La vida moderna de edgar

Tags:
< April 2008 >
SuMoTuWeThFrSa
   1 2 3 4 5
6 7 8 9101112
13141516171819
20212223242526
27282930   
  • El sábado me senté como Romo a intentar hacer un poco de código. Ahora sé que esto no sale bien cuando: no sabemos de antemano que hacer y no tenemos las herramientas listas (git configurado por ejemplo). El sábado lo intentamos de nuevo.
  • Buena configuración vista en un blog en Debian Planet. Claro que la parte de Vim no me interesa. Así que lo de screen está aquí.

    hardstatus alwayslastline
    hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f %t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %Y-%m-%d %{W}%c %{g}]'
    
  • La mejor documentación de git hasta ahora ha sido el manual. Aprendí varias posas pero no terminé la entrada que iba a crear para eso.
  • El Gultec parece realmente muerto, casi tanto como el guluanl, esperemos que el GUL UR haga cosas interesastes como el FLISOL que organizan ahora.
Fecha publicación: 23 Apr 2008 02:13 | temas relacionados: | permalink | comentarios (0) | trackback

Y en la meme geek tenemos:

  eald:bash@quon[~]
  history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn|head
  106 git
  73 cd
  61 gmcs
  58 ls
  50 mono
  24 less
  17 ps
  14 bzr
  10 python
  9 telnet

Proyectos en git y bazaar, en C# y python; oom por aquí y por allá.

Fecha publicación: 11 Apr 2008 02:25 | temas relacionados: | permalink | comentarios (0) | trackback

Bueno el servidor está de vuelta, siempre mil gracias a Quaility Post por ayudarnos a mantener este espacio, con la donación del hardware (prestado) y la colocación.

Este servidor en su momento ayudó al grupo de la uanl y ahora, pues sirve de host en la página principal del mismo.

Notas para los adminitradores:

en /etc/network/interfaces:

pre-up iptables-restore < /etc/iptables.conf

Resultado final: Puerto 25 bloqueado para conexiones que no vengan de localhost, como les había indicado en un mail: Todo Abril sin correo para salir de alguna lista de spammers por ahí.

Fecha publicación: 03 Apr 2008 23:31 | temas relacionados: | permalink | comentarios (0) | trackback

Ya corregí el error que tenía el grabber (hay veces que no me gustan o no entiendo las traducciones de las cosas a español) de darklyrics.com. Y envié el parche a bugzilla.

Heroe del día: foo = re.escape (foo) venció por decisión unánime a:

foo = foo.replace ('(', '\(')
foo = foo.replace (')', '\)')
# ...
# así por cada caracter que hay que tendría que escapar
Fecha publicación: 30 Mar 2008 05:05 | temas relacionados: | permalink | comentarios (0) | trackback

La noche del jueves comencé a utilizar git. El otro día hice Un hack en rhythmbox y ayer tuve problemas con mi máquina virtual y el dsl.

Lo feo de hoy fue que tuve un extraño problema con la máquina virtual que tengo: Necesitaba instalar Visual C# Express 2005 y Visual Basic Express 2005 en ella y bueno, los necesitaba bajar directamente desde ella por que así es como funciona el instaladore. El host de esa máquina virtual es mi escritorio (quon), que además es el gateway de mi casa, es decir es el que conecta con el modem adsl de inifinitum. Bueno el problema es que ADSL (tal vez cualquier ppp) y vmware, al utilizar la red a altas velocidads no se llevan. Lo que ocurrió fue que después de un corto lapso de utilizar la red (utilizarla toda, no navegar y esas cosas) con los grandes archivos que se bajaban el modem dejaba de responder, no había ningún tipo de tráfico entre el host (quon) y el modem, mucho menos desde la máquina virtual. A veces, después de que la máquina virtual ya no utilizaba la red (por que no le funcionaba) el modem se recuperaba y comenzaba a funcionar de nuevo, otras veces no, el modem daba timeout y listo había que re-conectar. La solución fue encender mi vieja y no-funcional laptop (lilth) y utilzarla de gatway, hacer nat desde ella y ejecutar la máquina virtual en quon, el problema es que el ventilador de lilith está roto y hace muchísimo ruido.

Lo segundo es menos malo hice el parche para que rhythmbox obtenga lyrics de Dark Lyrics. Sin embargo tienen un bug al obtener la letra de la última canción de un disco, lo repararé pronto.

Por último, para mantener los parches en espera mientras, mientras entras al svn de cada proyecto (si es que alguna vez entra alguno) decidí a probar git. Por lo pronto eso lo hace perfectamente, hago múltiples branches, uno con cada parche y cuando necesite juntar algo para compliar my rhythmbox hage un merge de todos los branches y listo.

Fecha publicación: 29 Mar 2008 01:39 | temas relacionados: | permalink | comentarios (0) | trackback

Rhhythmbox es un reproductor de archivos de audio similar a iItunes para linux, aunque hay muchos similares este es mi favorito y he tratado de colaborar de a poco con él, ayer mandé mi segundo parche y mañana debo enviar el tercero.

Antes un poco de historia:

Cuando deje Windows por la paz, una de las razones principales es que no era divertido, de hecho era bastante incómodo realizar tareas muy comunes, otras tareas eran obligatorias así que disfrutarlas o no era lo de menos. Navegar era la principal, no me sentía bien haciéndolo, me limitaba bastante, no sabía realmente que era pero algo no me gustaba.

La solución llegó algún tiempo después de cambiarme a GNU/Linux. Apareció Galeon, en ese momento era el navegador número uno del software libre, con su ligereza, velocidad, sus pestañas para navegar, me hicieron redescubrir la navegación de web. Como un año después comenzó el desarrollo de Firefox y este se convirtió en el ganador, aunque ya me fue por la sencilla elegancia de Epiphany.

Una vez solucionado tan importante tarea, durante mucho tiempo me incomodaba escuchar música en la computadora, organizar todos los discos, tags con soporte a caracteres internacionales, encontrar rápido la canción que busco. Sin embargo con el XMMS (clon de winamp) sobrevivía. Luego llegó la revolución llamada iTunes y programas similares comenzaron a emerger en Linux. Rhythmbox fue uno de ellos.

Rhythmbox + last.fm me satisfacen en mis necesidades musicales, es una actividad que realizo con placer por que las herramientas cumplen su propósito de forma adecuada. Por eso he querido contribuir en algunas ocasiones a la comunidad de Rhythmbox y del sitio last.fm. Ya he enviado algún parche antes a Rhythmbox y estoy en el canal de IRC para ayudar a algún usuario, pero ahora realmente deseo hacerlo de forma constante.

Promesas nada más, pero este es mi TODO, muchas cosas no se integrarán al código principal, pero es algo que quiero dar para el que pueda tomarlo:

Al fin de cada punto del TODO pongo el lenguaje en el que voy a hacerlo o al menos el que creo que utilizaré. No puedo dejar de mencionar lo sencillo que es hacer código en Python, en el futuro cuando termine me gustaría hablar de las dificultades que tuve para hacer cada cosa y en que intervino el lenguaje necesario en esas actividades.

Siendo Rhythmbox una aplicación hecha en GTK+, hace que el que desee colaborar tenga que conocer en mayor o menor medida GObjects, GTK, Glib, GStreamer. A veces hacer eso puede resultar una tarea grande, hay muchas convenciones que seguir, mucha documentación (las API's) para leer, pero pocos ejemplos de como hacer las cosas, entonces a base de intentos, imaginación y mucho google, uno tiene que ir descubriendo que hace cada cosa, si lo que uno cree es verdad y como se realizan las cosas que uno quiere. Este es un proceso de experimentación que se lleva mucho mejor acabo en la limpia sintaxis de Python agregado al hecho de que es un lenguaje "interpretado" o por lo menos que quita una tarea del proceso de programamción:

Edita, salva, compila, ejecuta.

Doy gracias por Python, PyGTK (Gtk+ en Python) y especiamenet Rhythmbox tenga soporte a plugins en Python... gracias doc y todos los que han hecho estas grandes piezas de software.

Fecha publicación: 25 Mar 2008 23:56 | temas relacionados: | permalink | comentarios (0) | trackback

Menos importante pero para la versión 1.3 de PyBlosxom ya tengo funcinando el autoping.py que me permite enviar trackbacks de lo que escribo aquí semi-automáticamente.

El único detalle es que este script se basa en bajar el texto completo del link que yo obtengo aquí. Lo analiza buscando trackbacks y pingbacks anunciados en el html (cado uno tiene su forma extraña de anunciarse); las url encontradas son las que finalmente hace autoping.

En un mundo ideal esta es la mejor forma, yo mismo anuncio mi trackback en mi html como dice la especificación, pero la realidad es que la mayoría de las personas sólo pone un link que llama trackback (como yo también lo hago) y espera que el usuario copie ese link y lo utilice directamente, no lo anuncia para un trabajo automático.

Así que obviamente el siguiente paso es añadir a este auto-descubrimiento una lista de tracbacks url con lineas como:

  #trackback http://linuxuanl.org/eald/blog/trackback/compu/comentarios_trackback_akismet

Pero eso será después de que haga mi blog en inglés (sobre FLOSS) en PyBlosxom 2.0 que se encuentra en desarrollo.

Desconozco si con mi parche el script ya funciona para trunk (2.0), pero esto lo veré otro día.

Parche para Autoping.

Fecha publicación: 22 Mar 2008 20:56 | temas relacionados: | permalink | comentarios (0) | trackback

Como hoy terminé mi trabajo mucho más temprano de lo que debía y estoy bajando bootlegs de Dream Theater como enfermo, necesitaba una forma sencilla de pasar esos flac a mp3 (para ponerlos en el Ipod) pero con la condición de NO usar gstreamer, lo cual es un problema cuando uso Gnome.

No puedo usar gstreamer por que los archivos resultantes no funcionan muy bien en el Ipod, así que para generar los mp3 debo usar LAME Así que busqué en internet un script que hiciera eso; claro que hay mil y uno, pero ante el ocio prematuro decidí que debía hacer el script mil dos en python.

El resultado es regular en dos aspectos, el didáctico y en la función del script.

  • Es posible enviarle tags mediante la línea de comandos como se puede ver en el --help.
  • Trata de reutilizar los tags que me interesan del flac original (lo que venga de la línea de comandos tiene prioridad): artist, genre, album, date.
  • Soporta Unicode
  • Requiere /usr/bin/flac y /usr/bin/lame
  • Depende de Mutagen por lo que mi código tiene el virus de GPLv2.

Tengo dudas de como interactúa todo por que lame tiene serios problemas con los tags id3, pero desafortunadamente es el que mejor obtiene el audio (el más compatible al menos), si llego a tener problemas veré que puedo hacer, por lo pronto y pasé unos 8 discos.

En el aspecto didáctico:

  • Entendí como son las cadenas de getopt que nunca habia entendido realmente.
  • Apliqué este artículo de Guido Van Rossum sobre el template básico de un main para un programa de línea de comandos.

Script aquí.

Fecha publicación: 18 Mar 2008 02:13 | temas relacionados: | permalink | comentarios (0) | trackback

Algunas horas, páginas de libros y líneas de código después, tengo una mejor idea de lo que es VB.Net. Y no es la gran cosa.

No necesito aprender Visual Basic y estar a la moda de ninguna manera, realmente no me ofrece gran cosa, C# no es tan complicado para hacer lo mismo y es mucho más fácil editar en Emacs C# que VB. El verdadero poder de Visual Basic está en su base de usuarios. De ahí en adelante es un conocimiento bastante olvidable.

En VB.Net se aprovecha todo lo que es Visual Studio (creación del proyecto, editor atractivo aunque molesto), .Net (sus tipos, costumbres y biblioteca) y así pude mandar a llamar con facilidad el módulo que hice en C# (código propietario del cliente, así que no ejemplos). Hice un UI sin necesidad de threads (tal vez esto haya sido un error pero es un simple demo lo que tenía que hacer en VB) y claro Intellisense.

Del lado negativo está un poco la incomodidad de las costumbres y lo explícito en exceso que tiene el código de VB. Como ejemplos: `CType (variable, tipo)` o CFoo, la costumbre casi generalizada de utilizar simplemente (tipo); IF Not foo is Nothing Then es la única forma que encontré de expresar el if foo: the Python if (foo != null) de C#; los insoportables End EstructuraFoo, comparados con la elegencia de python que no requiere más que regresar un nivel en la indentación o el acostumbrado } para cerrar el bloque en C; la confusión que genera el Dim varName as Type = New Type (args) para declarar e instanciar el objeto y no me pregunten como le haces cuando se trata de un arreglo de Type inicializado; el acceso a elementos de un arreglos es curioso en el mejor de los casos var(index) accede al elemento index de var, claro que si var fuese una Function o un Sub (Hola Pascal, tanto tiempo), index podría ser un argumento y ni quien se entere.

No encontré como escribir una constante Hexadecimal, tuve que usar una función que convierte entre bases a los enteros.

En resumen escribir en VB es un retroceso, es pobre en sus expresiones y no muy lindo. Si tengo que usarlo de nuevo espero poder encontrar algo que sea entretenido, tal vez hacer threads se muy fácil.

No ligas esta vez.

Fecha publicación: 18 Mar 2008 01:43 | temas relacionados: | permalink | comentarios (0) | trackback

Una de las razones principales por los cuales escogí pyblosxom como el motor de mi blog es que está escrito en python, aprovechando eso compuse un pequeño problema con trackbacks y el spam en pyblosxom.

Para mí, escrito en python significa que es fácil de modificar y en general que los programadores son fáciles de tratar. Luego ví que más que un software de blog ya hecho es como un rompecabezas, como una plataforma, teniendo el código tan disponible siempre me ha sido fácil hacerle pequeños cambios.

A veces mis cambios no sales bien (el plugin de tags lo tengo que reescribir o bajar otro). Pero ahora lo que hice fue integrar el soporte de análisis de spam a los trackbacks. Antes esto estaba descompuesto y no podían convivir los plugins de trackbacks y Akismet, ahora en svn ya conviven, pero Akismet ignora los trackbacks, por lo que el spam puede llegar por ahí sin filtro. Con mi parche (que en realidad es muy sencillo) trackbacks y seguramente pingbacks también pasarán por los sistemas anti-spam antes de ser publicados.

Fecha publicación: 16 Mar 2008 00:44 | temas relacionados: | permalink | comentarios (0) | trackback

Ayer y hoy intenté instalar (con aparente éxito) VMWare Server, con el propósito de tener un Windows(R) más cerca y aunque no fue automático como hace un año en mi trabajo, pude hacerlo en varios pasos y con algunos problemas.

Durante la instalación hay un problema con kernel 2.6.23 o superior. Por lo que fallará la compilación de los módulos (esto por que usamos una plataforma no soportada: Debian), así que una vez que falle esta, hay que bajar este "parche" y luego seguir con los pasos que menciona Kokopelli en el comentario #10 del tema relacionado en los foros de Ubuntu.

Con eso ya pude instalar correctamente VMWare. Pero a la hora de crear una imagen nuevo algo en el dialogo de abrir archivo de Gnome hace que todo falle, por lo que la ubicación hay que ponerla manualmente escribiendo la ruta.

Para terminar una vez que se usa tiene un par de problemas con mi computadora actual (Debian Unstable, Video NVidia con drivers propietarios):

  1. En una ocasión al sailr de modo fullscreen de la máquina virtual la imagen de esta se quedó encima del resto de las aplicaciones en X, por lo que no podía ver mucho de mi pantalla, además no se podía cerrar la máquina virtual mediante el servicio de VMWare. Aunado al problema (2) tuve que ir a la computadora de mi hermana para matar los procesos que me afectaban, reiniciar el servicio de vmware y así lo soluciono temporalmente, espero que no me vuelva a ocurrir.

  2. Aunado a 2, tengo un problema que se ha comentado en algunos foros. Al salir de fullscreen ya no puedo utilizar Shift y Control, por lo que no puedo por ejemplo cambiarme a una consola para solucionar algo. Lo que tengo que hacer para corregirlo es cambiar el "Layout" de mi teclado (y devolverlo al que lo tenía) y Gnome solicita a X la configurar de nuevo, así se re-establece, es feo pero tampoco espero usar el fullscreen mucho, esperemos que vmware pueda solucionar estos problemas pronto.

Fecha publicación: 12 Mar 2008 23:51 | temas relacionados: | permalink | comentarios (0) | trackback
  • Cuando usas linux por mucho tiempo se abren y cieran procesos y los id's se acaban ps ax ya no es tan buena opción, por que no muestra los procesos ordenados:

    alias ps='ps --sort start_time'
    
  • Grep con presentación coloreada:

    alias grep='grep --color'
    
Fecha publicación: 02 Mar 2008 02:16 | temas relacionados: | permalink | comentarios (0) | trackback

El título suena peor de lo que es. En realidad tengo que hacer sólo una pantalla en Visual Basic, que llamará una dll que tuve que hacer (en C#). Pero es cierto, estoy checando los graciosos documentos introductorios de VB.Net para aprender el lenguaje (aunque la mayoría de las cosas me las salto) y me recuerda mucho lo que viví hace más o menos 11 años.

En ese entonces yo era un chicuelo que desperdiciaba su tiempo en la preparatoria, pero me gustaban muchos las computadoras, de las clases de programación hacia la tarea de medio salón, casi el resto se lo copiaban y nos dieron Pascal, C y otras cosas que no son lenguajes de programación en sí (dBase por ejemplo). Pero un mal día que no recuerdo me enteré de la existencia de Visual Basic, versión 5 creo; un maestro de 6 lo daba (aunque debía dar otra cosa en sus clases) y me dejó ir a su clase y luego me prestó los discos de instalación (todo bien ilegal por supuesto).

Un par de años más tarde trabajé con Visual Basic 6 y hasta era bueno con él, sin ser nada especial ahora que me pongo en perspectiva pero lo suficiente para sobresalir. Y recuerdo mucho como me pasaba leyendo el MSDN de aquel entonces, del ejemplo del globito con el cual te enseñan lo que son eventos, propiedades y métodos; sobretodo el entusiasmo con el que veía la documentación y el lenguaje mismo, como una herramienta divertida y útil.

Pero han pasado muchísimas cosas desde entonces: ya no soy menor de edad, aprendí otras cosas, distintas ideas, sobretodo conocí personalidades poco comunes y rodeado del extinto Grupo de Usuarios de GNU/Linux de Monterrey entendí lo pobre que eran mis sueños basados en Visual Basic 6.0 (en realidad yo ya estaba muy decepcionado de Visual Basic al llegar al grupo, pero eso aceleró el proceso de ida sin retorno).

Hoy día, tengo la necesidad de hacer un poco de trabajo en Visual Basic.Net, que sé dista bastante de Visual Basic 6.0, algunos afirman que inclusive ya es un lenguaje hecho y derecho y me va a tocar comprobarlo a menos de manera superficial y aunque no tengo muchas ganas y siento que es un retroceso, también creo que si recupero un poco de ese entusiasmo con el que jugaba con el VB en mis años felices puedo sacar provecho de esta situación.

De antemano para mí Visual Basic.Net parece ser un "syntactic sugar" de C# con abreviaturas automáticas para hacer lo mismo que en C#, sin puntos y coma o llaves (pero con esos horribles EndFoo). Una sintaxis no tan buena limpia como python (tampoco así de poderosa), pero extendida para hacer aplicaciones Web y de escritorio con mucha facilidad (python es un lenguaje de propósito general). Veremos que es en realidad.

Fecha publicación: 27 Feb 2008 21:47 | temas relacionados: | permalink | comentarios (0) | trackback

Ya saben como es eso del uptime, algo totalmente fálico: mientras más largo más geek. Bueno pues le tengo que decir adiós a mi uptime a cambio de un nuevo quemador y un disco duro (ambos SATA).

eald:bash@quon[~]
uptime
 13:52:00 up 71 days, 13:49,  7 users,  load average: 0.91, 0.67, 0.48
Fecha publicación: 25 Feb 2008 13:55 | temas relacionados: | permalink | comentarios (0) | trackback

Me gusta cambiar de entretenimiento de forma constante: un rato veo películas, otro series, luego leo libros o sitios web, me puse a ver Fútbol Américano la temporada anterior y ahora me han vuelto las ganas de jugar Magic: The Gathering. Lo que me convierte en un ente raro que usa linux, juega magic y... prentende tener un blog.

Antes cuando jugaba sabía algunas cosas sobre lo que produce la combinación de estas cosas:

  • MTGO no se puede jugar muy bien en linux..
  • Mindless Automation era el único tabletop (programa que sirve para jugar, pero sin reglas programadas ni nada por el estílo) que funciona en linux.

Ahora las cosas han cambiado mucho, hay Firemox (que no he probado), MTGO va a sacar su versión 3 (aún sin soporte para Linux y Mindless Automation está descontinuado por que ahora su autor tiene un nuevo programa incompatible con Apprentice, por lo que a mí no sirve y yo seguiré utilizando Mindless Automation.

Mindless Automation intenta buscar la fuente:

    schumacher-*-medium-r-normal-*-*-80-*-*-*-*-*

y si no la tienes, te quedas con una horrible en todo el tabletop, para cambiar eso hice este hack:

Soporte para Pango en Mindless Automation. La fuente default es Sans 8 (está en todo sistema Gnome) y se puede editar mediante la llave font_name en ~/.mindlessrc.

Fecha publicación: 19 Feb 2008 23:53 | temas relacionados: | permalink | comentarios (0) | trackback

Hace unas semana se me ocurrió la puntada de buscar un tema para Gnome oscuro, al principio todo parecía felicidad, pero hay 3 aplicaciones que me dieron problemas (muchos).

X-Chat

El texto de la ventana y el fondo no tenían contraste suficiente en varios de los colores que muestran. Pues sencillamente tuve que cambiar los colores en la configuración de colores de la ventana de texto, nada complicado.

Epiphany

Aquí el problema lo provocan los desarrolladores web que no establecen color de fuente y fondo para el tag body, sin embargo su sitio basa su visibilidad en la suposición de que el fondo será blanco y la fuente negra. Como extraño Netscape, en los viejos tiempos, con su horrible fondo gris habría provocado que muy pocos cometieran ese error. La solución es sencilla, En el diálogo Edit -> Preferences; pestaña Font & Style utilizar la opción Use Custom Stylesheet y seguir la solución que se ha puesto en los comentarios de este blog: que indica poner en el Stylesheet:

body { background-color: #fff }.

Tomboy

Este programa no es muy conocido ni popular (Notas de escritorio con ligas entre ellas simulando un Wiki personal escrito en C#) Aquí el problema es el mismo falta de contraste entre fuente y fondo, primero intenté hacer cambiar el color del texto haciéndolo claro, pero las ligas no cambiaban de color, primero me creí el cuento de que con GtkWidget::link-color esto se solucionaría, sin embargo no pasaba, después de varios intentos (link_color en lugar de link-color por ejemplo), leer [el tutorial de temas de Gnome] no encontraba la razón por la cual no funcionaba, la única razón parecía ser que el color estaba embebido en el código, cosa que no me parecía posible, debido a la [actitud mostrada][] por los desarrolladores en la lista de correo de Tomboy acerca de la configuración de colores, en la que parecen indicar que eso debe recaer en la usabilidad general del sistema, que no es más que los temas. Primero un apt-get source tomboy y luego en tomboy-0.8.2/Tomboy/NoteTag.cs

                    // Links

                    tag = new NoteTag ("link:broken");
                    tag.Underline = Pango.Underline.Single;
                    tag.Foreground = "#555753";
                    tag.CanActivate = true;
                    Add (tag);

                    tag = new NoteTag ("link:internal");
                    tag.Underline = Pango.Underline.Single;
                    tag.Foreground = "#204a87";
                    tag.CanActivate = true;
                    Add (tag);

                    tag = new NoteTag ("link:url");
                    tag.Underline = Pango.Underline.Single;
                    tag.Foreground = "#3465a4";
                    tag.CanActivate = true;
                    Add (tag);

El cuerpo del delito, los colores estan hard-coded en el código, y aprendí que TaxtTag de Pango no hereda de GtkWidget por ningún lado, por eso el tema no puede afectar estos colores (aunque no estuviera hard-coded. Estuve tentado a hacer un parche que tomara el color del texto que indique el tema de Gtk, hay manera de hacerlo, pero no sé de donde sacar el color para el los tres tipos distintos de link y como el desarollador no quiere que eso sea modificable por el usuario, no hay mucho que hacer. Así que la decisión correcta me parece es hacer que el tema respete los colores usuales de Tomboy.

Para eso hay agregué al tema:

 style "tomboy"
 {
    base[NORMAL]            = "#FEF7B9" # Un amarillo
    text[NORMAL]            = @bg_color # Texto oscuro

  }
  widget "*Tomboy*NoteWindow*" style "tomboy"

Utilizo el nombre del tipo de dato (clase) que contiene el texto Tomboy.NoteWindow, esto debió haber sido obvio para mí, si desde un inicio bajaba el tema que se indica en este blog y lo leía.

Fecha publicación: 09 Dec 2007 20:22 | temas relacionados: | permalink | comentarios (0) | trackback

El jueves pasado inenté dar una plática de Django en el ITNL, por invitación del Grupo de Usuarios de GNU/Linux del ITTNL.

Y digo intenté por que la hice muy larga al parecer, en parte por que no parecían muy conocedores de los temas previos necesarios para esto y tuve que explicarlos uno a uno, y en otro por que me faltó hacer un resumen más estricto.

Quedamos que en otra ocasión daré la continuación. Por lo pronto dejo la presentación en PDF y mi script (está en UTF-8, lo tengo que aclarar por que mi sitio está en ISO-8859-1). Es sólo de la parte de que dí que es una plática general de lo que es programar en Web, tardé 40 minutos en darla.

Por cierto, la idea era dar el tutorial oficial sencillamente, por lo que leerlo y seguirlo debe dar el mismo o mejor resultado.

Fecha publicación: 31 Oct 2007 12:13 | temas relacionados: | permalink | comentarios (0) | trackback

Un mal día, mi jefe llegó preguntando por un forma de analizar unos logs de un programa que utilizamos. Primero una cosa sencilla, y mi tonta cabeza pensó:

Procesamiento de texto + Algoritmo simple = Perl

No lo vuelvo a hacer.

En ese momento pareció y fue buena idea, detectar un patrón de texto en un archivo, organizar un poco el texto y limpiarlo, parecía y fue factible, cuestión de minutos, más tiempo en recordar Perl, afinar la expresión regular, ver unos cuantos ejemplos sobre arreglos (pero se veía que llegaba a cosas oscuras) y listo.

Luego al ver el resultado y que había áreas de oportunidad, el requerimiento creció considerablemente; se encontró un error y seguimos para adelante.

El error fue resuelto, no sin sus problemas. En mi cabeza rondaban distintas formas de resolverlo, alguien con idea en el problema del análisis de texto podrá recordar estos problemas alguna vez:

Teoricamente el archivo tiene la forma:

 [Una linea]
 [Una linea]
 ...

Pero en realidad tenía la forma:

 [Una linea]
 [Una linea][Una linea]
 [Una linea][Una mentirosa linea][Una linea]
 [Una
 linea]
 [Una
 linea][Una linea]
 ...

Y combinaciones peores que esa. Así que como opciones encontré:

  • Considerar que el salto de linea no fuera mi separador de cadenas.
  • Que mis expresiones regulares fueran multi-lineas.
  • Otro par que afortunadamente ya no recuerdo.

Al final, después de pensarle un poco dí con una solución correcta. Pero recae muy poco en el poder de Perl de manejar expresiones regulares, tanto que podría haberlo escrito en Python sin ningún contratiempo, al menos no hubiera sido peor que lo que había hecho en Perl.

Pero hasta ese momento puedo presumir de que Perl había realizado su tarea sin muchos problemas. El problema fue cuando quise implementar los requerimientos extras.

En cuanto a mis requisitos para el lenguaje, una vez diseñada mi solución (y que decidí limpiar un poco el código) son:

  • Arreglos de Hash.
  • Arreglos de Arreglos de Hash.
  • Funciones que reciben valores por referencia.
  • Referencia a elementos de arreglos o de Hash.

Estas cosas suenan de lo más natural e inocencentes y han probado ser una desgracia infinita para mí. No por que no pueda resolver mi problema, sino por que no encuentro la forma correcta de hacerlo. Me centraré en el problema de las referencias para ejemplificar. Tengo un archivo de pruebas que voy generando mientras voy aprendiendo gramática nuevas (Sí, mientras voy aprendiendo formas nuevas de hacer lo mismo sigh).

Al inicio del archivo declaro mis buenas intenciones, la prueba es clásica, declaro una variable ($a) luego hago una referencia a ella $b y modifico el valor de la variable via su referencia. No me voy a meter en lo feo que se ve \$, yo creo que esto aceptable en un lenguaje como Perl:

   # Trying to learn how to use references in perl

   # Lesson 1: Make reference with \$ and dereference with $$
   $a = "pp";
   $b = \$a;
   $$b = "qq";
   print "\$a changed via \$\$b $a\n";

Después intento hacer lo mismo via referencias, tomo la referencia de $a via \$a sin variables intermedias, está todo bien, cuando declaro la variable con my, no pongo $$, sólo en el resto de los casos. Esto es coherente, puedo pasar de mi lección 1 a la lección 2 sin problemas:

   # Lesson 2: This works for functions too in the same way \$ and $$
   sub t {
       my $p = shift;
       $$p = "rr";
   }

   t(\$a);
   print "\$a changed via t(\\\$a) $a\n";

Por alguna extraña razón en mi script de trabajo, necesito utilizar prototipos (que por cierto no pudieron ser más feos) así que me pongo a probar como hacer prototipos. Y aquí es donde surge la duda, ¿qué recibe la función? Siendo coherente con la lección 2, una referencia a escalar (\$), no un escalar realmente, pero aparentemente las referencias a escalaras son... escalares. Así que yo no me fuí con el ejemplo anterior y jugué un poco, después de esto obtuve este código funcional:

   # Lesson 3a: with prototypes
   sub u ($);

   u(\$a);

   sub u ($) {
       my $p = shift;
       $$p = "ss";
   }

   print "\$a changed via u(\\\$a) $a, with prototype u(\$)\n";

Poniendo atención a la linea de asignación en la función `$$p = "ss"`. Por que aquí viene el momento en que decimos Bienvenido a Perl:

   # Lesson 3b: same to the one above but using declaring the reference
   # in the function no in the call
   sub v (\$);

   v($a);

   sub v (\$) {
       my $p = shift;
       $$p = "tt";
   }

   print "\$a changed via v(\$a) $a, with prototype v(\\\$)\n";

Veamos, utilizando una referencia ahora sí, entonces, resulta que $p tiene una referencia que con $$p se puede "desreferenciar". Bien entonces si \$a es una referencia y $a es un escalar, ambos enviados a una función, $$p, sirve para acceder al mismo valor en ambos casos? ¿\$a y $a son sinónimos? No, pero me dan el mismo resultado, ¿cómo se supone que debo hacerlo? Buscando esta respuesta se me ocurrió otra combinación:

   # Lesson 3c: same to the others, not declaring reference in the call
   # nor the declaration, just use it via $$
   sub w ($);

   w($a);

   sub w ($) {
        my $p = shift;
        $$p = "tt";
   }

   print "\$a changed via w(\$a) $a, with prototype w(\$)\n";

Aquí es donde nos paramos de la mesa y mejor nos vamos a otra cosa. La función espera un scalar, recibe un scalar, y mágicamente, con la soberana autoridad de hacer lo que se le da la gana "desreferencia" un scalar ¿? Sí. Eso hizo y tengo un nuevo valor para $a.

¿Cuál es la forma correcta de hacerlo?

En este momento me parecía que la última, ya que aunque no era explicita -ni mucho menos- era la menos fea (la \ es horrible). Aunque es la peor en términos de su significado (no dice nada al respecto de que se esta haciendo). Pero cuando intenté extender esto a arreglos me dí cuenta que esa era mi peor opción.

Eso lo pondré en otro episodio más de: No importa cuanto procesamiento de texto te prometan, si un lenguaje programación no es capaz de mantener una sintaxis estable y elegante para estructuras de datos complejas gira la página y vete al siguiente.

Fecha publicación: 28 Sep 2006 21:20 | temas relacionados: | permalink | comentarios (0) | trackback

Hay veces que la gente dice -o peor escribe- idioteces a diestra y siniestra, sobre todo en los medios no especializados de alcance masivo, un claro ejemplo son las notas de computación en el universal, como este fragmento:

  [...]"todos los que formamos parte de la industria de la
  música mexicana informamos que el `Peer to Peer' (P2P)
  es una actividad ilegal que viola los derechos de
  autor".

P2P es una tecnología, que se puede utilizar para medios que violan ciertos derechos de autor sí, pero hay tantos usos válidos, como la distribución de actualizaciones de videojuegos, por hablar de algo totalmente cerrado, pero habemos quienes utilizamos productos que permiten su distribución y para estos el P2P no hace más que ayudar a descentralizar el tráfico de estos.

Pero yo no sé si lo que voy a escribir a continuación viola derechos de autor o no (en realidad depende del uso que se le dé, no del servicio en sí), pero el servicio es algo que necesitamos y nos merecemos.

Imagino un reproductor de música (puede ser cualquiera) que tiene forma de asociar la letra de las canciones con la canción misma, es decir si yo estoy escuchando una canción pueda ver su letra, o sencillamente al seleccionarla puedo verla. De esos hay muchos, nada nuevo por aquí, pero el mayor problema es que capturar todas esas letras es un esfuerzo que aún navegando en la web y utilizando C&P es ridículo. Para esto, hay programas que encuentran la letra asociada y la ponen a tu disposición, notablemente Amarok que mi amigo Vox utiliza (muchos problema de facilidad de uso en este programa pero tiene muchas gracias); así que otra vez nada nuevo por aquí. La cuestión es que no hay una página en internet en la que puedas encontrar todo, pero yo me pregunto, ¿entre todos no tenemos todas las letras?

Hagamos que nuestro reproductor de música, no busque en un sitio las letras. Sino que incluya un mini generador de archivos para bittorrent y cliente de bittorrent (¿DHT tal vez?), el reproductor que imagino: genera los bittorrents para lo que tenemos, busca bittorrents para la letra de las canciones que no tenemos y queremos, entonces utilizando esta tecnología entre todos nos pasamos las letras, sin saturar un servidor y con una mayor probabilidad de encontrar lo que buscamos. Para identificar las canciones podría utilizar algo como el ID de MusicBrainz.

Me parece una solución atractiva para este problema.

Fecha publicación: 20 Sep 2006 20:11 | temas relacionados: | permalink | comentarios (0) | trackback

Esta guerra constante entre "buenos" y "malos" que hay en Internet, en la que nos encontramos en medio del tiroteo. No puedo dejar de tomar partido.

Spams vs spams-filters, cracks vs parches, script-kiddies vs sys-admins.

Por un lado es: tener una cantidad de correo no solicitado inmensa, por otro, obligar a mi computadora a consumir recursos en procesar el correo con los programas para filtrar correo electrónico; por un lado es: permitir que otros falsifiquen mi identidad en algún sitio, por otro, teclear contraseñas muy largas y complicadas; por un lado está, leer un blog lleno de comentarios que no lo son realmente (spam en los blog), por otro, está el que ver una tonta imagen distorsionada y teclear lo que ella dice; por un lado está el recibir visitante indeseados en la computadora, por otro, el control excesivo de mi computadora, el que nunca se exponga una máquina con Windows directamente a Internet, el que mis puertos abiertos sean de programas en los que confío, en actualizar constantemente todo mi sistema.

Ambos lados son horribles, desagradables para el usuario, pero me queda muy claro cual es el lado que me molesta menos.

Así que celebro esta encuentro de hoy: un interesante método anti-phishing de parte de Yahoo! mail, no sé que investigaciones tengan en sus bancos y cuestiones así, pero esta idea se me hace interesantísima, aunque es terriblemente complicado que yo caiga en un anti-phishing (casi siempre navego tecleando la url), me parece sobresaliente esta técnica.

Portada de Yahoo! mail personalizada para mi computadora

Se basa en que tu debes de llegar de una forma segura a la página de Yahoo! mail por primera vez, ahí te pide enviar una imágen o un texto que todos en tu computadora puedan reconocer, desde ahora, Yahoo! mail va a asociar tu ip con esa imagen (al menos eso supongo, no lo puedo confirmar), entonces ya sabes que si esa imagen no es la que debería, no estás realmente en Yahoo! mail, es una configuración de una vez, lo cual no lo hace tan desagradable de activar.

Por alguna razón sólo puedo verlo en epiphany (mi navegador titular) y no en firefox aunque ambos están basado en Gecko.

(The award-winning, free Web browser)f

Fecha publicación: 27 Aug 2006 22:23 | temas relacionados: | permalink | comentarios (0) | trackback

Este es El curso que deberían llevar todos los estudiantes de sistemas en el mundo.

A principios de año jpablo me mencionó la existencia de un curso introductorio a la programación, sinceramente el estaba muy emocionado con lo que ahí presentaban, por lo que despertó mi curiosidad, resulta que son unos vídeos en los que los profesores Harold Abelson y Gerald Jay Sussman dan el curso 6.001 del MIT.

Siempre hemos tenido ese cosquilleo de que los cursos de introducción a la programación o programación 1 y 2 o equivalentes que se dan en las distintas escuelas en la ciudad (y por lo hablado con otros es lo mismo en todo el país) no son lo que deberían ser, son demasiado orientados a mal-enseñar algún lenguaje de programación en particular, casi siempre C y pierden el objetivo que formar personas que tal vez no puedan programar pero sepan distinguir quien sabe del que no.

El curso de Structure and Interpretation of Computer Programs, da las bases para entender conceptos fundamentales como: abstracción de datos, iteración, recursión, modularización, todos los demás. Y por si 20 vídeos no bastaran, también está el libro del curso publicado en internet, cuyo nombre es el mismo del curso.

En este momento, cualquier pregunta que se asemeje a ¿cómo puedo aprender a programar? se va directo a ese curso, imperdible para cualquier joven entusiasta que pretende ser programador de computadoras o un estudiante que necesita reforzar sus fundamentos en el área.

Fecha publicación: 30 Jul 2006 02:32 | temas relacionados: | permalink | comentarios (0) | trackback

Primero que nada, este blog pretende ser una área de comentarios y discusión sobre cosas de computación de mi interés en general, no sólo hacks o código; seguramente habrá mas discusión y tutoriales que código mismo.

Fecha publicación: 30 Jul 2006 01:39 | temas relacionados: | permalink | comentarios (0) | trackback