Gallery 2

Gallery 2

Desde que creamos la web de fotografía del Arxiu Històric del Poblenou, hemos utilizado el software de galería de imágenes Gallery 2.

He probado otros software de galerías de imágenes, pero en cuanto a funcionalidades y prestaciones, Gallery 2 es el mejor. He probado Piwigo (de hecho, mi actual web de fotografías está temporalmente en Piwigo, y es el segundo en mi lista), ZenPhoto, y Coppermine, pero ninguno de ellos es tan versátil o robusto como Gallery.

El equipo de desarrollo de Gallery 2 creó la versión 3 del software, pero nunca llegó a ser tan versátil o robusta como Gallery 2, así que a pesar de haber probado la nueva versión en alguna web, no me decidí a instalarlo.

Desafortunadamente, hace ya años que no hay actividad en la comunidad y han discontinuado, así que he tenido que desempolvar mi PHP para realizar el mantenimiento yo mismo.

He creado recientemente un tema basado en bootstrap 3, y el resultado es bastante bueno. Todavía falta por optimizar algunas cosas, pero la cosa ya promete.

Para verlo, navegad a la web de fotografías del Arxiu Històric del Poblenou.

Repositorio github: https://github.com/miceno/bootstrap_matrix

 

 

Validación de email para Contact Form 7

Una forma sencilla de añadir doble validación de email a un formulario de WordPress… igual no es lo más elegante, pero a partir de ello he creado un plugin que lo contiene.

functions.php
<?php

//
//  Hook for double check of email addresses.
//  Taken from: http://stackoverflow.com/questions/6255367/contact-form-7-is-there-a-confirm-e-mail-input-type
//

function register_scripts() {
  if ( !is_admin() ) {
    // include your script
    wp_enqueue_script( 'email-confirm', get_stylesheet_directory_uri() . '/js/email-confirm.js' );
  }
}

add_action( 'wp_enqueue_scripts', 'register_scripts' );
js/email-confirm.js

// First we add a hook to the form submit event
jQuery( document ).ready( function () {
  jQuery('.wpcf7-submit').click(function () {
      // We remove the error to avoid duplicate errors
      jQuery('.error').remove();
      // We create a variable to store our error message
      var errorMsg = jQuery('<span class="error">Your emails do not match.</span>');
      // Then we check our values to see if they match
      // If they do not match we display the error and we do not allow form to submit
      if (jQuery('.email').find('input').val() !== jQuery('.email-confirm').find('input').val()) {
          errorMsg.insertAfter(jQuery('.email-confirm').find('input'));
          return false;
      } else {
          // If they do match we remove the error and we submit the form
          jQuery('.error').remove();
          return true;
      }
  });
});

Puedes minimizar el código javascript para ganar unos cuantos bytes de transferencia.

Podeis verlo en github.

Insertar una imagen de Google Drive

Puedes generar un enlace directo a un fichero almacenado en Google Drive utilizando el identificador del fichero.

Para obtener el identificador del fichero. Para ello, tienes que obtener un enlace compartido al fichero,  dicho enlace incluye el identificador.

Navega en Google Drive hasta el fichero que enlazar, y escoge la opción “Get shareable link” (vendrá en el idioma en que tengas configurado tu Google Drive).

Captura de pantalla para obtener un enlace compartido
Obtener un enlace compartido

Como ejemplo, he creado una carpeta en mi cuenta de Google Drive para mostrarlo. Se puede acceder a ella en esta carpeta. El enlace a la imagen que se obtiene es de la siguiente forma:

https://drive.google.com/open?id=1DBBfcZ3EXui0xT3CyJ6pIrCpiOgNTt-6

He marcado el identificador. Ahora solamente hay que hacer un cambio en la URL para que sea de la siguiente forma:

https://drive.google.com/uc?id=<IDENTIFICADOR>

Para la imagen anterior, la URL sería:

https://drive.google.com/uc?id=1DBBfcZ3EXui0xT3CyJ6pIrCpiOgNTt-6

Las imágenes de este artículo se han insertado así.

Instalación de librerias de Python en 1and1

El hosting compartido de 1and1 permite crear scripts utilizando Python 2.6. Sin embargo, no permite instalar librerias en las rutas de sistema, por lo que hay que ingeniarselas un poco para instalarlas.

Primero, hay que bajarse easy_install e instalarlo en algún lugar de nuestro espacio de hosting.

Luego, ya es más fácil, solamente hay que decirle a easy_install que en lugar de instalar paquetes en la ruta habitual, los debe instalar en una ruta de nuestro espacio de hosting. Por ejemplo, este comando instalará en el directorio $HOME/lib:

easy_install --prefix ~ xlrd==0.7.7

Después tendremos que asegurarnos que nuestros scripts Python encuentren las librerias.

Para ello, se puede modificar la variable de entorno PYTHONPATH con la ruta de la libreria. Este método solo funciona para scripts lanzados desde la linea de comandos.

En el caso de scripts CGI lanzados por Apache, no podemos modificar el entorno de ejecución de Apache para una nueva versión de la variable PYTHONPATH. Por ello, tendremos que recurrir a otra opción, menos elegante, pero igual de efectiva: cargar la libraria “a mano” en nuestro script. Para ello, basta con añadir algo de este estilo:

if sys.version_info < (2, 7):
     sys.path.append( 'PATHTOLIBRARY/lib/python2.6/site-packages/xlrd-0.7.3-py2.6.egg' )

Nuevo plugin para WordPress: insertar publicidad de Zanox

Voy a incluir publicidad en el blog, a través de Zanox, que ofrece programas y campañas a afiliados que quieran sacar partido de un espacio en el que colocar publicidad. Casi ni se va a notar, y me permitirá probar esto de la publicidad y los ingresos extra a través del blog.

Ya veremos si funciona.

Para mostrar la publicidad, cada anunciante proporciona código HTML que hay que insertar en la web. Para hacerlo lo más cómo posible y facilitarme la vida (voy a ir cambiando y probando cosas), he creado un módulo para WordPress.

Es un módulo muy sencillo, con una configuración sencilla también. El módulo pone a disposición del blog un widget, que se personaliza con el tipo de anuncio a incluir. El código HTML de cada anuncio está en un fichero. Hay un desplegable en el widget que permite seleccionar el anuncio, en base a unas etiquetas. Sencillo.

Y me ha llevado poco tiempo hacerlo, menos de 1 hora. Empecé a partir de otro plugin, para ver lo que tenía que incluir y lo que no. Y tuve suerte, porque empecé por un plugin muy sencillo: las medallas de Ohloh, que incluye un widget.

Ahora, tengo que pensar en mejoras: una interfaz de gestión para crear los ficheros HTML, conexión directa con mi cuenta de Zanox para seleccionar la publicidad, etc.

De vuelta

De vuelta al trabajo. Ahora, a ver si me reciclo completamente y empiezo a programar en Java y Scala. Esto promete.

Siempre me ha dado un poco de respeto Java, tan parecido a C++, las librerías, … hay que saber tanto, que siempre me daba miedo empezar.

Pero ahora ya no hay excusa. Y ya tengo una batería de enlaces y recursos.

He empezado con Netbeans, pero me he acabado pasando a la línea de comandos, es más sencillo, y así controlo lo que hago.

Fusion de ficheros PO para i18n

Estoy integrando un foro bbPress con un portal desarrollado en Zend y he tenido que desarrollar varios plugins (SSO, login, socialit) y crear un estilo. El portal gestiona los usuarios y el foro utiliza la autenticación del portal.

Ya existe un fichero de traducciones en castellano, que me ha costado encontrar. Aunque hay un repositorio de i18n de bbPress, resulta que es de la versión 0.8.3. Buscando por ahí encontré una traducción más reciente, que correspondía a la versión 1.0.2.

Ahora bien, aquí hay varias opciones,

puedo generar un fichero MO para toda la aplicación. Esto es lo más fácil, porque se ejecuta un script para generar todas las cadenas en un fichero POT, se hace un merge con el fichero actual y luego se queda uno con el resultado, y lo que falte se rellena. Esto está muy bien, y es facil, pero es poco flexible y supone tocar los ficheros de traducciones del nucleo de bbPress, cosa que no me entusiasma.

Se pueden generar ficheros MO para diferentes dominios, como los plugins o los temas. La verdad es que no tengo claro como hacerlo para los temas, creo que habría que integrarlo dentro de algún plugin. Para cada plugin/tema se generan un fichero POT. Luego se hace un merge entre el fichero es_ES.po de bbPress y el fichero POT nuevo:

msgmerge es_ES.po themes_es.po > resultado.po

El fichero es_ES.po será bastante grande y nuestro fichero themes_es.po será más bien pequeño. El resultado es otro fichero grande, pero con muchas lineas en modo fuzzy o comentadas. Tendremos que editar dicho fichero y borrar las entradas fuzzy. Probablemente, solo haya que dejar las primeras lineas. Para descubrir esto, solo hay que hacer un diff entre el fichero themes_es.po y el resultado.po

diff themes_es.po resultado.po

Y verás que solamente se han modificado las lineas que estaban sin traducir. Tengo que depurarlo un poco más, pero creo que con esto basta por ahora.

Ahora queda ver cómo se integra el fichero resultado.po en cada plugin. ¡Manos a la obra!

Secuencia de inicialización de bbPress

He decidido generar un flujo de comandos que se ejecutan en bbpress durante la secuencia de inicializacion.

La verdad es que el codigo está bastante bien comentado, asi es que he pensado que me bastaria con quedarme con los comentarios para explicar la secuencia de inicialización.

Para ello, he cogido el codigo fuente, he limpiado el propio codigo fuente y dejado solo los comentarios. He utilizado el script xscc.awk. A continuación, he añadido las entradas “do_action” y “require_once” para reflejar lo que se estaba ejecutando adicionalmente; en este caso, he utilizado un script propio. Y luego lo he pegado todo en orden.

La secuencia de comandos ha sido:

$ ~/devel/extract-comments.awk language=cpp blanklines=1  extract=comment bb-settings.php > bb-settings.php.txt
$ sed -ne '/do_action/p;/do_action/!{ c\
\
}' bb-settings.php > bb-settings.php.actions.txt
$ sed -ne '/require_once/p;/require_once/!{ c\
\
}' bb-settings.php > bb-settings.php.require_once.txt
$ paste -d" " bb-settings.php*.txt | sed -e 's/  //' | sed -e '/^$/{ N;/^\n$/d; }'> bb-settings.php.txt.all

Así que finalmente el resultado está en los siguientes ficheros: bb-settings.php.txt, bb-load.php.txt