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.

Por supuesto, no podía faltar

En el colmo de la desidia con esto de re-etiquetar mis MP3, escribí el programa tal vez más inútil en la historia de la humanidad.

ID3v2 soporta el poder embeber imágenes arbitrarias; lo cual suele utilizarse para guardar dentro del MP3 la portada del disco de donde viene dicha canción. Yo he estado usando esa característica de ID3v2 justo así, aunque ningún programa que yo use la aprovecha; Rhythmbox en particular guarda y lee las portadas de discos de un directorio.

Como sea, después de poner bonita la carpeta de mis discos “ripeados”, decidí que sería padre que cuando abriera un directorio con MP3s en Nautilus, que en lugar del icono genérico de “archivo de sonido” que normalmente aparece, que apareciera la portada del disco si el MP3 la tuviera embebida.

Así que me puse a programar un “mp3-cover-thumbnailer” que hace justamente eso; si el MP3 tiene la portada (y sólo la portada) del disco embebida, la saca y genera un thumbnail para el archivo, siguiendo los estándares de Nautilus y freedesktop.org.

La cosa fue una tortura de programar porque en ningún lado queda explícitamente claro cómo carajo ID3v2.4.0 utiliza enteros “synch-safe”, y entonces tuve que averiguarlo leyendo el código de LibTag y abriendo con un editor hexadecimal los JPEGs y los datos que iba sacando del MP3. Y todo es completa y absolutamente inútil, porque (al igual que con la carpeta que contiene a los discos) casi nunca abro una carpeta con MP3 en Nautilus, y aún si lo hago el famoso generador de thumbnails lo único que hace es generar un directorio con un montón de imágenes repetidas:

Thumbnails en vista de iconos

Thumbnails en vista de iconos

Y peor aún, en los raros casos que abro mis directorios con MP3s, suelo verlos en el modo de lista, lo que causa que los famosos thumbnails se vean diminutos e indiscernibles… y todos repetidos de nuevo.

Thumbnails en vista de lista

Thumbnails en vista de lista

Como sea, los que me conocen saben que me divierto con este tipo de pendejadas; así que voy a dejar mi thumbnailer por inútil que sea, y aquí lo dejo si alguien quiere utilizarlo: mp3-cover-thumbnailer.py. Háganlo ejecutable en algún lado, y agreguen estas dos llaves en GConf:


/desktop/gnome/thumbnailers/audio@mpeg/command = /usr/local/bin/mp3-cover-thumbnailer -s %s %i %o
/desktop/gnome/thumbnailers/audio@mpeg/enable = true

El programa necesita Python Imaging y TagPy.

Así que ahí lo tienen, un programa inútil e innecesario, pero que me divirtió unas horas hacerlo.

Pero se ve bonito

Ahora que me estoy tomando la chinga de re-etiquetar mi música, aproveché y mi carpeta de discos “ripeados” (¿cuál es la traducción correcta al español?, ¿”digitalizados”?) la puse “bonita”; puse como icono de cada carpeta la portada escaneada del disco correspondiente, le puse un fondo distinto al de mis carpetas normales, y le aumenté algo el zoom porque en el normal las portadas salían muy chiquitas.

Carpeta arreglada

Carpeta arreglada

La idea es que una vez “ripeado” un disco (y más ahora que ya le puse toda la información que espero necesitar) dicha carpeta jamás cambiará, y pues mejor que se vea bonito. Es completamente inútil, entre otras cosas porque mi carpeta de discos “ripeados” jamás la abro; mi música la escucho únicamente con Rhythmbox.

Pero pues se ve bonito.

Grabando video

Como ahora tengo cuatro gigabytes de espacio en mi cámara fotográfica, decidí hacer uso de una de las funciones que tiene que casi nunca utilizo: grabar video. Con 256 megabytes era medio imposible grabar nada.

Grabé un pequeño video de mi gato, que pueden bajar aquí en Ogg/Theora:

Tigger Ogg/Theora

Tigger Ogg/Theora (8.2 MB)

O aquí en Avi/DivX:

Tigger Avi/DivX

Tigger Avi/DivX (5.6 MB)

(Lamentablemente, estos días esa es la máxima actividad física de Tigger)

La cámara graba en MPEG, si no me equivoco con los mismos parámetros que los DVD, sólo que a 640×480. Los archivos son grandes; aproximadamente 100 MB por minuto, que dado que tengo 4 GB significa que puedo grabar poco más de 40 minutos con mi camarita.

Después de pasar el MPEG de 150 MB a mi computadora, lo reencodeé a Avi/DivX utilizando mencoder, lo que redujo el tamaño del archivo a unos 15 MB; nada mal, considerando que es diez veces más pequeño pero con la misma calidad (o al menos la que yo soy capaz de percibir). Entonces le corté las partes más aburridas con avidemux, y por último hice otra copia con Ogg/Theora usando ffmpeg2theora… que por alguna razón que desconozco terminó siendo mayor (hasta ahora mi experiencia era la opuesta; los Ogg/Theora son más pequeños que los Avi/DivX).

Exceptuando mencoder y ffmpeg2theora, todo lo hice sin utilizar la línea de comandos. Espero que dentro de poco se pueda encodear utilizando alguna herramienta gráfica en Linux.

Nautilus 2.21.91

Ya llevo un par de días usando Nautilus 2.21.91, desde que salió el ebuild en el overlay de GNOME en Gentoo.

Esta versión es mucho mejor que la anterior; cuando conecto dispositivos USB de almacenamiento de datos, Nautilus no truena. Cuando abro un directorio remoto usando SFTP (o sea SSH), Nautilus no se queda trabado para siempre y no tengo que matarlo con killall -9 nautilus. Tampoco se ha muerto intempestivamente cuando muevo archivos, como con la versión anterior.

En general, pues, funciona casi tan bien como funcionaba Nautilus antes del cambio a GVFS/gio. Parece ser que la bronca mayor hasta ahora es que el soporte para FTP es inexistente o muy preliminar; pero como yo no lo uso (nadie debería usar FTP), no podría importarme menos.

Además, el tan cantado soporte para FUSE en GVFS por fin me funciona a mí, lo que quiere decir que cualquier directorio remoto que abra usando GVFS, aparece como un directorio local en ~/.gvfs/ usando FUSE. Esto es maravilloso, porque entonces cualquier aplicación en Linux puede usar un directorio remoto montado con GVFS, aunque dicha aplicación no esté escrita utilizando GVFS. Era de las desventajas más graves de GNOME-VFS.

GVFS con FUSE

GVFS con FUSE

Hubo una discusión en la lista de correo de GNOME Desktop sugiriendo que se pospusiera la nueva versión de Nautilus para GNOME 2.24 (en seis meses), o bien que se retrasara la salida de GNOME 2.22 unas cuantas semanas. La idea detrás de la propuesta era que el cambio a GVFS/gio está muy cabrón, y que probablemente no se podría llegar a la fecha original de lanzamiento de GNOME sin que Nautilus tuviera regresiones; que cosas que funcionaban en la versión anterior no lo hicieran en ésta.

El consenso fue seguir con el plan y sacar Nautilus con GVFS/gio y que la fecha de lanzamiento no se cambiara. El razonamiento fue que justamente como el cambio está cabrón la única forma de encontrar todos los bugs es que el mayor número de gentes utilicen la nueva versión, y que además en general ya faltaba muy poco para que el nuevo Nautilus no tenga regresiones, sans el problema con FTP.

Yo repito que no uso FTP, pero sí me preocupé un poco porque la versión que estaba usando hace unos días se moría porque volara la mosca. A veces sin mosca incluso.

Pero esta nueva versión de verdad está muy bien, y “funciona para mí”. No sé si resuelvan la bronca de FTP, pero como yo no uso FTP (repito), y además estoy convencido de que no dobería usarse, la verdad no creo que sea un problema grave.

Ahora en singalés

Dejé en la noche compilando nuevos paquetes beta de GNOME, y en la mañana tenía un archivo de configuración para actualizar. En Gentoo, cuando uno actualiza, los nuevos archivos de configuración en /etc se guardan con un prefijo ._cfg0000 para que el administrador pueda revisarlos antes de reemplazarlos o mezclarlos con los viejos. Para ello existe un programita llamado dispatch-conf, que muestra las diferencias entre el viejo archivo de configuración y el nuevo.

El archivo de configuración era la lista de sonidos del applet de batería de GNOME (que las listas de sonidos se guardan en /etc aunque técnicamente no sean exactamente archivos de configuración), y el cambio era una línea:

 description[pt_BR]=Utilitário de Estado da Bateria
 description[ro]=Utilitar pentru monitorizare acumulator
 description[ru]=Индикатор состояния батареи
+description[si]=විදුලිකෝෂ තත්ව උපයුක්තය
 description[sk]=Nástroj pre stav batérie
 description[sl]=Pripomoček za prikaz stanja baterije
 description[sq]=Vegël e Statusit të Baterisë

Si no tienen tipos para el singalés, uno de los idiomas oficiales de Sri Lanka, lo de arriba probablemente no tenga sentido. Lo divertido es que, tal cual, es lo que yo veo en mi terminal.

Ahora en singalés

Ahora en singalés

Les digo que Unicode+UTF-8+GNOME son la neta.

Exploit

En los últimos días hubo un ligero paniqueo con respecto a un exploit para el kernel de Linux que afecta las versiones entre 2.6.17 y 2.6.24, inclusive. Los parches por fin salieron hoy; pueden leer la noticia en Kernel Trap.

En general yo había oído de exploits desde hacía mucho, pero este fue el primero que vi que funcionaba. En casi todas las máquinas con Gentoo que probé (excepto una que Enrique mantiene) pude convertirme en root sin ningún problema, y por lo visto Ubuntu, Slackware y Suse también sufren el mismo problema. Casualmente en la única versión de Fedora a la que tengo acceso no pude convertirme en root.

Es una vulnerabilidad local; uno debe tener acceso a la máquina como usuario regular para poder convertirse en root. Sería muchísimo más grave si el exploit fuera remoto; pero de cualquier forma está cabrón.

Como sea, lo primero que me vino a la mente cuando me di cuenta de que el exploit funcionaba fue que qué mala suerte. Cuando estaba en la Facultad como estudiante tenía acceso a un montón de máquinas como usuario regular, y me hubiera gustado poder convertirme en root en ellas. Y ahora que este exploit aparece, en todas las máquinas donde tengo acceso como usuario no necesito al exploit, porque también tengo acceso como root.

Si administran una máquina Linux con kernel entre 2.6.17 y 2.6.24, actualícenlo.

Swfdec

Una de las ventajas de estar sufriendoprobando la versión de desarrollo de GNOME es que nuevos paquetes de los cuales uno sólo había oído de repente son usables.

Uno de ellos es Swfdec.

Swfdec en 64 bits

Swfdec en 64 bits

Mi Firefox a 64 bits por fin puede utilizar Flash con él; particularmente YouTube. No es perfecto; pero ciertamente no truena y más importante aún funciona. Eso es, como que, importante. Flash en Linux siempre ha sido un punto débil; y Swfdec es GPL, así que puede ser distribuido sin ninguna restricción.

Que jale en 64 bits es anecdótico; que por fin tengamos una implementación OpenSource de Flash que (mal que bien)funciona es fabuloso.

Ahora sólo necesito un plugin de Java para 64 bits, y desinstalaré mi Firefox de 32 bits.

GNOME Beta

Después de algunas dolorosas interrupciones (por ejemplo, que libgnome no compilara), por fin se terminó de instalar GNOME 2.21.90 en mi máquina de escritorio.

Exceptuando que algunas cosas no funcionan (gnome-settings-daemon dice “Failed to execute program /usr/libexec/gnome-settings-daemon/gnome-settings-daemon: Success”; vayan y descifren eso), en general todo está chido, pero la verdad sí está verde.

En particular el nuevo Nautilus va a ser fabuloso… cuando lo estabilicen, porque ahora se muere a la menor provocación. Que hayan añadido gio y GVFS se nota en todos lados, y creo que el resultado final sí será lo mejor que le ha ocurrido a GNOME desde que se pasaron al modo espacial, pero en estos momentos no le recomendaría a nadie que instalara esta versión; sencillamente está muy inestable. A menos que quieran ayudar con el beta testing, claro.

GNOME 2.22 beta

En general nunca trato de usar versiones inestables de GNOME, pero la siguiente versión va a incorporar gio y GVFS, que terminarán reemplazando GnomeVFS (que ya era hora, por cierto).

Por eso en este momento estoy compilando el overlay de GNOME de Gentoo (disponible aquí, por si a alguien le interesa), con las versiones inestables de GNOME. Está actualizando bastantes cosas, HAL entre ellas, así que no creo hacer el mismo experimento en mi laptop, porque la mitad de cosas medianamente interesantes que hace mi laptop involucran HAL (como suspender e hibernar).

Ya les diré que tan inestable es GNOME inestable.

Andy Tanenbaum

Yo quiero ser como Andy Tanenbaum cuando sea grande.

Andy Tanenbaum es un académico gringo que vive en Holanda dando clases, haciendo investigación y asesorando estudiantes de doctorado. En otras palabras, básicamente cumple al pie de la letra la definición de “académico”; pero quise poner exactamente qué significa ser académico porque mucha gente realmente no lo sabe.

También es autor de Minix, un “unixcito” que escribió para que sus estudiantes pudieran ver cómo implementar ciertos aspectos de un sistema operativo, y ha escrito de varios libros, principalmente de Sistemas Operativos y Redes, que se han convertido en libros de texto por omisión en casi todos los programas de Ciencias de la Computación en el mundo. Yo llevé dos de sus libros como libros de texto en clases de la Facultad (aunque lamentablemente los cursos no estuvieran a la altura de los libros).

Linus Torvalds ha dicho que uno de los libros de Tanenbaum, Operating Systems: Design and Implementation, fue el que lo inspiró a escribir el kernel de Linux. Entonces ha de haber sido algo medio feo que en enero de 1992, Tanenbaum haya enviado un mensaje al grupo de noticias comp.os.minix (en donde Linus había anunciado Linux unos meses antes), diciendo que Linux “era obsoleto”.

No lo decía en el cuerpo del mensaje, por cierto; lo decía en el título: “Linux is obsolete”.

El punto de Tanenbaum era que Linux utilizaba técnicas de sistemas operativos que venían de los setentas (y de los sesentas en algunos casos), y que por lo tanto estaba condenado al fracaso porque los sistemas operativos “modernos” iban a utilizar técnicas novedosas que harían que nadie quisiera usar Linux. En particular, Tanenbaum se quejó amargamente de que Linux fuera un kernel de diseño monolítico, cuando “todo mundo” sabía que los microkernels eran el camino que había que seguir.

Un kernel monolítico compila todo dentro de sí, y un microkernel (como su nombre lo indica) es un kernel chiquitito que se limita a lo más básico que tenga que ver con el hardware, dejando casi todo lo demás en programas en el espacio de usuario (que suelen llamarse “servidores”). Incluyendo cosas como el manejo de memoria, el manejo de procesos y los sistemas de archivos. La idea es que de esta forma se protege el sistema operativo: si un sistema de archivos falla, el sistema puede seguir corriendo e incluso “reiniciar” el servidor del sistema de archivos. En 1992 el comentario de Andy era verdad: todo mundo creía que los kernels del futuro serían microkernels.

Linus, siendo como es, le respondió a Andy diciéndole que en primer lugar se había puesto a escribir Linux como hobby; que en segundo lugar, Minix era de chocolate (que lo era; Andy mismo siempre lo dijo); y que en tercer lugar podría utilizar técnicas obsoletas, pero al menos funcionaba (refiriéndose a que GNU/Hurd y BSD para motivos prácticos no existían en ese momento).

La cosa rápidamente degeneró en el famoso debate Tanenbaum-Torlvads, una de las flame wars más famosas que han existido, porque aunque indudablemente una flame war, el nivel de discusión se mantuvo bastante elevado la mayor parte del tiempo.

En algún punto del debate, Tanenbaum le dijo a Linus:

“I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design :-)”

Para lo que importe, Andy no le dijo a Linus que lo reprobaría; sólo le dijo que no obtendría una calificación alta.

Por supuesto, todos sabemos qué ocurrió después: Linux terminó convirtiéndose en uno de los sistemas operativos más exitosos de la historia. Pero además varias cosas que dijo Andy (como que en 1997 todos estaríamos corriendo GNU/Hurd en estaciones de trabajo Sparc, o que la arquitectura x86 desaparecería) sencillamente resultaron ser completamente erróneas.

No es que Tanenbaum fuera un idiota, claro; sencillamente en 1992 esas afirmaciones parecían estar justificadas. Y además yo creo que Andy no tomó en cuenta que Linux eventualmente sería escrito por miles de programadores, lo que le permitiría evolucionar mucho más de lo que a Linus jamás se lo podría haber ocurrido.

Dieciséis años después, además, varios aspectos del diseño de Linus que Andy criticó terminaron modificándose hasta acercarse mucho a lo que a él le hubiera gustado; el kernel Linux soporta módulos, que no es algo contemplado en un kernel monolítico “tradicional”. Más aún, cuando yo monto una partición NTFS de Windows en Linux, el código que hace eso corre en el espacio de usuario usando el módulo FUSE.

Aunque durante los años que siguieron al debate mucha gente se quedó con la impresión de que Andy y Linus estaban “peleados”, ambos siempre dijeron que eso no era cierto. En 2004 un instituto de derecha financiado por Microsoft trató de escribir un libro donde planteaban que Linux había robado código de (entre otras fuentes) Minix, que la GPL era “mala” (poco faltó para que la acusaran de comunista), y algunas otras linduras de ese estilo. Al final de cuentas el libro nunca se publicó porque fue hecho pedazos por todo mundo incluso antes de que saliera a la luz pública, pero Tanenbaum salió de inmediato en defensa de Linus diciendo que por supuesto ningún pedazo de Minix había sido “robado” para Linux.

Tanenbaum también dijo lo siguiente:

“I would like to close by clearing up a few misconceptions and also correcting a couple of errors. First, I REALLY am not angry with Linus. HONEST. He’s not angry with me either. I am not some kind of «sore loser» who feels he has been eclipsed by Linus. MINIX was only a kind of fun hobby for me. I am a professor. I teach and do research and write books and go to conferences and do things professors do. I like my job and my students and my university. [...] I wrote MINIX because I wanted my students to have hands-on experience playing with an operating system. After AT&T forbade teaching from John Lions’ book, I decided to write a UNIX-like system for my students to play with. [...] I was not trying to replace GNU/HURD or Berkeley UNIX. Heaven knows, I have said this enough times. I just wanted to show my students and other students how you could write a UNIX-like system using modern technology. A lot of other people wanted a free production UNIX with lots of bells and whistles and wanted to convert MINIX into that. I was dragged along in the maelstrom for a while, but when Linux came along, I was actually relieved that I could go back to professoring. [...] Linus seems to be doing excellent work and I wish him much success in the future.”

“While writing MINIX was fun, I don’t really regard it as the most important thing I have ever done. It was more of a distraction than anything else. The most important thing I have done is produce a number of incredibly good students, especially Ph.D. students. See my home page for the list. They have done great things. I am as proud as a mother hen. To the extent that Linus can be counted as my student, I’m proud of him, too. Professors like it when their students go on to greater glory.”

Tal vez pase desapercibido por muchos, pero que un profesor llame “mi estudiante” a alguien a quien nunca le ha dado clases directamente, y que además diga que está orgulloso de él, es tal vez el elogio más grande que pueda dar. Más aún viniendo de alguien como Andy Tanenbaum.

Andy Tanenbaum también es el “Votemaster” de Electoral Vote, un sitio que hace análisis de encuentas para tratar de determinar quien ganará las elecciones gringas; lo viene haciendo desde 2004. Además de sólo analizar los datos, el sitio es básicamente un blog político, donde Andy comenta las campañas y el espectro político estadounidense de forma muy inteligente, y desde un punto de vista de “izquierda” (entre comillas, porque la izquierda gringa es como que el centro del resto del mundo). Si les interesa aunque sea un poco la política gringa, es un blog que no pueden perderse.

Yo en general no tengo “ídolos” o “héroes”. Me educaron de forma demasiado irreverente como para que se me de eso. Pero Andy Tanenbaum es sin duda alguna alguien que merece todo mi respeto, y que sigue un estilo de vida que yo bien podría tomar como modelo. El tipo me cae muy bien, y sí me gustaría ser un poco como él cuando fuera grande.

Tirando pasajeros del avión

El otro día, xochitl (la máquina que alberga mi blog) entró en un semi coma. Eso quiere decir que no estaba muerta, pero no respondía o tardaba mucho en hacerlo. Del orden de minutos.

Teniendo mucha paciencia pude entrar por SSH, hacerme root y reiniciar la máquina, y un análisis de los logs mostró que fue un problema de MySQL que dejó de responder consultas, lo que causó que las páginas de mi blog se tardaran porque estaban esperando dichas consultas, lo que causó que apache tuviera que crear más procesos para poder servir otras peticiones de páginas porque había varios procesos atorados sirviendo las que esperaban a MySQL, lo que causó que se acabara la memoria (física y virtual).

Ya he pasado por eso antes.

¿Cómo rastrea uno un problema así? Es bastante sencillo; uno va a los logs y busca por “oom-killer” en ellos. El kernel de Linux tiene un mecanismo que le permite matar procesos cuando la memoria no alcanza; cuando el sistema tiene memoria libre negativa (ahorita explico eso), recorre la lista de procesos y busca matar alguno, esperando que eso libere memoria. Es una heurística relativamente compleja; no crean que agarra y mata el proceso que más memoria ocupe (al inicio hacía eso, y resultaba entonces que siempre mataba X… lo cual causaba que murieran un montón de aplicaciones, tal vez causándole pérdida de información al usuario). Este mecanismo es conocido como el “Out of Memory killer”, y generalmente referido como “oom-killer”.

¿Pero cómo carajo puede llegar a tener el sistema memoria negativa? Eso es bien fácil de responder: porque Linux miente cuando ciertas llamadas del sistema solicitan memoria.

El ejemplo más sencillo es fork: cuando uno hace fork, el proceso padre se copia completamente y se le transmite al proceso hijo. El problema es que el 90% de las veces, cuando uno hace fork, en el proceso hijo se ejecuta un comando completamente independiente de la copia del proceso padre, y esa copia es descartada de forma inmediata. Si uno tuviera muy poca memoria libre (menos que la que ocupa el proceso padre, pero más de la que ocupa el comando ejecutado por el proceso hijo), entonces es posible ejecutar de forma exitosa el fork. Linux entonces miente al decirle al fork que sí se puede ejecutar, esperando que todo salga bien.

Cuando todo no sale bien, se manda llamar al “oom-killer”.

Hace años había broncas con el OOM killer, y a veces se mataban procesos aunque hubiera memoria suficiente. Un desarrollador de Linux hizo una analogía muy interesante de eso y del OOM killer en general:

“An aircraft company discovered that it was cheaper to fly its planes with less fuel on board. The planes would be lighter and use less fuel and money was saved. On rare occasions however the amount of fuel was insufficient, and the plane would crash. This problem was solved by the engineers of the company by the development of a special OOF (out-of-fuel) mechanism. In emergency cases a passenger was selected and thrown out of the plane. (When necessary, the procedure was repeated.) A large body of theory was developed and many publications were devoted to the problem of properly selecting the victim to be ejected. Should the victim be chosen at random? Or should one choose the heaviest person? Or the oldest? Should passengers pay in order not to be ejected, so that the victim would be the poorest on board? And if for example the heaviest person was chosen, should there be a special exception in case that was the pilot? Should first class passengers be exempted? Now that the OOF mechanism existed, it would be activated every now and then, and eject passengers even when there was no fuel shortage. The engineers are still studying precisely how this malfunction is caused.”

El OOM killer sigue en el kernel, y en el caso de lo que ocurrió con xochitl por poco tumba a la máquina porque la heurísitica trata de matar el mínimo número de procesos corriendo. Esto quiere decir que mata un montón de procesos de apache, pero no a todos, y en particular nunca al proceso principal de apache (porque eso mataría muchos procesos). Esto permite que apache siga sirviendo páginas, que se siguen quedando atoradas por MySQL, lo que hace que se tengan que crear más procesos, etc.

(MySQL se queda atorado, pero no consume mucha memoria, entonces no es asesinado aunque realmente sea el culpable.)

Por suerte ahora el OOM killer es configurable, y uno puede marcar ciertos procesos como más “asesinables” (o usando la analogía, podemos seleccionar qué pasajeros queremos que mueran primero). Con ello lo que me pasó a mí es fácil evitar que se repita.

Pero realmente (como la analogía lo muestra), es idiota; no habría porqué estar matando procesos, no importa qué tan “inteligente” sea la heurística. El OOM killer sigue en el kernel porque en general la memoria se ha hecho estúpidamente barata, y los desarrolladores han tomado la postura de que es más inteligente dar más memoria o más disco duro al swap que estarse preocupando de los casos marginales (como el mío) donde de repente se acaba toda. Y para los casos marginales, siempre se puede decidir qué pasajero matar.

Así que con su permiso voy a implementar la política en mi aerolínea de que los pasajeros cuyos nombres terminen con “SQL” y comiencen con “My” sean aventados fuera del avión a la primera señal de que el combustible está bajo.

Eso, y un cron para revivir MySQL cada que sea asesinado. Digo, hay que ser justos.

Liferea

Todavía hace como año y medio mencionaba en una entrada que yo no usaba lectores de feeds. No recuerdo exactamente cuándo ocurrió, pero en algún momento comencé a utilizar Liferea, un lector de feeds para GNOME.

En algún momento intenté usar Blam!, pero el desarrollo sencillamente pareció detenerse, y luego llegó a un estado donde en Gentoo lo enmascararon, así que dejé de usarlo. Parece que ya lo están manteniendo de nuevo, pero la verdad es que Liferea cumple con mis necesidades.

Que digo, tampoco es ciencia de cohetes; uno mete un feed, Liferea lo actualiza de vez en cuando, uno lee las entradas. Se pueden marcar artículos que uno quiera leer después, se indexa todo bien bonito con Beagle, y utiliza el motor de dibujo de HTML de Firefox, así que en general todo está chido.

Hasta hace unos días, que comenzó a dibujar las fuentes así:

Liferea con fuentes horribles

Liferea con fuentes horribles

No sé a ustedes, pero para mí eso resulta casi ilegible. Y yo no hice nada; sólo de repente comenzó a verse así. Estuve meneándole a un montón de cosas en la configuración a Liferea, pero nada hacía que volviera a usar fuentes sans serif. Así que actualicé a la versión enmascarada, pero fue inútil; seguía mostrando esas horribles fuentes.

Total que se resolvió copiando mi archivo prefs.js de Firefox al directorio donde Liferea guarda las configuraciones de Mozilla (les digo que utiliza el motor de dibujo HTML de Firefox), y por fin recuperé mis fuentes bonitas:

Liferea con fuentes bonitas

Liferea con fuentes bonitas

Pero seguí usando la nueva versión de Liferea (la 1.4); total, parece estar jalando bien y no ve por qué no actualizar, dado que ya la compilé.

Y no fue sino hasta hace un rato que descubrí que tiene algo nuevo esta versión; baja los comentarios de cada entrada:

Liferea mostrando comentarios

Liferea mostrando comentarios

Lo cual está über cool.

Firefox de 64 bits

Traté de usar Firefox de 64 bits durante un par de días. Hay un plugin que permite envolver un plugin de 32 bits para poder usarlo en el nabegador de 64 bits, y puse el plugin de Java de Blackdown, que es el único JDK de 64 bits disponible para Linux (el plugin que envuelve plugins de 32 bits por alguna razón no funciona con los plugins de Java de Sun).

En general funciona, pero por alguna razón el Flash eventualmente deja de funcionar. Sencillamente ya no se reproducen los .swf. Y como de verdad uso bastante YouTube, eso es un no no. Es una lástima, porque el Firefox de 32 bits es perceptiblemente más lento que el de 64 bits, especialmente con JavaScript.

Además quería utilizarlo como periodo de transición para intentar después Epiphany; pero por lo visto eso tendra que esperar. No entiendo por qué Sun y Adobe no sacan versiones de 64 bits de sus plugins. Especialmente Sun, porque el JDK ya está en 64 bits; y de Flash de verdad no lo entiendo, Linux ha llegado al punto donde pasar una aplicación (incluso multimedia) es básicamente recompilar.

Firebug

Dado que uso GNOME, una pregunta válida es por qué no uso Epiphany, el navegador incluido. Para navegar funciona muy bien, es muy rápido (más que Firefox, parece ser el consenso) y además puede utilizar los plugins de Firefox; en particular Flash que gracias a cosas como YouTube se ha vuelto medio indispensable.

La primera razón por la que no uso Epiphany es porque en 64 bits no funciona (o no funcionaba al menos la últma vez que probé) el plugin de Flash; en mi laptop tal vez podría entonces usarlo, pero no en mi máquina grande.

La segunda razón son algunas extensiones de Firefox. La que corrige ortografía está superchida; sé que GNOME incluye corrección ortográfica, pero hasta donde yo me quedé funcionaba con únicamente un idioma a la vez, y yo escribo en inglés y español de forma más o menos regular (especialmente en el navegador; foros, listas de correo que leo con GMail, etc.)

Pero la extensión que se me ha hecho indispensable es Firebug:

Firebug

Firebug

La cosa es una maravilla para cualquiera que tenga que lidiar con cosas de HTML+CSS; no sólo permite entender de dónde viene la definición de cada elemento en un documento (que con la herencia en CSS se puede volver un verdadero desmadre entender qué definición es la que se está usando): además analiza el código HMTL en vivo, en particular después de haber sido modificado por JavaScript.

Lo cual es endemoniadamente útil cuando uno va a una página que muestra un video, pero la liga al video no está en el código fuente HTML de la página, sino escondido en uno de los múltiples archivos .js que incluye el documento.

De hecho Firebug es la primera aplicación, propiamente dicho, que yo haya visto sobre Firefox. Sé que hay muchas otras más (Greasemonkey siendo la más famosa, creo); pero que yo utilice Firebug es la primera.

Si hacen cualquier cosa relacionada con HTML+CSS, o necesitan averiguar qué está haciendo exactamente JavaScript con una página que vean, no duden en instalar Firebug en Firefox. Es de las cosas más útiles que he visto correr sobre un navegador.