<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel Hernández</title><link>http://msmvps.com/blogs/angelhernandez/default.aspx</link><description>Microsoft MVP ASP/ASP.NET
&lt;img src="http://6ckhfa.bay.livefilestore.com/y1p0_W74kyEgGM5Es9NLyPEts_MNaZ6Bc0zLK2zJTmRey1BGOYfUGDNWYigp2AGJBnf4COLYARuqHfIYqkLEvnrnQ/Foto_MSN.jpg" border="1" style="position:absolute;border-color:black;top:87px;left:253px;" height="90px" width="60px" alt="" /&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Get the SharePoint version programmatically </title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/07/02/get-the-sharepoint-version-programmatically.aspx</link><pubDate>Thu, 02 Jul 2009 12:14:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697573</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1697573</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1697573</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/07/02/get-the-sharepoint-version-programmatically.aspx#comments</comments><description>&lt;p&gt;&lt;span style="color:#0000ff;"&gt;This post is about a question that many developers ask themselves, &amp;iquest;how can I get the SharePoint version programmatically?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;There are at least&amp;nbsp; three possible ways to do this (that I&amp;#39;m aware of):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Accesing the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.buildversion.aspx"&gt;SPFarm.BuildVersion&lt;/a&gt; property&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Impersonate through&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx"&gt;SPSecurity.RunWithElevatedPrivileges&lt;/a&gt;&amp;nbsp;&amp;nbsp;and&amp;nbsp; retrieve this information from the registry &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Implement&amp;nbsp;WMI&amp;nbsp;and execute the following&amp;nbsp;WQL: &lt;strong&gt;&lt;em&gt;Select * From Win32_SoftwareFeature Where ProductName Like &amp;quot;%SharePoint Server%&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;in combination with the&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.management.managementobjectsearcher.aspx"&gt;ManagementObjectSearcher&lt;/a&gt; class&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;In my case, I&amp;#39;m always using&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx"&gt;WMI&lt;/a&gt;&amp;nbsp;and Windows provides us with the right tool (&lt;strong&gt;&lt;em&gt;WBEMTEST.EXE)&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;to try our&amp;nbsp; WQL queries&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697573" width="1" height="1"&gt;</description></item><item><title>Determinando el número de versión de SharePoint programáticamente</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/07/02/determinando-el-n-250-mero-de-versi-243-n-de-sharepoint-program-225-ticamente.aspx</link><pubDate>Thu, 02 Jul 2009 10:50:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1697570</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1697570</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1697570</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/07/02/determinando-el-n-250-mero-de-versi-243-n-de-sharepoint-program-225-ticamente.aspx#comments</comments><description>&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Este post trata de una pregunta que muchos desarrolladores&amp;nbsp;se hacen, &amp;iquest;c&amp;oacute;mo determino la versi&amp;oacute;n de SharePoint que tengo instalada por medio de c&amp;oacute;digo?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;A continuaci&amp;oacute;n enumero las tres posibles maneras (que yo conozco para hacerlo):&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Haciendo uso de la propiedad &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spfarm.buildversion.aspx"&gt;SPFarm.BuildVersion&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Impersonar por medio de &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx"&gt;SPSecurity.RunWithElevatedPrivileges&lt;/a&gt;&amp;nbsp;&amp;nbsp;y recuperar estos valores del registro de Windows&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;Hacer uso de WMI y del siguiente WQL: &lt;strong&gt;&lt;em&gt;Select * From Win32_SoftwareFeature Where ProductName Like &amp;quot;%SharePoint Server%&amp;quot;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;en combinaci&amp;oacute;n con la clase &lt;a href="http://msdn.microsoft.com/en-us/library/system.management.managementobjectsearcher.aspx"&gt;ManagementObjectSearcher&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;En mi caso particular, siempre hago uso de &lt;a href="http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx"&gt;WMI&lt;/a&gt; y Windows nos ofrece &lt;strong&gt;&lt;em&gt;WBEMTEST.EXE&lt;/em&gt;&lt;/strong&gt; para probar nuestras consultas WQL&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1697570" width="1" height="1"&gt;</description></item><item><title>Memory Mapped Files</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/06/25/memory-mapped-files.aspx</link><pubDate>Fri, 26 Jun 2009 02:28:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696759</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1696759</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1696759</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/06/25/memory-mapped-files.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Writing code nowadays can be considered as a &amp;quot;cheerful experience&amp;quot;,&amp;nbsp;we have a complete set of tools and development environments that make us more productive, helping us in the delivery of&amp;nbsp;high-quality software. 15 years ago it was a hard task to find IDEs with Intellisense support, we used to store our application settings in .INI files and we didn&amp;#39;t even have any virtualization environment in order to perform tests before sending out our solution to the customers, that&amp;#39;s why it&amp;#39;s a new adventure each time we got engaged on a new development project and coding hasn&amp;#39;t ever been as&amp;nbsp;enjoyable as it is today. A few years ago I read a book written by Jeffrey Richter called &amp;quot;Advanced Windows&amp;quot; and I learned heaps from this book, as a matter of fact, last year I bought his latest book called &amp;quot;Windows via C/C++&amp;quot; which is a classic and a must have in every Windows developer toolbox, same thing occurs with Charles Petzold&amp;#39;s book, however I learned a lot about Windows internal mechanisms by reading Richter&amp;#39;s, for instance, how can processes exchange information between them? What&amp;#39;s the difference between a Mutex and a Semaphore for threads synchronization? just to mention a few. Windows is a product that has evolved and grown throughout the years, despite of new APIs&amp;nbsp;and functionality that have been included into it we will always need access to the PC&amp;#39;s memory, for example we can mention Inter-Process Communication (IPC) and virtual memory access, this post is about it pretty much, how can I get access to the virtual memory so I can address and use a given amount of bytes? I think you know already what I&amp;#39;m talking about. Memory Mapped Files can be defined as &amp;quot;a segment of virtual memory which has been assigned a direct byte-for-byte correlation with some portion of a file or file-like resource. This resource is typically a file that is physically present on-disk, but can also be a device, shared memory object or other resource that the operating system can reference through a file descriptor&amp;quot;. They have three main purposes which are:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Load and execute .exe files and DLLs &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Access files on-disk very quickly without using buffers. Windows handles this for us&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Allow many processes to share information in memory &lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;The following diagram depicts some implementations for memory mapped files&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6371.clip_5F00_image002_5F00_27CB60FB.gif"&gt;&lt;img height="164" width="461" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6874.clip_5F00_image002_5F00_thumb_5F00_05935575.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Once the file is mapped in memory, a view&amp;nbsp;based on&amp;nbsp;that file needs to be created, I mean, a region or space within the file which allows a process to read and write onto it, when creating the&amp;nbsp;view we specify&amp;nbsp;bytes to be mapped, file offset and desired access, this process is shown in the image below&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6303.image_5F00_23916369.png"&gt;&lt;img height="298" width="366" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/3644.image_5F00_thumb_5F00_5A8B41A2.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;One of the new features bundled in .NET Framework 4.0 besides DLR (Dynamic Language Runtime), parallel processing and support for memory mapped files. The code that accompanies this post demonstrates how to do it using the new MemoryMappedFile class plus my own&amp;nbsp;implementation with .NET 3.5, C# and&amp;nbsp;a little of Interop. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Further reading about this topic can be found at&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Virtual_memory"&gt;Virtual Memory&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Paging"&gt;Paging&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;p align="center" id="video_1696759"&gt;&lt;a href="http://ajhsis.com/Community/MappedFile_English.swf"&gt;&lt;img src="http://9ras1w.bay.livefilestore.com/y1p7mmg7IDxhkDiCiNHaYzMzVdmRF9QBuHnyNUgZCvbSE8n5zmD9AjCd5GIBq-lvic_DUbkLB6MD8B-fiPBqB1-rAS55-RQoDEH/thumb1.jpg" border = "0" width="550" height="350"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href = "http://ajhsis.com/Community/MappedFile_English.swf"&gt;View Video&lt;/a&gt;&lt;br /&gt;Format: swf&lt;br /&gt;Duration: 22 min&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696759" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.67.59/MemDemo.zip" length="210058" type="application/x-zip-compressed" /><enclosure url="http://ajhsis.com/Community/MappedFile_English.swf" length="0" type="application/x-shockwave-flash" /></item><item><title>Archivos Mapeados en Memoria</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/06/24/archivos-mapeados-en-memoria.aspx</link><pubDate>Wed, 24 Jun 2009 06:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1696525</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1696525</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1696525</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/06/24/archivos-mapeados-en-memoria.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Hoy en d&amp;iacute;a es ameno &amp;ldquo;echar c&amp;oacute;digo&amp;rdquo;, pues tenemos herramientas de desarrollo que nos ayudan a ser productivos y aseguramos la calidad del software que hacemos. Hace 15 a&amp;ntilde;os atr&amp;aacute;s era dif&amp;iacute;cil encontrar entornos de desarrollo con Intellisense, guard&amp;aacute;bamos nuestra configuraci&amp;oacute;n en archivos .INI y no dispon&amp;iacute;amos de virtualizaci&amp;oacute;n para probar nuestra aplicaci&amp;oacute;n antes de enviarla al cliente, por eso en la actualidad cada d&amp;iacute;a es una aventura y programar es m&amp;aacute;s divertido. Hace unos a&amp;ntilde;os atr&amp;aacute;s le&amp;iacute; un libro escrito por Jeffrey Richter titulado &amp;ldquo;Programaci&amp;oacute;n avanzada para Windows 95/NT&amp;rdquo;, aprend&amp;iacute; mucho de ese libro&amp;nbsp; de hecho el a&amp;ntilde;o pasado me compr&amp;eacute; la &amp;uacute;ltima edici&amp;oacute;n del mismo titulado &amp;ldquo;Windows via C/C++&amp;rdquo;, es un cl&amp;aacute;sico como el libro de Charles Petzold, sin embargo con el libro de Richter aprend&amp;iacute; cosas sobre el funcionamiento interno del Sistema Operativo, por ejemplo, &amp;iquest;c&amp;oacute;mo los procesos pueden intercambiar informaci&amp;oacute;n entre s&amp;iacute;?, &amp;iquest;cu&amp;aacute;l es la diferencia entre un Mutex y un sem&amp;aacute;foro para sincronizar hilos? y muchas otras cosas m&amp;aacute;s. Windows es un producto que ha madurado y crecido con el paso de los a&amp;ntilde;os, a pesar de nuevas APIs y funcionalidad siempre tendremos que tener acceso a la memoria del PC, un ejemplo de esto es la comunicaci&amp;oacute;n entre procesos (IPC) y el acceso a la memoria virtual, el siguiente post trata de eso, &amp;iquest;c&amp;oacute;mo utilizar la memoria virtual para as&amp;iacute; direccionar y/o utilizar una cantidad de memoria que yo desee? Me imagino, ya saben a lo que me refiero y es Archivos mapeados en memoria (Memory Mapped Files) que lo podr&amp;iacute;amos definir como &amp;ldquo;un segmento de la memoria virtual la cual se le ha asignado una correlaci&amp;oacute;n directa byte a byte con alguna porci&amp;oacute;n de un archivo &amp;oacute; alg&amp;uacute;n otro recurso, el cu&amp;aacute;l t&amp;iacute;picamente es un archivo en disco pero tambi&amp;eacute;n puede ser un dispositivo, un objeto compartido de memoria u otro recurso que el sistema operativo pueda referenciar a trav&amp;eacute;s de un descriptor de archivo&amp;rdquo;. Los archivos mapeados en memoria tienen tres prop&amp;oacute;sitos los cuales son:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Cargar y ejecutar archivos .exe y bibliotecas de enlace din&amp;aacute;mico (DLL)&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Accesar archivos en disco r&amp;aacute;pidamente sin necesidad de usar b&amp;uacute;feres, Windows se encarga de esto por nosotros&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Permitir a varios procesos compartir la misma informaci&amp;oacute;n en memoria&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El siguiente diagrama muestra alguna de las implementaciones para los archivos mapeados en memoria&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6371.clip_5F00_image002_5F00_27CB60FB.gif"&gt;&lt;img height="164" width="461" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6874.clip_5F00_image002_5F00_thumb_5F00_05935575.gif" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Una vez que el archivo se encuentra mapeado en memoria, es necesario crear una vista basada en el mismo, es decir, una regi&amp;oacute;n &amp;oacute; espacio dentro del archivo a la cu&amp;aacute;l un proceso puede leer y escribir, al momento de crear la vista se especifica desde donde se va a comenzar a manipular el archivo as&amp;iacute; como el n&amp;uacute;mero de bytes a utilizar, este proceso lo podemos ver en la imagen mostrada a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/6303.image_5F00_23916369.png"&gt;&lt;img height="298" width="366" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/3644.image_5F00_thumb_5F00_5A8B41A2.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Una de las caracter&amp;iacute;sticas nuevas que trae consigo el .NET Framework 4.0 adem&amp;aacute;s de DLR (Dynamic Language Runtime), procesamiento paralelo y muchas otras m&amp;aacute;s, es el soporte para archivos mapeados en memoria, el c&amp;oacute;digo de este posting demuestra como hacerlo con la nueva clase MemoryMappedFile as&amp;iacute; como mi propia implementaci&amp;oacute;n con .NET 3.5, C# y un poco de Interop.&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Si deseas leer un poco m&amp;aacute;s sobre este tema puedes revisar estos links en Wikipedia: &lt;/span&gt;&lt;a href="http://es.wikipedia.org/wiki/Memoria_virtual"&gt;&lt;span style="color:#0000ff;"&gt;Memoria Virtual&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;y &lt;/span&gt;&lt;a href="http://es.wikipedia.org/wiki/Paginaci%C3%B3n"&gt;&lt;span style="color:#0000ff;"&gt;Paginaci&amp;oacute;n de Memoria&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;p align="center" id="video_1696525"&gt;&lt;a href="http://ajhsis.com/Community/MappedFile_Spanish.swf"&gt;&lt;img src="http://9ras1w.bay.livefilestore.com/y1p7mmg7IDxhkDiCiNHaYzMzVdmRF9QBuHnyNUgZCvbSE8n5zmD9AjCd5GIBq-lvic_DUbkLB6MD8B-fiPBqB1-rAS55-RQoDEH/thumb1.jpg" border = "0" width="550" height="350"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href = "http://ajhsis.com/Community/MappedFile_Spanish.swf"&gt;View Video&lt;/a&gt;&lt;br /&gt;Format: swf&lt;br /&gt;Duration: 38 Min&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1696525" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.65.25/MemDemo.zip" length="210058" type="application/x-zip-compressed" /><enclosure url="http://ajhsis.com/Community/MappedFile_Spanish.swf" length="0" type="application/x-shockwave-flash" /></item><item><title>Extending the Exception class, getting Win32 error messages plus extension methods</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/06/08/extending-exception-class-getting-win32-error-messages-plus-extension-methods.aspx</link><pubDate>Mon, 08 Jun 2009 10:53:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694537</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1694537</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1694537</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/06/08/extending-exception-class-getting-win32-error-messages-plus-extension-methods.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Structured Exception Handling (SEH), it&amp;rsquo;s one of the top used features by developers, it&amp;rsquo;s not required any more to be dealing with On Error labels or any other less elegant mechanism to handle error conditions, however .NET Framework is an existing layer between our application and the operating system, even when the Exception class describes an error condition it doesn&amp;rsquo;t provide the error code and message associated to the operating system, that&amp;rsquo;s why it&amp;rsquo;s frustrating sometimes to interpret some &amp;ldquo;less-descriptive&amp;rdquo; exceptions and hence recovering any Windows error information can be of great help. Throughout the years Windows API has evolved and grown in size and error messages as well, many of these messages can be found in the SDK and WDK, so I had this idea about extending the Exception class by implementing an extension method. Extension methods enable us to &amp;ldquo;add&amp;rdquo; methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. They are a special kind of static method, but they are called as if they were instance methods on the extended type. The most common extension methods are&amp;nbsp; the LINQ standard query operators that add query functionality to the existing IEnumerable and IEnumerable&amp;lt;T&amp;gt;.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;To retrieve the description for a given error code we use the FormatMessage function, as it&amp;rsquo;s shown below&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;[DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;           CallingConvention = CallingConvention.Winapi)]&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FormatMessage(&lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlags, &lt;span class="kwrd"&gt;int&lt;/span&gt; lpSource, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwMessageId,&lt;/pre&gt;
&lt;pre&gt;                     &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLanguageId, &lt;span class="kwrd"&gt;out&lt;/span&gt; StringBuilder lpBuffer,&lt;/pre&gt;
&lt;pre class="alt"&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; nSize, IntPtr va_list);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;The extension method used is the following &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExceptionExtension {&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Gets the win32 error description.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ex&amp;quot;&amp;gt;The ex.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Win32Error GetWin32ErrorDescription(&lt;span class="kwrd"&gt;this&lt;/span&gt; Exception ex) {&lt;/pre&gt;
&lt;pre&gt;        Win32Error retval = Win32Error.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        StringBuilder pMsgBuf = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; lastError = FormatErrorHelper.GetLastError();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        FormatErrorHelper.FormatMessage(&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.FORMAT_MESSAGE_ALLOCATE_BUFFER |&lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.FORMAT_MESSAGE_FROM_SYSTEM,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.NULL,   lastError, &lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.MakeLangID(FormatErrorHelper.LANG_NEUTRAL,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.SUBLANG_DEFAULT), &lt;span class="kwrd"&gt;out&lt;/span&gt; pMsgBuf, 0, IntPtr.Zero);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;         retval.ErrorCode = lastError;&lt;/pre&gt;
&lt;pre class="alt"&gt;         retval.Description = pMsgBuf != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? pMsgBuf.ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;      }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;So if we catch any exception, besides obtaining the exception object itself we get the error and message code from the operating system&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Win32Error osError = Win32Error.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt; {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="rem"&gt;// Some funky exception here...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;} &lt;span class="kwrd"&gt;catch&lt;/span&gt;(Exception ex) {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;  osError = ex.GetWin32ErrorDescription();&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;  Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Code: {0} - Description: {1}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] {osError.ErrorCode, osError.Description}));  &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;If we implement everything we&amp;rsquo;ve previously mentioned, see the difference between the exception message and the message provided by the operating system &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a&gt;&lt;img height="307" width="678" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5810.image_5F00_thumb2_5F00_6E1B5EFB.png" alt="image_thumb[2]" border="0" title="image_thumb[2]" 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;&lt;span style="color:#0000ff;"&gt;Hope this helps,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Regards,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694537" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.45.37/FormatError.zip" length="1173596" type="application/x-zip-compressed" /></item><item><title>Extendiendo la clase Exception, recuperando mensajes de error de Win32 además de los métodos de extensión</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/06/08/extendiendo-la-clase-exception-recuperando-mensajes-de-error-de-win32-adem-225-s-de-los-m-233-todos-de-extensi-243-n.aspx</link><pubDate>Mon, 08 Jun 2009 10:19:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1694534</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1694534</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1694534</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/06/08/extendiendo-la-clase-exception-recuperando-mensajes-de-error-de-win32-adem-225-s-de-los-m-233-todos-de-extensi-243-n.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;El manejo estructurado de excepciones, es una de las caracter&amp;iacute;sticas que como desarrolladores utilizamos m&amp;aacute;s a menudo, ya no es necesario estar implementando etiquetas On Error u otro mecanismo poco elegante para manejar condiciones de error, sin embargo el .NET Framework es una capa entre el sistema operativo y nuestra aplicaci&amp;oacute;n, aunque la clase Exception describe una condici&amp;oacute;n de error, carece del c&amp;oacute;digo de error y descripci&amp;oacute;n asociado al sistema operativo, en muchas ocasiones el interpretar algunas excepciones puede llegar en cierto punto ser algo frustrante porque no es muy descriptivo, por lo que no ser&amp;iacute;a mala idea recuperar la informaci&amp;oacute;n de error emitida por Windows. Con el paso de los a&amp;ntilde;os, el API de Windows ha crecido y as&amp;iacute; mismo la cantidad de mensajes de error subyacentes, en el SDK de la plataforma se consigue informaci&amp;oacute;n sobre estos mensajes de error y lo mismo sucede con el WDK, por lo que se me ocurri&amp;oacute; la idea de extender la clase Exception a trav&amp;eacute;s de un m&amp;eacute;todo de extensi&amp;oacute;n. Los m&amp;eacute;todos de extensi&amp;oacute;n, nos permiten &amp;ldquo;agregar &amp;ldquo;m&amp;eacute;todos a tipos de datos existentes sin la necesidad de crear un tipo derivado, recompilar &amp;oacute; modificar el tipo original. Estos m&amp;eacute;todos son un tipo especial de m&amp;eacute;todo est&amp;aacute;tico que son llamados como si fueran m&amp;eacute;todos de instancia en el tipo extendido. Su uso m&amp;aacute;s com&amp;uacute;n es con LINQ para as&amp;iacute; conseguir funcionalidad adicional de los tipos IEnumerable e IEnumerable&amp;lt;T&amp;gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Para recuperar la descripci&amp;oacute;n de un c&amp;oacute;digo de error utilizamos la funci&amp;oacute;n FormatMessage, como mostramos a continuaci&amp;oacute;n&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;[DllImport(&lt;span class="str"&gt;&amp;quot;kernel32.dll&amp;quot;&lt;/span&gt;, CharSet = CharSet.Auto, SetLastError = &lt;span class="kwrd"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;           CallingConvention = CallingConvention.Winapi)]&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FormatMessage(&lt;span class="kwrd"&gt;int&lt;/span&gt; dwFlags, &lt;span class="kwrd"&gt;int&lt;/span&gt; lpSource, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwMessageId,&lt;/pre&gt;
&lt;pre&gt;                     &lt;span class="kwrd"&gt;int&lt;/span&gt; dwLanguageId, &lt;span class="kwrd"&gt;out&lt;/span&gt; StringBuilder lpBuffer,&lt;/pre&gt;
&lt;pre class="alt"&gt;                       &lt;span class="kwrd"&gt;int&lt;/span&gt; nSize, IntPtr va_list);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;El m&amp;eacute;todo de extensi&amp;oacute;n utilizado con la clase Exception es el siguiente&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ExceptionExtension {&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// Gets the win32 error description.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ex&amp;quot;&amp;gt;The ex.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Win32Error GetWin32ErrorDescription(&lt;span class="kwrd"&gt;this&lt;/span&gt; Exception ex) {&lt;/pre&gt;
&lt;pre&gt;        Win32Error retval = Win32Error.Empty;&lt;/pre&gt;
&lt;pre class="alt"&gt;        StringBuilder pMsgBuf = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; lastError = FormatErrorHelper.GetLastError();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;        FormatErrorHelper.FormatMessage(&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.FORMAT_MESSAGE_ALLOCATE_BUFFER |&lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.FORMAT_MESSAGE_FROM_SYSTEM,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.NULL,   lastError, &lt;/pre&gt;
&lt;pre class="alt"&gt;               FormatErrorHelper.MakeLangID(FormatErrorHelper.LANG_NEUTRAL,&lt;/pre&gt;
&lt;pre&gt;               FormatErrorHelper.SUBLANG_DEFAULT), &lt;span class="kwrd"&gt;out&lt;/span&gt; pMsgBuf, 0, IntPtr.Zero);&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;         retval.ErrorCode = lastError;&lt;/pre&gt;
&lt;pre class="alt"&gt;         retval.Description = pMsgBuf != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? pMsgBuf.ToString() : &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; retval;&lt;/pre&gt;
&lt;pre&gt;      }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Por lo que al atrapar alguna excepci&amp;oacute;n, adem&amp;aacute;s de obtener el objeto Exception como tal tambi&amp;eacute;n obtengo el c&amp;oacute;digo y mensaje de error del sistema operativo&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;Win32Error osError = Win32Error.Empty;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;try&lt;/span&gt; {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="rem"&gt;// Some funky exception here...&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;} &lt;span class="kwrd"&gt;catch&lt;/span&gt;(Exception ex) {&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;  osError = ex.GetWin32ErrorDescription();&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;  Console.WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Code: {0} - Description: {1}&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] {osError.ErrorCode, osError.Description}));  &lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#0000ff;"&gt;Si ponemos en pr&amp;aacute;ctica todo lo mencionado anteriormente, vean lo diferente que es el mensaje de proporcionado por el .NET Framework al del sistema operativo&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/5810.image_5F00_7B0652C7.png"&gt;&lt;img height="304" width="678" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez.metablogapi/7360.image_5F00_thumb_5F00_4BF3F123.png" alt="image" border="0" title="image" 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;&lt;span style="color:#0000ff;"&gt;Espero sea de utilidad,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;"&gt;Angel&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1694534" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.45.34/FormatError.zip" length="1173596" type="application/x-zip-compressed" /></item><item><title>Pex (Automated White box Testing for .NET) | Pex (Caja blanca automatizada para pruebas en .NET)</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/06/01/pex-automated-white-box-testing-for-net-pex-caja-blanca-automatizada-para-pruebas-en-net.aspx</link><pubDate>Mon, 01 Jun 2009 07:16:13 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1693509</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1693509</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1693509</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/06/01/pex-automated-white-box-testing-for-net-pex-caja-blanca-automatizada-para-pruebas-en-net.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;font color="#0080ff"&gt;&lt;font color="#0000ff"&gt;I usually read a lot about technology stuff from Microsoft and other vendors as well. One of my favourite sites to gather information about ongoing projects and things to come is &lt;a href="http://research.microsoft.com"&gt;Microsoft Research&lt;/a&gt; so today after having lunch I started to browse for some projects and&amp;#160; I found &lt;a href="http://research.microsoft.com/en-us/projects/pex/default.aspx"&gt;Pex&lt;/a&gt; which in my humble opinion seems to be really interesting, why? Because it’s a new tool &lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;that helps in understanding the behavior of .NET code, debugging issues, and in creating a test suite that covers all corner cases – fully automatically. Through a context menu in the code editor, the user can invoke Pex to analyze an entire class or a single method. For any method, Pex computes and displays interesting input-output pairs. Pex systematically hunts for bugs – exceptions or assertion failures. As Pex discovers boundary conditions in code, Pex generates new tests that target these conditions. The result is a small test suite with high code coverage. Pex enables Parameterized Unit Testing, an extension of traditional unit testing that reduces test maintenance costs. Pex has been used in Microsoft to test core .NET components. Pex is developed at Microsoft Research and is integrated into Microsoft Visual Studio, so if you’re like me that loves to deliver high quality code then Pex is a must in your toolbox.&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;Regards,&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;Angel&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;   &lt;hr /&gt;&lt;/p&gt;   &lt;p align="justify"&gt;&lt;font color="#0080ff"&gt;&lt;font color="#0000ff"&gt;Usualmente leo bastante sobre tecnologías Microsoft y otros fabricantes también. Uno de mis sitios favoritos para conseguir información acerca de proyectos en ejecución y cosas por venir es&amp;#160; &lt;a href="http://research.microsoft.com"&gt;Microsoft Research&lt;/a&gt; así que hoy después de almorzar comencé a navegar por algunos proyectos y encontré &lt;a href="http://research.microsoft.com/en-us/projects/pex/default.aspx"&gt;Pex&lt;/a&gt;, el cual en mi humilde opinión&amp;#160; parece ser realmente interesante, ¿por qué?&amp;#160; Pues porque es una nueva herramienta que ayuda a entender el comportamiento de código .NET, problemas de depuración y en la creación de pruebas para la mayoría de los casos – todo esto de manera automática. A través de un menú contextual en el editor de código, el usuario puede invocar Pex para analizar una clase entera ó un sólo método. Para cualquier método, Pex calcula y muestra las entradas y las salidas. Pex sistemáticamente busca bugs – excepciones ó fallas de aserciones. Mientras Pex descubre las condiciones de límites en el código, a su vez genera nuevas pruebas para dichas condiciones. El resultado es una pequeña suite con alta cobertura de código. Pex permite realizar prueba unitarias parametrizadas, que son una extensión de las pruebas unitarias tradicionales que reducen los costos en el mantenimiento de las pruebas. Pex ha sido utilizado por Microsoft para probar componentes importantes de .NET. Pex es desarrollado en Microsoft Research y está integrado con Microsoft Visual Studio, así que si eres como yo que le encanta entregar código de alta calidad entonces Pex es indispensable en tu caja de herramientas.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;font color="#0000ff"&gt;Saludos&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1693509" width="1" height="1"&gt;</description></item><item><title>Policy injection, function pointers and why I prefer .NET instead of Java</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/05/17/policy-injection-function-pointers-and-why-i-prefer-net-instead-of-java.aspx</link><pubDate>Sun, 17 May 2009 21:22:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692595</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1692595</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1692595</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/05/17/policy-injection-function-pointers-and-why-i-prefer-net-instead-of-java.aspx#comments</comments><description>&lt;p align="justify" style="color:#0000ff;"&gt;Yesterday afternoon I was coming home on the train, when suddenly I had this idea of writing something about policy injection, function pointers and my preference of using .NET instead of Java. Firstly, allow me to get started with policy injection, it&amp;rsquo;s a definition commonly used in developer talks but, what does it mean? Or what is it about? In a few words we can define it as &amp;ldquo;one technique becoming increasingly popular by the adoption of Aspect Oriented Programming (&lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt;), which provides an array of mechanisms to change the behavior of business objects and other classes by applying policies thus making it easier to implement crosscutting concerns such as logging, validation, exception handling, caching and more&amp;rdquo;.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;The terminology of AOP uses the word &amp;ldquo;concern&amp;rdquo; to mean a task or feature of an application. Core concerns are the features usually unique to a class or object, for example, a class to connect to a database or serialize an object to disk. Tasks common to more than one class or object are crosscutting concerns. Poor management of these can result in duplicated and hard-to-manage code, and unreliable applications.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Policy injection was introduced by the Microsoft patterns &amp;amp; practices group into the release (version 3.0) of their Enterprise Library which integrates with the other application blocks in the library. The latest version can be downloaded &lt;a href="http://www.codeplex.com/entlib"&gt;here &lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;However, I would like to share with you the idea or principle behind &amp;ldquo;Policy injection&amp;rdquo;, if you&amp;rsquo;re like me that prefer designing and writing all the components for an application by yourself, this can be a useful post to you then.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;In my humble opinion, we have at least two possible ways to &amp;ldquo;inject&amp;rdquo; either by using generics or through callbacks (delegates), let&amp;rsquo;s proceed to describe them: &lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&lt;b&gt;&lt;i&gt;1-.Using Generics:&lt;/i&gt;&lt;/b&gt; Generics was introduced in .NET 2.0 and it gives us the ability to write &amp;ldquo;generic&amp;rdquo; code plus enforcing type-safety, I mean, no more casting to object to achieve multiple reuse. Let&amp;rsquo;s suppose we have the following class &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image002_5F00_649FB424.jpg"&gt;&lt;img height="308" width="708" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image002_5F00_thumb_5F00_4267A89E.jpg" alt="clip_image002" border="0" title="clip_image002" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;It implements the ISample interface which contains a single method PerformAction that throws an exception if the time&amp;rsquo;s current second is even (we do this to simulate that something goes wrong during the execution of this method), please note that we don&amp;rsquo;t have any exception handling in that method. Now, let&amp;rsquo;s suppose that I have heaps of classes implementing the same interface without any exception handling mechanism too, what could I possibly do in that case? If we take into consideration the definitions for concern and crosscutting concern we can then say: I have different concerns (even when the implemented interface is the same) but at the same time I have crosscutting concerns, I mean, all of my classes implement this interface without a proper exception handling mechanism. &lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Having said that, let&amp;rsquo;s have a look at the following code fragment&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image004_5F00_320C30E5.jpg"&gt;&lt;img height="608" width="708" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image004_5F00_thumb_5F00_4F31D8EF.jpg" alt="clip_image004" border="0" title="clip_image004" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;It&amp;rsquo;s a generic class and its usage is restricted to ISample objects plus requires the creation of a new instance, in its Ctor, through Reflection we collect information of the class used with the generic class, I mean, the object we&amp;rsquo;ll be applying our &amp;ldquo;policy&amp;rdquo; to. The generic class contains only a method called Execute which invokes the PerformAction method of our class implementing ISample hence exception handling is added which it didn&amp;rsquo;t exist in our original implementation.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;The implementation on the client or application would be like this&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image006_5F00_52EF7DBF.jpg"&gt;&lt;img height="158" width="708" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image006_5F00_thumb_5F00_1EDADE6C.jpg" alt="clip_image006" border="0" title="clip_image006" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Please note that I didn&amp;rsquo;t have to modify the original code but I&amp;rsquo;m using another mechanism instead, in this case &amp;ldquo;Policy injection&amp;rdquo; through a generic class that acts as a proxy which allows me to achieve what I want plus isolating concerns from each other but considering crosscutting concerns.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&lt;b&gt;&lt;i&gt;2-.Using Callbacks:&lt;/i&gt;&lt;/b&gt; Callbacks, function pointers or delegates refer to the same mechanism for passing executable code as an argument to another code. In old C/C++ school we can do it like this &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image008_5F00_479643B5.jpg"&gt;&lt;img height="308" width="508" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image008_5F00_thumb_5F00_611DD0E2.jpg" alt="clip_image008" border="0" title="clip_image008" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;However in .NET we do it like this&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image010_5F00_70DD65E6.jpg"&gt;&lt;img height="48" width="358" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image010_5F00_thumb_5F00_6879908F.jpg" alt="clip_image010" border="0" title="clip_image010" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;So the way we can achieve &amp;ldquo;policy injection&amp;rdquo; through callbacks differs a little from the one previously explained, which is cleaner, easier to maintain and suggested from my point of view, because we use a proxy that communicates with the class we&amp;rsquo;re applying the policy to; if we&amp;rsquo;re using callback it would be something like this&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image012_5F00_75073DAB.jpg"&gt;&lt;img height="408" width="708" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image012_5F00_thumb_5F00_0BE60F28.jpg" alt="clip_image012" border="0" title="clip_image012" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;The greater difference between the two approaches, it&amp;rsquo;s that policy code is on the client side and not in the proxy class, so code is repeated and future maintainability is at risk. We can achieve what we want but it&amp;rsquo;s not the best approach to follow, however this method it&amp;rsquo;s pretty useful in situations such as, impersonating a given user to execute a piece of code. &lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image014_5F00_628EC729.jpg"&gt;&lt;img height="508" width="708" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image014_5F00_thumb_5F00_4709C526.jpg" alt="clip_image014" border="0" title="clip_image014" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Changing topics and almost wrapping up, one of the reasons I prefer .NET instead of Java it&amp;rsquo;s because of Callbacks support which have been with us for a long time ago and they&amp;rsquo;re a pretty useful as we can see, for instance, the qsort function (quicksort implementation in CRT) which expects to receive as last parameter a Callback to a comparison function. In Java we don&amp;rsquo;t have this functionality out-of-the-box but we need to &amp;ldquo;simulate it&amp;rdquo; by implementing interfaces (Callback pattern) and I start wondering, what the heck? I can do this in C/C++ using native code and in any other .NET language without implementing any &amp;ldquo;pattern&amp;rdquo; so I can focus on the requirement, for reasons like this and many other reasons I prefer .NET instead of Java because it just makes me more productive.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Regards,&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Angel&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692595" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.25.95/CodeInjectionDemo.zip" length="61595" type="application/x-zip-compressed" /></item><item><title>Inyección de políticas, punteros a función y por qué prefiero .NET en vez de Java</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/05/17/inyecci-243-n-de-pol-237-ticas-punteros-a-funci-243-n-y-por-qu-233-prefiero-net-en-vez-de-java.aspx</link><pubDate>Sun, 17 May 2009 20:51:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692592</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1692592</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1692592</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/05/17/inyecci-243-n-de-pol-237-ticas-punteros-a-funci-243-n-y-por-qu-233-prefiero-net-en-vez-de-java.aspx#comments</comments><description>&lt;p align="justify" style="color:#0000ff;"&gt;Ayer en la tarde ven&amp;iacute;a en el tren hacia mi casa, cuando de repente se me ocurri&amp;oacute; la idea de escribir algo acerca de inyecci&amp;oacute;n de pol&amp;iacute;ticas, punteros a funci&amp;oacute;n y mi preferencia de .NET antes que Java. Primero, perm&amp;iacute;tanme comenzar con inyecci&amp;oacute;n de pol&amp;iacute;ticas, es un t&amp;eacute;rmino que se escucha com&amp;uacute;nmente en conversaciones de desarrolladores, pero &amp;iquest;qu&amp;eacute; significa &amp;oacute; de que trata? En pocas palabras lo podr&amp;iacute;amos definir como &amp;ldquo;Una t&amp;eacute;cnica que se est&amp;aacute; popularizando con la adopci&amp;oacute;n de la programaci&amp;oacute;n orientada a aspectos (&lt;a href="http://es.wikipedia.org/wiki/Programaci%C3%B3n_Orientada_a_Aspectos"&gt;AOP&lt;/a&gt;), la cual brinda distintos mecanismos para cambiar el comportamiento de objetos de negocios y otras clases a trav&amp;eacute;s de la aplicaci&amp;oacute;n de pol&amp;iacute;ticas, facilitando as&amp;iacute; la implementaci&amp;oacute;n com&amp;uacute;n de conceptos como validaci&amp;oacute;n, registro de eventos, manejo de excepciones y cach&amp;eacute; y muchas m&amp;aacute;s&amp;rdquo;.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;En AOP, se utiliza el t&amp;eacute;rmino concepto para referirse a una tarea &amp;oacute; caracter&amp;iacute;stica de una aplicaci&amp;oacute;n. Los conceptos claves son caracter&amp;iacute;sticas &amp;uacute;nicas de una clase u objeto, por ejemplo, una clase para conectarse a una BD &amp;oacute; serializar un objeto a disco. Las tareas comunes para una clase u objeto se denomina &amp;ldquo;funcionalidad transversal&amp;rdquo; (en ingl&amp;eacute;s, cross-cutting), que en muchas oportunidades un mal manejo de estas trae como consecuencia c&amp;oacute;digo duplicado y dif&amp;iacute;cil de mantener sin mencionar aplicaciones poco confiables.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;La inyecci&amp;oacute;n de pol&amp;iacute;ticas fue introducida en .NET por Microsoft con la versi&amp;oacute;n de 3 de su librer&amp;iacute;a de aplicaciones empresarial, la cual trae consigo un componente de inyecci&amp;oacute;n de pol&amp;iacute;ticas que se integra con los otros componentes de dicha librer&amp;iacute;a. La &amp;uacute;ltima versi&amp;oacute;n se puede descargar &lt;a href="http://www.codeplex.com/entlib"&gt;ac&amp;aacute;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Sin embargo, me gustar&amp;iacute;a compartir con ustedes la idea &amp;oacute; el principio de detr&amp;aacute;s de la &amp;ldquo;inyecci&amp;oacute;n de pol&amp;iacute;ticas&amp;rdquo;, si ustedes son como yo que prefieren dise&amp;ntilde;ar y desarrollar todos los componentes de una aplicaci&amp;oacute;n entonces este post puede ser de utilidad.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;En mi humilde opini&amp;oacute;n tenemos dos posibles maneras de &amp;ldquo;inyectar&amp;rdquo; bien sea usando Generics y un poco de Reflection &amp;oacute; a trav&amp;eacute;s del uso de Callbacks (delegados), a continuaci&amp;oacute;n describiremos las dos:&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&lt;b&gt;&lt;i&gt;1-. Haciendo uso de Generics:&lt;/i&gt;&lt;/b&gt; Generics fue introducido en .NET 2.0 y nos ofrece la posibilidad de escribir c&amp;oacute;digo m&amp;aacute;s &amp;ldquo;gen&amp;eacute;rico&amp;rdquo; esforzando la tipificaci&amp;oacute;n de los datos, es decir, no m&amp;aacute;s casting a Object para conseguir reutilizaci&amp;oacute;n m&amp;uacute;ltiple. Supongamos que tenemos la siguiente clase&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image002_5F00_6CEB8962.jpg"&gt;&lt;img height="304" width="704" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image002_5F00_thumb_5F00_03CA5ADF.jpg" alt="clip_image002" border="0" title="clip_image002" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;La cu&amp;aacute;l implementa la interfaz ISample que posee un s&amp;oacute;lo m&amp;eacute;todo PerformAction que arroja una excepci&amp;oacute;n si el segundo actual es par (esto para simular que algo falla con la ejecuci&amp;oacute;n de dicho m&amp;eacute;todo), n&amp;oacute;tese que no tenemos manejo de excepciones en ese m&amp;eacute;todo. Ahora supongamos que tengo un mont&amp;oacute;n de clases que implementan la misma interfaz pero con la misma carencia de manejo de excepciones, &amp;iquest;en ese caso qu&amp;eacute; puedo hacer? S&amp;iacute; tomamos en consideraci&amp;oacute;n las definiciones de concepto y funcionalidad transversal, podemos entonces decir: Tengo distintos conceptos (porque aunque la interfaz implementada es com&amp;uacute;n su implementaci&amp;oacute;n es distinta) pero a su vez tengo funcionalidad transversal, es decir, todas mis clases que implementan la interfaz ISample necesitan un manejo de excepciones. &lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Una vez dicho eso, obs&amp;eacute;rvese el siguiente fragmento de c&amp;oacute;digo&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image004_5F00_7A8E1F9D.jpg"&gt;&lt;img height="604" width="704" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image004_5F00_thumb_5F00_7804EDDF.jpg" alt="clip_image004" border="0" title="clip_image004" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Es una clase gen&amp;eacute;rica a la cual restringimos su uso para objetos que implementen la interfaz ISample adem&amp;aacute;s que su utilizaci&amp;oacute;n requiere una instancia de objeto, en el constructor a trav&amp;eacute;s de Reflection obtenemos informaci&amp;oacute;n de la clase usada con la clase gen&amp;eacute;rica, es decir, el objeto al cu&amp;aacute;l le aplicaremos la &amp;ldquo;pol&amp;iacute;tica&amp;rdquo;. La clase gen&amp;eacute;rica tiene s&amp;oacute;lo un m&amp;eacute;todo llamado Execute que invoca &amp;oacute; llama a su vez al m&amp;eacute;todo PerformAction de la clase que implementa ISample y agrega manejo de excepciones la cual no exist&amp;iacute;a en la implementaci&amp;oacute;n original.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;La manera de utilizarlo desde el cliente &amp;oacute; nuestra aplicaci&amp;oacute;n ser&amp;iacute;a as&amp;iacute;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image006_5F00_5560AF64.jpg"&gt;&lt;img height="154" width="704" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image006_5F00_thumb_5F00_7A7DF9D0.jpg" alt="clip_image006" border="0" title="clip_image006" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;N&amp;oacute;tese que no tuve que modificar el c&amp;oacute;digo original sino que hago uso de otro mecanismo, en este caso &amp;ldquo;inyecci&amp;oacute;n de pol&amp;iacute;ticas&amp;rdquo; que a trav&amp;eacute;s de una clase gen&amp;eacute;rica que act&amp;uacute;a como proxy el cu&amp;aacute;l me permite conseguir lo que quiero, as&amp;iacute; aislando mis conceptos pero tomando en consideraci&amp;oacute;n la funcionalidad transversal.&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;&lt;b&gt;&lt;i&gt;2-. Haciendo uso de Callbacks:&lt;/i&gt;&lt;/b&gt; Los Callbacks, punteros a funci&amp;oacute;n &amp;oacute; delegados se refieren al mismo mecanismo de pasar c&amp;oacute;digo ejecutable como argumento a otro c&amp;oacute;digo. En la vieja escuela C/C++ podr&amp;iacute;amos conseguirlo as&amp;iacute;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image008_5F00_115CCB4D.jpg"&gt;&lt;img height="304" width="504" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image008_5F00_thumb_5F00_55508997.jpg" alt="clip_image008" border="0" title="clip_image008" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;Sin embargo en .NET lo hacemos as&amp;iacute; &lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image010_5F00_6105D0C9.jpg"&gt;&lt;img height="44" width="354" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image010_5F00_thumb_5F00_6D937DE5.jpg" alt="clip_image010" border="0" title="clip_image010" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify" style="color:#0000ff;"&gt;Entonces la manera que podr&amp;iacute;amos lograr &amp;oacute; conseguir la &amp;ldquo;inyecci&amp;oacute;n de pol&amp;iacute;ticas&amp;rdquo; difiere un poco de la descrita previamente que es m&amp;aacute;s limpia, adecuada, f&amp;aacute;cil de mantener y la recomendada desde mi punto de vista, porque hacemos uso de un Proxy que se comunica con la clase a la cual se le aplica la pol&amp;iacute;tica; caso que difiere de hacerlo con un Callback como se muestra a continuaci&amp;oacute;n&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image012_5F00_4C33D849.jpg"&gt;&lt;img height="404" width="704" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image012_5F00_thumb_5F00_150A4A50.jpg" alt="clip_image012" border="0" title="clip_image012" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;La mayor diferencia como se puede notar, es que el c&amp;oacute;digo que pertenece a la pol&amp;iacute;tica est&amp;aacute; del lado del cliente y no en el proxy como tal, permitiendo as&amp;iacute; repetir c&amp;oacute;digo y poner en riesgo el mantenimiento futuro. Podemos conseguir lo que queremos pero no es la mejor manera de hacerlo, sin embargo este segundo enfoque es realmente &amp;uacute;til para casos en los cuales, por ejemplo quiera impersonar a un usuario para correr un fragmento de c&amp;oacute;digo&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image014_5F00_17835641.jpg"&gt;&lt;img height="504" width="704" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clip_5F00_image014_5F00_thumb_5F00_14FA2483.jpg" alt="clip_image014" border="0" title="clip_image014" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;Cambiando de tema y ya casi para finalizar, una de las razones por la cual prefiero .NET en vez de Java es por el soporte y uso de Callbacks los cuales est&amp;aacute;n con nosotros desde siempre y son muy &amp;uacute;tiles como el caso de la funci&amp;oacute;n qsort (Implementaci&amp;oacute;n de quicksort en el CRT) que acepta como &amp;uacute;ltimo argumento una funci&amp;oacute;n que se encarga de comparar los elementos que se desean ordenar sin mencionar el poder de pasar funciones a funciones. En Java, esto simplemente no &amp;ldquo;existe&amp;rdquo; si no hay que &amp;ldquo;simular conseguirlo&amp;rdquo; a trav&amp;eacute;s de la implementaci&amp;oacute;n de interfaces (Patr&amp;oacute;n de Callback) por lo que me pregunto, &amp;iquest;qu&amp;eacute; rayos es eso? Lo puedo hacer en C/C++ en c&amp;oacute;digo nativo y en cualquier lenguaje .NET sin implementar ning&amp;uacute;n tipo de &amp;ldquo;patr&amp;oacute;n&amp;rdquo; para as&amp;iacute; enfocarme en el requerimiento, por esta y muchas otras razones que .NET me hace m&amp;aacute;s productivo lo prefiero antes que Java.&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;Saludos,&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="color:#0000ff;"&gt;Angel&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692592" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.69.25.92/CodeInjectionDemo.zip" length="61595" type="application/x-zip-compressed" /></item><item><title>Invoking SharePoint WebServices when Forms Based Authentication is enabled / Invocando servicios Web de SharePoint cuando Autenticación Basada en Formas está habilitada</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/04/07/invoking-sharepoint-webservices-when-forms-based-authentication-is-enabled-invocando-servicios-web-de-sharepoint-cuando-autenticaci-243-n-basada-en-formas-est-225-habilitada.aspx</link><pubDate>Tue, 07 Apr 2009 08:51:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1685758</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1685758</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1685758</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/04/07/invoking-sharepoint-webservices-when-forms-based-authentication-is-enabled-invocando-servicios-web-de-sharepoint-cuando-autenticaci-243-n-basada-en-formas-est-225-habilitada.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;A couple of days ago I was writing a piece of code for a Sharepoint solution which has Forms based authentication enabled. I had to invoke some SharePoint WebServices but the only thing standing in the way... FBA (Forms Based Authentication) so after receiving a couple of &lt;a href="http://en.wikipedia.org/wiki/HTTP_403"&gt;403&lt;/a&gt; errors I realized that I had to change my approach. It&amp;#39;s really easy and straightforward do this using &lt;a href="http://en.wikipedia.org/wiki/Security_Support_Provider_Interface"&gt;SSPI&lt;/a&gt; (Windows Integrated Security, a.k.a. &lt;a href="http://en.wikipedia.org/wiki/NTLM"&gt;NTLM&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/Kerberos_(protocol)"&gt;Kerberos&lt;/a&gt;) because you just need to do something like this&lt;/span&gt;
&lt;p&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;&amp;nbsp;&lt;img height="149" width="685" src="http://g5cvhw.bay.livefilestore.com/y1p0WgjjU29DbnB3RjCYWNNbGgJ4SO4aWzIb1H4kBXJnMbvJeogcy6jfx357Kb2zK5zTcoDqtGIoPyK4zl3c6ZKJzfE3NZEHXyf/Default_Credentials.jpg" alt="" /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;but it&amp;#39;s a different story when your authentication mechanism is not SSPI and for that purpose we have &lt;a href="http://msdn.microsoft.com/en-us/library/authentication.authentication.aspx"&gt;authentication.asmx&lt;/a&gt;&amp;nbsp;located in the _vti_bin folder but before we proceed any further I&amp;#39;d like to add a comment in regards SharePoint&amp;#39;s WebServices&amp;nbsp;&lt;span style="font-size:12pt;"&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;&lt;em style="COLOR:red;"&gt;It&amp;#39;s required to set the service&amp;#39;s URL before calling it, for instance&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;a href="http://server/_vti_bin/authentication.asmx"&gt;&lt;span style="color:#ff0000;"&gt;&lt;em style="COLOR:red;"&gt;http://server/_vti_bin/authentication.asmx&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;em style="COLOR:red;"&gt;however I want to authenticate or access a resource in a given site then I must specify this Url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;a href="http://server/MySite/_vti_bin/authentication.asmx"&gt;&lt;span style="color:#ff0000;"&gt;&lt;em&gt;http://server/MySite/_vti_bin/authentication.asmx&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following code snippet illustrates how to do it &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;img height="450" width="1029" src="http://g5cvhw.bay.livefilestore.com/y1p1GpiAp_IJhQH3068R3Qu41ZHIpTQKgemnwIMo1KEbD6XDl2PcZtsp6Uecwv9hsWhFsVFkO5tatrQh_RJnMUL1Uiwfz4bhkYv/sp_service_call.jpg" alt="" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-size:12pt;"&gt;Regards,&lt;br /&gt;&lt;br /&gt;Angel 
&lt;hr /&gt;
&lt;p&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;Hace un par de d&amp;iacute;as estaba escribiendo un fragmento de c&amp;oacute;digo para una soluci&amp;oacute;n basada en SharePoint con autenticaci&amp;oacute;n basada en formas habilitada. Ten&amp;iacute;a que invocar unos servicios Web de SharePoint pero lo &amp;uacute;nico que ten&amp;iacute;a en el camino... Autenticaci&amp;oacute;n&amp;nbsp;basada en formas por lo que despu&amp;eacute;s de recibir un par de errores &lt;a href="http://en.wikipedia.org/wiki/HTTP_403"&gt;403&lt;/a&gt; me d&amp;iacute; cuenta que ten&amp;iacute;a que cambiar el enfoque y manera de hacer las cosas. Es realmente f&amp;aacute;cil&amp;nbsp;y sencillo h&amp;aacute;cerlo con&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Security_Support_Provider_Interface"&gt;SSPI&lt;/a&gt; (Seguridad Integrada de Windows,&amp;nbsp;conocido como&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/NTLM"&gt;NTLM&lt;/a&gt;&amp;nbsp;y &lt;a href="http://en.wikipedia.org/wiki/Kerberos_(protocol)"&gt;Kerberos&lt;/a&gt;) porque lo &amp;uacute;nico que se necesita hacer es algo como esto&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;
&lt;p&gt;&lt;span style="font-family:calibri;color:#0000ff;font-size:12pt;"&gt;&amp;nbsp;&lt;img height="149" width="685" src="http://g5cvhw.bay.livefilestore.com/y1p0WgjjU29DbnB3RjCYWNNbGgJ4SO4aWzIb1H4kBXJnMbvJeogcy6jfx357Kb2zK5zTcoDqtGIoPyK4zl3c6ZKJzfE3NZEHXyf/Default_Credentials.jpg" alt="" /&gt; &lt;/span&gt;&lt;/p&gt;
&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;Pero es una historia distinta cuando el mecanismo de autenticaci&amp;oacute;n no es SSPI y para esos casos tenemos&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/authentication.authentication.aspx"&gt;authentication.asmx&lt;/a&gt;&amp;nbsp;que se encuentra en la carpeta&amp;nbsp;_vti_bin folder sin embargo antes de proseguir me gustar&amp;iacute;a agregar un comentario en relaci&amp;oacute;n a los servicios Web de&amp;nbsp;SharePoint&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;em style="COLOR:red;"&gt;Es requerido establecer el URL del servicio antes de realizar alguna llamada, por ejemplo&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;a href="http://server/_vti_bin/authentication.asmx"&gt;&lt;span style="color:#ff0000;"&gt;&lt;em style="COLOR:red;"&gt;http://server/_vti_bin/authentication.asmx&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;em style="COLOR:red;"&gt;pero si quiero autenticarme o acceder un recurso en un sitio dado entonces debo especificar&amp;nbsp;este Url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;a href="http://server/MySite/_vti_bin/authentication.asmx"&gt;&lt;span style="color:#ff0000;"&gt;&lt;em&gt;http://server/MySite/_vti_bin/authentication.asmx&lt;/em&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El siguiente fragmento de c&amp;oacute;digo ilustra como h&amp;aacute;cerlo &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;img height="450" width="1029" src="http://g5cvhw.bay.livefilestore.com/y1p1GpiAp_IJhQH3068R3Qu41ZHIpTQKgemnwIMo1KEbD6XDl2PcZtsp6Uecwv9hsWhFsVFkO5tatrQh_RJnMUL1Uiwfz4bhkYv/sp_service_call.jpg" alt="" /&gt;&lt;/p&gt;
Saludos,&lt;br /&gt;&lt;br /&gt;Angel&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1685758" width="1" height="1"&gt;</description></item><item><title>I'm Cross-platform, baby / Soy multi-plataforma, nena</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/03/01/i-m-cross-platform-baby-soy-multi-plataforma-nena.aspx</link><pubDate>Sun, 01 Mar 2009 05:03:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1674957</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1674957</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1674957</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/03/01/i-m-cross-platform-baby-soy-multi-plataforma-nena.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;I just finished setting up my &lt;a href="http://imapc.lifewithoutwalls.com/"&gt;PC&lt;/a&gt; to have a dual boot (&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista"&gt;Windows Vista&lt;/a&gt; x64 &amp;amp;&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Mac_os_x_leopard"&gt;Mac OS X Leopard&lt;/a&gt;), I&amp;#39;m an Microsoft &lt;a href="https://mvp.support.microsoft.com/profile/Angel.Hernandez"&gt;MVP&lt;/a&gt; and I love Microsoft tecnologies (I&amp;#39;ve been using Microsoft software since &lt;a href="http://en.wikipedia.org/wiki/Timeline_of_x86_DOS_operating_systems"&gt;MS-DOS 3.3&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Gwbasic"&gt;GW-BASIC&lt;/a&gt;) but you all know me, I&amp;#39;m always trying to find a new challenge &lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt; so I decided to get started writing applications for&lt;a href="http://en.wikipedia.org/wiki/Iphone_os"&gt; iPhone OS&lt;/a&gt; and see how can integrate these applications with Microsoft technologies, I&amp;#39;ve written C# and C++ for a while but now my time to learn &lt;a href="http://en.wikipedia.org/wiki/Objective-c"&gt;Objective-C&lt;/a&gt; has come &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; It&amp;#39;s pretty funny this fact because like two weeks ago I found out that some gold partner here in Sydney didn&amp;#39;t like my &amp;quot;strong C++ background&amp;quot;&amp;nbsp; and the guy who interviewed me consider C/C++ &amp;quot;impure&amp;quot; ha ha ha that was the silliest thing I&amp;#39;ve ever heard in my life, right Richard? Anyways... I love to integrate technologies and play with them, my current project at &lt;a href="http://www.customware.net"&gt;Customware&lt;/a&gt; is about integrating SAP, Microsoft CRM, SharePoint, webMethods, .NET 3.5, ASP.NET and AJAX so integration is not new to me, as a matter of fact, I have a couple of Virtual Machines (Solaris Express Edition &amp;amp; Ubuntu) running on &lt;a href="http://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt; for some integration stuff I&amp;#39;m currently working on as well... Anyways, I&amp;#39;m really excited about this and I&amp;#39;ll keep you posted on this &amp;quot;integration wave&amp;quot; so &lt;a href="http://en.wikipedia.org/wiki/Cross-platform"&gt;I&amp;#39;m cross-platform&lt;/a&gt;, baby...&lt;/p&gt;
&lt;p&gt;Cheers,&lt;/p&gt;
&lt;p&gt;Angel&lt;/p&gt;
&lt;font color="#0000ff" style="font-size:12pt;"&gt;&lt;font face="calibri"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff" style="font-size:12pt;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/font&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;Acabo de terminar de configurar mi &lt;a href="http://imapc.lifewithoutwalls.com/"&gt;PC&lt;/a&gt;&amp;nbsp;para que tuviera una arranque dual (&lt;a href="http://en.wikipedia.org/wiki/Windows_Vista"&gt;Windows Vista&lt;/a&gt; x64 &amp;amp;&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Mac_os_x_leopard"&gt;Mac OS X Leopard&lt;/a&gt;), soy un&amp;nbsp; &lt;a href="https://mvp.support.microsoft.com/profile/Angel.Hernandez"&gt;MVP&lt;/a&gt; de Microsoft y amo las tecnolog&amp;iacute;as Microsoft (He estado utilizando software Microsoft desde&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Timeline_of_x86_DOS_operating_systems"&gt;MS-DOS 3.3&lt;/a&gt;&amp;nbsp;y &lt;a href="http://en.wikipedia.org/wiki/Gwbasic"&gt;GW-BASIC&lt;/a&gt;) pero todos ustedes me conocen , estoy siempre tratando de encontrar un nuevo reto&amp;nbsp;&lt;img src="http://msmvps.com/emoticons/emotion-1.gif" alt="Smile" /&gt; por lo que decid&amp;iacute; comenzar a escribir aplicaciones para el&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Iphone_os"&gt; iPhone OS&lt;/a&gt; y as&amp;iacute; ver como puedo integrar estas aplicaciones con tecnolog&amp;iacute;as Microsoft, he escrito c&amp;oacute;digo en C#&amp;nbsp;y C++ por un rato y ahora debo aprender&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Objective-c"&gt;Objective-C&lt;/a&gt;&amp;nbsp; &lt;img src="http://msmvps.com/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; Es curioso esto porque hace como dos semanas atr&amp;aacute;s descubr&amp;iacute; que un gold partner ac&amp;aacute; en Sydney no le gust&amp;oacute; mi &amp;quot;fuerte influencia de C++&amp;quot;&amp;nbsp; y la persona que me entrevist&amp;oacute; considera a C/C++ &amp;quot;impuros&amp;quot; ja ja ja&amp;nbsp;eso fue lo m&amp;aacute;s est&amp;uacute;pido que he escuchado en mi vida, verdad Richard? En fin... Disfruto mucho integrar tecnolog&amp;iacute;as y jugar con ellas, mi proyecto actual en&amp;nbsp;&lt;a href="http://www.customware.net"&gt;Customware&lt;/a&gt; tiene que ver con integrar SAP, Microsoft CRM, SharePoint, webMethods, .NET 3.5, ASP.NET&amp;nbsp;y AJAX por lo que integrar no es nuevo para mi, de hecho tengo un par de m&amp;aacute;quinas virtuales&amp;nbsp;(Solaris Express Edition &amp;amp; Ubuntu) corriendo en&amp;nbsp; &lt;a href="http://www.virtualbox.org"&gt;VirtualBox&lt;/a&gt; para algunas cosas de integraci&amp;oacute;n en los que actualmente tambi&amp;eacute;n estoy trabajando... De cualquier forma, estoy realmente emocionado acerca de esto y los mantendr&amp;eacute; informado en esta &amp;quot;ola de integraci&amp;oacute;n&amp;quot;&amp;nbsp; por lo que puedo decir &lt;a href="http://en.wikipedia.org/wiki/Cross-platform"&gt;soy plataforma cruzada&lt;/a&gt;, nena...&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
&lt;p&gt;Angel&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img width="300" src="http://9rar1w.bay.livefilestore.com/y1p5odjbhvP4HSI2hAj3Ls-E32H6zhQySkagn7-ovAErLLIuAkAZKP5nUWTNT4xzAlfgZjtvfNfTvQKBcPTzigRJg/HPIM0298.jpg" height="300" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="300" src="http://9rar1w.bay.livefilestore.com/y1pWMA58Hx85Shhws-LY6dKGJE1GmXoyMIGk4hnll_iEcYaHtl7jTzaZaMQFnAKcvMm9hKygPRRCLALCHcHiLYeUQ/HPIM0300.jpg" height="300" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="300" src="http://9rar1w.bay.livefilestore.com/y1pdfxkheiMiUdI9KhO4IanZVpmuFJUoskfCu0vRgmKertGrlVxIJhZVIR3d5HsD45YLF7_75dV8z_9VgDX0RSjeA/HPIM0301.jpg" height="300" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img width="300" src="http://9rar1w.bay.livefilestore.com/y1pkBwy8FuxwGWNvhtC_Vcpgf_uwftrruRAtrC2FRr_EkM1-IkDA5ja-d4juaR0qESKF78JmKrMtmCI6oNg-ttfcg/HPIM0303.jpg" height="300" alt="" /&gt;&lt;/p&gt;
&lt;font color="#0000ff" style="font-size:12pt;"&gt;&lt;font face="calibri"&gt;
&lt;p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color="#0000ff" style="font-size:12pt;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clonedrive_5F00_310684D4.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1674957" width="1" height="1"&gt;</description></item><item><title>Grouping by more than a column in LINQ / Agrupando por más de una columna en LINQ</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/02/12/grouping-by-more-than-a-column-in-linq-agrupando-por-m-225-s-de-una-columna-en-linq.aspx</link><pubDate>Thu, 12 Feb 2009 09:13:15 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1671670</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1671670</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1671670</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/02/12/grouping-by-more-than-a-column-in-linq-agrupando-por-m-225-s-de-una-columna-en-linq.aspx#comments</comments><description>&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p align="justify"&gt;LINQ is a very powerful feature in .NET, however its syntax can be a bit confusing sometimes for some developers plus having the ability to perform queries in our code it’s not a novelty either, I did some FoxPro in the past and this capability was present already, so using and implementing LINQ it’s not that difficult to me =)&amp;#160; Anyways… Some days ago I had to write and implement some caching mechanism on this SharePoint based solution I’m currently working on which integrates SAP, CRM, WebMethods, AJAX and so on. The issue I had was related to grouping data based on more than one column (which it’s not LINQ’s out-of-the-box functionality), let’s remember that grouping it’s provided by the Queryable class and my working data was based on a DataTable which it’s a totally different class…&amp;#160; so I came with this easy and quick idea to implement, since I’m using LINQ to ADO.NET and DataSets as well as DataTable don’t contain the AsQueryable extension method I had to create a “pseudo” extension method to handle DataRow collections then use a Func delegate which is going to be passed to the IEnumerable&amp;lt;T&amp;gt;.GroupBy extension method, you may be wondering by now, but what does the method targeted by the delegate do? Well… It’s a very simple a short answer, I just create a unique key (used to group my data) based on concatenating the value for the columns I want to group by and voila!&amp;#160; it’s works… It’s not hard or time consuming to implement and it gives me the results that I’m expecting. The images shown below illustrate the code that’s required to accomplish this. &lt;/p&gt;      &lt;p align="justify"&gt;Kind regards,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;    &lt;hr /&gt;&lt;/span&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;         &lt;p align="justify"&gt;LINQ es una característica muy poderosa en .NET, sin embargo su sintaxis puede ser un poco confusa algunas veces para los desarrollares, además la capacidad de realizar consultas en nuestro código tampoco es una novedad, yo desarrollé con FoxPro en el pasado y ésta característica estuvo siempre presente, así que utilizar ó implementar LINQ no es tan difícil para mí =) En fin… Hace unos días atrás tuve que escribir e implementar un mecanismo de caché para ésta solución basada en SharePoint&amp;#160; en la que trabajo actualmente la cual integra SAP, CRM, WebMethods, AJAX y pare usted de contar. El problema que tenía era en relación al agrupamiento de datos basado en más de una columna (Lo cuál no es una funcionalidad por defecto en LINQ), recordemos que el agrupamiento está dado por la clase Queryable y mis datos estaban almacenados en un DataTable los cuales son una clase totalmente distinta, por lo que se me ocurrió ésta idea que resultó ser rápida y fácil de implementar; ya que estoy utilizando LINQ con ADO.NET y DataSets al igual que DataTable no contienen el método de extensión AsQueryable tuve entonces que crear un “pseudo” método de extensión para manipular una colección de DataRow que me permitiera después utilizar un delegado Func que posteriormente es pasado al método de extensión IEnumerable&amp;lt;T&amp;gt;.GroupBy, ustedes se estarán preguntándose ahora, pero qué hace el método apuntado por el delegado?&amp;#160; Bueno… Es una respuesta corta y sencilla, sólo creo una clave única (utilizada para agrupar mis datos) a partir de concatenar el valor de las columnas por la cual quiero agrupar y voila!&amp;#160; Funciona… No es díficil ó toma tiempo para hácerlo y me da los resultados que espero. Las imágenes mostradas a continuación contienen el código que es necesario para conseguir esto.&lt;/p&gt;          &lt;p align="justify"&gt;Saludos cordiales,&lt;/p&gt;          &lt;p align="justify"&gt;Angel&lt;/p&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_6E2A1FC7.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="333" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_127B1618.png" width="651" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Image 1 – GetTestData method&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image3_5F00_0D951004.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="304" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image3_5F00_thumb_5F00_3DBB9920.png" width="653" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Image 2 – GroupData method&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image6_5F00_5B790FE0.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="431" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image6_5F00_thumb_5F00_694741DC.png" width="656" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Image 3 – EnumerableDataRowExtension class&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image9_5F00_3C4E8CA9.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="452" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image9_5F00_thumb_5F00_4D224925.png" width="656" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Image 4 – PerformDataGrouping method&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image1_5F00_5187E278.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="404" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image1_5F00_thumb_5F00_05A8939A.png" width="658" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Image 5 – It’s so easy to do in FoxPro =)&lt;/font&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1671670" width="1" height="1"&gt;</description></item><item><title>Visual NDepend</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/02/02/visual-ndepend.aspx</link><pubDate>Mon, 02 Feb 2009 08:44:40 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1668081</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1668081</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1668081</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/02/02/visual-ndepend.aspx#comments</comments><description>&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p align="justify"&gt;Have you ever wanted to browse code metrics based on a code base or manage complexity and dependency plus get to know how your code is structured and even more? If that’s your case then you should try &lt;a href="http://www.ndepend.com/"&gt;Visual NDepend&lt;/a&gt;. This tool based on 4 different inputs (Image 1):&lt;/p&gt;      &lt;ul&gt;       &lt;li&gt;         &lt;div align="justify"&gt;.NET Assemblies&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;.NET PDB Files&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;C# Source Files&lt;/div&gt;       &lt;/li&gt;        &lt;li&gt;         &lt;div align="justify"&gt;Coverage Files&lt;/div&gt;       &lt;/li&gt;     &lt;/ul&gt;      &lt;p align="justify"&gt;Performs an analysis and tells us more about our code in just minutes.&amp;#160; The “easiest” and most common way to measure any code base is through counting the number of lines of&amp;#160; code which at the end is a time consuming and boring task, &lt;a href="http://www.ndepend.com/"&gt;Visual NDepend&lt;/a&gt; does a much more than that because it supports CQL (Code Query Language) so we can query our code based on a given criteria and focus on design and architecture without incurring in dependencies faults in the event of refactoring.&lt;/p&gt;      &lt;p align="justify"&gt;The user interface is pretty straightforward (Image 2), just create a new project, add assemblies to be analized and go. The hardest part but after a while becomes easy is the ability to interpret analysis output results (Image 3) but like everything else in life… it’s all about practice.&lt;/p&gt;      &lt;p align="justify"&gt;At the end of the analysis we get a report which is a condensed view about our code structure and organization (Image 4), we can also see where we are in terms of abstractness and instability (Image 5) &lt;/p&gt;      &lt;p align="justify"&gt;So if you’re a developer or architect who expects nothing more than clean and reusable code, this tool is the right for you.&lt;/p&gt;      &lt;p align="justify"&gt;Kind regards,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;    &lt;hr /&gt;&lt;/span&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;         &lt;p align="justify"&gt;¿Alguna vez has querido navegar a través de las métricas basadas en tu código base ó manejar la complejidad y dependencia, además de llegar a saber como está estructurado tu código y aún más? Sí ese es tu caso entonces deberías probar &lt;a href="http://www.ndepend.com/"&gt;Visual NDepend&lt;/a&gt;. Ésta herramienta basada en 4 entradas diferentes (Imagen 1):&lt;/p&gt;          &lt;ul&gt;           &lt;li&gt;             &lt;div align="justify"&gt;Ensamblajes de .NET &lt;/div&gt;           &lt;/li&gt;            &lt;li&gt;             &lt;div align="justify"&gt;Archivos PDB&lt;/div&gt;           &lt;/li&gt;            &lt;li&gt;             &lt;div align="justify"&gt;Código fuente de C#&lt;/div&gt;           &lt;/li&gt;            &lt;li&gt;             &lt;div align="justify"&gt;Archivos de Cobertura&lt;/div&gt;           &lt;/li&gt;         &lt;/ul&gt;          &lt;p align="justify"&gt;Realiza un análisis y nos dice más de nuestro código en cuestión de minutos. La manera “más fácil” y común de medir cualquier código base es a través del conteo del número de líneas de código lo cual resulta ser una tarea aburrida que consume bastante tiempo, &lt;a href="http://www.ndepend.com/"&gt;Visual NDepend&lt;/a&gt; hace mucho más que eso porque soportaCQL (Lenguaje de Consulta de Código) así que podemos consultar nuestro código basado en un criterio dado y enfocarnos en el diseño y arquitectura sin incurrir en faltas asociadas a dependencias en el caso que tengamos que refactorizar.&lt;/p&gt;          &lt;p align="justify"&gt;La interfaz es realmente sencilla (Imagen 2), sólo crear un nuevo proyecto, agregar ensamblajes para analizar y ejecutar. La parte más díficil pero después de un tiempo se hace sencilla es la habilidad de interpretar el resultado del análisis&amp;#160; (Imagen 3) pero como todo en la vida… es sólo práctica.&lt;/p&gt;          &lt;p align="justify"&gt;Al final del análisis obtenemos un reporte el cual es una vista condensada acerca de la estructura y organización de nuestro código (Imagen 4), también podemos ver en donde nos encontramos en términos de abstracción e inestabilidad (Imagen 5) &lt;/p&gt;          &lt;p align="justify"&gt;Así que si eres un desarrollador ó un arquitecto que no espera sino código limpio y reutilizable, esta es la herramienta adecuada para ti.&lt;/p&gt;          &lt;p align="justify"&gt;Saludos cordiales,&lt;/p&gt;          &lt;p&gt;Angel&lt;/p&gt;          &lt;p&gt;&lt;/p&gt;       &lt;/span&gt;&amp;#160;&lt;/span&gt;       &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;&lt;img alt="" src="http://codebetter.com/blogs/patricksmacchia/NDependAnalysisInputs/NDependAnalysisInput.png" /&gt;&lt;/span&gt;   &lt;p&gt;Image 1 – NDepend Analysis inputs&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_0FD3B481.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="409" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_28DB9694.png" width="695" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Image 2 – NDepend welcome screen&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_240CF275.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="465" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_7643137F.png" width="699" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Image 3 – NDepend dependency matrix and metrics&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_6C8993A6.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="455" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_6E364B7B.png" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Image 4 – NDepend analysis report&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_61E45FED.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="442" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_5A38A4E6.png" width="704" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Image 5 – Abstractness vs. Instability&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1668081" width="1" height="1"&gt;</description></item><item><title>Some useful debugging tips / Algunos tips útiles para depuración</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/29/some-useful-debugging-tips-algunos-tips-250-tiles-para-depuraci-243-n.aspx</link><pubDate>Fri, 30 Jan 2009 01:19:11 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1667141</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1667141</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1667141</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/29/some-useful-debugging-tips-algunos-tips-250-tiles-para-depuraci-243-n.aspx#comments</comments><description>&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p align="justify"&gt;Last year 2008 was challenging, amazing and exciting all at the same time.&amp;#160; I’ve had a lot of interesting experiences and situations alike that goes from moving countries (Venezuela to Australia), joining &lt;a href="http://www.customware.net"&gt;CustomWare&lt;/a&gt;, my first speaking engagement in Tech-Ed and so on. I’ve learned a lot generally speaking so I hope this year 2009 can be better than the previous one.&amp;#160; As developers, we can’t escape the fact that our code is not bug free (we wish it was but life ain’t perfect) so this post is about some useful debugging tips and options we have available&lt;/p&gt;      &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #1 – Visual Studio .NET Debugger &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;This is our first line of defense, but it’s missing 99% of the times on a production environment.&amp;#160; It allows to set breakpoints, add watches, evaluate expressions, view memory and its disassembly and something even cooler… We can step into .NET Framework code (Image 1)&lt;/p&gt;      &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #2 – CorDebug &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;It’s a pretty cool tool which allows us to debug .NET code using the command line. It takes some time to get used to the commands but once we do it, it’s pretty straightforward. It’s highly recommended to have the symbols files (PDB) required to step into the code. If we don’t have it then we’re going to see the code in Assembler. Let’s take as an example the Test.cs source file (Image 2), it’s a very simple application written with “Visual” Notepad. &lt;/p&gt;      &lt;p align="justify"&gt;Then we’re going to compile it using the CSC from the Command Prompt. We can either generate symbols/debug information or not with the following switches:&lt;/p&gt;      &lt;p align="justify"&gt;· &lt;i&gt;Generate Debug Information&lt;/i&gt;&lt;/p&gt;      &lt;blockquote&gt;       &lt;p align="justify"&gt;csc test.cs /platform:x64 /debug&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p align="justify"&gt;· &lt;i&gt;Don’t generate any Debug Information&lt;/i&gt;&lt;/p&gt;      &lt;blockquote&gt;       &lt;p align="justify"&gt;csc test.cs /platform:x64&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p align="justify"&gt;Once we’ve built our assembly/application we can launch &lt;i&gt;CorDebug&lt;/i&gt; and start debugging it. We can either let&lt;i&gt; CorDebug &lt;/i&gt;launch the application for us or we can attach it to the selected process by ourselves. Image 3 depicts the &lt;i&gt;CorDebug&lt;/i&gt; “interface”.&amp;#160; &lt;/p&gt;      &lt;p align="justify"&gt;The yellow rounded rectangles indicate:&lt;/p&gt;      &lt;blockquote&gt;       &lt;p align="justify"&gt;1. Listing of managed applications running&lt;/p&gt;        &lt;p align="justify"&gt;2. Attach the debugger to process 1372&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p align="justify"&gt;We can execute &lt;b&gt;&lt;i&gt;?&lt;/i&gt;&lt;/b&gt; anytime to get information about available commands. The following image shows &lt;i&gt;CorDbg&lt;/i&gt; launching the application for us and we step into the code (The lines are retrieved from the PDB file and code executed outside our program is displayed in Assembler). The colour reference (Image 4) for the rounded rectangles is:&lt;/p&gt;      &lt;blockquote&gt;       &lt;p&gt;· Light Green: CorDbg launching c:\test.exe&lt;/p&gt;        &lt;p&gt;· Light Blue: Assemblies loaded &lt;/p&gt;        &lt;p&gt;· Yellow: Stepping into the code&lt;/p&gt;        &lt;p&gt;· Red: Displaying and modifying variables &lt;/p&gt;        &lt;p&gt;· Grey: Stack trace at that moment &lt;/p&gt;        &lt;p&gt;· Cyan: Modules loaded plus Application Domain ID&lt;/p&gt;     &lt;/blockquote&gt;      &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #3 – WinDbg (Windows Debugging Tools) &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;It’s a multipurpose debugger that can be used to debug user mode applications, drivers and the operating system itself in kernel mode. It’s very useful to debug kernel-mode memory dumps, created after an application crashes or when experiencing a “BSoD”. This tool allows to step into the code if PDB (symbol file) is present (Image 5).&lt;/p&gt;      &lt;p align="justify"&gt;WinDbg allows loading of extension &lt;a href="http://en.wikipedia.org/wiki/Dynamic-link_library"&gt;DLLs&lt;/a&gt; that can augment the debugger&amp;#39;s supported commands and allow for help in debugging specific scenarios: for example, displaying an &lt;a href="http://en.wikipedia.org/wiki/MSXML"&gt;MSXML&lt;/a&gt; document given an IXMLDOMDocument, or debugging the &lt;a href="http://en.wikipedia.org/wiki/Common_Language_Runtime"&gt;Common Language Runtime (CLR)&lt;/a&gt;. These extensions are a large part of what makes WinDbg such a powerful debugger. WinDbg is used by the &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;Microsoft Windows&lt;/a&gt; product team to build Windows, and everything needed to debug Windows is included in these extension DLLs. &lt;/p&gt;      &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #4 – CLR Profiler &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;Believe it or not but this tool helped me a lot 4 years ago when one of the projects I was engaged on at that time started to act “weird”… By using CLR Profiler and Windows Monitoring and Performance tools I was able to find a memory leak issue with BSTR objects. CLRProfiler is a tool that you can use to analyze the behavior of your managed applications which is focused on analyzing what is going on in the garbage collector heap (Image 6) and you can get an overview&amp;#160; of your application’s memory usage (Image 7).&lt;/p&gt;      &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #5 – .NET Reflector&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;Originally developed by Lutz Roeder and now by Red Gate Software, this tool is really handy and a “must-have” in every .NET developer toolbox because it allows you to Disassemble and analyze .NET assemblies (Image 8) so you can check and step into .NET code without having the source files.&lt;/p&gt;     &lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;         &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #6 –&amp;#160; Fiddler&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Have you ever wanted to sniff HTTP requests/responses? If that’s the case then you might find Fiddler useful. It’s a light-weight sniffing tool which allows developers see what’s happening between client/server HTTP transmission (Image&lt;/p&gt;       &lt;/span&gt; 9)&lt;/span&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;         &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Option #7 –&amp;#160; Microsoft NetMon (Network Monitor)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;A couple of months ago I had an issue related to Kerberos, it seemed that the Kerberos ticket was getting lost somewhere… My best choice for this kind of situations, NetMon (Image 10). It’s a complete sniffing and network monitoring tool by Microsoft.&lt;/p&gt;       &lt;/span&gt;&lt;/span&gt;      &lt;p&gt;&lt;strong&gt;&lt;u&gt;Option #8 –&amp;#160; Windows’ performance and monitoring Tools&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;Task Manager, Performance Monitor can make our lives easier if we know how to use them and most important… Add the right performance counter to determine and detect any possible problem. &lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;p&gt;Hope this helps,&lt;/p&gt;      &lt;p&gt;Kind regards,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;  &lt;p&gt;   &lt;hr /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt; &lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;         &lt;p align="justify"&gt;El año pasado 2008 fue retador, interesante y emocionante todo al mismo tiempo. Tuve un montón de experiencias y situaciones por igual que van desde cambiar de países (de Venezuela para Australia), unirme a &lt;a href="http://www.customware.net"&gt;CustomWare&lt;/a&gt;, mis primeras charlas en Tech-Ed y pare usted de contar. He aprendido generalmente hablando así que espero que este año 2009 pueda ser mejor que el anterior. Como desarrolladores, no podemos escapar el hecho de que nuestro código no está libre de errores (así lo quisierámos pero la vida no es perfecta) por lo que este post trata sobre algunos tips y opciones que tenemos disponibles&lt;/p&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #1 – Depurador de Visual Studio .NET&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Esta es nuestra primera línea de defensa, pero el 99% de las veces no está instalado en un ambiente de producción. Nos permite establecer puntos de interrupción, inspección de variables, evaluar expresiones, ver la memoria y su desensamblado y algo aún más chévere… Podemos ver código del .NET Framework (Imagen 1)&lt;/p&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #2 – CorDebug &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Es una herramienta bien interesante que nos permite depurar código de .NET desde la línea de comandos. Toma algo de tiempo acostumbrarse a los comandos pero una vez que lo hacemos, es realmente sencillo. Es altamente recomendado tener los símbolos (PDB) requeridos para poder ver el código. Sí no lo tenemos entonces vamos a ver el código en Ensamblador. Ahora tomemos como ejemplo el archivo Test.cs (Imagen 2), es una aplicación bastante sencilla escrita con&amp;#160; “Visual” Notepad. &lt;/p&gt;          &lt;p align="justify"&gt;Luego vamos a compilarla utilizando CSC desde la línea de comandos. Podemos generar ó no símbolos (información de depuración) con los siguientes switches:&lt;/p&gt;          &lt;p align="justify"&gt;· &lt;i&gt;Generar información de depuración&lt;/i&gt;&lt;/p&gt;          &lt;blockquote&gt;           &lt;p align="justify"&gt;csc test.cs /platform:x64 /debug&lt;/p&gt;         &lt;/blockquote&gt;          &lt;p align="justify"&gt;· &lt;i&gt;No generar información de depuración&lt;/i&gt;&lt;/p&gt;          &lt;blockquote&gt;           &lt;p align="justify"&gt;csc test.cs /platform:x64&lt;/p&gt;         &lt;/blockquote&gt;          &lt;p align="justify"&gt;Una vez que hayamos generado nuestro ensamblaje/aplicación podemos ejecutar&amp;#160; &lt;i&gt;CorDebug&lt;/i&gt; y comenzar a depurar. Podemos ejecutar la aplicación por nuestra cuenta ó podemos adjuntarlo al proceso seleccionado.La imagen 3 muestra la “interfaz” de &lt;i&gt;CorDebug&lt;/i&gt; “.&amp;#160; &lt;/p&gt;          &lt;p align="justify"&gt;Los rectángulos amarillos indican:&lt;/p&gt;          &lt;blockquote&gt;           &lt;p align="justify"&gt;1. Lista de aplicaciones administradas en ejecución&lt;/p&gt;            &lt;p align="justify"&gt;2. Adjuntar el depurador al proceso 1372&lt;/p&gt;         &lt;/blockquote&gt;          &lt;blockquote&gt;           &lt;p align="justify"&gt;Podemos ejecutar &lt;b&gt;&lt;i&gt;?&lt;/i&gt;&lt;/b&gt; en cualquier momento para obtener información de comandos disponibles. La siguiente imagen muestra a &lt;i&gt;CorDbg&lt;/i&gt; lanzando la aplicación por nosotros y podemos ver el código (Las líneas de código se recuperan del archivo PDB y el código ejecutado fuera de nuestro programa es mostrado en Ensamblador). La referencia del color (Imagen 4) de los rectángulos es:&lt;/p&gt;         &lt;/blockquote&gt;          &lt;blockquote&gt;           &lt;p&gt;· Verde claro: CorDbg lanzando c:\test.exe&lt;/p&gt;            &lt;p&gt;· Azul claro: Ensamblajes cargados &lt;/p&gt;            &lt;p&gt;· Amarillo: Ejecución línea por línea del código &lt;/p&gt;            &lt;p&gt;· Rojo: Mostrando y modificando variables &lt;/p&gt;            &lt;p&gt;· Gris: Pila de llamadas al momento&amp;#160; &lt;/p&gt;            &lt;p&gt;· Aguamarina: Módulos cargados además del ID AppDomain&lt;/p&gt;         &lt;/blockquote&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #3 – WinDbg (Windows Debugging Tools) &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Es un depurador multi-propósito que puede ser utilizado para depurar aplicaciones en modo usuario,&amp;#160; controladores y al mismo sistema operativo en modo Kernel.&amp;#160; Es muy útil para depurar vaciados de memoria en modo Kernel, que son creados después de una aplicación haberse cerrado inesperadamente ó tras experimentar una “Pantalla Azul”.&amp;#160; Esta herramienta permite ejecutar el código línea por línea sí el archivo de símbolos (PDB) está presente (Imagen 5) &lt;/p&gt;          &lt;p align="justify"&gt;WinDbg permite cargar &lt;a href="http://en.wikipedia.org/wiki/Dynamic-link_library"&gt;DLLs&lt;/a&gt; de extensión que pueden aumentar los comandos soportados por el depurador permitiendo así depurar en escenarios específicos: Por ejemplo,&amp;#160; mostrar un documento &lt;a href="http://en.wikipedia.org/wiki/MSXML"&gt;MSXML&lt;/a&gt; a partir de un objeto&amp;#160; IXMLDOMDocument ó inclusive depurar el &lt;a href="http://en.wikipedia.org/wiki/Common_Language_Runtime"&gt;Common Language Runtime (CLR)&lt;/a&gt;. Estas extensiones hacen de&amp;#160; WinDbg un poderoso depurador.&amp;#160; WinDbg es utilizado por el equipo de desarrollo de &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;Microsoft Windows&lt;/a&gt; y todo lo necesario para depurar Windows está incluído en estas DLLs de extensión.&lt;/p&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #4 – CLR Profiler &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Creánlo ó no pero esta herramienta me ayudó mucho hace 4 años atrás cuando uno de los proyectos en los que estaba involucrado para ese entonces comenzó a actuar “raro”…&amp;#160; Al utilizar el CLR Profiler y las herramientas de rendimiento y monitoreo de Windows pude encontrar una fuga de memoria relacionada con objetos de tipo BSTR.&amp;#160; El CLR Profiler nos permite analizar lo que sucede en el montón del colector de basura (Imagen 6) así mismo podemos obtener un resumen del uso de la memoria por parte de la aplicación (Imagen 7).&lt;/p&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #5 – .NET Reflector&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;Originalmente desarrollado por&amp;#160; Lutz Roeder y ahora por Red Gate Software, esta herramienta es realmente útil y “necesaria-tener” en la caja de herramientas de cada desarrollador .NET ya que permite analizar y decompilar ensamblajes de .NET (Imagen 8) por lo que se puede chequear y revisar el código sin necesidad de tener los archivos fuentes.&lt;/p&gt;         &lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;             &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #6 –&amp;#160; Fiddler&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;              &lt;p align="justify"&gt;¿Alguna vez has deseado escuchar solicitudes/respuestas basadas en HTTP? Sí es ese el caso, entonces encontrarás a Fiddler útil (Imagen&lt;/span&gt;&lt;/span&gt; 9).&amp;#160; Es una herramienta liviana para escuchar conversaciones basadas en HTTP entre el cliente y el servidor. &lt;/p&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:12pt;color:#0000ff;"&gt;&lt;span style="font-family:calibri;"&gt;             &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #7 –&amp;#160; Microsoft NetMon (Network Monitor)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;              &lt;p align="justify"&gt;Hace un par de meses atrás se me presentó un problema relacionado con Kerberos, parecía que el ticket de Kerberos se estaba perdiendo en alguna parte… Mi mejor opción para ese tipo de situaciones, NetMon (Imagen 10). Es una herramienta completa para escuchar el tráfico y conversaciones en la Red.&lt;/p&gt;           &lt;/span&gt;&lt;/span&gt;          &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Opción #8 –&amp;#160; Herramientas de rendimiento y monitoreo de Windows&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;          &lt;p align="justify"&gt;El administrador de tareas y monitor de rendimiento pueden hacer nuestras vidas más fáciles si sabemos como usarlos y lo más importante… Agregar el contador de rendimiento adecuado para detectar y determinar cualquier posible problema.&lt;/p&gt;          &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;          &lt;p align="justify"&gt;Espero sea de utilidad,&lt;/p&gt;          &lt;p align="justify"&gt;Saludos cordiales,&lt;/p&gt;          &lt;p align="justify"&gt;Angel&lt;/p&gt;          &lt;p align="justify"&gt;&lt;/p&gt;       &lt;/span&gt;&lt;/span&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image11_5F00_2202DF8A.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="349" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image11_5F00_thumb_5F00_3392CA55.png" width="599" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 1 – Yes… We want to step into the Framework code :D&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_09631C6D.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="341" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image_5F00_thumb_5F00_3F8494BC.png" width="607" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;Image 2 – Simple application written in Visual “Notepad”&amp;#160; =)&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image31_5F00_63C9793E.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="426" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image31_5F00_thumb_5F00_59B4D813.png" width="615" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 3 – Cordbg output&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image61_5F00_245B9FE1.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="646" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image61_5F00_thumb_5F00_6C59ABFD.png" width="605" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 4 – Cordbg output explained&lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/WinDbg_5F00_6481938E.jpg"&gt;&lt;img title="WinDbg" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="381" alt="WinDbg" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/WinDbg_5F00_thumb_5F00_6CB5B925.jpg" width="606" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 5 – WinDbg x64 Interface&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image111_5F00_02BC24B8.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="373" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image111_5F00_thumb_5F00_2DB412BD.png" width="614" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 6 – CLR Profiler displaying Heap graph &lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image4_5F00_11C2DDC5.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="374" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image4_5F00_thumb_5F00_3A121019.png" width="612" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 7 – CLR Summary &lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image711_5F00_0C444754.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="342" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image711_5F00_thumb_5F00_6716D71A.png" width="618" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 8 – .NET Reflector &lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image1_5F00_31BD9EE8.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="306" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image1_5F00_thumb_5F00_57839F7E.png" width="623" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 9 – Fiddler&amp;#160;&amp;#160; &lt;/p&gt;      &lt;p&gt;&amp;#160;&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image7_5F00_743D1493.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="377" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/image7_5F00_thumb_5F00_3EE3DC61.png" width="617" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Image 10 – NetMon&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1667141" width="1" height="1"&gt;</description></item><item><title>One thing to consider when deploying AJAX enabled apps / Algo que considerar cuando se están implementando aplicaciones basadas en AJAX</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/15/one-thing-to-consider-when-deploying-ajax-enabled-apps-algo-que-considerar-cuando-se-est-225-n-implementando-aplicaciones-basadas-en-ajax.aspx</link><pubDate>Thu, 15 Jan 2009 06:53:40 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661943</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1661943</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1661943</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/15/one-thing-to-consider-when-deploying-ajax-enabled-apps-algo-que-considerar-cuando-se-est-225-n-implementando-aplicaciones-basadas-en-ajax.aspx#comments</comments><description>&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p align="justify"&gt;I’m currently developing an AJAX enabled Webpart which consumes a WebService that connects to CRM. After deploying a simple application that resembles the Webpart functionality I’ve got the following exception (see image shown below) caused by ScriptReferenceBase class. There’s a gotcha with &lt;a href="http://www.asp.net/ajax/ajaxcontroltoolkit/"&gt;AjaxToolkit&lt;/a&gt; and .NET Framework 3.5. Suggestion… Install .NET Framework 3.5 SP1. Further information can be found &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptreferencebase.aspx"&gt;here&lt;/a&gt; &lt;/p&gt;      &lt;p&gt;Kind regards,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;  &lt;hr /&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p align="justify"&gt;Actualmente estoy desarrollando un Webpart con capacidades de AJAX el cual consume un servicio Web que se conecta a CRM. Después de desplegar una aplicación sencilla que tiene la funcionalidad del Webpart recibí una excepción (mostrada en la imagen abajo) causada por la clase ScriptReferenceBase. Hay un problemita con el &lt;a href="http://www.asp.net/ajax/ajaxcontroltoolkit/"&gt;AjaxToolkit&lt;/a&gt; y .NET Framework 3.5. Sugerencia… Instalar .NET Framework 3.5 SP1. &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.scriptreferencebase.aspx"&gt;Acá&lt;/a&gt; puede encontrarse más información&lt;/p&gt;      &lt;p align="justify"&gt;Saludos,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;      &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/nosp1_5F00_3FAA9EE1.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="nosp1" border="0" alt="nosp1" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/nosp1_5F00_thumb_5F00_0F341A6B.jpg" width="747" height="389" /&gt;&lt;/a&gt; &lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661943" width="1" height="1"&gt;</description></item><item><title>My first impressions with Windows 7 beta / Mis primeras impresiones con Windows 7 beta</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/13/my-first-impressions-with-windows-7-beta-mis-primeras-impresiones-con-windows-7-beta.aspx</link><pubDate>Tue, 13 Jan 2009 07:20:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661282</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1661282</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1661282</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/13/my-first-impressions-with-windows-7-beta-mis-primeras-impresiones-con-windows-7-beta.aspx#comments</comments><description>&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p&gt;These are some of my first impressions and findings with Windows 7 beta:&lt;/p&gt;      &lt;p&gt;1-. Installation is faster than Vista &lt;/p&gt;      &lt;p&gt;2-. Ability to select an active Wireless connection from installation &lt;/p&gt;      &lt;p&gt;3-. Drivers availability (Recognized all of my devices) &lt;/p&gt;      &lt;p&gt;4-. At simple sight, it seems to be faster than Vista (booting, copying files &amp;amp; performing some other tasks). I have to test with my development environment up and running (VS, SQL and WSS) &lt;/p&gt;      &lt;p&gt;5-. Fresher and nicer user interface &lt;/p&gt;      &lt;p&gt;6-. Ability to create Web Content (Blogging). Good integration with Windows Live &lt;/p&gt;      &lt;p&gt;7-. Ability to show desktop without minimizing all of the active windows &lt;/p&gt;      &lt;p&gt;8-. Recognize ISO images files allowing burning them with just a click &lt;/p&gt;      &lt;p&gt;9-. Ability to attach VHD files (Virtual Disks) &lt;/p&gt;      &lt;p&gt;10-. Improved system restore settings&lt;/p&gt;      &lt;p&gt;I’ll keep you posted =)&lt;/p&gt;      &lt;p&gt;Cheers,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;  &lt;hr /&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p&gt;Estas son algunas de mis primeras impresiones y descubrimientos con Windows 7 beta: &lt;/p&gt;      &lt;p&gt;1-. La instalación es más rápida que Vista &lt;/p&gt;      &lt;p&gt;2-. Posibilidad de seleccionar una conexión inalámbrica activa desde la instalación &lt;/p&gt;      &lt;p&gt;3-. Disponibilidad de controladores&amp;#160; (Reconoció todos mis dispositivos) &lt;/p&gt;      &lt;p&gt;4-. A simple vista, parece ser más rápido que Vista (Arrancando, copiando archivos y realizando otras tareas). Debo probar esto con mi ambiente de desarrollo propiamente configurado (VS, SQL y WSS)&lt;/p&gt;      &lt;p&gt; 5-. Interfaz de usuario renovada y más fresca &lt;/p&gt;      &lt;p&gt;6-. Posibilidad de crear contenido Web (Blogging). Buena integración con Windows Live &lt;/p&gt;      &lt;p&gt;7-. Posibilidad de mostrar el escritorio sin tener que minimizar todas las ventanas activas &lt;/p&gt;      &lt;p&gt;8-. Reconocimiento de imágenes ISO permitiendo grabar estas con un sólo click &lt;/p&gt;      &lt;p&gt;9-. Posiblidad de montar/adjuntar archivos VHD (Discos virtuales) &lt;/p&gt;      &lt;p&gt;10-. Configuración mejorada para restauración del sistema &lt;/p&gt;      &lt;p&gt;Los mantendré informados =)&lt;/p&gt;      &lt;p&gt;Saludos,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661282" width="1" height="1"&gt;</description></item><item><title>Dealing with ISO images on Windows 7 Beta / Lidiando con imágenes ISO en Windows 7 Beta</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/13/dealing-with-iso-images-on-windows-7-beta-lidiando-con-im-225-genes-iso-en-windows-7-beta.aspx</link><pubDate>Tue, 13 Jan 2009 06:54:39 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661274</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1661274</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1661274</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/13/dealing-with-iso-images-on-windows-7-beta-lidiando-con-im-225-genes-iso-en-windows-7-beta.aspx#comments</comments><description>&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p&gt;Almost every software media I have is an ISO image. Well, I tried mounting some of these by using &lt;a href="http://www.magiciso.com/tutorials/miso-magicdisc-history.htm"&gt;MagicDisc&lt;/a&gt; and &lt;a href="http://forum.daemon-tools.cc/announcements.php"&gt;Daemon Tools&lt;/a&gt; without any success so after googling a bit I found &lt;a href="http://www.slysoft.com/en/virtual-clonedrive.html"&gt;Virtual CloneDrive&lt;/a&gt; and it works perfectly. Please, remember to reboot your PC after installing and mount your ISO image from the context menu. &lt;/p&gt;      &lt;p&gt;A cool feature in Windows 7, the ability to burn ISO images from the Shell without having installed any CD/DVD burner software. &lt;/p&gt;      &lt;p&gt;Hope this helps,&lt;/p&gt;      &lt;p&gt;Cheers,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;  &lt;hr /&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;     &lt;p&gt;Casi que todo el software que tengo está como imagen ISO. Bueno, intenté montar algunas después de instalar el beta de Windows 7 utilizando&amp;#160; &lt;a href="http://www.magiciso.com/tutorials/miso-magicdisc-history.htm"&gt;MagicDisc&lt;/a&gt; y &lt;a href="http://forum.daemon-tools.cc/announcements.php"&gt;Daemon Tools&lt;/a&gt; sin tener éxito pero después de buscar un poco en Google encontré&amp;#160; &lt;a href="http://www.slysoft.com/en/virtual-clonedrive.html"&gt;Virtual CloneDrive&lt;/a&gt; y funciona perfectamente. Por favor, recuerda reiniciar tu PC después de instalarlo y monta la imagen ISO desde el menú contextual. &lt;/p&gt;      &lt;p&gt;Una característica chévere en Windows 7, es la posibilidad de quemar imágenes ISO desde el Shell sin necesidad de tener instalado algún software de grabación de CD/DVD.&lt;/p&gt;      &lt;p&gt;Espero sea de utilidad,&lt;/p&gt;      &lt;p&gt;Saludos,&lt;/p&gt;      &lt;p&gt;Angel&lt;/p&gt;   &lt;/span&gt;&lt;/span&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clonedrive_5F00_310684D4.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="clonedrive" border="0" alt="clonedrive" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/angelhernandez/clonedrive_5F00_thumb_5F00_45C44388.jpg" width="684" height="366" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661274" width="1" height="1"&gt;</description></item><item><title>Funky behaviour on my Windows Vista x64 while copying files over the network / Funcionamiento curioso de mi Windows Vista x64 mientras copiaba archivos en la red</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/12/funky-behaviour-on-my-windows-vista-x64-while-copying-files-over-the-network-funcionamiento-curioso-de-mi-windows-vista-x64-mientras-copiaba-archivos-en-la-red.aspx</link><pubDate>Mon, 12 Jan 2009 08:13:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661182</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1661182</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1661182</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/12/funky-behaviour-on-my-windows-vista-x64-while-copying-files-over-the-network-funcionamiento-curioso-de-mi-windows-vista-x64-mientras-copiaba-archivos-en-la-red.aspx#comments</comments><description>I&amp;rsquo;m a geek&amp;hellip; I&amp;rsquo;m an early adopter and that&amp;rsquo;s why I keep playing with new technologies&amp;hellip; Windows 7 couldn&amp;rsquo;t escape from this and so last week when I was backing up my laptop I received this funky message while copying...(&lt;a href="http://msmvps.com/blogs/angelhernandez/archive/2009/01/12/funky-behaviour-on-my-windows-vista-x64-while-copying-files-over-the-network-funcionamiento-curioso-de-mi-windows-vista-x64-mientras-copiaba-archivos-en-la-red.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661182" width="1" height="1"&gt;</description></item><item><title>I’ve been re-awarded once again as an MVP / Se me ha renovado el MVP</title><link>http://msmvps.com/blogs/angelhernandez/archive/2009/01/12/i-ve-been-re-awarded-once-again-as-an-mvp-se-me-ha-renovado-el-mvp.aspx</link><pubDate>Mon, 12 Jan 2009 06:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661179</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1661179</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1661179</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2009/01/12/i-ve-been-re-awarded-once-again-as-an-mvp-se-me-ha-renovado-el-mvp.aspx#comments</comments><description>&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;I&amp;rsquo;ve been on holidays for some days until now with limited internet access and I just checked my inbox and I had an email from my MVP Lead Roseanne Stamell telling me that I&amp;rsquo;ve been re-awarded once again. I&amp;rsquo;m really happy about this and I just hope to work harder and better this year. As you all may know now, I moved from Venezuela to Australia last year and it&amp;rsquo;s not as easy as you expect, however, I did my best and I&amp;rsquo;m MVP once again. I must thank God in first place, Community, My MVP Lead and Microsoft Corp.&lt;/p&gt;
&lt;p&gt;Kind regards,&lt;/p&gt;
&lt;p&gt;Angel&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;hr /&gt;
&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:calibri;"&gt;
&lt;p&gt;He estado de vacaciones por unos d&amp;iacute;as hasta ahora con limitado acceso a Internet y acabo de revisar mi correo y ten&amp;iacute;a un mensaje de mi l&amp;iacute;der MVP Roseanne Stamell inform&amp;aacute;ndome que se me ha renovado el reconocimiento de MVP una vez m&amp;aacute;s. Estoy realmente feliz por ello y s&amp;oacute;lo espero trabajar m&amp;aacute;s duro y mejor este a&amp;ntilde;o. Como todos ustedes han de saber ya, me mud&amp;eacute; de Venezuela a Australia el a&amp;ntilde;o pasado y no es tan f&amp;aacute;cil como parece, sin embargo, hice mi mejor esfuerzo y por ello a&amp;uacute;n sigo siendo MVP. Debo agradecer a Dios en primer lugar, la comunidad, mi l&amp;iacute;der MVP y a Microsoft Corp.&lt;/p&gt;
&lt;p&gt;Saludos cordiales,&lt;/p&gt;
&lt;p&gt;Angel&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661179" width="1" height="1"&gt;</description></item><item><title>New stuff coming from Microsoft / Nuevas cosas por venir por parte de Microsoft</title><link>http://msmvps.com/blogs/angelhernandez/archive/2008/11/09/new-stuff-coming-down-the-pipe-from-microsoft-nuevas-cosas-por-venir-por-parte-de-microsoft.aspx</link><pubDate>Sun, 09 Nov 2008 19:54:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653632</guid><dc:creator>AngelHernandez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/rsscomments.aspx?PostID=1653632</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/angelhernandez/commentapi.aspx?PostID=1653632</wfw:comment><comments>http://msmvps.com/blogs/angelhernandez/archive/2008/11/09/new-stuff-coming-down-the-pipe-from-microsoft-nuevas-cosas-por-venir-por-parte-de-microsoft.aspx#comments</comments><description>&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;Hi community, below you can find some pictures and videos from&amp;nbsp;last Thursday (Nov. 6th. 2008) when I attended&amp;nbsp;&amp;nbsp;&lt;a href="http://www.microsoft.com/australia/powertodevelopers/"&gt;&amp;quot;Power to Developers&amp;quot;&lt;/a&gt;&amp;nbsp;event here in Sydney. There are a lot of stuff coming our way such as &lt;a href="http://www.microsoft.com/azure/windowsazure.mspx"&gt;Azure&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.microsoft.com/windows/windows-7/"&gt;Windows 7&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;font-size:small;"&gt;Cheers,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;font-size:small;"&gt;Angel&lt;/span&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;hr /&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:12pt;"&gt;&lt;span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;Hola comunidad, a continuaci&amp;oacute;n encontrar&amp;aacute;n unas fotos y v&amp;iacute;deos del jueves pasado (6 Nov. 2008) cuando atend&amp;iacute; al evento&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.microsoft.com/australia/powertodevelopers/"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&amp;quot;Power to Developers&amp;quot;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&amp;nbsp;ac&amp;aacute; en&amp;nbsp;Sydney. Hay muchas cosas por venir tales como &lt;/span&gt;&lt;a href="http://www.microsoft.com/azure/windowsazure.mspx"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;Azure&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&amp;nbsp;y &lt;/span&gt;&lt;a href="http://www.microsoft.com/windows/windows-7/"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;Windows 7&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;p&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;font-size:small;"&gt;Saludos,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;font-size:small;"&gt;Angel&lt;/span&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&amp;nbsp;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt; &lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;&lt;span style="font-size:small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;p&gt;
&lt;p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;
&lt;p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Calibri;color:#0000ff;"&gt;
&lt;hr /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size:small;"&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pBJ7OqmorgV67KVReuTqo7TG9OWmMuyHJj1Q5Wy8Yi9-fBNR3F3S4cJdsbuDrEs1awh4fdOZlNz0/IMG_0001.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pBJ7OqmorgV7LO6drpPRrVeXiBbzCDZmyk1TIfH586srziBYZaQJS1ec5MI5IgnmuLgQYCE2xUaA/IMG_0004.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pQB1uGVasMuBH_B-EGlw1aB7Top5qTufCqiJn0p8AJcLhVArVHZz_L5lAxr-WxBTM2b0SnQv8kLQ/IMG_0009.JPG" alt="" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pl7m8WZ_j3EFFUKbg2lw4SdXkjjHBhT_MFU5FdF-dHnuD2xOwauLrs66kXXPzDrHDdsL0gN5oyjI/IMG_0012.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pt40Dn3z7eKG7VEIDUYK5Q_BG5JO2piTWMkX6eJz2qkpAIjXopFvrvJ1PhvJZuAHbbSIzTCZoWVw/IMG_0013.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1px5ULbyonj5fC0aulGoURWoc6yAhwtCoL3snA0Yso7vNa9PBosQfeVEI4GDdQZm4iFwRTZuQmNFA/IMG_0015.JPG" alt="" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1p10kMcoSr7fDfEk3ZUVQsrt4vq1qgfGccGLoNf4zgyobdCxhOIhlHDrCOIsKnMyT1Gudor5S3pCU/IMG_0019.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1p10kMcoSr7fDehRQSYrj-xfhNaaUc_HS-KJwat-BYaYZ_aALX4ILiRI2dnPH-82hT9KxcaBNt_uI/IMG_0028.JPG" alt="" /&gt;&amp;nbsp;&lt;img height="150" width="150" src="http://6ckkfa.bay.livefilestore.com/y1pN0OCp2e6m3_EwVE-Fz7CDC1EfZL9he6TB1h9PPrKyTYRg9yFMp-az8iTjxNSDk9rgZsDAtSU-po/IMG_0034.JPG" alt="" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;strong&gt;&lt;em&gt;&lt;span style="text-decoration:underline;"&gt;Videos&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;a href="http://ta7i2q.bay.livefilestore.com/y1p8JS4H3kTaJIT-sjhn2kCUTv1jGbSxS7MXFucTD3Qth0sqGNJSzfPhA0glLryh3wVufx9bobXzcY/1225948054.mov?download"&gt;Steve Ballmer&amp;#39;s Speech&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;a href="http://ta7i2q.bay.livefilestore.com/y1p_Tm_X9jyNX7JbMKgYFKrxNybR7TSx9Xxuc5oEFXegbbRppHDT59hLo3tCe9VxPG_DtO8DQUxCV8/1225954587.mov?download"&gt;Windows Vista (WPF demo apps)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;a href="http://ta7i2q.bay.livefilestore.com/y1p9pOyU67i8zT9IjEpQOceVCNPq_FbR06uZuE0SFfpK1NcktVj_EJA47luqkcSQhjCKPclbmAIkhQ/1225956166.mov?download"&gt;Autodesk demo application (based on WPF)&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;a href="http://www.ajhsis.com/Community/1225951122.mov"&gt;Giampaolo Carraro&amp;#39;s Speech&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;
&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;&lt;span style="color:#0000ff;font-size:12pt;"&gt;&lt;span style="font-family:Calibri;"&gt;
&lt;li&gt;&lt;a href="http://www.ajhsis.com/Community/1225954771.mov"&gt;Windows 7 Sneak Preview&lt;/a&gt;&lt;/li&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653632" width="1" height="1"&gt;</description></item></channel></rss>