<?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">TeraBIThia</title><subtitle type="html">Blog sobre el mundo de la informática y la tecnología. Principalmente sobre la plataforma Microsoft y su .net Framework</subtitle><id>http://geeks.ms/blogs/crisfervil/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/crisfervil/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/crisfervil/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-10-21T22:59:24Z</updated><entry><title>HTML Base Tag. Postback en ventanas modales</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2012/02/13/html-base-tag-postback-en-ventanas-modales.aspx" /><id>/blogs/crisfervil/archive/2012/02/13/html-base-tag-postback-en-ventanas-modales.aspx</id><published>2012-02-13T09:01:00Z</published><updated>2012-02-13T09:01:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_78937325.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_371DE22E.png" width="269" height="141" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Me he encontrado más de una vez con el siguiente problema: Si se produce un postback en una ventana modal, el resultado de ese postback se carga en una nueva ventana, en lugar de hacerlo en la propia ventana modal.&lt;/p&gt;  &lt;p&gt;Esto ocurre independientemente del evento que cause el postback: El click de un botón, el cambio de valor de un desplegable, etc.&lt;/p&gt;  &lt;p&gt;Este comportamiento sólo ocurre con Internet Explorer.&lt;/p&gt;  &lt;p&gt;Solución? este maravilloso Tag HTML: &lt;/p&gt;  &lt;p&gt;base target=”_self”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4EDA3AF6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_16543C3E.png" width="720" height="180" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Con ponerlo, se corrige el problema.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y ya que estamos, qué hace ese tag?&lt;/p&gt;  &lt;p&gt;Indica qué frame, o ventana se usará &lt;u&gt;por defecto&lt;/u&gt; para cargar los enlaces. Esto, está pensado para aquellas ventanas que tienen varios elementos &amp;lt;&lt;strong&gt;&lt;em&gt;iframe&lt;/em&gt;&lt;/strong&gt;&amp;gt;.&lt;/p&gt;  &lt;p&gt;Los iframes, tienen un atributo &lt;strong&gt;name&lt;/strong&gt;, que sirve para identificarlos. Además, los iframes se pueden anidar.&lt;/p&gt;  &lt;p&gt;Este tag tiene la misma función que el atributo target de la etiqueta &lt;strong&gt;&lt;em&gt;&amp;lt;a&amp;gt;&lt;/em&gt;&lt;/strong&gt;, la que sirve para especificar los hyperlinks.&lt;/p&gt;  &lt;p&gt;Debe ser que en las ventanas modales, internet explorer asigna por defecto el valor _blank a este atributo.&lt;/p&gt;  &lt;p&gt;Posibles valores del atributo target:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="112"&gt;&lt;strong&gt;Valor&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="288"&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_blank&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en una nueva ventana o pestaña&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_self&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el mismo frame en que se encuentra el enlace&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_parent&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el parent frame, o contenedor del frame en el que se encuentra el enlace&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;_top&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Si la ventana actual tiene varios iframes, los ignora todos y carga el enlace en la ventana actual.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="112"&gt;&lt;i&gt;framename&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="288"&gt;Abre el enlace en el frame con el nombre especificado.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Adjunto código que muestra el funcionamiento y la corrección&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a title="Código Ejemplo Skydrive" href="https://skydrive.live.com/redir.aspx?cid=da2e56199efa5596&amp;amp;resid=DA2E56199EFA5596!207&amp;amp;parid=DA2E56199EFA5596!157&amp;amp;authkey=!ADYnb3vGs0pNcGA" target="_blank"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image1_5F00_78ABD139.png" width="202" height="186" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_535A3CDA.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1421349F.png" width="649" height="215" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Enlaces&lt;/strong&gt;:     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/att_base_target.asp" href="http://www.w3schools.com/tags/att_base_target.asp"&gt;http://www.w3schools.com/tags/att_base_target.asp&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/tag_a.asp" href="http://www.w3schools.com/tags/tag_a.asp"&gt;http://www.w3schools.com/tags/tag_a.asp&lt;/a&gt;     &lt;br /&gt;&lt;a title="http://www.w3schools.com/tags/tag_iframe.asp" href="http://www.w3schools.com/tags/tag_iframe.asp"&gt;http://www.w3schools.com/tags/tag_iframe.asp&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203328" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="asp.net" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx" /><category term="HTML" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/HTML/default.aspx" /></entry><entry><title>Industria Software España</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2012/01/26/industria-software-espa-241-a.aspx" /><id>/blogs/crisfervil/archive/2012/01/26/industria-software-espa-241-a.aspx</id><published>2012-01-26T11:10:31Z</published><updated>2012-01-26T11:10:31Z</updated><content type="html">&lt;p&gt;Interesante artículo.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/" href="http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/" target="_blank"&gt;http://www.presionblogosferica.com/2010/09/30/por-que-digo-que-no-hay-una-industria-del-software-en-espana/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Jeje, me quedo con dos frases del autor, &lt;strong&gt;&lt;a href="http://www.presionblogosferica.com/acerca-de/cv1/" target="_blank"&gt;Ángel Medinilla&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Un programador es un ente que alimentamos con UML y escupe código.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Hay programadores que son incapaces de distinguir entre un ordenador y un piano.&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203009" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author></entry><entry><title>JSTreeGraph. HTML4+Javascript Tree Graph</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2012/01/18/jstreegraph-html4-javascript-tree-grahp.aspx" /><id>/blogs/crisfervil/archive/2012/01/18/jstreegraph-html4-javascript-tree-grahp.aspx</id><published>2012-01-18T18:00:09Z</published><updated>2012-01-18T18:00:09Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_08F024B6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="308" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_60E00647.png" width="715" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Árbol en modo Horizontal.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_26F3540C.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="351" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_68902109.png" width="592" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Árbol en modo Vertical.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Llevo tiempo buscando algún componente que me permita representar en un entorno web, información jerárquica en cajitas. Hasta hoy no he dado con ninguna opción que cubra mis requerimientos; esto es, que no necesite plug-ins adicionales (flash, silverlight, etc.), que no haya que pagar licencias, y que permita mostrar la jerarquía tanto en vertical como en horizontal.&lt;/p&gt;  &lt;p&gt;Estudiando detenidamente &lt;a href="http://www.yworks.com/en/index.html"&gt;esta&lt;/a&gt; solución existente, me he de dado cuenta de que la lógica que hay detrás de estos árboles no parece muy complicada. Básicamente se trata de pintar una cajita por cada nodo, y unas líneas que las unan.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_20D128D3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="519" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_68B4CC5E.png" width="789" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Componente Silverlight de YWorks&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Así que, ya se sabe, a reinventar la rueda; me puse a programarlo. Y he llegado a la conclusión de que es más difícil de lo que parece. Aunque tampoco es para tanto :) Eso sí, se aprende un montón.&lt;/p&gt;  &lt;p&gt;Las dificultades con las que me he encontrado son: &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Dibujar líneas sobre una capa en HTML&lt;/strong&gt;: Con HTML5 y los lienzos, es fácil. Pero con HTML4, hay que aplicar algún truquillo. &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;El Layout, o dónde va cada cajita&lt;/strong&gt;: Dar con un algoritmo, medianamente eficiente que permita conocer la posición de cada cajita, me ha traído de cabeza, pero ha salido… y creo que no ha quedado mal.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Dibujar líneas sobre una Capa HTML&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Investigando un poco &lt;a href="http://www.google.com/" target="_blank"&gt;por ahí&lt;/a&gt;, he dado con un par de artículos que comentaban el problema. Básicamente hay tres posibilidades para resolverlo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.p01.org/releases/Drawing_lines_in_JavaScript/" target="_blank"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="216" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_10E99622.png" width="328" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Dibujar una capa de un pixel por un pixel en cada punto de la línea&lt;/strong&gt;. El inconveniente evidente de esta técnica es que es muy ineficiente.&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Usar una imagen con una línea en diagonal&lt;/strong&gt;, hacia arriba o hacia abajo, y redimensionarla hasta ajustarla a los puntos necesarios. El inconveniente de esta técnica es que las líneas quedan muy pixeladas. La ventaja es que es muy eficiente.&lt;/p&gt;  &lt;p&gt;- &lt;strong&gt;Usar un div que tenga la longitud total de la línea&lt;/strong&gt;. Esto sólo funciona para líneas rectas. La ventaja es que no se requieren imágenes adicionales, y es muy óptimo. Es la técnica que he utilizado, ya que, al menos en esta primera versión, sólo permitiré unir las cajitas con líneas rectas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4E0D51A7.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="295" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_444A7AE0.png" width="558" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lo que hacemos en esta función es crear una capa de &lt;strong&gt;&lt;em&gt;lineWidth&lt;/em&gt;&lt;/strong&gt; píxeles de grosor, con una longitud o determinada por la diferencia de posición de los puntos X e Y de los parámetros.&lt;/p&gt;  &lt;p&gt;Como podemos ver, es bastante sencillo. Quizá lo más destacable es la manera en que se conoce si la línea es vertical u horizontal: si la coordenada&lt;strong&gt; X&lt;/strong&gt; del punto de inicio de la línea es la misma que la coordenada &lt;strong&gt;X &lt;/strong&gt;del punto final, entonces se trata de una línea vertical.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_781501E2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="366" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67305DF2.png" width="437" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;El Layout, o la disposición de las cajitas.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Para este tema, que ha costado bastante, he usado varias funciones recursivas, que establecen la posición de cada nodo.&lt;/p&gt;  &lt;p&gt;El posicionamiento es distinto si pintamos el árbol en modo horizontal o vertical. Explicaré el posicionamiento Horizontal, pues parece más fácil de ver. Comprendido éste, el posicionamiento Vertical es exactamente igual, pero jugando con la posición superior de las cajitas, en lugar de la posición izquierda.&lt;/p&gt;  &lt;p&gt;Como es necesario pasearse por la estructura del árbol, y calcular constantemente el nivel, la referencia al nodo padre, y al nodo que está a la izquierda en el mismo nivel (LeftNode), he creado una función que realiza todo este cálculo una única vez, al principio. Esta función es la función &lt;strong&gt;&lt;em&gt;PrepareNode&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5FA77F36.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="352" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_5095C1BE.png" width="710" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El LeftNode de un nodo es el que está inmediatamente a la izquierda en el mismo nivel. De este modo puedo navegar por el árbol de arriba a abajo, entre niveles, mediante las propiedades ParentNode y Nodes, y horizontalmente dentro de un mismo nivel mediante la propiedad LeftNode.&lt;/p&gt;  &lt;p&gt;El parámetro rightLimits, es un array que contiene para cada nivel, el último nodo hijo analizado. Es un atajo para conocer cuál es LeftNode que está en una rama distinta de la que estoy analizando.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5E2310CA.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="336" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_76490BD6.png" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Habiendo pues, analizado cada nodo, y realizado este cálculo previo, pasmos a calcular las posiciones de cada cajita.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;La función PerformLayout(node)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Esta es una función también recursiva. Su función es establecer las coordenadas de posición y el tamaño de cada una de las cajitas.&lt;/p&gt;  &lt;p&gt;El parámetro de entrada de esta función es un nodo.&lt;/p&gt;  &lt;p&gt;(1) Para conocer la posición de un nodo, lo primero que hemos de saber es si tiene hijos; si no los tiene (6) la posición izquierda será la del nodo inmediatamente a la izquierda, más un margen predefinido.&lt;/p&gt;  &lt;p&gt;(2) Si el nodo tiene hijos, entra en juego la recursividad, pues volvemos a llamar a la función para cada uno de los hijos. Esta característica hace que se analicen en primer lugar los nodos finales de cada rama. Y esto está bien, pues normalmente la posición de un nodo irá condicionada por la posición de los elementos que tiene por debajo. Si el nodo no tiene hijos en cambio, el se pinta al lado del que tenga a la izquierda.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_27D99ACE.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="606" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2F8724DF.png" width="628" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Una vez analizados los hijos, (3) utilizamos los resultados del paso anterior, localizamos el centro, y posicionamos el nodo en ese punto. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_37373FA1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="188" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_26552C62.png" width="703" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Puede ocurrir que ese centro se superponga con el nodo de la izquierda(4), con lo que hay que mover a la derecha(5) el nodo en cuestión, y todos sus descendientes. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1E601AB1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_505A4BEC.png" width="519" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: El centro de los nodos hijos se superpone con el de la izquierda.&lt;/p&gt;  &lt;p&gt;A continuación, (7) queda calcular la posición superior, el ancho y alto de cada cajita. La posición superior va en función del nivel, y el ancho y alto son valores constantes.&lt;/p&gt;  &lt;p&gt;Por último, debemos indicar las coordenadas de los puntos de anclaje de los conectores(8). ¿Y qué es esto? Son los puntos donde está el inicio de la línea en caso de un nodo padre, y el fin de la línea en caso de un nodo hijo. Conociendo la izquierda, derecha, ancho y alto de cada nodo, este valor es muy fácil de calcular.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0D7E0772.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="207" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_10B510BC.png" width="453" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;Imagen: Puntos de Anclaje. &lt;/p&gt;  &lt;p&gt;Una vez calculadas las posiciones, ya sólo es cuestión de recorrerlos y pintar en cada posición una cajita. Y por último las líneas que conectan padres e hijos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6D1E03C5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="324" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_255F0B8F.png" width="167" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;Imagen: Flujo Completo.&lt;/p&gt;  &lt;p&gt;Este mismo algoritmo es el que se utiliza para calcular las posiciones de los nodos en el modo Vertical. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El código fuente y los ejemplos están publicados en Codeplex: &lt;a title="http://jstreegraph.codeplex.com" href="http://jstreegraph.codeplex.com"&gt;http://jstreegraph.codeplex.com&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Referencias&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.p01.org/releases/Drawing_lines_in_JavaScript/" href="http://www.p01.org/releases/Drawing_lines_in_JavaScript/"&gt;http://www.p01.org/releases/Drawing_lines_in_JavaScript/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html" href="http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html"&gt;http://www.yworks.com/products/yfilessilverlight/Demo.yFiles.Graph.Collapse.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://jsdraw2d.jsfiction.com/" href="http://jsdraw2d.jsfiction.com/"&gt;http://jsdraw2d.jsfiction.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Graph_drawing" href="http://en.wikipedia.org/wiki/Graph_drawing"&gt;http://en.wikipedia.org/wiki/Graph_drawing&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202870" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="Javascript" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Javascript/default.aspx" /><category term="Graph" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Graph/default.aspx" /><category term="Tree" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Tree/default.aspx" /></entry><entry><title>Arrays vs Dictionaries</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/10/10/arrays-vs-dictionaries.aspx" /><id>/blogs/crisfervil/archive/2011/10/10/arrays-vs-dictionaries.aspx</id><published>2011-10-10T12:36:13Z</published><updated>2011-10-10T12:36:13Z</updated><content type="html">&lt;p&gt;Tengo la necesidad de cargar en memoria una tabla con un gran volumen de datos. Hablamos de una tabla de millones de registros. Además la estructura de los datos no es conocida a priori. Los tipos de cada columna y su número se conocen después de ejecutar una consulta a base de datos.&lt;/p&gt;  &lt;p&gt;Entonces me surge la duda: Qué sería más óptimo en cuanto al consumo de memoria? ¿Usar Arrays o Diccionarios?&lt;/p&gt;  &lt;p&gt;La ventaja principal de los diccionarios es que me permite añadir filas a la tabla sin tener que preocuparme por redimensionar cada vez el array. Además, puedo acceder a los valores de la tabla usando un nombre, en lugar de usar un índice.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_18A51F27.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_77B1AC7F.png" width="320" height="28" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Para salir de dudas, he hecho una prueba, un poco simplona, pero que me ha sacado de dudas:&lt;/p&gt;  &lt;p&gt;Primero, he hecho una carga en memoria de una tabla de 100 columnas y un millón de registros, usando un diccionario y una lista genérica.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_16F45353.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1543877F.png" width="600" height="408" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al ejecutar esto…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7EA13937.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4AF8CCD9.png" width="471" height="300" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vaya, nisiquiera llega a cargar el millón de registros. Se ha quedado&amp;#160; en 185.000 filas.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_304C30C0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_41505EA3.png" width="292" height="172" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A ver qué pasa con los arrays…&lt;/p&gt;  &lt;p&gt;Lo mismo, pero con menos registros&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7F697954.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2DFF8237.png" width="652" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_414038D6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6735E92C.png" width="306" height="159" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vuelvo a ejecutar la prueba, para cada una de las opciones, pero esta vez reduciendo el número de columnas a 10.&lt;/p&gt;  &lt;p&gt;Esta vez, ambos procesos acaban sin el error de memoria.&lt;/p&gt;  &lt;p&gt;El consumo de memoria es en el caso de los arrays es de 916MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_783A170F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_24769DF4.png" width="430" height="350" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En el caso de las listas y diccionarios es de 929MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3BC1A265.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7327B393.png" width="419" height="342" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Lo que sí he notado, pero no he querido entretenerme en comprobarlo, es que en el caso de los arrays el tiempo de ejecución era menor, lo que indica un acceso a memoria más óptimo en el caso de los arrays.&lt;/p&gt;  &lt;p&gt;De todos modos me he decantado por usar las listas, pues la prioridad era el consumo de memoria frente al tiempo de proceso. &lt;/p&gt;  &lt;p&gt;Hemos visto que el consumo de memoria es el prácticamente el mismo en ambos casos, pero usando los diccionarios, la programación es más cómoda, pudiéndose referenciar columnas por su nombre. Es posible que esto último ayude incluso a reducir el número de errores.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201111" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author></entry><entry><title>Convert ListaGenerica a DataTable</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/07/06/convert-listagenerica-a-datatable.aspx" /><id>/blogs/crisfervil/archive/2011/07/06/convert-listagenerica-a-datatable.aspx</id><published>2011-07-06T13:43:07Z</published><updated>2011-07-06T13:43:07Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7E9C29E3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="129" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_46EC0064.png" width="129" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Me apunto por aquí un trozo de código que permite convertir una Lista Genérica (por ejemplo de entidades) a un DataTable. Es totalmente compatible con el Framework 2.&lt;/p&gt;  &lt;p&gt;Para convertir una Lista Genérica en un DataTable, debemos primeramente obtener por reflexión las propiedades públicas de los elementos de la lista genérica. Cada una de estas propiedades corresponderá a una columna de la Tabla. &lt;/p&gt;  &lt;p&gt;A continuación, deberemos recorrer los elementos de la lista genérica, y añadir una fila a la tabla por cada item de la lista.&lt;/p&gt;  &lt;p&gt;Hay que tener cuidado con los tipos nullables. No están soportados en los DataTables.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Convert data from a generyc list to a DataTable&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DataTable Convert&amp;lt;TItemType&amp;gt;(List&amp;lt;TItemType&amp;gt; list)
{
    DataTable convertedData = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();

    &lt;span class="rem"&gt;// Get List Item Properties info&lt;/span&gt;
    Type itemType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TItemType);
    PropertyInfo[] publicProperties =
        &lt;span class="rem"&gt;// Only public non inherited properties&lt;/span&gt;
        itemType.GetProperties(BindingFlags.Instance | BindingFlags.Public);

    &lt;span class="rem"&gt;// Create Table Columns&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PropertyInfo property &lt;span class="kwrd"&gt;in&lt;/span&gt; publicProperties)
    {
        &lt;span class="rem"&gt;// DataSet does not support System.Nullable&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (property.PropertyType.IsGenericType &amp;amp;&amp;amp;
            property.PropertyType.GetGenericTypeDefinition() == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Nullable&amp;lt;&amp;gt;))
        {
            &lt;span class="rem"&gt;// Set the column datatype as the nullable value type&lt;/span&gt;
            convertedData.Columns.Add(property.Name, property.PropertyType.GetGenericArguments()[0]);
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            convertedData.Columns.Add(property.Name, property.PropertyType);
        }
    }

    &lt;span class="rem"&gt;// Convert the Data&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (TItemType item &lt;span class="kwrd"&gt;in&lt;/span&gt; list)
    {
        &lt;span class="kwrd"&gt;object&lt;/span&gt;[] rowData = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[convertedData.Columns.Count];
        &lt;span class="kwrd"&gt;int&lt;/span&gt; rowDataIndex = 0;
        &lt;span class="rem"&gt;// Iterate through Item Properties&lt;/span&gt;
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PropertyInfo property &lt;span class="kwrd"&gt;in&lt;/span&gt; publicProperties)
        {
            &lt;span class="rem"&gt;// Add a single cell data&lt;/span&gt;
            rowData[rowDataIndex] = property.GetValue(item, &lt;span class="kwrd"&gt;null&lt;/span&gt;);
            rowDataIndex++;
        }
        convertedData.Rows.Add(rowData);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; convertedData;
}&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Y la operación inversa; Convertir una DataTable en una lista Genérica.&lt;/p&gt;

&lt;p&gt;En este caso, lo primero será ver qué columnas de la tabla son propiedades públicas en los elementos de la lista. Las demás, no podré convertirlas, o al menos no directamente. &lt;/p&gt;

&lt;p&gt;A continuación, recorremos las filas de la tabla, e instanciamos un elemento de la lista por cada fila. Asignamos por reflexión los valores a las propiedades, y añadimos la nueva instancia a la lista. &lt;/p&gt;

&lt;p&gt;Este código también tiene en cuenta las conversiones entre Null y System.DBNull. Recordemos que en los DataTable se utiliza este valor para indicar un valor nulo. Esto seguramente es así, porque los DataTable son anteriores a la aparición de los tipos Nullables.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Fills a generyc list with the data cointained in a DataTable&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; List&amp;lt;TItemType&amp;gt; Convert&amp;lt;TItemType&amp;gt;(DataTable dt) &lt;span class="kwrd"&gt;where&lt;/span&gt; TItemType:&lt;span class="kwrd"&gt;new&lt;/span&gt;()
{
    List&amp;lt;TItemType&amp;gt; convertedData = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;TItemType&amp;gt;();

    &lt;span class="rem"&gt;// Get List Item Properties info&lt;/span&gt;
    Type itemType = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TItemType);
    
    &lt;span class="rem"&gt;// Only public non inherited properties&lt;/span&gt;
    BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;

    &lt;span class="rem"&gt;// wich columns of the datatable are properties of TItemType?&lt;/span&gt;
    Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;,PropertyInfo&amp;gt; availableProperties = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, PropertyInfo&amp;gt;();
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataColumn column &lt;span class="kwrd"&gt;in&lt;/span&gt; dt.Columns)
    {
        PropertyInfo prop = itemType.GetProperty(column.ColumnName, bindingFlags);
        &lt;span class="kwrd"&gt;if&lt;/span&gt;(prop!=&lt;span class="kwrd"&gt;null&lt;/span&gt;) availableProperties.Add(column.ColumnName,prop);
    }

    &lt;span class="rem"&gt;// Fill the generyc list with data&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DataRow row &lt;span class="kwrd"&gt;in&lt;/span&gt; dt.Rows)
    {
        TItemType item = &lt;span class="kwrd"&gt;new&lt;/span&gt; TItemType();
        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;, PropertyInfo&amp;gt; availableProperty &lt;span class="kwrd"&gt;in&lt;/span&gt; availableProperties)
        {
            &lt;span class="kwrd"&gt;object&lt;/span&gt; propValue = row[availableProperty.Key];
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (propValue!=&lt;span class="kwrd"&gt;null&lt;/span&gt;&amp;amp;&amp;amp;propValue!=System.DBNull.Value)
                availableProperty.Value.SetValue(item, propValue, &lt;span class="kwrd"&gt;null&lt;/span&gt;);                

        }
        convertedData.Add(item);
    }

    &lt;span class="kwrd"&gt;return&lt;/span&gt; convertedData;
}&lt;/pre&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Por último, cómo probaríamos este código? Unit Testing a Tope!&lt;/p&gt;

&lt;p&gt;Por ejemplo, puedo declarar una entidad de prueba, cargar una lista con datos aleatorios, y ver que tras la conversión a DataTable, la Tabla tiene tantas columnas como propiedades públicas tiene la entidad, y que el número de elementos coincide.&lt;/p&gt;

&lt;p&gt;Y al hacer la operación inversa, ver que el número de elementos es el mismo.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;List&amp;lt;TestEntity&amp;gt; myItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;TestEntity&amp;gt;();

&lt;span class="rem"&gt;// Generate Random Data&lt;/span&gt;
Random r = &lt;span class="kwrd"&gt;new&lt;/span&gt; Random(System.DateTime.Now.Millisecond);
&lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 10; i++)
{
    TestEntity newItem = &lt;span class="kwrd"&gt;new&lt;/span&gt; TestEntity();
    newItem.Name = Guid.NewGuid().ToString();
    newItem.Birthday = DateTime.Now.AddHours(r.Next(1000));
    newItem.LastBillDate = r.Next()%2 == 0 ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime?(DateTime.Now.AddHours(r.Next(1000)));
    newItem.LastBillAmount = r.Next() % 2 == 0 ? &lt;span class="kwrd"&gt;null&lt;/span&gt; : &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;double&lt;/span&gt;?(r.NextDouble());
    myItems.Add(newItem);
}

DataTable dt1 = Converter.Convert&amp;lt;TestEntity&amp;gt;(myItems);
&lt;span class="rem"&gt;// The date table columns count and the public properties must be the same&lt;/span&gt;
Assert.AreEqual(dt1.Columns.Count,&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(TestEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public).Length);
Assert.AreEqual(dt1.Rows.Count,myItems.Count);

&lt;span class="rem"&gt;// Re convert to an Entity List&lt;/span&gt;
List&amp;lt;TestEntity&amp;gt; myConvertedItems = Converter.Convert&amp;lt;TestEntity&amp;gt;(dt1);
Assert.AreEqual(myItems.Count, myConvertedItems.Count);&lt;/pre&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=197314" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="snippets" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx" /></entry><entry><title>Deshabilitar Boton Guardar en PDF</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/03/15/deshabilitar-boton-guardar-en-pdf.aspx" /><id>/blogs/crisfervil/archive/2011/03/15/deshabilitar-boton-guardar-en-pdf.aspx</id><published>2011-03-15T08:18:00Z</published><updated>2011-03-15T08:18:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_043F9089.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_73EE5B93.png" border="0" height="288" width="621" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Qu&amp;eacute; duda cabe que el formato PDF se ha popularizado tanto, que ha llegado a convertirse en un est&amp;aacute;ndar en el intercambio de documentos. Hoy en d&amp;iacute;a, cualquiera de las aplicaciones que manejamos permite exportar informaci&amp;oacute;n usando este formato.&lt;/p&gt;
&lt;p&gt;Muchas veces, nos encontramos con usuarios que manejan informaci&amp;oacute;n confidencial, y desean que sus documentos est&amp;eacute;n de alguna manera &lt;span style="text-decoration:underline;"&gt;controlados&lt;/span&gt;. Que a ser posible, no salgan de sus instalaciones. Que sus empleados, o las personas que tengan acceso a dicha informaci&amp;oacute;n, s&amp;oacute;lo puedan visualizarla, pero que no tengan la posibilidad de copiarla y distribuirla.&lt;/p&gt;
&lt;p&gt;A d&amp;iacute;a de hoy, esta es una funcionalidad que es bastante complicada conseguir. Y lo es, porque en teor&amp;iacute;a, cualquier contenido &lt;span style="text-decoration:underline;"&gt;al que tengamos acceso&lt;/span&gt;, es susceptible de ser copiado y posteriormente distribuido. &lt;/p&gt;
&lt;p&gt;El formato PDF no es ajeno a esta caracter&amp;iacute;stica. Una vez puestos los medios para impedir que &lt;span style="text-decoration:underline;"&gt;personas no adecuadas&lt;/span&gt; tengan acceso al documento, (porque en impedir el acceso s&amp;iacute; se pueden poner muchas medidas de seguridad) y el&amp;nbsp; usuario ha conseguido visualizarlo en pantalla, hay poco que podamos hacer; Si est&amp;aacute;n los bits, estos se pueden copiar. Y si se pueden copiar, se pueden distribuir.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Se puede usar el viejo truco de imprimir la pantalla, imprimir el documento y volver a escanearlo, copiarlo con l&amp;aacute;piz y papel, memorizarlo, hacer una foto con el m&amp;oacute;vil, y un mont&amp;oacute;n de cosas que est&amp;aacute;n ah&amp;iacute;, y no son complicadas de abordar.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3A01A958.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3136C26E.png" border="0" height="170" width="424" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como contramedida, lo que podemos hacer, es al menos, eliminar los medios de distribuci&amp;oacute;n m&amp;aacute;s evidentes, como el bot&amp;oacute;n guardar del Reader.&lt;/p&gt;
&lt;p&gt;Existen &lt;span style="text-decoration:underline;"&gt;par&amp;aacute;metros&lt;/span&gt; que pueden pasarse al Reader para deshabilitar las barras de herramientas, el men&amp;uacute;, la barra de estado, etc..&lt;/p&gt;
&lt;p&gt;Se puede adem&amp;aacute;s indicar qu&amp;eacute; p&amp;aacute;gina del documento se mostrar&amp;aacute;, el nivel de zoom, incluso si queremos realizar autom&amp;aacute;ticamente una b&amp;uacute;squeda dentro del documento.&lt;/p&gt;
&lt;p&gt;Referencia a la lista de par&amp;aacute;metros disponibles:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf" href="http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf"&gt;http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los par&amp;aacute;metros pueden pasarse por API, por l&amp;iacute;nea de comandos, por URL, o dentro del tag object de un documento html.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Acrobat.exe /A &amp;quot;zoom=1000&amp;quot; &amp;quot;C:\example.pdf&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;http://example.org/doc.pdf#page=3&amp;amp;pagemode=thumbs&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_673DD22C.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1A9C263A.png" border="0" height="179" width="633" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Con Toolbar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0E9CC6B7.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_200FB840.png" border="0" height="149" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Sin Toolbar.&lt;/p&gt;
&lt;p&gt;Existen tambi&amp;eacute;n otras alternativas. Como usar viewers en los que podemos controlar ciertos par&amp;aacute;metros, como el de las toolbars, el men&amp;uacute; contextual, etc.&lt;/p&gt;
&lt;p&gt;Van dos ejemplos de viewers en Silverlight.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.pdftron.com/silverdox/"&gt;http://www.pdftron.com/silverdox/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_15E0AE84.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_640DB94E.png" border="0" height="421" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;PDF Tron. Silverlight. Sin Toolbar. El men&amp;uacute; contextual no permite copiar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://firstfloorsoftware.com/documenttoolkit"&gt;http://firstfloorsoftware.com/documenttoolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_12F58C95.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_145C4018.png" border="0" height="421" width="644" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;First Floor Document Toolkit for Silverlight. Impide guardar el documento, copiarlo, pegarlo, etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://es.wikipedia.org/wiki/PDF" href="http://es.wikipedia.org/wiki/PDF"&gt;http://es.wikipedia.org/wiki/PDF&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En cuanto a impedir que la informaci&amp;oacute;n llegue a manos equivocadas, tenemos a nuestra disposici&amp;oacute;n, el servidor de Rights Management.&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx" href="http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx"&gt;http://www.microsoft.com/windowsserver2003/technologies/rightsmgmt/default.mspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Windows Rights Management impide que los documentos protegidos puedan ser abiertos, impresos, reenviados, etc, a personas no autorizadas.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E88AA65.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_349BF82A.png" border="0" height="320" width="330" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_48B7A564.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_033535EA.png" border="0" height="221" width="514" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como conclusi&amp;oacute;n, yo dir&amp;iacute;a que cuando nos encontremos con un requerimiento de este tipo, lo mejor es informar al usuario de los riesgos existentes y de las alternativas viables. El riesgo de fuga de informaci&amp;oacute;n siempre estar&amp;aacute; ah&amp;iacute;, y en &amp;uacute;ltima instancia, no existe m&amp;aacute;s remedio que intentar restringir al m&amp;aacute;ximo la informaci&amp;oacute;n confidencial y concienciar al usuario de los riesgos que supone no tenerla controlada. Normalmente, antes de ense&amp;ntilde;ar informaci&amp;oacute;n confidencial, se suele pedir al usuario que acepte unos t&amp;eacute;rminos de &lt;a href="http://es.wikipedia.org/wiki/Non-disclosure_agreement" target="_blank"&gt;NDA (Non Disclosure Agreement)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190389" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /><category term="PDF" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/PDF/default.aspx" /></entry><entry><title>StackOverflowException en ASP.net</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/03/10/stackoverflowexception-en-asp-net.aspx" /><id>/blogs/crisfervil/archive/2011/03/10/stackoverflowexception-en-asp-net.aspx</id><published>2011-03-10T07:57:00Z</published><updated>2011-03-10T07:57:00Z</updated><content type="html">&lt;p&gt;Apunto este snippet, como recordatorio.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7A3C5C75.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_75EA8703.png" border="0" height="342" width="842" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como indica el comentario del c&amp;oacute;digo, me ha ocurrido que necesitaba ejecutar una funci&amp;oacute;n recursiva, que recorriese un &amp;aacute;rbol en busca de un nodo.&lt;/p&gt;
&lt;p&gt;Como mi &amp;aacute;rbol hab&amp;iacute;a sido construido por el usuario, y no exist&amp;iacute;an validaciones que lo impidiesen, estaba realizando una b&amp;uacute;squeda recursiva, en la que uno de los nodos hijo era a su vez padre en la misma rama.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_44813412.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_56CC8B85.png" border="0" height="225" width="286" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y como indica la MSDN&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Starting with the .NET Framework version 2.0, a StackOverflowException object cannot be caught by a try-catch block and the corresponding process is terminated by default. Consequently, users are advised to write their code to detect and prevent a stack overflow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;el el StackOverflowException no se puede capturar en un bloque try&amp;hellip;catch, y como consecuencia, el proceso finaliza sin m&amp;aacute;s, sin hacer preguntas.&lt;/p&gt;
&lt;p&gt;Esto, en una aplicaci&amp;oacute;n de escritorio, aunque es problem&amp;aacute;tico, no tiene mayor repercusi&amp;oacute;n, y el fallo es evidente; La aplicaci&amp;oacute;n se cierra sin hacer preguntas. Pero en una aplicaci&amp;oacute;n Asp.net, el proceso del IIS se reinicia, y hasta que te das cuenta del fallo&amp;hellip; puede pasar mucho tiempo. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx" href="http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190189" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="asp.net" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx" /><category term="snippets" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx" /></entry><entry><title>Top 100 European Software Companies</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/02/07/top-100-european-software-companies.aspx" /><id>/blogs/crisfervil/archive/2011/02/07/top-100-european-software-companies.aspx</id><published>2011-02-07T08:27:22Z</published><updated>2011-02-07T08:27:22Z</updated><content type="html">&lt;p&gt;Veo este ranking y me pregunto: ¿Qué nos pasa?&lt;/p&gt;  &lt;p&gt;¿Cómo es posible que entre las 100 mayores empresas europeas sólo haya UNA española?&lt;/p&gt;  &lt;p&gt;¿Qué es lo que ocurre?&lt;/p&gt;  &lt;p&gt;¿Somos poco emprendedores? ¿No tenemos ideas? ¿No sabemos hacer negocio?&lt;/p&gt;  &lt;p&gt;¿El software no es lo nuestro?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.truffle100.com/2010/ranking.php" target="_blank"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_791D6B9B.png" width="527" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Source: &lt;a title="http://www.truffle100.com/2010/ranking.php" href="http://www.truffle100.com/2010/ranking.php"&gt;http://www.truffle100.com/2010/ranking.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;No hay que desmerecer el hecho de que &lt;a href="http://www.pandasecurity.com/" target="_blank"&gt;Panda Software&lt;/a&gt; esté en la posición 45, si no que no haya ninguna otra, ni por encima, ni por debajo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5D367967.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="210" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_43D106DE.png" width="565" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Truffle 100&lt;/strong&gt; ranks &amp;amp; analyzes the top 100 European Software Vendors (ISVs).    &lt;br /&gt;It was created in 2006 by &lt;strong&gt;&lt;a href="http://www.truffle.com"&gt;Truffle Capital&lt;/a&gt;&lt;/strong&gt;, &lt;a href="http://www.truffle.com"&gt;a leading European Venture Capital firm&lt;/a&gt;. The research is based on data compiled from survey and analysis conducted over the years by &lt;a href="http://www.cxp.fr/"&gt;CXP&lt;/a&gt;, a Market Research Organization focusing on Software, &lt;a href="http://www.idc.com"&gt;IDC&lt;/a&gt;, the premier global market intelligence firm, and the &lt;a href="http://www.softwaretop100.org/"&gt;Top 100 Research Foundation&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188515" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="Opinion" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Opinion/default.aspx" /><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /></entry><entry><title>Feliz 11111011011</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2011/01/03/feliz-11111011011.aspx" /><id>/blogs/crisfervil/archive/2011/01/03/feliz-11111011011.aspx</id><published>2011-01-03T15:26:51Z</published><updated>2011-01-03T15:26:51Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4ABCD818.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="213" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_449AACDF.png" width="441" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2011 es la suma de 11 números primos consecutivos.&lt;/p&gt;  &lt;h2&gt;2011 = 157+163+167+173+179+181+191+193+197+199+211&lt;/h2&gt;  &lt;p&gt;Es el siguiente año correspondiente a un número primo, desde 2003.&lt;/p&gt;  &lt;p&gt;Dos números primos son “consecutivos” si uno sigue al otro en la colección de números primos. Por ejemplo, 3 y 5 son números primos consecutivos, como lo son 7 y 11.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;¿Qué números primos son el resultado de la suma de otros números primos consecutivos?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;He aquí una lista: &lt;a href="http://bit.ly/dKuh9S" target="_blank"&gt;http://bit.ly/dKuh9S&lt;/a&gt; (2011 es uno de ellos!)&lt;/p&gt;  &lt;p&gt;El enlace corresponde a una entrada a la On-Line Encyclopedia of Integer Sequences (OEIS) y lo que se muestra es una lista de ejemplo de números que son el resultado de la sima de dos o más números primos consecutivos.&lt;/p&gt;  &lt;p&gt;Se incluye también código de &lt;a href="http://es.wikipedia.org/wiki/Mathematica" target="_blank"&gt;Mathematica&lt;/a&gt; para encontrar este tipo de números primos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_47D1B629.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="404" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_08961D3D.png" width="263" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El problema de encontrar números primos que son suma de dos o más números primos no consecutivos es un problema complejo, que se suele utilizar como ejercicio en muchas universidades.&lt;/p&gt;  &lt;p&gt;Podemos complicarlo un poco más e intentar averiguar, por ejemplo, ¿qué números primos son el resultado de la suma de números primos que son el resultado de la suma de números primos consecutivos…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El siguiente año, después de 2011 que es resultado de la suma de números primos consecutivos es 2027.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;2027 = 29+31+37+41+43+47+53+59+61+67+71+73+ 79+83+89+97+101+103+107+109+113+127+131+137+139&lt;/p&gt;  &lt;p&gt;2027 tiene además la propiedad de estar formado por los números 2+0+2+7=11, cuya suma es también, un número primo. Es el primer año desde 2003 que tiene esta propiedad.&lt;/p&gt;  &lt;p&gt;El siguiente año, después de 2027 con la propiedad de ser suma de números primos consecutivos es 2081.&lt;/p&gt;  &lt;p&gt;2081 = 401+409+419+421+431&lt;/p&gt;  &lt;p&gt;Pero 2011 puede ser además escrito como suma de otros números primos consecutivos. &lt;/p&gt;  &lt;p&gt;2011 = 661+673+677 &lt;/p&gt;  &lt;p&gt;Esto nos lleva a la pregunta: ¿De cuántas maneras puede expresarse un número primo como suma de números primos consecutivos?&lt;/p&gt;  &lt;p&gt;Pues, eso, feliz 2011!!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Prime_number" href="http://en.wikipedia.org/wiki/Prime_number"&gt;http://en.wikipedia.org/wiki/Prime_number&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Primality_test" href="http://en.wikipedia.org/wiki/Primality_test"&gt;http://en.wikipedia.org/wiki/Primality_test&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186705" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /></entry><entry><title>DSL. Domain Specific Languaje.</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/12/22/dsl-domain-specific-languaje.aspx" /><id>/blogs/crisfervil/archive/2010/12/22/dsl-domain-specific-languaje.aspx</id><published>2010-12-22T07:24:00Z</published><updated>2010-12-22T07:24:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_15FB5B4E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="218" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_02731D0F.png" width="323" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Qué son exactamente los DSL y qué posibilidades nos ofrecen? &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;En su definición más generalista, un DSL [Domain-Specific Programming Languaje] o &amp;quot;Lenguaje de Programación de Dominio Específico&amp;quot; es un lenguaje diseñado para realizar tareas específicas para un dominio concreto; es decir, a diferencia de un lenguaje de uso general, como C# o VB, un DSL permite abstraerse a una tipo de problema concreto, como puede ser, ejecutar procedimientos almacenados. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si lo que queremos es ejecutar procedimientos almacenados, un lenguaje generalista como VB, C o C#, permitiría realizarlo sin problemas, pero un lenguaje diseñado específicamente para esta actividad, debería hacer el trabajo más fácil. Un DSL, por ser un lenguaje específico, dejaría de lado las funciones que no son necesarias y se centraría sólo en lo importante para realizar dicha actividad.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E7EABDA.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="228" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_11D0C1E2.png" width="323" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un DSL debe permitir definir las entidades del dominio, que serían las piezas del puzle con las que el programador especificará los detalles concretos del problema.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Un DSL para ejecutar procedimientos almacenados podrían tener los siguientes elementos de dominio: Base de Datos, Procedimiento Almacenado, Esquema, Paquete, Parámetro, Cursor de Salida, Campo, etc., etc..&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El lenguaje nos debería permitir definir las propiedades y la interrelación entre estos elementos de dominio, y con esa información, permitir realizar la operación deseada.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image44_5F00_7073ACF6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 20px 0px;border-right-width:0px;" height="209" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image44_5F00_thumb_5F00_774DF27F.png" width="327" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Un DSL no tiene porqué ser un lenguaje de programación escrito, que haya que teclear. Puede ser gráfico, permitiendo definir las relaciones entre sus elementos mediante un lenguaje Visual. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ejemplos de Lenguajes Específicos pueden ser: Logo para niños, Verilog y VHSIC, R y S para estadísticas, Mata para programación matricial, Mathematica y Maxima para matemáticas, fórmulas de hojas de cálculo y macros, SQL para consultas a bases de datos relacionales, Yacc para crear parseadores, expresiones regulares para crear análisis léxico, Generic Eclipse Modeling System y &lt;a href="http://en.wikipedia.org/wiki/DGML" target="_blank"&gt;DGML de Visual Studio&lt;/a&gt; para crear lenguajes con el objetivo de diagramar, Csound un lenguaje para síntesis digital, y los lenguajes de entrada de GraphViz y GrGen, paquetes de software usados para graficar y reescribir gráficas. También podrían serlo &lt;a href="http://geeks.ms/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx" target="_blank"&gt;Alice, un lenguaje para la programación de mundos virtuales&lt;/a&gt; y &lt;a href="http://www.antlr.org/" target="_blank"&gt;ANTLR, que permite definir compiladores&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2A42A449.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="242" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_08E8200F.png" width="328" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pasando un poco de las definiciones más generalistas, vamos a ver qué son las DSL dentro de Visual Studio. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;br /&gt;Dentro del SDK de Visual Studio (a partir de la versión 2005), se encuentran las DSL Tools, que permiten la definición de los elementos de la DSL, la creación de diseñadores gráficos y la generación automática de código usando una notación bastante sencilla, basada en plantillas, que pueden ser escritas en C# o en VB.net. &lt;/p&gt;  &lt;p&gt;Está bien, parece interesante, pero cómo se hace esto? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx" target="_blank"&gt;El ejemplo en la siguiente entrega&lt;/a&gt; ;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Fuentes:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bb126259.aspx" href="http://msdn.microsoft.com/en-us/library/bb126259.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb126259.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx" href="http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx"&gt;http://msdn.microsoft.com/en-us/vstudio/cc677260.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Domain-specific_language" href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;http://en.wikipedia.org/wiki/Domain-specific_language&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html" href="http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html"&gt;http://cuartageneracion.blogspot.com/2005/06/microsoft-y-mda-mdd-domain-specific.html&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186248" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="DSL" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx" /></entry><entry><title>DSL Con Visual Studio</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx" /><id>/blogs/crisfervil/archive/2010/12/22/dsl-con-visual-studio.aspx</id><published>2010-12-22T07:04:00Z</published><updated>2010-12-22T07:04:00Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Dentro del SDK de Visual Studio (a partir de la versión 2005), se encuentran las DSL Tools, que permiten la definición de los elementos de la DSL, la creación de diseñadores gráficos y la generación automática de código usando una notación bastante sencilla, basada en plantillas, que pueden ser escritas en C# o en VB.net. &lt;/p&gt;  &lt;p&gt;Está bien, parece interesante, pero cómo se hace esto? &lt;/p&gt;  &lt;p&gt;Lo primero, es la instalación del &lt;a href="http://msdn.microsoft.com/en-us/library/bb166441.aspx" target="_blank"&gt;SDK&lt;/a&gt; de la versión correspondiente a Visual Studio que tienes instalada. &lt;/p&gt;  &lt;p&gt;Para crear un DSL debemos crear un proyecto de tipo Doman-Specific Languaje Designer&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_73099A39.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="499" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6C7B3C0B.png" width="685" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al crear la solución, se mostrará un asistente que nos guiará en la creación del proyecto. Existen plantillas, que contienen elementos del dominio y diseñadores predefinidos, en las que podemos basar nuestro DSL.&amp;#160; &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Los posteriores pasos del asistente son triviales. Piden información acerca del nombre del proyecto, la compañía, etc. &lt;/p&gt;  &lt;p&gt;Para el ejemplo, seleccionaremos la plantilla MinimalLanguaje.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_600FA993.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="487" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7CAEB617.png" width="700" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_449259A3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="487" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7C69BF28.png" width="700" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Finalizado el asistente, se crean en la solución, dos proyectos: &lt;span style="font-style:italic;"&gt;Dsl &lt;/span&gt;y &lt;span style="font-style:italic;"&gt;DslPackage&lt;/span&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_66A4F82D.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="379" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_212288B3.png" width="350" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Dentro de la solución, en el proyecto DSL encontraremos estos elementos:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_26FFBCFD.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="635" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3E0D7C92.png" width="986" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Al archivo DslDefinition, en el que definiremos todas las piezas de nuestro puzle.&lt;/p&gt;  &lt;p&gt;El panel DslExplorer, que nos mostrará, de una manera organizada, los elementos, y la lógica que definirá el comportamiento de nuestro Dsl.&lt;/p&gt;  &lt;p&gt;El panel DSL Details, que nos informará de algunas propiedades del elemento DSL seleccionado en diseñador DSL.&lt;/p&gt;  &lt;p&gt;La Toolbox, en la que encontraremos los elementos que podemos arrastrar al diseñador.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1593BBE0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="301" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_62C6461C.png" width="197" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una cosa realmente curiosa, es que la herramienta que estamos utilizando para crear nuestro DSL, es decir el &amp;quot;DSL Designer&amp;quot; de Visual Studio es un DSL, es decir, un lenguaje visual a partir del cual crearemos en un lenguaje no específico, la solución a nuestro problema especifico. Simplemente, impresionante. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_28D993E1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="486" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_03723124.png" width="189" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Como siguientes pasos para la demo, realizar las siguientes acciones:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Eliminar los elementos: ExampleElement, ExampleShape y ExampleConnector&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir, desde la Toolbox un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin-left:0px;margin-right:0px;border-right-width:0px;" height="21" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5038886B.png" width="138" border="0" /&gt; y llamarlo StoredProcedure&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Parameter&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Resulset&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir otro Named Domain Class y llamarlo Field    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_16B57874.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_37CB05BF.png" width="323" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, los siguientes pasos:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar ExampleModel con StoredProcedure mediante un &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_494087F9.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="16" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3DAACABA.png" width="141" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con Resulset mediante un Embedding RelationShip&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con Parameter mediante un Embedding RelationShip    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Conectar Resulset con Field mediante un Embedding RelationShip&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_32150D7B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="555" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6D8D1E8E.png" width="297" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, más pasos:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="20" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_061F4C90.png" width="127" border="0" /&gt; y llamarlo StoredProcedureCompartmentShape.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Decorators y Add new Text Decorator.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Compartments y Add new Compartment.&lt;/p&gt;  &lt;p&gt;Editar las propiedades de Compartment1 y establecer la propiedad Title a “Parameters”.&lt;/p&gt;  &lt;p&gt;Conectar StoredProcedure con StoredProcedureCompartmentShape mediante un Diagram Element Map.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un CompartmentShape y llamarlo ResulsetCompartmentShape.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Decorators y Add new Text Decorator.&lt;/p&gt;  &lt;p&gt;Botón derecho sobre Compartments y Add new Compartment.&lt;/p&gt;  &lt;p&gt;Editar las propiedades de Compartment1 y establecer la propiedad Title a “Fields”.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Añadir un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="14" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4172B24E.png" width="74" border="0" /&gt; y unirlo mediante un &lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="18" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_61218C16.png" width="130" border="0" /&gt;&amp;#160; con la relación que hay entre StoredProcedure y Resulset, es decir, StoredProcedureHasResulset.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Doble Click en la Línea que une&amp;#160; El StoredProcedureCompartmentShape y el StoredProcedure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6A111E55.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3DF6B215.png" width="638" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En la pestaña DSL Details, seleccionar, la pestaña Decorator Maps y en Decorators, marcar el check TextDecorator1.&lt;/p&gt;  &lt;p&gt;En el drop Display Property que aparece más a la derecha, seleccionar la propiedad Name.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1652C69C.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_72BBB9A5.png" width="659" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A continuación, cambiar a la pestaña Compartment Maps.&lt;/p&gt;  &lt;p&gt;Seleccionar el check Compartment1 y en el TextBox de la derecha “Displayed elements collection path:” escribir:&lt;/p&gt;  &lt;p&gt;StoredProcedureHasParameters.Parameters/!Parameter&lt;/p&gt;  &lt;p&gt;En el drop “Display property:” seleccionar la propiedad Name.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Luego, exactamente lo mismo para la Línea que une&amp;#160; El ResulsetCompartmentShape y el StoredProcedure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0D8A7063.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="178" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_438EEF70.png" width="481" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_49D856AF.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="181" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_542E9C71.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En la pestaña Compartment Maps, el texto de “Displayed elements collection path:” debe ser:&lt;/p&gt;  &lt;p&gt;ResulsetHasFields.Fields/!Field&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_60BEDA3E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="438" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4E0C7138.png" width="343" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Finalmente, en el panel DSL Explorer, en el nodo SPDSL (Dsl)\Editor\Toolbox Tabs\SPDSL\Tools&lt;/p&gt;  &lt;p&gt;Eliminar ExampleElement y ExampleRelationShip&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A continuación, click con el botón derecho sobre SPDSL \ Add new Element Tool&lt;/p&gt;  &lt;p&gt;Editar las propiedades del nuevo nodo:&lt;/p&gt;  &lt;p&gt;Class = StoredProcedure&lt;/p&gt;  &lt;p&gt;Name = StoredProcedureTool&lt;/p&gt;  &lt;p&gt;Toolbox Icon = Seleccionar un icono. (Se pueden agregar más iconos añadiendo imágenes a la carpeta Resources del proyecto en el Solution Explorer)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1AD2C880.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;margin:0px 20px 0px 0px;border-right-width:0px;" height="443" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_55505905.png" width="297" align="left" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nuevamente, en el DSL Explorer, botón derecho sobre SPDSL, Add new Connection Builder.&lt;/p&gt;  &lt;p&gt;Luego, botón derecho sobre el nuevo nodo, Add new Connection Builder Directive&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4231BD0A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="128" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7F55788F.png" width="272" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Seleccionar el nuevo nodo, y en el panel DSL Details…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2EA6EE1A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="164" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_15417B91.png" width="458" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Seleccionar en RelationShip la relación StoredProcedureHasResulset&lt;/p&gt;  &lt;p&gt;En Source role directives, seleccionar StoredProcedure y en Target role directives, seleccionar Resulset.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y ya por último, nuevamente en el DSL Explorer…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2DD3A992.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="495" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1A48DAA2.png" width="381" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Botón derecho en SPDSL, Add new Connection Tool.&lt;/p&gt;  &lt;p&gt;Editar las propiedades del nuevo nodo, y establecer el Connection Builder, el Name y el Tool Box Icon.&lt;/p&gt;  &lt;p&gt;Ya ya, guardar todo,&amp;#160; click en el botón Transform All Templates del Solution Explorer y F5&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_593CEBEE.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="111" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4B0103AF.png" width="279" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Si todo ha ido bien, el resultado debe ser este:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image91_5F00_2AE887A3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="660" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image91_5F00_thumb_5F00_7DF5B578.png" width="925" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Y la definición del DSL debe quedar así:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_42C98BC0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="744" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_28221109.png" width="789" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;To be continued. &lt;/p&gt;  &lt;p&gt;En la siguiente entrega, intentaré mostrar como agregar propiedades a los elementos del dominio, y hacer que las cajitas del diagrama sean más bonitas. Pero vamos, visto esto, todo lo que viene a continuación es muy sencillo.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://cid-da2e56199efa5596.office.live.com/self.aspx/BlogAttachments/SPDSL.zip" target="_blank"&gt;Decargar el código&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186247" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="DSL" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>SQL DSL</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/12/10/sql-dsl.aspx" /><id>/blogs/crisfervil/archive/2010/12/10/sql-dsl.aspx</id><published>2010-12-10T10:39:00Z</published><updated>2010-12-10T10:39:00Z</updated><content type="html">&lt;p&gt;Esta DSL permite generar consultas SQL a partir de la definición de unas tablas y sus relaciones.&lt;/p&gt;  &lt;p&gt;La he desarrollado sobre Visual Studio 2005, pero como todo es muy básico, supongo que aplica a versiones posteriores.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0A689EB2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="484" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_55834B87.png" width="635" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Este es el aspecto de la DSL&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_140DBA90.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="299" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_73F53E83.png" width="380" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Así es como quedaría la Query generada.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;&lt;strong&gt;Los elementos del modelo&lt;/strong&gt;&lt;/h2&gt;  &lt;h3&gt;Las clases&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FAC93A6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="113" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1D0668A6.png" width="170" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_375FD097.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="128" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49AB280A.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa una Query. Un diagrama puede tener una 0..N Queries.    &lt;br /&gt;Permitimos especificar un nombre y una descripción. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_42950769.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="108" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_1D2B13FB.png" width="164" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FCAB3D5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="121" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3620591A.png" width="353" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa cada una de las Tablas que tendrá la Consulta.    &lt;br /&gt;Tiene la propiedad Alias por si es necesario darle otro nombre a la tabla.     &lt;br /&gt;Una Query puede tener 0..N Tablas&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0A0F08B1.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_0B732B83.png" width="165" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1A7E5DD5.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="174" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_29B4C6A2.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Representa cada uno de los campos de una Tabla.    &lt;br /&gt;Cada tabla puede tener 0..N Campos.     &lt;br /&gt;La propiedad Name y Alias permite referenciar el nombre del campo.     &lt;br /&gt;La propiedad Select indica si el campo debe aparecer en la cláusula SELECT de la Query. Si es false, se utilizará sólo para especificar una condición.&amp;#160; &lt;br /&gt;Las condiciones de filtrado de la Query se especificarán en la propiedad FilterValue. En la imagen de ejemplo, se añadirá al WHERE de la SELECT la condición SHIP_COUNTRY=’SPAIN”. La propiedad DataType se utilizará para formatear adecuadamente el valor de la condición. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Las Relaciones&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_451AE6CF.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="85" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_302BF50D.png" width="260" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El modelo sólo podrá tener una Query como elemento primario.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1FB38412.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="87" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2FC252C9.png" width="230" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La Query podrá tener una o varias Tablas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3845B213.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="88" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_5A311497.png" width="248" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;y cada Tabla tendrá sus Campos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_578AE997.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="118" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49BB344D.png" width="312" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_4966311B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="120" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_26A4F95E.png" width="352" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Por último, las Tablas podrán tener relaciones entre ellas, y en cada relación, deben especificar un campo en cada tabla, mediante el cual se pueden relacionar.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Los elementos UI&lt;/h3&gt;  &lt;h3&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2F13B996.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="121" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_254E521E.png" width="192" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6AE7F15B.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="122" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67696071.png" width="180" border="0" /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;Es una GeometryShape normal y corriente. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_730F29F3.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="156" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2C2897A7.png" width="211" border="0" /&gt;&lt;/a&gt; &lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3035762A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="74" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_64699F70.png" width="201" border="0" /&gt;&lt;/a&gt; &lt;/h3&gt;  &lt;p&gt;Hemos modificado este CompartmentShape indicando que tendrá un Custom Parent Element, para que mediante código podamos especificarle que su padre será el GeometryShape de la clase Query. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_71CFB276.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="132" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_680A4AFE.png" width="169" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7B18DAB6.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="93" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3914FC26.png" width="150" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El conector tiene un par de Text Decorators para mostrar el Source y el Target Field de cada Tabla.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Customizations&lt;/h3&gt;  &lt;p&gt;Por defecto, en VS 2005 no se permite que un elemento del diagrama tenga como padre a otro elemento que no sea el propio diagrama.    &lt;br /&gt;El truco, es indicar en las propiedades del elemento hijo (el TableCompartmentShape en este caso) que vamos a especificar por código cuál será su padre.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_40D2927A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="153" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_67370676.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Y en el código, le decimos que su padre será la clase Query.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1F40C5F7.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="132" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_09E831F1.png" width="778" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Template&lt;/h3&gt;  &lt;p&gt;En la Template, todo el código es bastante simple. En la mayor parte se trata de recorrer los elementos del diagrama, para ir creando la Query.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7FEDDFCC.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="206" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_11CD044B.png" width="443" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Recorrer las Queries del Modelo&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5CC305CB.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="227" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_19E6C151.png" width="391" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Recorrer las Tablas de cada Query y por cada Tabla, recorrer cada Columna&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Quizá lo más complejo es lo de leer las propiedades de la relación.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_49487632.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="268" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3A342809.png" width="935" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#008080"&gt;TableReferencesTargetTables&lt;/font&gt; es la clase que representa la relación entre las tablas. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_578AE997.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="118" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_49BB344D.png" width="312" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Esta clase expone el método estático GetLinksToSourceTables que devuelve las relaciones en las que la tabla especificada en el parámetro sea Origen, o tenga el rol “source”. Una vez que tengamos esta referencia, podemos leer el valor de las propiedades Source y Target, que son los campos por los que se relacionan las dos tablas.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y para qué puede servir todo esto? Pues para además de generar la query, generar por ejemplo los procedimientos almacenados para las operaciones de Alta, Baja, Consulta y Modificación (CRUD), la capa de Acceso a Datos, incluso parte de la Lógica de negocio, Unit Tests, puede que hasta formularios. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hrfqrq.blu.livefilestore.com/y1pa-hL-Yd1-WIQKuNwwePRYLNP3uFVvsS49bcqt3ChQJ9owt_JOt2uPvS6S5lbBN4zzMLbUIAtIMhn1nU3XzR8iI6g-XmESwPk/QueryDSL.zip?download&amp;amp;psid=1" target="_blank"&gt;Adjunto él código&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185823" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="snippets" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx" /><category term="DSL" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/DSL/default.aspx" /></entry><entry><title>Alice. Mundos virtuales y programacion</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx" /><id>/blogs/crisfervil/archive/2010/11/30/alice-mundos-virtuales-y-programacion.aspx</id><published>2010-11-30T18:20:29Z</published><updated>2010-11-30T18:20:29Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/images/0307392260/ref=dp_image_0?ie=UTF8&amp;amp;n=283155&amp;amp;s=books"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" border="0" alt="La última lección + DVD (Spanish Edition)" align="left" src="http://ecx.images-amazon.com/images/I/51qhac4oXTL._SL500_AA300_.jpg" width="300" height="300" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Hace un tiempo leí este libro que me recomendaron. &lt;/p&gt;  &lt;p&gt;La &lt;a href="http://es.wikipedia.org/wiki/La_%C3%BAltima_lecci%C3%B3n" target="_blank"&gt;última lección&lt;/a&gt; es un libro autobiográfico escrito por &lt;a href="http://es.wikipedia.org/wiki/Randy_Pausch" target="_blank"&gt;Randy Pausch&lt;/a&gt;, profesor de informática, diseño e interacción persona-ordenador en la Universidad Carnegie Mellon en Pittsburgh, Pennsylvania, Estados Unidos. &lt;/p&gt;  &lt;p&gt;El libro profundiza en los temas expuestos en su famosa conferencia “Really Achieving Your Childhood Dreams” (realizando de verdad tus sueños de la infancia) .&lt;/p&gt;  &lt;p&gt;La obra gira en torno a sus pensamientos sobre la informática, la colaboración interdisciplinar, la educación, la interacción personal y el sentido de la vida.&lt;/p&gt;  &lt;p&gt;A mi me supo como una bocanada de optimismo. Es un libro muy recomendable.&lt;/p&gt;  &lt;p&gt;En varias ocasiones, el autor menciona su trabajo en la universidad. Entre otras cosas es creador del programa &lt;a href="http://es.wikipedia.org/wiki/Alice_(programa)" target="_blank"&gt;Alice&lt;/a&gt;, un lenguaje de programación visual que permite crear mundos virtuales.&lt;/p&gt;  &lt;p&gt;El programa, creado en Java, está pensado para enseñar a programar.&lt;/p&gt;  &lt;p&gt;Es una aplicación muy intuituva, y la verdad es que me encantó. Me gustó mucho la idea de poder programar arrastrando y soltando. Nunca había probado un programa de este tipo.&lt;/p&gt;  &lt;p&gt;Así que nada, me puse manos a la obra, y aprovechando que es “para enseñar a programar” intenté enseñar a mi hija de 6 años.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1B87A29F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4AE5EB9E.png" width="805" height="551" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_37B49925.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_4E1711DF.png" width="474" height="303" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Como curiosidad, el programa está financiado en parte por Microsoft &lt;strike&gt;(aunque sea Java)&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1604F82F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_01CB900C.png" width="527" height="439" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Este es el resultado del mundo virtual. Las voces de doblaje son las de mis peques =)&lt;/p&gt;  &lt;p&gt;Son 14 segundos de trepidante animación animal.&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:717d8763-98bf-46d9-a948-76872f23664e" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=xMT2_GuBNlk" target="_new"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/videodd61676e8d85_5F00_4B1D992D.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185430" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /><category term="Java" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Java/default.aspx" /></entry><entry><title>Cuentas de Correo de tu ISP</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/11/25/cuentas-de-correo-de-tu-isp.aspx" /><id>/blogs/crisfervil/archive/2010/11/25/cuentas-de-correo-de-tu-isp.aspx</id><published>2010-11-25T18:28:00Z</published><updated>2010-11-25T18:28:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_07EA6C9D.png" target="_blank"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_71D3DB3D.png" width="644" height="390" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Existe alguien en el universo que siga utilizando las cuentas de correo que te “regala” el ISP?&lt;/p&gt;  &lt;p&gt;Teniendo HotMail, GMail, los Spaces, los Google Sites, hacen falta?&lt;/p&gt;  &lt;p&gt;Y encima te dicen que son de 1 GB!! como si fuera gran cosa!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185262" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /></entry><entry><title>Ejemplo CodeRun</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2010/11/24/ejemplo-coderun.aspx" /><id>/blogs/crisfervil/archive/2010/11/24/ejemplo-coderun.aspx</id><published>2010-11-24T07:47:17Z</published><updated>2010-11-24T07:47:17Z</updated><content type="html">&lt;p&gt;&lt;a href="http://coderun.com/" target="_blank"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="54" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_65807FA6.png" width="166" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Esto es a lo que yo llamo programar en la nube.&lt;/p&gt;  &lt;p&gt;CodeRun es un IDE de .net desarrollado íntegramente en la nube. Con sus proyectos, su editor en colorines, su autocomplete, su depurador, su compilador y todo.&lt;/p&gt;  &lt;p&gt;Permite compartir código, así que pongo un proyecto de ejemplo. &lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw" href="http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw" target="_blank"&gt;http://www.coderun.com/ide/?w=cjw_XNFQyUiZcJjZCKpHVw&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El ejemplo muestra cómo añadir un Handler de Javascript para el evento click de cada uno de los items de un control RadioButtonList&amp;#160; de asp.net, cuando está enlazado a datos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6E03DEF0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="194" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_549E6C67.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista de la ventana de proyectos&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_684DE6AC.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="399" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2602807C.png" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vista del editor de código aspx&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2D466849.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="364" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_50987E50.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista del editor de c#&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2095DEE2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="228" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_06C43964.png" width="600" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista del “intellisense”&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_1F566765.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="388" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2E232DEE.png" width="538" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Vista de la ventana para añadir nuevos proyectos. &lt;/p&gt;  &lt;p&gt;Existen varias plantillas de proyecto, para MVC, YUI, JQuery, etc, etc, etc. Incluso se pueden realizar proyectos en PHP.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://hrfqrq.blu.livefilestore.com/y1pxpkgeHdwAgsjVmJNGttuEzlsk92HJ4XjaKp2jyA-jt0I1-AO7tE_FGUiFg4scf6_Rzkv7omlxA6sot6yp9sW-aZol9l-t19I/RadioButtonListItemOnClientClick.zip?download&amp;amp;psid=1" target="_blank"&gt;Descargar el código de ejemplo&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185201" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /><category term="asp.net" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/asp.net/default.aspx" /></entry><entry><title>CERN CMS Fireworks</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2009/11/24/cern-cms-fireworks.aspx" /><id>/blogs/crisfervil/archive/2009/11/24/cern-cms-fireworks.aspx</id><published>2009-11-24T21:47:00Z</published><updated>2009-11-24T21:47:00Z</updated><content type="html">&lt;p&gt;He visto unas capturas de pantalla de la aplicaci&amp;oacute;n que usan para analizar los datos que genera el &lt;a target="_blank" href="http://es.wikipedia.org/wiki/Gran_colisionador_de_hadrones"&gt;Colisionador de Hadrones&lt;/a&gt; del &lt;a target="_blank" href="http://public.web.cern.ch/public/en/LHC/LHC-en.html"&gt;CERN&lt;/a&gt; y me ha llamado la atenci&amp;oacute;n lo espectacular de la interface&amp;hellip; as&amp;iacute; que he investigado un poco&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/R121995L6E181_5F00_54A1979A.png"&gt;&lt;img height="484" width="634" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/R121995L6E181_5F00_thumb_5F00_413C8162.png" alt="R121995-L6-E18[1]" border="0" title="R121995-L6-E18[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Parece una aplicaci&amp;oacute;n en Java, o C++ , sobre Linux&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/HaloHCAL1136861_5F00_34DA7007.jpg"&gt;&lt;img height="389" width="645" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/HaloHCAL1136861_5F00_thumb_5F00_672E1DB9.jpg" alt="Halo-HCAL-113686[1]" border="0" title="Halo-HCAL-113686[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;No est&amp;aacute; mal eh!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/CollisionEvent1_5F00_1FC8A1FA.png"&gt;&lt;img height="493" width="645" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/CollisionEvent1_5F00_thumb_5F00_5A6FFF36.png" alt="CollisionEvent[1]" border="0" title="CollisionEvent[1]" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Aunque pone FireWorks, creo que no tiene nada que ver con el &lt;span style="text-decoration:line-through;"&gt;Macromedia&lt;/span&gt; &lt;a target="_blank" href="http://www.adobe.com/products/fireworks/"&gt;Adobe Fireworks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tutorial de la aplicaci&amp;oacute;n:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial" title="https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial"&gt;https://twiki.cern.ch/twiki/bin/view/CMS/WorkBookFireworksTutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;V&amp;iacute;deo de demostraci&amp;oacute;n de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov" title="http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov"&gt;http://cms-service-sdtweb.web.cern.ch/cms-service-sdtweb/fireworks/demo.mov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el video parece que responde bastante bien. &lt;/p&gt;
&lt;p&gt;La habr&amp;aacute;n hecho en la India? en China? cu&amp;aacute;ndo han podido tardar en hacer algo as&amp;iacute;? cu&amp;aacute;nto debi&amp;oacute; costar? &lt;/p&gt;
&lt;p&gt;El LHC comenz&amp;oacute; a construirse sobre el antiguo t&amp;uacute;nel del &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Large_Electron%E2%80%93Positron_Collider"&gt;LEP&lt;/a&gt;, en el a&amp;ntilde;o 2000, y al parecer tendr&amp;aacute; un coste total de 3,7 Billones (con B) de Euros!!&amp;nbsp; Desde luego no podr&amp;aacute;n decir que no han tenido tiempo y presupuesto..&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm" title="http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm"&gt;http://cms.web.cern.ch/cms/News/e-commentary/cms-e-commentary09.htm&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161185" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /></entry><entry><title>DataTable to Excel con un control DataGrid</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2009/11/23/datatable-to-excel-con-un-control-datagrid.aspx" /><id>/blogs/crisfervil/archive/2009/11/23/datatable-to-excel-con-un-control-datagrid.aspx</id><published>2009-11-23T16:07:00Z</published><updated>2009-11-23T16:07:00Z</updated><content type="html">&lt;p&gt;Dejo c&amp;oacute;digo con otra opci&amp;oacute;n para exportar datos de un &lt;a href="http://msdn.microsoft.com/es-es/library/system.data.datatable.aspx" target="_blank"&gt;DataTable&lt;/a&gt; a un archivo Excel.&lt;/p&gt;
&lt;p&gt;Resulta que el Excel es capaz de reconocer c&amp;oacute;digo html de una tabla, y eso es precisamente lo que genera el control &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.datagrid.aspx" target="_blank"&gt;DataGrid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Este m&amp;eacute;todo no me gusta demasiado porque implica referenciar el espacio de nombres &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.aspx" target="_blank"&gt;System.Web&lt;/a&gt;, y si estamos en una aplicaci&amp;oacute;n de escritorio, no me parece demasiado elegante. Supongo que en una aplicaci&amp;oacute;n Web, se notar&amp;iacute;a menos, pero un control es para lo que es, y si empezamos a usar cosas para lo que no son es cuando aparecen los problemas.&lt;/p&gt;
&lt;p&gt;Esto mismo se podr&amp;iacute;a hacer usando simplemente un objeto &lt;a href="http://geeks.ms/controlpanel/blogs/posteditor.aspx/System.Web.UI.HtmlTextWriter" target="_blank"&gt;HtmlWriter&lt;/a&gt;, pero el c&amp;oacute;digo quedar&amp;iacute;a bastante m&amp;aacute;s complejo que este.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_08B70AE7.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_207363AF.png" border="0" height="481" width="756" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una de las ventajas de este m&amp;eacute;todo es la posibilidad de a&amp;ntilde;adir estilos din&amp;aacute;micamente, por ejemplo usando un fichero css como este:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_348F10E9.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_560E4078.png" border="0" height="364" width="228" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Habr&amp;iacute;a que a&amp;ntilde;adir unas cuantas l&amp;iacute;neas m&amp;aacute;s al m&amp;eacute;todo anterior, para inyectar el contenido del css al html generado.&lt;/p&gt;
&lt;p&gt;Esta alternativa abre la posibilidad de tener varios formatos de exportaci&amp;oacute;n, definidos en distintos archivos css, y un &amp;uacute;nico m&amp;eacute;todo para realizar la exportaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_139E2EF3.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3061E6CC.png" border="0" height="889" width="763" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una de las desventajas de esta m&amp;eacute;todo podr&amp;iacute;a ser el rendimiento. El volumen de informaci&amp;oacute;n generado es bastante alto, y ante un n&amp;uacute;mero elevado de filas y de columnas, el rendimiento se resiente. &lt;/p&gt;
&lt;p&gt;Este ser&amp;iacute;a el contenido del texto generado, para un DataTable con dos filas y dos columnas&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_5AD3394B.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_534A5A8F.png" border="0" height="686" width="836" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Abri&amp;eacute;ndolo con el Excel:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_29004416.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_714D89E5.png" border="0" height="241" width="390" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;S&amp;eacute; que funciona con el Excel 2003 y posteriores, pero sospecho, aunque no estoy seguro, de que tambi&amp;eacute;n lo reconoce el Excel 2000.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/crisfervil/archive/2009/11/23/datatable-to-excel-con-excelexportlib.aspx"&gt;Tambi&amp;eacute;n se puede exportar a Excel, usando el formato Office Xml.&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161092" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="snippets" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx" /><category term="Excel" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Excel/default.aspx" /></entry><entry><title>DataTable To Excel con ExcelExportLib</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2009/11/23/datatable-to-excel-con-excelexportlib.aspx" /><id>/blogs/crisfervil/archive/2009/11/23/datatable-to-excel-con-excelexportlib.aspx</id><published>2009-11-23T09:36:00Z</published><updated>2009-11-23T09:36:00Z</updated><content type="html">&lt;p&gt;Dejo este snippet, por si a alguno le puede servir. &lt;/p&gt;  &lt;p&gt;Es una manera más de exportar un DataTable, o un DataSet a un fichero Excel, pero esta vez usando el formato Office Xml.&lt;/p&gt;  &lt;p&gt;Wikipedia: &lt;a title="http://es.wikipedia.org/wiki/Microsoft_Office_XML" href="http://es.wikipedia.org/wiki/Microsoft_Office_XML" target="_blank"&gt;http://es.wikipedia.org/wiki/Microsoft_Office_XML&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Los formatos &lt;b&gt;Microsoft Office XML&lt;/b&gt; (no confundir con &lt;a href="http://es.wikipedia.org/wiki/Office_Open_XML" target="_blank"&gt;Office Open XML&lt;/a&gt;) son formatos de documento basados en XML (o &lt;a href="http://es.wikipedia.org/wiki/XML_Schema" target="_blank"&gt;lenguajes de esquema XML&lt;/a&gt;) introducidos en versiones de &lt;a href="http://es.wikipedia.org/wiki/Microsoft_Office" target="_blank"&gt;Microsoft Office&lt;/a&gt; anteriores a &lt;a href="http://es.wikipedia.org/wiki/Office_2007" target="_blank"&gt;Office 2007&lt;/a&gt;. En Microsoft Office XP se introdujo un nuevo formato &lt;a href="http://es.wikipedia.org/wiki/XML" target="_blank"&gt;XML&lt;/a&gt; para almacenar hojas de cálculo de &lt;a href="http://es.wikipedia.org/wiki/Microsoft_Excel" target="_blank"&gt;Excel&lt;/a&gt; y Office 2003 añadió formatos basados en XML para documentos de &lt;a href="http://es.wikipedia.org/wiki/Microsoft_Word" target="_blank"&gt;Word&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Estos formatos fueron reemplazados por la especificación &lt;a href="http://es.wikipedia.org/wiki/Office_Open_XML" target="_blank"&gt;Office Open XML&lt;/a&gt; (ECMA-376) en &lt;a href="http://es.wikipedia.org/wiki/Microsoft_Office_2007" target="_blank"&gt;Microsoft Office 2007&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;El formato Excel xml tiene más o menos la siguiente apariencia: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_6FEE8EB9.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="546" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_0CF9CE33.png" width="689" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una de las ventajas de este formato, es la posibilidad de incluir formatos (valga la redundancia), fórmulas, etc. y que son reconocidos desde la versión 2003. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_57839CBE.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="114" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6E4574F8.png" width="270" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_097DCDFA.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="267" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_3458C2BD.png" width="822" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Más información acerca del formato: &lt;a title="http://msdn.microsoft.com/en-us/library/aa140066%28office.10%29.aspx" href="http://msdn.microsoft.com/en-us/library/aa140066%28office.10%29.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/aa140066%28office.10%29.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una exportación sencilla, no tiene ninguna complicación, pero so quisiéramos añadir ciertas complejidades, hay mucho código que escribir.&lt;/p&gt;  &lt;p&gt;Por eso, me he apoyado en esta librería que proporciona un modelo de objetos bastante sencillo, que permite centrarse en la información a generar, y delegar el “renderizado” del documento xml.&lt;/p&gt;  &lt;p&gt;&lt;a title="http://excelexportlib.codeplex.com/" href="http://excelexportlib.codeplex.com/" target="_blank"&gt;http://excelexportlib.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_438F2B8A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="216" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_62D4630E.png" width="843" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Traducción: ExcelExportLib es una librería de exportación simple que crea un archivo .xml. Este archivo puede ser abierto en Excel. Al contrario que los archivos &lt;a href="http://es.wikipedia.org/wiki/CSV" target="_blank"&gt;csv&lt;/a&gt;, este formato contiene información de formato. La principal ventaja del proyecto es que permite la exportación de datos en Excel sin necesidad de ejecutar Excel.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;A mí lo que me gustó de la librería es lo sencillita que es. Simple, pero potente.&lt;/p&gt;  &lt;p&gt;Un ejemplo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_0DAF57D2.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="377" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_6EFAFE97.png" width="755" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Bueno, y finalmente el snippet.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2331B88F.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="234" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_124D149F.png" width="525" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_3D943C57.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="641" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_2CB22918.png" width="656" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Por supuesto, al Excel generado se le pueden añadir todo tipo de formatos, fórmulas, totales, etc.&lt;/p&gt;  &lt;p&gt;Y allí donde ExcelExportLib no llegue, siempre se puede añadir funcionalidad propia. &lt;/p&gt;  &lt;p&gt;Normalmente para saber cómo se traduce a xml una característica del documento Excel, por ejemplo una fórmula, un formato, etc., se pueden consultar las especificaciones, pero lo más sencillo suele ser generar un documento con la características en cuestión, guardar el archivo en formato xml y ver el resultado.&lt;/p&gt;  &lt;p&gt;Por ejemplo, ¿cómo se especifica la característica de formato condicional?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_7BB2786A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="195" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_38D633F0.png" width="590" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Guardamos el documento en formato xml….&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_23E7422E.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="424" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_73565526.png" width="744" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Y abrimos el resultado con un editor de texto, o uno xml.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_36C0E73A.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="207" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_0869F23E.png" width="722" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;PD: No suelo pegar el código, por un trauma personal. He sufrido el copy-pasteado de mucha gente, y la verdad es que no se lo deseo a nadie. Por eso pongo la imagen, y que cada uno escriba su propio código. Perdón por los inconvenientes ocasionados. ;)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161063" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="snippets" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/snippets/default.aspx" /><category term="Excel" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/Excel/default.aspx" /></entry><entry><title>Novedades acerca del caso LSE</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2009/11/23/novedades-acerca-del-caso-lse.aspx" /><id>/blogs/crisfervil/archive/2009/11/23/novedades-acerca-del-caso-lse.aspx</id><published>2009-11-23T09:00:00Z</published><updated>2009-11-23T09:00:00Z</updated><content type="html">&lt;p&gt;No s&amp;eacute; si habr&amp;aacute;s le&amp;iacute;do algo acerca del caso de la &lt;a href="http://www.londonstockexchange.com/home/homepage.htm" target="_blank"&gt;London Stock Exchange&lt;/a&gt;, en el que se hab&amp;iacute;a reemplazado el sistema existente construido sobre linux y java, por un sistema completamente nuevo basado en el .net framework, windows y sql server.&lt;/p&gt;
&lt;p&gt;Si no, en este post de Jorge viene muy bien explicada toda la historia:    &lt;br /&gt;&lt;a title="http://geeks.ms/blogs/jorge/archive/2009/10/22/el-caso-de-la-lse-london-stock-exchange-y-los-procesos-en-tiempo-real.aspx" href="http://geeks.ms/blogs/jorge/archive/2009/10/22/el-caso-de-la-lse-london-stock-exchange-y-los-procesos-en-tiempo-real.aspx" target="_blank"&gt;http://geeks.ms/blogs/jorge/archive/2009/10/22/el-caso-de-la-lse-london-stock-exchange-y-los-procesos-en-tiempo-real.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bueno, pues resulta que finalmente han salido a la luz estas im&amp;aacute;genes que relatan &lt;span style="text-decoration:line-through;"&gt;fielmente&lt;/span&gt; como fue la entrevista de trabajo del Project Manager que contrataron para dirigir dicho proyecto. Por supuesto, no puedo citar mis fuentes.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_2DDF98A7.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/crisfervil/image_5F00_thumb_5F00_7B1222E3.png" border="0" height="209" width="604" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.dilbert.com/" href="http://www.dilbert.com/"&gt;http://www.dilbert.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159957" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="General" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/General/default.aspx" /></entry><entry><title>Resumen Examen MCTS 70-536 - Autenticación y Autorización</title><link rel="alternate" type="text/html" href="/blogs/crisfervil/archive/2009/10/21/resumen-examen-mcts-70-536-autenticaci-243-n-y-autorizaci-243-n.aspx" /><id>/blogs/crisfervil/archive/2009/10/21/resumen-examen-mcts-70-536-autenticaci-243-n-y-autorizaci-243-n.aspx</id><published>2009-10-21T21:59:24Z</published><updated>2009-10-21T21:59:24Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;amp;locale=en-us" target="_blank"&gt;&lt;img style="display:inline;margin-left:0px;margin-right:0px;" src="https://www.digitalguru.com/v/vspfiles/photos/9780735626195-2T.jpg" alt="" /&gt;&lt;/a&gt;&amp;#160;&lt;a title="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;amp;locale=en-us" href="http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;amp;locale=en-us"&gt;http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&amp;amp;locale=en-us&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Este es otro de los resúmenes que he rescatado. Va de la gestión de la seguridad en el .net Framework.&lt;/p&gt;  &lt;p&gt;Como curiosidad, indicar que en la &lt;a href="http://www.rae.es/" target="_blank"&gt;RAE&lt;/a&gt; sólo existe el término &lt;em&gt;Autenticación&lt;/em&gt;, y no &lt;em&gt;Autentificación&lt;/em&gt;. Se define &lt;em&gt;autenticación&lt;/em&gt; como la acción y el efecto de &lt;em&gt;autenticar&lt;/em&gt;, y &lt;em&gt;autenticar&lt;/em&gt; es &amp;quot;autorizar o legalizar algo&amp;quot;, o bien &amp;quot;dar fe de la verdad de un hecho o documento con autoridad legal&amp;quot; (fuente: &lt;a href="http://www.rae.es" target="_blank"&gt;diccionario online&lt;/a&gt; de la &lt;a href="http://www.rae.es/" target="_blank"&gt;RAE&lt;/a&gt;). Creo que conocer el significado de las palabras es importante para aclarar nuestras ideas y trasmitirlas con fidelidad a nuestros pensamientos. Por eso me detengo en estos detalles.&lt;/p&gt;  &lt;p&gt;Obs de último momento: Están admitidos tanto el verbo &lt;em&gt;autenticar&lt;/em&gt; como &lt;em&gt;autentificar&lt;/em&gt;. Ambos términos tienen el mismo significado. &lt;a href="http://buscon.rae.es/dpdI/SrvltConsulta?lema=autentificar" target="_blank"&gt;Ver + info aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Bueno... a lo que íbamos.&lt;/p&gt;  &lt;p&gt;En la jerga informática, que es la que nos interesa...&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Autenticación&lt;/strong&gt;: Es el proceso de identificación de un usuario.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Autorización&lt;/strong&gt;: Es proceso por el que permite o deniega el acceso de un usuario a un recurso.&lt;/p&gt;  &lt;p&gt;La clase &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;System.Security.Principal.WindowsIdentity&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; representa un usuario de Windows. No permite autenticar a un usuario; solo guarda el resultado de la autenticación. Estos son sus métodos más importantes: &lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:578.25pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="771"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.principal.windowsidentity.getanonymous(VS.80).aspx" target="_blank"&gt;GetAnonymous&lt;/a&gt; (shared) &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:427.5pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;" valign="top" width="570"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;mso-bidi-font-weight:bold;"&gt;Devuelve un objeto &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;WindowsIdentity&lt;/a&gt; que representa a un usuario anónimo. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;GetCurrent (shared) &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:427.5pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="570"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Devuelve un objeto &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;WindowsIdentity&lt;/a&gt; que representa el usuario actual de Windows. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:1;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Impersonate (shared) &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:427.5pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="570"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Devuelve un objeto &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.principal.windowsimpersonationcontext(VS.80).aspx" target="_blank"&gt;WindowsImpersonationContext&lt;/a&gt; que representa un usuario concreto del sistema. Permite al código que se está ejecutando reemplazar a otro usuario de Windows. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:2;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;GetCurrent &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:427.5pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="570"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Devuelve el objeto &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsprincipal.aspx" target="_blank"&gt;WindowsPrincipal&lt;/a&gt;&lt;/i&gt; correspondiente al usuario. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;Estas son propiedades (no estáticas) de &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;WindowsIdentity&lt;/a&gt;&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:578.25pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="771"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;AuthenticationType &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;mso-bidi-font-weight:bold;"&gt;String que indica el método de autenticación. Generalmente &amp;quot;NTLM&amp;quot;. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsAnonymous &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el usuario es anónimo. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:1;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsAuthenticated &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el usuario ha sido autenticado. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:2;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsGuest &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el usuario es un usuario &amp;quot;guest&amp;quot; o invitado. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:3;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsSystem &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el usuario es un usuario de sistema. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:4;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Name &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;string con el nombre de usuario y el dominio en el que ha sido autenticado. Si posee una barra invertida (\) dentro del nombre, indica que el usuario ha si do autenticado por un dominio de Active Directory. En caso contrario la autenticación se produjo contra el equipo local. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:5;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Token &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;int con el token identificador del usuario. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;La clase &lt;strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsprincipal.aspx" target="_blank"&gt;WindowsPrincipal&lt;/a&gt;&lt;/strong&gt; proporciona acceso a los grupos de los que un usuario es miembro. Esta clase debe ser creada pasando como parámetro de su constructor una instancia de &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;WindowsIdentity&lt;/a&gt;, o &lt;/em&gt;bien llamando&amp;#160; al método GetCurrent() de &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity.aspx" target="_blank"&gt;WindowsIdentity&lt;/a&gt;. Estos son algunos de sus métodos:&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:582.75pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="777"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.principal.windowsprincipal.isinrole(VS.80).aspx" target="_blank"&gt;IsInRole&lt;/a&gt; &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:432pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="576"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el usuario es miembro del grupo especificado. &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;Las clases &lt;a href="http://msdn.microsoft.com/es-es/library/system.security.permissions.principalpermission.aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; y &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.permissions.principalpermissionattribute.aspx" target="_blank"&gt;PrincipalPermissionAttribute&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; permiten, en conjunto, saber si el usuario cumple o no unos criterios de &lt;em&gt;autorización&lt;/em&gt; determinados. &lt;/p&gt;  &lt;p&gt;Estas son las &lt;strong&gt;propiedades&lt;/strong&gt; de &lt;a href="http://msdn.microsoft.com/es-es/library/system.security.permissions.principalpermission.aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt;&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:577.5pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="770"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Authenticated &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;mso-bidi-font-weight:bold;"&gt;bool que en caso de ser &lt;i&gt;true&lt;/i&gt;, indica que el usuario debe estar autenticado para poseer la autorización. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Name &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;string que indica el nombre que debe tener el usuario para poseer la autorización. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:149.25pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="199"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Role &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:426.75pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="569"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;string que indica el nombre del grupo al que debe pertenecer el usuario para poseer la autorización. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Métodos&lt;/strong&gt; de &lt;a href="http://msdn.microsoft.com/es-es/library/system.security.permissions.principalpermission.aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt;&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:579pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="772"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:148.5pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="198"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Demand &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:429pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="572"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Comprueba que el usuario cumpla con los criterios de &lt;i&gt;Authenticated&lt;/i&gt;, &lt;i&gt;Name&lt;/i&gt; y &lt;i&gt;Role&lt;/i&gt; especificados en sus propiedades. En caso contrario, se lanza una &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.securityexception(VS.80).aspx" target="_blank"&gt;SecurityException&lt;/a&gt;. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:148.5pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="198"&gt;&amp;#160;&lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:429pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="572"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Seguridad Declarativa (Declarative RBS Demands)&lt;/strong&gt;: Indica al runtime, mediante atributos, que realize comprobaciones &lt;strong&gt;R&lt;/strong&gt;ole-&lt;strong&gt;B&lt;/strong&gt;ased &lt;strong&gt;S&lt;/strong&gt;ecurity (Seguridad basada en Roles) antes de ejecutar el código de un ensamblado, clase o método.&lt;/p&gt;  &lt;p&gt;Usar este tipo de atributos es la manera más segura de impedir la ejecución de código a usuarios no autorizados, aunque posee algunos inconvenientes.&lt;/p&gt;  &lt;p&gt;Para usar estos atributos, es no olvidar realizar los siguientes pasos:&lt;/p&gt;  &lt;p&gt;- Realizar una llamada a &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.appdomain.setprincipalpolicy.aspx" target="_blank"&gt;System.AppDomain.CurrentDomain.SetPrincipalPolicy&lt;/a&gt;&lt;/i&gt; indicando la política de seguridad para el &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.iprincipal.aspx" target="_blank"&gt;IPrincipal&lt;/a&gt; (usuario) que ejecutará nuestro código.     &lt;br /&gt;- Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.securityexception(VS.80).aspx" target="_blank"&gt;SecurityException&lt;/a&gt;.     &lt;br /&gt;- Los atributos &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.permissions.principalpermissionattribute(vs.80).aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt; para declarar los accesos requeridos al ensamblado, clase o método cuyo acceso se desee restringir.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Seguridad Imperativa&lt;/strong&gt;     &lt;br /&gt;Las validaciones usadas en la seguridad imperativa se realizan dentro del código y eliminan la limitación de la seguridad declarativa de restringir los accesos a grandes porciones de código. &lt;/p&gt;  &lt;p&gt;Los pasos para incluir la seguridad imperativa en el código son los siguientes:    &lt;br /&gt;- Realizar una llamada a &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.appdomain.setprincipalpolicy.aspx" target="_blank"&gt;System.AppDomain.CurrentDomain.SetPrincipalPolicy&lt;/a&gt;&lt;/i&gt; indicando la política de seguridad para el &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.iprincipal.aspx" target="_blank"&gt;IPrincipal&lt;/a&gt; (usuario) que ejecutará nuestro código.     &lt;br /&gt;- Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.securityexception(VS.80).aspx" target="_blank"&gt;SecurityException&lt;/a&gt;.     &lt;br /&gt;- Un objeto PrincipalPermission para especificar las restricciones que aplicarán al código.     &lt;br /&gt;- Una llamada a &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.permissions.principalpermissionattribute(vs.80).aspx" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.permissions.principalpermission(vs.80).aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt;&lt;/a&gt;.Demand() para verificar que el &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.principal.iprincipal(VS.80).aspx" target="_blank"&gt;IPrincipal&lt;/a&gt; especificado está autorizado.&lt;/p&gt;  &lt;p&gt;La clase &lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.permissions.principalpermission(vs.80).aspx" target="_blank"&gt;PrincipalPermission&lt;/a&gt; posee 3 &lt;strong&gt;constructores&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;- PrincipalPermission(&lt;a href="http://msdn2.microsoft.com/es-es/library/system.security.permissions.permissionstate(VS.80).aspx" target="_blank"&gt;PermissionState&lt;/a&gt;): el enum PermissionState indica si la política de autorización es restrictiva o permisiva, es decir, si de primeras&amp;#160; no autorizamos al recurso a menos que cumpla el resto de requisitos, o si de primeras autorizamos al recurso, a menos que cumpla los requisitos.     &lt;br /&gt;- PrincipalPermission(Name, Role): Especifica como requisitos de autorización un nombre de usuario y un rol determinado.     &lt;br /&gt;- PrincipalPermission(Name, Role, Authenticated) Especifica como requisitos de autorización un nombre de usuario, un rol y un estado de autorización determinados.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Implementando usuarios y roles(grupos) propios&lt;/strong&gt;     &lt;br /&gt;Para realizar esta tarea es necesario implementar las interfaces &lt;i&gt;System.Security.Principal.IIdentity&lt;/i&gt; y &lt;i&gt;System.Security.Principal.IPrincipal&lt;/i&gt;. Estas interfaces permiten utilizar la infraestructura de acceso y autenticación de la plataforma. De hecho, las clases WindowsIdentity y WindowsPrincipal las implementan. De igual modo, en asp.net existen la clase FormsIdentity y PassportIdentity que también son implementaciones de estas intefaces.     &lt;br /&gt;Con lo cual, para implementar nuestro propio motor de autenticación y gestión de grupos y usuario, tirando por ejemplo, contra una base de datos, debemos, bien heredar de alguna de las clases vistas anteriormente o implementar estas interfaces.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Propiedades de &lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.iidentity.aspx" target="_blank"&gt;&lt;strong&gt;IIdentity&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:570pt;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="760"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;AuthenticationType &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:418.5pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="558"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;string para determinar el tipo de autenticación a usar. Para usar el de windows, NTLM. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;"&gt;       &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsAuthenticated &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:medium none;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:418.5pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="558"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;booleano que indica si el proceso de autenticación ha sido válido. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:150pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="200"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:4;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Name &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:418.5pt;padding-right:5.4pt;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;" valign="top" width="558"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;string con el nombre de usuario. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Métodos de &lt;/strong&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.principal.iprincipal.aspx" target="_blank"&gt;&lt;strong&gt;IPrincipal&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;table style="border-bottom:medium none;border-left:medium none;width:20cm;border-collapse:collapse;border-top:medium none;border-right:medium none;mso-border-top-alt:solid #4f81bd 1.0pt;mso-border-top-themecolor:accent1;mso-border-bottom-alt:solid #4f81bd 1.0pt;mso-border-bottom-themecolor:accent1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;" class="LightShading-Accent1" border="1" cellspacing="0" cellpadding="0" width="756"&gt;&lt;tbody&gt;     &lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:148.5pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="198"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:5;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Identity &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:417pt;padding-right:5.4pt;border-top:#4f81bd 1pt solid;border-right:medium none;padding-top:0cm;mso-border-top-themecolor:accent1;mso-border-bottom-themecolor:accent1;" valign="top" width="556"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:1;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;Objeto IIdentity que determina la identidad del usuario &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr style="mso-yfti-irow:0;mso-yfti-lastrow:yes;"&gt;       &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:148.5pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="198"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:68;" class="MsoNormal"&gt;&lt;b&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;IsInRole &lt;/span&gt;              &lt;p&gt;&lt;/p&gt;           &lt;/b&gt;&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td style="border-bottom:#4f81bd 1pt solid;border-left:medium none;padding-bottom:0cm;padding-left:5.4pt;width:417pt;padding-right:5.4pt;background:#d3dfee;border-top:medium none;border-right:medium none;padding-top:0cm;mso-border-bottom-themecolor:accent1;mso-background-themecolor:accent1;mso-background-themetint:63;" valign="top" width="556"&gt;         &lt;p style="line-height:115%;margin-bottom:10pt;mso-yfti-cnfc:64;" class="MsoNormal"&gt;&lt;span style="color:#365f91;mso-themecolor:accent1;mso-themeshade:191;"&gt;bool que indica si el Identity pertenece al grupo o rol especificados. &lt;/span&gt;            &lt;p&gt;&lt;/p&gt;         &lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;   &lt;br /&gt;La excepción &lt;b&gt;&lt;i&gt;System.Security.Authentication.&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.authentication.authenticationexception.aspx" target="_blank"&gt;AuthenticationException&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; se lanza cuando se produce un error de autenticación.&lt;/p&gt;  &lt;p&gt;La excepción &lt;b&gt;&lt;i&gt;System.Security.Authentication.&lt;a href="http://msdn.microsoft.com/en-us/library/system.security.authentication.invalidcredentialexception.aspx" target="_blank"&gt;InvalidCredentialException&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; se lanza cuando el sistema ha denegado nuestra autenticación y no podemos volver a intentar autenticarnos.&lt;/p&gt;
Crossposted from &lt;a href="http://crisfervil.com"&gt;crisfervil.com&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158583" width="1" height="1"&gt;</content><author><name>crisfervil</name><uri>http://geeks.ms/members/crisfervil/default.aspx</uri></author><category term="dotNetFramework" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/dotNetFramework/default.aspx" /><category term="MCP" scheme="http://geeks.ms/blogs/crisfervil/archive/tags/MCP/default.aspx" /></entry></feed>
