El cheque

Por andar clavado programando, se me había olvidado mencionarlo: Google me envió mi primer cheque de AdSense:

El cheque

El cheque

Yay!

La verdad es que es bien poquito… pero es por escribir en mi blog, que lo hago por gusto. Así que está bien que al menos saque para los chicles.

Avances en Geom

Los últimos 2 días estuve concentrado en programar; ni siquiera moderé comentarios del blog. Avancé bastante, y Geom comienza a tomar forma de algo similar a lo que he tenido en mente desde que inicié el proyecto.

Geom

Geom

También hay un screencast (en Flash de nuevo; lo siento). Aguas; este mide 2.7 megas (aunque en esta época de banda ancha no creo que importe demasiado).

Creo que lo básico de la infraestructura ya está ahí; ahora me estoy peleando (obviamente) con cómo manejar la interfaz. Al hacer el screencast, por ejemplo, fue dolorosamente evidente que necesito poder seleccionar por grupo (ahora selecciono punto por punto). No tengo idea de cómo hacer eso.

(Bueno, sí tengo idea, sólo no sé si sea la correcta).

Y faltan muchas cosas. Comenzando con que con cada cosa de CCC que uso, no es raro que aparezca algo que no funciona. Por ejemplo, por alguna razón CCC no detecta eventos del teclado; y eso es bastante grave dado que tenía pensado usar el teclado para facilitar muchas acciones. Ya reporté el bug en bugzilla. Otra: por alguna razón, las líneas en CCC no se estaban borrando al moverlas; ahorita le estoy dando la vuelta con un método que funciona, pero que es lentísimo: comienza a sentirse más y más lento el programa cuando uno mueve muchas líneas a la vez.

Pero a Geom en sí mismo le falta bastantito:

  • Seleccionar en grupo (ya lo dije)
  • Implementar undo y redo
  • Implementar cortar, copiar, pegar (cortar es sencillo)
  • Guardar y abrir archivos; ya me cansé de repetir los ejemplos cada vez que abro geom
  • Definir un formato en XML para guardar archivos
  • Permitir seleccionar las herramientas sin que el número de puntos esté seleccionado; ahorita si trato de crear un círculo con tres puntos sin tener dichos puntos seleccionados, el programa sencillamente se niega
  • Poner una página y SVN para el programa; podría usar ayuda de más gente
  • Conquistar el mundo

Falta un buen. Pero dado que llevo dos semanas (y sólo unas cuantas horas al día) haciendo esto, creo que no va mal.

Y ahora sí, puedo regresar a cosas como moderar los comentarios de mi blog.

Tengo un enorme micrófono, y haré uso de él

Estaba leyendo mis páginas de todos los días, y cuando finalmente llegué a Planet GNOME me encontré con esto. Para los que les de flojera seguir ligas, esto es lo que Sven publicó en su blog (y que por tanto apareció en Planet GNOME):

Canek Peláez Valdés is creating a nice geometry application (english) based upon the CCC canvas library. There’s even a really interesting flash demo (english) that demonstrates some of the ideas for the application.

He’s blogging a lot right now, which might be a pretty nice addition for Planet GNOME Hispano.

Lo primero que pensé fue “cool, mi nombre apareció en Planet GNOME”… hasta que fui a Planet GNOME Hispano y vi que mi nombre está en la lista de miembros (se ve ahí, luego luego a la derecha).

Aunque por alguna razón la liga que tienen ahí no es a mi blog… pero bueno.

Como sea; un saludo a todos los lectores del Planeta GNOME Hispano (si es que mi blog sí está siendo republicado ahí), y para los administradores del Planeta: creé una categoría GNOME en mi blog, porque publico mucho en mi blog de muchas cosas que tal vez no sea del interés de sus lectores.

Glade

Teniendo la funcionalidad mínima del canvas que necesito, y un prototipo funcionando, me puse a hacer la interfaz del programa de geometría. No me termina de quedar claro exactamente cómo la quiero, pero una primera idea es esto (que ya está funcionando):

Interfaz de Geom

Interface de Geom

Tampoco es permanente el nombre de “Geom”; pero la verdad me está gustando.

La idea hasta ahora es simple: si se selecciona la “herramienta” de puntos, uno puede poner puntos a lo bestia. Si se selecciona la de recta (por ejemplo), una de dos: o están seleccionados dos puntos (y automáticamente se crea la recta), o el usuario pone el punto o puntos necesarios para que se cree. Etc.

La flecha es para seleccionar puntos libres y moverlos. Por ahora ni me cruza por la cabeza el mover construcciones no libres… y tampoco me queda 100% claro qué sea libre.

La interfaz la hice en Glade3, que nunca había usado (sólo había usado Glade2). Está bien bonito; y quitaron la generación de código automática, lo que me forzó a utilizar libglade. Pero jaló de pelos, si bien el programa para hacer las interfaces tiene sus problemas… por decir lo menos: tuve que editar varias veces el archivo XML a pie. Pero no me quejo; me está gustando cómo va quedando esto.

Falta mucho; pero hay progreso.

Git

Cuando Percy le envía a Ron la carta donde le dice que se aleje de Harry, en Harry Potter y la Orden del Fénix, Ron rompe la carta y dice que Percy es el “world’s biggest git”. Git (como lo define Wiktionary) es

  1. (British slang) A contemptible person.

    Elissa is a right git.

  2. (British slang) A stupid or unpleasant person.

    Jacko is a git.

Bueno. De eso no voy a hablar ahora.

De lo que voy a hablar es de Git, el programa iniciado por Linus Torvalds para reemplazar a BitKeeper como sistema de control de versiones.

Yo no tengo mucha experiencia con sistemas de control de versiones; he usado CVS y tengo todos mis documentos en Subversion desde hace ya algunos años. Fuera de eso, sólo de vez en cuando he utilizado otros sistemas como Bazaar para bajar algún proyecto que me interesara cuando lo estaban desarrollando.

Hay distintos desarrolladores que defienden uno u otro sistema de control de versiones; algunos al punto del fanatismo. Todos los repositorios de GNOME se cambiaron de CVS a Subversion en estos días (después de un intento fallido hace seis meses), y eso desató toda una discusión por parte de la gente que no le gusta Subversion.

Como sea, yo no me he metido en eso. Subversion me funciona a mí para mantener mis documentos bajo control de versiones, pero no me he puesto a ver si hay algo mejor o más rápido o que proteja a los gatitos indefensos.

Pero para mi programa de geometría necesito un canvas, y lo único que se ve que será usable en un tiempo razonable (para GNOME, obviamente) es el Criawips/CriaCanvas, o CCC.

Sven Herzberg es el lead developer del proyecto (creo que es el único de hecho), y cuando descubrí su canvas la única página que había disponible daba como repositorio uno en Subversion. De ahí bajé el código y comencé a usarlo, hasta que me di cuenta que no tenía forma de manipular el orden en que se dibujan los elementos en el canvas; eso es malo, porque en un programa como el que yo quiero hacer los puntos deben estar “hasta arriba” (top layer) siempre.

Así que escribí una implementación rápida, y se la mandé por correo a Sven, preguntándole si se podría incluir. Me respondió diciéndome que el repositorio en Subversion estaba deprecado (el nuevo está en Git), y dándome unos consejos para mejorar la implementación que había hecho.

Así que bajé la versión que había en el repositorio en Git, reescribí mi implementación y se la mandé a Sven. Él la incluyó en el repositorio, y me pidió que escribiera un demo de lo que había hecho para un programa incluido con CCC que muestra pequeños ejemplos de lo que ofrece la biblioteca. Después de escribir mi prototipo hice el demo, que de hecho me hizo descubrir dos bugs en CCC; uno en lo que yo había contribuido, y otro en otra parte del sistema.

Total que ya le he enviado como siete parches a Sven, y estoy contribuyendo regularmente con el proyecto; me conviene, porque lo necesito para mi programa.

Pero el punto es que he tenido que usar Git bastante, y debo admitir que está bastante chido. Sobre todo porque yo suelo desarrollar en mi desktop y en mi laptop; entonces hago un pull del repositorio de Sven en mi desktop, y después hago un pull de mi desktop a mi laptop. Si se desincronizan puedo hacer (de forma bastante sencilla) un merge entre mi desktop y mi laptop; y además tengo un branch para mis propios cambios (que también puedo sincronizar entre mi laptop y desktop), con lo cual puedo generar parches fáciles de enviar para Sven.

En pocas palabras; Git está poca madre para desarrollo distribuido. Después de leer durante años cómo Linus trabaja para mantener el kernel, puedo entender perfectamente por qué desarrolló así el programa. Lo chistoso es que funcione igual de bien para el kernel (cientos de megas de código fuente, literalmente miles de programadores), y para un bibliotequita como CCC (dos megas de código fuente, un puñado de programadores).

Ahora: no sé si Git sea una solución “mejor” que Subversion. En particular, es bastante complejo (más que Subversion sin duda), consecuencia obvia de que es (creo) más poderoso. También come disco duro como si fuera gratis: de los dos megas que usa CCC, mi copia del repositorio genera casi doce. Y no es terriblemente intuitivo, especialmente si uno viene de sistemas como CVS.

Pero está muy, muy bonito. Sí tiene cosas bastante interesantes.

No voy a pasar mis documentos de Subversion a Git (Subversion es perfecto para ese caso de uso); pero en parte creo que he colaborado de forma tan sencilla con Sven porque Git lo facilita. Eso, y que necesito a CCC para mi programa.

Fantastic Four: Rise of the Silver Surfer

Acabo de ver el trailer de Fantastc For: Rise of the Silver Surfer. Se ve poca madre, especialmente el titular Silver Surfer:

Silver Surfer

Silver Surfer

Yo sé que la primera película no fue muy buena (aunque ganó 330 millones de dólares); pero tal vez por las pocas expectativas que tenía, a mí me gustó bastante. Quién sabe; igual y esta segunda parte es mucho mejor que la primera. Al menos eso espero; pero incluso me contentaría con una similar a la primera.

Silver Surfer

Silver Surfer

Por supuesto, que aparezca el Silver Surfer hacía casi obligatorio que lo haga también Galactus, el devorador de mundos. En la Wikipedia dicen que sí aparecerá, y nada más por eso valdría la pena ver la película. Digo, ver a Galactus en pantalla grande puede (del verbo “vamos a ver cómo les sale”) ser fabuloso.

Silver Surfer

Silver Surfer

Vamos a ver cómo sale. A ver si por tener mejores expectativas esta vez resulta que me gusta menos la secuela.

Primer prototipo del programa de geometría

Después de estudiar un poco el sistema de tipos de GObject, escribir algo de código, bajar la versión de desarrollo de CCC, corregirle unos bugs que tenía, agregarle funciones que necesitaba, y pelearme con vnc2swf, por fin quedó mi primer prototipo (recalco, prototipo) de mi programa de geometría.

La parte en que me peleé con vnc2swf fue porque un screenshot no refleja realmente nada del prototipo, así que hice un screencast en Flash. Lamento hacerlo en algo que no es libre, pero Istanbul sencillamente me falló (además de que estoy seguro que la mayor parte de mis lectores no tiene los codecs de Ogg Theora), y el otro que había usado que genera GIFs sacaba unas “animaciones” bastante chafas.

Así que les dejó la animación; es sólo un prototipo (repito): me falta mucho para tener lo que realmente busco. Pero hay progreso.

Por cierto, el código JavaScript para controlar la barra de búsqueda de la animación puede matar al Internet Explorer. O al menos eso decía el código.

Actualización: Quité la barra de búsqueda en JavaScript. Sencillamente no funcionaba.

GObject

Comencé a trabajar en mi programa de geometría, pero rápidamente me di cuenta de que, si lo hacía en C tradicional, el diseño iba a ser significativamente distinto de cómo originalmente lo había planeado.

En particular, en Java ya tenía algunas clases para manejar las construcciones geométricas; nada de cómo dibujarlas en pantalla, sólo cómo relacionarlas entre ellas. Y estaba usando herencia mucho, porque es lo correcto hacer aquí.

En C por supuesto no hay herencia, y si me seguía por un camino de estructuras con funciones me iban a alterar bastante las cosas. Nada realmente grave (se puede hacer así también), pero no como yo lo quería originalmente.

Así que me lancé el clavado de por fin aprender a usar GObject, el sistema de tipos (con herencia e interfaces) para C que usa GLib, Gtk+, y por consiguiente GNOME y amiguitos. Nunca lo había querido aprender a usar porque me daba bastante hueva, y no había tenido necesidad realmente.

Está bastante chido. Sí hay un montón de cosas que hay que hacer a pata, un montón de código repetido, y la herencia tiene sus bemoles. Por ejemplo, hay que hacer cast cuando uno quiere ver al objeto como si fuera de una clase más particular, obviamente; pero también uno tiene que hacer cast cuando se quiere ver al objeto como si fuera de una clase más general. O sea, en pocas palabras, se tiene que hacer cast siempre.

Pero funciona, y bastante chido además. Como consecuencia, mi diseño con herencia está básicamente intacto, y además está bastante divertido usar GObject (aunque sin duda es mucho más engorroso que usar un lenguaje OO de verdad). Y claro, no he aprendido bien todo; apenas estoy viendo cómo definir métodos virtuales, y no sé nada aún acerca de cómo definir y usar interfaces con GObject.

Pero está entretenido sin duda alguna.

La comodidad de usar software libre

Hace ya un rato (casi año y medio) decidí que usaría F-Spot para manejar las fotos que tomo con mi cámara digital. Algunas semanas después por fin me decidí a usar Gallery2 para mi álbum en línea (la otra opción era Coppermine).

En un principio no se llevaban muy bien que digamos; con F-Spot exportaba las fotos a un “VFS folder”, que era una conexión SSH a mi galería en línea, a un directorio especial, y usando la interfaz administrativa de Gallery2 acomodaba las fotos en el álbum o álbumes correspondientes. Y después repetía el engorroso proceso de ponerle título a las fotos (cosa que también hacía en F-Spot, por lo que era hacer dos veces la misma tarea).

Estoy muy orgulloso de que mi galería en línea tenga títulos para todas y cada una de las fotos. Y además es condenadamente útil: si en la caja de búsqueda le pico “fulano”, aparecen todas las fotos de Fulano.

Después de un tiempo, F-Spot o Mono (o ambos) comenzaron a estar medio inestables, y la opción de exportar a un directorio VFS se amoló. Funcionaba para directorios locales, pero no para SSH, así que exportaba a un directorio local, y luego subía las fotos al directorio especial de Gallery2 y repetía desde ahí el proceso anterior.

Lo feo fue cuando dejó de funcionar hasta para directorios locales. Como no podía exportar, tenía que escalar las fotos a pie; de hecho eso es lo más chido de cómo exporta las fotos F-Spot, que las escala como uno quiera (no voy a subir fotos de 7.2 megapixeles a una galería en línea). Y no podía hacerlo con algo como ImageMagick, porque entonces perdía la información EXIF de las fotos (y ahí van cosas como la fecha).

Así que abría las fotos en The Gimp, las escalaba, y las subía. De hueva.

Hace unos días de pura casualidad revisé el exportador de F-Spot para una galería en línea. Al inicio F-Spot no tenía tal cosa, y cuando por fin la tuvo no sólo no funcionaba; no recuerdo exactamente qué pasaba, pero jodía a la misma galería en línea. Así que nunca la usé realmente, y cuando empezó a fallar con la exportación a directorios VFS, supuse que estaría aún peor la exportación a galería en línea.

Pero esta vez que volví a revisarla, aparentemente funcionaba. Así que con las fotos de la fiesta de año nuevo decidí subirlas usando esta opción.

Es una maravilla. Uno crea el álbum en la galería en línea, y después en F-Spot uno selecciona las fotos, le da exportar a galería en línea, elige el álbum, a qué resolución escalara las fotos, y listo. El programa hace absolutamente todo lo demás. Incluso exporta los títulos de las fotos, así que ya nunca más tendré que capturarlos dos veces.

(También hay que dar de alta la galería, para definir el usuario y password de la misma; pero eso se hace una única vez).

Y eso es lo que me gusta del software libre. Al inicio tenía un par de herramientas que más o menos funcionaban; pero hubo gente (un montón de gente) que se puso a trabajar en las fallas o debilidades de ambos programas, y ahora tengo dos herramientas que entre ellas se comunican sin ningún problema y me ahorran bastante trabajo.

E incluso creo que puedo crear el álbum desde F-Spot. Voy a intentar eso la próxima vez que suba fotos. Pero si no funciona, no importa: dentro de poco funcionará.

En el peor de los casos puedo programarlo yo mismo.

La fiesta de año nuevo

En mi casa celebramos con bastantes ganas el año nuevo. Siempre ha sido como que la celebración importante del año, y en general siempre hay bastante gente en mi casa el 31 de diciembre.

Esta vez no fue la excepción, pero también tomé fotos; en particular de la comida, porque mi madre hace sus pechugas de pollo rellenas de tocino y queso amarillo con ensalada de manzana sólo una vez al año.

Las pechugas y el espagueti

Las pechugas y el espagueti

Estuvo bastante divertido; nos acostamos a las cinco de la mañana, así que acabamos medio cansados, pero estuvo muy chido.