May 2012 - Posts

Tengo la costumbre de levantar temprano en la mañana. El martes pasado, me levanté algo más temprano, todavía, porque tenía una idea rondando en la cabeza. La semana pasada trabajé bastante con Javascript y Node.js, en mis proyectos personales, y había conseguido algo que ahora veía que podía fácilmente implementar en Ruby. No lo había hecho por meses, porque no me parecía que hubiera un camino claro, pero luego de mi experiencia de la semana pasada, tomé la decisión de cómo implementarlo. Estoy hablando de tener un motor de plantillas (“template engine”) para mi generador de código AjGenesis, ahora en Ruby. Puse manos a la obra, y en tres horas tuve algo andando, armado usando TDD (con “commits” frecuentes que pueden ver en el log de GitHub).
El resultado quedón en mi cuenta de GitHub:
https://github.com/ajlopez/AjGenesisRb
Inicialmente, había planeado (el año pasado) usar uno de los motores de plantillas ya disponibles en Ruby, como Haml. Pero preferí escribir mi propia implementación, más alineada con el AjGenesis original. Esto lo tomé luego de la buena experiencia que tuve la semana pasada cuando escribí AjGenesis en Javascript/NodeJs, ver:
https://github.com/ajlopez/AjGenesisNode
En ese proyecto, separé el motor de plantilla en otro paquete, ya publicado en NPM:
https://github.com/ajlopez/SimpleTpl
De esta manera pude reusar el formato de plantilla en otro proyecto Javascript sobre Express,:
https://github.com/ajlopez/SimpleMvc
una simple implementación de MVC (Model View Controller).
Entonces, ahora tengo tres proyectos:
- El clásico AjGenesis, implementado en .NET (ver el directorio de ejemplos)
- AjGenesis en Javascript/Node, usando la SimpleTpl template engine, con interpolación de expresiones Javascript y con soporte de comandos Javascript embebidos en el medio de la plantilla (ver directorio samples)
- AjGenesis en Ruby, con un motor interno de plantillas similar al anterior, con soporte de expresiones y comandos Ruby embebidos (ver directorio samples)
AjGenesis en Javascript fue publicado en npm (Node Package Manager) como beta.
AjGenesis en Ruby no está todavía como gema.
RECUERDEN: todos estos proyectos GENERAN los artefactos de texto QUE QUIERAN. No son sólo para un lenguaje. Por ejemplo, desde AjGenesis en Javascript generé una solución para .NET, ver los ejemplos.
Es muy interesante ver cómo ideas simples pero poderosas pueden ser reimplementadas en lenguajes dinámicos (de ahí mi temprano interés en tener desde hace años a AjBasic y más recientemente, a AjSharp). Próximos pasos: más ejemplos, línea de comando, gema ruby, release de paquete node (ya no beta), y sitio web implementando “Code Generation as a Service” (ASP.NET implementation commented in my old post). (ver también AjGenesis: Basis of Its Implementation).
Otros lenguajes de implementación pendiantes: Python, quizás Java.
(La foto original desde: http://commons.wikimedia.org/wiki/File:Table_Rock_Dam_during_April_2008_White_River_Flood.jpg)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
En estos últimos tiempos, parece que hay un “meetup” cada día de cada semana, por estos lares, Buenos Aires, Argentina. Ya me pierdo en el calendario: Ruby, Erlang, Wayra, Google, Mozilla, etc…
Se han formados dos grupos nuevos, que planean sendas reuniones en Buenos Aires.
Primero, el de Emprendedores Informáticos, pueden ver la información en:
http://www.meetup.com/Emprendedores-Informaticos/
El primer “meetup” está planeado para el próximo Viernes Junio 8, 18:30pm (espero que sea en la ciudad de Buenos Aires, todavía no está puesto el lugar) Actualización: Será el próximo viernes 08/Junio a las 18.30hs. en el Auditorio de la Fundación Pablo Cassará, Av. de Mayo 1190 - 1er Piso.
http://www.meetup.com/Emprendedores-Informaticos/events/64414432/
Tienen ahí la agenda tentativa. Será interesante escuchar la experiencia de la gente de:
http://www.eckwebmobile.com.ar/
Este grupo de Emprendedores Informáticos ha sido impulsado por Leonardo Otero. El mismo también formó el grupo de Buenos Aires Javascript: actualización, ahora es de Argentina
https://groups.google.com/group/javascript-arg
(yo diría que ya es de Argentina, más que de sólo Buenos Aires).
La primera reunión se está discutiendo en el “thread”:
https://groups.google.com/group/javascript-ba/browse_thread/thread/4754f43358b05cd7
La idea es hacerla en la ciudad de Buenos Aires, este próximo Sábado 2 de Junio, a las 12hs, en Bar 6, Armenia 1676, Palermo. Pero confirmen en la lista si se realiza en ese lugar, día y hora.
Ah! Tantas cosas para hacer! Bueno, yo por ahora, sigo publicando ideas y proyectos en mi cuenta de GitHub, si quieren ver por qué me interesan estos dos grupos.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Anterior Post
Sigamos mejorando la clase de calendario de días laborables. Quiero ahora plantear el caso:
- El sábado y domingo se trabaja
- El lunes no se trabaja
Acá en Argentina, es común que así sea la semana del panadero (aunque dado los tiempos que corren, muchos abren todos los días). Este es el test que me armé: configuro al calendario con sábado y domingo como días laborales, y lunes como no laborable. Luego se prueban esos tres días:
[TestMethod]
public void SetWeekendAsWorkingDaysAndMondayAsANonWorkingDay()
{
WorkingDaysCalendar calendar = new WorkingDaysCalendar();
calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Saturday);
calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Sunday);
calendar.AddDayOfWeekAsNonWorkingDay(DayOfWeek.Monday);
DateTime saturday = new DateTime(2012, 3, 10);
Assert.AreEqual(saturday.DayOfWeek, DayOfWeek.Saturday);
Assert.IsTrue(calendar.IsWorkingDay(saturday));
Assert.IsTrue(calendar.IsWorkingDay(saturday.AddDays(1)));
Assert.IsFalse(calendar.IsWorkingDay(saturday.AddDays(2)));
}
Al ejecutar este código, si tenemos la clase calendario del post anterior, da en rojo, porque no tengo contemplado más que un día especial por tipo: sólo un día laborable especial, o sólo un día no laborable especial. Pero al llegar a este test, puedo implementar mejor el algoritmo interno. Llegó la hora de tener una lista de días:
public class WorkingDaysCalendar
{
private IList<DayOfWeek> nonWorkingDaysOfWeek = new List<DayOfWeek>() { DayOfWeek.Saturday, DayOfWeek.Sunday };
public bool IsWorkingDay(DateTime day)
{
if (this.nonWorkingDaysOfWeek.Contains(day.DayOfWeek))
return false;
return true;
}
public void AddDayOfWeekAsWorkingDay(DayOfWeek dayOfWeek)
{
if (this.nonWorkingDaysOfWeek.Contains(dayOfWeek))
this.nonWorkingDaysOfWeek.Remove(dayOfWeek);
}
public void AddDayOfWeekAsNonWorkingDay(DayOfWeek dayOfWeek)
{
if (!this.nonWorkingDaysOfWeek.Contains(dayOfWeek))
this.nonWorkingDaysOfWeek.Add(dayOfWeek);
}
}
Agregué una lista interna de días no laborables, sin cambiar la interfaz pública de la clase. ¿Pero habré cumplido con lo pedido con el test? Ejecuto, y da verde. ¿Pero no habré roto algo? Ejecuto el resto de los tests, también estan en verde. En cualquier caso, seguiría trabajando hasta que todo quede en verde. Luego, vendría refactorización. Por ejemplo, no estoy conforme conque los métodos comienzen con Add. No se agregan días, sólo se informa de su carácter de laborable o no laborable. Pero bueno, eso será para otro post.
Próximos temas: refactorizar, soporte de días feriados, feriados puentes, etc…
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Ayer, 20 de Mayo, tuve el gran gusto de presentar un tema que me gusta mucho, la implementación de lenguajes de programación, y en este caso, usando Javascript como lenguaje destino. Fue en la JSConf Argentina 2012:
http://jsconf.com.ar/
(Ya había escrito un post anunciando la conferencia) El día fue excelente, llena de interesantes charlas, muy bien organizada por @rauchg y su equipo (creo de @vulsai), tomé muchas notas, espero escribir uno o dos posts sobre el tema, en cuanto me recupere ;-) Mientras, pueden leer el post de @aijoona
http://blog.aijoona.com/2012/05/21/jsconf-ar-2012-mi-resumen/
Como ejemplo de charla, vean la de WebGL para javascripters de @gerbille:
http://www.slideshare.net/gerbille/webgl-para-javascripters
Este post contiene los enlaces y las implementaciones que visité y preparé para la charla, que tuvo poco de gráfico, y mucho, mucho de código. Debería comenzar a usar los lenguajes que presenté, para manejar temas gráficos en el cliente, por ejemplo WebGL, SVG, tal vez usar d3.js.
Mi presentación en mi Skydrive (nota: tengo que escribir la próxima presentación mía, supongo que será en el Ruby Meetup, en markdown y publicarla en HTML).
Lista de lenguajes que compilan a Javascript
https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS
The JavaScript World Domination Plan at 16 Years
http://www.infoq.com/presentations/The-JavaScript-World-Domination-Plan-at-16-Years
Lisp as the Maxwell’s equations of software
http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells-equations-of-software/
A Conversation with Alan Kay
http://queue.acm.org/detail.cfm?id=1039523
The Magnificent Seven
by Michael Fogus
http://fogus.me/static/preso/magnificent7/#slide1
McCarthy's Lisp in Python with macros
https://github.com/fogus/lithp
The roots of Lisp
http://www.paulgraham.com/rootsoflisp.html
Presenté AjLisp en Javascript
https://github.com/ajlopez/AjLispJs
Comenté y mostré demo de AjLogo en Javascript
https://github.com/ajlopez/AjLogoJs
Demo http://ajlopez.github.com/AjLogoJs/demo.html
Otras implementaciones de Logo en Javascript
http://www.calormen.com/Logo/
http://logo.twentygototen.org/
Recomendé ver a NetLogo http://ccl.northwestern.edu/netlogo/ (en Java) para ver hasta dónde ha llegado el tema.
Hice correr el REPL y el compilador de Clojurescript
https://github.com/clojure/clojurescript
Presenté a la AjTalk VM en C#, y desde el año pasado compila Smalltalk a Javascript
https://github.com/ajlopez/AjTalk
Este año agregué AjTalk en Javascript, con VM en bytecodes, y ejecutor de métodos compilados con AjTalk
https://github.com/ajlopez/AjTalkJs
Demo http://ajlopez.github.com/AjTalkJs/demo.html
Mostré una simple demo de clases Smalltalk compiladas a Javascript, que manejan google, y google.earth.
Levanté Amber y comenté cómo en su definición de métodos ponen Javascript nativo
http://amber-lang.net/
Visité la página de Smalltalk S8, U8
http://u8.smalltalking.net/
http://u8.smalltalking.net/browsecontributions.aspx
No pudimos ver las demos, justo en ese momento estuve sin conexión. Les comento algunos enlaces. Veamos dos:
Hay una Smalltalk S8 Console (con una compilación de V8 preparada para levantar código st)
http://u8.smalltalking.net/profile/smalltalking/125/index.html
Ver sus demos de Google Earth
http://u8.smalltalking.net/contribution.aspx?contributionId=222
(exploren las clases, creo que eran Google, GoogleEarth, GoogleEarthObject, GEDemo, etc…)
Mis posts sobre AjTalk, AjLisp, AjLogo implementations
http://ajlopez.wordpress.com/category/ajtalk/
http://ajlopez.wordpress.com/category/ajlisp/
http://ajlopez.wordpress.com/category/ajlogo/
http://msmvps.com/blogs/lopez/archive/tags/AjLisp/default.aspx
http://msmvps.com/blogs/lopez/archive/tags/AjLogo/default.aspx
http://msmvps.com/blogs/lopez/archive/tags/AjTalk/default.aspx
Mis posts sobre Javascript
http://msmvps.com/blogs/lopez/archive/tags/Javascript/default.aspx
Les agrego algunos enlaces sobre ClojureScript, que no mencioné
Introducing ClojureScript
http://clojure.com/blog/2011/07/22/introducing-clojurescript.html
de @stuartsierra
ClojureScript Rationale
https://github.com/clojure/clojurescript/blob/master/devnotes/cljs.org
de @stuarthalloway
Compiling Clojure to Javascript pt. 1 of n
http://blog.fogus.me/2011/07/21/compiling-clojure-to-javascript-pt1/
de @fogus
Ferret: An Experimental Clojure Compiler
http://nakkaya.com/2011/06/29/ferret-an-experimental-clojure-compiler/
Los enlaces que me interesaron, leí, estudié para esta charla, o los tengo pendientes:
http://delicious.com/ajlopez/clojurescript
http://delicious.com/ajlopez/javascript+parser
http://delicious.com/ajlopez/javascript+compiler
http://delicious.com/ajlopez/javascript+smalltalk
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
El próximo fin de semana (19 y 20 de Mayo), se viene la JS Conf en Argentina:
http://jsconf.com.ar/
en la ciudad de Buenos Aires, en el Centro Metropolitano de Diseño. La conferencia es una iniciativa que parte de @rauchg (CTO y cofundandor de LearnBoost, creador de socket.io, su blog en http://www.devthought.com/, sus proyectos en http://www.devthought.com/projects/), como lo anunció en http://www.devthought.com/2012/03/17/jsconf-argentina/. Seguir en Twitter como @jsconfar.
Como pueden ver en el sitio de la conferencia, habrá varios oradores, de Argentina y de otros paises. Para destacar es la llegada de:
Jacob Thornton(Twitter) en @fat
Jacob es un Ingenerio de Twitter y co-autor de algunos proyectos open source interesantes. Como por ejemplo: Bootstrap, Ender, Hogan.js... Estudió literatura en la universidad, lo cual significa que no tiene idea de lo que está haciendo pero es súper crítico de todo.
Isaac Z. Schlueter(Joyent) en @izs
Isaac Z. Schlueter viene trabajando con Javascript hace mucho tiempo. Creó npm (y otros programas en Node) y es el actual líder del proyecto Node.JS. Trabaja para Joyent, y vive en Oakland, California, la capital del mundo del server-side JavaScript y el buen café.
Nathan Rajlich(Learnboost) en @TooTallNate
Nathan es uno de los commiters del core del proyecto Node.js y ha sido un miembro activo de la comunidad por casi dos años. Ha escrito una gran variedad de módulos. Los más destacados son node-gyp, NodObjC, y ansi.js. Él vive en el norte de San Francisco, CA y es uno de los ingenieros en LearnBoost.
y debería nombrar a muchos más, también de Argentina, trabajando en interesantes proyectos, varios de código abierto. Por ejemplo, van a ver que Node.js es uno de esos proyectos. Pero vayan y vean, en el sitio de la conferencia.
Hasta yo voy a estar de orador :-) el domingo, con un temario de los que están acostumbrados en este blog:
Javascript es un lenguaje de programación flexible y ubicuo, que puede ejecutarse del lado del servidor en varias plataformas, y del lado cliente en una plétora de dispositivos. Hay docenas de lenguajes (literalmente) que han sido implementados usando Javascript como lenguaje final. En esta charla, visitaremos algunas formas de implementar intérpretes y máquinas virtuals sobre Javascript, y compiladores que generan código Javascript. Usaremos Logo, Lisp y Smalltalk como lenguajes de ejemplo a implementar, usando Node.js como servidor, y navegadores como clientes.
Ah! La conferencia tiene un costo, para cubrir desayuno, almuerzo, etc. Voy a ver cómo me las arreglo con el efecto Coto :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Se viene otra reunión de este grupo de usuarios. Organizada por @matiasbagini, será el miércoles 23 de Mayo, en sus oficinas de JRapid. Ver detalles y dirección en :
http://www.meetup.com/AWS-User-Group-Buenos-Aires/events/60434612/
Leo ahí:
AWS entregará U$S 20 de crédito para los asistentes al evento.
La reunión de mayo estará enfocada hacia usuarios con poca o nula experiencia en AWS que quieran comenzar a utilizar los servicios. Presentaremos una charla que responderá, entre otras, las siguientes preguntas:
* Qué es AWS?
* Cómo crear una cuenta?
* De qué trata S3 y EC2?
* Cómo es el pricing y cuáles son los diferentes tipos de instancias?
* Conviene usar servidores en USA? Europa? San Pablo?
* Qué es una AMI? cuál conviene usar? Linux o Windows?
* Cómo hosteo mi sitio web en AWS?
* Qué es CloudFront?
* Qué otros servicios ofrece AWS?
La presentación será principalmente práctica para que aquellos que lo deseen puedan irse con su cuenta creada y su primer sitio/aplicación corriendo.
Mis enlaces sobre Amazon Web Services:
http://delicious.com/ajlopez/aws
Ya asistí a la reunión anterior, espero poder asistir a ésta que viene. Tengo pendiente escribir sobre lo que estudié (en la reunión anterior me gané un libro), todavía no usé AWS directamente en un proyecto.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Se acerca una nueva reunión “meetup” de la gente de Ruby Argentina, en Buenos Aires. @inkel envió este anuncio en la lista RubySur:
Tenemos el agrado de invitarlos a la próxima meetup de Ruby Argentina en Buenos Aires, a realizarse en las oficinas de Wayra Argentina, sita en Costa Rica 5546, Oficina 604.
Para poder ingresar al edificio de Wayra Argentina necesitamos que ingresen su nombre y apellido en el siguiente formulario, y no olviden llevar su cédula o DNI. También pueden anotarse si quieren dar una charla o hacernos sugerencias.
Inscripción: http://goo.gl/68WQw
= Sobre Wayra Argentina http://wayra.org/
Wayra es una iniciativa sin precedentes en el entorno latinoamericano y europeo que pretende conseguir un impacto relevante en la economía de los países en que opera. Si sos emprendedor y tenés un proyecto en el ámbito digital, en
entorno web o soporte móvil, subilo a Wayra que te ayudamos a hacerlo realidad.
Les recordamos que el 13 de mayo es el cierre de inscripción de proyectos para Wayra Argentina 2012. Los interesados deberán completar el formulario de inscripción de proyectos en:
http://wayra.org/es/convocatoria-argentina-2012
El horario es de 19 a 21hs. Atención: la calle es Costa Rica, en el anuncio inicial se había puesto Nicaragua.
La idea del grupo es reunirse una vez por mes. Me gustaría ir a esta “meetup” y hasta preparar una charla, pero no estoy seguro todavía: estoy “en concentración” preparando mi charla para JsConf Argentina (ver anuncio de @rauchg y el sitio), y en el medio de dos proyectos (uno que me lleva a poner a atención a muchos detalles, y otro que me impulsa a pensar mucho ;-). Veo de decidirme este fin de semana.
Aprovecho para comentar que mis charlas en @AltNetHispano sobre lenguajes de programación (en la segunda incluí Ruby) están publicadas en:
http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte1.ashx
http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte2.ashx
Mis enlaces sobre Ruby que estuve estudiando o me interesaron:
http://delicious.com/ajlopez/ruby
La gente de la comunidad ya está preparando la segunda RubyConf, hacia finales de este año 2012.
La mención a Wayra, y sus proyectos, es porque ellos buscan propuestas (en varios países), vean:
http://wayra.org/es/tienes-un-proyecto
http://wayra.org/en/do-you-have-project
http://wayra.org/br/tenho-um-projeto
Vean proyectos que seleccionaron en Colombia, México, España, Argentina, Perú, Brasil, Venezuela, Chile y Colombia:
http://wayra.org/es/proyectos-acelerados
http://wayra.org/es/proyectos-seleccionados-argentina
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ahlopez
Anterior post
Siguiente post
Veamos ahora otro test, que como los anteriores, nos va a obligar a implementar mejor nuestro software en construcción.
Queremos configurar, sobre la semana básica, cuáles son los días laborables y cuáles son no laborables. En el anterior post, agregué la capacidad de especificar un nuevo día laboral. Ahora, quiero poder especificar que los lunes son no laborables. Este es el test que escribí:
[TestMethod]
public void SetMondayAsANonWorkingDay()
{
WorkingDaysCalendar calendar = new WorkingDaysCalendar();
calendar.AddDayOfWeekAsNonWorkingDay(DayOfWeek.Monday);
DateTime monday = new DateTime(2012, 3, 12);
Assert.AreEqual(monday.DayOfWeek, DayOfWeek.Monday);
Assert.IsFalse(calendar.IsWorkingDay(monday));
}
Primero, no compila. Porque usa el método no existente, AddDayOfWeekAsNonWorkingDay . Lo creo, lanzando una excepción de no implementado, ejecuto el test, y da rojo. Pongamos el mínimo código que hace que esto funcione, con algún refactor de nombre de parámetros.
private DayOfWeek? workingDay;
private DayOfWeek? nonWorkingDay;
public bool IsWorkingDay(DateTime day)
{
if (this.workingDay.HasValue && this.workingDay.Value == day.DayOfWeek)
return true;
if (this.nonWorkingDay.HasValue && this.nonWorkingDay.Value == day.DayOfWeek)
return false;
if (day.DayOfWeek == DayOfWeek.Sunday || day.DayOfWeek == DayOfWeek.Saturday)
return false;
return true;
}
public void AddDayOfWeekAsWorkingDay(DayOfWeek dayOfWeek)
{
this.workingDay = dayOfWeek;
}
public void AddDayOfWeekAsNonWorkingDay(DayOfWeek dayOfWeek)
{
this.nonWorkingDay = dayOfWeek;
}
Ahora el test está en verde. Agregué una nueva variable interna “nullable” nonWorkingDay. Ciertamente que la clase escrita sólo soporta un sólo día laborable configurable y un sólo día no laborable configurable. Pero los tests que escribimos pasan. Voy por “baby steps”, de a “pasos de bebé”.
Pero van viendo la aplicación de TDD: en cada test, hay una nueva especificación de cómo queremos que actúe nuestro software en construcción. Y sólo implementamos lo que necesitamos para pasar el test. Poco a poco, va emergiendo la implementación interna, donde ponemos lo que conocemos como programadores. Pero sin caer en la tentanción de “Ah! acá pongo esto que lo voy a necesitar”. Si el test no lo necesita, nosotros tampoco :-)
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Un nuevo mes comienza, y es tiempo de revisar mis resoluciones del mes pasado, y escribir la lista para este mes. Primero, el resultado de Abril:
- Completar Acquarella (comment, number detection, new styles, language extension..) parcial ver repo
- Trabajar en AjTalk en Javascript/NodeJs (class support, fileouts processing) completo ver repo ver demo en línea
- Trabajar en AjLogo in Javascript/NodeJs (canvas support) completo ver repo ver demo en línea
- Completar el soporte de verbos iniciales en SetTuples pendiente
- Dar una charla sobre Lenguajes de Programación (Javascript/NodeJs, Clojure, Erlang, Python, Ruby, Scala) completo ver video 1, video 2
- Modelo de AjContab en memoria pendiente
Además, hice:
- Dar una charla sobre Clojure completo
- Trabajar en DartSharp completo ver repo
Resoluciones para este nuevo mes de Mayo:
- AjContab modelo en memoria
- Agregar verbos en SetTuples
- Trabajar en Acquarella (extender configuración por lenguaje de programación, soporte de comentarios multi línea…)
- Trabajar en AjLogo en Javascript
- Trabajar en AjTalk en Javascript
- Mejorar la compilación de AjTalk de Smalltalk a Javascript
- Dar una charla sobre implementación de lenguajes de programación en Javascript
- Comenzar con la codificación de AjConsorSite
Muchas cosas, pero gran diversión!
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez