Alex Moreno


A Drupal Developer in London

Actualizar comentarios en drupal desde mysql

Un pequeño truco. En un determinado momento me vi con el problema de varios cientos de nodos en Drupal publicados con los comentarios cerrados.

Solución? Muy sencilla:

 

UPDATE node SET comment = '2' WHERE type = 'tipo_contenido';

(cambiar tipo_contenido por el contenido correspondiente, que además suele coincidir tipo_contenido con el nombre del contenido que hayamos creado en Drupal.

 

categorias: 

Añadir una marca de agua a varias imagenes

El otro día hablábamos sobre redimensionar una o varias imágenes (tantas como tengamos en un directorio o localización, puesto que podemos automatizarlo), y cambiar su calidad para poder subirla a la web.

Hoy vamos a ver un truco para, además, añadir una marca de agua a las imágenes. Además, al tratarse de un proceso automatizado no vamos a perder más que unos segundos, incluso aunque tengamos varios cientos de imágenes por tratar. 

Veamos una primera aproximación:

convert IMG_3476.JPG IMG_3493.JPG -font Helvetica -pointsize 120 -draw "gravity center fill black text 20,12 'http://www.ViajarenCruceros.com' fill white text 11,11 'http://www.ViajarenCruceros.com'" nieuw-amsterdam.jpg

Lo que hacemos aquí es añadir la marca de agua "ViajarenCruceros.com" a la imagen nieuw-amsterdam.jpg.

Ahora vamos a desplazar un poco hacia abajo esa marca de agua:

convert IMG_3476.JPG -font Helvetica -pointsize 120 -draw "gravity center fill black text 120,400 'http://www.ViajarenCruceros.com' fill white text 130,410 'http://www.ViajarenCruceros.com' " nieuw-amsterdam.jpg

Y ahora la centraremos un poco:

convert IMG_3476.JPG  -font Helvetica -pointsize 120 -draw "gravity center rgba(255,0,0,0.80)  'http://www.ViajarenCruceros.com' fill white text 11,11 'http://www.ViajarenCruceros.com' " nieuw-amsterdam.jpg

Y, para terminar, la solución que uso yo:

convert  IMG_3561.JPG -font Helvetica -pointsize 80 -draw "gravity south fill black text 120,400 'www.ViajarenCruceros.com' fill white text 126,404 'www.ViajarenCruceros.com' " nieuw-amsterdam.jpg

Redimensionar varias imagenes con imagemagick

Has hecho un lote de fotos de tus vacaciones, o les has hecho un book a un cliente y quieres subirlo a la web. Si tienes que ir una a una redimensionando cada una de las imágenes te pueden dar las uvas, como se suele decir vulgarmente.

Un pequeño truco es usar imagemagick y mogrify, un pequeño software que puede instalarte en linux y que te permite:

redimensionar varias imágenes a, por ejemplo, un porcentaje concreto:

mogrify -resize 40% *.JPG

En mi caso pasaron de ocupuar unos 1,5MB, demasiado para subirlas a una web, a pesar unos 300kb. Lo bueno de mogrify es que, si intentamos redimensionar en base a un tamaño determinado, mogrify intentará mantener las proporciones originales de la imagen:

mogrify -resize 800x600 *.jpg

Si queremos forzar a que se cambien las dimesiones podemos usar el !:

mogrify -resize 320x240! *.jpg

También podemos modificar la calidad de la imagen, algo típico en jpg:

convert -resize 750×500 -quality 80% *.jpg

categorias: 

Cambiar la configuracion en un vps o servidor dedicado sin reiniciar apache

Este es un pequeño truco que uso a veces cuando hago cambios en alguna configuración de alguno de mis sitios con Drupal. Imaginemos que configuramos un nuevo dominio en drupal, usando multisite para que apunte a un único directorio raiz, por ejemplo:

/var/www/vhosts/dominio.com/directorio-fuente-drupal

El fichero vhost será algo así (en /var/www/vhosts/dominioorigen.com/conf/vhost.conf):

 

        ServerAlias  *.crucerista.org
        ServerAdmin  "alejandro.moreno@tdo.es"
        DocumentRoot /var/www/vhosts/crucerista.net/httpdocs/crucerista/

        <Directory /var/www/vhosts/crucerista.net/httpdocs>
        <IfModule mod_php5.c>
                php_admin_flag engine on
                php_admin_flag safe_mode off
                php_admin_value open_basedir "/var/www/vhosts/crucerista.net/httpdocs:/tmp"
        </IfModule>
                Options +Includes -ExecCGI
        </Directory>
        <Directory /var/www/vhosts/crucerista.net/web_users>
        <IfModule sapi_apache2.c>
                php_admin_flag engine off
        </IfModule>
        <IfModule mod_php5.c>
                php_admin_flag engine off
        </IfModule>
        </Directory>

 

Y aquí viene el truco. Tras añadir el nuevo vhost no necesitamos ejecutar un apache restart, sino que valdrá con este comando:

/usr/local/psa/admin/bin/websrvmng --reconfigure-all

El truco está hecho sobre Drupal 6 y en un dedicado o un vps sobre Debian. Cualquier configuración alternativa de Drupal o distribución linux sería igualmente válida.

De nada ;-)

categorias: 

No puedo hacer login en Drupal después de cambiar de servidor

error tonto donde los haya, pero como todos, si es la primera vez que te ocurre puedes volverte loco hasta encontrarlo.

El problema, después de migrar un drupal funcionando a un servidor nuevo, el login parece no funcionar. Simplemente haces login y no da ningún mensaje adicional, error ni nada parecido, pero no estás "logueado".

Problema? Pues simplemente la variable cookies en settings.php:

$cookie_domain = '.dominio.com';

comentándola con una # al principio de la linea o bien simplemente cambiando el dominio al nuevo dominio debería ser suficiente para que volviera todo a funcinar correctamente :-).

categorias: 

backup y restore (volcar) una base de datos mysql

Cambiar de servidor una base de datos? Ningún problema

el primer paso, sencillo, hacer el backup:

mysqldump -a -u admin -p DATABASE > FILENAME.mysql

--default-character-set=latin1 table >

(esta última linea es opcional)

1.Drop the database

mysqladmin -u admin -p drop DATABASE

(idem, si queremos eliminarla estupendo, pero por seguridad yo la dejaría en su sitio)

2.Recreate the database

mysqladmin -u admin -p create DATABASE

-esto lo hacemos ya en el nuevo servidor

3.Import the backup data

mysql -u USER -p PASSWORD DATABASE < FILENAME.mysql

mysql -u admin -p < .mysql

 

Otras notas:

Hacer backup de varias bases de datos:

mysqldump -u username -ppassword –databases db_name1 [db_name2 ...] > dump.sql

 

TODAS LAS BASES DE DATOS:

mysqldump -u username -ppassword –all-databases > dump.sql

 

categorias: 

tutorial ssh-keygen en 2 pasos

ssh-keygen es un metodo que nos facilita el poder ejecutar determinados comandos desde nuestra máquina en una remota, sin la necesidad de tener que introducir la password en cada conexión. Es muy útil, por ejemplo, para sencillamente conectarnos con el servidor desde el ordenador con el que siempre trabajamos (siempre que sea un puesto seguro claro) o por ejemplo para ejecutar determinados scripts periódicos desde nuestro escritorio y sin necesidad de que estemos nosotros delante.

La mayoría de tutoriales que he encontrado son algo liosos, aunque en realidad una vez has comprendido la teoría es tremendamente sencillo. En dos pasos:

  • generamos una llave pública en nuestro ordenador: ssh-keygen -t rsa (le damos a enter a todo)
  • pegamos esa clave al fichero .ssh/authorized_keys de la máquina remota

Listos, ya podemos hacer ssh desde la máquina donde hemos hecho el ssh-keygen hacia la que hemos pegado dicho fichero en el authorized_keys.... quedó muy lioso?

categorias: 

Obtener el id más alto en mysql

Ahora mismo andaba buscando como saber cuál es el id más alto introducido en una base de datos MYSQL. Algunos lenguajes te permiten, incluido SQL, obtener la última consulta realizada con "autoincremente". Sin embargo buscaba algo a más "bajo nivel".

Concretamente lo estaba buscando para ruby, pero en verdad la solución en SQL es más eficaz puesto que "abstraes" la complejidad del lenguaje delegando todo el proceso al propio SQL.

Solución? Muy fácil, desde sql:

SELECT MAX(nid)  FROM table

Usando php:

 $sql = "SELECT MAX(ID) FROM tbl";
 $result = mysql_query($sql);
 $row = mysql_fetch_row($result); 
$max_id = $row[0]; 

Usando Ruby:

lastid = dbh.query("SELECT MAX(nid)  FROM node_revisions")

 

Enlaces relacionados:

http://www.codingforums.com/showthread.php?t=1552

categorias: 

Mejora el rendimiento de drupal

Actualmente tenemos varios sitios con más de 10.000 visitas diarias, gestionados mayoritariamente con Drupal. Lo problemas habituales son la aparición de slow threads, o consultas lentas en mysql, idénticos a los que aparecen en Wordpress.

Para detectar estos problemas lo más normal es usar monitores como Munin, para detectar posibles fallos al colgarse el servidor, bloquearse apache, etc, etc. Para estar atentos a estos fallos en el propio servidor podemos tener instaladas alertas que vienen configuradas con Plesk, para que nos avisen de que apache, mysql o cualquier otro servicio está bloqueado o no está respondiendo. Si no disponemos de estas alertas (podemos haber contratado una web sin más servicios que el puro alojamiento) servicios externos de uptime pueden avisarnos gratuitamente en cuanto tengamos problemas de este tipo. Os recomiendo UptimeRobot, por ejemplo, pero hay muchos ahí fuera.

En caso de que detectemos este tipo de problemas, antes de contratar más memoria ram, o incluso dar el salto a otro servidor más potente, podemos tratar de "apretar" aún más el actual servidor, aligerando la carga. Cómo? Pues fácil, reduciendo el número de consultas a la base de datos y reduciendo también el número de veces que se ejecutan sentencias de php.

La respuesta rápida es instalar boost, un módulo que mejora de manera considerable el rendimiento de Drupal. Al principio tuvimos muchos problemas con él, puesto que si no tenemos cuidad con qué activamos al entrar como usuario anónimo pueden aparecer consultas "rotas", enviando errores de compresión al navegador y no mostrando ningún contenido. Si nos pasa esto desactivando opciones como "aggresive compression", "aggressive gzip" o "Asynchronous Operation" y probablemente resolveremos el problema.

Si queremos ir un paso más allá (de hecho se puede ir muucho más allá) os recomiendo los siguientes artículos:

 

 

Algunos módulos útiles:

excluir un directorio de rsync

Rsync es una herramienta perfecta para hacer copias de seguridad, incluso de un directorio a otro dentro de la propia máquina. Con Drupal, por ejemplo, o con wordpress, te ahorra muchos quebraderos de cabeza, y te permite tener una copia de seguridad totalmente actualizada e incluso sincronizada via cron (en el caso de servidores linux o *ix en general).

La idea es tener un directorio en un disco montado fuera del sistema, por ejemplo en /mnt/discobackups, y hacer el rsync desde él:

rsync -avz /var/www/dominio.com/httpdocs/ /mnt/discobackups

Facil, verdad? Ahora bien, cuando empezamos a recibir tráfico es importante usar una herramienta o un plugin de cache, como boost en Drupal o su alternativa en Joomla, wordpress y demás. Esto deja mucha basura que no vamos a querer copiarnos a nuestra carpeta de backup, y que de hecho tendríamos que estar sincronizando casi al minuto. Pues bien, la solución es bien fácil, excluimos la carpeta donde el sistema esté escribiendo los datos de "caching". En drupal esta carpeta suele estar almacenada en /RUTA-A-DRUPAL/sites/cache o directamente en /RUTA-A-DRUPAL/cache.

Haremos la magia con la directiva --exclude, de la siguiente forma:

rsync -avz --exclude 'sites/cache' /var/www/dominio.com/httpdocs/ /mnt/discobackups

donde la ruta 'sites/cache' es relativa al directorio que estemos sincronizando, en este caso

/var/www/dominio.com/httpdocs/