<?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 : Proyectos de Código Abierto, NoSQL</title><link>http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_F300_digo+Abierto/NoSQL/default.aspx</link><description>Tags: Proyectos de Código Abierto, NoSQL</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Trabajando en AjObjects: objectos dinámicos/documentos en memoria</title><link>http://msmvps.com/blogs/lopez/archive/2010/03/08/working_2D00_on_2D00_ajobjects_2D00_in_2D00_memory_2D00_documentdynamic_2D00_object_2D00_base.aspx</link><pubDate>Mon, 08 Mar 2010 10:09:32 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1761225</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=1761225</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2010/03/08/working_2D00_on_2D00_ajobjects_2D00_in_2D00_memory_2D00_documentdynamic_2D00_object_2D00_base.aspx#comments</comments><description>&lt;p&gt;Al comienzo de este sigo, cuando apareció .NET, comencé a practicar programando proyectos personales. Había tres principales: AjStorm (Simple Tool for Object Relational Mapping), AjGenesis (Code generation) y AjObjects (objectos nativos en memoria con consultas dinámicas). Sólo el segundo proyecto está hoy activo. Pero aprendí sobre Reflection en los tres proyectos, sobre cómo implementar simples consultas en AjObjects (ahora, tenemos Linq en .NET). Pueden ver algo de código prehistórico en:&lt;/p&gt;  &lt;p&gt;&lt;a title="https://sourceforge.net/projects/ajstorm/" href="https://sourceforge.net/projects/ajstorm/"&gt;https://sourceforge.net/projects/ajstorm/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A fines de los noventa, cuando aprendí PHP, encontré en ese lenguaje una implementación de objetos dinámicos (por lo menos, de propiedades dinámicas, si no métodos; propiedades que se pueden agregar a un objeto en cualquier momento, sin haberlas definido en una clase previamente). Viendo lo flexible que eran en PHP, y luego de haber experimentado con generación de código en PHP, pasé a implementar esas ideas en AjBasic, el lenguaje interno de AjGenesis. Hace dos años, más o menos, agregué objetos dinámicos a otro lenguaje interpretado, AjSharp. Tanto AjBasic como AjSharp permite escribir cosas como:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;abel.Name = &amp;quot;&lt;span style="color:#8b0000;"&gt;Abel&lt;/span&gt;&amp;quot;
abel.Age = 600
abel.Father.Name = &amp;quot;&lt;span style="color:#8b0000;"&gt;Adam&lt;/span&gt;&amp;quot;
abel.Father.Age = 800
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;sin una previa definición de los objetos y propiedades. En AjSharp seríawithout previous definition of the object and its properties. In AjSharp you write:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;abel.Name = &amp;quot;&lt;span style="color:#8b0000;"&gt;Abel&lt;/span&gt;&amp;quot;;
abel.Age = 600;
abel.Father.Name = &amp;quot;&lt;span style="color:#8b0000;"&gt;Adam&lt;/span&gt;&amp;quot;;
abel.Father.Age = 800;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Más información en:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ajlopez.wordpress.com/2009/12/26/ajsharp-dynamic-classes-and-objects/" target="_blank"&gt;AjSharp: Dynamic Classes and Objects&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2009/12/27/ajsharp_2D00_dynamic_2D00_classes_2D00_and_2D00_objects.aspx" target="_blank"&gt;AjSharp: Clases y Objectos Dinámicos&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://ajlopez.wordpress.com/category/ajsharp" target="_blank"&gt;AjSharp posts&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/tags/AjSharp/default.aspx" target="_blank"&gt;AjSharp posts en español&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muchos lenguajes sobre las VM de .NET y Java ahora está reconociendo el poder de estas características dinámicas (En .NET 4 tenemos una implementación de ExpandoObjects, creo que nació con el DLR Dynamic Language Runtime, ahora la palabra clave dynamic es lo “nuevo”).&lt;/p&gt;

&lt;p&gt;Estuve jugando con objetos en memoria desde hace un tiempo, el año pasado escribí algún experimento llamado AjTwitter, mensajes en memoria. Y estuve escribiendo una implementación más relacional, en AjBase. Esos proyectos está en el trunk de:&lt;/p&gt;

&lt;p&gt;&lt;a title="http://code.google.com/p/ajcodekatas" href="http://code.google.com/p/ajcodekatas"&gt;http://code.google.com/p/ajcodekatas&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Impresionado por el movimiento &lt;a href="http://en.wikipedia.org/wiki/NoSQL" target="_blank"&gt;NoSQL&lt;/a&gt;, decidí “to push the envelop” de mi tiempo libre, y hace una semana, como code kata, escribí el esqueleto base de algo inspirado por &lt;a href="http://www.mongodb.org/display/DOCS/Home" target="_blank"&gt;MongoDB&lt;/a&gt;, que es conocidad como una base de datos orientada a documentos. Mi proyecto está escrito en C#. Pueden ver el código en el proyecto mencionado AjCodeKatas, con el nombre AjObjects.&lt;/p&gt;

&lt;p&gt;Definí un &lt;strong&gt;BasicObject &lt;/strong&gt;(similar al BasicDBObject en el driver Java de MongoDB):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajobjects01.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;BasicObject&lt;/strong&gt; puede ser llenado usando la propiedad indexada default:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;BasicObject newobj = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BasicObject();
newobj[&amp;quot;&lt;span style="color:#8b0000;"&gt;Age&lt;/span&gt;&amp;quot;] = 800;
newobj[&amp;quot;&lt;span style="color:#8b0000;"&gt;Name&lt;/span&gt;&amp;quot;] = &amp;quot;&lt;span style="color:#8b0000;"&gt;Adam&lt;/span&gt;&amp;quot;;
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;o por un método factoría:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,courier,monospace;font-size:12px;"&gt;BasicObject newobj = BasicObject.CreateObject(&amp;quot;&lt;span style="color:#8b0000;"&gt;Name&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;Adam&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;Age&lt;/span&gt;&amp;quot;, 800);
&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Collection&lt;/strong&gt; es el contendor de BasicObjects:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajobjects02.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Podemos insertar y borrar bjetos. Un nuevo objeto insertado obtiene un Guid. Podemos recuperar ese objeto via su Guid. Hay un método &lt;strong&gt;Find(Predicate&amp;lt;BasicObject&amp;gt;)&lt;/strong&gt; que retorna un &lt;strong&gt;Cursor&lt;/strong&gt; sobre los objetos que cumplen con el predicado pasado como parámetro:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/ajobjects03.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;El método &lt;strong&gt;Update(Predicate&amp;lt;BasicObject&amp;gt;,Action&amp;lt;BasicObject&amp;gt;)&lt;/strong&gt; aplica la acción a los objetos seleccionados de una colección.&lt;/p&gt;

&lt;p&gt;La adopción de predicados y acciones, podría complicar la implementación de estas invocaciones cuando llegue a programar las llamadas distribuidas. Deberé trabajar en la serialización de esos predicados y acciones: ver de trabajarlos como Expression lambda, que recuerde, éstas son serializables (lo vi alguna vez en expresiones LINQ que viajaban de nodo a nodo en Microsoft Robotics).&lt;/p&gt;

&lt;p&gt;Debo trabajar, como próximos pasos, en:&lt;/p&gt;

&lt;p&gt;- &lt;strong&gt;Concurrencia&lt;/strong&gt;: Actualmente, una colección tiene locks en cada uno de sus métodos. Los cursores obtienen una copia de la lista actual de objetos (copia la lista, no los objetos). Mientras se usa el curso, la colección original puede ser actualizado, sin cambiar el contenido del cursor.&lt;/p&gt;

&lt;p&gt;- &lt;strong&gt;Persistencia&lt;/strong&gt;: Hay un BasicObjectSerializer, a mejorar: más tipos básicos, necesito una implementación de &lt;strong&gt;BasicList&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;- &lt;strong&gt;Distribución&lt;/strong&gt;: Planeo tener varios hosts con réplicas, con consistencia eventual (tengo que estudiar la terminología).&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez 
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt; 

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1761225" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Proyectos+de+C_F300_digo+Abierto/default.aspx">Proyectos de Código Abierto</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/NoSQL/default.aspx">NoSQL</category></item></channel></rss>