<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez</title><link>http://msmvps.com/blogs/lopez/default.aspx</link><description>NET, Java, PHP y Desarrollo de Software</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Enlaces y noticias</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx</link><pubDate>Thu, 24 Jul 2008 11:48:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641989</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=1641989</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/24/enlaces-y-noticias.aspx#comments</comments><description>&lt;p&gt;Hay varios temas de los que quisiera bloguear más en detalle. Pero vaya hoy una lista de enlaces y comentarios cortos:&lt;/p&gt; &lt;p&gt;Primero de todo, tenemos nuevos Microsoft MVPs por aquí en Argentina, felicitaciones a &lt;a title="Rodolfo Finochietti" href="http://weblogs.shockbyte.com.ar/rodolfof/archive/2008/07/01/mvp-award-in-client-application-development.aspx"&gt;Rodolfo Finochietti&lt;/a&gt;, &lt;a title="archi" href="http://www.clariusconsulting.net/blogs/pga/archive/2008/07/01/77156.aspx"&gt;Pablo Galiano&lt;/a&gt;, y al pibe &lt;a href="http://blogs.southworks.net/mwoloski/2008/07/02/microsoft-mvp-award/" target="_blank"&gt;Matías Woloski&lt;/a&gt;. El bueno de Finochietti visita de vez en cuando este blog, y deja comentarios, por ejemplo, sobre programación funcional&amp;nbsp;y el lenguaje Cat. Tenemos varios intereses en común, como el estudio de lenguajes, compiladores, y compartimos la afición por la historia de las matemáticas. &lt;/p&gt; &lt;p&gt;Si se interesan en Smalltalk, es interesante &lt;a href="http://www.outbacksoftware.com/smalltalk/smalltalk.html" target="_blank"&gt;The Smalltalk programming language&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Gracias al bueno de Martin Salias, que me avisó de este texto en la web&amp;nbsp;&lt;a title="The Early History of Smalltalk" href="http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html"&gt;The Early History of Smalltalk&lt;/a&gt;&amp;nbsp;de Alan Kay (yo había anunciado una versión en PDF en &lt;a title="La historia de Smalltalk" href="http://msmvps.com/blogs/lopez/archive/2008/06/26/la-historia-de-smalltalk.aspx"&gt;La historia de Smalltalk&lt;/a&gt;). Es un &amp;quot;DEBESERLEIDO&amp;quot; por todo aquel que esté realmente interesado en la programación. Uno debe conocer la historia de las ideas, para realmente entender la situación actual tanto de ideas, como de tecnologías, y para tener un &amp;quot;grasp&amp;quot; de lo que podría venir.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.modumobile.com/#/modu_story/" target="_blank"&gt;Modu&lt;/a&gt;: gracias al twitter de &lt;a href="http://twitter.com/parancibia" target="_blank"&gt;@parancibia&lt;/a&gt;, vean este mobile modular. Muy interesante el concepto.&lt;/p&gt; &lt;p&gt;De vez en cuando, &lt;a href="http://www.directionsonmicrosoft.com/" target="_blank"&gt;Microsoft Directions&lt;/a&gt; publica un artículo público. Lean &lt;a href="http://www.directionsonmicrosoft.com/sample/DOMIS/update/2008/07jul/0708spsad.htm" target="_blank"&gt;Software Plus Services and Developers&lt;/a&gt;. ¿The next big thing?&lt;/p&gt; &lt;p&gt;Dentro del proyecto NHContrib, de herramientas para NHibernate, existe NHibernate.LINQ, que permite usar LINQ sobre NHibernate. Vean ahora lo que se hizo con Silverligh en &lt;a href="http://wildermuth.com/2008/07/20/Silverlight_2_NHibernate_LINQ_==_Sweet"&gt;Silverlight 2 + NHibernate.LINQ == Sweet&lt;/a&gt;&amp;nbsp;y el ejemplo de &lt;a title="nhibernat" href="http://www.silverlightdata.com/simple/nhibernate.aspx"&gt;nhibernate con Northwind&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para aprender NHibernate &lt;a title="NHibernate - Relational Persistence for Idiomatic .NET" href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/"&gt;NHibernate - Relational Persistence for Idiomatic .NET&lt;/a&gt;. Si quieren contribuir al proyecto &lt;a title="hibernate.org - Getting Started with the NHibernate Source Code" href="http://www.hibernate.org/428.html"&gt;hibernate.org - Getting Started with the NHibernate Source Code&lt;/a&gt;. Si tienen dudas, ver &lt;a href="http://groups.google.com/group/NHibernate-Hispano" target="_blank"&gt;la lista de NHibernate Hispano&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Siguiendo con LINQ, leo cómo usar un DataContext en memoria, esta vez desde ASP.NET MVC, en &lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/07/19/asp-net-mvc-tip-21-fake-the-data-context.aspx" target="_blank"&gt;ASP.NET MVC Tip #21 – Fake the Data Context&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Las aventuras de &lt;a href="http://www.hanselman.com/" target="_blank"&gt;Scott Hanselman&lt;/a&gt; para agregar un OpenSearch en sus páginas: &lt;a title="Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box" href="http://www.hanselman.com/blog/AddingOpenSearchToYourWebsiteAndGettingInTheBrowsersSearchBox.aspx"&gt;Adding OpenSearch to your website and getting in the Browser&amp;#39;s Search Box&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/stevecla01/" target="_blank"&gt;Steve Clayton&lt;/a&gt; está en Software + Services en Microsoft. Lean &lt;a href="http://blogs.msdn.com/stevecla01/archive/2008/07/21/my-us-tour-closes-out-with-ozzie.aspx" target="_blank"&gt;su encuentro con Ray Ozzie&lt;/a&gt;, no puede decir todo, pero S+S se viene cada vez más. El tiempo dirá qué será eso.&lt;/p&gt; &lt;p&gt;No llegué a tiempo para anunciarla. Diego Jancic realizó una encuesta en línea sobre cómo programamos. &lt;a href="http://blog.darioquintana.com.ar/2008/07/18/resultado-de-encuesta-como-programamos/" target="_blank"&gt;Vean los resultados&lt;/a&gt; en &lt;a href="http://blog.darioquintana.com.ar" target="_blank"&gt;el blog de Darío Quintana&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;El Composite Application Guidance para WPF tiene &lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx" target="_blank"&gt;su nueva página en MSDN&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/" target="_blank"&gt;Jeff Atwood&lt;/a&gt; tiene algunas ideas interesantes y discutibles sobre &lt;a href="http://www.codinghorror.com/blog/archives/001152.html" target="_blank"&gt;no normalizar base de datos&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.hanselman.com/blog/LearningOpportunityNETTerrariumIsBack.aspx" target="_blank"&gt;.NET Terrarium está de vuelta&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Me interesó el &lt;a href="http://jackrabbit.apache.org/jackrabbit-architecture.html" target="_blank"&gt;proyecto Jackrabbit&lt;/a&gt;, tengo que estudiar más en detalle la especificación Content Repository API de la &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr170/index.html" target="_blank"&gt;JSR-170&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blog.twitter.com/2008/07/finding-perfect-match.html" target="_blank"&gt;Twitter adquiriendo a Summize&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Y hay que visitar y usar&amp;nbsp;&lt;a href="http://www.emergingtechs.com/posts/15-online-tools-you-will-come-love-tech" target="_blank"&gt;10 herramientas para un tech&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Nuevo &lt;a href="http://blogs.msdn.com/gardel/" target="_blank"&gt;Blog de la comunidad MSDN en español&lt;/a&gt;. Gracias a &lt;a href="http://blogs.msdn.com/masaez/" target="_blank"&gt;Miguel Angel Saez&lt;/a&gt; por el aviso.&lt;/p&gt; &lt;p&gt;Si alguien necesita acá está: &lt;a href="http://www.theserverside.com/tt/articles/article.tss?l=FiniteStateMachinesPhyshunandSpring" target="_blank"&gt;Implementing Finite State Machines with Physhun and Spring&lt;/a&gt; (en Java)&lt;/p&gt; &lt;p&gt;Cada vez más lenguajes dinámicos sobre máquinas virtuales, ver &lt;a href="http://www.alittlemadness.com/2008/07/15/java-6-using-python-via-the-new-scripting-engine/" target="_blank"&gt;Java 6: Using Python via the new Scripting Engine&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Interesante código y artículo, sobre un tema que se necesita conocer: &lt;a href="http://www.codeproject.com/KB/aspnet/SingleSignon.aspx" target="_blank"&gt;Single Sign-on in ASP.NET and Other Platforms&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para entender la historia de MVC: &lt;a href="http://heim.ifi.uio.no/trygver/2003/javazone-jaoo/MVC_pattern.pdf" target="_blank"&gt;The Model-View-Controller, Its past and present&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Más sobre Model-View-Controller, Model-View-Presenter, y Presentation-Abstraction-Control en &lt;a href="http://ctrl-shift-b.blogspot.com/2007/08/interactive-application-architecture.html" target="_blank"&gt;Interactive Application Architecture Patterns&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;MVC en ASP.NET en &lt;a title="ASP.NET MVC - The Official Microsoft ASP.NET Site" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC - The Official Microsoft ASP.NET Site&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una interesante comparación de David Hayden&amp;nbsp;&lt;a href="http://www.pnpguidance.net/Post/ASPNETMVCFrameworkComparedWebClientSoftwareFactoryWCSF.aspx" target="_blank"&gt;ASP.NET MVC Framework Compared To Web Client Software Factory ( WCSF )&lt;/a&gt;&lt;/p&gt; &lt;p&gt;¿Necesitan un manejar un proyecto de software? No lo uso, vería el open source Trac Project, via web en Java (gracias a J. Franco, por este enlace). Al parecer, trabaja con &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;¿Necesitan open source en Java? De todo en &lt;a title="http://java-source.net/" href="http://java-source.net/"&gt;http://java-source.net/&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Off topic total: mi mejor post hasta ahora del 2008, con gráfica incluida, en &lt;a title="Posmopolitan" href="http://ajlopez.zoomblog.com/archivo/2008/07/08/posmopolitan.html"&gt;Posmopolitan&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;br /&gt;&lt;a title="http://friendfeed.com/ajlopez" href="http://friendfeed.com/ajlopez"&gt;http://friendfeed.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=1641989" 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/Smalltalk/default.aspx">Smalltalk</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/NHibernate/default.aspx">NHibernate</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Charla gratuita de Microsoft Robotics</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/18/charla-gratuita-de-microsoft-robotics.aspx</link><pubDate>Fri, 18 Jul 2008 18:23:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1641369</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=1641369</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/18/charla-gratuita-de-microsoft-robotics.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/roboticssim.png" align="left" alt="" /&gt; El&amp;nbsp;lunes 28 de Julio daré una charla gratuita en el &lt;a href="http://www.clubdeprogramadores.com/" target="_blank"&gt;Club de Programadores&lt;/a&gt;, sobre Microsoft Robotics, acá en Buenos Aires.&lt;/p&gt; &lt;p&gt;La idea es presentar la herramienta y su modelo de programación. Visitaremos el entorno de simulación, el manejo de robots simulados (que pueden reemplazarse por robots reales), el Visual Programming Language, y las librerías Decentrilized Software Services (DSS), y Concurrent and Coordination Runtime (CCR).&lt;/p&gt; &lt;p&gt;Más informes e inscripción a esta charla gratuita en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=458" href="http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=458"&gt;http://www.clubdeprogramadores.com/cursos/CursoMuestra.php?Id=458&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ya escribí algo sobre estos temas en este blog:&lt;/p&gt; &lt;p&gt;&lt;a title="Rob&amp;oacute;tica" href="http://msmvps.com/blogs/lopez/archive/tags/Rob_26002300_243_3B00_tica/default.aspx"&gt;Robótica&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Decentralized Software Services" href="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx"&gt;Decentralized Software Services&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Concurrency and Coordination Runtime" href="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx"&gt;Concurrency and Coordination Runtime&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/roboticsraf.png" align="left" alt="" /&gt; Presentaré algunos de los ejemplos que había usado en el último Microsoft Regional Architect Forum, en base a la presentación de &lt;a href="http://www.thearchitectexchange.com/" target="_blank"&gt;Arvindra Sehmi&lt;/a&gt;, y otros ejemplos adicionales.&lt;/p&gt; &lt;p&gt;Todo sobre Microsoft Robotics Developer Studio, desde&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/robotics"&gt;http://www.microsoft.com/robotics&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Concursos, desafíos, videos explicativos, desde el nuevo sitio de Robotics &lt;p&gt;&lt;a href="http://www.robochamps.com/"&gt;http://www.robochamps.com/&lt;/a&gt; &lt;p&gt;Enlaces que he coleccionado sobre estos temas en: &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/dss"&gt;http://del.icio.us/ajlopez/dss&lt;/a&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/ccr"&gt;http://del.icio.us/ajlopez/ccr&lt;/a&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/robotics"&gt;http://del.icio.us/ajlopez/robotics&lt;/a&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/msrs"&gt;http://del.icio.us/ajlopez/msrs&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1641369" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Rob_26002300_243_3B00_tica/default.aspx">Rob&amp;#243;tica</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx">Concurrency and Coordination Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx">Decentralized Software Services</category></item><item><title>AjTalk: un intérprete tipo Smalltalk</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/15/ajtalk-un-int-233-rprete-tipo-smalltalk.aspx</link><pubDate>Tue, 15 Jul 2008 09:18:24 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640872</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=1640872</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/15/ajtalk-un-int-233-rprete-tipo-smalltalk.aspx#comments</comments><description>&lt;p&gt;Hace unas semanas, estuve trabajando en mi proyecto de código abierto AjTalk, un intérprete tipo Smalltalk, escrito en .NET (con C#, para facilitar la migración a Mono, si alguien lo necesita), y ahora, quiero presentar el estado actual de ese trabajo. Desde los tempranos ochenta del siglo pasado, me ha interesado Smalltalk y siempre vuelvo al tema, aunque sólo en mi tiempo libre, no como desarrollador profesional.&amp;nbsp;No es la primera vez que escribo un intérprete de este tipo (el primero que escribí en aquellos años era muy simple: en C, sin recolector de basura,&amp;nbsp;interface solo texto), pero ahora quiero implementar uno más, esta vez más completo,&amp;nbsp;apoyándome en&amp;nbsp;la librería de clases .NET.&lt;/p&gt; &lt;p&gt;La versión actual es mínima, pero va tomando forma. La idea es tener objetos dinámicos, como en Smalltalk, y, en algún momento, agregarle el soporte de prototipos. Los objetos y el intérprete accederían a todo el framework .NET y otras librerías. Tengo la experiencia previa de haber logrado eso en mi intérprete AjBasic, que uso en mi proyecto de generación de código&amp;nbsp;&lt;a href="http://www.ajlopez.com/ajgenesis" target="_blank"&gt;AjGenesis&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;La versión inicial de AjTalk está publicada en Google Code:&lt;/p&gt; &lt;p&gt;&lt;a title="http://code.google.com/p/ajtalk/" href="http://code.google.com/p/ajtalk/"&gt;http://code.google.com/p/ajtalk/&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajtalk01.png" alt="" /&gt; &lt;/p&gt; &lt;h3&gt;La solución&lt;/h3&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/ajtalk02.png" align="left" alt="" /&gt;&amp;nbsp;Estoy usando Visual Studio 2005 Professional. La solución contiene cuatro proyectos. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjTalk&lt;/strong&gt; es el proyecto principal, una librería de clases conteniendo el núcleo del sistema. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjTalk.Test01&lt;/strong&gt; y &lt;strong&gt;AjTalk.Test02&lt;/strong&gt; son aplicaciones de consola, para usar en pruebas manuales. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;AjTalk.Tests&lt;/strong&gt; contiene los unit tests, escritos usando NUnit framework 2.2.8.&lt;/p&gt; &lt;p&gt;Mucho del sistema núcleo consiste en interfaces,&amp;nbsp;que definen&amp;nbsp;las conductas de base, y clases implementando esas interfaces.&lt;/p&gt; &lt;h3&gt;El objeto&lt;/h3&gt; &lt;p&gt;El proyecto contiene una interface para representar cualquier objeto:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5bc3d2fe-f4f7-427a-b6e9-b34b32ff74b2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjTalk
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#000000;"&gt; IObject
    {
        IClass Class { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; n] { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;;}
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; SendMessage(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; msgname, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; [] args);
    }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Podría hacer que un mensaje sea un objeto (del tipo Message), pero por ahora, el mensaje es sólo un nombre y un arreglo de argumentos.&lt;/p&gt;
&lt;p&gt;El índice this[int n] accesde a las variables de instancia. Cada valor en AjTalk puede apuntar a cualquier objeto .NET, no solamente a objetos que implementen IObject. De esta forma, puedo manejar int, long, String, DataSet, desde objetos IObject.&lt;/p&gt;
&lt;h3&gt;La clase&lt;/h3&gt;
&lt;p&gt;Estoy implementando una interface simple IClass, sin distinción entre clase, behavior, y otras clases, como sería en el Smalltalk clásico. Separaré esas clases en una futura versión, cuando llegue a ser necesario. Por ahora, estoy manejando sólo una interface:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a3e6608b-9e4a-4b91-8364-c7fc6cac48f7" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Collections.Generic;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjTalk
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#000000;"&gt; IClass : IObject
    {
        IClass SuperClass { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; DefineClassMethod(IMethod method);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; DefineInstanceMethod(IMethod method);

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; DefineClassVariable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; varname);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; DefineInstanceVariable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; varname);

        IObject NewObject();

        IMethod GetClassMethod(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; mthname);
        IMethod GetInstanceMethod(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; mthname);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetClassVariableOffset(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; varname);
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetInstanceVariableOffset(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; varname);
    }
}

&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Hay un diccionaro para los métodos de clase y otro para los de instancia, y listas de variables de instancia y de clase. No soporta todavía variables indexadas. La interface IClass está implementada en la clase BaseClass.&lt;/p&gt;
&lt;h3&gt;El método&lt;/h3&gt;
&lt;p&gt;Hay una interface IMethod:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1b757bb6-5b53-4539-b287-89d20a75c635" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;using&lt;/span&gt;&lt;span style="color:#000000;"&gt; System;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjTalk
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color:#000000;"&gt; IMethod
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Name { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        IClass Class { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Execute(IObject receiver, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; [] args);        
    }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;La clase concreta Método implementa esa interfaces. Su método Execute tiene:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ab303446-f55f-4690-8722-afce0f37c90c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Execute(IObject receiver, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] args)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; ExecutionBlock(receiver,receiver,&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;,args)).Execute();
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Los Execution blocks tienen variables locales y argumentos. El Execute de un bloque de ejecución toma instrucciones (bytecodes) desde métodos &amp;quot;compilados&amp;quot;, y los ejecuta. Aquí, me aparto de nuevo de Smalltalk original: acá el bloque de ejecución no es un objeto AjTalk. De esta forma, yo puedo ejecutar este intérprete sin necesidad de implementar gran cantidad de clases de base. Tengo que investigar las ventajas y problemas que esta decisión podría tener sobre el diseño e implementación de esta solución.&lt;/p&gt;
&lt;h3&gt;Los bytecodes&lt;/h3&gt;
&lt;p&gt;Tengo que meditar sobre usar un árbol de objetos (como en el patrón Interpreter) o bytecodes. En esta versión, uso bytecodes. Son las instrucciones básicas que mi &amp;quot;máquina virtul&amp;quot; entiende y ejecuta paso a paso.&lt;/p&gt;
&lt;p&gt;Esta es su enumeración:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:67906d46-f8c9-4bd2-ab64-5db089eea219" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color:#000000;"&gt; AjTalk
{
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteCode : &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;byte&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    {
        Nop &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetVariable &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        SetVariable &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetArgument &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        SetArgument &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetConstant &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetLocal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;6&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        SetLocal &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetClassVariable &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;8&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        SetClassVariable &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;9&lt;/span&gt;&lt;span style="color:#000000;"&gt;,

        GetSelf &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;20&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetClass &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;21&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        GetSuperClass &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;22&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        NewObject &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;23&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Pop &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;24&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        ReturnSub &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;25&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        ReturnPop &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;26&lt;/span&gt;&lt;span style="color:#000000;"&gt;,

        Add &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;40&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Substract &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;41&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Multiply &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;42&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Divide &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;43&lt;/span&gt;&lt;span style="color:#000000;"&gt;,

        Send &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;50&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Los bytecodes contenidos en un método, son interpretados y ejecutados en un Execution Blog. Un fragmento de ese código:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:773713c4-82fc-4a18-b22d-9ce07963ecb1" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ip &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; method.ByteCodes.Length) 
    {
        ByteCode bc &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ByteCode) method.ByteCodes&lt;img src="http://msmvps.com/emoticons/emotion-59.gif" alt="Paradise" /&gt;;
        Byte arg;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;switch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (bc) 
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteCode.ReturnSub:
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteCode.ReturnPop:
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Top;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteCode.GetConstant:
                ip&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
                arg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; method.ByteCodes&lt;img src="http://msmvps.com/emoticons/emotion-59.gif" alt="Paradise" /&gt;;
                Push(method.GetConstant(arg));
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; ByteCode.GetArgument:
                ip&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
                arg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; method.ByteCodes&lt;img src="http://msmvps.com/emoticons/emotion-59.gif" alt="Paradise" /&gt;;
                Push(arguments[arg]);
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
....&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Todo con Test&lt;/h3&gt;
&lt;p&gt;El código inicial había sido escrito en VB.NET. El año pasado lo comencé a pasar a C#. Este año cambié a modo &amp;quot;TDD&amp;quot;, tarde pero seguro, y agregué varios tests para el NUnit:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajtalktests.png" alt="" /&gt; &lt;/p&gt;
&lt;h3&gt;Bootstraping&lt;/h3&gt;
&lt;p&gt;Uso un archivo de texto, con un formato ad&amp;#39;hoc, para inyectar las definiciones iniciales de clases y objetos. Ahora, en el proyectos AjTest.Test02, hay un ejemplo de ese formato en el archivo Definitions.txt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;class Point&lt;br /&gt;variables x y &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;method&lt;br /&gt;x ^x. &lt;/font&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;method&lt;br /&gt;y ^y. &lt;/font&gt;
&lt;p&gt;&lt;font face="Consolas"&gt;class Rectangle&lt;br /&gt;variables point1 point2&lt;br /&gt;class Square Rectangle &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;Próximos pasos&lt;/h3&gt;
&lt;p&gt;Hay una pila de trabajo pendiente:&lt;/p&gt;
&lt;p&gt;- Completar la jerarquía de clases base (Behavior, Class, ....)&lt;/p&gt;
&lt;p&gt;- Implementar más bytecodes&lt;/p&gt;
&lt;p&gt;- Soporte de variables locales en métodos&lt;/p&gt;
&lt;p&gt;- Un archivo de text estándard&lt;/p&gt;
&lt;p&gt;- Acceso a objetos .NET nativos&lt;/p&gt;
&lt;p&gt;- Usar AjTalk desde aplicaciones .NET (no veo necesario entonces implementar una interface de ventanas en AjTalk, solamente consumirlo adecuadamente desde cualquier aplicación .NET)&lt;/p&gt;
&lt;p&gt;- Definir las clases y métodos para una implementación mínima&lt;/p&gt;
&lt;p&gt;- Serialización/deserialización de la imagen en memoria&lt;/p&gt;
&lt;p&gt;- Soporte de agregado de variables en una clase que ya tenga instancias creadas (puede ser un tema difícil)&lt;/p&gt;
&lt;p&gt;- Soporte de become: (el problema de todo intérprete)&lt;/p&gt;
&lt;p&gt;- Y mil más....&lt;/p&gt;
&lt;p&gt;Pero tengo confianza en la forma que va tomando el proyecto. Estoy aplicando &amp;quot;baby steps&amp;quot;, para mejorar el código de base y su funcionalidad. &lt;/p&gt;
&lt;p&gt;Este artículo en Anglish (Angel&amp;#39;s English):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2008/07/14/ajtalk-a-smalltalk-like-interpreter/"&gt;AjTalk: a Smalltalk-like&amp;nbsp;interpreter &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640872" 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/Smalltalk/default.aspx">Smalltalk</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/C+Sharp/default.aspx">C Sharp</category></item><item><title>Kill -9</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/10/kill-9.aspx</link><pubDate>Thu, 10 Jul 2008 09:36:25 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640154</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=1640154</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/10/kill-9.aspx#comments</comments><description>&lt;p&gt;Sigo volviendo la mirada atrás, como en &lt;a href="http://msmvps.com/blogs/lopez/archive/2008/07/04/el-origen-de-mi-nickname.aspx"&gt;El origen de mi nickname&lt;/a&gt;. Recuerdo hace ya más de dos décadas atrás, mis primeros pasos con un Xenix de Microsoft y un AIX (creo que se llamaba así el sistema que usuaba, hubo varios flavors y versiones) de IBM. Luego de CP/M y DOS y el Job Control Language de los mainframe de IBM, el shell de línea de comando era toda una herramienta (lo que son las cosas, esta semana me encuentra programando en PowerShell, una especie de tataranieto de eso). Recuerdo los ps y ls y los pipes, los apóstrofes invertidos, las discusiones sobre qué shell usar, desde la csh hasta la bourne. No había threads en esos años, todo procesos, y comunicación entre procesos, como habían imaginado Ken Thompson y compañía en los comienzos del Unix (recordemos, inspirado en parte, en los trabajos de Fano con el Multics). Tantos fork descontrolados, éramos tan jóvenes... ;-)... Y por supuesto, el kill. En una lista privada, el bueno de Daniel V envía este video:&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hk9NxydtPOU"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hk9NxydtPOU" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;Parece que es Stanford University, parte de un documental del estilo de vida de esta gente.&lt;/p&gt; &lt;p&gt;Otros videos:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/06/30/el-primer-usuario.aspx"&gt;El primer usuario&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/11/09/un-cl-225-sico-windows-share-your-pain.aspx"&gt;Un clásico: Windows Share Your Pain&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2007/02/19/videos-para-programadores.aspx"&gt;Videos para programadores&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640154" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Video/default.aspx">Video</category></item><item><title>Levantando catedrales</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/07/levantando-catedrales.aspx</link><pubDate>Mon, 07 Jul 2008 09:05:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639609</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=1639609</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/07/levantando-catedrales.aspx#comments</comments><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/pragprog.png" align="left" alt="" /&gt; Hace un tiempo escribí sobre&amp;nbsp;el libro &lt;a href="http://www.pragmaticprogrammer.com/" target="_blank"&gt;The Pragmatic Programmer&lt;/a&gt; en:&lt;/p&gt; &lt;p&gt;&lt;a title="Un programador pragm&amp;aacute;tico" href="http://msmvps.com/blogs/lopez/archive/2007/06/05/un-programador-pragm-225-tico.aspx"&gt;Un programador pragmático&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Los autores enumeran a lo largo del libro &amp;quot;tips&amp;quot;, que van comentando y explicando en el contexto de otros temas. Visitemos hoy el primero. El Tip 1 es&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Care About your Craft&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Como desarrolladores de software, tenemos que tomar la responsabilidad de la calidad de nuestro trabajo. A veces, no están dadas todas las circunstancias para que podamos dedicar todo el esfuerzo a eso. Pero deberíamos buscar la forma.&lt;/p&gt; &lt;p&gt;Algunos piensan que el desarrollo de software es sólo ingeniería, que hay un proceso a seguir, y que simplemente hace falta poner a la gente a seguir el proceso, y voila! Cualquiera que haya dirigido un proyecto de software sabe que eso no es cierto. También veo tantos avisos pidiendo gente que conozca de tal tecnología o de tal otra, en vez de buscar gente que realmente quiera hacer las cosas bien.&lt;/p&gt; &lt;p&gt;Es importante que la gente que forme el equipo sean gente a la que le importe lo produce. Pensemos en las catedrales europeas, construidas en la Edad Media. Tomó miles de años-hombres construirlas, a lo largo de décadas de trabajo, entre varios oficios. No había Microsoft Project y nada por el estilo para organizar semejante trabajo. Una generación seguía a la otra, y aún se seguía construyendo. Pero, como dice el libro, aquellos que cortaban piedras, hacían algo más que eso. Recordemos una historia (versión en español de Enrique Zamorano, en su libro &amp;quot;Las causas del fracaso de las empresas&amp;quot;):&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Tres canteros al pie de una catedral, que están haciendo el mismo trabajo: tallar piedras. &lt;p&gt;Un hombre se acerca al primero y le dice “¿Qué haces?” &lt;p&gt;El cantero le dice: “Tallo piedras” y la hosquedad de su mirada parece que añade: “¿No lo está viendo?” &lt;p&gt;El segundo responde diciendo: “Me gano la vida” y con su gesto de resignación parece añadir: “Es duro, ¿sabe usted?” &lt;p&gt;El tercer cantero, al escuchar la pregunta, levanta la cabeza, mira a lo alto, le brillan los ojos y dice: “Estoy construyendo una catedral”&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Como dice el libro &amp;quot;&lt;a href="http://www.jimcollins.com/lib/books.html" target="_blank"&gt;From Good to Great&lt;/a&gt;&amp;quot;, lo importante es tener la gente correcta, despues podemos construir lo que queramos: &amp;quot;&lt;a href="http://www.jimcollins.com/lab/firstWho/index.html" target="_blank"&gt;Right People First&lt;/a&gt;&amp;quot;. Esto se aplica aún más en los equipos ágiles: cuando tenemos un equipo de gente orgullosa de lo que está haciendo, sea un simple ejemplo, o la próxima &amp;quot;Big Thing&amp;quot; de la web, es cuando más brilla lo ágil. &lt;p&gt;Asegurémonos de formar un equipo, donde todos los que cortan piedras, vean una catedral. &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639609" width="1" height="1"&gt;</description><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></item><item><title>El origen de mi nickname</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/04/el-origen-de-mi-nickname.aspx</link><pubDate>Fri, 04 Jul 2008 19:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639393</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=1639393</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/04/el-origen-de-mi-nickname.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://www.ajlopez.net/images/ajlopez2.gif" align="left" alt="" /&gt; Este año cumplo treinta años con el desarrollo de software, así espero me permitan algunos posts nostálgicos, y algo personales. Hoy me da pie a escribir este post, una pregunta que me hicieron: ¿cómo surgió lo de Angel &amp;quot;Java&amp;quot; Lopez? ¿y por qué &amp;quot;ajlopez&amp;quot;?&lt;/p&gt; &lt;p&gt;Es simple. En los noventa, yo no tenía teléfono (en general no lo uso) en casa. Pero veía que cada vez más aparecían BBS. Mi primera visión de un modem fue en alguna Byte de los ochenta, y en el clásico film &amp;quot;Juegos de Guerra&amp;quot; (que habré visto varios veces en el mismo día). Así que comencé a comprar Boardwatch, contraté un teléfono para mi cubil, alguna placa o algo así para mi PC, y me sumergí en el mundo de los BBS. Recuerdo la FidoNet de aquel entonces. ¿Recuerdan los ASCII art de presentación? ¿Y el ruido del modem conectando? Eramos tan pobres... .;-)&lt;/p&gt; &lt;p&gt;El BBS más popular de aquel entonces para el tema de programación, por aquí en Argentina,&amp;nbsp;resultó ser el de MP Ediciones. ¿Cómo se llamaba? ¿Feedback? Ya no recuerdo. La cuestión que para inscribirme tuve que ir a la editorial misma, en la calle Moreno, acá en Buenos Aires. Me preguntaron el nombre completo, y en aquel entonces, habituaban a poner como nick las iniciales y el apellido del usuario. Así quedó mi código de usuario: ajlopez.&lt;/p&gt; &lt;p&gt;En ese BBS, en 95/96, participaba yo en foros de programación, en general. Yo estaba viendo y estudiando Java, que acababa de aparecer. Para mí, Java fue un avance: un lenguaje que llevaba garbage collector y una librería de clases para las masas. Le faltaba un golpe de horno (AWT era para mí Asqueroso Windows Toolkit...;-), pero pintaba interesante.&lt;/p&gt; &lt;p&gt;De tanto predicar sobre Java en el BBS de MP Ediciones, y al ser firmar como ajlopez, Angel J Lopez, el bueno de Sebastián Barraza, otro usuario activo del BBS, me bautizó Angel &amp;quot;Java&amp;quot; Lopez.&lt;/p&gt; &lt;p&gt;De ahí el origen de ese nick más completo.&lt;/p&gt; &lt;p&gt;A partir de la actividad de MP Ediciones, se formó el Club Byte, que en algun momento se escindió, y se formó el Microsoft User Group, que ya va para los 13 años de existencia, creo.&lt;/p&gt; &lt;p&gt;¿Tienen algún recuerdo de esos tiempos?&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639393" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Historia+de+la+Computaci_26002300_243_3B00_n/default.aspx">Historia de la Computaci&amp;#243;n</category></item><item><title>Explicando Scrum</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/03/explicando-scrum.aspx</link><pubDate>Thu, 03 Jul 2008 18:23:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639265</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=1639265</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/03/explicando-scrum.aspx#comments</comments><description>&lt;p&gt;Gracias al Microsoft User Group de Argentina, ayer dí una charla sobre Scrum, explicando cómo funciona, y algunas experiencias que he tenido en diversos proyectos desde finales de 2006.&lt;/p&gt; &lt;p&gt;Para mí fue interesante poder exponer algunos temas que quería compartir, y bajarlos a la tierra, para que se entienda bien hacia donde va Scrum, y para que sirve. Dejo la presentación en mi Skydrive:&lt;/p&gt; &lt;p&gt;&lt;a title="Scrum200801.ppt" href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Presentations/Scrum200801.ppt"&gt;Scrum200801.ppt&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.implementingscrum.com/images/060911-scrumtoon-spanish.jpg" alt="" /&gt; &lt;/p&gt; &lt;p align="center"&gt;Fuente: &lt;a href="http://www.implementingscrum.com"&gt;http://www.implementingscrum.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Dentro de dos semanas, espero dictar un curso práctico, donde los asistentes se dividiran en grupos, para trabajar a la Scrum:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mug.org.ar/Eventos/3049.aspx" target="_blank"&gt;Práctica de Scrum&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Algunos enlaces y recursos adicionales:&lt;/p&gt; &lt;p&gt;&lt;a title="http://agilethinking.net/" href="http://agilethinking.net/"&gt;http://agilethinking.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;El sitio de Tobias Meyer, que me inició en el ScrumMastering en el 2006.&lt;/p&gt; &lt;p&gt;&lt;a title="http://agilemanifesto.org/" href="http://agilemanifesto.org/"&gt;http://agilemanifesto.org/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Manifesto for Agile Software Development&lt;/p&gt; &lt;p&gt;&lt;u&gt;&lt;a href="http://softwareagil.blogspot.com"&gt;http://softwareagil.blogspot.com&lt;/a&gt;&lt;/u&gt; &lt;p&gt;El blog de Juan Gabardini, dedicado a Software Agil, en especial Scrum &lt;p&gt;&lt;a title="&amp;Aacute;giles 2008" href="http://agiles2008.org/"&gt;Ágiles 2008&lt;/a&gt; &lt;p&gt;Se vienen las jornadas Agiles 2008, acá en Buenos Aires, Argentina. &lt;p&gt;&lt;a href="http://www.implementingscrum.com/"&gt;http://www.implementingscrum.com/&lt;/a&gt; &lt;p&gt;Sitio donde encontraran la clásica historia: &lt;p&gt;&lt;a href="http://www.implementingscrum.com/blog/2006/09/11/the-classic-story-of-the-pig-and-chicken" target="_blank"&gt;The classic story of the pig and chicken&lt;/a&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;El libro que me sirvió de base para esta presentación&lt;/p&gt; &lt;p&gt;&lt;a&gt;Agile Project Management with Scrum&lt;/a&gt;  &lt;p&gt;by&amp;nbsp;Ken Schwaber&lt;br /&gt;ISBN:073561993x  &lt;p&gt;Microsoft Press © 2004  &lt;p&gt;De este libro he tomado estos recursos:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;i&gt;Agile Software Development with Scrum&lt;/i&gt;, Ken Schwaber and Mike Beedle (Prentice Hall, 2001) &lt;p&gt;Teoría y práctica de Scrum. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a href="http://www.controlchaos.com/"&gt;www.controlchaos.com/&lt;/a&gt;&lt;/i&gt; &lt;p&gt;El sitio de Ken Schwaber sobre Scrum. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a title="http://www.jeffsutherland.com/" href="http://www.jeffsutherland.com/"&gt;http://www.jeffsutherland.com/&lt;/a&gt;&lt;/i&gt; &lt;p&gt;Jeff Sutherland tiene contenido relacionado con desarrollo de software, programación, tecnología, objetos, componentes y Scrum. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a href="http://www.mountaingoatsoftware.com/scrum/"&gt;www.mountaingoatsoftware.com/scrum/&lt;/a&gt; &lt;/i&gt; &lt;p&gt;El sitio de Mike Cohn sobre Scrum. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a href="http://www.scrumalliance.org"&gt;www.scrumalliance.org&lt;/a&gt;&lt;/i&gt; &lt;p&gt;El hogar de los&amp;nbsp;ScrumMaster certificados. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a href="http://www.agilealliance.org"&gt;www.agilealliance.org&lt;/a&gt;&lt;/i&gt; &lt;p&gt;El sitio de la&amp;nbsp;AgileAlliance, con recursos sobre Agile y Scrum. &lt;p&gt;&lt;i&gt;&lt;/i&gt;&amp;nbsp; &lt;p&gt;&lt;a title="http://groups.yahoo.com/group/scrumdevelopment/" href="http://groups.yahoo.com/group/scrumdevelopment/"&gt;http://groups.yahoo.com/group/scrumdevelopment/&lt;/a&gt; &lt;p&gt;El grupo de discusión de Scrum, con años de existencia. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;&lt;a href="http://www.xprogramming.com"&gt;www.xprogramming.com&lt;/a&gt;&lt;/i&gt; &lt;p&gt;El sitio de Ron Jeffries acerca de&amp;nbsp;Extreme Programming (XP). XP provee varias de las prácticas que Scrum implementa para asegurar el incremento de funcionalidad potencialmente entregable. &lt;p&gt;&lt;i&gt;&lt;a&gt;&lt;/a&gt;&lt;/i&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;Process Dynamics, Modeling, and Control&lt;/i&gt;, Babatunde A. Ogunnaike and W. Harmon Ray (Oxford University Press, 1994) &lt;p&gt;La teoría que subyace a Scrum. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;The Alphabet Versus the Goddess&lt;/i&gt;, Leonard Shlain (Viking Penguin, 1998) &lt;p&gt;El conflicto entre las palabras y la imagen. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;Wicked Problems, Righteous Solutions&lt;/i&gt;, Peter Degrace and Leslie Hulet Stahl (Yourdon Press, 1990) &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;A Universe of Consciousness&lt;/i&gt;, Gerald Edelman (Basic Books, 2000) &lt;p&gt;Por qué es tan difícil pasar de requerimientos a código. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;Managing the Unknowable&lt;/i&gt;, Ralph D. Stacey (Josey-Bass, 1992) &lt;p&gt;Explicando las dificultades del manejo de la complejidad. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;Complexity and Emergence in Organisations&lt;/i&gt;, Ralph D. Stacey (Routledge, 2000) &lt;p&gt;Una crítica de cómo la teoría de la complejidad ha sido aplicada para entender organizaciones y marcar nuevas direcciones. Este libro promueve un reexamen radical del pensamiento gerencial. &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;i&gt;Artful Making&lt;/i&gt;, Rob Austin and Lee Devin (Prentice Hall, 2003) &lt;p&gt;Como manejar el trabajo creativo, adaptado del teatro.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp; &lt;p&gt;Dejo más enlaces que colleciono en &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/scrum"&gt;http://del.icio.us/ajlopez/scrum&lt;/a&gt; &lt;p&gt;&lt;a href="http://del.icio.us/ajlopez/agile"&gt;http://del.icio.us/ajlopez/agile&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639265" width="1" height="1"&gt;</description><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></item><item><title>Esos raros lenguajes nuevos: aprendiendo Python</title><link>http://msmvps.com/blogs/lopez/archive/2008/07/02/esos-raros-lenguajes-nuevos-aprendiendo-python.aspx</link><pubDate>Wed, 02 Jul 2008 17:06:55 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639137</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=1639137</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/07/02/esos-raros-lenguajes-nuevos-aprendiendo-python.aspx#comments</comments><description>&lt;p&gt;En mi post del domingo pasado&lt;/p&gt; &lt;p&gt;&lt;a title="Tato Bores y el desarrollo de software" href="http://msmvps.com/blogs/lopez/archive/2008/06/29/tato-bores-y-el-desarrollo-de-software.aspx"&gt;Tato Bores y el desarrollo de software&lt;/a&gt;&lt;/p&gt; &lt;p&gt;no incluí a nadie de Python. Bueno, ya voy a agregar algo y de otros lenguajes y tecnologías. La semana pasada, el bueno de Daniel Ajoy pasó esta información en una lista dedicada al lenguaje Logo:&lt;/p&gt; &lt;p&gt;Inventa tu propio juego en Python&lt;/p&gt; &lt;p&gt;&lt;a title="http://pythonbook.coffeeghost.net/" href="http://pythonbook.coffeeghost.net/"&gt;http://pythonbook.coffeeghost.net/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://pythonbook.coffeeghost.net/book1/images/cover_thumb.png" align="left" alt="" /&gt; Según el autor Al Sweigart:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;quot;Invent Your Own Computer Games with Python&amp;quot; is a free e-Book that teaches you how to program in the Python programming language. Each chapter gives you the source code for a new game, along with an explanation of how each line works.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;IYOCGwP (&amp;quot;eye-yawk-gwip&amp;quot;) is designed to be understandable by 9 to 12 year olds, although teenagers and adults with no previous programming experience can use it to teach themselves programming as well. &lt;p&gt;Se puede bajar en PDF o verlo en línea como HTML. Todavía no lo leí completo, pero por el vistazo que le di, parece interesante para comenzar a programar. Muchas veces me pregunta gente que no es &amp;quot;del gremio&amp;quot; cómo comenzar a programar. El lenguaje Python (bastante poderoso, ver también Ruby) puede ser usado a un nivel básico, sin necesidad de tener que aprender una sintaxis muy complicada. Con la llegada de estos lenguajes a las máquinas virtuales de Java y .NET, tenemos todavía más uso para estos &amp;quot;nuevos lenguajes&amp;quot;, que igualmente tienen años de desarrollo. &lt;p&gt;Hoy, ya no somos &amp;quot;programadores del lenguaje X&amp;quot;. Somos desarrolladores de software, con conocimientos de arquitectura, ingeniería de software, manejo de equipo, comunicación interpersonal, y actitudes ágiles. Aprender un lenguaje nuevo nos entrena la neurona y nos abre a nuevas perspectivas. &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639137" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Libros/default.aspx">Libros</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Tato Bores y el desarrollo de software</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/29/tato-bores-y-el-desarrollo-de-software.aspx</link><pubDate>Sun, 29 Jun 2008 15:26:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1638790</guid><dc:creator>lopez</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1638790</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/29/tato-bores-y-el-desarrollo-de-software.aspx#comments</comments><description>&lt;p&gt;Permítaseme esta vez escribir una visita ficticia del personaje de Tato Bores (para quienes no lo conocen, alguna información al final), a un supuesto Ministerio de Software recién creado en Argentina:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Andaba por la Plaza de Mayo, cuando decidí dirigirme al Ministerio de Software. Ahí me atreví a preguntar por qué tanto problema para crear software.&lt;/p&gt; &lt;p&gt;¡Eso pasa por que abandonaron el camino y no se escribe en C!, gritó José LenguajeC, mientras escribía una nueva versión del Hello World de Kernighan y Ritchie, y trataba de depurar un programa que manejaba punteros y malloc, sin free.&lt;/p&gt; &lt;p&gt;¡Mentira!, exclamó José C++. Gracias a que aparecí yo pudieron comenzar a aplicar clases y objetos.&lt;/p&gt; &lt;p&gt;¡Uds dos no saben nada! confunden clase con tipo, y cuándo un int fue un objeto?, desgañitó Jose Smalltalk, mientras trataba de hacer un formulario de ingresos de datos con primitivas de Squeak. Nosotros fuimos los que inventamos todo.&lt;/p&gt; &lt;p&gt;¡No, nosotros fuimos los primeros! ¡Vuelvan a&amp;nbsp;las fuentes! se escuchó fuerte decir a José COBOL, mientras escribía páginas y páginas de Data Division.&lt;/p&gt; &lt;p&gt;¡Las fuentes las pelotas! Usen lo nuevo que somos nosotros, decía José Ruby, mientras trataba de explicar porqué usar @ y @@ para acceder a variables es bonito.&lt;/p&gt; &lt;p&gt;¡No saben lo que dicen! Denme tiempo y creo cualquier sistema, decía José RedNeuronal, mientras se entrenaba a sí mismo reconociendo videos de Wanda Nara.&lt;/p&gt; &lt;p&gt;¡Qué tiempo ni que tiempo! ¡Persistencia ahora para todo el mundo!, armaba lío José NHibernate, que se tiró a dormir porque tenía el atributo de lazy en true.&lt;/p&gt; &lt;p&gt;¡Copiones! Persistencia eran las de antes,&amp;nbsp;vociferaba José Hibernate, mientras escribía 20 capítulos de mejores prácticas de manejar la sesión, y trataba de explicarle a un DBA por qué las Stored Procedures eran obra del diablo.&lt;/p&gt; &lt;p&gt;¡Vuelvan a las bases! proclamaba José Oracle, mientras escribía toda la lógica en paquetes de procedimientos almacenados.&lt;/p&gt; &lt;p&gt;¡Sacrilegio! le recriminaba José DDD, mientras se entablaba en una dicusión interminable consigo mismo sobre si poner acceso a los repositorios desde las entidades, se lo vió hablar solo por horas.&lt;/p&gt; &lt;p&gt;¡Dejá de decir pavadas! le espetó José DataSet, mientras trataba de dominar una grilla con edición y paginado, y miraba con ganas a Josefina Linq, que como era nuevita en el grupo, todavía no se atrevía a decir nada.&lt;/p&gt; &lt;p&gt;¡No la compliquen tanto! ¡Yo la hago fácil! decía José PHP, mientras creaba sitios con cuarenta includes uno dentro del otro, pero que soportaban 40 idiomas, lunfardo incluido.&lt;/p&gt; &lt;p&gt;¡Pero callate! A ver si te armás una aplicación empresarial como la gente, decía José J2EE, mientras trataba de ocultar a todos que tenía algo de EJB en la aplicación que estaba armando.&lt;/p&gt; &lt;p&gt;¡Aplicaciones empresariales son las nuestras! bramaba José CSharp, mientras trataba de mandar un mensaje WCF con WsHttpBinding que ocupara menos de un mega.&lt;/p&gt; &lt;p&gt;¡Callénse, cipayos! ¡Ututo o muerte! pataléo José Ututo, mientras estrangulaba a un fan de Tuquito (ambas distros de Linux argentinas)&lt;/p&gt; &lt;p&gt;¡Dejen de programar! Usen nuestra API, proclamó José Facebook mientras publicaba una nueva encuesta&amp;nbsp;aplicación del estilo&amp;nbsp;&amp;quot;Qué tipo de árbol bonsai eres&amp;quot;.&lt;/p&gt; &lt;p&gt;¡No! ¡Vengan a programar para nosotros! A ver si arreglan el lío que tenemos,&amp;nbsp;suplicaba a tres voces José Twitter, que desde hacía media hora estaba dándole al F5 del browser, a ver si reaparecía su página.&lt;/p&gt; &lt;p&gt;¡No saben ni de qué estan hablando! La programación no es nada, exclamaba José PatrónUML, mientras dibujaba en su Enterprise Architect diagramas y más diagramas de secuencia.&lt;/p&gt; &lt;p&gt;¡Callate! Menos dibujos y más entregables ¡A ver sí hacemos algo hoy mismo! se enojaba José Agil, mientras trataba de hacer pair programming con la secretaria del ministro.&lt;/p&gt; &lt;p&gt;¡Inútiles! Siempre se me van de presupuesto, exclamabla José ProgramManager, mientras abría en su notebook la última versión de Microsoft Project, que le calculaba sin ninguna sombra de duda, qué debería haber pasado en el desarrollo de su proyecto.&lt;/p&gt; &lt;p&gt;¡Guardá eso, y ponete a trabajar! gritaba José Customer, que no entendía por qué si él había pedido un sistema de CRM, le entregaban una lista de contactos en el Outlook.&lt;/p&gt; &lt;p&gt;¡Muerte al new! ¡Ese tiene toda la culpa! comenzaron a corear José SpringFramework (los dos, el de Java y el de .NET), mientras se inyectaban dependencias uno al otro.&lt;/p&gt; &lt;p&gt;¡Lo que pasan es que programan cualquier cosa, sin hacer el test! despotricaba José TDD, que estaba escribiendo una serie assert.AreEqual(1,0+1), assert.AreEqual(2,1+1) y así, para comprobar si Peano tenía razón.&lt;/p&gt; &lt;p&gt;¡Antes tienen que simular los sistemas! exclamaba José Mock, mientras trataba de explicarle a su esposa que su secretaria no era su amante, solo una mock de una noche. &lt;/p&gt; &lt;p&gt;¡Los sistemas no salen porque usan esas IDEs que complican todo! decía José Notepad, mientras miraba a la gente que usaba Dreamweaver con desprecio manifiesto.&lt;/p&gt; &lt;p&gt;¡Pero dejá de flagelarte! Es todo cuestión de encontrar el plugin adecuado, decía José Eclipse, que estaba buscando cuatro plugins de modelado (porque cada uno dependía de los otros tres), que corrieran en menos de 4 gigas, sin quemar el disco por paginado de memoria.&lt;/p&gt; &lt;p&gt;¡A ver si alguna vez madurás! Fijate, yo ya vengo con todo completo,&amp;nbsp;exclamaba José VisualStudio, mientras trataba de calcular cuantos litros&amp;nbsp;tenía que hipotecar de su sangre para conseguir las licencias del Team Foundation Server para su equipo de trabajo.&lt;/p&gt; &lt;p&gt;¡Lo importante es la experiencia de usuario! partía de la garganta de José Ajax, mientras ponía autocomplete hasta a los botones de aceptar un formulario.&lt;/p&gt; &lt;p&gt;¡Experiencia de usuario son las mías! exclamaba José Silverlight20, que se estaba peleando de antes con José Silverlight11, por razones de incompatibilidad manifiesta.&lt;/p&gt; &lt;p&gt;...&lt;/p&gt; &lt;p&gt;Como veía que el bolonki venía in crescendo, me retiré por una puerta lateral. Al salir al aire libre, recordé la frase del maestro ajlopez, que me había dicho &amp;quot;la mejor herramienta está entre nuestras orejas&amp;quot;.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;Así que, mis queridos chichipíos, la neurona atenta, vermouth con papas fritas, y ¡¡¡GOOOD SHOOOWWW!!!&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Bueno, espero que les guste, no sé si salió muy bien, pero recordé un monólogo real en mi otro blog en:&lt;/p&gt; &lt;p&gt;&lt;a title="La culpa, seg&amp;uacute;n Tato Bores" href="http://ajlopez.zoomblog.com/archivo/2008/06/08/la-culpa-segun-Tato-Bores.html"&gt;La culpa, según Tato Bores&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Un regalo offtopic, un verdadero monólogo, el monólogo 2000 de Tato, imperdible:´&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wkZquG6-joA"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wkZquG6-joA" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;La segunda parte en&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0bqkZGpGE4c"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0bqkZGpGE4c" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1638790" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category></item><item><title>Entrevista a Bill Gates</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/28/entrevista-a-bill-gates.aspx</link><pubDate>Sat, 28 Jun 2008 21:38:44 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1638740</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=1638740</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/28/entrevista-a-bill-gates.aspx#comments</comments><description>&lt;p&gt;Ayer fue el último día de Gates como &amp;quot;full time&amp;quot; en Microsoft. Encontré una lista de videos de una entrevista que le hizo en estos días la BBC en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/luisabreu/archive/2008/06/23/how-a-geek-changed-the-world.aspx" target="_blank"&gt;How a geek changed the world&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Veran parte de la historia de MS, la vieja historia de la Altair, cómo Allen viaja a Alburquerque con un intérprete Basic, hecho en Harvard con Gates, sin tener idea de si iba a funcionar en la máquina real. Se mudan ahí (siempre se cuentan historias de Gates visitando el barrio rojo de la ciudad). Veo a Mitch Kapor, a Myriam Lubow, contando cómo confundió a Gates con un intruso en la oficina de Microsoft, no podía creer que fuera el presidente, a Scott Wood, (recién descubro que Marla es Marla Wood ahora), la vuelta a Seattle (Gates viajó en su auto coleccionando multas), el crecimiento del gigante... Encontramos a Steve Ballmer, viejo compañero de noches de poker en los dormitorios de Harvard.&lt;/p&gt; &lt;p&gt;Aparece gente de BurguerMaster, donde varios de Microsoft, incluido Gates, iban a comer hamburguesas&amp;nbsp;(una rutina de manejo de memoria de los primeros Windows se llama así internamente, en honor a este local). Escucharan a Sir Alan Sugar hablando de Gates. Está la aparición de Novell. Está John Batelle describiendo la aparición de la web. Y cómo Microsoft llega tarde a la red, pero luego del memo interno de Gates (1995?) todo comienza a cambiar. Más adelante, Janet Reno comienza el juicio contra el gigante de Microsoft.&lt;/p&gt; &lt;p&gt;Mucho de lo que se muestra, lo viví directamente. Recuerdo haber trabajado con el GWBasic, el Lattice C que compraron, el venerable edlin, el Xenix (antes de MS, trabajé con el CP/M de Kildall, y antes... bueno, eso dará pie a otro post). Recuerdo cuando aparecieron las ventanas, no habia Overlapped (aunque ya estaba la constante definida en los archivos .h). Pero antes, el Multiplan, y el editor de texto que tenían para desplazar a Wordstar.... ooops... ya ni recuerdo el nombre. Pero el Multiplan estaba hecho sobre las interrupciones de DOS, mientras que Lotus trabajaba directamente sobre el BIOS, y la dirección de video 0xb000:0 creo para monocromático, o 0xb800:0 para color (para evitar flicker había que testear una puerta, antes de mandar algo a esa memoria... ;-). No fue lo único que influyó, pero realmente Lotus corría más rápido que el Multiplan.&lt;/p&gt; &lt;p&gt;Excelente documental, acá estan las partes de la entrevista, gracias a Youtube:&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2gOrWBPt1bA"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2gOrWBPt1bA" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/d_LHBfHrWIo"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/d_LHBfHrWIo" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/krFuJhGRwaw"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/krFuJhGRwaw" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rddm3aHdJp8"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rddm3aHdJp8" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5OLgcdgOmsk"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/5OLgcdgOmsk" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2GVCCZY6bYA"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2GVCCZY6bYA" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PClVHy03vnA"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PClVHy03vnA" type="application/x-shockwave-flash" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt; &lt;p&gt;Veremos que le depara el futuro a Gates: es una persona inteligente, que sabe cómo tomar decisiones con la información disponible, y llevar adelante lo que decide. Esperemos que despliegue esas habilidades en su nuevo desafío.&lt;/p&gt; &lt;p&gt;Para los nostálgicos, pueden encontrar otras piezas de la historia en&lt;/p&gt; &lt;p&gt;&lt;a title="Los piratas de Silicon Valley" href="https://msmvps.com/blogs/lopez/archive/2007/08/15/los-piratas-de-silicon-valley.aspx"&gt;Los piratas de Silicon Valley&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Gracias al bueno de &lt;a href="http://blogs.southworks.net/ejadib" target="_blank"&gt;Ezequiel Jadib&lt;/a&gt; por el enlace original.&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1638740" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Historia+de+la+Computaci_26002300_243_3B00_n/default.aspx">Historia de la Computaci&amp;#243;n</category></item><item><title>La historia de Smalltalk</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/26/la-historia-de-smalltalk.aspx</link><pubDate>Thu, 26 Jun 2008 20:12:57 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1638081</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=1638081</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/26/la-historia-de-smalltalk.aspx#comments</comments><description>&lt;p&gt;Ayer comenté un libro de conceptos de programación, de actualidad (ver &lt;a title="Libro Foundation of Programming, listo para bajar" href="http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx"&gt;Libro Foundation of Programming, listo para bajar&lt;/a&gt;). Quisiera hoy comentar un texto, que me parece un &amp;quot;debe ser leído&amp;quot; por todos los que nos dedicamos al desarrollo de software. Es un escrito del bueno de Alan&amp;nbsp;Kay, sobre la historia de Smalltalk:&lt;/p&gt; &lt;p&gt;&lt;a title="Smallhistory.pdf" href="http://www.metaobject.com/papers/Smallhistory.pdf"&gt;Smallhistory.pdf&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/smalltalkhistory.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Es un excelente texto para leer, y que influye más allá de simplemente estar interesado en Smalltalk. Es una historia de cómo algunas ideas fueron surgiendo, dentro de la comunidad de desarrollo americana. Cómo la programación a objetos fue surgiendo, y cómo la forma de interactuar con las computadoras actuales fue tomando forma. Hace un tiempo vimos por acá la demo de Douglas Engelbart. De nuevo aparece en esta historia.&lt;/p&gt; &lt;p&gt;Lean, por ejemplo, cómo Kay detecta&amp;nbsp;algunas ideas germinales (datos junto con conducta) en desarrollos de la Fuerza Aerea, que hoy veríamos muy alejados de la OOP. Lean sobre su contacto con Lisp, y con Seymour Papert. Lean sobre los problemas internos de Xerox, la compentencia con DEC, cómo algunas ideas fueron casi fruto de la casualidad, de que un proyecto siguió adelante aunque otros se oponían. Lean sobre Simula, Euler,&amp;nbsp; el IPL predecesor de Lisp. Lean sobre el Sketchpad de Evans (que yo encontré por primera vez en alguna revisión histórica de la Scientific American). Es una lectura, por lo menos para mí, deliciosa.&lt;/p&gt; &lt;p&gt;Kay tiene un idea desde hace años, que comparto: la idea de que la máquina, y la computación en general, nos debe servir para expandir las capacidades humanas. Excelente idea. Es lo que de alguna forma también hoy estamos logrando con Internet. Hoy, ramas del conocimiento y del hacer humano, han sido potenciadas por el software, el hardware y todo lo que ha pasado en nuestra profesión en las últimas décadas. &lt;/p&gt; &lt;p&gt;En mi infancia, se pensaba que los viajes espaciales iban a revolucionar la historia humana. Bueno, eso no ha pasado todavía. Pero de alguna forma producto de la guerra fría, y de la carrera espacial, el desarrollo de la computación (recordemos sus inicios modernos en la segunda guerra, y la aparición de la cibernética impulsada por temas militares) y de Internet misma, es lo que ha provocado un cambio, que poco a poco va alcanzando a gran parte de la humanidad.&lt;/p&gt; &lt;p&gt;Leer la historia de Kay es indispensable para ir entendiendo que ha pasado. Alguien que ha dicho &amp;quot;la mejor forma de dominar el futuro, es inventándolo&amp;quot; (frase aproximada, lean el texto, para ver dónde surgió exactamente).&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1638081" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Smalltalk/default.aspx">Smalltalk</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></item><item><title>Libro Foundation of Programming, listo para bajar</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx</link><pubDate>Wed, 25 Jun 2008 15:48:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637596</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=1637596</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/25/libro-foundation-of-programming-listo-para-bajar.aspx#comments</comments><description>&lt;p&gt;Gracias a Cladio M.E. Bastos Iorio de &lt;a href="http://www.blumer.com.ar"&gt;http://www.blumer.com.ar&lt;/a&gt; me entero de la aparición de este libro. Claudio posteó la información en una lista pública del MUG de Argentina (&lt;a href="http://www.mug.org.ar/"&gt;http://www.mug.org.ar/&lt;/a&gt; ):&lt;/p&gt; &lt;p&gt;&lt;a title="Foundations of Programming Ebook" href="http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx"&gt;Foundations of Programming Ebook&lt;/a&gt;&lt;/p&gt; &lt;h6&gt;&amp;nbsp;&lt;/h6&gt; &lt;blockquote&gt; &lt;p&gt;I&amp;#39;m excitted to finally release the official, and completely free, Foundations of Programming EBook. This essentially contains all 9 Foundation parts including a conclusion and some typical book fluff (table of content, acknowledgement and so on). A number of spelling errors were corrected, along with some small technical changes and clarifications - largely based on feedback, so thanks for everyone who provided it! Otherwise it&amp;#39;s exactly the same as what&amp;#39;s been posted here over the past several months. &lt;p&gt;Download it from &lt;a href="http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx"&gt;http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx&lt;/a&gt; &lt;p&gt;&lt;img src="http://www.openmymind.net/cover.jpg" alt="" /&gt;  &lt;p&gt;If the above link fails, you can also get it from &lt;a href="http://www.openmymind.net/FoundationsOfProgramming.pdf"&gt;http://www.openmymind.net/FoundationsOfProgramming.pdf&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Acabo de leer el índice, y de leer algunos capítulos rápidamente. Es muy interesante los temas que toca, y parece bien encarados. El bueno de Karl Seguin ha hecho un magnífico trabajo, colocando en un solo libro temas que nos tocan en el desarrollo de software de todos los días. Si bien está algo orientado a .NET, es totalmente aprovechable en otras tecnologías, como Java. El texto había ido apareciendo en los últimos meses, en forma de posts, y revisado por colegas, en general dentro del movimiento ALT.NET, así que el trabajo de Seguin se ha enriquecido con los comentarios de la comunidad de desarrollo. &lt;p&gt;Sobre el autor &lt;blockquote&gt; &lt;p&gt;Karl Seguin is a developer at Fuel Industries, a former Microsoft MVP, a member of the influential CodeBetter.com community and an editor for DotNetSlackers. He has written numerous articles and is an active member of various Microsoft public newsgroups. He lives in Ottawa, Ontario Canada.  &lt;p&gt;His personal webpage is: &lt;a href="http://www.openmymind.net/"&gt;http://www.openmymind.net/&lt;/a&gt;  &lt;p&gt;His blog, along with that of a number of distinguished professionals, is located at: &lt;a href="http://www.codebetter.com/"&gt;http://www.codebetter.com/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Enumero algunos temas tratados: &lt;p&gt;- El movimiento ALT.NET, enumerando y desarrollando sus pilares, algo confrontados con la visión MSDN &lt;p&gt;- Domain-Driven Design, explicando los términos, y justamente, explicando cuándo usarlo&amp;nbsp;y cuándo no, cuál es el contraste con una aproximación Data-Centric. &lt;p&gt;- Persistencia, algo con lo que lidiamos en prácticamente cada proyecto. &lt;p&gt;- Dependency Injection, una de las mejores técnicas inventadas, desde que alguien dijo que el pan tenía que venir en rebanadas. &lt;p&gt;- Unit Testing, indispensable en el bolso de la desarrolladora y en el bolsillo del caballero desarrollador. Hay días en los que pienso que hasta el Hello World de Kernighan y Ritchie debería tener su Unit Test. &lt;p&gt;- Object Relational Mappers, todo un capítulo explicando la idea y algunas implementaciones, usando NHibernate. &lt;p&gt;- Manejo de memoria, un back to basics que veo necesario, como comento en mis cursos. &lt;p&gt;- Excepciones, otro back to basics que se debe explicar. &lt;p&gt;- Proxy, tengo que ver en detalle este capítulo, para ver hasta dónde llega la idea del autor. &lt;p&gt;El libro también viene acompañado de código, con ejemplos de los temas tratados, por ejemplo, las formas de usar NHibernate, documentando sus características. Lo pueden bajar desde: &lt;p&gt;&lt;a href="http://openmymind.net/CodeBetter.Foundations.zip"&gt;http://openmymind.net/CodeBetter.Foundations.zip&lt;/a&gt; &lt;p&gt;Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637596" 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/Libros/default.aspx">Libros</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/NHibernate/default.aspx">NHibernate</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></item><item><title>Curso de JavaServer Pages gratuito en línea</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/24/curso-de-javaserver-pages-gratuito-en-l-237-nea.aspx</link><pubDate>Tue, 24 Jun 2008 18:33:09 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637272</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=1637272</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/24/curso-de-javaserver-pages-gratuito-en-l-237-nea.aspx#comments</comments><description>&lt;p&gt;Desde hace unos días, va tomando forma mi curso en línea de JavaServer Pages:&lt;/p&gt; &lt;p&gt;&lt;a title="http://ajlopez.net/cursos/Course.php?Id=5" href="http://ajlopez.net/cursos/Course.php?Id=5"&gt;http://ajlopez.net/cursos/Course.php?Id=5&lt;/a&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/ajlearning/ajlearningjsp.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Está basado en el servidor Tomcat, pero creo que lo pueden aprovechar para cualquier contenedor web que soporte JSP.&lt;/p&gt; &lt;p&gt;Como otros cursos que están ahí, nace de los cursos presenciales que doy cada semana. Digo en la introducción:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;En los noventa, aparece de la mano de Sun el lenguaje Java, que es más que un lenguaje, es todo un conjunto de tecnologías. Como lenguaje de uso general, tiene el soporte de una robusta y amplia librería de clases. Al estar implementado con una máquina virtual, sus programas son multiplataforma: pueden ejecutarse desde distintos entornos operativos, donde haya una implementación de la máquina virtual de Java. &lt;br /&gt;&lt;br /&gt;En este sitio ya estoy publicando las primeras lecciones del curso &lt;a href="http://ajlopez.net/cursos/Course.php?Id=1"&gt;Introducción a Java&lt;/a&gt;. Quisiera aprovechar este curso de JavaServer Pages para mostrar lo que se puede hacer con Java, más allá de los programas de consola o las ventanas gráficas. Internet, y la web en particular, hoy están en todos lados. JSP nos permite hacer aplicaciones web, con interfaces de páginas dinámicas, y aprovechar al mismo tiempo toda la potencia de Java. &lt;br /&gt;&lt;br /&gt;Estas lecciones son un pasaje a escrito de las que doy en mis cursos presenciales. Espero que les resulten útiles. Un curso a distancia no es lo mismo que un curso presencial, donde uno puede interactuar con el instructor y sus compañeros. Pero también tiene sus ventajas, como la falta de horario, y el avance a su propio ritmo. &lt;br /&gt;&lt;br /&gt;Estas son las primeras páginas del curso. Todos los días publico una lección adicional (no necesariamente de este curso). Mantengo una lista de lecciones publicadas en mi post: &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/04/08/a-lesson-a-day-keeps-the-doctor-away.aspx"&gt;A lesson a day keeps the doctor away&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Espero que les sirva. Nos leemos! &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637272" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Java/default.aspx">Java</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Cursos/default.aspx">Cursos</category></item><item><title>Agentes Distribuidos y Fractales usando DSS/VPL</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/23/agentes-distribuidos-y-fractales-usando-dss-vpl.aspx</link><pubDate>Mon, 23 Jun 2008 17:11:37 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637058</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=1637058</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/23/agentes-distribuidos-y-fractales-usando-dss-vpl.aspx#comments</comments><description>&lt;p&gt;La semana pasada escribí una aplicación de base para agentes distribuidos usando DSS/VPL, agentes que intercambian mensajes arbitrarios e implementan un balanceo de carga rudimentario. Pueden leer los detalles en:&lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx"&gt;Agentes Distribuidos usando DSS/VPL&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ajlopez.wordpress.com/2008/06/15/distributed-agents-using-dssvpl/"&gt;Distributed Agents using&amp;nbsp;DSS/VPL &lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ayer, extendí el ejemplo con un nuevo proyecto, Fractal:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalsln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Pueden bajarlo desde &lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DSS/AjDssAgents-0.2.zip" target="_blank"&gt;mi Skydrive&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Tiene dos&amp;nbsp;DSS Service Components, uno es el&amp;nbsp;Calculator: calcula un sector del fractal de Mandelbrot. El otro componente es el Renderer, que tiene un formulario para controlar y mostrar los resultados del cálculo. El mensaje que transporta la información del sector a calcular es:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:ed281842-4f1e-4878-87a4-5e9cc39d8478" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; SectorInfo : MessagePayload
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; RealMinimum { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; ImgMinimum { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;double&lt;/span&gt;&lt;span style="color:#000000;"&gt; Delta { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromX { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromY { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; MaxIterations { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; MaxValue { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Otra clase es el mensaje que retorna el cálculo:&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:c23ce92b-efa1-4832-9743-2aeef1438dd2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Sector : MessagePayload
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromX { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; FromY { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Width { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; Height { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] Values { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El Calculator divide el sector a calcular, si lo considera demasiado grade. Podría calcularlo en un solo paso, pero me parece interesante esta solución, para repartir el trabajo entre varios nodos:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:685af1f9-0d83-445f-89c6-e9b39667d0b9" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Calculate(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Calculator with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            SectorInfo sectorInfo &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (SectorInfo) msg.Payload;
            LogInfo(String.Format(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;X {0} Y {1} Width {2} Height {3}&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, sectorInfo.FromX, sectorInfo.FromY, sectorInfo.Width, sectorInfo.Height));

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (sectorInfo.Width &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; sectorInfo.Height &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
                SplitSector(sectorInfo);
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
                CalculateSector(sectorInfo);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como en el ejemplo de la semana pasada, podemos ejecutar este ejemplo desde un diagrama VPL, que se llama&amp;nbsp;FractalVpl1:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl1.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Acá hay un solo Renderer, y dos agentes Calculator. Si lanzamos este programa VPL, aparece una ventana. Esta es su apariencia (luego de presionar el botón Calculate):&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal2.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Podemos arrastrar el mouse para seleccionar una nueva región, o usar los botones de Zoom In y Zoom Out. El botón de Reset vuelve a la posición y colores iniciales. El botón Reset Colors vuelve a los colores iniciales, que pueden ser cambiados al azar con el botón New Colors.&lt;/p&gt;
&lt;p align="left"&gt;Hay otro programa VPL, llamado&amp;nbsp;FractalVpl2, que puede ser usado para ejecutar el mismo ejemplo de forma distribuida. Tiene un diagrama con dos AgentHosts:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl2d.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;y dos nodos:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractalvpl2n.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;Debemos compilar el ejemplo VPL y pedir de ejecutar sus nodos en forma distribuida, usando el rundeployer.cmd (para más detalles, ver mi anterior post, mencionado al principio).&lt;/p&gt;
&lt;p align="left"&gt;Estos son algunos de los gráficos que produce el sistema:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal1.png" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal4.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.todocontenidos.com/images/articles/fractal5.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;(Este post es una traducción del original en &amp;quot;Anglish&amp;quot;:&lt;/p&gt;
&lt;p align="left"&gt;&lt;a href="http://ajlopez.wordpress.com/2008/06/22/distributed-agents-and-fractals-using-dssvpl/"&gt;Distributed Agents and Fractals using&amp;nbsp;DSS/VPL &lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;)&lt;/p&gt;
&lt;p align="left"&gt;Nos leemos!&lt;/p&gt;
&lt;p align="left"&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;&lt;/p&gt;
&lt;p align="left"&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637058" 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/Grid+Computing/default.aspx">Grid Computing</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Concurrency+and+Coordination+Runtime/default.aspx">Concurrency and Coordination Runtime</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Decentralized+Software+Services/default.aspx">Decentralized Software Services</category></item><item><title>Agentes Distribuidos usando DSS/VPL</title><link>http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx</link><pubDate>Fri, 20 Jun 2008 10:44:33 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1636014</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=1636014</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/06/20/agentes-distribuidos-usando-dss-vpl.aspx#comments</comments><description>&lt;p&gt;En este post, exploraremos algunas ideas para implementar agentes distribuidos, aprovechando las capacidades&amp;nbsp;que nos brindan&amp;nbsp;Decentrilized Software Services (DSS) y el Visual Programming Language (VPL), includos en el &lt;a href="http://www.microsoft.com/robotics" target="_blank"&gt;Microsoft Robotics Developer Studio&lt;/a&gt; (estoy trabajando con la versión CTP 2.0, con VS 2008). Pueden bajarse el código desde mi Skydrive:&lt;/p&gt; &lt;p&gt;&lt;a href="http://cid-9f903f3d6db0c176.skydrive.live.com/self.aspx/Examples/DSS/AjDssAgents-0.1.zip" target="_blank"&gt;AjDssAgents-0.1.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En un anterior post:&lt;/p&gt; &lt;p&gt;&lt;a title="Web Crawler example using DSS (Decentralized Software Services)" href="http://ajlopez.wordpress.com/2008/05/25/web-crawler-example-using-dss-decentralized-software-services/"&gt;Web Crawler example using DSS (Decentralized Software Services)&lt;/a&gt;&lt;br /&gt;&lt;a title="Ejemplo de Web Crawler usando DSS (Decentralized Software Services)" href="http://msmvps.com/blogs/lopez/archive/2008/05/28/ejemplo-de-web-crawler-usando-dss-decentralized-software-services.aspx"&gt;Ejemplo de Web Crawler usando DSS (Decentralized Software Services)&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;escribí algunos componentes DSS orquestados desde VPL, para implementar un web crawler. En ese ejemplo, hay un Dispatcher, un Resolver, un Downloader, y un&amp;nbsp;Harvester. Pueden leer ahí el detalle de sus funciones.&lt;/p&gt; &lt;p&gt;Pero supongamos que ahora tenemos varias máquinas para poder ejecutar el proceso de web crawling. Queremos instalar y ejecutar varios Downloaders y Harvesters, en una grilla de máquinas, usando load balancing automático. El problema con la orquestación desde VPL es que no soporta conceptos como load balancing, por lo menos no directamente. Entonces, escribí este ejemplo donde los componentes se comunican entre sí, como agentes, usando mensajes especiales.&lt;/p&gt; &lt;p&gt;Un agente, en este ejemplo, es un DSS service component, capaz de recibir y procesar mensajes que les envían los otros agentes. Puede enviar mensajes a otros componentes. En vez de indicar a cuál agente va dirigido un mensaje, se especifica el tipo lógico de agente al que va destinado, por ejemplo &amp;quot;WebCrawler/Harvester&amp;quot;.&lt;/p&gt; &lt;p&gt;Otro componente especializado, el AgentHost, se encargar de recibir esos mensajes a enviar, y los destina a un agente local o remoto, que corresponda al tipo lógico especificado.&lt;/p&gt; &lt;h3&gt;La solución&lt;/h3&gt; &lt;p&gt;La solución .NET tiene tres proyectos:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajdssagentssln.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;AjDssAgents contiene el contrato genérico de un agente, y sus tipos, y la implementación concreta del AgentHost.&lt;/p&gt; &lt;p&gt;DecrementAgent and WebCrawler&amp;nbsp;son simples agentes a&amp;nbsp;usar en el ejemplo. El web crawler implementado es similar al&amp;nbsp;de mi anterior post, mencionado arriba.&lt;/p&gt; &lt;h3&gt;El mensaje&lt;/h3&gt; &lt;p&gt;Los agentes intercambian mensajes, objetos del tipo AgentMessage:&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:19c1260f-0edf-49ad-9ea5-ce3fd1a35bb3" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;
    [DataContract]
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage
    {
        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; From { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; To { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Action { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt; Payload { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;El campo From indica el origen del mensaje (no estoy usando ese campo todavía) El campo To es la dirección física (dirección DSSP) del agente destino, o su tipo lógico. En el ejemplo de este post, solamente estoy usando los tipos lógicos. ¿Por qué usar un tipo lógico? Así, si un mensaje tiene como To el valor &amp;quot;WebCrawler/Dispatcher&amp;quot;, será enviado a un agente que corresponda a ese tipo lógico.&lt;/p&gt;
&lt;p&gt;¿Cómo un agente conoce cuáles otros agentes están siendo ejecutados, y cuáles son sus tipos lógicos? Pues bien, no lo sabe. El componente que mantiene esa información es el AgenHost local, único en cada DssHost activo. Cada agente envía sus mensajes salientes a su AgentHost local, y éste los reenvía a los agentes locales o remotos apropiados.&lt;/p&gt;
&lt;h3&gt;Los agentes&lt;/h3&gt;
&lt;p&gt;Cada agente es un&amp;nbsp;DSS service component, con una dirección asignada cuando es creado. Durante el comienzo de su ejecucuón, el agente envía a su AgentHost local un mensaje DSS, indicando su dirección y su tipo lógico (p.ej. WebCrawler/Dispatcher). Esta es la forma por la que el AgentHost conoce los agentes que estan ejecutándose localmente, en su DssHost. Veamos el código de inicio de un agente Dispatcher del ejemplo WebCrawler:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:0f9d6b16-e418-434d-8269-c8c094c4e793" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;override&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Start()
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;base&lt;/span&gt;&lt;span style="color:#000000;"&gt;.Start();
            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Add service specific initialization here.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;            _state.AgentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;WebCrawler/Dispatcher&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

            host.NewNode newNode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.NewNode(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.AgentInfo() { Address &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;this&lt;/span&gt;&lt;span style="color:#000000;"&gt;.ServiceInfo.Service, AgentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state.AgentType });
            _hostPort.Post(newNode);
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El tipo del agente es mantenido en su estado.&lt;/p&gt;
&lt;p&gt;Este es un código típico, de un agente, en este caso un&amp;nbsp;Dispatcher, mostrando el tratamiento de un mensaje entrante y la producción de mensajes salientes:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:43d1f629-7d87-47b8-960c-1fc30002b3c2" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;        [ServiceHandler(ServiceHandlerBehavior.Concurrent)]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; IEnumerator&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ITask&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; PostMessageHandler(generic.PostMessage postMessage)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (postMessage.Body.Action.Equals(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Dispatch&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
                Dispatch(postMessage.Body);
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (postMessage.Body.Action.Equals(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Resolve&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
                Resolve(postMessage.Body);

            postMessage.ResponsePort.Post(DefaultSubmitResponseType.Instance);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;yield&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Dispatch(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Dispatcher with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;URL: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Payload);

            DownloadTarget target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; DownloadTarget();

            target.Uri &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;) msg.Payload;
            target.Depth &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

            AgentMessage postmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage() { Action &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Resolve&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, To &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; _state.AgentType, Payload &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; target };
            host.PostMessage post &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.PostMessage(postmsg);
            _hostPort.Post(post);
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; Resolve(AgentMessage msg)
        {
            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Entering Dispatcher with Action: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; msg.Action);
            DownloadTarget downloadtarget &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (DownloadTarget)msg.Payload;

            LogInfo(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;URL: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget.Uri &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Depth: &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget.Depth);

            DownloadTarget target &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ProcessUrl(downloadtarget);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (target &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
                AgentMessage agentmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; AgentMessage() { To &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;WebCrawler/Downloader&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Action&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Download&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Payload &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; downloadtarget };
                host.PostMessage postmsg &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; host.PostMessage(agentmsg);
                _hostPort.Post(postmsg);
            }
        }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;El AgentHost&lt;/h3&gt;
&lt;p&gt;Hay uno y sólo uno por DssHost en ejecución. El AgentHost recibe la información de los nuevos agentes que se crean (su dirección y tipo lógico), y mantiene esa información en su propio estado.&lt;/p&gt;
&lt;p&gt;Recibe mensajes de sus agentes locales, y los reenvía a otros agentes locales o a un AgentHost remoto. En este último caso, serializa el contenido del mensaje en un string, usando serialización XML (no podemos enviar un objeto genérico, debido a limitaciones en el Proxy que usa DSS). Esta es la estructura de un mensaje remoto:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a9815df5-5156-48a3-ba52-7c6468e48c46" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    [DataContract]
    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; RemoteAgentMessage
    {
        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; From { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; To { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Action { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; PayloadTypeName { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }

        [DataMember]
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Payload { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
    }
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Notemos que el mensaje remote tiene un string Payload, que es la serialización XML del&amp;nbsp;contenido original, y también tiene s