<?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 : .NET</title><link>http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>ALT.NET Hispano VAN (reunión virtual): Aplicaciones modulares con Prism</title><link>http://msmvps.com/blogs/lopez/archive/2009/12/10/alt-net-hispano-van-reuni-243-n-virtual-aplicaciones-modulares-con-prism.aspx</link><pubDate>Thu, 10 Dec 2009 10:49:14 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1744625</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=1744625</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/12/10/alt-net-hispano-van-reuni-243-n-virtual-aplicaciones-modulares-con-prism.aspx#comments</comments><description>&lt;p&gt;Este sábado 12 de diciembre, 19 GMT (4 de la tarde aquí en Buenos Aires) de nuevo tenemos VAN (Reunión virtual, des-conferencia) organizada por &lt;a href="http://altnet-hispano.pbworks.com/" target="_blank"&gt;la comunidad de ALT.NET Hispano&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;(Más información sobre cómo asistir a la reunión virtual, software necesario, enlaces:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones" href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones"&gt;http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;)&lt;/p&gt;  &lt;p&gt;Esta vez el tema será Prism (&lt;a href="http://www.codeplex.com/CompositeWPF/" target="_blank"&gt;Composite Application Guidance para Windows Presentation Foundation y Silverlight&lt;/a&gt;). La introducción estará a cargo del bueno de &lt;a href="http://twitter.com/juliandominguez" target="_blank"&gt;@juliandominguez&lt;/a&gt;, que nos comenta &lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/57e0df07accb3792?hl=es" target="_blank"&gt;en la lista de ALT.NET Hispano&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;La idea de este próximo sábado es presentar sobre Prism (o Composite Application Guidance for WPF and Silverlight para los que prefieren el nombre real pero aburrido).&lt;/p&gt;    &lt;p&gt;¿Qué es Prism de patterns &amp;amp; practices y qué desafíos resuelve?&lt;/p&gt;    &lt;p&gt;¿Qué beneficios les brinda a arquitectos, desarrolladores y a la interacción con diseñadores?&lt;/p&gt;    &lt;p&gt;En esta sesión mostraré cómo Prism nos ayuda a trabajar en equipos distribuidos, no distribuidos, grandes o pequeños, con requerimientos cambiantes, aplicando conceptos como TDD y patrones de UI como Model View ViewModel (MVVM). También voy a mostrar cómo nos ayuda a reusar código que funcione en WPF y en Silverlight.&lt;/p&gt;    &lt;p&gt;Vamos a estar viendo los beneficios que nos trae Prism a la hora de construir una aplicación compuesta, como así también en qué (lio?) nos metemos cuando queremos usar Prism en una aplicación que no lo amerita.&lt;/p&gt;    &lt;p&gt;Espero que les resulte muy interesante a quienes no conocen Prism y tienen pensado empezar un proyecto en WPF o Silverlight.&lt;/p&gt;    &lt;p&gt;Sé que normalmente las VAN suelen ser a las 18:00 GMT, pero debido a mi horario (actualmente estoy en Redmond), preferiría que sea las 19:00 GMT. Esto sería el sábado 12/12.&lt;/p&gt;    &lt;p&gt;Así que la reunión será este sábado a las 19GMT (no a las 18GMT como otras veces).&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mi colección de enlaces sobre Prism:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/prism"&gt;http://delicious.com/ajlopez/prism&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Otros interesantes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/mef"&gt;http://delicious.com/ajlopez/mef&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/mvvm"&gt;http://delicious.com/ajlopez/mvvm&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/silverlight"&gt;http://delicious.com/ajlopez/silverlight&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/wpf"&gt;http://delicious.com/ajlopez/wpf&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(especialmente si agregan examples o tutorial, como &lt;a href="http://delicious.com/ajlopez/mef+example"&gt;http://delicious.com/ajlopez/mef+example&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Si es la primera vez que topan con el término VAN, les recuerdo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones" target="_blank"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/10/27/resultado-de-la-van-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx"&gt;sobre generación de código&lt;/a&gt;). También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.&lt;/p&gt; &lt;/blockquote&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=1744625" 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/Windows+Presentation+Foundation/default.aspx">Windows Presentation Foundation</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/Silverlight/default.aspx">Silverlight</category></item><item><title>ALT.NET Hispano VAN: Mocking, Rhino Mocks, Moq con Hadi Hariri</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/27/alt-net-hispano-van-mocking-rhino-mocks-moq-con-hari-hariri.aspx</link><pubDate>Fri, 27 Nov 2009 11:29:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1742471</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=1742471</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/27/alt-net-hispano-van-mocking-rhino-mocks-moq-con-hari-hariri.aspx#comments</comments><description>&lt;p&gt;Este sábado 28 de noviembre, la &lt;a href="http://altnet-hispano.pbworks.com" target="_blank"&gt;comunidad ALT.NET Hispano&lt;/a&gt; organiza una nueva VAN (Reunión virtual). Esta vez el horario (tomen nota) será 19:00 GMT/UTC (4 de la tarde por aquí en Buenos Aires, Argentina). El tema será el uso de Mocks, en nuestras pruebas automatizadas. La presentación del tema estará a cargo del bueno de Hadi Hariri (que pueden seguir en Twitter en &lt;a href="http://twitter.com/hhariri" target="_blank"&gt;@hhariri&lt;/a&gt;). Hadi vive en España, se presenta en su sitio:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://hadihariri.com" href="http://hadihariri.com"&gt;http://hadihariri.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;de esta manera:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;I&amp;#39;m a software developer and work as Tech Lead for &lt;/em&gt;&lt;a href="http://www.imeta.com"&gt;&lt;em&gt;iMeta Technologies&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. I also give talks and presentations. I love to travel and luckily get to do so when speaking at conferences. My main passions are Software Architecture, Web and TCP/IP development. I live in Málaga, with my wife Katya and my two wonderful sons, Maxim and Sasha. I run the local .NET User group for Málaga and the province. If you live in Málaga or are visiting, drop me a line.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Pueden leer sobre sus conferencias e intereses en:   &lt;br /&gt;&lt;a title="http://hadihariri.com/blogengine/page/Conferences.aspx" href="http://hadihariri.com/blogengine/page/Conferences.aspx"&gt;http://hadihariri.com/blogengine/page/Conferences.aspx&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://hadihariri.com/blogengine/archive.aspx" href="http://hadihariri.com/blogengine/archive.aspx"&gt;http://hadihariri.com/blogengine/archive.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El enlace a usar es &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;. La información sobre las VAN que vienen, están en la página del &lt;a href="http://altnet-hispano.pbworks.com/Calendario" target="_blank"&gt;Calendario de ALT.NET Hispano&lt;/a&gt;. Ahí leo más detalles sobre esta reunión de mañana sábado:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;La comunidad ALT.NET Hispano (&lt;/em&gt;&lt;a href="http://altnethispano.org)"&gt;&lt;em&gt;http://altnethispano.org)&lt;/em&gt;&lt;/a&gt;&lt;em&gt; realizará un evento virtual con el tema &amp;quot;Mocking&amp;quot; (e &amp;quot;Inyección de Dependencias&amp;quot;), a cargo de Hadi Hariri. Fecha: Sábado 28 de Noviembre a las 19:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Lugar: Para atender la reunión deben usar el enlace: &lt;/em&gt;&lt;a href="http://snipr.com/virtualaltnet"&gt;&lt;em&gt;http://snipr.com/virtualaltnet&lt;/em&gt;&lt;/a&gt;&lt;em&gt; el cual les demandará el uso del programa Microsoft Office Live Meeting 2007 Client. En esta ocasión la desconferencia estará a cargo de Hadi Hariri, Visual C# MVP, quien es consultor y desarrollador ante todo, así como apasionado de la arquitectura de software y el desarrollo de aplicaciones web. Es ponente habitual en conferencias sobre .NET y Win32, y ha escrito numerosas publicaciones. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Descripción: En esta charla primero repasaremos la inyección de dependencias e Inversión de Control y profundizaremos en los frameworks de Mocks. Veremos cómo funcionan, éstos últimos, así como también cómo sacarle el máximo de partida a ellos para hacer tests sostenibles. Examinaremos las diferencias entre Mocks y Stubs así como diferencias entre pruebas de estado e interacción. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Algunas páginas a revisar:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://martinfowler.com/articles/injection.html" target="_blank"&gt;&lt;em&gt;Inversion of Control Containers and the Dependency Injection pattern&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hadihariri.com/blogengine/post/2008/09/11/Mocks-can-be-your-friend-or-your-worst-nightmare.aspx" target="_blank"&gt;&lt;em&gt;Mocks can be your friend, or your worst nightmare&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://martinfowler.com/articles/mocksArentStubs.html" target="_blank"&gt;&lt;em&gt;Mocks Aren&amp;#39;t Stubs&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/projects/rhino-mocks.aspx" target="_blank"&gt;&lt;em&gt;Rhino Mocks&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/moq" target="_blank"&gt;&lt;em&gt;Moq&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.typemock.com/" target="_blank"&gt;&lt;em&gt;TypeMock&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.nmock.org/" target="_blank"&gt;&lt;em&gt;NMock&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en: &lt;/em&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/t/57766b68494fe859"&gt;&lt;em&gt;http://groups.google.com/group/altnet-hispano/t/57766b68494fe859&lt;/em&gt;&lt;/a&gt;&lt;em&gt; Para mayor información sobre cómo atender la reunión consulten: &lt;/em&gt;&lt;a href="http://tinyurl.com/van-hispano"&gt;&lt;em&gt;http://tinyurl.com/van-hispano&lt;/em&gt;&lt;/a&gt;&lt;em&gt; Pueden vincular el Google Calendar al suyo (&lt;/em&gt;&lt;a href="http://screenr.com/nr7)"&gt;&lt;em&gt;http://screenr.com/nr7)&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, o bien descargar el iCal de este evento en particular: &lt;/em&gt;&lt;a href="http://altnet-hispano.pbworks.com/f/VAN20091128.ics"&gt;&lt;em&gt;http://altnet-hispano.pbworks.com/f/VAN20091128.ics&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/10/27/resultado-de-la-van-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx"&gt;sobre generación de código&lt;/a&gt;). También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.&lt;/p&gt;  &lt;p&gt;Con respecto a Mocks, y librerías de mocking, he dejado enlaces en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://delicious.com/ajlopez/mocks" href="http://delicious.com/ajlopez/mocks"&gt;http://delicious.com/ajlopez/mocks&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/rhino" href="http://delicious.com/ajlopez/rhino"&gt;http://delicious.com/ajlopez/rhino&lt;/a&gt;    &lt;br /&gt;&lt;a title="http://delicious.com/ajlopez/moq" href="http://delicious.com/ajlopez/moq"&gt;http://delicious.com/ajlopez/moq&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=1742471" 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/Patrones/default.aspx">Patrones</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category></item><item><title>Generando código con AjGenesis usando archivos de mapeo de NHibernate</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/23/generating_2D00_code_2D00_with_2D00_ajgenesis_2D00_using_2D00_nhibernate_2D00_hbm_2D00_files.aspx</link><pubDate>Mon, 23 Nov 2009 09:18:30 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1741719</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=1741719</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/23/generating_2D00_code_2D00_with_2D00_ajgenesis_2D00_using_2D00_nhibernate_2D00_hbm_2D00_files.aspx#comments</comments><description>&lt;p&gt;En estos días, estuve trabajando en generar código de clases C#, usando como punto de partida los archivos .hbm, que se usan en &lt;a href="http://nhforge.org" target="_blank"&gt;NHibernate&lt;/a&gt; para especificar el mapeo de clases y tablas de bases relacionales. Como es usual, cuando encaro algo de generación de código uso &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto open source de generación de código (practico el “dog fooding” :-).&lt;/p&gt;  &lt;p&gt;(English version of this post &lt;a href="http://ajlopez.wordpress.com/2009/11/22/generating-code-with-ajgenesis-using-nhibernate-hbm-files/" target="_blank"&gt;Generating code with AjGenesis using NHibernate hbm files&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Pueden bajar un ejemplo de lo que estoy haciendo de mi Skydrive:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/AjGenesis/NHibernateMappingExample01.zip" target="_blank"&gt;Examples &amp;gt; AjGenesis &amp;gt; NHibernateMappingExample01.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(el código en desarrollo está en el trunk, en &lt;a href="http://ajgenesis.codeplex.com/sourcecontrol/changeset/view/61684?projectName=ajgenesis#" target="_blank"&gt;este change actual&lt;/a&gt;, en el directorio examples\NHibernateMappinp:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh03.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;pero si quieren ir directamente al ejemplo, pueden bajárselo completo desde el Skydrive que mencioné, que incluye el ejecutable de AjGenesis de la versión en desarrollo, no necesitan compilar nada).&lt;/p&gt;  &lt;p&gt;Luego de expandir el archivo del ejemplo, tendrán este contenido:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh02.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Para crear clases C#, pueden probar de ejecutar los comandos:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;GenerateClasses AjFirstExample
GenerateClasses AjTest&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Para crear un proyecto .NET con los archivos .cs y .hbm, y una solución, ejecutar:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;GenerateProject AjFirstExample
GenerateProject AjTest&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Los archivos generados, en ambos casos, quedan en el directorio Build.&lt;/p&gt;

&lt;p&gt;Hay dos proyectos ejemplo que son AjFirstExample, con dos mapeos simples, y AjTest, que tiene mapeos más interesantes, con “bags” y relaciones “many to one”.&lt;/p&gt;

&lt;p&gt;En el ejemplo, cada proyecto se describe con un simple archivo Project.xml:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&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;Name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&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;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;En cuanto necesite más información, lo agregaré ahí, o en tags meta de los propios archivos de mapeo y configuración.&lt;/p&gt;

&lt;p&gt;Este es uno de los archivos de mapeo que sirven de modelo inicial para este ejemplo de generación, en Projects\AjTest\Mappings, Department.hbm:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; &lt;span style="color:#0000ff;"&gt;?&amp;gt;&lt;/span&gt; 
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;mapping&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;&lt;/span&gt;
  &lt;span style="color:#ff0000;"&gt;assembly&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities&amp;quot;&lt;/span&gt;
  &lt;span style="color:#ff0000;"&gt;namespace&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities&amp;quot;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Department&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;table&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;departments&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;column&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Int32&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;generator&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;native&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&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:#ff0000;"&gt;type&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;String&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;bag&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Employees&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;lazy&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;inverse&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;cascade&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;pre style="margin:0px;width:100%;font-size:12px;background-color:#ffffff;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;column&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;IdDepartment&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;one&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;to&lt;/span&gt;-&lt;span style="color:#ff0000;"&gt;many&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;AjTest.Entities.Employee, AjTest.Entities&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;bag&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;  
  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;hibernate&lt;/span&gt;-mapping&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Este es el código generado para este mapeo, Department.generated.cs:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; Iesi.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; AjTest.Entities 
{
  &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Department {
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Description { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IList&amp;lt;Employee&amp;gt; Employees { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Department() 
    {
      &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Employees = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Employee&amp;gt;();
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Veamos el proceso de generación. Este es el contenido de GenerateProject.cmd:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;@echo off
&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; ProjectName=%1%
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &amp;quot;&lt;span style="color:#8b0000;"&gt;%1%&lt;/span&gt;&amp;quot;==&amp;quot;&lt;span style="color:#8b0000;"&gt;&lt;/span&gt;&amp;quot; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; ProjectName=AjFirstExample
Bin\AjGenesis.Console.exe Projects\%ProjectName%\Project.xml Tasks\AddMappings.ajg Tasks\BuildCSharp.ajg
xcopy Libraries\*.* Build\%ProjectName%\CSharp\Src\Libraries /Y /Q&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;La línea más importante es la que invoca a AjGenesis.Console.exe. El contenido de Project.xml se carga en memoria. La tarea AddMapping.ajg se carga y ejecuta (está escrita en un lenguaje dinámico, afectuosamente llamado AjBasic), y luego, se procesa la tarea BuildCSharp.ajg. Veamos el código de AddMapping.ajg:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#008000;"&gt;&amp;#39; Add mappings from directory if not specified in Project model&lt;/span&gt;
Include(&amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/Utilities.tpl&lt;/span&gt;&amp;quot;)
&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.Mappings &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
  Project.Mappings = CreateList()
  
  di = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.IO.DirectoryInfo(&amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings&lt;/span&gt;&amp;quot;)
  
  &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; fi &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; di.GetFiles(&amp;quot;&lt;span style="color:#8b0000;"&gt;*.hbm.xml&lt;/span&gt;&amp;quot;)
    filename = fi.Name
    Project.Mappings.Add(filename.Substring(0, filename.Length - 8))
  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&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;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Encuentra y agrega los nombres de los archivos de mapeo contenidos en el directorio de Mapping, dentro del proyecto (noten que se pueden usar clases y objetos del framework .NET). Una tarea más interesante es la GenerateCSharp.ajg. Primero, carga la dll de NHibernate, para usar más adelante su parser de archivos hbm:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/Utilities.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/FileUtilities.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/TypeUtilities.tpl&lt;/span&gt;&amp;quot;
Include(&amp;quot;&lt;span style="color:#8b0000;"&gt;Utilities/NHibernateUtilities.tpl&lt;/span&gt;&amp;quot;)
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/UtilitiesCs.tpl&lt;/span&gt;&amp;quot;
include &amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/CSharpFunctions.tpl&lt;/span&gt;&amp;quot;
AssemblyManager.LoadFrom(&amp;quot;&lt;span style="color:#8b0000;"&gt;Libraries/NHibernate.dll&lt;/span&gt;&amp;quot;)
parser = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NHibernate.Cfg.MappingSchema.MappingDocumentParser()
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Crea objetos dinámicos, donde coloca información de la solución y el proyecto a crear:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; Project.BuildDir &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
  Project.BuildDir = &amp;quot;&lt;span style="color:#8b0000;"&gt;Build/${Project.Name}/CSharp&lt;/span&gt;&amp;quot;
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Creating Directories...&lt;/span&gt;&amp;quot;
FileManager.CreateDirectory(Project.BuildDir)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Sql&lt;/span&gt;&amp;quot;)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src&lt;/span&gt;&amp;quot;)
FileManager.CreateDirectory(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/Libraries&lt;/span&gt;&amp;quot;)
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Defining Solution and Projects...&lt;/span&gt;&amp;quot;
Project.Solution = CreateObject()
Project.Solution.Guid = &amp;quot;&lt;span style="color:#8b0000;"&gt;FAE04EC0-301F-11D3-BF4B-00C04F79EFBC&lt;/span&gt;&amp;quot;
Project.Solution.Projects = CreateList()
message &amp;quot;&lt;span style="color:#8b0000;"&gt;Defining Entities Project...&lt;/span&gt;&amp;quot;
PrjEntities = CreateObject()
PrjEntities.Includes = CreateList()
PrjEntities.Guid = CreateGuid()
PrjEntities.COMGuid = CreateGuid()
Project.Solution.Projects.Add(PrjEntities)
Project.Entities = CreateList()
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ahora, itera sobre cada archivo hbm, lo lee usando el parser del propio NHibernate, toma información sobre las clases a generar:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; MappingName &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Mappings
  filename = &amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  mapping = parser.Parse(OpenAsStream(filename))
    
  &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; hbmclass &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; mapping.Items where IsType(hbmclass, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmClass&lt;/span&gt;&amp;quot;)
    Entity = CreateObject()
    
    Project.Entities.Add(Entity)
  
    Entity.ClassName = hbmclass.name
    Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt; = mapping.&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;
    
    &lt;span style="color:#008000;"&gt;&amp;#39; Namespace as default project name for Entities Project&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;not&lt;/span&gt; PrjEntities.Name &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
      PrjEntities.Name = mapping.&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt;
      PrjEntities.Directory = &amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/${PrjEntities.Name}&lt;/span&gt;&amp;quot;
      FileManager.CreateDirectory(PrjEntities.Directory)
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    
    Entity.Properties = CreateList()
    
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; hbmclass.Id &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = hbmclass.Id.name
      &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(hbmclass.Id.type1, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
      Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    
    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; hbmclass.Items
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmProperty&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.type1, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmManyToOne&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmSet&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.IsSet = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.Item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; IsType(item, &amp;quot;&lt;span style="color:#8b0000;"&gt;HbmBag&lt;/span&gt;&amp;quot;) &lt;span style="color:#0000ff;"&gt;then&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt; = CreateObject()
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Name = item.name
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.IsList = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;.Type = HbmTypeToCSharp(item.Item.&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, Entity.&lt;span style="color:#0000ff;"&gt;Namespace&lt;/span&gt;)
        Entity.Properties.Add(&lt;span style="color:#0000ff;"&gt;Property&lt;/span&gt;)
      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;    
  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pueden extender esta capacidades, procesando más tags (debería escribir un ejemplo usando los tags meta que puede contener el hbm; ya utilitarios de Java, como el venerable XDocLet, usaban esos tags para ayudarse en la generación de código, en Hibernate), y detectar más formas de mapeo de NHibernate. Ahora, pasa a la generación de código:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; Entity &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Entities
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/Entity.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${PrjEntities.Directory}/${Entity.ClassName}.generated.cs&lt;/span&gt;&amp;quot;, Environment)
  PrjEntities.Includes.Add(CreateFileCs(&amp;quot;&lt;span style="color:#8b0000;"&gt;${Entity.ClassName}.generated&lt;/span&gt;&amp;quot;))
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;La tarea genera los archivos .cs, y también crea un archivo de solución y otro de proyecto C#, copiando y embebiendo los archivos de mapeo originales:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="font-size:10pt;margin:0px;width:100%;font-family:consolas;background-color:#ffffff;"&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; MappingName &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Mappings
  filename = &amp;quot;&lt;span style="color:#8b0000;"&gt;Projects/${Project.Name}/Mappings/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  targetfilename = &amp;quot;&lt;span style="color:#8b0000;"&gt;${PrjEntities.Directory}/${MappingName}.hbm.xml&lt;/span&gt;&amp;quot;
  System.IO.File.Copy(filename, targetfilename, &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)
  PrjEntities.Includes.Add(CreateFileType(MappingName,&amp;quot;&lt;span style="color:#8b0000;"&gt;hbm.xml&lt;/span&gt;&amp;quot;))
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;each&lt;/span&gt; CsProject &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Project.Solution.Projects where CsProject.ProjectType&amp;lt;&amp;gt;&amp;quot;&lt;span style="color:#8b0000;"&gt;Web&lt;/span&gt;&amp;quot;
  FileManager.CreateDirectory(CsProject.Directory)
  FileManager.CreateDirectory(CsProject.Directory &amp;amp; &amp;quot;&lt;span style="color:#8b0000;"&gt;/Properties&lt;/span&gt;&amp;quot;)
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/CsProject.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${CsProject.Directory}/${CsProject.Name}.csproj&lt;/span&gt;&amp;quot;, Environment)
  TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/CSharp/AssemblyInfoCs.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${CsProject.Directory}/Properties/AssemblyInfo.cs&lt;/span&gt;&amp;quot;, Environment)
&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;
TransformerManager.Transform(&amp;quot;&lt;span style="color:#8b0000;"&gt;Templates/Solution.tpl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;${Project.BuildDir}/Src/${Project.Name}.sln&lt;/span&gt;&amp;quot;, Environment)
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Esta es la solución generada:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajgenesisnh01.png" alt="" /&gt;&lt;/p&gt;

&lt;h3&gt;Próximos pasos&lt;/h3&gt;

&lt;p&gt;Debería trabajar en algunos puntos:&lt;/p&gt;

&lt;p&gt;- Generar una solución más completa, como en otros ejemplos de AjGenesis (con un proyecto de infraestructura, un proyecto de Service Layer o similar, una presentación web, etc…).&lt;/p&gt;

&lt;p&gt;- Soportar más opciones de mapeo de NHibernate.&lt;/p&gt;

&lt;p&gt;- Usar los tags meta.&lt;/p&gt;

&lt;p&gt;Por ahora, pueden jugar con este ejemplo. Pueden cambiar los templates para generar más artefactos, por ejemplo, código VB.NET.&lt;/p&gt;

&lt;p&gt;Gracias a &lt;a href="http://twitter.com/fabiomaulo" target="_blank"&gt;@fabiomaulo&lt;/a&gt; por avisarmr de las capacidades públicas de parser de hbm dentro de NHibernate!&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=1741719" 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/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjGenesis/default.aspx">AjGenesis</category></item><item><title>Lo bello de Twitter: Ejemplo 1</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/22/the_2D00_beauty_2D00_of_2D00_twitter_2D00_example_2D00_1.aspx</link><pubDate>Sun, 22 Nov 2009 09:31:11 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1741510</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=1741510</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/22/the_2D00_beauty_2D00_of_2D00_twitter_2D00_example_2D00_1.aspx#comments</comments><description>&lt;p&gt;Soy un gran usuario de Twitter. Generalmente, uso TweetDeck como cliente, aunque a veces voy por la interfaz web. Twitter es la implementación de un idea simple (mensajes cortos, podemos seguir a quien querramos que tenga perfil público, nos pueden seguir y dejar de seguir en cualquier momento (noten los cambios de Facebook a tener perfiles públicos, veo que motivados por la facilidad que se da en Twitter)) Todo eso ha cambiado la forma en que interactuamos. En especial, en el ambiente del desarrollo del software, Twitter es un gran complemente (podría ser un reemplazo) a los lectores de feeds. Veamos un ejemplo de lo efectivo que puede ser.&lt;/p&gt;  &lt;p&gt;Todo comenzó ayer sábado, con un mensaje de &lt;a href="mailto:de@jfroma" target="_blank"&gt;@jfroma&lt;/a&gt;, desarrollador de software argentino, como yo, que escribía:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample05.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Yo no había leído todos sus mensajes del viernes, así, que curioso sobre ese comentario, fuí y los leí. El mensaje original aludía al patró Model View View Model. Sé que José (&lt;a href="http://twitter.com/jfroma" target="_blank"&gt;@jfroma&lt;/a&gt;) ha estado trabajando en ejemplos de &lt;a href="http://jfromaniello.blogspot.com/search/label/WPF" target="_blank"&gt;data binding en WPF&lt;/a&gt; usando modelos recuperados con NHibernate, así que seguí el link que apuntaba al usuario &lt;a href="http://twitter.com/michaellperry" target="_blank"&gt;@michaellperry&lt;/a&gt;, para leer sus mensajes. Era mi primer contacto con Michael:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample08.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Encontré, entre sus mensajes del viernes, esta presentació:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.notatpdc.com/Schedule/Detail/50" target="_blank"&gt;Session Detail: Data binding without INotifyPropertyChanged&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;preguntando para confirmar a &lt;a href="http://twitter.com/jfroma" target="_blank"&gt;@jfroma&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample06.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Ahora, tenía más contexto (una frase que repito muchas veces: con contexto, uno se puede manejar más entre la información que recibe). Con todo esto, descubro los intereses de Michael en su blog (noten cómo Michael usa su estado Twitter a la izquierda):&lt;/p&gt;  &lt;p&gt;&lt;a title="http://adventuresinsoftware.com/blog" href="http://adventuresinsoftware.com/blog"&gt;http://adventuresinsoftware.com/blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample09.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Descubrí la librería de código abierto de la presentación de Michael:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://updatecontrols.net" href="http://updatecontrols.net"&gt;http://updatecontrols.net&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample10.png" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Como siempre que encuentro algo interesante, ya sea para mí, o que pienso que puede ser interesante para alguien, comencé a tweetear sobre el tema. Al rato, veo que &lt;a href="http://twitter.com/jyinglee" target="_blank"&gt;@jyinglee&lt;/a&gt; desde China, también tomó nota, haciendo RT de mi mensaje:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/twitterexample07.png" alt="" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Todo comenzó con un simple mensaje. Este es el poder de Twitter, es“serendipity with help” (descubrimiento accidental con ayuda), con la ayuda de gente interesante que nos sigue y a la que seguimos.&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=1741510" 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/Twitter/default.aspx">Twitter</category></item><item><title>Alt.Net Hispano VAN, ASP.NET MVC 2 con estilo, de Oxite a CodeCamp</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/19/alt-net-hispano-van-asp-net-mvc-2-con-estilo-de-oxite-a-codecamp.aspx</link><pubDate>Thu, 19 Nov 2009 12:08:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1740732</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=1740732</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/19/alt-net-hispano-van-asp-net-mvc-2-con-estilo-de-oxite-a-codecamp.aspx#comments</comments><description>&lt;p&gt;Este sábado 21 de Noviembre, tendremos VAN (reunión virtual) organizada por la comunidad ALT.NET Hispano. El tema será ASP.NET MVC, en particular, la versión 2. Como siempre, la reunión no será sólo una exposición, sino también discusión, preguntas, ejemplos, recursos, opiniones. Hasta donde sé, el horario es el de siempre 5:00pm GMT (2 de la tarde acá en Buenos Aires). Y en enlace a usar es &lt;a title="http://snipr.com/virtualaltnet" href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt; (más detalle sobre software y qué es una VAN al final de este post).&lt;/p&gt;  &lt;p&gt;La presentación inicial estará a cargo de Cristian Prieto, Microsoft ASP.NET MVP, MCPD ASP.NET Web Development Applications 3.5, MCTS Workflow Foundation 3.5:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.cprieto.com/" href="http://www.cprieto.com/"&gt;http://www.cprieto.com/&lt;/a&gt; (me gusta el título “IDisposable Thoughts” :-)&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/cprieto01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Hi, My name is Cristian Prieto, I&amp;#39;m a Senior Software Developer living in Guatemala, Central America. I mainly &amp;quot;speak&amp;quot; in .Net languages (like C#, F# and _even_ VB.NET) but I really love programming in Python/Ruby/Erlang. When I&amp;#39;m not programming (or speaking at a .net user group) I enjoy reading and spend my life with my beautiful wife (Emy) and my three cats: Cocco, Motto and Chester&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Pueden seguirlo en Twitter como &lt;a href="http://twitter.com/cprieto" target="_blank"&gt;@cprieto&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/cprieto02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;y en LinkedIn como &lt;a title="http://www.linkedin.com/in/cprieto" href="http://www.linkedin.com/in/cprieto"&gt;http://www.linkedin.com/in/cprieto&lt;/a&gt;. Ahí leemos su experiencia:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;- Experienced Web Developer with more than 9 years in technologies like ASP.NET, PHP, Python, JavaScript and distributed programming.     &lt;br /&gt;- Agile software developer proficient with patterns and best practices like Test Driven Development, Behavior Driven Development and Continuous Integration.      &lt;br /&gt;- Lover of agile process based development like Lean Development, Kanban and Scrum.      &lt;br /&gt;- Technical Community Leader, mentor of new development trends and best practices. Awarded Microsoft ASP.NET MVP 2009      &lt;br /&gt;- Accustomed to work with many languages and tools.      &lt;br /&gt;- Self-thought and early adopter &lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;Cristian Prieto’s Specialties:&lt;/em&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;ASP.NET, SQL Server, Web Development in general     &lt;br /&gt;Python, Best practices, Multi tier application development, Agile development (lean, kanban, scrum) &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Escribe el bueno de Cristian &lt;a href="http://groups.google.com/group/altnet-hispano/t/6cd63a245ee45d60?hl=es" target="_blank"&gt;en la lista de ALT.NET Hispano&lt;/a&gt;, cuál va a ser el tema de la charla:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Como ustedes recordaran, este sábado 21 de noviembre tendremos la VAN acerca de &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC 2, quería comentar un poco de que esperar para esta VAN (bueno, quizás también por parte del nerviosismo de ser mi primera VAN :P)     &lt;br /&gt;&lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC fue &amp;quot;cocinado&amp;quot; durante 1 año y mientras tanto nos mantubieron pegados a la silla con 5 CTP&amp;#39;s y un par de betas... después de varios meses hemos visto aplicaciones en producción con la plataforma, 5 libros acerca del tema, muchos y muchos webcasts (hay 2 en &lt;/em&gt;&lt;a href="http://alt.net"&gt;&lt;em&gt;alt.net&lt;/em&gt;&lt;/a&gt;&lt;em&gt; hispano :D) y conferencias de &amp;quot;cómo explotarla&amp;quot;, multiples proyectos de ejemplo.... y, obviamente, muchas preguntas luego de hacer el &amp;quot;hola mundo&amp;quot;.     &lt;br /&gt;¿Qué pasa cuando necesitamos algo más que el típico proyecto de NerdDinner? ¿Qué pasa cuando mi aplicación realmente no es un típico ejemplo? ¿Dónde pongo la lógica? ¿Cómo divido y saco provecho de la framework? ¿Qué otras cosas podemos tener bajo la manga para hacernos la vida más sencilla?      &lt;br /&gt;Para aclarar estas dudas, examinaremos desde el punto de vista histórico y práctico con qué solemos comenzar y hasta dónde lo podemos llevar, mencionando cosas como MvcContrib y MvcTurbine y dónde encajan cosas como SharpArchitecture en todo esto...      &lt;br /&gt;¿Porqué menciono todo esto si la charla es de &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC 2?, simple, porque gran parte de los &amp;quot;problemas&amp;quot; que solemos encontrarnos con &lt;/em&gt;&lt;a href="http://ASP.NET"&gt;&lt;em&gt;ASP.NET&lt;/em&gt;&lt;/a&gt;&lt;em&gt; MVC vienen o prometen venir solucionados en la &amp;quot;cajita&amp;quot; de la versión 2...     &lt;br /&gt;Espero verlos en la VAN, y espero que les guste lo que he preparado :)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Todo indica que va a ser una VAN muy interesante: el título del mensaje (y de este post) alude a un proyecto “fracaso” Oxite, con código disponibl, que fue critica por la comunidad por los “bad smell” que presentaba en la implementación, y a &lt;a href="http://code.google.com/p/codecampserver/" target="_blank"&gt;CodeCamp&lt;/a&gt;, un nuevo proyecto de código abierto, que sirve de muestra de mejores prácticas con &lt;a href="http://www.asp.net/mvc" target="_blank"&gt;ASP.NET MVC&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank"&gt;Model View Controller&lt;/a&gt;). Cristian menciona también a proyectos como &lt;a href="http://code.google.com/p/sharp-architecture/" target="_blank"&gt;SharpArchitecture&lt;/a&gt;, &lt;a href="http://www.codeplex.com/MVCContrib" target="_blank"&gt;MvcContrib&lt;/a&gt; y &lt;a href="http://mvcturbine.codeplex.com/" target="_blank"&gt;MvcTurbine&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/10/27/resultado-de-la-van-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx" target="_blank"&gt;sobre generación de código&lt;/a&gt;). Supongo (pero confirmen) que la URL de entrada de esta VAN será &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;. Cualquier cosa, pueden consultar &lt;a href="http://groups.google.com/group/altnet-hispano/"&gt;la lista de correo de ALT.NET Hispano&lt;/a&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad. Si no pueden asistir a ésta VAN, seguramente quedará publicada más adelante, con video incluido.&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=1740732" 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/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Web/default.aspx">Desarrollo Web</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ALT.NET/default.aspx">ALT.NET</category></item><item><title>NHibernate en SQL Azure</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/03/nhibernate-en-sql-azure.aspx</link><pubDate>Tue, 03 Nov 2009 16:12:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1737380</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=1737380</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/03/nhibernate-en-sql-azure.aspx#comments</comments><description>&lt;p&gt;El viernes pasado, estuve hablando con &lt;a href="http://fabiomaulo.blogspot.com" target="_blank"&gt;Fabio Maulo&lt;/a&gt; (&lt;a href="http://twitter.com/fabiomaulo" target="_blank"&gt;@fabiomaulo&lt;/a&gt;) de varios temas: de desarrollo de software, enseñanza de la programación, y por supuesto, sobre NHibernate. Ambos vivimos en Buenos Aires, Argentina, y fue un placer hablar con él, como siempre. Yo sigo a Fabio en Twitter, y soy un subscripto a&amp;#160; &lt;a href="http://fabiomaulo.blogspot.com" target="_blank"&gt;su blog&lt;/a&gt;. Fabio ha estado colaborando con el proyecto NHibernate desde hace años, y es un reconocido desarrollador en la comunidad .NET.&lt;/p&gt;  &lt;p&gt;Me contó detalles de un sitio que construyó con un equipo, usando NHibernate. Lo interesate es que corre sobre SQL Azure. Pueden verlo en línea (es un sitio mexicano):&lt;/p&gt;  &lt;p&gt;&lt;a title="http://salondetokio.autocosmos.com.mx/" href="http://salondetokio.autocosmos.com.mx/"&gt;http://salondetokio.autocosmos.com.mx/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/nhibernateazure01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Fabio y su equipo trabajaron duro para armar este sitio, en menos de mes (estoy esperando que el equipo de Fabio comente más detalles en posts, por ahora, puedo hablar sobre lo que se conoce públicamente).&lt;/p&gt;  &lt;p&gt;Curiosamente, el sitio está ejecutando sobre WebForms, pero sin usar ViewState, y sin tener un tag de Form en varios de los tags Body de las páginas que he examinado. Espero que Maulo y su equipo escriban explicando los detalles de implementación. El código está basado en el patrón Model View Presenter, ha sido escrito con tests automáticos, mocks, stubs, comenzando desde cerca de la presentación, hasta llegar a la persistencia. ¡Vamos Fabio! ¡Estamos esperando detalles sobre el proceso seguido y las decisiones de arquitectura! :-)&lt;/p&gt;  &lt;p&gt;Más información sobre NHiberante y SQL Azure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/archive/2009/09/05/nhibernate-on-the-cloud-sql-azure.aspx"&gt;NHibernate on the cloud: SQL Azure&lt;/a&gt; Tests de NHibernate sobre SQL Azure, según Ayende&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fabiomaulo.blogspot.com/2009/09/quick-news-nhibernate-with-sql-azure.html"&gt;Quick news NHibernate with SQL Azure&lt;/a&gt; Los primeros pasos de Fabio en el tema: “All work… even the SchemaExport.” !!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fabiomaulo.blogspot.com/2009/10/nhibernate-dialect-for-sql-azure.html"&gt;NHibernate dialect for SQL Azure&lt;/a&gt; Ajustes para el SchemaExport&lt;/p&gt;  &lt;p&gt;Estoy coleccionando enlaces sobre NHibernate y Azure en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://delicious.com/ajlopez/nhibernate+azure" href="http://delicious.com/ajlopez/nhibernate+azure"&gt;http://delicious.com/ajlopez/nhibernate+azure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hay una excelente serie de posts de Brad Adams, explicando Azure en general, SQL Azure, NHibernate, Silverlight, RIA .NET Services, y más:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/10/27/index-for-business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update.aspx" target="_blank"&gt;Index for Business Apps example for Silverligth 3 RTM and .NET RIA Services July Update&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Relacionado a NHibernate y Azure, en esa serie:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/08/06/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-nhibernate.aspx" target="_blank"&gt;Part 20: NHibernate&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://blogs.msdn.com/brada/archive/2009/08/21/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-23-azure.aspx" target="_blank"&gt;Part 23: Azure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;¿Conocen otro proyecto que use NHibernate en “el cloud”?&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=1737380" 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/Azure/default.aspx">Azure</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Cloud+Computing/default.aspx">Cloud Computing</category></item><item><title>Aventuras de Programación Extrema en C#</title><link>http://msmvps.com/blogs/lopez/archive/2009/11/02/aventuras-de-programaci-243-n-extrema-en-c.aspx</link><pubDate>Mon, 02 Nov 2009 09:06:08 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1737032</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=1737032</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/11/02/aventuras-de-programaci-243-n-extrema-en-c.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/xpmicrosoft0.png" align="left" alt="" /&gt; El viernes pasado estuve visitando las oficinas del Microsoft User Group de Argentina, acá en Buenos Aires. Tenía que dictar un curso de .NET, pero hubo un corte de luz (al parecer frecuente en estos días de alta temperatura; Buenos Aires está sufriendo cortes de luz, mucha carga en los aires acondicionados creo). Ni lerdo ni perezoso, me entretuve unas horas aprovechándome de la biblioteca del MUG, sobre la que tendría que postear más. Los socios del MUG tienen acceso a los volúmenes de la biblioteca, y hay libros de temas como Windows Server, programación .NET, Test Driven Development, programación en general, desarrollo web y más.&lt;/p&gt;  &lt;p&gt;Así que, no teniendo más deberes de los que ocuparme ni más preocupaciones en el alma (como Descartes ante la estufa… :-), me dediqué a la lectura. Estuve leyendo un libro de ASP.NET 3.5 (no tengo el autor acá), estuve hojeando el clásico “Práctica de la Programación” de Kernighan y&amp;#160; y estaba por encarar el Sistemas Operativos de &lt;a href="http://www.few.vu.nl/~ast/" target="_blank"&gt;Tanenbaum&lt;/a&gt; (al que sigo desde las primeros avisos en la Dr.Dobbs, al principio de los ochenta, sobre compiladores multilenguajes). Pero un libro me llamó la atención, había sido devuelto a la biblioteca el jueves, por el bueno de &lt;a href="http://twitter.com/lmpetek" target="_blank"&gt;@lmpetek&lt;/a&gt;: el &lt;a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=6777&amp;amp;locale=en-us" target="_blank"&gt;Extreme Programming Adventures in C#&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Excelente libro, escrito por &lt;a href="http://en.wikipedia.org/wiki/Ron_Jeffries" target="_blank"&gt;Ron Jeffries&lt;/a&gt;, acreditado XPer, uno de los tres “fundadores” de XP (&lt;a href="http://www.xprogramming.com/" target="_blank"&gt;Extreme Programming&lt;/a&gt;), junto con &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck" target="_blank"&gt;Ken Beck&lt;/a&gt; y &lt;a href="http://en.wikipedia.org/wiki/Ward_Cunningham" target="_blank"&gt;Ward Cunningham&lt;/a&gt;. Pueden seguirlo en Twitter por &lt;a href="http://twitter.com/RonJeffries" target="_blank"&gt;@RonJeffries&lt;/a&gt;. Leo en la página del libro en Microsoft Press:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;See how eXtreme Programming (XP) works—and learn Microsoft .NET and C# programming in the process!      &lt;br /&gt;See eXtreme Programming (XP) in action at the hands of an XP master—and learn Microsoft .NET and C# programming in the process! In this fast-paced, hands-on exposition, Ron Jeffries—one of the leading voices and practitioners in the XP community—demonstrates that you can write well-designed, resilient code incrementally and safely, while minimizing your investment in speculative up-front design. As Jeffries builds his sample application, you get firsthand insights into what successful XP development looks like, complete with real-world challenges such as the eleventh-hour change order. For further practice and study, you can download all the author’s code—including the missteps—so you can see XP and agile concepts in action and assess how they fit into your own work.Pair program with an XP master, discovering how to: &lt;/em&gt;&lt;/p&gt;  &lt;li&gt;&lt;em&gt;Streamline and simplify the software development process &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Work more effectively as part of an XP development team &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Reduce missteps by designing, testing, and refining code in increments &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Receive clearer specifications and feedback from customers &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Write cleaner, more expressive code—and weed out more bugs &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Conserve resources by planning and reassessing progress as you go &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Maintain a sustainable work pace—and avoid burnout &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Step up delivery dates, shipping the most crucial features first &lt;/em&gt;&lt;/li&gt;  &lt;li&gt;&lt;em&gt;Improve customer satisfaction!&lt;/em&gt;     &lt;p&gt;Jeffries va explicando, cómo un equipo de dos personas (uno es él mismo) van aprendiendo sobre C#, .NET, mientras desarrollan el software XMLNotepad. Es muy interesante de leer, porque explica paso a paso lo que van haciendo: cómo hacen spikes, pequeñas exploraciones, luego vuelven a tests, avanzan poco a poco, escriben y se ponen de acuerdo con los tests de aceptación, las historias de usuario, cómo generan un modelo testeable, mockean parte de la interfaz de usuario, etc. Si Uds. tienen dudas sobre cómo es el desarrollo con Programación Extrema, si quiere conocer los detalles de un caso concreto, éste es el libro. Pueden aprovecharlo, sepan o no C#: la parte técnica no es la más importante, es la explicación detallada la que hace de este libro, un excelente recurso.&lt;/p&gt;    &lt;p&gt;Hmm… ya va siendo hora de tener un sistema de biblioteca para el MUG, no? Podríamos armarlo usando XP… :-)&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;p&gt;&lt;/p&gt; &lt;/li&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1737032" 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/Libros/default.aspx">Libros</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_F300_n+Extrema/default.aspx">Programación Extrema</category></item><item><title>Code Kata: Capturando páginas web</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/26/code-kata-capturando-p-225-ginas-web.aspx</link><pubDate>Mon, 26 Oct 2009 09:31:03 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1735292</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=1735292</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/26/code-kata-capturando-p-225-ginas-web.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/scrap03.png" align="left" alt="" /&gt; Para practicar, como &lt;a href="http://codekata.pragprog.com/codekata/" target="_blank"&gt;Code Kata&lt;/a&gt; (y también, como prueba de concepto para un proyecto relacionado con &lt;a title="Hacia una Historia Clínica Digital de Código Abierto" href="http://msmvps.com/blogs/lopez/archive/2009/09/29/hacia-una-historia-cl-237-nica-digital-de-c-243-digo-abierto.aspx"&gt;Hacia una Historia Clínica Digital de Código Abierto&lt;/a&gt;), estuve codificando un programa de &lt;a href="http://en.wikipedia.org/wiki/Web_scraping" target="_blank"&gt;Web Scraping&lt;/a&gt;. Pueden bajarse el código completo desde: &lt;a href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/WebScrappingExample" target="_blank"&gt;Web Scrapping Example&lt;/a&gt; (pensé que en inglés era “scrapping” con doble p, así que quedó por ahora con ese nombre :-)&lt;/p&gt;  &lt;p&gt;La solución, escrita en C#, contiene un proyecto de librería de clases, uno de tests de Visual Studio, y un programa de demostración, del tipo consola. Fue interesante codificar un mini HTML parser (simple, que no contempla todos los casos, sólo los necesarios para el trabajo), que soporta el análisis de páginas mal formadas. El usar TDD (&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank"&gt;Test-Driven Development&lt;/a&gt;) me permitió ir codificándolo de forma de estar seguro de lo que necesitaba como resultado, y además, que ese resultado fuera el correcto. Ejemplo de test simple:&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;[TestMethod]&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ParseSimpleTag()&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;/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;    HtmlParser parser = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HtmlParser(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;lt;html&amp;gt;&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;    HtmlToken token = parser.NextToken();&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;    Assert.IsNotNull(token);&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;    Assert.AreEqual(HtmlTokenType.Tag, token.TokenType);&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;    Assert.AreEqual(&lt;span style="color:#006080;"&gt;&amp;quot;html&amp;quot;&lt;/span&gt;, token.Name);&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;    Assert.IsNull(parser.NextToken());&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;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Para capturar las páginas, usé System.Net.WebClient, con código tan simple 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;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetContent()&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;/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;    WebClient webclient = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WebClient();&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;return&lt;/span&gt; webclient.DownloadString(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.address);&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;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Como demostración, en el programa de consola, parto de explorar la página:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.nlm.nih.gov/medlineplus/druginfo/meds/a699012.html" target="_blank"&gt;Medline Plus Drugs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lanzando el programa de consola, aparece la salida, capturando algunos cientos de páginas, sobre información de drogas medicinales (efectos, posología, contraindicaciones, etc):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/scrap02.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Exploro las páginas que apuntan a la información de drogas por letra, obtengo los enlaces a cada droga, traigo el contenido de la página, extraigo la información que me interesa (descartando el principio y el fin de la página) por cada droga. Un ejemplo de página:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/scrap01.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Al final, genero una página de índice:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/scrap04.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Podría implementar un mejor parser de HTML, y algunas operaciones más de extracción de datos. Pero para lo que quería obtener, me bastó. Y fue una buena experiencia de TDD.&lt;/p&gt;

&lt;p&gt;Si usan la información generada, recuerden de leer los términos del sitio original (entiendo que necesitan una autorización para usarlo de forma comercial, no parece que haya problema en capturar los datos en un utilitario no comercial).&lt;/p&gt;

&lt;p&gt;¿Por qué no explorar directamente la web para obtener estos datos? Porque el contexto de la prueba de concepto que me impuse, es que los médicos y enfermeros no tienen acceso a Internet desde todas las máquinas donde van a estar trabajando.&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=1735292" 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/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Programaci_F300_n/default.aspx">Programación</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Code+Katas/default.aspx">Code Katas</category></item><item><title>Tales from the Scrum: No esperemos a Superman</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/24/tales-from-the-scrum-no-esperemos-a-superman.aspx</link><pubDate>Sat, 24 Oct 2009 14:18:29 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1734776</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=1734776</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/24/tales-from-the-scrum-no-esperemos-a-superman.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/superman01.png" align="left" alt="" /&gt; En estos días, buscando ejemplos de antipatrones de Scrum, me encuentro con el “&lt;a href="http://scrumisscrum.wordpress.com/2009/04/02/hero-driven-development/" target="_blank"&gt;Hero-Driven Development&lt;/a&gt;” (visiten todo el blog &lt;a href="http://scrumisscrum.wordpress.com/" target="_blank"&gt;Scrum is Scrum&lt;/a&gt;). Hace poco comentaba sobre las “prima donnas” en desarrollo en &lt;a title="Tales from the Scrum- No somos Q" href="http://msmvps.com/blogs/lopez/archive/2009/10/22/tales-from-the-scrum-no-somos-q.aspx"&gt;Tales from the Scrum- No somos Q&lt;/a&gt;. El caso que quiero comentar ahora, es distinto. El desarrollador super héroe de nuestra historia, puede ser un tipo apreciado, querido por el equipo, reconocido en su campo. Es uno de esos desarrolladores que puede programar mucho más que los demás. Steve Mc Connell los llama &lt;a title="10X Developers" href="http://go2.wordpress.com/?id=725X1342&amp;amp;site=scrumisscrum.wordpress.com&amp;amp;url=http%3A%2F%2Fforums.construx.com%2Fblogs%2Fstevemcc%2Farchive%2F2008%2F03%2F27%2Fproductivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx"&gt;10X Developers&lt;/a&gt;. Pero puede causar problemas. Veamos (basado en el blog que mencioné):&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Problema&lt;/strong&gt;: En el medio del desarrollo, surge un problema. Puede ser una configuración de Windows Communication Foundation, un tema de mapeo de Hibernate, una instalación en JBoss. No importa. El problema es complejo, y bastante técnico. De pronto, se abre la ventana, y entra nuestro “programador héroe”, reluciente en su traje. Se sienta, mira el código, entiende el problema, y lo va solucionando. El equipo, arrobado, se queda atrás, mirando, cómo nuestro Superman del código, va resolviendo el más intricado nudo de desarrollo. El héroe, concentrado, no habla ni explica. Parece relajado, lo que hace es “pan comido” para él. Entonces, en un momento, para, el problema está solucionado, levanta la vista, mira al equipo, y sale volando por la ventana, directo hacia el atardecer. Gran música de fondo.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Contexto&lt;/strong&gt;: El equipo no sabe cómo solucionar el problema técnico que surgió. Es algo en lo que tienen poca experiencia. Trataron de solucionarlo, pero no pudieron, y están entrando en pánico. Pasan las horas, y no avanzan. Todo está empantanado. Entonces, encienden la señal, para llamar al super héroe.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Fuerzas&lt;/strong&gt;: Vivimos en tiempos de cumplir los compromisos que asumimos para la iteración. Queda poco tiempo para la entrega. Todo indica que necesitamos una solución rápida.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Solución&lt;/strong&gt;: No hay que buscar solución rápida. Primero, habría que haber previsto el riesgo tecnológico, desde el propio equipo. Los miembros deberían haber anotado que en algún momento se toparían con una tecnología que no conocen, y tendrían que haber tomado la tarea asignándole más tiempo. Pero bueno, supongamos que no se pudo hacer eso. El problema de arriba, es que el equipo delega la solución FUERA del equipo. El equipo, de alguna forma, “se lava las manos”. La actitud del superhéroe también conspira para eso. No es ése el camino. El equipo no debería perder “ownership”, propiedad y responsabilidad del producto, y de cada pequeño o gran problema. El desarrollador super héroe, que los hay, debería haberse integrado al equipo, compartiendo su conocimiento. Debería actuar como consultor del resto del equipo, pero trabajando con él. Y cada cosa que haga, con el equipo, será considerada como cualquier otra tarea de otro miembro: deberá cumplir con los estilos pactados, las métricas adoptadas, la definición de “hecho”. No debe ser un miembro “distinguido”. Lo que haga, debe estar público y lo más entendible posible para el resto del equipo. Tal vez no consigamos una solución tan rápida como la de arriba. Pero seguramente, a largo plazo, estaremos construyendo un equipo más responsable.&lt;/p&gt;  &lt;p&gt;Recuerden: uno de los grandes entregables, en Scrum, es el equipo.&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=1734776" 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/Scrum/default.aspx">Scrum</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/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>VAN sobre Boo con Rodolfo Finochietti</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/23/van-sobre-boo-con-rodolfo-finochietti.aspx</link><pubDate>Fri, 23 Oct 2009 09:22:26 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1734501</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=1734501</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/23/van-sobre-boo-con-rodolfo-finochietti.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/boo01.png" align="left" alt="" /&gt; Vuelven las VAN (Reuniones Virtuales) de ALT.NET Hispano. La próxima, es este sábado 24 de Octubre, a las 18:00 GMT/UTC (Greenwich) (En Buenos Aires, con GMT-3, serían las 3 de la tarde). El tema será, principalmente, &lt;a href="http://boo.codehaus.org/" target="_blank"&gt;el lenguaje Boo&lt;/a&gt;, a cargo del bueno de &lt;a href="http://weblogs.shockbyte.com.ar/" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; (&lt;a href="http://twitter.com/rodolfof"&gt;@rodofof&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Pueden ver detalles en&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/dab63bbb407c3822?hl=es" target="_blank"&gt;VAN sobre Boo con Rodolfo Finochietti, Sábado 24 de Octubre&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Será en parte, continuación de la anterior&lt;/p&gt;  &lt;p&gt;&lt;a title="Alt.NET Hispano- VAN con Martín Salías y lenguajes en .NET" href="http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx"&gt;Alt.NET Hispano- VAN con Martín Salías y lenguajes en .NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver el video resultado de esa anterior reunión en:&lt;/p&gt;  &lt;p&gt;&lt;a title="Virtual ALT.NET sobre Lenguajes" href="http://blog.salias.com.ar/2009/10/virtual-altnet-sobre-lenguajes.html"&gt;Virtual ALT.NET sobre Lenguajes&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Son todos temas como los que tratamos en algún TechNight de Buenos Aires, el año pasado: &lt;a title="lenguajes de programación e implementaciones en .NET" href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx"&gt;lenguajes de programación e implementaciones en .NET&lt;/a&gt; (ahí dejé bastantes enlaces sobre los temas que ahora están siendo actualizados en esta serie de VANs).&lt;/p&gt;  &lt;p&gt;Según adelanta Rodolfo, el tema será:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Básicamente mi exposición se va a centrar en porque me gusta Boo. Todos los lenguajes estáticos en .NET son bastante similares (con el DLR esto cambio un poco), y esto creo yo tiene una razón que voy a explicar en el charla. En cambio Boo no se parece un lenguaje .NET. Su diseñador (Rodrigo De Oliveira) lo creo como un herramientas que le facilita la construcción de aplicaciones. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Resumiendo: Voy a hacer una intro al diseño de lenguajes estáticos en .NET y después me voy a centrar en Boo y sus características. &lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Recuerden:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;/em&gt;&lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;&lt;em&gt;VAN meetings&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;/em&gt;&lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;&lt;em&gt;Descripcion-de-Reuniones-VAN&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Pueden ver &lt;/em&gt;&lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;&lt;em&gt;el historial de anteriores reuniones VAN&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo ya participé en &lt;/em&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;&lt;em&gt;VAN sobre Scrum&lt;/em&gt;&lt;/a&gt;&lt;em&gt; y en otra &lt;/em&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx"&gt;&lt;em&gt;sobre generación de código&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, que quedará publicada en estos días). Supongo (pero confirmen) que la URL de entrada de la VAN de Martín será &lt;/em&gt;&lt;a href="http://snipr.com/virtualaltnet"&gt;&lt;em&gt;http://snipr.com/virtualaltnet&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Cualquier cosa, pueden consultar &lt;/em&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/"&gt;&lt;em&gt;la lista de correo de ALT.NET Hispano&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Visiten &lt;a href="http://boo.codehaus.org/" target="_blank"&gt;el sitio de Boo&lt;/a&gt; si quieren averiguar más sobre el lenguaje, y lean &lt;a href="http://www.google.com/url?q=http://boo.codehaus.org/BooManifesto.pdf&amp;amp;ei=n9rgSpPkKNOh8AbEqc2eDQ&amp;amp;sa=X&amp;amp;oi=nshc&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;ved=0CAsQzgQoAA&amp;amp;usg=AFQjCNFakzlVrlPRdxPt-ENYggy1Y8Af4g" target="_blank"&gt;el Boo Manifesto&lt;/a&gt;. Tomé la imagen del blog &lt;a title="http://blogs.codehaus.org/people/bamboo/archives/boo.html" href="http://blogs.codehaus.org/people/bamboo/archives/boo.html"&gt;http://blogs.codehaus.org/people/bamboo/archives/boo.html&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=1734501" 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/Lenguajes+de+Programaci_26002300_243_3B00_n/default.aspx">Lenguajes de Programaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ALT.NET/default.aspx">ALT.NET</category></item><item><title>Enseñando a programar (Parte 1)</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/19/ense-241-ando-a-programar-parte-1.aspx</link><pubDate>Mon, 19 Oct 2009 09:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1733324</guid><dc:creator>lopez</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1733324</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/19/ense-241-ando-a-programar-parte-1.aspx#comments</comments><description>&lt;p&gt;El tema que se&amp;ntilde;ala el t&amp;iacute;tulo de este post es un tema ampl&amp;iacute;simo, del que habr&amp;iacute;a tanto para decir y discutir. Veamos de tratar algunos puntos, que surgen de experiencia personal, e ideas sin probar que van rondando mi cabeza desde hace unos a&amp;ntilde;os.&lt;/p&gt;
&lt;p&gt;Primero, una aclaraci&amp;oacute;n: si bien gran parte de mi actividad semanal (en estos tiempos, m&amp;aacute;s del 60% del tiempo que empleo), est&amp;aacute; dedicado al dictado de cursos&amp;nbsp;(en empresas e institutos ac&amp;aacute; en Argentina, o en charlas en distintas ciudades) me considero no un instructor de programaci&amp;oacute;n, sino un desarrollador de software que por esos accidentes de la vida termin&amp;oacute; dedicando tanta cantidad de sus horas al dictado de clases. Pero no soy una persona pedag&amp;oacute;gica, o que haya estudiado para ense&amp;ntilde;ar sino, como muchos otros instructores, soy alguien que programa y que muestra algunos temas de programaci&amp;oacute;n, desde mi propio &amp;oacute;ptica personal (hace a&amp;ntilde;os que no doy un curso oficial o de Sun o de Microsoft, prefiero dar mis temas a mi forma y con mis temarios).&lt;/p&gt;
&lt;p&gt;Segundo: prefiero programar que ense&amp;ntilde;ar. Contrariamente a lo que algunos de Uds. podr&amp;iacute;an pensar, para m&amp;iacute; ense&amp;ntilde;ar no es la mejor forma que imagina de pasar mi tiempo profesional, por lo menos en cursos presenciales de la forma en que me toca ahora dictar. Prefiero escribir, leer, programar ejemplos, pruebas de conceptos, aplicaciones completas, describir temas en posts, antes&amp;nbsp;que estar dictando una clase presencial (una charla es otra cosa: es m&amp;aacute;s interesante, es para presentar un tema, y llamar a la acci&amp;oacute;n a los asistentes, sin tener que seguir por semanas hablando de lo mismo). Cuando tengo, digamos, un curso para las 18:30, ya s&amp;eacute; que ese d&amp;iacute;a no puedo trabajar hasta las 18hs en un proyecto, o no puedo irme a almorzar tarde, o no puedo salir de viaje a otra ciudad, o no puedo&amp;hellip;&amp;nbsp; o voy a salir demasiado tarde para ir a cenar tranquilo, o pasar por tal lado, o &amp;hellip; y mil cosas m&amp;aacute;s. Un curso es un clavo en el medio de cualquier agenda a armar. Tambi&amp;eacute;n pasa que un curso que no es nocturno, parte al medio cualquier d&amp;iacute;a de trabajo, especialmente cuando trabajo en un equipo Scrum. Como los cursos tienen d&amp;iacute;as ocupados durante varias semanas, tambi&amp;eacute;n se me complica organizar cualquier visita al interior de mi pa&amp;iacute;s, para dar una charla sobre un tema. En definitiva, curso presencial con muchas clases, es un incordio para cualquier agenda.&lt;/p&gt;
&lt;p&gt;Y una de las cosas que m&amp;aacute;s me cansan, a esta altura de mi vida, es hablar, hablar y hablar durante horas en un curso. Vuelvo a mi cubil, a veces, bastante cansado y congestionado, nada m&amp;aacute;s de hablar. Imagino que en cualquier momento comienzo a dar una clase mostrando cosas en el proyecto y explicando lo que hago escribiendo en el Notepad&amp;hellip; :-)&lt;/p&gt;
&lt;p&gt;Hechas esas confesiones personales, respiro hondo,&amp;nbsp;y paso a comentar algunos problemas que detecto&amp;nbsp;en los cursos que conozco, los m&amp;iacute;os.&lt;/p&gt;
&lt;p&gt;Muchos de mis cursos se pueden circunscribir a estos tipos:&lt;/p&gt;
&lt;p&gt;- Grupo de gente que conoce algo de programaci&amp;oacute;n, que pueden estar en distintos niveles, y quieren aprender un tema de tecnolog&amp;iacute;a, ejemplo: ASP.NET o JSP.&lt;/p&gt;
&lt;p&gt;- Curso con m&amp;aacute;quina o sin m&amp;aacute;quina y proyector&lt;/p&gt;
&lt;p&gt;Bien, comienzo por los temas que veo que no est&amp;aacute;n del todo bien y se pueden mejorar, o cambiar completamente por otro &amp;ldquo;approach&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Notemos que los cursos presenciales tienen un gran problema: son, justamente presenciales. Hay que combinar los horarios de todos los que quieren participar, reservar tal tiempo a tal hora y lugar; tambi&amp;eacute;n&amp;nbsp;tienen que estar todos presentes. Esto es un resabio de como se ense&amp;ntilde;aba en las universidades que comenzaron a aparecer en la Edad Media: como no hab&amp;iacute;a libros, el papel no exist&amp;iacute;a o era caro y los profesores escasos, la &amp;uacute;nica forma de ense&amp;ntilde;ar era presencial: juntar un grupo que ten&amp;iacute;a que escuchar a un profesor mientras daba un tema. En aquellos a&amp;ntilde;os incluso&amp;nbsp;se estudiaba para&amp;nbsp;ejercitar la memoria ante la escasez de elementos para tomar apuntes.&lt;/p&gt;
&lt;p&gt;Pasaron los siglos y veo seguimos con el mismo esquema. Algunos problemas derivados de esto:&lt;/p&gt;
&lt;p&gt;- Cada asistente tiene que venir, a cada clase. Si llueve, si est&amp;aacute; complicado en el trabajo, si se enferma, por lo que fuera se pierde una clase que en generle al es irrecuperable presencialmente. Tiene que estar disponible cada d&amp;iacute;a al horario en que se dicta el curso, por varias semanas a veces. Y si un d&amp;iacute;a se le complica asistir lo m&amp;aacute;s probable es que falte o que llegue tarde y no pueda aprovechar bien la clase.&lt;/p&gt;
&lt;p&gt;- Cada asistente mismo tiene que estar con el &amp;aacute;nimo m&amp;aacute;s despierto, durante varias horas, para captar todo lo que se dicta en el curso.&lt;/p&gt;
&lt;p&gt;- Como un curso presencial implica asignar recursos escasos, como lugar, proyector o m&amp;aacute;quinas, sala, etc., entonces cada clase dura por lo menos 3 horas durante las cuales o se dan demasiados temas, de tal forma que no hay tiempo de asimilar, o se dan pocos y el curso se encarece por durar m&amp;aacute;s tiempo.&lt;/p&gt;
&lt;p&gt;- El instructor tiene que explicar algo que ya explic&amp;oacute;, probablemente, cuarenta veces.&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;Como los asistentes, el instructor tambi&amp;eacute;n tiene que estar con todas las luces, explicar de forma clara y tener todas las neuronas prendidas en cada clase, que se repite y repite a lo largo del a&amp;ntilde;o.&lt;/p&gt;
&lt;p&gt;- No siempre el lugar de dictado es el adecuado: o no est&amp;aacute; cerca o no tiene todos los elementos en condiciones.&lt;/p&gt;
&lt;p&gt;- No todos los asistentes tienen el mismo nivel de conocimientos inicial con lo que no todos van aprovechando el contenido de la misma forma.&lt;/p&gt;
&lt;p&gt;- Si trabajan con m&amp;aacute;quina, el curso se alarga. Se necesita&amp;nbsp;m&amp;aacute;s tiempo para corregir ejemplos en cada m&amp;aacute;quina. Tambi&amp;eacute;n pasa que&amp;nbsp;algunos asistentes terminan antes y otros quedan trabados. Coordinar las distintas velocidades es dif&amp;iacute;cil de manejar. Muchas veces sugiero trabajar de a grupos, con poco &amp;eacute;xito. Pasa cuando los asistentes son particulares que no se conocen entre s&amp;iacute; y hay una m&amp;aacute;quina por persona: la gente prefiere encarar por su cuenta, en solitario, cada ejercicio. Esto trae como consecuencia que&amp;nbsp;la clase se alarga. O hay que alargar&amp;nbsp;el curso completo, con el consiguiente aumento del costo final.&lt;/p&gt;
&lt;p&gt;- Aun teniendo pr&amp;aacute;ctica para captar un tema, un asistente puede necesitar su tiempo para entenderlo. Necesita practicar y jugar con un ejercicio un tiempo. No siempre es posible disponer de ese tiempo: muchas veces porque hay que seguir con otro tema. &lt;/p&gt;
&lt;p&gt;- Si no trabajan con m&amp;aacute;quina, muchas veces los asistentes no se toman el tiempo para practicar. Hay varias razones: est&amp;aacute;n tomando el curso en el trabajo pero no tienen m&amp;aacute;quina adecuada para practicar. O est&amp;aacute;n tapados de trabajo y no tienen tiempo. O sus jefes no les asignan tiempo para practicar. O podr&amp;iacute;an practicar en una m&amp;aacute;quina personal, al volver a casa, pero ah&amp;iacute; tambi&amp;eacute;n: hay otros temas de que ocuparse. Me ha pasado dejar ejercicio a un curso y que de los veinte integrantes s&amp;oacute;lo uno o dos practic&amp;oacute; algo entre dos clases. Cuando esto se repite, a lo largo de las clases, llega un momento que el contenido que se trata no se asimila porque no se practic&amp;oacute; lo anterior. Llegados a ese punto, sin pr&amp;aacute;ctica de lo ya tratado&amp;nbsp;es dif&amp;iacute;cil captar todas las facetas del contenido nuevo. Tambi&amp;eacute;n a algunos asistentes se les complica instalar todo lo que necesitan para practicar. Una vez, recuerdo, puse un ejercicio entre clases en un curso de cuarenta personas. Lo&amp;nbsp;escrib&amp;iacute;&amp;nbsp;mal planteado a prop&amp;oacute;sito. A la siguiente clase, solo uno de los asistentes se dio cuenta del problema: era el &amp;uacute;nico que lo hab&amp;iacute;a encarado.&lt;/p&gt;
&lt;p&gt;- El lugar de dictado puede estar a varios kil&amp;oacute;metros de donde un asistente vive y trabaja.&lt;/p&gt;
&lt;p&gt;- Si el curso es en el propio trabajo,&amp;nbsp;un asistente puede sufrir interrupciones, o por tener un tema &amp;quot;urgente&amp;quot; para solucionar, debe abandonar&amp;nbsp;la clase.&lt;/p&gt;
&lt;p&gt;- Si el curso es en el trabajo, pero despu&amp;eacute;s o antes de hora de oficina, a muchos no les es f&amp;aacute;cil participar por tener otras actividades o no poder llegar m&amp;aacute;s temprano.&lt;/p&gt;
&lt;p&gt;- De vez en cuando me pasa que algunos asistentes no tienen mucha motivaci&amp;oacute;n para hacer el curso: los &amp;ldquo;mandaron&amp;rdquo; al curso y no tienen un soporte, un apoyo, de parte de sus empleadores, para sacar provecho del mismo (especulo, pero eso puede ser tambi&amp;eacute;n un &amp;ldquo;test de proactividad&amp;rdquo; de su empleador o contratante).&lt;/p&gt;
&lt;p&gt;- Otras veces, el asistente est&amp;aacute; motivado porque necesita trabajar pero hace tiempo que no toma un curso. Las tecnolog&amp;iacute;as nuevas lo sobrepasan y termina&amp;nbsp;necesitando de m&amp;aacute;s tiempo para aprovechar el contenido.&lt;/p&gt;
&lt;p&gt;- Si el curso es por cuenta de cada integrante, no lo paga una empresa, entonces&amp;nbsp;probablemente tenga que asistir despu&amp;eacute;s de hora un d&amp;iacute;a de semana&amp;nbsp;o un s&amp;aacute;bado. En esos horarios tambi&amp;eacute;n tendr&amp;aacute; que pelear su tiempo con otras actividades, familiares, o de estudio formal.&lt;/p&gt;
&lt;p&gt;- El temario es introductorio para un lenguaje de programaci&amp;oacute;n, pero no se ense&amp;ntilde;a a programa. Se pide expl&amp;iacute;citamente que se conozca de programar y de base de datos. Y algunos asistentes no tienen esos conocimientos en firme.&lt;/p&gt;
&lt;p&gt;- Otro caso es cuando el temario es intermedio o avanzado.&amp;nbsp; Puede pasar que de los que asisten, algunos ya saben varios puntos del temario y se aburren. Mientras, otros necesitan repasar o incluso aprender un tema, porque no llegan al nivel que se necesita para el curso. Esto pasa cuando los cursos son para asistentes de distintas empresas o que se inscriben por su cuenta.&lt;/p&gt;
&lt;p&gt;- Cuando el temario lo arma una empresa, el que arma el temario pide todos los temas habidos y por haber, pero luego no se asigna tiempo para que los asistentes practiquen en el medio del trabajo de cada d&amp;iacute;a.&lt;/p&gt;
&lt;p&gt;- Pr&amp;aacute;cticamente todo el material que doy queda disponible en mi sitio personal. A la quinta o sexta clase del curso, alguien se acerca y me pregunta: &amp;iquest;d&amp;oacute;nde puedo bajar los ejemplos? Yo me pregunto entonces: &amp;iquest;c&amp;oacute;mo hizo para seguir las anteriores clases, si nunca repas&amp;oacute; los ejemplos que YA se dieron? Detecto ac&amp;aacute; que no han tenido tiempo para practicar entre clases.&lt;/p&gt;
&lt;p&gt;Y en mi caso en particular, muchas veces los cursos no se abren por falta de inscriptos: se necesita un n&amp;uacute;mero m&amp;iacute;nimo para costear los activos inmovilizados (proyector, m&amp;aacute;quinas si es con pr&amp;aacute;ctica, lugar, instructor) que no siempre se cubre. Tambi&amp;eacute;n me pasa armar una lista de correo para los asistentes del&amp;nbsp;curso (por ejemplo, en los m&amp;iacute;os de Java) . Luego de dos a&amp;ntilde;os, les cuento que solo cuatro personas, entre decenas que asistieron,&amp;nbsp;se inscribieron para hacer m&amp;aacute;s preguntas.&lt;/p&gt;
&lt;p&gt;No quisiera afirmar que siempre es as&amp;iacute; como describo arriba. Pero me asombra la cantidad de veces que algunos de esos &amp;ldquo;anti-patrones&amp;rdquo; aparecen, por lo menos, en muchos de los cursos que me ha tocado dictar. As&amp;iacute; que pienso, desde hace alg&amp;uacute;n tiempo, que debo mejorar en algunos temas. O motivar m&amp;aacute;s, o hacer algo para que estos anti-patrones no aparezcan tan frecuentemente. Una sorpresa agradable: los cursos de Scrum son los m&amp;aacute;s participativos de todos: son casos&amp;nbsp;donde pr&amp;aacute;cticamente no pr&amp;aacute;cticamente no aparecen estos &amp;ldquo;issues&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Y un tema, disculpen, m&amp;aacute;s personal: otra &amp;ldquo;constante&amp;rdquo; que detecto. Ante un curso de cuarenta personas, pregunto cu&amp;aacute;ntos conocen mi blog.&amp;nbsp;S&amp;oacute;lo uno levanta la mano. Pasan las semanas, y al final del curso, despu&amp;eacute;s de dos meses, pregunto de nuevo. Y ahora, son 1 o 2 las manos levantadas. As&amp;iacute; que algo tengo que hacer: o mejorar los contenidos o escribir m&amp;aacute;s claro o de temas que les interesen m&amp;aacute;s. Muchas veces escribo para que lo explicado quede m&amp;aacute;s claro. Si algo no se entiende en una clase presencial, quisiera que&amp;nbsp;se pueda leer y releer por ac&amp;aacute;. Pero veo que he tenido poca llegada en ese tema, por lo menos en los asistentes a mis cursos presenciales.&lt;/p&gt;
&lt;p&gt;Pero tambi&amp;eacute;n detecto y especulo un patr&amp;oacute;n: los que programan y no leen blogs (m&amp;iacute;o o de cualquiera), en general,&amp;nbsp;no se mantienen actualizados y necesitan cursos presenciales. Los que programan y leen blogs son otro grupo: se mantienen actualizados y no necesitan cursos presenciales, apenas algunas charlas introductorias como primeros pasos en un tema. Luego, ellos mismos aprenden de una nueva tecnolog&amp;iacute;a, patr&amp;oacute;n, estilo arquitect&amp;oacute;nico o herramienta.&lt;/p&gt;
&lt;p&gt;Habiendo repasado estos puntos, &amp;iquest;c&amp;oacute;mo se podr&amp;iacute;a mejorar? Tengo algunas ideas al respecto, tomadas de otros &amp;aacute;mbitos, y de lo que veo que puede funcionar, pero son temas para seguir en la segunda parte de este post. Mientras tanto: &amp;iquest;tienen alguna sugerencia?&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=1733324" 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/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Desarrollando aplicaciones en .NET</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/12/desarrollando-aplicaciones-en-net.aspx</link><pubDate>Mon, 12 Oct 2009 17:08:40 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1731991</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=1731991</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/12/desarrollando-aplicaciones-en-net.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.todocontenidos.com/images/articles/softdev.jpg" align="left" alt="" /&gt; En esta semana, comienzo a dictar el curso presencial que había anunciado en un anterior post:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/19/preparando-un-curso-de-net-aplicaciones-patrones-y-arquitectura.aspx" target="_blank"&gt;Preparando un curso de .NET: aplicaciones, patrones y arquitectura&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;organizado por la gente del &lt;a href="http://www.mug.org.ar" target="_blank"&gt;Microsoft Users Group de Argentina&lt;/a&gt;. Gracias a todos los que dejaron sugerencias sobre el temario, ahí, y en listas de correo que consulté. Es un curso pago, pueden obtener más información en la &lt;a href="http://www.mug.org.ar/Eventos/3377.aspx" target="_blank"&gt;página de inscripción al curso&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;El temario a desarrollar es ambicioso:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Arquitectura de aplicaciones .NET&lt;/li&gt;    &lt;li&gt;Capas lógicas, capas físicas&lt;/li&gt;    &lt;li&gt;El gran Service Layer&lt;/li&gt;    &lt;li&gt;Persistencia&lt;/li&gt;    &lt;li&gt;Object Relational Mapping&lt;/li&gt;    &lt;li&gt;NHibernate, otros ORMs&lt;/li&gt;    &lt;li&gt;Reglas de Negocio&lt;/li&gt;    &lt;li&gt;Test-Driven Development&lt;/li&gt;    &lt;li&gt;Rhino Mocks, Moq, otros&lt;/li&gt;    &lt;li&gt;Inyección de dependencias&lt;/li&gt;    &lt;li&gt;Spring Framework y otros&lt;/li&gt;    &lt;li&gt;Separando responsabilidades&lt;/li&gt;    &lt;li&gt;Conceptos de Autorización, Autenticación, y Seguridad Federada&lt;/li&gt;    &lt;li&gt;Patrones en presentación: MVC, MVP, otros&lt;/li&gt;    &lt;li&gt;Tecnologías de presentación: WinForms, ASP.NET, ASP.NET MVC, conceptos de WPF, Silverlight&lt;/li&gt;    &lt;li&gt;Propuestas de Microsoft de Arquitectura&lt;/li&gt;    &lt;li&gt;Modelo de Dominio&lt;/li&gt;    &lt;li&gt;Domain-Driven Development&lt;/li&gt;    &lt;li&gt;Desarrollo en equipo&lt;/li&gt;    &lt;li&gt;Conceptos de Metodologías Agiles, XP, Scrum&lt;/li&gt;    &lt;li&gt;Repositorio de Código&lt;/li&gt;    &lt;li&gt;Integración Continua&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;además de algunas alternativas “exóticas” a explorar, como para amenizar estos temas. Presentaré ejemplos propios y otros de código abierto que están publicados en Internet.&lt;/p&gt;  &lt;p&gt;La idea es ir transmitiendo algunas de las técnicas e ideas que se están usando, para llevar a cabo un desarrollo en .NET. Bien podría dar un curso similar en Java: ambas plataformas son lo bastante maduras como para que podamos usarla en todos estos temas, y más. Y mucho de lo que se usa hoy en .NET, nació primero en Java y otras tecnologías.&lt;/p&gt;  &lt;p&gt;Mi idea es ir volcando por aquí, en este blog, algunos apuntes, resúmenes, notas de lo que dicte en el curso presencial. También compartir por acá enlaces sobre los temas que visitemos (más ejemplos, posts, herramientas, librerías). Es una forma de pasar en limpio, todo lo que entre todos tratemos en el curso, para que no quede solamente para los que asisten. Siempre dejo los ejemplos de los cursos que dicto en mi sitio, en &lt;a href="http://www.ajlopez.net/CursosEjemplos.php" target="_blank"&gt;Cursos y Seminarios: Ejemplos, Enlaces y Recursos&lt;/a&gt;, pero esta vez quisiera ir más lejos, y poner por escrito gran parte de lo que desarrollemos en el curso.&lt;/p&gt;  &lt;p&gt;Son varios temas: intentaré mostrar cómo se derivan de unos pocos principios y necesidades, en principio, de la complejidad y el cambio que acompañan a cualquier sistema de software no trivial y exitoso de estos días.&lt;/p&gt;  &lt;p&gt;(Tomé la imagen de este post de &lt;a title="http://www.leansoftwareinstitute.com/blog/" href="http://www.leansoftwareinstitute.com/blog/"&gt;http://www.leansoftwareinstitute.com/blog/&lt;/a&gt;, creo que refleja la belleza y complejidad de construir software).&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=1731991" 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/Arquitectura/default.aspx">Arquitectura</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/Desarrollo+Agil/default.aspx">Desarrollo Agil</category></item><item><title>Microsoft MVP (Most Valuable Professional) otro año más, y el futuro del software</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/10/microsoft-mvp-most-valuable-professional-otro-a-241-o-m-225-s-y-el-futuro-del-software.aspx</link><pubDate>Sat, 10 Oct 2009 14:36:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1731375</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=1731375</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/10/microsoft-mvp-most-valuable-professional-otro-a-241-o-m-225-s-y-el-futuro-del-software.aspx#comments</comments><description>&lt;p&gt;&lt;img align="left" src="http://www.todocontenidos.com/images/articles/past-present-future.jpg" style="display:inline;margin:0px 20px 20px 0px;" alt="" /&gt; El pasado 1ro. de Octubre, me confirmaron que nuevamente, en este a&amp;ntilde;o que sigue, soy Microsoft MVP. Pueden ver detalles del programa en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mvp.support.microsoft.com/" title="http://mvp.support.microsoft.com/"&gt;http://mvp.support.microsoft.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quiero agradecer a N&amp;eacute;stor Portillo (&lt;a target="_blank" href="http://twitter.com/nportillo"&gt;@nportillo&lt;/a&gt;) y &lt;a target="_blank" href="http://blogs.msdn.com/mvplead/"&gt;Fernando Garc&amp;iacute;a Loera&lt;/a&gt; (&lt;a target="_blank" href="http://twitter.com/ferglo"&gt;@ferglo&lt;/a&gt;) por su apoyo en todos estos a&amp;ntilde;os. Tambi&amp;eacute;n, a Carlos &amp;ldquo;Billy&amp;rdquo; Reynoso, quien&amp;nbsp;me propuso como MVP en 2002 (vio la luz!! :-), luego de haberme convocado tambi&amp;eacute;n en los 90 para participar de charlas y reuniones. Y a la gente del Microsoft User Group, del que participo desde hace casi 15 a&amp;ntilde;os, por el constante trabajo para armar una comunidad en la que podemos participar todos.&lt;/p&gt;
&lt;p&gt;Me gustar&amp;iacute;a que otras empresas tuvieran un programa similar a los Microsoft MVPs. No s&amp;eacute; si hay programas como &amp;eacute;ste en Oracle/Sun, IBM. En Argentina, la empresa que m&amp;aacute;s se ha preocupado (con altibajos, hay que reconocer) ha sido Microsoft. Recuerdo los tiempos de Sun lanzando Java por estos lares, en los noventa. Estaba m&amp;aacute;s preocupada por captar periodistas que a programadores. Si alguna vez me invitaron a una charla en los noventa, fue porque escrib&amp;iacute;a para una revista, sino, ni enterados la gente de Sun de que hay programadores de este lado del ecuador.&lt;/p&gt;
&lt;p&gt;Recuerdo mis primeros contactos con la tecnolog&amp;iacute;a Microsoft, al leer la Dr.Dobb&amp;rsquo;s Journal, donde se comentaban algunos productos.&amp;nbsp;&amp;iquest;Recuerdan Lattice C? Microsoft lo compr&amp;oacute; para ser su primer Microsoft C. &amp;iquest;Alguien recuerda el Lisp de Microsoft? Creo que se lo hab&amp;iacute;an comprado a una c&amp;iacute;a de Haway. Conoc&amp;iacute; m&amp;aacute;s de la historia de esos tiempos en varios libros; en especial,&amp;nbsp;recuerdo &amp;ldquo;&lt;a target="_blank" href="http://www.amazon.com/Fire-Valley-Making-Personal-Computer/dp/0071358927"&gt;Fire in the Valley&lt;/a&gt;&amp;rdquo;. Tambi&amp;eacute;n ah&amp;iacute; aprend&amp;iacute; de Apple, MITS y dem&amp;aacute;s pioneros en la microcomputaci&amp;oacute;n. En esos tiempos, hab&amp;iacute;a multitud de &amp;ldquo;computadoras personales&amp;rdquo;,&amp;nbsp;con distintos sistemas operativos y lenguajes. En muchas de ellas, Microsoft ten&amp;iacute;a software para ofrecer. Pero todos conocemos que el mercado despeg&amp;oacute; con la llegada de la IBM PC. Recuerdo que para editar con el edlin, booteaba con un diskette, lo retiraba, y pon&amp;iacute;a el segundo, porque ah&amp;iacute; estaba el editor de l&amp;iacute;nea. Como dir&amp;iacute;a Olmedo: &amp;ldquo;&lt;a target="_blank" href="http://www.youtube.com/watch?v=y3RgDknasAs"&gt;Eramos tan pobres&amp;hellip;.&lt;/a&gt; &amp;quot; :-). Si bien lleg&amp;oacute; Apple a mi pa&amp;iacute;s, Argentina, en aquellos a&amp;ntilde;os hab&amp;iacute;a que ser descendiente directo de los que desembarcaron en el Mayflower para poder acceder al programa de desarrollo de aplicaciones de la empresa de la manzanita. Algunos detalles m&amp;aacute;s de esos tiempos, en &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://msmvps.com/blogs/lopez/archive/2008/12/31/treinta-a-241-os-en-desarrollo-de-software.aspx"&gt;Treinta a&amp;ntilde;os en desarrollo de software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Creo que, como entonces, vivimos tiempos fascinantes en el tema de desarrollo de software. Me gustar&amp;iacute;a escribir ac&amp;aacute; algunos puntos a estudiar, a seguir de cerca, en estos a&amp;ntilde;os que se vienen (espero que para m&amp;iacute;, sean otros treinta a&amp;ntilde;os&amp;hellip; :-)&lt;/p&gt;
&lt;p&gt;Primero, quiero destacar la existencia de dos plataformas de desarrollo: &lt;strong&gt;Java y .NET&lt;/strong&gt;. Entiendo por plataforma de desarrollo a lenguaje(s), librer&amp;iacute;a de clases extensa, soporte de desarrollo de distinto tipos de aplicaciones (desde consola a web a distribuidas). En el 95, comenc&amp;eacute; a conocer Java, y desde entonces, me ha parecido una de las mejores cosas que ha pasado en la historia del desarrollo de software. Con todas las cr&amp;iacute;ticas que se le pueden hacer (EJB una terrible cosa que a&amp;uacute;n me d&amp;aacute; escalofr&amp;iacute;os (antes de acostarme, veo abajo de mi cama a ver si hay alg&amp;uacute;n Entity Bean escondido), Sun como karma, empresa que no supo mover a la comunidad de desarrollo, que en muchos casos se tuvo que arreglar sola (Hibernate como ejemplo?)), Java ha sido lo que hizo que las m&amp;aacute;quinas virtuales, clases y objetos, frameworks, threads, serializaci&amp;oacute;n, modelos de dominio, salieran de lo acad&amp;eacute;mico o del nicho, y pasaran a la corriente principal de desarrollo. Desde fines de los noventa, no he pasado casi una semana, sin dar alg&amp;uacute;n curso o charla sobre Java, y tecnolog&amp;iacute;as asociadas. Es un &amp;ldquo;must be know&amp;rdquo; para cualquier desarrollador de software de este milenio.&lt;/p&gt;
&lt;p&gt;Y Microsoft, vi&amp;oacute; la luz, y se reinvent&amp;oacute; a s&amp;iacute; misma: abandon&amp;oacute; VB, VBScript, ASP, C++ con la infame MFC (Microsoft Foundation Classes), ATL, COM (que nunca despeg&amp;oacute; para multiplataforma, como hubiera querido Don Box, y a&amp;uacute;n Miguel de Icaza con el proyecto Bonobo), y cambi&amp;oacute; como empresa, por lo menos en las herramientas de desarrollo. Parec&amp;iacute;a como si hubiera hecho todo por otra empresa: no m&amp;aacute;s COM como tecnolog&amp;iacute;a&amp;nbsp;necesaria; ten&amp;iacute;amos al fin una m&amp;aacute;quina virtual (un empleado de Microsoft morir&amp;aacute; en la tortura antes de llamar &amp;ldquo;m&amp;aacute;quina virtual&amp;rdquo; al CLR, pero, es lo que es.. :-); pl&amp;eacute;tora de&amp;nbsp;lenguajes nuevos, totalmente montados sobre esa m&amp;aacute;quina virtual. Realmente, es como si hubiera habido otra empresa que cre&amp;oacute; todo eso. Un gran movimiento por parte de Microsoft, que ha sabido adaptarse a los tiempos que le tocan: como ejemplo, recuerden el giro a Internet que di&amp;oacute; la empresa, a finales del 95.&lt;/p&gt;
&lt;p&gt;As&amp;iacute; que tenemos dos temas para seguir con atenci&amp;oacute;n: Java y .NET.&lt;/p&gt;
&lt;p&gt;Otros temas: el desarrollo de aplicaciones, &amp;iquest;d&amp;oacute;nde va? Veo que sigue habiendo aplicaciones de escritorio. Pero preveo que la lucha y la innovaci&amp;oacute;n vendr&amp;aacute;n en otras &amp;aacute;reas (enlaces al final):&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Aplicaciones Web&lt;/strong&gt;: dentro de la empresa, los sistemas de gesti&amp;oacute;n ser&amp;aacute;n migrados a todo web. Si bien la interfaz web no es la mejor, la aparici&amp;oacute;n de Ajax, librer&amp;iacute;as maduras de Javascript, tecnolog&amp;iacute;as en el servidor (ASP.NET, ASP.NET MVC, veremos hacia donde va Java, luego de no haberse adoptado JSF por todo el mundo, Ruby y Python con desarrollo web), hoy no es descabellado ver cada vez m&amp;aacute;s aplicaciones internas, expuestas en el browser.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Rich Internet Applications&lt;/strong&gt;: usar JavaFX, Silverlight, Air, o lo que aparezca. Pero crear aplicaciones, que mediante alg&amp;uacute;n plugin liviano en el cliente, permitan tener la experiencia de usuario del tipo de aplicaciones locales que tenemos ahora.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Software as a Service&lt;/strong&gt;, tanto aplicaciones web (Google Apps) como RIA, el software de gesti&amp;oacute;n y otros tipos, que hoy consumimos localmente, veo que estar&amp;aacute; cada vez m&amp;aacute;s ofertado directamente en la web. Habr&amp;aacute; que ver quienes ser&amp;aacute;n el target: &amp;iquest;las peque&amp;ntilde;as empresas que no tienen un equipo de IT? &amp;iquest;las medianas y grandes, que est&amp;aacute;n cansadas de soportar un equipo de IT y desarrollo semi a a medida?&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Desarrollos Web2.0&lt;/strong&gt;: la interconexi&amp;oacute;n de aplicaciones mediante protocolos livianos (desde REST hasta cualquier otra cosa, olvidando los pesados Web Services, especificaci&amp;oacute;n que veo que se encamina a la over-complexity), modelos pubsub montados sobre Twitter o similares, la aparici&amp;oacute;n de Service Bus online.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Cloud computing&lt;/strong&gt;: lo veo de dos formas: como una forma de virtualizaci&amp;oacute;n as a service, y como una forma de aplicaci&amp;oacute;n escalable hacia afuera. La primera ser&amp;aacute; m&amp;aacute;s f&amp;aacute;cil de programar (es como venimos hasta ahora, pero &amp;ldquo;hosteando&amp;rdquo; en otro lado). Nos ahorramos el setup de la m&amp;aacute;quina, licencias, mantenimiento del equipo. Lo de escalable hacia afuera, m&amp;aacute;s cercano a la idea de &amp;ldquo;cloud&amp;rdquo;, ejecutando en varias m&amp;aacute;quinas, habr&amp;aacute; que estudiar cu&amp;aacute;n de dif&amp;iacute;cil o f&amp;aacute;cil es el cambio de modelo de programaci&amp;oacute;n. Ejemplo: sharding de base de datos, &amp;iquest;ser&amp;aacute; lo suficientemente transparente para como venimos programando?&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Mobile&lt;/strong&gt;: o deber&amp;iacute;a llamarlo, la aparici&amp;oacute;n del software en m&amp;uacute;ltiples dispositivos. Esto es una rama que tenemos que estar atentos. La industria de desarrollo est&amp;aacute; por dar un salto, o ya lo est&amp;aacute; dando: tal vez, el mayor desde la aparici&amp;oacute;n de la computadora personal. La cabeza de playa son los tel&amp;eacute;fonos m&amp;oacute;viles. Pero lo que veo es: sistemas operativos para peque&amp;ntilde;os dispositivos (Android, Windows Mobile) con soporte de desarrollo (Android SDK, .NET Compact Framework), que har&amp;aacute;n que podamos escribir software para casi cualquier cosa, cualquier &amp;ldquo;widget&amp;rdquo; que tengamos (tel&amp;eacute;fonos personales, otros dispositivos, aparatos inteligentes), comunicados por Internet. La convergencia de: dispositivos inteligentes, Internet, herramientas de desarrollo maduras, es &amp;ldquo;the next big frontier&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Lenguajes din&amp;aacute;micos&lt;/strong&gt;: podr&amp;aacute; haber lenguajes aislados (como los originales Ruby y Python) pero veo que cada vez m&amp;aacute;s se montar&amp;aacute;n sobre las dos plataformas, .NET y/o Java. Veremos que pasa con esto: lo que veo, es que tienen comunidades fuertes, que impulsan nuevas cosas, nuevas ideas (o reimplementaciones frescas de otras ideas), que en otros ecosistemas m&amp;aacute;s maduros es dif&amp;iacute;cil de que prendan. Recordemos Ruby On Rails como un ejemplo.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Web Sem&amp;aacute;ntica&lt;/strong&gt;: ah&amp;iacute; afuera hay un mundo de informaci&amp;oacute;n, que por primera vez est&amp;aacute; disponible, no s&amp;oacute;lo para seres humanos, sino para nuestras aplicaciones. La aparici&amp;oacute;n de formas de aprovechar inteligentemente esta monta&amp;ntilde;a(cordillera dir&amp;iacute;a) de informaci&amp;oacute;n, es un camino que veremos donde llega. Las iniciativas de web sem&amp;aacute;ntica son lo m&amp;aacute;s promisorio. Pero tambi&amp;eacute;n puede que &amp;ldquo;la liebre salte por otro lado&amp;rdquo;: desarrollos aislados, que encuentren una forma de comunicarse o de aprovechar lo existente.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Aplicaciones distribuidas&lt;/strong&gt;: los que leen mi blog (yo, y mi t&amp;iacute;a Carlota), saben de mi inter&amp;eacute;s en aplicaciones distribuidas. Habr&amp;aacute; que seguir de cerca el tema message passing, o el m&amp;aacute;s prometedor y flexible, agentes. Multithreading, multicore, son simplemente una antesala a Multimachine. Ese es el camino a al escalabilidad, y superar el bloque de la Ley de Moore: multicore est&amp;aacute; bien, pero multimachine is the solution (preg&amp;uacute;ntele a Google). Sharding de base de datos, escalabilidad, datos y objetos en memoria distribuida en m&amp;aacute;quinas (m&amp;aacute;s barata y r&amp;aacute;pida que los discos).&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Memoria&lt;/strong&gt;: El &amp;uacute;ltimo p&amp;aacute;rrafo me trae a cuento esto que siempre nombro: el uso intensivo de memoria. La memoria cada vez es m&amp;aacute;s barata, y m&amp;aacute;s accesible. Pensemos en qu&amp;eacute; tipo de aplicaciones podemos lograr. Me imagino una base de objetos o de datos, totalmente en memoria, en m&amp;aacute;quinas distribuidas, donde el file system sea solamente otra forma de backup.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Concurrencia y Paralelismo&lt;/strong&gt;: un tema a estudiar. Vean lo que va surgiendo con Clojure, Software Transactional Memory, hasta NetLogo. Ver&amp;iacute;a de cerca paralelismo distribuido, como MapReduce, High Performance Computing, y alrededores.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Lenguajes funcionales&lt;/strong&gt;: recuerdo APL, pero no con cari&amp;ntilde;o. Pero vean el surgimiento de Erlang, la forma en que se us&amp;oacute; para el desarrollo de aplicaciones, el &amp;ldquo;revival&amp;rdquo; de Lisp con Clojure y c&amp;iacute;a, F# por parte de Microsoft, Haskell, algo mixto con Scala en Java. Sumar&amp;iacute;a a los declarativos, como Prolog. &amp;iquest;Ser&amp;aacute; el siglo del lambda? Para m&amp;iacute;, es hermoso que esos temas vuelvan a estar en el tapete. Todo desarrollador de software deber&amp;iacute;a sumergirse en estos temas, en lo que podr&amp;iacute;a llamar, los lenguajes de los dioses.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Modelos de aplicaciones&lt;/strong&gt;: las aplicaciones cada vez son m&amp;aacute;s complejas. Encarar el desarrollo basado pr&amp;aacute;cticamente en lenguajes de tercera generaci&amp;oacute;n, sin haber elevado el nivel de abstracci&amp;oacute;n, con tecnolog&amp;iacute;as de base que van cambiando a&amp;ntilde;o a a&amp;ntilde;o, mes a mes, es un camino lleno de piedras y espinas. Yo apuesto a la aparici&amp;oacute;n de modelos, Domain Specific Models, Domain Specific Languages, herramientas relacionadas (el camino m&amp;aacute;s cercano es la generaci&amp;oacute;n de c&amp;oacute;digo), para hacer m&amp;aacute;s f&amp;aacute;cil el domino de la complejidad y el cambio.&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Desarrollo &amp;aacute;gil&lt;/strong&gt;: en los tiempos que corren, el trabajo en equipo es indispensable. La cantidad de tecnolog&amp;iacute;as, detalles, y requerimientos que precisa un software m&amp;aacute;s o menos normal, implican que va desapareciendo el desarrollador de garage, en solitario. Las limitaciones de desarrollo en cascadas, el cambio en los requerimientos, porque hasta el ambiente externo cambia, &amp;eacute;xitos cosechados por el programaci&amp;oacute;n extrema y disciplinas relacionadas, todo apunta a que tenemos que ir adoptando m&amp;aacute;s y m&amp;aacute;s el modo &amp;aacute;gil de construir software. &lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;Inteligencia Artificial&lt;/strong&gt;: como dec&amp;iacute;a m&amp;aacute;s arriba, es tiempo de que agentes. Incorporar l&amp;oacute;gica, razonamiento, modelos del mundo, inferencias, objetivos, ontolog&amp;iacute;as, algoritmos gen&amp;eacute;ticos, redes neuronales, en todo lo que se viene.&lt;/p&gt;
&lt;p&gt;(ahora entender&amp;aacute;n un poco m&amp;aacute;s, a que van los c&amp;oacute;digos de c&amp;oacute;digo abierto que publico, como una especie de ejercicio personal para entrenarme en varios de los puntos de arriba).&lt;/p&gt;
&lt;p&gt;No he dejado enlaces en el texto, pero muchos de estos temas, como ver&amp;aacute;n, me interesan desde hace un tiempo, y estos son enlaces que he coleccionado:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/distributedcomputing"&gt;http://delicious.com/ajlopez/distributedcomputing&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/artificialintelligence"&gt;http://delicious.com/ajlopez/artificialintelligence&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/agile"&gt;http://delicious.com/ajlopez/agile&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/codegeneration"&gt;http://delicious.com/ajlopez/codegeneration&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dsl"&gt;http://delicious.com/ajlopez/dsl&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dsm"&gt;http://delicious.com/ajlopez/dsm&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/cloudcomputing"&gt;http://delicious.com/ajlopez/cloudcomputing&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/mobile"&gt;http://delicious.com/ajlopez/mobile&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/saas"&gt;http://delicious.com/ajlopez/saas&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ria"&gt;http://delicious.com/ajlopez/ria&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dynamiclanguages"&gt;http://delicious.com/ajlopez/dynamiclanguages&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/semanticweb"&gt;http://delicious.com/ajlopez/semanticweb&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/hadoop"&gt;http://delicious.com/ajlopez/hadoop&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/clojure"&gt;http://delicious.com/ajlopez/clojure&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/messaging"&gt;http://delicious.com/ajlopez/messaging&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/esb"&gt;http://delicious.com/ajlopez/esb&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scala"&gt;http://delicious.com/ajlopez/scala&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/concurrency"&gt;http://delicious.com/ajlopez/concurrency&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/parallel"&gt;http://delicious.com/ajlopez/parallel&lt;/a&gt; &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/stm"&gt;http://delicious.com/ajlopez/stm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tendr&amp;iacute;a m&amp;aacute;s para comentar, pero es hora de tomar mi medicaci&amp;oacute;n&amp;hellip;:-)&amp;hellip; S&amp;iacute;, ya s&amp;eacute;, es la pastilla roja, no la verde.&lt;/p&gt;
&lt;p&gt;Me parece suficiente para este post, &amp;iquest;no les parece?&lt;/p&gt;
&lt;p&gt;Lo que quer&amp;iacute;a trasmitirles, es que aprovechen este tiempo. Hace treinta a&amp;ntilde;os, yo no ten&amp;iacute;a todo esto disponible: comunicaci&amp;oacute;n instant&amp;aacute;nea, acceso a recursos a un costo razonable, contacto con la comunidad, herramientas maduras, ideas bullendo. Y ahora est&amp;aacute; todo ac&amp;aacute;, servido para la pr&amp;oacute;xima revoluci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Muchas de estas ideas, las comento en mis cursos, aunque no s&amp;eacute; cu&amp;aacute;n bien pude trasmitirlas, o si se entendi&amp;oacute; algo del mensaje. Siempre veo que la gente pide cursos de un tema en particular, me gustar&amp;iacute;a en este post (como en otros anteriores) haber dado una visi&amp;oacute;n m&amp;aacute;s amplia de lo que hay en el mundo del desarrollo de software, hoy, y que sirva de ensayo futurol&amp;oacute;gico, sin mayores pretensiones, de lo que puede venir como importante.&lt;/p&gt;
&lt;p&gt;De alguna forma, en estos a&amp;ntilde;os, se decidir&amp;aacute; el tipo de software que se ejecutar&amp;aacute; en las pr&amp;oacute;ximas dos d&amp;eacute;cadas. Y como en las anteriores, el software seguir&amp;aacute; cambiando la historia humana.&lt;/p&gt;
&lt;p&gt;Pero el software no se hace solo. Como dec&amp;iacute;a Alan Kay: &amp;ldquo;la mejor forma de predecir el futuro, es invent&amp;aacute;ndolo&amp;rdquo;. Sean parte de todo esto.&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=1731375" 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/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Historia+de+la+Computaci_26002300_243_3B00_n/default.aspx">Historia de la Computaci&amp;#243;n</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Agil/default.aspx">Desarrollo Agil</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+Web/default.aspx">Desarrollo Web</category></item><item><title>Alt.NET Hispano: VAN con Martín Salías y lenguajes en .NET</title><link>http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx</link><pubDate>Thu, 01 Oct 2009 09:32:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1728700</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=1728700</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/10/01/alt-net-hispano-van-con-mart-237-n-sal-237-as-y-lenguajes-en-net.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/babel.jpg" align="left" alt="" /&gt; Este viernes, 2 de Octubre, la comunidad de Alt.NET Hispano preparar una VAN (desconferencia, reunión virtual), a las 5:00pm GMT (2 de la tarde acá en Buenos Aires), sobre lenguajes en .NET, con el bueno de &lt;a href="http://blog.salias.com.ar" target="_blank"&gt;Martín Salías&lt;/a&gt; (&lt;a href="http://twitter.com/MartinSalias" target="_blank"&gt;@MartinSalias&lt;/a&gt;). Pueden ver más detalle en:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/336c9f1ae2ed16f9?hl=es" target="_blank"&gt;Por primera vez tendremos VAN entre semana con Martín Salías&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Explica ahí Martín:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;mi idea es charlar un poco entre todos sobre el florecimiento de los lenguajes en entornos manejados. Me parece que no es coincidencia que en el ambiente Java esté pasando algo similar a lo que tenemos en .NET. &lt;/p&gt;    &lt;p&gt;Lenguajes Dinámicos:      &lt;br /&gt;JVM: Jython, JRuby, Groovy       &lt;br /&gt;.NET: IronPython, IronRuby &lt;/p&gt;    &lt;p&gt;Lenguajes funcionales:      &lt;br /&gt;JVM: Scala, Clojure       &lt;br /&gt;.NET: F#, C# (¡cada vez más!) &lt;/p&gt;    &lt;p&gt;Otros:      &lt;br /&gt;Ioke (JVM/.NET), Boo (.NET) &lt;/p&gt;    &lt;p&gt;…&lt;/p&gt;    &lt;p&gt;Me parece interesante repasar juntos los objetivos y desarrollo histórico del CLR, el DLR, y cómo impactó en esta nueva tanda de lenguajes la influencia del ambiente Open Source, que es tan cercano al espíritu Alt.NET. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;El bueno de Martín, menciona algunos proyectos míos de lenguajes… snif… me van a hacer llorar de la emoción… snif… :-)&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;. Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;. Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás) (yo ya participé en &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx"&gt;VAN sobre Scrum&lt;/a&gt; y en otra &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx" target="_blank"&gt;sobre generación de código&lt;/a&gt;, que quedará publicada en estos días). Supongo (pero confirmen) que la URL de entrada de la VAN de Martín será &lt;a title="http://snipr.com/virtualaltnet" href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;. Cualquier cosa, pueden consultar &lt;a href="http://groups.google.com/group/altnet-hispano/" target="_blank"&gt;la lista de correo de ALT.NET Hispano&lt;/a&gt;. También pueden suscribirse para proponer nuevos temas, y colaborar con la comunidad.&lt;/p&gt;  &lt;p&gt;El año pasado con &lt;a href="http://weblogs.shockbyte.com.ar/" target="_blank"&gt;Rodolfo Finochietti&lt;/a&gt; (&lt;a href="http://twitter.com/rodolfof" target="_blank"&gt;@rodofof&lt;/a&gt;) y Martín, dimos un Technight en las oficinas de Microsoft Argentina (Buenos Aires), sobre &lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx" target="_blank"&gt;lenguajes de programación e implementaciones en .NET&lt;/a&gt;. (Lean el material de Rodolfo &lt;a href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2009/08/30/juti-c4.aspx" target="_blank"&gt;sobre C# 4.0&lt;/a&gt;). Me pareció muy interesante esa charla, y me divertí mucho preparándola y compartiéndola con Martín y Rodolfo. Creo que deberíamos invitar a Rodolfo para que siga con una próxima VAN completando el tema que inicia Martín.&lt;/p&gt;  &lt;p&gt;Post relacionados:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.salias.com.ar/2008/09/javascript-la-programacin-del-futuro.html" target="_blank"&gt;Javascript, la programación del futuro&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/10/16/babel-de-lenguajes-en-net.aspx" target="_blank"&gt;Babel de lenguajes en .NET&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/09/17/papa-fritas-cervezas-y-una-babel-de-esos-raros-lenguajes-nuevos.aspx" target="_blank"&gt;Papas fritas, cervezas y una babel de esos raros lenguajes nuevos&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(Me gustó tanto la pintura de la Torre de Babel, aludiendo a múltiples lenguajes, que usé en otro post, que la vuelvo a usar acá, con mi propio permiso… :-)&lt;/p&gt;  &lt;p&gt;Como es hábito, colecciono enlaces sobre estos temas en:&lt;/p&gt;  &lt;p&gt;Bueno, como siempre, los enlaces de estos temas, que colecciono, desde:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/dlr"&gt;http://delicious.com/ajlopez/dlr&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/javascript"&gt;http://delicious.com/ajlopez/javascript&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/programminglanguages"&gt;http://delicious.com/ajlopez/programminglanguages&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/functionalprogramming"&gt;http://delicious.com/ajlopez/functionalprogramming&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/python"&gt;http://delicious.com/ajlopez/python&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scala"&gt;http://delicious.com/ajlopez/scala&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/clojure"&gt;http://delicious.com/ajlopez/clojure&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/f#"&gt;http://delicious.com/ajlopez/f#&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/prolog"&gt;http://delicious.com/ajlopez/prolog&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/lisp"&gt;http://delicious.com/ajlopez/lisp&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/smalltalk"&gt;http://delicious.com/ajlopez/smalltalk&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/logo"&gt;http://delicious.com/ajlopez/logo&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/scripting"&gt;http://delicious.com/ajlopez/scripting&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://delicious.com/ajlopez/dynamiclanguages"&gt;http://delicious.com/ajlopez/dynamiclanguages&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&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=1728700" 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/F_2300_/default.aspx">F#</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><category domain="http://msmvps.com/blogs/lopez/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Dynamic+Language+Runtime/default.aspx">Dynamic Language Runtime</category></item><item><title>VAN (Reunión Virtual) en ALT.NET Hispano sobre Generación de Código</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx</link><pubDate>Fri, 25 Sep 2009 09:32:16 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1726628</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=1726628</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/25/van-reuni-243-n-virtual-en-alt-net-hispano-sobre-generaci-243-n-de-c-243-digo.aspx#comments</comments><description>&lt;p&gt;Gracias a la comunidad de ALT.NET Hispano, mañana sábado 26 de septiembre, participaré de una VAN (Reunión virtual) sobre generación de código (hora internacional 6PM GMT, son15hs Buenos Aires). La idea es que al principio presente algunas ideas, ejemplos de AjGenesis, panorama de generación de código, comentar otras herramientas y aproximaciones, pros y contras,&amp;#160; y luego, se discutan los temas, entre todos.&lt;/p&gt;  &lt;p&gt;Quisiera presentar:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Los por qué de la generación del código&lt;/li&gt;    &lt;li&gt;Qué pedirle a una herramienta de generación de código&lt;/li&gt;    &lt;li&gt;Elevar el nivel de abstracción, partiendo de un modelo&lt;/li&gt;    &lt;li&gt;Resolviendo paso a paso, la aplicación más simple&lt;/li&gt;    &lt;li&gt;Mostrar que es más que templates/plantillas&lt;/li&gt;    &lt;li&gt;Resolver una aplicación con entidades, desde el mismo modelo, en distintas tecnologías y plataformas (Java, .NET, PHP)&lt;/li&gt;    &lt;li&gt;Generación de código como servicio en línea&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar &lt;a href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para ver cómo se desarrolla una VAN de ALT.NET Hispano, y qué software necesitan para asistir, ver &lt;a href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver &lt;a href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;el historial de anteriores reuniones VAN&lt;/a&gt; (visiten las que dieron, por ejemplo, sobre NHibernate, WPF y demás)(ya había participado de &lt;a href="http://msmvps.com/blogs/lopez/archive/2009/09/18/resultado-de-la-van-en-alt-net-hispano-sobre-scrum.aspx" target="_blank"&gt;VAN sobre Scrum&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Gracias al bueno de &lt;a href="http://geeks.ms/blogs/jgamba" target="_blank"&gt;Jorge Gamba&lt;/a&gt; (&lt;a href="http://twitter.com/jorgegamba" target="_blank"&gt;@jorgegamba&lt;/a&gt;) que publicó el evento en su blog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/blogs/jgamba/archive/2009/09/24/van-hispano-2009-09-26-generacion-de-codigo.aspx" target="_blank"&gt;[Evento] Viendo la luz respecto a “Generación de Código”&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Copio de ahí:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;La comunidad &lt;a href="http://altnethispano.org"&gt;ALT.NET Hispano&lt;/a&gt; realizará un evento virtual con el tema &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/08/02/sobre-la-generaci-243-n-de-c-243-digo.aspx"&gt;Generación de Código&lt;/a&gt;, con la exposición principal del reconocido especialista y maestro en desarrollo de software &lt;a href="http://www.ajlopez.com/"&gt;Angel “Java” Lopez&lt;/a&gt;. Será el día sábado 26 de septiembre a la hora internacional 18:00 GMT/GTU (Greenwich), con una duración aproximada de 2 horas. Para atender la reunión deben usar el programa &lt;a href="http://office.microsoft.com/en-us/help/HA101733831033.aspx"&gt;Microsoft Office Live Meeting 2007 client&lt;/a&gt;, abriendo el enlace &lt;a href="http://snipr.com/virtualaltnet"&gt;http://snipr.com/virtualaltnet&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Adicionalmente, pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en la discusión &lt;a href="http://groups.google.com/group/altnet-hispano/browse_thread/thread/47667d4fc07235b4"&gt;Invitación a VAN Hispano Sábado 26 de septiembre - &amp;quot;Generación de código&amp;quot; con Angel &amp;quot;Java&amp;quot; Lopez&lt;/a&gt;, en nuestra &lt;a href="http://groups.google.com/group/altnet-hispano/"&gt;lista de correo&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;La comunidad ALT.NET hispano está muy activa, y los invito a participar de ella. Jorge escribe:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;les dejo la lista de recursos compartidos de los que disponemos en la comunidad:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://groups.google.com/group/altnet-hispano"&gt;Lista de Correo del Grupo de Usuarios&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://altnet-hispano.pbworks.com/"&gt;Wiki&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://twitter.com/AltNetHispano"&gt;Twitter&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://bit.ly/bLoe4"&gt;Facebook&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.viddler.com/explore/AltNet-Hispano/videos/"&gt;viddler&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://altnet-hispano.pbworks.com/Mapa"&gt;Mapa de ubicación geográfica&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.google.com/calendar/embed?src=fpf8r6u1n4f0hd2p50t0mcoa28%40group.calendar.google.com"&gt;Calendario de eventos&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/blockquote&gt;  &lt;p&gt;Como comenta Jorge, pueden ir leyendo:&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ón de código&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/08/25/diez-reglas-principales-en-generaci-243-n-de-c-243-digo.aspx"&gt;Diez reglas principales en generación de código&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/07/22/la-generaci-243-n-de-c-243-digo-y-el-trabajo-de-desarrollo-de-software.aspx"&gt;La generación de código y el trabajo de desarrollo de software&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=1726628" 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/PHP/default.aspx">PHP</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>AjSharp: un lenguaje dinámico en C#</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/22/ajsharp-un-lenguaje-din-225-mico-en-c.aspx</link><pubDate>Tue, 22 Sep 2009 10:04:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1725706</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=1725706</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/22/ajsharp-un-lenguaje-din-225-mico-en-c.aspx#comments</comments><description>&lt;p&gt;Durante el desarrollo de &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;, mi proyecto de generación de código, definí y usé un lenguaje interpretado, llamdado AjBasic, que me dió libertad para implementar tareas, plantillas y acceso a .NET, de una forma muy flexible. El año pasado comencé a separar la implementación de AjBasic del núcleo de AjGenesis, para poder irlo mejorando. Escribí el núcleo de un intérprete, AjInterpreter, y como prueba de concepto, construí sobre él a AjBasic, y a otro lenguaje &lt;a href="http://ajlopez.wordpress.com/category/ajsharp/" target="_blank"&gt;AjSharp&lt;/a&gt;, con una sintaxis más tipo C#. Más információn en:&lt;/p&gt;  &lt;p&gt;&lt;a title="AjSharp- a C Sharp-like interpreter, work in progress" href="http://ajlopez.wordpress.com/2008/09/25/ajsharp-a-c-sharp-like-interpreter-work-in-progress/"&gt;AjSharp- a C Sharp-like interpreter, work in progress&lt;/a&gt;    &lt;br /&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" target="_blank"&gt;AjSharp – un intérprete a la C# trabajo en progreso&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Ahora, este año, lo reescribí en una implementación nueva, dentro de &lt;a href="http://code.google.com/p/ajcodekatas" target="_blank"&gt;mi AjCodeKatas Google Code&lt;/a&gt;. El núcleo del intérprete es ahora AjLanguage, y AjSharp es el lenguaje con un parser que se apoya en la “virtual machine” que da el AjLanguage, para armar y ejecutar un árbol de comandos y expresiones:&lt;/p&gt;  &lt;p&gt;&lt;img alt="" src="http://www.todocontenidos.com/images/articles/ajlanguage01.png" /&gt;&lt;/p&gt;  &lt;p&gt;Pueden ver el código en desarrollo y bajarlo desde:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage" href="http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage"&gt;http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjLanguage&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Variables, expresiones y comandos&lt;/h2&gt;  &lt;p&gt;Las variables no son tipadas, y son automáticamente declaradas cuando son usadas:&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;a = 1;&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;b = 2;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Estas variables contienen valores enteros, pero pueden asignarles valores de otros tipos en cualquier momento:&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;a = “one”;&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;b = “two”;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Los comandos habituales son soportados:&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;if&lt;/span&gt; (k&amp;gt;0)&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;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: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;for&lt;/span&gt; (k=1; k&amp;lt;=10; k++)&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;   sum = k+sum;&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;while&lt;/span&gt; (j&amp;lt;10)&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;   DoProcess(j);&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;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (element &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; elements)&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;   AddElement(element);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Las condiciones puede ser cualquier expresión, no solamente una que de resultado booleano. Ver más adelante, la explicación sobre el valor False.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippetWrapper"&gt;
    &lt;h2&gt;Funciones y rutinas&lt;/h2&gt;

    &lt;p&gt;Esta es la sintaxies para escribir una función factorial. &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;function Factorial(n)&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;/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; (n&amp;lt;=1)&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;return&lt;/span&gt; 1;&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;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n * Factorial(n-1);&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;/pre&gt;
&lt;/div&gt;
    &lt;/div&gt;

    &lt;div id="codeSnippetWrapper"&gt;
      &lt;p&gt;La palabra sub puede ser usada para definir subrutinas.&lt;/p&gt;

      &lt;p&gt;Funciones y subrutinas son como cualquier otrosvalores. Puede ser definidos sin nombre y asignados a variables:&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;Add1 = function (n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n+1; }&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;two = Add1(1);&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;function Apply(func,values)&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;/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;    list = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&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;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&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;        list.Add(func(&lt;span style="color:#0000ff;"&gt;value&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;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; list;&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;/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;numbers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&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;numbers.Add(1);&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;numbers.Add(2);&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;numbers.Add(3);&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;function Square(n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n*n; }&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;squared = Apply(Square, numbers);&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;squared2 = Apply(function (n) { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; n*n; }, numbers);&lt;/pre&gt;
&lt;/div&gt;
      &lt;/div&gt;

      &lt;div id="codeSnippetWrapper"&gt;
        &lt;p&gt;&lt;/p&gt;

        &lt;h2&gt;Manejo de objetos .NET nativos&lt;/h2&gt;

        &lt;p&gt;Uno de los objetivos de diseño de AjLanguage es que pudiera acceder a objetos .NET. Pueden ser creados con la palabra new:&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;ds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Data.DataSet();&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;dinfo = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.IO.DirectoryInfo(“.”);&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;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (fi &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; dinfo.GetFiles()) {&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(fi.FullName);&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;/pre&gt;
&lt;/div&gt;
        &lt;/div&gt;

        &lt;div id="codeSnippetWrapper"&gt;
          &lt;p&gt;&lt;/p&gt;

          &lt;h2&gt;Objetos dynámicos&lt;/h2&gt;

          &lt;p&gt;Pueden ser creados usando la palabra new. Un objeto dinámico acepta nuevos miembros (variables y métodos):&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;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&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;dynobj.FirstName = “Adam”;&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;dynobj.LastName = &amp;quot;Genesis”;&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;dynobj.Age = 800;&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;dynobj.FullName = function() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FirstName + “ “ + LastName; }&lt;/pre&gt;
&lt;/div&gt;
          &lt;/div&gt;

          &lt;p&gt;Otra notación:&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;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Adam”, Age = 800 };&lt;/pre&gt;
&lt;/div&gt;
          &lt;/div&gt;

          &lt;div id="codeSnippetWrapper"&gt;
            &lt;div id="codeSnippetWrapper"&gt;
              &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

              &lt;p&gt;Otra notación:&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;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { var FirstName = “Adam”; var LastName = “Genesis”;&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; function FullName() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; FirstName + “ “ + LastName; }&lt;/pre&gt;
&lt;/div&gt;
              &lt;/div&gt;

              &lt;div id="codeSnippetWrapper"&gt;
                &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                &lt;p&gt;Los objetos dinámicos se definen automáticamente, poniendo valores en sus propiedades:&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;Project.Database.Provider = “…”;&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;Project.Database.ConnectionString = “…”;&lt;/pre&gt;
&lt;/div&gt;
                &lt;/div&gt;

                &lt;div id="codeSnippetWrapper"&gt;
                  &lt;p&gt;crea el objeto dinámico Project, con una propiedada Database que es a su vez otro objeto dinámico. Ese código equivale a:&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;Project = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&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;Project.Database = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&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;Project.Database.Provider = “…”;&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;Project.Database.ConnectionString = “…”;&lt;/pre&gt;
&lt;/div&gt;
                  &lt;/div&gt;

                  &lt;p&gt;Un experimento (veré si queda en la implementación final) las litas se definen automáticamente usando el método Add:&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;Project.Entities.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Customer”, Table = “dbo.Customers” });&lt;/pre&gt;
&lt;/div&gt;
                  &lt;/div&gt;

                  &lt;div id="codeSnippetWrapper"&gt;
                    &lt;div id="codeSnippetWrapper"&gt;
                      &lt;p&gt;equivale a:&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;Project = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&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;Project.Entities = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List();&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;Project.Entities.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { Name = “Customer”, Table = “dbo.Customers” });&lt;/pre&gt;
&lt;/div&gt;
                      &lt;/div&gt;

                      &lt;div id="codeSnippetWrapper"&gt;
                        &lt;h2&gt;Clases dinámicas&lt;/h2&gt;

                        &lt;p&gt;Una clase puede ser definida usando esta sintaxis:&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;class&lt;/span&gt; Person {&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;    var FirstName;&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;    var LastName;&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;    var Age;&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;    function FullName() {&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; FirstName + “ “ +&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;            LastName;&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;/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;/pre&gt;
&lt;/div&gt;
                        &lt;/div&gt;

                        &lt;div id="codeSnippetWrapper"&gt;
                          &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                          &lt;p&gt;Una nueva instancia puede ser creada como siempre:&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;adam = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Person() { FirstName = “Adam”, LastName = “Genesis”, Age = 800 };&lt;/pre&gt;
&lt;/div&gt;
                          &lt;/div&gt;

                          &lt;div id="codeSnippetWrapper"&gt;
                            &lt;p&gt;La instancia, a su vez, es dinámica: nuevos miembros pueder serle adosados, y pueden agregar o redefinir métodos:&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;adam.FullName = function() { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; “The “ + FirstName; };&lt;/pre&gt;
&lt;/div&gt;
                            &lt;/div&gt;

                            &lt;div id="codeSnippetWrapper"&gt;
                              &lt;p&gt;Pueden crear una clase como un valor:&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;Person = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicClass();&lt;/pre&gt;
&lt;/div&gt;
                              &lt;/div&gt;

                              &lt;div id="codeSnippetWrapper"&gt;
                                &lt;p&gt;pero todavía tengo que definir bien la interfaz para agregar miembros de instancia.&lt;/p&gt;

                                &lt;p&gt;&amp;#160;&lt;/p&gt;

                                &lt;h2&gt;Clases ya definidas&lt;/h2&gt;

                                &lt;p&gt;Hay algunas clases predefinidas:&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;dynobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DynamicObject();&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;list = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List(); &lt;span style="color:#008000;"&gt;// implementing IList&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;dict= &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary(); // implementing IDictionary&lt;/pre&gt;
&lt;/div&gt;
                                &lt;/div&gt;

                                &lt;div id="codeSnippetWrapper"&gt;
                                  &lt;div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;"&gt;&lt;/div&gt;

                                  &lt;h2&gt;Funciones primitivas&lt;/h2&gt;

                                  &lt;p&gt;Hay unas pocas funciones y subrutinas definidas:&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;Print(“Hello”);&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(“Hello World”);&lt;/pre&gt;
&lt;/div&gt;
                                  &lt;/div&gt;

                                  &lt;div id="codeSnippetWrapper"&gt;
                                    &lt;p&gt;Hay tres funciones predefenidas para ejecutar y evaluar código dinámicamente:&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;program.ajs&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;Evaluate(&lt;span style="color:#006080;"&gt;&amp;quot;k+1&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;Execute(&lt;span style="color:#006080;"&gt;&amp;quot;k=1;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
                                    &lt;/div&gt;

                                    &lt;div id="codeSnippetWrapper"&gt;
                                      &lt;div id="codeSnippetWrapper"&gt;Include ejecuta los comandos dentro de un archivo. Evalue analiza y evalúa una expresión. Execute compila y ejecuta comandos.&lt;/div&gt;

                                      &lt;h2&gt;El valor false&lt;/h2&gt;

                                      &lt;p&gt;Cualquier valor que sea false, null, 0 o el string vacío, será evaluado como falso dentro de una expresión condicional:&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;if&lt;/span&gt; (k)&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:#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:white;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:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;”);&lt;/pre&gt;
&lt;/div&gt;
                                      &lt;/div&gt;

                                      &lt;div id="codeSnippetWrapper"&gt;
                                        &lt;p&gt;El ejemplo de arriba imprime “false” en ejecución, si k es zero o indefinida. Si una variable es indefinida, cualquier acceso a sus miembros (que no sean métodos) retorna null, no una exception:&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;if&lt;/span&gt; (Project.Database.ConnectionString)&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:#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:white;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:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;    PrintLine(“&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;”);&lt;/pre&gt;
&lt;/div&gt;
                                        &lt;/div&gt;

                                        &lt;div id="codeSnippetWrapper"&gt;
                                          &lt;p&gt;Este comando imprime de nuevo “false”, si la variable Project está indefinida.&lt;/p&gt;

                                          &lt;h2&gt;Arreglos, listas y diccionarios&lt;/h2&gt;

                                          &lt;p&gt;Vectores nativos puede ser definidos, usando una longitud:&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;firstprimes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[10];&lt;/pre&gt;
&lt;/div&gt;
                                          &lt;/div&gt;

                                          &lt;div id="codeSnippetWrapper"&gt;
                                            &lt;p&gt;o con valores:&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;firstprimes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] { 1, 2, 3, 5, 7, 9 };&lt;/pre&gt;
&lt;/div&gt;
                                            &lt;/div&gt;

                                            &lt;div id="codeSnippetWrapper"&gt;
                                              &lt;p&gt;Una lista es creada dinámicamente si comenzamos a asignar valores con subíndices consecutivos, desde 0, a una variable no definida aún:&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;numbers[0] = “zero”;&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;numbers[1] = “one”;&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;numbers[2] = “two”;&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;numbers[3] = “three”;&lt;/pre&gt;
&lt;/div&gt;
                                              &lt;/div&gt;

                                              &lt;div id="codeSnippetWrapper"&gt;
                                                &lt;p&gt;Un diccionario es automáticamente creado si los subíndices no son numéricos:&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;numbers[“one”] = 1;&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;numbers[“two”] = 2;&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;numbers[“three”] = 3;&lt;/pre&gt;
&lt;/div&gt;
                                                &lt;/div&gt;

                                                &lt;div id="codeSnippetWrapper"&gt;
                                                  &lt;p&gt;Si necesitan más características, siempre pueden usar el framework .NET nativo.&lt;/p&gt;

                                                  &lt;h2&gt;Interfaz de consola&lt;/h2&gt;

                                                  &lt;p&gt;El proyecto AjSharp.Console es una aplicación de consola, donde pueden ingresar y ejecutar comandos AjSharp (no expresiones):&lt;/p&gt;

                                                  &lt;p&gt;&lt;img alt="" src="http://www.todocontenidos.com/images/articles/ajlanguage02.png" /&gt;&lt;/p&gt;

                                                  &lt;p&gt;No hay comando para salir, todavía. Simplemente, Control+C en Windows (no lo probé, pero todo el código debería ser recompilable en Mono).&lt;/p&gt;

                                                  &lt;h2&gt;Próximos pasos&lt;/h2&gt;

                                                  &lt;p&gt;Hay varias cosas que quisiera agregar. Una lista parcial:&lt;/p&gt;

                                                  &lt;p&gt;- Implementar AjBasic como otro lenguaje que use AjLanguage
                                                    &lt;br /&gt;- Soporte de Generics

                                                    &lt;br /&gt;- Soporte de plantillas/templates (como en AjGenesis)

                                                    &lt;br /&gt;- Integrar a la generación de código de &lt;a href="http://ajgenesis.codeplex.com" target="_blank"&gt;AjGenesis&lt;/a&gt;

                                                    &lt;br /&gt;- Compilar el AST a Dynamic Language Runtime (DLR)&lt;/p&gt;

                                                  &lt;p&gt;Nos leemos!&lt;/p&gt;

                                                  &lt;p&gt;Angel “Java” 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&gt;
                                              &lt;/div&gt;
                                            &lt;/div&gt;
                                          &lt;/div&gt;
                                        &lt;/div&gt;
                                      &lt;/div&gt;
                                    &lt;/div&gt;
                                  &lt;/div&gt;
                                &lt;/div&gt;
                              &lt;/div&gt;
                            &lt;/div&gt;
                          &lt;/div&gt;
                        &lt;/div&gt;
                      &lt;/div&gt;
                    &lt;/div&gt;
                  &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&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=1725706" 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/AjGenesis/default.aspx">AjGenesis</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><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx">AjSharp</category></item><item><title>Preparando un curso de .NET: aplicaciones, patrones y arquitectura</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/19/preparando-un-curso-de-net-aplicaciones-patrones-y-arquitectura.aspx</link><pubDate>Sat, 19 Sep 2009 14:20:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1724968</guid><dc:creator>lopez</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1724968</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/19/preparando-un-curso-de-net-aplicaciones-patrones-y-arquitectura.aspx#comments</comments><description>&lt;p&gt;Estoy preparando los temas y material, para un curso que dictar&amp;eacute; en el &lt;a href="http://www.mug.org.ar" target="_blank"&gt;Microsoft User Group de Argentina&lt;/a&gt;, en Octubre (seguramente quedar&amp;aacute; anunciado en el sitio del MUG). La idea es ir m&amp;aacute;s all&amp;aacute; de lo que ya d&amp;iacute; en los cursos de .NET cl&amp;aacute;sico (donde se muestra el framework, distintos tipos de aplicaciones), y un poco m&amp;aacute;s extenso que el que ya d&amp;iacute; sobre Arquitectura .NET.&lt;/p&gt;
&lt;p&gt;Mi lista de temas (tentativo) a tratar, con ejemplos a desarrollar (tengo que ordenar los temas):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capas l&amp;oacute;gicas, y el gran patr&amp;oacute;n: Service Layer&lt;/li&gt;
&lt;li&gt;Capas f&amp;iacute;sicas, Service Interface/Service Gateway&lt;/li&gt;
&lt;li&gt;Object Relational Mapping&lt;/li&gt;
&lt;li&gt;Domain-Driven Design&lt;/li&gt;
&lt;li&gt;Test-Driven Development&lt;/li&gt;
&lt;li&gt;Dependency Injection&lt;/li&gt;
&lt;li&gt;Validaciones y Reglas de Negocio&lt;/li&gt;
&lt;li&gt;Cambiando la presentaci&amp;oacute;n&lt;/li&gt;
&lt;li&gt;Model View Controller, Model View Presenter y variantes (con distintas tecnolog&amp;iacute;as de presentaci&amp;oacute;n)&lt;/li&gt;
&lt;li&gt;Esas raras arquitecturas nuevas: aplicaciones distribuidas, grid computing, sharding, &amp;hellip;&lt;/li&gt;
&lt;li&gt;Tecnolog&amp;iacute;as: WinForms, ASP.NET, ASP.NET MVC, ASP.NET Ajax, WPF (quiz&amp;aacute;s Silverlight)&lt;/li&gt;
&lt;li&gt;Herramientas y librer&amp;iacute;as: Moq, NUnit, NHibernate, VS Tests, Spring.NET, Rhino Mocks, &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;y seguramente alg&amp;uacute;n proyecto AjX&amp;hellip; :-)&lt;/p&gt;
&lt;p&gt;Como siempre, lo que produzcamos en el curso, enlaces a ejemplos ya existentes, ejemplos armados para el curso, quedar&amp;aacute;n en mi sitio, en &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.ajlopez.net/CursosEjemplos.php"&gt;Materiales de Cursos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Como no s&amp;eacute; si me dar&amp;aacute; el cuero para tratar tantos temas, les pregunto por ac&amp;aacute;: Cu&amp;aacute;les ser&amp;iacute;an sus temas preferidos? Falta alguno que prefieran a &amp;eacute;stos?&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=1724968" 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/Arquitectura/default.aspx">Arquitectura</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/DDD/default.aspx">DDD</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/TDD/default.aspx">TDD</category></item><item><title>Twitter para todo: TweetMyPC (y TweetMyMac también)</title><link>http://msmvps.com/blogs/lopez/archive/2009/09/01/twitter-para-todo-tweetmypc-y-tweetmymac-tambi-233-n.aspx</link><pubDate>Tue, 01 Sep 2009 09:55:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1719840</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=1719840</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/09/01/twitter-para-todo-tweetmypc-y-tweetmymac-tambi-233-n.aspx#comments</comments><description>&lt;p&gt;Una idea que quería explorar es crear un pequeño estándar de &lt;strong&gt;cómo usar mensajes cortos para enviar comandos y recibir respuestas de una aplicación cualquiera&lt;/strong&gt;. Un paso hacia eso, muy ingenioso, es la de TweetMyPc (&lt;a title="http://tweetmypc.codeplex.com/" href="http://tweetmypc.codeplex.com/"&gt;http://tweetmypc.codeplex.com/&lt;/a&gt;). El autor principal es &lt;a href="http://stackoverflow.com/users/12178/shoban" target="_blank"&gt;Shoban&lt;/a&gt;, Microsoft MVP de la India.&lt;/p&gt;  &lt;p&gt;La aplicación es chica, y cuando la ejecutamos en nuestra máquina, ingresamos los datos de nuestra cuenta de Twitter:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/TweetMyPCImage.jpg" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Una vez que arranca la aplicación, comienza a leer nuestros tweets cada 1 minuto. Es conveniente usar una cuenta para cada PC. Desde esa cuenta, desde cualquier otro lugar, podemos enviar comandos como: Shutdown, Hibernate, Lock, y hasta Download, que comienza a bajar un archivo. Una lista parcial de comandos la pueden ver en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codegeeks.net/tweetmypc-what-next" href="http://www.codegeeks.net/tweetmypc-what-next"&gt;http://www.codegeeks.net/tweetmypc-what-next&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si uno saca un Screenshot remoto, la aplicación responde enviando un comando con una URL de la imagen tomada. Este es el tipo de respuesta que tenía en mente en el primer párrafo de este post: &lt;strong&gt;una forma de enviar algo más grande que un mensaje, es mediante una URL&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;La aplicación está escrita en .NET. No vi el código todavía, pero está originalmente &lt;a href="http://tweetmypc.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28234#DownloadId=70382" target="_blank"&gt;escrita en VB.Net&lt;/a&gt; y hay &lt;a href="http://tweetmypc.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28235#DownloadId=70383" target="_blank"&gt;versión en C#&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Tienen también aplicación para &lt;/p&gt;  &lt;p&gt;Otra aplicación del mismo autor:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.codeplex.com/jata" href="http://www.codeplex.com/jata"&gt;http://www.codeplex.com/jata&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Jata is a Google Talk like Twitter Application which was developed using VB.net and Twiteroo Twitter API framework.     &lt;br /&gt;jata automatically checks for new messages periodically. You can post your status right from jata post message screen.      &lt;br /&gt;You can also reply to tweets using jata.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p dir="ltr" style="margin-right:0px;"&gt;Habría que seguir explorando la idea de manejar aplicaciones con mensajes cortos, desde Twitter u otros.&lt;/p&gt;  &lt;p dir="ltr" style="margin-right:0px;"&gt;Nos leemos!&lt;/p&gt;  &lt;p dir="ltr" style="margin-right:0px;"&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=1719840" 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/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Twitter/default.aspx">Twitter</category></item><item><title>Próxima reunión VAN de ALT.NET Hispano</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/24/pr-243-xima-reuni-243-n-van-de-alt-net-hispano.aspx</link><pubDate>Fri, 24 Jul 2009 07:07:08 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1708169</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=1708169</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/24/pr-243-xima-reuni-243-n-van-de-alt-net-hispano.aspx#comments</comments><description>&lt;p&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" src="http://altnet-hispano.pbworks.com/f/1238776323/altnet-logo.png" align="left" alt="" /&gt; Han pasado dos meses desde la última reunión virtual de ALT.NET Hispano. La última fue el pasado 24 de Mayo, con la participación del bueno de Fabio Maulo, por supuesto hablando de NHibernate. Ya han habido 5 reuniones VAN:&lt;/p&gt;  &lt;p&gt;Si no conocen qué es una reunión VAN, pueden consultar&lt;/p&gt;  &lt;p&gt;&lt;a title="VAN meetings" href="http://www.zachariahyoung.com/zy/post/2009/01/Introduction-to-Virtual-ALTNET.aspx"&gt;VAN meetings&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para ver cómo se desarrolla una VAN de ALT.NET Hispano ver&lt;/p&gt;  &lt;p&gt;&lt;a title="Descripcion-de-Reuniones-VAN" href="http://altnet-hispano.pbworks.com/Descripcion-de-Reuniones-VAN"&gt;Descripcion-de-Reuniones-VAN&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahora se viene una nueva reunión virtual, el próximo 1ro. de Agosto, pueden registrarse en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://eventioz.com/admin/events/van-hispano-1-de-agosto-de-2009/registrations" href="http://eventioz.com/admin/events/van-hispano-1-de-agosto-de-2009/registrations"&gt;http://eventioz.com/admin/events/van-hispano-1-de-agosto-de-2009/registrations&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El tema será &lt;a title="CSLA.NET" href="http://csla.net/"&gt;CSLA.NET&lt;/a&gt;, el framework de aplicaciones para .NET, que nació en su tiempo en Visual Basic clásico.&lt;/p&gt;  &lt;p&gt;Pueden ver el resultado de las anteriores reuniones virtuales en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://altnet-hispano.pbworks.com/Historial-de-reuniones" href="http://altnet-hispano.pbworks.com/Historial-de-reuniones"&gt;http://altnet-hispano.pbworks.com/Historial-de-reuniones&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Algunas reuniones fueron pasadas a video, como ejemplo, pueden ver al bueno de Fabio Maulo en:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://altnet-hispano.pbworks.com/NHIbernate.2009-06-22-12-54-41" href="http://altnet-hispano.pbworks.com/NHIbernate.2009-06-22-12-54-41"&gt;http://altnet-hispano.pbworks.com/NHIbernate.2009-06-22-12-54-41&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Si no conocen qué es ALT.NET pueden visitar:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://groups.google.com/group/altnet-hispano/web/qu-es-alt-net"&gt;¿Qué es ALT.NET?&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Es un movimiento&lt;/em&gt;… así de sencillo, pero también de entrada hay que decir que no hay una definición totalmente oficial ni exacta, hay descripciones y principios (tal vez no leyes) que rigen cómo piensa y actúa un &lt;em&gt;alt.netero. &lt;/em&gt;De hecho, si buscas en la Web, seguramente vas a encontrar diferencias en como lo entienden unos y otros, aunque también es necesario aclarar que las diferencias son muy pequeñas y no muy distantes.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;que nació de un post original de Jorge Gamba:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.gambasoft.net/blog/archive/2009/03/24/qu-es-altnet/"&gt;Que es ALT.NET&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pueden seguir la actividad del movimiento en Twitter:&lt;/p&gt;  &lt;p&gt;&lt;a title="@AltNetHispano" href="http://twitter.com/AltNetHispano"&gt;@AltNetHispano&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El sitio wiki de la comunidad:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://altnet-hispano.pbworks.com/" href="http://altnet-hispano.pbworks.com/"&gt;http://altnet-hispano.pbworks.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahí leemos:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;(tomado del sitio&lt;/em&gt; &lt;em&gt;&lt;a href="http://altdotnet.org/"&gt;&lt;em&gt;altdotnet.org&lt;/em&gt;&lt;/a&gt;&lt;/em&gt;&lt;em&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;Somos una comunidad&lt;/em&gt;&lt;em&gt;, independiente y con fines específicos,&lt;/em&gt; &lt;em&gt;de desarrolladores comprometidos por un deseo de superarse, desafiar supuestos, y que se ayudan entre sí perseguiendo la excelencia en la práctica de desarrollo de software.&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Posts relacionados:&lt;/p&gt;  &lt;p&gt;&lt;a title="ALT.NET Argentina, ALT.NET Hispano, primera reunión en Buenos Aires" href="http://msmvps.com/blogs/lopez/archive/2009/05/07/alt-net-argentina-alt-net-hispano-primera-reuni-243-n-en-buenos-aires.aspx"&gt;ALT.NET Argentina, ALT.NET Hispano, primera reunión en Buenos Aires&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="ALT.NET Buenos Aires Primera Reunión" href="http://msmvps.com/blogs/lopez/archive/2009/05/10/alt-net-buenos-aires-primera-reuni-243-n.aspx"&gt;ALT.NET Buenos Aires Primera Reunión&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(Imagen tomada de &lt;a title="http://altnet-hispano.pbworks.com/" href="http://altnet-hispano.pbworks.com/"&gt;http://altnet-hispano.pbworks.com/&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=1708169" 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/ALT.NET/default.aspx">ALT.NET</category></item><item><title>Ejemplos de ASP.NET, capas y Linq</title><link>http://msmvps.com/blogs/lopez/archive/2009/07/23/ejemplos-de-asp-net-capas-y-linq.aspx</link><pubDate>Thu, 23 Jul 2009 10:03:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1706460</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=1706460</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/07/23/ejemplos-de-asp-net-capas-y-linq.aspx#comments</comments><description>&lt;p&gt;Hace dos semanas, terminé de dar un curso de ASP.NET, con máquinas, en el laboratorio del &lt;a href="http://www.mug.org.ar/" target="_blank"&gt;Microsoft User Group de Argentina&lt;/a&gt;, en Buenos Aires, contando con diez asistentes, con los que tuvimos 30 horas explorando el desarrollo de sitios dinámicos con .NET. Los ejemplos que fuimos desarrollando y otros que bajamos de ejemplos míos, están disponibles para bajarse desde:&lt;/p&gt;  &lt;p&gt;&lt;a title="Material del Curso de ASP.NET en el MUG" href="http://www.ajlopez.net/ReferenciaVe.php?Id=267"&gt;Material del Curso de ASP.NET en el MUG&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(Siempre pueden bajar lo que tratamos en mis cursos, desde&lt;/p&gt;  &lt;p&gt;&lt;a title="Materiales de Cursos" href="http://www.ajlopez.net/CursosEjemplos.php"&gt;Materiales de Cursos&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ya sea ASP.NET, .NET, arquitectura, Java, JSP, Spring, Struts, etc… así como las presentaciones que se usaron)&lt;/p&gt;  &lt;p&gt;Hay varios ejemplos para estudiar, que podría explicar más en detalle en algún post, pero vaya ahora una introducción:&lt;/p&gt;  &lt;p&gt;&lt;a title="AjFirstExample" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjFirstExampleDotNet.zip"&gt;AjFirstExample&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En este ejemplo&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;tenemos una base de datos, que pueden instalar usando cualquiera de los dos directorios Sql, y dos soluciones, una en VB.NET y otra en C#.&lt;/p&gt;  &lt;p&gt;En el directorio Sql, tenemos:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Podemos lanzar la creación de la base con el comando ExecuteAll.cmd, que contiene&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:#008000;"&gt;REM  -------------------------------------------------------------&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;REM  You can change server.&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;REM  -------------------------------------------------------------&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;SET&lt;/span&gt; sqlServer=%1%&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; &lt;span style="color:#006080;"&gt;&amp;quot;%1%&amp;quot;&lt;/span&gt;==&lt;span style="color:#006080;"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; sqlServer=(local)&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;&lt;span style="color:#0000ff;"&gt;call&lt;/span&gt; CreateDatabase %sqlServer%&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;&lt;span style="color:#008000;"&gt;rem TBD:&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;rem call LinkData %sqlServer%&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;rem call InsertData %sqlServer%&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;&lt;span style="color:#0000ff;"&gt;goto&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;end&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;:&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Si lo invocamos sin parámetros, va a conectarse con nuestro MS SQL Server (local). Si queremos ir contra otra instancia, por ejemplo, contra .\SQLEXPRESS, hay que invocarlo como:&lt;/p&gt;

&lt;p&gt;ExecuteAll.cmd .\SQLEXPRESS&lt;/p&gt;

&lt;p&gt;Crea una base simple, AjFirstExample, con dos tablas, clientes y proveedores, y procedimientos almacenados:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug03.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;El ejemplo sigue algunos linemamientos de Patterns &amp;amp; Practices, de Microsoft, como tener separados Business Entities de Business Components. La solución tiene varios proyectos:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug04.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;WebClient es el sitio web. AjFirstExample.Services es una capa de servicios lógicos (no tecnológicos, como podría ser un Web Service), que es un .DLL que se invoca directamente de el sitio web. Es lo que en patrones llamamos una Service Layer. AjFirstExample.Entities contiene entidadas simples, con datos, sin conducta ni persistencia. Está muy orientada al ejemplo, que apenas es un CRUD (Create Read Update Delete) de entidades, fragmento:&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;Imports&lt;/span&gt; System.Collections.Generic&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;Imports&lt;/span&gt; AjFirstExample.Entities&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;Imports&lt;/span&gt; AjFirstExample.Business&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;&lt;span style="color:#0000ff;"&gt;Imports&lt;/span&gt; AjFramework.Data&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;&lt;span style="color:#0000ff;"&gt;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; SupplierService&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;Private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; mSupplierComponent &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SupplierComponent&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;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Insert(entity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier)&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;        mSupplierComponent.Insert(entity)&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;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Update(entity &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier)&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;        mSupplierComponent.Update(entity)&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;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Delete(id &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Integer&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;        mSupplierComponent.Delete(id)&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;Public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Shared&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Function&lt;/span&gt; GetById(id &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Integer&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; Supplier&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;return&lt;/span&gt; mSupplierComponent.GetById(id)&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; Function&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;AjFirstExample.BusinessComponents tiene lógica de validación antes de grabar o insertar una entidad, y AjFirstExample.Data termina encargándose de la persistencia, usando un DataService, que yo había codificado dentro de algo que uso en mis cursos, AjFramework.&lt;/p&gt;

&lt;p&gt;En las páginas web, es común conversar con el servicio, para tomar y enviar datos a ese proyecto:&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;Public&lt;/span&gt; Partial &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt; Admin_CustomersPage&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;Inherits&lt;/span&gt; System.Web.UI.Page&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;    &lt;span style="color:#0000ff;"&gt;Protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Sub&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; sender &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; System.&lt;span style="color:#0000ff;"&gt;Object&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;ByVal&lt;/span&gt; e &lt;span style="color:#0000ff;"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color:#0000ff;"&gt;Handles&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Me&lt;/span&gt;.Load&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;Put user code to initialize the page here&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;If&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Not&lt;/span&gt; IsPostBack &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;            gvwData.DataSource = CustomerService.GetList&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;            gvwData.DataBind()&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;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:#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;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: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;End&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;Class&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Este ejemplo lo tienen también en ese mismo .zip implementada en C#. Van a ver que ha sido generada directamente por AjGenesis, el generador de código que uso para armar gran parte de mis ejemplos y del desarrollo del día a día que emprendo:&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; File generated using 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; http://www.ajlopez.net/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; Open Source Code Generation Engine&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;&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;/div&gt;
&lt;/div&gt;

&lt;p&gt;Si tienen que cambiar el string de conexión, deben modificar el web.config del proyecto web, en el sector:&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;AjFramework&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;Parameters&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;Parameter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ConnectionString&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server=.\SQLEXPRESS;database=AjFirstExample;Integrated Security=true&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;Parameters&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;AjFramework&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;Hay otro ejemplo para bajarse e instalar de la misma manera:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjTest" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjTestDotNet.zip"&gt;AjTest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con las mismas ideas:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug05.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;pero con más entidades:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug06.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Cada departamento contiene empleados. Los proyectos contienen tareas, y las tareas se pueden asigna a empleados. Cada empleado tiene &amp;quot;Skills”, competencias, y cada competencia tiene empleados. Desde las páginas de administración, pueden ingresar los datos de estas entidades.&lt;/p&gt;

&lt;p&gt;Sin embargo, la relación entre estas entidades, no está en la entidad misma, sino en cómo recuperamos los datos necesarios desde el servicio. En vez de tener dentro de Department una lista de Employee, los empleados de un departamento se obtienen desde código, ejemplo:&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;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, System.EventArgs e)&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;/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;// Put user code to initialize the page here&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;if&lt;/span&gt; (!IsPostBack) {&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;        IdEntity = Convert.ToInt32(Request[&lt;span style="color:#006080;"&gt;&amp;quot;Id&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;        Entity = DepartmentService.GetById(IdEntity);&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;        dtgDataEmployees.DataSource = EmployeeService.GetByDepartmentEx(IdEntity);&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;           DataBind();&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;/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;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un ejemplo, donde usamos una base similar, pero en el código establecemos las relaciones, está en:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjTestCSharp3Linq.zip" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjTestCSharp3Linq.zip"&gt;AjTestCSharp3Linq.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acá usamos Linq2Sql&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug07.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;donde las entidades, generadas por el wizard de Linq2Sql, ya tienen las relaciones incorporadas. Entonces, una vez obtenido un Deparment, podemos pasar a Employees en una simple propiedad que tiene el objecto departamento:&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;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, System.EventArgs e)&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;/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;// Put user code to initialize the page here&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;if&lt;/span&gt; (!IsPostBack) {&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;        LinqDepartmentsService service = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; LinqDepartmentsService();&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;        IdEntity = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Guid(Request[&lt;span style="color:#006080;"&gt;&amp;quot;Id&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;        Entity = service.GetDepartment(IdEntity);&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;        dtgDataEmployees.DataSource = Entity.Employees;&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;           DataBind();&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;/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;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un último ejemplo más, para este post rápido:&lt;/p&gt;

&lt;p&gt;&lt;a title="AjFirstExampleWcfCSharp3.zip" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DotNet/AjFirstExampleWcfCSharp3.zip"&gt;AjFirstExampleWcfCSharp3.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este caso, seguimos usando Linq, lo que viaja a la presentación, son mensajes Windows Communication Foundation, hay un sitio web que expone servicios WCF, y de la parte del cliente, código de gateway para llegar a esos servicios:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/aspnetmug08.png" alt="" /&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;En vez de llegar a la presentación las entidades de .Data, de Linq, pasamos mensajes de Data Contract de WCF:&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;namespace&lt;/span&gt; AjFirstExample.Services.Contracts&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;/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;using&lt;/span&gt; System;&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;using&lt;/span&gt; System.Runtime.Serialization;&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;    [DataContract]&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Customer&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;/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;/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;        [DataMember]&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;public&lt;/span&gt; Guid Id { get; set; }&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;/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;        [DataMember]&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&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;/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;        [DataMember]&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Address { get; set; }&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;/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;        [DataMember]&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;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Notes { get; set; }&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;/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;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Bueno, espero que puedan sacar algo útil de estos ejemplo, vean también los archivos de ejemplos que fuimos desarrollando en cada clase.&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=1706460" 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/C+Sharp/default.aspx">C Sharp</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/VB.NET/default.aspx">VB.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>