Y ahora de regreso también

Hace poco más de un mes, describí cómo configurar Emacs para ligarlo a Evince, de tal forma que si compilamos un archivo \LaTeX a PDF con la opción -synctex=1, y al hacer Control-click en una parte del PDF, Emacs enmarque el archivo .tex en la línea correspondiente.

A los pocos días Omar me comentó que sí servía, y se quejó amargamente de que no funcionaba al revés: que dentro de Emacs mi código (que estaba basado en en el de aquí) no permitía saltar dentro del PDF a la región de texto correspondiente al archivo .tex.

Por supuesto, una vez más, sí se puede: estamos hablando de Emacs al fin y al cabo. Sólo que yo estaba atareadísimo terminando de escribir un artículo y las notas para otro, y los fines de semana yendo a la CN Tower y a las cataratas del Niágara, y no había tenido tiempo de revisar el código. Además, es Emacs Lisp, que la verdad (como todos los lenguajes tipo Lisp) tiendo a aborrecer ligeramente.

Por fin hace unos días revisé el código, y lo primero que hice fue corregir y mejorar algunas cosas de la primera parte, lo que hace que Evince se comunique con Emacs. El código funcionaba porque el alcance de las variables en Emacs Lisp no tiene sentido; en un lenguaje más sensato hubiera fallado miserablemente. Corregí eso y así quedó:

(require 'dbus)

(defun goto-line-and-recenter (line col)
    (goto-line line)
    (recenter line)
    (raise-frame))

(defun synctex-find-file (buf line col)
  (find-file buf)
  (goto-line-and-recenter line col))

(defun synctex-switch-to-buffer (buf line col)
  (switch-to-buffer buf)
  (goto-line-and-recenter line col))

(defun evince-backwards-sync (file linecol time)
  (let ((buf (get-file-buffer (substring file 7)))
        (line (car linecol))
        (col (cdr linecol)))
    (if (null buf)
      (synctex-find-file (substring file 7) line col)
      (synctex-switch-to-buffer buf line col))))

(dbus-register-signal
 :session nil "/org/gnome/evince/Window/0"
 "org.gnome.evince.Window" "SyncSource"
 'evince-backwards-sync)

Quedó un poquito más corto y más bonito; aunque en GNOME 3 sigue sin levantar la ventana de Emacs cuando se enmarca el documento (otra queja amarga de Omar). En otros escritorios debería levantarla: no tengo acceso a otros escritorios ahorita, y aunque lo tuviera la verdad me da mucha hueva comprobarlo.

Después comencé a ver el otro lado, que Emacs se comunique con Evince, y resulta que es similarmente sencillo, exceptuando el hecho de que Emacs Lisp es de esos lenguajes idiotas que dicen ser débilmente tipificados, lo cual significa que los tipos fallan justo cuando uno no quiere que fallen. Siendo justo, el problema realmente es que DBus es fuertemente tipificado, y entonces a veces hay que darle una manita a Emacs Lisp para que sepa cuál es el tipo que debe enviar por el cable (de ahí los feos :int32 que de repente aparecen en el código).

El código correspondiente me quedó así:

(defun get-evince-document (file)
  (dbus-call-method
   :session "org.gnome.evince.Daemon" "/org/gnome/evince/Daemon"
   "org.gnome.evince.Daemon" "FindDocument"
   (concat "file://" (replace-regexp-in-string "tex$" "pdf" file)) t))

(defun evince-forwards-sync (file line col)
  (dbus-call-method 
   :session (get-evince-document file) "/org/gnome/evince/Window/0"
   "org.gnome.evince.Window" "SyncView"
   file (list :struct :int32 line :int32 col) 0))

(defun current-line-number ()
  (1+ (count-lines 1 (point))))

(defun do-evince-forwards-sync ()
  (interactive)
  (if (not (null (buffer-file-name)))
      (if (not (buffer-modified-p))
	  (if (string-equal (substring (buffer-file-name) -4)
			    ".tex")
	      (if (file-exists-p (replace-regexp-in-string 
				  "tex$" "pdf"
				  (buffer-file-name)))
		  (evince-forwards-sync (buffer-file-name)
					(current-line-number) 1)
		(message "You need to PDFLaTeX your file."))
	    (message "You can only forward sync LaTeX files."))
	(message "You need to save your buffer first"))
    (message "Forward sync only works in file buffers.")))

Además yo en particular puse

(global-set-key (kbd "< f1 >") 'do-evince-forwards-sync)

en mi .emacs, así que ahora si le pico F1 a mi compu mientras Emacs está en un archivo .tex que esté salvado, inmediatamente manda al PDF a la página correspondiente en Evince. De nuevo, GNOME 3 no permite que una aplicación le robe el foco a otra, así que Evince no se levanta, pero debería hacerlo en otros escritorios.

Está bastante padre cómo funciona el asunto, y además funciona (me parece) de forma suficientemente robusta. Ciertamente espero usarlo mucho durante los próximos artículos que escriba.

GNOME 3.0

Después de romperme la cabeza durante días, por fin pude instalar bien GNOME 3.0 en mi laptop. El problema fue que uso systemd, el nuevo sistema de inicio, y éste no es estándar en Gentoo; la nueva versión de GNOME necesita un pequeño demonio que se encarga de todas las cuentas de usuario del sistema. De ahí se cuelga GDM para autenticar al usuario, NetworkManager para autenticar la red, el manejador de sesiones para asegurarse de que el usuario tenga permiso de suspender la máquina, etc., etc. Este demonio es levantado por el sistema de inicio normal de Gentoo, OpenRC, pero yo no lo hacía en sytemd (y de hecho, como estaba el ebuild de Gentoo ni siquiera se instalaba el archivo de servicio para systemd). Arreglé eso y todo funcionó a la perfección.

Llevo usando GNOME 3.0 (ya completamente funcional) poco más de un día, y ha sido sorprendentemente fácil el irse acostumbrando al nuevo modelo que impone el sistema, considerando que es completamente distinto al de GNOME 2. Algunas cosas necesitan un paso más que antes, otras todavía no es posible hacerlas únicamente con el teclado (un gran problema para gente como yo, que depende en gran medida del teclado para hacer todo rápido), y está medio rasposo en algunos puntos; pero en general todo me está gustando.

Se ve bonito el nuevo GNOME, y ciertamente parece (en mi opinión) cumplir la promesa de “no meterse” a la hora de que uno quiere realizar trabajo con él. Sigo ponderando qué tanta gritadera habrá por parte de la gente reacia al cambio (considerando además que GNOME hay un conjunto de usuarios de Linux que parecen odiarlo a un grado semi irracional), pero creo que los que lo diseñaron dieron en el blanco; es mi opinión que el futuro de las interfaces gráficas para escritorio es algo parecido a lo que GNOME está intentando hacer. Tiene ciertas similitudes con Mac OS X (yo ya casi no le veo ninguna con Windows, pero las nuevas versiones de Windows casi nunca las he usado), pero en general es un paradigma completamente distinto.

Por ejemplo, ya no tiene un menú para aplicaciones; uno entra a un overview y o bien selecciona una aplicación de un dashboard con favoritos, o comienza a escribir el nombre de la misma hasta que su icono aparece y uno lo selecciona y le da enter, o le hace click. Eso nada más va a sacar de quicio a muchísima gente, y sin embargo es sorprendentemente rápido (es de las cosas que pueden hacerse únicamente con el teclado). Sólo cuesta un poco acostumbrarse.

GNOME 3.0 no es un escritorio configurable; si eso es lo que buscan, más bien lléguenle a otra cosa. En GNOME 3.0 se puede cambiar la imagen del fondo del escritorio… y básicamente es lo único que se puede cambiar. La idea es que las opciones por omisión sean en general las “correctas”, y siempre esperando que sean las que más productividad le den al usuario. La idea es maravillosa hasta cierto punto: uno no compra un carro y después se pasa meses cambiándole las llantas u optimizando el motor. El carro debería funcionar tal y cual como viene de fábrica; lo mismo con casi cualquier aparato que cualquiera tenga en su casa.

Pero a mucha gente no le gustará. Yo esperaré a que la tormenta pase, y seguiré usándolo, porque creo que es una buena idea, y además me gusta y cada vez estoy más cómodo con este nuevo escritorio. Y ciertamente no he tenido broncas de estabillidad, que después de oír las historias de terror de los usuarios iniciales de KDE 4.0, y los que están probando el Unity de Ubuntu, la verdad me parece maravilloso.

Gtk+ program for downloading Apple Trailers

I like to watch the trailers in the Apple trailers site. I like it a lot, but I do not like to watch them in my browser (and with a 32 bit Firefox running in a 64 bit machine is tricky… not impossible, but tricky). So I wrote a little program in PyGtk to select and download to my desktop the latests Apple trailers. Once the trailers are selected the process is automatic, so I can go and watch them later with Totem or wathever player I prefer, and in fullscreen even.

The “program” (it has three Python files) was hastily written, without thinking in any kind of design, and really early in the moring (or really late at night); however it scratches a very particular itch of mine and I hope it’s useful for someone else. You can download it from here, and after decompress it you can run it with python appletrailers.py.

(It’s GPL-3, if somebody cares about it.)

If somebody with more Python experience than me could take a look and make it a little more pretty (that ain’t gonna be difficult), please send patches (or suggestions) to canek@ciencias.unam.mx.

Apple Trailers

Apple Trailers

(A mis lectores en español; una disculpa por la entrada en inglés, pero chicle y pega y el “programita” le interesa a alguien más, y en inglés es más fácil que me encuentren con Google).

(Update: fixed a crash with the Kung-Fu Panda trailer; the trailer fails to load, but it doesn’t crash.)

(Update: fixed so now it downloads all the trailers in the site… I think; I’m still downloading.)

Trac

Ahora que liberé la versión 0.0.7 de Geom, me harté del pequeño sitio en PHP que había escrito cuando trac comenzó a asesinar mi servidor. Además, de verdad me gustaría comenzar a usar un bug tracker, y evidentemente bugzilla es demasiado para Geom.

Así que decidí darle una segunda oportunidad a trac. El nuevo sitio de Geom está aquí, y el anterior redirecciona automáticamente a él. Los paquetes (.tar.gz, .rpm y .deb) siguen en el mismo lugar, así como los screenshots y los screencasts.

No recuerdo exactamente cuál fue el problema que tuve la última vez con trac; creo que dejaba abiertos un montón de archivos y entonces Apache ya no podía abrir (y por lo tanto servir) más páginas, pero la verdad no me queda claro. Lo que sí me queda claro es que desinstalé trac y moví todo el negocio a abulafia con un sitio escrito en 20 minutos con PHP, que sirvió más o menos para lo que quería hasta que el sábado me harté de cómo actualizaba las páginas (básicamente con XEmacs o Jed corriendo en una sesión SSH a abulafia).

Trac me sorprendió mucho; no sólo está más bonito de lo que recordaba, sino que está jalando de maravilla. Especialmente considerando que abulafia no es la máquina más poderosa (pero ni de lejos) del universo. Pero además está muy chido de configurar, y el wiki es extensible con pequeños archivitos de Python (lo cual jala sorprendentemente bien).

No me llevó mucho pasar todo lo que tenía al wiki; y además está la ventaja de que la interfaz con Subversion está bien bonita: puedo ver desde el navegador el código con sintaxis coloreada (como aquí), puedo ver las diferencias entre versiones (como aquí), y un montón de cosas más.

Y además es un wiki; hacer modificaciones a las páginas es facilísimo (cualquiera puede de hecho). Y me gusta cómo se ve, aunque igual y le hago más modificaciones luego.

Es como crack, les digo

Programar en Geom es como crack; altamente adictivo.

Ahora que terminé el primer capítulo de mi tesis (que debo aclarar que no es el primer capítulo de mi tesis, es el primer capítulo que escribí; terminará siendo el tercer o cuarto capítulo, dependiendo), utilicé mucho Geom para hacer varias de las figuras que en él aparecen.

Eso hizo que fuera arreglando ciertas cosas en el programa (la primera arreglar el script g2p.py; ni siquiera me di cuenta en qué momento dejó de funcionar), y poco después platicando con Omar me dio algunas ideas para mejorar el desempeño del algoritmo que calcula cómo redibujar construcciones dependientes a otra construcción. La idea fundamental es tan obvia que me da vergüenza no haberla pensado antes: utilizar un caché para sólo calcular una vez la lista de construcciones que se están moviendo.

Después de hacer eso hice algunas mediciones, y vi que estaba perdiendo mucho tiempo dibujando la pantalla cuando no era necesario. Así que ahora el programa sólo redibuja la pantalla cada 10,000 microsegundos, y se nota bastante (creo yo) en el desempeño.

Pero además llegué a la conclusión de que tal vez mucha gente no esté bajando Geom un poco intimidados por el hecho de tener que instalar CCC directamente del repositorio de git, así que bajé unas imágenes de VMware, instalé VMware Player, y me puse a hacer paquetes de Geom y CCC para Ubuntu 7.04 y Fedora 7.

Geom corriendo en Ubuntu 7.04 en VMware Player

Geom corriendo en Ubuntu 7.04 en VMware Player

Geom corriendo en Fedora 7 en VMware Player

Geom corriendo en Fedora 7 en VMware Player

Está muy chido el VMware Player, si bien es algo doloroso correrlo en mi laptop (que no es muy poderosa). Pero fue utilísimo para crear los paquetes… que por cierto; había olvidado lo horrible que es hacer RPMs. Y los paquetes de Debian (ergo Ubuntu) no están mucho mejor; de hecho creo que me gustan más los RPMs: al menos uno hace un archivo (el famoso spec). En Debian es un directorio, con mínimo como cinco archivos.

Ya entrado en calor, también hice un overlay chiquito para Gentoo, para poder instalar CCC y Geom. Y sin duda alguna creo que los ebuilds son infinitamente superiores a los packetes binarios de Fedora y Ubuntu.

Como sea, todo esto está en la sección de downloads en la página de Geom, y pueden ver instrucciones para instalar los paquetes en distintas distribuciones en la sección de install.

Ahora sí no hay pretexto: ya ni siquiera tienen que compilar nada para instalar Geom.

Y bueno, con su permiso me voy a dormir, que tengo una semana para demostrar el teorema que será el resultado central de mi tesis.

Geom 0.0.6

Una semana después, Geom 0.0.6 ha sido liberado.

De hecho no me tardé tanto con esta versión; un par de días en la tarde nada más. Pero lo que le incluí es, creo, fabuloso: extensiones en Python. Con ellas de verdad se vuelve extensible el programa (valga la rebuznancia).

La cosa es que, una vez logré ver cómo llamár los métodos de Python desde C para los plugins, me di cuenta que era exactamente lo que necesitaba para las restricciones de las construcciones (que por cierto, el llamar métodos de Python desde C es relativamente sencillo, si bien no lo he visto documentado en ningún lado… tal vez debería hacerlo yo… si no tuviera cosas que hacer).

Lo padre de esto es que cualquiera puede extender Geom sin necesidad de saber nada de C, y realmente muy poquito de Python (yo mismo no sé mucho). Y lo puede hacer aventando un par de archivos en un directorio de su $HOME, sin necesidad de recompilar nada.

Sólo para probar qué cosas se podían hacer, escribí tres extensiones que están incluidas en esta versión. La primera genera Kn (esto es, la gráfica completa de n vértices) poniendo los vértices sobre un círculo. No tiene nada de especial; de hecho ya se podía hacer (fácilmente además) desde la consola de Python. Lo bonito es que diseñé un método para que el usuario le pueda pasar información a una extensión (n en este caso); en este momento sólo se pueden pasar enteros y flotantes (y cadenas, que no tengo idea si tenga sentido), pero ya con eso se pueden hacer bastantes cosas. Vean el screencast para darse una idea.

Extensión Kn

Extensión Kn

Hay versiones en AVI en la sección de screencasts del sitio de Geom.

Después hice polígonos regulares. Este tampoco tiene nada de interesante (aunque también le pide al usuario el número de lados); lo interesante es que el polígono regular se puede guardar y volver a abrir, y la restricción sigue funcionando.

Extensión polígono regular

Extensión polígono regular

Después, y entusiasmado por una discusión que tuve con Omar, escribí una extensión que permite calcular el casco convexo de un conjunto de puntos. Esta extensión no pide entrada al usuario; pero sí deben estar seleccionados los puntos a los cuales se les quiere calcular el casco convexo (igual que en el polígono regular, por cierto).

Extensión casco convexo

Extensión casco convexo

Lo bonito es que por supuesto el casco convexo se conserva aunque movamos los puntos. Es bastante rápido, de hecho, me sorprendió que corriera tan bien en mi laptop (no se ve muy ágil en el video, pero es que ya calcular el casco convexo todo el tiempo y además estár encodeando a Ogg/Theora sí le pesa a mi maquinita).

Y ya teniendo el algoritmo de Graham Scan implementado, pues de una vez hice un plugin que explica cómo funciona con palos y bolitas.

Graham Scan plugin

Graham Scan plugin

Lo cual está padre, porque usando Geom se pueden explicar muy bien muchos algoritmos de Geometría Computacional. (Y también ayuda programarlos, por cierto).

Pero ahora sí considero agotado el tiempo que le podía haber dado a Geom mientras estoy en California; la cantidad de chamba ha crecido a pasos agigantados (razón por la cual no he escrito casi nada en el blog), y mi escritura de la tesis va bastante bien, creo yo. A lo más le haré pequeñas correcciones al programa cuando las necesite (sigo pensando usarlo para la mayor parte de mis gráficas), pero no creo volver a sacar una nueva versión hasta que vuelva a México.

Eso sí, se aceptan parches. O plugins. O extensiones.

O un API de Python bonito.

Geom 0.0.5

Después de un par de semanas de dedicarle mi tiempo libre, aquí está la nueva versión de Geom.

El número de características nuevas es bastante alto, pero lo más importante sin duda alguna es que por fin tiene plugins en Python. El tener que escribir los bindings para Python me hizo volver a pensar el diseño de casi todo el programa (además de entender porqué ciertas cosas funcionan de cierta manera en GObject), pero creo que el resultado es bastante bueno.

Geom 0.0.5

Geom 0.0.5

Además, dejé de hacer screencasts con Flash y estoy utilizando Istanbul, y debo decir que es fabuloso. Los videos resultantes son bastante bonitos, si bien el único problema es que mi laptop no es muy rápida y algunas cosas (como plugins que hacen animaciones) se ven como dando saltos. Que la verdad no sé de qué me quejo: son videos con resolución de 1280×800.

Quitando que algunas cosas se ven lentas, quedaron bastante bien: dense una vuelta por la sección de screencasts de Geom; hay disponibles en Ogg/Theora (que en mi laptop con Gentoo puede reproducir con Totem, MPlayer, Xine e incluso dentro de Firefox con el Totem Browser Plugin), y en AVI, aunque la verdad no sé qué tan fáciles sean de ver en Windows.

Screencasts de Geom

Screencasts en Geom

Con la funcionalidad que dan los plugins, ahora sí se puede usar Geom para cosas “serias”; el programa viene con dos plugins de ejemplo, y ambos hacen animaciones. Pueden verlas también en este screencast.

Estoy bastante orgulloso de esta lección; espero que ahora sí mi número de usuarios aumente de “1″.

Sucesiones Circulares

De las cosas que estoy estudiando ahorita con Bernardo y Silvia, son sucesiones circulares. Qué son, para qué sirven, y cómo se generan geométrica y combinacionalmente es un desmadre del cual no voy a hablar ahorita.

De lo que voy a hablar, es que resulta que para hacer diagramas bonitos de sucesiones circulares, mi programa Geom es perfecto, y hoy lo estuve usando para dibujar algunos. Modifiqué el script en Python que convierte a PStricks, y le estuve haciendo unas pequeñas modificaciones al programa (que al final ni siquiera utilicé); pero lo importante es que está siendo realmente útil, y entonces me da el pretexto necesario para seguir trabajando en él.

Sucesiones Circulares

Sucesiones Circulares

El screenshot es de Evince; el script de Python para convertir a PStricks quedó mucho mejor, creo. No sé qué tanto le mofique a Geom (tampoco puedo perder mucho tiempo con él), pero espero poder al menos sacar una versión nueva mientras estoy aquí, con las nuevas cosas que voy a necesitar que haga.

(Si pudiera hacer los bindings de Python para el sistema de plugins que me interesa, sería fabuloso; ¿sabe alguien de un buen lugar para buscar información acerca de hacer bindings de GObject con Python? Estaba estudiando el sistema de plugins de Rhythmbox antes de salir de México, pero creo que ahí es mucho más complejo de lo que yo necesito.)

Llenando de SPAM el planeta

Literalmente. No sé porqué de repente mi blog comenzó a llenar de SPAM al Planeta GNOME Hispano. Hace unas semanas mis entradas habían dejado de aparecer en el planeta, y creí que los administradores me habían hecho caso y estaban restringiendo a mis entradas de la categoría GNOME lo que aparece en el planeta. Cuando tampoco apareció mi última entrada de GNOME, pensé que había un problema (porque mi nombre sigue apareciendo en la lista de usuarios), o que me habían corrido por haber dejado de publicar avances de Geom (je).

Pero para mi sorpresa hoy de repente aparecieron como diez entradas de mi blog en el planeta. Perdón por el SPAM.

A los administradores del Planeta GNOME Hispano les repito que tal vez consideren apropiado restringir mis entradas que aparecen publicadas ahí a las que están en la categoría de GNOME.

Lienzos

Estaba leyendo Planet GNOME (o Planet Classpath, es igual), y me encontré con esta entrada de Andrew Cowie, donde menciona un hilo de discusión en la lista de desarrollo de Gtk+, donde intercambian ideas acerca del futuro de un posible GtkCanvas.

Se menciona a HippoCanvas (el que están utilizando para la interfaz Azúcar del proyecto OLPC), GooCanvas, y Criawips CriaCanvas, o CCC, que es el que uso para Geom. Todos utilizan Cairo, como debe de ser.

La discusión es en sí interesente; pero lo es particularmente para mí porque si Gtk termina incorporando alguno de esos lienzos, me gustaría que ese fuera el que Geom utilizara. Yo elegí CCC porque Sven de mostró muy accesible conmigo y porque (básicamente) me ha funcionado; pero creo que el diseño de Geom es lo suficientemente flexible como para cambiar el lienzo sin muchos dolores de cabeza.

Sin embargo, también me di cuenta de algo que tal vez era obvio desde hace algunas semanas, pero que yo no había confrontado: no tengo tiempo para Geom ahorita. Y probablemente no lo tenga mientras esté aquí en gringolandia.

Así que voy a pausar el desarrollo de Geom oficialmente (llevaba un mes detenido de forma extraoficial de cualquier modo). Si alguien quiere seguirle avanzando sólo necesita escribirme un correo; pero dudo que sea el caso porque el proyecto era muy joven. Como sea, yo seguiré programando en Geom (y tal vez CCC) en el futuro; sólo ahora no tengo el tiempo.

De paso, en tres meses tal vez CCC ya esté mucho más avanzado y estable (lo que sería de gran ayuda), o incluso ya exista un inicio de lo que será GtkCanvas. Quien sabe.

Geom 0.0.4

Acabo de subir una nueva versión de Geom. Son tantos los cambios que no sé ni por dónde empezar.

Geom 0.0.4

Geom 0.0.4

Tal vez lo primero es que limpié el código y lo acomodé de forma más bonita, creo. Me está gustando mucho cómo está quedando el programa. Además, agregué un montón de cosas: la que más me gustó es la de tener construcciones “fantasma”. Si un punto está definido por la intersección de dos segmentos de recta, y de repente los segmentos ya no se intersecan, entonces el punto no desaparece: sólo se convierte en fantasma, y no deja de serlo sino hasta que los segmentos se vuelvan a intersecar.

Si además hay otras construcciones que dependen de la que se acaba de hacer fantasma, se hacen fantasma a su vez, y regresan cuando la primera lo hace. Y todo esto también funciona al guardar un archivo con construcciones fantasma. Está bastante padre, y creo que es de lo que mas orgulloso estoy en esta versión (eso y que lo implementé usando señales de GLib, lo cual me pareció über cool).

Pero hay muchas otras cosas: se puede elegir color, ancho de línea y tamaño de punto, se pueden crear tangentes, paralelas y perpendiculares, ya hay puntos medios, etc., etc., etc. De verdad, son un montón de cosas las que tiene esta nueva versión, pero son casi las tres de la mañana y me estoy cayendo de sueño.

Así que mejor dense una vuelta por la página y especialmente por la sección de screencasts, porque esta vez hice 7 screencasts 7 para mostrar nueva funcionalidad en el programa.

Y bueno, voy a dejar a Geom un rato; tengo un montón de otras responsabilidades que atender. Y ahora me voy a dormir.

Encuentre las diez diferencias

Encuentren las diez diferencias entre esta imagen:

Geom 0.0.3

Geom 0.0.3

y esta otra:

Geom 0.0.3

Geom 0.0.3

La primera imagen es un screenshot de Geom 0.0.3, que acabo de liberar y que pueden bajar de aquí mismo si así lo desean.

La segunda imagen también es un screenshot… pero de Evince mostrando un documento \LaTeX compilado (y convertido a PDF) que contiene el código PStricks generado por g2p.py, un script en Python incluido en la versión 0.0.3 de Geom que toma un archivo XML en el formato que Geom utiliza y lo convierte en código PStricks.

(En el espíritu de full disclosure, a la primera imagen le hice una diminuta modificación en el Gimp; pero es que sin ella era trivial ver cuál screenshot era de Geom y cuál de Evince).

El script es pre-alpha, pero con él ya puedo hacer cosas bastante interesantes. Aunque no es perfecto pero ni de lejos; por alguna razón quiere poner la figura PStricks en una página para ella solita. Pero investigaré eso después.

Aquí hay otras dos imágenes; también son screenshots de Geom y de Evince. Y aquí no modifiqué nada:

Screenshot de Geom

Screenshot de Geom

Imagen generada con g2p.py

Imagen generada con g2p.py

Dado que esto era lo que realmente me interesaba de Geom, creo puedo decir que no está nada mal para mes y medio de programación en mi tiempo libre. Pero aún faltan muchas cosas; la siguiente versión (con suerte en una o dos semanas) tendrá una característica que se me hace fundamental pero que no he podido implementar por falta de claridad en cómo permitirle al usuario usarla: restringir puntos a intersecciones.

Como sea, vayan y prueben la nueva versión; creo que ya está razonablemente usable.

Geom 0.0.2

Acabo de poner en su pagina una nueva versión de Geom. Pueden bajar la versión 0.0.2 directamente de aquí.

Geom 0.0.2

Geom 0.0.2

También hay un screencast si les interesa ver en acción el programa. Nada más advierto que necesitan Flash y que es de 5.8 megabytes.

Novedades en esta versión:

  • Líneas perpendiculares a un segmento de recta.
  • Líneas tangentes a un círculo.
  • Guardar y cargar archivos usando un formato XML.
  • Borrar objetos libres.

A pesar de que aún faltan muchas cosas, esta versión es básicamente usable. Especialmente porque ya se pueden guardar las cosas que uno hace. Está avanzando bien el diseño, creo yo; voy a volver a dejar unos días el programa, para ver si ahora sí vuelvo a dedicarle tiempo a CCC: ya hay varias cosas que son urgentes que funcionen en la biblioteca.

Si les interesa, no lo piensen: bájenlo ya.

Nueva casa para Geom

Moví el sitio de Geom a abulafia, porque bastante gente comenzó a bajarlo (y ver los screencasts), y mi uso de ancho de banda subió hasta por las nubes.

Además, reemplacé trac con un simple sitio escrito en PHP; por alguna razón trac comenzaba a poner de rodillas mi servidor. Se acababa la memoria, el procesador y el número de archivos que se pueden tener abiertos.

Muy raro.

Y es una lástima, porque de verdad se veía bonito. No sé si hubiera llegado a usar su bug tracker, pero era mamón tenerlo ahí.

La ventaja es que todo lo relacionado con Geom ya está en una sola página: tarballs, screenshots, screencasts, etc. La gente que le interese Geom y no mi vida puede dejar de venir a mi blog, y sólo ir a la página del Geom.

Y también es padre regresar a abulafia; este es el tipo de cosas para las que justamente sirve tener acceso a un servidor en la UNAM. Ya no tengo que preocuparme por ancho de banda, espacio o disponibilidad del servicio… bueno, hasta que se vaya la luz.

El repositorio de Subversion también lo moví a abulafia; para hacer un checkout ahora deben hacer:

svn co http://abulafia.fciencias.unam.mx/svn/geom

Y bueno, ahora sí vuélvanse locos con el código.

Geom 0.0.1

Bueno, llegó el momento de dejar que todos los que quieran le echen un ojo a Geom, jueguen con él, y si así lo desean cooperen tantito con algunos parches, ideas y/o arte (los iconos podrían ser mejorados por mucho).

Acabo de levantar un sitio para Geom (basado en trac); es un wiki, así que espero que documentación y discusión acerca del programa se vaya generando no sólo por mí.

El sitio y todo lo relacionado con el programa está en inglés, por supuesto. Lamentablemente es la lingua franca del Software Libre.

El código está en SVN, y se puede conseguir haciendo

svn co http://abulafia.fciencias.unam.mx/svn/geom

También en la página hay un tarball, junto con otro de CCC que funciona con Geom (la versión de Sven en este momento hace tronar a mi programa).

Ya anuncié el programa en GNOME Files, así que espero que la gente interesada en el mismo empiece a jugar con él. Por supuesto, estoy liberando el programa con la versión 2 de la GNU General Public License.

Así que quien quiera revisar lo que he hecho, ahora es el momento.

Actualización (2007-01-22): trac resultó ser demasiado avaricioso con los recursos de mi servidor, y parece que mucha gente le gustó Geom porque mi uso de ancho de banda subió por las nubes. Así que moví el sitio a abulafia al igual que el repositorio SVN, porque aquí sí necesito el ancho de banda de la UNAM.

Puntos amarrados

(Hasta hoy, bueno, ayer, me di cuenta de que ahora sí estoy siendo publicado en Planeta GNOME Hispano; un saludo a todos mis nuevos lectores).

Por fin terminé la refactorización (por decirle de algún modo) de Geom. Sí terminé reescribiendo bastantes cosas; en particular, Geom ahora sigue completamente un patrón Model-View-Controller, donde todas las operaciones interesantes se realizan en el modelo, y todo lo relacionado a presentación está en la vista.

Eso significó meter aún más herencia al diseño; pero si se me permite, quedó muy bonito. También ya está básicamente toda la infraestructura para propiedades de objetos (cambiarles individualmente color, ancho de línea, tamaño de los puntos, etc.), y para salvar y abrir archivos usando un formato XML. No está funcionando todavía porque necesito implementar un desmantelamiento de los objetos geométricos usando el orden parcial que se genera dadas las relaciones de qué objeto domina a cuál (o cuales). Y además necesito eso para mi tesis.

Que también es otra cosa de la que quería hablar; voy a dejar de programar en esto unos cuantos días, mientras termino el borrador del artículo que estoy coescribiendo y además cuando regrese probablemente me meta más a CCC que al programa: me están comenzando a pegar seriamente algunas limitaciones del canvas, y Sven se ve que está ocupado con otras cosas. El fin de semana (si tengo tiempo) probablemente ponga un repositorio para que la gente pueda bajar el código fuente y jugar con Geom; creo que ya está listo para que otra gente lo vea y (si así lo desean) me echen una mano.

Además de la refactorización, hay varias cosas nuevas funcionando: para empezar, cada objeto se resalta cuando el ratón pasa sobre él. Sé que no suena terriblemente emocionante, pero tuve que hacerlo afuera de CCC, por las limitaciones de la biblioteca inicialmente, pero creo que terminaré haciéndolo así en la versión final: es sencillamente más fácil tener todo el control de qué ocurre en el canvas. Con esto puedo restringir puntos a objetos como círculos, segmentos o polígonos, y construir cosas más interesantes que las que ya tenía. También hay líneas (conceptualmente infinitas), aunque me están dando algunas broncas. El canvas se puede desplazar haciendo click con el botón de enmedio del ratón (como en el Gimp), si bien tampoco funciona perfectamente.

Ahorita los objetos se actualizan como si las relaciones entre ellos formaran un árbol (se actualiza el objeto “raíz”; después sus hijos, después los hijos de sus hijos, etc.), pero es sólo temporal. Realmente necesito implementar con cuidado el manejo del orden parcial entre objetos, no sólo para actualizar arbitrariamente, sino para poder salvar de forma eficiente (y correcta).

Y encima de eso están las cosas que tengo que hacerle a CCC: el rectángulo que dibujo cuando selecciono objetos no se borra perfectamente; el resaltado de objetos no funciona siempre; hay un bug en AMD64 cuando se limpian líneas, etc., etc. Pero eso será hasta después de que termine el borrador de mi artículo.

Nueva versión de Geom

Nueva versión de Geom

También hay un screencast de la nueva versión; son casi 8 megas, pero tiene comentario del director (gracias a Tomboy, y con faltas de ortografía porque lo hice en inglés y sin guión preparado).

Y pues eso es todo; me voy a dormir que mañana tengo bastantes cosas que hacer.

(Para los lectores del Planeta: aquí están las entradas relacionadas con Geom que tal vez no hayan visto:

Por si quieren ver las motivaciones de esto y algunas ideas en el diseño.)

Más avances en Geom

En mi “tiempo libre” de estar trabajando en el artículo (dícese, cuando ya estaba harto de programar cómo calcular tangentes a dos círculos arbitrarios para hacer diagramas bonitos) también le moví a cosas a Geom, con el resultado de que ahorita no funciona, pero cuando lo haga va a estar mucho más avanzado: funcionará (espero) seleccionar construcciones en grupo, salvar y leer archivos en su propio formato XML, y separar bien y bonito el modelo de las construcciones geométricas de su presentación en el canvas.

Además (y medio inevitablemente) seguí investigando cosas de CCC, porque al fin y al cabo lo necesito. Después de pruebas extenuantes, vi que el bug al redibujar segmentos de línea en CCC sólo ocurre en AMD64, no en x86. ¿Por qué? No sé; de hecho no tengo idea, pero Sven no tiene acceso a una máquina AMD64, así que recaerá en mis hombros el tener que resolver eso.

El formato XML que originalmente elegí para guardar los archivos de Geom se veía más o menos así:

<geom>
  <<point id=”p1″ x=”10.0″ y=”15.5″ />
</geom>

Mi razonamiento era que la información que inherentemente tendría el documento no es muy estructurada, pero Juan me dio un ejemplo que me hizo reconsiderarlo:

<point size=”3.0″ color=”#000000″>
<coordx>200.0</coordx>
<coordy>200.0</coordy>
</point>

Y es que se me había olvidado que en algún punto el programa permitirá editar cosas como el color de un punto, su tamaño, el ancho de la línea de un círculo, etc. Y entonces sí conviene representar la presentación en atributos y el contenido en elementos. También envolví cada construcción en una etiqueta <construct/>, porque así me permite mapear la jerarquía de herencia que estoy usando en GObject, y me hizo darme cuanta que el atributo id de cada construcción será fundamental, cuando al incio había creído que sólo la usaría para ponerles nombres bonitos a los puntos.

Los ids son fundamentales porque por diseño la estructura que toman las construcciones geométricas no es un árbol, sino una gráfica. Si fuera un árbol representarlo en XML sería de risa; como es una gráfica necesito referencias para poder hacer ciclos, de ahí la importancia de los ids.

Otra consecuencia es que voy a necesitar utilizar órdenes parciales para poder guardar y leer bien los archivos XML; necesito primero guardar los elementos maximales, después los menores y así hasta los minimales. Y el mismo camino para leer, obviamente.

Como sea, este si es un post en medio de la obra; no tengo screencast o screenshot para mostrar.

Todavía.

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.