lunes, mayo 01, 2006
Cuatro días y una extensión
Hace años ya que empecé a buscar una forma de sacar estadísticas de mi correo. Me parecía un complemento obvio para Thunderbird, pero no encontré ninguna extensión que lo hiciese. Me apetecía intentarlo a mí, pero teniendo en cuenta que no sabía nada de desarrollo de extensiones, suponía que me iba a llevar mucho tiempo, ese bien escaso.
Llevaba años con esa pequeña frustración, hasta que hace unas semanas vi esta historia: «How To Build a Game In A Week From Scratch With No Budget». El autor decidía que iba a dedicar 40 horas (el equivalente a una semana de trabajo) en desarrollar un juego completo, aunque sencillo, desde cero. Su conclusión es que había sido un ejercicio muy interesante que le había enseñado muchas cosas.
Inspirado por él, y ante la coyuntura de cuatro días de fiesta en los que podía escoger entre acudir a un Paso de Semana Santa en la A-6 o quedarme en casa haciendo algo interesante, decidí intentarlo: cuatro días para hacer una extensión que calculase estadísticas para mi correo.
Objetivos que me planteé:
1) Hacer una extensión completa, aunque tuviese muy poca funcionalidad, pero que lo que tuviese funcionase.
2) Publicarla como software libre, por si alguien quería utilizarla o incluso mejorarla.
3) Hacerlo en cuatro días.
Aunque podía haberlo dejado después de los cuatro días, cuando tenía una extensión funcionando, al final me di una extensión de tiempo y la semana siguiente estuve mejorando algunos aspectos de interfaz. Voy a contar un poco la historia del desarrollo, no hora a hora como el artículo original, pero con unos cuantos detalles de cosas que he aprendido y que pueden servir para otra persona que quiera hacer una extensión similar.
Día 1. Jueves Santo: Aprendiendo a programar extensiones
Empezaba de cero: no tenía ni idea de cómo funcionaban las extensiones para Thunderbird. Así que tirando de Google, llegué a dos recursos básicos: el tutorial de desarrollo de la extensión «Hola, mundo» y un blog en el que se cuentan detalles del desarrollo de extensiones para Thunderbird. El problema del primero, como ya conté en su momento, es que estaba dedicado a Firefox y me costó mucho conseguir el sencillo «Hola, mundo» en Thunderbid.
A media tarde del jueves mi extensión ya saludaba, así que mi siguiente paso fue conseguir aprender a recorrer las carpetas, para luego recorrer los mensajes y sacar las estadísticas. Ahí estaba peleándome sobre todo con dos entradas del blog antes mencionado: Navigating Folders y A Better Way to Navigate Folders. Con el primer método no me funcionaba, porque llama a la función GetDBView: yo la intentaba llamar desde la nueva ventana que estaba creando, pero la función está en el código de Thunderbird y sólo puede ser llamada desde un overlay. Con el segundo método tuve más éxito y me fui muy contento a la cama: había conseguido recorrer las carpetas. Ahora sólo era cuestión de recorrer los mensajes.
Día 2. Viernes santo: El mensaje
Lo de recorrer los mensajes, que parecía algo sencillo, se convirtió en algo muy difícil. Me estuve pegando mucho, buscando por Google, leyendo la incompleta documentación sobre XUL y bajándome otras extensiones para mirar su código. Casi ninguna hacía lo que yo quería, recorrer todos los mensajes, sino que se dedicaban a hacer pequeños cambios en el interfaz que solían actuar sobre el mensaje seleccionado. Al final me encontré con Quick File y, sobre todo, Remove Duplicate Messages, que hacía lo que yo quería. Mirando su código saqué la forma de recorrer todos los mensajes.
Una vez que conseguí este objetivo, ya sólo se trataba de sacar información sobre cada mensaje. Con un poco de XPCOM obtenido del propio código de Thunderbird, estuvo solucionado. Ahora ya parecía sólo cuestión de echar tiempo programando.
Día 3. Sábado santo: Refactorización, hilos e interfaz
El sábado, como ya he contado, me puse a hacer refactorización y a intentar poner una barra de progreso. Fue cuando me lié con el asunto de los hilos. Al final conseguí hacerlo con el setTimeout, aunque no de manera perfecta porque seguía apareciéndome el mensaje de «Unresponsive script», aunque sólo cuando tenía una carpeta muy grande.
Además del procesamiento de los mensajes, estaba también el asunto de generar los resultados. Opté por la solución que me parecía más sencilla: mostrarlos en un iframe dentro de una nueva ventana de Thunderbird. Como el iframe recibe código HTML, con unas cuantas tablas se solucionaba el asunto.
Día 4. Domingo santo: Intento de rematar
El domingo dediqué casi todo el tiempo (casi todo el tiempo que dediqué a la extensión, también hice otras cosas, como el resto de días) a mejorar la presentación de resultados. Para empezar, le puse un poco de estilo a las tablas. Hice unas cuantas refactorizaciones para hacer métodos genéricos que funcionasen con las distintas tablas que tenía y aprecié la potencia y la facilidad que ofrece el Javascript al no tener tipos estáticos.
Me planteé también hacer la salida a fichero, en formato HTML y en TSV. Lo de hacer la salida a disco me llevó a buscar una librería de Javascript que solucionase ese problema. Decidí utilizar el código de Robert Ginda.
El fichero en HTML parecía fácil: ya lo tenía en el iframe y sólo era escribirlo a disco. Me funcionaba cuando no tenía CSS, pero cuando lo metí, empezaron los problemas. Aunque sin estilo, el fichero con los datos estaba ahí, así que decidí dejar ese problema aparcado.
El fichero TSV no tuvo muchos problemas y permitió abrir los datos fácilmente en Excel y hacer gráficos con ellos: ¡guau! :-)
Después añadí soporte para localización: las cadenas que estaban metidas directamente en el código pasaron a ser parte de una especie de ficheros de recursos que tienen las extensiones. Rutinario.
Se acababa el domingo y llegaba el momento de publicar la extensión. Había dos inconvenientes: no tenía claro el nombre y no sabía dónde subirla.
Sobre lo primero, en principio la había llamado «Thunderbird Statistics», pero me hacía los nombres de las clases muy largos y, además, me fijé que las extensiones no solían tener lo de «Thunderbird» (o «Firefox») en el nombre. Algunas opciones que se me ocurrieron fueron «Thunderstats» (ya existe), «Mailstats» (ya existe), «Statszilla» (ya existe), «Statisticszilla» (no existe, pero no me extraña: no hay quien lo pronuncia ni quien lo escriba bien a la primera si no se tiene cuidado)... Al final me quedé con «tbStats». Da pocos resultados en Google (200) y no parece que nada tenga que ver con estadísticas de correo.
Para el problema de alojar la extensión, estaba buscando un sitio que ofreciese acceso al código fuente con Subversion y que permitiese también alojar una página para ella. Encontré esta comparativa y, echando un vistazo, el que más me convenció fue BerliOS. Intenté registrarme. Un par de veces: nunca me llegó el correo de registro. Así que, a última hora, me decidí por SourceForge. En principio no me gustaba porque creo que la página es un lío con tantas opciones, pero al darte la posibilidad de hacer tu propia página, se soluciona ese problema.
Me puse a registrarme y me encontré con un proceso muy cuidado: tienes que tener clara la licencia de tu código, cómo se va a llamar, cómo categorizarlo... Al final del proceso, tu solicitud queda pendiente de que la revise un humano, pero eso en horario laborable. Así que ahí se me acabó el domingo y sin haber conseguido publicar. Decidí darme una extensión del plazo
Extensión del plazo: Entre semana
Durante la semana, fui trabajando por las noches, algunas, porque con el trabajo normal no siempre tengo ganas de seguir peleando contra el ordenador cuando llego a casa.
El lunes me aceptaron el proyecto y estuve explorando un poco SourceForge. Subí el código por primera vez al repositorio Subversion. En teoría, ya podía hacer un lanzamiento y publicar la extensión, pero me parecía que sería conveniente tener una página web hecha para la gente que quisiera visitarla y, además, había algunos detalles (ausencia de gráficos, el mensaje del script que no responde, el estilo de los resultados no muy atractivo, tenía el icono por defecto...) que me parecía que había que trabajarlos un poco más.
Hasta el viernes me dediqué básicamente a aspectos de estilo: hacer un logo, la página web, cambiar colores y fuentes, hacer el icono... Las horas empleadas con el Photoshop fueron unas cuantas. Por cierto, me pareció que estaba muy mal explicado en SourceForge cómo subir la página web. Hay que hacer un SFTP a shell.sourceforge.net con tu nombre de usuario y contraseña, y luego el directorio es /home/groups/p/pr/proy/htdocs/, sustituyendo lo de p/pr/proy por la primera inicial de tu proyecto, más las dos segundas y el nombre.
Extensión de plazo: Segundo fin de semana
El sábado, otra vez con tiempo, decidí que había que ponerle unos gráficos a los resultados. Para ello cogí ideas de Apples to Oranges y, sobre todo, Standards Schmandards, pero ninguna de las dos me convencían porque utilizaban una imagen. Aparte de que yo no quería degradados ni efectos raros (perdí un par de horas probando distintos degradados, colores y bordes hasta que me convencí de que lo mejor era hacerlo con un relleno sólido), si metía una imagen no podía exportar a una página web HTML sin más. Al final modifiqué la técnica de Standards Schmandards para utilizar un div en vez de un img y quedé muy contento con el resultado. El proceso de desarrollo bajó de velocidad porque me dedicaba cada poco a abrir la ventana de estadísticas y quedarme extasiado de lo bonita que quedaba... ;-)
Una vez contento con las pintas de la extensión y el resto de la imagen de marca, decidí intentar arreglar algún problema serio. Empecé con uno que arrastraba desde el domingo pasado: el fichero HTML no tenía estilos. El problema es que los estilos los cargaba con un import de un url tipo chrome://tbstats/skin/tbstatsResults.css. Eso del chrome funciona dentro de Thunderbird, pero cuando genero a un archivo, no, claro. Así que tenía que sustituir la línea del import por el contenido del fichero. Estuve buscando varias alternativas: sacar del elemento correspondiente el estilo de alguna manera, una función que me permitiese leer el fichero a una cadena fácilmente (esto lo podría haber hecho yo y a lo mejor hubiese acabado muchísimo antes, pero me parecía algo tan obvio que no le encontraba sentido a hacerlo yo en vez de reutilizarlo)... Al final, mirando cómo hace Webdeveloper para mostrar el CSS de una página, encontré la solución: a través de un XMLHttpRequest. Y así, sin proponerlo, he entrado de lleno en la Web 2.0. ¿Puedo poner ya en el currículum que sé programar en AJAX? ;-)
Por último, me puse con el gran problema del «Unresponsive script». La solución me llevó media mañana del domingo (la otra media, para escribir esto y todo el asunto del setTimeout). Ahora ya consideraba que la extensión estaba lista para publicarse, así que hice la primera release, con su correspondiente anuncio.
Mostrando en público las vergüenzas
La publicación consistió en subir la versión a SourceForge y poner un mensaje en los MozillaZine Forums. Hubo una persona que probó la extensión e hizo unas cuantas críticas muy constructivas. Algunas son cosas que yo había visto que estaban mal, pero quería publicar ya. Como ya tenía un usuario quejándose, decidí arreglar las más importantes.
Por otra parte, me he encontrado con problemas con SourceForge: cuando saqué la primera versión, me escribió una persona diciéndome que el fichero que se bajaba estaba corrupto y ha vuelto a ocurrir con otro usuario en esta segunda versión.
En resumen, ha sido una experiencia muy interesante. Ah, si alguien está interesado, puede visitar la página web de la extensión: tbStats.
Llevaba años con esa pequeña frustración, hasta que hace unas semanas vi esta historia: «How To Build a Game In A Week From Scratch With No Budget». El autor decidía que iba a dedicar 40 horas (el equivalente a una semana de trabajo) en desarrollar un juego completo, aunque sencillo, desde cero. Su conclusión es que había sido un ejercicio muy interesante que le había enseñado muchas cosas.
Inspirado por él, y ante la coyuntura de cuatro días de fiesta en los que podía escoger entre acudir a un Paso de Semana Santa en la A-6 o quedarme en casa haciendo algo interesante, decidí intentarlo: cuatro días para hacer una extensión que calculase estadísticas para mi correo.
Objetivos que me planteé:
1) Hacer una extensión completa, aunque tuviese muy poca funcionalidad, pero que lo que tuviese funcionase.
2) Publicarla como software libre, por si alguien quería utilizarla o incluso mejorarla.
3) Hacerlo en cuatro días.
Aunque podía haberlo dejado después de los cuatro días, cuando tenía una extensión funcionando, al final me di una extensión de tiempo y la semana siguiente estuve mejorando algunos aspectos de interfaz. Voy a contar un poco la historia del desarrollo, no hora a hora como el artículo original, pero con unos cuantos detalles de cosas que he aprendido y que pueden servir para otra persona que quiera hacer una extensión similar.
Día 1. Jueves Santo: Aprendiendo a programar extensiones
Empezaba de cero: no tenía ni idea de cómo funcionaban las extensiones para Thunderbird. Así que tirando de Google, llegué a dos recursos básicos: el tutorial de desarrollo de la extensión «Hola, mundo» y un blog en el que se cuentan detalles del desarrollo de extensiones para Thunderbird. El problema del primero, como ya conté en su momento, es que estaba dedicado a Firefox y me costó mucho conseguir el sencillo «Hola, mundo» en Thunderbid.
A media tarde del jueves mi extensión ya saludaba, así que mi siguiente paso fue conseguir aprender a recorrer las carpetas, para luego recorrer los mensajes y sacar las estadísticas. Ahí estaba peleándome sobre todo con dos entradas del blog antes mencionado: Navigating Folders y A Better Way to Navigate Folders. Con el primer método no me funcionaba, porque llama a la función GetDBView: yo la intentaba llamar desde la nueva ventana que estaba creando, pero la función está en el código de Thunderbird y sólo puede ser llamada desde un overlay. Con el segundo método tuve más éxito y me fui muy contento a la cama: había conseguido recorrer las carpetas. Ahora sólo era cuestión de recorrer los mensajes.
Día 2. Viernes santo: El mensaje
Lo de recorrer los mensajes, que parecía algo sencillo, se convirtió en algo muy difícil. Me estuve pegando mucho, buscando por Google, leyendo la incompleta documentación sobre XUL y bajándome otras extensiones para mirar su código. Casi ninguna hacía lo que yo quería, recorrer todos los mensajes, sino que se dedicaban a hacer pequeños cambios en el interfaz que solían actuar sobre el mensaje seleccionado. Al final me encontré con Quick File y, sobre todo, Remove Duplicate Messages, que hacía lo que yo quería. Mirando su código saqué la forma de recorrer todos los mensajes.
Una vez que conseguí este objetivo, ya sólo se trataba de sacar información sobre cada mensaje. Con un poco de XPCOM obtenido del propio código de Thunderbird, estuvo solucionado. Ahora ya parecía sólo cuestión de echar tiempo programando.
Día 3. Sábado santo: Refactorización, hilos e interfaz
El sábado, como ya he contado, me puse a hacer refactorización y a intentar poner una barra de progreso. Fue cuando me lié con el asunto de los hilos. Al final conseguí hacerlo con el setTimeout, aunque no de manera perfecta porque seguía apareciéndome el mensaje de «Unresponsive script», aunque sólo cuando tenía una carpeta muy grande.
Además del procesamiento de los mensajes, estaba también el asunto de generar los resultados. Opté por la solución que me parecía más sencilla: mostrarlos en un iframe dentro de una nueva ventana de Thunderbird. Como el iframe recibe código HTML, con unas cuantas tablas se solucionaba el asunto.
Día 4. Domingo santo: Intento de rematar
El domingo dediqué casi todo el tiempo (casi todo el tiempo que dediqué a la extensión, también hice otras cosas, como el resto de días) a mejorar la presentación de resultados. Para empezar, le puse un poco de estilo a las tablas. Hice unas cuantas refactorizaciones para hacer métodos genéricos que funcionasen con las distintas tablas que tenía y aprecié la potencia y la facilidad que ofrece el Javascript al no tener tipos estáticos.
Me planteé también hacer la salida a fichero, en formato HTML y en TSV. Lo de hacer la salida a disco me llevó a buscar una librería de Javascript que solucionase ese problema. Decidí utilizar el código de Robert Ginda.
El fichero en HTML parecía fácil: ya lo tenía en el iframe y sólo era escribirlo a disco. Me funcionaba cuando no tenía CSS, pero cuando lo metí, empezaron los problemas. Aunque sin estilo, el fichero con los datos estaba ahí, así que decidí dejar ese problema aparcado.
El fichero TSV no tuvo muchos problemas y permitió abrir los datos fácilmente en Excel y hacer gráficos con ellos: ¡guau! :-)
Después añadí soporte para localización: las cadenas que estaban metidas directamente en el código pasaron a ser parte de una especie de ficheros de recursos que tienen las extensiones. Rutinario.
Se acababa el domingo y llegaba el momento de publicar la extensión. Había dos inconvenientes: no tenía claro el nombre y no sabía dónde subirla.
Sobre lo primero, en principio la había llamado «Thunderbird Statistics», pero me hacía los nombres de las clases muy largos y, además, me fijé que las extensiones no solían tener lo de «Thunderbird» (o «Firefox») en el nombre. Algunas opciones que se me ocurrieron fueron «Thunderstats» (ya existe), «Mailstats» (ya existe), «Statszilla» (ya existe), «Statisticszilla» (no existe, pero no me extraña: no hay quien lo pronuncia ni quien lo escriba bien a la primera si no se tiene cuidado)... Al final me quedé con «tbStats». Da pocos resultados en Google (200) y no parece que nada tenga que ver con estadísticas de correo.
Para el problema de alojar la extensión, estaba buscando un sitio que ofreciese acceso al código fuente con Subversion y que permitiese también alojar una página para ella. Encontré esta comparativa y, echando un vistazo, el que más me convenció fue BerliOS. Intenté registrarme. Un par de veces: nunca me llegó el correo de registro. Así que, a última hora, me decidí por SourceForge. En principio no me gustaba porque creo que la página es un lío con tantas opciones, pero al darte la posibilidad de hacer tu propia página, se soluciona ese problema.
Me puse a registrarme y me encontré con un proceso muy cuidado: tienes que tener clara la licencia de tu código, cómo se va a llamar, cómo categorizarlo... Al final del proceso, tu solicitud queda pendiente de que la revise un humano, pero eso en horario laborable. Así que ahí se me acabó el domingo y sin haber conseguido publicar. Decidí darme una extensión del plazo
Extensión del plazo: Entre semana
Durante la semana, fui trabajando por las noches, algunas, porque con el trabajo normal no siempre tengo ganas de seguir peleando contra el ordenador cuando llego a casa.
El lunes me aceptaron el proyecto y estuve explorando un poco SourceForge. Subí el código por primera vez al repositorio Subversion. En teoría, ya podía hacer un lanzamiento y publicar la extensión, pero me parecía que sería conveniente tener una página web hecha para la gente que quisiera visitarla y, además, había algunos detalles (ausencia de gráficos, el mensaje del script que no responde, el estilo de los resultados no muy atractivo, tenía el icono por defecto...) que me parecía que había que trabajarlos un poco más.
Hasta el viernes me dediqué básicamente a aspectos de estilo: hacer un logo, la página web, cambiar colores y fuentes, hacer el icono... Las horas empleadas con el Photoshop fueron unas cuantas. Por cierto, me pareció que estaba muy mal explicado en SourceForge cómo subir la página web. Hay que hacer un SFTP a shell.sourceforge.net con tu nombre de usuario y contraseña, y luego el directorio es /home/groups/p/pr/proy/htdocs/, sustituyendo lo de p/pr/proy por la primera inicial de tu proyecto, más las dos segundas y el nombre.
Extensión de plazo: Segundo fin de semana
El sábado, otra vez con tiempo, decidí que había que ponerle unos gráficos a los resultados. Para ello cogí ideas de Apples to Oranges y, sobre todo, Standards Schmandards, pero ninguna de las dos me convencían porque utilizaban una imagen. Aparte de que yo no quería degradados ni efectos raros (perdí un par de horas probando distintos degradados, colores y bordes hasta que me convencí de que lo mejor era hacerlo con un relleno sólido), si metía una imagen no podía exportar a una página web HTML sin más. Al final modifiqué la técnica de Standards Schmandards para utilizar un div en vez de un img y quedé muy contento con el resultado. El proceso de desarrollo bajó de velocidad porque me dedicaba cada poco a abrir la ventana de estadísticas y quedarme extasiado de lo bonita que quedaba... ;-)
Una vez contento con las pintas de la extensión y el resto de la imagen de marca, decidí intentar arreglar algún problema serio. Empecé con uno que arrastraba desde el domingo pasado: el fichero HTML no tenía estilos. El problema es que los estilos los cargaba con un import de un url tipo chrome://tbstats/skin/tbstatsResults.css. Eso del chrome funciona dentro de Thunderbird, pero cuando genero a un archivo, no, claro. Así que tenía que sustituir la línea del import por el contenido del fichero. Estuve buscando varias alternativas: sacar del elemento correspondiente el estilo de alguna manera, una función que me permitiese leer el fichero a una cadena fácilmente (esto lo podría haber hecho yo y a lo mejor hubiese acabado muchísimo antes, pero me parecía algo tan obvio que no le encontraba sentido a hacerlo yo en vez de reutilizarlo)... Al final, mirando cómo hace Webdeveloper para mostrar el CSS de una página, encontré la solución: a través de un XMLHttpRequest. Y así, sin proponerlo, he entrado de lleno en la Web 2.0. ¿Puedo poner ya en el currículum que sé programar en AJAX? ;-)
Por último, me puse con el gran problema del «Unresponsive script». La solución me llevó media mañana del domingo (la otra media, para escribir esto y todo el asunto del setTimeout). Ahora ya consideraba que la extensión estaba lista para publicarse, así que hice la primera release, con su correspondiente anuncio.
Mostrando en público las vergüenzas
La publicación consistió en subir la versión a SourceForge y poner un mensaje en los MozillaZine Forums. Hubo una persona que probó la extensión e hizo unas cuantas críticas muy constructivas. Algunas son cosas que yo había visto que estaban mal, pero quería publicar ya. Como ya tenía un usuario quejándose, decidí arreglar las más importantes.
Por otra parte, me he encontrado con problemas con SourceForge: cuando saqué la primera versión, me escribió una persona diciéndome que el fichero que se bajaba estaba corrupto y ha vuelto a ocurrir con otro usuario en esta segunda versión.
En resumen, ha sido una experiencia muy interesante. Ah, si alguien está interesado, puede visitar la página web de la extensión: tbStats.
Comentarios:
Muy interesante tu post. Lo que se puede hacer con ganas, conocimiento y unos días entre manos.
Enhorabuena por la publicación.
Enhorabuena por la publicación.
Con más ganas que conocimientos :-)
Precisamente algo similar pensé yo cuando vi lo del juego de Python. Hay que lanzarse a ello.
Publicar un comentario
Precisamente algo similar pensé yo cuando vi lo del juego de Python. Hay que lanzarse a ello.