Novedades: actualmente estoy impulsando el proyecto Argentina en Python, desde aquí (ver mapa)

Python más rápido que Java

Note

Este post no es el original, sino una migración de Wordpress a Nikola. Si no se visualiza correctamente, podés ir al original (en Wordpress) haciendo click aquí

image0

Con un título de post robado de la charla de Facundo Batista y Lucio Torre ("Python más rápido que C") empiezo un post para comentar los resultados que fui obteniendo a lo largo de la implementación de un árbol de búsqueda trie, para el desarrollo de un trabajo práctico de la facultad.

Una parte del trabajo consiste en crear una función de autocompletado, esto es, a medida que el usuario vaya tipeando letras en un editor de texto, se despliegue una lista con todas las sugerencias que coinciden con la cadena de teclas tipeadas. Por ejemplo, si el usuario va tipeando "automovi", el programa sugiere las palabras ["automovilístico", "automovilismo", "automovilista"] (la lista de todas las palabras son previamente cargadas desde un archivo de texto plano).

Con mi equipo intuíamos que esto se hacía con un árbol, ni idea porqué, pero pensábamos que era mejor que hacer una lista con todas las ocurrencias y filtrar por "startswith()" (empieza con), ya que de esta forma estamos recorriendo toda la lista, y el proceso se alentecería bastante. Asique opción descartada definitivamente... Aunque... ¡Aunque nada, y listo

Luego seguimos leyendo el trabajo, y decía: "La cantidad de palabras en los diccionarios puede ser grande, por lo cual se recomienda que la selección de la palabra actual se realice mediante una referencia a una estructura arbórea, y que no se cree una lista con todas las palabras posibles, ya que la ineficiencia de esta opción puede notarse en una aplicación interactiva como la que se pretende desarrollar". Por lo que no descubrimos nada con lo que intuíamos, pero por lo menos nos dimos cuenta que no estábamos equivocados...

El primer día que nos juntamos con Guille, mi compañero de grupo junto a Iván, aunque éste último se encontraba ausente debido a que estaba en su ciudad (¿natal?), nos pusimos las pilas pensando cómo iba a ser la estructura de datos que queríamos crear y cómo podíamos luego buscar las coincidencias con respecto a lo que tipeaba el usuario.

Sin ningún tipo de estupefaciente encima, ni siquiera cerca, empezamos a delirar varias ideas, árboles, listas, diccionarios, pilas, colas, mates y música volaban por todos lados. Pero ninguna de todas las ideas nos convencía.

A todo esto estábamos en la tarde del Miércoles de esta semana en la pileta de mi casa pensando estas cuestiones con un infiltrado en el grupo (Nico). Aunque ya habíamos trabajado a la mañana corrigiendo algunas cosas del trabajo anterior, que pensábamos que podían llegar a estar mal. La idea que fue más acertada por los tres, fue la de tener en cada nodo una lista con todos sus hijos, además de un caracter (que componía una de las letras de la palabra), y una marca indicando si en ese nodo terminaba una palabra o no.

Según algunos comentarios de Nico en su computadora la carga del diccionario.txt de unos 800Kb aproximadamente en una estructura le llevaba algo así como 5min, ¡Una guasada! Lo que en gran parte fue el comienzo de esta investigación.

Hicimos algunas cosas más (perdimos un poco de tiempo), y nos pusimos a codificar algo con el Guille. No llegamos a nada concreto, ni siquiera pudimos terminar de pulir la idea que teníamos. Él se fue y yo me quedé con la espina en el ojo de que cómo no podíamos implementar un árbol, si ya lo había hecho en ocasiones anteriores... Bueno, pasó y me fui a dormir.

Al otro día cuando me levanto, me voy derecho al canal IRC de PyAr, sabiendo de ante mano que tienen muy buena onda y que seguro alguno me iba a tirar alguna pista de cómo implementar un árbol de este tipo, por lo menos en Python. Lo que más necesitaba era saber si la idea que teníamos estaba más o menos acertada, sobre todo para no empezarme a pelear con Java sin saber si lo que estoy haciendo va a funcionar o no.

Me tiraron varias ideas teóricas, conceptos, material para investigar (que busque en google;)) y demás, hasta que Facundo mandó una implementación de esa estructura arbórea que yo necesitaba en Python. Él implementó algo muy parecido a lo que teníamos pensado pero cambiando algunas cosas, por ejemplo, en vez de listas utilizó diccionarios y algunas otras cuestiones que permite Python. La cuestión es que me hizo entender muy bien el funcionamiento de éstos árboles y lo rápido, fácil y útil que es Python para crear prototipos de cualquier cosa.

Lo primero que probé fue cargar todo este archivo con la implementación que hizo Facu (en el link anterior ya tiene las modificaciones que le hice yo). Lo cargó enseguida, demoró 5.12 segundo, que comparado con los 5 minutos de los que veníamos manejando con Nico, no era nada. Hice una búsqueda y funcionó. Pero pasaron algunas cosas, por ejemplo el programa en memoria estaba ocupando 185Mb de ram y 100Mb de memoria virtual, lo que es ¡Una locura!. Igualmente no molesté más a la gente de PyAr hasta que implemente mi versión en Java y podamos comparar tiempos de ejecución, de carga, de búsqueda y demás porque quizás esto era ¿aceptable?.

Luego de hacerlo en Java después de algunas peleas con los tipos de datos, partiendo de que no encontraba cuál era la clase de diccionarios ya que está Dictionary, pero esta es abstracta, por lo tanto no puedo tener instancias de estas. Así seguí bajando por el árbol de herencia hasta llegar a la clase Properties. Ni idea si esto es un diccionario o no, pero lo hice con esta clase y funcionó por lo menos...

Terminé de codificarlo todo, el código resultante quedó así (la implementación en Java) y los tiempos para "cargar las palabras del diccionario al árbol" y "cargar el árbol y realizar una búsqueda" son estos. El comando time está ejecutado tres veces por cada operación. Una vez que el programa carga todo el árbol en memoria, este ocupa 108Mb de memoria ram física y al rededor de 180Mb de memoria de intercambio algo similar a lo que ocupaba el programa hecho en Python. Asique estaba conforme con ambas implemenetaciones hasta el momento.

"La primera versión que había hecho del programa en Java ocupaba sólo 20Mb en memoria, lo cual me sorprendió mucho cuando ví. Pero que luego de unas correcciones pasó a parecerse a la implementación hecha en Python" ;)

En este momento dejé un comentario en el foro de la materia explicando esta situación, comentando de que habíamos creado esta estructura y que seguro que el programa iba a ser muy lento a la hora de mostrar las sugerencias en la lista de posibilidades. Pero hasta el día de hoy no he tenido ninguna respuesta :( .

Comenté en el canal de PyAr que me parecía raro que el programa ocupara tanto en memoria en comparación con la incorrecta implementación del mío :D (que en este momento desconocía) y Facundo mejoró su código agregando __slots__ para que la clase sepa cuanta memoria reservar de ante-mano. Y el programa pasó a ocupar como 80Mb menos en memoria, lo cual es bastante menos.Interesante.

Hoy, tres días después de haber pensado que era una locura meter todas las palabras y hacer startswith, me puse a implementar esta forma de encarar el problema, para luego llevarme una sorpresa **gigante.**

El programa para la carga y búsqueda lo hice en Python, ya que quería ver resultados rápidos, y Python para esto viene al pelo. Ni bien terminé de hacerlo corrí la aplicación cargando el árbol y nada más, en dónde veo que esta carga estaba demorando solamente 0.13 segundos como mucho, lo que no se compara con la carga del árbol que era 5.12 segundos con el algoritmo de Facundo también hecho en Python y 2.6 segundo que demoraba el mío hecho en Java. Entonces ¿es mejor utilizar listas que árboles para esto? El programa en Python con una lista en vez de un árbol es este.

Por ahora estoy bastante mareado con todos los resultados que obtuve. En el canal de PyAr me dijeron que quizás no importe tanto el tiempo que demore en cargar el diccionario ya que esto se hace una sola vez, lo que más importa es el tiempo de búsqueda de concordancias... Pero el resultado promedio que obtuve con esta implementación buscando 100 palabras aleatoreas:

[manuel] [~/blog/python-mas-rapido-que-java]$ python lista.py

En cargar: 0.07 seg

Cantidad de palabras a buscar: 100

Busq x palabra: 41.96 mseg

[manuel] [~/blog/python-mas-rapido-que-java]$

Cuanto tenga menos dudas o esté seguro al menos de cómo lo voy a desarrollar y qué estructura de datos voy a usar para hacer esto escribo cómo y qué hice :P


Pidiendo CD's por embarque

Note

Este post no es el original, sino una migración de Wordpress a Nikola. Si no se visualiza correctamente, podés ir al original (en Wordpress) haciendo click aquí

image0

Apenas me enteré que se podían pedir los nuevos (ya no tanto) CD's de Ubuntu Gutsy Gibbon por ShipIt, me pedí algunos. 10 si mal no recuerdo.

Después de volver de CaFeCONF y ver que Hugo Ruscitti en su charla de Python y Pygame entregó unos discos de un Ubuntu modificado para contener algunos programas extras como ser los juegos desarrollados para PyWeek, Pygame, y demás; se me ocurrió dar una charla en mi facultad sobre Ubuntu: el proyecto, la comunidad, etc. para hacer conocer a todos los ingresantes, y algunos un poco más avanzados en la carrera, el mundo de Linux que muchos lo desconocen.

Pensé hacer un pedido algo grande, si se quiere, de unos 100 discos en total de Ubuntu y Kubuntu, para repartir en la charla luego de haber presentado a este sistema operativo y comentado algunas de sus características.

Asique fui a la página e hice el pedido. Tuve que hacer un special request indicando el motivo de tal pedido. Para esto tuve que indicar la cantidad de discos de Ubuntu y de Kubuntu que quería y responder a la pregunta: Why are you requesting these CDs? (¿Porqué estoy pidiendo estos CD's?) por lo que recurrí a mis escasos conocimientos de inglés tratando de explicar lo que comenté en este post.

Después de algunas semanas (o menos) entré al canal #ubuntu-ar en freenode.net y estaban hablando del tema, asique pregunté. Me dijeron que al hacer un pedido grande los CD's se quedaban en la aduana.

Pregunté a qué le llamaban grande y contestaron más de 15 o 20, lo que me sorprendió bastante. Y volví a la página para cancelar ese pedido y crear uno nuevo, por lo menos para que me lleguen algunos CD's a mí y poder redistribuirlo entre mis amigos.

Hoy entré a la página para ver en qué situación se encontraba todo esto, y me volví a sorprender. Del pedido grande (que yo había cancelado) me aceptaron 12 discos y del pedido que había hecho luego, para mí, me lo rechazaron... :P

¿Cómo puede ser que uno quiere aportar su granito de arena a la comunidad Ubuntu y lo frenen estas cosas? ¿De qué forma puedo hacer que me lleguen estos discos para presentar una charla en mi facultad? (ya que bajar la imagen de Ubuntu Gutsy y grabar 100 CD's tiene un costo bastante importante, al menos para mí)


Soda Stereo, Buenos Aires, Argentina

Note

Este post no es el original, sino una migración de Wordpress a Nikola. Si no se visualiza correctamente, podés ir al original (en Wordpress) haciendo click aquí

image0

El 2 de Noviembre pasado a las 10:40hs estábamos saliendo con Pancho para Buenos Aires con destino a Retiro. Llegamos a las 17hs, cansado de no haber podido dormir mucho en el viaje y por haber salido de gira la noche anterior. Ahí nos estaba esperando Karucha, que ya habíamos arreglado con él para que nos aloje cuándo íbamos para allá. Partimos para su casa en subte, tren, y después en auto (un viajesito).

Cuando llegamos, descansamos un rato, hablamos al pedo, nos bañamos y partimos para Adrogué, recorrimos un poco, me familiaricé con un cartel ;) (para mí era un muy buen punto de referencia) y después nos sentamos a comer una pizza y tomar algunas cervezas. Al terminar partimos para Lomas de Zamora, dimos algunas vueltas por esta y tomamos algunas que otras cervezas acá también. Después empezó a bajar / subir el sueño y el cansancio del viaje, asique volvimos para nuestroHotel (la casa de Héctor) a descansar para al otro día levantarse temprano.

Con Karucha habíamos hablado de ir a un evento sobre Videos Juegos en Capital Federal, pero comenzaba a las 13hs, por lo que no podíamos asistir ya que queríamos estar como a las 12hs en River haciendo cola así no ver el recital desde la otra punta. El sábado nos levantamos bastante tardesito y tomamos un tren hacia Constitución, y desde ahí un Subte a Retiro, para esta altura ya estaba un poco perdido con todos estos lugares... Incluso hasta hace poco pensaba que Karucha vivía en Lanús :D . A mitad de camino del subte lo perdimosa Héctor que se iba para la conferencia de videos juegos y nosotros seguimos viaje atrás de uno que tenía la remera de Soda Stereo así no nos perdíamos :P . Aunque al llegar a Retiro se esfumó.

Compramos unos sandwiches de milanesa y unos pebetes para el resto del día que teníamos que estar haciendo cola y el viaje que restaba (otro tren con destino a La cancha de River, no me acuerdo como se llama la estación). Cuando llegamos estábamos medios perdidos para dónde teníamos que caminar, pero llegamos enseguida a la cancha. Para nuestra desilusión, la cola no se hacía en la cancha sino que 4, 5 o 6 cuadras más por Avenida Libertador... Las caminamos y, como buenos argentinos que somos No nos colamos!, si, yo tampoco lo puedo creer, fuimos y nos tiramos bien de frente al sol, que para esa hora (2 de la tarde) estaba algo bastante picante y nosotros de pantalón largo...

Esperamos algo más de una hora y media, y luego se levantaron todos para empezar a caminar por la cola. Yo entre que me calzaba y demás, me iban a pasar por encima, asique me caminé una cuadra en pata tratando de no clavarme ningún vidrio y empezar el recital con el pié izquierdo. La cola frenaba, esperábamos un rato, avanzaba, frenaba, y así hasta el ingreso al estadio.

Cuando entramos a la cancha, no había demasiada gente (en comparación con lo que hubo después). Yo no entedía muy bien que hacía en la cancha de River, pisando su pastito, toda esa gente, que sé yo. Todavía no caía muy bien que en un par de largas horas iba a estar tocando Soda Stereo delante nuestro. Para matar el tiempo yo había llevado unas hojitas con el juego Sudoku, asique resolvía uno, miraba un poco la pantalla, miraba el estadio, hacía otro, miraba el cielo, hablaba con Pancho, miraba los aviones que pasaban, miraba cualquier cosa... Ya estaba bastante embolado ahí, pero ansioso por ver el recital, y ya me empezaba a cansar de estar sentado en chinito, me levantaba, me sentaba...

Luego la gente se paró y nos apretonamos todos adelante, ¿Poqué? Ni idea, para estar un poco más incómodos nomás, ya que ahora estábamos parados y apretados, y antes estábamos sentados y cómodos. A partir de este momento, cada tanto, pasaban *Los videos de Peter Capussoto*, para entretener a la gente y que no se altere gritando :) .

Pasó un largo tiempo más y al fin salió Soda Stereo, y empezó el pogo de verdad, en el que hay que saltar o saltar, porque sino terminas en el piso. El problema es cuando el de adelante no salta, los de atrás, del cosatado y de arriba ;) empujan y te comes al de adelante. En el primer quilombo casi pierdo la zapatilla, porque me quedó el pié atrapado entre toda la multitud de gente y no lo podía sacar.

Del recital las cosas que más me sorprendieron fueron las luces sobre todo, las pantallas que había detrás de ellos, la calidad del sonido (aunque al principio para mí estaba un poco bajo), la organización del recital, la gente que estaba dentro de todo tranquila, la cantidad de tiempo que tocaron (al rededor de 3 horas) y que salí ileso :) .

Al salir del recital, hacía un frío terrible (yo por suerte me había llevado un buzo, que por otro lado no sé cómo sobrevivió al recital, ya que en ningún momento me preocupé por este) y todavía teníamos un viajecito hasta Retiro, que era el punto de encuentro con Héctor, por dónde él nos pasaba a buscar con Marcela (su novia). Caminamos algunas cuantas cuadras por Libertador y de camino nos compramos algo para comer y tomar, nos sentamos a esperar el colectivo hacia retiro y cuando voy a mandarle un mensaje a Karucha, veo que tenía un mensaje de él que decía que vayamos a Libertador al 6000, si mal no recuerdo. Miro el cartel de la calle y decía: "Libertador 6000-6100" ¡Bingo! Estábamos ahí, le mandé un mensaje diciendo eso y enseguida apareció. Nos había ido a buscar hasta ahí con su novia, la verdad ¡Se pasaron! Gracias otra vez. Asique nos fuimos para su casa, nos bañamos, nos sacamos toda la transpiración (de los otros y nuestra) y nos acostamos para al otro día encontrarnos con Hugo.

Al rededor de las 11 a.m. sentimos las palmas de Hugo, indicando que había llegado. Nosotros todavía estábamos durmiendo, sinceramente no sé como hice para escuchar esas palmas, había quedado muerto la noche anterior. Con Hugo, Héctor y Pancho hablamos de Python, Pygame, del juego de damas que habíamos coordinado una vez para hacer entre los tres (del cuál hasta el momento no hice nada :( ), tiramos ideas, vimos algunos truquitos de Python, discutimos si Pygame era lento, etc...

Después comimos un asado buenísimo que había hecho el papá de Héctor, y a la tarde nos fuimos a una heladería muy buena (La Veneciana, si no me equivoco) en Adrogué, creo. Fuimos de shopping ;) y volvimos para preparnos para la partida hacia Retiro, comprar el pasaje, comer algo y pegar la vuelta para Santa Fé.

Otra vez, Marcela y Héctor, se pasaron y nos llevaron en auto hasta Retiro, y nos despedimos. Con Juan (Pancho) compramos los pasajes para las 00:30 del Lunes, y nos fuimos a recorrer un poco el centro y a comer en una galería. Volvimos a las 00:15 y vimos en la terminal un quilombo de gente, parece que se estaban peleando dos tipos, uno tenía toda la cara llena de sangre y le faltaban la mitad de los dientes, ahhh... Al subirnos al cole e instalarnos, a los dos minutos yo ya estaba entre dormido, cuando viene una chica y me pregunta si teníamos esos asientos ¡Ups! No, teníamos los 47 y 48, y estábamos en los 45 y 46 que eran los indicados por el chofer y los últimos de la parte de abajo. La cuestión es que no sé que pasó con esta gente pero hablaron con el chofer y nosotros nos quedamos en esos asientos.

A la mitad de mi sueño, me despierto por un ruido muyfuerte, no sé que había pasado, pero me volví a dormir. Un par de sueños adelante me despierto escuchando al chofer que nos decía que en el puente nos habían tirado una piedra y se había roto un vidrio, asique teníamos que esperar entre 30 y 40 minutos a que venga otro cole a rescatarnos. Pasado ese tiempo nos cambiamos de colectivo y salimos nuevamente para Santa Fé, Juan consiguió justo un Fluviales que salía para Paraná y se fue. Yo me tomé un colectivo a mi casa y me acosté a dormir :D , para levantarme hoy a las 14:45 y ponerme a redactar esto.

Lo que me quedó de la entrada:

image1


Recordando mi infancia...

Note

Este post no es el original, sino una migración de Wordpress a Nikola. Si no se visualiza correctamente, podés ir al original (en Wordpress) haciendo click aquí

image0

Hace un par de días que tenía ganas de jugar a algún juego pero sin tener que bootear mi PC en otro Sistema Operativo como hacía hace un tiempo atrás. De hecho, ahora no lo puedo hacer porque es el único que tengo instalado.

Buscando en Internet caí a un *blog* de juegos para Linux y me puse a ver algunos de los que se mencionan ahí. Hace un tiempo que estoy subscripto por RSS pero nunca me detuve a leerlo concientemente.

Leyendo un rato artículos viejos y recordando varios juegos a los que he jugado (no muchos supongo) en estos año, me acordé de cuando jugábamos en mi casa al "Day Of The Tentacle"(El día del tentáculo) que era para DOS y yo particularmente me partía la cabeza pensando qué podía combinar con qué. Mientras que mi a hermano (un par de años más grande), siempre se le ocurrían algunas cosas más razonables.

También jugué al "Monkey Island" en casi todas sus versiones, o por lo menos la 1, 2, 3... creo que la 4 también, pero ya era en 3D y no me gustó mucho, sinceramente no recuerdo bien. Otros como el "Full Throttle", definitivamente un juegazo, con el cuál pasába horas frente a la computadora tratando de descifrar qué era lo que había que hacer. Este juego lo tengo original, si, si, lo compré.

Me acuerdo de muchos otros juegos que jugábamos; nos juntábamos en casa la mayoría de los chicos del barrio (porque yo era el único que tenía computadora) y jugábamos al "Mortal Kombat" de a dos, pero esto siempre era motivo de peleas;)porque si apretabas muchas teclas juntas se bloqueaba el teclado y los jugadores quedaban caminando para un lado totalmente tildados (esto era un buen truco cuando te estaban matando :P ).

En realidad hay una cantidad de juegos, algunos que he revivido gracias a ScummVM, un emulador de los juegos de LucasArts, que conocí gracias a la gente del canal de IRC #ubuntu-ar. Este emulador es multiplataforma, asique conseguí algunos juegos y empecé a jugar primeramente al "Day Of The Tentacle", aunque lamentablemente se me terminó en pocos días. Sin embargo sigo afirmando que es un juegazo con todas las letras.

Uhhh cómo olvidar el "Flight Of The Amazon Queen", "Andá al humito, andá al humito", un juego que marcó mi nombre en todo Internet...

Lo único malo es que es algo complicado conseguir los ROMS que uno quiere, yo tuve que recurrir a redes privadas ya que con Google no pude conseguir todos los juegos que había jugado en mi infancia.

Estaba pensando en hacer un .torrent y compartir todos estos juegos porque creía que estos eran Abandonware, pero leí en Wikipedia que justamente LucasArts se niega a la redistribución de sus juegos antiguos ya que ellos mismos los siguien vendiendo supuestamente :( . Si leo en algún otro lado que esto se puede hacer, quizás lo haga, por el momentos no, al menos públicamente.