Archive for the '12082' Category

Code Katas en JavaScript/Node.js usando TDD

Monday, January 14th, 2013

En estas semanas pasadas, he estado trabajando en ejemplos y módulos JavaScript/Node.js, usando TDD en cada paso. Practicar, practicar, practicar, el camino a la maestría.

Pueden ver mi progreso y revisar los commits que hago ante cada test. Lo que sigue es un resumen de este trabajo:

CobolScript: Ver mis posts un implementación de compilador de COBOL a JavaScript, con ejemplos de consola ejemplo web, usando MySQL y SimpleWeb.

SimplePipes: Una manera de definir pasaje de mensajes usando ‘pipes’ para conectar diferentes nodes/funciones en un grafo. Quiero extenderlo para que tenga proceso distribuido.

SimpleBoggle: Un programa que resuelve un tablero de Boggle, juega mejor que yo! Ver ejemplo de consola.

SimpleMemolap: procesamiento tipo OLAP multidimensional, pero usando un modelo en memoria. Hay ejemplo web que usa mi SimpleWeb (“dog fooding”):

SimpleChess: En progreso, define un tablero usando SimpleBoard, y ya calcula movidas. Estoy también trabajando en SimpleGo, para tener un tablero, un juego y evaluadores.

SimpleRules: Motor de reglas  “forward-chaining”, hacia adelante (ahora que está de nuevo “de moda” la programación reactiva. Trabaja inspirada en algoritmo RETE-2, detectando los cambios de estado para disparar las acciones apropiadas.

SimpleScript: Ver mi post con las primeras ideas sobre este lenguaje, que compila a JavaScript, trabajo en progreso.

Py2Script: Compilador de Python a JavaScript, primeros pasos.

SimpleWeb: Una capa de “middleware”, a la Connect, con un ejemplo web:

BasicScript: Mis primeros pasos para compilar Basic a JavaScript. Quiero usarlo como lenguaje de programación para juegos en el browser.

SimplePermissions: El code kata de este sábado a la mañana ;-). Implementa Sujetos (Subjects), roles, permisos, otorgados en contexto.

SimpleFunc: Serialización/Deserialización de funciones y objectos con funciones.

SimpleMapReduce: Explorando la implementación del algoritmo Map-Reduce (y una variante, que llamo Map-Process) tanto sincrónico como asincrónico.

SimpleTuring: Implementación de una máquina de Turing.

Cellular: Implementación de autómatas de estado, lineales o de otras dimensiaones. Incluye un ejemplo de juego de la vida en consola.

Y en estos dos días pasados, agregué:

NodeDelicious: Para recuperar mis enlaces desde la cuenta de Delicious (sin tener que lidiar con el XML que devuelve directamente la API), ahora que el sitio ha sido rediseñado y no tiene paginación. La gente de Delicious sigue pensando que uno usa los enlaces como un feed (que lo viejo se pierde), pero no, muchos usamos a Delicious como un “Mis favoritos” en la nube y queremos acceder por rango de tiempo.

SimpleSudoku: Una reescritura desde 0, con TDD, de mi anterior AjSudoku, resuelve tableros de Sudoku.

Tengo que trabajar en:

SimpleDatabase: Base de datos en memoria, puede que en algún momento le agregue persistencia en archivos.

Y como siempre, todo esto es muy divertido 😉

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Coding Dojo – “TDD on the rocks”

Wednesday, March 14th, 2012

Ayer martes 13 de Marzo asistí a la reunión mensual de Agiles Buenos Aires. Fue un coding dojo sobre TDD, dirigido por el bueno de @HernanWilkinson. Pueden ver la descripción del evento en:

http://www.meetup.com/agiles-bsas/events/55342802/

En la reunión de marzo, Hernan Wilkinson facilitará un coding dojo en el que se trabajará sobre un ejercicio de programación para practicar diseño orientado a objetos y la utilización de TDD.

La idea es que todos podamos participar, por lo que usaremos la técnica de Coding Dojo, estilo Randori.

Venite preparado con tu laptop, con las baterias bien cargadas, con tu lenguaje preferido (Java, C#, Ruby, Smalltalk, etc.) y con muchas ganas de discutir, aprender y pasarla bien.

Fue una muy interesante reunión, donde aprendimos de TDD, pasos, refactoring, etc. Y hubo discusiones interesantes.

Hernán armó un coding dojo diferente, escribió en la lista del meetup:

La idea es que haya un proyector donde se ve que están haciendo los que pasan al frente y son dos. Cuando el que está con la computadora termina, toma la computadora el otro y pasa uno nuevo para ser el próximo que toma la posta. Lo único malo que tiene esta modalidad es que a veces la computadora que se usa no es cómoda para todos por el teclado o el lenguaje o ide no lo conocen todos, etc., lo que hace mas lento el desarrollo del ejercicio por eso para contrarrestar este problema es que vamos a hacer un "Randori" customizado :-), que consiste en que todos vayan con su laptop copiando lo que se está mostrando con el proyecto, cada uno con su lenguaje preferido, ide preferido, etc. y que cuando pasan al frente, pasan con su laptop y lo unico que hay que hacer es conectar la laptop al proyector. Además contrarrestar el problema que comenté, tiene la ventaja de que todos van a estar programando realmente y no siguiendo el ejercicio solo con los "ojos" y se va a poder ver cómo va quedando el mismo problema con distintos lenguajes. Se podría decir que la contra es que por ahí uno que sabe Java le costará entender a otro que lo hace en Ruby, pero el problema no es tan complicado como para que la diferencia entre los lenguajes haga difícil entender la solución que se desarrolla en cada uno de ellos. Creo que va a estar muy interesante y si funciona bien después lo patentamos!!

Felicitaciones a la organización (tengo que anotar quienes fueron sponsors), y en particular a Hernán, que supo manejar la sesión, muy interesante, informativa, y divertida. El trabaja en el día a día, con sus equipos, con TDD desde hace 10 años aprox. Así que tiene mucho para transmitirnos, la reunión de ayer fue el principio. Ya tengo pensado incorporar todo lo visto al Proyecto Hogwarts, veremos si tengo tiempo disponible.

Yo estuve desde el comienzo, hasta las 20:30hs, pero siguió la reunión. Asistieron más de veinte personas, muchas que asistían por primera vez a estas reuniones de Agiles@Buenos Aires. Nos repartimos en equipos de dos, para hacer pair-programming. (Uy! No pude anotar el nombre de mi compañero, salí apurado porque tenía que llegar temprano a otro lado). Trabajamos en C#, Visual Studio 2008, en la notebook que uso.

Fue muy interesante ver pasar equipos al frente, y discutir entre todos cuál era el próximo paso a implementar. Hubo gente de Java, C#, Ruby, en distintos sistemas operativos, IDEs y editores.

Hernán nos dió una guía de pasos a seguir (además de los clásicos de TDD: rojo, verde, refactor):

Pasos a seguir:

–Caso más simple “positivo”

–Caso negativo

–Caso concreto distinto

–Más de un caso concreto

–Casos bordes

–Pensar-:)

Hoy, Hernán publicó la presentación en:

http://www.slideshare.net/hernanwilkinson/tdd-on-the-rocks

(en el slide 4 están los pasos que mencioné antes).

El problema planteado fue:

– Calendario de días laborables y no laborables

– Se debe saber si una fecha particular es laborable o no

– Se debe configurar con:

– día de la semana no laboral (ej. Domingo)

– día de mes no laboral (ej. Primero de Enero)

– fecha particular no laboral (ej. 4 de Abril de 2012)

Publiqué lo que hizo mi equipo (hasta que me tuve que ir) en:

https://github.com/ajlopez/TddOnTheRocks

en el directorio Src. Traté de hacer commit por test, pero escribí rápido los comentarios.

Fue un muy interesante ejercicio. Estoy comenzando a escribir en https://github.com/ajlopez/TddOnTheRocks/tree/master/MySrc otro “approach” más alineado con lo que hago habitualmente para poder comparar las diferencias de énfasis en los dos estilos.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Code Kata: Capturando páginas web

Monday, October 26th, 2009

Para practicar, como Code Kata (y también, como prueba de concepto para un proyecto relacionado con Hacia una Historia Clínica Digital de Código Abierto), estuve codificando un programa de Web Scraping. Pueden bajarse el código completo desde: Web Scrapping Example (pensé que en inglés era “scrapping” con doble p, así que quedó por ahora con ese nombre 🙂

La solución, escrita en C#, contiene un proyecto de librería de clases, uno de tests de Visual Studio, y un programa de demostración, del tipo consola. Fue interesante codificar un mini HTML parser (simple, que no contempla todos los casos, sólo los necesarios para el trabajo), que soporta el análisis de páginas mal formadas. El usar TDD (Test-Driven Development) me permitió ir codificándolo de forma de estar seguro de lo que necesitaba como resultado, y además, que ese resultado fuera el correcto. Ejemplo de test simple:

[TestMethod]

public void ParseSimpleTag()

{

    HtmlParser parser = new HtmlParser("<html>");

    HtmlToken token = parser.NextToken();

 

    Assert.IsNotNull(token);

    Assert.AreEqual(HtmlTokenType.Tag, token.TokenType);

    Assert.AreEqual("html", token.Name);

 

    Assert.IsNull(parser.NextToken());

}

Para capturar las páginas, usé System.Net.WebClient, con código tan simple como:

private string GetContent()

{

    WebClient webclient = new WebClient();

    return webclient.DownloadString(this.address);

}

Como demostración, en el programa de consola, parto de explorar la página:

Medline Plus Drugs

Lanzando el programa de consola, aparece la salida, capturando algunos cientos de páginas, sobre información de drogas medicinales (efectos, posología, contraindicaciones, etc):

Exploro las páginas que apuntan a la información de drogas por letra, obtengo los enlaces a cada droga, traigo el contenido de la página, extraigo la información que me interesa (descartando el principio y el fin de la página) por cada droga. Un ejemplo de página:

Al final, genero una página de índice:

Podría implementar un mejor parser de HTML, y algunas operaciones más de extracción de datos. Pero para lo que quería obtener, me bastó. Y fue una buena experiencia de TDD.

Si usan la información generada, recuerden de leer los términos del sitio original (entiendo que necesitan una autorización para usarlo de forma comercial, no parece que haya problema en capturar los datos en un utilitario no comercial).

¿Por qué no explorar directamente la web para obtener estos datos? Porque el contexto de la prueba de concepto que me impuse, es que los médicos y enfermeros no tienen acceso a Internet desde todas las máquinas donde van a estar trabajando.

Nos leemos!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez