Extendiendo Trac

En el trabajo ya hace bastante tiempo estamos usando Trac, con bastante éxito. Tiene sus limitaciones, ya que manejamos muchos proyectos, y sobretodo para la gente que tiene que coordinar más de un proyecto, se vuelve muy tediosa la falta de una "vista consolidada" que permita consultar y administrar al conjunto de proyectos como un todo. Por ejemplo, responder la pregunta "¿cuántos tickets tiene asignados fulano en TODOS los proyectos en los que está?" es complicado.

Esa parte la resolvió Diego exportando cada N tiempo cada una de las bases de datos SQLite de cada proyecto a una base de datos dentro de SQLServer, y ahora se están desarrollando varios reportes usando las herramientas estándares de la consultora. La desventaja es que la información es un snapshot (i.e., no tenemos la info en tiempo real, actualizada al instante), la enorme ventaja es que estamos pudiendo explotar la info de Trac de una manera mucho más rica, a la vez que nos permite una integración mucho más fuerte con nuestras otras herramientas. En cuanto a esta parte del dilema (consolidación de la información), la pata que está faltando es interactuar con Trac, es decir, no solo consultar la info, sino por ejemplo hacer operaciones masivas, del estilo seleccionar N tickets de X proyectos que cumplen tal criteria y cerrarlos. Diego está experimentando con una especie de RPC casero haciendo POSTs a Trac, yo tengo pendiente instalar en un entorno de prueba el XmlRpcPlugin y ver si nos da alguna ventaja.

Otro problema que teníamos era la consistencia entre proyectos en cuanto a "Prioridades", "Tipos de tickets", "Severidades", etc., etc., más cuestiones como definir que componentes por defecto están activos, que usuarios tienen que permisos, etc. Eso lo resolvimos haciendo un wrapper alrededor de TracAdmin. Pero no "trac-admin" el comando, sino TracAdmin a nivel de componente. Este wrapper puede usarse por línea de comandos o como un servicio web (que invocamos por ejemplo desde una página de creación de proyectos), y "sabe" hacer un initenv usando todos nuestros defaults: borra las cosas que no necesitamos, agrega las que sí, setea defaults y permisos, etc. Así cualquiera puede inicializar un nuevo proyecto en Trac con total confianza de no olvidarse ningún paso, y de que va a cumplir con nuestro estándar interno. Y el 99% de las cosas que hace este wrapper están definidas en un archivo externo de configuración, con lo cual es simple modificar / extender lo que hace.

Sacando esos dos grandes temas, aún tenemos pendientes varios detalles mas finitos, varios de los cuales son candidatos a o bien encontrar un plug-in en Trac Hacks que nos de la funcionalidad requerida, o implementar nuestro propio plug-in. Uno de esos temas tiene que ver con que Trac 0.10 no maneja workflows, la versión 0.11 se sigue demorando... y demoraaaaaaando, y estábamos necesitando empezar a validar ciertas cosas, en particular, de consistencia de valores de algunos campos al cerrar un ticket. Así que con un poco de expermientación del finde, más un ratito hoy en el trabajo para afinar detalles, me largué a escribir mi primer plugin para Trac.

Es realmente MUY fácil. La mayor parte del tiempo la invertí investigando de cual de tooooooooodos los puntos de extensión que expone Trac tenía que colgarme para hacer lo que yo quería. Una vez descubierto eso, fue muy sencillo. Quería validar el ticket al grabar cambios. La interfaz a implementar resultó ser ITicketManipulator. Macheteandome un poco en el código SpamFilterPlugin, y leyendo la MUY buena doc de Trac, el resto fue coser y cantar.

No publico el código completo porque está muy pegado a lo que hacemos internamente en el trabajo, pero en esencia, el core del plug-in es algo así:

from trac.core import *
from trac.ticket import ITicketManipulator, TicketSystem

class RechazarTicket(TracError):
    """Excepcion a generar si el ticket es inválido."""

class MiValidator(Component):
    implements(ITicketManipulator)

    # Métodos de ITicketManipulator

    def prepare_ticket(self, req, ticket, fields, actions):
        pass

    def validate_ticket(self, req, ticket):
        if 'preview' in req.args:
            # Si es un preview, y no estamos grabando, no validamos nada
            return []
        if ticket['status'] != 'closed':
            if ticket['version'] in ('XXX', 'YYY'):
                raise RechazarTicket('La versión %s solo es válida si el ticket está cerrado.' % ticket['version'])
            # El ticket aún no está cerrado: No validamos nada más
            return []

        # Recuperamos todos los campos que NO son de texto
        fields = [f['name'] for f in TicketSystem(self.env).get_ticket_fields() if f['type'] not in ('textarea', 'text')]
        for field in fields:
            # Acá implemento las validaciones que quiera...
            # "field" tiene el nombre del campo (ej., "version", "status", etc.)
            # puedo acceder al valor haciendo
            #    ticket[field]
            # y puedo ver el valor anterior (para ver si se está modificando) haciendo
            #    ticket._old[field]
            # Si alguna de mis validaciones custom no se cumple, se hace un
            # raise de RechazarTicket... y listo.
        return []

Como ven, muy fácil. Ahora entiendo un poco más por qué en Trac Hacks hay TANTAS cosas... es que realmente es simple extender Trac. Ahora que rompimos el hielo con este primer plugin... probablemente se vengan más a futuro.

Björk en Bs. As.

Anoche fue la segunda (y última) presentación de Björk en el Gran Rex, en el marco de la gira en la que está presentando su último trabajo, Volta. Y para no quedarme atrás en esta racha de prácticamente engancharme en todas que inauguré este año, estuve ahí.

Es difícil ponerle una etiqueta a Björk. Yo conozco más bien poco su trabajo, y en esta escalada experimental que inició hace ya varios años, digamos que cada vez experimenta más, y musicalmente a mi me cuesta digerirla un poquito más. Y resalto el musicalmente, porque (ahí es donde viene lo complicado con Björk), la música es solo un aspecto de su obra.

Anyway: A pesar de que Volta no es un disco que me pinte escuchar muy seguido, el show estuvo excelente. Como siempre, el tener al artista en vivo en un escenario pone las cosas en otro nivel. Impresionante el despliegue visual, los detalles de iluminación, vestuario (de Björk y de las Wonderbrass), las cosas inesperadas, como verla de pronto lanzar de sus manos una especie de telaraña que todavía estoy queriendo saber de donde sacó. Y por supuesto, me di el gusto de ver usar la reactable en vivo :)

¿Cómo? ¿no sabés que es la reactable? Mirá por ejemplo este video, o cualquiera de estos otros. Estuvo muy buena la idea de la producción de tener una camarita arriba del bicho ese que reproyectaba en pantalla gigante la "magia" que hace Damian Taylor.

El único punto un poco olvidable del show fue la diatriba de Björk hacia el público luego del segundo tema a causa de la (muchísima) gente que estaba sacando fotos con flash. Entiendo que moleste al que está en el escenario, sobretodo en un teatro que es un ambiente más chico. Entiendo que la gente es ignorante, usando flash por ejemplo desde el superpullman (infeliz: si tenés una cámara point-and-shot común (como tenía el 99% de la gente que estaba sacando fotos), es AL PEDO que pongas flash... lo único que lográs es fotografiar la nuca del que tenés adelante)... pero hay formas y formas de dirigirse al público. Igual, mucha bola no le dieron. Después del sermón la gente paró un poco, pero hasta ahí. Me pregunto cuantos entendieron lo que dijo (en un inglés con mucho mucho acento -- me llamó mucho la atención que tuviera tanto acento, cosa que no le noto cuando canta --). A juzgar por como la vitoreaban cuando hablaba... más de uno no entendió una goma y se pensó que estaba saludando o algo así... en fin.

Björk no para ni un minuto en el escenario... permanentemente bailando, saltando. Quizás eso explica que el espectáculo es más bien corto (o al menos, no es largo), y dura una hora y media. Hay que seguir ese ritmo una hora y media.

En resumen, muy buen show, y como comentábamos con los chicos, uno se queda con ganas de más.

Antes del teatro, nos juntamos con Eze y Seba a comer unas pizzas en El Cuartito... añares hacía que no iba ahí. Buenísima la pizza. Y a la salida, como Carolina y Pablo no habían cenado, fuimos todos al Palacio de la Pizza. Seba se animó a acompañarlos. Eze y yo pedimos directamente un bombón helado cada uno (la cara del mozo mientras parte de la mesa le pedía pizza, y parte postre era para enmarcar). Pésimo. Nota mental: NUNCA pidan un bombón helado en el Palacio de la Pizza. Nunca. Feo. Muy.

CDC UNLUX 2007 - Conectando Puntos

El sábado se realizó el Ciclo de Charlas UNLUX 2007, "Conectando Puntos", organizado por el Grupo de Usuarios de Software Libre de la Universidad Nacional de Luján (UNLUX para los amigos :p)

Evento que tuvo el "honor" de ser auspiciado por PyAr. ¿Será un honor? Jeje... hablando en serio, el honor fue nuestro, y marca un hito. Esperemos que en adelante podamos seguir auspiciando estos eventos.

Otro punto que hace especial a este ciclo de charlas es que fue generado desde adentro de una universidad, y eso es fantástico. Las universidades tendrían que tener un contacto MUCHO más grande con el software libre del que tienen... por una cuestión de soberanía y autonomía, por una cuestión de flexibilidad a la hora de adaptar el software a sus necesidades, por una cuestión pedagógica, especialmente en carreras de informática, dada por la posibilidad de de ver y modificar el código fuente, y como si todo eso fuera poco, por una cuestión económica.

Este fue el primer ciclo de charlas organizado por el UNLUX, y fue todo un éxito. Mucha más gente de la que esperábamos (el puntapié inicial de estas cosas no siempre tiene la convocatoria que uno quisiera), y la organización estuvo muy prolija. Hasta los chicos tuvieron que capear un corte de luz general de varias horas en toda la universidad.

Hubo una gran cantidad de charlas, de diversos temas. Obviamente, Python estuvo ahí, como corresponde :)

Luego del cierre de las charlas, gran parte de los organizadores, disertantes, un grupo de PyAr y algunos otros asistentes nos fuimos a festejar, cenar y pasar un rato agradable a una pizzería.

Facundo escribió un review bastante detallado del evento en este post.

Por último, si quieren fotos... las mías están en este álbum. Los chicos de UNLUX también publicaron fotos en su site, en el álbum CDC -> 2007 :: Conectando puntos. Y Facundo subió más fotos acá.

Back to Pidgin

Hasta hace un año atrás, mi cliente de IM de preferencia sobre Windows era (al igual que sobre Linux) Pidgin (ok, en aquel momento se llamaba Gaim).

Siempre me gustó pero había especialmente dos cosas que me molestaban: La cantidad de recursos consumidos, si bien sensiblemente menores a la suma de GTalk + MSN Live Messenger juntos, siempre me pareció excesiva para un cliente IM. Y GTK sobre Windows (especialmente sobre Win2K) siempre me pareció un tanto alienígena en cuanto a look&feel y ciertas convenciones de uso.

Entonces decidí probar Miranda IM, por recomendación de un amigo. Miranda apuntaba a resolver justamente mis dos mayores issues con respecto a Pidgin: Por un lado es MUY chiquito. El core de la aplicación es MINIMO, y todo, absolutamente todo lo demás son plug-ins. Por otro, es una aplicación desarrollada específicamente para Windows.

Hoy, un año después, vuelvo a Pidgin. Varias cosas han pasado: Desde hace varios meses tengo más RAM en la PC del laburo, las últimas versiones de Pidgin han mejorado muchos detalles; hoy por hoy consume menos recursos de lo que consumía hace un año (por optimizaciones en Pidgin, y en GTK en general), y GTK sobre Win2K también está más integrado.

Pero por sobretodas las cosas, me hartó la falta de pulido y la inestabilidad de Miranda. La idea es excelente. La arquitectura de la aplicación me encanta. Pero parece una aplicación "by geeks for geeks". Y si bien tengo mi costado geek, a esta altura del siglo XXI cuando quiero un cliente de IM quiero uno que me funcione, y me funcione bien, y no uno al que SIEMPRE tengo que estar "perdonándole" algún detalle: plug-ins que se rompen en cualquier actualización de un día para el otro y por tiempo indefinido, problemas de internacionalización, de notificación, de manejo de unicode, iconos "feuchos", pixelados, y muchas cositas más. Todos detalles. En su mayoría, son temas de pulido, o de poco testing. Pero todos fueron sumando a un descontento generalizado con la aplicación que hoy finalmente hicieron que el vaso rebalse, y volviera al viejo y querido Pidgin.

Gracias totales

Soda Stereo, "Me verás volver", 20 de octubre, estadio River Plate: IM-PE-CA-BLE

Qué buena banda. Qué bien que suenan arriba de un escenario, a pesar de sus supuestas diferencias personales, y de los 10 años que pasaron (cuando comentábamos esto al final del show con Facu, hizo una comparación bastante ocurrente respecto al añejado de un buen vino, que estuvo muy acertada). Qué buen espectáculo en cuanto a la puesta en escena. Fueron casi 3 horas de show que valieron la pena.

Recapitulando, cuando Soda se disolvió, dejó un vacío que ninguna otra banda de rock argentina, y me atrevería a decir latinoamericana, volvió a llenar. Y creo que aunque demos por cierto el hecho de que en este retorno haya mucho de negocio, y muy poco de pasión por la música, igual tiene mérito, y quizás más: Si lo que Soda hizo este finde sobre el escenario fue un "trámite comercial", imagínense si se juntaran otra vez con ganas de hacer algo nuevo.

Respecto al espacio vacío: Quizás la única banda latinoamericana que hoy por hoy es comparable a Soda en trascendencia y volumen de gente que convoca sea Maná, pero es muuuuuuy discutible, en principio, porque Maná hace otra música, más del lado de lo melódico y de lo romántico (aunque rockeen en varios temas), así que no se si la comparación vale. Y Maná no llena ni a palos 5 Rivers... aunque quizás si los llena en México (convengamos que jugar de locales para cualquier músico tiene ventajas).

En definitiva, Soda demostró que puede seguir haciendo la música que hacía, montar un show de calidad internacional (al menos para los estándares latinoamericanos), que sea rentable para mucha gente que pueda poner la mosca, y que deje más que conforme a todos los que quieren escuchar su música.

Quizás, la única gran pregunta sin respuesta es, si volvieran a reunirse, y escribieran música nueva, ¿podrían superar, o al menos igualar, a su propio mito? Todo un tema.

Pero no importa. Si no se animan... me conformo con que cada tanto (quizás con más frecuencia que cada 10 años, eso sí), hagan algo como lo de este finde, para volver a corear lo viejo.

La culpa de todo la tiene que no haya más colimba...

Corrientes al 4000. Una tardecita de estas. Dos hombres mayores, digamos, fácil de más de 60, conversando en la vereda:

Y Ud. vió, sacaron la colimba y arruinaron a la juventud!

Las cosas que hay que oír... claro, ya lo decía yo... estamos como estamos porque un (ínfimo) porcentaje de la población masculina de entre 18 y 19 años no tiene que perder más un año de su vida corriendo, limpiando, barriendo, pintando, cortando el cesped y haciendo de chofer y secretario privado de un oficial de mayor rango. Sí sí. Más claro échenle agua.

Todo lo que hizo la casta militar en Argentina en sus sucesivos pasos por el poder, con epicentro en los '70 era bárbaro, ¿no?

Y volviendo a hoy, los políticos de mierda que nos representan, la mala distribución de la riqueza, la corrupción, la pobreza, la inflación, la manipulación de la prensa, la drogadicción, la TV pedorra de colgándome de un caño por un sueño y GH 3.412.310, la violencia, la delincuencia... todo todo de pronto apareció en el '93, cuando abolieron la colimba.

LAS COSAS QUE HAY QUE OIR !!!!!!!!!!

Bienvenida, línea H

Acaba de cambiar radicalmente mi experiencia de viajar desde/hacia el laburo... y eso que todavía no llega hasta Av. Corrientes. Esperemos que dure, y que no sea solo un efecto colateral de que la mayoría de la gente aún no se enteró que existe. :)

Dos cumples dos (que debieron ser tres)

(y solo como para ir precalentando... octubre y noviembre son meses concurridos en cumpleaños)

El sábado fue el cumple de Cristian, y lo festejamos en su casa. Nos divertimos mucho, como siempre. Me puse al día con Romi, que hacía un toco que no la veía. Y, como comentábamos ya bien entrada la madrugada, y cuando ya algunos habían partido con otros destinos, fue la primera vez en muuuuuuuuucho tiempo que nos quedamos hasta altas horas charlando, no jugando, o mirando pelis, o lo que sea. Simple, gratificante, enriquecedora charla entre amigos. Eso es algo que con los chicos hacíamos muy seguido, y los años, las familias, y el no tener más 19 años supongo que hizo que lo fuéramos perdiendo.

Leíto cumplía años el lunes, pero arrancamos el festejo el domingo a la noche. Leíto es un excelente anfitrión y "agrupador de comunidades". Había toda clase de especímenes, de CaFeLUG, de PyAr, de WikiMedia Argentina, de Ubuntu, y también gente normal no geek :)  (sí, sí, seguro me olvido de mencionar algún grupo, pero no me salgan con celos ahora...) Estuvo muy divertido; también nos quedamos hasta muy tarde, y la nota de color la dimos algunos cuando desempolvamos los juegos con papel y lápiz típico de hora libre del cole, y terminamos jugando a la papa. ¿Cuánto hacía que no jugaba a eso? Supongo que como 15 años... no quiero sacar mucho la cuenta, da miedito.

Ese mismo domingo era el cumple de Dave... y para no superponerse con Leíto terminó festejando el sábado, así que no pude prenderme, ya que tenía que estar en lo de Cris.

No photos this time (pero quizás dándose una vuelta por Bitácora de Vuelo encuentren publicadas algunas... en breve)

CaFeConf 2007

Y así pasaron las Sextas Conferencias Abiertas de Software Libre y GNU/Linux.

Al igual que el año pasado, Python fue el lenguaje con más presencia en las conferencias, tanto en charlas, como en "comunidad". Esto es un logro de todo PyAr, pero creo que merece ser destacado el esfuerzo de Alecu, Dani, Dave, Lucio y Facu generando contenido, y el de los chicos de Santa Fe y Córdoba, siempre presentes. Como siempre, y a pesar de los reparos que yo en lo personal tengo al respecto, pyWeek vende. Y tener dos OLPC (gracias Educ.ar!) en el stand para mostrar, fue como tener un tarro de miel a un metro de un hormiguero... :)

Otro "debut" de este año fue la cartelera de trabajo, organizada por Alecu: http://python.com.ar/trabajos. Además de su contrapartida web, estuvo "físicamente" en forma de un gran afiche junto a nuestro stand, y todo el tiempo ví gente tomando nota.

Hubo muchas menos charlas que el año pasado, y creo que eso es un plus. Como comentábamos con los chicos de Lanux anoche, eso ayudó a subir el nivel: Hubo mucha menos superposición de contenidos, y más gente en cada charla. No si es esto fue casual o la gente de CaFeLUG específicamente buscó este efecto... pero es para tomar nota.

De las charlas a las que asistí, me quedo en especial con dos:

  • "Python más rápido que C", por Lucio Torre y Facundo Batista. Una muy entretenida e ilustrativa charla para mostrar que sí, que a veces Python es (bueno, casi...) más rápido que C, y que otras tantas, C es más rápido pero, ¿vale la pena el esfuerzo? Habían generado mucha espectativa con su charla, el título de entrada fue un gancho de marketing fenomenal. Y salieron muy bien parados de la prueba. Felicitaciones.
  • "Caperucita en el Bosque", por Enrique Chaparro, de la Fundación Vía Libre. Excelente. Sumamente ocurrente, en cuanto a usar el cuento de caperucita roja como analogía e hilo conductor de la charla. Muy amena. Y muy ilustrativa. Esta fue la "Key note", la única charla plenaria. Espero que se haya grabado... traten de buscarla, bájenla y véanla. Vale la pena.

El cierre de CaFeConf quedó una vez más a cargo de Leito Monk, y al igual que el año pasado, estuvo absolutamente desopilante. NADIE, absolutamente NADIE se esperaba verlo entrar al escenario disfrazado de pingüino, y gritando "developers! developers! developers!" La organización de todo el evento estuvo muy bien, realmente la muchachada de CaFeLUG labura un montón para esto... y se nota. Gracias!

El único punto "flaco", al igual que el año pasado, fue el lugar: UADE no es el mejor ámbito para estas conferencias. Los cacheos de seguridad, LENTOS y BUROCRATICOS son sumamente molestos. Así y todo, desapareció una laptop. Y algo me dice que UADE va a mirar seguramente para otro lado (ojalá que no... but I'm not holding my breath...). Pero bueno, por ahora, es lo que hay.

En cuanto al aspecto puramente social y pythonico, la noche del viernes nos fuimos a tomar unas cervezas por San Telmo. La excusa oficial fue festejar los buenos resultados de los grupos argentinos en la última edición de pyWeek... y terminó siendo una pseudo-reunión de PyAr. Luego de pasar un rato en una coqueta parrilla de San Telmo de la cual no recuerdo el nombre (ni lo quiero recordar...), en la que solo tomamos unas cervezas, terminamos en la pizzería Tío Felipe, en Balcarce y San Lorenzo. BUENISIMO. La pasamos genial. Y como siempre, los lugares más tradicionales, más "de barrio", son los mejores. Si alguien de Tío Felipe lee esto: Sigan así. No se dejen aggiornar por la movida "transformemos San Telmo en un lugar solo apto para europeos con euros". Ojo, no tengo NADA en contra del turismo europeo... solo de los comerciantes inescrupulosos argentinos que arman una mentira cara para vender a los turistas, que NO tiene nada que ver con la escencia de uno de los barrios más antiguos y tradicionales de Bs. As., y hacen que solo puedas salir a comer afuera por la zona si a), te creés la mentira y b) estás dispuesto a pagar por un servicio que no lo vale.

La noche del sábado, un pequeñísimo grupo de PyAr (Dave, Alecu y yo) acompañamos a los chicos de Lanux a tomar algo... oooootra vez, una muy buena cervezeada con picada y pizza, en el local de Zapi de Independencia y Perú.

Fotos, fotos y más fotos.

Cómo tener una consola de IronPython decente en Linux

IronPython, como buena implementación de Python, provee una consola interactiva.

Tiene un gran problema: En linux, anda MUY mal. Al menos en Ubuntu, desde gnome-terminal, suckea. Mucho. Pero que mucho. En Windows, anda un poquitín mejor. Por ejemplo, uno puede apretar backspace y sucede esa cosa mágica de borrar el caracter a la izquierda del cursor y todo!!! En linux, por default, ni eso.

Este finde estuve por primera vez en varios meses usando en serio IronPython, y si bien los ajustes finales de este mini-proyecto los terminé sobre .NET en Windows, arranqué trabajando con Mono en Linux. Y trabajar con Python con una consola que NO funciona, es desesperante. Me cansé de googlear buscando soluciones... y no encontré nada. Mi última búsqueda fue "ironpython console on linux sucks". Y para mi sorpresa, no arrojó resultados significativos. Porque IT REALLY SUCKS! Al toque empecé con mis teorías conspirativas, en la línea "claro, ahora que es un proyecto de Microsoft, no nos importa como anda en Linux". Pero no tenía sentido... porque debería haber una legión de usuarios de Linux/Mono descontentos. Y si Google no los encontraba, ¿dónde estaban? No cerraba. Evidentemente yo estaba haciendo algo mal.

Y ahí fue cuando entre tantas vueltas, descubrí que la consola de IronPython se puede iniciar con una serie de opciones... y al toque 3 llamaron poderosamente mi atención:

-X:AutoIndent        Automatically insert indentation
-X:ColorfulConsole   Enable ColorfulConsole
-X:TabCompletion     Enable TabCompletion mode

Si bien a priori no tenían que ver con mi problema (que es un manejo absolutamente BROKEN de las secuencias de escape, movimiento del cursor y demás), decidí probar. Y para mi sorpresa... no solo gané color, tab-completion (bastante similar a la que ofrece iPython) y auto-indent... sino que con esas opciones se resuelven los demás problemas!!! Fantástico. No se cual de las 3 hace la magia (sinceramente no lo probé... se los dejo como tarea para el hogar) pero sospecho que la opción salvadora debe ser -X:ColorfulConsole, que para manejar el color debe usar otra librería para interactuar con la consola.

Así que ahora tengo en mi .bash_aliases lo siguiente:

alias ipy='ipy -X:AutoIndent -X:ColorfulConsole -X:TabCompletion'

... de manera que cuando ejecuto 'ipy' (el intérprete de IronPython), lo hago con las opciones correctas. Y me pregunto por qué mierda esas opciones no están activas por default, y/o por qué Ubuntu no las activa por default. Porque la diferencia es ABISMAL.

Bonus-track: Esas opciones son también útiles en Windows.