Facundo Batista: Relación costo beneficio


Acabo de llegar a una conclusión, de esas apuradas, donde la certeza se ve reforzada por el no tan completo análisis científico que implica una corazonada.

La comida que más beneficio me da en función del costo (precio de los componentes, complejidad del laburo y tiempo de cocinero) es el pollo al horno con cebolla.

El proceso de armado del plato es, obviamente, sencillo.

Cómprese un par de "patamuslos" en la pollería amiga. Si es de pollo de campo, mejor. Yo en Italia lo hacía con pavo, y estaba igual de bueno. Cómprese cebolla. Se asume que en casa hay aceite neutro (girasol, ponele), sal y pimienta.

(se escuchan ruidos de frenada) Perá, ¿qué? ¿Nada más? No, nada más.

Agárrese una fuente, póngase un poco de aceite en la base (como para que no se pegue, apenas), acomódense las presas de pollo así nomás. Pélese y córtese las cebollas en partes grandes (si son cebollas chiquitas, en mitades; si son medianas, en cuartos; si son grandes, en octavos; y así). Revoléese las cebollas así nomás en la fuente, entre los huecos dejado por el pollo.

Métase en el horno, ya caliente. Una hora. Dese vuelta un poco todo. Salpiméntese. Dejar un rato más hasta que quede doradito doradito. Ante la duda, dejar un rato más.

Disfrútese.

Lleva menos laburo hacer esta comida para cuatro que lo que me costó hacer este post en el tiempo verbal pelotudo de ese pseudo presente-imperativo-en-tercera-persona que no sé como se llama.

Marcos Dione: ayrton-0.6

Almost two months since the last release, and with reason: I've been working hard to define remote()'s semantics. So far this is what there is:

  • Global and current scope's local variables can be used in the remote code. This includes envvars.
  • Changes to the local variables return to the local code.
  • Execution is done synchronously.

What this means is that if we had the following code:

[block 1]
with remote (...):
    [block 2]
[block 3]

we have the following:

  • Variables in block 1's scope are visible in block 2.
  • Modification to the local scope in block 2 are visible in block 3.
  • block 3 does not start executing until block 2 has finished.

This imposes some limitations on how we can communicate with the remote code. As it is synchronous, we can't expect to be able to send and receive data from block 3, so the previous way of communicating with paramiko's streams is no longer possible. On the other hand, stdin, stdout and stderr are not transmitted yet between the local and the remote, which means that actually no communication is posible right now except via variables.

Also, because of the way remote() is implemented, currently functions, classes and modules that are going to be used in the remote code must be declared/imported there.

Finally, exceptions raised in the remote code will be reraised in the local code. This two things together mean that any custom exception in the script must be declared twice if they're raised in the remote :(.

But all in all I'm happy with the new, defined semantics. I worked a lot to make sure the first two points worked properly. It took me a while to figure out how to do the changes to the scope's locals after the new values were returned from the remote. I know this is a very specific use case, but if you're interested, here's the thread were Armin Rigo tells me how it's done. You might also be interested in Yaniv Ankin's Python innards.

Finally, check the full ChangeLog:

  • Great improvements in remote()'s API and sematics
    • Made sure local variables go to and come back from the remote.
    • Code block is executed synchronously.
    • For the moment the streams are no longer returned.
    • _python_only option is gone.
    • Most tests actually connect to a listening netcat, only one test uses ssh.
  • Fixed bugs in the new parser.
  • Fixed globals/locals mix up.
  • Scripts are no longer wrapped in a function. This means that you can't return values and that module semantics are restored.
  • ayrton exits with status 1 when the script fails to run (SyntaxError, etc).

More fun times are coming!

Get it on github or pypi!


python ayrton

Roberto Alsina: Brute Force Works

Last ni­gh­t, Juan­jo Conti twee­ted this:

Or, in en­glis­h: "U­sing exac­tly on­ce the di­gi­ts 1,3,4 and 6, and any of the four ba­sic ope­ra­tion­s, ob­tain 24."

I first spent a cou­ple of mi­nu­tes thi­nking about it and then it hit me: the­re is no po­int in thi­nking this sort of pro­ble­m, be­cau­se:

  1. Bru­te for­cing it wi­ll take le­ss ti­me
  2. What you do whi­le "thi­nkin­g" it is sort of la­me, is­n't it?

So, he­re is a mo­re-o­r-­le­ss ge­ne­ral so­lu­tion for any of the­se pro­ble­ms.

from __future__ import print_function, division
import itertools

numbers = ['1','3','4','6']
target = 24

# Having '' as an operation allows for solution (14-6)*3, which
# may or may not be valid depending on rule interpretation.
operations =  ['*','/','+','-','']

t1='(({0}{4}{1}){5}{2}){6}{3}'
t2='{0}{4}({1}{5}({2}{6}{3}))'

for nums in itertools.permutations(numbers):
    for ops1 in itertools.combinations_with_replacement(operations, 3):
        for ops2 in itertools.permutations(ops1):
            for t in (t1, t2):
                s = t.format(*(nums+ops2))
                #print(repr(s))
                try:
                    if eval(s) == target:
                        print(s)
                except (ZeroDivisionError, SyntaxError, TypeError):
                    continue

Of cour­se you can make it sol­ve any pro­blem of this cla­ss by adjus­ting num­bers and tar­ge­t. ­The­re is al­so a po­s­si­ble ex­tra so­lu­tion if eva­l(s) == -ta­r­­get whe­re you just need to add a una­ry - to the ex­pres­sio­n, but who ca­res.

Did I miss so­me­thin­g? Is this rea­lly a ge­ne­ral so­lu­tio­n?

Juanjo Conti: Hoy en La opinión de Rafaela

Hoy a la mañana me llegó un mail de esos que te alegran el día. Un periodista y escritor de Rafaela había encontrado Xolopes en el departamento de su hijo y lo leyó:

Me entusiasmé y publiqué un artículo comentándolo en La Opinión, de aquí. Apareció en la edición de hoy, 26 de octubre, en la sección Información General, con foto.

Aquí la parte principal del texto y el link para leerlo online:

XOLOPES: VIAJE AL ENTRETENIMIENTO CON PROFUNDIDAD

“Xolopes”, de Juanjo Conti (edición 2014, de Automágica (Santa Fe), de 100 páginas) es una muy entretenida novela que, además de ser interesante, atrapa en todas las líneas de su contenido, cuenta historias y leyendas de mayas y aztecas, y muestra lugares mediante fotografías y gráficos de recorridos.

La parte central de su argumento son los acontecimientos de un viaje a México por parte de una pareja, contados por diferentes personajes, apareciendo sus voces alternativamente en pequeños sectores de pocas líneas separados por una numeración continuada, al modo de los libros de Eduardo Galeano (El libro de los abrazos, por ejemplo), pero la originalidad de Juanjo Conti va mucho más allá: las páginas no están numeradas; alude con frecuencia a la palabra “revolución” y la escribe tachada y a continuación dice “rebelión”, como si hiciera una corrección a un borrador; define su concepto de novela; incluye recetas, al modo de “Como agua para chocolate” y, finalmente, adopta como base narrativa la libertad que instaló Cortázar en “Rayuela”.

Juanjo Conti entiende y muestra cómo la escritura es juego, vida y pasión (y, sobre todo, libertad).

Lleva la línea argumental con precisión y apertura de enfoques y la cierra con seguridad, dejando un mensaje claro donde justifica el título de la obra. Se percibe llegando al final que se ha leído una novela sutil y elegantemente elaborada, con control de vocabulario, la sorpresa y la acción. Queda claro que sólo el autor sabe dónde están la verdad y la realidad de lo que cuenta. Para entretener cabalmente, Conti apela a la inteligencia del lector.

“Paseando con su camiseta de la selección Argentina de fútbol, se jacta de gran regateador por haber pagado dos dólares por un imán que le ofrecían a cinco. Y pagó sesenta por un estuche impermeable para la cámara de fotos que se llenó de agua del mar Caribe en la primera inmersión” (título 58).

En el título 79 hace una definición de lo que implica su obra. Dice que “lo mejor que le puede pasar a una novela como ésta (…) (que) intenta ser un fresco de un espacio y un tiempo (…) es tener un final que tome toda la paja de relleno y la prenda fuego”.

Hugo Borgna

Especial para “La Opinión”, de Rafaela

http://diariolaopinion.com.ar/noticia/77049/viaje-al-entretenimiento-con-profundidad

PS: ya pedí a un amigo que vive en rafaela que me guarde una copia en papel de recuerdo.

Manuel Kaufmann (Humitos): #1 Report to PSF

Para darle un poco más de transparencia al proyecto Argentina en Python y también para dar a conocer cuáles fueron los eventos que hemos ido organizando a lo largo de que empezó la financiación por parte de la Python Software Foundation, vamos a ir dando a conocer los reportes que hemos ido enviando

Hoy publicamos el #1 reporte enviando: Tue, 10 Feb 2015 22:30:51 -0300

Hello PSF,

How are you? I'm writing my 1st report to comment you about how my
project "Argentina in Python" is going.

During the last month I've been working on some Python's events:

== Past Events ==

- 17 Jan - Sprint at Resistencia, Chaco, Argentina
  (http://elblogdehumitos.com.ar/posts/primer-sprint-de-python-en-resistencia-chaco/)

- ~20 attendees (4 girls). Most of them without knowledge of
  Python, so we worked in different groups. The idea of a possible
  PyDay at Formosa merged from this meeting.

- 30 Jan - MeetUp at Resistencia, Chaco, Argentina
  (http://www.meetup.com/Python-NEA/events/219942458/)

- ~15 attendees (3 girls). A very informal meeting to keep all the
  energy from the past Sprint together and to start creating a
  local community. We talk about the future of Python, brython,
  javascript, django, php, openstreetmap and much more.

== Future Events ==

- 14 Feb - PyDay at Formosa, Formosa, Argentina

- 21 Mar - PyDay at Asunción, Gran Asunción, Paraguay

- 20-22 May - Educational Track for secondary students at SciPy LA
  2015, Posadas, Misiones, Argentina (http://scipyla.org/conf/2015/)

- Possible PyDay around May at Encarnación, Itapúa, Paraguay

- Possible PyDay around May at Apóstoles, Misiones, Argentina


* Is this the kind of information you want from me to report?
* Is this useful for you?

Please, let me know if you need another kind of information.

Thank you guys.

Facundo Batista: Nuevo curso abierto de Intro a Python


Antes de cerrar el año armé un nuevo curso de Python, no como parte de un grupo cerrado para una empresa o institución, sino abierto al público en general. Esta vez, intensivo (muchas horas en sólo tres clases).

Será un Curso Introductorio a Python, apuntado a aquellos que no saben nada de este lenguaje, o saben algo pero quieren profundizar o formalizar conocimientos, y también incluirá un popurrí de temas enfocados a devops... todos los desarrolladores terminamos siendo un poco sysadmines a veces y está bueno saber usar algunas herramientas.

El nivel es introductorio, lo que significa que se van a ver muchos conceptos del lenguaje de manera profunda, pero no se tocarán temas avanzados ni satélites a lo que es Python en sí, con la intención que el asistente gane sólidos conocimientos que luego le permitan explorar el resto a su gusto. Para aprovechar el curso en todo su potencial se necesita tener conocimientos previos de programación (pero no hace falta ser un programador avanzado). En detalle, el contenido del curso versará sobre los siguientes ítems:

  • Introducción: ¿Qué es Python?; Primeros pasos; Recursos
  • Tipos de Datos: Haciendo números, y más números; Cadenas de texto; Tuplas y listas; Conjuntos; Diccionarios
  • Controles de flujo: if/elif/else; loops while y for; Excepciones
  • Encapsulando código: Funciones; Clases; Módulos; Espacios de nombres
  • Otros temas: Archivos; Serialización; Trabajando en Red; Ejecución externa; Multithreading/multiprocessing

El formato del curso será presencial, en un ambiente "tipo aula" con pizarrón y proyector, pero no basado en filminas, sino totalmente dinámico y adaptativo. Se hace un foco especial en la interacción profesor-asistente, de forma de ir resolviendo las dudas de todos y lograr un aprendizaje más profundo en el mismo tiempo. En función de esto también se limita el cupo, con una cantidad máxima de asistentes de alrededor de siete personas.

Como parte del curso se entregará un certificado de asistencia al mismo. No se necesita asistir al curso con computadoras, pero pueden traer laptops/netbooks si lo desean (van a disponer de conexión a internet via wifi y conexión eléctrica).

El curso es de 18 horas en total, dividido en tres clases, los Miércoles 4, 11 y 18 de Noviembre. El horario será de 10 a 17, considerando una hora para almorzar. El almuerzo será provisto como parte del curso: la idea es ofrecer esto resuelto, así comemos algo liviano, descansamos un rato, y seguimos trabajando, porque si vamos a almorzar a otro lado no nos va a alcanzar el tiempo. El lugar de realización es Borges 2145, Olivos.

El costo total del curso (incluyendo el almuerzo) es de $2720; es necesario abonar al menos el 50% para reservar la posición (recuerden que, como indicaba arriba, hay un máximo de lugares disponibles), abonando el saldo restante el primer día de clases.

Para reservar me envían un mail para confirmar disponibilidad y ahí les paso los datos necesarios.

Facundo Batista: De sprint en Boston


Una semana de trabajo intensivo.

Muy intensivo, como son los sprints, porque trabajás de 9 a 18 sin pausa, pero también socializás de 8 a 23. O más, o menos, pero estás todo el tiempo con compañeros de trabajo, y la mayoría del tiempo hablando en inglés.

Intensivo.

Pero está bueno, te corta la rutina, hacés cosas diferentes. Este sprint fue en USA, hace bastante que no iba por allá. Era en la zona de Boston, así que aproveché para visitar a mi amigo Nico Cesar.

Llegué el domingo, antes del mediodía, tiré las cosas en el hotel y me tomé un par de bondis para ir a la casa. Salimos a pasear, almorzamos una sopa de almejas (riquísima) y después de cruzar el campus de Harvard y estar un rato mirando un show callejero, nos fuimos a navegar un rato, en un velero.

Nico en el velero

Nunca me había subido a un velero, y esta vez no fui solamente un turista: agarramos uno de los grandes, que tiene una vela adelante (además de la principal), y yo estaba a cargo de la misma (así como de desenganchar y enganchar el velero al salir/volver). Estuvo bueno, aprendí un montón de cosas :)

Pero más allá de eso, me encanta cruzarme con Nico. Podemos pasar horas charlando de mil boludeces, caminando, paseando, tomando algo.

El mismo domingo mi jefe Bret hizo una "langosteada"... unos sanguchitos de langosta, básicamente, pero preparados de la forma local (tostando los panes con manteca, con salsitas especiales, etc... laburó un montón, estuvo bueno :).

Flor silvestre

El resto de la semana, mucho trabajo (como decía) y mucha socialización. Este es el segundo sprint con este equipo y estuvo mucho mejor que el primero.

El lunes estuve paseando un rato, pero terminé tomando algo y casi cenando con mucho del equipo.

El martes fuimos con varios del grupo al centro a una charla de Cory Doctorow que estuvo muy buena. Acá me volví a cruzar con Nico, y nos fuimos a cenar todos juntos. La charla de Cory estuvo muy buena, el resto de la noche también.

Cory Doctorow

El miércoles era cena de equipo... la cena formal, digamos. Fuimos todos a un lugar donde comimos muy rico, pero el lugar no estaba bueno. Muy moderno, muy ruidoso. No fue la mejor noche, el lugar no tenía... swing... no sé.

El jueves estuvo mucho mejor. Entre mi jefe y otro más armaron una "barbacoa" en el patio del hotel. Compraron mil cosas, mucha variedad (y orgánico!), con muy buena cerveza para acompañar. Así que comimos pollo, hamburguesas, salchichás, salmón, carne de vaca. Acompañado con mil y una verduras. Todo muy rico.

Compras para la barbacoa

La barbacoa amerita un punto aparte. Sí, parece una máquina del demonio, o sea, una parrilla a gas... pero debo admitir que estos que estaban ahí estaban muy bien. Por un lado, la llama están apuntando para abajo, así que no tocan la comida... y por otro lado, tienen una tapa que captura el calor. De nuevo: no es una parrilla de verdad, pero termina quedando algo medio parrilla medio horno que no está tan mal.

La verdad es que la comida estuvo muy bien.

El viernes estaba muy cansado, aproveché a quedarme en la habitación, acomodar mil cosas, preparar todo.

Y el sábado, ya casi volviendo, fuimos a pegar una vuelta con Guillo hasta el Best Buy, más como una excusa para caminar que otra cosa. Llegamos nueve y media... ¡y estaba cerrado! Vimos que abría a las 10, así que nos fuimos a un mall que estaba cerca, mientras tanto. Fuimos como pudimos, porque no hay senderos para caminar, ni para cruzar la calle, etc. Si no tenés auto, estás en el horno :/. Nosotros igual caminamos y nos metimos en todos lados. Caminamos bastante, la verdad... cuando nos fijamos habían sido 6.5km!!

El otoño es muy colorido

Después, la vuelta... un viaje siempre demasiado largo, y por fin de nuevo con la familia :)