<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez</title><link>http://msmvps.com/blogs/lopez/default.aspx</link><description>NET, Java, PHP y Desarrollo de Software</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Recordando a Clipper</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/06/recordando-a-clipper.aspx</link><pubDate>Mon, 06 Jul 2009 09:32:15 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1698377</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1698377</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/06/recordando-a-clipper.aspx#comments</comments><description>&lt;p&gt;En el Proyecto Medusa, donde estoy trabajando, se está reimplementando en .NET un sistema de salud, que originariamente estaba escrito en Clipper. Es un sistema bastante grande, que tiene varios casos de uso, desde temas administrativos y contables, hasta turnos, farmacia, stock de medicamentos, cocina para dietas, y seguimiento de pacientes.&lt;/p&gt;  &lt;p&gt;Recuerdo que en los ochenta, me topé con DBase II, en varios sistemas operativos, el venerable intérprete, y más adelante, a fines de los ochenta, me encontré con la sorpresa de un compilador, el Clipper de Nantucket, para DOS. Otros recordaran al Fox, que luego, al ser adquirido por Microsoft, pasó a Windows como Visual Fox (no recuerdo si primero Fulton y cía pasaron su producto a Windows y luego Microsoft lo compró, o si primero pasó Fox de DOS a Microsoft, y ahí lo portaron a Windows).&lt;/p&gt;  &lt;p&gt;Para los que quieran recordar cómo era el lenguaje, encontré estos enlaces:&lt;/p&gt;  &lt;p&gt;&lt;a title="CA-Clipper 5.3 . Guide To CA-Clipper - Menu" href="http://www.itlnet.net/Programming/Program/Reference/c53g01c/menu.html"&gt;CA-Clipper 5.3 . Guide To CA-Clipper – Menu&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Clipper (programming language) - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Clipper_programming_language"&gt;Clipper (programming language) - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay ejemplos con código en:&lt;/p&gt;  &lt;p&gt;&lt;a title="The Oasis Clipper Source. Over 300,000,000,000 bytes served!" href="http://www.the-oasis.net/"&gt;The Oasis Clipper Source. Over 300,000,000,000 bytes served!&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Preguntas frecuentes sobre Clipper y sus sucesores en:&lt;/p&gt;  &lt;p&gt;&lt;a title="Frequently Asked Questions (FAQ 2.31) about CA-Clipper and CA-Visual Objects" href="http://www.davep.org/clipper/FAQ/"&gt;Frequently Asked Questions (FAQ 2.31) about CA-Clipper and CA-Visual Objects&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Como comentaba un miembro del equipo Medusa, Clipper mientras fue de Nantucket, se mantuvo actualizado, cuando lo compró Computer Associates, entró en un derrape del que no se recuperó.&lt;/p&gt;  &lt;p&gt;Si todavía tienen archivos Fox, Clipper, DBase dando vueltas por ahí, pueden probar los productos de:&lt;/p&gt;  &lt;p&gt;&lt;a title="CodeBase Products Overview" href="http://www.codebase.com/products/"&gt;CodeBase Products Overview&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Y parece interesante, con soporte de SQL Server, y de varias plataformas, el Proyecto de código abierto:&lt;/p&gt;  &lt;p&gt;&lt;a title="Harbour Project" href="http://harbour-project.org/"&gt;Harbour Project&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Como lenguaje, Clipper tenía sus “quirks”, como:&lt;/p&gt;  &lt;p&gt;- El uso de SET, como SET EXACT OFF, SET EXACT ON, que cambiaban todo al conducta del programa   &lt;br /&gt;- El uso de work areas para acceder a datos    &lt;br /&gt;- Cosas como MEMVARS, que todavía tengo que recordar que era… :-)&lt;/p&gt;  &lt;p&gt;Por mi parte, estoy divirtiéndome escribiendo un intérprete, AjClipper:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajclipper01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Ya tengo dos simples programas corriendo en mi intérprete:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;? &lt;span style="color:#006080;"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;y&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;? &lt;span style="color:#006080;"&gt;&amp;quot;This is a test&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;foo := &lt;span style="color:#006080;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;bar := &lt;span style="color:#006080;"&gt;&amp;quot;World&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;? foo, &lt;span style="color:#006080;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;, bar&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pueden ejecutarlo con&lt;/p&gt;

&lt;p&gt;&lt;font face="Consolas"&gt;AjClipper.Console HelloWorld.prg SimpleTest.prg&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;No será, “Uy, qué bruto, qué programa”, pero va tomando cuerpo. Pueden seguir mi avance en el trunk de AjCodeKatas:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjClipper" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjClipper"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjClipper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Están escritos los tests (dando verde, por ahora):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajclipper02.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Buen Code Coverage:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajclipper03.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Cualquier enlace interesante sobre Clipper, bienvenido! Iré agregándolos en &lt;a href="http://delicious.com/ajlopez/clipper"&gt;http://delicious.com/ajlopez/clipper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1698377" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C_26002300_243_3B00_digo+Abierto/default.aspx">C&amp;#243;digo Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjClipper/default.aspx">AjClipper</category></item><item><title>Volviendo a AjContab</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/05/volviendo-a-ajcontab.aspx</link><pubDate>Sun, 05 Jul 2009 14:09:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1698201</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1698201</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/05/volviendo-a-ajcontab.aspx#comments</comments><description>&lt;p&gt;Hace ya un tiempo que vengo pensando en reflotar AjContab:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.ajlopez.com/ajcontab/" href="http://www.ajlopez.com/ajcontab/"&gt;http://www.ajlopez.com/ajcontab/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Encuentro este mensaje viejo, en la lista de Arquitectura del MUG de Argentina&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.mail-archive.com/arquitectura@mug.org.ar/msg00504.html" target="_blank"&gt;http://www.mail-archive.com/arquitectura@mug.org.ar/msg00504.html&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;AjContab es un viejo ejemplo que daba en mis cursos de .NET 1.x, hace unos años. Debería reescribirlo, en ASP.NET 2, VS2008, tal vez ASP.NET MVC? Veré. Pero en estos días habia tweeteado:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://twitter.com/ajlopez/status/2258288758" href="http://twitter.com/ajlopez/status/2258288758"&gt;http://twitter.com/ajlopez/status/2258288758&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajcontab01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;La idea es tener:&lt;/p&gt;  &lt;p&gt;- Múltiples Tenants    &lt;br /&gt;- Múltiples Empresas     &lt;br /&gt;- Múltiples Planes de Cuenta por Empresa     &lt;br /&gt;- Múltiples Ejercicios     &lt;br /&gt;- Usuarios y Roles     &lt;br /&gt;- Minutas/Asientos     &lt;br /&gt;- Reportes como Balance, Libro Diario, Libro Mayor&lt;/p&gt;  &lt;p&gt;Al escribirlo en PHP/MySql, podría colocarlo fácilmente en línea. Me serviría como ejercicio de repaso de PHP, y comenzaría a tener un proyecto con Ajax, Javascript, JQuery quizás? Trataría de codificarlo liviano, para no ponerle demasiada arquitectura o parafernalia al principio. En todo caso, eso lo dejaría para la versión .NET o Java.&lt;/p&gt;  &lt;p&gt;Será interesante ver cómo los usuarios reciben la idea de tener un sistema así en la web. En el Proyecto Medusa (que mencioné hace poco, en &lt;a title="Generación de código con AjGenesis para Mere Mortals Framework" href="http://msmvps.com/blogs/lopez/archive/2009/06/22/code_2D00_generation_2D00_for_2D00_mere_2D00_mortals_2D00_framework.aspx"&gt;Generación de código con AjGenesis para Mere Mortals Framework&lt;/a&gt;), está incluido el desarrollo de un sistema contable en web. AjContab me serviría para afilar las uñas en el tema de poner este tipo de aplicaciones andando.&lt;/p&gt;  &lt;p&gt;En cuanto tenga algo publicado, escribo por acá. Keep tuned! :-)&lt;/p&gt;  &lt;p&gt;Sugerencias? Bienvenidas!&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1698201" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Software+as+a+Service/default.aspx">Software as a Service</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjContab/default.aspx">AjContab</category></item><item><title>Revista de Pragmatic Programmer</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/03/revista-de-pragmatic-programmer.aspx</link><pubDate>Fri, 03 Jul 2009 09:53:23 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697663</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1697663</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/03/revista-de-pragmatic-programmer.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" src="http://www.todocontenidos.com/images/articles/pragpub.png" align="left" alt="" /&gt; Ayer, gracias a un tweet de @chillicoder, me enteré de la aparición del primer número de la revista de la gente de Pragmatic Programmer:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.pragprog.com/magazines" href="http://www.pragprog.com/magazines"&gt;http://www.pragprog.com/magazines&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Les recomiendo bajarse la edición actual, de Julio. Yo la bajé desde esa página en formato PDF, pero también está disponible para otros formatos (notablemente, para Kindle). Esta edición no tiene desperdicio.&lt;/p&gt;  &lt;p&gt;Encuentro una editorial y artículo de Michael Swaine, un buen reencuentro con este autor, que debo estar leyendo desde que escribía en la Dr. Dobb’s.&lt;/p&gt;  &lt;p&gt;Leo un artículo donde explican su posición para poner a disposición este material, sin restricciones, y sobre cómo lo producen, en formato PDF (usando &lt;a href="http://www.lowagie.com/iText/" target="_blank"&gt;iText&lt;/a&gt;). Cada artículo tiene enlaces al final, sobre los temas y productos mencionados. Es bueno ver cómo uno de los primeros artículos explica cómo producen la propia revista y otros materiales. Es parte de lo ágil: explicar, dejar algo, que sirva para que las buenas prácticas o cosas aprendidas, puedan difundirse más allá del equipo que lo usa.&lt;/p&gt;  &lt;p&gt;Hay un artículo de Andy Lester (programador desde hace 20 años, visitar su blog &lt;a title="http://www.theworkinggeek.com/" href="http://www.theworkinggeek.com/"&gt;http://www.theworkinggeek.com/&lt;/a&gt;), sobre “The layoffs are coming”, donde explica tips para conseguir trabajo, o mantenerse en el mismo. En un mundo cambiante y en crisis, vemos que también el programador americano promedio se ve afectado.&lt;/p&gt;  &lt;p&gt;Michael Swaine entrevista a Rick Hickey (que creó Clojure, un dialecto muy popular de Lisp, que corre sobre la máquina virtual de Java, que por alguna extraña razón, es más popular que &lt;a href="http://code.google.com/p/ajlisp/" target="_blank"&gt;AjLisp&lt;/a&gt;… :-). Un artículo sin desperdicio, que tengo que leer en detalle. Pueden visitar &lt;a title="http://clojure.org/" href="http://clojure.org/"&gt;http://clojure.org/&lt;/a&gt; y he coleccionado enlaces que me parecieron interesantes en &lt;a href="http://delicious.com/ajlopez/clojure"&gt;http://delicious.com/ajlopez/clojure&lt;/a&gt;. (bueno, vería también &lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt; y &lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt; si están aburridos un fin de semana…. :-). Esta misma revista incluye un artículo técnico sobre Clojure, sobre su manejo de exceptions.&lt;/p&gt;  &lt;p&gt;El bueno de Dave Thomas es entrevistado por Swaine, sobre el proceso de publicación de los libros y revistas, y el mercado de libros electrónicos. Son temas importantes: qué va a pasar con el libro impreso? Hay cambios, y Thomas explica su visión.&lt;/p&gt;  &lt;p&gt;Hay un artículo de autor John Shade, sobre Microsoft, Google, y Wolfram Alpha, cómo es la pelea por la arena de los buscadores. Finalmente, hay un calendario de eventos que vienen (me temo que algo centrado en eventos de EE.UU.)&lt;/p&gt;  &lt;p&gt;Y si alguien todavía no lo conoce, les recomiendo la visita a todo el sitio&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.pragprog.com"&gt;http://www.pragprog.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;y los blogs de Andy Hunt &lt;a title="http://andy.pragprog.com/" href="http://andy.pragprog.com/"&gt;http://andy.pragprog.com/&lt;/a&gt; y Dave Thomas &lt;a title="http://pragdave.pragprog.com/" href="http://pragdave.pragprog.com/"&gt;http://pragdave.pragprog.com/&lt;/a&gt;. Tienen videos y podcast, yo prefiero lo escrito: &lt;a title="http://www.pragprog.com/articles" href="http://www.pragprog.com/articles"&gt;http://www.pragprog.com/articles&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697663" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_26002300_243_3B00_n+Funcional/default.aspx">Programaci&amp;#243;n Funcional</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>Ágiles 2009 - Llamada a Participación</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/01/193-giles-2009-llamada-a-participaci-243-n.aspx</link><pubDate>Wed, 01 Jul 2009 09:32:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697447</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1697447</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/01/193-giles-2009-llamada-a-participaci-243-n.aspx#comments</comments><description>&lt;p&gt;Luego del éxito de Agiles 2008, en Buenos Aires, Argentina, este año se está organizando la nueva edición en Florianápolis, Brasil, para el 6 al 9 de Octubre de 2009. Esta es la llamada a participar:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Estimado colega, &lt;/p&gt;    &lt;p&gt;Qué opinas de formar parte del equipo de expositores que reune nombres como Brian Marick, Diana Larsen, Matt Gelbwaks, Naresh Jain, Dave Nicolette, Alan Cyment, Alexandre Magno, entre otros? El próximo lunes 6 de julio será la última oportunidad para presentar tu propuesta de charla en Ágiles 2009! &lt;/p&gt;    &lt;p&gt;Ágiles 2009, a realizarse en Florianópolis, Brasil, es un evento sin fines de lucro, organizado por profesionales entusiastas del tema, unidos por el objetivo de crear un espacio amplio de discusión sobre las metodologías ágiles y su adopción en América Latina. &lt;/p&gt;    &lt;p&gt;Como expositor, tendrás acceso libre a la conferencia y otras ventajas que los organizadores están preparando para ti! Puedes proponer una presentación, un tutorial, un reporte de experiencias o un workshop. Accede a &lt;a href="http://www.agiles2009.org/es/submissions.php"&gt;http://www.agiles2009.org/es/submissions.php&lt;/a&gt; para ver la información que debes proporcionar para presentar tus propuestas. &lt;/p&gt;    &lt;p&gt;Esperamos contar contigo en Ágiles 2009! &lt;/p&gt;    &lt;p&gt;Comité Organizador     &lt;br /&gt;&lt;a href="http://www.agiles2009.org"&gt;www.agiles2009.org&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Tienen más información en español en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.agiles2009.org/es/index.php" href="http://www.agiles2009.org/es/index.php"&gt;http://www.agiles2009.org/es/index.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;y el programa del congreso en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.agiles2009.org/es/program.php" href="http://www.agiles2009.org/es/program.php"&gt;http://www.agiles2009.org/es/program.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697447" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>Un caso de Uso de AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/30/un-caso-de-uso-de-ajgenesis.aspx</link><pubDate>Tue, 30 Jun 2009 10:04:02 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697298</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1697298</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/30/un-caso-de-uso-de-ajgenesis.aspx#comments</comments><description>&lt;p&gt;En el grupo Google de Code Generation:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://groups.google.com/group/codegeneration" href="http://groups.google.com/group/codegeneration"&gt;http://groups.google.com/group/codegeneration&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;encuentro este mensaje de Fernando Claverino&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/codegeneration/browse_thread/thread/66a64cd0abd63942" target="_blank"&gt;Usos de AjGenesis&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Gracias a Fernando, por compartir su experiencia. Es importante, para &lt;a href="http://ajgenesis.codeplex.com/" target="_blank"&gt;AjGenesis&lt;/a&gt;, que los que lo usen compartan y comenten su experiencia, para poder ir viendo los usos, facilidades y problemas que tenemos con la herramienta. Comento acá gran parte del mensaje. Fernando usa AjGenesis para generar reportes, usando SQL Server por lo que entendí. En proyecto Medusa, estamos también generando reportes usando Reporting Services. Fernando escribe:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Modelo: &lt;/p&gt;    &lt;p&gt;No definimos un archivo models.xml que apunta a cada item del modelo.      &lt;br /&gt;Tenemos una carpeta models y hay una task que la recorre       &lt;br /&gt;recursivamente y levanta todos los archivos del modelo (*.mod.xml).       &lt;br /&gt;Cuando se hace esto, seteamos dinámicamente a cada objeto cargado una       &lt;br /&gt;propiedad con el path relativo, que luego usamos en otras tasks. Los       &lt;br /&gt;artefactos se generan en la misma estructura de carpeta, pero dentro       &lt;br /&gt;de la carpeta build.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Este es un ejemplo de modelo obtenido de otra forma. Podemos partir de uno o varios modelos, obtenerlos de archivos o de otra fuente de información (como una base de datos).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Plugins: &lt;/p&gt;    &lt;p&gt;Aca estamos haciendo algo de trampa. Si bien todos los artefactos      &lt;br /&gt;generados deberían construirse a partir del modelo, hay algunas cosas       &lt;br /&gt;que son dificiles de modelar. En nuestro caso generamos las consultas       &lt;br /&gt;MDX. Es muy difícil definir un modelo que soporte la riqueza de este       &lt;br /&gt;lenguaje. Asi que lo que hicimos fue definir en el archivo de       &lt;br /&gt;tecnología cual es el plugin a utilizar. El plugin es un template (que       &lt;br /&gt;genera la consulta MDX a partir del modelo). Vi en los ejemplos que en       &lt;br /&gt;la tecnología se suele definir el dialecto (esto sería algo parecido,       &lt;br /&gt;me parece). &lt;/p&gt;    &lt;p&gt;Esta técnica que nosotros llamamos plugin, la usamos siempre que      &lt;br /&gt;queremos generar un caso particular no cubierto por los templates que       &lt;br /&gt;ya tenemos. En el archivo de tecnología podemos definir el onrows,       &lt;br /&gt;oncols y where de la consulta, pero en muchos casos esto varía en       &lt;br /&gt;función del modelo. Es como favorerer convención sobre configuración.       &lt;br /&gt;Si no configuro nada, uso el template que corresponde. Si defino un       &lt;br /&gt;plugin, uso ese. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Interesante. El usar un template dinámicamente, indicándo cuál usar en el propio modelo, en vez de en código duro de tares, es una capacidad que AjGenesis tiene desde el principio. Recuerdo los tiempos de ASP clásico (los noventa), donde se podía incluir otro archivo por nombre en el proceso de un archivo/página, pero el nombre debía ser especificado como constante, no podía ser especificado en ejecución. PHP influyó bastante en el diseño de AjBasic, y se permiten cosas como:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;include &lt;span style="color:#006080;"&gt;&amp;quot;Tasks/Build${Technology.Programming.Dialect}.ajg&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Donde el archivo a incluir y procesar como tarea es determinado en ejecución a partir del estado del modelo (o de lo que sea). &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nivel de abstracción: &lt;/p&gt;

  &lt;p&gt;Aprovechamos la libertad del modelo para trabajar en un nivel más 
    &lt;br /&gt;abstracto. Es decir, en lugar de definir un reporte, definimos una 

    &lt;br /&gt;sección (grupo de reportes) y las posibles navegaciones. La 

    &lt;br /&gt;combinación de estas definen los reportes. Es decir, a partir del 

    &lt;br /&gt;modelo definido, una task lo combina y genera un nuevo modelo a partir 

    &lt;br /&gt;del cual se aplican los templates. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exacto. Podemos elevar el nivel de abstracción en cualquier momento, si no lleva demasiado costo. Es la idea de AjGenesis: podemos modelar entidades, o mensajes, o lo que descubramos en nuestro dominio que es interesante modelar. Y al descubrir eso a modelar, vamos elevando el nivel de abstracción.&lt;/p&gt;

&lt;p&gt;Fernando concluye que no encontraron, en su tiempo, otra herramienta que le diera tanta libertad en la definición de los modelos. Ciertamente, esa libertad es parte del diseño inicial de la herramienta.&lt;/p&gt;

&lt;p&gt;Si Ud. tiene algun caso de uso de AjGenesis, podrá publicar su experiencia?&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697298" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Modelos y metamodelos en AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/29/modelos-y-metamodelos-en-ajgenesis.aspx</link><pubDate>Mon, 29 Jun 2009 09:28:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697059</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1697059</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/29/modelos-y-metamodelos-en-ajgenesis.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://ajgenesis.codeplex.com/" target="_blank"&gt;AjGenesis&lt;/a&gt; genera código partiendo de un modelo, de libre definición. El modelo se lee desde un archivo .XML (en la versión AjGenesis 0.5) pero también se puede leer desde un archivo de texto. Sobre un modelo sencillo, y sobre la forma de modelo en texto, pueden leer:&lt;/p&gt;  &lt;p&gt;&lt;a title="Generando Código- Hello World con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx"&gt;Generando Código- Hello World con AjGenesis&lt;/a&gt;    &lt;br /&gt;&lt;a title="Modelo textual para generación de código con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx"&gt;Modelo textual para generación de código con AjGenesis&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ha sido una elección inicial de diseño que el modelo sea totalmente libre. El ejemplo más simple de modelo es el que especifica una aplicación Hello World, modelando el mensaje a mostrar:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Company&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ajlopez.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pero de vez en cuando, nos gustaría tener una especificación, algo que indique qué se puede poner o no en un modelo. Esto serviría, para poder construir, por ejemplo, programas que permitan validar el modelo a usar. Es como cuando uno tiene un Schema o DTD que define cómo es un tipo de documento XML, y es usado por distintos utilitarios, para validar y ayudar en la construcción del documento XML final.&lt;/p&gt;

&lt;p&gt;Como desde el inicio, el modelo no es XML, sino un concepto abstracto, que por razones de implementación, en la versión actual está en XML, nunca agregué o me apoyé en schemas de XML para definir una estructura al modelo, en ningún ejemplo. Pero siempre quise, en algún momento, agregar, opcionalmente, que se pueda definir el modelo. Y que los mismos formatos que AjGenesis usa, puedan servir para definir esos modelos. La descripción del modelo debería ser otro modelo: es un metamodelo expresado de la misma forma a la que ya estamos habituados en AjGenesis (noten que, históricamente, los DTD siempre algo molestaron en el mundo XML, al no ser ellos mismos XMLs, aunque me apresuro a agregar que hubo otras razones más para reemplazarlos).&lt;/p&gt;

&lt;p&gt;Como ejemplo inicial, el modelo de arriba es una instancia de todos los modelos que cumplen con este metamodelo:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SimpleHelloWorld&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Project&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Message&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Company&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Cada modelo tiene Types, que se describen en detalle. Si luego, tenemos un modelo de HelloWorld con múltiples mensajes:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Messages&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World One&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World Two&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hello, World Three&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Messages&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;lo podemos expresar en un metamodelo como:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MultipleHelloWorld&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Project&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Messages&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;String&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ItemName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Message&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ahora, tenemos una propiedad que no es simple, sino una lista, de strings. Pero que sus items tienen como nombre a Message (son de la forma &amp;lt;Message&amp;gt;String&amp;lt;/Message&amp;gt;).&lt;/p&gt;

&lt;p&gt;Tomemos un modelo más complejo. Puedo usar el “clásico” modelo de entidades, de:&lt;/p&gt;

&lt;p&gt;&lt;a title="Generando aplicaciones con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El proyecto más simple es AjFirstExample (dos entidades simples):&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;AjFirstExample&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;First Example using AjGenesis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;AjFE&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;com.ajlopez&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;ajlopez&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entities/Customer.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entities/Supplier.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Lists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;List&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;List&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Lists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Forms&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Forms&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Views&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;View&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;View&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Views&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Como ejemplo, recordemos la entidad Customer:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;¿Cómo podemos representar esto en un metamodelo? De esta forma:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EntityModel&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Project&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Description&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Prefix&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Domain&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Model&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Model&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Model&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entities&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entity&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Lists&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;List&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Views&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;View&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Forms&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Form&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entity&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SetName&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Description&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Descriptor&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SetDescriptor&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlTable&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Properties&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Property&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Property&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Type&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlType&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;List&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;View&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Form&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;(Faltaría completar los tipos Property, List, View, Form). Y la prueba de fuego, es que el propio metamodelo pueda expresarse como metamodelo:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Metamodel&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Metamodel&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Types&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Type&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Type&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Properties&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ListOf&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Property&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Property&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ListOf&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Reference&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Type&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Types&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Metamodel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;¿Y para qué tanto trabajo? Para poder usar esa información para validar el modelo, es una razón. Pero también, recordemos, AjGenesis genera código. Podríamos generar el código de un diseñador, de un modelador web o gráfico, que permita:&lt;/p&gt;

&lt;p&gt;- Leer y grabar el modelo
  &lt;br /&gt;- Ver sus datos (gráficamente, o en formularios)

  &lt;br /&gt;- Ingresar su contenido&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis34.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Por ejemplo, podríamos armar un programa .NET WinForm, que muestre un árbol a la izquierda con la estructura de nuestro modelo (ej. Entidades) y que permita agregar las ramas de ese árbol. Podemos generar las clases tipadas que representen ese modelo en memoria. Y los códigos de los serializadores del modelo en XML&amp;#160; o en texto o en lo que elijamos. También se podría leer el metamodelo desde un programa genérico, y que éste maneje el mostrado y el ingreso de datos del modelo, dinámicamente, en runtime:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis35.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Pero todo esto no es necesario para trabajar hoy por hoy con AjGenesis. Quería mencionarlo, porque lo tengo en suspenso desde hace unos años como idea. No es un tema prioritario por ahora, lo que más se necesita es documentación, ejemplos mejorados y ejemplos con nuevas tecnologías.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697059" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Transformando plantillas en AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/27/transformando-plantillas-en-ajgenesis.aspx</link><pubDate>Sat, 27 Jun 2009 06:59:32 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696836</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1696836</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/27/transformando-plantillas-en-ajgenesis.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://ajgenesis.codeplex.com/" target="_blank"&gt;AjGenesis&lt;/a&gt; se base en modelo libre, y usa plantillas (templates) para facilitar la descripción y generación de un archivo de texto final. La forma más simple de transformar un archivo de plantilla en un archivo destino es con un comando como:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;AjGenesis.Console Model.xml ModuleVb.tpl HelloWorld.vb&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Donde Model.xml puede tener&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Company&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ajlopez.com&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Hola, Mundo&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Message&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Author&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Pepe&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Author&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ModuleVb.tpl es la plantilla:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Automatically generated by AjGenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; http://www.ajlopez.com/ajgenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Company ${Project.Company}&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt; Module1&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Main()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        System.Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;${Project.Message}&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Produciendo HelloWorld.vb&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Automatically generated by AjGenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; http://www.ajlopez.com/ajgenesis&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Company ajlopez.com&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt; Module1&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Main()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        System.Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Hola, Mundo&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Module&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;(Los ejemplos de HelloWorld que describo los pueden encontrar en la versión liberada 0.5, dentro del directorio examples, hay varios directorios HelloWorld*) (Más detalle en &lt;a title="Generando Código- Hello World con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx"&gt;Generando Código- Hello World con AjGenesis&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;La otra opción es desde una tarea, programáticamente:&lt;/p&gt;

&lt;p&gt;AjGenesis.Console Model.xml Build.ajg&lt;/p&gt;

&lt;p&gt;donde Build.ajg es un archivo de tareas, escrito en AjGenesis:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;PrintLine &lt;span style="color:#006080;"&gt;&amp;quot;Generating HelloWorld&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;ModuleVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;HelloWorld.vb&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;El objeto TransformerManager es un objeto auxiliar, de los que están ya definidos en AjGenesis, para que podamos aprovecharlo. Su “gran método” es .Transform que toma:&lt;/p&gt;

&lt;p&gt;- Nombre del archivo de plantilla
  &lt;br /&gt;- Nombre del archivo a generar

  &lt;br /&gt;- El Environment&lt;/p&gt;

&lt;p&gt;Environment es otro objeto predefinido, que es un diccionario donde están definidos los nombres y valores de variables en curso. Tanto “TransformerManager” como “Environment” son claves/keys dentro de ese directorio. Cuando uno escribe en AjBasic:&lt;/p&gt;

&lt;p&gt;&lt;font face="Consolas"&gt;a = 1&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;agrega automáticamente la entrada “a” y el valor 1 en el Environment.&lt;/p&gt;

&lt;p&gt;Es común que la transformación de plantillas se escriba en tareas más complejas. Fragmento de un ejemplo (ver examples/HelloWorldNet20/Tasks/Build.ajg):&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;PrintLine &lt;span style="color:#006080;"&gt;&amp;quot;Creating Solution File&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\Solution.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}.sln&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;PrintLine &lt;span style="color:#006080;"&gt;&amp;quot;Creating VB.Net Project&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\ModuleVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Vb\Module1.vb&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\AssemblyInfoVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Vb\My Project\AssemblyInfo.vb&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\VbProject.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Vb\${Project.Name}Vb.vbproj&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;TransformerManager.Transform(&amp;quot;Templates\VbProjectUser.tpl&amp;quot;, &amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Vb\${Project.Name}Vb.vbproj.user&amp;quot;, Environment)&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;PrintLine &lt;span style="color:#006080;"&gt;&amp;quot;Creating C# Project&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\ClassCs.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Cs\Program.cs&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\AssemblyInfoCs.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Cs\Properties\AssemblyInfo.cs&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformerManager.Transform(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\CsProject.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Cs\${Project.Name}Cs.csproj&amp;quot;&lt;/span&gt;, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39;TransformerManager.Transform(&amp;quot;Templates\CsProjectUser.tpl&amp;quot;, &amp;quot;${Project.BuildDir}\${Project.Name}\${Project.Name}Cs\${Project.Name}Cs.csproj.user&amp;quot;, Environment)&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un problema que encontré, es que si regeneramos desde el modelo todos estos archivos finales, los pisamos, los creamos de nuevo. Supongamos que sólo queremos generar el archivo destino, si no existe de antes (una táctica destinada a preservar el archivo destino, por si lo hemos modificado nosotros). En un proyecto (el proyecto Medusa que mencionó en &lt;a title="Generando y regenerando texto y código con AjGenesis" href="http://msmvps.com/blogs/lopez/archive/2009/06/26/generando-y-regenerando-texto-y-c-243-digo-con-ajgenesis.aspx"&gt;Generando y regenerando texto y código con AjGenesis&lt;/a&gt;, &lt;a title="Generación de código con AjGenesis para Mere Mortals Framework" href="http://msmvps.com/blogs/lopez/archive/2009/06/22/code_2D00_generation_2D00_for_2D00_mere_2D00_mortals_2D00_framework.aspx"&gt;Generación de código con AjGenesis para Mere Mortals Framework&lt;/a&gt;), usamos esta rutina, que definimos en AjBasic:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;sub&lt;/span&gt; TransformNewFile(tpl, target, tm, env)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; System.IO.File.Exists(target) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        tm.Transform(tpl, target, env)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sub&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Que invocamos, por ejemplo, con:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformNewFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\ClassPartialVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}BO\${Project.Name}BO\${Table.Name}\${Table.Name}.Partial.vb&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pero nos ha resultado muy útil, tener otra rutina, que reemplaza el archivo destino, pero si éste existe, solamente lo reemplaza si su contenido actual es distinto del contenido nuevo que vamos a generar:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;sub&lt;/span&gt; TransformFile(tpl, target, tm, env)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; System.IO.File.Exists(target) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        target2 = target &amp;amp; &lt;span style="color:#006080;"&gt;&amp;quot;.tmp&amp;quot;&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        tm.Transform(tpl, target2, env)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        content1 = System.IO.File.ReadAllText(target)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        content2 = System.IO.File.ReadAllText(target2)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; content1 &amp;lt;&amp;gt; content2 &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;            System.IO.File.Copy(target2, target, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        System.IO.File.Delete(target2)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;        tm.Transform(tpl, target, env)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;sub&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Se puede mejorar (usar un stream en memoria, en lugar de un archivo temporal). Un ejemplo de uso:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\DefaultAspx.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\Default.aspx&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\DefaultAspxVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\Default.aspx.vb&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\GlobalAsax.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\Global.asax&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\MasterPageMainMaster.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\MasterPageMain.master&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\MasterPageMainMasterVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\MasterPageMain.master.vb&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\UserLoginAspx.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\UserLogin.aspx&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\UserLoginAspxVb.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\UserLogin.aspx.vb&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;TransformFile(&lt;span style="color:#006080;"&gt;&amp;quot;Templates\WebConfig.tpl&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;.\${Project.Name}Web\web.config&amp;quot;&lt;/span&gt;,TransformerManager, Environment)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La rutina TransformFile nos ha resultado muy útil, al usar un sistema de repositorio de código. Cuando cambiamos el modelo, y regeneramos todo lo que determinamos que se genera (contrapuesto a lo que tenemos como archivos manuales en nuestra solución), ahora, cuando vamos a guardar en el repositorio de código, los archivos que no cambiaron su contenido (ni su fecha y hora de grabación) son los que se envían al servidor. Esto ha simplificado todos los commits, y hasta sirve para darse cuenta cuál es el efecto de un cambio en el modelo inicial: el propio software de repositorio de código nos avisa qué archivos quedaron cambiados.&lt;/p&gt;

&lt;p&gt;Esas dos rutinas las pusimos en un archivo Templates\Utilities.tpl y las incluimos en nuestras tareas con:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;include &lt;span style="color:#006080;"&gt;&amp;quot;Templates/Utilities.tpl&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Seguramente, comenzaran a aparecer en los ejemplos que vaya publicando.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://www.facebook.com/ajlopez"&gt;http://www.facebook.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696836" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Generando y regenerando texto y código con AjGenesis</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/26/generando-y-regenerando-texto-y-c-243-digo-con-ajgenesis.aspx</link><pubDate>Fri, 26 Jun 2009 09:25:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696778</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1696778</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/26/generando-y-regenerando-texto-y-c-243-digo-con-ajgenesis.aspx#comments</comments><description>&lt;p&gt;En estos d&amp;iacute;as de Junio, se ha desarrollado el interesant&amp;iacute;simo congreso de generaci&amp;oacute;n de c&amp;oacute;digo (digamos, &amp;ldquo;el mundial&amp;rdquo; del Code Generation), con un programa envidiable:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codegeneration.net/cg2009/programme.php" title="Code Generation 2009 - Daily Event Programme"&gt;Code Generation 2009 - Daily Event Programme&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Encuentro en Twitter &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis33.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;(uso &lt;a target="_blank" href="http://tweetdeck.com/beta/"&gt;TweetDeck&lt;/a&gt;, con search &amp;ldquo;code generation&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;el enlace a este post de &lt;a target="_blank" href="http://www.metacase.com/stevek.html"&gt;Steven Kelly&lt;/a&gt; (de &lt;a target="_blank" href="http://www.metacase.com/"&gt;MetaCase&lt;/a&gt;) sobre&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.metacase.com/blogs/stevek/blogView?showComments=true&amp;amp;entry=3423259520"&gt;Code Generation 2009 round-up&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;donde levanta y comenta impresiones sobre la conferencia. Curiosamente (o no, ya a esta altura), Kelly tambi&amp;eacute;n usa Twitter para tomar feedback:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://twitter.com/EelcoVisser"&gt;&lt;img align="left" src="http://s3.amazonaws.com/twitter_production/profile_images/135809182/self_normal.jpg" alt="" /&gt;&lt;/a&gt; &lt;a href="http://twitter.com/EelcoVisser/statuses/2220107629"&gt;EelcoVisser&lt;/a&gt;: keynote by @markusvoelter and Steven Kelly at #cg2009: great overview of issues in model-driven development &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;a href="http://twitter.com/HBehrens"&gt;&lt;img align="left" src="http://s3.amazonaws.com/twitter_production/profile_images/87000893/HeikoProfil_normal.jpg" alt="" /&gt;&lt;/a&gt; HBehrens: Steven Kelly at #cg2009 keynote: &amp;quot;wizard based generators create a large legacy application you&amp;#39;ve never seen before&amp;quot; &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A esta &amp;uacute;ltima referencia, Kelly comenta y responde:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The reference was to vendor-supplied wizards, often found in IDEs or SDKs, that create skeleton applications for you based on your input. Since the vendors take pride in just how much boilerplate they can spew out, you&amp;#39;re left with a mass of generated code that you&amp;#39;ve never seen before, but must extend with your own code. Worse, you&amp;#39;re responsible for maintaining the whole ensuing mixture, and there&amp;#39;s no chance of re-running the wizard to change some of the choices -- at least not without losing or invalidating the code you&amp;#39;ve added. That&amp;#39;s in sharp contrast with generation in DSM, where your input is in the form of a model which you can edit at any time. You get the speed of generation but can remain at a high level of abstraction throughout&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Con DSM se refiere a Domain Specific Model. Pueden ver mis enlaces en &lt;a href="http://delicious.com/ajlopez/dsm"&gt;http://delicious.com/ajlopez/dsm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;M&amp;aacute;s info visitando el &lt;a href="http://www.dsmforum.org/" title="DSM Forum"&gt;DSM Forum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mi proyecto de c&amp;oacute;digo abierto &lt;a target="_blank" href="http://ajgenesis.codeplex.com/"&gt;AjGenesis&lt;/a&gt; est&amp;aacute; basado en modelo, en modelos de libre definici&amp;oacute;n, justamente, orientados al dominio que uno quiera modelar. No son modelos gr&amp;aacute;ficos, que son m&amp;aacute;s &amp;ldquo;fancy&amp;rdquo;, pero hasta ahora, me han resultado &amp;uacute;tiles y flexibles. Traduciendo la cita de arriba, una de las quejas de Kelly es que hay herramientas que generan c&amp;oacute;digo, como un wizard dentro de un entorno de desarrollo, pero luego, cuando trabaja agregando c&amp;oacute;digo propio en la soluci&amp;oacute;n, ya no puede volver a regenerar c&amp;oacute;digo. Y que &amp;eacute;l ve una soluci&amp;oacute;n si partimos de un modelo espec&amp;iacute;fico de dominio. El modelo a partir puede ser la base de datos, un modelo abstracto de entidades, un modelo m&amp;aacute;s orientado al sistema que estamos tratando de construir (me imagino modelos dedicados a CRM, o a mercados a&amp;uacute;n m&amp;aacute;s verticales).&lt;/p&gt;
&lt;p&gt;Bueno, el tema da para discutir. Pr&amp;aacute;cticamente, ning&amp;uacute;n modelo produce todo lo que queremos, as&amp;iacute; que tenemos que dejar en nuestra aplicaci&amp;oacute;n, lugares, puntos de extensibilidad manual, forma de agregar c&amp;oacute;digo nuestro, sin que tengamos que perder lo generado. Y que sigamos teniendo la posibilidad, al cambiar el modelo inicial, de volver a generar la parte autom&amp;aacute;tica, sin perder lo agregado manualmente.&lt;/p&gt;
&lt;p&gt;Desde hace algunos a&amp;ntilde;os, incluyo este &amp;ldquo;slide&amp;rdquo; en mis charlas sobre el tema. Explico que uno no genera todo, y que tiene que estar claro, cuales archivos de texto son generados, y luego regenerados desde el modelo cuantas veces uno quiera, cu&amp;aacute;les son generados de una sola vez, y cu&amp;aacute;les son agregados manualmente:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis32.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Uno tiene que decidir qu&amp;eacute; genera desde el modelo, y qu&amp;eacute; genera o agrega manualmente. Me encontrado con gente que utiliz&amp;oacute; AjGenesis s&amp;oacute;lo para generar los procedimientos almacenados. En el proyecto Medusa (que mencion&amp;eacute; en mi post&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/06/22/code_2D00_generation_2D00_for_2D00_mere_2D00_mortals_2D00_framework.aspx" title="Generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis para Mere Mortals Framework"&gt;Generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis para Mere Mortals Framework&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;)&lt;/p&gt;
&lt;p&gt;estamos adoptando una soluci&amp;oacute;n en el sentido de la figura. Cuando lanzamos la generaci&amp;oacute;n autom&amp;aacute;tica desde el modelo, que incluye:&lt;/p&gt;
&lt;p&gt;- Generaci&amp;oacute;n de scripts de generaci&amp;oacute;n de las tablas &lt;br /&gt;- Generaci&amp;oacute;n de los procedimientos almacenados &lt;br /&gt;- Generaci&amp;oacute;n de un proyecto de Business Objects (como pide el Mere Mortals Framework) &lt;br /&gt;- Generaci&amp;oacute;n de una aplicaci&amp;oacute;n web ASP.NET (usando nuevamente el Mere Mortals Framework, por ejemplo, sus controles web)&lt;/p&gt;
&lt;p&gt;hemos codificado las tareas, de tal forma que:&lt;/p&gt;
&lt;p&gt;- Hay archivos que siempre se generan (se &amp;ldquo;pisa&amp;rdquo; la anterior versi&amp;oacute;n, pero solamente si la nueva tiene un contenido distinto) &lt;br /&gt;- Hay archivos que no se generan si ya existen (pocos archivos, que se han decidido ser &amp;ldquo;one shoot&amp;rdquo;, generados de una sola vez, y no m&amp;aacute;s) &lt;br /&gt;- Hay archivos que se respetan y no se generan (archivos que vamos agregando a los proyectos que vamos armando)&lt;/p&gt;
&lt;p&gt;Estamos usando .NET. En el caso 2, caen las clases parciales, que es una forma de seguir especificando una clase, en un archivo adicional al original. En otras tecnolog&amp;iacute;as, podr&amp;iacute;amos generar un archivo ClaseBase generado autom&amp;aacute;ticamente, y un ClaseReal donde pudi&amp;eacute;ramos luego poner todo nuestro c&amp;oacute;digo manual.&lt;/p&gt;
&lt;p&gt;Con esta estrategia, hemos alcanzado hasta ahora, gran parte de lo que imaginaba en la figura de arriba: poder generar siempre desde el modelo, sin tener que perder lo que ya tenemos.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696778" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mere+Mortals+Framework/default.aspx">Mere Mortals Framework</category></item><item><title>Aguante el Logo</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/23/aguante-el-logo.aspx</link><pubDate>Tue, 23 Jun 2009 14:15:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696383</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1696383</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/23/aguante-el-logo.aspx#comments</comments><description>&lt;p&gt;Sandra, de la provincia de Tucum&amp;aacute;n, Argentina, produjo este video, usando el lenguaje Logo, parece que con el &lt;a target="_blank" href="http://fmslogo.sourceforge.net/"&gt;FMSLogo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;Durante el video, visita el sitio del bueno de Daniel Ajoy:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/" title="http://neoparaiso.com/"&gt;http://neoparaiso.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donde tenemos informaci&amp;oacute;n sobre el lenguaje y trabajos relacionados de Logo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/logo/" title="http://neoparaiso.com/logo/"&gt;http://neoparaiso.com/logo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ya escrib&amp;iacute; sobre Logo, mostrando el trabajo del bueno de Marcelo Dushkin sobre ese lenguaje, en la variante XLogo, con rob&amp;oacute;tica:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/01/01/mi-primer-robot-con-xlogo-y-rasti.aspx" title="Mi primer robot, con XLogo y Rasti"&gt;Mi primer robot, con XLogo y Rasti&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/07/04/mi-primer-robot.aspx" title="Mi primer robot"&gt;Mi primer robot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No tengo m&amp;aacute;s informaci&amp;oacute;n sobre Sandra. Pueden visitar su usuario en Youtube&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/user/educainformatica" title="http://www.youtube.com/user/educainformatica"&gt;http://www.youtube.com/user/educainformatica&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El foro que menciona en el video, al que estoy suscripto, es:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/logoes" title="http://groups.google.com/group/logoes"&gt;http://groups.google.com/group/logoes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;M&amp;aacute;s informaci&amp;oacute;n sobre versiones de Logo en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neoparaiso.com/logo/#sect3" title="http://neoparaiso.com/logo/#sect3"&gt;http://neoparaiso.com/logo/#sect3&lt;/a&gt; &lt;br /&gt;&lt;a href="http://neoparaiso.com/logo/logoes-mswlogo.html" title="http://neoparaiso.com/logo/logoes-mswlogo.html"&gt;http://neoparaiso.com/logo/logoes-mswlogo.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mis enlaces sobre este lenguaje, desde:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para los que les gusta m&amp;aacute;s la programaci&amp;oacute;n, recomendar&amp;iacute;a darle un visita al NetLogo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ccl.sesp.northwestern.edu/netlogo/" title="http://ccl.sesp.northwestern.edu/netlogo/"&gt;http://ccl.sesp.northwestern.edu/netlogo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;NetLogo is a cross-platform multi-agent programmable modeling environment.&lt;/p&gt;
&lt;p&gt;Si, imaginaron bien, hay un pich&amp;oacute;n de AjLogo en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/ajlogo/" title="http://code.google.com/p/ajlogo/"&gt;http://code.google.com/p/ajlogo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696383" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Logo/default.aspx">Logo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category></item><item><title>Generación de código con AjGenesis para Mere Mortals Framework</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/22/code_2D00_generation_2D00_for_2D00_mere_2D00_mortals_2D00_framework.aspx</link><pubDate>Mon, 22 Jun 2009 10:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696161</guid><dc:creator>lopez</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1696161</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/22/code_2D00_generation_2D00_for_2D00_mere_2D00_mortals_2D00_framework.aspx#comments</comments><description>&lt;p&gt;En un proyecto en el que estoy trabajando, el equipo &amp;aacute;gil del que soy miembro est&amp;aacute; desarrollando una aplicaci&amp;oacute;n completa de salud (es el Medusa Project), usando Mere Mortals framework como base para objestos de negocios, persistencia, y presentaci&amp;oacute;n en WinForm y ASP.NET. Pueden bajarse una versi&amp;oacute;n de prueba de este framework en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oakleafsd.com/" title="http://www.oakleafsd.com/"&gt;http://www.oakleafsd.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Hay una lista de caracter&amp;iacute;sticas en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oakleafsd.com/MMNetFeatures/pgMMNetFeatures.htm" title="http://www.oakleafsd.com/MMNetFeatures/pgMMNetFeatures.htm"&gt;http://www.oakleafsd.com/MMNetFeatures/pgMMNetFeatures.htm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pueden bajarse la gu&amp;iacute;a de desarrollo de&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oakleafsd.com/Download%20files/MMNetDevGuide35.zip" title="MM .NET Developer&amp;#39;s Guide"&gt;MM .NET Developer&amp;#39;s Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El framework fue desarrollado por Kevin McNeish, Microsoft MVP, presidente y arquicecto jefe de Oak Leaf Enterprise. El framework soporta entidades tipadas, pero por abajo, est&amp;aacute; basado en datasets. Podemos generar un proyecto de business objects con templates de VS que vienen con el framework, y tiene un generador de c&amp;oacute;digo provisto por el producto, podemos generar las clases de objetos de negocios, derivadas desde la base de datos.&lt;/p&gt;
&lt;p&gt;En mi equipo, alimentamos metadata leyendo informaci&amp;oacute;n de la base de datos, y con esa informaci&amp;oacute;n, generamos una aplicaci&amp;oacute;n web completa en ASP.NET, un librer&amp;iacute;a de objetos de negocios, procedimientos almacenados, y DDL para regenerar la base. Todo usando &lt;a target="_blank" href="http://ajgenesis.codeplex.com/"&gt;AjGenesis&lt;/a&gt;, mi proyecto abierto de generaci&amp;oacute;n de c&amp;oacute;digo. Espero escribir alg&amp;uacute;n post sobre esa experiencia. Las tareas y plantillas que usamos, han sido derivadas del ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2008/04/21/ajgenesis-generating-the-model-from-the-database/" title="AjGenesis- Generating the model from the database"&gt;AjGenesis- Generating the model from the database&lt;/a&gt; &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx" title="AjGenesis- Modelo desde la Base de Datos"&gt;AjGenesis- Modelo desde la Base de Datos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En esto post, uso otra aproximaci&amp;oacute;n, m&amp;aacute;s cl&amp;aacute;sica en los ejemplos de AjGenesis: partir de un modelo abstracto, generando desde all&amp;iacute;:&lt;/p&gt;
&lt;p&gt;- Scripts para crear la base de datos &lt;br /&gt;- Business Objects a la Mere Mortals en una librer&amp;iacute;a de clases &lt;br /&gt;- Proyecto WinForm con formularios de mantenimiento&lt;/p&gt;
&lt;p&gt;Escrib&amp;iacute; sobre generaci&amp;oacute;n de aplicaciones en distintas tecnolog&amp;iacute;as, desde un modelo abstracto, en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2007/11/12/application-generation-using-ajgenesis/" title="Application Generation using AjGenesis"&gt;Application Generation using AjGenesis&lt;/a&gt; &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx" title="Generando aplicaciones con AjGenesis"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pero recuerden: AjGenesis se basa en modelos de libre definici&amp;oacute;n. Podemos modelar lo que querramos. Como ejemplo trivial:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2007/01/29/code-generation-with-ajgenesis-a-hello-world-application/" title="Code Generation with AjGenesis- A Hello World application"&gt;Code Generation with AjGenesis- A Hello World application&lt;/a&gt; &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx" title="Generando C&amp;oacute;digo- Hello World con AjGenesis"&gt;Generando C&amp;oacute;digo- Hello World con AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;El modelo&lt;/h3&gt;
&lt;p&gt;Pueden bajar el ejemplo desde la p&amp;aacute;gina de ejemplos del proyecto, en Codeplex:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://ajgenesis.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7261#DownloadId=72477"&gt;MereMortalsExamples200906.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Contiene:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm02.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El modelo resido en el archivo Projects/AjFirstExample/Project.xml&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;AjFirstExample&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;First Example using AjGenesis&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;AjFE&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Prefix&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;com.ajlopez&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Domain&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;ajlopez&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;CompanyName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entities/Customer.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Entities/Supplier.xml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entities&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Lists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;List&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;List&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Lists&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Forms&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Forms&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Views&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;View&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;View&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Supplier&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Views&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Model&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;p&gt;Referencia a dos entidades, Customer and Supplier. La entidad Customer:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customer&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customer Entity&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Description&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customers&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customer&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Descriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customers&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SetDescriptor&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Customers&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlTable&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Id&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Id&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;varchar(200)&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Address&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Notes&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;text&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;SqlType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Property&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Properties&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Entity&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;p&gt;Hay un modelo que describe la tecnolog&amp;iacute;a que vamos a usar en Projects/AjFirstExample/Technologies/VbNet3.xml:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;VbNet3&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Programming&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Database&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;MsSql&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Dialect&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;AjFirstExampleMM&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;(local)&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Host&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Database&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Technology&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;p&gt;Puede cambiar el host a .\SQLEXPRESS si no tiene un servidor MS SQL. Puede agregar &amp;lt;Username&amp;gt; y &amp;lt;Password&amp;gt; si quiere usar la seguridad de SQL. Si no est&amp;aacute;n, el ejemplo usa seguridad integrada de Windows.&lt;/p&gt;
&lt;h3&gt;Generando la aplicaci&amp;oacute;n&lt;/h3&gt;
&lt;p&gt;Debe bajarse la versi&amp;oacute;n liberada actual de AjGenesis, la 0.5, desde &lt;a href="http://ajlgenesis.codeplex.com"&gt;http://ajlgenesis.codeplex.com&lt;/a&gt;. Agregue el directorio bin a su lista de directorios en PATH. Hecho esto, podemos ejecutar desde el directorio del ejemplo:&lt;/p&gt;
&lt;p&gt;GenerateProject.cmd AjFirstExample VbNet3&lt;/p&gt;
&lt;p&gt;El primer par&amp;aacute;metro es el nombre del proyecto, el segundo es la tecnolog&amp;iacute;a a usar. El comando invoca&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;AjGenesis.Console Projects\%Project%\Project.xml tasks\BuildProject.ajg  Projects\%Project%\Technologies\%Technology%.xml tasks\BuildTechnology.ajg tasks\BuildProg.ajg tasks\BuildSql.ajg&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Esto lee el modelo de proyecto, ejecuta la tarea BuildProject, carga el modelo de tecnolog&amp;iacute;a, ejecuta la tarea de BuildTechnology. Finalmente, la tarea BuildProg genera el c&amp;oacute;digo, y BuildSql genera el DDL necesario para crear la base de datos.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm03.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Se crea un nuevo directorio, Build, que contiene el resultado:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm04.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;En el directorio Sql, encontramos el comando ExecuteAll.cmd que crea la base de datos&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm05.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Podemos ejecutarlo con un par&amp;aacute;metro, especificando ah&amp;iacute; el servidor:&lt;/p&gt;
&lt;p&gt;ExecuteAll.cmd Bombadil&lt;/p&gt;
&lt;p&gt;Si ejecutamos el comando sin par&amp;aacute;metro, usa el host especificado en el modelo de tecnolog&amp;iacute;a.&lt;/p&gt;
&lt;p&gt;En directorio Src encontraremos reci&amp;eacute;n generada una soluci&amp;oacute;n .NET completa, con dos proyectos:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm06.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Podemos levantarla en Visual Studio 2008, y compilarla (necesitamos tener una versi&amp;oacute;n de Mere Mortals Framework instalada).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm07.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La librer&amp;iacute;a de clases contiene definiciones de objetos de negocios de Mere Mortals (usando clases parciales, clases de acceso a datos usando procedimientos almacenados, reglas&amp;hellip;.)&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm08.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El proyecto WinForm tiene dos formularios de mantenimiento, para Customers y Suppliers:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm09.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Bueno, no ser&amp;aacute; &amp;ldquo;uy que bruto, que aplicaci&amp;oacute;n&amp;rdquo;&amp;hellip;. :-)&amp;hellip; pero ejecuta:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/mm10.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Si no quieren seguir estos pasos, pueden bajarse la soluci&amp;oacute;n generada, de mi Skydrive&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjFirstExampleMereMortals.zip"&gt;AjFirstExampleMereMortals.zip&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Conclusiones&lt;/h3&gt;
&lt;p&gt;Usando un modelo abstracto, podemos generar los artefactos de textos que requiere el framework de Mere Mortals (o cualquier otro framework o tecnolog&amp;iacute;a como describ&amp;iacute; en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/06/14/generaci-243-n-de-c-243-digo-ajgenesis-y-dunga-dunga-a-la-tecnolog-237-a.aspx" title="Generaci&amp;oacute;n de c&amp;oacute;digo, AjGenesis, y Dunga dunga a la tecnolog&amp;iacute;a"&gt;Generaci&amp;oacute;n de c&amp;oacute;digo, AjGenesis, y Dunga dunga a la tecnolog&amp;iacute;a&lt;/a&gt;). Con clases parciales, y archivos separados, podemos regenerar c&amp;oacute;digo desde el modelo, sin perder el c&amp;oacute;digo manual que hayamos agregado. Podemos extender el c&amp;oacute;digo generado agregando validaciones autom&amp;aacute;ticos, nuevas reglas, y cualquier est&amp;aacute;ndar de codificaci&amp;oacute;n que estemos usando.&lt;/p&gt;
&lt;p&gt;Pero el punto principal, para m&amp;iacute;, es que usando un modelo abstracto, estamos separando el n&amp;uacute;cleo importante de nuestra aplicaci&amp;oacute;n, de los detalles t&amp;eacute;cnicos&amp;acute;. Podemos regenerar la aplicaci&amp;oacute;n usando otro framework, otros lenguajes, otras tecnolog&amp;iacute;as, y nuestro modelo podr&amp;iacute;a ser el mismo. El modelo describe lo que queremos. Tareas, y plantillas terminan siendo un sistema experto, que conoce COMO obtener lo que queremos como aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696161" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Mere+Mortals+Framework/default.aspx">Mere Mortals Framework</category></item><item><title>Se necesitan desarrolladores, no programadores</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/19/se-necesitan-desarrolladores-no-programadores.aspx</link><pubDate>Fri, 19 Jun 2009 10:35:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695849</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1695849</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/19/se-necesitan-desarrolladores-no-programadores.aspx#comments</comments><description>&lt;p&gt;Desde los 80, trato de ser desarrollador de software, m&amp;aacute;s que programador. Un programador es programador de un lenguaje, o de pocos lenguajes, y se ocupa s&amp;oacute;lo de programar. Encuentro hoy el art&amp;iacute;culo:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ericsink.com/No_Programmers.html"&gt;Small ISVs:&amp;nbsp; You need Developers, not Programmers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;de Eric Sink, desarrollador y empresario, fundador de &lt;a href="http://www.sourcegear.com/" title="SourceGear"&gt;SourceGear&lt;/a&gt;. Quiero comentar brevemente con mis palabras algo del post, les recomiendo leer el original en ingl&amp;eacute;s.&lt;/p&gt;
&lt;p&gt;Como dice Eric, el contexto es cr&amp;iacute;tico: un buen consejo para una empresa, no tiene que ser bueno para otra. Cuando escribi&amp;oacute; ese art&amp;iacute;culo (2003), SourceGear ten&amp;iacute;a seis a&amp;ntilde;os de vida, y 25 empleados.&lt;/p&gt;
&lt;p&gt;Eric escribe que m&amp;aacute;s que programadores, su empresa necesita desarrolladores. Cu&amp;aacute;l es la diferencia? Un programador escribe programas, un desarrollador contribuye de m&amp;uacute;ltiples maneras al &amp;eacute;xito de un producto.&lt;/p&gt;
&lt;p&gt;Yo pienso que eso se necesita a&amp;uacute;n en empresas grandes. Pero ese tipo de empresas se puede dar el lujo de tener especialistas. Un empresa chica, tiene que contar entre sus filas, no programadores especialistas, sino desarrolladores, y gente que pueda ponerse distintos &amp;ldquo;sombreros&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Un desarrollador, entonces, adem&amp;aacute;s de programar, tiene que involucrarse en:&lt;/p&gt;
&lt;p&gt;- Escribir especificaciones&lt;/p&gt;
&lt;p&gt;- Manejo de configuraci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;- Revisi&amp;oacute;n de c&amp;oacute;digo&lt;/p&gt;
&lt;p&gt;- Pruebas&lt;/p&gt;
&lt;p&gt;- Pruebas autom&amp;aacute;ticas&lt;/p&gt;
&lt;p&gt;- Documentaci&amp;oacute;n (ug!&amp;hellip;. :-)&lt;/p&gt;
&lt;p&gt;- Resolver problemas del cliente&lt;/p&gt;
&lt;p&gt;Puede ser dif&amp;iacute;cil conseguir gente que pueda hacer todo eso, adem&amp;aacute;s de codificar, especialmente para una empresa chica. Pero muchas personas tienen la capacidad de hacer eso, no se necesita &amp;ldquo;rocket science&amp;rdquo;. La soluci&amp;oacute;n? &lt;strong&gt;Formar a la gente&lt;/strong&gt;. Dentro de una empresa, un programador puede evolucionar a desarrollador.&lt;/p&gt;
&lt;p&gt;En un equipo &amp;aacute;gil, se puede entrenar a los &amp;ldquo;juniors&amp;rdquo; en estas habilidades adicionales, haciendo el trabajo de a pares, rotando los roles entre los miembros del equipo, etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.facebook.com/ajlopez"&gt;http://www.facebook.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695849" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Usando AML (Arbitrary Modeling Language)</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/17/usando-aml-arbitrary-modeling-language.aspx</link><pubDate>Wed, 17 Jun 2009 10:31:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695695</guid><dc:creator>lopez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1695695</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/17/usando-aml-arbitrary-modeling-language.aspx#comments</comments><description>&lt;p&gt;Hoy me encuentro con el post&lt;/p&gt;
&lt;p&gt;&lt;a href="http://memeagora.blogspot.com/2009/06/aml-arbitrary-markup-language.html"&gt;AML (Arbitrary Modeling Language)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lo que se plantea ah&amp;iacute; es que UML (Unified Modeling Language) es un fracaso. A ver, veamos.&lt;/p&gt;
&lt;p&gt;Los que recuerdan aquellos a&amp;ntilde;os de los 90, cada autor ven&amp;iacute;a con su propia forma de dibujar los distintos modelos que iban surgiendo para describir software y sistemas. Como lo que construimos no es una casa o edificio, no es f&amp;aacute;cil describir lo que vamos a crear, codificar, armar, y explicarlo, s&amp;oacute;lo en texto. Impulsados por la adopci&amp;oacute;n de objetos, muchos de los diagramas informales que se usaban, y de los formales que aparec&amp;iacute;an en herramientas CASE, se fueron adoptando, hasta que finalmente, los &amp;ldquo;Tres Amigos&amp;rdquo; se juntaron en un vuelo de avi&amp;oacute;n, y se unificaron sus ideas, en lo que fue luego apoyado por la OMG como UML.&lt;/p&gt;
&lt;p&gt;Todo UML es un avance, por ser una forma est&amp;aacute;ndar de comunicarnos.&lt;/p&gt;
&lt;p&gt;Pero hay que acordar con Neal Ford, el autor del post, que la mayor parte de nosotros, terminamos usando el AML (lenguaje de modelado arbitrario): usamos nuestras propias cajas, c&amp;iacute;rculos y l&amp;iacute;neas. En medio del auge de lo &amp;aacute;gil, yo pienso que es un buena pr&amp;aacute;ctica, SIEMPRE Y CUANDO, se mantenga el objetivo principal: poder comunicar nuestras ideas. Ning&amp;uacute;n dibujo es auto explicativo, o es dif&amp;iacute;cil que lo sea. Como Eric Evans apunta en su libro sobre DDD, los diagramas tienen que estar acompa&amp;ntilde;ados por texto, y los textos, ser explicados con diagramas.&lt;/p&gt;
&lt;p&gt;La comunicaci&amp;oacute;n es la clave. Como desarrolladores, tenemos que entrenarnos en esa habilidad. Ya pas&amp;oacute; el tiempo del programador aislado, trabajando solo en su m&amp;aacute;quina. Hoy, cualquier software no trivial, es producto de un equipo de trabajo. Si en nuestro equipo usamos diagramas, que sean UML o AML, es secundario. Lo que debe importar es que se usen consistentemente, y sean entendibles.&lt;/p&gt;
&lt;p&gt;Lo importante, tambi&amp;eacute;n, es tener modelos. Modelos que simplifican y explican mejor lo que estamos construyendo. Y no olvidar que el modelo, como el mapa, no es el territorio.&lt;/p&gt;
&lt;p&gt;UML lo que tiene de bueno, es que es &amp;ldquo;entendible&amp;rdquo; para el que lo estudi&amp;oacute;. El problema es que no todos los involucrados en un proyecto puede entenderlos, y hoy, son m&amp;aacute;s personas no t&amp;eacute;cnicas las que est&amp;aacute;n involucradas en un desarrollo de software.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n, UML ha sufrido de la &amp;ldquo;ilusi&amp;oacute;n del desarrollo&amp;rdquo;: pensar que dibujando, se crean sistemas. Muchos desarrolladores o managers, o gente interesada, estudia UML como si fuera la forma m&amp;aacute;gica de crear software, sin pagar el precio de codificaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Independientemente de usar UML o AML, recomendar&amp;iacute;a no pasar horas con un software de diagramas. Para muchos d&amp;iacute;as de nuestra actividad diaria, bastan los diagramas en el pizarr&amp;oacute;n, tomar la foto, y enviarlo a la lista de desarrollo.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.facebook.com/ajlopez"&gt;http://www.facebook.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695695" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>Generación de Código, AjGenesis y AjBasic</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/15/generaci-243-n-de-c-243-digo-ajgenesis-y-ajbasic.aspx</link><pubDate>Mon, 15 Jun 2009 16:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695470</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1695470</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/15/generaci-243-n-de-c-243-digo-ajgenesis-y-ajbasic.aspx#comments</comments><description>&lt;p&gt;En el post que coment&amp;eacute; ayer&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generaci&amp;oacute;n de c&amp;oacute;digo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;el comentador &lt;a href="http://emmanueloga.blogspot.com"&gt;Emmanuel&lt;/a&gt; escrib&amp;iacute;a:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pregunta: Ya que tu apodo es &amp;quot;java&amp;quot; :), porque no utilizar StringTemplate en vez de crear tu propio generador?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.stringtemplate.org/"&gt;http://www.stringtemplate.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://antlr.org/about.html"&gt;http://antlr.org/about.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La respuesta es corta y es larga. Si vieron los ejemplos que he publicado, y c&amp;oacute;mo funciona AjGenesis:&lt;/p&gt;
&lt;li&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;AjGenesis&lt;/a&gt; (posts en espa&amp;ntilde;ol con ejemplos)&lt;/li&gt;
&lt;p&gt;sabr&amp;aacute;n que he implementado mi propio lenguaje interpretado AjBasic (con una implementaci&amp;oacute;n ahora separada en &lt;a href="http://code.google.com/p/ajbasic/"&gt;http://code.google.com/p/ajbasic/&lt;/a&gt;), que ahora est&amp;aacute; evolucionando a ser un lenguaje, con el mismo n&amp;uacute;cleo que el AjSharp:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/26/ajsharp-un-int-233-rprete-a-la-c-sharp-trabajo-en-progreso.aspx"&gt;AjSharp: un int&amp;eacute;rprete a la C Sharp, trabajo en progreso&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n est&amp;aacute; pensado que se pueda utilizar otro lenguaje para los templates:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2006/10/02/Escribiendo-templates-de-AjGenesis-en-otros-lenguajes.aspx"&gt;Escribiendo templates de AjGenesis en otros lenguajes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pero hoy por hoy, se puede usar s&amp;oacute;lo AjBasic en la generaci&amp;oacute;n de c&amp;oacute;digo de AjGenesis. Lo adopt&amp;eacute;, porque pienso que el lenguaje de templates Y DE TAREAS (porque eso tiene AjGenesis, no s&amp;oacute;lo es templates, sino tambi&amp;eacute;n contiene c&amp;oacute;digo que organiza la generaci&amp;oacute;n de artefactos de textos), es tan fundamental en lo que quer&amp;iacute;a construir, que no pens&amp;eacute; en montarme sobre otro proyecto. Creo que, pasado el tiempo, ha sido una sabia decisi&amp;oacute;n. Veo que el proyecto actual, tengo un dominio total sobre algo que es parte del n&amp;uacute;cleo de AjGenesis.&lt;/p&gt;
&lt;p&gt;Recordemos que AjBasic se usa en las tareas. Y permite el uso de objetos din&amp;aacute;micos. Por ejemplo:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Title &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    Project.Title = Project.Name&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Version &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    Project.Version = &lt;span style="color:#006080;"&gt;&amp;quot;1.0.*&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Este ejemplo, tomado de una tarea t&amp;iacute;pica de los ejemplos que vienen incluidos con el sistema, muestra dos caracter&amp;iacute;sticas muy usadas: una, preguntar por Project.Title y si Project o Project.Title no est&amp;aacute;n definidos, eso vale falso para el if (una extensi&amp;oacute;n de ideas de lenguajes anteriores como PHP). Me evito preguntar por Nothing o cosas as&amp;iacute;. Y otra caracter&amp;iacute;stica: como Project es un objeto din&amp;aacute;mico, le puedo agregar propiedades en cualquier momento.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n se le pueden sembrar, en el environment (entorno de valores definidos en el sistema en ejecuci&amp;oacute;n), objetos .NET &amp;ldquo;duros&amp;rdquo;, y el lenguaje los maneja por reflection.&lt;/p&gt;
&lt;p&gt;Esto es algo que todo lenguaje interpretado de hoy en d&amp;iacute;a deber&amp;iacute;a tener: explotaci&amp;oacute;n f&amp;aacute;cil y directa de cualquier framework de clases que lo sostenga. He programado AjBasic de tal forma que podr&amp;iacute;a reimplementarlo f&amp;aacute;cilmente en Java, usando entonces la librer&amp;iacute;a de clases de Java. Y tiene una estructura (int&amp;eacute;rprete que ejecuta un &amp;aacute;rbol abstracto), que puede reimplementarse en cualquier lenguaje en que sea necesario. Por ahora, no he visto la necesidad de hacerlo. Estas razones hacen que no me haya preocupado por compilarlo a bytecodes de la m&amp;aacute;quina virtual, usando CodeDom, o Emit, porque no es el n&amp;uacute;cleo de lo que estoy persiguiendo: no necesito velocidad, necesito flexibilidad.&lt;/p&gt;
&lt;p&gt;Otro peque&amp;ntilde;o e importante detalle:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;include &lt;span style="color:#006080;"&gt;&amp;quot;Tasks/Build${Technology.Programming.Dialect}.ajg&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Este tipo de instrucci&amp;oacute;n, de nuevo inspirado en PHP, permite la inclusi&amp;oacute;n din&amp;aacute;mica de c&amp;oacute;digo. Dependiendo de lo que diga el modelo de tecnolog&amp;iacute;a, puedo incluir en la ejecuci&amp;oacute;n a Tasks/BuildCSharp2.ajg o a Tasks/BuildJava.ajg o lo que sea, din&amp;aacute;micamente.&lt;/p&gt;
&lt;p&gt;Y en un proyecto actual, del que espero postear en breve, hasta puedo incluir en la expansi&amp;oacute;n de un archivo de template, a otro, din&amp;aacute;micamente:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; System.Text&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Business&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Collections&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; OakLeaf.MM.Main.Data&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;Partial &lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; ${Table.SqlName}&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; Hook method automatically executed from the mmBusinessObject constructor&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39;&amp;#39; &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Overridable&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; HookPartialConstructor()&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;&amp;#39;&amp;#39; Place code here to be executed when the business object instantiates&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&amp;lt;#&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; System.IO.File.Exists(&lt;span style="color:#006080;"&gt;&amp;quot;Templates/${Table.Name}PartialVb.tpl&amp;quot;&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;        include(&lt;span style="color:#006080;"&gt;&amp;quot;Templates/${Table.Name}PartialVb.tpl&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;#&amp;gt;        &lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;End&lt;/span&gt; Class&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Y tengo m&amp;aacute;s usos para un lenguaje flexible, dentro de AjGenesis. La idea final, es usarlo para tomar decisiones, para convertir el proceso de generaci&amp;oacute;n, en un sistema experto. Algunas decisiones ya toma. Por ejemplo, dada un entidad X, que tiene relaciones con otras, puede decidir incluir una p&amp;aacute;gina de &amp;ldquo;ver entidad X&amp;rdquo; que tenga enlaces o directamente los datos de las entidades con las que se relaciona. O al ver que en el modelo hay entidades, y una de las entidades modela una persona, saber que para mostrar en algun lado (una lista desplegable, una grilla&amp;hellip;.) a qu&amp;eacute; persona estamos refiriendo, deber&amp;aacute; mostrar nombre, apellido, y tal vez alg&amp;uacute;n de legajo. O que si estoy armando una aplicaci&amp;oacute;n distribuida en Java, sepa deducir qu&amp;eacute; servicios web debo implementar, que DTOs hay que definir, seg&amp;uacute;n los casos de usos que est&amp;eacute;n descriptos en el modelo, y que escriba los ensambladores de esos DTOs.&lt;/p&gt;
&lt;p&gt;Esos sos ejemplos peque&amp;ntilde;os y grandes de decisiones. Pero la idea es ir avanzando en tener m&amp;aacute;s decisiones, y m&amp;aacute;s reglas, implementadas no con un r&amp;iacute;gido sistema de reglas forward chaining o backward chaining (que no lo descarto, de ah&amp;iacute; mi implementaci&amp;oacute;n de AjProlog en curso y de otras ideas), sino ir viendo de explorar la inserci&amp;oacute;n de decisiones en cualquier momento del proceso de generaci&amp;oacute;n de c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Otro ejemplo: en el proyecto en curso, un sistema real, se implement&amp;oacute; con AjBasic/AjGenesis una serie de reglas que examinan la base de datos de desarrollo, y detectan inconsistencias en los nombres de las columnas o relaciones de uno a muchos mal definidas. Y podemos seguir implementando m&amp;aacute;s reglas, que nos avisen de otros problemas.&lt;/p&gt;
&lt;p&gt;Por todo esto, es que no adopt&amp;eacute; un lenguaje de templates existente: AjGenesis necesitaba, desde su concepci&amp;oacute;n, un lenguaje que fuera m&amp;aacute;s que un lenguaje de templates. Esto me lo hizo ver mis primeros trabajos en el tema, en los 80, cuando implement&amp;eacute; algo parecido en C, pero con limitaciones. Y cuando le&amp;iacute; en estos a&amp;ntilde;os, el libro de &lt;a target="_blank" href="http://gendotnet.com/"&gt;Kathleen Dollard&lt;/a&gt;&amp;nbsp;&lt;a target="_blank" href="http://www.amazon.com/exec/obidos/ASIN/1590591372/qid%3D1103643269/sr%3D11-1/ref%3Dsr_11_1/104-5797382-2343919"&gt;Code Generation in Microsoft .NET&lt;/a&gt; donde ella no se animaba a implementar un lenguaje, y adoptaba uno existente, como XSLT sobre XML (mala elecci&amp;oacute;n), y luego en cada cap&amp;iacute;tulo, ten&amp;iacute;a que hacer malabares con el modelo, para poder conseguir alg&amp;uacute;n resultado, al leer eso, me decid&amp;iacute; por un lenguaje flexible.&lt;/p&gt;
&lt;p&gt;Y no tard&amp;eacute; mucho en construir el prototipo. Result&amp;oacute;, como muchas otras veces, divertido! :-)&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.facebook.com/ajlopez"&gt;http://www.facebook.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695470" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjBasic/default.aspx">AjBasic</category></item><item><title>Generación de código, AjGenesis, y Dunga dunga a la tecnología</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/14/generaci-243-n-de-c-243-digo-ajgenesis-y-dunga-dunga-a-la-tecnolog-237-a.aspx</link><pubDate>Sun, 14 Jun 2009 17:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695333</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1695333</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/14/generaci-243-n-de-c-243-digo-ajgenesis-y-dunga-dunga-a-la-tecnolog-237-a.aspx#comments</comments><description>&lt;p&gt;En un post m&amp;iacute;o&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Sobre la generaci&amp;oacute;n de c&amp;oacute;digo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;comentaba sobre &lt;a target="_blank" href="http://ajgenesis.codeplex.com"&gt;AjGenesis&lt;/a&gt; y generaci&amp;oacute;n de c&amp;oacute;digo en general. En uno de los p&amp;aacute;rrafos declaraba:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h5&gt;Dunga dunga un ratito&lt;/h5&gt;
&lt;p&gt;De alguna forma, un generador de c&amp;oacute;digo ideal no estar&amp;aacute; atado a una tecnolog&amp;iacute;a. Siempre habr&amp;aacute; alguna &amp;quot;better mousetrap&amp;quot;, siempre alguien inventar&amp;aacute; alguna nueva forma de hacer algo, siempre habr&amp;aacute; un ruso con insomnio, o un hind&amp;uacute; sin novia, que no tiene otra cosa que hacer que crear algo nuevo, ya sea en forma de librer&amp;iacute;a, framework, patr&amp;oacute;n, o estilo arquitect&amp;oacute;nico. Un generador de c&amp;oacute;digo debe ser agn&amp;oacute;stico de la tecnolog&amp;iacute;a, de las modas, de las soluciones actuales y futuras.&lt;/p&gt;
&lt;p&gt;El generador de c&amp;oacute;digo que adoptemos, debe poder adaptarse a lo que queramos hoy y ma&amp;ntilde;ana y pasado ma&amp;ntilde;ana. La estrategia es: no importa la tecnolog&amp;iacute;a, el patr&amp;oacute;n o el framework que aparezca, nuestro generador deber&amp;aacute; aprovecharse de lo que surja. Es lo que llamo la estrategia &amp;quot;dunga dunga&amp;quot;: si aparece una nueva tecnolog&amp;iacute;a T1, le hacemos &amp;quot;dunga dunga&amp;quot; a T1, si aparece un nuevo framework PiruloStruts, adaptamos nuestras plantillas a aprovecharse de ese framework, &amp;quot;dunga dunga&amp;quot; a PiruloStruts. Es como un maestro de aikido: siempre habr&amp;aacute; alguien m&amp;aacute;s fuerte, s&amp;oacute;lo hay que utilizar la fuerza del otro, para vencerlo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un comentador &lt;a href="http://emmanueloga.blogspot.com"&gt;Emmanuel&lt;/a&gt; escrib&amp;iacute;a:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un resumen y secciones mas especificas ayudar&amp;iacute;an (tienes que admitir que &amp;quot;Dunga dunga un ratito&amp;quot; es un titulo sobre el cual es dif&amp;igrave;cil sacar conclusiones :).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bien, me refer&amp;iacute;a a un viejo chiste, que no encontr&amp;eacute; ahora en la web, as&amp;iacute; que tratar&amp;eacute; de transcribirlo aqu&amp;iacute;, como pueda: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Resulta que un explorador se pierde en la selva, y ya exhausto, se encuentra con una tribu de ind&amp;iacute;genas, con caras de pocos amigos. Lo rodean, el que parece el jefe, se le acerca, y le despacha:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hombre blanco! Elige! Dunga dunga o muerte!!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;El explorador no entiende qu&amp;eacute; es eso de &amp;ldquo;dunga dunga&amp;rdquo;, as&amp;iacute; que acepta eso, antes que la muerte. Los miembros de la tribu sonr&amp;iacute;en, y le empiezan a dar al pobre explorador, de formas que &amp;eacute;ste no se lo imaginaba&amp;hellip; &lt;/p&gt;
&lt;p&gt;Lo dejan, y el explorador, maltrecho, sigue su camino, se encuentra con otra tribu, otro jefe, y la ya cl&amp;aacute;sica frase:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Hombre blanco! Elige! Dunga dunga o muerte!!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;El explorador, escarmentado, responde:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;No!! No dunga dunga de nuevo!! no!!! Prefiero la muerte!!&amp;rdquo;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;El jefe asiente, pero se le acerca, le pasa brazo por el hombre, y con afecto y sonriendo, le dice:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Bueno, muerte, pero antes&amp;hellip; dunga dunga un ratito, eh?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:-) :-)&lt;/p&gt;
&lt;p&gt;A eso me refer&amp;iacute;a cuando escrib&amp;iacute; ese post. AjGenesis, como generador de c&amp;oacute;digo, no est&amp;aacute; especializado en producir artefactos para una tecnolog&amp;iacute;a. No es como Xdoclet que s&amp;oacute;lo produce Java, o est&amp;aacute; muy orientado (por lo menos en sus comienzos) a EJB (Enterprise Java Beans).&lt;/p&gt;
&lt;p&gt;No, lo que hace AjGenesis, es aprovecharse del conocimiento del programador o equipo de programaci&amp;oacute;n, de las tecnolog&amp;iacute;as, frameworks existentes o futuros, y generar gran parte de una soluci&amp;oacute;n (o por lo menos la parte repetitiva).&lt;/p&gt;
&lt;p&gt;Recordemos que AjGenesis puede partir de un modelo abstracto y generar artefactos de textos (que pueden ser una soluci&amp;oacute;n completa):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis30.png" alt="" /&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Notemos que puede haber m&amp;aacute;s de un modelo inicial. En muchos de los ejemplos que publiqu&amp;eacute;, hay un modelo independiente de la plataforma (por ejemplo, que describe que nuestro sistemas tendr&amp;aacute; departamentos, empleados, clientes, proveedores&amp;hellip;) y un modelo de tecnolog&amp;iacute;a (que indica que vamos a usar tal base de datos, y tal lenguaje, y una interface web, etc..)&lt;/p&gt;
&lt;p&gt;Pero tambi&amp;eacute;n puede partir de la base de datos, y generar un modelo de base, que puede ser completado, ajustado, y usado m&amp;aacute;s adelante la generaci&amp;oacute;n de c&amp;oacute;digo:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesis31.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;El modelo a usar es totalmente definible. Y las tareas y plantillas a usar, totalmente definibles. Si lo que Uds. necesitan, es generar aplicaciones con interfaz web, usando Struts 2, es cuesti&amp;oacute;n de armarse las plantillas y tareas que generen ese tipo de soluci&amp;oacute;n. Si luego necesitan generar una aplicaci&amp;oacute;n en ASP.NET 3.5, con persistencia resuelta en NHibernate, de nuevo es cuesti&amp;oacute;n de definir las tareas y plantillas adecuadas.&lt;/p&gt;
&lt;p&gt;Pero si el d&amp;iacute;a de ma&amp;ntilde;ana, aparece un nuevo ORM (Object Relational Mapper), o hay una nueva forma de implementar la persistencia, podemos &amp;ldquo;instruir&amp;rdquo; al AjGenesis para que genere los artefactos de textos que necesitemos.&lt;/p&gt;
&lt;p&gt;Ya he publicado ejemplos, explicaciones de todo esto en&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx"&gt;Posts sobre AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;desde una explicaci&amp;oacute;n de Hola Mundo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2006/11/19/generando-c-digo-hello-world-con-ajgenesis.aspx" title="Generando C&amp;oacute;digo- Hello World con AjGenesis"&gt;Generando C&amp;oacute;digo- Hello World con AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;hasta aplicaciones completas en distintas tecnolog&amp;iacute;as:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/06/25/generando-aplicaciones-con-ajgenesis.aspx" title="Generando aplicaciones con AjGenesis"&gt;Generando aplicaciones con AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En esos ejemplos, el modelo se define en archivos XML, pero tambi&amp;eacute;n pueden tomarlo desde texto:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/29/modelo-textual-para-generaci-243-n-de-c-243-digo-con-ajgenesis.aspx" title="Modelo textual para generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis"&gt;Modelo textual para generaci&amp;oacute;n de c&amp;oacute;digo con AjGenesis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;y desde otras fuentes menos convencionales:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/25/ajgenesis-modelo-desde-la-base-de-datos.aspx" title="AjGenesis- Modelo desde la Base de Datos"&gt;AjGenesis- Modelo desde la Base de Datos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/27/ajgenesis-modelo-generado-desde-los-assemblies.aspx" title="AjGenesis- Modelo generado desde los assemblies"&gt;AjGenesis- Modelo generado desde los assemblies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si hasta pueden implementar una soluci&amp;oacute;n web que genere c&amp;oacute;digo para cualquiera que lo necesite:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/04/03/code-generation-as-a-service.aspx" title="Code Generation as a Service"&gt;Code Generation as a Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As&amp;iacute; que no tienen excusas: no pueden quejarse de que no les avis&amp;eacute;, o que me encanut&amp;eacute;, ocult&amp;eacute; algo bajo la manga. Tienen todo eso disponible desde hace a&amp;ntilde;os. S&amp;oacute;lo falta poner cabeza y cerebro, en descubrir los modelos de base que necesitamos, y escribir las tareas y plantillas. Recomiendo siempre partir de una aplicaci&amp;oacute;n de ejemplo, que resuelva lo que Uds. necesitan, usando la tecnolog&amp;iacute;a que hayan elegido, y desde ah&amp;iacute;, ir construyendo las tareas y plantillas que necesiten.&lt;/p&gt;
&lt;p&gt;Como siempre aclaro, no toda la aplicaci&amp;oacute;n puede crearse por generaci&amp;oacute;n de c&amp;oacute;digo. Pero se pueden aplicar t&amp;eacute;cnicas, como generar desde el modelo que elijamos, s&amp;oacute;lo algunos artefactos de texto, y otros, los generamos manualmente.&lt;/p&gt;
&lt;p&gt;Lo interesante, es que as&amp;iacute;, cuando pasen las tecnolog&amp;iacute;as, cuando aparecen nuevas, podemos reaprovechar nuestro conocimiento anterior, al haber definido un modelo que describa nuestro problema, y luego, al conocer una nueva tecnolog&amp;iacute;a, y c&amp;oacute;mo resolver los mismos problemas de otra forma, podemos generar c&amp;oacute;digo para la nueva forma de hacer las cosas.&lt;/p&gt;
&lt;p&gt;Yendo a un ejemplo concreto. Desde hace d&amp;eacute;cadas, estamos haciendo ABM (Altas, Bajas y Modificaciones) de valores, como pa&amp;iacute;ses, provincias y dem&amp;aacute;s. Cuando resolvimos eso en Visual Fox, un cliente nos pidi&amp;oacute; hacerlo en ASP cl&amp;aacute;sico. Cuando resolvimos eso en ASP cl&amp;aacute;sico, otro cliente nos pidi&amp;oacute; eso en ASP.NET, o en JSP o en JSF (JavaServer Faces) o en lo que aparezca ma&amp;ntilde;ana. Pero el problema a resolver es el mismo: mantener una lista de valores. Si luego cambia la tecnolog&amp;iacute;a, cambia la soluci&amp;oacute;n a aplicar, pero el problema inicial se mantiene. En AjGenesis, podemos definir un modelo independiente&amp;nbsp; de la tecnolog&amp;iacute;a (por ejemplo, definiendo las entidades que tenemos que manejar, como Cliente, Factura, Remito, etc&amp;hellip; y sus relaciones), y por otro, instruyendo sobre qu&amp;eacute; tecnolog&amp;iacute;a usar (aportando uno o varios modelos dependientes de la tecnolog&amp;iacute;a), como ASP.NET, ASP.NET MVC, WCF, JSP, JSF, Struts 1 o 2, etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Otro camino hubiera sido lo que muchos de nosotros encaramos: hacer nuestro propio framework. He visto muchas consultoras de software, &amp;ldquo;casarse&amp;rdquo; con una tecnolog&amp;iacute;a (ej. Visual Fox), estudiarla, armar un framework sobre ella (que resuelva los problemas cl&amp;aacute;sicos, como ABMs, seguridad, autorizaci&amp;oacute;n, validaciones, etc&amp;hellip;) y luego ver c&amp;oacute;mo, ese trabajo de a&amp;ntilde;os, se diluye, porque la tecnolog&amp;iacute;a cambia.&lt;/p&gt;
&lt;p&gt;Si nosotros elevamos el nivel de abstracci&amp;oacute;n, identificamos los problemas a resolver (ABMs, listas, buscadores, seguridad, procesos, validaciones, reglas de negocio), y luego los resolvemos en una tecnolog&amp;iacute;a (ya sea viendo c&amp;oacute;digo de ejemplo, armando nuestros propios ejemplos, et&amp;hellip;), podemos describir ese mapeo de problema a soluci&amp;oacute;n concreta, usando las tareas y plantillas de AjGenesis.&lt;/p&gt;
&lt;p&gt;Como ejemplo: cuando comenc&amp;eacute; con el proyecto, no exist&amp;iacute;a ASP.NET 2.x. Sin embargo, los modelos que constru&amp;iacute; como ejemplos de base, pudieron ser usados para luego generar aplicaciones de ASP.NET 2.x. Actualmente, en un proyecto, estamos adaptando conocimiento previo, para generar c&amp;oacute;digo sobre .NET y &lt;a target="_blank" href="http://www.oakleafsd.com/pgProducts_mmnet.htm"&gt;Mere Mortals Framework&lt;/a&gt;. Y el modelo que construimos, f&amp;aacute;cilmente podr&amp;iacute;a ser reusado para otras aplicaciones, y otras tecnolog&amp;iacute;as,como Clipper o COBOL, hasta ASP.NET MVC o Wicket. El construir el modelo, pone de manifiesto qu&amp;eacute; es lo que queremos resolver, los problemas b&amp;aacute;sicos, que terminan expres&amp;aacute;ndose de forma independiente de la tecnolog&amp;iacute;a de moda, o el framework popular del momento.&lt;/p&gt;
&lt;p&gt;Y aunque usemos una sola tecnolog&amp;iacute;a, el ejercicio de definir el modelo, definir las tareas y plantillas, aporta una clara separaci&amp;oacute;n entre lo abstracto, y lo que llamo las &amp;ldquo;technicalities&amp;rdquo;, los detalles t&amp;eacute;cnicos de implementaci&amp;oacute;n, que el d&amp;iacute;a de ma&amp;ntilde;ana pueden cambiar.&lt;/p&gt;
&lt;p&gt;Entonces, no importa la tecnolog&amp;iacute;a: AjGenesis le puede hacer dunga dunga a la tecnolog&amp;iacute;a que venga. Si Uds. creen que la tecnolog&amp;iacute;a que Uds. usan actualmente, va a durar para siempre, lamento desilusionarlos. Vean la historia de la programaci&amp;oacute;n, los &amp;uacute;ltimos 30 o 50 a&amp;ntilde;os, y ver&amp;aacute;n que lo &amp;uacute;nico permanente es el cambio.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.facebook.com/ajlopez" title="http://www.facebook.com/ajlopez"&gt;http://www.facebook.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695333" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Generaci_26002300_243_3B00_n+de+C_26002300_243_3B00_digo/default.aspx">Generaci&amp;#243;n de C&amp;#243;digo</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Primeros pasos con Maven</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/12/primeros-pasos-con-maven.aspx</link><pubDate>Fri, 12 Jun 2009 10:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695102</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1695102</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/12/primeros-pasos-con-maven.aspx#comments</comments><description>&lt;p&gt;En estos d&amp;iacute;as estoy repoblando de software mi notebook. Una de las aplicaciones que he instalado, para comenzar a usar con m&amp;aacute;s frecuencia, es el Maven de la gente de la Apache Foundation. Durante a&amp;ntilde;os, muchos proyectos de c&amp;oacute;digo abierto basan su armado y empaquetado en un utilitario como el Ant. Pero m&amp;aacute;s y m&amp;aacute;s proyectos est&amp;aacute;n pasando a basarse en este otro utilitario Maven. As&amp;iacute; que aprovecho que mi nueva notebook est&amp;aacute; limpia de anteriores versiones, para probar este utilitario.&lt;/p&gt;
&lt;p&gt;Pueden visitar el sitio del proyecto (c&amp;oacute;digo abierto, en Java):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://maven.apache.org/index.html" title="http://maven.apache.org/index.html"&gt;http://maven.apache.org/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ah&amp;iacute; leemos&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project&amp;#39;s build, reporting and documentation from a central piece of information. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If you think that Maven could help your project, you can find out more information about in the &amp;quot;About Maven&amp;quot; section of the navigation. This includes an in-depth description of &lt;a href="http://maven.apache.org/what-is-maven.html"&gt;what Maven is&lt;/a&gt;, a &lt;a href="http://maven.apache.org/maven-features.html"&gt;list of some of its main features&lt;/a&gt;, and a set of &lt;a href="http://maven.apache.org/general.html"&gt;frequently asked questions about what Maven is&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;No nos revela mucho esa descripci&amp;oacute;n, pero les cuento algo: Maven es un Ant con esteroides. Basado en la descripci&amp;oacute;n de un proyecto con el Project Object Model, puede armar la estructura de ese proyecto, para que podamos despu&amp;eacute;s completarlo en programaci&amp;oacute;n, bajarse las librer&amp;iacute;as que necesitemos (p.ej. Hibernate, Spring..), y hasta armar un sitio del proyecto, como los que tienen los proyectos de la fundaci&amp;oacute;n Apache (de hecho, fue as&amp;iacute; como naci&amp;oacute; Maven, como un automatizador de la creaci&amp;oacute;n de nuevos proyectos a incubar en la fundaci&amp;oacute;n Apache).&lt;/p&gt;
&lt;p&gt;Yo me baj&amp;eacute; la &amp;uacute;ltima versi&amp;oacute;n, seg&amp;uacute;n su p&amp;aacute;gina de downloads:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://maven.apache.org/download.html" title="http://maven.apache.org/download.html"&gt;http://maven.apache.org/download.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En mi caso la versi&amp;oacute;n binaria &lt;a href="http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-2.1.0-bin.zip"&gt;apache-maven-2.1.0-bin.zip&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Estoy trabajando en un Windows Vista, as&amp;iacute; que expand&amp;iacute; ese .zip en el directorio c:\Program Files\apache-maven-2.1.0 y arm&amp;eacute; dos variables de ambiente, M2 y M2_HOME como pide la documentaci&amp;oacute;n del producto, adem&amp;aacute;s de asegurarme que existe la variable JAVA_HOME :&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven09.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Agregu&amp;eacute; el valor de M2 (el directorio de los binarios de Maven) a la lista de directorios contenida en mi variable de ambiente PATH.&lt;/p&gt;
&lt;p&gt;Una vez que hice eso, pude ejecutar una prueba desde la consola, que muestre la versi&amp;oacute;n de Maven que estoy usando. Vean que el comando a invocar es mvn:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven01.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estoy siguiendo los pasos del&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html"&gt;Maven in 5 minutes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para probar de crear un proyecto m&amp;iacute;nimo, un t&amp;iacute;pico Hello World. En un directorio Dev, ejecut&amp;eacute; el comando:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven10.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El maven comienza a armar la carpeta del proyecto, y a bajar cualquier dependencia que decida que necesite. Vean que van a tener que estar conectados a Internet la primera vez que lo ejecuten, porque lo m&amp;aacute;s probable es que Maven vaya bajando software adicional que necesita. El repositorio de Maven se va creando en un directorio .m2 dentro del directorio home del usuario. En mi caso&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven07.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Durante el proceso, va mostrando el avance de la creaci&amp;oacute;n del proyecto:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven02.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El resultado, es una carpeta como:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven12.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En el directorio inicial se encuentra el archivo pom.xml que describe al proyecto:&lt;/p&gt;
&lt;div style="font-size:8pt;margin:20px 0px 10px;overflow:auto;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border:silver 1px solid;padding:4px;" id="codeSnippetWrapper"&gt;
&lt;div style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;" id="codeSnippet"&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;project&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://maven.apache.org/POM/4.0.0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;   &lt;span style="color:#ff0000;"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;modelVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;4.0.0&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;modelVersion&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;groupId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;com.ajlopez.app&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;groupId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;my-app&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;packaging&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;jar&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;packaging&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;my-app&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;url&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;http://maven.apache.org&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;url&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;dependencies&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;dependency&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;groupId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;junit&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;groupId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;junit&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;artifactId&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;3.8.1&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt;       &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;scope&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;test&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;scope&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum16"&gt;  16:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;dependency&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:white;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum17"&gt;  17:&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;dependencies&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;border-style:none;padding:0px;"&gt;&lt;span style="color:#606060;" id="lnum18"&gt;  18:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;project&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El pr&amp;oacute;ximo paso, es, desde el directorio del proyecto, invocar al Maven nuevamente, con otra instrucci&amp;oacute;n, de empaquetar (compilar y armar un .jar con nuestra aplicaci&amp;oacute;n):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven13.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ahora podemos ejecutar nuestro programa empaquetado, con el comando&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven14.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un comando m&amp;aacute;s interesante, es el que genera el sitio del proyecto:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven15.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dentro del directorio target\site deja un sitio con la descripci&amp;oacute;n del proyecto, que podemos ver en nuestro navegador:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/maven08.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Espero que sirva como descripci&amp;oacute;n de los primeros pasos para probar Maven, aunque todav&amp;iacute;a no queda claro toda la potencia que tiene el producto. Tengo que describir m&amp;aacute;s en detalle lo que es el Project Object Model, las dependencias, el ciclo de vida de un proyecto, los distintos &amp;ldquo;verbos&amp;rdquo; que tenemos, adem&amp;aacute;s de package o test.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695102" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Por una Web Sin Barreras para las Personas con Discapacidad</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/09/por-una-web-sin-barreras-para-las-personas-con-discapacidad.aspx</link><pubDate>Tue, 09 Jun 2009 09:54:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694701</guid><dc:creator>lopez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1694701</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/09/por-una-web-sin-barreras-para-las-personas-con-discapacidad.aspx#comments</comments><description>&lt;p&gt;El bueno de Mart&amp;iacute;n Baldassarre (que, teniendo problemas de vista, firma sus emails con &amp;ldquo;&amp;iexcl;Nos vemos, y sino nos chocamos!&amp;rdquo; &amp;hellip;. ;-), siempre ha luchado por el tema de la accesibilidad. Estamos rodeados de tecnolog&amp;iacute;as, como Silverlight, Flash y dem&amp;aacute;s, pero a veces nos olvidamos de lo m&amp;aacute;s simple e importante: llegar a las personas, m&amp;aacute;s que a los ojos.&lt;/p&gt;
&lt;p&gt;Ya hab&amp;iacute;a escrito sobre otra reuni&amp;oacute;n que hab&amp;iacute;a difundido Mart&amp;iacute;n en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/10/09/accesibilidad-para-todos-sidar-y-sus-10-a-241-os.aspx" title="Accesibilidad para todos- SIDAR y sus 10 a&amp;ntilde;os"&gt;Accesibilidad para todos- SIDAR y sus 10 a&amp;ntilde;os&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ahora, se viene la tercera jornada &amp;quot;Por una Web Sin Barreras para las Personas con Discapacidad&amp;quot;. Esta es la gacetilla de prensa:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3&amp;ordf; Jornada &amp;quot;Por una Web Sin Barreras para las Personas con Discapacidad&amp;quot; &lt;br /&gt;El martes 16 de junio se realizar&amp;aacute; la 3&amp;ordf; Jornada &amp;quot;Por una Web Sin Barreras para las Personas con Discapacidad&amp;quot; donde se difundir&amp;aacute; informaci&amp;oacute;n sobre las dificultades que encuentran para utilizar Internet quienes tienen alguna discapacidad y las normas que deben aplicarse al construir p&amp;aacute;ginas web para evitar la creaci&amp;oacute;n de estas barreras. &lt;br /&gt;Esta Jornada es organizada por el Cap&amp;iacute;tulo Argentina de Internet Society (ISOC-AR) y se desarrollar&amp;aacute; en Microsoft de Argentina, Bouchard 710 Piso 4. Es una actividad no arancelada que requiere inscripci&amp;oacute;n previa. &lt;br /&gt;Se realizar&amp;aacute; transcripci&amp;oacute;n simult&amp;aacute;nea para personas hipoac&amp;uacute;sicas. &lt;br /&gt;Participar&amp;aacute;n Diputados, funcionarios, especialistas en accesibilidad web y expertos en discapacidad. &lt;br /&gt;Inscripci&amp;oacute;n:&amp;nbsp; Enviando Nombre, N&amp;uacute;mero de Documento y empresa/organizaci&amp;oacute;n a:&amp;nbsp; &lt;a href="mailto:acc@isoc.org.ar"&gt;acc@isoc.org.ar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PROGRAMA&lt;/p&gt;
&lt;p&gt;3&amp;ordf; Jornada &amp;quot;Por una Web Sin Barreras para las Personas con Discapacidad&amp;quot; &lt;br /&gt;martes 16 de junio de 2009&lt;/p&gt;
&lt;p&gt;8:45 hs. ACREDITACI&amp;Oacute;N&lt;/p&gt;
&lt;p&gt;9:15 hs. APERTURA &lt;br /&gt;Ezequiel Glinsky:&amp;nbsp; Gerente de Nuevas Tecnolog&amp;iacute;as, Microsoft de Argentina &lt;br /&gt;Sebastian Bellagamba:&amp;nbsp; Manager - Oficina Regional para America Latina y el Caribe, Internet Society (ISOC) &lt;br /&gt;Raquel Tiramonti:&amp;nbsp; Presidenta de la Comisi&amp;oacute;n Nacional Asesora para la Integraci&amp;oacute;n de Personas Discapacitadas (CONADIS) &lt;br /&gt;Mar&amp;iacute;a Jos&amp;eacute; Lubertino:&amp;nbsp; Presidenta del Instituto Nacional contra la Discriminaci&amp;oacute;n, la Xenofobia&amp;nbsp; y el Racismo (INADI) &lt;br /&gt;Claudio Morgado:&amp;nbsp; Diputado Nacional, Presidente de la Comisi&amp;oacute;n de Discapacidad &lt;br /&gt;Nicol&amp;aacute;s Trotta:&amp;nbsp; Subsecretario de Tecnolog&amp;iacute;as de Gesti&amp;oacute;n, Secretar&amp;iacute;a de la Funci&amp;oacute;n P&amp;uacute;blica&lt;/p&gt;
&lt;p&gt;10:00 hs. &amp;quot;Porque, para que y como de la Accesibilidad Web&amp;quot; &lt;br /&gt;Jorge Plano:&amp;nbsp; Internet Society Cap&amp;iacute;tulo Argentina (ISOC-AR) y UTN Fac. Reg. Buenos Aires&lt;/p&gt;
&lt;p&gt;10:40 hs. CAFE&lt;/p&gt;
&lt;p&gt;11:00 hs. &amp;quot;Discapacidad, Tecnolog&amp;iacute;a y la Convenci&amp;oacute;n sobre los Derechos de las Personas con Discapacidad&amp;quot; &lt;br /&gt;Carolina Buceta:&amp;nbsp; Red por los Derechos con las Personas con Discapacidad (REDI)&lt;/p&gt;
&lt;p&gt;11:45 hs. &amp;quot;Nuevas Tecnolog&amp;iacute;as de Texto para las Telecomunicaciones para Personas Hipoac&amp;uacute;sicas&amp;quot; &lt;br /&gt;Arnoud van Wijk:&amp;nbsp; Disability Projects Coordinator, Internet Society (ISOC)&lt;/p&gt;
&lt;p&gt;12:15 hs. RECESO PARA ALMUERZO&lt;/p&gt;
&lt;p&gt;13:30 hs.&amp;nbsp; Principios tecnol&amp;oacute;gicos para la accesibilidad web &lt;br /&gt;Claudio Segovia:&amp;nbsp; Internet Society Cap&amp;iacute;tulo Argentina (ISOC-AR) / Fund. SIDAR &lt;br /&gt;Mart&amp;iacute;n Baldassarre:&amp;nbsp; Internet Society Cap&amp;iacute;tulo Argentina (ISOC-AR) / Fund. SIDAR &lt;br /&gt;Mart&amp;iacute;n Sal&amp;iacute;as:&amp;nbsp; Southworks&lt;/p&gt;
&lt;p&gt;14:45 hs. CAFE&lt;/p&gt;
&lt;p&gt;15:10 hs.&amp;nbsp; Experiencias de accesibilidad&amp;nbsp; web en Argentina &lt;br /&gt;Maria Dolores Garc&amp;iacute;a:&amp;nbsp; Programa para la Sociedad de la Informaci&amp;oacute;n (PSI-SECOM) &lt;br /&gt;Karina Rojo:&amp;nbsp; Administraci&amp;oacute;n Nacional de la Seguridad Social (ANSES) &lt;br /&gt;Norma Bonora:&amp;nbsp; Soles de Buenos Aires &lt;br /&gt;Nicolas Boccacci:&amp;nbsp; Universidad Cat&amp;oacute;lica Argentina (UCA)&lt;/p&gt;
&lt;p&gt;16:30 hs. CIERRE &lt;br /&gt;M&amp;oacute;nica Bianchi:&amp;nbsp; Presidenta Asociaci&amp;oacute;n Civil para la Integraci&amp;oacute;n Social (ACIS) &lt;br /&gt;M&amp;oacute;nica Abalo Laforgia:&amp;nbsp; Presidenta del Cap&amp;iacute;tulo Argentina de Internet Society (ISOC-AR)&lt;/p&gt;
&lt;p&gt;Actividad no arancelada que requiere inscripci&amp;oacute;n previa: enviando Nombre, N&amp;uacute;mero de Documento y empresa/organizaci&amp;oacute;n a:&amp;nbsp; &lt;a href="mailto:acc@isoc.org.ar"&gt;acc@isoc.org.ar&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se realizar&amp;aacute; transcripci&amp;oacute;n simult&amp;aacute;nea para personas hipoac&amp;uacute;sicas.&lt;/p&gt;
&lt;p&gt;Patrocinan: &lt;br /&gt;Microsoft &lt;br /&gt;Administraci&amp;oacute;n Nacional de la Seguridad Social (ANSES) &lt;br /&gt;Instituto Nacional contra la Discriminaci&amp;oacute;n, la Xenofobia y el Racismo (INADI) &lt;br /&gt;Fundaci&amp;oacute;n La Naci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;M&amp;aacute;s informaci&amp;oacute;n en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.isoc.org.ar/accesibilidad.html"&gt;http://www.isoc.org.ar/accesibilidad.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hubo dos jornadas anteriores:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.isoc.org.ar/proyectos/jornada2.html" title="Aqu&amp;iacute; pueden leerse detalles de la Segunda Jornada, incluyendo las presentaciones"&gt;Aqu&amp;iacute; pueden leerse detalles de la Segunda Jornada, incluyendo las presentaciones&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.isoc.org.ar/proyectos/jornada.html" title="Aqu&amp;iacute; pueden leerse detalles de la Primera Jornada, incluyendo las presentaciones"&gt;Aqu&amp;iacute; pueden leerse detalles de la Primera Jornada, incluyendo las presentaciones&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para conocer m&amp;aacute;s sobre el tema &lt;a href="http://www.isoc.org.ar/proyectos/referencias.html" title="referencias a sitios sobre accesibilidad web"&gt;referencias a sitios sobre accesibilidad web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Favor de difundir estas jornadas!&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694701" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/interfaces/default.aspx">interfaces</category></item><item><title>PyCon 2009 Argentina</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/05/pycon-2009-argentina.aspx</link><pubDate>Fri, 05 Jun 2009 09:57:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694123</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1694123</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/05/pycon-2009-argentina.aspx#comments</comments><description>&lt;p&gt;La gente de PyCon Argentina http://ar.pycon.org/ est&amp;aacute; organizando la Primera Conferencia Argentina de Python, a realizarse en Buenos Aires, el 4 y 5 de Setiembre de 2009.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://ar.pycon.org"&gt;&lt;img border="0" src="http://ar.pycon.org/common/2009/website/img/banners/PyConAR-2009-banner-grande.png" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Pueden encontrar m&amp;aacute;s informaci&amp;oacute;n en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/about/" title="http://ar.pycon.org/2009/about/"&gt;http://ar.pycon.org/2009/about/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hay &lt;a href="http://ar.pycon.org/2009/conference/keynotes/" title="Charlas Plenarias"&gt;Charlas Plenarias&lt;/a&gt;, &lt;a href="http://ar.pycon.org/2009/conference/talks/" title="Charlas Programadas"&gt;Charlas Programadas&lt;/a&gt;, &lt;a href="http://ar.pycon.org/2009/conference/lightning/" title="Charlas Rel&amp;aacute;mpago"&gt;Charlas Rel&amp;aacute;mpago&lt;/a&gt; (hay que ir preparado para hablar!) Todav&amp;iacute;a faltan definir varios puntos, creo que no est&amp;aacute; decidido el lugar de la reuni&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Pero ya hay un &amp;ldquo;Call for Papers&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/charlas/" title="http://ar.pycon.org/2009/charlas/"&gt;http://ar.pycon.org/2009/charlas/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PyCon Argentina - http://ar.pycon.org/&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Primera Conferencia Argentina de Python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buenos Aires - 4 y 5 de Septiembre de 2009&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt;, el grupo de usuarios de Python de Argentina llama a la participaci&amp;oacute;n de la comunidad de usuarios de Python y Software Libre a la Primera Conferencia Argentina de Python.&lt;/p&gt;
&lt;p&gt;En este evento nos juntaremos desarrolladores avanzados y principiantes de Python para intercambiar informaci&amp;oacute;n, compartir experiencias, analizar nuevas tecnolog&amp;iacute;as, y en general aprender m&amp;aacute;s de este lenguaje a trav&amp;eacute;s de la comunidad de Python Argentina.&lt;/p&gt;
&lt;p&gt;El autor de cada charla seleccionada podr&amp;aacute; participar presencialmente, como orador en el evento. En los casos en que la charla sea realizada por varios autores, se permitir&amp;aacute; un m&amp;aacute;ximo de 3 oradores.&lt;/p&gt;
&lt;p&gt;Aclaraci&amp;oacute;n: Por cuestiones presupuestarias, s&amp;oacute;lo podr&amp;aacute; abonar algunos de los pasajes, total o parcialmente, a los autores seleccionados que residan fuera de Capital Federal o Gran Buenos Aires.&lt;/p&gt;
&lt;p&gt;Agradecemos la contribuci&amp;oacute;n de todos en la difusi&amp;oacute;n de este llamado y del evento en si mediante los banners dise&amp;ntilde;ados para tal fin y que se encuentran la secci&amp;oacute;n &lt;a href="http://ar.pycon.org/2009/helping/publicize/"&gt;Ayudanos - Difundir&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;D&amp;oacute;nde enviar las Charlas&lt;/h3&gt;
&lt;p&gt;Las charlas deben ser enviadas para su aprobaci&amp;oacute;n a trav&amp;eacute;s de este sitio, en &lt;a href="http://ar.pycon.org/2009/conference/proposals/submit/"&gt;Conferencia - Propuestas - Enviar&lt;/a&gt; La fecha l&amp;iacute;mite de env&amp;iacute;o de charlas es el 29 de Junio inclusive. En caso de consultas o inconvenientes, contactarse con &lt;a href="mailto:charlas%40ar.pycon.org"&gt;charlas@ar.pycon.org&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;C&amp;oacute;mo enviar las Charlas&lt;/h3&gt;
&lt;p&gt;El env&amp;iacute;o de la propuesta de charla debe tener los siguientes datos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;T&amp;iacute;tulo: &lt;/li&gt;
&lt;li&gt;Autor(es): Nombre y apellido, breve descripci&amp;oacute;n de cada uno, foto, asociaci&amp;oacute;n, grupo de usuarios, organismo, o empresa a la que pertenece, si corresponde. &lt;/li&gt;
&lt;li&gt;Tiempo estimado de duraci&amp;oacute;n: Las charlas generalmente son de 45&amp;#39;. En caso de que sea mayor o menor el tiempo requerido solicitamos su justificaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Breve descripci&amp;oacute;n de la charla: Uno o dos p&amp;aacute;rrafo(s) que explique -no tan brevemente- el contenido de la presentaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Nivel objetivo de la charla: Clasificar dentro de: introductorio/intermedio/avanzado/experto &lt;/li&gt;
&lt;li&gt;Tipo de publico: Desarrolladores avanzados, desarrolladores principiantes, empresarios, docentes, p&amp;uacute;blico en general &lt;/li&gt;
&lt;li&gt;Conocimientos previos: Especificar que conocimientos previos deber&amp;aacute;n tener los asistentes. &lt;/li&gt;
&lt;li&gt;Tags: web, gui, databases, frameworks, orm, ide, ciencia, educaci&amp;oacute;n, juegos, comunidad, etc. &lt;/li&gt;
&lt;li&gt;Tel&amp;eacute;fono del/los autor/es: Para poder comunicarnos. &lt;/li&gt;
&lt;li&gt;Ciudad de residencia del/los autor/es. &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Qu&amp;eacute; formato deben tener las Presentaciones&lt;/h3&gt;
&lt;p&gt;El env&amp;iacute;o de las diapositivas y/o presentaciones debe tener alguno de los siguientes formatos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Openoffice.org presentation &lt;/li&gt;
&lt;li&gt;HTML standard &lt;/li&gt;
&lt;li&gt;Postscript &lt;/li&gt;
&lt;li&gt;PDF &lt;/li&gt;
&lt;li&gt;Texto plano &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Licencia&lt;/h3&gt;
&lt;p&gt;Debe especificarse una licencia que permita que &lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt; distribuya el material en un CD-Live o de Documentaci&amp;oacute;n y que permita ser descargado del sitio web de &lt;a href="http://ar.pycon.org/2009/pyar"&gt;PyAr&lt;/a&gt;. Se recomienda Creative Commons o similares.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es interesante que la comunidad de desarrolladores de Python vaya organizando este tipo de eventos. Espero que sea un &amp;eacute;xito.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694123" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category></item><item><title>Primer ejemplo con NHibernate 2.x</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/04/first_2D00_nhibernate_2D00_2_2D00_x_2D00_example.aspx</link><pubDate>Thu, 04 Jun 2009 09:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693849</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1693849</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/04/first_2D00_nhibernate_2D00_2_2D00_x_2D00_example.aspx#comments</comments><description>&lt;p&gt;Estuve trabajando creando una soluci&amp;oacute;n .NET que contiene un ejemplo m&amp;iacute;nimo de NHibernate 2.x. Estoy usando la distribuci&amp;oacute;n binaria NHibernate GA 2.0.1, siguiendo las instrucciones del manual de referencia.&lt;/p&gt;
&lt;p&gt;Pueden bajarse el c&amp;oacute;digo fuente de la soluci&amp;oacute;n de mi Skydrive:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/NHibernate/NHibernateExample1.zip"&gt;NHibernateExample1.zip&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Estuve usando la documentaci&amp;oacute;n en l&amp;iacute;nea de&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nhforge.org/doc/nh/en/" title="http://nhforge.org/doc/nh/en/"&gt;http://nhforge.org/doc/nh/en/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;y arm&amp;eacute; el mismo manual en formato .pdf, usando comandos del trunk de SVN:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nhibernate.svn.sourceforge.net/svnroot/nhibernate" title="https://nhibernate.svn.sourceforge.net/svnroot/nhibernate"&gt;https://nhibernate.svn.sourceforge.net/svnroot/nhibernate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si quieren, pueden bajar el manual en .pdf de este enlace:&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.todocontenidos.com/images/articles/nhibernate-reference.pdf"&gt;nhibernate-reference.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La soluci&amp;oacute;n contiene dos proyectos: una librer&amp;iacute;a de clases, y una aplicaci&amp;oacute;n de consola:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-02.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El dominio s&amp;oacute;lo contiene una clase, Cat (estoy siguiendo el primer ejemplo que se describe en la documentaci&amp;oacute;n):&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;namespace NHibernateExample1.Domain
{
    public class Cat
    {
        private string id;
        private string name;
        private char sex;
        private float weight;

        public Cat()
        {
        }
        public virtual string Id
        {
            get { return id; }
            set { id = value; }
        }

        public virtual string Name
        {
            get { return name; }
            set { name = value; }
        }

        public virtual char Sex
        {
            get { return sex; }
            set { sex = value; }
        }

        public virtual float Weight
        {
            get { return weight; }
            set { weight = value; }
        }
    }
}

Hay un recurso embebido que describe el mapeo Cat.hbm.xml:&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;hibernate-mapping xmlns=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;
namespace=&amp;quot;NHibernateExample1.Domain&amp;quot; assembly=&amp;quot;NHibernateExample1.Domain&amp;quot;&amp;gt;
  &amp;lt;class name=&amp;quot;Cat&amp;quot; table=&amp;quot;Cats&amp;quot;&amp;gt;
    &amp;lt;!-- A 32 hex character is our surrogate key. It&amp;#39;s automatically
generated by NHibernate with the UUID pattern. --&amp;gt;
    &amp;lt;id name=&amp;quot;Id&amp;quot;&amp;gt;
      &amp;lt;column name=&amp;quot;CatId&amp;quot; sql-type=&amp;quot;char(32)&amp;quot; not-null=&amp;quot;true&amp;quot;/&amp;gt;
      &amp;lt;generator class=&amp;quot;uuid.hex&amp;quot; /&amp;gt;
    &amp;lt;/id&amp;gt;
    &amp;lt;!-- A cat has to have a name, but it shouldn&amp;#39; be too long. --&amp;gt;
    &amp;lt;property name=&amp;quot;Name&amp;quot;&amp;gt;
      &amp;lt;column name=&amp;quot;Name&amp;quot; length=&amp;quot;16&amp;quot; not-null=&amp;quot;true&amp;quot; /&amp;gt;
    &amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;Sex&amp;quot; /&amp;gt;
    &amp;lt;property name=&amp;quot;Weight&amp;quot; /&amp;gt;
  &amp;lt;/class&amp;gt;
&amp;lt;/hibernate-mapping&amp;gt;&lt;/pre&gt;
&lt;p&gt;Hay un ExecuteAll.cmd en el directorio Sql, que crea la base de datos a usar (pueden darle como par&amp;aacute;metro el servidor de MS SQL Server a usar,&amp;nbsp; .\SQLEXPRESS es el valor asumido):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-03.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La aplicaci&amp;oacute;n de consola es simple: configura NHibernate, obtiene una sesi&amp;oacute;n, inserta nuevos objetos en una transacci&amp;oacute;n, ejecuta una consulta, y lista el resultado:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;        static void Main(string[] args)
        {
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

            ISession session = sessionFactory.OpenSession();
            ITransaction tx = session.BeginTransaction();

            Cat cat;

            cat = new Cat() { Name = &amp;quot;Moe&amp;quot;, Sex = &amp;#39;M&amp;#39;, Weight = 9.0f };

            session.Save(cat);

            cat = new Cat() { Name = &amp;quot;Larry&amp;quot;, Sex = &amp;#39;M&amp;#39;, Weight = 8.5f };

            session.Save(cat);

            cat = new Cat() { Name = &amp;quot;Sue&amp;quot;, Sex = &amp;#39;F&amp;#39;, Weight = 7.5f };

            session.Save(cat);

            tx.Commit();

            IQuery query = session.CreateQuery(&amp;quot;select c from Cat as c where c.Sex = :sex&amp;quot;);

            query.SetCharacter(&amp;quot;sex&amp;quot;, &amp;#39;M&amp;#39;);

            foreach (Cat kitty in query.Enumerable())
                System.Console.Out.WriteLine(&amp;quot;Male Cat: &amp;quot; + kitty.Name);

            session.Close();

            System.Console.ReadLine();
        }&lt;/pre&gt;
&lt;p&gt;Ejecutando la aplicaci&amp;oacute;n de consola se inserta en la base estos datos:&lt;img src="http://www.todocontenidos.com/images/articles/nhibernateex1-01.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El ejemplo es simple. Ahora que est&amp;aacute; funcionando con NHibernate 2.0, pienso actualizar mis templates de AjGenesis para usar esa versi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;No dejen de visitar el sitio de comunidad de NHibernate, para conseguir m&amp;aacute;s informaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nhforge.org"&gt;http://nhforge.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si tienen dudas sobre NHibernate, pueden preguntar en el grupo en espa&amp;ntilde;ol:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/NHibernate-Hispano" title="NHibernate-Hispano"&gt;NHibernate-Hispano&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1693849" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category></item><item><title>Holodeck a la Google</title><link>http://msmvps.com/blogs/lopez/archive/2009/06/01/holodeck-a-la-google.aspx</link><pubDate>Mon, 01 Jun 2009 04:21:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693519</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1693519</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/06/01/holodeck-a-la-google.aspx#comments</comments><description>&lt;p&gt;El desarrollo de la computaci&amp;oacute;n ha sido impresionante, desde la mitad del siglo pasado. Mucho de su avance se debi&amp;oacute;, en aquellos a&amp;ntilde;os, a la inversi&amp;oacute;n en investigaci&amp;oacute;n de EE.UU. durante la guerra fr&amp;iacute;a. Uno de los &amp;aacute;mbitos donde hubo mucha investigaci&amp;oacute;n fue en la simulaci&amp;oacute;n gr&amp;aacute;fica. Recuerdo las primeros pasos de Sutherland y c&amp;iacute;a, en la creaci&amp;oacute;n de escenarios en tres dimensiones.&lt;/p&gt;
&lt;p&gt;Hoy, la investigaci&amp;oacute;n tambi&amp;eacute;n debe tener un componente gubernamental, pero veo m&amp;aacute;s iniciativa privada. Cualquier avance puede llegar hoy a un mercado global, y eso permite que la investigaci&amp;oacute;n y desarrollo &amp;ldquo;se financie&amp;rdquo; con la expectativa de recupero de la inversi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Una de las empresas con mayor compromiso con la investigaci&amp;oacute;n es Google. Y en el evento Google I/O (donde tambi&amp;eacute;n present&amp;oacute; &lt;a target="_blank" href="http://wave.google.com"&gt;Wave&lt;/a&gt;, que merecer&amp;iacute;a un post aparte), mostr&amp;oacute; a su aparato a la Holodeck de Star Trek, pueden ver fotos en&lt;/p&gt;
&lt;p&gt;&lt;a href="http://searchengineland.com/google-holodeck-streetview-in-360-degrees-19808"&gt;Google Holodeck: StreetView In 360 Degrees&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;Bueno, no ser&amp;aacute; todav&amp;iacute;a como el de la Enterprise, pero algo es algo.&lt;/p&gt;
&lt;p&gt;Pero es impresionante c&amp;oacute;mo algoritmos, hardware, software han ido avanzando, desde aquellas primeras pantallas con escenas de &amp;ldquo;alambre&amp;rdquo; en 3D, a estos resultados. Parece que es s&amp;oacute;lo cuesti&amp;oacute;n de potencia de c&amp;aacute;lculo el alcanzar mejores resultados.&lt;/p&gt;
&lt;p&gt;Bueno, un enlace de postre, para los que les gusta la ciencia ficci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.whereiwrite.org/"&gt;Where I Write - Main Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1693519" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/interfaces/default.aspx">interfaces</category></item><item><title>Bing, el nuevo chico del barrio</title><link>http://msmvps.com/blogs/lopez/archive/2009/05/30/bing-el-nuevo-chico-del-barrio.aspx</link><pubDate>Sat, 30 May 2009 09:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693450</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1693450</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/05/30/bing-el-nuevo-chico-del-barrio.aspx#comments</comments><description>&lt;p&gt;Lleg&amp;oacute; el nuevo producto de Microsoft, que presentan, no como un buscador, como un engine de b&amp;uacute;squeda, sino como un motor de decisiones:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.decisionengine.com" title="http://www.decisionengine.com"&gt;http://www.decisionengine.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Please visit the site to view this media)&lt;/p&gt;
&lt;p&gt;Como empresa gigante, Microsoft se puede dar el lujo de tener un gran equipo de research, y llega el momento en que todo ese conocimiento y esfuerzo se vuelca en alg&amp;uacute;n producto (no siempre).&lt;/p&gt;
&lt;p&gt;Yo todav&amp;iacute;a tengo que probar ese producto, que no est&amp;aacute; liberado al p&amp;uacute;blico. Como muchos productos globales, hoy se anuncian de esta manera, con un video viral, como el de arriba, que no s&amp;oacute;lo est&amp;aacute; en el sitio, sino que tambi&amp;eacute;n est&amp;aacute; en Youtube, y lo puedo embeber en mis blogs.&lt;/p&gt;
&lt;p&gt;A simple vista, es un producto que montado sobre ideas (no implementaciones) de web sem&amp;aacute;ntica, apunta a no tener tanto agentes recorriendo y obteniendo informaci&amp;oacute;n, sino a presentarla y organizarla para que el usuario tenga una experiencia distinta.&lt;/p&gt;
&lt;p&gt;Veremos si cumple con la expectativa. Pero es interesante ver c&amp;oacute;mo la fuente de la informaci&amp;oacute;n es la propia web. Tambi&amp;eacute;n es interesante notar que la informaci&amp;oacute;n de la que parte, no estaba pensada para ser consumida de esa forma. Eso es lo que imagino que va a pasar con las ideas de web sem&amp;aacute;ntica. Las p&amp;aacute;ginas publicada s&amp;oacute;lo va a comenzar a contener informaci&amp;oacute;n sem&amp;aacute;ntica, cuando este tipo de aplicaciones se popularicen. Mientras tanto, el &amp;ldquo;trabajo sucio&amp;rdquo; de obtener informaci&amp;oacute;n de los datos de una p&amp;aacute;gina, quedar&amp;aacute; a cargo de las aplicaciones.&lt;/p&gt;
&lt;p&gt;No veo que sea una &amp;ldquo;killer application&amp;rdquo; para Google. M&amp;aacute;s bien, como Wikipedia, va a brindar otra experiencia de usuario. As&amp;iacute; como hay temas que investigamos con Google, as&amp;iacute; como habr&amp;aacute; otros m&amp;aacute;s estructurados que investigamos partiendo de Wikipedia, habr&amp;aacute; consultas, tareas, comparaciones, donde preferiremos (o no) a Bing.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1693450" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Inteligencia+Artificial/default.aspx">Inteligencia Artificial</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Video/default.aspx">Video</category></item></channel></rss>