<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET o no .NET, esa es la cuestión : rationale</title><link>http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx</link><description>Etiquetas: rationale</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>ReSharper para Visual Studio</title><link>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx</link><pubDate>Sat, 17 Nov 2012 12:55:10 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:207457</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=207457</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=207457</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/11/17/resharper-para-visual-studio.aspx#comments</comments><description>&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Esta es una historia un tanto extraña porque ni en mis más locos sueños hubiera yo decidido usar este complemento en Visual Studio. No porque no me guste la empresa, ni porque piense que el producto sea malo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Simplemente porque no soy yo mucho de añadir complementos a mi herramienta de trabajo más allá de las cosas imprescindibles, más que nada porque los tiempos de carga se alargan en extremo, y la estabilidad de Visual Studio decae en picado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Por ejemplo, si ya la versión 2010 de VS anda algo inestable, con vahídos extraños, cuando le añades el SDK de Windows Phone la cosa empeora y te encuentras con que a veces el compilador se encuentra errores fantasma que sólo él ve, o simplemente el IDE se queda autista.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Añádele alguna herramienta más y eres un firme candidato a lanzar tu ordenador por la ventana y dedicarte a criar setas en el sótano de tu abuelo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Sin embargo Visual Studio 2012 parece más estable, y he estado como dos semanas usándolo sin que hiciera cosas raras, incluso tras añadirle el citado SDK, que es imprescindible para mi en estos momentos.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;De repente a un compañero que trabaja en la aplicación de Java de mi empresa le compraron el &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt; y comenzó a comentar las bondades del producto y cómo había pasado de desesperarse y tirarse de los pelos con la cosa esa del Eclipse a tener un IDE en condiciones.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Eso me llevó a recordar que cuando asisto a alguna charla virtual suelen regalar un ReSharper a los asistentes… y una cosa me llevó a la otra, y es que la envidia es tiñosa, y muy mala malosa, y yo soy el peor de todos. Por lo tanto entré en la web de &lt;a href="http://www.jetbrains.com/index.html"&gt;JetBrains&lt;/a&gt; y me bajé el &lt;a href="http://www.jetbrains.com/resharper/"&gt;producto&lt;/a&gt; en su &lt;a href="http://www.jetbrains.com/resharper/download/index.html"&gt;versión demo&lt;/a&gt; de treinta días y…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡¡MADRE DEL AMOR HERMOSO!!&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;¡Como alguien me quite el producto me lo como con ropa y todo! ¿Cómo he podido vivir yo sin eso?&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;A ver, que no estoy exagerando ni mucho menos. El producto cuesta sus pelas, pero os aseguro que las vale. Ahora que estoy desarrollando en C# porque no tengo más cojones, se me ha hecho prácticamente indispensable y eso que lo llevo usando tan sólo unas dos semanas.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os cuento lo que hace. Y ya me conocéis, que yo no me caso con nadie y no tengo pelos en la lengua.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;ReSharper es una extensión a Visual Studio (creo que soportan todas las versiones del producto desde la 2003 menos las Express). En mi caso lo instalé en mi Visual Studio Ultimate de la MSDN.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo que hace el producto es ayudarte a teclear código, pero a todos los niveles. Hay que verlo para creerlo. Cuando está instalado lo que más llama la atención es que te coloca una tira vertical al lado derecho de la ventana de edición, similar a la de la derecha en donde pones los breakpoints, bookmarks y el IDE te marca el código modificado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;En esa columna te coloca una serie de rayitas horizontales de colorines. Rojo para los errores. Naranja para las mejoras (ahora os cuento), verde para las sugerencias. Creo que hay más colores, pero en este momento no me acuerdo (son las cosas de estar tirado en el sofá tecleando en mi MacBook). Arriba del todo hay una marca global que te dice el &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Cuando posas el ratón sobre la rayita, te dice de qué va la cosa, y si haces clic te lleva al código fuente en cuestión. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Y aquí es donde viene lo interesante. Te ofrece la mejora o la solución, y si le dices que sí, te lo corrige. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pero os aseguro que es algo terrorífico. Hay cosas más o menos chorras, como cambiar un tipo por una variable automática, pero otras dan miedo.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Es capaz de cambiar tus bucles for o foreach por sentencias LINQ. Con eso ya os lo he dicho todo. A mi al menos eso me da mucho miedo. Del bueno, ojo. Que coja tres bucles anidados y te los convierta en una sentencia LINQ de una línea me deja embobado.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Peor hay más. Simplifica los operadores lambda, te transforma bloques de código en otros menos agresivos con la aplicación, te formatea el código, te ofrece lo que vas a escribir a continuación…&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;No sé, cada vez que hago algo nuevo me sorprendo por las posibilidades que te ofrece. Otra de las cosas que me trae loco es que es capaz de eliminar código redundante, como la creación de delegados o la eliminación de código redundante.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Os pongo un ejemplo que me dejó todo loco.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Yo solía poner sentencias del tipo:&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(String.Format(“bla bla {0} bla bla {1}”,a.Hola,a.Adios));&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Pues bien, él me sugiere&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Debug.WriteLine(“bla bla {0} bla bla {1}”,a.Hola,a.Adios);&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;min-height:13px;"&gt; &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Vale. Tú lo sabes. Yo no lo sabía hasta que no me lo ofreció ReSharper. Y así con muchas cosas más, pero lo que de verdad me admira son las transformaciones a LINQ y viceversa. No me canso de repetirlo. Bucles a LINQ. Bucles a LINQ.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene soporte en XAML. Es decir, editar XAML pasa de ser una pesadilla a ser bastante mejor. Si tu usas Blend, mejor para ti. Yo la última vez que intenté hacer algo con el producto terminé hasta la coronilla. Entre excepciones y la *** manía de ponerle márgenes hasta a su madre… Pues bien, con ReSharper editar a mano XAML también mejora la cosa.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Refactoring. Todo lo que te puedas imaginar y más. Si añadimos las reglas para estilo de código, te detecta las variables y los métodos que no lo siguen, ofreciéndote cambiarlos si así lo deseas. Y es una cosa a la que vas a decir que sí, porque esas rayitas naranjas no molan nada, y que no te las vea el jefe… :-P&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Lo dicho, en cuanto te sales de las guías de estilo el producto no solo te lo dice sino que te ofrece la posibilidad de cambiarlo. Por supuesto puedes definir las tuyas, no las que el programa quiera. &lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Como abras la pantalla de opciones te vas a caer de culo, porque puedes configurar cualquier cosa. Por tener hasta tienes “juegos de configuración”, pudendo cargar la que quieras cuando quieras, por si tienes un proyecto con unas reglas y otro con otras.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;También tiene algunas chorradillas (es un decir) interesantes, como que te pinta una raya de color debajo de un número que represente un código ARGB, por poner un ejemplo. Son cosas que no se echan en falta hasta que no las tienen y luego te las quitan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Ya para terminar comentaros los Find Usages. Algo así como Find all references pero con muchos esteroides. Pones el cursor sobre un símbolo, le das a la opción con el botón derecho del ratón y goza. Así he encontrado un par de problemas serios de sincronización que me tenían todo loco, y encima en un rato de nada.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Opciones que no he probado han sido la de limpiar el código de toda la solución de una tacada y otras que seguro se me escapan.&lt;/p&gt;
&lt;p style="margin:0px;text-align:justify;text-indent:35.5px;font-size:11px;font-family:Calibri;"&gt;Bueno, pues lo dicho, si quieres aumentar tu productividad de forma bastante seria, prueba el producto. Seguro que luego pasas por caja. Y si entráis en la Web de JetBrains podréis ver capturas de pantallas y algún vídeo enseñando lo que es capaz de hacer.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207457" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/licencias/default.aspx">licencias</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>Multiplataforma de la buena (mismo código fuente)</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx</link><pubDate>Tue, 03 Jul 2012 18:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205955</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205955</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205955</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Antes de empezar, y de que me deis ca&amp;ntilde;a de la buena, quiero decir que todo esto son elucubraciones personales m&amp;iacute;as y que lo m&amp;aacute;s seguro nadie est&amp;eacute; de acuerdo conmigo. Dicho esto, vamos al meollo del asunto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ya sab&amp;eacute;is que me he ido distanciando un poco de la plataforma Windows a la vez que me he acercado a la de Apple sin realizar el cambio total. De Linux no quiero hablar, porque cada vez que tengo que hacer algo con &amp;eacute;l, sudo tinta china y al final, tras muchos cabezazos, suelo terminar desistiendo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo fue compilar el SDK de lector del libros electr&amp;oacute;nicos Boox i62HD. Tras instalar una Debian 6 x86 virtual en vmWare Fusion (el Workstation del MAC) por segunda vez, ya que la primera fall&amp;oacute; estrepitosamente porque el instalador s&amp;iacute; que reconoci&amp;oacute; el discos duro SCSI pero luego el kernel instalado no, fui incapaz de compilarlo.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero me encontr&amp;eacute; con una serie de paquetes que no estaban presentes y que el comprobador del SDK no avis&amp;oacute; que faltaban, lo que te obliga a recorrer la cadena de errores para descubrir que te falta esto o aquello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo, y que todav&amp;iacute;a est&amp;aacute; sin solucionar, es que falta una dependencia en un fichero de proyecto, en concreto incluir &amp;ldquo;-l z&amp;rdquo; en el lugar correcto, que es enlazar con la biblioteca zlib. En mi caso el problema no es saber qu&amp;eacute; falta, sino d&amp;oacute;nde a&amp;ntilde;adirlo. Tras varios intentos infructuosos y muchas p&amp;aacute;ginas de internet le&amp;iacute;das, no consegu&amp;iacute; solucionarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Hab&amp;iacute;a un bug similar si instalabas el SDK en un linux x64, pero el m&amp;iacute;o era x86, y el parche existente intentaba modificar ficheros que no existen (al menos en mi instalaci&amp;oacute;n).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, ni me han hecho ni *** caso ni tampoco lo han solucionado, lo que me lleva a preguntarme c&amp;oacute;mo cojones est&amp;aacute;n programando. Y menos mal que us&amp;eacute; una Debian, que es la misma distribuci&amp;oacute;n que usan los que han creado el SDK, que si llego a instalarme otra cosa&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto es un ejemplo de la desidia reinante en Linux. Lo dije en un foro hace tiempo. Los programadores de linux me parecen muy poco profesionales, tendentes a montar cualquier cosa que les parezca &lt;em&gt;c00l&lt;/em&gt; y luego, cuando viene la hora de la verdad y demostrar que se es un programador con dos cojones, pasan del tema porque eso de solucionar bugs ya no es tan fascinante como lo otro, y encima solventar cualquier cosa son un mont&amp;oacute;n de horas en las que no estamos subiendo nuestra supuesta &lt;em&gt;cach&amp;eacute; c00l&lt;/em&gt; en la comunidad.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de deleznable, me parece una pr&amp;aacute;ctica muy poco seria y que sigue dejando a Linux como lo que es: o bien un juguete para ni&amp;ntilde;os falsamente &lt;em&gt;interesantes&lt;/em&gt;, o bien algo destinado a servidores de bajo coste, y si no contadme c&amp;oacute;mo es el &amp;uacute;nico sistema operativo que ha reventado con el segundo extra a&amp;ntilde;adido hace unos d&amp;iacute;as.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, para mi el desarrollo en Linux queda completamente descartado a corto y largo plazo, por lo menos hasta que se pongan un cohete en el culo, cosa que dudo mucho que ocurra jam&amp;aacute;s (y espero equivocarme).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Luego vino el tema del &lt;em&gt;swtiching&lt;/em&gt;. Lo cierto es que tras el entusiasmo inicial, la cosa deja mucho que desear en cuanto a usabilidad y, s&amp;iacute;, rendimiento. Ya lo he ido comentando por este blog con anterioridad. OS X Lion y Mountain Lion, si los comparamos con XP, son la rehostia, pero comparados con Windows 7 dejan mucho, pero mucho que desear. La usabilidad es p&amp;eacute;sima, aparte de ciertos problemas de ergonom&amp;iacute;a a los que al final uno termina acostumbr&amp;aacute;ndose.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tambi&amp;eacute;n es cierto que cuando le coges el tranquillo ya no hay vuelta atr&amp;aacute;s, m&amp;aacute;s que nada por la integraci&amp;oacute;n de todos los elementos, m&amp;aacute;s todav&amp;iacute;a si tienes un iPad o un iPhone. Puedes conseguir casi lo mismo en Windows, pero no de forma tan integrada ni coherente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Respecto al rendimiento, dir&amp;eacute; que por fin tengo un MAC que funciona como yo quiero, tras gastarme m&amp;aacute;s de 300 euros en a&amp;ntilde;adirle un segundo disco SSD al iMac de 27&amp;rdquo;. Es decir, en este momento mi m&amp;aacute;quina principal es un iMac de mediados del 2011 con un i7 a 3.4 GHz, un disco SSD de 256GB como disco de sistema para el OS X y uno de 1TB como secundario para datos. En este momento el disco FireWire de 2TB que usaba como secundario lo tengo como copia de Time Machine y, aparte de que arranca en 8 segundos (antes tardaba m&amp;aacute;s de dos minutos y el disco segu&amp;iacute;a rascando hasta casi los diez), s&amp;oacute;lo veo la roseta multicolor de la muerte cuando se para el disco mec&amp;aacute;nico y tiene que arrancar. Adem&amp;aacute;s, la carga de aplicaciones, incluso las pesadas como Pages o Word, es pr&amp;aacute;cticamente instant&amp;aacute;nea.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y justo ahora, mientras escribo esto en Scrivener, tengo abierta una m&amp;aacute;quina virtual en Unity con Windows 7 x86 en la que se est&amp;aacute; instalando el SP1 de Visual Studio 2010 porque he instalado el AtmelStudio, que es un IDE basado en el Microsoft para generar ejecutables para los microprocesadores de Atmel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Acabo de hacer una pausa para lanzar el JTAG MK-II, conectarlo a Windows y verificar que el AtmelStudio lo reconoce y funciona, todo ello virtualizado. Que es una de las cosas a las que quer&amp;iacute;a llegar. Con un buen producto de virtualizaci&amp;oacute;n, uno puede tener lo mejor de ambos mundos. Un equipo silencioso a m&amp;aacute;s no poder que ejecuta de forma transparente tanto aplicaciones Windows como OS X sin mayor complicaci&amp;oacute;n que molestarse un poco en configurar las cosas, y encima con un rendimiento equivalente a si se ejecutara en real.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Evidentemente tenemos BootCamp, pero os aseguro que Windows no funciona igual que en un PC real, y perdemos todas las cosas buenas que puedes hacer con un MAC.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no es a eso a lo que me refiero. M&amp;aacute;s bien todo esto es una especie de parche o pegote. De lo que realmente quiero hablar es de desarrollar para al menos Windows y MAC sin tener que crear dos programas diferentes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Descartamos de entrada que un mismo ejecutable pueda funcionar en ambas plataformas. Por parte de los dos contendientes queda descartado. Microsoft podr&amp;iacute;a haber hecho .NET para OS X o Apple Cocoa para Windows, pero no creo que eso vaya a ocurrir nunca jam&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica posible soluci&amp;oacute;n es Mono, pero ignoro sin un EXE de Windows se lanzar&amp;aacute; en un MAC o no, y lo voy a descartar por razonamientos que expondr&amp;eacute; m&amp;aacute;s adelante.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, la otra posible soluci&amp;oacute;n es compatibilidad en el c&amp;oacute;digo fuente. Que yo conozca, s&amp;oacute;lo tenemos dos grandes contendientes: QT y lo que ahora es Embarcadero pero que todos conocemos como Delphi y/o C++Builder.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;De QT he hablado ya por aqu&amp;iacute;, pero no como plataforma cruzada. He estado us&amp;aacute;ndolo un poco, en un proyecto en donde trabajaba, pero s&amp;oacute;lo para generar aplicaciones Windows.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En principio QT es multiplataforma si no te sales del propio Framework, y de hecho he podido compilar un mismo c&amp;oacute;digo fuente en ambas plataformas sin m&amp;aacute;s que compilar o bien desde Windows o bien desde OS X. Hay que tener mucho cuidado y usar el propio Creator de QT, y todos los ficheros servir&amp;aacute;n sin problema. Eso s&amp;iacute;, necesitas dos ordenadores, uno para cada plataforma. Tres si quieres tambi&amp;eacute;n Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto nos trae a lo que hemos tratado antes. Como no es posible ejecutar OS X desde una m&amp;aacute;quina Windows (no sin violar licencias y sin &lt;em&gt;hacks&lt;/em&gt; y sin limitaciones y fallos aleatorios), la &amp;uacute;nica soluci&amp;oacute;n es tener un MAC m&amp;aacute;s o menos potente y usar un Windows virtualizado, compartiendo la carpeta de desarrollo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso, pese a no estar haciendo nada m&amp;aacute;s que estudiar ahora que estoy en paro y tengo tiempo para &lt;em&gt;jugar&lt;/em&gt; con todo esto, tengo una carpeta en donde est&amp;aacute; todo mi c&amp;oacute;digo fuente, carpeta que est&amp;aacute; compartida con SkyDrive y de ese modo puedo verla tambi&amp;eacute;n en mi ordenador Windows (no el virtualizado), aparte de hacer copia de seguridad de forma autom&amp;aacute;tica.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ojo con sincronizar mediante SkyDrive entre real y virtual, porque el tema no es instant&amp;aacute;neo y puedes armar un buen jaleo. La soluci&amp;oacute;n es compartir una carpeta de tu MAC en tu Windows virtual. Con Fusion la cosa funciona muy bien, y hasta Embarcadero ha solucionado los problemas que ten&amp;iacute;a para compilar sobre carpetas de red (Microsoft siempre lo ha tenido resuelto, incluso dando la posibilidad de cachear localmente los ficheros intermedios).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si nos damos cuenta, con QT tenemos que compilar y ejecutar en cada m&amp;aacute;quina, lo que en principio no es un gran problema, pero s&amp;iacute; cuando quieres algo que no est&amp;aacute; en el Framework. Ah&amp;iacute; si que tienes que, mediante compilaci&amp;oacute;n condicional, sacarte tu mismo las casta&amp;ntilde;as del fuego. Dada mi escasa experiencia con QT multiplataforma, no puedo asegurar si es algo muy habitual o no.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro participante es Embarcadero, con su FireMonkey bajo Delphi/C++ Builder. La historia de todo esto es un poco rocambolesca, ya que la empresa ha llevado muchos a&amp;ntilde;os implementando compilaci&amp;oacute;n condicional en su VCL. S&amp;oacute;lo hay que mirar el c&amp;oacute;digo fuente de cualquier versi&amp;oacute;n (creo que desde la 2009) y ver c&amp;oacute;mo muchos ficheros tienen secciones para Windows, MAC y Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Uno, por tanto, se esperaba que cualquier d&amp;iacute;a anunciaran que la VCL se hab&amp;iacute;a convertido en multiplataforma y que se podr&amp;iacute;a compilar para estos tres sistemas operativos.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no, Embarcadero compr&amp;oacute; un producto a medio hacer y en seis meses lo transform&amp;oacute; en su FireMonkey, que anunci&amp;oacute; a bombo y platillo con su nueva versi&amp;oacute;n de RAD Studio XE2. Que por cierto se encuentra completamente lleno de bugs y no hay entrada de blog explicando esta o aquella caracter&amp;iacute;stica que no hable de que hay un problema y que han tenido de resolverlo de alguna manera. Y es que seis meses es muy poco tiempo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey es una gran idea implementada muy pobremente. La idea es usar el IDE de Delphi o de C++ Builder para, a partir de un mismo c&amp;oacute;digo fuente, generar un ejecutable Windows o MAC, pero siempre desde Windows, por lo que estamos ante el mismo problema que antes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja aqu&amp;iacute; es que puedes hacerlo todo desde Windows, hasta depurar. Es decir, es necesario instalar un servidor en el lado MAC, servidor que te va a permitir enviar el &lt;em&gt;bundle OS X&lt;/em&gt; al MAC y depurarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y como todo primer producto, est&amp;aacute; completamente lleno de bugs y da muchos problemas, tanto el IDE como la depuraci&amp;oacute;n remota y el framework en s&amp;iacute;. Embarcadero lleva sacados cinco parches, uno de ellos tan grande que exige reinstalarlo todo, que mejoran algo pero no mucho.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y para m&amp;aacute;s INRI, son aplicaciones de 32 bits, cosa que en los MAC se est&amp;aacute; acabando a pasos agigantados.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esperemos que el XE3, que saldr&amp;aacute; este verano, mejor algo la cosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Nos falta comentar Mono, el C# multiplataforma y de c&amp;oacute;digo abierto. Ya he hablado algo de &amp;eacute;l &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; con anterioridad, pero ahora voy a matizar un poco m&amp;aacute;s. Mono engloba una serie de tecnolog&amp;iacute;as m&amp;aacute;s o menos integradas que comparten un mismo lenguaje de programaci&amp;oacute;n: C#.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Basado en &lt;em&gt;ports&lt;/em&gt;, todo el meollo se centra en un IDE (disponible para ambas plataformas, como el de QT) que permite crear aplicaciones basadas en los ya citados &lt;em&gt;ports&lt;/em&gt;, de los que disonemos de varios seg&amp;uacute;n qu&amp;eacute; plataforma.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por un lado tenemos el de Windows.Forms, que nos permitir&amp;aacute; generar c&amp;oacute;digo compatible con la tecnolog&amp;iacute;a de Microsoft y ejecutar en Windows, MAC y Linux. GTK# es otro de ellos. Tambi&amp;eacute;n est&amp;aacute; MonoMAC, en exclusiva para MAC. Hay m&amp;aacute;s pero nos detenemos aqu&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es que cada &lt;em&gt;port&lt;/em&gt; conserva la idiosincrasia de cada &lt;em&gt;origen&lt;/em&gt;. Es decir, el API de GTK# es el GTK pero traducido a C#, y as&amp;iacute; con todos. Es una buena idea y en general, se puede generar c&amp;oacute;digo para Windows y MAC sin problemas mayores que los que tendr&amp;iacute;amos con QT.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero ahora viene el t&amp;iacute;o de la rebaja. Hemos visto algunas pegas que tienen todos estos sistemas de desarrollo, pero no son las peores de todas. De todos modos, si desarrollas para MAC necesitar&amp;aacute;s un MAC, y lo mismo para Windows, as&amp;iacute; que llevar a cabo esas tareas en ambas m&amp;aacute;quinas no es todo lo malo que se puede esperar, y de hecho en todos los casos existen soluciones bastante &amp;oacute;ptimas, aunque lo m&amp;aacute;s deseable ser&amp;iacute;a el acercamiento de Embarcadero, con compila en un sitio, ejecuta en dos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La mayor pega de todas consiste en que pr&amp;aacute;cticamente ninguno de estos sistemas pinta los controles como nativos. QT podr&amp;iacute;a salvarse por los pelos, pero ni FireMonkey ni Mono, salvo MonoMac, aparecen como aplicaciones nativas. En la documentaci&amp;oacute;n de algunos productos la llaman hasta &amp;ldquo;alien&amp;rdquo;. Ya os pod&amp;eacute;is imaginar. Y si bien en Windows un usuario normal puede aceptar ciertos interfaces ex&amp;oacute;ticos, un fanboy (perd&amp;oacute;n, maquero) de pro seguro que te manda a la mierda con todas sus palabras, y encima con raz&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El caso de MonoMac no se aplica, ya que no podremos compartir c&amp;oacute;digo fuente con Windows puesto que se trata de un envoltorio sencillo sobre el propio Cocoa con la idiosincrasia de OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, el &amp;uacute;nico Framework que s&amp;eacute; de forma fehaciente que ha entrado en la App Store de los MAC ha sido QT tras aplicar unos parches para evitar que el propio QT modificara ficheros dentro del &lt;em&gt;bundle&lt;/em&gt;. De todos modos no s&amp;eacute; qu&amp;eacute; pasar&amp;aacute; con el Sandboxing y si QT (y los dem&amp;aacute;s) lo soportan.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente, est&amp;aacute; completamente claro que, a fecha de hoy, desarrollar en multiplataforma de manera coherente continua prohibido, principalmente por limitaciones de los Frameworks existentes que de problemas t&amp;eacute;cnicos, dado que el rendimiento y las herramientas base (como compiladores de plataforma cruzada o lenguajes comunes en diferentes plataformas), est&amp;aacute;n m&amp;aacute;s que maduros.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tan s&amp;oacute;lo habr&amp;iacute;a que crear un Framework que utilizara los controles nativos de cada plataforma, cosa que a fecha de hoy no existe (m&amp;aacute;s sobre esto luego).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;iquest;Qu&amp;eacute; nos queda, pues? Tan sencillo y tan complejo como dividir nuestra aplicaci&amp;oacute;n en dos partes. La primera, la parte visual, tendremos que hacerla diferente para cada plataforma. Objective-C en MAC, Win32 (MFC, o cualquier otro que pinte nativo), y la parte no visual o el n&amp;uacute;cleo de nuestro programa en alg&amp;uacute;n lenguaje com&amp;uacute;n, como puede ser C++ y STL y mantener al loro todo el tema para que compile y funcione en todos los sistemas de destino&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Es m&amp;aacute;s trabajo, pero creo que es la &amp;uacute;nica forma de mantener un interfaz visual nativo y coherente. El problema viene cuando nuestra aplicaci&amp;oacute;n es demasiado simple de modo que mantener esta estructura es m&amp;aacute;s costoso que crear dos programas de forma independiente.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte, claro est&amp;aacute;, la bajada de rendimiento al tener que desacoplar ambas partes, aunque esto es muy bueno y deber&amp;iacute;a ser una constante en cualquier desarrollo no trivial, aunque estemos haci&amp;eacute;ndolo solo para Windows o s&amp;oacute;lo para MAC. No obstante, a veces la ca&amp;iacute;da de rendimiento es tal, o el programa es tan meramente visual que este acercamiento no es aplicable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si os dais cuenta no he entrado en el tema de c&amp;oacute;digo abierto versus c&amp;oacute;digo cerrado, y es que para el programador medio, se la trae floja si tiene el fuente o no de lo que est&amp;eacute; usando: no lo va a mirar porque o bien no tiene tiempo o bien no est&amp;aacute; capacitado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tampoco he cubierto el tema Metro de Windows 8, que est&amp;aacute; de lado del tema m&amp;oacute;vil, en el que no he entrado pese a haber tambi&amp;eacute;n Frameworks gen&amp;eacute;ricos. Aqu&amp;iacute; estamos igual, pero ahora las plataformas son Windows Phone, Windows Metro (o RT), Android e iOS, y si las de Windows y MAC son disparejas, no os digo estas. Y, a fecha de hoy, que yo sepa, no hay ning&amp;uacute;n Framework multiplataforma y compatible. FireMonkey promete llegar a Android, Metro y a C++ en pr&amp;oacute;ximas versiones, pero si ya con dos plataformas la cosa est&amp;aacute; como est&amp;aacute;, no quiero saber cuando haya tantas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Me falta hablar de un jugador que no he nombrado y que tiene muy buena pinta, quiz&amp;aacute;s la mejor de todas pero, como apenas lo he probado, lo dejo para una futura entrada. Se llama wxWidgets y hace tiempo que habl&amp;eacute; de &amp;eacute;l aqu&amp;iacute;, pero para Windows. Estamos ante un Framework con mucha solera en el mundo del desarrollo y que usan empresas como Google en su producto Google Drive a trav&amp;eacute;s de wxPython.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y la mayor ventaja est&amp;aacute; en que, aparte de estar disponible para alguna que otra plataforma embebida, los controles son los nativos de cada sistema operativo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;QT en Windows y OS X (Fijaos c&amp;oacute;mo los controles son casi nativos en cada sistema).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey en Windows y OS X (Esto no pasa la MAC App Store ni a golpe de talonario. Por no aparecer ni el men&amp;uacute; aparece donde debe).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets en OS X (Todos los controles son nativos).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205955" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Visual C++ 2012 soportará Windows XP</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx</link><pubDate>Fri, 15 Jun 2012 20:49:28 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205620</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205620</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205620</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/15/visual-c-2012-soportar-225-windows-xp.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Dicho así, a bote pronto, puede parecer una tontería, pero no lo es. Los que hayan estado probando las diferentes versiones alfas, betas y &lt;em&gt;omicrones&lt;/em&gt; de Visual C++ 11 se habrán dado cuenta de que no generan código para Windows XP.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;El motivo no era otro más que se han hecho una serie de mejoras al &lt;em&gt;runtime&lt;/em&gt; de C++ (ya sabéis, la biblioteca de C y de C++) que se basan en una serie de funciones de Win32 que no están presentes en Windows Xp y sí en Vista y siguientes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;La respuesta fácil sería decir que han hecho eso para empezar a ir descartando a XP como sistema operativo soportado y forzar que los nuevos programas no funcionen con él, pero a la vista de las noticias no ha sido así. De hecho, hace poco tiempo alguien publicó la forma de soportar XP con las versiones beta ya publicadas mediante un truco. No me preguntéis cómo porque no lo he mirado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Independientemente de eso, cuando un programa debe ejecutarse en un sistema que no tiene todas las importaciones de, por ejemplo, Kernel32.DLL, lo que hace es realizar una carga parcial o suministrar funciones &lt;em&gt;dummy&lt;/em&gt; para que el sistema funcione. Es decir, si por ejemplo el &lt;em&gt;runtime&lt;/em&gt; de C++ llama a una supuesta función de Kernel32.DLL llamada &lt;em&gt;UnaFuncion()&lt;/em&gt; que no está en, digamos, XP pero sí en Windows 7, lo que se hace es, o bien esas se marcan como &lt;em&gt;delayed&lt;/em&gt; (retardadas) y sólo se cargan manualmente una vez que el &lt;em&gt;runtime&lt;/em&gt; ha comprobado que el sistema operativo la posee, o bien se suministra una vacía o con emulación.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;No me preguntéis más porque realmente no sé cómo se hace ya que nunca me ha hecho falta, y tampoco sé si está documentado de forma oficial o no, pero es un mecansimo más o menos conocido que usa al menos la propia Microsoft para soportar sistemas operativos obsoletos y no tener varios juegos de ficheros.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Y ya que estamos en el tema, os comento otra cosa. Hace unos días se anunció que las versiones Express (todas) de Visual Studio 2012 sólo soportarían crear aplicaciones Metro en Windows 8 y que, si queríamos escritorio, deberíamos seguir usando las 2010 para ello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Hablamos, claro está, de las gratuitas. La versión &lt;em&gt;Professional&lt;/em&gt; y superiores sí que iban a poder crear ambos tipos de aplicaciones, y todo bajo un mismo IDE tal y como estamos acostumbrados. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;[Para los despistados, diré que con las versiones Express, si uno necesita crear un proyecto mixto, digamos una DLL hecha en C, C++ ó C++/CLI para que luego una aplicación en C# la use, tienes que instalar los productos por separado y manejar cada tipo de proyecto también por separado, y nada de depurar y saltar de código manejado a nativo y viceversa. Con las versiones de pago todo está en un mismo IDE y se pueden manejar de forma conjunta].&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;En principio la imposibilidad de crear aplicaciones de escritorio con la Express 2012 puede parecer trivial ya que tenemos las 2010, pero lo cierto es que perdemos muchas mejoras en todos los lenguajes. Podría citar como ejemplo los métodos asíncronos en C# y toda la nueva parafernalia del C++11 para C++, que no es poco.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Pero ha sido tal el clamor popular (y no tan popular, porque algunos MVP le han dado caña de la buena a MS -no, esta vez yo no he movido un dedo), que Microsoft ha reaccionado y va a sacar una versión 2012 &lt;em&gt;Desktop&lt;/em&gt; para crear aplicaciones de escritorio.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Es decir, que vamos a tener al menos dos C# Express, dos C++ Express y demás, una para aplicaciones Metro y otra para escritorio. Y lo que es mejor, las versiones escritorio creo, y digo creo porque no lo tengo claro, va a ser un solo IDE que va a soportar todos los lenguajes como las versiones de pago…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;Enlaces originales:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/vcblog/archive/2012/06/15/10320645.aspx"&gt;Targeting Windows XP with C++ in Visual Studio 2012&lt;/a&gt;&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;font:14.0px Helvetica;"&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/06/08/visual-studio-express-2012-for-windows-desktop.aspx"&gt;Visual Studio Express 2012 for Windows Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205620" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+8/default.aspx">Windows 8</category></item><item><title>Menuda porquería de gestión de memoria que tiene el OS X</title><link>http://geeks.ms/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx</link><pubDate>Sun, 06 May 2012 18:24:35 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204884</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=204884</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=204884</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Helvetica;"&gt;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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>Ocultación de datos y paso de variables</title><link>http://geeks.ms/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx</link><pubDate>Tue, 24 Apr 2012 09:45:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:204620</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=204620</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=204620</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/04/24/ocultaci-243-n-de-datos-y-paso-de-variables.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>C++/CX (II). C++/CX vs WRL</title><link>http://geeks.ms/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx</link><pubDate>Fri, 04 Nov 2011 19:13:32 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201533</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201533</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201533</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/11/04/c-cx-ii-c-cx-vs-wrl.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px 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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category></item><item><title>¿WinRT un subsistema? No, no lo es</title><link>http://geeks.ms/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx</link><pubDate>Wed, 02 Nov 2011 16:41:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201435</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201435</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201435</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/11/02/191-winrt-un-subsistema-no-no-lo-es.aspx#comments</comments><description>&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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B002F00_CX/default.aspx">C++/CX</category></item><item><title>Code Complete 2, Steve McConnell</title><link>http://geeks.ms/blogs/rfog/archive/2011/10/27/code-complete-2-steve-mcconnell.aspx</link><pubDate>Thu, 27 Oct 2011 18:51:12 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201402</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201402</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201402</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/10/27/code-complete-2-steve-mcconnell.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px 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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/libros/default.aspx">libros</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>iCloud o la flagrante tontería</title><link>http://geeks.ms/blogs/rfog/archive/2011/10/16/icloud-o-la-flagrante-tonter-237-a.aspx</link><pubDate>Sun, 16 Oct 2011 11:09:38 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201203</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=201203</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201203</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/10/16/icloud-o-la-flagrante-tonter-237-a.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px 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;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>WinTablet.info: Windows 8 y los Tablet</title><link>http://geeks.ms/blogs/rfog/archive/2011/09/25/wintablet-info-windows-8-y-los-tablet.aspx</link><pubDate>Sun, 25 Sep 2011 09:43:55 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:200711</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=200711</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=200711</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/09/25/wintablet-info-windows-8-y-los-tablet.aspx#comments</comments><description>&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Ya sabéis que me gusta meter baza en los nuevos productos de Microsoft más que a un pollo la mierda. No creo que os pille de sorpresa, pero en este caso estamos hablando de caviar Beluga ya que encima tenemos dominio y web propia.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Sí, lo que leéis, el RFOG ha sido invitado a participar en un &lt;a href="http://wintablet.info/"&gt;blog&lt;/a&gt; de temática exclusiva sobre Windows 8 y su orientación hacia los Tablet. Sin restricción de temática, sin censura y con libertad total de publicar lo que quiera (no, que no se os abran los ojos como platos, de momento no voy a poner porno).&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Bueno, después de la presentación chula, vienen los detalles. Nos hemos juntado cuatro interfectos de entre los indeseables de la internet y que encima somos granos en el culo de las grandes corporaciones y nos hemos decidido a poner los puntos sobre las íes en el tópico descrito más arriba. La idea fue originalmente de &lt;a href="http://tinta-e.blogspot.com/"&gt;Juan Luis Chulilla&lt;/a&gt;, quien la propuso a &lt;a href="http://ultramobilepc-tips.blogspot.com/"&gt;Ctitanic&lt;/a&gt; y a mi. No hace falta decir que tardamos 100 milisegundos en decir que sí, que es el tiempo medio de reacción entre el ojo y el cerebro (para aquellos que tengan neuronas, claro). Luego se nos unió Mahjong, y así formamos el &lt;em&gt;cuarteto concertante&lt;/em&gt; (la referencia es de Verne).&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Dicho y hecho, sólo faltaba arremangarse y empezar a escribir, así que el sitio ya contiene entradas chulas, aunque todavía anda algo en obras y debéis poneos casco no sea que se os caiga algún ladrillo en la cocorota.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Para aquellos que todavía estéis en Babia, os comento. Windows 8 es la siguiente versión de Windows 7, y viene en &lt;em&gt;modo dual&lt;/em&gt;. Es decir, que trae dos&lt;em&gt;Shell&lt;/em&gt; de usuario. La primera es la que todos ya conocemos, con su menú inicio, su explorador y su Internet Explorer, con las &lt;em&gt;mejoras&lt;/em&gt; pertinentes. Lo pongo en cursiva porque hay mucha gente a la que la &lt;em&gt;Ribbon&lt;/em&gt; en el Explorador no les mola nada… a mí sí.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;La segunda interfaz se llama Metro y está destinada a los Tablet, sean del tipo que sean. Si habéis visto Windows Phone ya tenéis una idea de qué es. Como siempre con las tecnologías de Microsoft, debajo hay más de lo que parece, y también ahora ocurre así.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;A simple vista Metro parece nada más que una interfaz de apretar botones, pero dentro existe un motor basado en DirectX muy potente e interesante, envuelto en una capa que se programa con C# y una variante de C++/CLI. Y no es .NET, es nativa. De esto os contaré más aquí, pero en otro momento.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Finalmente también hay una &lt;em&gt;preview&lt;/em&gt; de la siguiente versión de Visual Studio que es capaz de generar ejecutables para esta nueva plataforma, y de esto también hablaré por aquí.&lt;/p&gt;
&lt;p style="text-align:justify;text-indent:18px;margin:0px;"&gt;Bueno, lo dicho, daos una vuelta por &lt;a href="http://wintablet.info/"&gt;WinTablet.info&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=200711" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category></item><item><title>Aprobado: C++0x ya es C++11</title><link>http://geeks.ms/blogs/rfog/archive/2011/08/13/aprobado-c-0x-ya-es-c-11.aspx</link><pubDate>Sat, 13 Aug 2011 10:16:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:199354</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=199354</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=199354</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/08/13/aprobado-c-0x-ya-es-c-11.aspx#comments</comments><description>&lt;p&gt;Leo en el blog de Sutter, la representaci&amp;oacute;n de Microsoft como compa&amp;ntilde;&amp;iacute;a en el comit&amp;eacute; internacional de estandarizaci&amp;oacute;n de C++, que, por fin, el nuevo est&amp;aacute;ndar ha sido aprobado por unanimidad y que pasa a llamarse, como ya se esperaba, C++11.
&lt;/p&gt;
&lt;p&gt;
Un poco m&amp;aacute;s y lo tentemos que llamar C++12.
&lt;/p&gt;
&lt;p&gt;
El rey ha muerto. &amp;iexcl;Viva el rey!
&lt;/p&gt;
&lt;p&gt;
Ahora a ver qu&amp;eacute; tal lo hace Microsoft con su pr&amp;oacute;ximo compilador, y a ver si &lt;span style="text-decoration:line-through;"&gt;Borland&lt;/span&gt;Embarcadero se pone las pilas y tambi&amp;eacute;n hace algo, aunque lo m&amp;aacute;s seguro sea para C++Builder XE3 el a&amp;ntilde;o que viene o el otro, porque el XE2 ya est&amp;aacute; terminado y a punto de salir, por cierto con compilaci&amp;oacute;n cruzada para MAC OS&amp;hellip;
&lt;/p&gt;
&lt;p&gt;La noticia original: http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=199354" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category></item><item><title>OS X Lion: Ver la carpeta Librería desde dentro del Time Machine</title><link>http://geeks.ms/blogs/rfog/archive/2011/08/05/os-x-lion-ver-la-carpeta-librer-237-a-desde-dentro-del-time-machine.aspx</link><pubDate>Fri, 05 Aug 2011 15:37:47 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:198876</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=198876</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=198876</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/08/05/os-x-lion-ver-la-carpeta-librer-237-a-desde-dentro-del-time-machine.aspx#comments</comments><description>De nuevo volvemos a Lion y a sus chipirtifláuticas nuevas características súper fashion de la muette.

Ahora hablamos de cómo mirar dentro de la Librería de nuestra carpeta de usuario cuando estamos dentro de Time Machine porque queremos recuperar algo de allí.

No, no se ve. Aparte de que es un poco complicado acceder a la carpeta de usuario porque Apple nos quiere ocultar cada vez más el sistema de ficheros de OS X, cuando entras en ella la carpeta Librería no está aunque le hayas cambiado el atributo de oculto…

Mola, ¿no?

Si buscas por la red verás un montón de páginas que explican cómo hacerlo, matando el Finder y con otras técnicas un tanto barrocas. La mía no es que sea muy directa, pero al menos no le tocamos las pelotas al sistema operativo y se hace todo de forma ordenada.

Lo primero que hay que hacer es montar la unidad en donde se guarda la copia de seguridad. Hay varias formas, como lanzar una copia de seguridad manual, entrar en el Time Machine y luego salir o simplemente haciendo clic en la unidad en donde estemos realizando la copia.

Una vez montada, es tan fácil como abrir un Terminal y movernos al &lt;em&gt;home&lt;/em&gt; de la copia que queramos. Partimos de la carpeta &amp;quot;/Volumes&amp;quot; y nos vamos adentrando en la copia. También podemos hacer doble clic en el disco montado en el escritorio o seguir navegando por el Finder… La cosa es llegar al &lt;em&gt;home&lt;/em&gt; de la fecha que nos interese, ya sea por terminal o con el Finder.

Una vez allí podemos pulsar CTRL-I (o Ver información) sobre la ruta, para saber dónde estamos. Si hemos usado el terminal no tenemos que hacer nada más que, una vez en nuestro &lt;em&gt;home&lt;/em&gt;, picar &amp;quot;cd Library&amp;quot; y estaremos dentro.

Si lo hemos hecho con el Finder, ahora es turno de abrir un Terminal y seleccionar y copiar la ruta completa que nos aparece en la ventana de información, picar &amp;quot;cd &amp;quot; en el terminal y pegar dicha ruta sobre el mismo. Al pulsar Enter estaremos en la misma situación que el párrafo de arriba.

Ahora viene el truco del almendruco. Podemos usar el terminal para copiar lo que queramos con los comandos de Unix (ya sabéis, cp), pero resulta mucho más cómo hacerlo con el Finder. Por lo tanto ahora picamos

&lt;cite&gt;pwd&lt;/cite&gt;

en el terminal y presionamos enter. Justo arriba del cursor nos aparece la ruta completa en donde estamos. La seleccionamos con el ratón y la copiamos.

Hacemos clic sobre el escritorio para que en el menú del sistema nos aparezca el del Finder. Elegimos &amp;quot;Ir -&amp;gt; Ir a la carpeta&amp;quot; y en cajetín, pegamos la URL que acabamos de copiar. Se nos abrirá una ventana del Finder en todo su esplendor.

[Sí, ya sé que hay una forma muy fácil de mostrar la Libería, que es explica en infinidad de sitios, pero sólo sirve para la carpeta de la cuenta actual, no dentro del Time Machine.]

Por supuesto también vale hacer esto para entrar en la Libería del &lt;em&gt;home&lt;/em&gt; actual de nuestra cuenta de usuario.

Otra forma para, desde cualquier carpeta, ir retrocediendo carpetas padre, es pulsar Commando+Flecha Arriba o, sobre el título de la carpeta en el Finder, retroceder haciendo clic con el botón secundario del ratón.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=198876" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx">configuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>¿Se cree Apple que somos imbéciles?</title><link>http://geeks.ms/blogs/rfog/archive/2011/04/21/191-se-cree-apple-que-somos-imb-233-ciles.aspx</link><pubDate>Thu, 21 Apr 2011 16:59:51 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:192722</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=192722</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=192722</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/04/21/191-se-cree-apple-que-somos-imb-233-ciles.aspx#comments</comments><description>&lt;p&gt;Supongo que a estas horas, con toda la parafernalia mediática que lo está rodeando, todo el mundo sabe que el sistema operativo iOS realiza una triangulación y seguimiento de nuestros aparatos siempre que lleven 3G…&lt;/p&gt;  &lt;p&gt;Mención especial de la noticia son los blogs &lt;i&gt;voceros&lt;/i&gt; y defensores de Apple a toda costa, transformando lo terrible y lo intolerable en algo leve y sin mucha importancia… Estoy hablando de entradas como &lt;a href="http://appleweblog.com/2011/04/toda-la-verdad-sobre-el-guardado-de-localizaciones-de-iphone-y-ipad"&gt;esta&lt;/a&gt;, &lt;a href="http://appleweblog.com/2011/04/cuidado-tu-iphone-te-espia"&gt;esta&lt;/a&gt; y &lt;a href="http://www.applesfera.com/apple/el-iphone-y-el-ipad-3g-registran-todos-los-movimientos-del-usuario"&gt;esta&lt;/a&gt;. Y ya de paso, un olé al amigo Malo Maloso de Spectra, Chemita y su &lt;a href="http://www.elladodelmal.com/2011/04/la-dura-vida-con-un-ayfon.html"&gt;entrada&lt;/a&gt; por decir las cosas claras.&lt;/p&gt;  &lt;p&gt;Ya cuando empecé a leer sobre el tema, anoche, en mis aplicaciones dentro de un, vergüenza me da escribirlo, iPad, empezó a hervirme la sangre.&lt;/p&gt;  &lt;p&gt;Hace ya tiempo que veo un enorme paralelismo entre los malos tiempos de Microsoft y la actualidad de Apple. Microsoft hizo muchas cosas malvadas y de las que debería hacer acto de contrición, como robar a Stacker y envolver su driver en otro simulando que lo habían hecho ellos, o cuando metieron un &lt;i&gt;payload&lt;/i&gt; en Windows 3.1 para que éste fallara si corría sobre DR-DOS… &lt;/p&gt;  &lt;p&gt;Pero lo de Apple no tiene nombre. Aparte del oscurantismo y el control dictatorial, aparte de ese aura de estúpida &lt;i&gt;magicidad&lt;/i&gt;, de ese espíritu &lt;i&gt;cool&lt;/i&gt; y guay del Paraguay se esconde una de las empresas más ingentemente malignas, más absurdamente controladoras, manipuladoras y aberrantes de toda la historia de la informática. Para mi Apple es el Cuarto Reich, Steve es Hitler, con la evidente distinción de que, y solo de momento, Apple no mata, o casi (sólo hay que recordar lo que pasa en &lt;a href="http://www.rtve.es/noticias/20100525/oleada-suicidios-fabrica-taiwanesa-iphones/332661.shtml"&gt;Foxconn&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;Para aquellos que no lo sepáis todavía, iOS guarda en un fichero sin encriptar la geolocalización de todas las iCosas que tengan 3G. No sólo lo guardan los dispositivos, sino que también está presente en las copias de seguridad de los ordenadores. Si bien es cierto que este hecho viene indicado en el contrato de treinta páginas que te obligan a aceptar, la verdad es que resulta inconcebible que se pueda hacer impunemente algo así.&lt;/p&gt;  &lt;p&gt;El hecho no es malo en sí, el hecho es que se trata de algo que ha sido ocultado, manipulado y que pone en peligro la integridad física de algunas personas. Es evidente que, en principio, poca importancia tiene por dónde haya pasado un iPhone. Pero no para un juez antiterrorista, ni para un político en el punto de mira de alguna organización terrorista, o incluso como herramienta de chantaje. Es tan fácil como entrar en casa del interfecto, volcar la copia de seguridad de su iPhone en un pincho USB y conocer por dónde se pasa… o pagarle a un chorizo para que robe la iCosa en un descuido de la persona vigilada.&lt;/p&gt;  &lt;p&gt;Pero lo peor de todo no es eso. Lo peor ha sido la respuesta de Apple. Con toda su desfachatez, con toda su cara dura, ha dicho que es un &lt;a href="http://www.appleinsider.com/articles/11/04/21/ios_location_tracking_file_likely_a_bug_apple_could_address_issue_with_next_udpate.html"&gt;bug y que será solucionado en la siguiente versión&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Apple, ¿te crees que somos imbéciles? ¿Que nos chupamos el dedo? Hay que joderse y hay que ser muy cínico y muy jodidamente oscurantista para que el común mortal se crea una mandanga así… No obstante, seguro que más de un fanboy salta a pies juntillas con la justificación…&lt;/p&gt;  &lt;p&gt;En fin, que cada vez me dan menos ganas de seguir con esto de programar para las herramientas construidas por tales interfectos…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=192722" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/delito/default.aspx">delito</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>Hasta los putos cojones del instalador del Flash Player</title><link>http://geeks.ms/blogs/rfog/archive/2011/04/03/hasta-los-putos-cojones-del-instalador-del-flash-player.aspx</link><pubDate>Sun, 03 Apr 2011 13:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:191584</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=191584</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=191584</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/04/03/hasta-los-putos-cojones-del-instalador-del-flash-player.aspx#comments</comments><description>&lt;p&gt;Pues eso, que estoy hasta los mism&amp;iacute;simos cojones del instalador del Flash Player.&lt;/p&gt;
&lt;p&gt;En primer lugar por instalarme un acceso directo al antivirus de McAffee sin mi permiso. Y aun m&amp;aacute;s a lo mierda que es ese antivirus.&lt;/p&gt;
&lt;p&gt;En segundo lugar, y no menos importante, es que seg&amp;uacute;n Adobe yo soy imb&amp;eacute;cil. Primero me pregunta si lo quiero bajar, y luego me pregunta si acepto la licencia. &lt;/p&gt;
&lt;p&gt;&amp;iquest;Por qu&amp;eacute; cojones no haces una sola pregunta? Al principio. Pregunta si quieres bajarlo, aceptas la licencia y quieres instalarlo. &lt;strong&gt;Una sola vez y una sola pregunta.&lt;/strong&gt; No creo que sea tan dif&amp;iacute;cil. O mejor a&amp;uacute;n, si he elegido instalarlo, &amp;iexcl;cojones! No me preguntes m&amp;aacute;s. Ya te he dicho que s&amp;iacute;, que lo quiero.&lt;/p&gt;
&lt;p&gt;Y tercera, por instalarme la mierda esa del download manager mierdoso...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191584" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/licencias/default.aspx">licencias</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category></item><item><title>Ya está aquí C++0x, digoooo C++11</title><link>http://geeks.ms/blogs/rfog/archive/2011/04/01/ya-est-225-aqu-237-c-0x-digoooo-c-11.aspx</link><pubDate>Fri, 01 Apr 2011 16:49:24 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:191474</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=191474</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=191474</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/04/01/ya-est-225-aqu-237-c-0x-digoooo-c-11.aspx#comments</comments><description>&lt;p&gt;En qué estaría yo pensando, aisssss. J Bueno, pues eso, que hace unos días Sutter &lt;a href="http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/"&gt;anunciaba en su blog&lt;/a&gt; que ya está todo cerrado y que en unas pocas semanas (esperemos) estará todo cerrado y el estándar publicado.&lt;/p&gt;  &lt;p&gt;También comenta (él u otro de los enlaces que pongo abajo) que esperan que esta nueva versión no necesite más que correcciones nimias dado que ya hay muchos fabricantes de compiladores que han implementado casi todas las características (y los TR publicados) y no se han detectado errores de concepto ni de implementación, por lo que se está bastante seguro de que no se ha cometido ninguna pifia que luego haya que corregir (me refiero a la definición del estándar, como ya ocurrió con la versión anterior, en la que hubo de modificar errores de concepto y clarificar puntos oscuros).&lt;/p&gt;  &lt;p&gt;Las cosas chulas que trae este nuevo estándar se pueden resumir en las siguientes:&lt;/p&gt;  &lt;p&gt;-rvalues y semántica de movimiento.&lt;/p&gt;  &lt;p&gt;-Operadores lambda (como los de C# pero con esteroides).&lt;/p&gt;  &lt;p&gt;-Variables automáticas (que rompen el estándar anterior).&lt;/p&gt;  &lt;p&gt;-Enumeraciones fuertemente tipadas.&lt;/p&gt;  &lt;p&gt;-Plantillas variadic y otras cosas sobre plantillas.&lt;/p&gt;  &lt;p&gt;-TLS y soporte para threads&lt;/p&gt;  &lt;p&gt;-Alguna cosa más.&lt;/p&gt;  &lt;p&gt;Mi intención es ir publicando aquí sobre todo eso, así que estad atentos.&lt;/p&gt;  &lt;p&gt;Y ahora, algunos enlaces de los gurús de todo esto:&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/"&gt;We Have FDIS! (Trip Report: March 2011 C++ Standards Meeting)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://scottmeyers.blogspot.com/2011/03/effective-c-in-c0x-c11-age.html"&gt;Effective C++ in the C++0x (C++11) Age&lt;/a&gt; (o cómo mear en tiesto propio)&lt;/p&gt;  &lt;p&gt;· &lt;a href="http://cplusplus-soup.com/2011/03/28/c0x-will-be-c-2011/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+CppSoup+%28C%2B%2B+Soup%29"&gt;C++0x will be C++ 2011&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191474" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category></item><item><title>Lo que valen los test case</title><link>http://geeks.ms/blogs/rfog/archive/2011/03/29/lo-que-valen-los-test-case.aspx</link><pubDate>Tue, 29 Mar 2011 20:36:36 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:191275</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=191275</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=191275</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/03/29/lo-que-valen-los-test-case.aspx#comments</comments><description>&lt;p align="justify"&gt;Seguro que más de uno, tras leer esta entrada, decide buscarme y matarme, pero os lo tengo que contar, y supongo que por el título ya habéis adivinado de qué va la cosa: otra diatriba del RFOG.&lt;/p&gt;  &lt;p align="justify"&gt;Ya sabéis que yo no soy muy dado a las formalidades esas de seguir un método de desarrollo como Scrumm o Agile o como quieran llamarse, y que siempre he dicho que los test units no sirven para nada… al menos en mi trabajo.&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, pues ahora le toca el turno a los “test case”… Según yo los entiendo, se trata de pasar una pieza de código más o menos importante y/o completa por una serie de test automatizados (o no) para determinar si los cambios realizados para resolver un problema han roto otra parte.&lt;/p&gt;  &lt;p align="justify"&gt;El concepto es hacer pequeños tests (los &lt;i&gt;units&lt;/i&gt; esos) sobre pequeños bloques de código como funciones y demás. Y luego, cuando ya tienes un módulo completo e independiente (sea lo que quiera que signifique eso en tu caso), lo vuelves a verificar como un todo.&lt;/p&gt;  &lt;p align="justify"&gt;Y si has sido bueno y has hecho los deberes, todo debe funcionar perfectísimamente bien y no presentar ningún problema final, y si lo hace, pues vuelves a revisar el código e iteras.&lt;/p&gt;  &lt;p align="justify"&gt;Luego queda un paso final, que es poner delante del monitor (o lo que sea) a alguien y que compruebe a mano que todo va bien.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Esa es mi visión de una secuencia de verificación de código, pero en mi caso muchas veces te encuentras con serias limitaciones, como las que os voy a contar, aunque realmente no puedo hacerlo como quisiera porque tiene que ver con mi trabajo y no puedo hablar con mucho detalle sobre él.&lt;/p&gt;  &lt;p align="justify"&gt;El caso es que tenía una secuencia como la descrita que falló estrepitosamente en producción, o más bien que falló en la etapa final de verificación del producto, que es sacarlo a la calle y dejar que los lusers lo revienten, como así ha sido.&lt;/p&gt;  &lt;p align="justify"&gt;Supongamos por un momento que tenemos un algoritmo del que sólo hay una implementación razonable y posible con los recursos disponibles, y que encima dicho algoritmo es la primera vez que se realiza en donde trabajas, por lo que no hay experiencia anterior ni reutilización de código. &lt;/p&gt;  &lt;p align="justify"&gt;Y encima el algoritmo es indivisible, es decir, no se puede dividir en tareas más pequeñas y verificables. Bueno, sí, pero esas partes son triviales y ni siquiera necesitan un &lt;i&gt;unit test&lt;/i&gt; por lo de siempre: un &lt;i&gt;qsort&lt;/i&gt; va a funcionar y te va a dejar el tema ordenado sí o sí, y todavía va a funcionar mejor si usas de origen ya algún contenedor STL ordenado…&lt;/p&gt;  &lt;p align="justify"&gt;Y es en este caso donde entran a pleno rendimiento todas esas metodologías chachi piruli Juan Pelotilla que tanto bombo y platillo tienen.&lt;/p&gt;  &lt;p align="justify"&gt;Ahora suponed que con esfuerzo uno hace un análisis de lo que va a ser la entrada al algoritmo y descubre que tiene cuatro variaciones sobre otras cuatro, es decir, 16 familias o grupos de datos. Y a mano, hace al menos dos tests para cada una de ellas. Es decir, calcula a mano, para dos entradas de cada familia, qué dos salidas debe haber.&lt;/p&gt;  &lt;p align="justify"&gt;Y lo mete todo en un test por tabla iterativo. Ante cada entrada se procesa ésta y se compara la salida obtenida con la que se debería obtener, y si todo coincide, se pasa a la siguiente. &lt;/p&gt;  &lt;p align="justify"&gt;Aparte se generan entradas aleatorias y se anotan las salidas, y se le aplican todas las comprobaciones heurísticas posibles, como por ejemplo que el total de la entrada debe ser el total de la salida, que si A es cero, B debe ser cero, etc., pero lo que no se puede hacer es tener un código que verifique los datos porque ese código sería exactamente el mismo y no se puede realizar un algoritmo inverso porque el resultado es entrópico: no se puede obtener el origen en base al resultado.&lt;/p&gt;  &lt;p align="justify"&gt;Si recordáis otra entrada similar a ésta, ese proceso sí que se podía verificar ya que el PC tenía artimética de 32 bits pero el origen no, y lo que se tenía que simular era eso: cierta aritmética de 32 bits en un procesador de 8 bits en el que, encima, el compilador hacía cosas mal.&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, volviendo al presente, una vez todos los casos funcionaban bien, y se generaban millones de secuencias sin que aparentemente nada descuadrara, y se revisaran algunas de forma aleatoria, se integró el algoritmo en el equipo de destino y… falló. &lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Tardó dos semanas pero falló. Vuelta al laboratorio. Primero se encontraron errores chorra de otras partes del código que alimentaban a la rutina con datos incorrectos, pero aun así seguía fallando miserablemente en uno de los 16 casos.&lt;/p&gt;  &lt;p align="justify"&gt;Escribirlo es infinitamente más sencillo que encontrarlo. Me refiero a delimitar el problema a una de las 16 familias, pero tras muchas pruebas, muchos análisis de logs, se encontró.&lt;/p&gt;  &lt;p align="justify"&gt;Luego uno miró los test cases y no vio error alguno… excepto que estaban mal. Es decir, la salida que el programa generaba era incorrecta, y como la salida coincidía (recordemos que pese a ser determinista es entrópica, como un compilador) con lo que decía el test, la cosa fue para adelante.&lt;/p&gt;  &lt;p align="justify"&gt;El primer problema es cómo cojones se pudo equivocar uno en eso. Para mí está claro: dislexia. Invertí dos valores de una tabla, que encima coincidían con la salida incorrecta. Una de esas casualidades que uno encuentra en la vida y que piensa que no deberían ocurrir porque son tan improbables… antes de que Murphy haga su aparición, claro.&lt;/p&gt;  &lt;p align="justify"&gt;Pues bien, una vez corregida la tabla, rápidamente se encontró el error… que era bien estúpido. Para que os hagáis una idea, después de una ordenación mediante quicksort (estamos en C embebido), se recorría la ordenación buscando un elemento con una característica concreta, pero la comparación se hacía… sobre la tabla sin ordenar, o más bien sobre el índice de uno de los elementos ordenados pero tomando la tabla de origen como base del índice… En fin.&lt;/p&gt;  &lt;p align="justify"&gt;Aquí entra una de las cosas que me molan mucho: código auto defensivo. En el caso de las otras familias el código no fallaba porque se recuperaba del error anterior debido a las seguridades insertas en él, pero en el caso que nos ocupa se concatenaba una debilidad de la auto defensa con el error y al final el &lt;i&gt;algorrino &lt;/i&gt;terminaba fallando.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Ya como conclusión me gustaría hacer algunos comentarios. Los tests estaban mal. Si hubieran estado bien el problema se habría detectado inmediatamente, pero el hecho es que sirvieron de poco o de nada.&lt;/p&gt;  &lt;p align="justify"&gt;En el caso que nos ocupa, el algoritmo era bastante complejo y encima se tenían recursos limitadísimos en la máquina de destino, por lo que no se podían hacer grandes implementaciones ni grandes comprobaciones, y de hecho todavía no se está seguro de que se haya solventado por completo. Las verificaciones automáticas siguen ejecutándose todas las noches, con la ventaja de que ahora los fallos terminan en un bucle infinito desde el cual se puede determinar qué falló y por qué.&lt;/p&gt;  &lt;p align="justify"&gt;Pero la advertencia es muy seria, y es la conclusión a la que quiero llegar. Los tests no sirven para nada, o casi para nada. Porque cuando uno los necesita de verdad, nunca puedes estar completamente seguro de que estén bien. De hecho, los propios tests son código, y podría darse, y os aseguro que se da, la situación en la que un error en el código a comprobar, más un error en el código del test producen una salida correcta.&lt;/p&gt;  &lt;p align="justify"&gt;Es evidente que uno puede tener todo el cuidado del mundo en hacerlos, pero nadie está a salvo de equivocarse. Y al menos yo pienso que, si puedes hacer un test del que estés seguro que no va a fallar es porque no lo necesitas, ya que también estás seguro de que el código funciona bien porque es ese mismo código el que te indica la correctitud o no del test.&lt;/p&gt;  &lt;p align="justify"&gt;Y sobre la verificación de parámetros de entrada, en muchos casos es un objetivo irreal. En el caso que nos ocupa, el algoritmo (y nuestros tests) son completamente incapaces (o casi) de verificar que la entrada es incorrecta salvo en los casos más triviales. Y, de nuevo, los tests no sirven para nada.&lt;/p&gt;  &lt;p align="justify"&gt;Con esto no quiero decir que no se deban hacer tests, que se deben hacer, y cuantos más mejor, si no que cuando más útiles deberían ser, menos utilidad tienen, y encima podría decir que se trata de una relación exponencial inversa…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=191275" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>MAC Rationale vs Windows Rationale en el desarrollo</title><link>http://geeks.ms/blogs/rfog/archive/2011/03/19/mac-rationale-vs-windows-rationale-en-el-desarrollo.aspx</link><pubDate>Sat, 19 Mar 2011 14:42:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:190697</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=190697</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=190697</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/03/19/mac-rationale-vs-windows-rationale-en-el-desarrollo.aspx#comments</comments><description>&lt;p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Todav&amp;iacute;a estoy leyendo temas generales sobre el
desarrollo en MAC, de hecho a&amp;uacute;n no he pasado de los manuales que describen las
tecnolog&amp;iacute;as y los diferentes bloques en que se divide el desarrollo en MAC. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No obstante me ha surgido una curiosa
reflexi&amp;oacute;n que quiero compartir con vosotros. Todav&amp;iacute;a no estoy muy seguro de que
sea completamente cierta, porque todav&amp;iacute;a no he profundizado en los conceptos
MAC y lo que he le&amp;iacute;do tiene m&amp;aacute;s que ver con la &lt;i&gt;publicidad&lt;/i&gt; del desarrollo en esta plataforma que otra cosa, pero
creo que tiene muchos visos de ser real como la vida misma.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y lo m&amp;aacute;s curioso de todo es que tiene mucho
que ver con el desarrollo Windows, y m&amp;aacute;s cercanamente al de las tecnolog&amp;iacute;as
.NET. Cuanto m&amp;aacute;s leo sobre Cocoa, QuickTime (que no s&amp;oacute;lo es un programa sino una
tecnolog&amp;iacute;a), etc., m&amp;aacute;s me parece estar leyendo sobre .NET, o m&amp;aacute;s bien sobre la
forma en la que se publicita .NET.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Se habla de grandes grupos de tecnolog&amp;iacute;as
orientadas a objetos, con grandes rendimientos y grandes facilidades ofrecidas
a los desarrolladores. Calcado uno de otro. Ahora habr&amp;aacute; que ver la pura
realidad.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Del lado .NET ya lo tengo claro: mucho ruido y
pocas nueces, al menos para desarrollo de sistemas. Quiero creer que del lado
MAC no ser&amp;aacute; igual, pero cualquiera sabe. Ya os ir&amp;eacute; diciendo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;***&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero no, no es sobre eso sobre lo que os
quer&amp;iacute;a hablar. Veamos por un lado la arquitectura l&amp;oacute;gica expresada por los
manuales de MAC, que creo es m&amp;aacute;s real que la dicha por los de Windows.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Debajo del todo un ordenador de Apple hay un
Kernel BSD que no es otra cosa que una variante de UNIX igual que es Linux. Y
luego hay un sistema POSIX de toda la vida que de nuevo tiene que ver con el
mundo UNIX (que viene a ser como una serie de servicios que simplifican el
acceso al n&amp;uacute;cleo del sistema igual que una consola de comandos en Windows
permite trabajar con ficheros sin tener que tocarlo).&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Aunque Apple lo ha llamado Darwin, no deja de
ser lo que es, y de hecho Apple &lt;a href="http://www.opensource.apple.com/"&gt;publica
todo el c&amp;oacute;digo fuente&lt;/a&gt; de ello. Al ser un est&amp;aacute;ndar debe estar separado.
Realmente est&amp;aacute; separado. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Encima de eso hay una serie de capas, Cocoa,
Carbon, QuickTime. M&amp;aacute;s o menos. Pero lo que es cierto es que esos subsistemas
est&amp;aacute;n completamente separados del n&amp;uacute;cleo o m&amp;aacute;s bien &lt;i&gt;encima&lt;/i&gt; de &amp;eacute;l.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;En Windows creo que no es as&amp;iacute;. En su momento,
en las versiones NT originales s&amp;iacute; que lo era (o al menos as&amp;iacute; se publicitaba).
Recordemos la capa HAL que pod&amp;iacute;a ser para un mont&amp;oacute;n de procesadores y luego el
sistema NT Executive nativo, que corr&amp;iacute;a sobre dicha capa. Pero ahora, despu&amp;eacute;s
de la unificaci&amp;oacute;n con la plataforma 9x en lo que fue Windows XP dudo mucho que
siga si&amp;eacute;ndolo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Porque ahora no hay soporte para ARM, ni para
SuperH, ni para PPC. S&amp;oacute;lo Intel x86 y dando gracias. Me juego un gallifante a
que ahora est&amp;aacute; todo mezclado y revuelto (y de ah&amp;iacute; los problemas de Microsoft
para volver a a&amp;ntilde;adir soporte para ARM). Porque si no fuera as&amp;iacute; no se entender&amp;iacute;a
c&amp;oacute;mo puede funcionar el sistema de v&amp;iacute;deo sobre Win32 accediendo al driver que
est&amp;aacute; en el n&amp;uacute;cleo (s&amp;iacute;, ya s&amp;eacute;, anillos, &lt;i&gt;gateways&lt;/i&gt;
y todo eso, pero no voy por ah&amp;iacute;)&amp;hellip; &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Bueno, quiz&amp;aacute;s en esto me equivoque, pero si
alguien me explicara c&amp;oacute;mo el hecho de reproducir un v&amp;iacute;deo dentro de un
navegador pueda generar una BSOD estando los sistemas separados, que me lo
diga. Porque me ha pasado. Y no una, sino varias veces. Putas ATI.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;De todos modos luego veremos alguna raz&amp;oacute;n m&amp;aacute;s
de ello y quiz&amp;aacute;s uno de los puntos m&amp;aacute;s fuertes de por qu&amp;eacute; Microsoft est&amp;aacute; un
poco contra la espada y la pared.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;***&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Apple ya lo ha hecho al menos dos veces y lo
va a hacer una m&amp;aacute;s. En x64 no va a haber Carbon, que es como se le llama al
subsistema que soporta programar en C y C++ de forma nativa. En x64 s&amp;oacute;lo vamos
a tener Cocoa (Objetive-C y Objetive-C++) y POSIX (que yo sepa). En su momento,
con el cambio de PPC a x86 repiti&amp;oacute; jugada, haciendo borr&amp;oacute;n y cuenta nueva y
forzando a muchas empresas de software a reescribir sus programas. Como cosa
curiosa os dir&amp;eacute; que Apple encarg&amp;oacute; a Adobe la creaci&amp;oacute;n de su iPhoto, iVideo y
dem&amp;aacute;s programas de esa plataforma y Adobe los mand&amp;oacute; a fre&amp;iacute;r esp&amp;aacute;rragos porque
estaban como locos rehaciendo sus propios programas. Creo que hubo otro cambio
rompedor m&amp;aacute;s en los MAC pero ahora no recuerdo qu&amp;eacute;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Bueno, el meollo del asunto est&amp;aacute; en que a
veces es conveniente hacer borr&amp;oacute;n y cuenta nueva. Hasta donde s&amp;eacute;, el API de MAC
OS X y el de iOS es un API moderno, orientado a objetos y bastante potente. Ya
os dir&amp;eacute; si realmente es cierto cuando me enfangue las manos con ello.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;***&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Ahora volvamos a Windows. Aquellos que hayan
le&amp;iacute;do sobre el tema, sabr&amp;aacute;n lo que son los &lt;i&gt;subsistemas&lt;/i&gt;.
Para los que no, una peque&amp;ntilde;a introducci&amp;oacute;n.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Win32 es un subsistema. POSIX es un subsistema
(o lo era hasta que lo quitaron). De hecho, en las primeras versiones de NT
hab&amp;iacute;a hasta un subsistema OS/2. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Un subsistema es una API completa que sirve
para que las aplicaciones escritas para tal subsistema se ejecuten en &amp;eacute;l, sean
independientes del n&amp;uacute;cleo y no puedan afectarlo en ninguna manera. Ved la
siguiente imagen de la Wikipedia y fijaros arriba a la derecha.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/5/5d/Windows_2000_architecture.svg"&gt;&lt;span&gt;
 
 
  
  
  
  
  
  
  
  
  
  
  
  
 
 
 

 
 
&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/File:Windows_2000_architecture.svg"&gt;&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;a target="_blank" href="http://en.wikipedia.org/wiki/File:Windows_2000_architecture.svg"&gt;http://en.wikipedia.org/wiki/File:Windows_2000_architecture.svg&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;B&amp;aacute;sicamente esa deber&amp;iacute;a ser la arquitectura de
Windows. Fijaros tambi&amp;eacute;n en lo que hemos hablado antes sobre el HAL y el
Executive.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&amp;iquest;Realmente Windows es as&amp;iacute;? Creo que no.
Te&amp;oacute;ricamente si cog&amp;eacute;is un programa 100% compatible POSIX y lo ejecut&amp;aacute;is en
Windows 2000, deber&amp;iacute;a funcionar. &amp;iquest;Lo hace? Pues no. En su momento lo prob&amp;eacute; y no
funcionaba. Tampoco lo hac&amp;iacute;a uno de OS/2 cuando ese subsistema estaba, todav&amp;iacute;a,
presente. No es que no funcionaran bien o hicieran alguna cosa rara, es que la
mayor&amp;iacute;a de veces simplemente no cargaban.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&amp;iquest;Ha visto alguno de vosotros un Windows NT
ejecutado en un ARM o en un SuperH? Yo no y no creo que funcionen. &amp;iquest;Vais viendo
ya por d&amp;oacute;nde voy?&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Con esto no quiero decir que nunca hayan
llegado a funcionar, lo que quiero decir es que yo al menos no lo consegu&amp;iacute; en
su momento. En un MAC moderno podemos ejecutar pr&amp;aacute;cticamente cualquier comando
t&amp;iacute;pico UNIX, desde un &amp;ldquo;ls&amp;rdquo; hasta un &amp;ldquo;ps&amp;rdquo; pasando por un &amp;ldquo;dd&amp;rdquo; o lo que queramos.
Aparte de los que la propia Apple ha a&amp;ntilde;adido, que hay unos cuantos.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;De nuevo no me malinterpret&amp;eacute;is, en ning&amp;uacute;n
momento estoy diciendo que un MAC sea mejor que un Windows por eso. Simplemente
estoy diciendo que en un MAC s&amp;iacute; que est&amp;aacute;n separadas y presentes las distintas
piezas, o al menos as&amp;iacute; lo creo. De nuevo el tiempo me lo dir&amp;aacute;, y yo a vosotros.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;***&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y ahora entramos de lleno en .NET. &amp;iquest;Por qu&amp;eacute;
.NET no es un subsistema y sin embargo est&amp;aacute; construido sobre Win32, que no es
precisamente un API limpia y ordenadita sino m&amp;aacute;s bien todo lo contrario? &amp;iquest;Por
qu&amp;eacute; no aprovecha Microsoft la arquitectura de los subsistemas para hacer a .NET
miembro de derecho propio dentro de Windows y no un mero envoltorio que cada
vez se va pareciendo m&amp;aacute;s a lo que envuelve, sobre todo en el tema de la &lt;i&gt;guarrer&amp;iacute;a&lt;/i&gt;?&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Si ya .NET es algo grande en el aspecto del
rendimiento y funcionalidad (comparado con su contrapartida Java y a veces con
el propio Win32), &amp;iquest;qu&amp;eacute; rendimiento no tendr&amp;iacute;a si fuera un subsistema
independiente?&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&amp;iquest;O es que toda la estructura arquitect&amp;oacute;nica de
Windows es una mentira como un castillo y no puede haber otros subsistemas
cooperando sobre el &lt;i&gt;ejecutivo&lt;/i&gt;? &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Me gustar&amp;iacute;a que alguien me aclarara todo esto,
porque sinceramente no lo entiendo. Yo tengo mi teor&amp;iacute;a, que no voy a exponer
aqu&amp;iacute; no sea que se me acuse de lo que creo no soy, y menos ahora que tengo mi &lt;i&gt;calent&amp;oacute;n&lt;/i&gt; de fanboy&amp;hellip;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=190697" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Win32/default.aspx">Win32</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>C++Builder XE/Delphi XE Starter edition (como los Express de Visual Studio, pero pagando poco)</title><link>http://geeks.ms/blogs/rfog/archive/2011/01/29/c-builder-delphi-xe-starter-edition-como-los-express-de-visual-studio-pero-pagando-poco.aspx</link><pubDate>Sat, 29 Jan 2011 11:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:188149</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=188149</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=188149</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/01/29/c-builder-delphi-xe-starter-edition-como-los-express-de-visual-studio-pero-pagando-poco.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Actualizaci&amp;oacute;n 31/01/2011:&lt;/strong&gt; Definitivamente es una realidad. Hoy acaba de ser anunciado oficialmente, con los precios indicados (al menos en USA), y para Europa, como siempre, la traducci&amp;oacute;n 1 d&amp;oacute;lar 1 euro, es decir, 199 euros para la versi&amp;oacute;n completa y 149 para la actualizaci&amp;oacute;n. En un primer vistazo, la versi&amp;oacute;n Starter es la Professional pero sin el soporte para UML, refactorizaci&amp;oacute;n y competado de c&amp;oacute;digo, as&amp;iacute; como de alguna que otra cosilla m&amp;aacute;s...&lt;/p&gt;
&lt;p&gt;Hac&amp;iacute;a ya varios a&amp;ntilde;os que &lt;span style="text-decoration:line-through;"&gt;BorlandCodegear&lt;/span&gt;Embarcadero no sacaba nada &lt;em&gt;express&lt;/em&gt; como ya lo hicieron con sus Turbo Explorer hace bastante tiempo. De hecho esas ediciones ya no se pueden conseguir, ni funcionan las activaciones aunque tenglas la clave...&lt;/p&gt;
&lt;p&gt;Pues bien, se comenta por los mentideros de la red que van a aparecer una versiones &lt;em&gt;Starter&lt;/em&gt; de los productos citados. Parecer ser que a alguien se le escap&amp;oacute; sin querer la semana pasada, y la noticia ha sido comentada hasta el punto de que Embarcadero ha reconocido que est&amp;aacute; en ello.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delphi-insider.blogspot.com/2011/01/delphi-starter-official-announcement.html"&gt;http://delphi-insider.blogspot.com/2011/01/delphi-starter-official-announcement.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.marcocantu.com/blog/delphi_started_edition.html"&gt;http://blog.marcocantu.com/blog/delphi_started_edition.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.sdtimes.com/link/35223"&gt;http://www.sdtimes.com/link/35223&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El mayor problema es que esas ediciones van a ser de pago. Se habla de unos 199 d&amp;oacute;lares o 149 euros, aunque permiten desarrollar hasta en cinco m&amp;aacute;quinas simultaneamente y para fines comerciales hasta que los beneficios producidos por ellas no sobrepasen los 1000$ anuales (o al menos eso es lo que creo haber entendido de las noticias en ingl&amp;eacute;s).&lt;/p&gt;
&lt;p&gt;No es mala idea ofrecer esos productos a ese precio, aunque si fueran gratis ser&amp;iacute;a todav&amp;iacute;a mejor ya que tienen que competir con las versiones Express de Visual Studio, que son gratis total para cualquier uso. No quiero hablar de la estupidez que me parece eso de los 1000 d&amp;oacute;lares, como tampoco del hecho de que Delphi no puede competir con Visual C# Express por la sencilla raz&amp;oacute;n del precio. En el caso de C++ Builder s&amp;iacute; que podr&amp;iacute;a existir una sana competencia con su equivalente de Microsoft, m&amp;aacute;s que nada porque, aunque el compilador de C++/CLI es superior, Windows Forms orientadas a C++ son un poco mierdosas, sin hablar de que C++ no vale para WPF (y poco les habr&amp;iacute;a costado implementar clases parciales en C++/CLI)... C++ Builder es mucho m&amp;aacute;s r&amp;aacute;pido y con mucha m&amp;aacute;s funcionalidad que Visual C++, ya sea con MFC o con C++/CLI y Windows Forms (recordemos que los sue&amp;ntilde;os de Microsoft de dejar atr&amp;aacute;s C++ han fracasado completamente).&lt;/p&gt;
&lt;p&gt;Desde un punto de vista general s&amp;iacute; que es una buena jugada, ya que la pr&amp;oacute;xima versi&amp;oacute;n de Delphi/C++Builder se supone ser&amp;aacute; lo suficientemente multiplataforma como para poder desarrollar para Mac y para Linux... o al menos es lo que se pretende. De hecho, toda la documentaci&amp;oacute;n y el c&amp;oacute;digo fuente que he podido ver as&amp;iacute; lo indica: en muchos lugares hay compilaci&amp;oacute;n condicional para las tres plataformas y en otros la documentaci&amp;oacute;n indica que eso no est&amp;aacute; disponible para Linux o para MAC...&lt;/p&gt;
&lt;p&gt;Por lo tanto, una ampliaci&amp;oacute;n de usuarios les vendr&amp;iacute;a muy bien para luego vender las nuevas versiones, porque debemos recordar que, al menos C++Builder en sus versiones 2009, 2010 y XE son casi el mismo producto con la diferencia de que cada versi&amp;oacute;n soluciona los bugs de la anterior (y genera nuevos) y trae complementos de terceros. Y es que la goma no se puede estirar m&amp;aacute;s. La VCL est&amp;aacute; completa, pocas cosas gen&amp;eacute;ricas se les puede a&amp;ntilde;adir, los IDE tampoco dan m&amp;aacute;s de s&amp;iacute;, y a lo sumo a C++Builder se le podr&amp;iacute;an a&amp;ntilde;adir lo que le falta para ser compatible con C++0x...&lt;/p&gt;
&lt;p&gt;C++ Builder XE, en su fecha de salida y pese a haber corregido varios miles de bugs de la versi&amp;oacute;n 2010, era un pu&amp;ntilde;adito de caca que casi no pod&amp;iacute;a compilar nada. No obstante unos meses despu&amp;eacute;s sacaron el primer parche y el producto se convirti&amp;oacute; en lo que deb&amp;iacute;a haber sido en un principio. Esta versi&amp;oacute;n mejora tambi&amp;eacute;n el sistema de b&amp;uacute;squeda (*), y parece ser que hay una nueva actualizaci&amp;oacute;n de la misma que todav&amp;iacute;a arregla m&amp;aacute;s cosas. Yo lo estoy usando un poco y ciertamente es bastante m&amp;aacute;s estable que las versiones anteriores.&lt;/p&gt;
&lt;p&gt;De todos modos imaginaros el siguiente escenario dentro de uno&amp;nbsp;o&amp;nbsp;a&amp;ntilde;os&amp;nbsp;a partir de&amp;nbsp;estas fechas. Un futuro C++ Builder XE 3 Starter gratuito o de coste m&amp;iacute;nimo, capaz de compilar s&amp;oacute;lo para Windows y Win32. Y un C++ Builder XE 3 Professional y superior capaz de compilar para Win32, Win64, MAC x64, Linux x64... Esos son los planes de Embarcadero, pero como no se espabilen les van a comer la merienda. QT viene pegando fuerte, muy fuerte.&lt;/p&gt;
&lt;p&gt;(*) Lo que demuestra que la tecnolog&amp;iacute;a dentro del Document Explorer de Microsoft no es el problema. El problema es la poca preocupaci&amp;oacute;n de la integraci&amp;oacute;n del sistema de ayuda con los IDE...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=188149" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/linux/default.aspx">linux</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>El RFOG se renueva, por dentro y por fuera</title><link>http://geeks.ms/blogs/rfog/archive/2010/12/02/el-rfog-se-renueva-por-dentro-y-por-fuera.aspx</link><pubDate>Thu, 02 Dec 2010 20:40:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185517</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=185517</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=185517</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/12/02/el-rfog-se-renueva-por-dentro-y-por-fuera.aspx#comments</comments><description>&lt;p&gt;Sí, pese a lo que dijo sobre su MAC, al final se ha comprado un PC que sin ser lo último de lo último, tiene su cosa. El MAC está bien, pero le echa a faltar muchas cosas, muchos programas y otros temas, así que, al final, en lugar de comprarse un MAC PRO, se ha decidido por un clónico.&lt;/p&gt;  &lt;p&gt;Si os preguntáis qué le ha pasado con su ordenador viejo, no lo hagáis directamente a él, porque va a coger un cabreo de cojones y posiblemente os deje con la palabra en la boca… si no os suelta alguna fresca.&lt;/p&gt;  &lt;p&gt;Básicamente su QUAD con 8 GB de RAM se ha quedado en la empresa. Para evitar jaleos y tener la fiesta en paz, ha decidido que no vale la pena batallar por cosa tan nimia (Si no lo sabíais, el RFOG ha pasado, por ordeno y mando, de trabajar en su casa a tener que ir, todos los días, a una empresa, gastando por ello al menos hora u hora y media más de su vida por las mismas prestaciones económicas, y de hecho sigue preguntándose por qué no se ha ido sin más... Corramos un estúpido velo sobre el tema y dejemos la cosa como está.&lt;/p&gt;  &lt;p&gt;Bueno, el nuevo ordenador del RFOG está compuesto por una placa Gigabyte (Modelo P55A-UD4) que tiene hasta tres chipsets para discos. Uno para el eSata, otro para los SATA II normales y un tercero para dos discos SATA III. Aparte la placa tiene FireWire 400. Ahí es nada, y también ahí es nada el tiempo que tarda toda la rutina del POST, de hecho más tiempo que el necesario para arrancar su Windows.&lt;/p&gt;  &lt;p&gt;Esa placa ejecuta un Core i7 870 a 2.93 GHz que tiene cuatro núcleos dobles con HyperThreading, lo que suman 8. Y bien bonitos que se ven en el Administrador de Tareas. Y también, de momento, no les ha visto el culo, porque no suben del 40% total de tiempo de proceso.&lt;/p&gt;  &lt;p&gt;La idea original era ponerle 16GB de RAM, pero al final sólo pudo disponer de 4 porque no le pudieron encontrar módulos de 4GB, aunque le han dicho que en cuanto los consigan lo avisan y se los cambian. De todos modos, 8GB ya son gigas para lo que el RFOG quiere.&lt;/p&gt;  &lt;p&gt;La tarjeta de vídeo es una ATI HD6850. El rendimiento es tal que ni el StarCraft II ni el Civilization V a plena resolución hacen que la el ventilador de la misma se revolucione. Ahí es nada. De hecho, apenas nota que tiene algunas cosas con vmWare en modo Unity (que ya es decir).&lt;/p&gt;  &lt;p&gt;Luego están los discos. Un SATA II de 1 TB normalito como disco de datos y de seguridad. Y cuatro discos SSD de 64GB en dos RAID 0. Sí, lo que oís, los discos valen más que el resto del ordenador.&lt;/p&gt;  &lt;p&gt;Pero ¡chico!, cómo van. Y eso que no son de los más rapiditos que hay, que si no… El arranque de Windows hasta mostrar el escritorio es unos 10 segundos. La tasa de transferencia en copia entre las dos agrupaciones RAID es de unos 220-230 MB/s sostenida (unos 40 GB de una tacada).&lt;/p&gt;  &lt;p&gt;A todo eso ha añadido a su ya existente monitor de 24”… otro más. Y como el primero tiene resolución de 1920x1200, el nuevo también la tiene (los modernos traen una de 1920x1080, quizás para poder bajar precios). Y el RFOG se pierde entre tanta pantalla.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Eso en cuanto al hardware. Respecto al software la cosa es algo más normal. El SATA II tiene dos particiones, en una de ellas está su trabajo y en la otra se mantienen las copias de seguridad de los otros dos conjuntos RAID, que el RFOG no se fía mucho ni de los SSD ni de los RAID. Relativamente amargas experiencias ha tenido con los últimos.&lt;/p&gt;  &lt;p&gt;En uno de los RAID está Windows 7 x64 al completo con algunos programas más, entre ellos vmWare y Office. En el otro hay almacenadas varias máquinas virtuales, en donde se han instalado diferentes programas. En una de ellas está Visual Studio 2010, y en otra, Visual Studio 2008SP1 con los SDKs embebidos. Y así. Esas dos son Windows 7 Ultimate x86 con 3GB de RAMy 2 procesadores con 2 cores, y se pueden tener ambas abiertas sin mucha penalización de rendimiento (en su i7, claro, y más cuando tenga 16GB de RAM).&lt;/p&gt;  &lt;p&gt;Y la idea es mantener limpio su HOST e ir intercambiando las máquinas virtuales según necesidad. Su nueva máquina lo da, y de momento la cosa está funcionando bien, con algunos detalles que está puliendo a ratos. Puede poner accesos directos a los programas en su barra de tareas como si una aplicación no virtualizada se tratara, y cuando la lanza primero se abre la máquina virtual en modo Unity y luego se lanza la aplicación. &lt;/p&gt;  &lt;p&gt;El único problema es que Visual Studio no se lleva bien con los proyectos situados en carpetas de red, aunque sean compartidas a nivel de vmWare, así que ha metido todos sus proyectos en un disco duro virtual de Windows (VHD) y lo ha añadido a la configuración de la máquina virtual.&lt;/p&gt;  &lt;p&gt;Un detalle del que se ha dado cuenta es que la máquina virtual, salvo el acceso a video, es sensiblemente más rápida que la real. Ignora si eso se debe a que es de 32 bits en lugar de 64, o a que al estar el disco comprimido sobre un SSD la rapidez es impresionante…&lt;/p&gt;  &lt;p&gt;Evidentemente todo esto es a nivel particular. A nivel de curro la cosa sigue como antes. (Bueno, mucho peor, pero sigue haciendo proyectos interesantes, que quizás sea lo único que lo mantenga apegado a él).&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Bueno, ya para finalizar, la idea original era &lt;i&gt;hackintoshear&lt;/i&gt; la placa base (que se puede, es una de las que tienen el parche de la BIOS) para instalarse un Snow Leopard en nativo y virtualizar todos sus Windows, pero una vez que tuvo delante de sí el PC… se le quitaron las ganas de hacerlo. Es muy posible que en un arranque de aburrimiento lo intente, o que se instale una VM pirateada. &lt;/p&gt;  &lt;p&gt;Ya veremos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185517" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/hardware/default.aspx">hardware</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Windows+7/default.aspx">Windows 7</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Manifiesto por una Red Neutral</title><link>http://geeks.ms/blogs/rfog/archive/2010/11/30/manifiesto-por-una-red-neutral.aspx</link><pubDate>Tue, 30 Nov 2010 16:31:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:185427</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=185427</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=185427</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/11/30/manifiesto-por-una-red-neutral.aspx#comments</comments><description>&lt;p&gt;Los ciudadanos y las empresas usuarias de Internet adheridas a este texto manifestamos: &lt;/p&gt;
&lt;p&gt;1.Que Internet es una Red Neutral por dise&amp;ntilde;o, desde su creaci&amp;oacute;n hasta su actual implementaci&amp;oacute;n, en la que la informaci&amp;oacute;n fluye de manera libre, sin discriminaci&amp;oacute;n alguna en funci&amp;oacute;n de origen, destino, protocolo o contenido. &lt;/p&gt;
&lt;p&gt;2.Que las empresas, emprendedores y usuarios de Internet han podido crear servicios y productos en esa Red Neutral sin necesidad de autorizaciones ni acuerdos previos, dando lugar a una barrera de entrada pr&amp;aacute;cticamente inexistente que ha permitido la explosi&amp;oacute;n creativa, de innovaci&amp;oacute;n y de servicios que define el estado de la red actual. &lt;/p&gt;
&lt;p&gt;3.Que todos los usuarios, emprendedores y empresas de Internet han podido definir y ofrecer sus servicios en condiciones de igualdad llevando el concepto de la libre competencia hasta extremos nunca antes conocidos. &lt;/p&gt;
&lt;p&gt;4.Que Internet es el veh&amp;iacute;culo de libre expresi&amp;oacute;n, libre informaci&amp;oacute;n y desarrollo social m&amp;aacute;s importante con el que cuentan ciudadanos y empresas. Su naturaleza no debe ser puesta en riesgo bajo ning&amp;uacute;n concepto. &lt;/p&gt;
&lt;p&gt;5.Que para posibilitar esa Red Neutral las operadoras deben transportar paquetes de datos de manera neutral sin erigirse en &amp;ldquo;aduaneros&amp;rdquo; del tr&amp;aacute;fico y sin favorecer o perjudicar a unos contenidos por encima de otros. &lt;/p&gt;
&lt;p&gt;6.Que la gesti&amp;oacute;n del tr&amp;aacute;fico en situaciones puntuales y excepcionales de saturaci&amp;oacute;n de las redes debe acometerse de forma transparente, de acuerdo a criterios homog&amp;eacute;neos de inter&amp;eacute;s p&amp;uacute;blico y no discriminatorios ni comerciales. &lt;/p&gt;
&lt;p&gt;7.Que dicha restricci&amp;oacute;n excepcional del tr&amp;aacute;fico por parte de las operadoras no puede convertirse en una alternativa sostenida a la inversi&amp;oacute;n en redes. &lt;/p&gt;
&lt;p&gt;8.Que dicha Red Neutral se ve amenazada por operadoras interesadas en llegar a acuerdos comerciales por los que se privilegie o degrade el contenido seg&amp;uacute;n su relaci&amp;oacute;n comercial con la operadora. &lt;/p&gt;
&lt;p&gt;9.Que algunos operadores del mercado quieren &amp;ldquo;redefinir&amp;rdquo; la Red Neutral para manejarla de acuerdo con sus intereses, y esa pretensi&amp;oacute;n debe ser evitada; la definici&amp;oacute;n de las reglas fundamentales del funcionamiento de Internet debe basarse en el inter&amp;eacute;s de quienes la usan, no de quienes la proveen. &lt;/p&gt;
&lt;p&gt;10.Que la respuesta ante esta amenaza para la red no puede ser la inacci&amp;oacute;n: no hacer nada equivale a permitir que intereses privados puedan de facto llevar a cabo pr&amp;aacute;cticas que afectan a las libertades fundamentales de los ciudadanos y la capacidad de las empresas para competir en igualdad de condiciones. &lt;/p&gt;
&lt;p&gt;11.Que es preciso y urgente instar al Gobierno a proteger de manera clara e inequ&amp;iacute;voca la Red Neutral, con el fin de proteger el valor de Internet de cara al desarrollo de una econom&amp;iacute;a m&amp;aacute;s productiva, moderna, eficiente y libre de injerencias e intromisiones indebidas. Para ello es preciso que cualquier moci&amp;oacute;n que se apruebe vincule de manera indisoluble la definici&amp;oacute;n de Red Neutral en el contenido de la futura ley que se promueve, y no condicione su aplicaci&amp;oacute;n a cuestiones que poco tienen que ver con &amp;eacute;sta. &lt;/p&gt;
&lt;p&gt;La Red Neutral es un concepto claro y definido en el &amp;aacute;mbito acad&amp;eacute;mico, donde no suscita debate: los ciudadanos y las empresas tienen derecho a que el tr&amp;aacute;fico de datos recibido o generado no sea manipulado, tergiversado, impedido, desviado, priorizado o retrasado en funci&amp;oacute;n del tipo de contenido, del protocolo o aplicaci&amp;oacute;n utilizado, del origen o destino de la comunicaci&amp;oacute;n ni de cualquier otra consideraci&amp;oacute;n ajena a la de su propia voluntad. Ese tr&amp;aacute;fico se tratar&amp;aacute; como una comunicaci&amp;oacute;n privada y exclusivamente bajo mandato judicial podr&amp;aacute; ser espiado, trazado, archivado o analizado en su contenido, como correspondencia privada que es en realidad. &lt;/p&gt;
&lt;p&gt;Europa, y Espa&amp;ntilde;a en particular, se encuentran en medio de una crisis econ&amp;oacute;mica tan importante que obligar&amp;aacute; al cambio radical de su modelo productivo, y a un mejor aprovechamiento de la creatividad de sus ciudadanos. La Red Neutral es crucial a la hora de preservar un ecosistema que favorezca la competencia e innovaci&amp;oacute;n para la creaci&amp;oacute;n de los innumerables productos y servicios que quedan por inventar y descubrir. La capacidad de trabajar en red, de manera colaborativa, y en mercados conectados, afectar&amp;aacute; a todos los sectores y todas las empresas de nuestro pa&amp;iacute;s, lo que convierte a Internet en un factor clave actual y futuro en nuestro desarrollo econ&amp;oacute;mico y social, determinando en gran medida el nivel de competitividad del pa&amp;iacute;s. De ah&amp;iacute; nuestra profunda preocupaci&amp;oacute;n por la preservaci&amp;oacute;n de la Red Neutral. Por eso instamos con urgencia al Gobierno espa&amp;ntilde;ol a ser proactivo en el contexto europeo y a legislar de manera clara e inequ&amp;iacute;voca en ese sentido. &lt;/p&gt;
&lt;p&gt;Si te sientes representado por este manifiesto te pedimos encarecidamente que lo copies y lo publiques en tu blog o que lo menciones en tu cuenta de Twitter o en Facebook usando el hashtag #redneutral. &amp;iexcl;Muchas gracias!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=185427" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/delito/default.aspx">delito</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/redneutral/default.aspx">redneutral</category></item></channel></rss>