Agua Mineral
Cuando nadie deja de aplaudir, repito mi última canción.
Toco y canto, Agua Mineral
Cuando nadie deja de aplaudir, repito mi última canción.
Toco y canto, Agua Mineral
Una tarde estábamos jugando a este juego en su tablero y me dieron ganas de jugarlo en la compu también. Una búsqueda rápida no nos arrojó resultados y decidí programarlo para practicar mi PyGame. La idea fue no terminar con algo muy complejo, sino más bien simple que pueda programarlo rápido y que sirva también como ejemplo de uso de esta librería.
El juego es un juego lógico: hay que pensar para poder ganar ;-).
Para jugarlo pueden obtener la última versión desde el svn:
svn co http://svn.juanjoconti.com.ar/code/ SecretCode
A pedido de Lucio de PyAr dejo unas capturas de pantalla, espero que alcancen para entender el juego. Si no se entiende, podemos usar los comentarios de este post para aclarar dudas :).





Hoy se llevó a cabo el octavo Python Bug Day. Sabía que era en estos días pero no lo tenía presente ni se me había ocurrido participar. Al mediodía Facundo Batista me lo recuerda por chat y me pregunto... ¿Por qué no? Puedo probar unas horas, ver que pasa, nunca compilé Python tal vez tenga que hacerlo para probar una solución.
Me dieron una lista de bugs fáciles. Y elejí este: 1779. El bug en particular podría haber sido resuelto en pocos minutos por un desaarrollador de Python. Es más, el mismo había sido reportado por el creador del lenguaje :D Pero como bien dice en uno de los comentarios, es un buen bug para el Python Bug Day. A un experto, resolverlo no le habría costado nada, pero tampoco le habría aportado nada. A un novato como a mi me sirvió para conocer algo del nucleo del lenguaje y el proceso que hay que seguir para resolver un bug:
<li>Bajar la última versión del código fuente</li> <li>Compilar</li> <li>Correr los tests para ver que todo ande bien</li> <li> Encontrar el bug y arreglarlo</li> <li>Correr los tests nuevamente</li> <li>Arreglar los tests que fallan</li> <li>Agregar tests que prueben el arreglo</li> <li>Correr los tests nuevamente</li> <li>Armar un parche</li> <li>Envair el parche</li>
El bug, que continuará en las versiones previas de Python pero ya está corregido en Python 3000, es el siguiente:
>>> int("- 1")
-1
>>> float("- 1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): - 1
Cuando se quiere crear un número a partir de un string, no pueden haber espacios en blanco entre el signo (+ o -) y el número. El comportamiento correcto es el de la función float. El de int es errorneo. Necesita ser arreglado.
Obtener el código fuente
Bajé del servidor svn la última versión de Python 3000, la nueva versión del lenguaje, para el cual el bug estaba abierto:
svn co http://svn.python.org/projects/python/branches/py3k/
(Esto llevó bastante tiempo. Mientras tanto cociné y almorcé.)
Compilar
cd py3k/
./configure && make
Correr el intérprete compilado
./python
Correr los tests
make test
o
./python Lib/test/regrtest.py
Arreglar el bug
En los comentarios sel bug se decía que era simple de resolver y que no consistía más que en comentar 2 líneas en un archivo en C.
Revisé el archivo Objects/longobject.c y luego de entender como funcionaba la función PyLong_FromString(char str, char *pend, int base), comenté las líneas 1688 y 1689. Problema resuelto!
Compilé para que mis cambios se vean reflejados.
make
Y probé en el intérprete.
>>> int("- 1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 1'
Perfecto!
Luego corrí las pruebas afectadas por mi cambio y fallaron.
./python Lib/test/test_builtin.py
La función en particular era test_int(self). Luego de una mirada rápida, comenté los valores de una lista que hacían fallar la prueba y pensé que con eso era suficiente. Consulté y me dijeron que también agregue mi cambio en Misc/NEWS. Lo hice. Lo siguiente era generar el parche.
svn diff | tee bug_fix_for_1779.diff
El mismo está en http://bugs.python.org/file9220.
Luego lo vio Facundo y me dijo que tenía que tenía que agregar pruebas para mi parche. Me llevó bastante tiempo entender como funcionaba la prueba. Finalmente, luego de preguntar bastante conseguí el resultado deseado. Volví a generar un parche y a subirlo.
svn diff | tee bug_fix_for_1779-plustests.diff
http://bugs.python.org/file9228
La experiencia
La verdad es que la experiencia fue muy buena. En unas 5 horas aprendí mucho sobre Python en si y sobre su ciclo de desarrollo, interactué con una comunidad despuesta a darte una mano cuando la necesitás y arreglé un error en el lenguaje que más uso. Voilá! Muchas gracias Comunidad de Python por organizar este Python Bug Day.
El martes 8, 3 minutos antes de entrar a trabajar, compré en Mauro Yardín el número 7 de la Biblioteca de Ciencia Ficción de Hyspamérica (Si, esos libritos azules): El sol desnudo, de Isaac Asimov.
Al día siguiente compré otra joyita, La paja en el ojo de Dios 1 y 2.
Un par de notas mentales, las dejo en mi blog para no perderjas :)
Ya sospechaba de este hecho pintoresco de la literatura :) Me lo confirma el autor en el capítulo 4 de El Sol Desnudo en el que relata una entrevista entre un detective de la Tierra y una mujer que vive en otro planeta, con otras costumbres y pudores. No digo más, a leerlo.
Tal vez algún día termine de leer la saga completa. De momento estoy bastante retrasado:
Los libros de la saga
El orden dado a continuación coincide mayoritariamente con el de lectura recomendado por Asimov, con algunas correcciones que surgen de la lectura de los propios textos y las inclusiones de textos posteriores antes señaladas. Esto no excluye otros ordenamientos de lectura, como el dado por las fechas de publicación, ya que los libros fueron originalmente historias separadas y posteriormente conectadas en un todo coherente. Algunos críticos argumentan[2][3] que la lectura de las protosecuelas, antes de la de los primeros libros escritos, desvelaría datos importantes que en la trama original se plantearon como sorpresivos. Como los títulos de los libros han sido traducidos de modo diverso por cada editor, se dan a continuación los títulos originales y fechas de publicación de las ediciones en inglés. Las ediciones castellanas de cada uno de estos títulos se dan más abajo.Historias de robots
- 1 ) The Complete Robot (1982). Colección de 31 relatos cortos sobre robots publicados entre 1940 y 1976, que incluye los previamente incluidos en la recopilación I Robot (1950).
- 2 ) Robot Visions (1990). Recopilación de 34 cuentos cortos de robots, 7 de ellos coincidentes con los de The Complete Robot.
- 3 ) The Caves of Steel (1954). Primera novela de robots humanoides, transcurre en la Tierra, en el siglo 47, cuando la colonización de la galaxia estaba estancada en 50 planetas. Se plantea, por primera vez, una solución al problema de su reanudación. Update: terminado de leer el 18/03/08.
- 4 ) The Naked Sun (1957). Segunda novela de robots. Con el mismo protagonista (Elijah Baley), puede considerarse una continuación de la anterior. Aparece por primera vez el planeta Solaria y una amenaza a toda la galaxia poblada.
- 5 ) The Robots of Dawn (1983). Tercera novela de robots.
- 6 ) Robots and Empire (1985). Cuarta novela de robots.
El Imperio Galáctico
A veces denominado el Tríptico del Imperio, consta de las siguientes novelas:
- 7 ) The Stars, Like Dust (1951). El último de los 1099 planetas colonizados, Tyrann, inicia la colonización de los sistemas de la Nebulosa Cabeza de Caballo. Son los primeros balbuceos para la formación del Imperio Galáctico.
- 8 ) The Currents of Space (1952). La expansión de la Confederación de Trántor, con sólo cinco siglos de existencia, abarca ya la mitad de la galaxia con un millón de planetas habitados.
- 9 ) Pebble in the Sky (1950). La historia transcurre en la Tierra, más de 50.000 años después del comienzo de la colonización humana de la galaxia, cuando ya se ha olvidado que fue el planeta que la inició.
Ciclo de la Fundación
- 10 ) Prelude to Foundation (1988). Primera novela sobre La Fundación.
- 11 ) Forward the Foundation (1993). Segunda novela sobre La Fundación.
- 12 ) Foundation (1951). Tercera novela sobre La Fundación.
- 13 ) Foundation and Empire (1952). Cuarta novela sobre La Fundación.
- 14 ) Second Foundation (1953). Quinta novela que con Foundation y Foundation and Empire, constituyen la clásica Trilogía de la Fundación. Esta trilogía fue originalmente publicada por entregas (no son relatos cortos) en la revista Astounding Science Fiction de John Campbell y galardonada con el Premio Hugo (1966) a "la mejor serie de ciencia ficción de todos los tiempos".
- 15 ) Foundation's Edge (1982). Sexta novela sobre la Fundación.
- 16 ) Foundation and Earth (1983). Séptima y última novela sobre la Fundación que finaliza la saga.
De Wikipedia.
Axxón es una revista electrónica de Ciencia Ficción y Fantasía. Tiene una increíble colección de cuentos, galería de arte, noticias y mucho más.
Axxón es un ezine argentino dedicado principalmente a la literatura de ciencia ficción, la fantasía y el terror.Creada en 1989 por Eduardo J. Carletti y Fernando Bonsembiante, Axxón fue la primera revista editada en soporte informático en habla hispana, destacándose además que se trataba de un programa ejecutable autocontenido, desarrollado independientemente por sus creadores. La principal inspiración para el surgimiento de este vehículo literario fue la fuerte crisis económica que atravesaba Argentina: la inflación mensual cercana al 200% hacía casi imposible cualquier nuevo proyecto de edición e impedía especialmente la aparición de los varios fanzines de ciencia ficción que habían empezado a surgir durante la década de 1980.
Originalmente el programa funcionaba en MS-DOS con una cantidad relativamente pequeña de páginas. Sucesivas mejoras en la compresión permitieron que en el reducido tamaño de un disquete de 360 kilobytes se pudieran incluir novelas completas con ilustraciones, como fue el caso de El Libro de la Tierra Negra, de Carlos Gardini, actualmente una novela impresa por medios convencionales pero que vio la luz por primera vez como un número especial de Axxón. Refinamientos posteriores permitieron la inclusión de mejores imágenes, sonido, conversión a una versión completamente gráfica y luego una versión que funcionaba bajo Windows, siempre con la idea de que todo el programa debía caber en un diskette (que para ese momento ya eran de 1,2 y 1,4 megabytes).
Axxón apareció durante nueve años invariablemente cada mes, superando el centenar de números, pero diversas circunstancias volvieron más irregular la preparación de los números ejecutables. Además, el acceso a Internet del público regular era más económico y fácil. Todo esto decidió a su director a darle un nuevo impulso a la publicación, transformando la página web de Axxón de punto de presencia para la bajada de los programas ejecutables en sede de un webzine sumamente activo.
Más en Wikipedia.
La imagen con la que adorno este post se titula Tempestad y es una obra de Raúl Cruz (Racrufi).
Para los que le interese:
Ya se puede reservar en la ciudad de Santa Fe una copia del séptimo libro de la saga de Harry Potter. Pueden pasar por Mauro Yardín Librerías y señarlo por $20. Al señarlo deben decidir si querrán una copia de tapas blandas (aprox. $60) o de tapas duras (aprox. $70).
Los libros podrán retirarse a partir del 21 de febrero a las 20 hs.
El viernes viajé a mi pueblo, llegué al rededor de las 10 de la noche y para las 11 ya estaba en la Fiesta Nacional de las Culturas.
El programa, como dice su sitio web, era:
Viernes 28 de diciembre: Espectáculos de Música y Danza de la región y las presentaciones de los Elencos de "Kumelén":
- Murga "Los Piamtados".
- Ballet Juvenil "Sueñero".
- "Por Vos", música popular.
- "Ballet Popular Sueñero".
- Perdón Tango", Carlos Pellegrini.
- "Casitango", Piamonte.
- "Intentango", El Trébol.
- "Andando", Carlos Pellegrini.
- "Nunamanta" ("desde el alma", en quichua), Piamonte.
- "Makipura" ("mano con mano", en quichua), El Trébol.
En el programa no parece haber nada fuera de lo común, artista prodigioso o número internacional que justifique viajar casi 4 horas un viernes por la tarde. Sin embargo tenía una razón.
La semana anterior mi amigo Juan Manuel me había invitado a escucharlo cantar. El grupo del que forma parte se llama Canto Grupal y no es una banda de rock, un coro gregoriano o una escuela de canto. Es un grupo de gente que se junta a cantar por que les da placer, por que les gusta.
En mi opinión fue lo mejor de la noche. No por que sus voces sean excelentes, el acompañamiento de guitarras ejemplar o la afinación perfecta. Sino por que se trataba de una fiesta de la Cultura, y esa es justamente una de las mejores definiciones de Cultura: personas expresándose por placer.
Podés cantar, escribir o dibujar. O lo que se te ocurra, pero no dejes de expresarte.
Y así termina la reflexión del día, dejando la web para trabajar un poco en mis cuentos y escuchando a León Gieco.
Usando GIMP y el complemento que permite crear plug-ins en Python podemos hacer manipulación a bajo nivel de los pixels de una imagen.
PixelRegion permite realizar una abstracción sobre una imagen de forma tal de verla como una región de pixeles. Cada posición x,y de la región corresponde a un pixel de la imagen. En el caso de las imágenes RGB, cada pixel tiene 3 valores. En Python-Fu estos valores son representados con un string de 3 caracteres en el que cada caracter es uno de aquellos que tiene su número de orden (función ord) entre y 255.
Los siguientes ejemplos son una demostración sencilla de como trabajar con PixelPerfect para manipular imágenes. En el primer ejemplo se leen los valores de algunos de los pixeles de la imagen y en el segundo se escriben otros.
La siguiente imagen de 5x5 pixeles (ampliada) será usada para este ejemplo:

Imagen original
La función pixel es la que se ejecutará cuando ejecutemos el plug-in creado para este ejemplo. No se ingresan parámetros desde la interfaz gráfica del mismo, pero la función recibe 2 argumentos. Objetos que representan la imagen y la capa (layer) a procesar.
def pixels(img, layer):
w = layer.width
h = layer.height
pr = layer.get_pixel_rgn(0, 0, w, h)
print "Valores de los pixeles de las esquinas de la imagen"
r,g,b = pr[0,0]
print [ord(x) for x in r,g,b]
r,g,b = pr[0,4]
print [ord(x) for x in r,g,b]
r,g,b = pr[4,0]
print [ord(x) for x in r,g,b]
r,g,b = pr[4,4]
print [ord(x) for x in r,g,b]
layer.update(0, 0, w, h)
layer.flush()
gimp.displays_flush()
El ejemplo es sencillo y lo que hace es instanciar una PixelRegion tan grande como la capa (layer). Luego los diferentes pixeles de la misma pueden accederse mediante sus coordenadas: pr[x,y].
Se muestran los valores RGB de cada uno de los puntos del ejemplo.
Código fuente: pixels-read.py
En una porción de código que empieza de forma similar a la del ejemplo anterior podemos ver que una vez que hemos obtenido la PixelRegion que nos interesa, podemos escribir pixeles en ella.
El siguiente ejemplo aplicado sobre la imagen del ejemplo anterior dibuja una equis amarilla:
def pixels_write(img, layer):
w = layer.width
h = layer.height
pr = layer.get_pixel_rgn(0, 0, w, h)
yellow_rgb = (255,255,0)
yellow_str = chr(yellow_rgb[0]) + chr(yellow_rgb[1]) + chr(yellow_rgb[2])
for i in xrange(5):
pr[i,i] = yellow_str
pr[4-i,i] = yellow_str
layer.update(0, 0, w, h)
layer.flush()
gimp.displays_flush()

Imagen procesada con el código del ejemplo 2
Código fuente: pixels-write.py
No tengo fotolog, álbum en Internet o incluso cámara digital de fotos :) Pero gracias a que Meli y César trajeron sus cámaras el 20 pasado durante mi cumpleaños puedo decorar este rincón de la web con algunas fotos lindas. Incluyo las que estuvieron mejor tomadas tratando de que aparezcan todos.
Pablo, Ema, Bruno, Ale y Luis

Pablo y Ale

Nico y Juanjo

Juanjo y Luis

César preparando su famoso Ananá Fizz cacero

Mary y Luci
Gonza, Nico, Luis, Santi, Juanjo, Emi, Ale, Ema y Ceci
Ceci, Flor, Juanjo César, Manu
Ceci, Flor, Ale, Juanjo, Barby, Ale, Pablo y Celeste
Lau, Meli, Ceci, Barby, Ale, Cele, Juanjo, Ale, Palbo
Meli, Juanjo, Ceci, Ale y Ema
Con las hermanas Puccinelli
Con Mary
Retoques fotográficos con The GIMP. 
1. Cada padre contribuye con 23 cromosomas al ADN de un niño.
2. Toma 23 segundos que la sangre circule por todo el cuerpo.
3. En los humanos, el cromosoma número 23 es el que determina el género.
4. Hay 23 letras en el alfabeto latino.
5. Julio César fue apuñalado 23 veces cuando fue asesinado.
6. El eje de la tierra está a 23.5 grados.
7. El Templo de los Caballeros contaba con 23 Grandes Maestros.
8. William Shakespeare nació el 23 de Abril de 1564.
9. William Shakespeare murió el 23 de Abril de 1616.
10. Los antiguos calendarios egipcios y sumerios comienzan el 23 de Julio.
11. El Titanic se hundió la mañana del 15 de Abril de 1912 (4+1+5+1+9+1+2 = 23)
12. Los Mayas creían que el mundo terminaría el 23 de Diciembre de 2012 (20+1+2= 23)
13. La compañía de producción de Jim Carrey se llama JC23 Entertainment.
14. John Dillinger robó 26 bancos, pero sólo 23 por dinero.
15. La distancia del centro de Marte hasta su luna más cercana es de 23,500 km.
16. 230 pasajeros murieron en el vuelo de TWA número 800.
17. Kurt Cobain nació en 1967: 1+9+6+7 = 23.
18. Kurt Cobain murió in 1994: 1+9+9+4 = 23.
19. La Revelación se comenzó a filmar el 23 de Enero de 2006.
20. Las letras en los nombres Joel Schumacher y Jim Carrey suman 23 en total.
21. Las letras en los nombres Virginia Madsen y Jim Carrey suman 23 en total.
22. Charles Manson nació el 12 de Noviembre (11 + 12 = 23)
23. Número 23 se estrenó en EEUU el 23 de febrero de 2006.