<?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 : MAC, Apple</title><link>http://geeks.ms/blogs/rfog/archive/tags/MAC/Apple/default.aspx</link><description>Etiquetas: MAC, Apple</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Compilar wxWidgets en mac</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/04/compilar-wxwidgets-en-mac.aspx</link><pubDate>Wed, 04 Jul 2012 11:24:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205970</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205970</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205970</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/04/compilar-wxwidgets-en-mac.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&lt;a href="http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx"&gt;Dec&amp;iacute;a aye&lt;/a&gt;r que &lt;a href="http://www.wxwidgets.org/"&gt;wxWidgets&lt;/a&gt; podr&amp;iacute;a ser una buena herramienta para desarrollar aplicaciones multiplataforma a partir de un &amp;uacute;nico c&amp;oacute;digo fuente, quiz&amp;aacute;s incluso mejor que QT ya que utiliza los controles nativos all&amp;iacute; donde los haya.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets es muy similar a MFC en cuanto a jerarqu&amp;iacute;a de clases y a &amp;ldquo;concepto&amp;rdquo;, y de hecho el paso de una tecnolog&amp;iacute;a a la otra es mucho menos traum&amp;aacute;tico que el paso, por ejemplo a QT. De wxWidgets se han dicho muchas cosas negativas. Que si no soporta excepciones, que si ocupa mucho tama&amp;ntilde;o, que si es muy complicada, y en general que tiene una arquitectura obsoleta.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Personalmente creo que ninguna de esas cosas es cierta, no al menos en el sentido en que se dice. Ciertamente su jerarqu&amp;iacute;a de clases no tiene excepciones, pero nadie impide que las uses en tu c&amp;oacute;digo. Otra ventaja es que su API es gen&amp;eacute;rica para todas las plataformas, y que tiene un mont&amp;oacute;n de clases de soporte que nos evitan la compilaci&amp;oacute;n condicional.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por ejemplo, tenemos soporte directo para impresi&amp;oacute;n, depuraci&amp;oacute;n, bases de datos, modelo documento/vista, arrastrar y soltar, ficheros de configuraci&amp;oacute;n, sincronizaci&amp;oacute;n y threads, protocolos de red, OpenGL y hasta para la creaci&amp;oacute;n de diagramas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte existen varias &lt;a href="http://wiki.wxwidgets.org/Tools"&gt;herramientas de soporte&lt;/a&gt;, algunas de ellas realmente buenas aunque sean de pago. El problema es que s&amp;oacute;lo est&amp;aacute;n disponibles para Windows, y tendremos que tener la cl&amp;aacute;sica soluci&amp;oacute;n de una m&amp;aacute;quina virtual bajo OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica pega para desarrollar bajo MAC es que, hasta hace bien poco, el Framework estaba basado en Carbon (ya sab&amp;eacute;is, el API de C de OS X que ya est&amp;aacute; obsoleto), pero la &amp;uacute;ltima versi&amp;oacute;n, la 2.9.3 soporta compilar sobre Cocoa y 64 bits sin problema alguno.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra pega es que tenemos que compilarla nosotros, ya que s&amp;oacute;lo se distribuye en c&amp;oacute;digo fuente. Para Windows ya lo&lt;a href="http://geeks.ms/blogs/rfog/archive/2007/01/06/wxwidgets-con-visual-studio-2005.aspx"&gt; expliqu&amp;eacute; hace tiempo&lt;/a&gt;. De todos modos no es muy dif&amp;iacute;cil una vez que has atinado con las opciones adecuadas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo primero es bajarnos el tema, de &lt;a href="http://www.wxwidgets.org/downloads/"&gt;aqu&amp;iacute;&lt;/a&gt;. Os recomiendo que elij&amp;aacute;is la opcion de &amp;ldquo;With Unix line endings (for Unix and OS X). Yo lo he descomprimido en mi HOME, a partir de una carpeta que he llamado &amp;ldquo;wxWidgets&amp;rdquo;. Debemos entrar en ella, y una vez ah&amp;iacute;, como en todo proyecto tipo Unix, configuramos la compilaci&amp;oacute;n:&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 36.0px;font:14.0px Courier;"&gt;&lt;span style="font:14.0px Calibri;"&gt;.&lt;/span&gt;/configure --with-cocoa --prefix=$HOME/wx --enable-stl --disable-shared --with-macosx-version-min=10.7 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Una vez hayamos terminado, un simple make seguido de otro make install nos dejar&amp;aacute; el sistema listo y en producci&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Fijaos en las opciones que he elegido. &amp;ldquo;&amp;mdash;With-cocoa&amp;rdquo; hace que se compile con el API de OS X actual, y con la de &amp;ldquo;&amp;mdash;prefix&amp;rdquo; le estamos diciendo que use nuestro HOME para no enmarranar las carpetas del sistema operativo. Esto es muy &amp;uacute;til porque si luego queremos desinstalarlo tendremos problemas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Con &amp;ldquo;&amp;mdash;disable-shared&amp;rdquo; le estamos diciendo que queremos las bibliotecas est&amp;aacute;ticas y no las din&amp;aacute;micas. Si vamos a poner alguna aplicaci&amp;oacute;n en la Tienda, es la mejor opci&amp;oacute;n, ya que nuestro programa ser&amp;aacute; un &amp;uacute;nico ejecutable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y finalmente las dos &amp;uacute;ltimas opciones. Yo he puesto Lion (10.7), pero vosotros pod&amp;eacute;is poner Snow Leopard (10.6). Si os fij&amp;aacute;is, la ruta de los SDK ha cambiado en las &amp;uacute;ltimas versiones de Xcode. Recordadlo para otras ocasiones.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Se me olvidaba comentar que necesitamos instalar las &amp;ldquo;Command Line Tools&amp;rdquo; para poder compilar cualquier cosa desde la consola de comandos. Abrimos Xcode, nos vamos a las Opciones (Command + ;) y las seleccionamos de all&amp;iacute;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205970" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>Multiplataforma de la buena (mismo código fuente)</title><link>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx</link><pubDate>Tue, 03 Jul 2012 18:32:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205955</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205955</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205955</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/07/03/multiplataforma-de-la-buena-mismo-c-243-digo-fuente.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Antes de empezar, y de que me deis ca&amp;ntilde;a de la buena, quiero decir que todo esto son elucubraciones personales m&amp;iacute;as y que lo m&amp;aacute;s seguro nadie est&amp;eacute; de acuerdo conmigo. Dicho esto, vamos al meollo del asunto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ya sab&amp;eacute;is que me he ido distanciando un poco de la plataforma Windows a la vez que me he acercado a la de Apple sin realizar el cambio total. De Linux no quiero hablar, porque cada vez que tengo que hacer algo con &amp;eacute;l, sudo tinta china y al final, tras muchos cabezazos, suelo terminar desistiendo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo fue compilar el SDK de lector del libros electr&amp;oacute;nicos Boox i62HD. Tras instalar una Debian 6 x86 virtual en vmWare Fusion (el Workstation del MAC) por segunda vez, ya que la primera fall&amp;oacute; estrepitosamente porque el instalador s&amp;iacute; que reconoci&amp;oacute; el discos duro SCSI pero luego el kernel instalado no, fui incapaz de compilarlo.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero me encontr&amp;eacute; con una serie de paquetes que no estaban presentes y que el comprobador del SDK no avis&amp;oacute; que faltaban, lo que te obliga a recorrer la cadena de errores para descubrir que te falta esto o aquello.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Lo &amp;uacute;ltimo, y que todav&amp;iacute;a est&amp;aacute; sin solucionar, es que falta una dependencia en un fichero de proyecto, en concreto incluir &amp;ldquo;-l z&amp;rdquo; en el lugar correcto, que es enlazar con la biblioteca zlib. En mi caso el problema no es saber qu&amp;eacute; falta, sino d&amp;oacute;nde a&amp;ntilde;adirlo. Tras varios intentos infructuosos y muchas p&amp;aacute;ginas de internet le&amp;iacute;das, no consegu&amp;iacute; solucionarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Hab&amp;iacute;a un bug similar si instalabas el SDK en un linux x64, pero el m&amp;iacute;o era x86, y el parche existente intentaba modificar ficheros que no existen (al menos en mi instalaci&amp;oacute;n).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pues bien, ni me han hecho ni *** caso ni tampoco lo han solucionado, lo que me lleva a preguntarme c&amp;oacute;mo cojones est&amp;aacute;n programando. Y menos mal que us&amp;eacute; una Debian, que es la misma distribuci&amp;oacute;n que usan los que han creado el SDK, que si llego a instalarme otra cosa&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto es un ejemplo de la desidia reinante en Linux. Lo dije en un foro hace tiempo. Los programadores de linux me parecen muy poco profesionales, tendentes a montar cualquier cosa que les parezca &lt;em&gt;c00l&lt;/em&gt; y luego, cuando viene la hora de la verdad y demostrar que se es un programador con dos cojones, pasan del tema porque eso de solucionar bugs ya no es tan fascinante como lo otro, y encima solventar cualquier cosa son un mont&amp;oacute;n de horas en las que no estamos subiendo nuestra supuesta &lt;em&gt;cach&amp;eacute; c00l&lt;/em&gt; en la comunidad.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de deleznable, me parece una pr&amp;aacute;ctica muy poco seria y que sigue dejando a Linux como lo que es: o bien un juguete para ni&amp;ntilde;os falsamente &lt;em&gt;interesantes&lt;/em&gt;, o bien algo destinado a servidores de bajo coste, y si no contadme c&amp;oacute;mo es el &amp;uacute;nico sistema operativo que ha reventado con el segundo extra a&amp;ntilde;adido hace unos d&amp;iacute;as.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, para mi el desarrollo en Linux queda completamente descartado a corto y largo plazo, por lo menos hasta que se pongan un cohete en el culo, cosa que dudo mucho que ocurra jam&amp;aacute;s (y espero equivocarme).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Luego vino el tema del &lt;em&gt;swtiching&lt;/em&gt;. Lo cierto es que tras el entusiasmo inicial, la cosa deja mucho que desear en cuanto a usabilidad y, s&amp;iacute;, rendimiento. Ya lo he ido comentando por este blog con anterioridad. OS X Lion y Mountain Lion, si los comparamos con XP, son la rehostia, pero comparados con Windows 7 dejan mucho, pero mucho que desear. La usabilidad es p&amp;eacute;sima, aparte de ciertos problemas de ergonom&amp;iacute;a a los que al final uno termina acostumbr&amp;aacute;ndose.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tambi&amp;eacute;n es cierto que cuando le coges el tranquillo ya no hay vuelta atr&amp;aacute;s, m&amp;aacute;s que nada por la integraci&amp;oacute;n de todos los elementos, m&amp;aacute;s todav&amp;iacute;a si tienes un iPad o un iPhone. Puedes conseguir casi lo mismo en Windows, pero no de forma tan integrada ni coherente.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Respecto al rendimiento, dir&amp;eacute; que por fin tengo un MAC que funciona como yo quiero, tras gastarme m&amp;aacute;s de 300 euros en a&amp;ntilde;adirle un segundo disco SSD al iMac de 27&amp;rdquo;. Es decir, en este momento mi m&amp;aacute;quina principal es un iMac de mediados del 2011 con un i7 a 3.4 GHz, un disco SSD de 256GB como disco de sistema para el OS X y uno de 1TB como secundario para datos. En este momento el disco FireWire de 2TB que usaba como secundario lo tengo como copia de Time Machine y, aparte de que arranca en 8 segundos (antes tardaba m&amp;aacute;s de dos minutos y el disco segu&amp;iacute;a rascando hasta casi los diez), s&amp;oacute;lo veo la roseta multicolor de la muerte cuando se para el disco mec&amp;aacute;nico y tiene que arrancar. Adem&amp;aacute;s, la carga de aplicaciones, incluso las pesadas como Pages o Word, es pr&amp;aacute;cticamente instant&amp;aacute;nea.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y justo ahora, mientras escribo esto en Scrivener, tengo abierta una m&amp;aacute;quina virtual en Unity con Windows 7 x86 en la que se est&amp;aacute; instalando el SP1 de Visual Studio 2010 porque he instalado el AtmelStudio, que es un IDE basado en el Microsoft para generar ejecutables para los microprocesadores de Atmel.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Acabo de hacer una pausa para lanzar el JTAG MK-II, conectarlo a Windows y verificar que el AtmelStudio lo reconoce y funciona, todo ello virtualizado. Que es una de las cosas a las que quer&amp;iacute;a llegar. Con un buen producto de virtualizaci&amp;oacute;n, uno puede tener lo mejor de ambos mundos. Un equipo silencioso a m&amp;aacute;s no poder que ejecuta de forma transparente tanto aplicaciones Windows como OS X sin mayor complicaci&amp;oacute;n que molestarse un poco en configurar las cosas, y encima con un rendimiento equivalente a si se ejecutara en real.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Evidentemente tenemos BootCamp, pero os aseguro que Windows no funciona igual que en un PC real, y perdemos todas las cosas buenas que puedes hacer con un MAC.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no es a eso a lo que me refiero. M&amp;aacute;s bien todo esto es una especie de parche o pegote. De lo que realmente quiero hablar es de desarrollar para al menos Windows y MAC sin tener que crear dos programas diferentes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Descartamos de entrada que un mismo ejecutable pueda funcionar en ambas plataformas. Por parte de los dos contendientes queda descartado. Microsoft podr&amp;iacute;a haber hecho .NET para OS X o Apple Cocoa para Windows, pero no creo que eso vaya a ocurrir nunca jam&amp;aacute;s.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La &amp;uacute;nica posible soluci&amp;oacute;n es Mono, pero ignoro sin un EXE de Windows se lanzar&amp;aacute; en un MAC o no, y lo voy a descartar por razonamientos que expondr&amp;eacute; m&amp;aacute;s adelante.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, la otra posible soluci&amp;oacute;n es compatibilidad en el c&amp;oacute;digo fuente. Que yo conozca, s&amp;oacute;lo tenemos dos grandes contendientes: QT y lo que ahora es Embarcadero pero que todos conocemos como Delphi y/o C++Builder.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;De QT he hablado ya por aqu&amp;iacute;, pero no como plataforma cruzada. He estado us&amp;aacute;ndolo un poco, en un proyecto en donde trabajaba, pero s&amp;oacute;lo para generar aplicaciones Windows.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En principio QT es multiplataforma si no te sales del propio Framework, y de hecho he podido compilar un mismo c&amp;oacute;digo fuente en ambas plataformas sin m&amp;aacute;s que compilar o bien desde Windows o bien desde OS X. Hay que tener mucho cuidado y usar el propio Creator de QT, y todos los ficheros servir&amp;aacute;n sin problema. Eso s&amp;iacute;, necesitas dos ordenadores, uno para cada plataforma. Tres si quieres tambi&amp;eacute;n Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esto nos trae a lo que hemos tratado antes. Como no es posible ejecutar OS X desde una m&amp;aacute;quina Windows (no sin violar licencias y sin &lt;em&gt;hacks&lt;/em&gt; y sin limitaciones y fallos aleatorios), la &amp;uacute;nica soluci&amp;oacute;n es tener un MAC m&amp;aacute;s o menos potente y usar un Windows virtualizado, compartiendo la carpeta de desarrollo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso, pese a no estar haciendo nada m&amp;aacute;s que estudiar ahora que estoy en paro y tengo tiempo para &lt;em&gt;jugar&lt;/em&gt; con todo esto, tengo una carpeta en donde est&amp;aacute; todo mi c&amp;oacute;digo fuente, carpeta que est&amp;aacute; compartida con SkyDrive y de ese modo puedo verla tambi&amp;eacute;n en mi ordenador Windows (no el virtualizado), aparte de hacer copia de seguridad de forma autom&amp;aacute;tica.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Ojo con sincronizar mediante SkyDrive entre real y virtual, porque el tema no es instant&amp;aacute;neo y puedes armar un buen jaleo. La soluci&amp;oacute;n es compartir una carpeta de tu MAC en tu Windows virtual. Con Fusion la cosa funciona muy bien, y hasta Embarcadero ha solucionado los problemas que ten&amp;iacute;a para compilar sobre carpetas de red (Microsoft siempre lo ha tenido resuelto, incluso dando la posibilidad de cachear localmente los ficheros intermedios).&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si nos damos cuenta, con QT tenemos que compilar y ejecutar en cada m&amp;aacute;quina, lo que en principio no es un gran problema, pero s&amp;iacute; cuando quieres algo que no est&amp;aacute; en el Framework. Ah&amp;iacute; si que tienes que, mediante compilaci&amp;oacute;n condicional, sacarte tu mismo las casta&amp;ntilde;as del fuego. Dada mi escasa experiencia con QT multiplataforma, no puedo asegurar si es algo muy habitual o no.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro participante es Embarcadero, con su FireMonkey bajo Delphi/C++ Builder. La historia de todo esto es un poco rocambolesca, ya que la empresa ha llevado muchos a&amp;ntilde;os implementando compilaci&amp;oacute;n condicional en su VCL. S&amp;oacute;lo hay que mirar el c&amp;oacute;digo fuente de cualquier versi&amp;oacute;n (creo que desde la 2009) y ver c&amp;oacute;mo muchos ficheros tienen secciones para Windows, MAC y Linux.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Uno, por tanto, se esperaba que cualquier d&amp;iacute;a anunciaran que la VCL se hab&amp;iacute;a convertido en multiplataforma y que se podr&amp;iacute;a compilar para estos tres sistemas operativos.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero no, Embarcadero compr&amp;oacute; un producto a medio hacer y en seis meses lo transform&amp;oacute; en su FireMonkey, que anunci&amp;oacute; a bombo y platillo con su nueva versi&amp;oacute;n de RAD Studio XE2. Que por cierto se encuentra completamente lleno de bugs y no hay entrada de blog explicando esta o aquella caracter&amp;iacute;stica que no hable de que hay un problema y que han tenido de resolverlo de alguna manera. Y es que seis meses es muy poco tiempo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey es una gran idea implementada muy pobremente. La idea es usar el IDE de Delphi o de C++ Builder para, a partir de un mismo c&amp;oacute;digo fuente, generar un ejecutable Windows o MAC, pero siempre desde Windows, por lo que estamos ante el mismo problema que antes.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja aqu&amp;iacute; es que puedes hacerlo todo desde Windows, hasta depurar. Es decir, es necesario instalar un servidor en el lado MAC, servidor que te va a permitir enviar el &lt;em&gt;bundle OS X&lt;/em&gt; al MAC y depurarlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y como todo primer producto, est&amp;aacute; completamente lleno de bugs y da muchos problemas, tanto el IDE como la depuraci&amp;oacute;n remota y el framework en s&amp;iacute;. Embarcadero lleva sacados cinco parches, uno de ellos tan grande que exige reinstalarlo todo, que mejoran algo pero no mucho.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y para m&amp;aacute;s INRI, son aplicaciones de 32 bits, cosa que en los MAC se est&amp;aacute; acabando a pasos agigantados.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Esperemos que el XE3, que saldr&amp;aacute; este verano, mejor algo la cosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Nos falta comentar Mono, el C# multiplataforma y de c&amp;oacute;digo abierto. Ya he hablado algo de &amp;eacute;l &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx"&gt;aqu&amp;iacute;&lt;/a&gt; con anterioridad, pero ahora voy a matizar un poco m&amp;aacute;s. Mono engloba una serie de tecnolog&amp;iacute;as m&amp;aacute;s o menos integradas que comparten un mismo lenguaje de programaci&amp;oacute;n: C#.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Basado en &lt;em&gt;ports&lt;/em&gt;, todo el meollo se centra en un IDE (disponible para ambas plataformas, como el de QT) que permite crear aplicaciones basadas en los ya citados &lt;em&gt;ports&lt;/em&gt;, de los que disonemos de varios seg&amp;uacute;n qu&amp;eacute; plataforma.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por un lado tenemos el de Windows.Forms, que nos permitir&amp;aacute; generar c&amp;oacute;digo compatible con la tecnolog&amp;iacute;a de Microsoft y ejecutar en Windows, MAC y Linux. GTK# es otro de ellos. Tambi&amp;eacute;n est&amp;aacute; MonoMAC, en exclusiva para MAC. Hay m&amp;aacute;s pero nos detenemos aqu&amp;iacute;.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La idea es que cada &lt;em&gt;port&lt;/em&gt; conserva la idiosincrasia de cada &lt;em&gt;origen&lt;/em&gt;. Es decir, el API de GTK# es el GTK pero traducido a C#, y as&amp;iacute; con todos. Es una buena idea y en general, se puede generar c&amp;oacute;digo para Windows y MAC sin problemas mayores que los que tendr&amp;iacute;amos con QT.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Pero ahora viene el t&amp;iacute;o de la rebaja. Hemos visto algunas pegas que tienen todos estos sistemas de desarrollo, pero no son las peores de todas. De todos modos, si desarrollas para MAC necesitar&amp;aacute;s un MAC, y lo mismo para Windows, as&amp;iacute; que llevar a cabo esas tareas en ambas m&amp;aacute;quinas no es todo lo malo que se puede esperar, y de hecho en todos los casos existen soluciones bastante &amp;oacute;ptimas, aunque lo m&amp;aacute;s deseable ser&amp;iacute;a el acercamiento de Embarcadero, con compila en un sitio, ejecuta en dos.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;La mayor pega de todas consiste en que pr&amp;aacute;cticamente ninguno de estos sistemas pinta los controles como nativos. QT podr&amp;iacute;a salvarse por los pelos, pero ni FireMonkey ni Mono, salvo MonoMac, aparecen como aplicaciones nativas. En la documentaci&amp;oacute;n de algunos productos la llaman hasta &amp;ldquo;alien&amp;rdquo;. Ya os pod&amp;eacute;is imaginar. Y si bien en Windows un usuario normal puede aceptar ciertos interfaces ex&amp;oacute;ticos, un fanboy (perd&amp;oacute;n, maquero) de pro seguro que te manda a la mierda con todas sus palabras, y encima con raz&amp;oacute;n.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;El caso de MonoMac no se aplica, ya que no podremos compartir c&amp;oacute;digo fuente con Windows puesto que se trata de un envoltorio sencillo sobre el propio Cocoa con la idiosincrasia de OS X.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Por lo tanto, el &amp;uacute;nico Framework que s&amp;eacute; de forma fehaciente que ha entrado en la App Store de los MAC ha sido QT tras aplicar unos parches para evitar que el propio QT modificara ficheros dentro del &lt;em&gt;bundle&lt;/em&gt;. De todos modos no s&amp;eacute; qu&amp;eacute; pasar&amp;aacute; con el Sandboxing y si QT (y los dem&amp;aacute;s) lo soportan.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente, est&amp;aacute; completamente claro que, a fecha de hoy, desarrollar en multiplataforma de manera coherente continua prohibido, principalmente por limitaciones de los Frameworks existentes que de problemas t&amp;eacute;cnicos, dado que el rendimiento y las herramientas base (como compiladores de plataforma cruzada o lenguajes comunes en diferentes plataformas), est&amp;aacute;n m&amp;aacute;s que maduros.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tan s&amp;oacute;lo habr&amp;iacute;a que crear un Framework que utilizara los controles nativos de cada plataforma, cosa que a fecha de hoy no existe (m&amp;aacute;s sobre esto luego).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;&amp;iquest;Qu&amp;eacute; nos queda, pues? Tan sencillo y tan complejo como dividir nuestra aplicaci&amp;oacute;n en dos partes. La primera, la parte visual, tendremos que hacerla diferente para cada plataforma. Objective-C en MAC, Win32 (MFC, o cualquier otro que pinte nativo), y la parte no visual o el n&amp;uacute;cleo de nuestro programa en alg&amp;uacute;n lenguaje com&amp;uacute;n, como puede ser C++ y STL y mantener al loro todo el tema para que compile y funcione en todos los sistemas de destino&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Es m&amp;aacute;s trabajo, pero creo que es la &amp;uacute;nica forma de mantener un interfaz visual nativo y coherente. El problema viene cuando nuestra aplicaci&amp;oacute;n es demasiado simple de modo que mantener esta estructura es m&amp;aacute;s costoso que crear dos programas de forma independiente.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte, claro est&amp;aacute;, la bajada de rendimiento al tener que desacoplar ambas partes, aunque esto es muy bueno y deber&amp;iacute;a ser una constante en cualquier desarrollo no trivial, aunque estemos haci&amp;eacute;ndolo solo para Windows o s&amp;oacute;lo para MAC. No obstante, a veces la ca&amp;iacute;da de rendimiento es tal, o el programa es tan meramente visual que este acercamiento no es aplicable.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Si os dais cuenta no he entrado en el tema de c&amp;oacute;digo abierto versus c&amp;oacute;digo cerrado, y es que para el programador medio, se la trae floja si tiene el fuente o no de lo que est&amp;eacute; usando: no lo va a mirar porque o bien no tiene tiempo o bien no est&amp;aacute; capacitado.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Tampoco he cubierto el tema Metro de Windows 8, que est&amp;aacute; de lado del tema m&amp;oacute;vil, en el que no he entrado pese a haber tambi&amp;eacute;n Frameworks gen&amp;eacute;ricos. Aqu&amp;iacute; estamos igual, pero ahora las plataformas son Windows Phone, Windows Metro (o RT), Android e iOS, y si las de Windows y MAC son disparejas, no os digo estas. Y, a fecha de hoy, que yo sepa, no hay ning&amp;uacute;n Framework multiplataforma y compatible. FireMonkey promete llegar a Android, Metro y a C++ en pr&amp;oacute;ximas versiones, pero si ya con dos plataformas la cosa est&amp;aacute; como est&amp;aacute;, no quiero saber cuando haya tantas&amp;hellip;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Me falta hablar de un jugador que no he nombrado y que tiene muy buena pinta, quiz&amp;aacute;s la mejor de todas pero, como apenas lo he probado, lo dejo para una futura entrada. Se llama wxWidgets y hace tiempo que habl&amp;eacute; de &amp;eacute;l aqu&amp;iacute;, pero para Windows. Estamos ante un Framework con mucha solera en el mundo del desarrollo y que usan empresas como Google en su producto Google Drive a trav&amp;eacute;s de wxPython.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;Y la mayor ventaja est&amp;aacute; en que, aparte de estar disponible para alguna que otra plataforma embebida, los controles son los nativos de cada sistema operativo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/qt.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;QT en Windows y OS X (Fijaos c&amp;oacute;mo los controles son casi nativos en cada sistema).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;min-height:17.0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/firemonkey.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;FireMonkey en Windows y OS X (Esto no pasa la MAC App Store ni a golpe de talonario. Por no aparecer ni el men&amp;uacute; aparece donde debe).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Helvetica;"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg"&gt;&lt;img src="http://geeks.ms/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/rfog/wx2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Calibri;"&gt;WxWidgets en OS X (Todos los controles son nativos).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205955" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B00_/default.aspx">c++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Biblioteca+de+C_2B002B00_/default.aspx">Biblioteca de C++</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2B002B00_+Builder/default.aspx">C++ Builder</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/QT/default.aspx">QT</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>Un poco hasta los cojones del OS X sí que estoy, la verdad</title><link>http://geeks.ms/blogs/rfog/archive/2012/06/01/un-poco-hasta-los-cojones-del-os-x-s-237-que-estoy-la-verdad.aspx</link><pubDate>Fri, 01 Jun 2012 14:02:55 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205350</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205350</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205350</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/06/01/un-poco-hasta-los-cojones-del-os-x-s-237-que-estoy-la-verdad.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;No sé quién diría eso de &lt;em&gt;en MAC eso no pasa&lt;/em&gt;, pero el hecho es que, a fecha de hoy, OS X Lion no llega ni a la suela de los zapatos de Windows 7. Esperemos que el Montañés mejore algo, porque lo que es la versión actual, es un mucho mierdosa.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Aparte de las infinitas carencias en usabilidad, con un Finder al que hay que meterle diez extensiones o instalarse sustitutos para se que acerquen un poco al Explorador de Windows, los programas más o menos mierdosos que necesitan sustituto (léase Mail, iCal, …), las porquerías del Spotlight que unas veces va lentísimo, otras antepone los propios programas de Apple a otros de terceros aunque los de origen no se hayan usado nunca (y por eso uso Alfred), la necesidad de gastarte una pasta en sustitutos que en la mayor parte suelen ser gratuitos en Windows, las pifias de programas &lt;em&gt;serios&lt;/em&gt; como iPhoto que unas veces sí y otras también es incapaz de recordar que tengo activo el &lt;em&gt;photo streaming&lt;/em&gt;, los petes del Pages porque él lo vale y que me hace rememorar las primeras versiones de Open Office, que cascaban o iban mal sí o sí, los enganches y autismos varios del iTunes, la &lt;em&gt;ruedecilla multicolor de la muette&lt;/em&gt;, que aparece de vez en cuando, sobre todo en Safari, la lentitud en arrancar el sistema completo… &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;… Todo eso, a lo que hay que sumar la &lt;a href="http://geeks.ms/blogs/rfog/archive/2012/05/06/menuda-porquer-237-a-de-gesti-243-n-de-memoria-que-tiene-el-os-x.aspx"&gt;pésima gestión de memoria&lt;/a&gt; y, ahora mismo, dos problemas con el &lt;em&gt;kelmer&lt;/em&gt; o que creo que vienen directamente del mismo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Tengo un monitor secundario enganchado a un puerto Thunderbolt pero usado como DVI con su adaptador correspondiente. Pues bien, cada dos por tres pierde lo que quiera que pierda y ambas pantallas se ponen a parpadear. La anexa porque se ha perdido, y la principal poniendo y quitando el escritorio como si eso fuera a solucionar en algo la otra pantalla.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;El otro problema viene con el puerto de la SD, que sólo me permite insertar una tarjeta por reinicio. Sí, una vez que he insertado una tarjeta, y tras su expulsión, ya no vuelve a leer nada de ella.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En ambos casos no es el hardware, porque en Windows con Boot Camp en ningún momento me ha pasado nada parecido. Es el *** OS X que, tras cada actualización, va peor que la anterior.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y ya para finalizar, ¿quién es lumbrera al que se le ha ocurrido poner el puerto de la SD justo debajo de la ranura del DVD? Porque manda cojones, mucho diseño, mucha tontería pero lo dicho: ergonomía poca o ninguna. Justo hace un momento casi tengo que desmontar mi iMAC (que todavía está en garantía) porque he metido por error la SD en el hueco del DVD…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En fin, que mucho ruido pero pocas nueces.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Perdonadme la entrada, pero creo que tengo razón al quejarme de todas estas cosas y de más que no os cuento porque tengo la duda de si es el &lt;em&gt;layer 8&lt;/em&gt; o el sistema.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205350" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/Sistemas+Operativos/default.aspx">Sistemas Operativos</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item><item><title>MonoTouch: muy bonito pero una guarrería</title><link>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx</link><pubDate>Wed, 30 May 2012 09:17:01 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:205305</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=205305</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=205305</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2012/05/30/monotouch-muy-bonito-pero-una-guarrer-237-a.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ayer estuve jugando un poco con MonoTouch, más que nada por curiosidad. Para los que no lo sepáis, es un IDE más una biblioteca que envuelve de forma conveniente todo el desarrollo para iOS, tanto iPhone como iPad y que permite a un programador de C# desarrollar para estas plataformas sin tener que aprender nada de Objective-C y demás zarandajas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Es un decir, porque realmente no es más que un envoltorio fino a todo eso. Por lo tanto, si estás desarrollando para Windows o Silverlight, no esperes sentarte y ponerte a ello porque aparte de usar la sintaxis de C#, todo lo demás es iOS. Incluso se usa el IDE de xCode para crear los elementos gráficos y su interactuación, como son los &lt;em&gt;outlets&lt;/em&gt; (propiedades) y las &lt;em&gt;actions&lt;/em&gt; (los eventos).&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;La ventaja es que al ser una capa fina apenas introduce sobrecarga y todo es nativo. El inconvenientes es que tienes que aprenderte todas las idiosincrasias del iOS.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y otra cosa que no me creo mucho es el tema de la compartición de código. No esperes tener el mismo código fuente de tu aplicación y compilar para Android, iOS, OS X y Windows. Podrás compartir bloques de código, pero nada más.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Otra cosa es que estas herramientas son de pago. Desde 400$ la más barata hasta viarios miles de dólares. Depende de qué quieras y cómo. Las versiones gratuitas para Android e iOS no caducan pero sólo permiten ejecutar código en el simulador.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Las versiones para escritorio son completamente gratuitas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Se me olvidaba decir &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Ahora bien, como decidas desinstalar algo… arreglado vas. Aparte de que no hay desinstalador, los procesos para hacerlo son completamente insuficientes y te dejan el sistema hecho unos zorros con miles de archivos desperdigados por todo el disco. &lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Versiones anteriores traían un desinstalador embebido dentro del PKG que realizaba la instalación, pero al menos la que yo he instalado no lo trae.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Primero ejecuta los comandos descritos &lt;a href="http://stackoverflow.com/questions/74902/uninstall-mono-from-mac-os-x-v10-5-leopard"&gt;aquí&lt;/a&gt;. Eso te va a limpiar digamos que las partes públicas del entorno. Y si tienes la última versión de xCode instalada, te puedes cargar la carpeta /Developer de un plumazo sin problemas porque sólo tendrás el Mono de los cojones en ella. Pero antes de hacerlo, míralo por si acaso.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Una vez pasado ese script, si te pica la curiosidad, haz una búsqueda global con la palabra “mono”.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;En mi caso he usado CleanMyMac para limpiar el ordenador de basura, pero tu puedes hacerlo a mano o con otra herramienta. Ojo con los ficheros que no son del mono.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Finalmente tenemos que desinstalar MonoDevelop. En mi caso, de nuevo con CleanMyMac.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Y creo, sólo creo, que tengo limpio de nuevo el sistema.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-align:justify;text-indent:18.0px;font:14.0px Calibri;"&gt;Hay que joderse.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205305" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/configuraci_26002300_243_3B00_n/default.aspx">configuraci&amp;#243;n</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Interoperabilidad/default.aspx">Interoperabilidad</category></item><item><title>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>Win/MAC: arranque dual y jodimiento de particiones</title><link>http://geeks.ms/blogs/rfog/archive/2011/11/19/win-mac-arranque-dual-y-jodimiento-de-particiones.aspx</link><pubDate>Sat, 19 Nov 2011 12:14:42 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:201768</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=201768</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=201768</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/11/19/win-mac-arranque-dual-y-jodimiento-de-particiones.aspx#comments</comments><description>&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Os lo juro. Estoy hasta los putísimos cojones de Windows, de MAC y de la madre que los parió a todos. El primero por pensarse que todo le pertenece, incluyendo las particiones  HFS+, y el segundo por pensar que todos los usuarios son tontos del culo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;No tengo muchas ganas de escribir, así que voy a ser bastante escueto.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Escenario: Windows/MAC con Boot Camp y arranque dual. Como Windows asigna las unidades como le sale de los cojones, entro en el Administrador de Discos y las cambio a los valores que quiero.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;"&gt;Vale, todo bien en Windows. Inicio OS X y… una de las tres particiones no se carga. Es decir, habiendo cambiado la letra de unidad a &lt;strong&gt;dos&lt;/strong&gt; particiones HFS+ desde Windows, &lt;strong&gt;una&lt;/strong&gt; de ellas luego no se carga desde OS X porque Windows, en su maravilloso afán de poseerlo todo, ha decidido cambiar cierta cadena de las tablas internas del disco por “&lt;span style="color:#29303b;"&gt;Microsoft Basic Data”. Hay que joderse con tomate. ¿No saben reconocer una partición ajena y no tocar nada? Pues parece ser que no, que tienen ganas de joder la marrana.&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Bueno, la Utilidad de Discos de OS X se ve incapaz de recuperar la partición. Hala, nueva pérdida de datos. Cuatro máquinas virtuales y un montón de descargas.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Pues no, hay solución. Está &lt;a href="http://steelpangolin.wordpress.com/2009/03/15/invalid-bs_jmpboot-in-boot-block-000000/"&gt;aquí&lt;/a&gt;. Otro &lt;em&gt;geek&lt;/em&gt; de la más alta alcurnia se ha encontrado con el mismo problema y ha creado una aplicación en Python para solucionar el problema. Lo único que hace es cambiar dicha cadena por su valor por defecto. Y entonces OS X reconoce la partición como suya y la monta.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Olé sus cojones.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Os cuento cómo hacerlo.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;***&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Desmonta el disco completo en donde esté la partición afectada. Luego graba el fichero &lt;a href="http://bat-country.us/code/GPTools/trunk/gpt_surgeon.py?view=markup"&gt;&lt;em&gt;gpt_surgeon.py&lt;/em&gt;&lt;/a&gt; en disco (ojo con grabar el html y no el contenido del mismo). Aquí viene cuando Apple piensa que somos imbéciles o así. Tu grabas un archivo, que te lo pone como texto de lectura escritura. Pero tu lo quieres de ejecución, porque si no ya puedes darle de sopapos porque se negará a correr.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Hay que añadir el bit de ejecución. ¿Cómo? Ahí está el problema. Desde la interfaz gráfica no se puede, porque CMD-I sólo te dejar cambiar entre lectura y escritura, pero no ejecución.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Quizás haya algún botón por algún lado para activarlo, pero no lo he encontrado, así que tienes que abrir una ventana de terminal y cambiarlo &lt;em&gt;ala &lt;/em&gt;UNIX: &lt;strong&gt;“chmod u+x gpt_surgeon.py”&lt;/strong&gt;. Claro, puede que algún imbécil siga la secuencia desde el Finder y sea capaz de cambiarle los permisos a un troyano. En fin, viva la ergonomía y usabilidad maqueras.&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Luego sigues la secuencia explicada en el enlace de arriba:&lt;/p&gt;
&lt;ul style="list-style-type:disc;"&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;./gpt_surgeon.py list /dev/disk&amp;lt;n&amp;gt;, en donde &amp;lt;n&amp;gt; es el disco &lt;em&gt;malo&lt;/em&gt;.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;Localiza la partición jodida, en la que debe aparecer el infame texto de “Microsoft Basic Data”.&lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;sudo ./gpt_surgeon.py repair /dev/disk&amp;lt;n&amp;gt; &amp;lt;y&amp;gt;, en donde &amp;lt;y&amp;gt; es la partición rota. &lt;/li&gt;
&lt;li style="margin:0.0px 0.0px 0.0px 0.0px;font:14.0px Cochin;color:#29303b;"&gt;Al poco, OS X (o el script) montará todas las unidades, habiendo reparado la estropeada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;text-indent:18.0px;font:14.0px Cochin;color:#29303b;"&gt;Y ya está, esta ha sido la crónica del día de hoy. Cagontó…&lt;/p&gt;
&lt;p style="margin:0.0px 0.0px 0.0px 0.0px;font:12.0px Cochin;color:#29303b;min-height:14.0px;"&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=201768" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/windows/default.aspx">windows</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/chapuzas/default.aspx">chapuzas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/bugs/default.aspx">bugs</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/tips/default.aspx">tips</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>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>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>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>iPad/iPod/i&lt;Cosa&gt; vs. E-ink y otras petisoperías</title><link>http://geeks.ms/blogs/rfog/archive/2011/03/12/ipad-ipod-i-lt-cosa-gt-vs-e-ink-y-otras-petisoper-237-as.aspx</link><pubDate>Sat, 12 Mar 2011 16:26:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:190280</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=190280</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=190280</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2011/03/12/ipad-ipod-i-lt-cosa-gt-vs-e-ink-y-otras-petisoper-237-as.aspx#comments</comments><description>&lt;p&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;[Esta entrada tambi&amp;eacute;n se ha publicado &lt;a href="http://kindleman.blogspot.com/2011/03/ipadipodi-vs-e-ink-y-otras-petisoperias.html"&gt;aqu&amp;iacute;&lt;/a&gt;]&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Llevo como una semana leyendo exclusivamente
con el iPad y mi nuevo iPod Touch de cuarta generaci&amp;oacute;n, que para quien no lo
sepa tiene una resoluci&amp;oacute;n casi id&amp;eacute;ntica a la del iPad pero en una pantalla
mucho m&amp;aacute;s peque&amp;ntilde;a, por lo que si tienes buena vista la calidad de lectura es
acojonante. Y no, no me molesta el brillo de la pantalla, y si con treinta a&amp;ntilde;os
pegado diez horas al d&amp;iacute;a a una no me he quedado ciego, no creo que me quede en
otros treinta, no al menos por culpa de ellas.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pese a las cr&amp;iacute;ticas a las plataformas de Apple,
y su evidente limitaci&amp;oacute;n en algunos dispositivos, cada vez estoy m&amp;aacute;s convencido
de su utilidad, por encima de Windows. Vamos, que me estoy convirtiendo en un &lt;i&gt;switcher&lt;/i&gt; de pro y al completo, pues le
estoy dando un tiento al Xcode 4 y me he bajado (y estoy leyendo &amp;ndash;que es
diferente a bajarse-) un mont&amp;oacute;n de documentaci&amp;oacute;n sobre programar en OS X. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;A lo largo de mi historia de amor/odio con
Apple, he ido rode&amp;aacute;ndome, sin quererlo, de muchos de sus dispositivos.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Primero fue un iPod de segunda generaci&amp;oacute;n, que
ahora duerme el sue&amp;ntilde;o de los justos pues lo tengo de mero despertador pero que
en su momento me acompa&amp;ntilde;&amp;oacute; en muchos viajes y cuitas.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Unos meses despu&amp;eacute;s vino un iMac (2008) como
quien no quiere la cosa, o m&amp;aacute;s bien como capricho. Ya llevaba un tiempo
ech&amp;aacute;ndole los ojos a un port&amp;aacute;til de Apple, pero los precios me echaban para
atr&amp;aacute;s. Sin embargo, un d&amp;iacute;a en el Mediamarkt mi hermana me dio el empuj&amp;oacute;n que me
faltaba y me volv&amp;iacute; con un flamante Core2Duo de 24&amp;rdquo;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Tras la emoci&amp;oacute;n inicial tambi&amp;eacute;n qued&amp;oacute; criando
malvas, m&amp;aacute;s por no entender el OS X que por otra cosa, ya que es un aparato
silencioso y que cumple como un jabato. De hecho se qued&amp;oacute; como plataforma para
actualizar el iPod y luego el iPad.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Porque el iTunes en Windows es una mierda. Se
atasca y atasca el sistema (incluso en mi i7 con 8 n&amp;uacute;cleos) sin subir ninguna
CPU a un porcentaje de uso remarcable. Es como si el driver USB fuera una
casta&amp;ntilde;a pilonga. En alg&amp;uacute;n momento tuve las bibliotecas compartidas entre mi
anterior PC (un QuadCore) y el iMac gracias a alg&amp;uacute;n que otro truco, pero ya no.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;M&amp;aacute;s tarde vino el iPad. &amp;iexcl;Ay el iPad! Ese
elemento denostado por todos pero que ha tenido un &amp;eacute;xito inmenso, m&amp;aacute;s all&amp;aacute; de
cualquier expectativa&amp;hellip; Y es que, pese a las bocas llenas de &lt;i&gt;despectiveces&lt;/i&gt; de los expertos, ese tipo
de &lt;i&gt;tabletos&lt;/i&gt; (expresi&amp;oacute;n copiada de &lt;a href="http://www.tinta-e.blogspot.com/"&gt;Juan Luis Chulilla&lt;/a&gt;) era algo
esperado con ansia.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No voy a entrar aqu&amp;iacute; en que si no es un PC,
que no lo es, o la era post-PC del haba de Steve. Es lo que es. Un aparato para
estar tumbado en el sof&amp;aacute; y ver una pel&amp;iacute;cula, o leer, o revisar el correo. Y
quien niegue la utilidad de eso est&amp;aacute; m&amp;aacute;s ciego que un topo. Por lo menos para
los &lt;i&gt;singles&lt;/i&gt; como yo que se pasan el
d&amp;iacute;a a solas&amp;hellip; y hay unos cuantos &lt;i&gt;singles&lt;/i&gt;
por el mundo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Bueno, como os dec&amp;iacute;a, vino el iPad. El mismo
d&amp;iacute;a que sali&amp;oacute; en USA lo compr&amp;eacute; a un revendedor americano, por lo que el lunes o
el martes siguiente lo tuve aqu&amp;iacute; y pude, por fin, pasar m&amp;aacute;s tiempo en el sof&amp;aacute;
que delante del ordenador. S&amp;iacute;, yo soy ese tipo de gandul que es capaz de hacer
los trabajos de H&amp;eacute;rcules si luego va a estar tranquilo toc&amp;aacute;ndose las bolas.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Se me olvida decir que antes de esto vino un
Time Capsule como disco de copia de seguridad para el Time Machine, Windows y
como router. Lo cierto es que como disco de seguridad para Windows no sirve
porque la mitad de las veces se desconectaba solo, y&lt;span&gt;&amp;nbsp; &lt;/span&gt;Windows 7 termin&amp;oacute; de rematarlo. Pero como
router es insuperable, y cuando viene alguna visita que quiere WiFi le activo
la de invitados y me ahorro de compartir claves y dem&amp;aacute;s zarandajas. Y es un
equipo robusto. El cable modem ha sido cambiado dos veces, mientras que el TC
ah&amp;iacute; sigue, haciendo de Time Machine para mi Snow Leopad.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No me cansar&amp;eacute; de repetirlo: el iPad es la
rehostia. Y no, no me voy a comprar el iPad 2. Porque la inclusi&amp;oacute;n de las
c&amp;aacute;maras me la trae floja, y el que pueda ir hasta nueve veces m&amp;aacute;s r&amp;aacute;pido
tambi&amp;eacute;n. No soy un &lt;i&gt;gamer&lt;/i&gt;. Soy un &lt;i&gt;reader&lt;/i&gt;. Lo actualizar&amp;eacute; cuando le pongan
una pantalla m&amp;aacute;s grande o con m&amp;aacute;s resoluci&amp;oacute;n. O se rompa el que tengo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Durante el d&amp;iacute;a, en el trabajo, voy revisando
las RSS en los tiempos muertos y las entradas que me interesan las env&amp;iacute;o al
Instapaper. Por tiempo no siempre puedo hacerlo, pero es lo habitual.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Cuando llego a casa y hago las tareas comunes
(revisar el correo y las news en el PC MAC, cenar, ducharme, ponerme
c&amp;oacute;modo), me tumbo en el &lt;i&gt;sof&amp;aacute;&lt;/i&gt; (en
cursiva porque es una cama de esas con motor que puede adoptar la postura que
quieras) con mi iPad a mano. Leo las RSS que me han quedado y las que me
interesan las voy pasando al &lt;a href="http://www.instapaper.com/"&gt;Instapaper&lt;/a&gt;
desde el propio programa. Para mis sindicaciones principales uso &lt;a href="http://itunes.apple.com/es/app/mobilerss-hd-google-rss-news/id375300540?mt=8"&gt;MobileRSS&lt;/a&gt;,
y para las secundarias (libros gratis, libros &lt;i&gt;gratis&lt;/i&gt;, y alg&amp;uacute;n que otro relacionado) &lt;a href="http://www.omz-software.de/newsstand/"&gt;NewsRack&lt;/a&gt; (tengo dos cuentas de
Google).&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Luego le toca el turno a &lt;a href="http://flipboard.com/"&gt;Fipboard&lt;/a&gt; y a &lt;a href="http://www.zite.com/"&gt;Zite&lt;/a&gt;.
Este &amp;uacute;ltimo es un reciente descubrimiento y todav&amp;iacute;a me estoy haciendo a &amp;eacute;l (y
&amp;eacute;l a mi). Digamos que utiliza una serie de algoritmos basados en tu cuenta de
Twitter y de Google Reader para ofrecerte noticias relacionadas a tus
intereses. Y se va auto configurando seg&amp;uacute;n lo que hagas, lo que leas y cu&amp;aacute;nto
tiempo le dediques a cada tarea. S&amp;iacute;, ya s&amp;eacute;, todo termina en unos servidores que
a saber qu&amp;eacute; van a hacer con la informaci&amp;oacute;n que capturen. Hablando en plata me
la trae m&amp;aacute;s que floja que sepan que mis intereses sean C++ o los piticos de
boina&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Tras eso cargo el &lt;a href="http://www.instapaper.com/iphone"&gt;Instapaper&lt;/a&gt; y me recreo en la
lectura de todo lo que me he ido pasando. A veces reenvi&amp;oacute; por correo o saco a
Facebook o Twitter algo. Eso me ocupa sobre una hora u hora y media, dependiendo
de las novedades que haya. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;El siguiente paso consiste en o bien cerrar el
iPad y abrir un libro-e o libro-p o bien seguir con el iPad, que es lo que
estoy haciendo &amp;uacute;ltimamente. Y luego a mimir, a veces incluso en el mismo sof&amp;aacute;
si hace fr&amp;iacute;o, tengo la chimenea encendida, y estoy perraco para cambiar de
cuarto&amp;hellip; En verano no s&amp;eacute; c&amp;oacute;mo ser&amp;aacute; mi rutina, porque el anterior mi casa estaba
de otra forma y la habitaci&amp;oacute;n que ahora es mi cuarto de estar era la de
trabajo&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;S&amp;iacute;, la tele la tengo de adorno, en otro
cuarto, y que siga as&amp;iacute; por muchos a&amp;ntilde;os.&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 metamos el PC en medio. Es decir, cuando
llego a casa lo enciendo y encendido se queda hasta m&amp;aacute;s o menos cuando me voy a
dormir. A ratos me levanto y miro las news o miro algo que no puedo hacer en el
iPad. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Algunos d&amp;iacute;as, cuando estoy de humor y la
jornada de trabajo no ha sido muy opresiva, programo en casa mis cosas tras la
sesi&amp;oacute;n con el iPad (o antes). S&amp;iacute;, tengo proyectos personales a medio hacer,
algunos de ellos interesantes.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y es aqu&amp;iacute; d&amp;oacute;nde viene la crisis del PC&amp;hellip; y
personal. Entre septiembre y noviembre de 2010 mi situaci&amp;oacute;n laboral cambi&amp;oacute;
dr&amp;aacute;sticamente. B&amp;aacute;sicamente fui miserablemente enga&amp;ntilde;ado por mi jefe, aunque &amp;eacute;l
diga que no. Yo curraba en casa. La central en Madrid cerr&amp;oacute; por temas que no
tienen que ver con la crisis y de los que ni puedo ni quiero hablar, y fue
trasladada a una ciudad a media hora de coche de d&amp;oacute;nde vivo. O al pueblo en
donde vive mi jefe.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Yo traslad&amp;eacute; mis cosas all&amp;iacute; temporalmente para
terminar un proyecto que corr&amp;iacute;a prisa. &amp;iexcl;Qu&amp;eacute; inocente que fui! Pasaron dos meses
y segu&amp;iacute;a all&amp;iacute;. Al final todo explot&amp;oacute;. Tuve una gord&amp;iacute;sima con mi jefe y todo
qued&amp;oacute; claro: no s&amp;oacute;lo fui enga&amp;ntilde;ado para cambiar mi forma de trabajar, sino que
luego encima se regode&amp;oacute; dici&amp;eacute;ndome que ya no pod&amp;iacute;a protestar, que legalmente
ten&amp;iacute;a un mes y ya hab&amp;iacute;an pasado dos. Las promesas de ir s&amp;oacute;lo uno o dos d&amp;iacute;as a
la semana se las llevaron el viento. Minti&amp;oacute; como un cosaco.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero no s&amp;oacute;lo fue eso. En el proceso se
perdieron 1000 euros que se me deb&amp;iacute;an de unos extras realizados un tiempo antes
y no se me pagaron y &amp;ldquo;hazte cuenta de que eso no lo vas a ver nunca&amp;rdquo;. Y tambi&amp;eacute;n
perd&amp;iacute; mi PC. Mi versi&amp;oacute;n es que cuando yo empec&amp;eacute; a trabajar en mi casa hab&amp;iacute;a un
PC de nivel medio/alto que era m&amp;iacute;o. Cuando dej&amp;eacute; de currar en mi casa no qued&amp;oacute;
ninguno. Seg&amp;uacute;n mi jefe, el PC lo hab&amp;iacute;a pagado &amp;eacute;l. En cierta medida as&amp;iacute; era,
puesto que del original no quedaba ya ninguna pieza, todas ellas rotas u
obsoletas en el desarrollo de mi labor profesional. El hecho &lt;i&gt;de facto&lt;/i&gt; es que al empezar yo ten&amp;iacute;a un
PC y al terminar no ten&amp;iacute;a ninguno. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Depresi&amp;oacute;n al canto, ideas muy malas de
llevarlo a los tribunales con todo y a por todas. Sondeo de familiares y
conocidos para el tema. Todos me daban la raz&amp;oacute;n y afirmaban las palabras y
promesas que hab&amp;iacute;an o&amp;iacute;do de mi jefe, pero nadie se comprometi&amp;oacute; a decirlas ante
un juez (y d&amp;aacute;ndoles gracias por avisarme antes y no hacerlo en el momento
crucial). Su palabra contra la m&amp;iacute;a. Y mejores abogados, como lleg&amp;oacute; a decirme.
Hubo unos d&amp;iacute;as en los que la baja por depresi&amp;oacute;n se torn&amp;oacute; una salida demasiado tentadora,
una baja larga y demoledora par &amp;eacute;l&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Lo curioso y lo que m&amp;aacute;s me jode es que encima
&amp;eacute;l queda como el bueno de la pel&amp;iacute;cula. Como Steve Jobs, su distorsi&amp;oacute;n de la
realidad es legendaria entre sus conocidos y familia (por desgracia yo mismo).
Seg&amp;uacute;n &amp;eacute;l me dio posibilidad de tra&amp;eacute;rmelo y usar la morralla que hab&amp;iacute;a en la
empresa, pero claramente las facturas de muchas cosas estaban a nombre de la
empresa. Es preferible perder un ordenador que luego ser acusado de robar
material de la empresa. Aun as&amp;iacute; me traje todo lo que ten&amp;iacute;a una factura a mi
nombre&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero no, hab&amp;iacute;a de por medio otras razones para
seguir de las que no debo hablar&amp;hellip; as&amp;iacute; que decid&amp;iacute; tragar y seguir. Horario a
rajatabla. Cero concesiones. Pasar de &amp;eacute;l. Todav&amp;iacute;a tengo cartas en el bolsillo
para jugar, pero las cosas se est&amp;aacute;n volviendo &amp;ldquo;amigables&amp;rdquo; de nuevo. De nuevo
vueltas a casa a las diez de la noche (antes no eran &amp;ldquo;vueltas a casa&amp;rdquo; pero eran
&amp;ldquo;retiradas de currar&amp;rdquo;)&amp;hellip; Pero no, no lo voy a consentir.&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;Bueno, centr&amp;aacute;ndonos en el tema, yo estaba en
casa, depresivo y sin ordenador. No, sin ordenador no. Ten&amp;iacute;a mi fiel iMAC, ya
algo obsoleto y con un rendimiento no muy bueno al menos comparado con el PC&amp;hellip;
As&amp;iacute; que volv&amp;iacute; a usarlo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero comet&amp;iacute; un error. Instal&amp;eacute; el vmWare Fusion
y le met&amp;iacute; todo lo que ten&amp;iacute;a en una m&amp;aacute;quina virtual con Windows 7. Imaginaros un
iMAC con 4GB de RAM corriendo una VM con 2GB asignados&amp;hellip; Lento. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Por mi cabeza pas&amp;oacute; un Mac Pro de 12 cores con
mucha RAM. Pero el precio se iba &amp;ndash;mucho- de madre. Adem&amp;aacute;s, no es oro todo lo
que reluce, el rendimiento en determinadas circunstancias no era el esperado en
semejante bestia. As&amp;iacute; que del de 12 cores baj&amp;eacute; al de 4&amp;hellip; y me dije que por ese
precio ten&amp;iacute;a un PC el doble de potente, as&amp;iacute; que eso hice.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Un i7 de 4 n&amp;uacute;cleos HT que son 8, 16GB de RAM,
4 discos SSD y uno SATA II en una s&amp;uacute;per placa Gigabyte con m&amp;aacute;s chipsets que
operaciones cosm&amp;eacute;ticas llevan algunas, adem&amp;aacute;s de una ATI 6850. Y un monitor de
24&amp;rdquo; a 1920 x 1200 (en lugar de los ahora 1080 habituales) para complementar el
que hab&amp;iacute;a podido rescatar del ordenador que era m&amp;iacute;o pero no era m&amp;iacute;o. Una bestia
parda, vamos. El iMAC de nuevo a la otra mesa, como actualizador del iPad e
iPod&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Pero la
procesi&amp;oacute;n iba por dentro. Como un runr&amp;uacute;n. Cada vez que cog&amp;iacute;a un libro para
ponerme a estudiar como antes me ven&amp;iacute;an a las mientes que eso iba a servir para
mejorar mi curro&amp;hellip; y lo dejaba. Si abr&amp;iacute;a el Visual Studio lo mismo. Empec&amp;eacute; a
usar C++ Builder, que no uso en el curro, pero daba igual.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No quiero. No quiero mejorar para mi jefe. Lo
siento. Las tres horas al d&amp;iacute;a menos de tiempo libre que tengo las tiene que
pagar de alguna manera. S&amp;iacute;, ya s&amp;eacute;, pensar&amp;eacute;is que no estaba mejor&amp;aacute;ndome para mi
jefe sino para mi. Pues s&amp;iacute; y no, pero no es una cosa de querer, es una cosa de
poder. A fecha de hoy no puedo estudiar si lo que estudie sirve para lo dicho.
Est&amp;aacute; en mi y en mi esp&amp;iacute;ritu. Punto.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Por lo tanto estoy en crisis. Crisis profunda.
No puedo hacer c&amp;oacute;digo en casa. Ni siquiera puedo leer un tema t&amp;eacute;cnico sobre
desarrollo sin que me de asco. S&amp;iacute;, ya s&amp;eacute;. La depresi&amp;oacute;n&amp;hellip; O simplemente largarme.
Tengo para vivir una muy larga temporada sin trabajar. Pero no, esa es la
soluci&amp;oacute;n f&amp;aacute;cil. Es el camino que no debo tomar. O al menos no ahora. Como dice
el refr&amp;aacute;n, a todo cerdo le llega su San Mart&amp;iacute;n. Veremos.&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 seguimos con el runr&amp;uacute;n. Tambi&amp;eacute;n me comentaron
en alg&amp;uacute;n foro que para qu&amp;eacute; cojones quer&amp;iacute;a un MAC si lo iba a usar como un
Windows. As&amp;iacute; que fui a por un PC de gama alta. Y me lo compr&amp;eacute;. Estamos ya en
diciembre, han pasado tres meses desde el &lt;i&gt;desastre&lt;/i&gt;.
Gracias, Noelia, a ti tambi&amp;eacute;n te las tengo que dar. Por ser como eres.
Simplemente por eso.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero la realidad estaba en que quer&amp;iacute;a usar el
MAC como un Windows, o meti&amp;eacute;ndole un Windows dentro, o como quer&amp;aacute;is verlo. &amp;iquest;Y
por qu&amp;eacute; no usar un MAC como&amp;hellip; un MAC? Aceptar sus ventajas e inconvenientes y
tirar hacia delante&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Joder, a veces uno es tonto y se le escapa lo
evidente&amp;hellip;&lt;span&gt;&amp;nbsp; &lt;/span&gt;Pero todav&amp;iacute;a no estaba
convencido del todo. Yo soy un windowsero rabioso, un fanboy de Windows&amp;hellip; Y vino
el le&amp;oacute;n. Y Xcode 4.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Ha habido un par de semanas en la que un d&amp;iacute;a
he tenido el PC y al otro el MAC. Y vuelta a cambiar de nuevo. Eso de perder 20
a&amp;ntilde;os de experiencia a mis 40 suena un poco fuerte&amp;hellip; Indecisi&amp;oacute;n. Culo inquieto. Y
eso que el rendimiento de mi iMAC en real es bastante decente.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Hala, de nuevo a confesarme. No, claro que no
es perder 20 a&amp;ntilde;os de experiencia, ni mucho menos. Es como cierta l&amp;aacute;stima a
abandonar, a tomar un camino nuevo y diferente. Perder el MVP. No es que lo
vaya a perder de la noche a la ma&amp;ntilde;ana ni mucho menos. Todav&amp;iacute;a respondo en los
foros, pero si os dais cuenta desde la crisis no he publicado apenas nada en mi
blog de desarrollo. Y tengo temas para hacerlo, pero me faltan las ganas, sobre
todo cuando te das cuenta de que encima eres un MVP inc&amp;oacute;modo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Yo no escribo en el blog ni respondo en los
foros para ser MVP. S&amp;oacute;lo faltar&amp;iacute;a eso. Escribo y respondo porque me apetece y
punto. Pero ahora ya no me apetece, o apenas lo hace. Se suma mi crisis, la
incomodidad que genero, el hecho de que MS est&amp;eacute; perdiendo puntos a pasos
agigantados. Nada es decisivo, pero afecta. Bueno, las ganas y mi crisis s&amp;iacute; que
son decisivas, pero siempre se puede hacer un esfuerzo. Pero no, simplemente no
me apetece.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y es que, tambi&amp;eacute;n, el proyecto MVP est&amp;aacute;
muerto. Microsoft lo ha matado lentamente. &amp;iquest;C&amp;oacute;mo pueden estar tan ciegos? &amp;iquest;C&amp;oacute;mo
cojones pueden llevar 10 a&amp;ntilde;os con un sistema de ayuda para Visual Studio que
simplemente no funciona (por poner un ejemplo evidente)? &amp;iquest;Es que no ven lo
evidente?&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;As&amp;iacute; que se me quitan las ganas cuando encima
tengo pocas. La opci&amp;oacute;n f&amp;aacute;cil es mandarlo todo a tomar por culo. Sin m&amp;aacute;s&amp;hellip; Pero
no, de nuevo esa es la salida f&amp;aacute;cil. No hablo del MVP, al final eso me da
igual. Si he perdido el inter&amp;eacute;s la culpa es de Microsoft. Simplemente que se
jodan. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Hablo de mandarlo TODO a tomar por culo. Es
una opci&amp;oacute;n. No la mejor pero una de ellas.&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;Hay otras. La cacharrer&amp;iacute;a de Apple me mola. El
Magic Mouse es&amp;hellip; m&amp;aacute;gico. El Trackpad ya ni os digo. El teclado extendido en el
centro. A la izquierda la tableta. A la derecha el rat&amp;oacute;n. Enfrente hacia la
derecha el iMAC, a su izquierda el monitor secundario. Mola. &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Detr&amp;aacute;s del iMAC, un Book Studio Edition II for
MAC de 2TB en RAID 0, recientemente adquirido, conectado al iMAC por FireWire
800. Conectado al PC por eSata va m&amp;aacute;s r&amp;aacute;pido, pero yo lo quiero en mi MAC.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;El iTunes no hace cosas raras cuando actualiza
mi iPad o mi iPod. El iMac no hace ruido alguno. Se suspende solo (bueno, el PC
tambi&amp;eacute;n, pero el iMAC lo hace con m&amp;aacute;s estilo. :-P). Y la pantalla es
acojonantemente buena. El monitor secundario tampoco est&amp;aacute; mal, es un BENQ que
tiene entradas para todo y en su momento cost&amp;oacute; casi lo que se me debe...&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Alfred, Snap. CleanMyMac, BetterZip, VideoLAN,
Transmission, Speed Download 5, Calibre. Mola. El Fusion para abrir una m&amp;aacute;quina
virtual Windows de tarde en tarde. Ahora ya no cometo el error de usar Windows
virtualizado. Si me hace falta algo que requiera rendimiento enciendo el PC y
lo controlo por escritorio remoto. El sempiterno Office (Versi&amp;oacute;n 2011), a la espera
de que salga Pages 11&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No me hace falta nada m&amp;aacute;s.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Bueno, s&amp;iacute;, un iMAC algo m&amp;aacute;s r&amp;aacute;pido y con m&amp;aacute;s
RAM, pero con el a&amp;ntilde;adido del Book Studio de momento me sobra. Esperemos a la
pr&amp;oacute;xima actualizaci&amp;oacute;n de los iMAC (los expertos dicen que para junio o julio),
aunque un i7 con 8GB de los actuales tampoco estar&amp;iacute;a mal. 27&amp;rdquo; de monitor. Qu&amp;eacute;
gozada.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Vendo mi PC reci&amp;eacute;n comprado. Y mi Touchsmart
TM2 con algo m&amp;aacute;s de un a&amp;ntilde;o.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Xcode 4, en este momento compilando QT 4.7.2,
aunque no creo que lo use. Un mont&amp;oacute;n de PDF para leer en el iPAD en relaci&amp;oacute;n a
Cocoa, Xcode y desarrollo MAC. Mola. Mola mazo. &lt;/span&gt;&lt;span lang="ES"&gt;&lt;span&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;El iPad no tiene sistema de ficheros, pero me
la trae al pairo. Mi mayor preocupaci&amp;oacute;n a la hora de leer un PDF es si hacerlo
en el GoodReader o en el iAnnotatePDF. Mi mayor preocupaci&amp;oacute;n a la hora de leer
un EPUB o un MOBI es si hacerlo en el iPod o en el iPad, y luego en qu&amp;eacute;
aplicaci&amp;oacute;n (tengo para elegir. Las que m&amp;aacute;s me gustan son el iBooks, el Kindle
for iPad/iPhone, el Stanza o el i2reader). &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Si quiero meter un fichero al iPAD, lo enchufo
al MAC, lo paso a la aplicaci&amp;oacute;n correspondiente y a otra cosa mariposa. S&amp;iacute;, ya
s&amp;eacute;, se puede hacer igual desde Windows. Pero solo cuando el iTunes quiere (no
entro si es a prop&amp;oacute;sito o no). Las copias de seguridad del i&amp;lt;Cosa&amp;gt; me
tardan un mont&amp;oacute;n en Windows. En MAC son rapid&amp;iacute;simas.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No hay multitarea real. No me hace falta. El
GoodReader habla con las otras aplicaciones compatibles. Y el MobileRSS, y el
NewsRack, y el Instapaper. Y el Dropbox.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Mola.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Mola mazo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y tengo un nuevo reto: aprender a programar en
MAC. Y eso a mi jefe no le sirve para nada. Lo mismo hasta vendo alguna
aplicaci&amp;oacute;n en la tienda&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Mola.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Mola mazo.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;&lt;span&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES"&gt;&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=190280" 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/libros/default.aspx">libros</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Kindle/default.aspx">Kindle</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>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>Las pifias de OS X (y de Office 2011)</title><link>http://geeks.ms/blogs/rfog/archive/2010/11/13/las-pifias-de-os-x-y-de-office-2011.aspx</link><pubDate>Sat, 13 Nov 2010 20:47:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:184762</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=184762</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=184762</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/11/13/las-pifias-de-os-x-y-de-office-2011.aspx#comments</comments><description>&lt;p&gt;Dado que el RFOG está últimamente bastante MACoso, y que criticar a los demás le levanta algo el ánimo, os va a contar hoy algunas aventuras con su iMAC, y como no sería justo criticar a unos y no a otros, ha decidido escribir un potpurrí de anécdotas y de paso explicaros cómo medio subsanar algunas de las carencias de OS X, que ciertamente algunas tiene, sobre todo comparándolo con Windows 7.&lt;/p&gt;  &lt;p&gt;Para empezar os diré que, pese a gustarme mucho OS X, le veo ciertas &lt;i&gt;durezas&lt;/i&gt; y rugosidades, y es que prefiero funcional a bonito. Será que soy diferente, pero si funciona, me da igual que sea feo, sobre todo si es bonito y no lo hace bien.&lt;/p&gt;  &lt;p&gt;Y es el caso del Finder. Es completamente increíble que a fecha de hoy no exista ningún atajo de teclado para llamarlo desde cualquier sitio teniendo en cuenta que es el componente más usado de todo el MAC. Bueno, el más usado es el &lt;i&gt;Spotlight&lt;/i&gt;, pero por las carencias del anterior, o al menos a veces se usa &lt;i&gt;Spotlight&lt;/i&gt; porque no estamos al alcance del Finfer.&lt;/p&gt;  &lt;p&gt;Eso, o a mi se me escapa algo, que todo pudiera ser. &lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Efectivamente, no existe atajo de teclado para lanzar el Finder desde cualquier sitio. O en otras palabras: no existe atajo de teclado equivalente al Win+E de Windows. Menos mal que podemos solucionarlo de aquella manera. No obstante, resulta tremendamente extraño que OS X no tenga dicho atajo… sabiendo que existe un &lt;i&gt;shortcut&lt;/i&gt; para casi cualquier cosa (menos esa).&lt;/p&gt;  &lt;p&gt;Veamos cómo solucionarlo. EL truco lo encontré &lt;a href="http://contented.qolc.net/articles/osx-global-shortcut-key-new-finder-window/"&gt;aquí&lt;/a&gt;, pero no me funcionó hasta que lo arreglé. Para aquellos que no estén muy familiarizados con el uso del Automator (que digamos es un generador visual del equivalente de los ficheros .bat en MAC), sería conveniente que abrierais dicha página y la pusierais lado a lado con la mía, porque voy a traducir y expandir los puntos que allí se tratan y así aprovecháis las imágenes, que yo no tengo ganas de repetir.&lt;/p&gt;  &lt;p&gt;1. Abrimos el Automator y elegimos un Servicio como flujo de trabajo. Digamos que un Servicio es una especie de programa disponible globalmente y que nada tiene que ver con los Servicios de Windows.&lt;/p&gt;  &lt;p&gt;2. Después, en la ventana de la izquierda, elegimos “Utilidades” -&amp;gt; “Ejecutar AppleScript”. Y lo soltamos sobre la zona de la derecha, quedando algo similar a la imagen de la otra Web.&lt;/p&gt;  &lt;p&gt;3. Ahora borramos ese texto y pegamos el nuestro. Para facilitaros la tarea, copiad y pegad al completo esto:    &lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td&gt;           &lt;p&gt;on run {input, parameters}&lt;/p&gt;            &lt;p&gt;tell application &amp;quot;Finder&amp;quot;&lt;/p&gt;            &lt;p&gt;activate&lt;/p&gt;            &lt;p&gt;make new Finder window to home&lt;/p&gt;            &lt;p&gt;end tell&lt;/p&gt;            &lt;p&gt;return input&lt;/p&gt;            &lt;p&gt;end run&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;4. Dadle al icono de ejecutar. Se debe abrir una ventana del Finder. Si no lo hace revisad el texto. Si os fijáis, el script es auto descriptivo, o casi: “le decimos al Finder que se active y que cree una nueva ventana en Home. Tenéis que guardar el script y darle un nombre que recordéis. Poned, por ejemplo: “EjecutaFinder”. Ya está, ya podemos cerrar el Automator.&lt;/p&gt;  &lt;p&gt;5. Ahora nos vamos a Sistema -&amp;gt; Preferencias -&amp;gt; Teclado -&amp;gt; Funciones rápidas de teclado y nos colocamos en “Aplicaciones” en el listado de la izquierda. Luego pulsamos el “+” que hay debajo y se nos abre la ventana del punto 5 de la otra Web.&lt;/p&gt;  &lt;p&gt;6. Introducimos el nombre que le dimos al servicio (“EjecutaFinder”) en el campo de Título del Menú, asegurándonos de que en Aplicación aparece “Todas las aplicaciones”. Y finalmente, seleccionamos “Función rápida de teclado” y apretamos la combinación de teclas con la que queramos lanzar el servicio. Yo he apretado ALT+CMD+F.&lt;/p&gt;  &lt;p&gt;7. Ya está, ya hemos terminado. Al cerrar las opciones de teclado debería activarse y cada vez que apretemos dicha combinación, debería aparecer una ventana del Finder.&lt;/p&gt;  &lt;p&gt;Pero no lo hace porque se nos ha olvidado una cosa. Volvemos a abrir el servicio en el Automator y arriba del todo, justo encima de “Ejecutar AppleScript”, tenemos que cambiar los dos desplegables y poner “El servicio recibe sin datos de entrada en cualquier aplicación”. Grabamos y ya está, ahora sí que funciona bien.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Vale. ¿Cuál es el problema? Pues que tarda como diez segundos a aparecer la ventana del Finder. Al menos en mi Core2Duo con 4GB de RAM, y todavía tarda más si tengo activa la máquina virtual con Windows para poder ejecutar lo que no se puede en OS X, como el servidor NNTP para las comunidades de Microsoft.&lt;/p&gt;  &lt;p&gt;La respuesta es que nos jodemos y punto. Es lo que hay. Carencia de MAC solucionada a trancas y barrancas.&lt;/p&gt;  &lt;p&gt;Sí, ya sé, podemos abrir la carpeta o el fichero que queramos desde Spotlight, pero no es lo mismo y el tiempo que se tarda es más o menos el mismo si no más.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Otras carencias del OS X: no existe el concepto de “ir al final de la línea”. Y no veáis lo que me jode, porque en Windows es algo a lo que estoy más que acostumbrado. Tampoco existe el concepto de “saltar palabra” (Ctrl+Flecha en Windows).&lt;/p&gt;  &lt;p&gt;Dos problemas a los que no he encontrado solución y que me traen por la calle de la amargura y hacen que mi rendimiento en OS X caiga en picado. Primero porque le doy a la tecla de fin y me salta al final del documento, y tengo que volver con el teclado, o peor todavía: armo un desbarajuste de cuidado.&lt;/p&gt;  &lt;p&gt;Menos mal que las aplicaciones de Microsoft (léase Office) sí que aplican el concepto a sus productos. O no tan menos mal, porque entonces el lío está armado. &lt;/p&gt;  &lt;p&gt;Me refiero a que cada vez es más automático: si estoy en el curro bajo Windows, uso los atajos de Windows. Si estoy en casa usando MAC, uso los de MAC… Pero con el Office me lío, y no poco.&lt;/p&gt;  &lt;p&gt;En fin, a sanjoderse, de nuevo, tocan.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Más. &lt;/p&gt;  &lt;p&gt;La última actualización de Office hace algo raro porque cada vez que reinicio el MAC me coloca unos ficheros recuperados en la papelera. Es algo que le ocurre a todo el mundo y está más o menos documentado, buscad “wkresources” y veréis. Esperemos que Microsoft lo solucione en breve, pero vaticino un “NOT REPRO” en los informes de Bugs… o un NEXT VERSION o un NOT TO BE SOLVED… Deseo ardientemente equivocarme.&lt;/p&gt;  &lt;p&gt;Además, si reinicias con el Word abierto tras haber editado y cerrado ficheros, también te recupera morralla de ellos.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Todavía más.&lt;/p&gt;  &lt;p&gt;No veais lo que me jode, pero en profundidad, que en MAC no exista el concepto de “ir al siguiente mensaje sin leer”. Y encima que Outlook le siga a pies juntillas.&lt;/p&gt;  &lt;p&gt;¿A qué superlumbreras se le habrá ocurrido que a la gente no iba a interesarle, no un atajo de teclado para saltar entre mensajes sin leer, sino ni que ni siquiera exista el concepto de tal cosa? Perdonadme la expresión: es de imbéciles.&lt;/p&gt;  &lt;p&gt;Tenemos las carpetas inteligentes, y podemos crearnos una (o varias) en las que nos aparezcan los mensajes sin leer, pero sueltos y fuera de concepto, y en Outook no nos marca que hay nuevos sin leer.&lt;/p&gt;  &lt;p&gt;En fin, otra cagada más.&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Y ya para finalizar, la última de la última.&lt;/p&gt;  &lt;p&gt;¿Cómo cojones se escribe el símbolo de HOME, la tilde esa horizontal? Y ya de paso, ¿cómo puñetas se escriben los símbolos especiales que con Windows es Alt-número?&lt;/p&gt;  &lt;p&gt;***&lt;/p&gt;  &lt;p&gt;Pues eso, que si sabes alguna respuesta a lo que pongo, escribe un comentario. Todas son preguntas a cosas que no he podido encontrar ni en Internet ni en los libros sesudos sobre Snow Leopard que he podido consultar…&lt;/p&gt;  &lt;p&gt;Os garantizo un profundo agradecimiento por mi parte y seguro que de muchos otros.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Addenda.&lt;/b&gt; Después de tener escrita la entrada e intentar publicarla, no he podido hacerlo desde MAC. Suelo escribirlas en Office para MAC, y luego las guardo en HTML. Finalmente veo el código fuente, lo copio, me voy al IE virtualizado, pego como HTML limpiando alguna morralla y entonces la entrada sale bien.&lt;/p&gt;  &lt;p&gt;Pues en este caso ni así. Y no sé por qué. Bueno, sí que lo sé: la *** mierda de interoperabilidad entre Windows/MAC. Al final he instalado el Word en la máquina virtual, he abierto el DOCX en dicho Word, copiado/pegado sobre Live Writer… y por fin ha salido bien.&lt;/p&gt;  &lt;p&gt;No obstante, para tener un Windows dentro de un MAC… lo tengo fuera y punto.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=184762" width="1" height="1"&gt;</description><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>Timers, alarmas y el iPhone</title><link>http://geeks.ms/blogs/rfog/archive/2010/11/07/timers-alarmas-y-el-iphone.aspx</link><pubDate>Sun, 07 Nov 2010 12:32:36 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:184463</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=184463</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=184463</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/11/07/timers-alarmas-y-el-iphone.aspx#comments</comments><description>&lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Con esta entrada vamos a matar tres pájaros de un tiro y evitar que dios, en su infinita sabiduría, mate más gatitos. Porque sí, porque cada vez que falla la alama de un iPhone o un iPod, dios se carga uno. Pero antes de llegar al meollo de la cuestión tenemos que ver otras cosas. Aprovecharé para contaros cómo funcionan los timers en un microprocesador (el primer ave defenestrada), os explicaré el concepto para construir una aplicación que sea un reloj con alarma (el segundo pajarraco) y dejaremos una pregunta en el aire para mofa y escarnio de la gente del iOs.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Todos hemos oído hablar de &lt;i style="mso-bidi-font-style:normal;"&gt;la frecuencia&lt;/i&gt; a la que funciona un microprocesador. Los, primero megaherzios, y luego gigahercios. Y no oiremos hablar de los terahercios porque están en el rango de los efectos cuánticos y no nos valen para mover un microprocesador… (Chiste para físicos cuánticos: tengo un ordenador a 3 terahercios pero nunca estoy seguro de dónde está).&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Ese reloj genera una serie de pulsos (parecidos a los que aparecen en un cardiograma pero más regulares) y son para el procesador y aledaños como nuestro corazón. O como un mecanismo de cuerda, que hace girar los engranajes. Imaginaros la rueda de escape de un reloj. Pues el funcionamiento interno de un procesador es igual: ante cada punto de escape (que en informática se llama ciclo máquina) las ruedas de engranajes se van moviendo poco a poco y al final vemos cómo la aguja del segundero va trazando su arco.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Si nos da por mirar una placa base en detalle, no vamos a ver un reloj de los gigahercios que se supone tiene nuestro equipo. Con suerte veremos uno de 40 o 60 MHz. Lo demás se realiza dentro de chips especiales que dividen esa frecuencia en otras mayores mediante electrónica. Y más dentro del micro, ya que muchas partes dentro de él no necesitan tanta velocidad y a veces es contraproducente, como veremos.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Uno de los elementos que comparten absolutamente todos los microprocesadores son los &lt;i style="mso-bidi-font-style:normal;"&gt;timers&lt;/i&gt;, nombre con el que suelen conocerse en la literatura técnica. El mínimo es uno, el máximo viene determinado por el tipo y destino del microprocesador, más todavía en los microcontroladores. Existen dos modos generales de funcionamiento. A veces ambos están presentes, a veces un mismo timer se puede comportar de las dos formas, y a veces sólo hay de un tipo.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;En uno de ellos tenemos acceso a un contador que se va incrementando periódicamente y que nosotros podemos leer para comparar con nuestro valor. En el otro, llegado a un punto (generalmente cero), se dispara una interrupción.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Es decir, cuando nosotros queremos activar un timer, lo que hacemos es escribir en una serie de registros del microprocesador para configurarlo. Decimos registros pero lo habitual son direcciones de memoria que están mapeadas dentro del procesador. Si os acordáis de otra entrada, nosotros escribimos en una dirección del procesador y las patillas del mismo cambian de estado. Pues ahora es lo mismo, pero en lugar de subir o bajar la tensión de una de ellas, configuramos el timer.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;O en otras palabras: conectamos una serie de ruedas de engranajes que estaban detenidas, ruedas que nos permitirán tener un evento periódico, ya sea un contador que se vaya incrementando solo o una interrupicón que se lanzará con cierta frecuencia.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Pero hay un problema. En un procesador de 8 bits, los registros serán, a lo sumo, de 16 bits. En uno de 16, de 32. En uno de 64 lo habitual es que sean de 64 bits, no de 128. Para ponerlo en marcha o detenerlo sólo necesitamos un bit, pero para programar el &lt;i style="mso-bidi-font-style:normal;"&gt;prescaler&lt;/i&gt;, cuantos más bits tengamos, mejor. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Suponiendo que tenemos un registro de 16 bits, tendremos 65536 posibles valores respecto a la base de tiempos. Por decirlo de otro modo, si en ese registro ponemos el valor de 10, el procesador hará la acción (ya sea incrementar otro registro o generar una interrupción) cada vez que ese valor llegue a cero. Si tenemos una base de tiempos de 1 ns, nuestro timer será de 10 ns. Si ponemos un valor de 50000, entonces tendremos un &lt;i style="mso-bidi-font-style:normal;"&gt;tick&lt;/i&gt; cada 50 us (microsegundos).&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Si os fijais, en esta situación, nuestro valor más alto será de un poco más de 65 microsegundos. Esta es la limitación de la que hablábamos antes. Algunos fabricantes lo solucionan ofreciendo DOS registros para programar el &lt;i style="mso-bidi-font-style:normal;"&gt;timer&lt;/i&gt;, o que cada salto de 1 en en ese registro sea de 10 en la base de tiempos, o ambas cosas, e incluso tendremos dentro de un mismo microprocesador varios tipos de timers.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Al final, el tema está en que lo habitual es que no podamos tener &lt;i style="mso-bidi-font-style:normal;"&gt;ticks&lt;/i&gt; mayores de unos cientos de milisegundos lo que para los programas puede ser un tiempo excesivamente largo, pero para un reloj normal son demasiado cortos.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;En ambos casos la limitación es la misma: tanto la interrupción como el contador interno del microprocesador se van a disparar demasiado rápido para lo que queremos. No he dicho que en el caso del incremento de la variable, normalmente es otro registro del procesador el que se va incrementado (o decrementando), y cuando decimos registro queremos decir dirección de memoria, que podremos leer y consultar. El mayor problema de este tipo de temporizadores está en que cuando la variable llega a su mínimo o su máximo, o bien vuelve a empezar o bien el timer se detiene. Y si no lo consultamos con la frecuencia suficiente, no sabremos que se ha detenido y habremos perdido nuestra base de tiempos.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Si os acordáis, hubo en Windows 95 un fallo que hacía que el ordenador se colgara si estaba más de unos días sin reiniciar. El problema era este mismo: Windows tenía un contador interno que se iba incrementando y cuando llegaba al máximo, volvía a empezar por cero. Y entonces todo se iba al garete porque lo que quiera que lo usara para su funcionamiento esperaba un incremento, no un decremento del orden de 2&lt;sup&gt;30&lt;/sup&gt; ó 2&lt;sup&gt;31&lt;/sup&gt;.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Incidentalmente el problema tiene solución, y encima no es compleja en exceso pero sí que necesita código y saber la frecuencia media de consulta al timer, solución que debe ser compartida entre el timer y la parte que lo consulta. De hecho existen TRES soluciones. Os lo dejo como ejercicio de clase.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Por lo tanto yo no suelo recomendar el uso de este tipo de &lt;i style="mso-bidi-font-style:normal;"&gt;timers&lt;/i&gt;, aunque a veces es inevitable, y entonces es obligatorio evaluar si se puede producir dicho desbordamiento, o al menos es lo que hacen los &lt;i style="mso-bidi-font-style:normal;"&gt;buenos programadores&lt;/i&gt;. De todos modos, al final, veremos que es muy posible que siempre nos pueda ocurrir. Y no, incidentalmente, no creo que sea este el problema con los iPhone.&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;Bueno, ahora que sabemos qué es un timer y cómo funciona, vamos a construir un ejemplo práctio… en C.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//Este &lt;span class="SpellE"&gt;es&lt;/span&gt; el &lt;span class="SpellE"&gt;contador&lt;/span&gt; global de &lt;span class="SpellE"&gt;nuestro&lt;/span&gt; timer.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Esto&lt;/span&gt; se &lt;span class="SpellE"&gt;debe&lt;/span&gt; &lt;span class="SpellE"&gt;llamar&lt;/span&gt; &lt;span class="SpellE"&gt;una&lt;/span&gt; sola &lt;span class="SpellE"&gt;vez&lt;/span&gt; al principio de &lt;span class="SpellE"&gt;todo&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Configura&lt;/span&gt; y pone los &lt;span class="SpellE"&gt;registros&lt;/span&gt; &lt;span class="SpellE"&gt;adecuados&lt;/span&gt; &lt;span class="SpellE"&gt;para&lt;/span&gt; &lt;span class="SpellE"&gt;que&lt;/span&gt; &lt;span class="SpellE"&gt;nuestro&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//timer sea de 1 ms.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;InstallItmer&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Configurar&lt;/span&gt; los &lt;span class="SpellE"&gt;registros&lt;/span&gt;&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//...&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Arranca&lt;/span&gt; el timer con un &lt;span class="SpellE"&gt;intervalo&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;SetTimer&lt;/span&gt;(&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; interval)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;=interval;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Arrancar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Devuelve&lt;/span&gt; &amp;quot;&lt;span class="SpellE"&gt;cierto&lt;/span&gt;&amp;quot; &lt;span class="SpellE"&gt;si&lt;/span&gt; el timer ha &lt;span class="SpellE"&gt;terminado&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;HasEnded&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;==0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//La &lt;span class="SpellE"&gt;interrupción&lt;/span&gt; &lt;span class="SpellE"&gt;que&lt;/span&gt; se &lt;span class="SpellE"&gt;lanzará&lt;/span&gt; &lt;span class="SpellE"&gt;periódicamente&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Aquí&lt;/span&gt; el linker &lt;span class="SpellE"&gt;deberá&lt;/span&gt; &lt;span class="SpellE"&gt;poner&lt;/span&gt; &lt;span class="SpellE"&gt;su&lt;/span&gt; &lt;span class="SpellE"&gt;dirección&lt;/span&gt; en el &lt;span class="SpellE"&gt;lugar&lt;/span&gt; &lt;span class="SpellE"&gt;adecuado&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;INTERRUPT_TIMER &lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;--;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;if(&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;;&lt;span style="color:green;"&gt; //&lt;span class="SpellE"&gt;Detener&lt;/span&gt; el timer             &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;else&lt;span style="color:green;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Recargar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;La llamada a InstallTimer() debe hacerse al arranque del procesador, o al menos antes de que vayamos a usarlo por primera vez. Lo que hace esta función es configurar los registros según lo hemos explicado, de modo que, en base a la frecuencia de trabajo del procesador, más los registros adecuados, se nos dispare una interrupción cada milisegundo (en nuestro ejemplo). Pero no lo pone en marcha, simplemente lo configura.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;TimerInterrupt() es la interrupción que nos saltará cada vez que transcurra un milisegundo. Fijaros que decrementamos en una unidad una variable local y que si llega a cero, detenemos el timer y si no lo recargamos. Esto es un ejemplo, porque a veces no será necesario recargarlo, es decir, el procesador disparará la interrupción cada 1 ms, otras veces lo hará sólo una vez y se detendrá, todo depende del modelo y características de casa procesador y del timer que estemos usando.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Aquí, con INTERRUPT_TIMER he ejemplificado el hecho de que debemos indicarle al compilador y al enlazador que dicha función es una interrupción y que debe ser instalada en el lugar adecuado. De nuevo estamos ante las particularidades de cada compilador y enlazador, aunque cuanto más moderno sea, más fácil nos lo pondrá. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Básicamente, una interrupción está localizada en una dirección de memoria exacta, y es ahí dónde se debe poner la dirección en la que está la rutina a modo de puntero a función: cuando se dispare el timer, el hardware del micro hará un call a lo que quiera que esté apuntando esa dirección. Si hay código bueno se ejecutará. Si no, lo habitual es que se cuelgue, aunque a veces también se puede producir una excepción hardware que nos permitirá &lt;i style="mso-bidi-font-style:normal;"&gt;resumir&lt;/i&gt;, de algún modo, el funcionamiento. Además, en algunos microprocesadores la instrucción de retorno de función (&lt;i style="mso-bidi-font-style:normal;"&gt;ret&lt;/i&gt;, para entendernos) será alguna instrucción especial como &lt;i style="mso-bidi-font-style:normal;"&gt;iret&lt;/i&gt;, retorno de interrupción. De nuevo estamos ante el hecho de que hay tantas variaciones como familias y fabricantes de electrónica.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Bueno, la parte difícil ya está. La fácil son las dos funciones que nos quedan. SetTimer() asignará un valor a la variable global y HasEndend() nos devolverá &lt;i style="mso-bidi-font-style:normal;"&gt;cierto&lt;/i&gt; cuando el contador haya llegado a cero. Si, por ejemplo, pasamos 1000 a SetTimer(), habremos obtenido un metrónomo de 1 segundo. Terminar nuestro reloj es casi trivial:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; _&lt;span class="SpellE"&gt;tmain&lt;/span&gt;(&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class="SpellE"&gt;argc&lt;/span&gt;, _TCHAR* &lt;span class="SpellE"&gt;argv&lt;/span&gt;[])         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class="SpellE"&gt;segundo&lt;/span&gt;=0, &lt;span class="SpellE"&gt;minuto&lt;/span&gt;=0, &lt;span class="SpellE"&gt;hora&lt;/span&gt;=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;InstallTimer&lt;/span&gt;();         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt;(;;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//NOTA: Con &lt;span class="SpellE"&gt;esto&lt;/span&gt; &lt;span class="SpellE"&gt;simulamos&lt;/span&gt; la &lt;span class="SpellE"&gt;interrupción&lt;/span&gt;&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;!=0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;();         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//FIN DE NOTA&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;HasEnded&lt;/span&gt;())         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;SetTimer&lt;/span&gt;(1000);         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;segundo&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;segundo&lt;/span&gt;&amp;gt;=60)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:4;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;minuto&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:4;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;segundo&lt;/span&gt;-=60;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;minuto&lt;/span&gt;&amp;gt;=60)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:4;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;hora&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:4;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;minuto&lt;/span&gt;-=60;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; 0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &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;¿Lo veis, no? Lo único a destacar en el ejemplo es que hemos puesto la interrupción en nuestro bucle for (para evitar que el autor tenga que crear un thread para el timer o suscribirse a uno de windows, etc). Obviando eso, tenemos un reloj en nuestro PC que ejemplifica cómo podríamos construir uno si TimerInterrupt() realmente se disparara cada milisegundo.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Copiaros el código a un proyecto de C++ de consola de Visual C++, definid&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:35.4pt;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;#define&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; INTERRUPT_TIMER &lt;span style="color:blue;"&gt;void            &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Al principio de todo, y os debe funcionar.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Añadir alarmas es relativamente fácil. Deberíamos tener una lista de variables hora, minuto y segundo y, en el bucle, comprobar si la hora actual es igual o superior a la programada, y si lo es, lanzar el sonido.&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;Bueno, ya tenemos nuestro reloj. Bonito, ¿no? Pues NO. Ese programa es una mierda de programa, y desde luego no creo que esté hecho así en iOS, y si lo está sería para matarlos lentamente (aunque el tipo de problema que tiene me hace pensar que…). Ese programa nos sube la CPU al 100% y en un dispositivo con batería se la iba a chupar en un tris.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;No, la solución es algo más compleja, y pasa por mover bastantes cosas a la interrupción. Algo así:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//Este &lt;span class="SpellE"&gt;es&lt;/span&gt; el &lt;span class="SpellE"&gt;contador&lt;/span&gt; global de &lt;span class="SpellE"&gt;nuestro&lt;/span&gt; timer, y los &lt;span class="SpellE"&gt;datos&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//Para &lt;span class="SpellE"&gt;mantener&lt;/span&gt; el &lt;span class="SpellE"&gt;reloj&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;hora&lt;/span&gt;=0,minuto=0,segundo=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//La &lt;span class="SpellE"&gt;interrupción&lt;/span&gt; &lt;span class="SpellE"&gt;que&lt;/span&gt; se &lt;span class="SpellE"&gt;lanzará&lt;/span&gt; &lt;span class="SpellE"&gt;periódicamente&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Aquí&lt;/span&gt; el linker &lt;span class="SpellE"&gt;deberá&lt;/span&gt; &lt;span class="SpellE"&gt;poner&lt;/span&gt; &lt;span class="SpellE"&gt;su&lt;/span&gt; &lt;span class="SpellE"&gt;dirección&lt;/span&gt; en el &lt;span class="SpellE"&gt;lugar&lt;/span&gt; &lt;span class="SpellE"&gt;adecuado&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;INTERRUPT_TIMER &lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;--;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;HasEnded&lt;/span&gt;())         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;SetTimer&lt;/span&gt;(1000);         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;segundo&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;segundo&lt;/span&gt;&amp;gt;=60)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;minuto&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;segundo&lt;/span&gt;-=60;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;minuto&lt;/span&gt;&amp;gt;=60)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;{         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;hora&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;minuto&lt;/span&gt;-=60;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;}         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Recargar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &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;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; _&lt;span class="SpellE"&gt;tmain&lt;/span&gt;(&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class="SpellE"&gt;argc&lt;/span&gt;, _TCHAR* &lt;span class="SpellE"&gt;argv&lt;/span&gt;[])         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;InstallTimer&lt;/span&gt;();         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;Sleep(INFINITE);         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; 0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &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;Este ejemplo ya no nos va a funcionar en el PC, pero gasta un montón menos de batería y nos deja la CPU al 0% o casi. &lt;span style="mso-spacerun:yes;"&gt;&amp;#160;&lt;/span&gt;Ahora sí que tenemos un reloj de verdad, optimizado al 100%. Y ahora es cuando entra el tío de la rebaja: tenemos que medir (con un sistema de traza, por ejemplo), cuánto tiempo tarda la ejecución del bloque que hay dentro del primer if, y si es superior al milisegundo, debemos anotarlo y corregir el contador para evitar que nuestro reloj atrase. También debemos comprobar si la interrupción es reentrante (en el caso de que no haya acabado y si llega el momento de volver a ejecutarla, el procesador lo hará o no) y actuar en consecuencia. De todos modos, por el código usado, os aseguro que se tarda menos de 1 ms a hacer todo lo que hay dentro del if.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;¿De dónde viene el ahorro de energía? Es muy sencillo: si os fijás en este último caso, sólo se ejecuta código cuando es estrictamente necesario, y cuando no el programa está durmiendo sin hacer nada. En el caso anterior el programa estaba continuamente comprobando si el timer había llegado a cero o no, de continuo, usando el 100% de la CPU.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Una solución intermedia al primer programa podría haber sido poner un else y dormir el programa durante 1 ms, pero aun así sigue siendo bastante inefectivo (y en Windows esa dormida será de, al menos, 15 ms).&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;Ya, ahora sí, ahora ya está todo perfecto… ¡NO! ¡Ni mucho menos! Lo de arriba sigue siendo una enorme pérdida de tiempo, un absurdo sólo válido como explicación teórica y poco más. ¿Realmente necesitamos tres variables para el reloj? Pues no, esas tres variables sólo son necesarias para cuando tengamos que verlas los seres humanos, por lo tanto debemos plantearnos la pregunta de qué precisión necesitamos. ¿1 segundo? Pues hagamos lo siguiente:&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//Este &lt;span class="SpellE"&gt;es&lt;/span&gt; el &lt;span class="SpellE"&gt;contador&lt;/span&gt; global de &lt;span class="SpellE"&gt;nuestro&lt;/span&gt; timer, y los &lt;span class="SpellE"&gt;datos&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//Para &lt;span class="SpellE"&gt;mantener&lt;/span&gt; el &lt;span class="SpellE"&gt;reloj&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span class="SpellE"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;unsigned&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span style="color:blue;"&gt;long&lt;/span&gt; &lt;span class="SpellE"&gt;g_hora&lt;/span&gt;=0;         &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//La &lt;span class="SpellE"&gt;interrupción&lt;/span&gt; &lt;span class="SpellE"&gt;que&lt;/span&gt; se &lt;span class="SpellE"&gt;lanzará&lt;/span&gt; &lt;span class="SpellE"&gt;periódicamente&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:green;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;//&lt;span class="SpellE"&gt;Aquí&lt;/span&gt; el linker &lt;span class="SpellE"&gt;deberá&lt;/span&gt; &lt;span class="SpellE"&gt;poner&lt;/span&gt; &lt;span class="SpellE"&gt;su&lt;/span&gt; &lt;span class="SpellE"&gt;dirección&lt;/span&gt; en el &lt;span class="SpellE"&gt;lugar&lt;/span&gt; &lt;span class="SpellE"&gt;adecuado&lt;/span&gt;.&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;INTERRUPT_TIMER &lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;--;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;((g_timerCntr%1000)==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Recargar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;void&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span class="SpellE"&gt;MuestraHoraActual&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class="SpellE"&gt;hora&lt;/span&gt;, &lt;span class="SpellE"&gt;min,seg&lt;/span&gt;;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;hora&lt;/span&gt;=g_hora/3600;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;min=g_hora/60;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;seg&lt;/span&gt;-=(&lt;span class="SpellE"&gt;hora&lt;/span&gt;*3600+min*60);         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;printf&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;%02d:%02d:%d2d&amp;quot;&lt;/span&gt;,hora,min,seg);         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &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;Fijaros en la interrupción, reducida a la mínima expresión a costa de crearnos una función de muestra de hora algo más compleja (que no estoy seguro si funcionará bien o no, pero sin lo hace pocas diferencias tiene que haber con la correcta). A simple vista hemos perdido, pero realmente hemos ganado, y no poco. ¿Qué relación hay entre las veces que vemos el reloj y las que se ejecuta la interrupción? Pues prácticamente infinitas. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Ahora me diréis que el iPhone muestra la hora arriba del todo. Sí, pero en minutos. Es decir, que podemos reducir incluso el contador de la interrupción a minutos en lugar de segundos. Y entonces añadimos el truco del almendruco, que es un flag para indicar a la shell que debe actualizar el reloj. Algo así:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;INTERRUPT_TIMER &lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;--;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;((g_timerCntr%1000)==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;((&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;)%60==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_flagCambiaMinuto&lt;/span&gt;=1;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Recargar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Y será tarea de la interfaz del iPhone la de pintar cada vez que cambie el minuto. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Este acercamiento para el aviso de cambio de minuto es muy burdo. Lo que yo haría es tener llamar a un callback que me repinte la hora si el iPhone no está a pantalla completa y si eso no se puede hacer (que no se podrá, porque pintar en pantalla desde una interrupción como que es chapucero y a veces simplemente el hardware no lo permite), ese callback invalidaría el rectánculo de pintado y entonces el controlador de pintado, al recibir dicha invalidación, repintaría el área… con la nueva hora.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Fijaros cómo una tarea en principio simple tiene más miga de la que parece, sobre todo si quieres hacer las cosas bien. De hecho no sé cómo lo está haciendo Apple (y de paso Microsoft) con el tema de las horas, pero si yo tuviera que hacer algo así esa sería MI forma.&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;Ya está, ya terminamos. ¿Cómo podríamos añadir alarmas (y que suenen) al último ejemplo? La solución más sencilla es tener un array de variables del mismo tipo que g_hora. El tamaño podría ser dinámico con una lista enlazada, o un array estático con, pongamos, 16 variables que nos permitirian tener un máximo de 16 alarmas diferentes. Eso ya depende de la implementación. Esta sería la nueva interrupción, ya definitiva:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;#define&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; NUM_ALARMAS 16        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;unsigned&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt; &lt;span style="color:blue;"&gt;long&lt;/span&gt; &lt;span class="SpellE"&gt;g_alarmas&lt;/span&gt;[NUM_ALARMAS];         &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;INTERRUPT_TIMER &lt;span class="SpellE"&gt;TimerInterrupt&lt;/span&gt;(&lt;span style="color:blue;"&gt;void&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;{        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_timerCntr&lt;/span&gt;--;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;((g_timerCntr%1000)==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;++;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;tab-stops:35.4pt 70.8pt 106.2pt 141.6pt 177.0pt right 451.3pt;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt;(&lt;span class="SpellE"&gt;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&lt;/span&gt; &lt;span class="SpellE"&gt;i&lt;/span&gt;=0;i&amp;lt;&lt;span class="SpellE"&gt;NUM_ALARMAS;i&lt;/span&gt;++)&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt;(&lt;span class="SpellE"&gt;g_alarmas&lt;/span&gt;[&lt;span class="SpellE"&gt;i&lt;/span&gt;]!=0 &amp;amp;&amp;amp; &lt;span class="SpellE"&gt;g_alarmas&lt;/span&gt;[&lt;span class="SpellE"&gt;i&lt;/span&gt;]&amp;lt;&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:3;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;PreparaAvisoAlarma&lt;/span&gt;(&lt;span class="SpellE"&gt;i&lt;/span&gt;); &lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:35.4pt;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;color:blue;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;if&lt;/span&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;((&lt;span class="SpellE"&gt;g_hora&lt;/span&gt;)%60==0)         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:2;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class="SpellE"&gt;g_flagCambiaMinuto&lt;/span&gt;=1;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;        &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;&lt;span style="mso-tab-count:1;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color:green;"&gt;//&lt;span class="SpellE"&gt;Recargar&lt;/span&gt; el timer&lt;/span&gt;         &lt;/span&gt;&lt;/p&gt;  &lt;p style="text-align:left;text-indent:0cm;mso-pagination:none;mso-layout-grid-align:none;" class="MsoNormal" align="left"&gt;&lt;span style="font-family:consolas;font-size:9.5pt;mso-bidi-font-family:consolas;mso-ansi-language:en-us;" lang="EN-US"&gt;}        &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;Fijaros qué código más minimalista y completo: tenemos alarmas, tenemos reloj en tiempo real, actualización de la hora en el escritorio con apenas unas líneas y que apenas consumen una miseria de energía y tiempo de proceso.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Cuando g_alarmas[i] vale cero, es que esa alarma está desactivada, y si no vale cero y su valor es inferior a la hora actual, es que debe sonar. De nuevo PreparaAvisoAlarma() debe ser una función mínima que simplemente indique al sistema que la alarma debe tocar, ya sea despertando un hilo dormido o activando cualquier flag que luego alguien leerá y actuará en consecuencia.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Luego, la tarea del programa de interfaz con el usuario que le permita añadir, quitar o modificar alarmas, será la de “tocar” dichas variables a gusto del consumidor.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;¿Cuál es, pues el fallo del iPhone? Pues que ante el cambio de hora, al programador de turno se le olvidó actualizar también ese array de alarmas (o su equivalente), con lo que ellas tienen el valor antiguo y sonarán cuando el valor de disparo antiguo se corresponda con el nuevo…&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Peeeeeeeeeeeeeeeeeeeero, hay un gran pero, y aquí es donde vienen las risas. En mi caso, ninguna solución propuesta funciona. Ni en mi flamante iPhone 4G, ni en mi iPod Touch 2G. Ni por cierto en el de mi jefe, lo que supuso una seria discusión sobre lo inútil que era (yo) y que antes de hablar debería asegurarme de que la culpa es mía y no de los demás, como siempre hago (palabras textuales), a lo que yo le dije que probáramos el tema… Cuando vio que ni en el mío ni en el suyo funcionaban… se fue a recoger el correo (en fin, que la cosa se va acercando a su final lógico…).&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;La solución que me funciona es poner una alarma y activarla para TODOS LOS DÍAS de la semana, de lunes a domingo. Si no se hace así suena una hora más tarde, aunque sean alarmas antiguas o recién creadas, o apagues y reinicies el iPhone, o incluso lo restaures desde la copia de seguridad: falla.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;Por lo tanto, alguna chapuza remiendosa debe de haber dentro del software del iPhone, porque, como os he demostrado, tener alarmas en un dispositivo como el que hablamos es, a nivel de desarrollo, completamente trivial, y si regenerarlas desde cero no funciona…&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES"&gt;[NOTA: El código de ejemplo, salvo la primera parte, no está probado, así que lo mismo puede haber algún gazapo si a alguien se le ocurriera probarlo]. &lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=184463" 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/MAC/default.aspx">MAC</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/Apple/default.aspx">Apple</category></item></channel></rss>