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

FLISoL 2007 en Santa Fe

Este sábado se llevó a cabo enmás de 160 ciudades de 17 países el 3º Festival Latinoaméricano de Instalación de Software Libre. Lo que sigue es mi apreciación personal del evento, para información sobre el evento en Santa Fe visitar: FLISoL 2007 en la web del LUGLi.

El sábado 28 empezó temprano, a la 6:30 am sonó el despertador de mi celular y el hecho de haberme acostado solo unas 5 horas antes se sintió en mi cuerpo. Uno es siempre más valiente cuando pone el despertador que cuando este suena. Pero hoy tenía que levantarme, arriba.

Le había dicho a César que a las 7:00 am iba a estar en su casa para imprimir algunos carteles que ibamos a necesitar ese día (como un mapa para pegar en la entrada de la facu indicando como llegar al alboratorio donde ibamos a estar realizando las instalaciones). 7:01 golpeo las manos en la puerta de la casa amarilla. Luego de aplaudir recojo lo que había depositado en el suelo para liverar mis manos: u na bolsa con CDs de Ubuntu y un embace de capuccino instantaneo, ese día no desayunaba en casa.

Mientras algunas cosas se imprimían y tomaba mi desayuno me puse a navegar en Internet con la notebook que césar se había comprado un par de días antes. Desde la web del festival llegué a un sitio peruano con canciones muy divertidas. (Para saber de que les hablo no dejen de entrar a http://pero.flisol.net, esperen unos momentos y escucharán una canción, luego entren a la sección Audio para escuchar un spot publicitario).

La hora de encuentro era 8:00 am, como para acomodar el laboratorio. A eso de las 9:30 am eramos muchos los miembros del LUGLi listos para nuestro trabajo y a esa hora empezó a llegar gente. Algunos no sabían nisiquiera que se hacía ahí, habían llegado para escuchar, para ver e que se trataba. Otros, más aguerridos, llegaban con sus computadoras bajo el brazo, luego de subirla 3 pisos por que el asensor dejaba de funcionar por ráfagas.

En el pizarrón del laboratorio escribimos:

  • Instalaciones:
    • Exitosas: 0
    • Fallidas: 0

Y empezaron las instalciones! Mucha gente llegó por la mañana y contrariamente a lo que nos imaginábamos, otro tanto calló a la tarde. El final de nuestro tanteador fue:

  • Instalaciones:
    • Exitosas: 14
    • Fallidas: 2

Lamentablemente no pudimos cargar estos datos en el sistema oficial del festival, no se si luego podremos :(

Siguiendo un poco con el balance, nos pareció un día exitoso, lo pasamos bien y mucha gente se fué contenta a su casa son Software Libre en su computadora. Espero que los asistentes pienen lo mismo que nosotros.


Probando ScribeFire

Este post es solo una prueba de ScribeFire, un plug-in para Firefox que permite escribir artículos sin necesidad de utilizar la interfaz web de nuestro blog (WordPress en mi caso).

Mmm no tiene un botón more para separar la introducción del resto del post?


N-Puzzle

Hace unos días mandé a la lista de correos de PyAr una implementación inicial del juego N-Puzzle. n-puzzle-0.1.tgz.

Es muy sencilla. Toma una imagen, la parte en cuadraditos, quita uno de los cuadraditos y los mezcla. Luego uno puedo deslizar los cuadraditos adyasentes al espacio en blanco con las flechas de teclado. El objetivo del juego es recomponer la imagen original.

N Puzzle 0.01
Hoy estuve mejorando el código y agregándole una funcionalidad que permite que la computadora resuelva el problema (o nos ayude a hacerlo).La idea original para este programa es luego utilizarlo para probar los métodos de búsqueda que estamos estudiando en Inteligencia Artificial.

Ojo! Si bien en esta nueva versión apretando la tecla 'S' entramos y salimos del modo Auto Solve, no estoy usando IA para implementarlo. Siempre pueden mirar el código y ver como lo estoy haciendo :)

Actualmente el juego está planteado como una prueba de concepto más que como un programa totalmente usable. Esto implica que pueden ocurrir errores durante su ejecución y que algunas opciones que podrían ser configurables están clavadas en el código:

  • N es el número de fichas que participan del juego: 8 (en un tablero de 3 x 3), 15 (en uno de 4 x 4), 24 (en uno de 5 x 5). Por defecto es 8 pero puede cambiarse en el archivo run.py.
  • La imagen que se usará para generar las fichas se llama ejemplo.jpg y debe estar en el mismo directorio que los scripts (yo proveo una). Pueden pisarla con otra imagen o pueden cambiar la ruta a la misma en el archivo run.py. La imagen debe ser de 600 x 600 pixeles.
  • El desordenamiento original del tablero se efectua mediante un número X de movimientos. En el código fuente el valor usado es 20 pero puede cambiarse en el método __init__ de la clase Puzzle en el archivo puzzle.py (van a encontrarlo en la llamada al método _shuffle).

El puzzle resuelto se ve así:

N Puzzle solved
La última versión puede encontrarse en: files/python/n-puzzle-0.1-1.tgz.Y este es el CHANGELOG de mi primer intento a este segundo mejorado:
0.1-1: mix(x,y) se realiza ahroa como x,y = y,x en lugar de usar una variable temporal. Cada Card tiene un cid (Card ID), un par i,j correspondiente a su posición original en el tablero. El desordenado del tablero se realiza mediante el movimiento aleatorio de las piezas (usando los métodos up, down, right y left) para evitar que el juego comience con una configuración que no tiene solución (Para un ejemplo, Google: 14-15 Puzzle). Apretando la tecla 'S' se entra y sale del modo 'Auto Solve' en el cual la computadora nos ayuda a resolver el juego. Atención: NO IA was used in this feature.

Requiere Python y PyGame. Si tienen problemas para instalarlos mandenme un mail y los ayudo.



Shuffle un diccionario en Python

El módulo random de Python tiene varias funciones muy útiles.

>>> import random

Cómo choice, que permite elegir un elemento al asar de una secuencia:

>>> lista = [1, 2, 3, "hola", 'q', '$', 0]

>>> random.choice(lista)

1

>>> random.choice(lista)

0

>>> random.choice(lista)

3

>>> random.choice(lista)

'q'

>>> random.choice("Esta es una oración muy interesante")

'E'

>>> random.choice((1,2,3,4))

3

O shuffle, que desordena una lista (in place, es decir que no retorna una lista desordenada sino que la misma es desordenada):

>>> random.shuffle(lista)

>>> lista

[3, 1, 0, 'hola', '$', 'q', 2]

>>> texto = "Esto es una pruba con SHUFFLE"

>>> random.shuffle(texto)

Traceback (most recent call last):

File "<stdin>", line 1, in ?

File "/usr/lib/python2.4/random.py", line 262, in shuffle

x[i], x[j] = x[j], x[i]

TypeError: object does not support item assignment

Obviamente ni a tuplas ni a strings se puede aplicar esta función ya que esos dos tipos de datos son inmutables.

Me encontraba yo programando y se me ocurrió que podría desordenar (shuffle) un diccionario para lograr cierto efecto. ¿Cual sería la semántica de esto? Seguro se entenderá mejor con un ejemplo, dado el diccionario:

{0 : "cero", 1 : "uno", 2 : "dos"}

que tiene números como claves y strings como valores, luego de que se le aplique la función shuffle

random.shuffle(dicc)

Se obtendría por ejemplo:

{0 : "uno", 1 : "dos", 2 : "cero"}

Bien, probémoslo en el REPL de Python:

>>> from random import shuffle

>>> lista = [1,2,3,4,5,6,7,8]

>>> shuffle(lista)

>>> lista

[4, 1, 7, 8, 6, 2, 5, 3]

>>> dicc = {}

>>> for a in range(8):

dicc[a] = a

>>> dicc

{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7}

>>> shuffle(dicc)

>>> dicc

{0: 1, 1: 4, 2: 7, 3: 6, 4: 2, 5: 5, 6: 3, 7: 0}

Mmm, parece que funciona. ¿Qué dicen uds? El del último ejemplo no es en realidad el diccionario que uso en mi programa, sino que es más bien algo así:

>>> dicc = {(1,1): "primero", (1,2): "segundo", (2,2): "otro"}

Intentamos mezclarlo y..

>>> shuffle(dicc)

Traceback (most recent call last):

File "<stdin>", line 1, in ?

File "/usr/lib/python2.4/random.py", line 262, in shuffle

x[i], x[j] = x[j], x[i]

KeyError: 2

¿Qué pasó? La respuesta a este raro comportamiento está en el código mismo de Python, en el módulo random. En mi instalación de Python2.4 en Debian GNU/Linux lo encontramos en: /usr/lib/python2.4/random.py

def shuffle(self, x, random=None, int=int):

"""x, random=random.random -> shuffle list x in place; return None.



Optional arg random is a 0-argument function returning a random

float in [0.0, 1.0); by default, the standard random.random.

"""



    if random is None:

        random = self.random

    for i in reversed(xrange(1, len(x))):

    # pick an element in x[:i+1] with which to exchange x[i]

        j = int(random() * (i+1))

        x[i], x[j] = x[j], x[i]

Sólo de ver la implementación se nota que solo funcionará con listas. La siguiente es mi alternativa, una función shuffle_dict que sirve para mezclar los elementos de un diccionario:

from random import choice



def shuffle_dict(d):

"""Shuffle the d dict."""

    for i in d.keys():

        k = d.keys()

        k.remove(i)

        j = choice(k)

        d[i], d[j] = d[j], d[i]



Felices Pascuas!

Amigos! Quiero desearles a todos unas Felices Pascuas!


Rocky VI

La sexta (y última?) película del boxeador Rocky, el semental italiano, Balboa.

La película la hizo Stalone y se juegó a eso. A que a los tipos como yo que les gusta Rocky les iba a gustar, pero es más o menos nomás la pelicula.

A.G.

¿La vieron? ¿Les gusto? ¿Y eran Rocky-fans?

A mi, sin ser de los más fieles seguidores de Balboa me gustó. Ideal para un domingo a la siesta.


La Matrix se colgó

Hola! Soy Juanjo Conti. Tal vez me recuerden de críticas cinematográficas como El código Da Vinci no compila o Desenmarañando Spiderman. Hoy me acerco a la revista de sus video clubs (si, tal vez con un par de años de atraso) para criticar las secuelas 2 y 3 del film The Matrix (Reloaded y Revolutions).

The Oracle cita, "Every thing that has a beginning, has an end". Esto es más bien del tipo End, así que vamos por su Beginning:

The Matrix, 1999

Una de las mejores formas de criticar es alabar a otro. Así que usemos, entre otras y para comenzar, esta técnica. Corría el año 1999 cuando esta película de los hermanos Woachosky (no esperarán que lo escriba bien, no?) salía a las calles. Por su puesto en ese año yo no me enteré de su existencia ni le pasé cerca, fue por eso imposible que la vea en cine (cosa que sí hice con sus secuelas.. parafraseando a Morfeo: al parece el destino no carece de sentido del humor).

No fue hasta el año 2000 o 2001, cuando mi amigo Joel me invitó a verla en su casa, que me enteré de la existencia de esta película. Me acuerdo que me dijo (que le habían dicho sobre la película) sobre la película algo así como que las personas vivían dentro de las máquinas... Yo me imaginé a unos robots tipo tanques, grandes, con alguna cápsula de vidrio dentro de la cual se podía ver a una persona inconciente con cables conectándola a la máquina.

Cual fué mi desilución cuando luego de una hora de película no habíamos visto ni a uno de estos robots! La trama era entretenida, pero nada de lo que nos esperábamos encontrar.. y entonces sucedió. Neo eligió la píldora roja y averiguó que tan ondo era el hoyo del conejo. Toda la pelicula nos calló encima con la fuerza de una de esas naves que manejaban. El mundo que creíamos conocer ya no era y las reglas aprendidas ya no valían.

Neo se enfrenta a la realidad (El desierto de lo real), le duelen sus ojos por que nunca antes los había usado, tiene agujeros en todo el cuerpo, sus músculos están atrofiados.. Y luego es entrendo, el salto, los cables, sigue conociendola (Trinity), y entonces está listo (I know kung fu). De ahí a una batalla que parecía perdida y a una victoria esperada solo había unos pasos.

Internet explotó. Miles de sitios webs con información sobre la película. Fotos, videos, errores, personajes, actores, juegos, remeras. Recuerdo haber leido el guión. Influyó en la moda, en otras películas, en programas de televisión, en obras de filosofía. Se hizo común reconocer por la calla, y en especial en las grandes ciuiades, a los fans que andaban todos vestidos de negro. Se hablaba de la película en listas de correo especializadas de tecnología, ciencias y religión. Se había convertido en una película de culto.

Domingo

Hace unos día, domingueando, alquilé Matrix Reloaded y Revolutions. No las había visto desde que salieron en el cine, pero como hace unos días empezaron a pasar Reloaded en la tele y no pude verla, aproveché para verlas y darme el gusto.

Reloaded

Con la euforia todavía viva en los seguidores de The Matrix y las espectativas creadas a su alrededor salió Matrix Reloaded, se segunda parte de la saga (que según los directores era una trilogía desde el comienzo.. tengo mis dudas). Fuí a verla al cine.

La verdad es que no fue la que más me gustó. No llenó mis espectativas. Más allá de la entrada de Trinity en el segundo cero de la película el resto no me gustó mucho. De todas las cosas que no me gustaron, la que menos fue que Neo tenga sus super poderes fuera de la Matrix.

No me gustaron las burdas referencias sexuales (de almenos 2 oportunidades) de la peli, e incluso me parecieron innecesarias en la historia.

El frances: -0. Causalidad? Todo empieza con una elección.

Su mujer: +0. Actriz italiana, poca letra.

The Key Maker: el mejor, lejos. El verdadero hacker de The Matrix. Un heroe incluso, ya que muere por su causa.

Revolutions

Indudablemente superior a su predecesora. Neo comienza la película en una estación de trenes (Limbo) entre el mundo real y el virtual. Tiene una interesante charla con un hombre indú sobre las palabras y su significado.

Sati, la niña indú. Me calló muy bien, se lleva los aplausos (el personaje y la pequeña actriz).

El Ferroviario: -1. Unfriendly user interface para un programa que vincula el mundo real con el de la Matrix.

Guerra. Esa es la plalabra que describe a esta película. La entra de Morfeo, Trinity y el ponja (otro nombre que no recuerdo en este momento) al Infierno.

.. has an end. La batalla de los humanos contra las máquinas en Zion (de las dos películas la escena que más puede emocionar a alguien). La pelea final entre Neo y el (ex) Agente Smith (muchos efectos especiales, poco realismo).

End

La Matrix se colgó. El final de la historia (las partes 2 y 3) no fue lo que podría haber sido. Una lástima :(

Sigan al conejo blanco!


Mirá esta película

Una de las ventjas de alquilar DVDs en el Video Club de mi pueblo --dónde no se conoce lo que es un DVD original y muchos están pésimamente grabados, sin menú, sin selección de idioma, sin nada-- es que se pueden conseguir películas que todavía no se extrenaron en el cine al que voy (en Santa Fe).

Es el caso de Stranger than fiction, una de esas películas que terminás de ver con una sonrisa en la cara. Un heroe con cara de tonto, una chica linda compartiendo con él escenas y una trama muy original.

Harold Crick es un auditor del Servicio de Rentas Internas, se levanta cada mañana gracias a la alarma de su reloj, come solo, cuenta el número de pasos a su trabajo, y cepilla sus dientes exactamente 76 veces (38 verticalmente, 38 horizontalmente).

¿Qué harías si durante uno de tus días una voz empezara a narrar tu vida como si estuviesen en una novela? ¿Qué tal si cuando estás por cruzar la calle y pedís la hora para ajustar tu reloj la voz de la narradora dice: "Él no sabía que este acto aparentemente inofensivo simple daría lugar a su muerte inminente"?

Si quiren saber que haría Harold Crick no dejen de ver Stranger than fiction (Más extraño que en ficción)!

¿Alguna vez te recomendé una película mala? ;-)