17 de noviembre de 2007

Prism y nuestro IDE

Me entere que Mozilla había "relanzado" una especie de "Firefox-light", es decir un Firefox que permite correr un solo sitio , impidiendo la navegación por otras urls. La aplicación se denomina ahora "Prism", y antes era conocida como "WebRunner".

Leyendo sobre las ventajas (menor consumo de recursos, mayor seguridad, etc.) se me ocurrió que podía ser el compañero ideal de nuestro "IDE" para desarrollar sitios web y no esperar tanto cada vez que "recargabamos" el proyecto. Así que lo puse a prueba con VS2005 y anduvo bárbaro, cargando como esperaba "muchísimo" más rápido el proyecto para debuguear.

Para hacerlo procedan así
  1. Generen un "Acceso directo" con Prism con el URL de su aplicación por ej: "http://localhost:4401/Website/Default.aspx".
  2. luego tomando de la hoja de propiedades del Acceso Directo que genero Prism los valores del campo "Destino"

  3. configuren en las opciones de Inicio en el menu WebSite de VS2005, poniendo en este caso en el campo de
    "Start external program": C:\Archivos de programa\Prism\prism.exe
    y en el campo "Command line argument": -webapp TestPrisma@prism.app

  4. Aplicar, y listo.

3 de septiembre de 2007

Agradecimiento y deuda

Hoy abro el correo de la lista de arquitectura del MUG y encuentro el post que escribío Angel sobre la charla que dio el viernes y que ya les comente . Y me llevé la grata sorpresa de ser citado en él, y en su blog, lo cual le agradezco.
Próximamente subire una version mejorada de "templates compilados" para aclarar un poco màs el asunto

31 de agosto de 2007

Templates compilados?

Hoy, luego de asistir a una charla en el "MUG" dictada por el "maestro" Angel sobre generación de código y su excelente "ajgenesis", me quede "tildado" en la relación entre templates, código "vivo" y su actualización de forma dinámica. Ya que uno de los grandes problemas de la "generación de código" es la actualización del código generado, sobre todo si estamos produciendo software de una forma incremental. O sea, si actualizamos el "template", como "brodcastiamos" o difundimos eso en el "código" ya generado, y por sobre todo no pisamos el "ajuste fino" que hicimos sobre él.

Por otro lado, habitualmente para generar un template en alguna herrmienta de generación de código lo que hago es reemplazar las partes "variables" de un codigo en el lenguaje original que estoy trabajando y lo reemplazo por los token que me da el generador. O sea algo así:

"EditPersona" se transforma en "Edit${NombreEntidad}".

Esto implica abrir el notepad buscar "Persona" y reemplazarlo por "Edit${NombreEntidad}". Esto sucede cada vez que cambio mi código "fuente", o sino debo agregar a "pelo" en el template lo que modifique sin garantía de que este código este compilado. Demás esta decir que si son muchas las variables a reemplazar y muchos los templates a actualizar el trabajo se torna largo, y tedioso.

Lo ideal sería entonces que:
  1. El template "compilara".
  2. Que en el proceso de re-generación no pisará nuestro "ajuste fino".
Lo que les dejó aquí es una especie de "prueba de concepto" que me gustaría profundizar con la opinión de ustedes. Solamente atacá el primer problema, ya que es un mero ejemplo que más que ofrecer una solución lo pongo para explorar una idea. Esta realizado simplemente con NAnt y algún "truquillo" en el código c#.

Para usarlo simplemente tenemos que respetar que las variables/string que queremos reemplazar empiezen con "_" y terminen con "0", (se pueden elegir otros que c# permita) , lanzar el build de NAnt (GeneraEntidad) y luego recargar el proyecto. El único problema es que deberán comentar el código de cada generación de entidad ya que NAnt NO "puede"!!! sobreescribir sus propiedades.

Los comentarios estan abiertos para opinar

16 de agosto de 2007

Presentando a Quetzal

Como dijimos en el blog introductorio Quetzal es un framework de librerías de mi autoría, realizado en c# que consta de dos capas:
  1. La capa de descripción del modelo (Model Descriptor): que comprende las clases que describen el modelo inferido a partir de las clases del dominio. El cual puede ser "refinado" desde el evento Init.
  2. y la capa de automatización que comprende las librerías que generan distintos artefactos de nuestra aplicación. De esta capa solo desarrollé dos librerías:
    1. Automation.UI: para la generación de pantallas.
    2. Automation.NH: para la generación de los .hbm para NHibernate.
Quizas una imagen describa mejor lo dicho:


Existe una tercera capa de servicios, que no aparece en el gráfico, y que por ahora sólo contiene unas tareas en NAnt que permite ejecutar unos templates de NVelocity inyectandole el modelo descripto.
Vale la pena decir que si bien esta es mi cuarta version de las librerías, (hace casi un año que empecé) estas continuan aún en un estado beta en el caso de Model Descriptor y Automation.UI y en un estado alfa Automation.NH.


15 de agosto de 2007

Introducción a Quetzal

El surgimiento...


Hace varios años que vengo girando alrededor del tema de ser "productivo" en mi trabajo, y a su vez me aburre mucho "copiar y pegar" código y luego reemplazar, para hacer aplicaciones nuevas, sin hablar de los riesgos que esto implica. Así es que siempre he tratado de construirme algún framework, o herramientas que me ayudaran a evitar esta tediosa tarea.
Unos de mis primeros intentos fue por Marzo del 2002 con un proyecto de "generación de código" que se llamo "GenClases" y que realice en VB6 + XML + XSLT. Demás esta decir que fracasé en tanto que debía escribir las XSLT(o sea los templates) para hacer las transformaciones. Un trabajo que luego de cierto grado de complejidad se torna "inhumano".
Luego vino .Net, c#, CodeSmith, MyGeneration, NHibernate, Patrones, DDD, ASP.NET 2.0, AJAX etc. por lo que pasó un tiempo hasta que logre reacomodar la cabeza para insistir con el tema y finalmente pude volver a la tarea de hacer algo que me ayudara en la generación de mis aplicaciones.

Pero... que es Quetzal?


Quetzal es un framework de librerías desarrollado en C#, que junto a otras herramientas como NAnt y NVelocity, permite la creación de aplicaciones y sus multiples artefactos, a partir del código escrito para las clases del dominio de la aplicación.


Algunos antecedentes


Es dificil entender el "punto nodal" de Quetzal sin ver un panorama de las herramientas de "automatización" para la generación de aplicaciones.
Una primera aproximación es la de los "generadores de código". Angel "Java" López ha escrito muy, mucho y bien sobre el tema (y en castellano para colmo) lo que me ahorra de escribir unos buenos párrafos sobre esto.
Pero tambien hay frameworks, como "MonoRail" que van más allá de la generación del código y parte de su "trabajo" lo realizan de forma dinámica o en "runtime" como en el caso de la generación de los .hbm de NHibernate con "Castle ActiveRecord".
Otra mirada del asunto la encontrmos en "Naked Objects" para el mundo Java, con su "futura" versión optimizada para .net, donde solamente debemos escribir "una" capa (la del dominio) para tener la aplicación hecha. Y no sigo más para no aburrir y porque con esto me alcanza para marcar algunas diferencias en la visión de Quetzal.
Queda sin embargo un tema importate en todo esto : LOP o "Lenguajes Orientados a la Programación", una especie de "esperanto" para programar, pero me referiré a esto más adelante .

Los problemas de estos enfoques


En la mayoría de las estrategias de los "generadores de código" el modelo esta separado de la aplicación, siempre hay una metadata que define al dominio de la aplicación que es distinta del codigo de las clases, siempre debe sucederse una transformación con el consiguiente problema de el "gap"(distancia) posible entre el modelo de la metadata y el modelo de la aplicación. A esto debemos sumarle que pasa con el código "nuevo" agregado, ante una nueva generación, "partial class" y herencia juegan aquí su rol para garantizar la "sincronía", que si no esta prevista implica "fuertes" dolores de cabeza.
En cambio los frameworks como Mono Rail, tienen el problema de que estan "atados" a una "arquitectura" y en este caso tambien a una tecnología (NHibernate con ActiveRecord), entiendo que su uso no es excluyentes, pero implican un costo y pierde algo de la gracia de su uso.
El enfoque en cambio de Naked Object, que es el que más me simpatiza en términos de "productividad", implica escribir el dominio de una forma "extraña", definiendo las clases del dominio con los tipos que propone el framework, pudiendo implicar que ciertas actualizaciones del lenguaje impliquen la actualización previa del framework para su utilización. Tambien tiene su costo en el entrenamiento, si trabajamos con personas no entrenadas en el framework

Que sería entonces lo deseable de un generador de aplicaciones?


  1. Poder escribir el modelo en el mismo código de la aplicación.
  2. Que no implicara acoplamiento alguno con una determinada tecnología.
  3. Que no usara otro tipo de clases para definir el dominio que nos impidan reutiliazar lo ya codificado y que la curva de aprendizaje sea leve.
  4. Que no usen bases de datos para inferir el modelo, evitando así la impedancia entre objetos y tablas.
En la próxima entrada les presento a Quetzal.

Extendiendo las propiedades de una clase dinámicamente

El otro día estaba tratando de pasar parametros de una forma "muy" desacoplada, pero con cierto "rigor" y salio esto. No se que tan correcto sea, pero lo comparto por si a alguien le sirve.

/// <summary>
/// Parametros para extender dinámicamente las propiedades
/// </summary>
Dictionary<string, object> _parameters = new Dictionary<string, object>();
public void SetParameter<T>(string name, T value)
{
if (_parameters.ContainsKey(name))
_parameters[name] = value;

else
_parameters.Add(name, value);
}

public T GetParameter<T>(string name)
{
try
{
if (_parameters.ContainsKey(name))
return (T)_parameters[name];
else
throw new Exception("El parametro solicitado no existe");
}
catch
{

}
return default(T);
}