<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">      Motivos de un ensamblado</title><subtitle type="html" /><id>http://geeks.ms/blogs/mllopis/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/mllopis/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/mllopis/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-03-20T22:53:42Z</updated><entry><title>Modeling in Text: Serie de screencasts sobre el lenguaje M</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2010/02/18/modeling-in-text-serie-de-screencasts-sobre-el-lenguaje-m.aspx" /><id>/blogs/mllopis/archive/2010/02/18/modeling-in-text-serie-de-screencasts-sobre-el-lenguaje-m.aspx</id><published>2010-02-18T05:13:00Z</published><updated>2010-02-18T05:13:00Z</updated><content type="html">&lt;p&gt;Durante las &amp;uacute;ltimas semanas he tenido la oportunidad de grabar una &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/videos.aspx#mfamily"&gt;serie de cinco screencasts&lt;/a&gt; sobre el lenguaje M para &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/ee460940.aspx"&gt;nuestra web en MSDN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La serie est&amp;aacute; dividida en cinco cap&amp;iacute;tulos, en los cuales partimos de un conocimiento previo sobre M pr&amp;aacute;cticamente nulo para posteriormente incrementar la funcionalidad de nuestro ejemplo a medida que introducimos nuevos conceptos del lenguaje. El contenido de cada uno de los cap&amp;iacute;tulos es el siguiente:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd576258.aspx"&gt;&amp;ldquo;Modeling a Language&amp;rdquo;&lt;/a&gt;&lt;/strong&gt;: En este cap&amp;iacute;tulo explico de qu&amp;eacute; forma podemos modelar nuestros propios lenguajes, comenzando por la creaci&amp;oacute;n de un lenguaje sencillo que reconozca una &amp;uacute;nica sentencia (&amp;ldquo;Chris is 24 years old&amp;rdquo;) para posteriormente incorporar nuevos conceptos y funcionalidades del lenguaje y poder generalizar dicho lenguaje, as&amp;iacute; como modificar la estructura del AST / proyecci&amp;oacute;n resultante.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd904456.aspx"&gt;&lt;strong&gt;&amp;ldquo;Data&amp;rdquo;&lt;/strong&gt;&lt;/a&gt;: Esta segunda parte de la serie se centra en explicar c&amp;oacute;mo consumir el resultado obtenido en el cap&amp;iacute;tulo anterior (estructuras de datos en M generadas a partir de la &amp;ldquo;compilaci&amp;oacute;n&amp;rdquo; de un archivo de texto escrito en nuestro propio DSL), de modo que podamos importar dichos datos a SQL Server, v&amp;iacute;a herramientas de l&amp;iacute;nea de comandos (M.exe y Mx.exe), as&amp;iacute; como visualizar dichos datos en Quadrant una vez forman parte de nuestro repositorio en SQL Server.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd904457.aspx"&gt;&lt;strong&gt;&amp;ldquo;Transformation&amp;rdquo;&lt;/strong&gt;&lt;/a&gt;: En este v&amp;iacute;deo veremos la estructura general de la transformaci&amp;oacute;n de M a sentencias T-SQL, as&amp;iacute; como diferentes alternativas para escribir funciones de manipulaci&amp;oacute;n sobre dichos datos en M, que posteriormente ser&amp;aacute;n transformadas en vistas de SQL.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd904458.aspx"&gt;&lt;strong&gt;&amp;ldquo;Constraints&amp;rdquo;&lt;/strong&gt;&lt;/a&gt;: Este cap&amp;iacute;tulo muestra de qu&amp;eacute; forma podemos imponer restricciones sobre nuestros datos (definir el tipo de datos de cada atributo, etc.), y analizamos c&amp;oacute;mo su traducci&amp;oacute;n a T-SQL resulta diferente en funci&amp;oacute;n de dichos cambios.&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd904459.aspx"&gt;&lt;strong&gt;&amp;ldquo;Identity and relationships&amp;rdquo;&lt;/strong&gt;&lt;/a&gt;: En la &amp;uacute;ltima parte de la serie, describimos c&amp;oacute;mo crear relaciones entre distintas entidades, mediante el uso de IDs, etiquetas y colecciones que referencian a dichos elementos.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Aprovecho para recomendar a aquellos interesados en SQL Server Modeling (M, Quadrant, Repositorio) que visiten nuestra secci&amp;oacute;n de videos en la cual no s&amp;oacute;lo podr&amp;eacute;is encontrar esta serie sino tambi&amp;eacute;n v&amp;iacute;deos de las sesiones del PDC de Don Box, Chris Anderson, Chris Sells, etc., as&amp;iacute; como bastantes m&amp;aacute;s screencasts sobre las tecnolog&amp;iacute;as que estamos construyendo.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=167674" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /><category term="sql server modeling" scheme="http://geeks.ms/blogs/mllopis/archive/tags/sql+server+modeling/default.aspx" /></entry><entry><title>He leído: “CLR Via C#”, 3ª Edición</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2010/02/09/he-le-237-do-clr-via-c-3-170-edici-243-n.aspx" /><id>/blogs/mllopis/archive/2010/02/09/he-le-237-do-clr-via-c-3-170-edici-243-n.aspx</id><published>2010-02-09T22:00:03Z</published><updated>2010-02-09T22:00:03Z</updated><content type="html">&lt;p&gt;Este fin de semana he tenido la ocasión de leer la última edición del libro &lt;a href="http://www.amazon.com/CLR-via-C-Third-Pro-Developer/dp/0735627045"&gt;“CLR via C#”&lt;/a&gt;, que saldrá a la venta próximamente. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/images/0735627045/ref=dp_image_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books"&gt;&lt;img style="display:block;float:none;margin-left:auto;margin-right:auto;" border="0" alt="CLR via C# 3rd Edition (Pro-Developer)" src="http://ecx.images-amazon.com/images/I/4144R47rswL._SL500_AA240_.jpg" width="240" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No descubro nada diciendo que este es uno de los libros de imprescindible lectura para todo aquel programador de .Net que se precie… Sin embargo, me gustaría destacar algunas de las novedades incluídas en esta nueva edición, que constituyen un motivo más que suficiente para que aquellos que han leído alguna de las ediciones anteriores se animen a volver a leerlo… En realidad, creo que quien haya leído este libro con anterioridad, no necesita motivos que le animen a volver a leerlo, más allá de la noticia de que una nueva edición ha sido publicada…&lt;/p&gt;  &lt;p&gt;En esta edición, la principal novedad es la inclusión de una nueva sección (unas 200 páginas extra) dedicadas a &lt;strong&gt;Threading&lt;/strong&gt;, mecanismos de gestión concurrente en Windows y su correspondencia en el “nuevo” CLR 4.0, operaciones asíncronas y políticas de sincronización entre hilos.&lt;/p&gt;  &lt;p&gt;Otra sección totalmente nueva que ha sido incorporada al libro está dedicada a &lt;strong&gt;serialización&lt;/strong&gt; en tiempo de ejecución.&lt;/p&gt;  &lt;p&gt;En el resto de secciones, se han añadido o modificado conceptos para adaptarlos a las nuevas versiones del CLR y del propio lenguaje C#.&lt;/p&gt;  &lt;p&gt;En cuanto a &lt;strong&gt;C# 4.0&lt;/strong&gt;, algunos de los conceptos incorporados al libro son: tipo dynamic, parametros opcionales, variables locales implícitamente tipadas, propiedades implementadas automáticamente, tipos anónimos, inicializadores de objetos y de colecciones, uso de expresiones lambda para delegados, etc.&lt;/p&gt;  &lt;p&gt;Respecto al &lt;strong&gt;CLR 4.0&lt;/strong&gt;, se ha reescrito completamente el capítulo dedicado al manejo de excepciones en el framework, así como modificaciones notables en cuanto a la gestión automática de memoria (novedades en el garbage collector), soporte para múltiples CLRs cargados en un mismo proceso, novedades en el manejo de AppDomain, etc.&lt;/p&gt;  &lt;p&gt;Sin duda, una lectura más que recomendable…&lt;/p&gt;  &lt;p&gt;Disfrutadlo!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=167060" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="CLR" scheme="http://geeks.ms/blogs/mllopis/archive/tags/CLR/default.aspx" /><category term=".net 4.0" scheme="http://geeks.ms/blogs/mllopis/archive/tags/.net+4.0/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/mllopis/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Pongamos que hablo de MSN Entretenimiento</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2010/02/04/pongamos-que-hablo-de-msn-entretenimiento.aspx" /><id>/blogs/mllopis/archive/2010/02/04/pongamos-que-hablo-de-msn-entretenimiento.aspx</id><published>2010-02-04T02:26:00Z</published><updated>2010-02-04T02:26:00Z</updated><content type="html">&lt;p&gt;Me cuenta un pajarito que el pr&amp;oacute;ximo&lt;strong&gt; jueves 4 de Febrero, a partir de las 23:30h&lt;/strong&gt; (GMT+1) podremos disfrutar a trav&amp;eacute;s de &lt;a target="_blank" href="http://entretenimiento.es.msn.com/musica/noticia.aspx?cp-documentid=151994172"&gt;MSN Entretenimiento en &lt;strong&gt;primicia mundial&lt;/strong&gt;&lt;/a&gt; del nuevo videoclip del &lt;strong&gt;Maestro Sabina&lt;/strong&gt;:&lt;em&gt; &amp;ldquo;Viudita de Clicqcuot&amp;rdquo;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.tribunalatina.com/es/img2/joaquin_sabina_09_g.jpg" style="display:block;float:none;margin-left:auto;margin-right:auto;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://entretenimiento.es.msn.com/"&gt;MSN Entretenimiento&lt;/a&gt; es un servicio de MSN que pone a nuestra disposici&amp;oacute;n una gran variedad (y cantidad) de contenidos multimedia online, de forma gratuita: Series de TV, m&amp;uacute;sica, videoclips, juegos, etc. Todo en Espa&amp;ntilde;ol&amp;hellip; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A disfrutarlo compa&amp;ntilde;er@s!!&lt;/strong&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166614" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="msn" scheme="http://geeks.ms/blogs/mllopis/archive/tags/msn/default.aspx" /></entry><entry><title>Por qué no me gusta la métrica LOC (Lines Of Code)</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/12/21/por-qu-233-no-me-gusta-la-m-233-trica-loc-lines-of-code.aspx" /><id>/blogs/mllopis/archive/2009/12/21/por-qu-233-no-me-gusta-la-m-233-trica-loc-lines-of-code.aspx</id><published>2009-12-21T19:15:03Z</published><updated>2009-12-21T19:15:03Z</updated><content type="html">&lt;p&gt;[ Aprovechando las vacaciones navideñas &lt;strike&gt;y las 15 horas de vuelos desde Seattle&lt;/strike&gt; hasta España para redactar unos cuantos posts que tenía en mente desde hace tiempo… ]&lt;/p&gt;  &lt;p&gt;Hoy os hablaré sobre por qué considero que &lt;strong&gt;LOC&lt;/strong&gt; no es una métrica de código demasiado útil (por decirlo eufemísticamente), algo sobre lo que estoy seguro de que habréis leído ya en bastantes ocasiones pero me gustaría aportar mi visión particular. &lt;/p&gt;  &lt;p&gt;De vez en cuando me he encontrado con gente que me realiza preguntas del tipo: &lt;em&gt;“¿Cuántas líneas de código tiene el proyecto &lt;strike&gt;Oslo&lt;/strike&gt; SQL Server Modeling Services?&amp;quot;&lt;/em&gt; (cambiad esta última parte por Windows 7, o Visual Studio 2010, o SQL Server 2008, etc), o también &lt;em&gt;“Miguel, ¿cuantas líneas de código escribes al día?”…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;En el caso de la segunda pregunta, mi respuesta suele ser: “En algunos de los mejores días de mi vida como desarrollador, mi LOC ha sido un valor negativo. Afortunadamente, LOC no es directamente proporcional a mi productividad”.&amp;#160;&amp;#160; : )&lt;/p&gt;  &lt;p&gt;Hay dos matices que considero bastante descriptivos en cuanto a LOC:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Para lo único que LOC es una medida válida es para medir el tamaño de la base de código de un proyecto. &lt;/li&gt;    &lt;li&gt;Un valor de LOC enorme en nuestra codebase no resulta ser, en muchas ocasiones, algo bueno. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Mi opinión personal es que LOC es &lt;em&gt;prácticamente&lt;/em&gt; inútil para gestión de proyectos, para lo único que nos sirve es para hacer análisis del tipo:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;El módulo A es el doble de grande que el módulo B. (considerando que ambos están escritos en el mismo lenguaje (aunque esto sería también discutible, hay estudios que afirman que LOC es independiente del lenguaje empleado, pero no estoy de acuerdo en la mayoría de casos), que las coding guidelines son las mismas para ambos, etc… En cualquier otro caso, ni siquiera serían comparables) &lt;/li&gt;    &lt;li&gt;El módulo C ha crecido un 25% en los últimos 6 meses. &lt;/li&gt;    &lt;li&gt;Podemos ver cómo el módulo D tiene un elevado número de bugs, debido a su gran tamaño. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Para cuestiones relacionadas con el análisis del crecimiento/progreso en un determinado proyecto, es claramente mejor fijarse en otras métricas diferentes a LOC, como por ejemplo el número de &lt;em&gt;features&lt;/em&gt; completadas/pendientes, etc. Si empleáramos LOC, el análisis sería incorrecto ya que alguien podría añadir 1.000 líneas de código a un proyecto sin completar una &lt;em&gt;feature&lt;/em&gt; concreta, de igual forma que alguien podría eliminar 1.000 líneas de código y ser capaz de completar tres &lt;em&gt;features&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;Respecto a este último ejemplo, comentar que un índice LOC negativo es en bastantes casos el resultado de un trabajo de refactorización de código realizado como parte de la implementación de una nueva feature y puede tener un impacto significativo en el tamaño global de nuestra base de código.&lt;/p&gt;  &lt;p&gt;Ahora que ya os he dado mi opinión personal, veamos qué dicen otras fuentes más documentadas que yo al respecto. Por ejemplo, la siguiente tabla (extraída del libro &lt;a href="http://www.cc2e.com/" target="_blank"&gt;“Code Complete”&lt;/a&gt;) nos muestra la relación entre el tamaño del proyecto y el LOC por persona/año: &lt;/p&gt;  &lt;div align="center"&gt;   &lt;table border="1" cellspacing="0" cellpadding="2" width="400" align="center"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="200"&gt;&lt;strong&gt;Tamaño del proyecto (LOC)&lt;/strong&gt;&lt;/td&gt;          &lt;td valign="top" width="200"&gt;&lt;strong&gt;LOC por persona/año&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;1.000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;2.5K - 25K&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;10.000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;2K - 25K&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;100.000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;1K - 20K&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;1.000.000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;0.7K - 10K&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="200"&gt;10.000.000&lt;/td&gt;          &lt;td valign="top" width="200"&gt;0.3K - 5K&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;  &lt;p&gt;El aspecto a destacar en esta tabla es que la cantidad de líneas de código que un desarrollador es capaz de escribir &lt;strong&gt;disminuye&lt;/strong&gt; a medida que el proyecto aumenta de tamaño. Esto se debe a diversos factores, como son el hecho de que la complejidad aumenta, el impacto de las modificaciones realizadas es mucho mayor en otras partes del proyecto, el esfuerzo de testing necesario aumenta, el número de bugs aumenta, etc.&lt;/p&gt;  &lt;p&gt;Por tanto, idealmente, un buen desarrollador no es aquel con mayor LOC, sino con mayor ratio Feature/LOC ya que eso significaría que el desarrollador está implementando nuevas funcionalidades (y por tanto aportando valor añadido para el cliente) a la vez que mantiene el tamaño de code base en unos límites razonables, lo cual permite incrementar la productividad de él mismo y del resto de compañeros en el equipo de desarrollo del proyecto.&lt;/p&gt;  &lt;p&gt;Otros factores negativos sobre LOC los podemos encontrar en el libro &lt;a href="http://mcgraw-hill.com.au/html/9780071502443.html" target="_blank"&gt;“Applied Software Measurement” de Capers Jones&lt;/a&gt;, entre los que destacaré los siguientes:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Las métricas LOC penalizan a los lenguajes de programación de alto nivel. &lt;/li&gt;    &lt;li&gt;Análisis comparativos de proyectos en los que se ha empleado más de un lenguaje de programación y que se fundamenten en LOC deberán ser considerados una mala práctica profesional. &lt;/li&gt;    &lt;li&gt;Las métricas de “Coste por bug” penalizan la calidad y hacen que un software lleno de bugs pueda parecer mejor de lo que en realidad es, a juzgar por los resultados de un estudio basado en LOC. Para este tipo de estudios, es mejor emplear métricas de Puntos de Función. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Por último, me gustaría recomendar otro libro bastante interesante &lt;a href="http://www.amazon.com/Measuring-Managing-Performance-Organizations-Robert/dp/0932633366" target="_blank"&gt;“Measuring and Managing Performance in Organizations”&lt;/a&gt;, de Robert Austin. En este libro, Austin entrevista a varios expertos de la industria del software que aportan su opinión acerca de qué cosas conviene (o no) medir. Al final, casi todos ellos coinciden en que medir todo aquello que convendría medir en el desarrollo software es prácticamente imposible…&lt;/p&gt;  &lt;p&gt;Merry Christmas!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=163183" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="metodolog&amp;#237;as" scheme="http://geeks.ms/blogs/mllopis/archive/tags/metodolog_26002300_237_3B00_as/default.aspx" /></entry><entry><title>De Oslo a SQL Server Modeling: Anunciando nuestra nueva CTP de Noviembre de 2009</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/11/19/de-oslo-a-sql-server-modeling-anunciando-nuestra-nueva-ctp-de-noviembre-de-2009.aspx" /><id>/blogs/mllopis/archive/2009/11/19/de-oslo-a-sql-server-modeling-anunciando-nuestra-nueva-ctp-de-noviembre-de-2009.aspx</id><published>2009-11-19T08:58:00Z</published><updated>2009-11-19T08:58:00Z</updated><content type="html">&lt;p&gt;Una caracter&amp;iacute;stica com&amp;uacute;n a todos los grupos de producto en Microsoft es su trabajo constante para mejorar y refinar sus tecnolog&amp;iacute;as. Este hecho se cumple a&amp;uacute;n cuando hay que afrontar diversos cambios tales como cambios en la organizaci&amp;oacute;n o tambi&amp;eacute;n el renombrado de dichos productos, as&amp;iacute; como encontrar para ellos una v&amp;iacute;a que los conduzca a un lanzamiento exitoso.&lt;/p&gt;
&lt;p&gt;En este caso, ha llegado la hora de anunciar el cambio de nombre de lo que hasta ahora conoc&amp;iacute;amos con el nombre de &lt;strong&gt;OSLO&lt;/strong&gt;. Nuestro nuevo nombre es:&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt; SQL Server Modeling&lt;/span&gt;&lt;/strong&gt;. Este cambio, del cual &lt;a target="_blank" href="http://geeks.ms/blogs/mllopis/archive/2009/08/19/update-191-qu-233-hay-de-nuevo-por-oslo.aspx"&gt;ya os habl&amp;eacute; hace unos meses&lt;/a&gt;, no deber&amp;iacute;a coger por sorpresa a nadie puesto que algunas de las tecnolog&amp;iacute;as inclu&amp;iacute;das en OSLO, como por ejemplo &lt;strong&gt;Quadrant&lt;/strong&gt;, han estado siempre ligadas a SQL Server y otras, como el repositorio de modelos, directamente implementadas sobre&lt;strong&gt; SQL Server&lt;/strong&gt;. Incluso en el caso de una tecnolog&amp;iacute;a como el&lt;strong&gt; lenguaje M&lt;/strong&gt;, a priori agn&amp;oacute;stico en cuanto al motor de bases de datos subyacente, tiene una sinergia natural con SQL Server.&lt;/p&gt;
&lt;p&gt;Por supuesto, hay una serie de dudas y cuestiones que afloran como consecuencia de este cambio de nombre del proyecto, de las cuales probablemente est&amp;eacute;is ya al tanto&amp;hellip; No obstante, la respuesta m&amp;aacute;s clara, concisa y sonora que os puedo dar es:&lt;strong&gt;&lt;em&gt; independientemente del nombre bajo el que se aglutinen estas tecnolog&amp;iacute;as, el compromiso por parte del equipo de producto sigue siendo absoluto con todas y cada una de ellas&lt;/em&gt;&lt;/strong&gt;. Ahora, las respuestas largas para cada una de estas preguntas las pod&amp;eacute;is encontrar en esta p&amp;aacute;gina de &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/dd129873.aspx"&gt;Q&amp;amp;A&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Al margen de esta reflexi&amp;oacute;n, la gran noticia en torno a &lt;span style="text-decoration:line-through;"&gt;Oslo&lt;/span&gt; SQL Server Modeling esta semana ha sido el lanzamiento de una nueva CTP: &lt;strong&gt;&lt;a target="_blank" href="http://go.microsoft.com/?linkid=9648442"&gt;SQL Server Modeling November 2009 CTP&lt;/a&gt;&lt;/strong&gt;. Esta CTP contiene nuevas versiones del &lt;strong&gt;lenguaje M&lt;/strong&gt;, el dise&amp;ntilde;ador &lt;strong&gt;Quadrant&lt;/strong&gt;, y de&lt;strong&gt; SQL Server Modeling Services&lt;/strong&gt; (previamente conocidos como &amp;ldquo;el repositorio de modelos de Oslo&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Los aspectos generales acerca de estas novedades en nuestras tecnolog&amp;iacute;as los pod&amp;eacute;is encontrar en las &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/dd823315.aspx"&gt;Release Notes&lt;/a&gt;, as&amp;iacute; como en nuevos art&amp;iacute;culos publicados en &lt;a target="_blank" href="http://msdn.microsoft.com/library/cc709420.aspx"&gt;MSDN Library&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Sin embargo, me gustar&amp;iacute;a destacar aquellos que, a priori, considero m&amp;aacute;s relevantes&amp;hellip;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;Cambios Generales&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El primer cambio que notar&amp;eacute;is al instalar esta nueva CTP es que el nombre de Oslo ha desaparecido (sniff sniff), tanto en el proceso de instalaci&amp;oacute;n, como en el men&amp;uacute; de inicio. Sin embargo, a&amp;uacute;n encontrar&amp;eacute;is el nombre de Oslo en la carpeta de Archivos de Programa, y tambi&amp;eacute;n ver&amp;eacute;is instalada en SQL Server una base de datos llamada &amp;ldquo;Repository&amp;rdquo;, al igual que en anteriores CTPs&amp;hellip;. no nos dio tiempo de cambiar el nombre en todas partes, jeje&amp;hellip; Resumiendo, a pesar de que el nombre de la CTP haya cambiado, estructuralmente veremos lo mismo que en previas CTPs.&lt;/p&gt;
&lt;p&gt;El segundo cambio importante, lo encontrar&amp;eacute;is en los requerimientos de esta CTP: &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx"&gt;Visual Studio 2010 y .Net 4.0 Beta 2&lt;/a&gt;. Si a&amp;uacute;n no hab&amp;eacute;is instalado dichas maravillas tecnol&amp;oacute;gicas, &amp;iexcl;&amp;eacute;ste es el momento perfecto!&amp;nbsp;&amp;nbsp; : )&lt;/p&gt;
&lt;p&gt;Como os dec&amp;iacute;a, no hemos tenido tiempo de modificar el nombre en la parte estructural del proyecto, en buena parte debido a que hemos estado ocupados a&amp;ntilde;adiendo funcionalidades al proyecto&amp;hellip; Entre ellas, las siguientes&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;Cambios en SQL Server Modeling Services&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En primer lugar, el dominio UML incluido en CTPs anteriores (System.UML2) ha sufrido cambios significativos. Estos cambios suponen que aquellos ejemplos creados en CTPs anteriores sobre este dominio no funcionen tal cual, deben ser readaptados. Pero&amp;hellip; a cambio, ahora es posible exportar estos modelos en UML para interoperar con otras herramientas de modelado UML.&lt;/p&gt;
&lt;p&gt;Por otra parte, el modelo correspondiente al CLR (que nos permit&amp;iacute;a realizar queries acerca del uso de nuestros assemblies, entre otras cosas) tambi&amp;eacute;n ha sufrido algunos cambios, especialmente en el modo de funcionamiento de la herramienta LoadAssembly.exe, la cual nos permite cargar assemblies en nuestro repositorio. Si os gusta, como a m&amp;iacute;, el Algebra y est&amp;aacute;is familiarizados con la teor&amp;iacute;a de conjuntos, la forma m&amp;aacute;s precisa de definir estos cambios es: En la versi&amp;oacute;n actual, LoadAssembly ya no calcula y carga en el repositorio la clausura transitiva de todos los ensamblados referenciados por ensamblados especificados en la l&amp;iacute;nea de comandos&amp;rdquo;. Este cambio en la l&amp;oacute;gica de LoadAssembly.exe nos permite evitar cargas duplicadas de metadatos de ensamblados de .Net fx, lo cual, considerando el ahorro espacio-temporal y las mejoras en el rendimiento de LoadAssembly.exe, es una ventaja considerable.&lt;/p&gt;
&lt;p&gt;El &amp;uacute;ltimo aspecto a destacar en cuanto a las novedades en SQL Server Modeling Services es la creaci&amp;oacute;n de un nuevo ejemplo, denominado PatternApplication, el cual nos permite aplicar los patrones del repositorio a un conjunto de modelos, algo que hasta ahora se deb&amp;iacute;a realizar para cada modelo de forma independiente. Pod&amp;eacute;is encontrar este ejemplo &lt;a target="_blank" href="http://code.msdn.microsoft.com/SQLModCTPPatApp"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para m&amp;aacute;s informaci&amp;oacute;n sobre SQL Server Modeling Services, &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/ee720189.aspx"&gt;aqu&amp;iacute; ten&amp;eacute;is la nueva p&amp;aacute;gina en MSDN&lt;/a&gt; (algo de lo que os hablar&amp;eacute; un poco m&amp;aacute;s abajo&amp;hellip;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;Cambios en Quadrant&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quiz&amp;aacute; el cambio m&amp;aacute;s obvio en esta nueva versi&amp;oacute;n de Quadrant sea el esquema de colores de la UI. Hasta el momento, predominaba el color gris y plateado, y &amp;eacute;ste ha sido sustituido por el azul&amp;hellip;&lt;/p&gt;
&lt;p&gt;Pasando a cambios m&amp;aacute;s profundos dentro de Quadrant, ya que para nosotros lo que cuenta es el interior, encontramos como rasgo general el hecho de que la presencia del lenguaje M integrado en Quadrant es notablemente mayor que en la CTP anterior. Algunos lugares donde esta integraci&amp;oacute;n se pone de manifiesto son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es posible escribir c&amp;oacute;digo en M directamente en una hoja de trabajo (File &amp;ndash; New &amp;ndash; M File) y desplegar una base de datos desde aqu&amp;iacute;.&lt;/li&gt;
&lt;li&gt;Si disponemos de una BD ya existente, a pesar de no haber sido creada con M, podemos inferir su modelo y obtener el c&amp;oacute;digo en M necesario para representarla completamente (esquema y datos instanciados). A partir de este punto, y siempre desde dentro de Quadrant, podremos modificar dicho c&amp;oacute;digo en M y actualizar la base de datos posteriormente con estos cambios.&lt;/li&gt;
&lt;li&gt;Una de las caracter&amp;iacute;sticas principales de Quadrant tradicionalmente ha sido su alta capacidad de configuraci&amp;oacute;n y personalizaci&amp;oacute;n de las vistas sobre nuestros datos/modelos. En la CTP actual, adem&amp;aacute;s podemos visualizar estas configuraciones (modelos!!) como c&amp;oacute;digo en M, modificarlo y actualizarlo en el repositorio de Quadrant, pudiendo aplicar dichos cambios al instante en nuestras vistas (probad la opci&amp;oacute;n del men&amp;uacute; Workpad &amp;ndash; View Source).&lt;/li&gt;
&lt;li&gt;El lenguaje M es ahora el lenguaje predeterminado para la barra de consultas de Quadrant, que adem&amp;aacute;s incluye validaci&amp;oacute;n sint&amp;aacute;ctica para queries en M, a medida que las escribimos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Al margen de estos cambios, ha habido otros tantos refinamientos a nivel de UI en Quadrant: auto-ajuste en el tama&amp;ntilde;o de nuestro panel de dise&amp;ntilde;o, control de cambios en nuestros esquemas, resoluci&amp;oacute;n de conflictos entre versiones y manejo de errores.&lt;/p&gt;
&lt;p&gt;Una de las caracter&amp;iacute;sticas con la que os recomiendo jugar en esta nueva versi&amp;oacute;n de Quadrant es el concepto de comandos y visores personalizados. Un ejemplo que ilustra esta nueva funcionalidad es el de &amp;ldquo;Media Library for Quadrant&amp;rdquo;, disponible &lt;a target="_blank" href="http://code.msdn.microsoft.com/SQLServerModelingCTP"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Otros cambios dignos de menci&amp;oacute;n en esta versi&amp;oacute;n de Quadrant:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nueva consola para T-SQL.&lt;/li&gt;
&lt;li&gt;Mejoras de rendimiento, incluyendo virtualizaci&amp;oacute;n de tablas.&lt;/li&gt;
&lt;li&gt;Soporte para autenticaci&amp;oacute;n en SQL Server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por si esto fuera poco, coincidiendo con el lanzamiento de esta CTP, nuestros compa&amp;ntilde;eros PMs de Quadrant han publicado &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/dd229322.aspx#quadrant"&gt;una serie de videos explicando algunos de los escenarios principales de Quadrant&lt;/a&gt;. Uno de mis favoritos es &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/ee789913.aspx"&gt;Quadrant UI Overview&lt;/a&gt;, el cual muestra c&amp;oacute;mo personalizar la visualizaci&amp;oacute;n de datos en Quadrant de formas que ninguna otra herramienta actual es capaz de hacer. WOW!!&lt;/p&gt;
&lt;p&gt;Para m&amp;aacute;s informaci&amp;oacute;n sobre Quadrant, pod&amp;eacute;is acceder a la &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/data/ee720190.aspx"&gt;nueva p&amp;aacute;gina de Quadrant en MSDN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;El lenguaje M y herramientas relacionadas&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bueno, llegamos a la parte de mi querido M&amp;hellip; Esta vez, he procurado dejarlo para el final y tratar&amp;eacute; de ser breve, para posteriormente ampliar informaci&amp;oacute;n en futuros posts&amp;hellip;&amp;nbsp; ; )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;iquest;Qu&amp;eacute; hay de nuevo en M en esta CTP?&lt;/em&gt;&lt;/strong&gt; Al margen de la integraci&amp;oacute;n con Quadrant de la que hablaba previamente (y que bastantes horas de trabajo ha supuesto&amp;hellip;) podemos destacar las siguientes novedades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las entidades y colecciones ahora soportan evaluaciones de igualdad.&lt;/li&gt;
&lt;li&gt;Nuevos operadores l&amp;oacute;gicos a&amp;ntilde;adidos al lenguaje.&lt;/li&gt;
&lt;li&gt;Concatenaci&amp;oacute;n de strings con el operador &amp;ldquo;+&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Acceso a miembros en expresiones.&lt;/li&gt;
&lt;li&gt;Proyecciones.&lt;/li&gt;
&lt;li&gt;Soporte para el operador .Count&lt;/li&gt;
&lt;li&gt;Conversiones de tipos.&lt;/li&gt;
&lt;li&gt;Expresiones en la parte derecha de nuestras gram&amp;aacute;ticas (para los puristas del mundo de las gram&amp;aacute;ticas, expresiones en RHS).&lt;/li&gt;
&lt;li&gt;Capacidad para referenciar instancias etiquetadas de entidades en expresiones, y tambi&amp;eacute;n en sucesivos episodios de compilaci&amp;oacute;n (entre m&amp;oacute;dulos importados/exportados, im&amp;aacute;genes, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Resumiendo:&lt;/strong&gt; Ha sido necesario reponer varias veces al d&amp;iacute;a las m&amp;aacute;quinas de caf&amp;eacute; en zonas cercanas a nuestros pasillos&amp;hellip;!!&lt;/p&gt;
&lt;p&gt;Al margen de estas novedades, hay una serie de &amp;ldquo;breaking changes&amp;rdquo; en algunas sentencias del lenguaje, az&amp;uacute;car sint&amp;aacute;ctico fundamentalmente, en lo referido a la creaci&amp;oacute;n de colecciones ( T* ahora es {T*}, T#n ahora es {T#n}, etc.). Pod&amp;eacute;is encontrar m&amp;aacute;s informaci&amp;oacute;n al respecto en las &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/dd823315.aspx"&gt;Release Notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;M&amp;aacute;s all&amp;aacute; de los cambios en el lenguaje, ha habido cambios interesantes en las herramientas que rodean a M, como por ejemplo en Intellipad: capacidad para comentar bloques completos de c&amp;oacute;digo, coloreado de sintaxis, y la capacidad de realizar ingenier&amp;iacute;a inversa sobre cualquier base de datos en SQL Server y obtener el correspondiente c&amp;oacute;digo en M, tal cual comentaba previamente. &lt;/p&gt;
&lt;p&gt;Por &amp;uacute;ltimo, hay novedades importantes en los tipos de proyectos en M dentro de Visual Studio 2010 Beta 2, pero eso os dejo que lo descubr&amp;aacute;is vosotros mismos&amp;hellip;&amp;nbsp; ;-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;MSDN: It&amp;rsquo;s All About Data&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este es el lema de las camisetas que hemos creado con motivo del PDC 2009 en nuestro equipo, y en cierto modo, es el perfecto resumen para hablar de los cambios en nuestra web de MSDN tambi&amp;eacute;n. Como consecuencia de los cambios organizacionales, fusiones con otros equipos, asociaciones, etc. nuestro MSDN Oslo Developer Center ha pasado a ser m&amp;aacute;s amplio y a cambiar de ubicaci&amp;oacute;n. Ahora, nos referiremos a &amp;eacute;l como &lt;a target="_blank" href="http://msdn.com/data"&gt;Data Developer Center&lt;/a&gt;, y engloba tecnolog&amp;iacute;as como&lt;strong&gt; ADO.Net EF&lt;/strong&gt;, &lt;strong&gt;Astoria&lt;/strong&gt;, &lt;strong&gt;XML&lt;/strong&gt;, &lt;strong&gt;LINQ2SQL&lt;/strong&gt; y, por supuesto, &lt;strong&gt;SQL Server Modeling&lt;/strong&gt;! &lt;/p&gt;
&lt;p&gt;Para terminar el post, no me queda m&amp;aacute;s que recordaros la existencia de nuestro &lt;a target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/oslo/threads/"&gt;SQL Server Modeling Forum&lt;/a&gt; y sitio web de connect &lt;a target="_blank" href="https://connect.microsoft.com/sqlmodeling"&gt;SQL Server Modeling Connect&lt;/a&gt; (previamente, M Spec Community).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HAPPY MODELING!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160827" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="SQL Server" scheme="http://geeks.ms/blogs/mllopis/archive/tags/SQL+Server/default.aspx" /><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /><category term="sql server modeling" scheme="http://geeks.ms/blogs/mllopis/archive/tags/sql+server+modeling/default.aspx" /></entry><entry><title>Ya disponible Microsoft SDK for Facebook Platform… por fin!!</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/11/11/ya-disponible-microsoft-sdk-for-facebook-platform-por-fin.aspx" /><id>/blogs/mllopis/archive/2009/11/11/ya-disponible-microsoft-sdk-for-facebook-platform-por-fin.aspx</id><published>2009-11-11T00:04:48Z</published><updated>2009-11-11T00:04:48Z</updated><content type="html">&lt;p&gt;Ya está disponible para descarga gratuita la &lt;strong&gt;SDK de Microsoft para desarrollo de aplicaciones en Facebook&lt;/strong&gt;. Esta SDK proporciona un conjunto de librerías cuyas funcionalidades son capaces de competir con las de las SDKs ya existentes para Facebook desarrolladas en PHP y JavaScript.&lt;/p&gt;  &lt;p&gt;Entre las posibilidades que se abren, se encuentra la capacidad para incorporar aplicaciones web desarrolladas en ASP.Net o Silverlight a Facebook, haciendo uso de las características sociales de Facebook (listas de amigos, informacion de nuestro perfil, etc.). Tambien es posible emplear estas librerías en nuestras aplicaciones de escritorio WPF y WinForms, para dotarlas de servicios de Facebook….&lt;/p&gt;  &lt;p&gt;Más información, ejemplos, tutoriales, descargas… aquí: &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.infoworld.com/d/developer-world/microsoft-brings-silverlight-facebook-592" href="http://www.infoworld.com/d/developer-world/microsoft-brings-silverlight-facebook-592"&gt;http://www.infoworld.com/d/developer-world/microsoft-brings-silverlight-facebook-592&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;  &lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160280" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="WPF" scheme="http://geeks.ms/blogs/mllopis/archive/tags/WPF/default.aspx" /><category term="asp.net" scheme="http://geeks.ms/blogs/mllopis/archive/tags/asp.net/default.aspx" /><category term="silverlight" scheme="http://geeks.ms/blogs/mllopis/archive/tags/silverlight/default.aspx" /></entry><entry><title>Channel 9 Expert-to-Expert: Don Box y Erik Meijer reflexionan sobre la historia de SOAP, la programación/modelado de datos, cómo no, el lenguaje M.</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/10/31/channel-9-expert-to-expert-don-box-y-erik-meijer-reflexionan-sobre-la-historia-de-soap-la-programaci-243-n-modelado-de-datos-c-243-mo-no-el-lenguaje-m.aspx" /><id>/blogs/mllopis/archive/2009/10/31/channel-9-expert-to-expert-don-box-y-erik-meijer-reflexionan-sobre-la-historia-de-soap-la-programaci-243-n-modelado-de-datos-c-243-mo-no-el-lenguaje-m.aspx</id><published>2009-10-31T09:40:00Z</published><updated>2009-10-31T09:40:00Z</updated><content type="html">&lt;p&gt;Desde sus inicios, he sido un gran seguidor de la serie Expert-To-Expert de Channel 9, en la que el gran &lt;strong&gt;Erik Meijer&lt;/strong&gt; realiza entrevistas profundamente t&amp;eacute;cnicas sobre alguna tecnolog&amp;iacute;a concreta a sus respectivos creadores. Entre los cap&amp;iacute;tulos de la serie que recuerdo con mayor cari&amp;ntilde;o/admiraci&amp;oacute;n, debo destacar el cap&amp;iacute;tulo sobre &lt;a target="_blank" href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Anders-Hejlsberg-The-Future-of-C/"&gt;el futuro del lenguaje C# con Anders Hejlsberg&lt;/a&gt;, el de &lt;a target="_blank" href="http://channel9.msdn.com/shows/Going+Deep/Joe-Duffy-Perspectives-on-Concurrent-Programming-and-Parallelism/"&gt;perspectivas sobre Paralelismo y Programaci&amp;oacute;n Concurrente con Joe Duffy&lt;/a&gt;, la &lt;a target="_blank" href="http://channel9.msdn.com/posts/Charles/Expert-to-Expert-Martin-Fowler-and-Chris-Sells-Perspectives-on-Domain-Specific-Languages/"&gt;importancia de los DSLs con &amp;ldquo;los grandes&amp;rdquo; Martin Fowler y Chris Sells&lt;/a&gt;, y los &lt;a target="_blank" href="http://channel9.msdn.com/posts/Charles/Expert-to-Expert-The-Basics-of-SmallBasic/"&gt;fundamentos del lenguaje Small Basic con su creador el amigo Vijaye Raji&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En esta ocasi&amp;oacute;n, le ha tocado el turno a Don Box, quien se sienta un rato en nuestra antigua sala de Scrum (snif snif) a dialogar con Erik Meijer acerca de la historia de SOAP, las principales decisiones que motivaron su dise&amp;ntilde;o all&amp;aacute; por finales de los 90, y posteriormente hablan sobre los conceptos que hoy en d&amp;iacute;a ocupan a Don: las tecnolog&amp;iacute;as de programaci&amp;oacute;n/modelado de datos, y concretamente, el lenguaje M.&lt;/p&gt;
&lt;p align="center"&gt;
&lt;object type="application/x-silverlight-2" height="384" width="512" data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAIAADqNAAAsCcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/E2E-Erik-Meijer-and-Don-Box-Perspectives-on-SOAP-Programming-Data-and-M/"&gt;Enlace alternativo por si no se ve el video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;iexcl;Disfrutadla!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159717" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="channel9" scheme="http://geeks.ms/blogs/mllopis/archive/tags/channel9/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /></entry><entry><title>System.Collections.Concurrent: Estructuras de datos para computación paralela en .Net 4.0</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/10/31/system-collections-concurrent-estructuras-de-datos-para-computaci-243-n-paralela-en-net-4-0.aspx" /><id>/blogs/mllopis/archive/2009/10/31/system-collections-concurrent-estructuras-de-datos-para-computaci-243-n-paralela-en-net-4-0.aspx</id><published>2009-10-31T09:05:00Z</published><updated>2009-10-31T09:05:00Z</updated><content type="html">&lt;p&gt;Una de las principales novedades introducidas en .net 4.0 y Visual Studio 2010 es la inclusi&amp;oacute;n de mecanismos para la resoluci&amp;oacute;n de problemas de computaci&amp;oacute;n paralela. Este soporte se ha incorporado de muy diversas formas a nuestro querido framework, mediante la adici&amp;oacute;n de nuevas instrucciones con capacidades de multiprocesamiento tales como los bucles paralelos (Parallel.Foreach, etc), operadores de consultas LINQ paralelos (PLINQ), invocaciones paralelas (Parallel_Invoke), encadenamiento de operaciones (Continuations), entre otras&amp;hellip;&lt;/p&gt;
&lt;p&gt;Tradicionalmente, los problemas fundamentales de la Programaci&amp;oacute;n Concurrente han sido la implementaci&amp;oacute;n de mecanismos efectivos para la &lt;b&gt;comunicaci&amp;oacute;n&lt;/b&gt; y &lt;b&gt;sincronizaci&amp;oacute;n&lt;/b&gt;. Por una parte, perseguimos el objetivo de la compartici&amp;oacute;n de informaci&amp;oacute;n entre procesos (por ejemplo, el uso de los resultados de un proceso como valores de entrada para el otro), y por otra parte, buscamos que dicha comunicaci&amp;oacute;n a nivel de datos sea sincronizada (de modo que un proceso &amp;ldquo;espere&amp;rdquo; datos tan s&amp;oacute;lo en el momento adecuado, cuando estos est&amp;eacute;n disponibles, ya que de lo contrario se producir&amp;iacute;an situaciones como la espera ocupada (implementada habitualmente del modo: &lt;em&gt;while(true) { TryToRead(buffer); }&lt;/em&gt;, que degradar&amp;iacute;an el rendimiento de nuestro programa).&lt;/p&gt;
&lt;p&gt;Estas situaciones se han tratado de resolver mediante el uso de &lt;b&gt;memoria compartida&lt;/b&gt; entre los distintos agentes/procesos/hilos de nuestra aplicaci&amp;oacute;n concurrente (escoged alguna de esas tres palabras dependiendo del nivel de granularidad de nuestro paralelismo, o del patr&amp;oacute;n de concurrencia que vayamos a emplear). Para controlar el acceso a esta memoria compartida, se han implementado mecanismos cuya funci&amp;oacute;n principal consiste en aislar en nuestro c&amp;oacute;digo aquellas instrucciones que acceden a esta memoria compartida, bien sea para modificarla o simplemente consultar su contenido (a estos conjuntos de instrucciones en nuestro c&amp;oacute;digo se les suele conocer tambi&amp;eacute;n con el nombre de &lt;b&gt;secciones cr&amp;iacute;ticas&lt;/b&gt;). Dentro de estos mecanismos de control para el acceso a la secci&amp;oacute;n cr&amp;iacute;tica, podemos encontrar diversas aproximaciones, como los &lt;i&gt;sem&amp;aacute;foros&lt;/i&gt;, &lt;i&gt;monitores&lt;/i&gt; o procedimientos para el &lt;i&gt;paso de mensajes&lt;/i&gt; (que a su vez pueden ser de tipo bloqueante o no bloqueante). &lt;/p&gt;
&lt;p&gt;El uso de estos mecanismos b&amp;aacute;sicos ha sido a menudo una dificultad a&amp;ntilde;adida a la tarea del programador, que ha sumado una complejidad excesiva al proceso de abstracci&amp;oacute;n del problema concurrente y su implementaci&amp;oacute;n posterior. &lt;/p&gt;
&lt;p&gt;Un enfoque alternativo a este problema consiste en el uso de abstracciones que nos proporcionen una implementaci&amp;oacute;n de estos mecanismos de control de acceso a las zonas de memoria compartida de forma totalmente &lt;b&gt;transparente&lt;/b&gt; al desarrollador. De este modo, resultar&amp;aacute; m&amp;aacute;s sencillo centrarse en la resoluci&amp;oacute;n del problema concreto que le ocupa, y abstraer los mecanismos de control de operaciones b&amp;aacute;sicas de memoria sobre las cuales deber&amp;aacute; apoyarse para alcanzar su soluci&amp;oacute;n pero que, por otra parte, resultan comunes a cualquier problema de tipo concurrente. &lt;/p&gt;
&lt;p&gt;Es sobre este &amp;uacute;ltimo grupo, estructuras de datos para computaci&amp;oacute;n paralela, sobre el que me gustar&amp;iacute;a hablaros en este post: las nuevas estructuras de datos con soporte para concurrencia introducidas en el .Net framework 4.0, concretamente en el namespace:&lt;b&gt;&lt;i&gt; System.Collections.Concurrent&lt;/i&gt;&lt;/b&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Dentro de este espacio de nombres, podremos encontrar las siguientes estructuras de datos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;BlockingCollection&amp;lt;T&amp;gt;&lt;/b&gt;: Se trata de una estructura que nos proporciona acceso a una colecci&amp;oacute;n de elementos. El acceso a esta colecci&amp;oacute;n se puede bloquear/desbloquear y tambi&amp;eacute;n es posible acotar su capacidad.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcurrentBag&amp;lt;T&amp;gt;&lt;/b&gt;: Colecci&amp;oacute;n no ordenada de objetos.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ConcurrentDictionary&amp;lt;TKey, Value&amp;gt;&lt;/b&gt;: Colecci&amp;oacute;n de tuplas key-value a la que se puede acceder concurrentemente.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OrderablePartitioner(TSource)&lt;/b&gt;: Permite configurar la forma en que prentendemos dividir los datos procedentes de un determinado origen en un conjunto de particiones. Idealmente, es la colecci&amp;oacute;n inicial a emplear ante problemas del tipo &amp;ldquo;divide y vencer&amp;aacute;s&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Partitioner(TSource)&lt;/b&gt;: Similar al anterior, pero en esta ocasi&amp;oacute;n dispondremos de una serie de m&amp;eacute;todos de particionado predefinidos, que podremos aplicar sobre arrays, listas y otros objetos enumerables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seguidamente, mostraremos un ejemplo del uso de estas estructuras de datos en un problema cl&amp;aacute;sico de la Programaci&amp;oacute;n Concurrente: &lt;a href="http://en.wikipedia.org/wiki/Producer-consumer_problem"&gt;el problema del productor-consumidor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style="text-decoration:underline;"&gt;Soluci&amp;oacute;n al problema del Productor-Consumidor empleando BlockingCollection&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Resumiendo a grandes rasgos este problema, trataremos de resolver una situaci&amp;oacute;n en la que dos tipos de procesos diferentes se comunican a trav&amp;eacute;s de un buffer de forma concurrente. Mientras uno de los dos procesos (el productor) escribe bloques de informaci&amp;oacute;n en dicho buffer a medida que dispone de ellos, el otro (consumidor) se encarga de leerlos.&lt;/p&gt;
&lt;p&gt;Existen diferentes variantes del problema: cambiando el n&amp;uacute;mero de productores o de consumidores presentes, modificando las caracter&amp;iacute;sticas del buffer de forma que &amp;eacute;ste pueda tener un tama&amp;ntilde;o limitado o infinito, o tambi&amp;eacute;n alterando la persistencia de los contenidos del buffer (por ejemplo, si un bloque de datos es borrado del buffer tras haber sido le&amp;iacute;do por un consumidor).&lt;/p&gt;
&lt;p&gt;Vamos a ver c&amp;oacute;mo implementar algunos de estos patrones concurrentes mediante el uso de &lt;strong&gt;BlockingCollection&amp;lt;T&amp;gt;&lt;/strong&gt;, proporcionada por el espacio de nombres de .Net 4.0: System.Collections.Concurrent, tal cual coment&amp;aacute;bamos antes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Productor-Consumidor (1:1) con buffer ilimitado e informaci&amp;oacute;n no persistente:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En este caso, crearemos dos nuevas tareas Producer y Consumer, haciendo uso del objeto Task (Task.Factory.StartNew). El Producer generar&amp;aacute; valores aleatorios que escribir&amp;aacute; en el buffer mediante el uso del m&amp;eacute;todo Add() del mismo. Ser&amp;aacute; necesario realizar una llamada al m&amp;eacute;todo CompleteAdding() para indicar que la actual operaci&amp;oacute;n de escritura sobre el buffer se ha completado.&lt;/p&gt;
&lt;p&gt;Por su parte, el consumidor leer&amp;aacute; los elementos presentes en el buffer iterando sobre el mismo. El m&amp;eacute;todo GetConsumingEnumerable() nos permite obtener nuestra BlockingCollection&amp;lt;int&amp;gt; como IEnumerable&amp;lt;int&amp;gt;. Por &amp;uacute;ltimo, el consumidor se quedar&amp;aacute; a la espera de nuevos valores a&amp;ntilde;adidos al buffer por parte del productor (consumer.Wait()).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Concurrent;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Threading.Tasks;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Threading;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; ProducerConsumer&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            BlockingCollection&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt; buffer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BlockingCollection&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            var producer = Task.Factory.StartNew(() =&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Random rand = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Random();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 3; i++)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        Thread.Sleep(1000);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; item = rand.Next();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        buffer.Add(item);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                        Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Productor escribe {0} &lt;/span&gt;, item);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                                            en el buffer&amp;quot;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    buffer.CompleteAdding();                    &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                });&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            var consumer = Task.Factory.StartNew(() =&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; buffer.GetConsumingEnumerable())&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    Console.WriteLine(&lt;span style="color:#006080;"&gt;&amp;quot;Consumidor lee {0} &lt;/span&gt;, item);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                                            del buffer&amp;quot;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            });&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            consumer.Wait();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Console.ReadLine();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El resultado podemos verlo a continuaci&amp;oacute;n, el productor genera tres valores aleatorios y los escribe en el buffer, mientras que el lector leer&amp;aacute; cada uno de ellos del buffer y los muestra.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_0499A910.png"&gt;&lt;img height="266" width="523" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_0E126786.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Productor-Consumidor (1:1) con buffer ilimitado e informaci&amp;oacute;n persistente:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En este segundo escenario, las restricciones del problema ser&amp;aacute;n las mismas que en el caso anterior, con la &amp;uacute;nica diferencia de que la informaci&amp;oacute;n escrita en el buffer&amp;nbsp;no ser&amp;aacute; eliminada despu&amp;eacute;s de que el consumidor la haya utilizado.&lt;/p&gt;
&lt;p&gt;Para ello, tan s&amp;oacute;lo deberemos cambiar una l&amp;iacute;nea en el c&amp;oacute;digo mostrado anteriormente, en lugar de acceder en el consumidor al buffer mediante el met&amp;oacute;do buffer.GetConsumingEnumerable() accederemos de la siguiente forma: &lt;em&gt;foreach(var item in buffer)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Productores &amp;ndash; Consumidores (N:N) con buffer ilimitado e informaci&amp;oacute;n no persistente.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En este caso, la &amp;uacute;nica diferencia con respecto a los escenarios anteriores es que deberemos &amp;ldquo;envolver&amp;rdquo; la creaci&amp;oacute;n del productor y del consumidor en sendos bucles, para generar el n&amp;uacute;mero deseado de productores y de consumidores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Productores-Consumidores (N:N) con buffer limitado e informaci&amp;oacute;n no persistente.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La &amp;uacute;ltima variante que veremos hoy sobre el problema del Productor-Consumidor es la relacionada con la limitaci&amp;oacute;n del tama&amp;ntilde;o de nuestro buffer. En este caso, limitaremos el n&amp;uacute;mero de elementos de nuestra BlockingCollection&amp;lt;int&amp;gt;.&lt;/p&gt;
&lt;p&gt;Para ello, &amp;uacute;nicamente deberemos emplear una de las sobrecargas del constructor de esta clase, indicando el n&amp;uacute;mero de elementos tope de la colecci&amp;oacute;n: &lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;BlockingCollection&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt; buffer = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BlockingCollection&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;(3);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;De este modo, hemos limitado a 3 el n&amp;uacute;mero de elementos que nuestra colecci&amp;oacute;n puede contener. Por tanto, si el productor desea escribir en este buffer y el n&amp;uacute;mero de elementos ha alcanzado el m&amp;aacute;ximo, el propio productor se bloquear&amp;aacute;, dejando paso al consumidor para que consuma un valor, y posteriormente retomando el control sobre el buffer para escribir el valor que ten&amp;iacute;a preparado.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;La elecci&amp;oacute;n de un tama&amp;ntilde;o apropiado para nuestro buffer, as&amp;iacute; como el uso de una cadencia de lectura/escritura (n&amp;uacute;mero de items afectados por cada operaci&amp;oacute;n de acceso al buffer) ser&amp;aacute;n dos decisiones importantes a tomar en este caso. Teniendo en cuenta que, generalmente, las situaciones de bloqueo tienen un efecto positivo y otro negativo. En el lado positivo de la balanza, un bloqueo supone una resoluci&amp;oacute;n a un conflicto coherente con la l&amp;oacute;gica de nuestra soluci&amp;oacute;n, pero por otra parte, supone cierta degradaci&amp;oacute;n en el rendimiento de nuestra aplicaci&amp;oacute;n concurrente.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;Happy Coding!&lt;/strong&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159716" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term=".net 4.0" scheme="http://geeks.ms/blogs/mllopis/archive/tags/.net+4.0/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/mllopis/archive/tags/C_2300_/default.aspx" /><category term="paralel computing" scheme="http://geeks.ms/blogs/mllopis/archive/tags/paralel+computing/default.aspx" /></entry><entry><title>Calentando motores para el PDC 09</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/10/06/calentando-motores-para-el-pdc-09.aspx" /><id>/blogs/mllopis/archive/2009/10/06/calentando-motores-para-el-pdc-09.aspx</id><published>2009-10-06T01:00:00Z</published><updated>2009-10-06T01:00:00Z</updated><content type="html">&lt;p&gt;Queda menos de un mes y medio para la pr&amp;oacute;xima edici&amp;oacute;n del &lt;strong&gt;&lt;a href="http://www.microsoftpdc.com/"&gt;PDC&lt;/a&gt;&lt;/strong&gt;, a celebrarse en Los Angeles (California) entre el 17 y el 19 de Noviembre, y a pesar de que son muchas las novedades que veremos all&amp;iacute;, me gustar&amp;iacute;a anunciaros las sesiones relativas a &lt;span style="text-decoration:line-through;"&gt;Oslo&lt;/span&gt; nuestra plataforma de modelado: lenguaje M, Quadrant y Repositorio.&lt;/p&gt;
&lt;p&gt;Por el momento, tenemos confirmadas las siguientes sesiones (a falta de alguna m&amp;aacute;s, todav&amp;iacute;a en proceso)&amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://microsoftpdc.com/Sessions/P09-04"&gt;Data Programming and Modeling for the Microsoft .Net Developer&lt;/a&gt;&lt;/strong&gt;: En esta charla eminentemente pr&amp;aacute;ctica, los amigos&lt;strong&gt; Don Box&lt;/strong&gt; y &lt;strong&gt;Chris Anderson&lt;/strong&gt; mostrar&amp;aacute;n las mejoras introducidas en forma de herramientas, lenguajes y frameworks para simplificar la forma de modelar, consumir o producir datos. Imprescindible asistir a esta charla si quieres estar informado acerca del futuro en el &amp;aacute;mbito del modelado y programaci&amp;oacute;n sobre datos utilizando productos y servicios de Microsoft.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT34"&gt;&lt;strong&gt;Microsoft project code name &amp;ldquo;M&amp;rdquo;, the Data and Modeling Language&lt;/strong&gt;&lt;/a&gt;: Esta sesi&amp;oacute;n servir&amp;aacute; para repasar los conceptos fundamentales del lenguaje de modelado M, c&amp;oacute;mo crear DSLs y esquemas de datos, y tambi&amp;eacute;n explorar&amp;aacute; el futuro del lenguaje M, en el cual ambos conceptos converger&amp;aacute;n en un &amp;uacute;nico lenguaje, as&amp;iacute; como otro conjunto bastante interesante de caracter&amp;iacute;sticas. La sesi&amp;oacute;n ser&amp;aacute; presentada por &lt;strong&gt;Don Box&lt;/strong&gt; y &lt;strong&gt;Jeff Pinkston&lt;/strong&gt; (a.k.a. Pinky)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://microsoftpdc.com/Sessions/FT50"&gt;&lt;strong&gt;Building Data-Driven applications using Microsoft code name Quadrant and code name M&lt;/strong&gt;&lt;/a&gt;: &lt;span style="text-decoration:line-through;"&gt;&amp;ldquo;El gran&amp;rdquo;&lt;/span&gt; &lt;strong&gt;Chris Sells&lt;/strong&gt; nos contar&amp;aacute;, junto a&lt;span style="text-decoration:line-through;"&gt;l no menos grande&lt;/span&gt; &lt;strong&gt;Doug Purdy&lt;/strong&gt;, c&amp;oacute;mo podemos emplear el dise&amp;ntilde;ador Quadrant y el propio lenguaje M para interactuar con SQL Server con el fin de crear aplicaciones dirigidas por datos, involucrando funcionalidades como el uso de vistas din&amp;aacute;micas y capacidades de edici&amp;oacute;n en aplicaciones multi-usuario. Adem&amp;aacute;s podremos aprender c&amp;oacute;mo el uso combinado de ambas herramientas permite acelerar y simplificar el ciclo de desarrollo de las capas de datos en nuestras aplicaciones SOA desarrolladas en plataforma .net. Por &amp;uacute;ltimo, veremos c&amp;oacute;mo personalizar Quadrant y M para proporcionar experiencias de desarrollo/usuario que sean domain-specific.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://microsoftpdc.com/Sessions/SVR19"&gt;Microsoft project code name &amp;ldquo;Repository&amp;rdquo;, using metadata to drive application design, development and management&lt;/a&gt;&lt;/strong&gt;: El repositorio es probablemente la tecnolog&amp;iacute;a perteneciente a Oslo de la que menos se ha hablado en los &amp;uacute;ltimos meses y, sin embargo, se trata tal vez de la que tendr&amp;aacute; potencialmente un mayor impacto en la arquitectura de nuestras aplicaciones. Mediante el uso de un repositorio central de gesti&amp;oacute;n de metadatos (modelos, configuraciones, etc.), podremos incrementar el control sobre nuestras operaciones de desarrollo, despliegue, mantenimiento y gesti&amp;oacute;n de aplicaciones empresariales. Algunas de las funciones que el uso de este repositorio nos proporciona son: capacidad para realizar an&amp;aacute;lisis de impacto, validaci&amp;oacute;n de la arquitectura de nuestro sistema, gestionar el despliegue y configuraci&amp;oacute;n de nuestras aplicaciones empleando UML, CLR, Identity, etc. Esta sesi&amp;oacute;n correr&amp;aacute; a cargo de &lt;strong&gt;Shoshanna Budzianowsky&lt;/strong&gt; y &lt;strong&gt;Keith Short&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pod&amp;eacute;is encontrar la informaci&amp;oacute;n completa sobre estas y otras sesiones en la web oficial del evento: &lt;a href="http://www.microsoftpdc.com"&gt;http://www.microsoftpdc.com&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Por &amp;uacute;ltimo, adelantaros que en pr&amp;oacute;ximos posts (pre y post PDC) os hablar&amp;eacute; largo y tendido de todos estos conceptos, incluyendo presentaciones, demos, v&amp;iacute;deos y algunas cosas m&amp;aacute;s ;)&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=157449" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="SQL Server" scheme="http://geeks.ms/blogs/mllopis/archive/tags/SQL+Server/default.aspx" /><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="architects" scheme="http://geeks.ms/blogs/mllopis/archive/tags/architects/default.aspx" /><category term=".net 4.0" scheme="http://geeks.ms/blogs/mllopis/archive/tags/.net+4.0/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /></entry><entry><title>Update: ¿Qué hay de nuevo por Oslo?</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/08/19/update-191-qu-233-hay-de-nuevo-por-oslo.aspx" /><id>/blogs/mllopis/archive/2009/08/19/update-191-qu-233-hay-de-nuevo-por-oslo.aspx</id><published>2009-08-19T11:06:00Z</published><updated>2009-08-19T11:06:00Z</updated><content type="html">&lt;p&gt;Hace ya m&amp;aacute;s de un mes desde mi &amp;uacute;ltimo post, concretamente cinco semanas&amp;hellip; Para cumplir con mi promesa de &lt;em&gt;&amp;ldquo;al menos un post al mes&amp;rdquo;&lt;/em&gt; (espero que este mes pueda escribir al menos dos m&amp;aacute;s que guardo en la rec&amp;aacute;mara desde hace varias semanas pero para los que no he encontrado el momento oportuno todav&amp;iacute;a), vuelvo a la carga para actualizar con las &amp;uacute;ltimas novedades en torno a &lt;a href="http://msdn.com/oslo"&gt;Oslo&lt;/a&gt;. `&lt;/p&gt;
&lt;p&gt;[Aviso de antemano: &lt;em&gt;Es un post bastante largo y denso, a&amp;uacute;n as&amp;iacute; te agradecer&amp;eacute; que lo leas y aportes el feedback que te parezca oportuno, ser&amp;aacute; bien recibido.]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hablando desde la &amp;ldquo;l&amp;iacute;nea de combate&amp;rdquo; del proyecto, hace unos d&amp;iacute;as que terminamos una etapa de desarrollo bastante sustancial en nuestro calendario. Esto incluye nuevas caracter&amp;iacute;sticas tanto en el lenguaje M como en Quadrant y nuestro repositorio relacional de modelos, de las cuales os hablar&amp;eacute; pr&amp;oacute;ximamente. En este momento, dedicamos nuestros esfuerzos a estabilizar todas estas nuevas funcionalidades que apenas acaban de aterrizar en el proyecto, cerrar algunos &amp;ldquo;asuntillos&amp;rdquo; pendientes y, b&amp;aacute;sicamente, realizar una parada en boxes para repostar y prepararnos para volver a acelerar en el desarrollo, con una meta parcial en la mente de todos nosotros: &lt;a target="_blank" href="http://microsoftpdc.com/"&gt;PDC 2009&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En otro orden de cosas y hablando desde una perspectiva puramente organizativa del proyecto, la novedad principal es la asociaci&amp;oacute;n del equipo de Oslo con el equipo de &lt;strong&gt;Data Programmability&lt;/strong&gt; (responsables de algunas tecnolog&amp;iacute;as de acceso program&amp;aacute;tico a datos como son ADO.Net, Astoria, EDM y Entity Framework).&lt;/p&gt;
&lt;p&gt;Este movimiento nos aporta una serie de ventajas que repercuten en una mayor especializaci&amp;oacute;n y mejor posicionamiento de nuestras tecnolog&amp;iacute;as, que finalmente resultar&amp;aacute;n en un beneficio global en el ecosistema de desarrollo en .Net framework.&lt;/p&gt;
&lt;p&gt;Para comprender mejor el alcance de dichas mejoras, conviene repasar la evoluci&amp;oacute;n de Oslo, sus l&amp;iacute;neas generales y, por supuesto, tambi&amp;eacute;n la experiencia adquirida a trav&amp;eacute;s del feedback recibido desde la comunidad.&lt;/p&gt;
&lt;p&gt;Hace ya casi dos a&amp;ntilde;os desde el &lt;a target="_blank" href="http://www.microsoft.com/soa/products/oslo.aspx"&gt;primer anuncio oficial sobre Oslo&lt;/a&gt;, realizado en la &lt;strong&gt;SOA &amp;amp; BP Conference&lt;/strong&gt;, en Octubre de 2007 en Redmond. En aquel momento, nos referimos a Oslo como un conjunto de esfuerzos combinados a trav&amp;eacute;s de diferentes tecnolog&amp;iacute;as y productos, para simplificar el ciclo de desarrollo de aplicaciones. Dichos esfuerzos se ver&amp;iacute;an reflejados en diferentes tecnolog&amp;iacute;as existentes: Visual Studio, .Net framework, BizTalk y SQL Server. &lt;/p&gt;
&lt;p&gt;Acerc&amp;aacute;ndonos un poco m&amp;aacute;s en la l&amp;iacute;nea cronol&amp;oacute;gica al momento actual, el siguiente punto de inflexi&amp;oacute;n tuvo lugar hace casi un a&amp;ntilde;o, en el PDC 2008. En dicho evento, realizamos una &lt;a target="_blank" href="http://geeks.ms/blogs/mllopis/archive/2008/11/07/sesiones-sobre-oslo-en-el-pdc-2008.aspx"&gt;serie de sesiones&lt;/a&gt; presentando las diversas tecnolog&amp;iacute;as de modelado que formaban parte de Oslo, as&amp;iacute; como publicamos nuestra primera CTP. Al aproximarnos a este hito, nos dimos cuenta de algunos aspectos rese&amp;ntilde;ables, principalmente en la forma de canalizar nuestro discurso para que llegara de forma clara y un&amp;iacute;voca al p&amp;uacute;blico: en primer lugar, el hecho de englobar bajo el codename Oslo diferentes tecnolog&amp;iacute;as como &lt;strong&gt;BizTalk&lt;/strong&gt;, &lt;strong&gt;Workflow Foundation&lt;/strong&gt;, herramientas de modelado (&lt;strong&gt;M&lt;/strong&gt; &amp;amp; &lt;strong&gt;Quadrant&lt;/strong&gt;), etc, generaba cierto grado de confusi&amp;oacute;n en la audiencia. De modo que, para evitar dicho efecto, optamos por canalizar diferentes tecnolog&amp;iacute;as de Oslo en nuevas versiones de productos ya existentes, en lugar de crear una nueva generaci&amp;oacute;n de herramientas bajo el nombre de Oslo.&lt;/p&gt;
&lt;p&gt;Debido a esto &amp;uacute;ltimo, algunas de las tecnolog&amp;iacute;as integrantes del proyecto en su origen ya han sido liberadas. Cuando hablamos de algunas partes de .Net framework 4.0, como las nuevas versiones de Workflow Foundation y WCF, BizTalk Server 2009, el servidor de aplicaciones Dublin, MEF o la pila unificada de XAML; debemos tener en cuenta que dichas tecnolog&amp;iacute;as formaron parte del proyecto Oslo en su momento, y por tanto, la motivaci&amp;oacute;n con la que fueron desarrolladas, el objetivo com&amp;uacute;n subyacente, se encuentra totalmente alineado con las metas de Oslo.&lt;/p&gt;
&lt;p&gt;Realizando un poco de autocr&amp;iacute;tica sobre este proceso, encontramos aspectos positivos y negativos. En el lado positivo, la habilidad del equipo para liberar partes del proyecto consolidadas (WCF 4.0, WF 4.0, etc) que fueran introduciendo en el ecosistema de desarrollo algunas de las metas transversales de Oslo, mientras que otras partes del proyecto a&amp;uacute;n en fase temprana han ido evolucionando de forma apropiada (M, Quadrant). En el lado negativo de la balanza, quiz&amp;aacute; ser&amp;iacute;a reprochable el hecho de haber mantenido el codename Oslo activo durante mucho tiempo, y por ello haber contribuido a la confusi&amp;oacute;n de la que os hablaba un par de p&amp;aacute;rrafos m&amp;aacute;s arriba&amp;hellip; En el momento actual, emplearemos el codename Oslo para referirnos &amp;uacute;nica y exclusivamente a la plataforma de modelado: M, Quadrant, repositorio.&lt;/p&gt;
&lt;p&gt;La piedra angular de Oslo fue desde sus or&amp;iacute;genes la &lt;em&gt;evoluci&amp;oacute;n hacia la creciente utilizaci&amp;oacute;n de contenidos declarativos en plataforma .Net&lt;/em&gt; (XAML), que fueran &lt;em&gt;din&amp;aacute;micos&lt;/em&gt; y, al mismo tiempo, que pudieran ser empleados para dirigir nuestras aplicaciones y entornos de ejecuci&amp;oacute;n (MDD/MDA). Si pensamos en el repositorio de modelos de Oslo, concretamente, siempre hemos hablado de un repositorio relacional de modelos, implementado sobre SQL Server. Dicho repositorio contiene (meta)datos, hablando sobre datos que contienen informaci&amp;oacute;n sobre nuestras aplicaciones y empleo el t&amp;eacute;rmino &amp;ldquo;meta&amp;rdquo; entre par&amp;eacute;ntesis puesto que a menudo tambi&amp;eacute;n induce a confusi&amp;oacute;n el uso de dicho prefijo. Dichos metadatos son f&amp;aacute;cilmente maleables mediante nuestras tecnolog&amp;iacute;as de modelado: M y Quadrant. (pod&amp;eacute;is encontrar una explicaci&amp;oacute;n profunda sobre esto en &lt;a target="_blank" href="http://geeks.ms/blogs/mllopis/archive/2009/01/23/msdn-oslo-developer-center-primeros-contenidos-en-espa-241-ol.aspx"&gt;este art&amp;iacute;culo&lt;/a&gt;, y en estas dos presentaciones: &lt;a target="_blank" href="http://geeks.ms/blogs/mllopis/archive/2009/03/11/mvp-summit-2009-materiales-de-mi-sesi-243-n-sobre-oslo-en-castellano.aspx"&gt;1&lt;/a&gt; y &lt;a target="_blank" href="http://geeks.ms/blogs/mllopis/archive/2009/07/02/materiales-de-la-presentaci-243-n-sobre-oslo-en-ms-iberica.aspx"&gt;2&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Continuando con este an&amp;aacute;lisis desde una perspectiva evolutiva del proyecto, cabe destacar que, especialmente en este &amp;uacute;ltimo a&amp;ntilde;o, existe un hecho que se ha puesto notablemente de manifiesto para nosotros. Este hecho es la estrecha vinculaci&amp;oacute;n entre nuestra plataforma de modelado y la pila de programaci&amp;oacute;n de acceso a datos (ADO.Net, EF/EDM, Astoria, etc.). &lt;/p&gt;
&lt;p&gt;Tal es as&amp;iacute;, que consideramos necesaria una alineaci&amp;oacute;n consistente entre ambos &amp;ldquo;mundos&amp;rdquo;, y es por ello que decidimos realizar esta asociaci&amp;oacute;n a nivel organizativo.&lt;/p&gt;
&lt;p&gt;Por tanto, y despu&amp;eacute;s de una reflexi&amp;oacute;n que espero no os haya aburrido demasiado&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;&amp;iquest;Qu&amp;eacute; significa este cambio para los &lt;span style="text-decoration:line-through;"&gt;mortales&lt;/span&gt; desarrolladores en plataforma .Net?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Significa que, de ahora en adelante, vais a escuchar hablar sobre el &lt;strong&gt;lenguaje M de una forma mucho m&amp;aacute;s ligada a EDM y Entity Framework&lt;/strong&gt;; de la herramienta de modelado &lt;strong&gt;Quadrant asociada a diferentes herramientas de Visual Studio&lt;/strong&gt; y, por &amp;uacute;ltimo, podr&amp;eacute;is apreciar c&amp;oacute;mo el concepto un tanto abstracto de &lt;strong&gt;MDD/MDA&lt;/strong&gt; (quiz&amp;aacute; rayando lo esot&amp;eacute;rico en algunos casos, jeje) evoluciona de la mano de los avances que se produzcan en las versiones futuras de &lt;strong&gt;.Net framework&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Y para terminar, hablando del futuro y puesto que ya he citado el &lt;strong&gt;PDC 2009&lt;/strong&gt; (por ah&amp;iacute; comenz&amp;oacute; el post y por ah&amp;iacute; va a terminar), os anuncio una excelente sesi&amp;oacute;n en la cual hablaremos largo y tendido sobre el estado actual del proyecto (&lt;a target="_blank" href="http://microsoftpdc.com/Sessions/P09-04"&gt;Data Programming and Modeling for the Microsoft .Net Developer&lt;/a&gt;), que ser&amp;aacute; impartida por los se&amp;ntilde;ores &lt;strong&gt;Don Box&lt;/strong&gt; y &lt;strong&gt;Chris Anderson&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Esperamos veros por all&amp;iacute;!!&lt;/p&gt;
&lt;p&gt;PD.: Para aquellos &amp;aacute;vidos de m&amp;aacute;s informaci&amp;oacute;n al respecto de estas novedades, pod&amp;eacute;is echar un vistazo a &lt;a href="http://www.douglaspurdy.com/2009/08/17/on-oslo/"&gt;este post&lt;/a&gt; de &lt;strong&gt;Doug Purdy&lt;/strong&gt;, &amp;ldquo;The Man&amp;rdquo; :), quien adem&amp;aacute;s de dominar mejor que yo la lengua de Shakespeare, explica todo ello en una mejor prosa.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=154326" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="SQL Server" scheme="http://geeks.ms/blogs/mllopis/archive/tags/SQL+Server/default.aspx" /><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="astoria" scheme="http://geeks.ms/blogs/mllopis/archive/tags/astoria/default.aspx" /><category term=".net 4.0" scheme="http://geeks.ms/blogs/mllopis/archive/tags/.net+4.0/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /></entry><entry><title>Teleriks crea su propia implementación de “LINQ to M”</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/07/13/teleriks-crea-su-propia-implementaci-243-n-de-linq-to-m.aspx" /><id>/blogs/mllopis/archive/2009/07/13/teleriks-crea-su-propia-implementaci-243-n-de-linq-to-m.aspx</id><published>2009-07-13T06:03:00Z</published><updated>2009-07-13T06:03:00Z</updated><content type="html">&lt;p&gt;Uno de los aspectos que m&amp;aacute;s me apasionan de la comunidad de desarrolladores que se han animado a probar &lt;a target="_blank" href="http://msdn.com/oslo"&gt;&lt;strong&gt;Oslo&lt;/strong&gt;&lt;/a&gt; hasta el momento es la cantidad de herramientas y tecnolog&amp;iacute;as que, haciendo uso de Oslo, lo complementan en escenarios concretos o proporcionan funcionalidades adicionales bastante interesantes. &lt;/p&gt;
&lt;p&gt;Buena muestra de ello es la implementaci&amp;oacute;n de&lt;strong&gt; &lt;a target="_blank" href="http://www.telerik.com/libraries/labs_projects/telerik_m_core.sflb"&gt;LINQ to M&lt;/a&gt;&lt;/strong&gt;, creada por Teleriks y lanzada la semana pasada, que nos permite realizar consultas sobre datos estructurados en M (MGraph) con un estilo muy similar al de LINQ to XML. Veamoslo con algo m&amp;aacute;s de detalle&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El formato de datos &amp;ldquo;MGraph&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Como ya hemos comentado en posts previos, el lenguaje M, que en un futuro no muy lejano ser&amp;aacute; un &amp;uacute;nico lenguaje, est&amp;aacute; hoy por hoy dividido en tres &amp;ldquo;dialectos&amp;rdquo;: &lt;strong&gt;MSchema, MGrammar y MGraph.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;M es un lenguaje cuya principal funci&amp;oacute;n es la de definir datos y restricciones sobre dichos datos, todo ello en forma de texto. Existe una conexi&amp;oacute;n &amp;ldquo;emocional&amp;rdquo; entre la gran mayor&amp;iacute;a de desarrolladores y el formato de tipo texto, ya desde tiempos remotos los desarrolladores hemos vivido en entornos de tipo texto (consola, MS-DOS, etc), y adem&amp;aacute;s hemos representado nuestras ideas y algoritmos en forma de texto, mediante el uso de lenguajes de programaci&amp;oacute;n de prop&amp;oacute;sito general (C, C++, C#, Java, etc.), o lenguajes de etiquetas/marcado para un dominio espec&amp;iacute;fico como por ejemplo HTML, XML o XAML. Adicionalmente, podemos pensar en un texto redactado en lengua castellana como otra representaci&amp;oacute;n de datos de forma textual, si bien, esta representaci&amp;oacute;n en lenguaje natural sigue unas reglas gramaticales algo menos estrictas que los lenguajes de programaci&amp;oacute;n y de marcado, as&amp;iacute; como una estructura textual (p&amp;aacute;rrafos, signos de puntuaci&amp;oacute;n, etc) bastante m&amp;aacute;s flexible que en los lenguajes citados con anterioridad.&lt;/p&gt;
&lt;p&gt;Considerando todos estos lenguajes, el elemento diferenciador entre cada uno de ellos no es ni m&amp;aacute;s ni menos que el conjunto de reglas que nos permiten expresar una serie de informaci&amp;oacute;n en dicho lenguaje y tambi&amp;eacute;n estructurar dichas ideas de forma m&amp;aacute;s o menos &amp;ldquo;mec&amp;aacute;nica&amp;rdquo;. Esta forma mec&amp;aacute;nica de representaci&amp;oacute;n de informaci&amp;oacute;n textual se lleva al extremo en un lenguaje como XML, el cual sigue una sintaxis muy estricta que lo convierte adem&amp;aacute;s en un lenguaje complejo de entender para una persona.&lt;/p&gt;
&lt;p&gt;No obstante, todos ellos comparten una caracter&amp;iacute;stica com&amp;uacute;n, bastante obvia, pero conviene tenerla siempre presente: todos estos lenguajes nos permiten representar informaci&amp;oacute;n en formato de texto.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Si pensamos en la relaci&amp;oacute;n entre texto y datos, el lenguaje M vive en dicha intersecci&amp;oacute;n&lt;/em&gt;. Por una parte, nos permite representar informaci&amp;oacute;n en una serie de lenguajes proporcionados &amp;ldquo;de serie&amp;rdquo; y, por otra parte, nos permite crear f&amp;aacute;cilmente nuestras propias reglas gramaticales para transformar un conjunto de informaci&amp;oacute;n textual poco estructurada (por ejemplo, un texto en castellano) en otro conjunto de informaci&amp;oacute;n textual organizada de la forma que a nosotros nos resulte m&amp;aacute;s c&amp;oacute;moda: traducida a scripts T-SQL como en el caso de MSchema, a una representaci&amp;oacute;n en forma de grafo ac&amp;iacute;clico que conocemos con el nombre de AST y que constituye el &amp;ldquo;dialecto&amp;rdquo; MGraph, o a cualquier otra representaci&amp;oacute;n que definamos nosotros mismos mediante nuestras gram&amp;aacute;ticas creadas con MGrammar.&lt;/p&gt;
&lt;p&gt;Una vez tengamos la informaci&amp;oacute;n en un formato optimizado para su procesamiento, disponemos de diversas opciones para consumir dicha informaci&amp;oacute;n desde nuestros entornos de ejecuci&amp;oacute;n y aplicaciones. En esta ocasi&amp;oacute;n, nos vamos a centrar en la implementaci&amp;oacute;n de LINQ to M (MGraph) creada por Teleriks.&lt;/p&gt;
&lt;p&gt;A continuaci&amp;oacute;n podemos ver un fragmento v&amp;aacute;lido de informaci&amp;oacute;n representada en formato MGraph, en la cual estamos describiendo un conjunto de vuelos e informaci&amp;oacute;n sobre cada uno de ellos (c&amp;oacute;digo de vuelo, operador del vuelo, origen y destino).&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:00905863-e47b-4a43-8f43-1088e1ddf226" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;
&lt;pre class="brush: c#"&gt;{
      {Id=1,Origen=&amp;quot;&amp;quot;Alicante&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Madrid&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Iberia&amp;quot;&amp;quot;},
      {Id=2,Origen=&amp;quot;&amp;quot;Oslo&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Barcelona&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;SAS&amp;quot;&amp;quot;},
      {Id=3,Origen=&amp;quot;&amp;quot;Seattle&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;New York&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Delta&amp;quot;&amp;quot;},
      {Id=4,Origen=&amp;quot;&amp;quot;Paris&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Amsterdam&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Air France&amp;quot;&amp;quot;},
      {Id=5,Origen=&amp;quot;&amp;quot;Londres&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Vancouver&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;British Airways&amp;quot;&amp;quot;},
      {Id=6,Origen=&amp;quot;&amp;quot;Tokyo&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Shanghai&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Air China&amp;quot;&amp;quot;},
      {Id=7,Origen=&amp;quot;&amp;quot;Alicante&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Madrid&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Vueling&amp;quot;&amp;quot;},
      {Id=8,Origen=&amp;quot;&amp;quot;Alicante&amp;quot;&amp;quot;,Destino=&amp;quot;&amp;quot;Madrid&amp;quot;&amp;quot;,Operador=&amp;quot;&amp;quot;Spanair&amp;quot;&amp;quot;}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Para este ejemplo, en el cual vamos a consumir la informaci&amp;oacute;n directamente en tiempo de ejecuci&amp;oacute;n desde nuestro c&amp;oacute;digo C#, lo que vamos a hacer es almacenar este fragmento de c&amp;oacute;digo M en un const string. &lt;/p&gt;
&lt;p&gt;Adem&amp;aacute;s, deberemos agregar en nuestro proyecto una referencia a Telerik.M.Core.dll y a&amp;ntilde;adir una sentencia using Telerik.M.Core; en nuestro c&amp;oacute;digo, a fin de poder emplear estas funcionalidades. (esta dll forma parte de la descarga de LINQ to M).&lt;/p&gt;
&lt;p&gt;Para consumir nuestro c&amp;oacute;digo M en forma de sentencias LINQ, deberemos en primer lugar cargar nuestro origen de datos, mediante el uso del objeto QueryContext, tal cual se muestra a continuaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_20847A9B.png"&gt;&lt;img height="210" width="536" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_2D1227B7.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Con esto simplemente ya podr&amp;iacute;amos hacer uso de nuestra variable vueloM como origen de datos, por ejemplo para asignarlo a dicha propiedad DataSource en un objeto de tipo Grid, y visualizar nuestros registros de vuelos. &lt;/p&gt;
&lt;p&gt;No obstante, si deseamos obtener Intellisense, coloreado de sintaxis, y dem&amp;aacute;s servicios adicionales del lenguaje, deberemos crear una clase en C# que tenga la misma estructura que la informaci&amp;oacute;n definida en M, para lo cual realizaremos algo parecido al siguiente c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_4BE89B95.png"&gt;&lt;img height="151" width="373" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_368AE62D.png" alt="image" border="0" title="image" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Gracias a esta definici&amp;oacute;n, ya podemos hacer uso de caracter&amp;iacute;sticas avanzadas del IDE, como por ejemplo Intellisense. En la siguiente captura podemos observar c&amp;oacute;mo realizar consultas LINQ sobre nuestra colecci&amp;oacute;n de datos en M, obteniendo informaci&amp;oacute;n contextual en VS. (click sobre la imagen para una vista ampliada).&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_75E899BD.png"&gt;&lt;img height="332" width="531" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_0965D392.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Terminaremos la consulta para visualizar los vuelos Alicante &amp;ndash; Madrid ordenados de forma ascendente por nombre de Operador, y mostraremos dicha informaci&amp;oacute;n en nuestra consola&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_5C7070B6.png"&gt;&lt;img height="271" width="566" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_7493DB11.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_13D681E5.png"&gt;&lt;img height="270" width="535" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_12FE1BFB.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Para m&amp;aacute;s informaci&amp;oacute;n, pod&amp;eacute;is acceder al &lt;a target="_blank" href="http://www.stephenforte.net/PermaLink,guid,bd174995-58d0-4713-8ce0-b4ce452c5951.aspx"&gt;blog de Stephen Forte&lt;/a&gt;, CEO de Telerik, quien nos describe otra aplicaci&amp;oacute;n similar al ejemplo que os he mostrado aqu&amp;iacute;, y tambi&amp;eacute;n nos cuenta sus experiencias con la &lt;a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=827122a5-3ca0-4389-a79e-87af37cbf60d&amp;amp;displaylang=en"&gt;SDK de Oslo&lt;/a&gt; durante los &amp;uacute;ltimos meses.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n puedes descargar la implementaci&amp;oacute;n de LINQ to M en &lt;a target="_blank" href="http://www.telerik.com/libraries/labs_projects/telerik_m_core.sflb"&gt;este enlace&lt;/a&gt;. Y el c&amp;oacute;digo completo de mi ejemplo &lt;a target="_blank" href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/LINQToM.zip"&gt;aqu&amp;iacute;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=152281" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="LinQ" scheme="http://geeks.ms/blogs/mllopis/archive/tags/LinQ/default.aspx" /><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /></entry><entry><title>Materiales de la presentación sobre Oslo en MS Iberica</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/07/02/materiales-de-la-presentaci-243-n-sobre-oslo-en-ms-iberica.aspx" /><id>/blogs/mllopis/archive/2009/07/02/materiales-de-la-presentaci-243-n-sobre-oslo-en-ms-iberica.aspx</id><published>2009-07-02T10:35:00Z</published><updated>2009-07-02T10:35:00Z</updated><content type="html">&lt;p&gt;Tal cual comentaba hace unos d&amp;iacute;as en una &lt;a href="http://geeks.ms/blogs/mllopis/archive/2009/06/12/workshop-en-madrid-introducci-243-n-a-oslo-el-futuro-en-el-modelado-de-aplicaciones.aspx"&gt;entrada previa&lt;/a&gt;, este martes tuve la oportunidad de realizar un workshop sobre &lt;a href="http://msdn.microsoft.com/oslo"&gt;Oslo&lt;/a&gt; en las oficinas de MS Iberica en Madrid. En la siguiente carpeta de skydrive os dejo los materiales de la misma, presentaci&amp;oacute;n y archivos de c&amp;oacute;digo M empleados durante la demo.&lt;/p&gt;
&lt;p align="center"&gt;&lt;iframe scrolling="no" marginwidth="0" frameborder="0" src="http://cid-3aabaa76b81ce667.skydrive.live.com/embedgrid.aspx/Public/Oslo%20Workshop%20%7C5Junio%202009%7C6" marginheight="0" style="background-color:#ffffff;margin:3px;width:94px;height:94px;border:#dde5e9 1px solid;padding:0px;"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;Gracias a todos aquellos que asistieron a la sesi&amp;oacute;n por el inter&amp;eacute;s mostrado y especialmente a &lt;a href="http://blogs.msdn.com/cesardelatorre/default.aspx"&gt;C&amp;eacute;sar De la Torre&lt;/a&gt;, por su colaboraci&amp;oacute;n y organizaci&amp;oacute;n del evento, as&amp;iacute; como al resto de compa&amp;ntilde;eros de Madrid por su gran acogida, &amp;quot;as always&amp;quot;.&lt;/p&gt;
&lt;p&gt;Saludos @Madrid&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;nbsp;:)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151664" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /></entry><entry><title>Small Basic v0.5: Ahora con localización en Español... y más!!</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/06/18/small-basic-v0-5-ahora-con-localizaci-243-n-en-espa-241-ol-y-m-225-s.aspx" /><id>/blogs/mllopis/archive/2009/06/18/small-basic-v0-5-ahora-con-localizaci-243-n-en-espa-241-ol-y-m-225-s.aspx</id><published>2009-06-18T08:06:00Z</published><updated>2009-06-18T08:06:00Z</updated><content type="html">&lt;p&gt;Hoy se ha liberado una nueva versi&amp;oacute;n del lenguaje &lt;a href="http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx"&gt;Small Basic&lt;/a&gt;. Entre las novedades m&amp;aacute;s destacadas est&amp;aacute; que ahora est&amp;aacute; localizado para Espa&amp;ntilde;ol, adem&amp;aacute;s de Ingl&amp;eacute;s. Adem&amp;aacute;s, las siguientes caracter&amp;iacute;sticas han sido a&amp;ntilde;adidas al lenguaje, en base al feedback recibido por la comunidad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mejoras en el IDE&lt;/strong&gt;: Funci&amp;oacute;n&amp;nbsp;&amp;quot;Buscar&amp;quot;, indicador de l&amp;iacute;nea y columna, bot&amp;oacute;n para &amp;quot;Guardar como...&amp;quot;, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mejoras en el lenguaje&lt;/strong&gt;: Al margen del nuevo soporte para Espa&amp;ntilde;ol, quiz&amp;aacute; la m&amp;aacute;s destacada sea el soporte de arrays... multidimensionales! :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para aquellos que no hayan escuchado hablar de Small Basic todav&amp;iacute;a, comentar que se trata de un lenguaje bastante simple (apenas 15 keywords), cuyas ideas base derivan de Visual Basic, pero su prop&amp;oacute;sito es eminentemente pedag&amp;oacute;gico. Pod&amp;eacute;is encontrar un&lt;a href="http://channel9.msdn.com/posts/Charles/Expert-to-Expert-The-Basics-of-SmallBasic/"&gt; excelente v&amp;iacute;deo en Channel 9&lt;/a&gt;, de la serie Expert-to-Expert en la que su creador, &lt;a href="http://blogs.msdn.com/smallbasic/"&gt;Vijaye Raji&lt;/a&gt;&amp;nbsp;y Chris&amp;nbsp;Anderson&amp;nbsp;(compa&amp;ntilde;eros en el equipo de &lt;a href="http://msdn.com/oslo"&gt;Oslo&lt;/a&gt;), nos explican en detalle las caracter&amp;iacute;sticas del lenguaje junto al gran Erik Meijer.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n dispone de una &lt;a href="http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx"&gt;p&amp;aacute;gina en MSDN&lt;/a&gt; y &amp;nbsp;un&lt;a href="http://www.facebook.com/home.php#/group.php?gid=58053367137"&gt; grupo en Facebook&lt;/a&gt; a trav&amp;eacute;s del cual se anuncian las novedades en torno a este proyecto.&lt;/p&gt;
&lt;p&gt;Keep up the great work, Vijaye!&lt;/p&gt;
&lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150681" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="small basic" scheme="http://geeks.ms/blogs/mllopis/archive/tags/small+basic/default.aspx" /></entry><entry><title>[Workshop en Madrid] Introducción a “Oslo”: El Futuro en el Modelado de Aplicaciones</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/06/12/workshop-en-madrid-introducci-243-n-a-oslo-el-futuro-en-el-modelado-de-aplicaciones.aspx" /><id>/blogs/mllopis/archive/2009/06/12/workshop-en-madrid-introducci-243-n-a-oslo-el-futuro-en-el-modelado-de-aplicaciones.aspx</id><published>2009-06-12T01:16:00Z</published><updated>2009-06-12T01:16:00Z</updated><content type="html">&lt;p&gt;El verano siempre es una buena &amp;eacute;poca para&amp;nbsp;visitar &lt;a target="_blank" href="http://www.directcostablanca.com/images-costa-blanca/alicante_012.jpg"&gt;Alicante&lt;/a&gt; durante unos d&amp;iacute;as. Como Madrid est&amp;aacute; de paso, aprovecharemos para hablar un rato sobre &lt;a target="_blank" href="http://msdn.microsoft.com/oslo"&gt;Oslo&lt;/a&gt;. Aqu&amp;iacute; est&amp;aacute;n los detalles del evento:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:#000000;"&gt;&lt;i&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;"&gt;En este&amp;nbsp;Workshop revisaremos los conceptos de MDD (Model Driven Development) y derivados (Model Driven SOA, etc.) y presentaremos la propuesta de futuro de Microsoft: &amp;quot;Oslo&amp;quot; (codename, actualmente en estado Beta),&amp;nbsp;recorriendo las diferentes tecnolog&amp;iacute;as que nos ofrecer&amp;aacute; (lenguaje de modelado textual M, herramienta visual Quadrant y repositorio relacional de modelos). Al terminar la sesi&amp;oacute;n, los asistentes ser&amp;aacute;n capaces de responder a las siguientes dos preguntas: &amp;iquest;Qu&amp;eacute; es Oslo? Y&amp;hellip; &amp;iquest;Por qu&amp;eacute; deber&amp;iacute;a prestarle atenci&amp;oacute;n de ahora en adelante?.&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:14pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;"&gt;FECHA: 30 de Junio&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:14pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="line-height:125%;font-family:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;font-size:11pt;"&gt;&lt;span style="color:#000000;"&gt;LUGAR: Oficinas Microsoft Madrid &amp;ndash; Sala Marie Curie.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="LINE-HEIGHT:125%;FONT-FAMILY:&amp;#39;Calibri&amp;#39;,&amp;#39;sans-serif&amp;#39;;COLOR:#1f497d;FONT-SIZE:11pt;"&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="color:#000000;"&gt;AGENDA&lt;br /&gt;9:00 - 9:30 - Registro&lt;br /&gt;9:30-10:45 - Model Driven Application, MDD y la propuesta de futuro de Microsoft: &amp;quot;Oslo&amp;quot;. (&lt;strong&gt;C&amp;eacute;sar De La Torre&lt;/strong&gt;, Architect Evangelist, MS Iberica)&lt;br /&gt;10:45-11:15 - Cafe&lt;br /&gt;11:15-14:00 - &amp;quot;Oslo&amp;quot; en detalle, Lenguaje M, Quadrant, Repositorio. (&lt;strong&gt;Miguel Llopis&lt;/strong&gt;, SDET Team Oslo, MS Corp)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES" style="mso-ansi-language:ES;"&gt;&lt;span style="color:#000000;"&gt;Link de registro: &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?culture=en-US&amp;amp;EventID=1032417769&amp;amp;%3bCulture=es-ES"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?culture=en-US&amp;amp;EventID=1032417769&amp;amp;%3bCulture=es-ES&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Esperamos veros por all&amp;iacute;,&amp;nbsp;&amp;nbsp; &lt;strong&gt;:)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;M.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150387" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /></entry><entry><title>Publicada la CTP de Mayo de Oslo: Quadrant, mejoras en el lenguaje M, modelos para UML 2.1 y CLR... y más!</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/05/27/publicada-la-ctp-de-mayo-de-oslo.aspx" /><id>/blogs/mllopis/archive/2009/05/27/publicada-la-ctp-de-mayo-de-oslo.aspx</id><published>2009-05-27T04:52:00Z</published><updated>2009-05-27T04:52:00Z</updated><content type="html">&lt;p&gt;Los lectores habituales de este blog probablemente hayan notado durante las &amp;uacute;ltimas semanas un considerable descenso de la actividad en el mismo (apenas un post al mes durante los &amp;uacute;ltimos 2 meses). Una de las causas que m&amp;aacute;s ha influido en ello es el intenso trabajo que los miembros del equipo de &lt;a href="http://msdn.microsoft.com/en-us/oslo/default.aspx"&gt;Oslo&lt;/a&gt; hemos llevado a cabo, con el objetivo de llegar a este &amp;ldquo;hito&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Hoy, 26 de Mayo, hemos alcanzado una &amp;ldquo;meta parcial&amp;rdquo; en nuestro camino, hemos publicado nuestra tercera CTP: la &lt;a target="_blank" href="http://go.microsoft.com/?linkid=9648442"&gt;&lt;strong&gt;CTP de Mayo de Oslo&lt;/strong&gt;&lt;/a&gt;. Se trata de una &amp;ldquo;major release&amp;rdquo; CTP que incluye mejoras bastante considerables respecto a las anteriores. Entre estas mejoras, cabe destacar al menos las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instalador unificado para todos los elementos que componen nuestra CTP: IntelliPad, Lenguaje M, herramientas de l&amp;iacute;nea de comandos, repositorio de modelos&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/clip_5F00_image001_5F00_2625445D.jpg"&gt;&lt;img height="376" width="509" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/clip_5F00_image001_5F00_thumb_5F00_24E0AB7E.jpg" alt="clip_image001" border="0" title="clip_image001" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;strong&gt;&amp;uacute;nico compilador para el Front-End del lenguaje M&lt;/strong&gt; (a.k.a. &lt;em&gt;One M to rule them all!&lt;/em&gt;). Hasta el momento, dispon&amp;iacute;amos de dos compiladores diferentes para MSchema (m.exe) y para MGrammar (mg.exe), ahora ambos son s&amp;oacute;lo uno: m.exe&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primera versi&amp;oacute;n p&amp;uacute;blica de Quadrant&lt;/strong&gt;: Esta es nuestra primera release en la cual inclu&amp;iacute;mos Quadrant, nuestra herramienta gr&amp;aacute;fica para consultar y modificar datos del repositorio. Pod&amp;eacute;is encontrar informaci&amp;oacute;n al respecto en la &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/dd857491(VS.85).aspx"&gt;nueva secci&amp;oacute;n de Quadrant&lt;/a&gt; en nuestra web de MSDN.&lt;/li&gt;
&lt;li&gt;Primera versi&amp;oacute;n p&amp;uacute;blica de los &lt;strong&gt;modelos de dominio para UML 2.1 y CLR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nuevas funcionalidades en el lenguaje M y redefinici&amp;oacute;n de algunas ya existentes, en base al feedback recibido por parte de la comunidad y a trav&amp;eacute;s de la &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/oslo/msc.aspx"&gt;M Specification Community&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En pr&amp;oacute;ximos posts explicar&amp;eacute; detalladamente cada una de estas novedades, ya que sin duda suponen cambios significativos y que esperamos que sean de vuestro agrado. Por el momento, os animamos a que descargu&amp;eacute;is e instal&amp;eacute;is la nueva CTP y nos cont&amp;eacute;is a trav&amp;eacute;s de &lt;a target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/oslo/threads"&gt;nuestros foros&lt;/a&gt; vuestras impresiones.&lt;/p&gt;
&lt;p&gt;Enjoy! &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=149418" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="oslo" scheme="http://geeks.ms/blogs/mllopis/archive/tags/oslo/default.aspx" /><category term="M" scheme="http://geeks.ms/blogs/mllopis/archive/tags/M/default.aspx" /><category term="quadrant" scheme="http://geeks.ms/blogs/mllopis/archive/tags/quadrant/default.aspx" /></entry><entry><title>Cliente de Facebook para Windows Mobile… por fin!! :)</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/05/10/cliente-de-facebook-para-windows-mobile-por-fin.aspx" /><id>/blogs/mllopis/archive/2009/05/10/cliente-de-facebook-para-windows-mobile-por-fin.aspx</id><published>2009-05-10T13:06:00Z</published><updated>2009-05-10T13:06:00Z</updated><content type="html">&lt;p&gt;Desde hace unos dias disponemos de un &lt;a href="http://www.microsoft.com/windowsmobile/en-us/downloads/facebook.mspx"&gt;nuevo cliente de Facebook para Windows Mobile 6&lt;/a&gt;. Descargadlo y enviad vuestro feedback a traves de &lt;a href="http://www.facebook.com/windowsphone"&gt;esta pagina&lt;/a&gt; de Facebook y podreis ganar un &lt;a href="http://reviews.cnet.com/smartphones/htc-touch-pro-sprint/4505-6452_7-33248637.html"&gt;HTC Touch Pro&lt;/a&gt;!!&lt;/p&gt;
&lt;p&gt;Algunas capturas&amp;hellip; :)&lt;/p&gt;
&lt;p&gt;&lt;img height="195" width="260" src="http://www.microsoft.com/library/media/1033/windowsmobile/en-us/assets/images/downloads/scr_facebook01.jpg" alt="Facebook screenshot" border="0" /&gt;&amp;nbsp;&amp;nbsp; &lt;img height="195" width="260" src="http://www.microsoft.com/library/media/1033/windowsmobile/en-us/assets/images/downloads/scr_facebook02.jpg" alt="Facebook screenshot" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img height="195" width="260" src="http://www.microsoft.com/library/media/1033/windowsmobile/en-us/assets/images/downloads/scr_facebook03.jpg" alt="Facebook screenshot" border="0" /&gt;&amp;nbsp;&amp;nbsp; &lt;img height="195" width="260" src="http://www.microsoft.com/library/media/1033/windowsmobile/en-us/assets/images/downloads/scr_facebook04.jpg" alt="Facebook screenshot" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Enjoy!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=148418" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="mobile" scheme="http://geeks.ms/blogs/mllopis/archive/tags/mobile/default.aspx" /></entry><entry><title>El Profesor Stephen Hawking evoluciona favorablemente...</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/04/22/el-profesor-stephen-hawking-evoluciona-favorablemente.aspx" /><id>/blogs/mllopis/archive/2009/04/22/el-profesor-stephen-hawking-evoluciona-favorablemente.aspx</id><published>2009-04-22T07:31:00Z</published><updated>2009-04-22T07:31:00Z</updated><content type="html">&lt;p&gt;Durante las primeras horas de la ma&amp;ntilde;ana de este Lunes, apareci&amp;oacute; en Internet la &lt;a href="http://news.yahoo.com/s/ap/20090420/ap_on_re_eu/eu_britain_hawking"&gt;noticia&lt;/a&gt; de la hospitalizaci&amp;oacute;n inmediata de &lt;a href="http://en.wikipedia.org/wiki/Stephen_hawking"&gt;Stephen Hawking&lt;/a&gt;, en el Addenbrooke&amp;#39;s Hospital de la Universidad de Cambridge (Inglaterra), debido a complicaciones en su estado de salud.&lt;/p&gt;
&lt;p&gt;El Dr. Hawking, que el pasado mes de Enero cumpli&amp;oacute; 67 a&amp;ntilde;os, sufre esclerosis lateral amiotr&amp;oacute;fica desde los 21 a&amp;ntilde;os. Este hecho ha reducido progresivamente su capacidad motora pero no ha sido capaz de frenar en ning&amp;uacute;n modo a una de las mentes m&amp;aacute;s poderosas de nuestro planeta; hasta el punto de ser considerado por muchos como el f&amp;iacute;sico te&amp;oacute;rico de mayor importancia en la Historia. Para aquellos que no hayan disfrutado de sus obras, recomiendo la lectura de &lt;a href="http://www.amazon.com/Illustrated-Brief-History-Time/dp/0593040597/computerworld-20"&gt;&amp;quot;The Illustrated Brief Story of Time&amp;quot;&lt;/a&gt;&amp;nbsp;y &lt;a href="http://www.amazon.com/Universe-Nutshell-Stephen-William-Hawking/dp/055380202X/ref=pd_sim_b_1/185-5155638-3118437"&gt;&amp;quot;The Universe in a Nutshell&amp;quot;&lt;/a&gt; (el Universo en un vistazo), dos de esos libros que uno no puede soltar de las manos hasta que los termina de leer.&lt;/p&gt;
&lt;p&gt;La&lt;strong&gt; nota inform&amp;aacute;tica&lt;/strong&gt; de este post radica en el hecho de que, a ra&amp;iacute;z de la aparici&amp;oacute;n de esta noticia, el tr&amp;aacute;fico en Internet relacionado con este gran hombre ha sufrido un gran incremento y, como consecuencia de ello, los administradores de &lt;a href="http://www.hawking.org.uk/"&gt;su sitio web oficial&lt;/a&gt; (habitualmente repleto de art&amp;iacute;culos, anuncios sobre sus pr&amp;oacute;ximas conferencias,&amp;nbsp;enlaces a sus obras, biograf&amp;iacute;a, etc.) han decidido sustituir este contenido&amp;nbsp;por una &amp;uacute;nica p&amp;aacute;gina en HTML en la cual, diariamente, a&amp;ntilde;aden una breve actualizaci&amp;oacute;n sobre su estado de salud, a fin de evitar problemas de saturaci&amp;oacute;n en su servidor... Es curioso ver bajo qu&amp;eacute; inescrutables circunstancias salen a relucir posibles deficiencias en los planes de pruebas de una aplicaci&amp;oacute;n inform&amp;aacute;tica, como en este caso las pruebas de Stress sobre un sitio web...&lt;/p&gt;
&lt;p&gt;Me gustar&amp;iacute;a para cerrar el post mandar un fuerte abrazo al Profesor, y mis mejores deseos de pronta recuperaci&amp;oacute;n para &amp;eacute;l, su esposa y sus tres hijos: &lt;em&gt;Keep fighting, Mr Hawking!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=147235" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="off-topic" scheme="http://geeks.ms/blogs/mllopis/archive/tags/off-topic/default.aspx" /><category term="Testing" scheme="http://geeks.ms/blogs/mllopis/archive/tags/Testing/default.aspx" /></entry><entry><title>Mis pensamientos sobre cocina, Office, Windows 7, Internet Explorer 8 y la gestión de grandes proyectos en Microsoft</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/03/23/mis-pensamientos-sobre-cocina-office-windows-7-internet-explorer-8-y-la-gesti-243-n-de-grandes-proyectos-en-microsoft.aspx" /><id>/blogs/mllopis/archive/2009/03/23/mis-pensamientos-sobre-cocina-office-windows-7-internet-explorer-8-y-la-gesti-243-n-de-grandes-proyectos-en-microsoft.aspx</id><published>2009-03-23T07:35:00Z</published><updated>2009-03-23T07:35:00Z</updated><content type="html">&lt;p&gt;&lt;span style="font-size:small;"&gt;Me encanta cocinar. Es un hecho. Y desde que abandon&amp;eacute; la casa de mis padres para retomar la aventura de construir Oslo con &lt;/span&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/oslo/dd262121.aspx"&gt;&lt;span style="font-size:small;"&gt;unos cuantos amigos&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;, hace algo m&amp;aacute;s de 6 meses, y vivo independizado en &lt;strong&gt;Vancouver&lt;/strong&gt;, este hecho se ha convertido adem&amp;aacute;s en clara necesidad vital. Sin embargo, en este post, no voy a hablaros sobre &lt;/span&gt;&lt;a target="_blank" href="http://msdn.com/oslo"&gt;&lt;strong&gt;&lt;span style="font-size:small;"&gt;Oslo&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt; como &amp;uacute;ltimamente acostumbro a hacer, no voy a hablar de ning&amp;uacute;n gran proyecto software concreto; o, tal vez, hable un poco sobre todos ellos.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;img height="196" width="282" src="http://farm4.static.flickr.com/3407/3257141117_120786b17e.jpg" align="right" style="margin:5px;display:inline;" alt="" /&gt;Retomando mis aficiones culinarias, hay algo en el &lt;/span&gt;&lt;a target="_blank" href="http://www.recetasgratis.net/Receta-de-Paella-alicantina-receta-19534.html"&gt;&lt;span style="font-size:small;"&gt;proceso de preparaci&amp;oacute;n de una buena Paella Alicantina&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt; que se asemeja mucho a la ingenier&amp;iacute;a de procesos en grandes proyectos software. Desde el momento en el que captamos los requerimientos de nuestro proyecto (hora a la que queremos comer, cantidad de raciones a preparar, etc.), hasta que realizamos las estimaciones del proyecto (cantidades de cada uno de los ingredientes, tiempo de cocci&amp;oacute;n, etc.) el razonamiento no difiere demasiado del que llevamos a cabo para construir software. Existen adem&amp;aacute;s una gran cantidad de t&amp;eacute;cnicas que el tiempo y la experiencia previa nos aportan, de forma que podamos medir con una mayor precisi&amp;oacute;n los riesgos de cada fase del proceso. De este modo, seremos capaces de determinar aquellas tareas cr&amp;iacute;ticas a las que deberemos dedicarnos de manera exclusiva, as&amp;iacute; como aquellas que podamos pararelizar y por tanto ser capaces de realizar de forma simult&amp;aacute;nea (tales como pelar una cabeza de ajos mientras fre&amp;iacute;mos &amp;ntilde;ora picada, e incluso calentar agua para cocer el arroz mientras el resto de ingredientes ya est&amp;aacute;n en la paella&amp;hellip;). Eventualmente, tambi&amp;eacute;n seremos capaces de cocinar al mismo tiempo que buscamos en los armarios de la cocina algunos de los ingredientes para a&amp;ntilde;adir al proceso, e incluso nos sentiremos c&amp;oacute;modos y consideraremos esta capacidad como algo natural, proporcionado por la experiencia. Por &amp;uacute;ltimo, cuando cocinemos varios platos al mismo tiempo, deberemos hacerlo al ritmo adecuado para que todos ellos est&amp;eacute;n preparados en el momento preciso: la hora de comer. Este proceso, ya de por s&amp;iacute; algo complejo, tiende a incrementar su nivel de dificultad cuando cada una de estas tareas o platos son elaborados por personas diferentes, incluso por equipos de personas diferentes. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;De igual forma sucede en el mundo del desarrollo software. Existen diferentes formas de organizar y coordinar a esas personas, a esos equipos, con el fin de convertir el lanzamiento de un gran producto en un aut&amp;eacute;ntico homenaje a la cooperaci&amp;oacute;n, sincronizaci&amp;oacute;n y coordinaci&amp;oacute;n transversal. Analizando globalmente la estructura de los equipos de producto en Microsoft, encontraremos &lt;strong&gt;dos modelos principales de organizaci&amp;oacute;n&lt;/strong&gt;, a trav&amp;eacute;s de los cuales un proyecto evoluciona desde su fase de incubaci&amp;oacute;n hasta alcanzar su madurez. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Pensemos en un gran proyecto como &lt;strong&gt;Office&lt;/strong&gt;, compuesto actualmente por m&amp;aacute;s de una veintena de proyectos (yo ya he perdido la cuenta). Si recordamos los or&amp;iacute;genes de este producto, veremos que &amp;ldquo;en la noche de los tiempos&amp;rdquo;, no exist&amp;iacute;a Office&amp;hellip; Exist&amp;iacute;a &lt;strong&gt;Word&lt;/strong&gt;, y &lt;strong&gt;Excel&lt;/strong&gt;, y &lt;strong&gt;Access&lt;/strong&gt;, y m&amp;aacute;s adelante &lt;strong&gt;PowerPoint&lt;/strong&gt; y &lt;strong&gt;OneNote&lt;/strong&gt;, y&amp;hellip; (paremos aqu&amp;iacute; de contar, ya que quiero acabar alg&amp;uacute;n d&amp;iacute;a este post). Office es uno de los grandes proyectos de Microsoft, junto con Windows, Visual Studio y unos cuantos m&amp;aacute;s, que han experimentado una transici&amp;oacute;n entre estos dos modelos, visiones, filosof&amp;iacute;as, enfoques para gestionar un gran proyecto software.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;El primero de estos modelos es el conocido como&lt;strong&gt; Product Unit Management&lt;/strong&gt; (PUM). Este modelo es probablemente el m&amp;aacute;s habitual entre todos los equipos en Microsoft, y se basa en la definici&amp;oacute;n de una unidad de producto (conjunto de arquitectos, desarrolladores, testers, program managers y otros roles implicados) como &amp;oacute;rgano independiente y hegem&amp;oacute;nico en la planificaci&amp;oacute;n de todas las fases del proyecto, desde su incubaci&amp;oacute;n hasta su lanzamiento. Generalmente, estas unidades de producto no dependen de otras, a menos que exista una tecnolog&amp;iacute;a concreta empleada por esta PUM que se encuentre pr&amp;oacute;xima a su fecha de lanzamiento. Este independencia convierte al modelo PUM en el modelo &amp;oacute;ptimo en t&amp;eacute;rminos de &lt;strong&gt;agilidad&lt;/strong&gt;, de &lt;em&gt;&amp;ldquo;time-to-ship&amp;rdquo;&lt;/em&gt; (tiempo hasta el lanzamiento) y capacidad de respuesta ante la competencia. Sin embargo, es deficiente en t&amp;eacute;rminos de &lt;strong&gt;colaboraci&amp;oacute;n&lt;/strong&gt; entre proyectos, &lt;strong&gt;estandarizaci&amp;oacute;n&lt;/strong&gt; de infraestructuras tales como automatizaci&amp;oacute;n de builds, o ejecuci&amp;oacute;n de pruebas automatizadas. Esto genera un aumento de los costes para estas tareas, que si bien se llevan siempre acabo, en estos casos resultan m&amp;aacute;s laboriosas para el grupo de producto al tener que duplicar esfuerzos de otros grupos. A menudo, encontramos este modelo organizativo en &lt;strong&gt;peque&amp;ntilde;os equipos&lt;/strong&gt;, como el equipo de &lt;strong&gt;Surface&lt;/strong&gt;, de &lt;strong&gt;Zune&lt;/strong&gt;, de&lt;strong&gt; Live Mesh&lt;/strong&gt;&amp;hellip; Tambi&amp;eacute;n en proyectos m&amp;aacute;s grandes como es el caso de &lt;strong&gt;Oslo&lt;/strong&gt; (donde disponemos de distintas organizaciones PUM, para el&lt;strong&gt; lenguaje M&lt;/strong&gt;, para &lt;strong&gt;Quadrant&lt;/strong&gt;, etc.), e incluso en proyectos monstruosos (en volumen, se entiende) como es el caso de &lt;strong&gt;Windows&lt;/strong&gt; u &lt;strong&gt;Office&lt;/strong&gt;. En este &amp;uacute;ltimo tipo de proyectos, generalmente el modelo de independencia a nivel de PUM se adopta para nuevas caracter&amp;iacute;sticas del producto que se encuentran todav&amp;iacute;a en fase de incubaci&amp;oacute;n&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_2FBDAAC9.png"&gt;&lt;span style="font-size:small;"&gt;&lt;img height="100" width="502" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_27C60867.png" alt="image" border="0" title="image" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;A medida que un producto madura, los equipos habitualmente crecen de tama&amp;ntilde;o y la centralizaci&amp;oacute;n de algunas tareas e infraestructuras para mejorar la eficiencia y reducir costes sucede de forma natural. Este modelo recibe muchos nombres, pero tal vez el nombre m&amp;aacute;s apropiado sea el de &amp;ldquo;modelo de equipos coordinados/compartidos&amp;rdquo; (en Ingl&amp;eacute;s lo conocemos como &amp;ldquo;&lt;strong&gt;Shared Team&lt;/strong&gt;&amp;rdquo;). Con este enfoque, muchas tareas y caracter&amp;iacute;sticas del producto se asignan a un equipo compartido central y el resto de equipos que participan en el proyecto deben sincronizarse con este equipo central, o por el contrario no ser&amp;aacute;n capaces de finalizar el proyecto y lanzar un producto con todas las caracter&amp;iacute;sticas previstas.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Office es un gran ejemplo de adopci&amp;oacute;n de este modelo, tal cual coment&amp;aacute;bamos unas cuantas l&amp;iacute;neas m&amp;aacute;s arriba. Desde el d&amp;iacute;a en que alguien tuvo la gran idea de que todas las aplicaciones de productividad deber&amp;iacute;an empaquetarse juntas y vender el producto como una suite ofim&amp;aacute;tica, la jerarqu&amp;iacute;a dentro del equipo de Office ha evolucionado hacia este segundo modelo. De hecho, este equipo compartido recibe el nombre de &lt;strong&gt;Office Shared Services Team&lt;/strong&gt; (OSS).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_191B5C82.png"&gt;&lt;span style="font-size:small;"&gt;&lt;img height="116" width="532" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_5F2C1995.png" alt="image" border="0" title="image" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Dentro de la divisi&amp;oacute;n de Office, existen diferentes grupos de producto (como Word, Excel, Sharepoint, etc.) cuya labor es centrarse en el desarrollo de cada una de estas aplicaciones y ofrecer un producto de gran calidad, capaz de satisfacer a los clientes. Y frente a este tipo de grupos, encontramos otros grupos &lt;em&gt;transversales&lt;/em&gt; encargados de una serie de caracter&amp;iacute;sticas del producto comunes a todas las aplicaciones de la suite (Interfaz de Usuario, Infraestructura de Builds, Documentaci&amp;oacute;n, Internacionalizaci&amp;oacute;n, etc.). Combinando los esfuerzos de ambos tipos de grupos, se consigue por una parte innovar en cada aplicaci&amp;oacute;n y mejorarla de una a otra versi&amp;oacute;n, a la vez que mantener una coherencia a nivel de producto en toda la suite, y tambi&amp;eacute;n alinear fechas de lanzamiento del producto. De igual modo, la creaci&amp;oacute;n de estos grupos transversales nos proporciona una mejor visi&amp;oacute;n a la hora de implementar estrategias de dise&amp;ntilde;o, desarrollo y pruebas en el conjunto de la suite de Office.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Existen muchas variaciones y modelos intermedios entre ambos enfoques de organizaci&amp;oacute;n. &lt;em&gt;Siendo sinceros, probablemente no seamos capaces de encontrar dos grupos en Microsoft con una estructura id&amp;eacute;ntica entre s&amp;iacute;&lt;/em&gt;. Sin embargo, las filosof&amp;iacute;as y buenas pr&amp;aacute;cticas de estos dos modelos son la base ideol&amp;oacute;gica sobre la que todos los equipos se apoyan.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;A menudo, desde fuera de Microsoft, esto puede parecer una batalla, un cierto grado de rivalidad entre equipos. Pensemos en equipos de desarrollo como el &lt;strong&gt;equipo de C#&lt;/strong&gt; y el&lt;strong&gt; equipo de Visual Basic&lt;/strong&gt;, la forma en que alternativamente van a&amp;ntilde;adiendo caracter&amp;iacute;sticas nuevas a su lenguaje respectivo y la consiguiente &amp;ldquo;respuesta&amp;rdquo; del otro grupo. Afortunadamente, la colaboraci&amp;oacute;n entre estos dos grupos (&lt;em&gt;y entre otros muchos!&lt;/em&gt;) es cada vez mayor a nivel global dentro de Microsoft, y &lt;em&gt;en lugar de ser transatl&amp;aacute;nticos independientes luchando por llegar primeros a la otra costa, son aut&amp;eacute;nticas flotas navales avanzando de forma coordinada con un mismo rumbo&lt;/em&gt;&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Una estructura muy similar a la explicada para Office ser&amp;iacute;a la existente en la divisi&amp;oacute;n de Windows. Espero y deseo que a estas alturas todos conozcais y sigais de manera habitual el blog &lt;/span&gt;&lt;a target="_blank" href="http://blogs.msdn.com/e7"&gt;&lt;span style="font-size:small;"&gt;Engineering Windows 7&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:small;"&gt;, en el que nuestros amigos de Windows 7 encabezados por &lt;strong&gt;Steven Sinofsky&lt;/strong&gt; (Senior VP de Windows, de hecho), nos cuentan muchas de las decisiones de dise&amp;ntilde;o (y tambi&amp;eacute;n de ingenier&amp;iacute;a de procesos), que se toman a lo largo del desarrollo de un proyecto de semejantes dimensiones.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Valga el p&amp;aacute;rrafo previo para darme la oportunidad de mencionar el reciente lanzamiento de&lt;strong&gt; Internet Explorer 8&lt;/strong&gt; (Release Candidate). Si acud&amp;iacute;s a la web de descargas, observar&amp;eacute;is que la versi&amp;oacute;n para Windows 7 no est&amp;aacute; disponible para descarga, debido a que deben llevarse a cabo una serie de pruebas adicionales sobre ciertas caracter&amp;iacute;sticas exclusivas de Windows 7 (tales como interfaz de usuario t&amp;aacute;ctil, etc. pod&amp;eacute;is leerlo en la propia web de descarga)&amp;hellip; como podr&amp;eacute;is adivinar, este tipo de caracter&amp;iacute;stica pertenece a uno de esos &amp;ldquo;grupos transversales&amp;rdquo; de los que os hablaba arriba&amp;hellip; y antes de que nadie se escandalice por el hecho de no disponer a&amp;uacute;n de una versi&amp;oacute;n RC de IE8 en Windows 7, podr&amp;eacute;is leer entre l&amp;iacute;neas en este post la explicaci&amp;oacute;n razonada y &lt;em&gt;metodol&amp;oacute;gica&lt;/em&gt; de este hecho&amp;hellip; Es &amp;ldquo;&lt;em&gt;inminente&lt;/em&gt;&amp;rdquo; la aparici&amp;oacute;n de una versi&amp;oacute;n RC de Windows 7 que incluya IE8, as&amp;iacute; como otras caracter&amp;iacute;sticas excepcionales en las que est&amp;aacute;n trabajando.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;Comensales, ocupen sus asientos, y disp&amp;oacute;nganse a degustar esta suculenta paella llamada Windows 7. :)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=145477" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="microsoft" scheme="http://geeks.ms/blogs/mllopis/archive/tags/microsoft/default.aspx" /><category term="ingenieria" scheme="http://geeks.ms/blogs/mllopis/archive/tags/ingenieria/default.aspx" /><category term="windows 7" scheme="http://geeks.ms/blogs/mllopis/archive/tags/windows+7/default.aspx" /><category term="internet explorer" scheme="http://geeks.ms/blogs/mllopis/archive/tags/internet+explorer/default.aspx" /><category term="metodolog&amp;#237;as" scheme="http://geeks.ms/blogs/mllopis/archive/tags/metodolog_26002300_237_3B00_as/default.aspx" /></entry><entry><title>Disponibles los vídeos de todas las sesiones del Mix ‘09</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/03/23/disponibles-los-v-237-deos-de-todas-las-sesiones-del-mix-09.aspx" /><id>/blogs/mllopis/archive/2009/03/23/disponibles-los-v-237-deos-de-todas-las-sesiones-del-mix-09.aspx</id><published>2009-03-22T23:39:27Z</published><updated>2009-03-22T23:39:27Z</updated><content type="html">&lt;p&gt;&lt;font size="3"&gt;Tras la finalización del Mix’09, se ha publicado los vídeos de todas las sesiones en la web oficial del evento.&amp;#160; &lt;/font&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_58B05B83.png"&gt;&lt;font size="3"&gt;&lt;img style="border-right-width:0px;margin:5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="right" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/mllopis/image_5F00_thumb_5F00_50B8B921.png" width="132" height="80" /&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt; &lt;/font&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;font size="3"&gt;Tan sólo debemos seleccionar la sesión en el horario y pinchar en el título de la sesión en la ficha de la parte inferior de la página para cargar el player de Silverlight con los contenidos de la misma.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="https://content.visitmix.com/2009/Sessions/" href="https://content.visitmix.com/2009/Sessions/"&gt;&lt;font size="3"&gt;https://content.visitmix.com/2009/Sessions/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="left"&gt;&lt;font size="3"&gt;Enjoy!!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=145444" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="videos" scheme="http://geeks.ms/blogs/mllopis/archive/tags/videos/default.aspx" /><category term="MIX" scheme="http://geeks.ms/blogs/mllopis/archive/tags/MIX/default.aspx" /></entry><entry><title>Lo mejor del Mix’09: Vídeo sobre la Historia de Internet</title><link rel="alternate" type="text/html" href="/blogs/mllopis/archive/2009/03/20/lo-mejor-del-mix-09-v-237-deo-sobre-la-historia-de-internet.aspx" /><id>/blogs/mllopis/archive/2009/03/20/lo-mejor-del-mix-09-v-237-deo-sobre-la-historia-de-internet.aspx</id><published>2009-03-20T21:53:42Z</published><updated>2009-03-20T21:53:42Z</updated><content type="html">&lt;p&gt;&lt;font size="3"&gt;A juzgar por la opinión de mucha gente, estos han sido los mejores 5 minutos del &lt;strong&gt;Mix’09&lt;/strong&gt;. Con motivo del lanzamiento de &lt;a href="http://www.microsoft.com/windows/internet-explorer/default.aspx"&gt;&lt;strong&gt;Internet Explorer 8&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;Microsoft&lt;/strong&gt; ha creado un video recogiendo los hitos más destacables en la historia de la World Wide Web. Sí, ya sé que eso es algo que puedes encontrar en la &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/History_of_the_Internet"&gt;&lt;font size="3"&gt;&lt;strong&gt;Wikipedia&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="3"&gt;… Bueno, realmente no. Lo que la Wikipedia nos cuenta al respecto es la versión aburrida de la historia de Internet. En este video podrás encontrar a esos célebres personajes que has ido conociendo a lo largo de los últimos años, desde el &lt;em&gt;dancing hamster&lt;/em&gt; hasta el Ninja de &lt;em&gt;“Ask a Ninja”,&lt;/em&gt; pasando por grandes fenómenos sociales como el &lt;em&gt;“Update Status”&lt;/em&gt; o el &lt;em&gt;“Poke a Friend”.&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="3"&gt;Si Internet es de los usuarios, la Historia de Internet debería guiarse por aquello que a los usuarios más les ha impactado, ¿no? Pues aquí lo tenemos…&lt;/font&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/GsMFyo8DWs4&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/GsMFyo8DWs4&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=145337" width="1" height="1"&gt;</content><author><name>mllopis</name><uri>http://geeks.ms/members/mllopis/default.aspx</uri></author><category term="internet explorer" scheme="http://geeks.ms/blogs/mllopis/archive/tags/internet+explorer/default.aspx" /></entry></feed>