Burbujas

En Atlanta, Estados Unidos, durante uno de los paseos una tarde de Sprints, en la PyCon, me fui hasta un shopping mall (que nosotros acortamos a shopping pero los yanquis acortan a mall), donde entré en un negocio tipo bazar.

Pero bazar de los modernosos modernosos, donde hay muchas cosas para la cocina, el baño, y otras partes de la casa. Mucho diseño, mucho color, mucha herramienta de alta calidad (y alto precio).

Mirando y paseando, debo decir que me sorprendí mucho cuando en uno de los estantes, ¡encontré un sifón!

Sifón modernoso

Como pueden ver, es un sifón recargable, para preparar soda a mano, con la típica garrafita... ¿será el futuro que se viene?

Comentarios Imprimir

PyCon Atlanta 2011, los Sprints

Cuando me puse a pensar qué podía hacer durante los cuatro días de sprints, al principio no me llamó nada la atención. Pero luego se me ocurrió que podía (empezar a) portar Twisted a Python 3, que era algo que tenía una mezcla de dos cosas en la que me quería meter: más adentro de Twisted que lo que te da el uso diario, y en Python 3 usándolo en casos no triviales.

Más puntualmente, mis objetivos para los sprints eran:

  • Meterme adentro del código de twisted: Conocer la estructura del proyecto, detalles del código, etc.

  • Conocer más sobre el projecto de Twisted en sí: conocer más y charlar con los desarrolladores, meterme en el proceso de desarrollo que ellos tienen montado alrededor del proyecto, etc.

  • Tener problemas reales (más allá de la teoría) al portar a Python 3, enfrentándome a casos complicados que no aparecen cuando uno estudia la documentación.

  • Lograr que al menos un test corra OK en Python 3 (lo que implica que toda la infraestructura de pruebas funcione en la nueva versión, lo cual está lejos de ser sencillo porque esa infraestructura misma es provista por twisted).

En los días anteriores había bajado el trunk del proyecto, para irme familiarizando, y al correr los tests encontré que me fallaban algunos; luego de analizar y ver qué pasaba terminé descubriendo que era por un problema del código que dependía del locale de la máquina (y como yo la tengo en castellano, explotaba ahí). Decidí que esa iba a ser mi primer contribución al proyecto, y armé un parche y lo propuse.

No fue tan directo, ya que realmente los tests no fallaban a menos que la máquina estuviese no en inglés, así que luego de charlarlo un rato decidimos que tenía que ponerle unos casos de prueba condicionales, y eso hice. Tampoco entró tan fácil esto, porque faltaban un par de cosas de estética en las que yo no estaba de acuerdo con los desarrolladores de Twisted.

Y es que Twisted es un proyecto muy viejo, y estandarizó algunas cosas que son contradictorias con lo que después se definió como mejores prácticas dentro del mundo Python. Entonces ahí tuvimos algunas idas y vueltas, y al final yo mandé un mail a la lista de Twisted para empezar un cambio, y metieron mi parche en trunk, corrigiendo el problema.

Aunque todo esto llevó bastante tiempo, me sirvió mucho para irme familiarizando con el proceso, cómo manejan los tickets, qué significa cada cosa, etc.; en definitiva, cual es el workflow de los bugs y parches.

Sprinting

Volviendo a los casos de prueba, luego de ejecutar algunos tests en Python 2.6 con el flag -3 detecté algunas cosas que podía empezar a cambiar masivamente, y al mismo tiempo meterlo en el código actual. En otras palabras, cambios que pegaban en todo el proyecto, y que hacía que esas partes estuviesen mejor preparadas para la migración a Python 3. Uno de estos cambios fue dejar de usar el módulo new y comenzar a usar types, el otro fue dejar de usar cmp (tanto __cmp__, como el builtin, como el parámetro de sort/sorted) y empezar a usar lo que se llama rich comparisons. El primer cambio era bastante directo (propuse un branch, aunque me dijeron que había tocado un par de cosas que no tiene pruebas y tenía que hacer los test), pero el segundo cambio es un quilombo (no llegué a terminar el branch) porque la funcionalidad no es directamente equivalente, sino que depende de qué tipo de comparaciones se quieren realizar.

El tercer día decidí cambiar el enfoque. Lo que estaba haciendo no estaba equivocado, pero daba para mucho más que los dos días que quedaban, y la idea era probar distintas cosas ahí, antes que termine el sprint, aprovechando que estaban los viejos del proyecto cerca.

Así que decidí arrancar con la migración propiamente dicha, postergando las correcciones a lo que ya había hecho. Le corrí 2to3 a todo el proyecto, lo cual me corrigió una gran cantidad de cosas triviales en muchos archivos, dejó intacto muy pocos, y me avisó de cosas que no pudo cambiar que debería tocar a mano (esto quizás se pueda meter en otro branch que funcione también en Python 2).

Finalmente, traté de correr un test con Python 3. Acá empezaron a saltar muchos, muchos detalles. Algunos triviales, y otros bastante espesos.

El primero complicado fue que Twisted depende de zope.interface. Por suerte este ya estaba migrado a Python 3, el tema era hacerlo andar con el Python 3.2 que tenía instalado (Ubuntu Maverick trae 3.1). Al principio quise usar virtualenv pero no había una versión empaquetada para Python 3, así que traté de compilarlo, lo que me llevó a darme cuenta que necesitaba tener setuptools3... en fin, terminé teniendo lo que necesitaba en 3.1, pero no en 3.2. Acá cambié el approach... bajé las fuentes de un virtualenv para Python 3, lo compilé e instalé usando Python 3.2, y ya adentro del virtualenv instalé con easy_install a setuptools3 y zope.interface... y acá quedó andando lindo: Python 3.2, con todo lo necesario. (muchas gracias a Nati y Darni por la ayuda en toda esta gran configuración).

Igual, no terminaba ahí, porque tuve que tocar bastante código ya que cambió la forma de usar zope.interface: antes se hacía implements(IAlgo) en el scope de la clase, y ahora hay que decorar la clase con @implementor(IAlgo).

Otra cosa que me mordió feo es que el método de una clase no es más un unbound method, sino una función pelada que no sabe en qué clase está (obviamente en ambos casos al instanciar la clase, la función se convierte en un bound method). Esto rompe el cómo trial busca los test cases que uno indicó por linea de comandos.

Cuando les comenté este problema a los desarrolladores, empezó toda una discusión de qué podíamos hacer porque corregir esto no es trivial, y va a pegar bastante en todo el código. Finalmente decidí arreglarlo de forma medio sucia... no es la forma final, pero me permitió seguir con lo que yo estaba haciendo. Otro chico se quedó con la tarea de ver de normalizar eso.

Igual, más allá de esos dos problemas grandes, tuve que ir corrigiendo muchos pequeños detalles (hay que tener en cuenta que Twisted es uno de los pocos proyectos que sigue hoy en día habiendo arrancado en Python 1).

Pero finalmente, varias horas después, terminé de corregir todo lo necesario, y pude ver mi primer test que corría OK con Python 3, :D

La verdad es que estaba muy contento, y no sólo yo: los otros desarrolladores también, porque yo no era el primero que decía que se tenía que migrar el proyecto a Python 3, pero sí el primero que se arremangaba y obtenía resultados.

Y hasta acá llegó el sprint... realmente no hice mucho más, excepto ver todos los cambios que había metido y hacer una especie de listita con todo lo que hay que ir sacando de ahí e ir pasando en limpio para mandar al proyecto. Encima a las tres de la tarde del último día nos cortaban internet, así que básicamente después de almorzar ya estaba con la persiana baja.

Así que me quedé un rato, saludé, me fui para el lobby a usar la internet del hotel para terminar algunas otras cosas, y un par de horas después emprendí el camino de regreso a casa.

Comentarios Imprimir

PyCon Atlanta 2011, la conferencia

El formato de PyCon USA este año fue de dos días de tutoriales, tres días de conferencia (dos y tres cuartos, realmente), y cuatro días de sprints.

A los tutoriales no fui, pero sí a la conferencia y los sprints. Este post es sobre esos tres días de conferencia.

Primer día

Luego de la presentación y apertura del evento, tuvimos en la primera charla plenaria a Hilary Mason hablando de programación, análisis de datos, y varias cosas diversas... nada específico, pero entretenido.

Tuvimos un pequeño break y arrancó la primer sesión de charlas propiamente dichas. La primera fue "Distributed Tasks with Celery", por Ryan Petrello. Creo que la idea está buena, claramente resuelve casos de uso que se me presentaron y con los que estuve jugando... pero el diablo está en los detalles, dicen, hay que ver cómo es usar esto IRL.

"Getting more contributors (and diversity) through outreach" por Asheesh Laroia. Estuvo bien, aunque se focalizó más en "more contributors" que en "diversity", que era mi interés. Una idea para diversidad: hacer un evento especial para mujeres... hombres pueden ir, pero tenés que ir invitado por una mujer que vaya. Esto es algo que se inventó y probó en la comunidad de Ruby on Rails y que ha tenido bastante éxito... ya mandé un mail a la lista de correo de PyAr, veremos qué se opina por ahí.

Para dejar clara mi posición al respecto, lo que a mi me interesa es derribar las barreras actuales que evitan que las mujeres tengan las mismas oportunidades que los hombres en todo lo relacionado con tecnología.

La última charla de la mañana estuvo relacionada con la anterior, "Diversity in Tech: Improving our Toolset", por Jennifer Leech. Interesante aspecto relacionado con las expectativas y como estas afectan los comportamientos: "Si vos le decís a una persona cómo esperás que cumpla con una tarea en particular afecta profundamente cómo esa persona cumplirá con la tarea".

Luego el almuerzo, que fue durante la reunión de la Python Software Foundation, y las charlas de la tarde. Me quedé para dos relacionadas con Python 3: "Status of Unicode in Python 3" por Victor Stinner, y "Porting to Python 3", por Lennart Regebro.

Un break, una charla que no me gustó, y luego "Why is Python slow and how PyPy can help?", que no era lo que esperaba pero no estuvo tan mal (se dedicaron a hablar de que PyPy es más rápido que CPython y algunas cosas que hacen a nivel del JIT, pero nada más).

Sala de la plenaria

De cierre, las lightning talks. Alguna te puede gustar, otra no, pero el formato está buenísimo (justamente porque de las que te gustaron luego seguís investigando, y de las que no... bueno, no perdiste más de cinco minutos).

Al rato nos fuimos a cenar Dani Moisset, Armin Rigo (core developer de PyPy), Reid Kleckner que laburaba en Unsladen Swallow mientras el proyecto estaba activo, y yo. Comimos en un restaurant chino que estaba cerquita.

Al volver me puse a laburar en un fix a Twisted, y al sobre.

Segundo día

Al otro día, arrancamos con lightning talks de nuevo. Estuvo buena la de python-on-a-chip, que es una colección de ports de Python a algunos microcontroladores... me llamó la atención particularmente el port a DryOS, que es el sistema operativo de muchas Canon, incluída la que tengo.

También estuvo piola la de Brett Cannon contando que había hecho la nueva guía para desarrollar Python (Python, no en Python), y otro documento sobre cómo portar proyectos a Python 3.

Luego vino una plenaria sobre "How Dropbox did it and how Python helped", la cual estuvo pésima. Habló un poco de Dropbox, habló mucho de él y sus amigos... como charla normal, hubiese estado de medio pelo para abajo, y para una plenaria uno espera más. El flaco, como disertante, pésimo... creo que miró a la audiencia dos o tres veces, el resto leía de la laptop... mal.

Para cerrar el bloque, una entrevista relajada a Guido: básicamente una serie de preguntas que la gente fue mandando y votando a través de una página web. Habló de varias cosas, pero una frase que me encantó fue "The biggest innovation in Python is Community" ("la mayor innovación en Python es la Comunidad").

Luego de un break, comenzó la primer sesión de charlas. Me enteré de detalles históricos en "Ten years of Twisted", por Glyph Lefkowitz, y luego algunas ideas sobre documentación en "Writing great documentation", por Jacob Kaplan-Moss. Antes de comer, una interesante charla de Alex Martelli, "API Design anti-patterns".

La sesión de la tarde, después del almuerzo, arrancó con una charla de programación genética usando PyEvolve, y luego una charla sobre memoria: interesante, pero me hubiese gustado algo más de detalle en los internals y menos en lo que hace la biblioteca de este muchacho, gdb-heap. Antes del break cerramos con una charla sobre ZeroMQ... la biblioteca está interesante (una especie de socket mágico que puede ser 1:1 o 1:N, N:1, N:M, y con distintas semánticas con respecto a la respuesta), pero el flaco se la pasó cambiando ventanas, yendo para atrás y para adelante en la presentación a toda velocidad, y la verdad que se hubiese entendido más si hubiese mostrado todo mejor (no más, sólo mejor).

En el último bloque sólo ví una charla sobre AST, que estuvo un poco densa pero me dió más info para algo que tenía en la cabeza... de esos proyectos que uno patea para adelante y realmente nunca empieza, je, maldito día de sólo veinticuatro horas.

Y para cerrar, lightning talks de nuevo! Se habló de Read the docs, un sitio web que reúne documentación de forma muy piola: basicamente lo apuntás a tu proyecto, y te arma toda la documentación a partir de tus .rst, los sirve, búsquedas completas, descarga como PDF, etc; muy interesante. Barry Warsaw habló sobre flufl.i18n una herramientra de internacionalización de más alto nivel que la clásica gettext.

A la noche cena con Nati Bidart, Dani Moisset y Juan Pablo (un chico de Buenos Aires que no conocíamos... bah, nos vimos un par de veces en algún PyDay) a un mexicano cerca que no estuvo muy bueno.

Tercer día

Nuevamente arrancamos con lightning talks, en las que yo di una charlita sobre PyAr, básicamente hablando de las Charlas Abiertas de Python en La Tribu, y de la CDPedia.

Luego hubieron tres plenarias dadas por sponsors: Threadless, Disqus y OpenStack. La de Threadless estuvo super divertida, y la de Disqus fue interesante del lado técnico, pero nada más.

Torta  de los 20 años

Luego de un break bastante largo (porque estaba la "poster session"... eso de los posters no me llama mucho la atención) fui a la charla de Raymond Hettinger "Fun with Python's Newer Tools", donde habló sobre Counter, namedtuples, lru_cache y .format. Estuvo muy buena!

A la tarde asistí a una charla sobre cómo habían escalado el nuevo frontend de SourceForge, y a una en que Doug Hellmann contaba sobre "tesoros escondidos" de la biblioteca estándar (no estuvo mal, pero ya conocía todos los módulos que comentó).

Para cerrar el evento, más lightning talks y mucha gente desfilando diciendo qué sprint va a liderar, a ver si consigue gente. Yo ya lo tengo decidido antes de venir, voy a empezar a portar Twisted a Python 3.

Conclusión

La conferencia, a nivel charlas, estuvo bien. No hubieron demasiadas cosas que me volaran la cabeza, pero estuvo interesante. Creo que vale la pena venirse hasta acá (aunque quizás no todos los años, por el costo que implica).

Hubo una sorprendente cantidad de "ruido" alrededor de PyPy (el intérprete de Python escrito en Python), porque que alcanzaron un punto de madurez en el que cumplen 99.99% de Python2.6, y es más rápido que CPython (el intérprete de Python hecho en C).

También se habló mucho alrededor de Python 3 siendo el futuro evidente... ya nadie se pregunta "cómo" ni "si pasará", sino "cuando se hará el click" y "quienes se están quedando atrás".

Python cumplió veinte años, y está más vivo que nunca.

Comentarios Imprimir

Viajando distinto

Una de las decisiones que tomé en el 2010 con respecto al 2011 fue la de ir sí o sí a PyCon USA este año. Luego me dieron el Python Community Award y la decisión fué más firme aún, ya que el premio incluye la entrada a la conferencia y 500 dólares que aunque no cubren todo el hotel, es una buena parte.

Cuando empecé a buscar vuelos, hace tres o cuatro meses, encontré que tenía puntos en American Airlines, de otros vuelos que había hecho. Tenía como sesenta mil... lo cual no me decía nada, vieron como son los programas de puntos: "Tenés un millón setecientos treinta y dos mil cuatrocientos doce puntos, que apenas te alcanza para un tubo de pelotitas de tenis".

Sorpresa mía, cuando ví que con ese puntaje me alcanzaba para ¡el viaje de ida y vuelta! Ahí fue donde empecé a revisar las condiciones para cambiar los puntos, a qué vuelos se los pueden aplicar, etc. Son bastantes restrictivas. Y yo quería apuntarle muy bien a los días que iba a estar en Atlanta, porque el hotel es caro y no quería quedarme allá más de lo necesario.

Y encontré una combinación que me servía... pero para la ida no tenía vuelos comunes, sino de alto puntaje. Y ahí no me alcanzaban los puntos, pero me quedaba corto por muy poquito. Lo bueno es que podés comprar puntos, y lo que yo necesitaba salía unos veinticinco dólares (peso más, peso menos).

Y los compré, ya que estaba resolviendo el tema del avión por muy poca guita. Lo destacable es que esos vuelos de alto puntaje eran Business en el tramo largo (Buenos Aires - Dallas) y Primera en el tramo corto (Dallas - Atlanta).

Business y Primera

Nunca había viajado en business o primera... y la verdad es que hay mucha, mucha diferencia de confort. Sigo pensando que si lo tengo que pagar yo, no lo pago (hay mucha, mucha diferencia de guita contra el vuelo común), pero la verdad es que lo disfruté.

El vuelo largo, que es el más complicado por la cantidad de horas, se me pasó volando (cuac!). El asiento es súper cómodo, y le podés regular todo con unos botoncitos. Tiene mucho espacio alrededor, podés ir súper estirado, e incluso se pone 100% plano para dormir.

La comida también es muy distinta: un champancito mientra esperás, una copita de vino y nueces calientes antes de la cena, elegir lo que querés de un menú con dos opciones de entrada, cuatro de plato principal y dos de postre, una copita de Baileys... muy distinto a lo otro, muy distinto.

Y la sorpresa final fue cuando repartieron los auriculares: unos Bose con cancelación activa de ruido que me permitieron ver una película sin subtítulos, ya que con los auriculares comunes y el ruido del avión es imposible. Obviamente no te los podés quedar, pero es un buen detalle para el vuelo.

El único punto en contra del servicio fue que los asientos tienen enchufe... pero de continua, un enchufe especial como el del encendedor del auto. Y las azafatas no tenían un adaptador/conversor para 220v o 110v, y tampoco vendían uno, así que no lo pude usar.

Por otro lado, entre que hice un sudoku en una revista, la película (con la cena durante la misma), y que dormí bastante cómodo, prendí la laptop tres horas antes de llegar, y la batería casi me alcanzó para todo lo que quería hacer.

Comentarios Imprimir

Primer día de jardín!

El tiempo pasa, y así como sin querer, Felipe arrancó el jardín :|

Bueno, es "maternal" todavía, no "jardín de infantes propiamente dicho", y van a ser menos de tres horas por día, pero va a estar bueno para que vaya conociendo gente y se vaya socializando.

Felu en el jardín

Hoy como era la primera vez fuimos Moni y yo, hubo una actividad de pegar una foto, la directora charló un rato con nosotros, y no mucho más. Felipe había ido un par de veces al jardín (cuando reservamos, y a la entrevista con la "seño Lumila"), y la verdad es que le encantó estar ahí.

Se fascinó con un tobogán, al que aprendió a subirse y tirarse solo, y estuvo mucho rato ahí... pero también deambulando por el jardín, y la verdad es que no lo vimos demasiado preocupado cuando lo dejamos solo.

En el tobogán

Igual, la adaptación será la adaptación, veremos como se porta.

Comentarios Imprimir