Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

Agua Mineral

Cuando nadie deja de aplaudir, repito mi última canción.

Toco y canto, Agua Mineral


Código Secreto (juego)

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 :).

Menú

Secret Code-Menu

Las reglas

Pantallazo-Secret Code-Reglas

Jugando

Secret Code-Jugando

Una jugada ganadora

Secret Code-Ganando

Créditos

Secret Code-Creditos


Una experiencia en PythonBugDay

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 sol desnudo

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 :)

Asimov es un pícaro

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.

Saga de la Fundación

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.


¿Conocías Axxón?

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.

Tempestad de Raúl Cruz (Racrufi)

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).



La cultura es

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":Fiesta Nacional de las Culturas
  • 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.


Manipulación de pixels con Python-Fu

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

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.

Ejemplo 1 (lectura)

La siguiente imagen de 5x5 pixeles (ampliada) será usada para este ejemplo:

5×5 pixel image

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

Ejemplo 2 (escritura)

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()

5×5 image with yellow pixels

Imagen procesada con el código del ejemplo 2

Código fuente: pixels-write.py

Links


Algunas fotos de mi cumple n° 23

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

0010.jpg

Pablo y Ale

0016.jpg

Nico y Juanjo

0019.jpg

Juanjo y Luis

0041.jpg

César preparando su famoso Ananá Fizz cacero

0043.jpg

Mary y Luci

100_2959.JPG

Gonza, Nico, Luis, Santi, Juanjo, Emi, Ale, Ema y Ceci

100_2968.JPG

Ceci, Flor, Juanjo César, Manu

100_2971.JPG

Ceci, Flor, Ale, Juanjo, Barby, Ale, Pablo y Celeste

100_2974.JPG

Lau, Meli, Ceci, Barby, Ale, Cele, Juanjo, Ale, Palbo

100_2976.JPG

Meli, Juanjo, Ceci, Ale y Ema

100_2966.JPG

Con las hermanas Puccinelli

100_2980.JPG

Con Mary

100_2983.JPG

Retoques fotográficos con The GIMP. La mascota de GIMP


23

23Hoy cumplo 23 años de edad :) No sabías? No me saludaste? No te hagás drama! ..siempre y cuando dejes un comentario aca.

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.