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

BDD y Números Romanos

Nota

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í

En la primera y última, hasta el momento, charla del LugLi en la UTN de Santa Fé Gastón mostró lo que es BDD (Behaviour Driven Development) aplicándolo en su lenguaje favorito (vaya uno a saber porqué) con RSpec. Lo que mostró y como dió la charla fue fantabuloso, nos engañó a todos de una forma increible, yo compraba.

Y finalmente... compré. Ayer me puse a buscar info sobre BDD en Google pero aplicado a Python, no encontré mucho, al parecer toda esta metodología es demasiado nueva y está muy verde. Finalmente caí en dos links que salen de la sección implementación de la página oficial de BDD. Uno se llama specipy, que no entendí para nada como se usa, ¡no hay doc!. Y el otro es un plugins para nose, y... justamente no sé lo que es que se llama pinocchio.

Seguí leyendo bastante, y preguntando qué me recomendaban hacer en la lista de PyAr y en el canal. No conseguí ninguna respuesta, no sé si nadie sabía, no lo utilizan o qué pasó. Después caí en el módulo doctest de Python, que sirve para probar comentarios como si fueran sentencias dentro del interprete. Está muy piola. Por ejemplo:

def suma(x, y):
  """Esta función devuelve la suma de los
  argumentos x e y
  >>> suma(2,4)
  6
  >>> suma(24,1)
  25
  >>> suma([2],[4])
  [2, 4]
  >>> suma([3], 5)
  Traceback (most recent call last):
  ...
  TypeError: can only concatenate list (not "int") to list
  """

  return x + y

if __name__ == '__main__':
  import doctest
  doctest.testmod()

Esto lo que hace es, cuando se ejecuta este módulo diréctamente se meten en el intérprete todos los comentarios que empiecen con >>> y se compara el resultado con lo que está inmediátamente abajo de esa línea. Si esta coincide, el test es válido.

Ahora para jugar un poco con esto, ya que quería ver cómo se siente tener que escribir cómo debe funcionar la aplicación y luego escribir el código, me puse a jugar con un ejercicio interesante: "Convertir números romandos a enteros, y viceversa". Abrí un archivo nuevo, lo guardé como .py y empecé a delirar.

Es medio raro escribir algo de texto y ver que no avanzás mucho, pero después cuando escribís la función ya estás seguro de que funciona :D , y no tenés que testearla manualmente, además en una me pasó que metí la pata y pasé de tener 1 Test Fail a tener 14, lo cual hizo que me de cuenta enseguida que había hecho cualquier cosa.

Todavía no me acostrumbro bien a hacer esto, a veces me desespero un poco y empiezo a tirar código a medida que voy haciendo las pruebas, o bien termino la prueba de una función y enseguida la escribo.

El módulo se puede descargar de acá y un ejemplo de su uso sería algo así.

>>> from roman import Roman

>>> Roman(2)

Roman('II')

>>> Roman('XI')

Roman('XI')

>>> Roman(2.5)

Traceback (most recent call last):
    ...
ValueError: float number is not support

>>> Roman('II') + 5

Roman('VII')

>>> Roman('XXI') * 2

Roman('XLII')

>>> Roman('X') + Roman('XV')

Roman('XXV')

>>> Roman('X') - 25

Traceback (most recent call last):
    ...
ValueError: result zero or negative

>>> Roman(25) + Roman(3995)

Traceback (most recent call last):
    ...
ValueError: result too long

Ahora bien, para qué carajo sirve sumar y restar números romanos no sé, si alguien le encuentra alguna utilidad... Bienvenido sea :)


Flisol 2008

Nota

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í

Hoy participé por primera vez en una Flisol. Este año se llevó a cabo en la UNL (Universidad Nacional del Litoral) de Santa Fé. Intenté ayudar con la organización a último momento, ya que no había mucho movimiento en la lista del Lugli, aunque igualmente no pude hacer mucho porque ya era demasiado tarde. Traté de colaborar con zapatillas, switch's, cd's y dvd's. Algo es algo...

Fui con Gustavo y con Pedro, dos de los integrantes en el desarrollo del juego para PyWeek 6, quizás a uno de ellos es más conocido por otra cosa: spaejemejem... Llevé mi máquina, sí, el CPU chiquito que tengo :) . Cuando llegué allá ya estaba Gastón, Emiliano, César, Juanjo y otros chicos más. Charlé un poco con cada uno y después, como no llegaba para instalar algún software me puse a hablar con Gastón sobre la charla que estamos preparando.

Empezamos a hablar, y de a poco se empezó a juntar gente a escuchar lo que decíamos sobre Ruby y Python (¿viste lo puse al revés? ;) ), cada uno con una opinión distinta y tirando algún que otro chiste, medio en joda medio en serio sobre cada uno de los lenguajes. Estuvo bastante entretenido.

Después nos pusimos a jugar un rato tirando algunos ejercicios para desarrollar en los dos lenguajes para luego probar tiempos de ejecución y también poder comparar algo de código, teniendo dos programitas que hacían exactamente lo mismo. Lamentablemente, digamos que debido a la cantidad de gente y el disturbio que se pudo haber generado, mi compañero Gastón, tuvo un problemita con la medición del tiempo :D . Asique se nos demoró bastante lo que pensábamos que nos iba a llevar 15 minutos para empezar a probar y ver algunos resultados. A todo esto venía gente nos preguntaba algunas cosas sobre Linux, y cómo hacer tal o cual cosa, lo que también hizo que se demoraran estas pruebas.

Resumiendo, salió todo bastante mal, no pudimos hacer muchas comparaciones con respecto de los tiempos de ejecución, pero sí hablamos mucho de los dos lenguajes en sí mismo. Yo utilicé por primera vez decoradores y me gustó, me pareció agradable como quedó el código y demás, aunque era un uso muy sutil de estos.

Cuando terminó la Flisol, a eso de las 16 hs, con Gastón y Juan Pablo nos fuimos a comer a un bar del shopping, charlamos bastante sobre Ruby, Python, Java, experiencias de todo tipo y tomamos unas cervezas.


...Python Vs. Ruby... ¿Rivales?

Nota

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í

Desde la primer charla del LugLi en la UTN, hace un par de semanas, que conozco Ruby. Esto quiere decir que ví algo de código, me mostraron algunas de sus características y me dejó algo impactado.

Este lenguaje es muy parecidoa Python en muchos aspectos. Sin embargo Gastón Ramos me mostró algunas aspéctos que lo hacen que sea tan bueno como es, y me dejó regulando en como hacerlo en Python.

Hay mucha gente que o está del lado de Ruby o de Python, y ni siquiera quieren mirar al costado para compararlos, son cerrados y hasta incluso rivales. Después de un tiempo le propuse hacer algunas comparaciones un poco más profundas y no que quede solo de palabras, asique decidimos escribir un par de post al respecto. Este es el primero de él, la respuesta de Juanjo y ahora tiro algunas diferencias entre ellos.

Python

  1. Tiene strings inmutable
  2. Lo métodos privados comienzan con __ (doble guión bajo)
  3. Los bloques se delimitan con la identación y : (dos puntos)
  4. Tiene __getattr__()
  5. La sobrecarga de operadores se define como un método especial (comienza y termina con __). def __add__(self) para redefinir la suma.
  6. No tiene constantes
  7. InputRaw con r"C:\Mis Documentos"
  8. Insertar una variable en un texto al estilo C: "Mi variable es: %s" % (cadena.upper())
  9. Necesita paréntesis para llamar a un método
  10. True, False, None, elif, import
  11. Acceso dirécto a las variables de una instancia mediante el operador . (punto)
  12. if __name__ == '__main__': verifica si es el archivo principal
  13. Tiene un guía excepcional para todo programador: import this
  14. Docstring utilizados para brindar ayuda con help()
  15. Las funciones son objetos y puedo crear una referencia a ellas

Ruby

  1. Tiene strings mutables
  2. Los métodos privados van después de private
  3. Los bloques se delimitan con end's statements
  4. Tiene method_missing
  5. La sobrecarga de operadores es def +(), para redefinir la suma por ejemplo
  6. Tiene constantes
  7. InputRaw con 'C:\Mis Documentos', (comillas simples)
  8. Insertar una variable dentro de una cadena al estilo Template (de Django, por ejemplo): "Mi variable es #{variable.capitalize}
  9. No necesita paréntesis para los métodos, los atributos comienzan luego del espacio
  10. true, false, nil, elsif, require
  11. Tengo que definir cuales variables son públicas una por una
  12. if __FILE__ == $0 verifica si es el archivo principal
  13. No tiene un guía built-in
  14. Los docstring se utilizan cuando se llama al comando: rdoc
  15. Hasta ahora, no pude guardar la referencia a una función en una variable

Éstas son algunas de las diferencias que encontré a simple vista en Python y Ruby, pero lo que más me interesa mostrar es cómo hacer algo en un lenguaje utilizando alguna particularidad del mismo, que permita que sea super sencillo o que diréctamente en el otro no se pueda realizar de "ninguna forma".

Vamos a ver que sale de todo esto. ¿Seguiré con Python o me pasaré a Ruby? ¡CHAN!


PyAr en la OLPC

Nota

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í

Luego de terminar el juego que hicimos con mi equipo para PyWeek, nos sugirieron en la lista de Python Argentina portar el juego a la OLPC. Como Alecu me había ofrecido participar en la charla que él habitualmente da con Dave, me puse a ver como era todo esto así iba aprendiendo algo para esta posibilidad.

Siguiendo este tutorial no tuve casi ningún problema. Lo único que todavía no puedo hacer, es que el ícono se vea de forma correcta una vez que se hace click sobre este, ya que cambia de colores dependiendo de cómo tenga configurado el chico su laptop, pero seguí tal cual los pasos de la guía que indica como crear un ícono para la OLPC, quizás me falló el inglés una vez más.

El juego se puede descargar desde acá y para su instalación hay que hacer:

cd ~/Activities

unzip robotfactory-1.xo

Listo! una vez que hicimos esto lo único que queda es reiniciar la OLPC o el emulador para que aparezca el ícono de un sombrerito en la barra de actividades.

Al juego lo probé en un emulador de virtual box con una resolucion de 1024x768 en la que el juego no alcanza a cubrir toda la pantalla, no sé porqué. Tendría que probarlo en una OLPC para saber qué es lo que tengo que corregir o si en esta funciona correctamente.

Vamos a ver que dicen los chicos de esto :D