En este post voy a describir una idea, no hay implementacion todavía. AjGenesis, mi proyecto de código abierto de generación de código, está basado en modelos, tareas y plantillas. Cada artecfacto a ser usado, podemos definirlo nosotros, y así se consigue generar salidas, archivos, código para cualquier tecnología, framework o plataforma.
El modelo reside en memoria, durante su proceso. Podemos cargar en memoria varios modelos a la vez: en los ejemplos que he publicado, un modelo abstracto describe la solución en términos generales, y otro modelo de tecnología define el lenguaje, base de datos, patrones, que se usaran en el proceso de generación de código.
Ambos modelos pueden ser cargados desde archivos XML, o desde archivos de texto (esta es una nueva característica, todavía en prueba). Ahora, quisiera proponer otro camino: modelos en planillas de cálculo.
El ejemplo
En un post reciente:
Modelo textual para generación de código con AjGenesis
Textual model for code generation in AjGenesis
Presenté ahí un modelo simple, en dos representaciones: XML y textual. Ese modelo podría ser expresado en una planilla Excel, como:
El alcance de una descripción de objeto está determinada por la indentación: Entity Customer es un elemento de Entities (vean que no importa dejar filas en blanco). Podemos usar una tabla para describir un elemento compuesto de varios. Una propiedad simple puede ser descripta en dos columnas consecutivas: la primera conteniendo el nombre de la propiedad, la segunda nos da el valor. Si queremos describir un objeto en otra hola de la misma planilla, ponemos el nombre entre corchetes [...], como en "Entity [Employee]", que nos podría llevar a otra hoja como:
El principal beneficio de este modelo es la clara representación que conseguimos. Colores y tipos de letras mejoran la presentación, pero son ignorados en la carga del modelo. Pero la presentación se mejora. Como siempre digo, no somos vulcanos (al Sr. Spock le bastaría un archivo XML), y una buena presentación nos ayuda a procesar información.
Próximos pasos
Si consideran que esta propuesta es útil, podría escribir un nuevo Object Builder que se alimente de archivos Excel, para cargar un modelo. Debería elegir la librería a usar: podría tomar el modelo de objetos de Excel, aunque eso implica que para usarlo, se deba tener el Excel instalado. Como siempre, sugerencias, comentarios, bienvenidos!
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
AjGenesis, mi proyecto open source de generación de código, usa un modelo definido por el usuario. Podemos definir tareas y templates, para transformar el modelo a código y archivos de texto. Podemos escribir nuestro propio modelo, agregar tareas y transformaciones. Desde una tarea, se puede invocar a objetos .NET o código AjBasic, en el medio del proceso de generación. Es un proceso flexible: genera lo que Ud. quiera generar, no tiene un patrón predeterminado.
Como el modelo lo define uno, el sistema no está limitado a un tipo de proyecto. Al estar basado en templates y tareas definidas, genera artefactos de código que no están ligados una sola tecnología. Podmos generar archivos para cualquier tecnología, framework, línea de negocios y plataforma. Podemos generar scripts de DDL, o una aplicación completa de base, o cualquier cosa en el medio. Es nuestra decisión hasta donde llegar.
Cuando comencé a escribir y usar el sistema, no existía .NET 2.0. Cuando la nueva tecnología se hizo pública, escribí tareas y templates adicionas para aprovechar las nuevas características como master pages, themes y nuevos controles ASP.NET, sin necesidad de tocar el código núcleo de AjGenesis. Una vez los nuevos templates y tareas estuvieron escritos, pude generar aplicaciones ASP.NET 2.x, a partir de los mismos modelos que ya tenía armados para mis otros cursos y trabajos.
Ahora, como una prueba de concepto, escribí un nuevo ejemplo, que genera código usando LINQ, en nuevo chico en el barrio de .NET 3.x. El resultado fue publicado como AjGenesisExamplesNet3.zip en la página de ejemplos de AjGenesis en CodePlex. Para ejecutar el ejemplo, necesitamos la actual versión 0.5 (incluye código fuente, ejemplos iniciales, y binarios). (Hay una versión 0.5.1 en desarrollo que pueden ir viendo en el repositorio de código del proyecto).
El ejemplo

Hay sólo un modelo en el ejemplo: AjFirstExample, con un simple modelo XML describiendo a dos entidades planas, Customers y Suppliers. Es el mismo modelo que usé en otros ejemplos anteriores.
<Project>
<Name>AjFirstExample</Name>
<Description>First Example using AjGenesis</Description>
<Prefix>AjFE</Prefix>
<Domain>com.ajlopez</Domain>
<CompanyName>ajlopez</CompanyName>
<Model>
<Entities>
<Entity Source="Entities/Customer.xml"/>
<Entity Source="Entities/Supplier.xml"/>
</Entities>
<Lists>
<List Entity="Customer"/>
<List Entity="Supplier"/>
</Lists>
<Forms>
<Form Entity="Customer"/>
<Form Entity="Supplier"/>
</Forms>
<Views>
<View Entity="Customer"/>
<View Entity="Supplier"/>
</Views>
</Model>
</Project>
El directorio Templates contiene dos conjuntos de archivos .tpl , que son templates AjGenesis. Los de MsSql son usados en la generación de scripts DDL. En el folder CSharp3, hay nuevos templates que generan un LINQ DataContext, y clases simples, como entidades y servicios.
Ejecutando el ejemplo
El directorio principal del ejemplo hay un archivo de comando:
makeajfirstexample.cmd
que al ejecutarse, carga el modelo abstracto y el de tecnología en memoria, y ejecuta dos tareas, creando códidog y scripts de generación de base de datos.
Lo generado reside en un nuevo directorio Build, con código fuente y scripts para MS SQL:
El archivo Build\AjFirstExample\CSharp3\Sql\CreateDatabase.sql crea la base y tablas, un fragmento:
create database AjFirstExampleNet3
go
...
use AjFirstExampleNet3
go
...
--
-- Entity: Customer
-- Description: Customer Entity
--
if exists (select name from sysobjects
where name = 'Customer' and type = 'U')
drop table Customer
go
create table Customer (
[Id] [uniqueidentifier] not null
CONSTRAINT [DF_Customer_id] DEFAULT (newid()),
[Name] nvarchar(200),
[Address] nvarchar(2048),
[Notes] nvarchar(2048)
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF)
ON [PRIMARY]
)
go
La solución puede cargarse directamente en Visual Studio 2008:
La clase AjFirstExampleDataContext.cs es un simple LINQ DataContext:
public partial class AjFirstExampleDataContext :
System.Data.Linq.DataContext
{
public AjFirstExampleDataContext()
....
public Table<Customer> Customers;
public Table<Supplier> Suppliers;
}
Podríamos reemplazarlo por un DataContext generado por el wizard de Linq To SQL que viene en el Visual Studio. Hay una opción en el modelo de tecnología para especificar qué estrategia usar: o genera un archivo nuestro, o deja al desarrollador poner manualmen luego, al levantar la solución, un DataContext generado por el propio IDE. El resto de las clases funciona igual contra cualquiera de las dos opciones.
La solución tiene 3 proyectos: datos, servicios y presentación ASP.NET. La página inicial es espartana (ya me conocen, soy desarrollador, no diseñador gráfico... :-)):
Desde la opción de Administration, podemos explorar, agregar, editar y borrar clientes y proveedores:
Próximos pasos
Quiero convertir otros ejemplos anteriores a estos nuevos templates (el modelo de AjTest es el más desafiante, con relaciones uno a varios y varias entidades). Sería interesante generar páginas ASP.NET MVC, en lugar de ASP.NET plano. Y algunos proyectos adicionales, de infraestructura de testo. Estoy viendo el código de ScrumLite como un ejemplo base a seguir.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://delicious.com/ajlopez
http://twitter.com/ajlopez
http://friendfeed.com/ajlopez
Estuve trabajando agregando una "feature" a mi proyecto de generación de código AjGenesis. El sistema maneja un modelo definido por el usuario, que puede ser cargado en memoria desde archivos .xml. AjGenesis puede procesar el modelo, completarlo, invocar a objetos .NET, crear directorios, archivos y aplicar templates para crear código y archivos de texto cualesquiera.
Pero el modelo reside en memoria: la deserialización desde XML es solamente una opción de implementación. Este fin de semana, he agregado el nuevo código en el repositorio de código del proyecto Codeplex: ahora, todo usuario de AjGenesis puede expresar su modelo en texto plano.
El modelo puede, entonces, expresarse en simples archivos de texto. Veamos un ejemplo.
El ejemplo más simple que se me ocurre es el modelo para una aplicación Hello World en AjGenesis. El modelo en XML es:
<Project Company="ajlopez.com">
<Message>Hello, World</Message>
</Project>
Ahora, podemos expresar el mismo modelo en un archivo de texto:
Project
Company = "ajlopez.com"
Message = "Hello, World"
End Project
Si necesitamos más mensajes, en XML escribíamos:
<Project>
<Messages>
<Message>Hello, World One</Message>
<Message>Hello, World Two</Message>
<Message>Hello, World Three</Message>
</Messages>
</Project>
Ahora, en texto, podemos escribir:
Project
Messages
Message = "Hello, World One"
Message = "Hello, World Two"
Message = "Hello, World Three"
End Messages
End Project
Se puede cargar el modelo desde el programa de consola, indicando un archivo .txt o .xml:
..\..\..\bin\AjGenesis.Console Model.txt ModuleVb.tpl HelloWorld.vb
..\..\..\bin\AjGenesis.Console Model.xml ModuleVb.tpl HelloWorld.vb
Lo mismo podemos hacer desde tareas de NAnt: cargar un modelo, en un archivo .XML o .txt.
Hay más ejemplos en:
Hello world Examples
Un modelo más realista, donde describimos entidades en un XML:
<?xml version="1.0" encoding="utf-8" ?>
<!--
An Entity with Properties
-->
<Entities>
<Entity Name="Customer">
<Description>A Customer</Description>
<Properties>
<Property Name="Id" Type="Id"/>
<Property Name="Name" Type="Text"/>
<Property Name="Address" Type="Text"/>
</Properties>
</Entity>
<Entity Name="Supplier">
<Description>A Supplier</Description>
<Properties>
<Property Name="Id" Type="Id"/>
<Property Name="Name" Type="Text"/>
<Property Name="Address" Type="Text"/>
</Properties>
</Entity>
</Entities>
ahora puede ser expresado en texto (no es el mismo modelo de arriba, pero similar):
Entities
Entity Customer
Description = "Customer Entity"
Properties
Property Id Type="Id"
Property Name Type="Text"
Property Address Type="Text"
End Properties
End Entity
Entity Supplier
Description = "Supplier Entity"
Properties
Property Id Type="Id"
Property Name Type="Text"
Property Address Type="Text"
End Properties
End Entity
End Entities
Una vez que el modelo es cargado en memoria, AjGenesis lo procesa como siempre, sin importar su forma original, texto o XML.
Más sobre AjGenesis:
Posts about AjGenesis (English)
Posts sobre AjGenesis (Spanish)
Apenas relacionado, pero interesante:
Problems for Textual Model Notations
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
El pasado mes publiqué un proyecto en Google code:
http://code.google.com/p/ajbasic/
Es un intérprete AjBasic, escritbo en VB.NET. El código es la evolución de mi trabajo previo, para mi proyecto de generación de código AjGenesis. En esta nueva versión, el intérprete fue separado en un proyecto aparte, y la gramática de AjBasic y su compilador residen en otro proyecto.
Esa forma de trabajo permite escribir otra gramática y compilador, usando como salida el mismo intérprete núcleo. Así nace AjSharp: pueden bajarlo del mismo repositorio de código de AjBasic.
La solución
Tiene varios proyectos. El proyecto AjInterpreter es exactamente el mismo que en la solución AjBasic. Así, ambas soluciones comparten la misma implementación núcleo de sus primitivas.
El proyecto AjSharp contiene el nuevo compilador, que reconoc código AjSharp, como:
Hay algunos verbos, tomados de AjBasic, como print y printline. Pero el resto de los verbos son más tipo C#. Mi plan es incluir estas nuevas versiones de AjBasic y AjSharp en el próximo release de AjGeesis, así los que escriban plantillas (templates) para AjGenesis puedan usar cualquiera de los dos lenguajes (está planeado usar un lenguaje .NET directamente, pero esa capacidad quedará para incluir en otra versión futura de AjGenesis).
Como mencionaba en mis anteriores posts:
AjBasic- un intérprete Basic de código abierto
AjBasic- an open source Basic-like interpreter
AjBasic nació para soportar la generación de código en AjGenesis. Lo diseñé para manejar objetos .NET nativos, y también objetos dinámicos. Ahora, eso también está soportado en AjSharp. Un objeto dinámico es un objeto que no tiene una clase, pero que puede soportar nuevas propiedades, definidas en el momento (el ejemplo más cercano que puedo pensar como parecido, son los objetos Javascript).
Podemos escribir código en AjSharp como:
a.FirstName = “Adam“;
a.LastName = “Doe“;
a.Age = 800;
No hace falta declarar la variable. El objeto se crea y se agrega la propiedad FirstName, en un solo comando (esta creación automática de objetos no está soportada en AjGenesis, todavía).
Podemos preguntar por la existencia de una propiedad:
if (a.LastName)
printline "a has last name";
else
printline "a hasn't last name";
Si la variable a no tiene un valor asignado (no existe), o si existe pero no tiene propiedad LastName, la condición de arriba se evalúa a falso. Podemos preguntar por algo como foo.bar.anything y si foo no existe, no aparece ninguna excepción de referencia a null. El resultado completo de esa expresión será, no error, sino null, y en estos lenguajes, null es falso para una condición.
Podemos acceder a objetos .NET, también. Un ejemplo:
di = new System.IO.DirectoryInfo(".");
foreach (fi in di.GetFiles()) {
printline System.String.Format("File {0}",fi.Name);
}
El intérprete
El núcelo de AjBasic y AjSharp, es el proyecto AjInterpreter, una vista parcial:

Tiene varios nodos definidos, que se usan para formar un árbol de evaluación. Ambos compiladores analizan texto, y lo conviernte a una representación de árbol de nodos AjInterpreter. Hay dos clases principales de esos objetos: Expressions y Commands. Un nodo expression puede ser evaluado, retornando un objeto arbitrario. Un nodo command es ejecutado. Ambas operaciones trabajan sobre un environment, que contiene las variables y sus valores asociados.
Los tests
El compilador, scanner y otros objetos auxiliares, fueron escritos con tests. En la versión publicada, los tests estan en verde:
Consola y GUI
AjSharp.Console es un pequeño programa para probar código AjSharp. Podemos ejecutar archivos .ajs si los colocamos como argumentos, o ingresar comandos por la consola:
AjSharp.GUI is un "feo" programa, que sólo muestra que podemos invocar al intérprete desde un programa WinForm:
Trabajo en progreso
El código actual de AjSharp (y de AjBasic) contiene nuevas características, como el soporte de try/catch/finally en los lenguajes.
Todo este trabajo es trabajo en progreso. Próximos pasos:
- Integrar AjBasic y AjSharp en la próxima versión de AjGenesis
- Soporte para System.Array en ambos intérpretes
- Agregado de un comando for en AjBasic (hay un for each en ambos, y un for tipo C# en AjSharp)
- Operadores de incremento y decremento
- Y mil ideas más... ;-)
Hay dos caminos en el futuro: portar este trabajo a Java, y/o integrar esto con el nuevo soporte de Dynamic Language de .NET. Pero por ahora, integración con AjGenesis es la prioridad. Y, debo confesarlo, este trabajo me divierte mucho.. ;-)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
En estas últimas semanas, almuerzo y café de por medio, se ha ido gestando una charla que vamos a dar con el bueno de Martín Salías, en noviembre, aquí en Buenos Aires, para el Microsoft User Group de Argentina. En estos días, tengo más contacto laboral con Martín, y eso facilita la organización de nuevas charlas, reuniones. Me temo que nuestros almuerzos han sido regados únicamente por agua mineral o saborizada. Pero han sido comdimentados por discusiones de temas de arquitectura, tecnología, metodologías, y bueyes perdidos.
Ayer terminamos de definir
He aquí el título, subtítulo y temas a tratar:
Vivir programando
Todo lo que usted quería saber sobre programación y nunca se atrevió a preguntar.
Esta jornada cubrirá aspectos generales relativos al oficio del programador, en un espectro amplio que cubre cuestiones filosóficas, de arquitectura, manejo de equipos, proyectos, etc.
Comenzaremos con una breve introducción (de menos de una hora) en la que revisaremos temas generales:
Historia del oficio de programador
Proyecciones y tendencias
Prácticas de Ingeniería
Prácticas de control de proyecto
Estrategias de comunicación
Durante esta introducción, anotaremos temas específicos a profundizar, los que serán priorizados por el público, de manera de profundizar durante el resto de la jornada en los temas más importantes, hasta donde alcance el tiempo.
Algunos de los temas específicos pueden incluir (pero no están limitados a) los siguientes:
Herramientas, Generación de código, Control de Fuentes, Pruebas Unitarias, TDD, Mock Objects, Inyección de Dependencia, Trabajo sobre código Legacy, Análisis de código, Integración contínua, Lenguajes de Programación, Frameworks, Construcción de APIs, Documentación, Capacitación, Soporte, Actualización Profesional, Entrenamiento, Mejora Continua, Recursos (Libros, blogs, revistas), Open Source, etc.
Programar es una actividad fascinante. Y es parte arte, parte ingenieria. En estos últimos años, la actividad de programar se ha ido haciendo más compleja. Ya no es más el trabajo de alguien en solitario haciendo sistemas en Clipper. Ahora múltiples tecnologías, plataformas, requerimientos cada vez más complejos, trabajo en equipo, varias disciplinas a cubrir, temas de comunicación, organización, capacitación, estilos arquitectónicos, prácticas ágiles, patrones, lenguajes nuevos. ¿Cómo programar, en los tiempos de Internet y aplicaciones distribudas, sin morir en el intento?
Tenemos varias fuentes para consultar, desde los libros como Pragmmatic Programmer, bibliografía ágil, Code Complete, varios de Fowler. Pero, por supuesto, vamos a explotar la experiencia de Martín en el manejo de equipos, y el llevado a buen término de proyectos.
Lo bueno de la charla, es que la gente priorizará los temas que le interesan. No es una charla gratuita (Salías está más allá del bien y del mal, pero yo aún sufro del Efecto Coto... ;-) ). Es el martes 11 de noviembre, de 9 a 13hs. Igualmente, algunos de esos temas seran tratados, con tiempo, en posts, con comentarios y enlaces a recursos. En cuanto tenga los datos de inscripción, dejo el enlace en este post.
Posts relacionados con estos temas:
CodeThinked Estrategia para ser un mejor desarrollador
Matriz de Competencias de Programación
Libro Foundation of Programming, listo para bajar
Aprendiendo de Jason Bourne
Levantando catedrales (ahí, un comentario de Martín fue el disparador de esta charla)
Un programador pragmático
¿Quieren algún tema en especial, de los que estan en el temario? ¿Alguno nuevo para sugerir?
(Espero que alguien recuerde la película a la que refiere el título y la imagen)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
Estoy subscripto al twitter feed de Justin Etheredge. Ayer, publicó el post:
What is your strategy for becoming a better developer-
¡Gran pregunta! Hay tantas respuestas que podrían darse. Puedo escribir algunas de mis favoritas, ahora en español (ayer fue en Anglish, Angel's English en
CodeThinked What is your strategy for becoming a better developer-
):
- Leer: leer revistas, el código de otros programadores, blogs, artículos. No hay excusa, en este mundo tan conectado, para no tomar en cuenta la información, conocimiento y saber de otros. Si uno no tiene tiempo para aprender de otros, estará perdiendo tiempo aprendiendo solo.
- Pensar: Hay que pensar sobre lo que uno lee y aprende. Hay que ejercitar el pensamiento crítico sobre lo que uno conoce, lee y aplica cada día. Un pattern no es una receta escrita en piedra. Un framework X no es la bala de plata que buscamos. Debemos entender cuales son los verdaderos problemas a resolver, en vez de adoptar ciegamente una solución fija. Elevemos nuestro nivel de abstracción, separemos los detalles accidentales del núcleo del problema.
- Escribir: Escriba sus ideas, y lo que aprende. Trate de explicar algo a otro, escribiendo un artículo, post, o dando un código de ejemplo. Para mí, éste es el "deliverable" de cualquier mejora en una habilidad. Como programadores, debemos tener habilidades de comunicación, así podemos pasar nuestras ideas, trabajos, conocimientos e implementaciones a otros. Recuerdo una frase de Richard Feynmann: "si no podemos explicarlo, es que todavía no entendemos el problema". Y si uno escribe sobre lo que aprende, podemos compartirlo con otros. Exponer nuestros descubrimientos de esta forma, es una manera también de recibir "feedback", sobre lo que estamos haciendo. No tema a la crítica: cualquier retroalimentación deberá ser bienvenida.
- Hablar: relacionado con el punto anterior, de una charla sobre el tema que le interesa. Prepare una charla par su grupo local de programación. Ganará visibilidad para Ud. mismo y para su trabajo. Pero el punto principal sigue siendo: cuando Ud. enseña, Ud. aprende.
- Practique: tome trabajos adicionales, haga un "code kata", un ejercicio corto para entrenar sus habilidades. Escriba un mini intérprete, solucione un problema (y para relacionarlo con lo anterior, publique el resultado).
- "Pushing the envelope": salga de su zona de comfort. Aprenda algo nuevo, que no esté entre el conjunto de sus habilidades presentes. Si Ud. es malo en diseño gráfico, vaya e involúcrese en un proyecto que necesite una bonita interfaz de usuario. Si sólo conoce dos lenguajes, o una plataforma, es tiempo de probar otras. Si no se siente cómodo dando una charla, planee dar una: no tiene que ser perfecta, puede darla para su grupo de trabajo, interna. Lo importante es ir mejorando.
Muchas de estas actividades pueden hacerse en grupo. El trabajo de desarrollo de hoy es, en gran parte, trabajo de grupo. Aprenda de otros, de mentoring a otros.
Un post mío relacionado con el tema:
Programmer Competency Matrix
Matriz de Competencias de Programación
Otras respuestas a la pregunta de Justin:
CodeThinked | What is your strategy for becoming a better developer? "Read.... Stretch...."
Jeremiah Peschka "My strategies tie these all together and are pretty simple, really: Learn and Teach."
Ryan Lanciaux "Read... Share... Set Goals..."
Krishna Kumar "make coding...you must do coding outside of office hours....Choose a problem that you want to solve..."
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
Ayer viernes, comenzó mi segunda semana sabática de este año. Generalmente tengo dos semanas sabáticas por año, dedicadas a pensar, leer, escribir, crear y codificar, y a algunas reorganizaciones. Esta "semana" terminará el lunes 29 de septiembre (lo incluye). Prefería viajar, dejando Buenos Aires (Mar del Plata es mi lugar favorito para semana sabática), pero esta vez me quedaré por acá, sin otras obligaciones, excepto codificar para un proyecto en curso. No daré clases, ni charlas, ni habrá reuniones con clientes.
En este post, quiero escribir la lista de lo que quiero hacer técnicamente, en esta semana larga, así me pongo algo de compromiso en cumplir los puntos. La lista es:
- Terminar una primera versión ejecutable de mi intérpreta AjSharp, similar en sintaxis a C#, ahora en desarrollo dentro de mi proyecto AjBasic.
- Escribir el código para soportar un modelo textual en AjGenesis, en lugar de sólo usar archivos XML (que seguirán siendo soportados). Pueden ver algún progreso en el repositorio de código del proyecto.
- Publicar algunos ejemplos de AjGenesis generando archivos para usar LINQ y soluciones, proyectos de Visual Studio 2008.
- Poner algo de amor en el código del proyecto AjTalk, para soportar la lectura y proceso de definiciones de clases desde archivos tipo .st.
- Escribir dos posts sobre AjGenesis.
- Escribir dos posts sobre F#, para ir adelantando temas para el próximo TechNigh.
- Escribir dos posts que traten sobre CCR (Concurrent and Coordination Runtime) de Microsoft Robotics.
(Los posts serán publicados durante esta semana sabático o en la semana que le sigue)
Posibles "overdelivers" (sin compromiso en firme):
- Integración de AjBasic/AjSharp en AjGenesis.
- Publicar una versión nueva de AjMessage, que soporte el transporte de mensajes via DSS/CCR así como por Windows Communication Foundation.
- Escribir una primera versión de entidades en el "cloud", a la Sql Server Data Services (solamente una librería local, API y tests, aún sin soporte de acceso distribuido).
Es un plan ambicioso, pero divertido. Escribiré sobre los resultados al final de la semana sabática. Tengo otra lista de "commitments" no técnicos (como organizar mis libros en mi nuevo hábitat, acabo de terminar de acomodarlos en nueva biblioteca). También quiero postear en mi blog no técnico sobre temas que me interesan (filosofía, ciencia, matemáticas). Pero esta será una semana sabática más dedicada a lo técnico.
(La foto que uso, la robé, emmm... digo, la tomé del post
Making it Look Easy For those on sabbatical, work is its own reward
)
Algunas notas y resultados de mi anterior semana sabática en este año en:
Semana Sabática
Resultados de la semana sabática
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com
Leo en el blog de Arvindra Sehmi que la gente de Tyco Software House implementó un sistema donde usando CCR (Concurrent and Coordination Runtime), la librería que viene dentro de Microsoft Robotics. En su artículo ARCast.TV - Nice Example of CCR Adoption in the Enterprise muestra el video donde la gente de Tyco explica cómo consiguieron procesar gran cantidad de mensajes, basándose en envío asincrónico.
ARCast.TV - Stephen Tarmey of Tyco on adopting Robotics Studio CCR for High Performance Async IO
Me gustaría que mostraran algo más gráfico del sistema que armaron, pero igual es interesante escuchar a alquien que usa a Microsoft Robotics aplicado a la empresa.
Ya Arvindra había comentado usos de DSS/CCR más allá de Robotics en
DSS Use Cases in the Enterprise
Todavía algunos de esos usos no están publicados, pero espero que aparezcan más casos de éxito con el tiempo.
El año pasado escribí y publiqué un ejemplo AjMessages, con intercambio de mensajes asincrónicos, usando WCF como comunicación entre nodos de una grilla:
AjMessages- hacia un procesador de mensajes
También el año pasado escribí una versión para usar CCR internamente, y DSS como comunicación entre los nodos, pero no la publiqué. El núcleo del sistema se puede implantar en un host WCF o en un host DSS. Me gustaría en estos días, pulir un poco el código, y publicar el ejemplo, para ver que uno puede usar CCR internamente para encolar mensajes en memoria, y repartirlos en un pool de threads que maneja internamente CCR, mientras al mismo tiempo, repartimos mensajes en otros nodos de la grilla, si los hubiera, sin mayor problema, para conseguir escalabilidad usando más máquinas de forma transparente. Como ejemplo de uso, podría reescribir el Web Crawler o el programa de Fractal, que escribí directamente para DSS/CCR/VPL:
Agentes Distribuidos y Fractales usando DSS/VPL
Agentes Distribuidos usando DSS/VPL
Pero imaginen que pueden repartir una tarea entre varias máquinas, incluso remotas. Imaginen que pueden enviar una tarea a realizar (como recolectar información para un informe de Business Intelligence) a una sucursal, y otra tarea a máquinas de otra sucursal dentro de su empresa. Pueden recibir los resultados como mensajes, usando un patrón del tipo request-response. Podemos codificar "agentes" que se envíen mensajes entre sí, para colaborar en un objetivo.
Creo que el modelo de mensaje asincrónico junto con la implementación de grilla, puede ser explotado de muchas maneras. Mi idea es aprovechar mi semana sabática (que comienza mañana) para codificar algunos proyectos, y uno de ellos es una versión más terminada de AjMessages.
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
Hoy viene una lista de enlaces, sobre tecnologías, sitios, noticias, de varios temas (siguiendo con el espíritu de la anterior entrega Enlaces y noticias)
Para Noviembre, acompañaré a Martín Salías en una charla para el Microsoft User Group de Argentina, dedicada a visitar y repasar el gran tema de "cómo programar y no morir en el intento". Estamos con Martín meditando los temas, ya tenemos una lista informal, veremos de ir armando la charla de alguna manera ágil, con backlog, iteraciones y demás. Por ahora, ya tenemos el "timebox": hay una fecha para Noviembre. Keep tuned!
El miércoles 10 de septiembre pasado, hubo reunión de Arquitectura y Empanadas, en el MUG de Argentina. Hubo interesantes discusiones sobre SOA, aplicaciones web, el uso de herramientas, y Fabio Maulo estuvo comentando varios detalles sobre el desarrollo de NHibernate y el nuevo sitio de la comunidad http://www.nhforge.org/. Las empanadas estuvieron regadas por gaseosa y latas de cervezas (algunos nos especializamos en estas últimas... :-)). Espero que en breve se repita este tipo de reunión. (Para los que no saben que es una empanada argentina o un repulgue, está el clásico enlace a empanada en Wikipedia).
Ya comenté sobre la reunión del sábado pasado, de Smalltalking, donde asistió Claus Gittinger, creador de Smalltalk/X. Leer Reunión de Smalltalking, con Claus Gittinger y Smalltalk/X.
Ayer fue el cumpleaños del bueno de Roberto Schatz, capi di tutti capi en el tema arquitectos en Microsof. Un saludo desde acá! Vean lo que está haciendo en Puerta 18, en Robótica en Puerta 18.
Apareció un nuevo sitio de comunidad .NET Ideavine- Open source community for .NET. Al parecer, tendran más herramientas de soporte, como un Continuos Integration o similar. Es una creación de James Avery y Nate Kohari.
Si tienen que manejar un equipo distribuido, pueden usar las herramientas de Accelerating Software Development Assembla. Otro lugar, que brinda hosting de SVN es CVSDude- Professional Subversion (SVN) Hosting and CVS Hosting.
Una opinión sobre el avance de .NET sobre Java en .NET outpacing Java-.
Tienen un pdf sobre la implementación con código de la base de .NET en Shared Source CLI 2.0 Internals.
Como saben, soy un entusiasta del uso de modelos para generación de código. Lo importante es el modelo (tema para un próximo post). Entonces, para mí es interesante cómo aparece modelo en el nuevo Oslo de Microsoft. Leer The Origins of Microsoft's Oslo Software Modeling Platform. (se viene un modelo textual en AjGenesis, es decir, en lugar de XML, un lenguaje de texto). Y también me interesa Domain Specific Languages, encontré Embedded typesafe DSLs for Java.
Spring Framework para Java no para de desarrollar nuevas "features". Spring 2.5- New Features in Spring MVC.
Una explicación de por qué JBI (aka Java Business Integration or JSR-208) no despega como Enterprise Service Bus en Enterprise Java Community- The Road to JBI- Paved with Good Intentions.
Veremos que pasa con Rich Internet Applicaciones en Java. Para leer Getting Started With JavaFX Technology.
Un libro que me interesó es Adobe Press - 9780321603944 - Software Pipelines- The Key to Capitalizing on the Multi-core Revo. Podría adaptar mucho de eso a AjMessages y otras formas de aplicaciones distribuidas, no sólo muti-core.
Volviendo a Martín Salías, escribió un post comentando mi anterior El browser de Google- proyecto Chrome , explicando más en detalle lo que se viene con Chrome y la nueva "engine" de Javascript que tiene incorparada. Leer su post Javascript - La programación del futuro (gracias, Martín, por ese guiño en el título recordando a mi libro de Java). Pueden ver el código de la engine V8 en v8 - Google Code. Si quieren seguir de cerca al proyecto, leer su blog oficial Chromium Blog. El código fuente del browser en Chromium - Google Code. El bueno de Scott Hanselman ha comentado sobre la aparición de código de Microsoft en el código de Chrome. Leer The Weekly Source Code 33 - Microsoft Open Source inside Google Chrome.
Encontré por ahí a The Guido van Robot Programming Language lenguaje multiplataforma, para enseñanza de conceptos de programación. Tendría que estudiarlo. Otro con parecida idea es Reeborg's World.
Ejemplos de código Java agrupados por categoría en Java examples (example source code) Organized by topic.
Para los interesados en F#, un punto de inicio con enlaces es F# Programming Fast Guide.
Para los que quieran comenzar un proyecto con NHibernate, y quieren ver cómo se comienza con un ejemplo más de la vida real, leer A Journey with NHibernate - Part 1 y A Journey With NHibernate - Part 2, A Journey With NHibernate (and DDD) - Part 3, A Journey with Domain Driven Design (and NHibernate) - Part 4, A Journey with Domain Driven Design (and NHibernate) - Part 5. Son posts de Ben Scheirman, interesante también Blame NHibernate, Why Not-.
Para los nostálgicos como yo (que recuerdo al Pong de Atari, el próximo nivel en mi adolescencia luego de los flippers... :-)), lean Ten Things Everyone Should Know About Space Invaders. Pueden codificar algo con Space Invaders 101 - An Accelerated Java 2D Tutorial.
Muy interesante el artículo de Fracois Orsini Apache Derby Case Study- Benefits of a Microkernel architecture.
Este es un enlace muy conocido, pero siempre es bueno recordarlo: TIOBE Programming Community Index, donde se listan lenguajes de programación segun su popularidad (ver ahí los detalles de cómo lo miden). No me sorprende el primer lugar de Java, pero no parecen distinguir VB.NET de basic en general, y C# está abajo de Perl. Pero vayan a ver la lista de lenguajes menos conocidos. Creo que es un buen ejercicio, en los tiempos que corren, ejercitarnos en otros lenguajes. Siempre se aprende algo, una nueva perspectiva de los problemas y soluciones.
Soy un entusiasta usuario de Twitter, pueden leerme en http://twitter.com/ajlopez. El sistema es interesante para estudiarlo, como caso de ejemplo (o dis-ejemplo) de escababilidad. Un artículo criticando algo de código de otro microblog en Let the microblogs bloom. Creo igual que el código puede ser mejorado. En el caso de este tipo de aplicaciones, lo importante es la marea de gente que uno tiene, luego la escalabilidad se puede mejorar, cambiando código de base en cualquier momento.
Patrones, estilos arquitectónicos, herramientas, hay muchas de moda. Para comenzar a estudiar Inversion of Control (nombre raro si los hay), pueden visitar primero la introducción y LOS POR QUE de IoC en el post del bueno de Jeremy Miller Before you use an IoC tool, some concepts to know first - Jeremy D. Miller -- The Shade Tree Dev.
Muchos temas de SOA aplicado, en iServiceOriented.com Practical Service Oriented Architecture. Me interesa leer más adelante ahí sobre la implementación de un ESB (Enterprise Service Bus) empezando por Building Our Own ESB - Publish Subscribe Part 1 (7/21/2008)
Matías "El Pibe" Woloski (conocido como gran comedor de cangrejos en China, siempre recordado por su recorrido por la gran muralla enfundado en campera amarilla, lo que le ha valido el apodo en esos lares de "the banana man"... :-)), ha escrito su tesis sobre Software as a Service. Uno de sus posts muestra SaaS Taxonomy Map. Pueden leer sobre el desarrollo de su tesis siguiendo las miguitas de pan que deja en su twitter. Creo que la versión final de la tesis está en Tesis Woloski. Cualquier cosa, vigilan su folder público en Skydrive.
Lean como el bueno de Eugenio Pace descubre una implementación SaaS Eugenio Pace - Software as a Service Architecture Guidance - Northwind Hosting exists, it's bett, y Apprenda - Software as a Service (SaaS) Platform.
En mi anterior Noticias y Enlaces, mencionaba a mi mejor post de este año Posmopolitan. Ahí usé texto generado por computadora. Si alguna vez no estan inspirados, pueden también usar el servicio de Computer poems.
Un poco de humor geek en If People Bought Cars Like They Buy Computers. Con tantas tecnologías y siglas en Web 2.0, un refrescante How to be an instant Web me-2.0 developer.
Me gusta Linux, pero no todo es un lecho de rosas. Creo que este enlace lo encontré en el twitter de Miguel de Icaza o del bueno de Cazzulino: Linux Hater's Blog.
Estoy planificando mi segunda semana sabática del año. Me temo que tendré que seguir atendiendo a algún cliente de programación, pero suspendo mis cursos por 9 días. Comienzo el sábado, veremos qué entregables me comprometo al terminar en esa semana.
Y como siempre al final, un off topic total: el bueno de Sebastian Bassi, del Club de la Razón y Genes Digitales, está vendiendo islas en la Patagonia. Yo no voy a comprar, recien tiré... :-)
Bueno, basta por hoy, espero que encuentren algo útil en todo este rejunte de enlaces... :-)
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez
http://friendfeed.com/ajlopez
Gracias a la gente de Microsoft de Argentina, en especial al bueno de Miguel Saez, tendré el gran gusto de participar de un Tech Night, para el viernes 10 de Octubre, aquí en la sucursal de Buenos Aires, acompañando a Martín Salías y Rodolfo Finocchieti. El tema es los lenguajes de programación, sus paradigmas, en especial, su implementación en .NET. Ya al final de 2005, Martín y yo dimos un TechNight, sobre implementación de distintos lenguajes sobre .NET. En mi opinión, la máquina virtual de .NET (jeje, no van a encontrar un microsoftie que diga "máquina virtual", se les traba la lengua antes, pero es así, es una máquina virtual, como la de Java, ¿vió, señora?), ha sido diseñada con operaciones adicionales a las que tiene Java, y desde el vamos, está preparada para ser usada con otros lenguajes encima, no solamente Visual Basic o C#. Esto ha provocado que la comunidad haya ido montando compiladores, intérpretes sobre .NET. Algunos apuntes sobre esa antigua charla en:
Material de Lenguajes en .NET
Material del Seminario Dialéctica del Software (mostrando un poco la cocina).
Martín ha posteado sobre este nuevo Tech Night:
Technight en proceso
con el abstract:
Programando en Babel: Esos raros lenguajes nuevos
.NET como máquina virtual permite la implementación de múltiples lenguajes. Originalmente el CLR brindó un excelente soporte para lenguajes estáticos y algunos funcionales, proveyendo un sistema de tipos comunes, un garbage collector y varios mecanismos que facilitaban la implementación de lenguajes interpretados y compilados, capaces de reaprovechar la Base Class Library. El nuevo Dynamic Language Runtime (DLR) extiende este poder a los lenguajes dinámicos y otros más experimentales, e incluso está impactando a nivel de diseño las próximas versiones de la plataforma.
En esta sesión haremos una puesta al día sobre las últimas versiones de lenguajes como F#, Boo, ajBasic, IronPython y varios otros. También charlaremos de características generales del campo de diseño de lenguajes y los objetivos de mantener esta variedad. Finalmente, especularemos sobre el impacto que tiene la problemática del desarrollo de lenguajes sobre el futuro de la plataforma .NET.
Me gusta lo de "Programando en Babel", así, que un rapto de originalidad, "copié" la idea de la imagen que puso Martín en su post, y lo puse en este (curiosamente, la imagen original la tomé del artículo técnico Weaving the multilingual Web - Standards and their implementation).
El bueno de Rodolfo (alguien a quien le gustan los lenguajes de programación y la historia de las matemáticas, no puede dejar de ser bueno... :-)... tampoco puede dejar de ser bueno quien escribe un web service dinamyc proxy o un Service Invocation Framework y lo publica), ya estuvo dando con Martín un TechNight sobre DLR (Dynamic Language Runtime) en .NET. Ahora se presentará más trabajo sobre lo que se construyó encima de eso.
Mi participación se centrará en la programación funcional en general, y en F# en particular. Es interesante ver cómo un paradigma algo alejado del "mainstream" igual tiene su lugar, y hasta ha influido en algunas características de .NET, como la aparición de las expresiones lambda.
En el temario quedó también AjBasic, que será un ejemplo de intérprete, con objetos dinámicos y extensibles.
El futuro mostrará qué pasa con el soporte de lenguajes dinámicos en Java, hay que seguir el proyecto de máquina Da Vinci (vean cómo los bytecodes originales de Java tienen que ser extendidos).
Algunos enlaces como aperitivo:
AjBasic- un intérprete Basic de código abierto
AjLisp- un intérprete Lisp en .NET
AjTalk- un intérprete tipo Smalltalk
Recursos de F#
Post sobre F#
http://delicious.com/ajlopez/dlr
http://delicious.com/ajlopez/f%23
http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/lisp
http://delicious.com/ajlopez/haskell
http://delicious.com/ajlopez/erlang
http://delicious.com/ajlopez/ocaml
a-dynamic-language-runtime-dlr.aspx
dlr-trees-part-1.aspx
a-dynamic-language-runtime-dlr.aspx
No sé si conocen cómo termina un TechNight de Microsoft Buenos Aires: con cerveza y papas fritas. Yo creo que voy a ir nada más que por eso... :-).... Hubo un tiempo que había pizza también (recuerdo eso de las reuniones en la segunda oficina de MS en Argentina, en Libertador casi 9 de Julio), pero alguna vez dejamos demasiado sucio el lugar (quedó alguna anchoa en la alfombra) y alguien de la sucursal se enojó.... Bueno, no se puede tener todo en la vida... :-)
Creo que todavía no está publicada la inscripción, pero seguramente aparecerá en:
MSDN Eventos Latam
Nos leemos!
Angel "Java" Lopez
http://www.ajlopez.com/
El sábado pasado, 13 de septiembre, asistí a la reunión de Smalltalking. Esta vez, la reunión fue un café cerca del edificion de la Biblioteca Nacional, aquí en Buenos Aires, Argentina. El grupo es pequeño pero entusiasta, y las discusiones fueron muy interesantes.
El primero en llegar fue Leonardo de Marco, que en estos días está cambiando su vida laborar, para dedicarse de tiempo completo al desarrollo de Smalltalk. Alejandro Reimonde, el "jefe" del grupo, llegó un poco más tarde de las 10hs. Otros miembros que asistieron fueron Esteban Lorenzano, Diego Coronel, Matías Castilla y Juan (sólo Juan, no tengo el apellido...).
Alejandro Reimondo es un referente en el campo del desarrollo en Smalltalk, conocido en el mundo, que ha trabajado desde hace décadas con esta tecnología. Es el fundador del grupo Smalltalking, dedicado a la difusión y discusión de desarrollo de software y más, con Ambientes de Objetes Virtuales. Ya había comentado por este blog sobre su actividad en el desarrollo de multitouch (ver Más sobre multitouch screen).
Esteban Lorenzano enseña arquitectura de proyectos IT, en la Universidad Tecnológica Nacional, de Buenos Aires. La página de la cátedra es:
http://apit.wikidot.com/
Es uno de los fundadores de la nueva empresa Smallworks, dedicada al desarrollo de software usando Smalltalk. Los fundadores son ex Snoop, entre ellos, veo a Evagenlista, al que conocí en algún curso mío hace años.
Diego Coronel tiene una compañía, Informagine (no dió el enlace, supongo que es http://www.informagine.com ), con trabajos para el estado argentina, usando Smalltalk, ahora está trabajando mucho con México. Vive en los dos paises. Curiosamente, Diego y Esteban conocían los mismo lugares de México DF, e intercambiaron impresiones sobre cómo es vivir en esa ciudad, y cómo México albergó y recibió a argentinos, tanto en los años difíciles del siglo pasado, como en este siglo, luego de la "debacle" de 2001.
Matías Castillas es estudiante, vino desde la La Plata (unos 70 km de Buenos Aires). Nos faltó otro platense, Elvio Fernandez, que esta vez no pudo asistir a la reunión. El año pasado, el bueno de Elvio fue anfitrión de otra reunión del grupo, donde hubo buenas charlas, discusiones, una raviolada, y algunas botellas de tinto, que muchos de los integrantes actuales estamos extrañando.
En esta reunión, como en otras, hubo varias discusiones, exposiciones, de distintos temas. Las reuniones no se organizan por temas y tiempo, o apenas, así que muchas veces derivan en temas que no se habían propuesto. Pero siguen siendo interesantes. Entre los temas discutidos estuvieron: la sustentabilidad del desarrollo de código abierto, la situación de la educaciónde objetos y conceptos de arquitectura en Argentina, la escasez de gente, en Smalltalk y otras tecnologías, la rotación de los desarrolladores en las compañías, y el alto salario que se ofrece a desarrolladores juniors, debido a la situación global del desarrollo, y el cambio peso/dólar en Argentina, que hace redituable el trabajo para el exterior.
Con respecto a la rotación, yo podría dar referencias de cómo no tener ese tipo de problema. Pero eso será tema de otros posts. En resumen: hay que dar el ambiente y los desafíos adecuados, para que la gente quiera seguir participando en la misma compañía. También, es importante elegir bien a la gente: es más importante tener la gente adecuada, con una actitud proactiva, y de constante aprendizaje y mejora, en vez de buscar "desarrolladores Java que conozcan Struts" o ese tipo de pedidos.
No se mencionó mucho sobre el tema de metodologías ágiles, que me parecen hoy por hoy, fundamentales para encarar el desarrollo con poca gente. He conocido casos de éxito (y también de fracaso) de excelentes desarrollo con poca gente. Incluso los fracasos enseñan qué tipo de proyectos y de gente necesitamos para avanzar, si tenemos una empresa o un grupo interno de desarrollo.
Alejandro comentó su viaje a Postdam, donde asistió a
Workshop on Self-Sustaining Systems (S3) 2008
The Workshop on Self-sustaining Systems (S3) is a forum for discussion of topics relating to computer systems and languages that are able to bootstrap, implement, modify, and maintain themselves. One property of these systems is that their implementation is based on small but powerful abstractions; examples include (amongst others) Squeak/Smalltalk, COLA, Klein/Self, PyPy/Python, Rubinius/Ruby, and Lisp. Such systems are the engines of their own replacement, giving researchers and developers great power to experiment with, and explore future directions from within, their own small language kernels.
Acá había posteado sobre el tema y el trabajo de Piumarta en:
Self-sustaining Systems, Cola, Pepsi, Coke y Mate
Alejandro comentó que le interesó el trabajo de Richard Gabriel, de IBM (su página personal y bio en Richard Gabriel personal page). Pueden ver el trabajo presentado por Gabriel en:
http://www.tele-task.de/page50_lecture3625.html
Esperamos que sea un tema a tratar en una próxima reunión de Smalltalking (con raviolada y pingüinos de tinto en lo de Elvio... ;-)
Pero la estrela de la reunión, fue Claus Gittinger, fundador de