Combinar múltiples imágenes con ImageMagick

En ocasiones puede hacer falta la típica composición de imágenes, una al lado de otra, de m x n celdas. Para eso el comando montage de ImageMagick viene de perlas:

montage -mode concatenate -tile mxn <archivos de entrada> <nombre de salida>

Donde m es el número de columnas y n de filas.

Fuente → Combine multiple images using ImageMagick [superuser.com].

Solución al «Argument list too long» en Linux

Cuando se quiere aplicar una operación masiva como copiar, mover y borrar archivos se suelen usar combinaciones de asteriscos y comodines para no ir de uno en uno. Luego Bash se encarga de expandir los nombres. El problema es que entonces se forma un chorizo de comando con demasiados argumentos. La solución pasa por ejecutar el comando en cuestión archivo a archivo, como por ejemplo con find y xargs para borrar:

find . -name "*" -print0 | xargs -0 rm

Pero ojo, que en este caso find es recursivo, así que habría que acotarlo con -maxdepth 1. Además, así también se pueden ejecutar comandos sobre archivos según fechas y otras características.

Vía → Argument list too long error for rm, cp, mv commands @ Stack Overflow.

Obtener la IP de cada interfaz en Perl

Obtener la IP de la máquina no tiene mucho misterio. Pero cuando se trata de servidores con varias interfaces de red, algunas incluso virtuales, la cosa cambia. Y se trata de algo que puede tener muchas aplicaciones, como por ejemplo un script que distinga entre si las copias que se van a realizar son realmente desde/hacia una máquina remota o en local y agilizar el proceso.

La manera más resumida en el caso de Linux es filtrar la salida de ifconfig:

my @IP = (`ifconfig -a` =~ /inet addr:(\S+)/g);

Pero es cierto que algún día los desarrolladores de la distribución de turno pudieran decidir traducir las palabras inet addr por direccion inet o a saber, por lo que ya estarían fastidiando la expresión regular y por tanto el invento. Así que por eso para soluciones más elegantes y multiplataforma, que para eso es Perl, se puede hacer uso de algún módulo como […] (continuar leyendo)

«cron» y el último día de cada mes

El demonio cron facilita las ejecuciones programadas cuando se trata del primer día del mes. Sin embargo para el último día de cada mes hay que usar un poco de ingenio y otras herramientas del sistema. Una manera:

30 23 * * * [[ $(date +'%d') -eq $(cal | awk '!/^$/{ print $NF }' | tail -1) ]] && /ruta/absoluta/al/script 1>/dev/null 2>&1

Que cada día a las 2330 comprobará si se trata del último día del mes:

  1. Obtiene el día del mes.
  2. Obtiene el calendario del mes actual.
    1. Extrae el final de cada línea del calendario.
    2. Se queda con la última de esas líneas.
  3. Si el día actual es igual al último día del mes obtenido, se ejecuta lo que le digamos y las salidas las manda a /dev/null.

Fuente → The UNIX and Linux Forums.

Compartir un hash multidimensional entre hilos en Perl

De cara a la concurrencia es frecuente hacer un script que vaya lanzando hilos según sea necesario. Y no mucho menos habitual es también que tales hilos compartan algunas variables. Un ejemplo puede ser un sistema que recibe peticiones y mientras tanto las va lanzando en hilos.

A priori parece la mar de sencillo. Usando threads y threads::shared con un array o un hash se resuelve el asunto. Sin embargo si no hubiera más remedio que utilizar un hash y de más de una dimensión vendría el problema. Con shared se comparte un nivel del hash, de manera que si se tiene compartido %miscosas y se necesita ahora utilizar $miscosas{1339953221}{detalles}{algo} vamos a tener un error de vuelta del estilo invalid value for shared scalar.

Para ello hay dos soluciones posibles […] (continuar leyendo)

Módulos en Perl multiplataforma

El lenguaje Perl permite escribir scripts multiplataforma sin demasiados problemas. Aunque siempre puede haber algunos impedimentos como por ejemplo la carga de módulos que no están disponibles para todos los sistemas operativos. Aquí va un ejemplo con Linux y Windows.

Puede darse el caso de necesitar un script que pueda correr como demonio en Linux o servicio de sistema en Windows. Para el segundo entorno el asunto se complica dado que se necesita de un módulo como Win32::Daemon, el cual si intentamos endosarle a Linux nos dirá que tararí. Y es que […] (continuar leyendo)

SWF a HTML5 con Google Swiffy

La gente de Google está que no para con la red social que están probando ni tampoco con Swiffy. Un conversor on-line de los archivos gráficos vectoriales SWF a lenguaje HTML5. Adobe desarrolla desde hace un tiempo algo parecido llamado Wallaby (para FLA a HTML), pero como es costumbre en ellos hay versión para Windows y dando gracias para MAC, ya para Linux ni rastro. Sin embargo Swiffy también tiene, al menos de momento, sus limitaciones:

  • Soporta ActionScript 2.0, pero no 3.0.
  • Soporta SWF 8 pero con SWF 5 se pueden obtener mejores resultados.
  • No soporta FLV.
  • Requiere un navegador sobre WebKit (Chrome/Chromium, Epiphany, Safari,..).

Pero menos da una piedra. He probado con la animación de un avión y parece funcionar bien. […] (continuar leyendo)