<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/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>.NET o no .NET, esa es la cuestión</title><link>http://geeks.ms/blogs/rfog/default.aspx</link><description>Artículos, comentarios, noticias e ideas sobre la programción .NET y nativa, generalmente sobre C++ y C++/CLI, aunque siempre habrá un poco de todo.</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Llamando al API de WinRT desde aplicaciones de escritorio normales en C#</title><link>http://geeks.ms/blogs/rfog/archive/2013/02/02/llamando-al-api-de-winrt-desde-aplicaciones-de-escritorio-normales-en-c.aspx</link><pubDate>Sat, 02 Feb 2013 14:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208467</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=208467</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=208467</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2013/02/02/llamando-al-api-de-winrt-desde-aplicaciones-de-escritorio-normales-en-c.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;span style="color:#ff00ff;"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;strong&gt;&lt;span style="font-family:mceinline;"&gt;NOTA IMPORTANTE:&lt;/span&gt;&lt;/strong&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Esta entrada est&amp;aacute; obsoleta porque lo que describo m&amp;aacute;s abajo no funciona tal y como est&amp;aacute; contado. Es un &lt;i&gt;mea culpa&lt;/i&gt;&amp;nbsp;en toda propiedad por no haber probado antes lo que escrib&amp;iacute;a, pero es que la entrada original es bastante cre&amp;iacute;ble.&lt;/p&gt;
&lt;p align="justify"&gt;Eso me llev&amp;oacute; a crear un nuevo art&amp;iacute;culo, esta vez verificado, que se puede leer aqu&amp;iacute;:&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 class="title"&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/dn126142.aspx"&gt;Llamando al API de WinRT desde aplicaciones de escritorio normales en C#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;******************************************************&lt;/p&gt;
&lt;p align="justify"&gt;El otro d&amp;iacute;a &lt;a href="https://twitter.com/elrfog/status/297107885199093760"&gt;twite&amp;eacute;&lt;/a&gt; un &lt;a href="http://www.hanselman.com/blog/HowToCallWinRTAPIsInWindows8FromCDesktopApplicationsWinRTDiagram.aspx"&gt;enlace&lt;/a&gt; que ten&amp;iacute;a apuntado por ah&amp;iacute; y que no hab&amp;iacute;a le&amp;iacute;do hasta el momento del twitt, como me pasa con una docena m&amp;aacute;s, que tengo en la lista de encontrar tiempo y tranquilidad para leerlos en detalle.&lt;/p&gt;
&lt;p align="justify"&gt;Y como creo que deber&amp;iacute;a estar en castellano, os voy a contar de qu&amp;eacute; va la cosa.&lt;/p&gt;
&lt;p align="justify"&gt;Todos sabemos que ahora hay dos Windows 8. El tradicional de toda la vida y el RT. A ver, son el mismo, pero a la vez diferentes. El RT es la versi&amp;oacute;n para tabletas, que en teor&amp;iacute;a permite desarrollar usando s&amp;oacute;lo un subconjunto de Win32 y de .NET, pese a que por debajo sigue estando el Windows de toda la vida.&lt;/p&gt;
&lt;p align="justify"&gt;La otra versi&amp;oacute;n es la normal, la del escritorio pleno y funcional a la que estamos acostumbrados, que a su vez usa el API tradicional, ya sea el nativo Win32 o el de .NET. &lt;/p&gt;
&lt;p align="justify"&gt;Y si bien est&amp;aacute; prohibido usar el API completo en las aplicaciones RT, lo contrario no es as&amp;iacute; ya que en el escritorio tenemos plena libertad para utilizar cualquier cosa, incluyendo el API de Windows RT. Lo que ocurre es que el soporte directo para ello est&amp;aacute; ausente en las versiones de Visual Studio.&lt;/p&gt;
&lt;p align="justify"&gt;Pero se puede hacer editando el texto plano del fichero de nuestro proyecto: &amp;lt;proyecto&amp;gt;.csproj. Ah&amp;iacute; dentro debemos a&amp;ntilde;adir las l&amp;iacute;neas&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;propertygroup&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;targetplatformversion&amp;gt;8.0&amp;lt;/targetplatformversion&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;lt;/propertygroup&amp;gt;&lt;/p&gt;
&lt;p align="justify"&gt;Y a partir de ah&amp;iacute;, una vez recargado el mismo, podremos usar el API de Windows RT con s&amp;oacute;lo a&amp;ntilde;adir las referencias adecuadas seg&amp;uacute;n se vayan necesitando. El mayor problema es que tenemos que saber cu&amp;aacute;les son y a&amp;ntilde;adirlas a mano.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_14CC9A47.png"&gt;&lt;img height="98" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_thumb_5F00_7AF86417.png" alt="clip_image001" border="0" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" title="clip_image001" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_6C4DB832.jpg"&gt;&lt;img height="141" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_thumb_5F00_5FDF9509.jpg" alt="clip_image003" border="0" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" title="clip_image003" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208467" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+RT/default.aspx">Windows RT</category></item><item><title>Workaround para Windows Phone ListBox/LongListSelector y ScrollIntoView() cuando los elementos tienen diferente tamaño</title><link>http://geeks.ms/blogs/rfog/archive/2013/01/11/workaround-para-windows-phone-listbox-longlistselector-y-scrollintoview-cuando-los-elementos-tienen-diferente-tama-241-o.aspx</link><pubDate>Fri, 11 Jan 2013 13:34:35 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208210</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=208210</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=208210</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2013/01/11/workaround-para-windows-phone-listbox-longlistselector-y-scrollintoview-cuando-los-elementos-tienen-diferente-tama-241-o.aspx#comments</comments><description>&lt;h3 align="justify"&gt;&lt;font style="font-weight:normal;"&gt;En Windows Phone 7.5 hay un bug bastante asqueroso que sólo se presenta cuando quieres mostrar un elemento en un &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ListBox&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; o en un &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;LongListSelector&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; llamando a &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ScrollIntoView()&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; y los elementos contenidos tienen diferentes tamaños. El bug también está presente en Windows Phone 8, pero sólo en el componente &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;ListBox&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt;. &lt;/font&gt;&lt;i&gt;&lt;font style="font-weight:normal;"&gt;LongListSelector&lt;/font&gt;&lt;/i&gt;&lt;font style="font-weight:normal;"&gt; está construido de otra forma y, según Microsoft, ya no presenta el problema.&lt;/font&gt;&lt;/h3&gt;  &lt;p align="justify"&gt;Como es habitual en la empresa, y aparte de ser un problema conocido desde hace tiempo, no se va a solucionar. Personalmente podría entender que no se haga en las versiones actuales ya que requeriría que luego los fabricantes reconstruyeran sus propias plataformas, pero me resulta completamente inaceptable que siga estando en el nuevo Windows Phone 8, y encima conociéndolo de antemano.&lt;/p&gt;  &lt;p align="justify"&gt;En fin, es lo que hay, y encima tampoco existe ningún &lt;i&gt;workaround&lt;/i&gt; oficialmente sancionado para resolver el problema. En otras palabras, si tienes un programa en el que te ocurre eso, básicamente te jodes y bailas.&lt;/p&gt;  &lt;p align="justify"&gt;Pero no, aquí está RFOG que te va a sacar las castañas del fuego. Como sabéis llevo unos meses currando en &lt;a href="https://d.docs.live.net/f1c8bb586bc9f3b9/Blogs/yuilop.com"&gt;Yuilop&lt;/a&gt; para Windows Phone, y también debéis saber que me toca mucho las narices que te digan &lt;i&gt;eso no se puede hacer&lt;/i&gt; y similares. Y por supuesto, a tu jefe tampoco le agrada mucho que le digas: &lt;i&gt;es un bug y no tiene solución&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Para descargo propio he de deciros que la solución es un poco chorra y que sólo había que pensar un poco, pero tenéis que reconocerme que debo de darme algo de bombo y platillo.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, ahora la parte técnica. &lt;/p&gt;  &lt;p align="justify"&gt;En el ejemplo que anexo más abajo, cuando se pulsa el botón de &lt;i&gt;Insert…&lt;/i&gt; se genera un elemento de tres posibles mediante Code Behind. Los tres tienen como elemento base un &lt;i&gt;Grid&lt;/i&gt;, pero el interior es diferente y por tanto su altura. Dos de ellos contienen una imagen y el tercero, un texto. &lt;/p&gt;  &lt;p align="justify"&gt;En cada elemento creado, se llama a &lt;i&gt;ScrollIntoView()&lt;/i&gt; sobre el citado, para que se visualice adecuadamente.&lt;/p&gt;  &lt;p align="justify"&gt;Conforme vamos creando elementos, llega un momento en el que uno de ellos se queda cortado a medias como en la captura:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_69D0AB4B.png"&gt;&lt;img title="clip_image001" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image001" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image001_5F00_thumb_5F00_3D477B65.png" width="132" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;El comportamiento adecuado debería ser que se mostrara completo, mostrando la parte inferior. Ese es el problema: cuando los elementos tienen diferente altura, termina ocurriendo esto mismo. Y según Microsoft, no se va a solucionar. Las apuestas suben cuando hay campos de edición y cambios de orientación: con total seguridad te quedará el elemento cortado.&lt;/p&gt;  &lt;p align="justify"&gt;El código que genera los elementos es:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Button_Tap(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GestureEventArgs e)
        {
            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (s_rnd.Next(0,3))
            {
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 0:
                    var itemText = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemText(&lt;span class="str"&gt;&amp;quot;Hola mundo&amp;quot;&lt;/span&gt;);
                    ListBox.Items.Add(itemText); 
                    ListBox.ScrollIntoView(itemText);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 1:
                    var itemImgBien = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageBien);
                    ListBox.Items.Add(itemImgBien);
                    ListBox.ScrollIntoView(itemImgBien);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 2:
                    var itemImgMal = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageMal);
                    ListBox.Items.Add(itemImgMal);
                    ListBox.ScrollIntoView(itemImgMal);
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            }
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Fijaos en el detalle. Dependiendo de un número aleatorio creamos uno de tres. Eso debería funcionar bien, pero como podéis comprobar vosotros en vuestra casa, no lo hace en el momento en el que empiezan a aparecer elementos con el texto y con una de las dos imágenes.&lt;/p&gt;

&lt;p align="justify"&gt;***&lt;/p&gt;

&lt;p align="justify"&gt;Como ya os he dicho, la solución es bastante sencilla. Os pego el código:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ButtonNoBug_Tap(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, GestureEventArgs e)
        {
            &lt;span class="kwrd"&gt;switch&lt;/span&gt; (s_rnd.Next(0, 3))
            {
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 0:
                    var itemText = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemText(&lt;span class="str"&gt;&amp;quot;Hola mundo&amp;quot;&lt;/span&gt;);
                    ListBox.Items.Add(itemText);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 1:
                    var itemImgBien = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageBien);
                    ListBox.Items.Add(itemImgBien);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
                &lt;span class="kwrd"&gt;case&lt;/span&gt; 2:
                    var itemImgMal = &lt;span class="kwrd"&gt;new&lt;/span&gt; ListBoxItemImage(StaticResources.ImageMal);
                    ListBox.Items.Add(itemImgMal);
                    ForceScrollListBox();
                    &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            }
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Y el truco del almendruco:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ForceScrollListBox()
        {
            var fake = &lt;span class="kwrd"&gt;new&lt;/span&gt; Grid();
            ListBox.Items.Add(fake);
            ListBox.ScrollIntoView(fake);
        }&lt;/pre&gt;


&lt;p align="justify"&gt;Sí, señores. El truco consiste en crear un nuevo elemento del mismo tipo base pero completamente vacío, añadirlo y llamar a &lt;i&gt;ScrollIntoView()&lt;/i&gt; sobre él. El uso de memoria es mínimo porque el componente no debe ocupar muchos bytes ya que está vacío, y tampoco se visualiza, pero en general el sistema &lt;i&gt;empuja&lt;/i&gt; hacia arriba al elemento que queremos mostrar.&lt;/p&gt;

&lt;p align="justify"&gt;No obstante, creo haber detectado que no siempre funciona, al menos en el emulador, pero de momento la gente de QA de &lt;a href="https://d.docs.live.net/f1c8bb586bc9f3b9/Blogs/yuilop.com"&gt;Yuliop&lt;/a&gt; todavía no me ha protestado. [Aplausos de fondo].&lt;/p&gt;

&lt;p align="justify"&gt;En el ejemplo tenéis tres botones. En el primero hacemos inserciones con el bug, en el segundo sin él y con el tercero corregimos si tenemos un elemento a medio mostrar o nos vamos abajo del todo si estamos a medias.&lt;/p&gt;

&lt;p align="justify"&gt;Finalmente, el código fuente de todo esto está aquí: &lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="https://github.com/rfog/InsertInListboxproblem_Solution"&gt;https://github.com/rfog/InsertInListboxproblem_Solution&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Sed buenos y hasta otra.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208210" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Repetid conmigo mil veces:</title><link>http://geeks.ms/blogs/rfog/archive/2012/12/18/repetid-conmigo-mil-veces.aspx</link><pubDate>Tue, 18 Dec 2012 15:26:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207838</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207838</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207838</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/12/18/repetid-conmigo-mil-veces.aspx#comments</comments><description>&lt;p&gt;Los elementos del &lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un &lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con &lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;Los elementos del&amp;nbsp;&lt;i&gt;DataTemplate&lt;/i&gt;&amp;nbsp;en un&amp;nbsp;&lt;i&gt;FrameworkElement&lt;/i&gt;&amp;nbsp;con&amp;nbsp;&lt;i&gt;DataBinding&lt;/i&gt;&amp;nbsp;deben ser propiedades.&lt;/p&gt;
&lt;div&gt;...&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;O en otras palabra, cuando uses el modelo MVVM (al menos en Windows Phone) los elementos de &lt;i&gt;binding&lt;/i&gt;&amp;nbsp;en la plantilla de datos deben ser propiedades aunque sean del tipo gen&amp;eacute;rico.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Es decir en&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ListBox.ItemTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Grid Margin=&amp;quot;10&amp;quot;&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;RowDefinition /&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;RowDefinition /&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Name}&amp;quot; Grid.Row=&amp;quot;0&amp;quot; FontWeight=&amp;quot;Bold&amp;quot; FontSize=&amp;quot;20&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;TextBlock Text=&amp;quot;{Binding Surname}&amp;quot; Grid.Row=&amp;quot;1&amp;quot; FontSize=&amp;quot;10&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox.ItemTemplate&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;tanto Name como Number deben ser propiedades y p&amp;uacute;blicas.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Me da igual si est&amp;aacute; documentado en alg&amp;uacute;n lado o no, pero me ha costado sudores darme cuenta. El objeto que se va a enlazar en la colecci&amp;oacute;n puede ser una clase o una estructura, pero debe ser p&amp;uacute;blica s&amp;iacute; o s&amp;iacute;.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;Ya os imagin&amp;aacute;is por qu&amp;eacute; estoy poniendo esta entrada, &amp;iquest;no? :-P&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207838" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Yoda Code y el Optimizador de .NET</title><link>http://geeks.ms/blogs/rfog/archive/2012/12/08/yoda-code-y-el-optimizador-de-net.aspx</link><pubDate>Sat, 08 Dec 2012 13:09:54 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207734</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207734</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207734</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/12/08/yoda-code-y-el-optimizador-de-net.aspx#comments</comments><description>&lt;p align="justify"&gt;Dicen que a veces la vida te da sorpresas, sorpresas te da la vida. Y en este caso es completamente cierto. A raíz de la &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/12/05/cross-threading-en-mvvm-y-windows-phone-8-y-tambi-233-n-7.aspx"&gt;entrada anterior&lt;/a&gt;, un par de amigos comentaron en &lt;a href="http://https:/twitter.com/Jtorrecilla/status/276305505373282305"&gt;Twitter sobre la misma&lt;/a&gt;, haciendo uno de ellos hincapié en el &lt;i&gt;Yoda Code&lt;/i&gt; que había puesto.&lt;/p&gt;  &lt;p align="justify"&gt;No soy yo muy partidario de &lt;i&gt;Yoda&lt;/i&gt;, más que nada porque todos los lenguajes con los que programo suelen avisarte del uso de un solo igual en las comparaciones, aparte de que, como perteneciente a la vieja escuela, veo raro poner eso al revés. No es que sea gratuito, sino que viene de la forma en que aprendimos los lenguajes.&lt;/p&gt;  &lt;p align="justify"&gt;Digamos que para nosotros, en null==handler, &lt;i&gt;null&lt;/i&gt; es un &lt;i&gt;lvalue&lt;/i&gt; y debe ir a la derecha sí o sí. A ver, que es un poco tontería porque es una comparación, no una asignación, pero así lo veo al menos yo.&lt;/p&gt;  &lt;p align="justify"&gt;Evidentemente no hay nada en contra de utilizar al amigo Yoda (esperemos que Spielberg no se nos enfade y empiece a pedirnos derecho de marca). Simplemente yo lo veo extraño.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Pues nada, el RFOG pone las manos en la masa y decide investigar si hay alguna diferencia en el código generado por el compilador entre ponerlo de una forma u otra. Y ahí es donde se lleva una sorpresa que seguro vosotros tampoco os esperáis (no, no es la que pensáis. Paciencia, joven &lt;i&gt;padawan&lt;/i&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Para ello se crea un proyecto de consola con el siguiente código fuente en C#:&lt;/p&gt;  &lt;div align="justify"&gt;   &lt;pre style="overflow:auto;border-top:#cecece 1px solid;height:418px;border-right:#cecece 1px solid;border-bottom:#cecece 1px solid;padding-bottom:5px;padding-top:5px;padding-left:5px;min-height:40px;border-left:#cecece 1px solid;padding-right:5px;width:491px;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;        {
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            var a = 33;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (40 == a)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;        
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (a == 40)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                Console.WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;        }
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Y en C++ (más bien C, pero a efectos de nuestro interés da igual):&lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre style="overflow:auto;border-top:#cecece 1px solid;height:360px;border-right:#cecece 1px solid;border-bottom:#cecece 1px solid;padding-bottom:5px;padding-top:5px;padding-left:5px;min-height:40px;border-left:#cecece 1px solid;padding-right:5px;width:493px;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;auto&lt;/span&gt; a = 33;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (40 == a)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                printf(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                printf(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;        
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (a == 40)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                printf(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;            &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;                printf(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;			&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 0;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Y finalmente en C++/CLI, más que nada por mor de completitud:&lt;/p&gt;

&lt;div align="justify"&gt;
  &lt;pre style="overflow:auto;border-top:#cecece 1px solid;height:432px;border-right:#cecece 1px solid;border-bottom:#cecece 1px solid;padding-bottom:5px;padding-top:5px;padding-left:5px;min-height:40px;border-left:#cecece 1px solid;padding-right:5px;width:498px;background-color:#fbfbfb;"&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; main(array&amp;lt;System::String ^&amp;gt; ^args)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;{
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;auto&lt;/span&gt; a = 33;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (40 == a)
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;		Console::WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;		Console::WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (a == 40)
&lt;/pre&gt;&lt;pre style="font-size:12px;height:29px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:77.6%;background-color:#fbfbfb;"&gt;		Console::WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es diferente&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;		Console::WriteLine(&amp;quot;&lt;span style="color:#8b0000;"&gt;Es igual&lt;/span&gt;&amp;quot;);
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;	&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; 0;
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;}
&lt;/pre&gt;&lt;pre style="font-size:12px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;margin:0em;width:100%;background-color:#fbfbfb;"&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Si os fijáis, el código es idéntico excepto sus diferencias de sintaxis. Para ver el código resultante, se pone un punto de interrupción en la asignación de la variable &lt;i&gt;a&lt;/i&gt;, se lanza el programa y luego nos vamos a &lt;i&gt;Debug -&amp;gt; Windows -&amp;gt; Disassembly&lt;/i&gt; (o pulsamos Alt-8). Y miramos el código resultante en los tres casos. Primero en Debug y para C#:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_1817F648.png"&gt;&lt;img title="clip_image002" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_thumb_5F00_26FF2562.png" width="166" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Nítido como el agua: tanto monta, monta tanto, a==40 que 40==a. Perfecto. Vamos con C++/CLI:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_7AE22870.png"&gt;&lt;img title="clip_image004" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image004" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_thumb_5F00_5765840B.png" width="193" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Más o menos como en C#, de hecho el código es prácticamente el mismo. Finalmente C++ nativo:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_614A7576.png"&gt;&lt;img title="clip_image006" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image006" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_thumb_5F00_0B69FD92.png" width="196" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Otra vez como lo esperado. Ninguna diferencia en la generación de código en la parte de la comparación. Bueno, no, algo peor porque el código generado en C++ es a todas luces peor que el de C#, cosa que me extraña. Esta es la primera sorpresa, pero todavía hay más.&lt;/p&gt;

&lt;p align="justify"&gt;De todos modos, si te preocupaba la generación de código tanto usando a Yoda como sin usarlo, ves que no hay diferencia.&lt;/p&gt;

&lt;p align="justify"&gt;Aun así, te recomiendo que sigas leyendo. Lo interesante viene ahora.&lt;/p&gt;

&lt;p align="justify"&gt;***&lt;/p&gt;

&lt;p align="justify"&gt;Pasemos a las versiones Release, que se suponen generan mejor código. La versión en C# genera exactamente el mismo código, por lo que realmente el compilador no está haciendo nada de nada. No hace falta que ponga ninguna captura: el código es idéntico.&lt;/p&gt;

&lt;p align="justify"&gt;En C++/CLI ya vemos algo diferente, y es que el breakpoint se ha movido él solo hacia abajo. Eso quiere decir que ha entrado el optimizador de código:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image008_5F00_4916E54E.png"&gt;&lt;img title="clip_image008" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image008" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image008_5F00_thumb_5F00_12C5BD3F.png" width="244" height="201" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;La versión en ensamblador es terroríficamente simple:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image010_5F00_4DACF008.png"&gt;&lt;img title="clip_image010" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image010" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image010_5F00_thumb_5F00_4B8FF13F.png" width="207" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Como el compilador ya sabe el resultado, simplemente ejecuta el código adecuado y punto. El que el primer bloque de ensamblador sea tan largo se debe al prefijo de carga de &lt;i&gt;main&lt;/i&gt;, y ese &lt;i&gt;je 00000015&lt;/i&gt; no es más que la comparación de a con 40, que el optimizador todavía realiza.&lt;/p&gt;

&lt;p align="justify"&gt;¿Por qué lo hace? Buena pregunta: otro hilo podría haber cambiado el valor de a, por lo tanto es necesaria la comparación. Ya sé que en este contexto no es válido, pero en otro sí que podría serlo.&lt;/p&gt;

&lt;p align="justify"&gt;Lo mismo nos pasa con C++ nativo, y ahora sí que vemos cómo el código está más que optimizado y apenas son unas cuantas línea de código ensamblador. La siguiente captura está dedicada a todos aquellos que piensan que no vale la pena desarrollar en C++:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image012_5F00_03623563.png"&gt;&lt;img title="clip_image012" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image012" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image012_5F00_thumb_5F00_19D4D3EA.png" width="244" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;***&lt;/p&gt;

&lt;p align="justify"&gt;Hasta ahora está todo meridianamente claro: No hay diferencia entre ir con Yoda o sin él y que el compilador de C++ es una caña generando código.&lt;/p&gt;

&lt;p align="justify"&gt;¿Estamos todos de acuerdo? Yo al menos lo estaba hasta hace bien poco. Ahora os dedico dos nuevas capturas de pantalla:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image014_5F00_3FCA8440.png"&gt;&lt;img title="clip_image014" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image014" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image014_5F00_thumb_5F00_76C46279.png" width="238" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image016_5F00_43882910.png"&gt;&lt;img title="clip_image016" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image016" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image016_5F00_thumb_5F00_3AB820C4.png" width="244" height="205" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Y este es el bombazo: el código en .NET es casi idéntico al nativo. Cosa que hace unos años no pasaba. ¿Cómo he obtenido esas capturas? Os vais a &lt;i&gt;Tools -&amp;gt; Options -&amp;gt; Debugging -&amp;gt; General -&amp;gt; Supress JIT optimization on module load&lt;/i&gt; y desmarcáis la casilla.&lt;/p&gt;

&lt;p align="justify"&gt;Bueno, el código es &lt;i&gt;casi&lt;/i&gt; tan bueno como el nativo, pero fijaos que es mucho menor que las versiones anteriores. Esto me lleva a confirmar una sospecha: la gente de Microsoft está haciendo bien sus deberes, llevando al compilador de C# a cotas cada vez más altas.&lt;/p&gt;

&lt;p align="justify"&gt;Y es que con los años parece ser que han mejorado mucho:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/05/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de código&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/07/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo-ii.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de Código (II)&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/07/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo-iii.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de Código (III)&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/07/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo-iv.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de Código (IV)&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/17/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo-y-v.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de Código (V)&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/08/21/c-cli-y-c-asombrosas-diferencias-en-el-optimizador-de-c-243-digo-y-vi.aspx"&gt;C++/CLI y C#: Asombrosas diferencias en el optimizador de Código (VI)&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207734" width="1" height="1"&gt;</description></item><item><title>Cross Threading en MVVM y Windows Phone 8 (y también 7)</title><link>http://geeks.ms/blogs/rfog/archive/2012/12/05/cross-threading-en-mvvm-y-windows-phone-8-y-tambi-233-n-7.aspx</link><pubDate>Wed, 05 Dec 2012 10:42:07 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207697</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207697</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207697</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/12/05/cross-threading-en-mvvm-y-windows-phone-8-y-tambi-233-n-7.aspx#comments</comments><description>&lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;Os cuento una rápida que seguro os va a solucionar un montón de quebraderos de cabeza y que me ha traído loco un rato hasta que me he dado cuenta del pufo.&lt;/p&gt;  &lt;p align="justify"&gt;Todo viene cuando estás usando el patrón MVVM y varías algún dato que se está mostrando en algún componente visual. Todos los tutoriales te dicen que heredes de &lt;i&gt;ObservableCollection&lt;/i&gt; y que implementes el método &lt;i&gt;NotifyPropertyChanged()&lt;/i&gt;. Y te ponen el típico ejemplo:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged([CallerMemberName] &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
{
    var handler = PropertyChanged;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;null&lt;/span&gt; != handler)
    {
      handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
    }
}&lt;/pre&gt;


&lt;p align="justify"&gt;Hasta aquí nada extraño. Cuando una propiedad cambia su valor, quien quiera que esté observando tu colección se enterará del mismo y actuará en consecuencia. Eso si alguien está observando tu colección, que no siempre ocurre, sobre todo si hay algún &lt;i&gt;converter&lt;/i&gt; de por medio (ya hablaré largo y tendido sobre esto).&lt;/p&gt;

&lt;p align="justify"&gt;Pero el problema viene cuando ese cambio se produce fuera del hilo principal de la aplicación, como suele pasar a poco que estés haciendo algo medianamente serio. No veo yo bloqueando tu aplicación mientras un servicio web o lo que sea se baja lo que se tenga que bajar, aparte de que en Windows Phone la mayoría de llamadas a todo eso son asíncronas.&lt;/p&gt;

&lt;p align="justify"&gt;Si haces un cambio en un hilo que no sea el de la UI, en Windows Phone 7.5 no pasa nada. Simplemente se ejecuta el código y en general tu colección cambia de valor y a veces, sólo a veces, la visualización cambiará. O no.&lt;/p&gt;

&lt;p align="justify"&gt;En Windows Phone 8 ocurre otra cosa no muy diferente. Recibes dos &lt;i&gt;first chance&lt;/i&gt; de dos excepciones diferentes, el IDE no te captura nada a no ser que cambies la configuración de captura de excepciones y el hilo en el que se esté ejecutando el código se muere silenciosamente. Y por supuesto no se cambia nada en la parte visual de tu aplicación.&lt;/p&gt;

&lt;p align="justify"&gt;Vale. Tonto si no pones un bloque &lt;i&gt;try/catch&lt;/i&gt; en cada hilo. Pero aquí estamos hablando de otro combate.&lt;/p&gt;

&lt;p align="justify"&gt;¿Cómo puñetas puedo actualizar eso de forma automática? Es decir, ¿tengo que hacer un &lt;i&gt;BeginInvoke()&lt;/i&gt; cada vez que asigne algo? La respuesta corta es que sí. La larga es lo siguiente.&lt;/p&gt;

&lt;p align="justify"&gt;Primero tienes que crearte una propiedad nueva en la clase App que vas a llamar &lt;i&gt;UiDispatcher&lt;/i&gt; (o como te salga de los OO):&lt;/p&gt;

&lt;p align="justify"&gt;internal static Dispatcher UiDispatcher=Current.RootVisual.Dispatcher;&lt;/p&gt;

&lt;p align="justify"&gt;Y luego cambia el código de arriba por el siguiente:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; PropertyChangedEventHandler PropertyChanged;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; NotifyPropertyChanged([CallerMemberName] &lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)
        {
            var handler = PropertyChanged;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;null&lt;/span&gt; != handler)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (App.UiDispatcher.CheckAccess())
                    handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName));
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    App.UiDispatcher.BeginInvoke(() =&amp;gt; handler(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyChangedEventArgs(propertyName)));
            }
        }  &lt;/pre&gt;


&lt;p align="justify"&gt;Ahora, si os fijáis, si el cambio de vuestra propiedad se realiza dentro del hilo principal, se llamará directamente, y si lo hace desde otro lo hará dentro del &lt;i&gt;Dispatcher&lt;/i&gt; de la UI.&lt;/p&gt;

&lt;p align="justify"&gt;¿Por qué una propiedad y no llamar siempre a &lt;i&gt;Current.RootVisual.Dispatcher&lt;/i&gt;? Pues porque podría interesarnos tener diferentes &lt;i&gt;dispatchers&lt;/i&gt; para otras cosas, pero esa es otra guerra que hay que combatir en otro momento. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207697" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>ReSharper para Visual Studio</title><link>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx</link><pubDate>Sat, 17 Nov 2012 12:55:10 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207457</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207457</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207457</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx#comments</comments><description>&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Esta es una historia un tanto extraña porque ni en mis más locos sueños hubiera yo decidido usar este complemento en Visual Studio. No porque no me guste la empresa, ni porque piense que el producto sea malo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Simplemente porque no soy yo mucho de añadir complementos a mi herramienta de trabajo más allá de las cosas imprescindibles, más que nada porque los tiempos de carga se alargan en extremo, y la estabilidad de Visual Studio decae en picado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Por ejemplo, si ya la versión 2010 de VS anda algo inestable, con vahídos extraños, cuando le añades el SDK de Windows Phone la cosa empeora y te encuentras con que a veces el compilador se encuentra errores fantasma que sólo él ve, o simplemente el IDE se queda autista.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Añádele alguna herramienta más y eres un firme candidato a lanzar tu ordenador por la ventana y dedicarte a criar setas en el sótano de tu abuelo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Sin embargo Visual Studio 2012 parece más estable, y he estado como dos semanas usándolo sin que hiciera cosas raras, incluso tras añadirle el citado SDK, que es imprescindible para mi en estos momentos.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;De repente a un compañero que trabaja en la aplicación de Java de mi empresa le compraron el &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; y comenzó a comentar las bondades del producto y cómo había pasado de desesperarse y tirarse de los pelos con la cosa esa del Eclipse a tener un IDE en condiciones.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Eso me llevó a recordar que cuando asisto a alguna charla virtual suelen regalar un ReSharper a los asistentes… y una cosa me llevó a la otra, y es que la envidia es tiñosa, y muy mala malosa, y yo soy el peor de todos. Por lo tanto entré en la web de &lt;a href="http://www.jetbrains.com/index.html"&gt;JetBrains&lt;/a&gt; y me bajé el &lt;a href="http://www.jetbrains.com/resharper/"&gt;producto&lt;/a&gt; en su &lt;a href="http://www.jetbrains.com/resharper/download/index.html"&gt;versión demo&lt;/a&gt; de treinta días y…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡¡MADRE DEL AMOR HERMOSO!!&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡Como alguien me quite el producto me lo como con ropa y todo! ¿Cómo he podido vivir yo sin eso?&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;A ver, que no estoy exagerando ni mucho menos. El producto cuesta sus pelas, pero os aseguro que las vale. Ahora que estoy desarrollando en C# porque no tengo más cojones, se me ha hecho prácticamente indispensable y eso que lo llevo usando tan sólo unas dos semanas.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os cuento lo que hace. Y ya me conocéis, que yo no me caso con nadie y no tengo pelos en la lengua.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;ReSharper es una extensión a Visual Studio (creo que soportan todas las versiones del producto desde la 2003 menos las Express). En mi caso lo instalé en mi Visual Studio Ultimate de la MSDN.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo que hace el producto es ayudarte a teclear código, pero a todos los niveles. Hay que verlo para creerlo. Cuando está instalado lo que más llama la atención es que te coloca una tira vertical al lado derecho de la ventana de edición, similar a la de la derecha en donde pones los breakpoints, bookmarks y el IDE te marca el código modificado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;En esa columna te coloca una serie de rayitas horizontales de colorines. Rojo para los errores. Naranja para las mejoras (ahora os cuento), verde para las sugerencias. Creo que hay más colores, pero en este momento no me acuerdo (son las cosas de estar tirado en el sofá tecleando en mi MacBook). Arriba del todo hay una marca global que te dice el &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Cuando posas el ratón sobre la rayita, te dice de qué va la cosa, y si haces clic te lleva al código fuente en cuestión. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Y aquí es donde viene lo interesante. Te ofrece la mejora o la solución, y si le dices que sí, te lo corrige. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pero os aseguro que es algo terrorífico. Hay cosas más o menos chorras, como cambiar un tipo por una variable automática, pero otras dan miedo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Es capaz de cambiar tus bucles for o foreach por sentencias LINQ. Con eso ya os lo he dicho todo. A mi al menos eso me da mucho miedo. Del bueno, ojo. Que coja tres bucles anidados y te los convierta en una sentencia LINQ de una línea me deja embobado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Peor hay más. Simplifica los operadores lambda, te transforma bloques de código en otros menos agresivos con la aplicación, te formatea el código, te ofrece lo que vas a escribir a continuación…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;No sé, cada vez que hago algo nuevo me sorprendo por las posibilidades que te ofrece. Otra de las cosas que me trae loco es que es capaz de eliminar código redundante, como la creación de delegados o la eliminación de código redundante.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os pongo un ejemplo que me dejó todo loco.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Yo solía poner sentencias del tipo:&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(String.Format(“bla bla {0} bla bla {1}”,a.Hola,a.Adios));&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pues bien, él me sugiere&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(“bla bla {0} bla bla {1}”,a.Hola,a.Adios);&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Vale. Tú lo sabes. Yo no lo sabía hasta que no me lo ofreció ReSharper. Y así con muchas cosas más, pero lo que de verdad me admira son las transformaciones a LINQ y viceversa. No me canso de repetirlo. Bucles a LINQ. Bucles a LINQ.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene soporte en XAML. Es decir, editar XAML pasa de ser una pesadilla a ser bastante mejor. Si tu usas Blend, mejor para ti. Yo la última vez que intenté hacer algo con el producto terminé hasta la coronilla. Entre excepciones y la *** manía de ponerle márgenes hasta a su madre… Pues bien, con ReSharper editar a mano XAML también mejora la cosa.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Refactoring. Todo lo que te puedas imaginar y más. Si añadimos las reglas para estilo de código, te detecta las variables y los métodos que no lo siguen, ofreciéndote cambiarlos si así lo deseas. Y es una cosa a la que vas a decir que sí, porque esas rayitas naranjas no molan nada, y que no te las vea el jefe… :-P&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo dicho, en cuanto te sales de las guías de estilo el producto no solo te lo dice sino que te ofrece la posibilidad de cambiarlo. Por supuesto puedes definir las tuyas, no las que el programa quiera. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Como abras la pantalla de opciones te vas a caer de culo, porque puedes configurar cualquier cosa. Por tener hasta tienes “juegos de configuración”, pudendo cargar la que quieras cuando quieras, por si tienes un proyecto con unas reglas y otro con otras.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene algunas chorradillas (es un decir) interesantes, como que te pinta una raya de color debajo de un número que represente un código ARGB, por poner un ejemplo. Son cosas que no se echan en falta hasta que no las tienen y luego te las quitan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Ya para terminar comentaros los Find Usages. Algo así como Find all references pero con muchos esteroides. Pones el cursor sobre un símbolo, le das a la opción con el botón derecho del ratón y goza. Así he encontrado un par de problemas serios de sincronización que me tenían todo loco, y encima en un rato de nada.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Opciones que no he probado han sido la de limpiar el código de toda la solución de una tacada y otras que seguro se me escapan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Bueno, pues lo dicho, si quieres aumentar tu productividad de forma bastante seria, prueba el producto. Seguro que luego pasas por caja. Y si entráis en la Web de JetBrains podréis ver capturas de pantallas y algún vídeo enseñando lo que es capaz de hacer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207457" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/licencias/default.aspx">licencias</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>Yuliop y Windows Phone 7 SDK: Una introducción</title><link>http://geeks.ms/blogs/rfog/archive/2012/11/01/yuliop-y-windows-phone-7-sdk-una-introducci-243-n.aspx</link><pubDate>Thu, 01 Nov 2012 18:52:42 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207293</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207293</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207293</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/11/01/yuliop-y-windows-phone-7-sdk-una-introducci-243-n.aspx#comments</comments><description>&lt;p align="justify"&gt;Como ya &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/08/26/161-el-rey-ha-muerto-161-viva-el-rey.aspx"&gt;comenté hace algo de tiempo&lt;/a&gt;, he realizado un cambio laboral bastante radical, dejando de lado el desarrollo de sistemas embebidos verticales escritos en C y C++ para subir un paso en el escalón del desarrollo en cuanto a tipos de proyecto. En otras palabras, ahora mi tarea principal es desarrollar con Windows Phone para una &lt;i&gt;startup&lt;/i&gt; llamada &lt;a href="http://yuilop.com/es/"&gt;Yuilop&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;He pasado de ser un desarrollador más o menos versátil a estar no sólo centrado en una plataforma fija, sino en una única aplicación: su cliente de mensajería. Os contaré cómo funciona la cosa.&lt;/p&gt;  &lt;p align="justify"&gt;La aplicación está disponible para la mayoría de teléfonos Android y para iOS, y próximamente habrá una versión para Windows Phone 7.5, la que estoy haciendo yo. Olvidaros de Windows Phone 7.0 porque no tiene sockets y es prácticamente imposible hacer algo ahí. Se podría implementar con BOSH, pero no vale la pena.&lt;/p&gt;  &lt;p align="justify"&gt;Con la aplicación instalada en un teléfono se pueden enviar mensajes de texto, con emoticonos y emojis, de manera similar a como se realiza con otras aplicaciones similares. También puedes enviar fotos y localizaciones. Hasta aquí nada nuevo bajo el sol.&lt;/p&gt;  &lt;p align="justify"&gt;Lo novedoso está en que también puedes hacerlo a gente que no tenga la aplicación. Es decir, puedes &lt;i&gt;chatear&lt;/i&gt; con prácticamente cualquier persona que tenga un móvil a través de SMS. Es decir, tu envías un mensaje de chat y la otra persona recibe un SMS, y justo al revés.&lt;/p&gt;  &lt;p align="justify"&gt;También puedes hablar por teléfono mediante VOIP. Siempre que la otra parte tenga Yuilop instalado podrás hablar con ella de forma gratuita a través de la WiFi o del 3G, sin gastar una llamada de voz tradicional…&lt;/p&gt;  &lt;p align="justify"&gt;No, espera, no. Eso también lo puedes hacer con cualquiera. Incluso con teléfonos fijos. O en otras palabras: no es necesario que la otra persona tenga la aplicación instalada para poder hablar con ella a través de Yuilop. &lt;/p&gt;  &lt;p align="justify"&gt;Todo ello con coste cero. O más bien, pagas la transferencia de datos, el Wifi o el 3G. No pagas ni SMS ni establecimiento de llamada ni a razón del tiempo que estés hablando o chateando o &lt;i&gt;SMSseando&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;¿Cómo puede funcionar algo así? Pues bastante fácil: la aplicación tiene publicidad, y el pulsar en ella, o instalarte aplicaciones recomendadas, o seguir ciertas indicaciones te dan &lt;i&gt;energía&lt;/i&gt;, que es lo que gastas a la hora de hablar o chatear con gente no Yuilop. &lt;/p&gt;  &lt;p align="justify"&gt;Es decir, que cada vez que hagas algo con gente de fuera de la aplicación, gastas &lt;i&gt;energía&lt;/i&gt;. Cada vez que instalas las aplicaciones recomendadas, o haces clic en la publicidad, o chateas con gente Yuilop, obtienes energía. También por invitar a amigos y que estos acepten la invitación.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Como veis resulta algo bastante interesante y más potente que las aplicaciones de la competencia (que no nos dejan nombrar).&lt;/p&gt;  &lt;p align="justify"&gt;Pues bien, el que esto suscribe tiene en un estado bastante avanzado la aplicación para Windows Phone. Dadas las características de este sistema operativo, hay algunas opciones que no van a estar disponibles, no porque no queramos, sino porque no podemos.&lt;/p&gt;  &lt;p align="justify"&gt;Y eso me lleva al tema técnico. Llevo dos meses desarrollando con Visual Studio 2010 y el SDK 7.1. Ha habido momento en los que he estado a punto de renunciar dadas no ya las enormes carencias de la plataforma, sino también la falta de documentación y las inconsistencias y bugs de todo ello.&lt;/p&gt;  &lt;p align="justify"&gt;Y de eso es de lo que voy a hablar próximamente aquí. Primero haré una lista de todos los problemas con los que me he encontrado y la forma que te tenido de solucionarlos cuando he podido hacerlo, que no siempre ha sido así.&lt;/p&gt;  &lt;p align="justify"&gt;Para adelantaros un poco el tema, el modelo MVVM es una mierda limitadísima que sólo permite realizar aplicaciones típicas y sencillas, el acceso a bases de datos es, más que pésimo, limitado e incoherente, y existen ciertas limitaciones incoherentes para realizar algunas tareas. Además, la gestión de eventos es mínima, la creación de controles personalizados deja mucho que desear, así como el API expuesto en relación a los componentes con los que podemos trabajar (y ahí incluyo también el &lt;i&gt;Windows Phone Toolkit&lt;/i&gt; y sus amigos de &lt;i&gt;Coding4Fun&lt;/i&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;Y no, el modelo asíncrono de desarrollo es toda una gozada si no existieran las limitaciones arriba descritas. Los métodos asíncronos, los operadores &lt;i&gt;lambda&lt;/i&gt;, los métodos de extensión (pese a ser aberraciones, ya os contaré) y demás zarandajas son una gozada.&lt;/p&gt;  &lt;p align="justify"&gt;Mejor no hablar de XAML, menuda porquería de implementación aunque la idea esté genial. &lt;/p&gt;  &lt;p align="justify"&gt;Y a todo ello añadimos el hecho de que apenas existe documentación. Mientras que para la explicación de una clase en .NET 3, 3.5 ó 4.0 tienes una explicaciones más que detalladas contándote todo, en Silverlight las páginas están más que peladas. Por no incluir ni siquiera ponen lo imprescindible. Parece que se hayan creado a partir del propio código fuente sin más. Y no, no vale aplicar las explicaciones de una a la otra: simplemente funcionan diferente o el comportamiento no existe.&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, lo dicho, estad atentos que le voy a dar caña a Windows Phone 7.5 (Parece ser que la versión 8 ya es adulta y han añadido cosas muy interesantes. También os contaré dentro de unos meses, cuando empiece con ella).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207293" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>Viendo el código fuente de .NET con Visual Studio 2012</title><link>http://geeks.ms/blogs/rfog/archive/2012/09/15/viendo-el-c-243-digo-fuente-de-net-con-visual-studio-2012.aspx</link><pubDate>Sat, 15 Sep 2012 11:19:14 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206758</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206758</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206758</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/09/15/viendo-el-c-243-digo-fuente-de-net-con-visual-studio-2012.aspx#comments</comments><description>&lt;p&gt;Quien tenga una versión anterior de Visual Studio seguro que sabe que se puede navegar por las tripas de .NET y ver cómo Microsoft ha implementado todo el tema. Pues bien, más o menos a &lt;a href="http://blogs.msdn.com/b/dotnet/archive/2012/08/15/announcing-the-release-of-net-framework-4-5-rtm-product-and-source-code.aspx"&gt;mediados de agosto del corriente&lt;/a&gt; (2012) se anunció la disponibilidad del código fuente de .NET 4.5, lo que nos permite meternos en las tripas del Framework y, lo que es mucho más interesante, mirar cómo funciona todo lo nuevo relacionado con Windows 8.&lt;/p&gt;  &lt;p&gt;El artículo citado da un somero repaso a las novedades no específicas de la biblioteca, entre las que se pueden destacar el añadido de métodos asíncronos en conjunción con las clases de tareas, y que ahora el &lt;i&gt;jitter&lt;/i&gt; es capaz de optimizar el código para los procesadores multinúcleo. También se mejora el rendimiento de casi todo (como siempre dicen, lo que a veces no es cierto), y se potencia el acceso de .NET a nueva parte nativa de Windows 8 (o RT o Metro o como quieras llamarlo), que es código nativo escrito en C++ y C++/CX, permitiendo a este lenguaje acceder, también, a código escrito en otros lenguajes .NET gracias a su parte CX (que como ya he dicho varias veces, es nativa).&lt;/p&gt;  &lt;p&gt;Como en otras versiones, el código fuente está disponible para &lt;a href="http://referencesource.microsoft.com/netframework.aspx"&gt;descarga directa&lt;/a&gt;, o para ser visto desde nuestro propio código, y también como símbolos de depuración.&lt;/p&gt;  &lt;p&gt;La captura de abajo nos muestra una aplicación Metro por defecto, detenida en un punto de interrupción, tal y como se ve en mi Visual Studio 2012 sin cambiar la configuración por defecto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_2B0EE603.jpg"&gt;&lt;img title="clip_image002" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_thumb_5F00_084DAE46.jpg" width="244" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fijaos en que la ventana de &lt;i&gt;Call Stack&lt;/i&gt; estgá prácticamente vacía, y si hacemos &lt;i&gt;Step Into&lt;/i&gt; simplemente saltamos a la siguiente línea de nuestro código fuente.&lt;/p&gt;  &lt;p&gt;Vamos a habilitar la posibilidad de meternos dentro del código de Microsoft.&lt;/p&gt;  &lt;p&gt;Nos vamos a TOOLS -&amp;gt; PROPERTIES, abrimos la pestaña lateral de &lt;i&gt;Debugging&lt;/i&gt;, y cambiamos las siguientes opciones:&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable Just My Code&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable .NET Framework source stepping&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Desmarcar &lt;i&gt;Step over porperties and operators (Managed only)&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Marcar &lt;i&gt;Enable source server support&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;· Desmarcar &lt;i&gt;Require source files to exactly match the original version&lt;/i&gt;.&lt;/p&gt;  &lt;p&gt;Dejadlo todo más o menos como en la imagen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_0A1E040D.png"&gt;&lt;img title="clip_image003" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image003" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image003_5F00_thumb_5F00_675CCC4F.png" width="244" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahora, en la pestaña de &lt;i&gt;Symbols&lt;/i&gt;, hay que añadir una nueva dirección de descarga de los mismos: &lt;a href="http://referencesource.microsoft.com/symbols"&gt;http://referencesource.microsoft.com/symbols&lt;/a&gt;. Como en la capura.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_0BF0EA85.png"&gt;&lt;img title="clip_image004" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;margin:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image004" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_thumb_5F00_1DD00F03.png" width="244" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Finalmente, cuando le deis a OK el IDE se quedará bajando ficheros. Hay que esperar a que termine, y dependiendo de lo rápida que sea tu conexión, tendrás que esperar bastante tiempo.&lt;/p&gt;  &lt;p&gt;Con esta configuración, cada vez que se necesite algo, el IDE irá a los servidores de Microsoft, por lo que la carga y depuración de vuestro programa podría ser muy lenta a veces… por lo que se pueden bajar todos los símbolos de una tacada e instalarlos de forma local, apuntando la URL anterior a done los hayamos instalado. Podéis bajarlos de &lt;a href="http://referencesource.microsoft.com/netframework.aspx"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;La siguiente captura muestra algo de las tripas de Metro:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_2D0677D0.jpg"&gt;&lt;img title="clip_image006" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="clip_image006" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_thumb_5F00_25E9CC09.jpg" width="244" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Vale. Ahora el tío de la rebaja. ¿Habéis intentado profundizar en el código fuente, en métodos como el &lt;i&gt;Activate()&lt;/i&gt; de la primera captura? No entra, ¿verdad? No muestra código fuente, sino que simplemente salta sobre la llamada.&lt;/p&gt;  &lt;p&gt;Un gallinfante a quien adivine por qué es. &lt;/p&gt;  &lt;p&gt;Vale: es código nativo. Es decir, la parte Metro del .NET Framework no es código manejado, sino nativo. Es decir, está escrita en C++/CX, en donde la parte CX actúa como &lt;i&gt;Sugar Syntax&lt;/i&gt; de todo el perifostio COM y COM+ que finalmente es .NET&lt;/p&gt;  &lt;p&gt;Y todavía me atrevería a añadir algo más. Metro esconde en la manga algunos trucos de desarrollo que a MS no le interesa que se sepan, y ya visteis &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/06/05/ingenier-237-a-inversa-de-una-aplicaci-243-n-metro-m-225-s-f-225-cil-que-nunca.aspx"&gt;lo fácil que es hacer ingeniería inversa de una aplicación .NET&lt;/a&gt;. Si toda esa parte hubiera estado hecha con .NET, sería facilísimo meterle mano.&lt;/p&gt;  &lt;p&gt;¡Y qué cojones, donde esté C++ que se quite cualquier lenguajucho de mala muerte! ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206758" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>No puedo editar las propiedades en XAML ("Property editing not available")</title><link>http://geeks.ms/blogs/rfog/archive/2012/09/11/no-puedo-editar-las-propiedades-en-xaml-quot-quot-property-editing-not-available-quot.aspx</link><pubDate>Tue, 11 Sep 2012 09:55:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206705</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206705</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206705</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/09/11/no-puedo-editar-las-propiedades-en-xaml-quot-quot-property-editing-not-available-quot.aspx#comments</comments><description>&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Ayer me pas&amp;oacute; algo muy curioso con Visual Studio 2010SP1, y es que, de repente, el editor XAML se qued&amp;oacute; tonto del todo y la ventana para editar las propiedades dijo que &amp;ldquo;&lt;em&gt;Property editing not available&lt;/em&gt;&amp;rdquo;&amp;hellip; y ah&amp;iacute; se qued&amp;oacute; el jod&amp;iacute;o, ense&amp;ntilde;ando ese texto y nada m&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Y no, no estaba experimentando ni haciendo ninguna guarrer&amp;iacute;a con el editor. De hecho estaba tecleando c&amp;oacute;digo en un &lt;em&gt;BackgroundWorker&lt;/em&gt; que nada tiene que ver con la interfaz, y menos con la ventana (perd&amp;oacute;n, &lt;em&gt;Page&lt;/em&gt;, que ahora ando con esto del Windows Phone) que fall&amp;oacute;.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;La cosa era muy curiosa, porque el editor XAML funcionaba bien, y si dejabas caer alg&amp;uacute;n componente sobre la ventana este se a&amp;ntilde;ad&amp;iacute;a sin problemas. Lo que no funcionaba era la ventana de propiedades.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;En &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/513755/property-editing-not-available-when-editing-xaml-of-silverlight-business-application-in-vb-net"&gt;&lt;em&gt;Connect&lt;/em&gt; hay recogido un bug&lt;/a&gt; que se supone fue solucionado en la RTM, pero yo acabo de comprobar que no ha sido as&amp;iacute;. Quiz&amp;aacute;s hayan rebajado un poco la incidencia, pero sigue ah&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;De nuevo quiero reiterar que no toqu&amp;eacute; nada. Estaba en una ventana editando c&amp;oacute;digo e hice clic sobre la que mostraba el &lt;em&gt;Page&lt;/em&gt;, dividida entre XAML y parte visual. Al redibujarse, el &lt;em&gt;Page&lt;/em&gt; dio un salto &amp;eacute;l solo, pasando de 80% a 100% y todo dej&amp;oacute; de funcionar.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;En el citado enlace se dan varias soluciones, que a mi no me funcionaron. Incluso cerr&amp;eacute; y abr&amp;iacute; el IDE, recompil&amp;eacute;, volv&amp;iacute; a abrir todas las ventanas&amp;hellip; Nada.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Lo &amp;uacute;nico que solvent&amp;oacute; el tema fue limpiar la soluci&amp;oacute;n, cerrando el IDE inmediatamente despu&amp;eacute;s. Al abrirlo de nuevo, aparecieron un par de &lt;em&gt;warnings&lt;/em&gt; y &lt;em&gt;errores&lt;/em&gt; sin mucho sentido en relaci&amp;oacute;n a dicho &lt;em&gt;Page&lt;/em&gt;. Una vez reconstruida la soluci&amp;oacute;n, todo volvi&amp;oacute; a la normalidad.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;"&gt;Lo dicho, aviso para navegantes y c&amp;oacute;mo lo solucion&amp;eacute; yo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206705" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>¡El rey ha muerto! ¡Viva el rey!</title><link>http://geeks.ms/blogs/rfog/archive/2012/08/26/161-el-rey-ha-muerto-161-viva-el-rey.aspx</link><pubDate>Sun, 26 Aug 2012 14:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206554</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206554</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206554</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/08/26/161-el-rey-ha-muerto-161-viva-el-rey.aspx#comments</comments><description>&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Bueno, como resulta m&amp;aacute;s que evidente, este blog anda as&amp;iacute; como un poco parado, y cuando escribo algo para &amp;eacute;l, suelo hablar de cualquier cosa excepto de tecnolog&amp;iacute;as Microsoft y Windows.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Como bien sab&amp;eacute;is, en principio pas&amp;eacute; una etapa de bastante inestabilidad &lt;em&gt;inform&amp;aacute;tica&lt;/em&gt;, con mi conversi&amp;oacute;n a Apple que al final se ha quedado al 50% ya que hay muchas cosas que no me terminan de convencer. Es decir, suelo usar OS X y mi iPad para las tareas normales, pero aun as&amp;iacute; conservo varias m&amp;aacute;quinas virtuales Windows&amp;nbsp; e incluso arranque dual con Windows gracias a &lt;em&gt;Boot Camp&lt;/em&gt;. De hecho estoy escribiendo esto en un MacBook Pro Retina Display, ah&amp;iacute; es nada. Pese a todas las pifias de Apple, hay muchas cosas en las que son inigualables. Y punto.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;De programar, mejor no hablamos. Alguna cosilla he hecho en QT para MAC y para Windows, pero nada serio y siempre para consumo propio.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Despu&amp;eacute;s de aquello, o m&amp;aacute;s bien durante, dej&amp;eacute; de trabajar, m&amp;aacute;s o menos a finales de marzo. Ya estaba cansado del sector, mucho ruido y pocas nueces, un &amp;aacute;rea que cada vez va perdiendo m&amp;aacute;s y m&amp;aacute;s ventas y productos por la sempiterna falta de actualizarse cuando ves al lobo venir. A efectos pr&amp;aacute;cticos la empresa cerr&amp;oacute; en Espa&amp;ntilde;a a la vez que las de otros pa&amp;iacute;ses pasaban de un grupo inversor a otro.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Lo curioso con la espa&amp;ntilde;ola es que &lt;em&gt;el cierre&lt;/em&gt; se produjo una semana despu&amp;eacute;s de la reforma laboral que permit&amp;iacute;a hacer eso sin pasar por el control del Estado, estos politicastros nuestros de mierda sabr&amp;aacute;n qu&amp;eacute; est&amp;aacute;n haciendo con el pa&amp;iacute;s.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;A mi me dan ganas de largarme a otro lugar, pero como dice el refr&amp;aacute;n, no hay mal que por bien no venga. Justo antes de todo esto, comenc&amp;eacute; conversaciones con una Start Up que han llegado a buen puerto.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Entre medias, unos meses de descanso y desintoxicaci&amp;oacute;n &lt;em&gt;program&amp;aacute;tica&lt;/em&gt;, con d&amp;iacute;as dedicados a estar tumbado a la bartola o simplemente a leer sin m&amp;aacute;s.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Tambi&amp;eacute;n han ocurrido otras cosas muy interesantes para mi. Con pareja parece ser que afianzada, todo empez&amp;oacute; m&amp;aacute;s o menos en el mismo punto en el que todo termin&amp;oacute;. Me refiero a cerrar una etapa y a abrir otra nueva.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Chica nueva (aunque antes no hab&amp;iacute;a ninguna). Casa nueva (aqu&amp;iacute; s&amp;iacute;, s&amp;iacute; que ten&amp;iacute;a casa). Trabajo nuevo. Y entre medias, unos mesecitos para afianzarlo todo.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Cerramos etapa dedicada a la programaci&amp;oacute;n de hardware, muchas veces &lt;em&gt;a pelo&lt;/em&gt;, sin sistema operativo y justo encima del hardware, con peque&amp;ntilde;as aplicaciones bajo Windows para apoyarlo, todo ello mayormente escrito en C, C++ y a veces C#.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Y abrimos una nueva, plenamente orientada hacia tecnolog&amp;iacute;as Microsoft, en concreto Windows Phone, y en un futuro Windows RT y sus tabletas.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;Eso quiere decir que, si las fuerzas nos acompa&amp;ntilde;an, volveremos aqu&amp;iacute;, hablando sobre Windows Phone (que por cierto, para aquellos que me comentaron tiempo ha, no es tan &lt;em&gt;obtuso&lt;/em&gt; de programar ni mucho menos), C# y tecnolog&amp;iacute;as anexas.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-size:14px;font-family:Cochin;"&gt;&lt;span style="font-family:mceinline;"&gt;As&amp;iacute; que afilad los ratones.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206554" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>QT: QFileSystemModel: actualizando rutas (BUG)</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/11/qt-qfilesystemmodel-actualizando-rutas-bug.aspx</link><pubDate>Wed, 11 Jul 2012 08:03:09 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206045</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206045</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206045</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/11/qt-qfilesystemmodel-actualizando-rutas-bug.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ya me extrañaba a mi que no me encontrara, tarde o temprano, con algún tipo de bug en esto del QT. Además, se trata de un bug bastante serio y que, según he leído por ahí, lleva sin solucionar desde que se creó la citada clase, allá por la versión 4.4 o así. Y estamos en la 4.8, varios años después.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Os comento. &lt;em&gt;QFileSystemViewer &lt;/em&gt;es la parte &lt;em&gt;documento&lt;/em&gt; del modelo documento/vista para trabajar sobre el sistema de ficheros. Como ya vimos ayer, si queremos conectarlo a una parte visual, llamamos al &lt;em&gt;setModel()&lt;/em&gt; de la parte visual pasándole un puntero al documento.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo cierto es que en QT esta arquitectura es mucho más sencilla de entender y manejar que la de, por ejemplo, MFC.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero ¿qué ocurre cuando se crea o  modifica un fichero? En principio, debería existir alguna forma de comunicar a &lt;em&gt;QFileSystemViewer&lt;/em&gt; ese hecho. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;No la hay. La primera en la frente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En cierta medida, esto viene &lt;em&gt;solucionado&lt;/em&gt; de aquélla manera. La vista tiene un método para indicarle al documento (???) que monitorice una ruta. Supongo que se le dirá a la vista porque también sirve para indicar que esa es la ruta &lt;em&gt;padre&lt;/em&gt; a partir de la cual no se puede descender.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ciertamente es bastante barroco. ¿Por qué no hacerlo con el documento, ya que es el que realmente mantiene el tema de los archivos? El único &lt;em&gt;handicap &lt;/em&gt;es que un sólo objeto del tipo &lt;em&gt;QFileSystemViewer&lt;/em&gt; podría servirnos para muchas vistas diferentes, pero con crearnos varios objetos… Además, si queremos diferentes vistas de un mismo documento, este documento ha de ser idéntico para todas ellas, por lo que la idea de un solo documento para todo no nos vale. Simplemente no lo entiendo y punto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El bug. A ver, cuando uno llama a &lt;em&gt;setRootIndex()&lt;/em&gt; pasándole un contexto a una ruta, la vista no descenderá de ese punto, y el documento instala un &lt;em&gt;QFileSystemWatcher&lt;/em&gt; que monitorizará esa carpeta y actualizará la vista en consecuencia. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Así es cómo funcionan mantener y leer las actualizaciones de ficheros. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El problema es que no funciona. Da igual que crees una nueva carpeta o un fichero, el sistema no se entera de la actualización. Y como no hay forma de indicarle que el sistema de ficheros ha cambiado…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La solución. Es un poco barroca (y lenta), pero es que no me ha funcionado ninguna de las otras soluciones encontradas en internet.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tenemos que cambiar la ruta de monitoreo a una que no nos interese y de nuevo a la que nos interese. Algo así:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;color:#008d14;"&gt;//The only way I&amp;#39;ve found to refresh after some update&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;QFileSystemModel *pModel=&lt;span style="color:#103ffb;"&gt;static_cast&lt;/span&gt;&amp;lt;QFileSystemModel *&amp;gt;(ui.listView-&amp;gt;model());&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;pModel-&amp;gt;setRootPath(m_ruta+&lt;span style="color:#b22822;"&gt;”..”&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;pModel-&amp;gt;setRootPath(m_ruta);&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;pModel-&amp;gt;sort(0);&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El programa se queda como autista cosa de un segundo y la vista o vistas quedan actualizadas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto me ocurre en una unidad de red montada mediante la compartición de carpetas de vmWare Fusion, por lo que el problema también podría estar en la capa del OS X, la del vmWare y la de red del propio Windows, pero el tema es que no funciona.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra cosa que he vi ayer, fue que, tras unas cinco horas de trabajar con el escenario mixto de máquina virtual Windows sobre OS X, ésta se fue volviendo cada vez más lenta hasta ir arrastrándose… Ignoro a qué se debe, así que hoy estaré más atento. De momento ya he visto que, tras lanzar un programa escrito con QT, la memoria no recupera unos 200 megas. Espero que sean cachés y no otras cosas más indefinibles.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206045" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category></item><item><title>QT: QFileSystemViewer a partir de una ruta</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/10/qt-qsystemfileviewer-a-partir-de-una-ruta.aspx</link><pubDate>Tue, 10 Jul 2012 15:59:41 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206036</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=206036</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=206036</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/10/qt-qsystemfileviewer-a-partir-de-una-ruta.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto es un “truco” que he encontrado de refilón y lo voy a anotar aquí para que no se me olvide y para goce y disfrute de quien me lea.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es utilizar el modelo documento/vista de QT para navegar a través del sistema de ficheros, pero solo a partir de una ruta en concreto. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si lo utilizamos conforme a la documentación, el árbol de ficheros se verá completo, con todas nuestras carpetas y ficheros. Nosotros queremos que la raíz del árbol sea una ruta cualquiera.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;QFileSystemModel *model=&lt;span style="color:#103ffb;"&gt;new&lt;/span&gt; QFileSystemModel;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;QModelIndex index=model-&amp;gt;setRootPath(“ruta_a_limitar”);&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;ui-&amp;gt;treeView-&amp;gt;setModel(model);&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;"&gt;ui-&amp;gt;treeView-&amp;gt;setRootIndex(index);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:9.5px Consolas;min-height:11.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En donde  &lt;em&gt;treeView  &lt;/em&gt;es un QTreeView.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206036" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category></item><item><title>Compilar wxWidgets en mac</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/04/compilar-wxwidgets-en-mac.aspx</link><pubDate>Wed, 04 Jul 2012 11:24:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205970</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205970</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205970</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/04/compilar-wxwidgets-en-mac.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx"&gt;Dec&amp;iacute;a aye&lt;/a&gt;r que &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt; podr&amp;iacute;a ser una buena herramienta para desarrollar aplicaciones multiplataforma a partir de un &amp;uacute;nico c&amp;oacute;digo fuente, quiz&amp;aacute;s incluso mejor que QT ya que utiliza los controles nativos all&amp;iacute; donde los haya.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets es muy similar a MFC en cuanto a jerarqu&amp;iacute;a de clases y a &amp;ldquo;concepto&amp;rdquo;, y de hecho el paso de una tecnolog&amp;iacute;a a la otra es mucho menos traum&amp;aacute;tico que el paso, por ejemplo a QT. De wxWidgets se han dicho muchas cosas negativas. Que si no soporta excepciones, que si ocupa mucho tama&amp;ntilde;o, que si es muy complicada, y en general que tiene una arquitectura obsoleta.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Personalmente creo que ninguna de esas cosas es cierta, no al menos en el sentido en que se dice. Ciertamente su jerarqu&amp;iacute;a de clases no tiene excepciones, pero nadie impide que las uses en tu c&amp;oacute;digo. Otra ventaja es que su API es gen&amp;eacute;rica para todas las plataformas, y que tiene un mont&amp;oacute;n de clases de soporte que nos evitan la compilaci&amp;oacute;n condicional.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por ejemplo, tenemos soporte directo para impresi&amp;oacute;n, depuraci&amp;oacute;n, bases de datos, modelo documento/vista, arrastrar y soltar, ficheros de configuraci&amp;oacute;n, sincronizaci&amp;oacute;n y threads, protocolos de red, OpenGL y hasta para la creaci&amp;oacute;n de diagramas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte existen varias &lt;a href="http://wiki.wxwidgets.org/Tools"&gt;herramientas de soporte&lt;/a&gt;, algunas de ellas realmente buenas aunque sean de pago. El problema es que s&amp;oacute;lo est&amp;aacute;n disponibles para Windows, y tendremos que tener la cl&amp;aacute;sica soluci&amp;oacute;n de una m&amp;aacute;quina virtual bajo OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica pega para desarrollar bajo MAC es que, hasta hace bien poco, el Framework estaba basado en Carbon (ya sab&amp;eacute;is, el API de C de OS X que ya est&amp;aacute; obsoleto), pero la &amp;uacute;ltima versi&amp;oacute;n, la 2.9.3 soporta compilar sobre Cocoa y 64 bits sin problema alguno.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra pega es que tenemos que compilarla nosotros, ya que s&amp;oacute;lo se distribuye en c&amp;oacute;digo fuente. Para Windows ya lo&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/01/06/wxwidgets-con-visual-studio-2005.aspx"&gt; expliqu&amp;eacute; hace tiempo&lt;/a&gt;. De todos modos no es muy dif&amp;iacute;cil una vez que has atinado con las opciones adecuadas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo primero es bajarnos el tema, de &lt;a href="http://www.wxwidgets.org/downloads/"&gt;aqu&amp;iacute;&lt;/a&gt;. Os recomiendo que elij&amp;aacute;is la opcion de &amp;ldquo;With Unix line endings (for Unix and OS X). Yo lo he descomprimido en mi HOME, a partir de una carpeta que he llamado &amp;ldquo;wxWidgets&amp;rdquo;. Debemos entrar en ella, y una vez ah&amp;iacute;, como en todo proyecto tipo Unix, configuramos la compilaci&amp;oacute;n:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:14.0px Courier;"&gt;&lt;span style="font:14.0px Calibri;"&gt;.&lt;/span&gt;/configure --with-cocoa --prefix=$HOME/wx --enable-stl --disable-shared --with-macosx-version-min=10.7 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Una vez hayamos terminado, un simple make seguido de otro make install nos dejar&amp;aacute; el sistema listo y en producci&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Fijaos en las opciones que he elegido. &amp;ldquo;&amp;mdash;With-cocoa&amp;rdquo; hace que se compile con el API de OS X actual, y con la de &amp;ldquo;&amp;mdash;prefix&amp;rdquo; le estamos diciendo que use nuestro HOME para no enmarranar las carpetas del sistema operativo. Esto es muy &amp;uacute;til porque si luego queremos desinstalarlo tendremos problemas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Con &amp;ldquo;&amp;mdash;disable-shared&amp;rdquo; le estamos diciendo que queremos las bibliotecas est&amp;aacute;ticas y no las din&amp;aacute;micas. Si vamos a poner alguna aplicaci&amp;oacute;n en la Tienda, es la mejor opci&amp;oacute;n, ya que nuestro programa ser&amp;aacute; un &amp;uacute;nico ejecutable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y finalmente las dos &amp;uacute;ltimas opciones. Yo he puesto Lion (10.7), pero vosotros pod&amp;eacute;is poner Snow Leopard (10.6). Si os fij&amp;aacute;is, la ruta de los SDK ha cambiado en las &amp;uacute;ltimas versiones de Xcode. Recordadlo para otras ocasiones.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Se me olvidaba comentar que necesitamos instalar las &amp;ldquo;Command Line Tools&amp;rdquo; para poder compilar cualquier cosa desde la consola de comandos. Abrimos Xcode, nos vamos a las Opciones (Command + ;) y las seleccionamos de all&amp;iacute;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205970" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>Multiplataforma de la buena (mismo código fuente)</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx</link><pubDate>Tue, 03 Jul 2012 18:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205955</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205955</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205955</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Antes de empezar, y de que me deis ca&amp;ntilde;a de la buena, quiero decir que todo esto son elucubraciones personales m&amp;iacute;as y que lo m&amp;aacute;s seguro nadie est&amp;eacute; de acuerdo conmigo. Dicho esto, vamos al meollo del asunto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ya sab&amp;eacute;is que me he ido distanciando un poco de la plataforma Windows a la vez que me he acercado a la de Apple sin realizar el cambio total. De Linux no quiero hablar, porque cada vez que tengo que hacer algo con &amp;eacute;l, sudo tinta china y al final, tras muchos cabezazos, suelo terminar desistiendo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo fue compilar el SDK de lector del libros electr&amp;oacute;nicos Boox i62HD. Tras instalar una Debian 6 x86 virtual en vmWare Fusion (el Workstation del MAC) por segunda vez, ya que la primera fall&amp;oacute; estrepitosamente porque el instalador s&amp;iacute; que reconoci&amp;oacute; el discos duro SCSI pero luego el kernel instalado no, fui incapaz de compilarlo.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero me encontr&amp;eacute; con una serie de paquetes que no estaban presentes y que el comprobador del SDK no avis&amp;oacute; que faltaban, lo que te obliga a recorrer la cadena de errores para descubrir que te falta esto o aquello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo, y que todav&amp;iacute;a est&amp;aacute; sin solucionar, es que falta una dependencia en un fichero de proyecto, en concreto incluir &amp;ldquo;-l z&amp;rdquo; en el lugar correcto, que es enlazar con la biblioteca zlib. En mi caso el problema no es saber qu&amp;eacute; falta, sino d&amp;oacute;nde a&amp;ntilde;adirlo. Tras varios intentos infructuosos y muchas p&amp;aacute;ginas de internet le&amp;iacute;das, no consegu&amp;iacute; solucionarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Hab&amp;iacute;a un bug similar si instalabas el SDK en un linux x64, pero el m&amp;iacute;o era x86, y el parche existente intentaba modificar ficheros que no existen (al menos en mi instalaci&amp;oacute;n).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, ni me han hecho ni *** caso ni tampoco lo han solucionado, lo que me lleva a preguntarme c&amp;oacute;mo cojones est&amp;aacute;n programando. Y menos mal que us&amp;eacute; una Debian, que es la misma distribuci&amp;oacute;n que usan los que han creado el SDK, que si llego a instalarme otra cosa&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto es un ejemplo de la desidia reinante en Linux. Lo dije en un foro hace tiempo. Los programadores de linux me parecen muy poco profesionales, tendentes a montar cualquier cosa que les parezca &lt;em&gt;c00l&lt;/em&gt; y luego, cuando viene la hora de la verdad y demostrar que se es un programador con dos cojones, pasan del tema porque eso de solucionar bugs ya no es tan fascinante como lo otro, y encima solventar cualquier cosa son un mont&amp;oacute;n de horas en las que no estamos subiendo nuestra supuesta &lt;em&gt;cach&amp;eacute; c00l&lt;/em&gt; en la comunidad.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de deleznable, me parece una pr&amp;aacute;ctica muy poco seria y que sigue dejando a Linux como lo que es: o bien un juguete para ni&amp;ntilde;os falsamente &lt;em&gt;interesantes&lt;/em&gt;, o bien algo destinado a servidores de bajo coste, y si no contadme c&amp;oacute;mo es el &amp;uacute;nico sistema operativo que ha reventado con el segundo extra a&amp;ntilde;adido hace unos d&amp;iacute;as.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, para mi el desarrollo en Linux queda completamente descartado a corto y largo plazo, por lo menos hasta que se pongan un cohete en el culo, cosa que dudo mucho que ocurra jam&amp;aacute;s (y espero equivocarme).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Luego vino el tema del &lt;em&gt;swtiching&lt;/em&gt;. Lo cierto es que tras el entusiasmo inicial, la cosa deja mucho que desear en cuanto a usabilidad y, s&amp;iacute;, rendimiento. Ya lo he ido comentando por este blog con anterioridad. OS X Lion y Mountain Lion, si los comparamos con XP, son la rehostia, pero comparados con Windows 7 dejan mucho, pero mucho que desear. La usabilidad es p&amp;eacute;sima, aparte de ciertos problemas de ergonom&amp;iacute;a a los que al final uno termina acostumbr&amp;aacute;ndose.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tambi&amp;eacute;n es cierto que cuando le coges el tranquillo ya no hay vuelta atr&amp;aacute;s, m&amp;aacute;s que nada por la integraci&amp;oacute;n de todos los elementos, m&amp;aacute;s todav&amp;iacute;a si tienes un iPad o un iPhone. Puedes conseguir casi lo mismo en Windows, pero no de forma tan integrada ni coherente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Respecto al rendimiento, dir&amp;eacute; que por fin tengo un MAC que funciona como yo quiero, tras gastarme m&amp;aacute;s de 300 euros en a&amp;ntilde;adirle un segundo disco SSD al iMac de 27&amp;rdquo;. Es decir, en este momento mi m&amp;aacute;quina principal es un iMac de mediados del 2011 con un i7 a 3.4 GHz, un disco SSD de 256GB como disco de sistema para el OS X y uno de 1TB como secundario para datos. En este momento el disco FireWire de 2TB que usaba como secundario lo tengo como copia de Time Machine y, aparte de que arranca en 8 segundos (antes tardaba m&amp;aacute;s de dos minutos y el disco segu&amp;iacute;a rascando hasta casi los diez), s&amp;oacute;lo veo la roseta multicolor de la muerte cuando se para el disco mec&amp;aacute;nico y tiene que arrancar. Adem&amp;aacute;s, la carga de aplicaciones, incluso las pesadas como Pages o Word, es pr&amp;aacute;cticamente instant&amp;aacute;nea.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y justo ahora, mientras escribo esto en Scrivener, tengo abierta una m&amp;aacute;quina virtual en Unity con Windows 7 x86 en la que se est&amp;aacute; instalando el SP1 de Visual Studio 2010 porque he instalado el AtmelStudio, que es un IDE basado en el Microsoft para generar ejecutables para los microprocesadores de Atmel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Acabo de hacer una pausa para lanzar el JTAG MK-II, conectarlo a Windows y verificar que el AtmelStudio lo reconoce y funciona, todo ello virtualizado. Que es una de las cosas a las que quer&amp;iacute;a llegar. Con un buen producto de virtualizaci&amp;oacute;n, uno puede tener lo mejor de ambos mundos. Un equipo silencioso a m&amp;aacute;s no poder que ejecuta de forma transparente tanto aplicaciones Windows como OS X sin mayor complicaci&amp;oacute;n que molestarse un poco en configurar las cosas, y encima con un rendimiento equivalente a si se ejecutara en real.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Evidentemente tenemos BootCamp, pero os aseguro que Windows no funciona igual que en un PC real, y perdemos todas las cosas buenas que puedes hacer con un MAC.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no es a eso a lo que me refiero. M&amp;aacute;s bien todo esto es una especie de parche o pegote. De lo que realmente quiero hablar es de desarrollar para al menos Windows y MAC sin tener que crear dos programas diferentes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Descartamos de entrada que un mismo ejecutable pueda funcionar en ambas plataformas. Por parte de los dos contendientes queda descartado. Microsoft podr&amp;iacute;a haber hecho .NET para OS X o Apple Cocoa para Windows, pero no creo que eso vaya a ocurrir nunca jam&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica posible soluci&amp;oacute;n es Mono, pero ignoro sin un EXE de Windows se lanzar&amp;aacute; en un MAC o no, y lo voy a descartar por razonamientos que expondr&amp;eacute; m&amp;aacute;s adelante.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, la otra posible soluci&amp;oacute;n es compatibilidad en el c&amp;oacute;digo fuente. Que yo conozca, s&amp;oacute;lo tenemos dos grandes contendientes: QT y lo que ahora es Embarcadero pero que todos conocemos como Delphi y/o C++Builder.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;De QT he hablado ya por aqu&amp;iacute;, pero no como plataforma cruzada. He estado us&amp;aacute;ndolo un poco, en un proyecto en donde trabajaba, pero s&amp;oacute;lo para generar aplicaciones Windows.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En principio QT es multiplataforma si no te sales del propio Framework, y de hecho he podido compilar un mismo c&amp;oacute;digo fuente en ambas plataformas sin m&amp;aacute;s que compilar o bien desde Windows o bien desde OS X. Hay que tener mucho cuidado y usar el propio Creator de QT, y todos los ficheros servir&amp;aacute;n sin problema. Eso s&amp;iacute;, necesitas dos ordenadores, uno para cada plataforma. Tres si quieres tambi&amp;eacute;n Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto nos trae a lo que hemos tratado antes. Como no es posible ejecutar OS X desde una m&amp;aacute;quina Windows (no sin violar licencias y sin &lt;em&gt;hacks&lt;/em&gt; y sin limitaciones y fallos aleatorios), la &amp;uacute;nica soluci&amp;oacute;n es tener un MAC m&amp;aacute;s o menos potente y usar un Windows virtualizado, compartiendo la carpeta de desarrollo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso, pese a no estar haciendo nada m&amp;aacute;s que estudiar ahora que estoy en paro y tengo tiempo para &lt;em&gt;jugar&lt;/em&gt; con todo esto, tengo una carpeta en donde est&amp;aacute; todo mi c&amp;oacute;digo fuente, carpeta que est&amp;aacute; compartida con SkyDrive y de ese modo puedo verla tambi&amp;eacute;n en mi ordenador Windows (no el virtualizado), aparte de hacer copia de seguridad de forma autom&amp;aacute;tica.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ojo con sincronizar mediante SkyDrive entre real y virtual, porque el tema no es instant&amp;aacute;neo y puedes armar un buen jaleo. La soluci&amp;oacute;n es compartir una carpeta de tu MAC en tu Windows virtual. Con Fusion la cosa funciona muy bien, y hasta Embarcadero ha solucionado los problemas que ten&amp;iacute;a para compilar sobre carpetas de red (Microsoft siempre lo ha tenido resuelto, incluso dando la posibilidad de cachear localmente los ficheros intermedios).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si nos damos cuenta, con QT tenemos que compilar y ejecutar en cada m&amp;aacute;quina, lo que en principio no es un gran problema, pero s&amp;iacute; cuando quieres algo que no est&amp;aacute; en el Framework. Ah&amp;iacute; si que tienes que, mediante compilaci&amp;oacute;n condicional, sacarte tu mismo las casta&amp;ntilde;as del fuego. Dada mi escasa experiencia con QT multiplataforma, no puedo asegurar si es algo muy habitual o no.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro participante es Embarcadero, con su FireMonkey bajo Delphi/C++ Builder. La historia de todo esto es un poco rocambolesca, ya que la empresa ha llevado muchos a&amp;ntilde;os implementando compilaci&amp;oacute;n condicional en su VCL. S&amp;oacute;lo hay que mirar el c&amp;oacute;digo fuente de cualquier versi&amp;oacute;n (creo que desde la 2009) y ver c&amp;oacute;mo muchos ficheros tienen secciones para Windows, MAC y Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Uno, por tanto, se esperaba que cualquier d&amp;iacute;a anunciaran que la VCL se hab&amp;iacute;a convertido en multiplataforma y que se podr&amp;iacute;a compilar para estos tres sistemas operativos.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no, Embarcadero compr&amp;oacute; un producto a medio hacer y en seis meses lo transform&amp;oacute; en su FireMonkey, que anunci&amp;oacute; a bombo y platillo con su nueva versi&amp;oacute;n de RAD Studio XE2. Que por cierto se encuentra completamente lleno de bugs y no hay entrada de blog explicando esta o aquella caracter&amp;iacute;stica que no hable de que hay un problema y que han tenido de resolverlo de alguna manera. Y es que seis meses es muy poco tiempo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey es una gran idea implementada muy pobremente. La idea es usar el IDE de Delphi o de C++ Builder para, a partir de un mismo c&amp;oacute;digo fuente, generar un ejecutable Windows o MAC, pero siempre desde Windows, por lo que estamos ante el mismo problema que antes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja aqu&amp;iacute; es que puedes hacerlo todo desde Windows, hasta depurar. Es decir, es necesario instalar un servidor en el lado MAC, servidor que te va a permitir enviar el &lt;em&gt;bundle OS X&lt;/em&gt; al MAC y depurarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y como todo primer producto, est&amp;aacute; completamente lleno de bugs y da muchos problemas, tanto el IDE como la depuraci&amp;oacute;n remota y el framework en s&amp;iacute;. Embarcadero lleva sacados cinco parches, uno de ellos tan grande que exige reinstalarlo todo, que mejoran algo pero no mucho.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y para m&amp;aacute;s INRI, son aplicaciones de 32 bits, cosa que en los MAC se est&amp;aacute; acabando a pasos agigantados.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esperemos que el XE3, que saldr&amp;aacute; este verano, mejor algo la cosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Nos falta comentar Mono, el C# multiplataforma y de c&amp;oacute;digo abierto. Ya he hablado algo de &amp;eacute;l &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; con anterioridad, pero ahora voy a matizar un poco m&amp;aacute;s. Mono engloba una serie de tecnolog&amp;iacute;as m&amp;aacute;s o menos integradas que comparten un mismo lenguaje de programaci&amp;oacute;n: C#.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Basado en &lt;em&gt;ports&lt;/em&gt;, todo el meollo se centra en un IDE (disponible para ambas plataformas, como el de QT) que permite crear aplicaciones basadas en los ya citados &lt;em&gt;ports&lt;/em&gt;, de los que disonemos de varios seg&amp;uacute;n qu&amp;eacute; plataforma.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por un lado tenemos el de Windows.Forms, que nos permitir&amp;aacute; generar c&amp;oacute;digo compatible con la tecnolog&amp;iacute;a de Microsoft y ejecutar en Windows, MAC y Linux. GTK# es otro de ellos. Tambi&amp;eacute;n est&amp;aacute; MonoMAC, en exclusiva para MAC. Hay m&amp;aacute;s pero nos detenemos aqu&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es que cada &lt;em&gt;port&lt;/em&gt; conserva la idiosincrasia de cada &lt;em&gt;origen&lt;/em&gt;. Es decir, el API de GTK# es el GTK pero traducido a C#, y as&amp;iacute; con todos. Es una buena idea y en general, se puede generar c&amp;oacute;digo para Windows y MAC sin problemas mayores que los que tendr&amp;iacute;amos con QT.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero ahora viene el t&amp;iacute;o de la rebaja. Hemos visto algunas pegas que tienen todos estos sistemas de desarrollo, pero no son las peores de todas. De todos modos, si desarrollas para MAC necesitar&amp;aacute;s un MAC, y lo mismo para Windows, as&amp;iacute; que llevar a cabo esas tareas en ambas m&amp;aacute;quinas no es todo lo malo que se puede esperar, y de hecho en todos los casos existen soluciones bastante &amp;oacute;ptimas, aunque lo m&amp;aacute;s deseable ser&amp;iacute;a el acercamiento de Embarcadero, con compila en un sitio, ejecuta en dos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La mayor pega de todas consiste en que pr&amp;aacute;cticamente ninguno de estos sistemas pinta los controles como nativos. QT podr&amp;iacute;a salvarse por los pelos, pero ni FireMonkey ni Mono, salvo MonoMac, aparecen como aplicaciones nativas. En la documentaci&amp;oacute;n de algunos productos la llaman hasta &amp;ldquo;alien&amp;rdquo;. Ya os pod&amp;eacute;is imaginar. Y si bien en Windows un usuario normal puede aceptar ciertos interfaces ex&amp;oacute;ticos, un fanboy (perd&amp;oacute;n, maquero) de pro seguro que te manda a la mierda con todas sus palabras, y encima con raz&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El caso de MonoMac no se aplica, ya que no podremos compartir c&amp;oacute;digo fuente con Windows puesto que se trata de un envoltorio sencillo sobre el propio Cocoa con la idiosincrasia de OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, el &amp;uacute;nico Framework que s&amp;eacute; de forma fehaciente que ha entrado en la App Store de los MAC ha sido QT tras aplicar unos parches para evitar que el propio QT modificara ficheros dentro del &lt;em&gt;bundle&lt;/em&gt;. De todos modos no s&amp;eacute; qu&amp;eacute; pasar&amp;aacute; con el Sandboxing y si QT (y los dem&amp;aacute;s) lo soportan.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente, est&amp;aacute; completamente claro que, a fecha de hoy, desarrollar en multiplataforma de manera coherente continua prohibido, principalmente por limitaciones de los Frameworks existentes que de problemas t&amp;eacute;cnicos, dado que el rendimiento y las herramientas base (como compiladores de plataforma cruzada o lenguajes comunes en diferentes plataformas), est&amp;aacute;n m&amp;aacute;s que maduros.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tan s&amp;oacute;lo habr&amp;iacute;a que crear un Framework que utilizara los controles nativos de cada plataforma, cosa que a fecha de hoy no existe (m&amp;aacute;s sobre esto luego).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;iquest;Qu&amp;eacute; nos queda, pues? Tan sencillo y tan complejo como dividir nuestra aplicaci&amp;oacute;n en dos partes. La primera, la parte visual, tendremos que hacerla diferente para cada plataforma. Objective-C en MAC, Win32 (MFC, o cualquier otro que pinte nativo), y la parte no visual o el n&amp;uacute;cleo de nuestro programa en alg&amp;uacute;n lenguaje com&amp;uacute;n, como puede ser C++ y STL y mantener al loro todo el tema para que compile y funcione en todos los sistemas de destino&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Es m&amp;aacute;s trabajo, pero creo que es la &amp;uacute;nica forma de mantener un interfaz visual nativo y coherente. El problema viene cuando nuestra aplicaci&amp;oacute;n es demasiado simple de modo que mantener esta estructura es m&amp;aacute;s costoso que crear dos programas de forma independiente.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte, claro est&amp;aacute;, la bajada de rendimiento al tener que desacoplar ambas partes, aunque esto es muy bueno y deber&amp;iacute;a ser una constante en cualquier desarrollo no trivial, aunque estemos haci&amp;eacute;ndolo solo para Windows o s&amp;oacute;lo para MAC. No obstante, a veces la ca&amp;iacute;da de rendimiento es tal, o el programa es tan meramente visual que este acercamiento no es aplicable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si os dais cuenta no he entrado en el tema de c&amp;oacute;digo abierto versus c&amp;oacute;digo cerrado, y es que para el programador medio, se la trae floja si tiene el fuente o no de lo que est&amp;eacute; usando: no lo va a mirar porque o bien no tiene tiempo o bien no est&amp;aacute; capacitado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tampoco he cubierto el tema Metro de Windows 8, que est&amp;aacute; de lado del tema m&amp;oacute;vil, en el que no he entrado pese a haber tambi&amp;eacute;n Frameworks gen&amp;eacute;ricos. Aqu&amp;iacute; estamos igual, pero ahora las plataformas son Windows Phone, Windows Metro (o RT), Android e iOS, y si las de Windows y MAC son disparejas, no os digo estas. Y, a fecha de hoy, que yo sepa, no hay ning&amp;uacute;n Framework multiplataforma y compatible. FireMonkey promete llegar a Android, Metro y a C++ en pr&amp;oacute;ximas versiones, pero si ya con dos plataformas la cosa est&amp;aacute; como est&amp;aacute;, no quiero saber cuando haya tantas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Me falta hablar de un jugador que no he nombrado y que tiene muy buena pinta, quiz&amp;aacute;s la mejor de todas pero, como apenas lo he probado, lo dejo para una futura entrada. Se llama wxWidgets y hace tiempo que habl&amp;eacute; de &amp;eacute;l aqu&amp;iacute;, pero para Windows. Estamos ante un Framework con mucha solera en el mundo del desarrollo y que usan empresas como Google en su producto Google Drive a trav&amp;eacute;s de wxPython.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y la mayor ventaja est&amp;aacute; en que, aparte de estar disponible para alguna que otra plataforma embebida, los controles son los nativos de cada sistema operativo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;QT en Windows y OS X (Fijaos c&amp;oacute;mo los controles son casi nativos en cada sistema).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey en Windows y OS X (Esto no pasa la MAC App Store ni a golpe de talonario. Por no aparecer ni el men&amp;uacute; aparece donde debe).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets en OS X (Todos los controles son nativos).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205955" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Alfred: Cómo lanza aplicaciones dentro de vmWare</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/26/alfred-c-243-mo-lanza-aplicaciones-dentro-de-vmware.aspx</link><pubDate>Tue, 26 Jun 2012 08:22:49 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205780</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205780</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205780</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/26/alfred-c-243-mo-lanza-aplicaciones-dentro-de-vmware.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;&lt;span style="text-decoration:underline;"&gt;&lt;strong&gt;Escenario.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Quieres (o ya tienes) aplicaciones virtualizadas en el Dock. Es decir, tu tienes un programa dentro de una máquina virtual vmWare y quieres lanzarla desde el Dock sin más.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Para ello, una vez que la máquina virtual está en modo Unity, lanzas la aplicación desde el menú de vmWare y te aparecerá el icono de la misma en el Dock. Ahora sólo tienes que, con el botón derecho del mismo, elegir “Opciones -&amp;gt; Mantener en el Dock”. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;La próxima vez que quieras lanzarla, con hacer clic sobre dicho icono es suficiente para que se abra la máquina virtual y tu programa de forma completamente transparente. Si la máquina está en modo Unity la aplicación se abrirá como una más del MAC. Si no, lo hará dentro de la ventana.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Vale. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;&lt;span style="text-decoration:underline;"&gt;&lt;strong&gt;Problema&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Ahora queremos poder lanzar esa aplicación desde un atajo de teclado. Hace tiempo &lt;a href="http://geeks.ms/blogs/rfog/archive/2010/11/13/las-pifias-de-os-x-y-de-office-2011.aspx"&gt;expliqué cómo hacer algo similar&lt;/a&gt; con Automator y una serie de pasos. No sé si funcionará en el caso que nos ocupa, ni me importa mucho ya que ahora tengo instalado Alfred y su Power Pack, que es lo que realmente debería traer OS X de serie…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;&lt;span style="text-decoration:underline;"&gt;&lt;strong&gt;Solución&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Alfred con el Power Pack tiene la opción de lanzar cualquier aplicación con una combinación de teclas que, creo, se superpone a las del sistema operativo. Hacerlo para cualquier aplicación es completamente trivial, pero para las aplicaciones internas de una máquina virtual es harina de otro costal.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Mirando aquí y allí, he descubierto que el Dock guarda la configuración de los programas que tiene en su barra aquí: ~/Library/Preferences/com.apple.dock.plist &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Si abres dicho fichero con xCode te encuentras una serie de items numerados. Hay que buscar el que nos ocupa, y en la rama “file-data -&amp;gt; _CFURLString” tenemos lo que nos interesa: la ruta al arhivo que el sistema usa para lanzar el programa que nos interesa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Una breve inspección nos dice que, para cada máquina virtual, y dentro de su &lt;em&gt;bumdle&lt;/em&gt;, existe una carpeta llamada “Applications” que contiene un fichero por cada aplicación “exportada” por la máquina virtual.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Ahora ya sólo nos queda añadir el fichero deseado al lanzador de aplicaciones de Alfred.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Supongo que los que usáis Parallels tendréis algo equivalente.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205780" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx">configuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>Visual C++ 2012 soportará Windows XP</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx</link><pubDate>Fri, 15 Jun 2012 20:49:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205620</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205620</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205620</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Dicho así, a bote pronto, puede parecer una tontería, pero no lo es. Los que hayan estado probando las diferentes versiones alfas, betas y &lt;em&gt;omicrones&lt;/em&gt; de Visual C++ 11 se habrán dado cuenta de que no generan código para Windows XP.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;El motivo no era otro más que se han hecho una serie de mejoras al &lt;em&gt;runtime&lt;/em&gt; de C++ (ya sabéis, la biblioteca de C y de C++) que se basan en una serie de funciones de Win32 que no están presentes en Windows Xp y sí en Vista y siguientes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;La respuesta fácil sería decir que han hecho eso para empezar a ir descartando a XP como sistema operativo soportado y forzar que los nuevos programas no funcionen con él, pero a la vista de las noticias no ha sido así. De hecho, hace poco tiempo alguien publicó la forma de soportar XP con las versiones beta ya publicadas mediante un truco. No me preguntéis cómo porque no lo he mirado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Independientemente de eso, cuando un programa debe ejecutarse en un sistema que no tiene todas las importaciones de, por ejemplo, Kernel32.DLL, lo que hace es realizar una carga parcial o suministrar funciones &lt;em&gt;dummy&lt;/em&gt; para que el sistema funcione. Es decir, si por ejemplo el &lt;em&gt;runtime&lt;/em&gt; de C++ llama a una supuesta función de Kernel32.DLL llamada &lt;em&gt;UnaFuncion()&lt;/em&gt; que no está en, digamos, XP pero sí en Windows 7, lo que se hace es, o bien esas se marcan como &lt;em&gt;delayed&lt;/em&gt; (retardadas) y sólo se cargan manualmente una vez que el &lt;em&gt;runtime&lt;/em&gt; ha comprobado que el sistema operativo la posee, o bien se suministra una vacía o con emulación.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;No me preguntéis más porque realmente no sé cómo se hace ya que nunca me ha hecho falta, y tampoco sé si está documentado de forma oficial o no, pero es un mecansimo más o menos conocido que usa al menos la propia Microsoft para soportar sistemas operativos obsoletos y no tener varios juegos de ficheros.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Y ya que estamos en el tema, os comento otra cosa. Hace unos días se anunció que las versiones Express (todas) de Visual Studio 2012 sólo soportarían crear aplicaciones Metro en Windows 8 y que, si queríamos escritorio, deberíamos seguir usando las 2010 para ello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Hablamos, claro está, de las gratuitas. La versión &lt;em&gt;Professional&lt;/em&gt; y superiores sí que iban a poder crear ambos tipos de aplicaciones, y todo bajo un mismo IDE tal y como estamos acostumbrados. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;[Para los despistados, diré que con las versiones Express, si uno necesita crear un proyecto mixto, digamos una DLL hecha en C, C++ ó C++/CLI para que luego una aplicación en C# la use, tienes que instalar los productos por separado y manejar cada tipo de proyecto también por separado, y nada de depurar y saltar de código manejado a nativo y viceversa. Con las versiones de pago todo está en un mismo IDE y se pueden manejar de forma conjunta].&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;En principio la imposibilidad de crear aplicaciones de escritorio con la Express 2012 puede parecer trivial ya que tenemos las 2010, pero lo cierto es que perdemos muchas mejoras en todos los lenguajes. Podría citar como ejemplo los métodos asíncronos en C# y toda la nueva parafernalia del C++11 para C++, que no es poco.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Pero ha sido tal el clamor popular (y no tan popular, porque algunos MVP le han dado caña de la buena a MS -no, esta vez yo no he movido un dedo), que Microsoft ha reaccionado y va a sacar una versión 2012 &lt;em&gt;Desktop&lt;/em&gt; para crear aplicaciones de escritorio.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Es decir, que vamos a tener al menos dos C# Express, dos C++ Express y demás, una para aplicaciones Metro y otra para escritorio. Y lo que es mejor, las versiones escritorio creo, y digo creo porque no lo tengo claro, va a ser un solo IDE que va a soportar todos los lenguajes como las versiones de pago…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Enlaces originales:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320645.aspx"&gt;Targeting Windows XP with C++ in Visual Studio 2012&lt;/a&gt;&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/06/08/visual-studio-express-2012-for-windows-desktop.aspx"&gt;Visual Studio Express 2012 for Windows Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205620" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>Ingeniería inversa de una aplicación Metro: más fácil que nunca</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/05/ingenier-237-a-inversa-de-una-aplicaci-243-n-metro-m-225-s-f-225-cil-que-nunca.aspx</link><pubDate>Tue, 05 Jun 2012 14:18:15 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205478</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205478</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205478</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/05/ingenier-237-a-inversa-de-una-aplicaci-243-n-metro-m-225-s-f-225-cil-que-nunca.aspx#comments</comments><description>&lt;p align="justify"&gt;Andaba yo esta mañana mirando mis fuentes de noticias cuando me encuentro con esta entrada: &lt;a href="http://lunarfrog.com/blog/2012/06/05/metro-app-protection/"&gt;Your Metro-style app needs protection and here is why&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;En principio no me lo creí, o pensé que el contenido venía de versiones anteriores a la última Release Preview de Windows 8. Pero no, es completamente cierto.&lt;/p&gt;  &lt;p align="justify"&gt;Todos debéis saber que realizar ingeniería inversa a un programa escrito en .NET es cosa de minutos y es una tarea enormemente sencilla incluso si la aplicación está ofuscada. Si no lo está, podemos obtener el código fuente completo tal y como lo escribió el autor, y encima en el lenguaje que queramos.&lt;/p&gt;  &lt;p align="justify"&gt;Esto nos da un truco muy sencillo para usar código de terceros escrito en un lenguaje .NET que no conocemos. Tomamos el código a copiar, creamos una aplicación, le aplicamos un &lt;i&gt;Reflector&lt;/i&gt; (que es como se llaman a estos programas) y obtenemos el código fuente en el lenguaje deseado, ya sea &lt;a href="http://vb.net/"&gt;VB.NET&lt;/a&gt;, C# o incluso C++/CLI.&lt;/p&gt;  &lt;p align="justify"&gt;Si el programa está ofuscado la ingeniería inversa es algo más difícil, pero con un poco de práctica es posible convertir el resultado en algo legible. No obstante, si queremos copiar un bloque de código o ver cómo está hecha una cosa, no necesitamos más. Copiamos, pegamos y listo. A ver, no es tan fácil, pero un ofuscador de código lo único que hace es cambiarle el nombre a todo y allí donde es posible, separar o juntar cosas. Nada que un experto medianamente espabilado no pueda deshacer.&lt;/p&gt;  &lt;p align="justify"&gt;Pues bien, las aplicaciones Metro en Windows 8 todavía son más fáciles de desensamblar. Estoy intentando instalarme un programa de demo, pero todavía no sé cómo se hace localmente pese a tener el paquete listo para su instalación.&lt;/p&gt;  &lt;p align="justify"&gt;Mientras averiguo eso, podéis jugar un ratín como he jugado yo. Lo primero de todo es hacer que la carpeta “C:\Program Files\WindowsApps” esté visible. Para ello abrimos la ventana de Windows Explorer en el escritorio y en la opción “View” del menú, seleccionamos “Options”. Allí, en la pestaña “View”, marcamos “Show hidden files, folders and drives” y ya de paso, también “Hide extensions for known file types”, que no es imprescindible pero ayuda.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora ya podemos ver la carpeta WindowsApps. Desde el explorador de Windows nos dice que no podemos entrar. Podríamos tomar control de la carpeta, pero al menos yo no lo he hecho, ya que abriendo una consola de comandos con permisos elevados podemos entrar y ver el contenido:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_2030FA49.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image002" border="0" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image002_5F00_thumb_5F00_1CCF62A1.jpg" width="243" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vaya. Tenemos acceso a todas las aplicaciones Metro instaladas… Aunque podemos navegar por ellas desde la ventana de comandos, también podemos copiarlas a otro destino con el comando “xcopy &amp;lt;origen&amp;gt; &amp;lt;destino&amp;gt; /r/s”. Y eso es lo que he hecho. Me he movido el “Reader” de Microsoft.&lt;/p&gt;  &lt;p align="justify"&gt;Y ahora puedo entrar sin tocar nada de nada:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_46CF60C9.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image004" border="0" alt="clip_image004" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image004_5F00_thumb_5F00_3CBABF9E.jpg" width="244" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Interesante, ¿no? Tenemos archivos XAML, ejecutables, imágenes, metadatos, todos ellos al alcance de la mano. Dos pantallazos más:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_7BAC4039.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image006" border="0" alt="clip_image006" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image006_5F00_thumb_5F00_18D1E844.jpg" width="244" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image008_5F00_6CB4EB52.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image008" border="0" alt="clip_image008" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image008_5F00_thumb_5F00_6F9A2A38.jpg" width="237" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Creo que es suficiente, ¿no?&lt;/p&gt;  &lt;p align="justify"&gt;Pues no, ahora vamos a abrir y desensamblar algún ejecutable. La aplicación Reader que hemos estado viendo parece ser que es binaria (luego volveremos sobre ello), pero por ejemplo la “BingFinance” es .NET pura y encima está sin ofuscar:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image010_5F00_2E8BAAD4.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image010" border="0" alt="clip_image010" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image010_5F00_thumb_5F00_32494FA4.jpg" width="244" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En la imagen de arriba vemos dos ficheros de dicha aplicación abiertos de… esto… piernas.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Pero todavía hay más. Vamos a echar un vistazo a un par de aplicaciones escritas por uno mismo. La primera es un SplitView en C++ tal y como sale del asistente de Visual Studio 2012RC. Entre otras cosas genera dos ficheros “ejecutables”. Un EXE tradicional, que es binario o al menos así lo parece, y otro con la extensión Winnmd y el mismo nombre. Este sí que es manejado, pero parece ser que sólo contiene las exportaciones a WinRT. Tampoco tengo claro qué es, aunque parece ser que WinRT necesita las exportaciones del programa y MS lo ha solucionado de esta manera. En fin, aquí esta:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image012_5F00_713AD03F.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image012" border="0" alt="clip_image012" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image012_5F00_thumb_5F00_5A9881F8.jpg" width="159" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Ahora veamos la misma aplicación tomada del asistente de C#. En este caso sólo hay un ejecutable, el propio programa que es desensamblable por completo:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image014_5F00_59C01C0E.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="clip_image014" border="0" alt="clip_image014" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/clip_5F00_image014_5F00_thumb_5F00_104DC753.jpg" width="244" height="239" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;¿Os mola? A mi nada de nada. Esperemos que Microsoft se ponga las pilas con esto, porque si no mal vamos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205478" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>Un poco hasta los cojones del OS X sí que estoy, la verdad</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/01/un-poco-hasta-los-cojones-del-os-x-s-237-que-estoy-la-verdad.aspx</link><pubDate>Fri, 01 Jun 2012 14:02:55 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205350</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205350</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205350</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/01/un-poco-hasta-los-cojones-del-os-x-s-237-que-estoy-la-verdad.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;No sé quién diría eso de &lt;em&gt;en MAC eso no pasa&lt;/em&gt;, pero el hecho es que, a fecha de hoy, OS X Lion no llega ni a la suela de los zapatos de Windows 7. Esperemos que el Montañés mejore algo, porque lo que es la versión actual, es un mucho mierdosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de las infinitas carencias en usabilidad, con un Finder al que hay que meterle diez extensiones o instalarse sustitutos para se que acerquen un poco al Explorador de Windows, los programas más o menos mierdosos que necesitan sustituto (léase Mail, iCal, …), las porquerías del Spotlight que unas veces va lentísimo, otras antepone los propios programas de Apple a otros de terceros aunque los de origen no se hayan usado nunca (y por eso uso Alfred), la necesidad de gastarte una pasta en sustitutos que en la mayor parte suelen ser gratuitos en Windows, las pifias de programas &lt;em&gt;serios&lt;/em&gt; como iPhoto que unas veces sí y otras también es incapaz de recordar que tengo activo el &lt;em&gt;photo streaming&lt;/em&gt;, los petes del Pages porque él lo vale y que me hace rememorar las primeras versiones de Open Office, que cascaban o iban mal sí o sí, los enganches y autismos varios del iTunes, la &lt;em&gt;ruedecilla multicolor de la muette&lt;/em&gt;, que aparece de vez en cuando, sobre todo en Safari, la lentitud en arrancar el sistema completo… &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;… Todo eso, a lo que hay que sumar la &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx"&gt;pésima gestión de memoria&lt;/a&gt; y, ahora mismo, dos problemas con el &lt;em&gt;kelmer&lt;/em&gt; o que creo que vienen directamente del mismo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Tengo un monitor secundario enganchado a un puerto Thunderbolt pero usado como DVI con su adaptador correspondiente. Pues bien, cada dos por tres pierde lo que quiera que pierda y ambas pantallas se ponen a parpadear. La anexa porque se ha perdido, y la principal poniendo y quitando el escritorio como si eso fuera a solucionar en algo la otra pantalla.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro problema viene con el puerto de la SD, que sólo me permite insertar una tarjeta por reinicio. Sí, una vez que he insertado una tarjeta, y tras su expulsión, ya no vuelve a leer nada de ella.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En ambos casos no es el hardware, porque en Windows con Boot Camp en ningún momento me ha pasado nada parecido. Es el *** OS X que, tras cada actualización, va peor que la anterior.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y ya para finalizar, ¿quién es lumbrera al que se le ha ocurrido poner el puerto de la SD justo debajo de la ranura del DVD? Porque manda cojones, mucho diseño, mucha tontería pero lo dicho: ergonomía poca o ninguna. Justo hace un momento casi tengo que desmontar mi iMAC (que todavía está en garantía) porque he metido por error la SD en el hueco del DVD…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En fin, que mucho ruido pero pocas nueces.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Perdonadme la entrada, pero creo que tengo razón al quejarme de todas estas cosas y de más que no os cuento porque tengo la duda de si es el &lt;em&gt;layer 8&lt;/em&gt; o el sistema.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205350" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>MonoTouch: muy bonito pero una guarrería</title><link>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx</link><pubDate>Wed, 30 May 2012 09:17:01 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205305</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205305</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205305</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ayer estuve jugando un poco con MonoTouch, más que nada por curiosidad. Para los que no lo sepáis, es un IDE más una biblioteca que envuelve de forma conveniente todo el desarrollo para iOS, tanto iPhone como iPad y que permite a un programador de C# desarrollar para estas plataformas sin tener que aprender nada de Objective-C y demás zarandajas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es un decir, porque realmente no es más que un envoltorio fino a todo eso. Por lo tanto, si estás desarrollando para Windows o Silverlight, no esperes sentarte y ponerte a ello porque aparte de usar la sintaxis de C#, todo lo demás es iOS. Incluso se usa el IDE de xCode para crear los elementos gráficos y su interactuación, como son los &lt;em&gt;outlets&lt;/em&gt; (propiedades) y las &lt;em&gt;actions&lt;/em&gt; (los eventos).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja es que al ser una capa fina apenas introduce sobrecarga y todo es nativo. El inconvenientes es que tienes que aprenderte todas las idiosincrasias del iOS.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y otra cosa que no me creo mucho es el tema de la compartición de código. No esperes tener el mismo código fuente de tu aplicación y compilar para Android, iOS, OS X y Windows. Podrás compartir bloques de código, pero nada más.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra cosa es que estas herramientas son de pago. Desde 400$ la más barata hasta viarios miles de dólares. Depende de qué quieras y cómo. Las versiones gratuitas para Android e iOS no caducan pero sólo permiten ejecutar código en el simulador.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Las versiones para escritorio son completamente gratuitas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Se me olvidaba decir &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ahora bien, como decidas desinstalar algo… arreglado vas. Aparte de que no hay desinstalador, los procesos para hacerlo son completamente insuficientes y te dejan el sistema hecho unos zorros con miles de archivos desperdigados por todo el disco. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Versiones anteriores traían un desinstalador embebido dentro del PKG que realizaba la instalación, pero al menos la que yo he instalado no lo trae.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero ejecuta los comandos descritos &lt;a href="http://stackoverflow.com/questions/74902/uninstall-mono-from-mac-os-x-v10-5-leopard"&gt;aquí&lt;/a&gt;. Eso te va a limpiar digamos que las partes públicas del entorno. Y si tienes la última versión de xCode instalada, te puedes cargar la carpeta /Developer de un plumazo sin problemas porque sólo tendrás el Mono de los cojones en ella. Pero antes de hacerlo, míralo por si acaso.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Una vez pasado ese script, si te pica la curiosidad, haz una búsqueda global con la palabra “mono”.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso he usado CleanMyMac para limpiar el ordenador de basura, pero tu puedes hacerlo a mano o con otra herramienta. Ojo con los ficheros que no son del mono.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente tenemos que desinstalar MonoDevelop. En mi caso, de nuevo con CleanMyMac.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y creo, sólo creo, que tengo limpio de nuevo el sistema.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Hay que joderse.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205305" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx">configuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>C++/CX (IV). Clases parciales</title><link>http://geeks.ms/blogs/rfog/archive/2012/05/18/c-cx-iv-clases-parciales.aspx</link><pubDate>Fri, 18 May 2012 15:10:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205119</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205119</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205119</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/05/18/c-cx-iv-clases-parciales.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;Eacute;ramos pocos y pari&amp;oacute; la abuela. &amp;iquest;Sab&amp;eacute;is por qu&amp;eacute; C++/CLI (el C++ de .NET) se qued&amp;oacute; en la cuneta en eso de ser &lt;em&gt;a first class .NET language&lt;/em&gt; (o en cristiano: un lenguaje .NET de primera clase)? Efectivamente, la ausencia de clases parciales.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Cuando Microsoft introdujo el .NET 3.0 tambi&amp;eacute;n cambi&amp;oacute; la forma de entender la interacci&amp;oacute;n con la parte visual. Si bien antes las ventanas se constru&amp;iacute;an con c&amp;oacute;digo, aunque de forma m&amp;aacute;s o menos automatizada gracias al dise&amp;ntilde;ador visual (hablamos de Windows Forms), a partir de ese momento se implement&amp;oacute; una nueva forma que, pese a ser una idea cojonuda, peca un poco de mal implementada, como casi todo lo que hace la casa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Los viejos lobos de mar nos hemos defendido con &lt;em&gt;las plantillas de cuadro de di&amp;aacute;logo&lt;/em&gt;, que defin&amp;iacute;an los tales mediante una serie de palabras claves. Luego Windows se encargaba de leer la versi&amp;oacute;n binaria de ese texto y nos constru&amp;iacute;a nuestro cuadro de di&amp;aacute;logo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, XAML es la en&amp;eacute;sima reencarnaci&amp;oacute;n de lo mismo, pero con esteroides. Y digo en&amp;eacute;sima porque por ejemplo Delphi, C++ Builder e incluso el ya vetusto VB6 lo hac&amp;iacute;an m&amp;aacute;s o menos as&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;XAML es un &lt;em&gt;lenguaje&lt;/em&gt; (lo que me cuesta llamarlo as&amp;iacute;) XML que define la estructura de una ventana y todos sus componentes. La idea es tener algo que nos defina por completo, y de forma independiente del c&amp;oacute;digo, la parte visual de un programa y que encima se pueda crear tanto de forma manual como con programas&amp;hellip; Eso s&amp;iacute;, l&amp;eacute;ete tu un fichero XAML escrito con Blend, que lo vas a flipar en colores.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Bueno, a lo que vamos, XAML tiene que poder interactuar de alguna forma con el c&amp;oacute;digo. Para evitarnos cosas como MFC, Microsoft permiti&amp;oacute; que se pudiera definir una misma clase en m&amp;aacute;s de un fichero. Y nacieron las clase parciales.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es bien sencilla. XAML conoce una parte de la clase que define la ventana, y el programador conoce otra. Luego el compilador las une y hemos conseguido nuestro objetivo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, C++/CX implementa clases parciales de forma casi id&amp;eacute;ntica a C#. Es la &amp;uacute;nica forma de que C++ pueda entenderse con XAML sin hacer virguer&amp;iacute;as todav&amp;iacute;a peores.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En resumen:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;No est&amp;aacute; definido en el est&amp;aacute;ndar de C++11.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;S&amp;oacute;lo funciona para &lt;em&gt;ref class&lt;/em&gt;. O en otras palabras: no vale para c&amp;oacute;digo C++ cl&amp;aacute;sico ni para la parte cl&amp;aacute;sica de una aplicaci&amp;oacute;n Metro escrita en C++/CX.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Se a&amp;ntilde;ade una nueva palabra reservada, &lt;em&gt;partial&lt;/em&gt;, que debe ir en todas las declaraciones menos en una.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Tom&amp;aacute;ndolo del &lt;a href="http://mariusbancila.ro/blog/2011/10/13/cpp-winrt-and-partial-classes/"&gt;art&amp;iacute;culo en ingl&amp;eacute;s &lt;/a&gt;en el que me baso, os pego un ejemplo:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;// foo.private.h&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;#pragma once&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;min-height:13.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;partial ref class foo // &amp;lt;- here the partial keyword is used&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;{&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;private:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;&amp;nbsp;&amp;nbsp; int _id;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;&amp;nbsp;&amp;nbsp; Platform::String^ _name;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;};&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;// foo.public.h&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;#pragma once&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;#include &amp;quot;foo.private.h&amp;quot;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;min-height:13.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;ref class foo // &amp;lt;- partial keyword is not used here&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;{&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;public:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;&amp;nbsp;&amp;nbsp; int GetId();&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;&amp;nbsp;&amp;nbsp; Platform::String^ GetName();&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;};&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;// foo.cpp&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;#include &amp;quot;pch.h&amp;quot;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;#include &amp;quot;foo.public.h&amp;quot;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;min-height:13.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;int foo::GetId() {return _id;}&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;Platform::String^ foo::GetName {return _name;}&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es decir, cuando declaremos una clase en varios ficheros, todos ellos deben llevar la palabra reservada &lt;em&gt;partial&lt;/em&gt; excepto uno de ellos, que har&amp;aacute; de &lt;em&gt;concentrador&lt;/em&gt;. Supongo que esto facilita la tarea del compilador, que ir&amp;aacute; anotando las partes parciales y las ir&amp;aacute; a&amp;ntilde;adiendo poco a poco a la otra de forma din&amp;aacute;mica y conforme se vaya encontrando el c&amp;oacute;digo. Y finalmente, en uno o m&amp;aacute;s CPP definimos los m&amp;eacute;todos y dem&amp;aacute;s. Aqu&amp;iacute; ya no hace falta para nada la palabra &lt;em&gt;partial&lt;/em&gt; porque eso ya lo pod&amp;iacute;amos hacer antes sin problema alguno.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto nos lleva al dibujo siguiente, tomado tambi&amp;eacute;n del art&amp;iacute;culo citado:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;img style="float:left;" title="xaml_cpp.png" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/xaml_5F00_cpp.png" alt="xaml_cpp" width="600" height="319" border="0" /&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Eso es lo que hace Visual C++ a la hora de crear una ventana, generando estos cinco ficheros. El XAML contiene la definici&amp;oacute;n de la ventana y todo lo que pongamos dentro, y es id&amp;eacute;ntico a uno generado en C#. Tambi&amp;eacute;n genera otros dos con los nombres terminados en .g.h y en .g.cpp, que contienen c&amp;oacute;digo necesario para que el sistema pueda enlazar el archivo XAML con el c&amp;oacute;digo fuente que hayamos podido editar, que a su vez reside en otros dos sendos ficheros con las extensiones de .xaml.h y .xaml.cpp.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Nuestro c&amp;oacute;digo debe ir en los ficheros terminados en xaml (para la definici&amp;oacute;n de la parte visual), xaml.h (para la declaraci&amp;oacute;n de la clase que representa la ventana) y xaml.cpp para todo lo dem&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Debemos ser muy cuidadosos en no tocar los otros dos ficheros, que suelen ser generados de forma autom&amp;aacute;tica al vuelo por Visual Studio (y supongo que por Blend, pero eso no lo he probado todav&amp;iacute;a) y que, si hacemos algo mal, podemos tirar abajo el dise&amp;ntilde;ador y luego la aplicaci&amp;oacute;n no se cargar&amp;aacute; bien. Digamos que dichos ficheros son los equivalentes al &lt;em&gt;InitializeComponents()&lt;/em&gt; de &lt;em&gt;WindowsForms&lt;/em&gt; y que, si los tocamos sin conocimiento de causa, podemos dejar inservible nuestra ventana.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Os dejo que jugu&amp;eacute;is con lo descubierto. Creaos una aplicaci&amp;oacute;n vac&amp;iacute;a, ponedle un bot&amp;oacute;n o lo que quer&amp;aacute;s y a&amp;ntilde;adidle un evento.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205119" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item></channel></rss>