<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">.NET o no .NET, esa es la cuestión</title><subtitle type="html">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.</subtitle><id>http://geeks.ms/blogs/rfog/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/rfog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/rfog/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2011-10-16T13:09:38Z</updated><entry><title>C++/CX (IV). Clases parciales</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/05/18/c-cx-iv-clases-parciales.aspx" /><id>/blogs/rfog/archive/2012/05/18/c-cx-iv-clases-parciales.aspx</id><published>2012-05-18T15:10:00Z</published><updated>2012-05-18T15:10:00Z</updated><content type="html">&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;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Visual Studio" scheme="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx" /><category term="C++/CX" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx" /><category term="Windows 8" scheme="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx" /></entry><entry><title>C++/CX (III). Objetos COM</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/05/18/c-cx-iii-objetos-com.aspx" /><id>/blogs/rfog/archive/2012/05/18/c-cx-iii-objetos-com.aspx</id><published>2012-05-18T14:14:09Z</published><updated>2012-05-18T14:14:09Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Decíamos &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx"&gt;ayer&lt;/a&gt; y &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/10/31/c-cx-windows-8-y-el-nuevo-subsistema-winrt-i.aspx"&gt;antes de ayer&lt;/a&gt; que para crear aplicaciones Metro en Windows 8 podíamos usar, o bien el .NET Framework 4.5 con C# y &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt; o bien hacerlo con el tradicional C++. Ya conocemos que Microsoft se ha dado cuenta de que la &lt;em&gt;cosa manejada&lt;/em&gt; no deja de ser un poco juguete comparada con la nativa, y que hay muchísimas empresas que siguen, no solo con C++, sino incluso con MFC.&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;Independientemente de eso, lo cierto es que el API para Metro no es más que una variación de Win32, empaquetada y ofrecida mediante objetos COM nativos. La idea es cambiar Win32 y prohibirla para Metro, ofreciendo su equivalente mediante la biblioteca WRL que no es más que un encapsulado exportado mediante COM.&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;Aquí parece como si Microsoft matara dos pájaros de un tiro, ya que .NET utiliza COM internamente, o lo más parecido y cercano a ello. Por lo tanto, lo exportado mediante la WRL es tomado, por un lado por .NET y por el otro por C++ con su extensión 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;Tenemos que decir que C++/CX es código nativo. Sin recolector de basura. Sin máquina virtual.  Compilado para un procesador específico. No es más que nuestro código escrito en C++ que utiliza objetos COM envueltos en una serie de clases &lt;em&gt;al estilo de .NET&lt;/em&gt;. De hecho, la sintaxis de C++/CX es la misma que la de C++/CLI, por lo que en un principio puede llevar a confusió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 Calibri;"&gt;De todos modos, para aquellos que hayan leído el &lt;a href="http://www.gotw.ca/publications/C++CLIRationale.pdf"&gt;&lt;em&gt;Rationale&lt;/em&gt; de Sutter&lt;/a&gt; (&lt;a href="http://rfog.cmact.com/inicio.htm"&gt;versión en español de Octavio Hernández y del que suscribe aquí&lt;/a&gt;), sabrán que es la única otra sintaxis posible y, o bien escribimos en C++/CLI para el .NET clásico (léase Windows Forms) o bien lo hacemos en C++/CX para Metro. Y si bien podemos hacer ambas cosas para Windows 8, las aplicaciones C++/CLI serán las tradicionales, y las C++/CX las Metro.&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;Con esto queremos decir que, usando C++/CX, tenemos acceso a toda la parafernalia nativa de C++ como la STL, Boost, C++11… y encima desarrollar para Metro. O dicho de otro modo: cualquier código que tengamos que no haga uso de ventanas ni de Win32 de forma directa no servirá para las aplicaciones Metro.&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;La parte CX se activa con la opción /ZW del compilador, y lo que hace es mapear los objetos COM en clases normales y corrientes. Allí donde antes teníamos que enfangarnos con &lt;em&gt;IInspectable&lt;/em&gt;, y usar toda la parafernalia COM, ahora simplemente tenemos que usar una&lt;em&gt; ref class&lt;/em&gt; normal y corriente con sus constructores, destructores, propiedades, delegados y métodos que recibirán los tipos de datos más estándar y que devolverán también valores estándar.&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;O en otras palabras: las clases que nos ofrece el API de Metro (por llamarlo de alguna manera, ya que es el API de WRL) son envoltorios a objetos COM WRL. Y de igual forma que los programadores de Windows han construido la WRL, nosotros también podremos tener objetos del mismo tipo, hechos por nosotros y ofrecidos a terceros. &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;Supongamos que tenemos una clase cualquiera con un método llamado &lt;em&gt;Compute &lt;/em&gt;que toma dos enteros y devuelve un valor de estado. Para nosotros, que usamos dicha clase, tan sólo tenemos que llamar al método y esperar el resultado.&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;Pero internamente, lo que está haciendo el &lt;em&gt;sugar syntax&lt;/em&gt; de la parte CX del compilador, es algo así:&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; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Consolas;"&gt;//Parte del “consumidor” de la case&lt;br /&gt; inline int Computer::Compute(int first, int second) { &lt;br /&gt;     int result; &lt;br /&gt;     HRESULT hr = ___impl_Compute(this, first, second, &amp;amp;result); &lt;br /&gt;     if (hr != 0) ___impl_throw_for_hr(hr); &lt;br /&gt;     return result; &lt;br /&gt; } &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;min-height:13.0px;"&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 luego, el método &lt;em&gt;__impl_Compute&lt;/em&gt;, que está en el lado del componente (si fuera una clase WRL estaría &lt;em&gt;dentro&lt;/em&gt; de la WRL), sería algo así:&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; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;HRESULT __stdcall ___impl_Compute(Computer* cmp, &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;  int first, int second, int* result) { &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;    try { *result = cmp-&amp;gt;Compute(first, second); } &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;    catch(Platform::Exception^ e) { return e-&amp;gt;HResult; } &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;    return S_OK; &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 0.0px;text-align:justify;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-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;De este modo vemos cómo podemos acceder a un método sin toda la parafernalia ni las ofuscaciones de COM. Y no queremos entrar en detalles sobre por qué COM es tan &lt;em&gt;así&lt;/em&gt;, mayormente porque no tenemos ni repajolera idea.&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 obstante, si así lo queremos por detalles de la implementación o simplemente por ser &lt;em&gt;guays&lt;/em&gt;, tenemos acceso a la parte interna de WRL de la siguiente manera:&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; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;//Assuming 32-bit pointers &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;Computer^ computer = ref new Computer; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;int* vtable_array = (int*)computer; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;int* icomputer_vtable = (int*)vtable_array[0]; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;int* compute_will_be_fptr = (int*)icomputer_vtable[6]; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;typedef HRESULT (__stdcall *compute_fptr_t)(Computer*, &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;  int, int, int*); &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;compute_fptr_t compute_fptr = (compute_fptr_t)compute_will_be_fptr; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;//…use compute_fptr freely :-)&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; &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 voy a comentar nada de aquí porque simplemente me parece algo demasiado barroco y supongo que sólo será útil si te encuentras con algún bug en la parte CX del compilador… También podemos acceder a la interfaz COM pura a través del método &lt;em&gt;RoActivateInstance&lt;/em&gt;, pero lo dejamos para los &lt;em&gt;hardcore&lt;/em&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;***&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 hay una opción del compilador no documentada para que éste nos muestre una estructura detallada del componente WinRT que especifiquemos: &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; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;/d1reportSingleClassLayout&amp;lt;CLASSNAME&amp;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;min-height:17.0px;"&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 de nuevo dejamos la opción para los &lt;em&gt;aventureros&lt;/em&gt;, que yo ya me he cansado de escribir por hoy.&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; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205115" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="c++" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx" /><category term="Win32" scheme="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx" /><category term="Biblioteca de C++" scheme="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx" /><category term="C++/CX" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx" /><category term="Windows 8" scheme="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx" /></entry><entry><title>Menuda porquería de gestión de memoria que tiene el OS X</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx" /><id>/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx</id><published>2012-05-06T18:24:35Z</published><updated>2012-05-06T18:24:35Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;A veces, cuando uno es un &lt;em&gt;swicher&lt;/em&gt; de pro como yo, se encuentra con cosas que le resultan un tanto kafkianas como la que os voy a contar.&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;¿Tiene alguien queja de la gestión de memoria de Windows? No me refiero a si consume más o menos, sino a si funciona como debe, sin que haga &lt;em&gt;cosas raras&lt;/em&gt;. ¿A que no? Pues en OS X (los &lt;em&gt;MAC&lt;/em&gt; para los despistados), dicha gestión deja mucho que desear.&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;Hace tiempo empecé a leer en los blogs &lt;em&gt;fanboys&lt;/em&gt; la existencia de ciertas aplicaciones que &lt;em&gt;liberaban y optimizaban&lt;/em&gt; la memoria de los MAC. En principio algo similar a los supuestos optimizadores de memoria en Windows, pero para OS X. Y si en Windows no hacen falta y sólo consumen recursos, en OS X debería ser lo mismo o, en opinión de los &lt;em&gt;expertos&lt;/em&gt;, todavía más inútiles que en la plataforma de Microsoft.&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;Yo fui uno de esos que comenzó a defender a capa y espada la gestión de memoria del OS X sin haber hecho ninguna prueba porque suponía que era una cosa que se caía por su propio peso: si un sistema operativo es incapaz de gestionar bien su memoria, poco útil va a ser…&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 de hecho, igual que pasó en su momento cuando se promocionaban ese tipo de aplicaciones para Windows, con artículos pagados y demás, se armaron en los citados blogs unas buenas trifulcas sobre el tema, con razonamientos a favor y en contra más o menos elaborados y veraces…&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;Una puntualización. En OS X, cuando tu cierras una aplicación, está no se cierra realmente, sino que se suspende y queda &lt;em&gt;residente&lt;/em&gt; en memoria. Es lo que ocurre cuando le das al aspa de cerrar, o cuando presionas Command-W. Si realmente quieres retirarla de la memoria, o cerrarla &lt;em&gt;ala Windows&lt;/em&gt;, tienes que presionar Command-Q o hacerlo a mano desde el Dock. Aquí hablamos de cerrarla realmente, que es cuando se debería liberar su memoria. No obstante, hay programas que realmente se cierran ellos solos, como el gestor de libros Calibre.&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;Por lo tanto, en OS X tenemos dos formas de cerrar una aplicación. En la primera realmente no se está cerrando, sino que se está &lt;em&gt;ocultando&lt;/em&gt; y no es aplicable lo que estamos hablando aquí. Sería el equivalente de minimizar en Windows.&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 OS X, la memoria se va asignando pero no liberando. Es decir, tu abres un programa, lo usas y luego lo cierras del todo. La memoria asignada no se libera, sino que queda asignada por si se vuelve a abrir la aplicación y se aprovecha la huella de memoria ya existente.&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;Por lo tanto, conforme vas abriendo y cerrando aplicaciones la memoria se va llenando poco a poco hasta que apenas queda libre. Hasta aquí la cosa está bien, porque de este modo mantenemos una &lt;em&gt;caché&lt;/em&gt; que podría resultar en un aumento de rendimiento.&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 a veces es así. La segunda vez que abres ciertos programas, estos se cargan mucho más deprisa porque recuperan su imagen de la memoria física. Por ejemplo, en el caso del Opera con varios miles de mensajes de correos y de news, la diferencia es abismal. De tardar como treinta segundos o más a ser completamente instantánea.&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;Según la teoría, una vez que se ha ocupado toda la memoria y se necesita más, es esa caché la que se va liberando según un algoritmo que no me he preocupado en mirar. &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;Eso es la teoría. La práctica es otra: se tira de swap y el rendimiento de tu MAC empieza a caer en picado y oyes cómo empiezan a rascar los discos duros. Y nadie puede negármelo porque lo he comprobado yo mismo esta mañana.&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;Todo ha comenzado pasándome del iMAC al Air la biblioteca del iTunes. Para ello he iniciado el AirDrop y con ambos iTunes cerrados, lo he copiado. En el Air estaba vigilando el uso de procesador del Sparrow, que me tiene mosca, así que he abierto el monitor de actividad en el iMAC. &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 primera en la frente: de los 12GB de RAM que tiene el iMAC, he visto cómo conforme si iban pasando los ficheros de uno a otro se iba quedando en cero libres. Una vez ha terminado de copiar, he abierto varios programas como el Word, el Pages y el ordenador ha comenzado a tirar de swap en lugar de liberar la memoria inactiva. Los he cerrado del todo y no ha decrecido el consumo. &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 completar el ejercicio he lanzado una máquina virtual que consume 2GB de memoria y ni aun así se ha liberado lo ocupado, sino que los discos han empezado a rascar todavía más furiosamente y el rendimiento ha caído en picado…&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;Tras eso me he ido a la App Store y me he bajado un liberador de RAM. Al poco de ejecutarlo y lanzar la limpieza de la misma, mano de santo, oye. Los discos han dejado de rascar y me ha dejado algo más de 8GB de RAM libres, que han subido a 10 cuando lo he vuelto a ejecutar tras cerrar la máquina virtual.&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 problema, evidentemente, no está en el consumo de RAM. Por mi como si se ocupa toda, sino en el hecho de que un consumo real de 2GB del sistema operativo más otros 2 GB de la máquina virtual, han tirado abajo el rendimiento de un iMAC con 12GB de RAM y un i7 con 8 cores…&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;Pensaba que Apple podía hacerlo mejor, pero al final resulta que son unos chapuceros de mucho cuidado…&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;Por si os interesa, he probado el &lt;em&gt;FreeMemory&lt;/em&gt; y tras comprobar que funcionaba bien, he comprado la versión &lt;em&gt;Pro &lt;/em&gt;por tres cuartos de euro.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204884" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /><category term="Apple" scheme="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx" /></entry><entry><title>ExFAT 1, XBOX 0, Microsoft -infinito</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/05/06/exfat-1-xbox-0-microsoft-infinito.aspx" /><id>/blogs/rfog/archive/2012/05/06/exfat-1-xbox-0-microsoft-infinito.aspx</id><published>2012-05-06T17:07:17Z</published><updated>2012-05-06T17:07:17Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Esta tarde nos hemos puesto a ver una película en la XBOX… lo que ha supuesto toda una odisea. Me explico.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Enciendo la consola y hala, actualización. No suelo encenderla muy a menudo, pero joder, que pase como con los PC… Pero el tema no es que haya sido una, sino que han sido dos, la segunda de ellas muy muy gorda. Tanto, que supongo que se ha actualizado toda entera.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;La primera en la frente: no he podido usar la consola cuando he querido, sino que me he tenido que esperar más de media hora. Vale, podría haber decidido actualizarla luego, pero cualquiera se fía de un equipo que se conecta a internet con la que está cayendo…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Vale. Entro ya en el interfaz y meto un USB normal y corriente de 16GB… No lo detecta. Lo saco y meto un segundo de 4 GB, previa copia de lo que íbamos a ver. Tampoco lo coge. De 1 GB. Ni con esas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Vale, estaban en ExFAT y la consola ¡¡no soporta los propios formatos de Microsoft!! Está bien que no lo haga cuando salió el sistema de ficheros, pero éste lleva ya varios años en el mercado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Entiendo que no lea NTFS, ni HPFS, ni Ext2, ni ReiserFS… Es razonable a más no poder, ¡pero que un producto de Microsoft sea incapaz de leer sus propios formatos!…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Porque entendamos que si bien NTFS es un sistema “enterprise”, ExFAT es comercial y pretende ser la sustitución del veterano FAT… ¡Joder, si hasta los MAC los leen!&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Y lo peor no es eso, lo peor es que una vez que ha sido &lt;em&gt;tocado&lt;/em&gt; por la XBOX, ese USB deja de poder aceptar nuevo contenido. Es decir, que sólo deja ver y borrar ficheros, pero no añadir.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;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-indent:18.0px;font:14.0px Helvetica;"&gt;Al final, mientras reformateaba el disco a FAT32, y copiaba los archivos, me dio por navegar un rato con la consola…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Ahora se pueden instalar aplicaciones. Vale. Me instalo el visor de Youtube, por hacer algo. Se instala sin problemas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Lo lanzo segundos después ¡y me dice que tiene que actualizarse! Hay que joderse, amigo Sancho… ¡¡Pero si está recién bajado de la tienda!!&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;En fin, se actualiza, entro y… necesito una cuenta Gold. La mía es la normal, sin pago…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;¿Por qué cojones no me dice que es necesaria una cuenta Gold &lt;em&gt;antes&lt;/em&gt; de instalar? Pues si piensan que tras la instalación voy a pasar por caja van arreglados.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Por seguir probando (ya que todavía no se habían copiado los ficheros en el disco USB), instalo la aplicación de DailyMotion. Esta al menos me avisa de que habrá cosas del interfaz no soportadas en la consola, pero cuando lo lanzo e intento ver un vídeo… me vuelve a pedir la cuenta Gold.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;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-indent:18.0px;font:14.0px Helvetica;"&gt;Vamos, lo dicho, un gigantesco despropósito de cosas que me resultan completamente incomprensibles… No sé quiénes tomarán las decisiones, pero seguro que serían más útiles cavando bancales de ajos que decidiendo qué va y qué no va en los productos de Microsoft. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Helvetica;"&gt;Y no hablo de los problemas de conexión que tengo con el Media Center (de Microsoft) y el NAS (este no es de MS), aunque el último suele ir sensiblemente mejor que el primero.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;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-indent:18.0px;font:14.0px Helvetica;"&gt;Básicamente, que les den.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204881" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="escariotrop&amp;#237;as gimn&amp;#233;sicas" scheme="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx" /><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="bugs" scheme="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx" /><category term="hardware" scheme="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /></entry><entry><title>Culico que veo cubico que deseo</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/05/04/culico-que-veo-cubico-que-deseo.aspx" /><id>/blogs/rfog/archive/2012/05/04/culico-que-veo-cubico-que-deseo.aspx</id><published>2012-05-04T10:58:19Z</published><updated>2012-05-04T10:58:19Z</updated><content type="html">&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Creo que ya tengo un post con el mismo título por algún lado, pero no puedo resistirme a comentar algunas cosas sobre los últimos movimientos de Microsoft.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Hay cosas de las que de momento no puedo hablar, pero hay otras que sí, y la verdad es que resultan un poco risibles porque, al menos desde mi punto de vista, son la respuesta incorrecta a una competencia mal entendida.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Os comento.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Apple, de vez en cuando, dice cosas como que el Flash es malo y sus productos no lo llevan, o que la disquetera está obsoleta, o que simplemente se acabaron las instalaciones con unidad de disco…&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Y eso primero genera polémica, y luego resulta que tenían razón…&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Pues bien, Microsoft quiere hacer lo mismo, pero como ya sabemos dónde tienen el estilo, la cosa termina, seguro, en unas risas y en una l,vuelta atrás.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Por un lado, mientras todos los fabricantes de móviles hacen cada vez equipos más potentes y con más funcionalidades dentro de su sistema operativo, mientras que mantienen otras restricciones más o menos incomprensibles para los expertos, Microsoft ha decidido hacer lo mismo… pero a su manera.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;En general, un producto de Microsoft siempre ha ido creciendo tanto en vertical (más necesidad de hardware) como en horizontal (un API más rico y más completo). Esto ha llevado siempre a que la siguiente versión ha necesitado más memoria y más procesador para funcionar bien. En la parte de las APIs, han preferido enmarranar y convertir algo existente en más complejo en lugar de hacer borrón y cuenta nueva o simplemente añadir un API nuevo con más funcionalidad y dejar que el anterior muera…&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Tampoco vamos a hablar del hecho de que, cuando han conseguido una tecnología madura y estable, en lugar de mantenerla y ampliarla, han decidido reinventar la rueda y vuelta a empezar: nuevo de todo, nuevos bugs, etc…&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Pues bien, como decía, en un intento de paralelizarse a Apple, en lugar de cambiar para bien, lo hacen para mal. Hablo ahora de Windows Phone de 256 megas de RAM, que enmierdan todavía más ya la mierdosa API de ese sistema operativo. &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/04/12/windows-phone-y-las-petisoper-237-as.aspx"&gt;Quitan cosas útiles&lt;/a&gt; y añaden nuevas inútiles (y ya hablaré de eso en otro momento). Básicamente quieren copiar, pero copian mal.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;***&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Apple retiró su Media Center por los motivos que fueran. Microsoft lo retira en su Windows 8. Nada, hay que hacer lo mismo.&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;***&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;Y ahora llega el colmo de los colmos. &lt;a href="http://gizmodo.com/5907600/windows-8-wont-play-dvds-as-standard?utm_campaign=socialflow_gizmodo_facebook&amp;amp;utm_source=gizmodo_facebook&amp;amp;utm_medium=socialflow"&gt;Windows 8 no podrá reproducir DVD&lt;/a&gt; sin programas externos porque dicen que el uso del DVD está rápido decline en los ordenadores…&lt;/p&gt;
&lt;p style="margin:0px;text-indent:18px;font-family:Calibri;font-size:14px;"&gt;En fin, lo dicho, copia, pero copia bien, joder, y no vayas haciendo este tipo de tonterías…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204863" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="escariotrop&amp;#237;as gimn&amp;#233;sicas" scheme="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx" /><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="humor" scheme="http://geeks.ms/blogs/rfog/archive/tags/humor/default.aspx" /><category term="Apple" scheme="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx" /></entry><entry><title>Ocultación de datos y paso de variables</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx" /><id>/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx</id><published>2012-04-24T09:45:00Z</published><updated>2012-04-24T09:45:00Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Leo en Twitter un par de preguntas m&amp;aacute;s que curiosas sobre dos cosas que se dan por supuestas en el desarrollo orientado a objetos. Aunque una de ellas est&amp;aacute; formulada al rev&amp;eacute;s, yo aqu&amp;iacute; le voy a dar el sentido correcto, e intentar&amp;eacute; responder, en la medida de mis conocimientos, a ambas.&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;La primera de ellas es &amp;ldquo;&amp;iquest;por qu&amp;eacute; las variables de una clase no deben ser p&amp;uacute;blicas?&amp;rdquo;&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 una de las primeras cosas que nos ense&amp;ntilde;an en la POO. Extendiendo la pregunta al &amp;aacute;mbito completo, el concepto se conoce como &amp;ldquo;ocultaci&amp;oacute;n de datos&amp;rdquo;, y se extiende no s&amp;oacute;lo a las variables de clase, sino tambi&amp;eacute;n a los objetos en s&amp;iacute; y en general al programa 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;Por poner un caso extremo, en la mayor&amp;iacute;a de &lt;em&gt;Frameworks&lt;/em&gt; serios, el punto de entrada de un programa cualquiera deber&amp;iacute;a ser:&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;MiApp theApp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Calibri;"&gt;theApp.Run();&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;Vale, es un poco extremo, pero a ese nivel es lo que necesitamos: una aplicaci&amp;oacute;n, y que la vamos a ejecutar. No nos hace falta nada m&amp;aacute;s ni tenemos que conocer nada m&amp;aacute;s a ese nivel.&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, uno de los motivos de la ocultaci&amp;oacute;n de datos es dar a conocer &amp;uacute;nicamente lo estrictamente necesario, y de hecho no nos importa si &lt;em&gt;theApp&lt;/em&gt; tiene una variable llamada &lt;em&gt;Juanito &lt;/em&gt;o &lt;em&gt;Pepito&lt;/em&gt; porque no tiene utilidad conocerlo a ese nivel.&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 de hecho no nos interesa que nadie sepa la estructura interna de &lt;em&gt;MiApp&lt;/em&gt; porque sencillamente ah&amp;iacute; no podemos y no debemos hacer nada m&amp;aacute;s que ejecutar el objeto que es la representaci&amp;oacute;n en memoria de nuestra aplicaci&amp;oacute;n. Quiz&amp;aacute;s, o bien en el constructor o bien en el m&amp;eacute;todo &lt;em&gt;Run()&lt;/em&gt;, pasar los argumentos con los que ha sido llamada la aplicaci&amp;oacute;n, pero s&amp;oacute;lo si es pertinente y nos interesa.&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 regla nos dice que si no lo necesitamos a ese nivel, no lo hagamos p&amp;uacute;blico. Pero claro, todav&amp;iacute;a no he explicado &lt;em&gt;por qu&amp;eacute;&lt;/em&gt;. Simplemente he definido la regla: oculta todo lo que puedas.&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;Jorge Serrano, respondiendo en Twitter, lo ha dicho bastante claro: No te interesa que nadie te pueda cambiar los zapatos sin tu consentimiento. Yo dir&amp;iacute;a que cada perro debe lamerse su pijo, expresi&amp;oacute;n m&amp;aacute;s castiza. Imagina que vas andando por el monte, y alguien te cambia tus botas de &lt;em&gt;trekking&lt;/em&gt; por unas chanclas de playa sin tu consentimiento&amp;hellip; O que est&amp;aacute;s en una reuni&amp;oacute;n de alto copete y una chavala empieza a esto&amp;hellip;, lamerte el tema&amp;hellip;&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;Reformulado en c&amp;oacute;digo, y retrocediendo un poco, la idea es bastante interesante.&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 la programaci&amp;oacute;n procedural cl&amp;aacute;sica (es decir, C y similares), y tal y como lo dijo Stroustrup en no recuerdo qu&amp;eacute; lugar, un programa es un conjunto de funciones que menean un conjunto de datos.&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 teor&amp;iacute;a, cualquier funci&amp;oacute;n podr&amp;iacute;a &lt;em&gt;tocar&lt;/em&gt; cualquier dato. Digo en teor&amp;iacute;a porque en C y similares tambi&amp;eacute;n hay m&amp;eacute;todos, m&amp;aacute;s primitivos, para ocultar datos. Quien haya desarrollado aplicaciones m&amp;aacute;s o menos grandes con esta filosof&amp;iacute;a, se habr&amp;aacute; encontrado con serios problemas:&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 Calibri;"&gt;M&amp;eacute;todos que cambian datos que no deber&amp;iacute;an cambiar.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Datos que deber&amp;iacute;an ser diferentes pero que por un despiste tienen el mismo nombre y que son combinados por el enlazador como uno solo.&lt;/li&gt;
&lt;/ul&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;Poni&amp;eacute;ndolo en otras palabras: se pueden dar situaciones en las que la modificaci&amp;oacute;n de un dato genere efectos laterales que terminen en un comportamiento no deseado, o incluso generar una &lt;em&gt;onda de interferencia&lt;/em&gt; que termine tumbando la aplicaci&amp;oacute;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 Calibri;"&gt;Lo mismo podr&amp;iacute;a pasar con dos variables que accidentalmente han sido nombradas igual. Un compilador moderno deber&amp;iacute;a avisar de este &amp;uacute;ltimo caso a nivel de enlazador, y en general, al menos con Visual C++, as&amp;iacute; ocurre. Otra cosa es que el programador novel le haga caso o se d&amp;eacute; cuenta del aviso. Y no todos los compiladores notifican de este hecho, sobre todo los de plataforma cruzada para sistemas embebidos, que suelen ser bastante antiguos.&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;Volviendo al tema central, la OO intenta solucionar este problema con las clases y la ocultaci&amp;oacute;n de datos. Es decir, una clase es una serie de m&amp;eacute;todos que definen c&amp;oacute;mo &lt;em&gt;tocar&lt;/em&gt; a una serie de datos de forma auto contenida. Y hasta la fecha es la mejor soluci&amp;oacute;n que se ha podido encontrar, y si alguien conoce alguna mejor (que no sea una paja mental), le vaticino los laureles del &amp;eacute;xito m&amp;aacute;s absoluto y arrollador.&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 otras palabras: una clase es una &lt;em&gt;entidad&lt;/em&gt; con un comportamiento definido por su c&amp;oacute;digo y es algo opaco a cualquier cosa que intente ver su interior excepto un interfaz p&amp;uacute;blico que sirva para tratar con 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;Y hay varias razones, todas ellas muy poderosas, para que esto deba ser as&amp;iacute;, lo que lleva impl&amp;iacute;cito una serie de obligaciones: ocultaci&amp;oacute;n de datos, interfaz p&amp;uacute;blica y autocontenci&amp;oacute;n. Otras caracter&amp;iacute;sticas como polimorfismo extienden pero no obligan, por lo que las vamos a obviar.&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;Volviendo al ejemplo de los zapatos, pensemos en un objeto &lt;em&gt;zapato&lt;/em&gt; gen&amp;eacute;rico. Cuando construyamos una persona, a la clase &lt;em&gt;persona&lt;/em&gt; le a&amp;ntilde;adimos dos objetos &lt;em&gt;zapatos&lt;/em&gt; (que podr&amp;iacute;an ir en un array, pero no es imprescindible).&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 ahora viene el &lt;em&gt;truco del almendruco&lt;/em&gt;. Atarse los cordones. Podemos hacerlo de varias formas.&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 m&amp;aacute;s chapucera es acceder al m&amp;eacute;todo miembro &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; de cada &lt;em&gt;zapato&lt;/em&gt; y atarlo, ejecutando una serie de acciones (c&amp;oacute;digo) sobre dichos cordones. Para ello necesitamos que &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; sea p&amp;uacute;blico.&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;&amp;iquest;Pero qu&amp;eacute; pasa si tenemos varios tipos de zapatos? Por ejemplo, unos que lleven hebillas. Ups. El c&amp;oacute;digo para atar zapatos que est&amp;aacute; en la clase &lt;em&gt;persona&lt;/em&gt; ya no nos sirve&amp;hellip;&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;Si embargo, si definimos un &lt;em&gt;zapato&lt;/em&gt; padre que tenga un m&amp;eacute;todo llamado &lt;em&gt;AtarCordones()&lt;/em&gt; y que internamente use el dato miembro &lt;em&gt;cord&amp;oacute;n&lt;/em&gt; para realizar la misma operaci&amp;oacute;n que antes hac&amp;iacute;amos desde la clase &lt;em&gt;persona&lt;/em&gt;, cuando heredemos de dicho &lt;em&gt;zapato&lt;/em&gt; una nueva clase llamada &lt;em&gt;sandalia&lt;/em&gt;, tan s&amp;oacute;lo tendremos que redefinir el m&amp;eacute;todo &lt;em&gt;AtarCordones()&lt;/em&gt; que, en lugar de usar &lt;em&gt;cord&amp;oacute;n&lt;/em&gt;, usar&amp;aacute; &lt;em&gt;hebilla&lt;/em&gt; y una serie de acciones con ellas.&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 lo que es m&amp;aacute;s importante, la clase contenedora, &lt;em&gt;persona&lt;/em&gt;, se desentiende de qu&amp;eacute; zapato tenemos, de si tiene hebillas o cordones. Simplemente llama a &lt;em&gt;zapato.AtarCordones()&lt;/em&gt; y la acci&amp;oacute;n estar&amp;aacute; hecha.&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;[Hablando m&amp;aacute;s seriamente, deber&amp;iacute;amos tener una clase base virtual llamada, por ejemplo, &lt;em&gt;ZapatoGen&amp;eacute;rico&lt;/em&gt; que defina un m&amp;eacute;todo virtual llamado &lt;em&gt;AtatCordones()&lt;/em&gt;. Y luego deber&amp;iacute;amos heredar de ah&amp;iacute; el &lt;em&gt;Zapato&lt;/em&gt; normal y la &lt;em&gt;Sandalia&lt;/em&gt;. Y quiz&amp;aacute;s otras variantes de calzado.]&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;Por lo tanto, al ocultar los datos internos y dejar una interfaz p&amp;uacute;blica, ganamos muchas cosas:&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 Calibri;"&gt;Los objetos que manipulen nuestro objeto lo har&amp;aacute;n a trav&amp;eacute;s de una interfaz definida y que debe ser siempre la misma (con la salvedad de los pasos de refactorizaci&amp;oacute;n que sean necesarios y que cambien los nombres o la propia interfaz).&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;El punto de arriba mejora la claridad del c&amp;oacute;digo, &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Nos evita tener que depurar los objetos llamadores porque no ha cambiado nada en ellos,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Nos permite cambiar el comportamiento interno del objeto manipulado sin tener que preocuparnos de la clase manejadora,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Permite el &lt;em&gt;efecto biblioteca&lt;/em&gt; (comentado por Herb Sutter en su &lt;em&gt;Rationale&lt;/em&gt; a C++/CLI, que su vez lo toma de Stroustrup): podemos meter la clase &lt;em&gt;Zapato&lt;/em&gt; en una biblioteca, y podremos cambiar su comportamiento interno sin tener que recompilar el c&amp;oacute;digo que la use,&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Oculta la visibilidad, permitiendo un c&amp;oacute;digo mucho m&amp;aacute;s limpio y con menos interferencias y s&amp;iacute;mbolos globales, que al menos en C++ pueden lentificar la compilaci&amp;oacute;n en grado sumo. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Acelera la carga en tiempo de ejecuci&amp;oacute;n, porque el cargador del sistema, al tener menos s&amp;iacute;mbolos p&amp;uacute;blicos, tiene que inicializar y relacionar menos cosas.&lt;/li&gt;
&lt;/ul&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;Vale, creo que no se me escapa nada, y si lo hiciera, con los puntos de arriba hay suficiente.&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 esto nos lleva a una serie de reglas de dise&amp;ntilde;o con las clases que, al menos yo, llevo a rajatabla:&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 Calibri;"&gt;Oculta todo lo que puedas. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Usa el nivel m&amp;aacute;s cerrado posible: &lt;em&gt;private&lt;/em&gt; en C++ para todo lo que puedas. Luego, cuando refactorices y necesites que algo sea conocido por clases hijas, p&amp;aacute;salo a &lt;em&gt;protected&lt;/em&gt;, pero con sumo cuidado ya que si hay (o se quiere) efecto lateral, mejor pon un m&amp;eacute;todo protegido en el padre que pueda ser llamado por el hijo para acceder a ese miembro privado.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Define interfaces p&amp;uacute;blicos, pero los menos posibles. Si un zapato no va desatar los cordones, no lo definas. Si lo necesitas, ya lo definir&amp;aacute;s. (Aqu&amp;iacute; hay que mantener cierto equilibrio, porque si sabes que lo puedes necesitar, mejor lo declaras pero no lo defines &amp;ndash;cuerpo vac&amp;iacute;o-, ya que podr&amp;iacute;a ser peor luego tener que cambiar la interfaz ya definida y usada).&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Calibri;"&gt;Documenta por qu&amp;eacute;, no c&amp;oacute;mo (el c&amp;oacute;mo ya te lo dice el propio c&amp;oacute;digo, a no ser que sea alg&amp;uacute;n algoritmo complejo, y en ese caso en el 99% de las veces seguro que se puede hacer de otra forma m&amp;aacute;s sencilla).&lt;/li&gt;
&lt;/ul&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 esto nos lleva a un problema que plantea mucha gente, y es que toda esa ocultaci&amp;oacute;n y esos m&amp;eacute;todos de acceso pueden volver un programa extremadamente lento.&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 lo puedo asegurar: eso fue en tiempos pasados, cuando los compiladores eran animales mitol&amp;oacute;gicos y se sab&amp;iacute;a poco sobre ellos.&amp;nbsp; Ahora, cualquier compilador medio decente se va a comer tus miles de l&amp;iacute;neas de c&amp;oacute;digo en un santiam&amp;eacute;n y va a generar mejor c&amp;oacute;digo que el que tu pudieras hacer a mano salt&amp;aacute;ndote todos esos pasos. Al menos en C++ y quiero creer que tambi&amp;eacute;n en C#.&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;Bueno, ahora viene la segunda pregunta, que reformulo pues est&amp;aacute; planteada con los conceptos cambiados: &amp;ldquo;&amp;iquest;Alguno sabe la raz&amp;oacute;n de por qu&amp;eacute; las variables se pasan por valor y los objetos por referencia?&amp;rdquo; Hablamos de C#, ya que en C++ y C++/CLI podemos pasarlos como nos salga de la pepitilla&amp;hellip;&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;Para responder a esta pregunta debemos meternos un poco en c&amp;oacute;mo funcionan los compiladores.&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 variable nativa, digamos un entero, ocupa 4 bytes (por decir algo, todo depende de d&amp;oacute;nde ejecutemos). Un objeto ocupa tanto como la suma de sus datos miembro y una o varias vtable en caso de que tenga m&amp;eacute;todos virtuales y del nivel de anidaci&amp;oacute;n de la herencia (as&amp;iacute; como de lo bueno que sea el compilador).&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 vtable es un array de punteros a funci&amp;oacute;n que, en tiempo de ejecuci&amp;oacute;n, determinan qu&amp;eacute; m&amp;eacute;todo se va a ejecutar dentro de un objeto con m&amp;eacute;todos virtuales. Un buen compilador resumir&amp;aacute; esto en cambiar un &lt;em&gt;call&lt;/em&gt; directo a un &lt;em&gt;call&lt;/em&gt; indirecto en base a un &amp;iacute;ndice almacenado en alg&amp;uacute;n lugar.]&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 nosotros definimos una clase, y a partir de ella instanciamos un objeto, el compilador (y en tiempo de compilaci&amp;oacute;n) hace un &lt;em&gt;pase de manos&lt;/em&gt; y agrupa todos los m&amp;eacute;todos miembro en un bloque que junta con los dem&amp;aacute;s m&amp;eacute;todos miembro de las dem&amp;aacute;s clases, a&amp;ntilde;adiendo unas firmas especiales a los nombres de funci&amp;oacute;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 Calibri;"&gt;Digamos que una vez compilado, un programa OO se convierte en un programa no OO que tiene una serie de funciones globales que acceden y modifican una serie de datos&amp;hellip; &amp;iquest;Os suena, verdad? Es que es la &amp;uacute;nica forma de hacerlo, os lo puedo asegurar. La ventaja est&amp;aacute; en que, salvo oscur&amp;iacute;simos errores del compilador que cada vez ocurren con menos frecuencia, a todos los efectos, el comportamiento final simula ser completamente orientado a objetos.&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, cuando pasamos par&amp;aacute;metros en una llamada a m&amp;eacute;todo, el sistema usa una pila, que es un &amp;aacute;rea de la memoria especialmente destinada a las tareas descritas.&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 vamos a entrar en detalles t&amp;eacute;cnicos, pero la cosa funciona as&amp;iacute;: el compilador pone en la pila los datos a pasar, copi&amp;aacute;ndolos quiz&amp;aacute; de otro punto de la pila. Entonces hace un &lt;em&gt;call&lt;/em&gt; en ensamblador a la funci&amp;oacute;n que hemos llamado, y cuando entremos en ella, sabr&amp;aacute; que en la cima de la pila tiene sus par&amp;aacute;metros.&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 pasamos un par&amp;aacute;metro por valor, estamos copiando dicho valor en la pila. Si es un entero, ocupar&amp;aacute; 4 bytes. Si es un objeto, ocupar&amp;aacute; tantos bytes como datos miembro tenga (ojo, s&amp;oacute;lo los datos, no el c&amp;oacute;digo), m&amp;aacute;s las tablas virtuales m&amp;aacute;s alg&amp;uacute;n que otro elemento m&amp;aacute;s que hace la funci&amp;oacute;n de &lt;em&gt;metadatos&lt;/em&gt; del objeto pasado.&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;Si el objeto ocupa 10 bytes, se copiar&amp;aacute;n, y si ocupa 100, 1K o 100K, se tendr&amp;aacute;n que copiar absolutamente todos los bytes. Dependiendo de qu&amp;eacute; objeto, la copia podr&amp;iacute;a ser onerosa en tiempo de ejecuci&amp;oacute;n y gasto de memoria.&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 pasamos un objeto por referencia, estamos pasando un &lt;em&gt;puntero&lt;/em&gt; al dato. No importa en qu&amp;eacute; lenguaje estemos, siempre es un puntero. Todo lo dem&amp;aacute;s lo hace el &lt;em&gt;sugar syntax&lt;/em&gt; del lenguaje, que nos &lt;em&gt;endulza&lt;/em&gt; la sintaxis y el operar con ellos.&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 este caso, de media, una referencia a un objeto en C#, y si no lo han cambiado, ocupa unos 10 bytes independientemente de qu&amp;eacute; tama&amp;ntilde;o real tenga el objeto en s&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;Por lo tanto, ahora vemos por qu&amp;eacute; en C# un objeto se pasa por referencia y un tipo nativo por valor: optimizaci&amp;oacute;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 Calibri;"&gt;Esto genera una serie de idiosincrasias en C# que al menos a mi no me gustan mucho, ya que estamos obligando al programador a que lo haga al estilo del lenguaje y no como uno quiera (ya sab&amp;eacute;is, eso de &amp;ldquo;programar en&amp;rdquo; y &amp;ldquo;programar con&amp;rdquo;).&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 optimizaci&amp;oacute;n es la adecuada para la mayor&amp;iacute;a de casos, pero a veces querr&amp;iacute;amos hacerlo de otra forma, y es cuando uno ve las limitaciones del lenguaje. En el caso que nos ocupa, un objeto no se puede pasar por valor, lo que fuerza a copiarlo a mano si vamos a modificarlo y no queremos que el original sufra cambios. Y a veces eso es dif&amp;iacute;cil, ya que en algunos casos la copia es de nuevo por valor y no se produce la mutaci&amp;oacute;n a nuevo objeto cuando modificamos la referencia creada, y no podemos hacer nada porque el C# (y el .NET) &lt;em&gt;son as&amp;iacute;&lt;/em&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;Sin embargo s&amp;iacute; que podemos pasar un tipo nativo por referencia, a&amp;ntilde;adiendo &lt;em&gt;ref&lt;/em&gt; al par&amp;aacute;metro (con lo cual modificaremos su valor desde dentro de la funci&amp;oacute;n llamada). No obstante, la implementaci&amp;oacute;n es una chapuza como un castillo, ya que la cosa funciona as&amp;iacute; dadas las severas limitaciones de la m&amp;aacute;quina virtual .NET: El valor a pasar por referencia se copia al mont&amp;iacute;culo (&lt;em&gt;heap&lt;/em&gt; en ingl&amp;eacute;s, que es donde se guardan los objetos y dem&amp;aacute;s elementos instanciados por referencia) y entonces se pasa, en la pila, una referencia a ese valor puesto en el mont&amp;iacute;culo. Cuando salimos de la funci&amp;oacute;n llamada, el sistema coge del mont&amp;iacute;culo el valor modificado y lo vuelve a poner en la pila.&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 lo que se llama &lt;em&gt;box/unbox&lt;/em&gt;, y viene determinado por la limitaci&amp;oacute;n del .NET de acceder a la pila cuando el elemento a tocar no est&amp;aacute; encima de ella. La &amp;uacute;nica ventaja que obtenemos de esto es que es mucho m&amp;aacute;s dif&amp;iacute;cil generar una inyecci&amp;oacute;n de c&amp;oacute;digo mediante el envenenamiento de los par&amp;aacute;metros de retorno de la pila.&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;Para aquellos que quieran tener una visi&amp;oacute;n m&amp;aacute;s amplia de la orientaci&amp;oacute;n a objetos, as&amp;iacute; como muchas explicaciones, les recomiendo el libro de Bertrand Meyer, &lt;a href="http://www.amazon.es/Object-Oriented-Software-Construction-Prentice-Hall-International/dp/0136291554/ref=sr_1_2?ie=UTF8&amp;amp;qid=1335260520&amp;amp;sr=8-2"&gt;&lt;span style="color:#103ffb;text-decoration:underline;"&gt;&lt;em&gt;Construcci&amp;oacute;n de software orientado a objetos&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; Segunda Edici&amp;oacute;n, que es un tocho de m&amp;aacute;s de mil p&amp;aacute;ginas denso como &amp;eacute;l solo&amp;hellip; Pese al proselitismo hacia &lt;em&gt;Eiffel&lt;/em&gt;, es un gran libro. Hay edici&amp;oacute;n en castellano de Prentice Hall (que es la que yo tengo), pero no s&amp;eacute; si se podr&amp;aacute; encontrar o no.&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;Otro no menor pero m&amp;aacute;s pr&amp;aacute;ctico, es &lt;a href="http://www.amazon.es/Code-Complete-Costruction-Construction-Professional/dp/0735619670/ref=sr_1_1?s=foreign-books&amp;amp;ie=UTF8&amp;amp;qid=1335260633&amp;amp;sr=1-1"&gt;&lt;span style="color:#103ffb;text-decoration:underline;"&gt;&lt;em&gt;Code Complete 2&lt;/em&gt;&lt;/span&gt;&lt;/a&gt; de Steven C. McConnell. Este es mucho m&amp;aacute;s pr&amp;aacute;ctico y orientado hacia el c&amp;oacute;digo real que escribimos las personas normales.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204620" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="c++/cli" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx" /><category term="c++" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx" /><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx" /><category term="lenguajes" scheme="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx" /></entry><entry><title>Windows Phone y las petisoperías</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/04/12/windows-phone-y-las-petisoper-237-as.aspx" /><id>/blogs/rfog/archive/2012/04/12/windows-phone-y-las-petisoper-237-as.aspx</id><published>2012-04-12T07:45:58Z</published><updated>2012-04-12T07:45:58Z</updated><content type="html">&lt;p&gt;Hay que joderse, que dijo aquél. Este podría ser el resumen de esta entrada. Ahora mismo veréis por qué.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Estoy empezando a jugar de forma más o menos seria con Windows Phone. Ya cuando salió, el no poder ejecutar código nativo básicamente me hizo pensar que Microsoft había perdido el tiempo y que WP iba a ser un gran y nuevo fracaso de la compañía que había perdido el norte, el sur, el este y el oeste…&lt;/p&gt;  &lt;p&gt;Pasa el tiempo y pese a todos los intentos de MS, WP no levanta cabeza. Ni cuota de mercado ni aplicaciones, comparándolo con Android e iOS, que crecieron mucho más rápido.&lt;/p&gt;  &lt;p&gt;Ahora sé algunas razones, imposibilidad de usar C++ incluída.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Windows Phone 7.0 no tiene sockets. Toma ya. Increíble. Para los legos: no hay posibilidad de crear ningún tipo de aplicación de chat, ni de comunicación remota a servidores ni nada parecido. Todo hay que hacerlo mediante HTTP, que no conserva el estado y necesita sobredimensionar el lado servidor frente al cliente…&lt;/p&gt;  &lt;p&gt;Whidows Phone 7.5 tiene sockets… de aquella manera. Cuando la aplicación pasa a background el socket se cierra, con lo que pierdes la persistencia en la comunicación. Aquí lo puedes solucionar mediante técnicas Push (que todavía no he visto e ignoro las limitaciones y ventajas que puedan tener). Pero de momento, aplicaciones verticales que requieran una conexión permanente tampoco están permitidas.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Ahora llega la última versión, con dispostivos de 256 MB de memoria… &lt;a name="http://www.developer.nokia.com/Community/Wiki/Best_practice_tips_for_delivering_apps_to_Windows_Phone_with_256_MB"&gt;&lt;/a&gt;&lt;a href="http://www.developer.nokia.com/Community/Wiki/Best_practice_tips_for_delivering_apps_to_Windows_Phone_with_256_MB"&gt;Y la vuelven a cagar.&lt;/a&gt; Dadas las limitaciones de los mismos, dejan de funcionar las tareas periódicas y las intensivas… Y te dicen que cuando lances la aplicación mires en qué dispositivos estás ejecutando y uses secuencias if/else para cambiar el comportamiento.&lt;/p&gt;  &lt;p&gt;En primer lugar eso es una soberana imbecilidad como una casa. ¿Tienes que codificar las cosas dos veces? Pues no, tendrás que hacerlo todo con la limitación predicha, porque si lo puedes hacer sin esos elementos, es una soberana gilipollez repetir el código. El problema vendrá cuando sin eso no puedas hacerlo.&lt;/p&gt;  &lt;p&gt;En segundo lugar, mientras los demás fabricantes implementan mejoras y optimizan el código de sus sistemas operativos, Microsoft hace lo contrario. Apple pasa de dispositvos de 256 MB de RAM a 512 y luego a 1024. Microsof pasa de 512 a 256, llevándose cosas de en medio.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Recuerdo la presentación de Windows Phone: que si sólo .NET, que si sólo procesadores multicore, que si sólo dispositivos de gama alta… Al final tienen que pasar por el aro, pero en lugar de abrir el Windows CE interno al lenguaje C y/o C++ y quitar la mierda del .NET, que seguro consume 40 de los 60 MB de la huella de memoria de cada proceso, van y quitan prestaciones… porque lo de las tareas asíncronas es sólo una de tantas limitaciones impuestas, que podéis leer en la entrada que os enlazo más arriba.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Resumendo, que van de mal en peor. RFOG dixit.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=204405" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="Windows CE" scheme="http://geeks.ms/blogs/rfog/archive/tags/Windows+CE/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx" /><category term="hardware" scheme="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /><category term="Windows Phone" scheme="http://geeks.ms/blogs/rfog/archive/tags/Windows+Phone/default.aspx" /></entry><entry><title>La Oferta Interminable</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/03/16/la-oferta-interminable.aspx" /><id>/blogs/rfog/archive/2012/03/16/la-oferta-interminable.aspx</id><published>2012-03-16T08:51:04Z</published><updated>2012-03-16T08:51:04Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;No sé si reír o llorar, si partirme el culo de la risa o qué hacer. Os cuento rápidamente:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Embarcadero, actual dueño de RAD Studio, que combina Delphi, C++ Builder y otras herramientas, tiene por costumbre sacar, año sí y año también, una nueva versión de cada una de sus herramientas de desarrollo. Da igual en el estado en que estén: ellos, más o menos a finales de agosto, sacan lo que ellos llaman una nueva versión.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Digamos que es una suscripción anual encubierta, ya que la nueva soluciona algunos bugs de la anterior, y de paso añade unos cuantos más. El compilador de C++ está estirado hasta límites increíbles, y parece ser que están haciendo algo nuevo con soporte multiplataforma y mixto entre 32 y 64 bits. Ya veremos qué sacan.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Os decía que cada año hay una nueva versión del producto. En general suele ser bastante inestable y algunas veces completamente inusable en según qué escenarios. Hasta que no sacan el primer parche la cosa no empieza a ir medianamente bien. Debe ser que eso de probar antes de vender no va con ellos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;También suelen hacer algún tipo de oferta que viene a durar dos o tres meses. La más típica es la de que pagas un producto y te llevas otro igual. No obstante últimamente se ha puesto de moda primero limitar las actualizaciones de versiones demasiado viejas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Es decir, que si tienes un C++Builder 5 no puedes, legalmente, actualizarte a C++Builder XE2 (la última) a precio de actualización, sino que tienes que pagar la versión completa. Comprarla la puedes comprar, pero cuando metes el número que te dan y tiras a activar te dice que nones, así que ándate con ojo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Ya que estamos, y antes de entrar en el meollo de la entrada os cuento la última que han hecho. Dado el XE2 es la primera versión en la que se soportan los 64 bits para Delphi en Windows y la plataforma OS X (MAC) en 32 bits (que ya les vale), están sacando actualizaciones a bastante buen ritmo. De hecho la última que salió hace unos días fue la cuarta.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Es una actualización completa. Tienes que desinstalar el producto completo y volver a instalar la versión completa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Pero eso no es lo único malo. Lo peor de todo es que esta nueva “actualización” rompe la compatibilidad binaria hacia atrás y, para más inri, hay algo que han hecho mal y el enlazador tiene serias limitaciones para generar programas en Firemonkey hasta el punto de que es completamente inusable si no aplicas una chapuza de las gordas…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Hay que joderse.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;Bueno, ahora ya sí, lo que os quería contar. Os decía que primero te capan la posibilidad de actualización desde versiones antiguas. Eso deben haberlo hecho para forzar a los usuarios que todavía utilicen versiones viejas (recordemos que, al menos en el C++ Builder y para Windows, desde la versión 4 no han aportado nada realmente nuevo) a comprar una actualización o a perder definitivamente la posibilidad de hacerlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;En cierta medida tiene su justificación, aunque si tu estás más que cómodo con tu C++Builder 4 ó 5, no tienes por qué actualizar para encontrarte con nuevos problemas y nuevas idiosincrasias impuestas por Embarcadero. Y de todos modos pienso que no es más que una técnica para intentar vender más.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;No obstante el cachondeo viene ahora. La oferta comenzó en agosto de 2011, terminó en septiembre u octubre (no recuerdo exactamente cuándo), pero la ampliaron hasta diciembre. Una semana antes de caducar volvieron a ampliarla hasta no recuerdo qué fecha, y finalmente lo han vuelto a hacer hasta el 31 de marzo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:36.0px;font:12.0px &amp;#39;Courier New&amp;#39;;"&gt;¿Sabéis lo que pienso? Que casi nadie les compra ya el producto, y con la tónica que llevan no creo que continúen teniendo mucho éxito. O se espabilan de una vez o los veo en el agujero, pese al bombazo de la multiplataforma (que por cierto ha pasado sin pena ni gloria en los medios de comunicación), que como ya os dije, vino traída de forma bastante chapucera.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203859" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="c++" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx" /><category term="escariotrop&amp;#237;as gimn&amp;#233;sicas" scheme="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx" /><category term="C++ Builder" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx" /></entry><entry><title>Instalando las últimas versiones de QT en un MAC</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/03/12/instalando-las-250-ltimas-versiones-de-qt-en-un-mac.aspx" /><id>/blogs/rfog/archive/2012/03/12/instalando-las-250-ltimas-versiones-de-qt-en-un-mac.aspx</id><published>2012-03-12T22:46:57Z</published><updated>2012-03-12T22:46:57Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Conforme va pasando el tiempo vemos cómo un producto que pudo haber sido de Microsoft y haber constituido la plataforma base nativa para Windows, va creciendo y estabilizándose poco a poco.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Hablo del &lt;em&gt;framework&lt;/em&gt; de QT, creado por Trolltech, vendido a Nokia y, cuando ésta pasó a formar parte de Microsoft, cedido a Digia para el soporte. Resulta un producto un tanto movido, base de KDE y de muchos otros productos interesantes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Hasta no hace mucho, utilizar QT Creator para construir este tipo de aplicaciones era un tanto cansino, porque el producto no estaba a la altura de un IDE medio decente. Tampoco es que ahora lo esté, porque sólo permite visualizar una ventana, y la depuración es, cuando va, lenta. Ni se te ocurra poner puntos de interrupción en diferentes hitos, porque algunas veces pararán y otras no. El inspector de variables locales tampoco anda muy fino que digamos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No obstante QT sí que está muy maduro y funciona muy bien. Al menos en las partes que he usado, que son todo el tema de los Widgets y la sincronización. Eso sí, desde Visual Studio con su correspondiente plugin. Desde el propio Creator da verdadero asquito de usar.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Bueno, os decía que ahora el SDK de QT tiene hasta un instalador, tanto para MAC como para Windows y Linux. El de Windows va muy bien, lo uso en el trabajo y no he tenido problemas. (Y es por eso por lo que he dejado de hablar de Metro y C++ ya que estoy metido de lleno con QT y apenas tengo tiempo de mirar otras cosas. Ya sabéis, donde manda patrón no manda marinero).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No obstante, en el iMAC no conseguía instalarlo, e internet no es que me fuera de mucha ayuda… Hasta que de refilón, y mirando otra cosa, lo encontré.&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;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Para instalar el SDK de QT es necesario tener xCode instalado previamente. Pero si la versión que tienes es la 4.3 el instalador de QT va a protestar y te va a decir que no tienes un compilador de C++ en tu equipo, pese a que xCode está ahí y compila sin problemas un proyecto…&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 solución? Abrir xCode, ir a Preferencias, pestaña de Descargas, e instalar las &lt;em&gt;Command Line Tools&lt;/em&gt;. Necesitas una cuenta de Developer en Apple, que es gratuita.&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 vez instalado eso, ya podrás poner en marcha tu copia de QT.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203810" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="configuraci&amp;#243;n" scheme="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx" /><category term="QT" scheme="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx" /><category term="Apple" scheme="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx" /></entry><entry><title>Windows 8 Consumer Preview y Visual Studio 11 Beta</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/02/29/windows-8-consumer-preview-y-visual-studio-11-beta.aspx" /><id>/blogs/rfog/archive/2012/02/29/windows-8-consumer-preview-y-visual-studio-11-beta.aspx</id><published>2012-02-29T16:13:16Z</published><updated>2012-02-29T16:13:16Z</updated><content type="html">&lt;p&gt;&lt;a href="http://metrolatam.net/2012/02/windows-8-consumer-preview-y-visual-studio-11-beta/"&gt;Aquí&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=203585" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx" /><category term="Windows 8" scheme="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx" /></entry><entry><title>"Vivo o muerto" y el C++</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2012/01/09/quot-vivo-o-muerto-quot-y-el-c.aspx" /><id>/blogs/rfog/archive/2012/01/09/quot-vivo-o-muerto-quot-y-el-c.aspx</id><published>2012-01-09T11:40:30Z</published><updated>2012-01-09T11:40:30Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Llevo bastante tiempo sin leer novedades literarias, y menos aún las de esta clase: &lt;em&gt;Vivo o muerto&lt;/em&gt;, Tom Clancy y Grant Blackwood. Y suena a lo que es: un bestseller que aprovecha el tirón del 11S y que forma parte de la serie Jack Ryan del autor. Para los que no saben de qué va, estos libros son novelas de entretenimiento en los que el personaje Jack Ryan, primero analista de la CIA y luego más cosas, termina en medio de los berenjenales más típicos de este tipo de obras: terrorismo, espionaje, etc.. Las novelas estarían mejor si no tuvieran ese pro-USA tan acérrimo. Pero bueno, es lo que hay.&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 os preguntáis qué hace una entrada como esta en un blog como este, os lo diré: id a la página 168 de la edición de Umbriel de 2011 (la única por ahora) y leed conmigo:&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;“Y aunque hubieran examinado aquél [un CD grabado], no habrían visto más que un galimatías incomprensible: datos sólidamente cifrados en lenguaje de programación C++, carentes por completo de sentido.”&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;Sí, yo también me he asustado, y no poco. Vale, es una pifia del traductor, ¿no? Pues no, en el original pone:&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;“Even if that one had been examined, it would have been shown to contain gibberish, robustly encrypted data written in C++ computer code that made no sense at all,”&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;Bueno, pues ya lo sabéis, chicos, el C++ también sirve para encriptar datos. Ya sé que el &lt;em&gt;obfuscated code&lt;/em&gt; puede ser difícil de entender, pero tanto como para incluir elementos encriptados en su código…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Desde luego hay quien oye campanas y se imagina belenes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;En fin.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=202664" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="c++" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="humor" scheme="http://geeks.ms/blogs/rfog/archive/tags/humor/default.aspx" /><category term="criptografía y criptología" scheme="http://geeks.ms/blogs/rfog/archive/tags/criptograf_ED00_a+y+criptolog_ED00_a/default.aspx" /><category term="criptograf&amp;#237;a y criptolog&amp;#237;a" scheme="http://geeks.ms/blogs/rfog/archive/tags/criptograf_26002300_237_3B00_a+y+criptolog_26002300_237_3B00_a/default.aspx" /></entry><entry><title>RAD Studio XE2: ¿Pruebas de integración? ¿Para qué?</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/11/29/rad-studio-xe2-191-pruebas-de-integraci-243-n-191-para-qu-233.aspx" /><id>/blogs/rfog/archive/2011/11/29/rad-studio-xe2-191-pruebas-de-integraci-243-n-191-para-qu-233.aspx</id><published>2011-11-29T11:12:24Z</published><updated>2011-11-29T11:12:24Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Ya las hará el cliente y protestará. En el caso de que tengamos ganas, le ayudaremos. Si no, que se joda.&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 Cochin;"&gt;Esa parece ser la filosofía de Embarcadero para su producto RAD Studio XE2. Para hacernos una idea, lo que ahora trae el XE2 es lo que debería haber traído el XE original, pero ya sabemos, después de varios (muchos) años intentando convertir a la VCL en multiplataforma, llegan, compran un producto cualquiera, y en menos de seis meses lo integran en su RAD Studio, sustituyendo a la vetusta VCL que, por cierto, dio nacimiento a .NET cuando Microsoft se llevó a Anders de Borland.&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 Cochin;"&gt;El sistema de desarrollo es un tanto churrimangui, aunque parece ser que funciona. La idea es tener una máquina Windows con RAD Studio instalado. Puede ser una máquina virtual corriendo dentro de OS X, pero tened mucho cuidado con la compartición de perfiles y demás: en un tris tenéis que volver a activar, porque una de las cosas que mira el entorno para detectar que no lo han &lt;em&gt;tocado&lt;/em&gt; es el nombre del equipo en la red. En fin.&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 Cochin;"&gt;Luego instalas un servidor en OS X, lo que, junto a un debugger de plataforma cruzada, puedes editar y compilar en la máquina Windows y ejecutar y depurar en el MAC. Digo churrimangui porque no es a lo que nos tiene habituados Borland, digo Embarcadero. Encima todo el tema al lado del MAC es por línea de comandos. Cualquier programador de hardware, o ya puestos de teléfonos y similares, verá el paralelismo evidente.&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 Cochin;"&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 Cochin;"&gt;Pero bueno, no es de eso de lo que quiero hablar aquí. Hasta el 32 de diciembre del 2011, hay una oferta que si compras alguna versión del producto, te regalan otros. A veces ha sido comprar C++ Builder (o Delphi) y obtener el otro gratis. La de este año consiste en que te regalan más componentes y otros programas de 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 Cochin;"&gt;Uno de los productos es FastCube, componentes que te ayudan al análisis de datos. En mi caso no creo que me hagan falta, pero podría ser interesante para aquellos que hagan programas de gestión y tengan que presentar datos analizados.&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 Cochin;"&gt;Pues bien, las pruebas de integración de este producto con RAD Studio no se han hecho. No porque si instalas el componente, el producto deja de funcionar. No se trata de algunas configuraciones en concreto, ni que ocurra en ciertas máquinas: pasa siempre.&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 Cochin;"&gt;Si uno se pone a buscar en internet el error que da C++ Builder (que es el que falla, Delphi funciona bien), no encuentras absolutamente nada sobre el tema. Aplicando un poco de lógica, podemos llegar a varias posibles conclusiones:&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 Cochin;"&gt;Nadie está usando C++ Builder, o si lo está, no ha instalado dichos componentes.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Cochin;"&gt;Desde que han sacado la oferta, no han vendido ni una sola copia de C++ Builder o de RAD Studio.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Cochin;"&gt;Nadie está usando el producto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Os dejo con la reflexión antes de pasar a la solució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 Cochin;"&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 Cochin;"&gt;El problema se genera cuando la instalación del producto (que no es de Embarcadero, pero deberían haber hecho el test de integración antes de ponerlo a disposición de la gente tan alegremente) estropea por completo las rutas por defecto del compilador. Es decir, si abrimos el IDE (ya sea la versión completa de RAD Studio o personalidad de C++Builder), y nos vamos a Tools -&amp;gt; Options -&amp;gt; C++ Options -&amp;gt; Paths and Directories, las rutas de &lt;em&gt;Include Path&lt;/em&gt; y de &lt;em&gt;Library Path&lt;/em&gt; quedan completamente inutilizadas porque FastCube, en su soberana sabiduría, ha decidido que nadie más que él debe estar ahí.&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 Cochin;"&gt;Desinstalar el producto no soluciona nada, porque dichas rutas se quedan sin restaurar.&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 Cochin;"&gt;Por lo tanto, la solución pasa por volver a colocar allí dichas rutas. En mi caso son:&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 Cochin;"&gt;&lt;strong&gt;Include:&lt;/strong&gt; $(CG_BOOST_ROOT)\boost\tr1\tr1;$(CG_BOOST_ROOT);$(BDSINCLUDE);$(BDSINCLUDE)\dinkumware;$(BDSINCLUDE)\windows\crtl;$(BDSINCLUDE)\windows\sdk;$(BDSINCLUDE)\windows\rtl;$(BDSINCLUDE)\windows\vcl;C:\Program Files (x86)\FastReports\LibD16;$(BDS)\RaveReports\Lib;C:\Program Files (x86)\Raize\CS5\Lib\RS-XE2\Win32&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Cochin;"&gt;&lt;strong&gt;Lib:&lt;/strong&gt; $(BDSLIB)\win32\release;$(BDSLIB)\win32\release\psdk;C:\Program Files (x86)\FastReports\LibD16;$(BDS)\RaveReports\Lib;C:\Program Files (x86)\Raize\CS5\Lib\RS-XE2\Win32&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;No te garantizo que la instalación haya tocado otras cosas, pero en mi caso, con volver a colocar ahí dichas cadenas, se soluciona el tema.&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 Cochin;"&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 Cochin;"&gt;Por lo tanto, otro coscorrón más para Embarcadero. Y ya os diré cómo funciona el producto, porque voy a usarlo para un proyecto personal.&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 Cochin;min-height:17.0px;"&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201925" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="bugs" scheme="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx" /><category term="C++ Builder" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /></entry><entry><title>Win/MAC: arranque dual y jodimiento de particiones</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/11/19/win-mac-arranque-dual-y-jodimiento-de-particiones.aspx" /><id>/blogs/rfog/archive/2011/11/19/win-mac-arranque-dual-y-jodimiento-de-particiones.aspx</id><published>2011-11-19T12:14:42Z</published><updated>2011-11-19T12:14:42Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Os lo juro. Estoy hasta los putísimos cojones de Windows, de MAC y de la madre que los parió a todos. El primero por pensarse que todo le pertenece, incluyendo las particiones  HFS+, y el segundo por pensar que todos los usuarios son tontos del culo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No tengo muchas ganas de escribir, así que voy a ser bastante escueto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Escenario: Windows/MAC con Boot Camp y arranque dual. Como Windows asigna las unidades como le sale de los cojones, entro en el Administrador de Discos y las cambio a los valores que quiero.&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, todo bien en Windows. Inicio OS X y… una de las tres particiones no se carga. Es decir, habiendo cambiado la letra de unidad a &lt;strong&gt;dos&lt;/strong&gt; particiones HFS+ desde Windows, &lt;strong&gt;una&lt;/strong&gt; de ellas luego no se carga desde OS X porque Windows, en su maravilloso afán de poseerlo todo, ha decidido cambiar cierta cadena de las tablas internas del disco por “&lt;span style="color:#29303b;"&gt;Microsoft Basic Data”. Hay que joderse con tomate. ¿No saben reconocer una partición ajena y no tocar nada? Pues parece ser que no, que tienen ganas de joder la marrana.&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;color:#29303b;"&gt;Bueno, la Utilidad de Discos de OS X se ve incapaz de recuperar la partición. Hala, nueva pérdida de datos. Cuatro máquinas virtuales y un montón de descargas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Pues no, hay solución. Está &lt;a href="http://steelpangolin.wordpress.com/2009/03/15/invalid-bs_jmpboot-in-boot-block-000000/"&gt;aquí&lt;/a&gt;. Otro &lt;em&gt;geek&lt;/em&gt; de la más alta alcurnia se ha encontrado con el mismo problema y ha creado una aplicación en Python para solucionar el problema. Lo único que hace es cambiar dicha cadena por su valor por defecto. Y entonces OS X reconoce la partición como suya y la monta.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Olé sus cojones.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Os cuento cómo hacerlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Desmonta el disco completo en donde esté la partición afectada. Luego graba el fichero &lt;a href="http://bat-country.us/code/GPTools/trunk/gpt_surgeon.py?view=markup"&gt;&lt;em&gt;gpt_surgeon.py&lt;/em&gt;&lt;/a&gt; en disco (ojo con grabar el html y no el contenido del mismo). Aquí viene cuando Apple piensa que somos imbéciles o así. Tu grabas un archivo, que te lo pone como texto de lectura escritura. Pero tu lo quieres de ejecución, porque si no ya puedes darle de sopapos porque se negará a correr.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Hay que añadir el bit de ejecución. ¿Cómo? Ahí está el problema. Desde la interfaz gráfica no se puede, porque CMD-I sólo te dejar cambiar entre lectura y escritura, pero no ejecución.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Quizás haya algún botón por algún lado para activarlo, pero no lo he encontrado, así que tienes que abrir una ventana de terminal y cambiarlo &lt;em&gt;ala &lt;/em&gt;UNIX: &lt;strong&gt;“chmod u+x gpt_surgeon.py”&lt;/strong&gt;. Claro, puede que algún imbécil siga la secuencia desde el Finder y sea capaz de cambiarle los permisos a un troyano. En fin, viva la ergonomía y usabilidad maqueras.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Luego sigues la secuencia explicada en el enlace de arriba:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;./gpt_surgeon.py list /dev/disk&amp;lt;n&amp;gt;, en donde &amp;lt;n&amp;gt; es el disco &lt;em&gt;malo&lt;/em&gt;.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;Localiza la partición jodida, en la que debe aparecer el infame texto de “Microsoft Basic Data”.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;sudo ./gpt_surgeon.py repair /dev/disk&amp;lt;n&amp;gt; &amp;lt;y&amp;gt;, en donde &amp;lt;y&amp;gt; es la partición rota. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;Al poco, OS X (o el script) montará todas las unidades, habiendo reparado la estropeada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Y ya está, esta ha sido la crónica del día de hoy. Cagontó…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Cochin;color:#29303b;min-height:14.0px;"&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201768" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="bugs" scheme="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx" /><category term="tips" scheme="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /><category term="Apple" scheme="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /></entry><entry><title>C++/CX (II). C++/CX vs WRL</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx" /><id>/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx</id><published>2011-11-04T19:13:32Z</published><updated>2011-11-04T19:13:32Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Bueno, una vez que hemos visto lo que hay &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/10/31/c-cx-windows-8-y-el-nuevo-subsistema-winrt-i.aspx"&gt;dentro del nuevo Windows 8&lt;/a&gt;, y comprobado que WinRT &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx"&gt;no es un subsistema&lt;/a&gt; sino algo por encima de Win32 como es .NET, vamos a contaros las dos formas que hay de programar con C++ para la interfaz Metro.&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 Cochin;"&gt;Ya lo he comentado antes, pero voy a repetirlo aquí por mor de claridad. En Windows 8 hay dos escritorios diferentes. Por un lado tenemos el clásico de toda la vida que es prácticamente idéntico al de Windows 7, y por otro el de la interfaz Metro. Si no cambian las cosas, los equipos que lleven un procesador x86 tendrán acceso indistinto a los dos, mientras que aquellos que lleven procesador ARM sólo verán la interfaz Metro.&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 Cochin;"&gt;Eso quiere decir que habrá dos tipos de aplicaciones: las clásicas y las Metro. Las primeras sólo podrán compilarse para x86 (de 32 o de 64 bits) y sólo funcionarán en las máquinas Intel. Si estamos en la interfaz Metro y lanzamos una aplicación de este tipo, el sistema cambiará al escritorio clásico.&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 Cochin;"&gt;Las segundas podrán compilarse para x86 o para ARM y en ambos casos funcionarán en sus propios sistemas, pero siempre bajo la interfaz Metro. Es decir, si queremos que nuestra aplicación Metro escrita con código nativo pueda correr en los dos tipos de arquitectura, tendremos que proveer dos compilaciones.&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 Cochin;"&gt;Con .NET (C# y &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;) viene a pasar lo mismo, aunque en este caso creo que con especificar AnyCPU será suficiente para que la aplicación corra en ambas arquitecturas. Y de nuevo tendremos los dos tipos de aplicaciones: de escritorio y Metro, con las mismas reglas.&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 Cochin;"&gt;Por lo tanto, cualquier programa escrito en cualquier lenguaje que funcione ahora mismo en Windows 7, no debe tener ningún problema en ejecutarse en la siguiente versión, pero siempre en el escritorio clásico. Y podremos seguir escribiéndolos como hasta ahora.&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 Cochin;"&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 Cochin;"&gt;Eso quiere decir que tenemos dos API diferentes e incompatibles entre sí. Por un lado tenemos el API de Win32 clásico y tradicional, sobre el que se construyen bibliotecas de terceros y el .NET. Aquí podemos meter VB6, Delphi, C#, C++/CLI, QT… Vamos, lo que hasta ahora.&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 Cochin;"&gt;Y para Metro hay una nueva API que se llama WinRT. Creo que hay cosas compartidas con Win32, pero no me hagáis mucho caso porque todavía no he visto nada. De todos modos si las hubiera, podemos tomarlas como si fueran nuevas, porque son excluyentes, al menos de momento.&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 Cochin;"&gt;Es decir, o bien desarrollas para Win32 o bien para WinRT, pero no puedes tener un ejecutable que use partes del otro más allá de las que MS ha querido compartir, y entre ellas no se encuentra 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 Cochin;"&gt;Por lo tanto también hay dos versiones de .NET. La de la interfaz Metro se construye sobre WinRT, y la clásica sobre Win32. Nos podemos hacer a la idea de que, aunque tengamos un API con nombres similares, por dentro funciona todo diferente (lo que no es cierto, pero a efectos prácticos sí que lo es, ya que las aplicaciones Metro deberán ir firmadas y el proceso de firmado garantiza que no vas a salirte de las API estándar -¿De qué me sonará eso?).&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 Cochin;"&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 Cochin;"&gt;No obstante, WinRT no está escrito con C++/CX si no que está hecho con C++ clásico. Y en cierto modo es lógico, ya que no es más que una extensión a Win32, que es C y C++. Además, independientemente de mis diatribas personales, es algo bueno que le añada funcionalidad a un API que lleva tanto tiempo funcionando con regularidad y sin grandes problemas. Imaginaos los bugs que podría tener algo escrito desde cero.&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 Cochin;"&gt;Por lo tanto, podemos desarrollar aplicaciones para Metro sin usar .NET ni C++/CX. Podemos utilizar C++ y una biblioteca de plantillas llamada WRL (Windows Runtime Library), que viene a ser algo así como el ATL de Metro.&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 Cochin;"&gt;Microsoft no recomienda usarla, más que nada porque es compleja y porque de momento no hay documentación alguna sobre ella, pero está ahí, y es la base de Metro.&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 Cochin;"&gt;Si queremos echarle un vistazo, podemos acercarnos a “Program Files (x86)\Windows Kits\8.0\Include\winrt\wrl” y ver qué hay dentro. Tomaos un par de aspirinas antes.&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 Cochin;"&gt;Básicamente se trata de toda la infraestructura y parafernalia para acceder a los objetos COM y componentes de Metro.&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 Cochin;"&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 Cochin;"&gt;C++/CX ocupa el nicho de lenguaje nativo para Metro, con lo que es más rápido que C# y que &lt;a href="http://VB.NET"&gt;VB.NET&lt;/a&gt;, y es con el único con el que se puede acceder a DirectX (y por tanto a la creación de juegos). También es nativo. Es decir, que no es .NET y compila al código máquina que todos conocemos y de hecho es idéntico al C++ de toda la vida.&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 Cochin;"&gt;Lo que ocurre es que contiene una serie de extensiones que nos van a facilitar la vida a la hora de operar con Metro y sus componentes. Soporta clases parciales, se entiende bien con XAML e instanciar o crear un componente COM es un juego de niños comparado a como se hace con Win32.&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 Cochin;"&gt;Digamos que con esas extensiones nos ahorramos una buena faena a la hora de programar, y será el compilador el que sustituya esa &lt;em&gt;azúcar sintáctica&lt;/em&gt; por el código necesario.&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 Cochin;"&gt;En siguientes entradas os contaré más sobre C++/CX.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201533" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx" /><category term="lenguajes" scheme="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /><category term="C++/CX" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx" /></entry><entry><title>¿WinRT un subsistema? No, no lo es</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx" /><id>/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx</id><published>2011-11-02T16:41:00Z</published><updated>2011-11-02T16:41:00Z</updated><content type="html">&lt;p&gt;Bueno, al final no ha costado mucho encontrarlo. B&amp;aacute;sicamente, el resultado de esta investigaci&amp;oacute;n es:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_4ACD74FC.png"&gt;&lt;img height="138" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_08EBB110.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O con otras palabras: WinRT y Metro se ejecutan, como todo lo dem&amp;aacute;s, sobre Win32, con las ventajas y los inconvenientes que eso pueda tener. No me malinterpret&amp;eacute;is: no hay nada malo que la arquitectura sea diferente a la indicada en el gr&amp;aacute;fico de arriba, lo que est&amp;aacute; mal es que Microsoft nos mienta tan descaradamente. Simplemente eso.&lt;/p&gt;
&lt;p&gt;Si lo han hecho as&amp;iacute;, por algo ser&amp;aacute; y sus motivos tendr&amp;aacute;n, y es entonces cuando, ya definitivamente, yo ten&amp;iacute;a raz&amp;oacute;n: Windows ya no es Windows NT, y su grandiosa arquitectura por bloques se ha perdido en el camino. Y esto s&amp;iacute; que es malo, bastante malo, porque estamos volviendo a un batiburrillo de c&amp;oacute;digo como es, por cierto, el OS X (quiz&amp;aacute;s alg&amp;uacute;n d&amp;iacute;a hable de ello).&lt;/p&gt;
&lt;p&gt;Vosotros mismos pod&amp;eacute;is comprobarlo sin problema alguno y de forma muy r&amp;aacute;pida. Ten&amp;eacute;is que construir dos aplicaciones, una WinRT en C++/CX y otra cl&amp;aacute;sica de Win32. No hay m&amp;aacute;s que utilizar las plantillas por defecto sin ning&amp;uacute;n cambio.&lt;/p&gt;
&lt;p&gt;Eso s&amp;iacute;, hay que hacerlo a partir de la versi&amp;oacute;n Developer de 64 bits de Windows 8, e instalar una versi&amp;oacute;n de la MSDN, porque la Express creo que no es capaz de generar programas Win32 puros.&lt;/p&gt;
&lt;p&gt;He llamado &amp;ldquo;TestWin32&amp;rdquo; a mi aplicaci&amp;oacute;n tradicional, que genera una ventana de Windows normal y corriente utilizando directamente el API de Win32. A la Metro la he llamado &amp;ldquo;TestSplitApplication&amp;rdquo;. Una vez generadas, tenemos que compilarlas. Visual Studio se os quedar&amp;aacute; m&amp;aacute;s o menos as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_33C6A5D3.png"&gt;&lt;img height="161" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_55B49908.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si ahora nos vamos a la carpeta en donde est&amp;aacute; almacenado el proyecto (que podemos hacer desde el mismo IDE posicion&amp;aacute;ndonos en el nombre de la soluci&amp;oacute;n en el Explorador y elegimos &lt;i&gt;Open Folder in Windows Explorer&lt;/i&gt;), carpeta &lt;i&gt;Debug&lt;/i&gt;, encontraremos el ejecutable del programa nativo (&lt;i&gt;TestWin32.exe&lt;/i&gt;) y dentro de la carpeta &lt;i&gt;TestSplitApplication&lt;/i&gt;, el de la aplicaci&amp;oacute;n Metro.&lt;/p&gt;
&lt;p&gt;(Por cierto, en uno de esos lapsus teclae tan habituales en mi, le he dado el nombre de &amp;ldquo;TestSplitApplicarion&amp;rdquo; en lugar del correcto.)&lt;/p&gt;
&lt;p&gt;Ahora debemos conseguir el &lt;a href="http://www.dependencywalker.com/"&gt;&lt;i&gt;Dependency Walker&lt;/i&gt;&lt;/a&gt;, aunque existen otras herramientas de l&amp;iacute;nea de comandos que nos permiten hacer lo mismo dentro del SDK, lo interesante es utilizar esta porque lo veremos todo de un golpe. El mayor problema es que se trata de una utilidad que hace tiempo que no se incluye en ning&amp;uacute;n SDK, por lo que hay que conseguirla de &lt;a href="http://www.dependencywalker.com/"&gt;forma externa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una vez obtenida la versi&amp;oacute;n de 32 bits, porque nuestros proyectos son de dicho tipo, la ejecutamos sobre cada uno de los dos programas. Este es el resultado:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_7E53050F.png"&gt;&lt;img height="161" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_19B00966.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;iquest;Lo veis? Ambos programas importan las mismas DLL, las de Win32 como KERNEL32.DLL y USER32.DLL.&lt;/p&gt;
&lt;p&gt;Es decir que ambos son aplicaciones Win32 nativas.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;Si nos diera por abrir, por ejemplo, uno de los dos KERNEL32.DLL, ver&amp;iacute;amos que ambas DLL son la misma con las mismas dependencias y exportaciones. Por lo tanto, ambas aplicaciones dependen del mismo subsistema.&lt;/p&gt;
&lt;p&gt;Reitero que es una tonter&amp;iacute;a, pero no lo es cuando intentan enga&amp;ntilde;arte.&lt;/p&gt;
&lt;p&gt;Lo que s&amp;iacute; parece han hecho ha sido &lt;i&gt;romper&lt;/i&gt; KERNEL32.DLL en otros ficheros m&amp;aacute;s peque&amp;ntilde;os que contemplan subconjuntos de lo que en versiones anteriores hab&amp;iacute;a en &amp;eacute;l. Quiz&amp;aacute;s de esta forma reduzcan la huella de memoria evitando cargar sub ficheros cuando estos no se vayan a utilizar.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;Esto nos lleva a un tercer problema: parecer ser que una aplicaci&amp;oacute;n Metro no puede ejecutar funciones de Win32, y una de Win32 tampoco de WinRT.&lt;/p&gt;
&lt;p&gt;&amp;iexcl;&amp;iexcl;Pero si es el mismo subsistema!!&lt;/p&gt;
&lt;p&gt;Pues bien, estamos ante una limitaci&amp;oacute;n artificialmente impuesta por Microsoft sin ning&amp;uacute;n motivo t&amp;eacute;cnico aparente&amp;hellip; con lo guapo que ser&amp;iacute;a hacer aplicaciones Win32 con C++/CX&amp;hellip;&lt;/p&gt;
&lt;p&gt;Se me ocurren un par de trucos para poder forzar esto, pero no creo que valga la pena hacerlo en una versi&amp;oacute;n tan temprana como esta. Quiz&amp;aacute;s cuando salga la definitiva, si tengo ganas y si nadie m&amp;aacute;s se me adelanta, lo intente.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201435" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx" /><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="Win32" scheme="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx" /><category term="Biblioteca de C++" scheme="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /><category term="C++/CX" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx" /></entry><entry><title>C++/CX  (I). Windows 8 y el nuevo subsistema WinRT</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/10/31/c-cx-windows-8-y-el-nuevo-subsistema-winrt-i.aspx" /><id>/blogs/rfog/archive/2011/10/31/c-cx-windows-8-y-el-nuevo-subsistema-winrt-i.aspx</id><published>2011-10-31T14:34:00Z</published><updated>2011-10-31T14:34:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_47C30F25.png"&gt;&lt;img height="137" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_6774799E.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Observad con detalle la imagen de arriba. Fijaos en que est&amp;aacute; dividida en dos grandes bloques. A poco que os haya preocupado la arquitectura l&amp;oacute;gica de Windows, os dar&amp;eacute;is cuenta de que hay nueva chica en la oficina: WinRT. &lt;/p&gt;
&lt;p&gt;Ya habl&amp;eacute; de algo as&amp;iacute; &lt;a href="http://geeks.ms/blogs/rfog/archive/2011/03/19/mac-rationale-vs-windows-rationale-en-el-desarrollo.aspx"&gt;aqu&amp;iacute;&lt;/a&gt;, pero en relaci&amp;oacute;n con la arquitectura de Apple comparada con la de Windows, y de los &amp;uacute;ltimos cambios que Microsoft ha ido haciendo para adecuar su plataforma NT para que sea funcional y &amp;uacute;til para el usuario medio, dejando un poco de lado la arquitectura tradicional.&lt;/p&gt;
&lt;p&gt;Pues bien, parece ser que me tengo que comer mis palabras con patatas (no, no &lt;i&gt;esas patatas&lt;/i&gt;, Z). Volviendo al gr&amp;aacute;fico anterior, WinRT es un nuevo subsistema igual que lo es Win32. Para aquellos que no tengan claro qu&amp;eacute; es, os cuento un poco la arquitectura te&amp;oacute;rica de Windows NT.&lt;/p&gt;
&lt;p&gt;El sistema operativo cuenta con un kernel (s&amp;iacute;, como el de Linux, pero con muchas m&amp;aacute;s cosas dentro de &amp;eacute;l y mucho m&amp;aacute;s din&amp;aacute;mico), que en teor&amp;iacute;a se asienta sobre una capa HAL que abstrae a dicho n&amp;uacute;cleo de la arquitectura f&amp;iacute;sica. En su momento hubo HAL para ARM y para otras plataformas. En la actualidad s&amp;oacute;lo la hay para x86, tanto en versi&amp;oacute;n de 32 como de 64 bits.&lt;/p&gt;
&lt;p&gt;O eso cre&amp;iacute;a tras haber hecho un somero an&amp;aacute;lisis de las tripas de Windows 7. Pues bien, si Microsoft a&amp;ntilde;ade soporte para ARM (y recordemos que van a salir procesadores de este tipo de 64 bits), dicha capa debe ser o bien reimplementada o bien ya exist&amp;iacute;a y simplemente estaba inactiva. O lo que me parece m&amp;aacute;s l&amp;oacute;gico: recompilar todo el sistema operativo para que se ejecute en dicha arquitectura, cambiando lo que haya que cambiar, dado que eso de traducir cualquier otro procesador a x86, sobre todo desde un ARM, suena a fantas&amp;iacute;a animada de ayer y de hoy.&lt;/p&gt;
&lt;p&gt;Por otro lado, Windows se mueve mediante subsistemas. Uno de ellos es Win32. Otro lo fue OS/2 y tambi&amp;eacute;n Posix (s&amp;iacute;, en un pasado lejano, Windows NT era capaz de ejecutar comandos de unix con las primitivas de desarrollo que tiene la parte est&amp;aacute;ndar Posix de Unix). Es decir, un subsistema suministra cierta abstracci&amp;oacute;n sobre el n&amp;uacute;cleo, proporcionando un API mucho m&amp;aacute;s rico y potente. Y de paso lo a&amp;iacute;sla para que las aplicaciones sean incapaces de tumbarlo.&lt;/p&gt;
&lt;p&gt;En otras palabras, Win32 se ejecuta en el anillo 3 y el n&amp;uacute;cleo en el cero, y es Win32 el que, cuando una aplicaci&amp;oacute;n pide alg&amp;uacute;n recursos del sistema (por ejemplo un puerto serie), el que se encarga de mover la petici&amp;oacute;n y de realizar tareas intermedias, evitando as&amp;iacute; que un mal uso por parte de una aplicaci&amp;oacute;n genere una pantalla azul. &lt;/p&gt;
&lt;p&gt;Digamos que una aplicaci&amp;oacute;n en el anillo 3 jam&amp;aacute;s podr&amp;aacute; tumbar al sistema ejecut&amp;aacute;ndose en el anillo 0, o al menos esa es la teor&amp;iacute;a. A veces un par&amp;aacute;metro mal pasado puede terminar en una ca&amp;iacute;da completa, pero no es lo habitual, y cada vez menos.&lt;/p&gt;
&lt;p&gt;Pues bien, aparte de Win32, ahora tenemos un nuevo subsistema llamado WinRT. O eso dice, al menos la teor&amp;iacute;a y as&amp;iacute; nos lo presenta Microsoft en sus gr&amp;aacute;ficos y en la escas&amp;iacute;sima informaci&amp;oacute;n de la que disponemos.&lt;/p&gt;
&lt;p&gt;Una de mis pr&amp;oacute;ximas tareas es la de intentar averiguar si esto es as&amp;iacute; o no lo es. No es la primera vez que Microsoft miente descaradamente, como cuando dijo de XAML no iba a necesitar de Win32 y que desaparec&amp;iacute;an los bucles de mensajes y que se ejecutar&amp;iacute;a sobre DirectX&amp;hellip; Hasta donde s&amp;eacute;, todav&amp;iacute;a eso no es del todo cierto.&lt;/p&gt;
&lt;p&gt;Tambi&amp;eacute;n nos dijo que .NET iba a ser un subsistema, y realmente se ha quedado como una capa sobre Win32&amp;hellip;&lt;/p&gt;
&lt;p&gt;Por lo tanto, estad atentos al blog. Adem&amp;aacute;s, el dibujo original de Microsoft deja mucho que desear respecto a la claridad, presentando Internet Explorer y .NET como subsistemas independientes de Win32, lo que es, a todas luces, completamente falso:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_3B577CAD.png"&gt;&lt;img height="138" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/image_5F00_thumb_5F00_0E673B34.png" alt="image" border="0" title="image" style="background-image:none;border-bottom:0px;border-left:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;Volviendo al gr&amp;aacute;fico de arriba, podemos ver algunos detalles que creo no son del todo ciertos, pero nos dan una idea de la arquitectura del nuevo WinRT (sobre la que se basa la interfaz METRO que llevar&amp;aacute;, junto al escritorio tradicional, Windows 8).&lt;/p&gt;
&lt;p&gt;(Una de las cosas por las que dudo que WinRT sea un subsistema completo es el hecho de que Windows 8 consuma menos memoria que el 7 y de que se pueda producir ese intercambio tan r&amp;aacute;pido entre los dos escritorios, lo que me hace pensar que, de nuevo, se trata de algo sobre Win32).&lt;/p&gt;
&lt;p&gt;En WinRT hay dos interfaces de desarrollo principales: XAML y HTML. Es decir, podemos hacer aplicaciones &lt;i&gt;cl&amp;aacute;sicas&lt;/i&gt; basadas en el primer modelo y &lt;i&gt;modernas&lt;/i&gt; en el segundo.&lt;/p&gt;
&lt;p&gt;A simple vista puede parecer que en ambas se utiliza una misma variaci&amp;oacute;n del XML, pero no es as&amp;iacute;. En el caso de HTML/CSS nuestra aplicaci&amp;oacute;n no ser&amp;aacute; otra cosa m&amp;aacute;s que una &lt;i&gt;p&amp;aacute;gina web&lt;/i&gt; ejecut&amp;aacute;ndose dentro de una sesi&amp;oacute;n m&amp;aacute;s o menos oculta de Internet Explorer. Tendremos acceso a esas dos tecnolog&amp;iacute;as (incluyendo HTML5) y JavaScript como &lt;i&gt;lenguaje&lt;/i&gt; de desarrollo. &lt;/p&gt;
&lt;p&gt;En el caso de XAML, estamos ante la &lt;i&gt;&amp;uacute;ltima&lt;/i&gt; evoluci&amp;oacute;n de las interfaces de usuario din&amp;aacute;micas en las que la interfaz est&amp;aacute; completamente (o lo m&amp;aacute;s posible) separada del c&amp;oacute;digo en s&amp;iacute;, lo que permite una soltura nunca vista hasta ahora. O al menos esa es la teor&amp;iacute;a y casi os dir&amp;iacute;a que la pr&amp;aacute;ctica.&lt;/p&gt;
&lt;p&gt;XAML es muy potente. Demasiado, casi dir&amp;iacute;a. Se trata de una especie de colecci&amp;oacute;n de contenedores jer&amp;aacute;rquicos que pueden actuar como tales o como elementos finales, y pueden &lt;i&gt;mutar&lt;/i&gt; de un tipo a otro con una facilidad pasmosa. De hecho, cambiar el aspecto visual de una aplicaci&amp;oacute;n XAML puede llegar a ser cosa de unas pocas &amp;ndash;muy pocas- l&amp;iacute;neas de c&amp;oacute;digo, con el a&amp;ntilde;adido de que quien haya desarrollado con .NET y la versi&amp;oacute;n anterior, est&amp;aacute; casi listo para esta nueva (que por cierto no es mi caso, pese a ver en su momento las ventajas evidentes del nuevo modelo).&lt;/p&gt;
&lt;p&gt;Por lo tanto, los programadores de .NET que hayan abandonado Windows Forms por la nueva forma, lo tendr&amp;aacute;n bastante f&amp;aacute;cil. Los dinosaurios como yo mismo tendremos ciertas dificultades en adaptarnos&amp;hellip; o no.&lt;/p&gt;
&lt;p&gt;&amp;iquest;Record&amp;aacute;is C++/CLI, el C++ del .NET? Pues bien, la &amp;uacute;nica pega para que dicha extensi&amp;oacute;n de C++ pudiera utilizar XAML es que no se soportan las clases parciales como en C o en VB.NET. Por desgracia, eso sigue siendo as&amp;iacute;, y la interfaz cl&amp;aacute;sica continua estando vedada para los programadores de C++ en .NET, quedando limitados a Windows Forms y a un IDE que no es que se muestre muy estable manejando el lenguaje&amp;hellip;&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;Bueno, ahora, por fin, entra C++/CX. &amp;iquest;Qu&amp;eacute; es? Nada m&amp;aacute;s y nada menos que una nueva extensi&amp;oacute;n a C++, con una sintaxis muy similar a C++/CLI pero con un prop&amp;oacute;sito muy diferente: el de soportar METRO y XAML. Y no, no es .NET. Es nativo.&lt;/p&gt;
&lt;p&gt;Supongo que Microsoft se plante&amp;oacute; ante una disyuntiva muy pero que muy gorda: el rendimiento de .NET es suficiente para un PC, pero no lo es para una plataforma m&amp;oacute;vil como una tableta. No estoy diciendo que sea malo, estoy diciendo que eso de tener una m&amp;aacute;quina virtual consumiendo memoria y recursos, un &lt;i&gt;jitter&lt;/i&gt; ejecut&amp;aacute;ndose detr&amp;aacute;s de todo, y un post-compilador pasando MSIL a c&amp;oacute;digo nativo no es de recibo para un Tablet.&lt;/p&gt;
&lt;p&gt;Delante de todos est&amp;aacute; el fracaso de Android. Por favor, absteneros fundamentalistas y otros p&amp;aacute;jaros de similar cala&amp;ntilde;a: Android es un fracaso. Puede que aguante unos cuantos a&amp;ntilde;os, pero terminar&amp;aacute; por caer estrepitosamente, tanto por problemas t&amp;eacute;cnicos (demasiado consumo de memoria, demasiada lentitud, demasiadas capas una encima de otra, demasiadas ca&amp;iacute;das) como por comerciales (demasiada fragmentaci&amp;oacute;n, demasiado abandono de terminales a medio hacer), etc..&lt;/p&gt;
&lt;p&gt;Por lo tanto, para competir en igualdad de condiciones, tenemos que darle ca&amp;ntilde;a a iOS. Se debe hacer algo similar, y ese algo es WinRT y C++/CX. No hay m&amp;aacute;quina virtual .NET, ni nada oculto (o eso quiero creer), tan solo un motor de ejecuci&amp;oacute;n, una interfaz y el propio sistema operativo. O en otras palabras: objetive-c, cocoa y lo que quiera que haya en el n&amp;uacute;cleo de iOS (parece ser que un BSD recortadito).&lt;/p&gt;
&lt;p&gt;Otro problema es la arquitectura. Ya se ha demostrado que x86 es demasiado pesado y demasiado hambriento de energ&amp;iacute;a como para ser &amp;uacute;til en el mercado m&amp;oacute;vil, por lo que hay que subirse al carro de ARM, que son micros mucho menos complejos y por tanto consumen mucho menos y andan m&amp;aacute;s &lt;i&gt;sueltos&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;Por lo tanto se necesita algo diferente, algo mucho m&amp;aacute;s liviano. Y eso, de nuevo, es WinRT. Por lo tanto, la combinaci&amp;oacute;n ganadora es C++/CX, XAML y, c&amp;oacute;mo no, C# y VB.NET corriendo sobre una variaci&amp;oacute;n de .NET llamada .NET 4.5 WinRT (y que funcionar&amp;aacute; m&amp;aacute;s lento y consumir&amp;aacute; m&amp;aacute;s bater&amp;iacute;a que una aplicaci&amp;oacute;n realizada con C++/CX).&lt;/p&gt;
&lt;p&gt;Pero el n&amp;uacute;cleo, el centro de todo, es C++ y WinRT. Luego est&amp;aacute; .NET, encima igual que en Win32. Como debe ser. Y de nuevo abst&amp;eacute;ngase fundamentalistas. Si lo han hecho por algo ser&amp;aacute;. Quien cae del &amp;aacute;rbol a tiempo todav&amp;iacute;a puede recuperarse.&lt;/p&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;p&gt;C++/CX no es .NET. Es nativo. Y la parte CX no es m&amp;aacute;s que un envoltorio c&amp;oacute;mo para los interfaces COM, ese animal mitol&amp;oacute;gico con el que los programadores de C++ nos tenemos que enfrentar de tiempo en tiempo y que nos pone los pelos de punta.&lt;/p&gt;
&lt;p&gt;Es decir, la parte CX s&amp;oacute;lo se utiliza para interactuar con XAML y los componentes que se hayan creado a tal efecto. Luego, nuestro c&amp;oacute;digo ser&amp;aacute; C++ normal y corriente, con la STL, los &lt;i&gt;streams&lt;/i&gt; (que personalmente pienso que no son muy &amp;uacute;tiles), Boost o lo que queramos usar y est&amp;eacute; disponible. Desarrollo determinista por completo, sin recolector de basura (a no ser que nos hagamos uno), sin elementos ocultos excepto el envolvente COM que han llamado CX y que nos servir&amp;aacute; para interactuar con los componentes.&lt;/p&gt;
&lt;p&gt;Otra ventaja de C++/CX sobre .NET es que, si quieres hacer un juego sobre DirectX, tendr&amp;aacute;s que usarlo ya que ni C# ni VB.NET est&amp;aacute;n soportados, de nuevo como debe ser.&lt;/p&gt;
&lt;p&gt;Ah, y con soporte para clases parciales, lo que&amp;hellip; bueno, mejor lo dejamos para m&amp;aacute;s adelante.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201432" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="c++/cli" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx" /><category term="c++" scheme="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx" /><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="lenguajes" scheme="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx" /><category term="Win32" scheme="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx" /><category term="Biblioteca de C++" scheme="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx" /><category term="C++/CX" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx" /></entry><entry><title>Code Complete 2, Steve McConnell</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/10/27/code-complete-2-steve-mcconnell.aspx" /><id>/blogs/rfog/archive/2011/10/27/code-complete-2-steve-mcconnell.aspx</id><published>2011-10-27T18:51:12Z</published><updated>2011-10-27T18:51:12Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;Ñas. Por fin lo he leído. Más de un año para acabarlo. Entre lo que os conté con mi jefe y la empresa, y cierto bajón existencial, dejé de leer temas técnicos, pero creo que he vuelto, o eso espero.&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 Cochin;"&gt;Bueno, al rollo.&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 Cochin;"&gt;Lo primero de todo, y pese a que me vais a llamar de todo, el libro no me ha aportado nada nuevo, salvo quizás en los últimos capítulos cuando habla de integraciones y manejo de grandes grupos de programadores, entre los que no me cuento. Es decir, o bien programo solo o bien en pareja o para un tercero, haciendo rutinas de bajo nivel o bibliotecas (DLL, como las llama mi jefe).&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 Cochin;"&gt;Lo único ha sido la sorpresa de encontrar veinte años de experiencia condensados en un solo libro. Y lo que falta, que no es poco. Pero bueno, lo cierto es que este libro tienes que leerlo.&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 Cochin;"&gt;Si no lo has hecho, cómpralo y ponte a ello, porque seguro que te va a resultar constructivo. Y si te dice cosas nuevas, vuélvelo a leer cada año o cada seis meses. O si eres de los que va despacio, cuando termines por una punta, cógelo por la otra.&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 Cochin;"&gt;Es increíble lo que pueden dar ochocientas páginas, pero lo dan.&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 Cochin;"&gt;Te pego una cita, sacada de &lt;a href="http://www.antronio.com/topic/1002952-code-complete-2-el-libro-esencial-de-los-programadores/"&gt;aquí&lt;/a&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 Cochin;min-height:17.0px;"&gt; &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Cochin;"&gt;Si sólo tienes oportunidad de leer un libro sobre desarrollo de software en toda tu vida, procura que sea éste. Code Complete es prácticamente la biblia del desarrollo de software, además de una de las mejores guías prácticas sobre la programación de todos los tiempos. Es un libro muy fácil de leer, entretenido, y tremendamente práctico, con montones de recomendaciones útiles para cada fase del ciclo de vida del software. El simple hecho de leerlo te hará mejor programador. Seguro.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:10.0px Cochin;min-height:12.0px;"&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 Cochin;"&gt;Con eso creo que basta.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201402" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="libros" scheme="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx" /><category term="lenguajes" scheme="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx" /></entry><entry><title>El compilador como servicio</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/10/21/el-compilador-como-servicio.aspx" /><id>/blogs/rfog/archive/2011/10/21/el-compilador-como-servicio.aspx</id><published>2011-10-21T17:16:52Z</published><updated>2011-10-21T17:16:52Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Me he quedado poco menos que estupefacto con &lt;a href="http://blogs.msdn.com/b/somasegar/archive/2011/10/19/roslyn-ctp-available-now.aspx"&gt;esta entrada&lt;/a&gt; del blog de SomaSegar. Y no, no penséis mal, que no es malo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Básicamente viene a decirnos que está disponible la CTP de “Roslyn”, que según entiendo es una extensión -de momento- a Visual Studio 2010 SP1. De hecho nos la &lt;a href="http://msdn.microsoft.com/es-es/roslyn"&gt;podemos bajar&lt;/a&gt; y jugar con ella.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Comienza diciendo que los compiladores se han venido haciendo en C++ nativo, pero que ya es hora de cambiar y que han rehecho los compiladores de C# y de Visual Basic desde cero en… Visual Basic.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Hay que joderse. La primera en la boca. ¿Pero no decían que el compilador y el propio .NET estaban hechos en C# (lo siento, no encuentro la referencia)? Ahora no, ahora resulta que C# está escrito en C++.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Y la segunda, también: C# está hecho en Visual Basic.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;O están tontos, o yo no me entero, o mienten más que hablan. Para nada me extraña de que hubieran mentido en lo de hacer C# en C++, de hecho es lo lógico y coherente, ¡pero construirlo todo en VB?&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;De todos modos dejemos esto aquí, corramos un estúpido velo, y centrémonos en el meollo del artículo: compilador como servicio.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Es decir, en Visual Studio 11 los compiladores de C# y VB no serán ejecutables, sino servicios expuestos al público (espero que haya uno para invocarlo desde la línea de comandos), de modo que cualquiera podrá compilar.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No solo eso, sino que dejarán de ser una &lt;em&gt;caja negra&lt;/em&gt; que, a partir de un código fuente, genera una salida compilada, sino que podremos acceder a los diferentes estados del proceso de compilación, e incluso podremos realizar solo unos pasos, como análisis semántico o la obtención del código IL (ensamblador del .NET).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Eso posibilita la creación de &lt;em&gt;scripts&lt;/em&gt; en una consola interactiva. ¿Recuerdan la consola aquella que tenía el Visual FoxPro que permitía ir encadenando comandos como si programáramos? Pues lo mismo, pero en VB y en C#. Vamos, que reinventan la rueda.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;En la entrada original hay un par de imágenes enseñando lo que puede hacer.&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;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201299" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Visual Studio" scheme="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx" /><category term="lenguajes" scheme="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx" /></entry><entry><title>Paragon HFS+ para Windows o cómo reventar un MAC</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/10/18/paragon-hfs-para-windows-o-c-243-mo-reventar-un-mac.aspx" /><id>/blogs/rfog/archive/2011/10/18/paragon-hfs-para-windows-o-c-243-mo-reventar-un-mac.aspx</id><published>2011-10-18T20:07:50Z</published><updated>2011-10-18T20:07:50Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Cuando uno está en esto del &lt;em&gt;switching indeciso&lt;/em&gt;, que no sabe si irse para Pinto o para Valdemoro, le pueden pasar cosas como la que os voy a contar.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Todos sabéis que desde hace unos años Apple permite la ejecución de Windows sobre su hardware compatible, y que suministra no sólo los drviers (que funcionan cojonudos), sino las herramientas necesarias para tener un arranque dual sin mucho problema. Por tener, hasta tenemos soporte de lectura para el formato de ficheros HFS+, con lo que veremos sin problemas las unidades del MAC, aunque no podremos escribir en ellas.&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 suposición personal es que, así, no podremos trastear en un sistema de ficheros en el que es peligroso tocar si no está cargado el sistema operativo. (Lo que viene a ser igual que con Windows, ya que si tenemos arranque dual, la instalación que no se haya iniciado podría ser fácilmente estropeada por algún zarpas, léanseme: yo mismo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Pues bien, hasta aquí todo perfecto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Supongamos ahora que queremos soporte de escritura. Porque somos así de chulos y así de molones, porque nosotros lo valemos. O simplemente porque tenemos una unidad de disco externo con nuestro MAC que también queremos usar en Windows.&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, la formateamos con FAT32 y listo. No os lo aconsejo. Aparte de que es un sistema de ficheros no muy robusto, carece de sistema de permisos y tiene otras limitaciones en cuanto a los nombres de los ficheros. Y si encima tienes ya ocupados unos cuantos gigas, como que se hace cuesta arriba la conversión.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;¿Podemos escribir en HFS+ desde Windows? La respuesta corta es que sí. La larga es que mejor no lo hagas. Me explico.&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;a href="http://www.paragon-software.com"&gt;Paragon Software Group&lt;/a&gt; cuenta con un &lt;a href="http://www.paragon-software.com/home/hfs-windows/"&gt;driver para Windows&lt;/a&gt; (tanto de 32 como de 64 bits) que permite eso mismo: leer y escribir sin problemas sobre particiones HFS+. O eso dicen.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;En mi caso ha sido un desastre total. No sólo me ha jodido la partición donde estaba el OS X (que no tendría mayor problema) sino que también ha destrozado otra sobre la que no estaba escribiendo, alojada en un disco externo por FireWire 800.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Me tocó reinstalar el OS X desde el DVD de Lion (porque de paso borré todo el disco interno del iMAC e hice una instalación limpia para ver si se me iban los problemas al actualizar a la 10.7.2) y olvidarme de los datos que había en el disco externo, algo así como medio Tera en máquinas virtuales, ISOs descargadas y otras copias de seguridad…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Así que ya sabéis, tomaos con calma el “HFS+ for Windows” y probadlo extensamente antes de pasar a producción.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201243" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="Sistemas Operativos" scheme="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx" /><category term="windows" scheme="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx" /><category term="chapuzas" scheme="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx" /><category term="bugs" scheme="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /><category term="seguridad" scheme="http://geeks.ms/blogs/rfog/archive/tags/seguridad/default.aspx" /></entry><entry><title>iCloud o la flagrante tontería</title><link rel="alternate" type="text/html" href="/blogs/rfog/archive/2011/10/16/icloud-o-la-flagrante-tonter-237-a.aspx" /><id>/blogs/rfog/archive/2011/10/16/icloud-o-la-flagrante-tonter-237-a.aspx</id><published>2011-10-16T11:09:38Z</published><updated>2011-10-16T11:09:38Z</updated><content type="html">&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Cochin;"&gt;¿Sabéis lo que es iCloud? Aunque digáis que sí, me juego un gallifante a que no. ICloud es una mierda envuelta en papel brillante, un trozo de bisutería rodeado de oro del que cagó el moro.&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 Cochin;"&gt;Acabo de comprobarlo. Tengo dos iMAC, un iPad, un iPod y un iPhone (este del curro, que todavía no he actualizado).&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 Cochin;"&gt;Como sabéis, hace unos días salieron todas las actualizaciones de golpe, tanto para el escritorio como para los dispositivos móviles. En mi caso la actualización a Lion 10.7.2 se realizó sin problemas, salvo una notable ralentización del sistema una vez reiniciado, ralentización que parece es temporal ya que ahora funciona todo casi igual de rápido que antes… excepto algún que otro &lt;em&gt;rosetón multicolor de la muette&lt;/em&gt; que deja mi i7 de cuatro núcleos dobles y 12 GB de RAM como autista unos segundos… Eso no lo hacía antes de aplicar el parche.&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 Cochin;"&gt;No obstante, la actualización de los dispositivos móviles ha sido más que penosa. En primer lugar falló la descarga y la actualización. Me dio el infausto “internal error” causado por la caída de los servidores de Apple. Hay que joderse, con la expectativa generada y que la empresa no fuera capaz de preverlo con antelación. Joder, hasta Microsoft, el denostado Microsoft, cuando saca un producto nuevo que es muy esperado, aumenta y confía en terceros para las descargas…&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 Cochin;"&gt;Pero no todo termina ahí, no. El iPod se actualizó más o menos bien, a la tercera o la cuarta, pero el iPad hubo de sufrir bastantes intentos. O bien se quedaba autista o bien simplemente fallaba. Como tengo casi 40 GB de datos en él, y la interrupción se producía casi al final, la cosa llevaba su tiempo. Al final, restauración de fábrica, instalación de las aplicaciones y vuelta a meter los datos. Menos mal que soy un chico previsor y los tengo en el MAC, listos en sus carpetas. Eso sí, todavía estoy configurando programas…&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 Cochin;"&gt;¡Quietos parados, fanboys! A ver. Uno mete el iPad, te dice que tiene una actualización, le dices que sí, y a medias falla. No hay otra. No es mi culpa. Es de Apple. Por el motivo que sea. Mi iPad está impoluto, sin Jailbreak, sin cosas raras. Ya que está todo cerrado, debería funcionar a la primera, porque si no me vuelvo a Windows que me deja hacer lo que quiera sin más, y si falla puedo achacarlo a mi ineptitud, no a la de Apple. [Como colofón a esto, no soy el primero que ha tenido problemas. Básicamente la actualización a iOS 5 ha sido pésima. También quiero pensar que no se trata de un intento de que estampe mi iPad 1 contra la pared y me compre un 2.]&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 Cochin;"&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 Cochin;"&gt;Bueno, ahora sí, ahora hablemos de la &lt;em&gt;magia&lt;/em&gt; de la cosa esa del iCloud. ¿Os pensáis que es una versión mejorada de Dropbox? Juas, ni se le acerca. Hasta el infausto &lt;em&gt;SkyDrive&lt;/em&gt; de Microsoft es mejor.&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 Cochin;"&gt;No, no es que vaya mal, es que no cumple mis expectativas. Es una decepción total, más que total, humillante. Lo único que te va a guardar iCloud son los documentos de Pages, de Office (a mi no me lo hace), tus fotos y los calendarios… pero los que crees en la nube. Es decir, la cacareada sincronización sólo se va a producir entre los documentos &lt;em&gt;políticamente correctos&lt;/em&gt; que, como siempre, le vengan en gana a Apple. No mis documentos. No mis fotos ya hechas, no los documentos que yo quiera, no.&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 Cochin;"&gt;Y encima, como elemento de &lt;em&gt;obsolescencia programada&lt;/em&gt;, si quieres tus documentos en la nube, paga por nuevas versiones que lo soporten. Asco me da. Decepción. Tristeza.&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 Cochin;"&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 Cochin;"&gt;En serio, tengo una extraña sensación que me parece que, conforme va pasando el tiempo, es más fuerte y coherente: cuanta más cuota de mercado coge Apple, más se parece a los peores tiempos de Microsoft, con fallos estúpidos, dejadez en atender los requisitos de los clientes y olvidarse de que uno debe estar al loro con las actualizaciones de seguridad y que no debe esperar dos meses a, por ejemplo, invalidar una entidad certificadora. Es una especie de &lt;em&gt;deja-vu&lt;/em&gt;, una sensación como de inquietud y de malestar… Ahora que Jobs ya no está, quizás la cosa mejore… aunque lo más seguro es que empeore.&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 Cochin;"&gt;Básicamente, maldita la hora en que me pasé a Apple.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201203" width="1" height="1"&gt;</content><author><name>RFOG</name><uri>http://geeks.ms/members/RFOG/default.aspx</uri></author><category term="bugs" scheme="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx" /><category term="rationale" scheme="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx" /><category term="MAC" scheme="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx" /><category term="Apple" scheme="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx" /><category term="Interoperabilidad" scheme="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx" /></entry></feed>
