Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

October 2008 - Posts

Manejo del riesgo en proyectos

El bueno de Maximiliano Amoretti ha escrito una serie de posts sobre manejo del riesgo en proyectos de software:

- Administración de riesgos" href="http://blogs.southworks.net/mamoretti/2008/10/11/risk-management-i-administracion-de-riesgos/">Permanent Link to Risk Management Idea- Administración de riesgos

Permanent Link to Risk Management [II]- Herramientas para la administración de riesgos

Permanent Link to Risk Management [III]- Aplicación del Radar de Riesgos

Maximiliano ha participado de varios proyectos, y ha sido uno de los líderes de un proyecto a principios de año, que involucró varias semanas, nueva tecnología, y presión de tiempo (timeboxed), con definiciones que cambiaban en el tiempo, todo manejado desde un proceso ágil a la Scrum.

Al comienzo del primer post recuerda la frase:

“En todo contexto de la vida, la primera y más importante manera de evitar víctimas y desastres, es comenzando por la prevención. ¿Por qué no en nuestro proyecto?”

Ciertamente, es una práctica a recomendar en varios proyectos. Ya escribí algunos puntos de lo que puede ir mal en un proyecto, para destinarlo al fracaso:

¿Por qué fallan los proyectos de software-

Algunas frases a destacar de los posts:

El monitoreo debe ser mirando hacia el futuro, y no al presente. El “radar” debe estar encendido constantemente.

Informar: Tener conciencia de las cosas elimina dudas y sorpresas .... “El que avisa, no traiciona…”

Las herramientas deben ser ágiles, simples y estar siempre a la vista.

Muchas veces nos olvidamos de esos puntos. Lo de "estar siempre a la vista" lo extendería a todo el equipo. Cuando hay un equipo donde, digamos, un Project Manager, no comparte esa información, es un indicio de problema. La comunicación de los posibles riesgos de todo tipo, y sus mitigaciones, tiene que darse de tal forma que todo el equipo esté advertido, "aware", de lo que pueda suceder.

Es interesante que Maximiliano mencione una herramienta de representación gráfica, el Radar de Riesgos. Como seres humanos, captamos mejor la situación con una imagen, que tal vez con un informe o cifras. Las habilidades de presentación de una situación, no deben minizarse en un proyecto, y menos, en un proyecto ágil. Tratemos siempre de obtener alguna representación gráfica del estado del proyecto, su evolución, y otras métricas. No tienen por qué hacer un gráfico con un gran programa: un dibujo en papel, basta para transmitir la idea. Lo bueno de las herramientas gráficas, es que podemos cambiar los datos, sobre el mismo gráfico, y cortar/pegar lo producido en otros documentos.

Les recomiendo una lectura de los libros mencionados en los posts, especialmente el de Covey (más allá del desarrollo de software) y el de "Practical Project Initiation". Siempre es bueno encontrar posts que mencionen las fuentes, para poder ir profundizando en el tema tratado.

Un tema a discutir lo encuentro cuando Maximiliano comenta sobre los riesgos técnicos:

... Suelen ser comunes, pero a mi parecer, son los de más fácil mitigación. En un equipo con ganas, la mayoría de las veces se podrán resolver los nuevos “desafíos”, o buscar un camino alternativo.

Como muchas otras cosas, depende del contexto. Hay proyectos donde su núcleo se basa en una tecnología que no es "negociable". Si lo que estamos haciendo es una aplícación de referencia de la tecnología X, y la tecnología X no funciona, estaremos en problemas. Si por razones externas, tenemos que usar la librería Y y encontramos problemas, no siempre es fácil encontrar un camino alternativo. Pongan EJB en lugar de X e Y, y verán lo que puede ser el camino del infierno... ;-)

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Fri, Oct 31 2008 13:22 by lopez | 1 comment(s)

Cantando bajo las burbujas

Encuentro en el blog de Martin Varsavsky el post

Look at what some smart people were singing in 2006

Vean el video

Muy gracioso!

Bueno, ¿pero será así? Digamos que las ideas están floreciendo desde todos lados, basta ver el último TechCrunch. En este "nuevo mundo Web 2.0", parece que lo importante es tener una idea basada en web, con gran cantidad de usuarios. Facebook es un ejemplo paradigmático, excelente idea desde el punto de vista de desarrollo de software. Notablemente, otras ideas como Twitter, han tenido un gran impacto en la relación de mucha gente (una minoría dentro del mundo real), sin tener tanto trabajo de armado como en el caso de Facebook. Igualmente, es admirable el esfuerzo y la creatividad, y el trabajo que se ha puesto para resolver problemas técnicos como la escalabilidad.

Pero el tema es otro: ¿valen tanto las compañías? Más allá de Google, que parece tener una "cash cow" en su modelo de publicidad, que le permite soportar y armar nuevos proyectos, y Amazon, que desde hace más de una década también tiene su "cash cow", no veo tan fácil respaldar los valores que se están manejando para otras empresas.

¿Será otra burbuja?

Me gustaría que todas estas nuevas empresas sobrevivan, si es que le dan algo de valor a sus usuarios. Habrá que ver si lo consiguen, sin pasar por una "inflación valorativa" en el medio.

Ese nuevo tipo de aplicaciones, están para quedarse: la aparición de pequeños dispositivos cada vez más potentes, el acceso de Internet desde "cualquier" lado, la sincronización de datos y aplicaciones, en distintos puntos del planeta, la interacción con las personas, y más, hace que un grupo de la humanidad (insisto, un grupo, habrá que ver cuán representativo es), esté formando algo nuevo.

A mí, me interesa más Internet, y la Web en particular, no tanto como ambiente de relación inmediata (mensajería instantánea, microblogging) o de relación (redes sociales), sino como un lugar para compartir y difundir conocimiento, por un lado, y dar herramientas para hacer. Si la comunicación inmediata y las redes, se quedan solamente en relacionarnos, pero sin encarar algo para hacer, pierde para mí algo de su encanto. Veremos donde llegamos con todo esto, y que cambios realmente profundos traerá.

Mientras, un botón de muestra, el trabajo de Instedd:

http://www.instedd.org/

donde está el bueno de @edjez, con ayudas como la de @kzu y cía.

Mientras, sigo twittereando... ;-)

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Thu, Oct 30 2008 11:28 by lopez | with no comments

Filed under:

Resultados de la Semana Sabática

Desde el 19 al 29 de septiembre pasado, tuve mi segunda semana sabática del año, sin cursos, sin entrevistas, sin charlas, dedicadas a desarrollo y estudio. Había publicado lo que quería hacer y producir en esa semana.

Segunda Semana Sabática del año

Ya pasó el tiempo, es hora de escribir los resultados. Creo que nos sirve escribir lo que uno quiere hacer, y también publicar los resultados. Así que estos post, el anterior y el actual, son algo necesario para el proceso: son parte de los "deliverables" del proyecto.

La lista a producir y lo producido:

- Terminar una primera versión ejecutable de mi intérpreta AjSharp, similar en sintaxis a C#, ahora en desarrollo dentro de mi proyecto AjBasic. COMPLETO Pueden ver el resultado en el código del proyecto, donde quedaron dos nuevas solucíones que definen el nuevo lenguaje. Escribí un post explicando algo de la implementación en

AjSharp- un intérprete a la C Sharp, trabajo en progreso

- 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. COMPLETO Finalmente quedó implementado. Escribí sobre el tema en

Modelo textual para generación de código con AjGenesis

También hay ideas nuevas para implementar:

Otro modelo para AjGenesis

- Publicar algunos ejemplos de AjGenesis generando archivos para usar LINQ y soluciones, proyectos de Visual Studio 2008. COMPLETO Finalmente

- 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. COMPLETO Ahora se puede cargar código desde archivos .st, pueden ver algunos tests en el código publicado. Faltan varios detalles de lenguaje y parseo mismo, como el soporte de bloques entre [ y ] y la invocación de primitivas desde ese texto a cargar, y el manejo de variables indexadas. Luego de la semana sabática, seguí probando el nuevo Loader, y está interesante: es cuestión de completar esos puntos y comenzar a implementar la librería base. Estoy estudiando la implementación que viene con Smalltalk/X.

- Escribir dos posts sobre AjGenesis. COMPLETO Fueron los post

Generación de código para LINQ y C# 3.0 con AjGenesis

y el ya mencionado

Modelo textual para generación de código con AjGenesis

- Escribir dos posts sobre F#, para ir adelantando temas para el próximo TechNight. PARCIAL Escribí un post sobre

Recursos de F# y Programación Funcional

pero no el segundo. Como compensación, escribí en detalle sobre la charla del TechNight en

Babel de lenguajes en .NET

- Escribir dos posts que traten sobre CCR (Concurrent and Coordination Runtime) de Microsoft Robotics. PENDIENTE Tengo escrito un ejemplo corto introductorio, pero falta pulirlo.

No hubo "overdeliveries" en el producto de la semana, pero con el impulso de lo hecho y estudiado en la semana sabática, luego aparecieron:

http://code.google.com/p/ajfunc Implementación de un lenguaje funcional, AjFunc, siguiendo la sintaxis y semántica de F#. Falta el soporte de inferencia de tipos, y mil detalles más. Pero ya va tomando forma el núcleo.

http://code.google.com/p/ajlogo Una implementación del lenguaje Logo. Dando los primeros pasos.

http://www.codeplex.com/ajmessages La publicación de un AjMessages sobre DSS/CCR. Lo había escrito el año pasado, pero ahora lo actualicé, lo pulí un poco. El año pasado también hubo un ejemplo sobre WCF. Próximos pasos: unificar los ejemplos, mejorar la serialización de los objetos, mejorar la configuración. Un post describiendo algo de la nueva implementación en:

Aplicaciones distribuidas con AjMessages usando DSS/CCR

Como en otras semanas sabáticas, me divertí muchísimo, y aparte me entrené y aprendí cosas nuevas.

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Sat, Oct 25 2008 9:58 by lopez | with no comments

Proyecto Tocatú

El bueno de Leonardo de Marco y sus compañeros (no tengo los nombres completos acá, ni los encuentro en la página, Gabriel y Marite, y la participación de Alejandro Reimondo) estuvieron trabajando largo tiempo en su tesis y trabajo, de interface multitouch. Ahora pueden ver el resultado en:

http://www.tocatu.com.ar

Explica Leonardo:

El proyecto TocaTú es producto de mas de un año de investigacion y trabajo (esporadicas pero muy divertidas por cierto) en la que junto a Ale, y luego con Gabriel y Marite fuimos avanzando en la construccion de una idea que agrupara las diferentes aplicaciones o casos de uso en que es posible utilizar la tecnologia de vision por computador.
La parte de Software esta totalmente construida en Smalltalk basado en el framework de Ale de OpenCV (http://alereimondo.no-ip.org/OpenCV) y la librería Touchlib (http://www.whitenoiseaudio.com/touchlib/).

Además de haberlo armado y llevado adelante, hoy el proyecto se presenta en INNOVAR 2008!

"El Concurso INNOVAR se proyecta como un espacio permanente de soluciones a los problemas que deben enfrentar y resolver los emprendedores, en el campo del diseño, la tecnología y el comercio, para que sus creaciones lleguen y se difundan en el mercado. Los objetivos de INNOVAR son estimular y difundir los procesos de transferencia de conocimientos y tecnología, aplicados a productos y/o procesos que mejoren la calidad de vida de la sociedad."

Desde acá, felicitaciones y mucha suerte, a Leonardo y sus compañeros.

Más sobre interfaces y multitouchs en:

Posts sobre interfaces

http://delicious.com/ajlopez/interface

Touchless SDK de código abierto (para comenzar a probar multitouch con solo una webcam).

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Wed, Oct 22 2008 11:41 by lopez | 5 comment(s)

Filed under: ,

Máquinas de Estado en C# 3.0 usando AjGenesis

Recientemente encontré el trabajo de Andrew Matthews:

Permanent Link to State Machines in C# 3.0 using T4 Templates

Tomé el ejemplo y lo reimplementé usando mi proyecto de generación de código AjGenesis. Para correr este ejemplo, tenemos que bajar la última versión publicada 0.5 desde la página del proyecto en Codeplex.

(más información sobre el proyecto, ejemplos, explicación del funcionamiento en mis anteriores posts).

Pueden bajar el código de este ejemplo.

El modelo que usé es el mismo del post original de Andrew:

<?xml version="1.0" encoding="utf-8" ?> <StateModels> <StateModel ID="My" start="defcon1"> <States> <State ID="defcon1" name="defcon1"/> <State ID="defcon2" name="defcon2"/> <State ID="defcon3" name="defcon3"/> </States> <Inputs> <Input ID="diplomaticIncident" name="diplomaticIncident"/> <Input ID="assassination" name="assassination"/> <Input ID="coup" name="coup"/> </Inputs> <Transitions> <Transition from="defcon1" to="defcon2" on="diplomaticIncident"/> <Transition from="defcon2" to="defcon3" on="assassination"/> <Transition from="defcon3" to="defcon1" on="coup"/> </Transitions> </StateModel> </StateModels>

(Andrew escribió que ha sido influido un poco por la serie de TV 24, al elegir los estados del ejemplo... ;-)

Modifiqué la solución original:

Ahora, hay un archivo Model.xml que contiene el modelo de arriba. El archivo MyStateModel.cs es automáticamente generado desde el modelo. Cambié la solución para tener un evento de Pre-Build en el proyecto TestHarness:

$(ProjectDir)..\VsMakeStates.cmd

El archivo .cmd contiene:

cd ..\..\..
c:\ajlopez\ProyectosNet2\AjGenesis-0.5\bin\AjGenesis.Console TestHarness\Model.xml GenStates.ajg

(TENEMOS que cambiar la segunda línea para apuntar al directorio binario de AjGenesis 0.5)

Con este comando, AjGenesis.Console carga el modelo desde el archivo .xml, y aplica una tarea, GenStates.ajg, escrita enwritten in AjBasic:

for each StateModel in StateModels
    TransformerManager.Transform("State.tpl","TestHarness\${StateModel.ID}StateModel.cs",Environment)
end for

Hay otro comando, que podemos lanzar directamente desde la línea de comando, MakeStates.cmd, conteniendo:

c:\ajlopez\ProyectosNet2\AjGenesis-0.5\bin\AjGenesis.Console TestHarness\Model.xml GenStates.ajg

Amo mi template AjBasic en GenStates.ajg ;-) un fragmento:

using System; using System.Collections.Generic; using Aabs; using Core; namespace ${StateModel.ID} { public enum ${StateModel.ID}States : int { <# sep = "" for each State in StateModel.States #> ${sep}${State.ID} // ${State.name} <# sep = "," end for #> } // end enum ${StateModel.Id}States ...

Está basado en archivo .tt de Andrew Matthews. Notemos que no hay referencia a nodos .XML o similares. AjGenesis carga el modelo en memoria, como un objeto dinámico. El lenguaje AjBasic puede acceder al modelo, usándolo como un objecto cualquiera. El uso de ${ } reemplaza la salida con algún valor, tomado de las variables o del modelo en proceso.

El principal punto en este ejemplo es que está basado en un modelo libre (AjGenesis puede cargar cualquier modelo, no se usa uno predefinido). Si uno quiere agregar más información, podemos escribir más atributos, elementos, en el archivo .xml. Y usarlos desde el código de template. No hay un esquema fijo.

Otro punto a destacar: el ejemplo podría ser modificado para generar la solución Visual Studio completa, o para generar una solución en otro lenguaje (un ejemplo generando una solución VS completa:
Code Generation for LINQ and C# 3.0 with AjGenesis
)

Gracias a Andrés por un ejemplo tan interesante. Pueden leer más sobre su implementación en el post mencionado:

Permanent Link to State Machines in C# 3.0 using T4 Templates

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Posted Tue, Oct 21 2008 10:39 by lopez | with no comments

Ideas para un proyecto geospatial

El viernes pasado, asistí al MVP (Most Valuable Professional) Open Day, en la sucursal de Microsoft en Buenos Aires. Fue un gusto encontrarme con otros colegas y con gente de Microsoft, como Miguel Saez, Ezequiel Glinksy, y el carnal de todos Fernando García Lorea para pasar todo un día en charlas de distintos temas, desde una discusión Fish Bowl, hasta el tema de las comunicaciones en la red y cómo afectan nuestras vidas. Interesantísimo, y además, hubo comida!!! ;-)

En una de las charlas, Alejandro Ponicke presentó un excelente trabajo programado por el bueno de Juan Ladetto (arquitecto de cepa tucumana, que ahora está trabajando en Microsoft Buenos Aires):

El nuevo mapa del Capitan, pero que mapa!

(Nota para Alejandro Ponicke: con lo de "En Europa no se consigue" se te cayeron, no dos, sino tres sotas.. ;-)

Se discutieron extensiones a este proyecto (como fue una charla privada, no puedo comentar todo, pero algo puedo filtrar...;-), para armar algo colaborativo a publicar en código abierto.

Estaba presente el bueno de Daniel Cazzulino (@kzu en Twitter) que comentó su trabajo con @edjez (el inefable Eduardo Jeziersky) en Instedd.org y su aplicación Geo Chat: envío de un mensaje SMS sobre un mapa.

Hacia el final, Martín Salías propuso que mucho de las extensiones que proponíamos podrían ser abstraidas en el concepto de agregar items sobre el mapa, y conectarlos.

Me gustaría comentar algunos breves puntos sobre esas ideas:

- Se podría implementar el concepto de Item, asociado a un punto geográfico.

- Los items no son todos iguales, podrían definirse distintos tipos de items.

- Se podrían definir distintas aplicaciones, sobre una API unificada, para que quien quiera pueda definir su propio item (con campos mínimos de la API, más campos extensibles por aplicación). Me imagino un aplicación SaaS con configuración por tenant. Los campos extensibles serían similares a los que ya maneja SQL Data Services (o los nuevos proyectos "in the cloud" que presentará Microsoft en el cercano PDC).

- Los items se pueden ver en el mapa, se podrían ampliar, ver de a uno, filtrar por posición, cercanía, por algún campo.

- Matcheo entre items: algunos "matchs" básicos por cercanía, coincidencia de campos, luego, un "match" genérico a implementar por cada aplicación.

- Integración con Twitter (siguiendo el camino de GeoChat).

- La API a desarrollar, sería expuesta por Web Services y/o REST. El consumidor inicial sería una página web como la del ejemplo de Ladetto, pero podría expandirse luego a distintos Smart Clients a desarrollar.

- Reaprovecharía ideas, implementación, de la demo sobre SQL Server que mostró Bill Gates y cía en su última Key Note, antes de dejar su trabajo a tiempo completo en Microsoft.

- No complicaría el desarrollo inicialmente, pero plantearía desde el principio, casos de uso de distintas aplicaciones (algunas en concreto fueron mencionadas en la charla). No quisiera una sola aplicación: me gustaría que se encarara con la idea de multi-aplicación definible "a piaccere". (como le decía Olmedo a la "negra" Romero: "si la hacemo, la hacemo bien"... ;-)

- Aun cuando las aplicaciones puedan ser definidas, armaría una aplicación "cabeza de playa" para "cruzar el abismo" (¿notan aquí la lectura de Geoffrey Moore?). Es decir, alguna aplicación en concreto, que muestre la usabilidad de la aplicación base.

Algunos tags, enlaces a investigar:

http://delicious.com/ajlopez/geospatial
http://delicious.com/ajlopez/geotagging

Comentarios, ideas, crítica, enlaces, ¡bienvenidos!

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Sun, Oct 19 2008 15:51 by lopez | 1 comment(s)

Babel de lenguajes en .NET

El viernes pasado tuve el gran gusto de compartir un TechNight con los buenos de Martín Salías y Rodolfo Finocchieti, en temas que nos gustan a los tres: lenguajes de programación, en este caso, implementados sobre .NET. Ya habíamos preanunciado el evento en:

Technight en proceso
Papa fritas, cervezas y una babel de esos raros lenguajes nuevos

(bueno, me gustó la imagen que usé entonces para ilustrar mi post, así que la repito acá... ;-).

Desde que tengo memoria, ha habido lenguajes de programación y más lenguajes de programación. En mi tierna infancia ya había varios lenguajes (sí, algunos mal intencionados van divulgando por ahí que cuando yo era un infante, había una sola masa continental, pero son rumores infundados... ;-).

Recuerdo un artículo de los 60 del Scientific American, donde se mostraba un lenguaje propuesto, no totalmente desarrollado, el CPL (Combined Programming Language). Recordaba vagamente que era parte de un trabajo de Christopher Strachey, hoy lo pueden comprobar en el corto artículo de la Wikipedia sobre CPL. (Bien! la neurona todavía me trae recuerdos más o menos "accurate"...;-).

Se vió que era un lenguaje algo ambicioso. Yo llegué a programar con una versión simplificada, el BCPL, de Martin Richards que tenía algo que me sigue fascinando: su compilador estaba escrito en BCPL, así que bastaba usar una máquina que tuviera implementando BCPL para poder ir armando otros compiladores BCPL en otras máquinas. También se podía generar un O-Code para una máquina virtual, y reimplementar esa máquina virtual en otras computadoras. Desde ideas de BCPL partieron el B y nuestro conocido lenguaje C. Otros intentos de máquinas virtuales fueron el P-Code de Pascal BSD, creo recordar, y también las Smalltalk machine que siempre se pensaron armar sobre ideas de Smalltalk. Siempre es interesante encontrar la idea de un lenguaje que implementa su propio compilador o intérprete. Recuerdo el mítico Small C de Cain y luego Hendrix, que aparecía a principio de los ochenta en Dr. Dobb's. Este año reencuentro esa idea de "lenguajes auto sustentables" en Self-sustaining Systems, Cola, Pepsi, Coke y Mate.

Hoy no podemos hablar, como antes (algunas décadas), de "yo programo en X (un solo lenguaje)". Cada vez más, tenemos más opciones. Habrá que ver que no todas son potables para todos los trabajos. Pero pienso que debemos de vez en cuando, sumergirnos en el estudio de otros lenguajes, para tener una visión más amplia, ejercitar la neurona, y tener una nueva "tool" en nuestra caja de herramientas.

En los noventa, nos encontramos de nuevo con el auge de las máquinas virtuales, con la aparición de Java. Con el nacimiento de .NET, tenemos una máquina virtual (aunque alguien de Microsoft se atragantaría con su lengua antes de denominar al CLR, Common Language Runtime, como máquina virtual).

Es sobre .NET y su máquina virtual, donde aparecieron múltiples implementaciones de lenguajes. Pero basta de historia, y pasemos a la charla en sí.

La charla

Excelente lo que mostraron Martín y Rodolfo. Yo comenté algunos temas de programación funcional, orientados a F#, basado en ejemplos que vienen con el lenguaje, y de libros. Los recursos que utilicé y nombré estan en mi anterior post:

Recursos de F# y Programación Funcional

Quisiera poner acá un resumen de lo que mostraron Martín y Rodolfo.

Rodo se dedicó a comentar en particular dos lenguajes, Boo y Cat, además de seguir comentando sobre las ideas de funcional. También mostró un Toy language, implementado usando las capacidades de Dynamic Language Runtime (Rodolfo, no encontré si está disponible ese ejemplo). Pueden bajarse su presentación desde

TechNight: programming in Babel

 Boo lenguaje de programación creado por Rodrigo Barreto de Oliveira. Pueden leer el Boo Manifesto para conocer más sobre la historia del lenguaje. Rodrigo necesitaba un lenguaje que se adaptara a lo que necesitaba programar, y como no encontraba ninguno que diera la talla, se lanzó a crear su propio lenguaje. El estaba entusiasmado con Python, pero en esos momentos no lo podía usar en el proyecto que tenía que desarrollar. Boo tiene una sintaxis inspirada en Python, declaración automática de variables, inferencia automática de tipos, casteo de tipos automático, funciones como objetos y ciudadanos de primera clase en el lenguaje, duck typing (la gente de Smalltalk reconocerá el concepto, y se asombrará de que exista como tal, para ellos es parte de la naturaleza misma). Rodolfo nos fue mostrando todos estos conceptos, pueden ver más detalles en la presentación que dejó disponible.

Otro lenguaje que mostró fue  Cat Programming Language. Conocí este lenguaje gracias al bueno de Rodolfo, que me dejó un comentario en este blog (eso es cumplir con Don't be a Canuto, bravo!). Es un lenguaje funcional, orientado a pila, que nació de otro trabajo en Java, el Joy Programming Language. La primera vez que lo ví, me recordó a mi querido Forth (aún debo tener en algún cubil mío, la Dr. Dobb's dedicada a ese lenguaje). Lo que me comentó Rodolfo el viernes, es lo simple que es la solución de código: podemos recorrerla y entenderla. Es un caso de estudio abordable de generación de código compilado en .NET, con instrucciones de Intermediate Language. Vean también cómo un lenguaje definido se puede reimplementar en otros. Lo tienen en JavaScript Online Cat interpreter , en Cat in Scheme, Cat in Python, Cat in Haskell, Cat in Haskell using monads, y en Cat in Omega. ¿Tendré que pasarlo a ajlisp o ajbasic? ;-)

En su turno, Martín Salías siguió comentando sobre implementaciones de lenguajes en Dynamic Language Runtime, en especial la historia de IronPython, creado por Jim Hugunin. Jim es el creador de Jython, la implementación de Python sobre Java, y quería demostrar que la máquina virtual de .NET no era adecuada para implementar un lenguaje dinámico como Python. Y se lleva la sorpresa de poder hacerlo mejor que en Java. Así va naciendo lo que ahora conocemos como Dynamic Language Runtime, un nuevo namespace de código abierto, que crea Jim dentro de la implementación de IronPython, y que podemos usar para implementar otros lenguajes. Nos da clases de soporte para armar un árbol de expresiones en memoria, y luego generar código para .NET. No hay un lugar separado para bajarse esas clases, pero pueden obtenerlas desde:

http://www.codeplex.com/IronPython

Es interesantísimo ver la implementación en detalle, en especial los conceptos aplicados sobre DynamicSite, basta como botón de muestra

Martin Maly - Building a DLR Language - Dynamic Behaviors 2

y visitar el blog de Hugunin en MSDN.

Puede ver lo que se está gestando para IronRuby también.

Y comentó sobre todo lo que se está haciendo en JavaScript. Lean su post:

Javascript - La programación del futuro

Mencionó el trabajo del "monstro" de JavaScript, John Ressig:

 http://ejohn.org/ en Twitter @jeresig

sobre JavaScript, principal creador del JQuery (agregaría que en estos días, Microsoft ha decidido agregar JQuery a su implementación de ASP.NET Ajax). Martín dejó encantada a la audiencia, mostrando lo que hizo Resig: implementar en JavaScript un lenguaje gráfico Processing pasen, lean y vean:

Processing.js

(imagen tomada de ese post) 

Martín comentó que JavaScript corre en el cliente, con lo que se puede poner trabajo no trivial en esa máquina, haciendo más liviano el trabajo del servidor, que tal vez se encargue de darnos datos sin embellecer, el proceso de agrupación, mostrado, gráfico, puede ser derivado al cliente. Igualmente, hay JavaScript en el servidor, leer:

Permanent link to Bringing the Browser to the Server

Ahora que en los browsers está el elemento Canvas, podemos usarlo desde JavaScript, leer

Permanent link to Javascript Sparklines Library

Pero vean hasta donde puede llegar JavaScript, viendo el proyecto del bueno de Dan Ingalls:

Sun Labs Lively Kernel

Más enlaces

Para todos los que les gusta explorar los lenguajes de programación, sus paradigmas, ideas y futuro, algunos enalces recolectados en estos días:

JAOO 2007- Gilad Bracha - Computational Theology, Functional versus Imperative, Language History

Ted Neward- On Java and .NET, Software Academics versus Practioners, General Purpose Programming

Prolog just blew my mind!

Dynamic programming futures InfoWorld Analysis 2008-10-13 By Peter Wayner

Erik Meijer, Gilad Bracha, Mads Torgersen- Perspectives on Programming Language Design and Evolu

Dynamic Languages vs Static Verification - Greg Young [MVP]

Joe Gregorio BitWorking JavaScript is the new Smalltalk

ST2JS - Smalltalk to Javascript translator (el trabajo de nuestro argentino Diego Gomez Deck)

Google Chrome, JavaScript and Smalltalk

La preparación de esta charla, me movió a escribir y actualizar algo de código de mini intérpretes que estoy armando. Pueden ver el estado actual en:

http://code.google.com/p/ajbasic Intérprete, con sintaxis AjBasic y ahora también AjSharp
http://code.google.com/p/ajlisp Intérprete Lisp, bastante terminado
http://code.google.com/p/ajtalk Intérprete bytecodes a la Smalltalk, más adelante podría compilarse
http://code.google.com/p/ajfunc Idem, pero orientado a la F#
http://code.googe.com/p/ajlogo  El lenguaje Logo siempre es interesante de investigar

Bueno, como siempre, los enlaces de estos temas, que colecciono, desde:

http://delicious.com/ajlopez/dlr
http://delicious.com/ajlopez/javascript
http://delicious.com/ajlopez/programminglanguages
http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/ruby
http://delicious.com/ajlopez/prolog
http://delicious.com/ajlopez/lisp
http://delicious.com/ajlopez/smalltalk
http://delicious.com/ajlopez/logo

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/
http://twitter.com/ajlopez

Posted Thu, Oct 16 2008 13:03 by lopez | 2 comment(s)

Touchless SDK de código abierto

Mike Wasserman trabaja en el Office Labs de Microsoft. Basado en su trabajo universitario en Columbia, el grupo ha creado el proyecto Touchless. Se compone de dos partes:

Touchless Demo: una aplicación de código abierto para experimentar con una interface multitouch, teniendo solamente una webcam. Tiene 4 demos, que pueden ver en el video de abajo.

Touchles SDK: open source también, para crear nuestras aplicaciones multitouch basadas en una entrada desde webcam.

Desde hace unos días, el código esta en Codeplex, visiten:

Code with the SDK

El manejo via webcam se basa en la detección de elementos de color, que sirven como punteros. Usando objetos que el software distingue por colores y posición, podemos manejar de nuevas formas aplicaciones que desarrollemos para multitouch.

Vean dos demos:

Touchless - A webcam multi-touch SDK

Touchless SDK - Fair Demo August'08

Otros posts sobre multitouch e interfaces en general en:

http://msmvps.com/blogs/lopez/archive/tags/interfaces/default.aspx

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com/

Posted Tue, Oct 14 2008 6:19 by lopez | 6 comment(s)

Filed under: , ,

Recursos de F# y Programación Funcional

F# es un lenguaje funcional, creado por Microsoft. Implementado bajo el soporte de .NET CLR, es un lenguaje tipado, con acceso completo al framework de .NET. Hereda características de los lenguajes ML/OCaml, notablemente de este último, el soporte de clases y objetos.

F# nació dentro de Microsoft Research, siendo su principal creador Don Syme. Aunque es un lenguaje funciona, soporta programación de objetos, y no vive en solitario: puede llamarse desde otros lenguajes .NET y puede invocar a librerías escritas en otros lenguajes, lo cual le da una flexibilidad que otros lenguajes más "puros" no tiene. Despues de años de desarrollo, es un lenguaje maduro, que está ganando momento en la comunidad científica, y en otras, como la financiera, que necesitan manipular monedos y operar con fórmulas. Como puede acceder a todo .NET, puede aprovechar otras librerías, como muestra esta imagen, de un programa de demostración que viene en el paquete, donde F# accesde a DirectX desde .NET.

Cito algo de la promoción de Apress sobre el libro Expert F#:

While inspired by OCaml, F# isn't just another functional programming language. Drawing on many of the strengths of both OCaml and .NET, it's a general–purpose language ideal for real–world development. F# integrates functional, imperative, and object–oriented programming styles so you can flexibly and elegantly solve programming problems, and brings .NET development alive with interactive execution. Whatever your background, you'll find that F# is easy to learn, fun to use, and extraordinarily powerful. F# will help change the way you think about and go about programming.

Hay abundante información sobre el lenguaje. Este posts es una actualización de uno anterior, con enlaces, blogs, posts, recursos, libros, sobre este interesante lenguaje. Ya había publicado a fines del año pasado:

Recursos de F#

Enlaces

La primera página a visitar es la página madre de F# en Microsoft:

Microsoft Research's website for F#
F# Manual
F# Documentation

Hay blogs y foros en
hubFS- The place for F# - F# news, forums and blogs

Blogs personales de gente dedicada a F#:
Don Syme's web log, a key source of information on F#
Robert Pickering's blog
Tomas Petricek
Granville Barnett's blog
Luke Hoban's blog
Chris Smith (F# Tester)
Brian McNamara (F# Dev)
Jomo Fisher (F# Dev)
Andrew Kennedy (MSR)
Luca Bolognese (Managed Languages Principal PM)

Harry Pierson ha escrito varios posts sobre programación funcional, no solo para F#, abarca también F#:
DevHawk Functional Programming category

Posts y podcasts

Algunos enlaces a posts (hay cientos en los enlaces de arriba), sólo para que tengan un primer encuentro con el lenguaje y su poder expresivo:

Episode 18- Matt Podwysocki on F# and Functional Programming Herding Code
Matt Podwysocki pone "fun" en programación "fun"cional, con F#.

Concurrency on a single thread
Usando expresiones F# asincrónicamente para escribir programas paralelos.

F# September 2008 CTP Released
El último "release" CTP de septiembre. 

F# Overview (I.) - Introduction Articles TomasP.Net

Functional Understanding

Practical F# Parsing- The Parse Buffer

Play Ball Script in F#

Units of Measure in F#- Part One, Introducing Units

The Weekly Source Code 34 - The Rise of F#

Para escuchar

Herding Code 18- Matthew Podwysocki on F# and Functional Programming
Software Engineering Radio Episode 108 - Simon Peyton Jones on Functional Programming and Haskel
.NET Rocks Episode 310 - Simon Peyton Jones on Functional Programming and Haskell

Ejemplos

Además de los ejemplos que vienen con el paquete de distribución, encontraran código para bajarse y probar en lás páginas de los libros mencionados más abajo. Además, tenemos:

F# Samples - Home
Ant Colony Simulation
FsTest
FsUnit

Libros de F#

Estoy leyendo los dos primeros, publico acá algo del resumen publicado por las editoriales para promocionarlos:

  Foundations of F#

Every professional .NET programmer needs to learn about FP, and there's no better way to do it than by learning F#--and no easier way to learn F# than from Foundations of F#. Written by F# evangelist Rob Pickering, this is an elegant, comprehensive introduction to all aspects of the language and an incisive guide to using F# for real-world professional development.

by Robert Pickering | ISBN-13: 978-1-59059-757-6 | Published May 2007 | 360pp.

 

 Expert F#

Written by F#'s inventor and two major contributors to its development, Expert F# is the authoritative, comprehensive, and in–depth guide to the language and its use. Designed to help others become experts, the first part of the book quickly yet carefully describes the F# language. The second part then carefully shows how to use F# elegantly for a wide variety of practical programming tasks.

by Don Syme, Adam Granicz, Antonio Cisternino | ISBN-13: 978-1-59059-850-4 | Published Dec 2007 | 609pp.

Otro libro, de Jon Harrop: 

F# for Scientists

F# for Scientists will bring you up to speed with basic syntax and programming language concepts. Written in a clear and concise style with practical and enlightening examples, this book is accessible and easy to understand. By reviewing the Visual Studio screen shots that illustrate compilation, debugging and interactive use, you will understand both the functional aspects of F# and the object-oriented task-based features that make F# so useful in practice.

Programación Funcional

Si estamos interesados en la programación funcional en general, podemos visitar:

Functional Programming for the Rest of Us

Why Functional Programming Matters un clásico de John Hughes

Why Haskell Matters

El "paper" clásico de Backus backus.pdf. Backus fue el que puso de nuevo en el tapete a la programación funcional. Recuerdo mis tiempos de "jugar" con APL (A Programming Language).

Un "popurri" de enlaces:

Are FP and OO Incompatible Syntactic Styles-
A Gentle Introduction to Haskell, Version 98
About Erlang
APL (programming language) (uno de los primeros lenguajes con los que me topé)
An APL Compiler (Timothy Budd no deja de escribir libros sobre implementación de lenguajes)
The Cat Programming Language (Gracias a Rodolfo Finochietti por comentarme este lenguaje)
YouTube - Tangible Functional Programming
Functional Programming Notables #1 (más enlaces a programación funcional)
The Little MLer
functional objects Felleisen
Erlang in Lisp
Free Online Functional Programming Books -- FreeTechBooks.com
The Expression Lemma (muy math geek, teoría de categorías, programación funcional y LINQ!! Ideal para internarse una semana)
Chaitin's construction (también math-geeky, más teoría de categorías, Chaitin es argentino, como el mate)
On being stateful
The Glasgow Haskell Compiler
A Neighborhood of Infinity- You Could Have Invented Monads! (And Maybe
InfoQ- Domain Specific Languages in Erlang

C# Funcional

.NET y C# van adoptando con el tiempo algunos estilos funcionales. Todo lo que siempre quiso saber sobre programación funcional con C#, desde el post del bueno de Mattew Podwysocki:

Richmond Code Camp 2008.2 - Functional C# Recap

Otros enlaces:

Functional C# Project
Is C# Becoming a Functional Language- - Mads Torgersen
Functional C# - Learn from F# and LINQ

Mi Delicious

Soy un adicto a Delicious, acá están los tags que uso para estos temas:

http://delicious.com/ajlopez/fsharp
http://delicious.com/ajlopez/f%23
http://delicious.com/ajlopez/functionalprogramming
http://delicious.com/ajlopez/haskell
http://delicious.com/ajlopez/erlang

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
http://delicious.com/ajlopez

Posted Sat, Oct 11 2008 16:53 by lopez | with no comments

Aplicaciones distribuidas con AjMessages usando DSS/CCR

Por ahora, es solo un proyecto en marcha. La aplicación de ejemplo es mínima. Pero es la evolución de mi trabajo anterior con AjMessages usando  Windows Communication Foundation:

AjMessages- a message processor
AjMessages- hacia un procesador de mensajes

El año pasado excribí ese ejemplo, y otro que usaba DSS/CCR. Solo el primero fue publicado, ahora, estuve revisando mi implementación con DSS/CCR, tecnologías que son la base de Microsoft Robotics. El código nuevo se puede bajar del repositorio de CodePlex en:

http://www.codeplex.com/ajmessages

Los ejemplos estan basados en ideas del proyecto Fabriq, ahora en nuevas tecnologías. En estos días, Arvindra Sehmi escribió sobre una nueva versión de Fabriq, llamada Fabriq4Dss, que está usando DSS/CCR como base. Preparó una presentación para la conferencia JAOO, lean:

JAOO 2008 Presentation

Espero que pronto aparezcan novedades sobre esa implementación y otras. Keep tuned!

La solución

Tiene tres proyectos:

El primero es la implementación del núcleo del sistema, que es independiente del transporte de los mensajes distribuidos:

El segundo proyecto contiene un ejemplo con un message handler que decrementa un entero. El tercer proyecto es un DSS Service Component que se usa para albergar el servidor de AjMessages en una máquina con un DSS Host:

 

Para una más detallada explicación de qué es una aplicación, mensaje, servidor, leer mis anteriores posts:

AjMessages- a message processor
AjMessages- hacia un procesador de mensajes

La aplicación

Un archivo de configuración XML define las aplicaciones a ejecutar. Una aplicación tiene:

  • Nodes: una colección de acciones a procesar (un nodo tiene varias acciones, podría ser análogo a clase/método).
  • Handlers: objetos que procesan mensajes. Un handler puede estar compuesto de otros handlers.
  • Actions: puntos con nombre para entrar a un handler

Un ejemplo de definición de aplicación en AjMessages.SampleApp\Configurations\Server1.xml:

<?xml version="1.0" encoding="utf-8" ?> <AjMessages> <Application Name="AjMessages"> <Node Name="Administration"> <Handler Name="ConfigureHandler" Type="AjMessages.ConfigureHandler, AjMessages"/> <Handler Name="PrintHandler" Type="AjMessages.PrintHandler, AjMessages"/> <Handler Name="PrintMessageHandler" Type="AjMessages.PrintMessageHandler, AjMessages"/> <Handler Name="ConfigurePipeline"> <Handler Name="PrintHandler"> <Property Name="Text" Value="Reconfiguring server..."/> </Handler> <Handler Name="ConfigureHandler"/> </Handler> <Action Name="Configure" Handler="ConfigurePipeline"/> </Node> </Application> <Application Name="App1"> <Node Name="Node1"> <Handler Name="PrintMessageHandler" Type="AjMessages.PrintMessageHandler, AjMessages"/> <Handler Name="PostHandler" Type="AjMessages.PostHandler, AjMessages"/> <Handler Name="DecrementHandler" Type="AjMessages.SampleApp.Handlers.DecrementHandler, AjMessages.SampleApp"/> <Handler Name="Pipeline1"> <Handler Name="DecrementHandler"/> <Handler Name="PostHandler"> <Property Name="Action" Value="App1/Node1/Process"/> </Handler> </Handler> <Action Name="Process" Handler="Pipeline1"/> </Node> <Node Name="Node2"/> </Application> <Host Name="Server1" Activate="true"> <Application Name="AjMessages"> <Node Name="Administration"/> </Application> <Application Name="App1"> <Node Name="Node1"/> <Node Name="Node2"/> </Application> </Host> <Host Name="Server2" Address="http://localhost:50002/ajmessages/node"> <Application Name="AjMessages"> <Node Name="Administration"/> </Application> <Application Name="App1"> <Node Name="Node1"/> <Node Name="Node2"/> </Application> </Host> </AjMessages>

Ejecutando el ejemplo

Abrimos la solución en el Visual Studio 2008 (se necesita tener instalado un Microsoft Robotics Developer Studio, una versión CTP de este año, debe configurar el directorio de salida de los proyectos para que apunten a su directorio de MRDS). Al ejecutar el proyecto DSS se lanza un DSS Host, que muestra una ventana de control:

El host está ejecutando en las puertas 50000/50001. Configure el servidor AjMessages usando el archivo AjMessages.SampleApp\Configurations\Server1.xml.

Podemos lanzar un segundo host desde el prompt de DSS:

bin/dsshost /p:50002 /t:50003
m:<pathto>\Source\AjMessages.DssServices\AjMessagesDssServices.manifest.xml

Un segundo formulario aparece:

Use el archivo de configuración AjMessages.SampleApp\Configurations\Server2.xml y el port 50002.

Podemos enviar un mensaje a la aplicación de ejemplo (que ejecuta en dos hosts). El mensaje es solamente un entero, que es decrementado en cada proceso de acción en cada nodo. El nodo de decremento está instalado en ambos servidores, así que el mensaje viaja de uno a otro durante su proceso.

Próximos pasos

Quiero mejorar varios puntos. Me gustaría serializar cualquier tipo de mensaje, ahora solamente viajan enteros y strings. Me gustaría usar un solo archivo de configuración, en lugar de uno por máquina. Y poder tener en una sola solución, ambas implementaciones de hosting y transporte: DSS/CCR y WCF.

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com

Posted Fri, Oct 10 2008 12:42 by lopez | 6 comment(s)

Otro modelo para AjGenesis

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

Posted Fri, Oct 3 2008 12:07 by lopez | 2 comment(s)

Generación de código para LINQ y C# 3.0 con AjGenesis

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

Posted Wed, Oct 1 2008 11:51 by lopez | 1 comment(s)