Gimp batch processor

Es frecuente que antes de publicar en una página web las fotos tomadas con una cámara digital sea necesario reducirlas de tamaño (de [mil y pico] x [mil y pico] pixels a 450 x [algo que mantenga la proporción] pixels, por ejemplo). Este proceso puede hacerse en WindowsXP: apenas conectamos la cámara al puerto USB, aparece un Wizard que ofrece pasar las fotos de la cámara al disco duro, con opción de reducirlas de tamaño. Pero este wizard no conoce sino unos pocos spells básicos. Por ejemplo, no sabe cómo aplicar filtros ni nada parecido, de modo que aunque nos saca del apuro su uso es limitado.

Gimp, en cambio, tiene muchísimas opciones. Pero como viene de fábrica, no procesa archivos por lotes, cosa bastante molesta. Pero éste plugin soluciona el problema. Te permite procesar archivos por lotes con un control detallado de lo que Gimp le hace a cada imagen, incluyendo conversión de un formato gráfico a otro.

Nota: para instalarlo en Linux, se necesita gimptool, que es un utilitario que viene en el paquete libgimp2.0-dev. Es decir, $ sudo apt-get install libgimp2.0-dev.


Leave a Comment

Python, Boa y wxPython

Python

Desde hace algún tiempo estoy programando en Python. Definitivamente es un lenguaje que se acomoda a mis circunstancias (el mundo en cuanto mundo de alguien, según la DRAE). Quiero decir que aunque me las pasaría todo el día delante de la pantalla desarrollando software, mi día a día tiene poco que ver con desarrollar software. Buscaba por eso un lenguaje en el que pudiera pasar del concepto al programa rápido, y que tuviera librerías suficientemente completas. Además, un lenguaje en el que los programas corrieran sin o con poca modificación tanto en Linux como en Windows, y si era posible, también en MacOS, una plataforma cada vez más tentadora.

Python es un lenguaje excelente. No voy a abundar en esto, ya hay todo una guerra al respecto (un artículo interesante es Python is not Java). Estoy bastante cómodo programando en Python y ya tengo suficientes horas de recorrido como para que una expresión como l = [ “%s” % row['Name'] for row in rows ] me salga más natural que escribir

l = []
for row in rows:
    l.append( “%s” % row['Name'] )


Además, por si en algún momento el lado oscuro nos comienza a parecer más atractivo, hay muchos artículos sobre Python que despejan toda nube de sombra y además ensalzan en ego. (Por ejemplo, Great Hackers, de Paul Graham)

He dedicado no poco tiempo a escoger una buena librería para la interfase del usuario (… para el user interface, UI, etc.). Hay gran variedad disponible, algunas muy completas, otras son proyectos incipientes. Para casi todas hay bindings para Python. He optado por wxPython (que son los bindings para Python a wxWidgets (An open source C++ GUI framework to make cross-platform programming child’s play, según los desarrolladores de la libería). La estructura de este framework es bastante ordenada. Hay versiones de wxPython para Linux, Windows, MacOs, etc., de modo que el programa funciona sin cambios en cualquiera de las plataformas en las que está disponible Python y wxPython. Una buena prueba de esto es el demo que viene con wxPython.

Eventos y entornos de desarrollo

Como en la mayoría de librerías para interfaces gráficas, los controles (widgets) de wxPython interactúan entre sí generando o reaccionado a eventos. Si quiero que el programa muestre ayuda cuando el usuario hace click sobre el botón de ayuda, tengo que escribir una función que muestre la información de ayuda, y decirle a wxPython que esa función es el handler para el evento que genera el botón cuando lo presionan.

He probado varios entornos de desarrollo (IDEs). Hay una buena oferta entre proyectos Open Source, para todos los gustos. Me sirve que el entorno de desarrollo permita depurar el programa (poner breakpoints, watches, etc.), porque aún escribiendo primero los test cases siempre se mete algún bug escurridizo; que el editor tenga una configuración razonable; mejor, si tiene code completion. Estas características las tienen varios entornos de desarrollo: WingIDE, Eclipse a través de un plug-in (pyDev), SPE, etc.

También se agradece poder diseñar la interfaz del usuario (user interface) gráficamente. Hay varios diseñadores para wxPython, aunque casi todos los que he probado tienen un vacío, y es que no permiten vincular los eventos que generan los objetos de la librería a los respectivos handlers. Después de diseñar gráficamente la interfaz, hay que buscar los controles en el código y empezar a vincular manualmente los handlers respectivos . El generador de código, por su parte, suele reescribir parte del código cuando se modifica el diseño de la interfaz gráfica, borrando todo lo que esté en medio. Por eso, el código para vincular los handlers al control hay que escribirlo más abajo, o más arriba, o en un método aparte, pero no junto al control al que hacen referencia. Estas limitaciones son molestas, sobre todo teniendo en cuenta que la documentación de wxPython es bien parca (eso sí hay, viene con un demo omnicomprensivo, que es realmente excelente) y no es fácil tener en la cabeza todos los eventos que genera cada control.

wxPython viene con XRCED, un editor que, aunque algo limitado, es útil. wxGlade es bastante popular y cada versión es más estable. Pero aunque Glade, el proyecto original en el que se inspira, permite vincular eventos a funciones, wxGlade no ofrece esa posibilidad. Un entorno de desarrollo bastante completo que sí permite vincular los handlers a los eventos es Boa-Constructor. Es un proyecto open source que avanza lento, la página web está desactualizada… pero hay releases cada tanto, que se pueden encontrar en este link a Sourceforge. Tiene todo lo que digo arriba: code competion, un buen debugger, un buen editor de interfaz gráfica, maneja incluso proyectos. De modo que es lo que estoy usando ahora.

WingIDE también es muy buen producto. He usado unas semanas la versión de evaluación (es un producto comercial) y si más adelante veo que lo de vincular los eventos no es tan indispensable, probablemente me anime a invertir en este programa, que tiene un precio razonable.


Comments (5)

OpenZaurus 3.5.3 unstable

Hace unos días intenté instalar OpenZaurus 3.5.3 (OZ) en la Zaurus SL-5600 que tengo. Me interesaba esta versión de OZ, aparte de la novelería, porque viene con algunos programas como Wellenreiter, Konqueror embedded, Opie reader, sshd ya instalados, y porque ofrece paquetes más actuales que los que encuentro para el ROM que viene con la SL-5600 de fábrica. Sin embargo, después de varias horas, he vuelto a la versión original del ROM de Sharp. El motivo de fondo es que no logro que la sincronización del Outlook con el Datebook de OpenZaurus funcione bien: logro sincronizar todas las citas y eventos, pero desfasados 5 horas hacia adelante (es lo que llaman en varios foros el “timeshift bug”. Al parecer, como vivo en Lima, que tiene un huso horario GMT-5, todo se desfasa 5 horas… absurdo).

De todos modos detallo lo que he hecho, porque parece que la sincronización del OZ con Outlook es un problema de muchos y porque cuando tenga un poco más de tiempo intentaré solucionarlo.

Hay que tener en cuenta que esta versión de Openzaurus es “unstable” y no sorprenderse de que hayan cosas que no funcionan todavía. La mayor parte de estos “tips” los he encontrado en Internet (ZarusUserGroup.com, etc.), no son elaboración mía.

Equipo

SL-5600 con OZ 3.5.3, WinXP y Outlook.

  • Sacar copia de todo lo que no se quiera perder en la Zaurus.
  • Bajar las imágenes del website de OZ (http://www.openzaurus.org) y copiarlos al SD Card (o CF). Son tres archivos: updater.sh, zImage.bin e initrd.bin.
    La copia la hice con el explorer en Windows y Samba en la Zaurus (así viene por defecto la SL-5600). Windows, por defecto, cambia el zImage.bin a zimage.bin, de modo que en la zaurus, desde la consola, hay que volver a cambiar el nombre a zImage.bin.
  • Borrar el directorio /home/root si existe (por ejemplo, de un intento anterior de instalar OZ) escibiendo rm -rf /home/root en la consola de la Zaurus.
  • Antes de “flashear” (no encuentro otra palabra, con perdón) la imagen de OZ al ROM, borrar toda la memoria (hacer un “full reset”, encender la Zaurus presionando OK y Cancel a la vez, seleccionar “Format”).
  • Ahora sí, “flashear” OZ: destapar la Zaurus, presionar reset, taparla, y encenderla presionando OK y Cancel a la vez. Seleccionar Update del menú que aparece, y SD para que el actualizador use la imagen del SD Card.

Una vez instalado OpenZaurus, hay que hacer unos “ajustes” para que la Z no se cuelgue (hay un bug sumamente molesto que hace que una vez que se apaga la Z, no haya forma de volverla a encender si no es con un hard-reset). Para esto, abrir la consola (el terminal) en la Zaurus y detener el daemon apmd:
# /etc/init.d/apmd stop

Esto tiene sus inconvenientes, claro, porque para algo existe apmd (por ejemplo, las alarmas no suenan cuando la Z está apagada), pero por lo menos la máquina no se congela. En algunos foros dan otras alternativas, ninguna me ha funcionado.

Cada vez que se apaga la Zaurus o se saca del craddle, se pierde la configuración de red, y cuando se vuelve a enchufar la agenda Windows ya no reconoce el dispositivo. Es necesario crear un script que vuelva a cargar los módulos correspondientes en la Zaurus:


#!/bin/sh
# relusb.sh
/sbin/rmmod pxa_bi
/sbin/rmmod net_fd
/sbin/rmmod usbdcore
/sbin/insmod /lib/modules/2.4.18-rmk7-pxa3-embedix/kernel/drivers/usb/device/usbdcore.o
/sbin/insmod /lib/modules/2.4.18-rmk7-pxa3-embedix/kernel/drivers/usb/device/net_fd/net_fd.o
/sbin/insmod /lib/modules/2.4.18-rmk7-pxa3-embedix/kernel/drivers/usb/device/bi/pxa_bi.o

Como la interface (“interfaz”, en español) de red se desconfigura cada vez que desaparece el dispositivo usb en la Zaurus, y el applet gráfico para configurar la red no funciona, este script también es util:


#!/bin/sh
# usbd0-up.sh
ifconfig usbd0 192.168.129.201 netmask 255.255.255.0 up
route add -host 192.168.129.1 usbd0
route delete -net 192.168.129.0/24 usbd0
route add default gw 192.168.129.1

Se supone que se puede configurar hotplug para que ejecute estos scripts automáticamente cada vez que se enchufa la Zaurus al cradle.

Sincronización con Outlook

La Zaurus SL-5600 que tengo viene con la versión 3.1E de Intellisync para Windows, y no se lleva bien con OZ. Parece ser que en uno de los cambios de versión de Intellisync Sharp cambió el puerto de sincronización, pero OZ sigue manteniendo el puerto antiguo. (O por lo menos eso dicen en algunos foros, pero no convence mucho el argumento. El ROM de Sharp usa como entorno gráfico Qtopia 1.5.4 y accesorios, que es de agosto de 2003, y sincroniza perfecto con Intellisync 3.1E. Openzaurus 3.5.3 es de abril de 2005).

De modo que para que Intellisync y OZ por lo menos se miren, lo primero que hay que hacer es bajar la versión 1.43E de Intellisync de la página de Sharp: es la versión que viene con la SL-5500, el archivo es setupI.exe y el link está hacia el final de esta página: http://www.myzaurus.com/ROMupdate3.asp
Antes de instalar la versión 1.43E de Intellisync, hay que desinstalar la versión 3.1E. Es importante que el resto del software instalado en Windows sea el de la SL-5600, en particular los drivers para que Windows reconozca a la Zaurus como dispositivo USB y configure la interface (mejor dicho, interfaz) de red. En el panel de control de Windows, Agregar y Quitar programas, seleccionar Sharp Zaurus, modificar instalación y desinstalar sólo el Intellisync. Reiniciar la máquina, instalar el intellisync 1.43E, reiniciar nuevamente.

OZ espera la versión 2.0 de Intellisync. Pero acabamos de instalar la versión 1.43E… de modo que si presionamos el botón de sincronizar, aunque tanto Windows como la Zaurus empezarán a hacer ruidos, finalmente OZ nos dirá que la versión de Intellisync es incorrecta. Esto se arregla escribiendo en la consola de la Zaurus:

# echo “1.43E” > /home/root/systeminfo/linkver

(Nota para mí: ¿quizá esto tiene que ver con el desfase horario?)

En la Zaurus, en la pestaña de “Settings”, en el applet “Security”, seleccionar sincronizar con Qtopia 1.7 (ya sé que queremos sincronizar con Intellisync. Pero si se escoge Intellisync, OZ no reconoce la configuración de seguridad y cada sincronización pregunta unas 30 veces si debe permitir acceso de Intellisync al a la Zaurus). He probado con Intellisync y Qtopia en la Zaurus, e Intellisync en Windows y el resultado, a efectos de transferencia de datos, es el mismo.

Con lo que hemos hecho hasta este momento, se puede sincronizar la agenda, pero terminada cada sincronización Intellisync nos dice que cambiemos el IP de la Zaurus. Para evitar esto, sacamos una copia del archivo de configuración de Intellisync y después de cada sincronización restauramos los datos originales:

  • En el directorio C:\Archivos de Programa\Sharp\Intellisync for SL\QtDBTemp copiar de Intellisync en Windows, copiar el archivo NetStat.dat a OZ_NetStat.dat.
  • Con un editor de texto, abrir OZ_NetStat.net y cambiar el IP a 192.168.129.201 (o el IP que esté configurado en la Zaurus).
  • Cuando queramos sincronizar la Zaurus, ejecutamos SLNetDlg.Exe y luego copiamos OZ_NetStat.dat a NetStat.dat.

OK, listo. Con esto puedo sincronizar sin problemas la libreta de direcciones (el addressbook), y la agenda (el calendario, datebook) pero con el desfase horario famoso.


Tags:

Comments (4)