Delirios de un Informático

WordPress Plugin Feed

Los programadores que trabajamos con WordPress debemos estar informados de las actualizaciones de los plugins que utilizamos. El problema es que aunque los plugins son de código abierto y Automattic proporciona una herramienta para bucear por su código, no proporciona ningún feed decente. Por ejemplo:

Por eso he creado una pequeña herramienta llamada WordPress Plugin Feed que se encarga de obtener toda la información disponible de cada release de un plugin para generar un feed que permite mantenerse actualizado sin tener que acudir al panel de control de WordPress o a la ficha de cada plugin en WordPress.org.

Cada release mostrará:

  • Lista completa de cambios en formato legible
  • Fecha precisa (basada en los commits de Subversion)
  • Enlace a la lista de cambios entre versiones en Subversion
  • Actualizaciones de seguridad destacadas

El código está disponible en GitHub y se permiten pull requests….

Funciones personalizadas para Less mediante Grunt

Less dispone de muchas funciones nativas, pero hay ocasiones en las que resultaría útil disponer de funciones personalizadas porque los mixins tampoco son suficientes. Por ejemplo, puede ser útil comprobar si existe un archivo, leer su contenido o ejecutar una herramienta externa para obtener los valores.

Para estos casos, es posible añadir nuevas funciones a Less mediante Grunt y el plugin grunt-contrib-less mediante la opción customFunctions, con lo que tendremos toda la potencia de Node.js a nuestra disposición para realizar todo que se nos ocurra.

Este sería el contenido de un Gruntfile.js de ejemplo:

module.exports = function(grunt) {
    grunt.loadNpmTasks('grunt-contrib-less');

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        less: {
            options: {
                customFunctions: require('./functions.js'),
                sourceMap: false
            },
            build: {
                src: 'test.less',
                dest: 'test.css'
            }
        }
    });

    grunt.registerTask('default', ['less']);
};

Como se puede ver, utilizo un require('./functions.js') para almacenar en un archivo todas las funciones, que deben exportarse del siguiente modo:

exports.test = function(less, arg1, arg2) {
    // código personalizado
}

Cada función se exporta con un nombre que será el utilizado en Less:

body {
  background-color: test('test.jpg', #FFFFFF);
}

Hay que tener en cuenta los siguientes aspectos:

  • El primer argumento recibido por la función es una instancia del compilador Less
  • El resto de argumentos son los que se especifiquen en Less
  • Cada argumento es un objeto con las siguientes propiedades (entre otras):
    • value: valor especificado en Less
    • quote: entrecomillado usado para convertir el valor
    • escaped: indica si se aplicarán caracteres de escape en el valor
  • Cualquiera de las propiedades puede modificarse para que el compilador las utilice
  • El entrecomillado será el especificado en Less: ‘, ” o ninguno si se usa un color o cualquier otro valor CSS
  • El valor de retorno de la función puede ser un objeto como el recibido como argumento o una cadena que se mostrará tal cual

El único problema que no he logrado solventar es poder acceder a las variables definidas en el punto en el que se llama a la función. Sería muy útil poder acceder a las variables, añadirlas y modificarlas, pero por lo que he podido comprobar la instancia de Less recibida por la función no da acceso a ellas.

Teclas multimedia de teclados Logitech G en Mac

En ninguno de los teclados Logitech G que he probado en Mac OS X (G11, G15 y G510) funcionaban las teclas multimedia para el control de la música (excepto en iTunes, curiosamente). Ni Spotify ni VLC ni otros programas respondían a las teclas prev/next (pero sí a play/pause), por lo que pensé en hacer un pequeño script que solucionara el problema.

Al ponerme a investigar econtré con Karabiner, un excelente software que soluciona muchos de los problemas más comunes con teclados en Mac (el punto del teclado numérico, la posición de las teclas < y >…) y que es extensible mediante archivos XML. Al ser un proyecto alojado en GitHub hice el correspondiente pull request que el autor amablemente aceptó.

Desde hace unos días los cambios se han integrado en la versión estable (desde la 10.5) por lo que basta instalar el programa y activar el mapeo llamado Enable PC Prev/Next Media Keys para poder por fin saltar canciones en Spotify….

Cómo añadir el locale gallego en Mac OS X

Apple no proporciona el locale gallego para Mac (el listado puede obtenerse con locale -a) por lo que al desarrollar aplicaciones que utilicen fechas en gallego se mostrarán las fechas en el idioma por defecto.

Añadir este locale es fácil (duplicar el español y editarlo) pero un script que lo automatice es mucho más cómodo. Por eso he añadido el repositorio Galician locale for Mac a mi GitHub con lo necesario.

Para hacerlo aún más rápido:

curl -fsSL https://raw.githubusercontent.com/vaites/galician-locale-for-mac/master/install.sh | bash

Lógicamente esto no añade las traducciones de la interfaz de Mac, sólo las definiciones para su uso en desarrollo….

Actualizador de Calibre en Mac OS X

Uso Calibre para gestionar mi biblioteca digital desde hace mucho, y he sufrido la versionitis de su autor con una actualización semanal. Debido a que no dispone de un actualizador automático he creado este pequeño script que descarga la última versión, la instala en /Applications y deja el archivo DMG en la carpeta de descargas:

#!/bin/bash
 
CALIBRE_DOWN="http://status.calibre-ebook.com/dist/osx32"
CALIBRE_LAST=`curl --head --silent ${CALIBRE_DOWN} | grep "Location" \
	| awk '{print $2}' | perl -pi -e 's/\r\n//g'`
 
CURRENT_USER=`whoami`
CALIBRE_NAME=`echo ${CALIBRE_LAST} | awk -F '/' '{print $5}'`
CALIBRE_FILE="/Users/${CURRENT_USER}/Downloads/${CALIBRE_NAME}"
 
if [ ! -f $CALIBRE_FILE ]; then
	wget "${CALIBRE_LAST}" -O "${CALIBRE_FILE}"
fi
 
if [ -f $CALIBRE_FILE ]; then
	cd "/Applications/"
	rm -rf 'Calibre.app'
 
	CALIBRE_VOLUME=`hdiutil attach "${CALIBRE_FILE}" \
		| grep "calibre" | awk '{print $3}'`
 
	cp -R "${CALIBRE_VOLUME}/calibre.app" "/Applications/Calibre.app"
 
	hdiutil detach "${CALIBRE_VOLUME}" > /dev/null
fi