Archivo por meses: agosto 2007

Escribiendo con PyGTK como $DEITY manda

Hoy he lanzado una nueva versión de Z88Transfer. Los cambios observables por los usuarios son más bien pequeños: ahora muestra una barra de progreso durante la transferencia, permite transferir varios archivos de una sola tacada, comprueba más exhaustivamente si un archivo nuevo sobreescribe a uno viejo, y, sobre todo, simplifica muchísimo su uso en windows.

Sin embargo, por dentro los cambios son mucho más radicales, pues prácticamente he reescrito la aplicación. Las razones han sido tres:

  • Por un lado, varias partes del código estaban muy sucias y eran muy poco modulares.
  • Por otra, quería internacionalizar la aplicación, para poder traducirla a otros idiomas (aunque en esta versión todavía no hay traducciones).
  • Por último, quería organizar en condiciones el código de las ventanas poniendo los manejadores de eventos de cada una en su propia clase (haciéndolo así más modular mantenible), además de simplificarlo usando diálogos para los distintos mensajes que pueden aparecer, en lugar de ventanas modales.

La última razón es especialmente importante. En el caso de SuperShow, el código era ya bastante bueno pues es la última aplicación que he escrito hasta la fecha, pero en el caso de Z88Transfer el código era realmente sucio, pues fue la primera aplicación que hice con PyGTK. Sin embargo, gracias a que es una aplicación relativamente sencilla, el código aún era razonable (la transferencia de ficheros y la conversión de formatos van en sendas clases separadas, lo que simplificó la reescritura).

¿Y a qué viene ésto? Pues viene porque también estoy reescribiendo el código de DeVeDe. Cuando comencé a escribir con PyGTK no sabía como generar una única ventana ni como conectar los eventos de ésta con métodos de una clase, pues la documentación del módulo PyGlade era escasa, por no decir nula. El resultado fue que la única manera que tenía de programar era generando una instancia de absolutamente todas las ventanas disponibles en el archivo de Glade, y metiendo todas las funciones de eventos directamente en un único fichero, lo que dio lugar a un código… bueno, llamémoslo caótico (por ser benévolo conmigo mismo), y muy poco mantenible.

Ahora lo veo en retrospectiva y me parece increible que haya sido capaz de escalar el código original de DeVeDe hasta el nivel actual, aunque siendo yo el programador supongo que no tiene mucho mérito. El que sí que tiene mérito es, sin duda, Peter Gill, que lo revisó y modificó para que funcionase también en windows. Un código que fue escrito originalmente como una solución chapucera y rápida para hacerle con comodidad a mi madre una pequeña colección de DVDs con los programas de Arguiñano que bajaba de la mula.

En estos momentos ya he reescrito toda la parte de conversión de vídeos y de generación de la imagen de DVD usando una orientación a objetos bastante razonable, y posiblemente lance una versión sólo con esas modificaciones, pues el nuevo código debería ser mucho más resistente a fallos tontos (el propio Peter, cuando lo revisó para asegurarse de que funcionase en Windows, comentó que sería una tarea muchísimo más sencilla gracias a la nueva arquitectura). El siguiente paso será cambiar a una clase independiente todo el código de la ventana de propiedades de los vídeos, para permitir añadir con más facilidad nuevas opciones de codificación. Por último, meteré en su propia clase la ventana principal y pondré la ventana de selección de tipo de disco como un diálogo. Entonces podré dar por terminada la refactorización del código y seguir añadiendo cosas nuevas.

Esos pequeños placeres

Mi caja actual tiene un pequeño fallo de diseño: el conector frontal de USBs está muy cerca de la salida de auriculares, por lo que no puedo conectar a la vez los cascos y mi reproductor de MP3 para grabar cosas en él. Sin embargo, un poco más separada está la conexión de micrófono, por lo que se me ocurrió hacer un par de puentes para que el sonido salga por ésta, y así no tener problemas. Llevaba tiempo queriendo hacerlo, pero hasta hoy no saqué ganas.

¿Y qué tiene que ver ésto con el título? Bueno, la última vez que usé un soldador para hacer alguna chapucilla propia fue hace casi dos años, cuando amplié la memoria de mi Z88, y es también la primera vez que lo uso desde que me independicé. Volver a cogerlo, aunque fuese para algo tan sencillo, ha sido realmente agradable. No te das cuenta de lo mucho que echas de menos hacer algo hasta que lo vuelves a hacer y disfrutas. Llevo tanto tiempo concentrado en mi trabajo y en mis proyectos de programación que tengo la electrónica completamente abandonada.

Después de ésto quiero hacer algún proyectillo nuevo, pero antes tengo que comprar una mesa adecuada. ¿Por qué no hay un Ikea cerca cuando lo necesitas?

SuperShow

Finalmente he sacado la versión 2.0 de SuperShow. En ella he pulido la interfaz y he limpiado algo más el código. Entre las novedades está un código Flash muy mejorado, que ahora permite pausar la presentación, retroceder y avanzar, y reproducirla de nuevo cuando termina.

Otra importante novedad es que ahora permite grabar y volver a cargar las temporizaciones. Esto es especialmente interesante porque así es posible generar de nuevo una presentación con una versión posterior de SuperShow, aprovechando las ventajas que traiga (por ejemplo, nuevos controles de la presentación, corrección de bugs en el código Flash…).

Además, ahora la temporización es precisa, y no como en la versión anterior, en que las diapositivas cambiaban aproximadamente en el punto deseado.

Por último, ahora las presentaciones son compatibles con Gnash, el reproductor de Flash libre de GNU. Esto significa que, aún usando un formato propietario, mantengo la libertad de los usuarios. Más que en el código Flash, los cambios para ésto estuvieron en el propio Gnash, y precisamente tengo que reconocer que el equipo del proyecto se ha portado increiblemente bien: no solo resolvieron en un tiempo record los bugs más complicados que notifiqué, sino que admitieron todos los parches que envié para corregir otros bugs que sí eran lo suficientemente evidentes como para que pudiese arreglarlos yo. El resultado es que las presentaciones del nuevo SuperShow funcionarán casi al 100% en la próxima versión estable de Gnash.

Y digo «casi» porque, de momento, el avance, retroceso y pausa no funcionan correctamente debido a un bug en el método que activa un sonido. Sin embargo, están trabajando en ello y seguro que en breve estará implementado. Otro fallo es que, cuando simplemente se especifica un color de fondo en lugar de usar una primitiva o una imagen, Gnash lo pinta de negro (en las presentaciones hechas con Impress, si no se pone ingún fondo, debería ser blanco). Este bug es, por lo que comentan en el Bugzilla, bastante complejo, por lo que, como solución temporal, es recomendable utilizar un fondo hecho con un rectángulo de color que ocupe toda la diapositiva.