Piedra libre

Fotos — Jueves 30 de Julio de 2015, 16:39


¡Juguemos a las escondidas!

alt

Si no recuerdo mal, esta foto la tomé en el bosque que hay atrás de un hotel en Bruselas.


Cena Gurmé

Comidas — Martes 21 de Julio de 2015, 19:06


El sábado a la noche hice en casa la "Cena Gurmé", una cena más elaborada de lo que hago normalmente cuando invito gente, para pocas personas (básicamente porque la mesa más grande de casa no es demasiado grande).

Esta es la invitación que les mandé a los pocos que tuvieron la oportunidad de venir:

Invitación a la Cena Gurmé

La idea de este post no es sólo contar que salió todo bien, que la pasamos bárbaro, que terminamos con la panza bien llena y agradecerle a Moni por toda la ayuda, sino pasar las recetas de cada plato.

Ahí vamos.


Bruschetas a los tres mares

Como podrán adivinar, son bruschetas. Tres. Y cuyo componente principal en cada caso se saca del mar :p

Antes que nada hay que conseguirse un pan rico en la panadería que se pueda cortar bastante en diagonal y obtener una pieza alargada. Luego mandar las fetas de pan al horno hasta tostar, rociándolos con aceite de oliva.

Para la primeras bruschetas armar una pasta con queso crema, jugo de limón, y rayadura de cáscara de limón (recuerden usar sólo la parte amarilla, la blanca es muy amarga). La pasta tiene que quedar con sabor alimonado, y no se tiene que notar la rayadura del limón (sino sería mucho! incluso sin verlos se sienten en boca).

Entonces, untar generosamente las bruschetas con esta pasta, y luego acomodar una buena porción de salmón rosado crudo. Completar con un poco de jugo de limón.

Bruschetas de salmón sobre crema alimonada

La salsa de las segundas bruschetas implica tener preparada de antes una provenzal casera, al menos con tres o cuatro días de anticipación para que sea sabrosa. Mezclarla con mayonesa y queso crema.

En el momento, saltear en aceite de oliva langostinos pelados, hasta empezar a dorar.

El armado es sencillo: una buena ración de la crema a la provenzal, dos o tres langostinos (en función del tamaño de los mismos y la tostada), y completar con algunas gotas de jugo de limón y un poco de perejil fresco picado en el momento.

Bruschetas de langostinos saltados sobre crema a la provenzal

La tercer tanda termina de subir en sabor, e incluso es caliente. El pescado en este caso son sardinas naturales (¡no en latas); yo conseguí unas portuguesas que vienen congeladas, en el Mercado Central... no sé en qué otro lado conseguirlas, mi segunda opción sería "la pescadería del supermercado" del barrio chino, en Capital (si conocés el barrio chino, sabés de qué estoy hablando ;). Y las conseguí enteras, así que las limpié (cabeza, cola, tripas), desespiné, y dejé listos por cada sardinas dos filetes.

Para poner sobre el pan, rehogar bien chiquito cebolla, ajo, y tomate. Los filetitos de sardinas también rehogarlos, que queden cocinados y calentitos, y armar así la bruscheta. Terminar rociándolas con aceite de oliva y un poco de perejil fresco.

Bruschetas de sardinas portuguesas naturales sobre colchón de rehogado de cebolla, tomate y ajo


Bondiola atrapada

Este es el plato principal, y lleva su tiempo armarlo. Tiene dos variantes, la más rica, y la apta para los que no les gusta la comida agridulce :)

Algunas horas antes (medio día, un día), cortar la bondiola en cubos (tamaño bocado) y meterlos en un tupper o una bolsa, para dejar macerar, con cerveza negra, ajo y perejil.

Pre-hervir papa (versión no-agridulce) y/o batata (versión rica), pero no que quede demasiado blanda. Poner un poco de sal, pero no mucha. También rehogar cebolla y cebolla de verdeo, salpimentar (de nuevo, ¡poca sal!).

Un rato antes de comer, luego del tiempo de macerado, saltar los cubitos de bondiola, e irlos separando. Levantar el fondo de cocción con salsa de soja (que es salada, por eso los avisos de arriba de guarda con la sal).

En unos cacharritos aptos para horno, poner una base de pedacitos de la papa (versión aburrida), o de la batata, agregando ciruela pasa (versión copada). Luego los pedacitos de carne y la cebolla, más lo que se levantó de la sartén. Si parece que queda "seco", no se preocupen.

Hacer una masa de pizza o de pan, y al final del amasado mezclar con romero. Con esta masa tapar los cacharritos de manera de cubrirlos bien y que sobre un poco en el borde. Les decía que no se preocupen si quedó seco, porque va a evaporar poco, y a la carne le quedan jugos para largar.

Meter los cacharritos en el horno, y dejar un rato, unos 15 o 20 minutos. Un ratín luego de meterlos, antes de que la tapa de masa se termine de cocinar, rociarla con aceite de oliva.

Sacar y servir caliente. ¡Guarda que quema!

Bondiolita macerada con batata y ciruela, terminada al horno en cazuela cerrada


Flan cara y ceca

Acá no hay muchos secretos, pero la clave está en hacer un buen flan. Con huevos, azucar, leche, etc., no una porquería de polvito, eh! Bien sabroso, como siempre lo hace Moni.

Servirlo con tu dulce de leche preferido, y crema chantilly de verdad (de nuevo, nada de porquerías de tubito en aerosol), batida un rato antes para que tenga heladera y quede en su punto justo (a mí me salió un poco chirla, debo reconocer).

Flan casero casero con dulce de leche regalado por hermana y crema Chantilly


Las bebidas

La gente llegó puntual, alrededor de una hora y pico antes que salieran las primeras bruschetas.

Arrancamos con un aperitivo refrescante. Como teníamos ganas de jugar, Lucio preparó algo que nadie sabía como hacer, pero con una base que habíamos elegido antes (pisco peruano, agua tónica, limón).

Con las bruschetas abrimos un vino blanco, bien fresco, que estuvo ideal para las primeras dos tandas. También se tomó cerveza.

Para la tercer tanda de bruschetas, y especialmente el plato principal, lo mejor es vino tinto. Lo que hice acá fue ofrecer unas seis o siete botellas distintas, y dejar que la gente elija lo que prefiera: empezamos con un Trumpeter malbec, seguimos con un Gascón reserva Cabernet Sauvignon... pero la idea es que elijan un poco en función del gusto de los comensales.

Para terminar, un cafecito rico :). ¡Provecho!


Todos somos Joac

General — Domingo 05 de Julio de 2015, 01:22


(Disclaimer: este texto está sobradamente copiado de la declaración de OpenData, porque tenía ganas de escribir algo parecido, y no me salía, y ellos lo expresaron muy bien)

Sobre el allanamiento de domicilio a Joaquín Sorianello ocurrido el viernes a la noche.

A horas de los comicios de primera vuelta para elegir a las autoridades de la Ciudad Autónoma de Buenos Aires, nuestro amigo y colega Joaquín Sorianello denuncia el allanamiento de su domicilio, realizado por la la Policía Metropolitana bajo las órdenes de la jueza Dra. María Luisa Escrich.

El motivo aparente es haber informado sobre una vulnerabilidad grave en los servidores de la empresa Magic Software Argentina (MSA), dueña y operaria del sistema de voto y escrutinio electrónico a ser utilizado en las elecciones porteñas. Esta falla de seguridad permitiría el envío de información apócrifa a los sistemas donde se computa el escrutinio provisorio, vulnerando así la voluntad popular.

Joaquín es un reconocido programador, experto en redes informáticas, muy querido y respetado en distintas comunidades de software libre en las que participa, no sólo por su conocimiento técnico sino también por sus profundos valores y su calidad humana. Su descubrimiento, de una gravedad institucional que no se condice con la pobre difusión pública que tuvo, fue logrado gracias a su loable sentido del deber cívico, y fue informado en primer lugar a la propia MSA para que tome las medidas correctivas. Lejos de obtener premio alguno por colaborar con la transparencia que la ocasión demanda, Joaquín fue víctima de un allanamiento, como si hubiese cometido un acto criminal.

La celeridad y falta de sentido común con la que este allanamiento se realiza resulta al extremo injustificable además, dado que, 6 meses atrás, el Presidente del Tribunal Superior de Justicia de la Ciudad, José Osvaldo Casás, presentó su renuncia al cargo a partir de las falencias ya visibles del sistema de votación.

Es por eso que más allá de alguna que otra acción privada que siempre será insuficiente, me solidarizo con la situación de Joaquín y de otros colegas afectados por este bochornoso accionar de la justicia porteña. Consideramos que el espacio para quienes quieren mejorar las instituciones y la transparencia del pilar fundamental de la democracia, como lo es la voluntad del pueblo a través del sufragio, tiene que existir y ser valorado.


Releases por dos: Encuentro y fades

Python — Viernes 19 de Junio de 2015, 10:57


Estos últimos días se liberaron nuevas versiones de dos proyectos en los que estoy involucrado activamente.

A principio de mes lancé Encuentro 3.1 (como ya sabrán, este programa permite buscar, descargar y ver contenido del Canal Encuentro, Paka Paka, BACUA, Educ.ar y otros).

La versión 3.1 trae los siguientes cambios con respecto a la versión anterior:

  • Vuelve a funcionar luego de los cambios de backend de Encuentro y Conectate
  • Ahora con CTRL-F se va directamente al campo de filtro (gracias Emiliano)
  • Se rehizo el manejo de la lista de episodios: ahora verlos y filtrarlos es muchísimo más rápido
  • Mejoras en el empaquetado, debería funcionar para muchas (todas?) las versiones de Debian/Ubuntu (gracias Adrián Alves). 
  • Varias mejoras al encontrar nuevos episodios de los distintos backends, y correcciones en general. 

Más info y cómo descargarlo, instalarlo, etc, en la página oficial.

Por otro lado, ayer se lanzó fades 3 (un proyecto orientado a desarrolladores Python, en contraposición a Encuentro que está pensado para el usuario final), que desarrollamos principalmente Nico Demarchi y yo.

fades (en inglés: FAst DEpendencies for Scripts) es un sistema que maneja automáticamente los virtualenvs en los casos simples que uno normalmente encuentra al escribir scripts o programas pequeños.  Crea automáticamente un nuevo virtualenv (o reusa uno creado previamente) instalando las dependencias necesarias, y ejecutando el script dentro de ese virtualenv.

¿Qué hay de nuevo en esta release?

  • Podés usar diferentes versiones del intérprete: simplemente pasá --python=python2 o lo que te convenga.
  • Las dependencias pueden especificarse en la linea de comando: no hay necesidad de cambiar el script para una prueba rápida, simplemente especificá la dependencia necesaria con --dependency.
  • Modo interactivo: es la manera más rápida de probar una nueva biblioteca. Sólo hacé fades -d <dependencia> y te abrirá un intérprete interactivo dentro de un venv con esa dependencia.
  • Soporta tomar argumentos desde el shellbang. De esta manera podés crear un script y poner al principio del mismo algo como: #!/usr/bin/env fades -d <dependencia> --python=python2.7
  • Puede parsear requerimientos desde un archivo. No hay necesidad de ningún cambio si ya tenés un archivo requirements.txt: simplemente indicalo con --requirement.
  • Si no se especifica el repo, toma PyPI por defecto, lo que resulta en código más limpio y simple.
  • Tiene una base de datos integrada para conversiones típicas de nombres: de esta manera se puede marcar con fades un "import bs4" incluso si ese no es el nombre del paquete en PyPI.
  • Otros cambios y correcciones menores.

Toda la info, en la página de PyPI del proyecto.


Películas y series a mansalva

General — Sábado 06 de Junio de 2015, 16:16


Buena temporada para ver películas fue.

Y además, le metí pilas a las series (estoy aprovechando que los niños ya duermen bien, y tengo un rato a la noche al acostarme): arranqué con Games of Thrones (ya ví las primeras tres temporadas), metí también la segunda de Tremé, estoy viendo Seinfeld (en orden, luego de años y años de agarrar cualquier capítulo al azar al hacer zapping en la noche) y arranqué con The L Word.

  • After Earth: +0. Buena película de ciencia ficción; a la parte humana le falta, intenta ir por ahí pero le falta actores.
  • Before Midnight: -0. Los diálogos están buenos, pero siendo la tercera de la serie, le falta resolución, le falta consistencia.
  • Europa Report: -0. Conceptualmente interesante, pero el mecanismo de "contar la película por las cámaras del lugar" es trillado y mal llevado. Y hacer efectitos para asustar o sorprender la aberreta mucho, una lástima.
  • Generation Um...: -1. Lenta, disconexa, con una historia que bleh. No la pude ni terminar de ver.
  • Gravity: +1. Notable lo que se puede hacer con solo dos actores :p. Me gustó mucho el lado "real" de una peli en el espacio, que uno normalmente no ve.
  • Hitchcock: +0. Un personaje del que no sabía mucho (ni tampoco soy un fan especial de sus películas) y la historia alrededor de su película (quizás) más famosa. Muy buenas actuaciones.
  • It's a Disaster: -0. Tiene sus momentos interesantes, pero se queda a medias tintas y no llega a ser.
  • La reconstrucción: +0. Un poco lenta, pero muy buena historia. La actuación de Peretti es genial.
  • Machete Kills: +0. Si te gusta este estilo de películas, mirala, zafa. Si no, ni te acerques.
  • Pandora's Promise: +0. Hay que ir con mucho cuidado con este tipo de películas, pero aunque no me crea todas las respuestas, me da un montón de preguntas para el análisis.
  • Paranoia: -0. La historia tiene un núcleo interesante, y las actuaciones están bien, pero la película está orientada mal. Podría haber sido un thriller de suspenso, una de espías interesante, y termina siendo un dramón adolescentoide, :/
  • Riddick: -0. Menos de lo mismo (?). O sea, se pierde parte de la esencia del personaje, y se exageran otras. Demasiada testosterona sin sentido, en mi opinión.
  • Rush: +0. Una gran historia, incluso si no te gusta la fórmula 1 (pero si te gustan los autos, suma, claro que sí).
  • Seventh Son: -1. Una colección de clichés en una película demasiado predecible.
  • Sound City: +0. Es una historia muy puntual, pero es linda, es verídica, y habla de la gente, de la calidad, y de tratar de hacer bien las cosas.
  • The Counselor: -0. Un gran "alrededor" de una historia que le faltó bastante. Una lástima, porque todo eso estaba muy bien, grandes actores, etc... pero sin el soporte de una historia decente como núcleo, no vale pena.
  • The East: +1. Me gustó mucho, no sólo por la temática sino por cómo cuentan los sentimientos y actitudes de las personas involucradas.
  • The Last Days on Mars: -0. Bleh, es una de zombies en el espacio. Nada interesante.
  • This Is 40: -0. Varias partes divertidas, y bastantes donde rozan cosas que pasan en una familia tipo; pero no me sentí identificado (quizás porque la dinámica familiar yanqui es distinta a la nuestra), así que bleh.
  • Trance: +1. Es de esas pelis que a medida que te van explicando qué pasa te vas dando cuenta que entendés menos y menos, hasta que entendiste todo. Interesante.


Anotadas para el futuro:

  • Amy (2015; Documentary, Biography, Music) Asif Kapadia's 90' minutes documentary on the six-time Grammy-winner will feature previously unseen archive footage and seek to tell the London performer's tragic story in her own words. Amy Winehouse died from alcoholic poisoning in July 2011 at the age of 27. James Gay-Rees will produce through Playmaker Films and Universal Music is on board as co-producer. "This is an incredibly modern, emotional and relevant film that has the power to capture the zeitgeist and shine a light on the world we live in, in a way that very few films can," said Kapadia and Gay-Rees. Amy was a once-in-a-generation talent who captured everyone's attention. She wrote and sung from the heart and everyone fell under her spell. But tragically Amy seemed to fall apart under the relentless media attention, her troubled relationships, her global success and precarious lifestyle. As a society we celebrated her huge success but then we were quick to judge her failings when it suited us." [D: Asif Kapadia; A: Amy Winehouse]
  • Hotel Transylvania 2 (2015; Animation, Comedy, Family) The Drac pack is back for an all-new monster comedy adventure in Sony Pictures Animation's Hotel Transylvania 2! Everything seems to be changing for the better at Hotel Transylvania... Dracula's rigid monster-only hotel policy has finally relaxed, opening up its doors to human guests. But behind closed coffins, Drac is worried that his adorable half-human, half-vampire grandson, Dennis, isn't showing signs of being a vampire. So while Mavis is busy visiting her human in-laws with Johnny - and in for a major cultural shock of her own - "Vampa" Drac enlists his friends Frank, Murray, Wayne and Griffin to put Dennis through a "monster-in-training" boot camp. But little do they know that Drac's grumpy and very old, old, old school dad Vlad is about to pay a family visit to the hotel. And when Vlad finds out that his great-grandson is not a pure blood - and humans are now welcome at Hotel Transylvania - things are going to get batty! [D: Genndy Tartakovsky; A: Adam Sandler, Selena Gomez, Keegan-Michael Key]
  • Inside Out (2015; Animation, Comedy, Family) Growing up can be a bumpy road, and it's no exception for Riley, who is uprooted from her Midwest life when her father starts a new job in San Francisco. Like all of us, Riley is guided by her emotions - Joy, Fear, Anger, Disgust and Sadness. The emotions live in Headquarters, the control center inside Riley's mind, where they help advise her through everyday life. As Riley and her emotions struggle to adjust to a new life in San Francisco, turmoil ensues in Headquarters. Although Joy, Riley's main and most important emotion, tries to keep things positive, the emotions conflict on how best to navigate a new city, house and school. [D: Pete Docter, Ronaldo Del Carmen; A: Diane Lane, Rashida Jones, Amy Poehler]
  • Mission: Impossible - Rogue Nation (2015; Action, Adventure, Thriller) Ethan and team take on their most impossible mission yet, eradicating the Syndicate - an International rogue organization as highly skilled as they are, committed to destroying the IMF. [D: Christopher McQuarrie; A: Tom Cruise, Jeremy Renner, Simon Pegg]
  • Point Break (2015; Action, Crime, Thriller) A young FBI agent infiltrates an extraordinary team of extreme sports athletes he suspects of masterminding a string of unprecedented, sophisticated corporate heists. Deep undercover, and with his life in danger, he strives to prove these athletes are the architects of the mind-boggling crimes that are devastating the world's financial markets. Filmed on four continents, North America, Europe, South America and Asia, "Point Break" presents extraordinary feats performed by the world's top extreme sports athletes, and involves some of the most daring exploits ever committed to film. Extreme sports featured include snowboarding, wingsuit flying, free rock climbing, high-speed motocross, and surfing 70-foot waves. [D: Ericson Core; A: Teresa Palmer, Luke Bracey, Édgar Ramírez]
  • The Face of an Angel (2014; Drama) THE FACE OF AN ANGEL tells the story of a journalist and a filmmaker as they lose themselves in a notorious murder case they are covering. Based on true events, a riveting account of the controversial case of a American student accused of murder in Italy. [D: Michael Winterbottom; A: Cara Delevingne, Kate Beckinsale, Daniel Brühl]
  • The Intern (2015; Comedy) 70-year-old widower Ben Whittaker has discovered that retirement isn't all it's cracked up to be. Seizing an opportunity to get back in the game, he becomes a senior intern at an online fashion site, founded and run by Jules Ostin. [D: Nancy Meyers; A: Anne Hathaway, Robert De Niro, Adam DeVine]
  • Time Lapse (2014; Sci-Fi, Thriller) Three friends discover a mysterious machine that takes pictures 24hrs into the future and conspire to use it for personal gain, until disturbing and dangerous images begin to develop. [D: Bradley King; A: Danielle Panabaker, Matt O'Leary, George Finn]
  • A Perfect Day (2015; Drama) A group of aid workers work to resolve a crisis in an armed conflict zone. [D: Fernando León de Aranoa; A: Benicio Del Toro, Tim Robbins, Olga Kurylenko]
  • Crimson Peak (2015; Horror) In the aftermath of a family tragedy, an aspiring author is torn between love for her childhood friend and the temptation of a mysterious outsider. Trying to escape the ghosts of her past, she is swept away to a house that breathes, bleeds...and remembers. [D: Guillermo del Toro; A: Charlie Hunnam, Jessica Chastain, Tom Hiddleston]
  • Pixels (2015; Action, Comedy) As kids in the 1980s, Sam Brenner (Adam Sandler), Will Cooper (Kevin James), Ludlow Lamonsoff (Josh Gad), and Eddie "The Fire Blaster" Plant (Peter Dinklage) saved the world thousands of times - at 25 cents a game in the video arcades. Now, they're going to have to do it for real. In Pixels, when intergalactic aliens discover video feeds of classic arcade games and misinterpret them as a declaration of war, they attack the Earth, using the video games as the models for their assaults -- and now-U.S. President Cooper must call on his old-school arcade friends to save the world from being destroyed by PAC-MAN, Donkey Kong, Galaga, Centipede, and Space Invaders. Joining them is Lt. Col. Violet Van Patten (Michelle Monaghan), a specialist supplying the arcaders with unique weapons to fight the aliens. [D: Chris Columbus; A: Peter Dinklage, Adam Sandler, Michelle Monaghan]
  • Regression (2015; Thriller) A young girl is sexually abused by her father. Thus, begins the disturbing tale of a father and daughter torn apart, thrown into the center of a conspiracy that shocks the nation. [D: Alejandro Amenábar; A: Emma Watson, Ethan Hawke, David Thewlis]
  • Space Station 76 (2014; Comedy, Drama, Sci-Fi) Space Station 76 is a refueling satellite near an alternate-reality Earth, circa 1976. Jessica arrives to serve as the station's new first mate. While she narrates a piece about how she likes the predictability of asteroids, some placidly drifting asteroids are shown colliding in chain-reaction fashion. While at first the station appears normal and the people friendly, Jessica soon discovers that the people on board have issues due to the isolation and stress of being cooped up with one another in a relatively small space far from Earth. This is in addition the usual problems people struggle with, such as infidelity, loneliness, depression, and drug abuse. She tries to make friends and fit in, but, unable to connect meaningfully with anyone, she becomes lonely. She's baffled and disillusioned by the stiff and irritable Captain Glenn, who harbors secrets of his own. She finds herself drawn to Ted, a lonely, married crewman, and his 7 year-old daughter, Sunshine. Ted yearns to reconnect with his unhappy, medicated wife, Misty, but she's too far gone to respond and is driving him away. His daughter Sunshine contends with her unhappy, mentally ill mother and her own isolation issues. Events finally come to a head at a Christmas party when a rapidly unhinging Misty decides everyone needs to play the "Truth Game." Just when it seems like everything's falling apart, a celestial event shakes everyone to their core, reminding them what their real priorities in life should be. [D: Jack Plotnick; A: Patrick Wilson, Liv Tyler, Marisa Coughlan]
  • The Gunman (2015; Action, Crime, Drama, Mystery, Thriller) A sniper on a mercenary assassination team, working for an unknown client, kills the minister of mines of the Congo. Terrier's (Sean Penn's) successful kill shot forces him to go into hiding to protect himself and the members of the team from retribution. This includes abruptly abandoning his girlfriend who has no idea what is going on. The assassination, paid for by a foreign mining company, triggers wide spread chaos and death in an already inflamed Congo. Terrier returns to the Congo years later working for an NGO, but eventually finds himself to be the target of a paid hit squad somehow connected to the ministers assassination. This leads to immediate deaths and the endangerment of the people working around him, and forces him back into hiding. In trying to discover who has put a price on his head, he begins to reconnect to the members of his old assassination team, including his old girlfriend. Always aware there is no path to redemption for his crimes, he is also periodically incapacitated by a type of accumulated and evolving physical brain damage caused by the hard knocks of his occupation. Unexpectedly, given the time that has elapsed, his reconnection to his old assassination team exposes additional intrigues with immediate deadly consequences. All of his years spent in hiding, have merely delayed the twisted end game that now enfolds. [D: Pierre Morel; A: Sean Penn, Jasmine Trinca, Javier Bardem]
  • The Man from U.N.C.L.E. (2015; Action, Adventure, Comedy) In the early 1960s, CIA agent Napoleon Solo and KGB operative Illya Kuryakin participate in a joint mission against a mysterious criminal organization, which is working to proliferate nuclear weapons. [D: Guy Ritchie; A: Alicia Vikander, Henry Cavill, Armie Hammer]
  • The Zero Theorem (2013; Drama, Fantasy, Sci-Fi) A hugely talented but socially isolated computer operator is tasked by Management to prove the Zero Theorem: that the universe ends as nothing, rendering life meaningless. But meaning is what he already craves. [D: Terry Gilliam; A: Christoph Waltz, Gwendoline Christie, Rupert Friend]


Finalmente, el conteo de pendientes por fecha:

(Mar-2010)    4
(Sep-2010)   18   9   2   1
(Dic-2010)   12  12   5   1
(Abr-2011)   23  23  22  17   4
(Ago-2011)   11  11  11  11  11   4
(Ene-2012)   18  17  17  17  17  11   3
(Jul-2012)   15  15  15  15  15  14  11
(Nov-2012)   12  12  11  11  11  11  11   6
(Feb-2013)       19  19  16  15  14  14   8   2
(Jun-2013)           19  18  16  15  15  15  11   2
(Sep-2013)               18  18  18  18  17  16   8
(Dic-2013)                   14  14  12  12  12  12
(Abr-2014)                        9   9   8   8   8
(Jul-2014)                           10  10  10  10
(Nov-2014)                               24  22  22
(Feb-2015)                                   13  13
(Jun-2015)                                       16
Total:      113 118 121 125 121 110 103 100  94  91


A partir de mañana

General — Martes 26 de Mayo de 2015, 18:34


Los Mayos tienden a estar saturados de cumpleaños familiares, incluidos el de Moni el del que suscribe. Moni en general los festeja al menos haciendo algo en casa, yo en general no festejo nada (en general, hay excepciones algunos años).

En esta oportunidad fue una de esas veces, que hubo excepción. Y festejamos, con Moni. E hicimos festejo grande, ya que cumplíamos redondo si tomamos el número en base 10 :)

¡¡Cumplimos 40!!

Moni y Facu soplando las velitas

Ya que décadas no se cumple todos los años (frase estúpida pero no menos cierta), decidimos hacer algo no en casa, sino más tipo fiesta-fiesta.

Buscamos un lugar copado para hacerlo. No queríamos que fuese en un boliche o pub donde hubiera otra gente. Y tampoco queríamos un salón formal formal, tipo cumpleaños de 15 o casamiento. Al final encontramos (aramos, dijo el mosquito) un lugar inmejorable: el Centro Cultural Comunicanto, donde enseñan teatro y canto, hay obras de teatro, etc.

Comunicanto, esquina con pared y mesas


Comunicanto, vista de la entrada


Comunicanto, una de las barras

Y, como decía antes, fue fiesta, de noche. Sin hijos, ya que la idea no era hacerlo familiar, sino parrandoso parrandoso (teníamos barra libre, por ejemplo). Lamentablemente, el tema de "sin hijos" hizo que alrededor de 10 amigos no puedan venir, porque no tuvieron donde dejar a sus correspondientes. Pero bueno, no se puede todo en la vida.

Fiesta, les decía. Principalmente baile baile normal, que aquellos que disfrutan de bailar aprovecharon, :). Pero también tuvimos una sección de karaoke, donde muchos subimos (sí, en primera persona) y cantamos algo. Moni le tenía muchas ganas al karaoke, y estuvo ahí como en el 80% de las canciones, mientras iban rotando invitados :)

Moni y Facu cantando


Moni era la Maestra de Ceremonias del karaoke


Vale y Moni (estábamos todas como locas)


Karaoke grupal

Obvio, también tuvimos los momentos de charla mientras comíamos y tomábamos algo. Y la clásica soplada de velitas con cantito feliz.

Un párrafo aparte se merece la mesa dulce. Se la contratamos no al salón, sino a una chica que hace todo casero (tiene una pequeña casa de comidas altamente recomendable, Amapola Café Bar, pero también hace catering de dulces), y la verdad es que fue una decisión acertadísima, ya que todo lo que probé estaba espectacular.

Mesa dulce, porciones


Mesa dulce, tortas


Mesa dulce, vasitos

Acá están todas las fotos.


Sin pluralidad mediática no podemos tener democracia

General — Miércoles 20 de Mayo de 2015, 18:16


En gran parte de América latina ya la técnica no es que el Estado mate sino fomentar la violencia letal entre el 70 por ciento que ese modelo quiere excluir. No nos olvidemos de que los 23 países que superan el 20 por cien mil anual de homicidios, 18 pertenecen a América latina y Caribe y cinco a Africa. Tampoco olvidemos que también somos campeones de coeficientes de Gini, es decir de mala distribución de la renta.

Este es el modelo de sociedad que quieren reafirmar los medios masivos concentrados. En toda América latina hay que prohibir constitucionalmente los monopolios u oligopolios televisivos. Sin pluralidad mediática no podemos tener democracia. Los medios monopólicos u oligopólicos están haciendo algo trágico en América latina.

En los países donde hay altos niveles de violencia letal la naturalizan y lo único que proponen es la destrucción de las garantías individuales. En los países donde la letalidad es baja la exacerban al efecto de crear un aparato punitivo altísimamente represivo y en definitiva también letal.

Raul Zaffaroni, en esta nota de Martín Granovsky.


Cambiando un poco la estrategia

General — Domingo 03 de Mayo de 2015, 15:52


Me está costando ponerme a escribir algo en el blog. Más que nada porque no tengo mucho tiempo libre, y cuando lo tengo (y no lo aprovecho con la familia), me alejo un poco de la compu y veo series o pelis, o en la compu estoy sólo programando.

Tampoco tengo nada puntual que escribir, entonces me da fiaca hacer una recopilación de cosas, o detalles que sucedieron, etc.

Pero para ver si logramos vencer esta "inercia a arrancar", vamos a probar un nuevo esquema.  El otro día estaba escuchando una entrevista a Dolina, en el programa de Alivertii "Decime quien sos vos", y me enteré que a él le resulta más fácil, para escribir o producir textos, dictarlos. Entonces, la idea es dictarme yo mismo, grabando con el teléfono, y después voy a transcribir eso.

Obviamente lo voy a editar bastante, lo voy a toquetear, pero la idea es a ver si se logra que fluya más las cosas para contar y no terminar con dos o tres descripciones parcas y nada más.

Grabador de voz

En tren de contar algo de lo que fue sucediendo, el mes pasado hice el asado geek, que aunque es sólo un asado un domingo, realmente hay que ir a comprar un montón de cosas, y acomodar cosas en la casa, preparar todo, un largo etc. Después es un par de días de reorganizar todo de nuevo.

Se vino también el cumple de Malena, que implicó organizar la fiesta en el salón, la reunión en casa, etc. Y estamos armando una fiesta de cumpleaños con Moni, lo cual también lleva su tiempo de coordinación.

A nivel programación, estoy avanzando con varios proyectos, puntualmente CDPedia, fades, y Encuentro.

Con respecto a CDPedia, había preparado hace unos meses una imagen nueva para Huayra, que me pidió Karucha, pero revisando lo que se había armado nos dimos cuenta que había problemas en la búsqueda (vos ponías una palabra y jamás te traía un resultado).

Empecé a analizar el problema, y ví que no era algo que había salido mal en esa imagen, sino que teníamos un problema a nivel código, era algo a arreglar, así que me puse con eso y encontré que estábamos sacando mal títulos de las páginas (habían cambiado el formato interno).

Lo mejoré, y ahora no sólo saca bien los títulos sino que los saca en una etapa anterior, lo que es más eficiente. También metí un par de mejoras con respecto a la internacionalización.  En este momento estoy generando una imagen beta para ver si está todo bien, y ahí armar un set completo de imágenes, para distribuirlos. Luego, saldrá una beta en portugués, a ver cómo anda :)

El otro programa en el que estoy metiendo tiempo, como decía, es Encuentro. Cuando Humitos estuvo en casa (en esos días antes y después del asado geek) le metimos unas horas a este programa porque él está haciendo lo que es la integración con el backend de CDA, y ayudándolo y probando algunas cosas me di cuenta que la autenticación de Conectate cambió con lo cual no se podían bajar bien los videos.

Eso ya lo arreglé, pero todavía no lo liberé. Mi idea era esperar a Humitos para ver si metemos lo de CDA, pero creo que no lo va a tener para las próximas semanas, así que voy a hacer un release estos días, no sólo con ese fix sino también con otras mejoras y pequeñas correcciones que fui haciendo.

Finalmente, el otro fin de semana pasé un rato por FLISOL y luego me fui para la casa de Gilgamezh donde le estuvimos metiendo tiempo a fades, porque queremos hacer un release pronto con algunos features realmente copados ahí. Ya tenemos planeado con qué queremos llegar a la v3, nos falta poco :)


Búsqueda por prefijos tolerante a errores

Python — Jueves 30 de Abril de 2015, 18:16


Hace un tiempo les hablé de un árbol que hice para sacar prefijos de palabras.

En el laburo estoy estudiando la forma de hacer un autocompletador. Entonces, luego de leer cosas por ahí, decidí probar ese árbol que ya tenía hecho.

Nunca le había tirado tantos datos, pero la verdad es que salió andando de perlas.

Por otro lado, tenía un detalle que necesitaba solucionar: yo quería que la búsqueda de palabras soportara errores en la escritura. O sea, que si uno buscara "maise", encontrara "maizena".

Encontré un paper bastante loco, Efficient Error-tolerant Query Autocompletion, pero que mostraba la forma de soportar errores al buscar palabras completas, no prefijos. Igual, apliqué ideas de ahí, y en un par de días de laburo conseguí lo que quería. Pero, al cargar el millón y medio de registros que tengo que cargar, ¡explotaba por memoria!

Luego de algunas optimizaciones obvias, se me ocurrió lo de deduplicar los subtrees internos. ¿Qué es deduplicar? Deduplicar es la acción por la cual si tengo un objeto A, y luego tengo otro B, que resulta ser igual a A, puedo usar el A directamente en ambos casos, descartando B (libera memoria), y listo.

Deduplicar diccionarios no es un asunto trivial. Tiré el asunto en la lista de PyAr, y en pocas horas logré que todo funcione correctamente. Ahora no sólo no explota, sino que ocupa bastante poca memoria!

    Memory usage after loading the tree: rss: +586 MB  vms: +586 MB
    Time to load the tree: 327190.99 msec
    <WordTree at 3068071276 [tau=1]: 1478347 words 30015540 (2201293) nodes (unique)>

Millón y medio de palabras, 30 millones de nodos (de los cuales 2.2 millones son únicos), ocupando 590 MB de memoria. Nada mal, ¿no? Que tarde 5.5 minutos en armar toda la estructura es un problema, la semana que viene voy a mirar eso bien.

Todo el código, acá.


Mis lugares favoritos en el mapa

General — Sábado 11 de Abril de 2015, 16:29


Hace algunos años me empezó a pasar que leía (o me pasaban) recomendaciones de lugares para comer, tomar algo, jugar al pool, etc, y luego cuando estaba en la calle, no las recordaba y terminaba yendo a cualquier lado al azar.

Se me ocurrió empezar a registrar los lugares en un mapa. La solución que usé fue basada en Google Maps: en la interfaz web creé una capa mía, en la cual empecé a cargar todos esos lugares. Luego, en el teléfono, iba a Google Maps, le decía que me mostrara esa capa, y ahí tenía el mapa con muchas estrellitas (cada lugar que había cargado) y podía ver qué tenía cerca, o para donde iba, etc.

Con el tiempo, se empezó a complicar.

En un momento, Google decidió que la versión del teléfono de Maps no iba a mostrar más "custom layers" (o sea, las capas que creabas vos). En otras palabras, ¡no podía ver más mis datos! Esto lo solucioné instalando una versión vieja de Google Maps en el teléfono (lo cual no es sencillo de hacer, pero funcionaba). Más adelante, Google empezó a complicar el uso de las capas en la versión web también. Y hace algunos meses, dejó de servir esa información, con lo cual aunque en el teléfono tuviera una versión que pedía esas capas al servidor, el servidor no las contestaba.

Esta foto es vieja, pero me encanta

En paralelo, hace un par de años largos que quiero empezar a irme en lo posible de los servicios de Google, y en función de eso en los últimos meses empecé a usar los mapas de OpenStreetMap ("OSM"), por recomendaciones de Nico, Humitos y Marcos Dione. Desde mitad del año pasado también lo puse en el teléfono, mediante la gran aplicación OsmAnd primero, y desde hace un par de semanas con MAPS.ME (que es bastante más rápida al mostrar los datos, y creo que es mejor decidiendo dónde mostrarte los nombres de las calles, lo cual es importante).

La gran ventaja de OsmAnd y MAPS.ME es que usan los mapas de OpenStreetMap (que son mejores en su calidad que los de Google Maps, y además son abiertos y colaborativos), y que además lo usan de forma offline. O sea, te bajás los mapas que te interesan (por ejemplo, el de Argentina) cuando tenés una buena conexión de internet y luego el mapa está en tu teléfono, con lo cual no necesitás internet cuando estás en la calle para consultar estos datos.

Pero, aunque estaba contento con la solución de "mapas" en su forma genérica, me faltaba esto de "anotar mis lugares". Hasta que Humitos me recomendó umap, donde podés justamente crear capas de lugares arriba de los mapas de OpenStreetMap (hay una gran cantidad de sitios que utilizan los datos de OSM y dan servicios arriba de ellos, ejemplos que me pasó Humitos: su propio "puntos de interes", otro con fotos de ciudades, y uno donde la gente registra árboles frutales).

En ese sitio, entonces, creé mi mapa de lugares para ir de parranda (no volví a armarlo de cero, sino que importé lo que exporté previamente de google maps). Para llevar estos datos a mi teléfono, exporté un KML, me lo mandé por mail, y en el teléfono le dije que lo abra con el MAPS.ME.

Y listo, :)


Hay días en el laburo...

General — Miércoles 08 de Abril de 2015, 18:58


Hay días en el laburo donde tenés que hacer un trabajo, lo planeás, te juntás con gente, se decide que cosas se van a hacer, se separa todo en tres o cuatro partes, hacés cada una (con tests y todo), todo bien, te hacen los review, entra en trunk, va a producción, todo muy lindo, mirás las métricas, suben y bajan como corresponde, y sos feliz.

Hay otros días en el laburo, donde empezás a ver algo y decís "esto no puede ser", empezás rastrear por qué está ese número ahí y te das cuenta que los logs tienen un problema, entonces lo querés contrastar con las métricas, y te das cuentas que en las métricas falta data, decidís cruzarlo con otro dato y te das cuenta que todavía no están sincronizados los archivos donde eso está, lo tenés que pedir y te tardan tres o cuatro horas en dartelo, y después cuando lo podés cruzar te das cuenta que deberías haber estado registrando algún otro número más, pero que no todo está perdido porque lo podés sacar de forma indirecta, hacés un script para parsear un quintillón de registros, te da un resultado más o menos coherente, pero todavía tenés que resolver como puede ser que el problema realmente esté sucediendo, mirás el código, te das cuenta que esa función está siendo llamada desde siete lados de los cuales solamente te acordabas tres, y de esos siete lados hay dos que no tenes datos de cómo están llamados... 

Está todo roto

En fin, la mayoría de las veces termina todo con un final feliz, pero realmente estás uno, dos o tres días rascándote grupalmente la cabeza con tus compañeros de trabajo hasta que se resuelve el acertijo.


Metaclasses in Python, the easy way (a real life example)

Python — Jueves 12 de Marzo de 2015, 00:24


They say that metaclasses make your head explode. They also say that if you're not absolutely sure what are metaclasses, then you don't need them.

And there you go, happily coding through life, jumping and singing in the meadow, until suddenly you get into a dark forest and find the most feared enemy: you realize that some magic needs to be done.


The necessity

Why you may need metaclasses? Let's see this specific case, my particular (real life) experience.

It happened that at work I have a script that verifies the remote scopes service for the Ubuntu Phone, checking that all is nice and crispy.

The test itself is simple, I won't put it here because it's not the point, but it's isolated in a method named _check, that receives the scope name and returns True if all is fine.

So, the first script version did (removed comments and docstrings, for brevity):

    class SuperTestCase(unittest.TestCase):

        def test_all_scopes(self):
            for scope in self._all_scopes:
                resp = self._check(scope)
                self.assertTrue(resp)

The problem with this approach is that all the checks are inside the same test. If one check fails, the rest is not executed (because the test is interrupted there, and fails).

Here I found something very interesting, the (new in Python 3) subTest call:

    class SuperTestCase(unittest.TestCase):

        def test_all_scopes(self):
            for scope in self._all_scopes:
                with self.subTest(scope=scope):
                    resp = self._check(scope)
                    self.assertTrue(resp)

Now, each "sub test" internally is executed independently of the other. So, they all are executed (all checks are done) no matter if one or more fail.

Awesome, right? Well, no.

Why not? Because even if internally everything is handled as independent subtest, from the outside point of view it still is one single test.

This has several consequences. One of those is that the all-inside test takes too long, and you can't know what was going on (note that each of these checks hit the network!), as the test runner just show progress per test (not subtest).

The other inconvenient is that there is not a way to call the script to run only one of those subtests... I can tell it to execute only the all-inside test, but that would mean to execute all the subtests... which, again, takes a lot of time.

So, what I really needed? Something that allows me to express the assertion in one test, but that in reality it were several methods. So, I needed something that, from a single method, reproduce them so the class actually had several ones. This is, write code for a class that Python would find different. This is, metaclasses.


Metaclasses, but easy

Luckily, since a couple of years ago (or more), Python provides a simpler way to achieve the same that could be done with metaclasses. This is: class decorators.

Class decorators, very similar to method decorators, receive the class that is defined below itself, and its response is considered by Python the real definition of the class. If you don't have the concept, you may read a little here about decorators, and a more deep article about decorators and metaclasses here, but it's not mandatory.

So, I wrote the following class decorator (explained below):

    def test_multiplier(klass):
        """Multiply those multipliable tests."""
        for meth_name in (x for x in dir(klass) if x.startswith("test_")):
            meth = getattr(klass, meth_name)
            argspec = inspect.getfullargspec(meth)

            # only get those methods that are to be multiplied
            if len(argspec.args) == 2 and len(argspec.defaults) == 1:
                param_name = argspec.args[1]
                mult_values = argspec.defaults[0]

                # "move" the usefult method to something not automatically executable
                delattr(klass, meth_name)
                new_meth_name = "_multiplied_" + meth_name
                assert not hasattr(klass, new_meth_name)
                setattr(klass, new_meth_name, meth)
                new_meth = getattr(klass, new_meth_name)

                # for each of the given values, create a new method which will call the given method
                # with only a value at the time
                for multv in mult_values:
                    def f(self, multv=multv):
                        return new_meth(self, **{param_name: multv})

                    meth_mult_name = meth_name + "_" + multv.replace(" ", "_")[:30]
                    assert not hasattr(klass, meth_mult_name)
                    setattr(klass, meth_mult_name, f)

        return klass

The basics are: it receives a class, it returns a slightly modified class ;). For each of the methods that starts with "test_", I checked those that had two args (not only 'self'), and that the second argument were named.

So, it would actually get the method defined in the following structure and leave the rest alone:

    @test_multiplier
    class SuperTestCase(unittest.TestCase):

        def test_all_scopes(self, scope=_all_scopes):
            resp = self.checker.hit_search(scope, '')
            self.assertTrue(resp)

For that kind of method, the decorator will move it to something not named "test_*" (so we can call it but it won't be called by automatic test infrastructure), and then create, for each value in the "_scopes" there, a method (with a particular name which doesn't really matter, but needs to be different and is nice to be informative to the user) that calls the original method, passing "scope" with the particular value.

So, for example, let's say that _all_scopes is ['foo', 'bar']. Then, the decorator will rename test_all_scopes to _multiplied_test_all_scopes, and then create two new methods like this::

    def test_all_scopes_foo(self, multv='foo'):
        return self._multiplied_test_all_scopes(scope=multv)

    def test_all_scopes_foo(self, multv='bar'):
        return self._multiplied_test_all_scopes(scope=multv)

The final effect is that the test infrastructure (internally and externally) finds those two methods (not the original one), and calls them. Each one individually, informing progress individually, the user being able to execute them individually, etc.

So, at the end, all gain, no loss, and a fun little piece of Python code :)


1 2 3 ... 55 56 57  Siguiente»

Powered by LifeType