<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-33066466</atom:id><lastBuildDate>Mon, 17 Jun 2013 20:05:43 +0000</lastBuildDate><category>ruby</category><category>presentaciones</category><category>apple</category><category>genexus extensions</category><category>útiles</category><category>ipad</category><category>desarrollo</category><category>uruguay</category><category>collaborative proyects</category><category>piensopienso</category><category>música</category><category>open source</category><category>redes sociales</category><category>curiosidades</category><category>fútbol</category><category>genexus rocha</category><category>c#</category><category>objective-c</category><category>firefox</category><category>fotografía</category><category>testeo</category><category>iphone</category><category>películas</category><category>reflexiones</category><category>libros</category><category>educación</category><category>git</category><category>web 2.0</category><category>apps</category><category>rss</category><category>nintendo</category><category>internet</category><category>televisión</category><category>tecnología</category><category>windows</category><category>email</category><category>gx_meeting</category><category>linux</category><category>facebook</category><category>almacenamiento</category><category>openId</category><category>office</category><category>php</category><category>user controls</category><category>astronomía</category><category>reconocimientos</category><category>genexus</category><category>ted</category><category>ruby_on_rails</category><category>blog</category><category>tags</category><category>android</category><category>xcode</category><category>running</category><category>genexus_x_ev2</category><category>varios</category><category>flickr</category><category>twitter</category><category>microsoft</category><category>eventos</category><category>asp.net</category><category>celulares</category><category>sugerencias</category><category>ciencia</category><category>mac_os_x</category><category>subversion</category><category>google</category><title>Blog de Marcos Crispino</title><description>Sobre desarrollo de software, tecnología, y algunas otras cosas</description><link>http://blog.marcoscrispino.com/</link><managingEditor>noreply@blogger.com (Marcos Crispino)</managingEditor><generator>Blogger</generator><openSearch:totalResults>304</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/mcrispino" /><feedburner:info uri="mcrispino" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>mcrispino</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-872085097141505373</guid><pubDate>Mon, 17 Jun 2013 17:31:00 +0000</pubDate><atom:updated>2013-06-17T14:31:13.661-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apps</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>Metro México DF 2.0, primer aplicación Offline con iOS</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-mm1fsTcBl3Y/Ub8rH4MYq0I/AAAAAAAACHk/hJUbnRDapcA/s1600/MetroDF.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-mm1fsTcBl3Y/Ub8rH4MYq0I/AAAAAAAACHk/hJUbnRDapcA/s1600/MetroDF.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace unos días, se liberó la versión 2.0 de la aplicación del &lt;a href="https://itunes.apple.com/hk/app/metro-mexico-df/id529815225?mt=8"&gt;Metro de México DF para iOS&lt;/a&gt;, hecha con &lt;a href="http://www.genexus.com/gx/tilo"&gt;GeneXus Tilo&lt;/a&gt;, y que tiene como novedad que incorpora la funcionalidad de generación Offline de esta versión. Hasta donde sé&lt;sup&gt;(1)&lt;/sup&gt;, esta es la primera aplicación Offline en iOS con GeneXus.&lt;br /&gt;
&lt;br /&gt;
La generación Offline para aplicaciones de Smart Devices es una de las &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?20286"&gt;características principales de la versión Tilo&lt;/a&gt;, de la cual estamos por liberar una beta que agrega esta funcionalidad para iOS.&lt;br /&gt;
&lt;br /&gt;
Por "aplicaciones Offline" en este caso, entendemos aplicaciones que tienen una base de datos en el dispositivo (SQLite, tanto en iOS como en Android), y tienen generación de código del lado del cliente, por lo que pueden funcionar completamente desconectadas del servidor.&lt;br /&gt;
&lt;br /&gt;
En la versión Evolution 2 lo más parecido, es el caché de datos, que permitía acceder a los mismos a pesar de no tener conexión, pero no permitía ejecutar código del lado del cliente ni realizar modificaciones en la base de datos.&lt;br /&gt;
&lt;br /&gt;
En particular la aplicación del Metro DF usa varias características del nuevo generador.&lt;br /&gt;
&lt;br /&gt;
Para empezar, tiene todos los datos embebido en el SQLite, por lo que los accesos son mucho más rápidos.&lt;br /&gt;
&lt;br /&gt;
Además se hace uso del generador de Objective-C, por lo que todos los cálculos se realizan locales, no hay ninguna llamada al servidor por ejemplo para calcular las rutas entre dos estaciones dadas.&lt;br /&gt;
&lt;br /&gt;
También se realizan modificaciones a la base de datos mediante procedimientos, para cálculos internos, aunque esto no es visible para el usuario final ya que no hay ningún formulario de entrada de datos.&lt;br /&gt;
&lt;br /&gt;
Otra cosa para destacar es que en la aplicación se usó la sincronización automática de datos (del servidor al cliente), para la carga inicial de datos en el SQLite, que luego se agregaron a la aplicación compilada (para evitar que cada instalación tenga que sincronizar).&lt;br /&gt;
&lt;br /&gt;
Como decía, en breve vamos a tener una beta liberada para que puedan probar esta funcionalidad. No es una versión completa, porque quedan cosas por hacer, pero por lo menos tenemos la certeza de que ya hay un conjunto de aplicaciones que se pueden hacer. Y para muestra, ya pueden bajar la &lt;a href="https://itunes.apple.com/hk/app/metro-mexico-df/id529815225?mt=8"&gt;aplicación del Metro de México DF&lt;/a&gt;&lt;sup&gt;(2)&lt;/sup&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;sup&gt;(1) &lt;/sup&gt;Dado que el generador no está liberado, creo estar bastante seguro de que no hay otra aplicación liberada para iOS que use base de datos Offline. Si me equivoco, me avisan :)&lt;br /&gt;
&lt;sup&gt;(2) &lt;/sup&gt;La aplicación tiene algunos puntos a mejorar, por lo que se va a estar subiendo una nueva versión, pero igual me pareció destacable que la aplicación ya esté en producción...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=WzrW_PDZ4nY:OK72sj46n28:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=WzrW_PDZ4nY:OK72sj46n28:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=WzrW_PDZ4nY:OK72sj46n28:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=WzrW_PDZ4nY:OK72sj46n28:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=WzrW_PDZ4nY:OK72sj46n28:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/WzrW_PDZ4nY/metro-mexico-df-20-primer-aplicacion.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-mm1fsTcBl3Y/Ub8rH4MYq0I/AAAAAAAACHk/hJUbnRDapcA/s72-c/MetroDF.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/06/metro-mexico-df-20-primer-aplicacion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2466028774620173280</guid><pubDate>Thu, 13 Jun 2013 22:53:00 +0000</pubDate><atom:updated>2013-06-13T19:53:00.501-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>Literales de tipo Date y DateTime en GeneXus</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
Cuando programamos, ya sea en GeneXus o en cualquier otro lenguaje, es muy común usar literales en el código, para valores conocidos o especiales de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si voy a hacer una suma de varios registros, inicializo la variable en cero:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
&amp;amp;suma = 0&lt;/tt&gt;&lt;/blockquote&gt;
O si estoy por ejemplo en una transacción y quiero saber si estoy en modo Insert, puedo preguntar&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;if &amp;amp;Mode = 'INS'&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ... &lt;br /&gt;
endif&lt;/tt&gt;&lt;/blockquote&gt;
(nota: es un ejemplo... lo recomendable en este caso es usar el dominio enumerado TrnMode) &lt;br /&gt;
&lt;br /&gt;
En GeneXus hay unos cuantos tipos de datos, pero podríamos decir que los principales son cuatro: números, strings, booleanos y fechas (o fecha-hora para ser más precisos).&lt;br /&gt;
&lt;br /&gt;
Para los tres primeros, es bien sabido como expresar literales, ¿pero para las fechas?&lt;br /&gt;
&lt;br /&gt;
Esta funcionalidad creo que no es muy conocida, pero en GeneXus también se pueden escribir literales de fechas, utilizando el caracter # como delimitador (así como usamos las comillas simples o dobles para los strings).&lt;br /&gt;
&lt;br /&gt;
Así por ejemplo, las siguientes expresiones son válidas:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;&amp;amp;date = #2013-06-13#&lt;br /&gt;
&amp;amp;dateTime = #2013-06-13 06:23p#&lt;/tt&gt;&lt;/blockquote&gt;
Por más información, pueden ver la &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?4372"&gt;documentación oficial en el Wiki&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Esto en sí no parece tener demasiadas ventajas con respecto a usar las funciones &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?7627"&gt;YMDtoD&lt;/a&gt; y &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?7626"&gt;YMDHMStoT&lt;/a&gt;, pero hay un caso donde sí en necesario usarlos: cuando queremos hacer un call dinámico a un objeto SD, que recibe una fecha por parámetro. Por ejemplo:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;&amp;amp;callObject = "sd:MiObjetoSD?#2013-06-13#"&lt;br /&gt;
call(&amp;amp;callObject)&lt;/tt&gt;&lt;/blockquote&gt;
En todo caso, es una herramienta más de la que disponemos a la hora de escribir nuestras aplicaciones en GeneXus.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=F6FAlysbifA:1NJvJQhjjeY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=F6FAlysbifA:1NJvJQhjjeY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=F6FAlysbifA:1NJvJQhjjeY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=F6FAlysbifA:1NJvJQhjjeY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=F6FAlysbifA:1NJvJQhjjeY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/F6FAlysbifA/literales-de-tipo-date-y-datetime-en.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s72-c/GXLogo.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/06/literales-de-tipo-date-y-datetime-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8557111659536591358</guid><pubDate>Tue, 11 Jun 2013 23:09:00 +0000</pubDate><atom:updated>2013-06-11T20:09:00.404-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">apple</category><title>iOS 7</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Q9Tmp-zrkWE/Ubc26L0u91I/AAAAAAAACGI/kA89C3fyFpo/s1600/iOS7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Q9Tmp-zrkWE/Ubc26L0u91I/AAAAAAAACGI/kA89C3fyFpo/s1600/iOS7.png" /&gt;&lt;/a&gt;&lt;/div&gt;
En el día de ayer Apple presentó la nueva versión de iOS, que ya se puede obtener en versión beta y estará disponible más adelante este año.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede ver completa &lt;a href="http://www.apple.com/apple-events/june-2013/"&gt;en el sitio de Apple&lt;/a&gt;, donde tambiéan anunciaron una nueva versión de OS X (con poca cosa nueva...), nuevas MacBook Air y una nueva Mac Pro. Si quieren ver el &lt;a href="http://www.apple.com/ios/ios7/"&gt;video de presentación de iOS 7&lt;/a&gt; específicamente (no la presentación), también lo pueden hacer.&lt;br /&gt;
&lt;br /&gt;
Si bien se esperaba que el nuevo diseño en iOS 7 fuera más "flat" que en versiones anteriores, creo que con lo que mostraron se pasaron para el otro lado...&lt;br /&gt;
&lt;br /&gt;
Todavía no instalé la beta, y dudo que lo vaya a hacer. Eventualmente voy a terminar actualizando, pero el diseño de esta nueva versión me parece mucho más descuidado que en iOS 6.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, &lt;a href="https://itunes.apple.com/us/app/wwdc/id640199958?ls=1&amp;amp;mt=8"&gt;la aplicación del WWDC&lt;/a&gt; que liberaron hace unos días para el evento de desarrolladores, tiene "tabs" en la barra de navegación que se ven así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-jgekX6Wsx60/Ubc5aqGnWbI/AAAAAAAACGY/QYKYqgeNRCE/s1600/navBar_iOS6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-jgekX6Wsx60/Ubc5aqGnWbI/AAAAAAAACGY/QYKYqgeNRCE/s1600/navBar_iOS6.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En contraste, por ejemplo la aplicación de Calendario en iOS 6, tiene botones similares en la "toolbar", que se ven así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-25_F1AZZwSY/Ubc6g-UX8dI/AAAAAAAACGo/T8-SHYyUYDI/s1600/calendar_iOS6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-25_F1AZZwSY/Ubc6g-UX8dI/AAAAAAAACGo/T8-SHYyUYDI/s1600/calendar_iOS6.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Entre estos dos diseños, ya se nota la diferencia. En la aplicación del WWDC se le saca el aspecto redondeado a los botones y a la barra misma.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, a pesar que podía ser esperable algo similar para iOS 7, hicieron un cambio mucho más grande.&lt;br /&gt;
&lt;br /&gt;
En iOS 7, ese mismo componente de UI se ve así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-GvPb0bg85nI/Ubc8OQx4eOI/AAAAAAAACG4/BlVuZQ9wuKY/s1600/navBar_iOS7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-GvPb0bg85nI/Ubc8OQx4eOI/AAAAAAAACG4/BlVuZQ9wuKY/s1600/navBar_iOS7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En temas de diseño, evidentemente es una cuestión de gustos... pero el estilo "flat" que eligieron me resulta bastante malo.&lt;br /&gt;
&lt;br /&gt;
En fin... Ya veremos el próximo año cuando anuncien el porcentaje de adopción de iOS 7, a ver si se acerca al que tiene iOS 6 hoy en día (que es del 93% de acuerdo a la presentación de ayer).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=LTNYd7q5s7A:S24JV2g3NrA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=LTNYd7q5s7A:S24JV2g3NrA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=LTNYd7q5s7A:S24JV2g3NrA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=LTNYd7q5s7A:S24JV2g3NrA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=LTNYd7q5s7A:S24JV2g3NrA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/LTNYd7q5s7A/ios-7.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Q9Tmp-zrkWE/Ubc26L0u91I/AAAAAAAACGI/kA89C3fyFpo/s72-c/iOS7.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/06/ios-7.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8184776389600861146</guid><pubDate>Thu, 16 May 2013 16:28:00 +0000</pubDate><atom:updated>2013-05-16T13:29:28.502-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">user controls</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>Realidad Aumentada en aplicaciones iOS con GeneXus</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-VsWo8fYJgPM/UZT0bvUzNhI/AAAAAAAACBo/pbH2MclUPoI/s1600/ArTur.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-VsWo8fYJgPM/UZT0bvUzNhI/AAAAAAAACBo/pbH2MclUPoI/s1600/ArTur.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace un tiempo, &lt;a href="https://twitter.com/gmilano"&gt;Gastón&lt;/a&gt; hablaba sobre &lt;a href="http://genexus-sd.blogspot.com/2013/03/8-reasons-why-model-driven-development.html"&gt;las ventajas del "Model Driven Development"&lt;/a&gt;, y una de las que menciona es la extensibilidad.&lt;br /&gt;
&lt;br /&gt;
Hoy sin duda esto queda demostrado, gracias a aplicaciones como &lt;a href="https://itunes.apple.com/es/app/artur-mvd/id556465581?mt=8"&gt;ArTur MVD&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
ArTur MVD es una guía turística de Montevideo para iOS y Android, desarrollada por la gente de &lt;a href="http://www.devxtend.com/"&gt;DevXtend&lt;/a&gt;. Fue premiada durante el &lt;a href="http://www.genexus.com/encuentro2011/noticias?es"&gt;XXI Encuentro GeneXus&lt;/a&gt; (año 2011), y en su momento incluía una función de reconocimiento de monumentos, para lo cual alcanzaba con tomar una foto del monumento, y la aplicación nos mostraba la información del mismo.&lt;br /&gt;
&lt;br /&gt;
Hace unos días subieron una nueva versión al App Store, que incluye la funcionalidad de realidad aumentada. Cuando uno apunta la cámara del dispositivo en una determinada dirección, muestra los restaurantes, comercios, hoteles, etc. que hay en esa dirección, dentro de un radio de 5 kilómetros.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Vq622YvRrYI/UZUIvb83UHI/AAAAAAAACB4/J9pCUPeOIzE/s1600/ArTurScreenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Vq622YvRrYI/UZUIvb83UHI/AAAAAAAACB4/J9pCUPeOIzE/s320/ArTurScreenshot.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
La aplicación está hecha con &lt;a href="http://www.genexus.com/genexus-x-evolution-2/genexus-x-evolution-2?en"&gt;GeneXus X Evolution 2&lt;/a&gt;, y la funcionalidad de realidad aumentada está provista por un user control desarrollado por la misma gente de DevXtend, que usa la información de "geolocation" de los items de un grid, la posición actual y la orientación del dispositivo, para saber que información debe mostrar.&lt;br /&gt;
&lt;br /&gt;
El control por ahora lo tienen solamente para iOS, pero están trabajando también en una versión para Android. Además, estará disponible en el Marketplace para que lo pueda utilizar cualquiera (aclaro que desconozco como será el licenciamiento, si será pago o no...).&lt;br /&gt;
&lt;br /&gt;
En la &lt;a href="http://showcase.genexus.com/app.aspx?arturmvd,en"&gt;página correspondiente del Showcase&lt;/a&gt; pueden ver un video del control en acción.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=8xRVnhEpyWo:7AI34PaZLoY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=8xRVnhEpyWo:7AI34PaZLoY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=8xRVnhEpyWo:7AI34PaZLoY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=8xRVnhEpyWo:7AI34PaZLoY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=8xRVnhEpyWo:7AI34PaZLoY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/8xRVnhEpyWo/realidad-aumentada-en-aplicaciones-ios.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-VsWo8fYJgPM/UZT0bvUzNhI/AAAAAAAACBo/pbH2MclUPoI/s72-c/ArTur.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/05/realidad-aumentada-en-aplicaciones-ios.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4185088222104567501</guid><pubDate>Mon, 22 Apr 2013 14:16:00 +0000</pubDate><atom:updated>2013-04-22T11:18:27.383-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">running</category><title>Mi primer media maratón</title><description>En el día de ayer corrí por primera vez una media maratón (21 kilómetros). Capaz que esta mal que yo lo diga, pero fue todo un logro :)&lt;br /&gt;
&lt;br /&gt;
No hace mucho que empecé a correr, menos de tres años, y la verdad si en ese momento me hubieran dicho que iba a poder correr esa distancia, no les hubiera creído.&lt;br /&gt;
&lt;br /&gt;
Hoy creo que con el entrenamiento adecuado, cualquiera puede correr la distancia que se proponga (salvo por algún impedimento médico, obviamente). Ayer por ejemplo, la edición de 10km de la carrera, la corrió un hombre con dos muletas...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
El entrenamiento&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Desde antes de empezar a prepararme para la media maratón, ya estaba usando una aplicación que se llama &lt;a href="http://runkeeper.com/"&gt;RunKeeper&lt;/a&gt;, que además de permitir registrar las corridas, tiene la opción de seguir programas de entrenamiento.&lt;br /&gt;
&lt;br /&gt;
El que elegí yo era para correr la &lt;a href="http://runkeeper.com/fitness-class/running-half-marathon/15"&gt;media maratón en menos de 2 horas y 15 minutos&lt;/a&gt;. Implicaba salir a correr entre cuatro y cinco veces por semana, con distintas distancias, velocidades, y con sesiones con cambio de ritmo.

Fueron algo más de tres meses de entrenamiento y casi 500 km recorridos, que sin duda valieron la pena.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;
La carrera&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La carrera fue ayer, como decía, a las 9 de la mañana.&lt;br /&gt;
&lt;br /&gt;
Hubo bastante gente. No la cantidad que hay en las carreras masivas de 10km, pero me sorprendió tanta gente para correr los 21km. Después viendo los resultados, llegaron a la meta más de 800 personas.&lt;br /&gt;
&lt;br /&gt;
El día estuvo muy lindo. Demasiado lindo capaz, cerca de las 11 de la mañana se hizo sentir el calor...&lt;br /&gt;
&lt;br /&gt;
Pude cumplir mi objetivo de terminar la carrera primero, y luego de hacerla en menos de 2:15' ya que puse un tiempo de &lt;a href="http://kronos.com.uy/?Q=resultado&amp;amp;M=detalleResultado&amp;amp;RID=636186&amp;amp;ID=2250&amp;amp;C=70171&amp;amp;S=2"&gt;2:09'30"&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
De todas formas venía mejor hasta el km 18, y los últimos tres fueron bastante difíciles. Así que en parte quedé con esa sensación de derrota, como cuando te empatan el partido en la hora.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Y ahora qué?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Por lo pronto ahora a descansar unos días, para darle un respiro a las rodillas.&lt;br /&gt;
&lt;br /&gt;
En la primavera correré alguna de las carreras de 10km, a ver si puedo bajar de los 55 minutos, que era el objetivo para el 2012 y no logré cumplir.&lt;br /&gt;
&lt;br /&gt;
Y después veremos... No creo que estos hayan sido los últimos 21km ;)
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fUW7ZpOdKR0:AW_Ppl65Zog:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fUW7ZpOdKR0:AW_Ppl65Zog:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fUW7ZpOdKR0:AW_Ppl65Zog:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fUW7ZpOdKR0:AW_Ppl65Zog:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fUW7ZpOdKR0:AW_Ppl65Zog:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/fUW7ZpOdKR0/mi-primer-media-maraton.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>8</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/04/mi-primer-media-maraton.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-3271675633054564336</guid><pubDate>Fri, 12 Apr 2013 00:04:00 +0000</pubDate><atom:updated>2013-04-11T21:04:00.101-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Cosas que me gustaría tener en Objective-C</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s1600/xcode_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s200/xcode_logo.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
En los últimos tiempos, el lenguaje Objective-C ha mejorado bastante, como ya hemos comentado en el blog (por ejemplo &lt;a href="http://blog.marcoscrispino.com/2012/12/objective-c-se-moderniza-subscripting.html"&gt;acá&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Pero (siempre hay un "pero"), igual hay algunas cosas que todavía se podrían mejorar o agregar al lenguaje.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Implementación default para métodos de protocolos&lt;/h4&gt;
Supongamos que tenemos un &lt;i&gt;@protocol MyProtocol&lt;/i&gt;, que define una &lt;i&gt;@property NSArray *someArray&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Cuando uso una variable que está basada en este protocolo (&lt;i&gt;id&amp;lt;MyProtocol&amp;gt; myVar&lt;/i&gt;), puedo ver cuantos elementos tiene el array escribiendo&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
[[myVar someArray] count]&lt;/tt&gt;&lt;/blockquote&gt;
Pero supongamos que esto lo hago muy seguido, entonces quiero cambiar esto, para que el protocolo ya defina la propiedad &lt;i&gt;elementCount&lt;/i&gt; para poder usarla como&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
[myVar elementCount]&lt;/tt&gt;&lt;/blockquote&gt;
¿Cuál es el problema con esto? Que si agrego la propiedad &lt;i&gt;elementCount&lt;/i&gt; al protocolo, tengo que implementarla en todas las clases que implementan el protocolo.&lt;br /&gt;
&lt;br /&gt;
Una alternativa sería tener algo así como "method templates", donde se pudiera definir la implementación del método en el protocolo mismo. Estos templates solo podrían usar otros métodos y propiedades definidos en el protocolo.&lt;br /&gt;
&lt;h4&gt;
Templates o módulos&lt;/h4&gt;
Yendo en la misma línea, hay casos en que una implementación de un método es genérica, sin importar la clase en la que esté.&lt;br /&gt;
&lt;br /&gt;
El ejemplo más claro de esto es con los "singleton". Una posible implementación es la siguiente:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
+ (instancetype)sharedInstance {&lt;br /&gt;
&amp;nbsp; static id _sharedInstance = nil;&lt;br /&gt;
&amp;nbsp; static dispatch_once_t onceToken;&lt;br /&gt;
&amp;nbsp; dispatch_once(&amp;amp;onceToken, ^{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _sharedInstance = [[self alloc] init];&lt;br /&gt;
&amp;nbsp; });&lt;br /&gt;
&amp;nbsp; return _sharedInstance;&lt;br /&gt;
}&lt;/tt&gt;&lt;/blockquote&gt;
(tomada de &lt;a href="http://nshipster.com/c-storage-classes/"&gt;NSHipster&lt;/a&gt;, un excelente blog sobre Objective-C, ya que estamos)&lt;br /&gt;
&lt;br /&gt;
Nótese que en esta implementación no se hace nunca referencia a la clase donde está definido el método. Lo único que se requiere es que tenga un método init.&lt;br /&gt;
&lt;br /&gt;
Si tuviera algo equivalente a los módulos de Ruby (&lt;a href="http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#s2"&gt;cuando se usan como "mixins"&lt;/a&gt;), podría simplemente "declarar" que una clase es un singleton, y que eso incluya la implementación del método sharedInstance.&lt;br /&gt;
&lt;h4&gt;
Generics&lt;/h4&gt;
En las APIs de Objective-C, cuando un método espera recibir un objeto genérico, declara que recibe un &lt;i&gt;id&lt;/i&gt;, que indica que puede recibir cualquier tipo de objeto.&lt;br /&gt;
&lt;br /&gt;
Esto es muy útil, y por ejemplo los arrays no controlan el tipo de objeto, por lo que podemos tener por ejemplo un número y un texto en el mismo array.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, hay veces que es útil saber de que tipo son los elementos de una colección, y forzar a que no se agreguen elementos de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Supongamos el caso que tenemos un protocolo que define una propiedad&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
@property (nonatomic, strong) NSArray *actions;&lt;/tt&gt;&lt;/blockquote&gt;
¿De qué tipo pueden ser las &lt;i&gt;actions&lt;/i&gt;? No lo sabemos, a no ser que quien escribió el protocolo haya puesto un comentario... El lenguaje me debería ayudar a que esto quede más claro.&lt;br /&gt;
&lt;h4&gt;
Boxing (y unboxing) de tipos básicos&lt;/h4&gt;
&lt;div&gt;
En Objective-C, los arrays y los diccionarios solo pueden contener objetos, por lo que si queremos guardar por ejemplo un int en un array, tenemos que hacer el "boxing"y pasarlo al array como un &lt;i&gt;NSNumber *&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Si bien no es algo complicado de hacer, por ejemplo;&lt;/div&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
int someInteger = 1;&lt;br /&gt;
NSArray *myArray = [NSArray arrayWithObject: @(someInteger) ];&lt;/tt&gt;&lt;/blockquote&gt;
podría ser el compilador el que se encargue de hacerlo...&lt;br /&gt;
&lt;h4&gt;
Map &amp;amp; Reduce&lt;/h4&gt;
&lt;div&gt;
Las funciones que tiene la API para manipular colecciones, en ciertos aspectos son bastante limitados.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, no tengo funciones para Map y Reduce, que son muy útiles. Son fáciles de implementar, pero ya podrían venir incluidas.&lt;br /&gt;
&lt;br /&gt;
Otras, por ejemplo para filtrar un array, son demasiado complicadas:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
[[someArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings) {&lt;br /&gt;&amp;nbsp;   /* filtering code goes here */&lt;br /&gt;}];&lt;/tt&gt;&lt;/blockquote&gt;
Debería poder escribir simplemente&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
[someArray filterWithBlock:^(id evaluatedObject) {&lt;br /&gt;&amp;nbsp;   /* filtering code goes here */&lt;br /&gt;}];&lt;/tt&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;h4&gt;
Conclusión&lt;/h4&gt;
Por suerte Objective-C es un lenguaje en evolución, así que tal vez podamos contar con alguna de estas cosas en el futuro...&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=AA2gJ8rE9f4:LHmUsXGRETw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=AA2gJ8rE9f4:LHmUsXGRETw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=AA2gJ8rE9f4:LHmUsXGRETw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=AA2gJ8rE9f4:LHmUsXGRETw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=AA2gJ8rE9f4:LHmUsXGRETw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/AA2gJ8rE9f4/cosas-que-me-gustaria-tener-en.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s72-c/xcode_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/04/cosas-que-me-gustaria-tener-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6880537734836631008</guid><pubDate>Sat, 06 Apr 2013 23:36:00 +0000</pubDate><atom:updated>2013-04-06T21:06:42.601-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Comandos útiles de Google Search</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-y-kEsWmDi_4/UVwa9JbwkQI/AAAAAAAACAY/5fVDWMJuajw/s1600/google-g-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-y-kEsWmDi_4/UVwa9JbwkQI/AAAAAAAACAY/5fVDWMJuajw/s1600/google-g-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Hace ya bastante tiempo que la página de búsqueda de Google dejó de ser un simple buscador de páginas web, y ha pasado a ser más una especie de aplicación de línea de comandos, que brinda información de contexto y no solo una lista de resultados.&lt;br /&gt;
&lt;br /&gt;
Lo que sigue son algunos comandos útiles que se pueden usar en Google Search. No pretende ser una lista exhaustiva, son los que conosco y uso con cierta frecuencia.&lt;br /&gt;
&lt;h4&gt;Calculadora&lt;/h4&gt;&lt;div&gt;Si en vez de ingresar un texto a buscar, ingresamos una operación aritmética como por ejemplo "&lt;a href="https://www.google.com/search?q=2%2B3&amp;amp;aq=f&amp;amp;oq=2%2B3&amp;amp;aqs=chrome.0.57j5j0l2j60j62.571j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;2+3&lt;/a&gt;", Google nos devuelve el resultado, y muestra una calculadora como para poder seguir haciendo operaciones.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;También permite usar funciones trigonométricas, logaritmos, exponenciales, factoriales, etc. Es bastante completa.&lt;/div&gt;&lt;h4&gt;Gráfica de funciones&lt;/h4&gt;&lt;div&gt;Si uno escribe una función, por ejemplo "&lt;a href="https://www.google.com/search?q=x%5E2%2B1&amp;amp;aq=f&amp;amp;oq=x%5E2%2B1&amp;amp;aqs=chrome.0.57j0l3j62l2.491j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;x^2+1&lt;/a&gt;", el resultado que obtiene es la gráfica de la misma.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;No es que use mucho esta funcionalidad, pero me hubiera servido en otro momento :)&lt;/div&gt;&lt;h4&gt;Conversión de monedas&lt;/h4&gt;&lt;div&gt;Si queremos saber algún tipo de cambio, digamos para saber cuantos dólares son 100 euros, escribimos "&lt;a href="https://www.google.com/search?q=convert+100+euros+to+dollars&amp;amp;aq=f&amp;amp;oq=convert+100+euros+to+dollars&amp;amp;aqs=chrome.0.57j0l3.514j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;convert 100 euros to dollars&lt;/a&gt;".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Funciona también para pesos uruguayos, la única dificultad es que hay que escribir el comando en inglés:&amp;nbsp;&lt;a href="https://www.google.com/search?q=convertir+100+pesos+uruguayos+a+argentinos&amp;amp;aq=0&amp;amp;oq=convertir+100+pesos+uruguayos+a+&amp;amp;aqs=chrome.1.57j0l3.8454j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8#hl=en&amp;amp;sclient=psy-ab&amp;amp;q=convert+100+uruguayan+pesos+to+dollars&amp;amp;oq=convert+100+uruguayan+pesos+to+&amp;amp;gs_l=serp.3.0.33i29i30l4.9288.13055.1.15661.19.19.0.0.0.0.292.4851.2-19.19.0...0.0...1c.1.8.psy-ab.LlxDnFXBIQA&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_cp.r_qf.&amp;amp;bvm=bv.44697112,d.eWU&amp;amp;fp=e89d73f048cc8be0&amp;amp;biw=1163&amp;amp;bih=727"&gt;convert 100 uruguayan pesos to dollars&lt;/a&gt;.&lt;/div&gt;&lt;h4&gt;Estado del tiempo&lt;/h4&gt;&lt;div&gt;También podemos consultar el estado del tiempo en algún lugar, por ejemplo preguntando "&lt;a href="https://www.google.com/search?q=weather+montevideo&amp;amp;aq=f&amp;amp;oq=weather+montevideo&amp;amp;aqs=chrome.0.57j0l3j64.587j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;weather montevideo&lt;/a&gt;", o simplemente "weather" y (a veces) Google se da cuenta en donde estamos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;El resultado muestra pronóstico por hora de la temperatura, lluvia y viento, y el pronóstico para los próximos días. Bastante completo, aunque no me puse a sacar estadísticas para ver que tan acertado es...&lt;/div&gt;&lt;h4&gt;Información sobre películas, libros y música&lt;/h4&gt;&lt;div&gt;Si buscamos por el título de una &lt;a href="https://www.google.com/search?q=the+matrix&amp;amp;aq=0&amp;amp;oq=the+matrix&amp;amp;aqs=chrome.0.0l4.2709j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;película&lt;/a&gt;, &lt;a href="https://www.google.com/search?q=game+of+thrones&amp;amp;aq=0&amp;amp;oq=game+of+thrones&amp;amp;aqs=chrome.0.0l4j62l2.2925j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;serie&lt;/a&gt;, &lt;a href="https://www.google.com/search?q=foundation+series&amp;amp;aq=0&amp;amp;oq=foundation+seri&amp;amp;aqs=chrome.0.0j57j5j0j62.3444j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8#hl=en&amp;amp;sclient=psy-ab&amp;amp;q=foundation+book&amp;amp;oq=foundation+book&amp;amp;gs_l=serp.3..0i20j0l3.2140.5302.3.5628.8.7.1.0.0.1.285.1823.2-7.7.0...0.0...1c.1.8.psy-ab.6IEGJC_nnIQ&amp;amp;pbx=1&amp;amp;bav=on.2,or.r_cp.r_qf.&amp;amp;bvm=bv.44697112,d.dmQ&amp;amp;fp=e89d73f048cc8be0&amp;amp;biw=1034&amp;amp;bih=624"&gt;libro&lt;/a&gt;, &lt;a href="https://www.google.com/search?q=abbey+road&amp;amp;aq=0&amp;amp;oq=abbey+roa&amp;amp;aqs=chrome.0.0j57j5j0.2636j0&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8"&gt;disco&lt;/a&gt;, o por autor, actor, director, etc., además de la clásica lista de resultados, muestra a la derecha de la página información sobre lo que estamos buscando.&lt;/div&gt;&lt;h4&gt;Conclusión&lt;/h4&gt;&lt;div&gt;La búsqueda de páginas web a veces es útil, pero puede ser una pérdida de tiempo si queremos encontrar algo específico. Google va por el camino de tratar de mostrar la información más relevante dada la búsqueda que estamos haciendo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;La lista de comandos que mencioné en el artículo puede resultar útil, seguramente haya otras cosas que no conozco, y seguramente se vayan agregando más comandos con el paso del tiempo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;¿Alguien sabe de otros comandos que se puedan usar en Google Search? ¿Algún otro buscador que haga este tipo de cosas?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=jP1L116ck48:IUAI2CXI7Ik:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=jP1L116ck48:IUAI2CXI7Ik:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=jP1L116ck48:IUAI2CXI7Ik:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=jP1L116ck48:IUAI2CXI7Ik:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=jP1L116ck48:IUAI2CXI7Ik:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/jP1L116ck48/comandos-utiles-de-google-search.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-y-kEsWmDi_4/UVwa9JbwkQI/AAAAAAAACAY/5fVDWMJuajw/s72-c/google-g-logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/04/comandos-utiles-de-google-search.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2168787255494039871</guid><pubDate>Thu, 14 Mar 2013 16:51:00 +0000</pubDate><atom:updated>2013-03-14T14:28:07.783-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">curiosidades</category><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Optimizaciones del compilador en Objective-C</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s1600/xcode_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s200/xcode_logo.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
Cuando se tiene un objeto que es inmutable, por ejemplo un string, es bastante útil contar con optimizaciones del compilador, para que no cree varias instancias idénticas.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, en Objective-C si hacemos&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
NSString *a = @"hola";&lt;br /&gt;NSString *b = @"hola";&lt;/tt&gt;&lt;/blockquote&gt;
el compilador se da cuenta que son referencias a la misma instancia, y crea el string &lt;i&gt;@"hola"&lt;/i&gt; una sola vez en memoria, por lo que &lt;i&gt;a&lt;/i&gt; y &lt;i&gt;b&lt;/i&gt; quedan apuntando al mismo objeto.&lt;br /&gt;
&lt;br /&gt;
Lo mismo pasa si se usan objetos de tipo NSNumber. Si tengo por ejemplo&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
NSNumber *c = @1;&lt;br /&gt;NSNumber *d = @1;&lt;/tt&gt;&lt;/blockquote&gt;
el objeto &lt;i&gt;@1&lt;/i&gt; queda una sola vez en memoria y las variables &lt;i&gt;c&lt;/i&gt; y &lt;i&gt;d&lt;/i&gt; referencian la misma instancia.&lt;br /&gt;
&lt;br /&gt;
Hasta acá no hay mucha sorpresa. Son objetos inmutables, por lo que no importa mucho que sean la misma instancia... salvo en lo que se puede ahorrar de memoria.&lt;br /&gt;
&lt;br /&gt;
Una curiosidad si se quiere, es que los constructores no siempre pueden ser optimizados. Por ejemplo&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
NSString *e = [@"h" stringByAppendingString:@"ola"];&lt;/tt&gt;&lt;/blockquote&gt;
crea una nueva instancia del string &lt;i&gt;@"hola"&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa con el método &lt;i&gt;alloc&lt;/i&gt;? En principio uno podría pensar que si se usa &lt;i&gt;alloc&lt;/i&gt;, debería devolver una nueva instancia. Esto sin embargo no es así para la clase NSNumber. El siguiente código devuelve la misma instancia que la asignada en &lt;i&gt;c&lt;/i&gt; y &lt;i&gt;d&lt;/i&gt;.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
NSNumber *f = [[NSNumber alloc] initWithInt:1];&lt;/tt&gt;&lt;/blockquote&gt;
Raro...&lt;br /&gt;
&lt;br /&gt;
Pero más raro aún, es que el método &lt;i&gt;copy&lt;/i&gt; también devuelve la misma instancia. &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
NSNumber *g = [f copy];&lt;/tt&gt;&lt;/blockquote&gt;
En este caso, ¡&lt;i&gt;c&lt;/i&gt;, &lt;i&gt;d&lt;/i&gt;, &lt;i&gt;f&lt;/i&gt; y &lt;i&gt;g&lt;/i&gt; quedan apuntando todas a la misma dirección de memoria!&lt;br /&gt;
&lt;br /&gt;
Esto no es necesariamente un bug o una feature, creo que se puede argumentar a favor y en contra de cada una de las dos opciones. Lo que sí es importante, es conocer como se comportan las herramientas que usamos.&lt;br /&gt;
&lt;br /&gt;
Una última curiosidad,&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;tt&gt;
[NSObject new]&lt;/tt&gt;&lt;/blockquote&gt;
siempre devuelve una nueva instancia, a pesar de que dos NSObject creados de esta forma son indistiguibles...&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1094792ByUk:P1SqbQ84ZFg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1094792ByUk:P1SqbQ84ZFg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1094792ByUk:P1SqbQ84ZFg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1094792ByUk:P1SqbQ84ZFg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1094792ByUk:P1SqbQ84ZFg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/1094792ByUk/optimizaciones-del-compilador-en.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s72-c/xcode_logo.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/03/optimizaciones-del-compilador-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-177327572098481816</guid><pubDate>Fri, 22 Feb 2013 22:10:00 +0000</pubDate><atom:updated>2013-02-22T20:10:00.302-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>Leyes inconstitucionales</title><description>Capaz que es un poco ingenuo de mi parte, pero ¿el parlamento no debería asegurarse que las leyes que vota sean constitucionales?&lt;br /&gt;
&lt;br /&gt;
En los últimos días hemos tenido por lo menos dos casos, con &lt;a href="http://www.elobservador.com.uy/noticia/243873/vea-sentencia-de-la-scj-sobre-inconstitucionalidad-del-icir/"&gt;el ICIR&lt;/a&gt; y &lt;a href="http://www.elobservador.com.uy/noticia/244268/la-scj-cierra-definitivamente-las-investigaciones-por-derechos-humanos/"&gt;la ley interpretativa de la ley de caducidad&lt;/a&gt;, que la Suprema Corte de Justicia declara como inconstitucionales leyes que fueron votadas y promulgadas.&lt;br /&gt;
&lt;br /&gt;
Es decir, tenemos un Parlamento con 99 diputados y 30 senadores (o por ahí...), que a su vez tienen secretarios y asistentes varios. ¿No deberían al menos tratar de que las leyes sean constitucionales? ¿Qué sentido tiene que voten leyes que no son válidas?&lt;br /&gt;
&lt;br /&gt;
¿Son tan ignorantes que ni siquiera conocen la constitución? Parece como que debería ser requisito previo para ser diputado o senador, ¿no? Aunque en la realidad esto claramente no aplica...&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=NFSIHHBClGA:o6gTJK2nI5M:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=NFSIHHBClGA:o6gTJK2nI5M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=NFSIHHBClGA:o6gTJK2nI5M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=NFSIHHBClGA:o6gTJK2nI5M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=NFSIHHBClGA:o6gTJK2nI5M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/NFSIHHBClGA/leyes-inconstitucionales.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/02/leyes-inconstitucionales.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2861032498128812516</guid><pubDate>Fri, 15 Feb 2013 12:29:00 +0000</pubDate><atom:updated>2013-02-15T10:29:05.814-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apps</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">apple</category><title>Smart App Banners en Mobile Safari</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-DSYUtJxH4Ds/UR4lsgbyiII/AAAAAAAAB-s/zC65xosuojQ/s1600/mobileSafari.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DSYUtJxH4Ds/UR4lsgbyiII/AAAAAAAAB-s/zC65xosuojQ/s1600/mobileSafari.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;
Esta no la sabía, me pareció interesante como para compartirlo.&lt;br /&gt;
&lt;br /&gt;
Aparentemente desde iOS 6, Safari tiene una funcionalidad llamada &lt;a href="https://developer.apple.com/news/index.php?id=10082012b"&gt;Smart App Banners&lt;/a&gt;, que permite que la página web muestre un banner con un link para bajar o abrir una determinada aplicación.&lt;br /&gt;
&lt;br /&gt;
Del anuncio de Apple:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;With Safari’s new Smart App Banner feature in iOS 6, you can display a banner that provides a direct link to your app on the App Store, or opens the app if the user already has it installed. Smart App Banners integrate seamlessly, have the same look and feel users know from the App Store, and are easy to implement.&lt;/i&gt;&lt;/blockquote&gt;
Agregarlo en una página web cualquiera es muy fácil. Alcanza con agregar un meta-tag en el HTML:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
&amp;lt;meta name="apple-itunes-app" content="app-id=529888450"&amp;gt;&lt;/tt&gt;&lt;/blockquote&gt;
En ejecución se ve así:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-fJGnEcA0wgg/UR4nRA5kGwI/AAAAAAAAB-4/BDKOg5YofZM/s1600/la+foto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-fJGnEcA0wgg/UR4nRA5kGwI/AAAAAAAAB-4/BDKOg5YofZM/s320/la+foto.PNG" width="212" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Agregar esto en GeneXus también es muy fácil, alcanza con poner lo siguiente en el evento Start del Web Panel:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;Form.Meta.AddItem("apple-itunes-app", "app-id=529888450")&lt;/tt&gt;&lt;/blockquote&gt;
Y por favor, si lo usan, úsenlo bien... &lt;a href="http://www.hanselman.com/blog/IdLikeToUseTheWebMyWayThankYouVeryMuchQuora.aspx"&gt;No hagan como Quora&lt;/a&gt; que bloquea el contenido de la página web para que haya que bajar la aplicación.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=OkyvbjUip4o:w5ZUQWSuRBc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=OkyvbjUip4o:w5ZUQWSuRBc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=OkyvbjUip4o:w5ZUQWSuRBc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=OkyvbjUip4o:w5ZUQWSuRBc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=OkyvbjUip4o:w5ZUQWSuRBc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/OkyvbjUip4o/smart-app-banners-en-mobile-safari.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-DSYUtJxH4Ds/UR4lsgbyiII/AAAAAAAAB-s/zC65xosuojQ/s72-c/mobileSafari.jpeg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/02/smart-app-banners-en-mobile-safari.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-1587685406790540384</guid><pubDate>Mon, 11 Feb 2013 20:59:00 +0000</pubDate><atom:updated>2013-02-11T18:59:00.529-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Objective-C: ejecución sincrónica mediante semáforos</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s1600/xcode_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s200/xcode_logo.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
En Objective-C, o para ser más precisos en iOS, la norma es que cuando una tarea lleva tiempo, la misma se ejecuta de forma asincrónica mediante el uso de &lt;i&gt;delegates&lt;/i&gt; y &lt;i&gt;call-backs&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, si queremos obtener el contenido de una página web, usamos&amp;nbsp;&lt;i&gt;NSURLConnection&lt;/i&gt;. El método &lt;i&gt;start&lt;/i&gt; de dicha clase, inicia la operación y termina inmediatamente, antes de comenzar a recibir datos. Los datos llegan a través de los métodos del protocolo&amp;nbsp;&lt;i&gt;NSURLConnectionDelegate&lt;/i&gt;, como por ejemplo,&amp;nbsp;&lt;i&gt;connection:didReceiveData:&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Esto presenta un problema para la implementación de las clases estándar de GeneXus, ya que por ejemplo cuando hacemos&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
&amp;amp;httpClient.execute('GET', 'http://www.google.com')&lt;br /&gt;
&amp;amp;status = &amp;amp;httpClient.statusCode&lt;br /&gt;
&lt;/tt&gt;&lt;/blockquote&gt;
esperamos que al volver de la llamada la variable &lt;i&gt;&amp;amp;status&lt;/i&gt; tenga la información correspondiente.&lt;br /&gt;
&lt;br /&gt;
La solución que encontramos para que la ejecución se realice de forma sincrónica, es mediante el uso de semáforos.&lt;br /&gt;
&lt;br /&gt;
Los &lt;a href="http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW24"&gt;semáforos&lt;/a&gt; son parte de una tecnología llamada &lt;a href="http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html"&gt;Grand Central Dispatch&lt;/a&gt;, que está disponible para iOS a partir de la versión 4.0.&lt;br /&gt;
&lt;br /&gt;
La forma de implementar esto es la siguiente:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;cuando se llama al método que queremos que ejecute de forma sincrónica, se crea un nuevo semáforo mediante una llamada a la función&amp;nbsp;dispatch_semaphore_create:&lt;br /&gt;&lt;blockquote&gt;
&lt;tt&gt;_loadingSemaphore = dispatch_semaphore_create(0);&lt;/tt&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;la operación asincrónica se debe iniciar en otro thread (en particular hay operaciones que necesitan ejecutarse en el &lt;i&gt;main thread&lt;/i&gt;), de forma que no haya bloqueos. En el ejemplo del HTTPClient, sería así:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;dispatch_sync(dispatch_get_main_queue(), ^{&lt;br /&gt;
&amp;nbsp;   _conn = [NSURLConnection connectionWithRequest:request delegate:self];&lt;br /&gt;
&amp;nbsp;   [_conn start];&lt;br /&gt;
});&lt;/tt&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;cuando termina la operación asincrónica, se libera el semáforo de forma que los demás métodos puedan ejecutar:&lt;br /&gt;&lt;blockquote&gt;
&lt;tt&gt;dispatch_semaphore_signal(_loadingSemaphore);&lt;/tt&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;mientras tanto, los demás métodos que necesitan que haya terminado la operación para poder ejecutar, como por ejemplo el statusCode, se bloquean hasta que termine la ejecución, luego realizan la tarea que necesitan y por último mandan un nuevo &lt;i&gt;signal&lt;/i&gt; al semáforo por si hay alguna otra tarea esperando:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;dispatch_semaphore_wait(_loadingSemaphore, DISPATCH_TIME_FOREVER);&lt;br /&gt;
block();&lt;br /&gt;
dispatch_semaphore_signal(_loadingSemaphore);&lt;/tt&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Esta forma de implementar la ejecución sincrónica tiene además una ventaja: solo espera cuando es necesario. En el ejemplo, ejecutábamos el método &lt;i&gt;execute&lt;/i&gt; e inmediatamente le pedíamos el &lt;i&gt;statusCode&lt;/i&gt;, por lo que va a quedar esperando. Pero si antes de pedir el &lt;i&gt;statusCode&lt;/i&gt; hacemos otra cosa, como por ejemplo ejecutar un procedimiento, puede ser que al terminar el procedimiento ya hayan venido los datos, y por lo tanto el &lt;i&gt;statusCode&lt;/i&gt; no espera.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=P82DwuwxcZ0:R0ChgZEWrFE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=P82DwuwxcZ0:R0ChgZEWrFE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=P82DwuwxcZ0:R0ChgZEWrFE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=P82DwuwxcZ0:R0ChgZEWrFE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=P82DwuwxcZ0:R0ChgZEWrFE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/P82DwuwxcZ0/objective-c-ejecucion-sincronica.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s72-c/xcode_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/02/objective-c-ejecucion-sincronica.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-458621360684362444</guid><pubDate>Mon, 28 Jan 2013 23:33:00 +0000</pubDate><atom:updated>2013-01-28T21:33:00.586-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tecnología</category><category domain="http://www.blogger.com/atom/ns#">apps</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>Maps With Me: mapas sin conexión para dispositivos móviles</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Fc_-2giMsvE/UQaYIKfv3YI/AAAAAAAAB-c/FLeMqexA_aE/s1600/MapsWithMe.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://4.bp.blogspot.com/-Fc_-2giMsvE/UQaYIKfv3YI/AAAAAAAAB-c/FLeMqexA_aE/s200/MapsWithMe.jpg" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace poco estuve de viaje, y por lo tanto sin conexión a internet en el celular. Algo que hasta hace poco era la norma, usar mapas en papel, ahora me resulta bastante incómodo: es difícil ubicarse, en general se precisa más de un mapa (ciudad y rutas), es más complicado de manipuar, etc.&lt;br /&gt;
&lt;br /&gt;
Es el problema de depender de la tecnología: uno se acustrumbra demasiado fácil :)&lt;br /&gt;
&lt;br /&gt;
Por suerte para iOS (y también Android) existe una aplicación que tiene mapas de todos los países que se bajan y quedan locales en el teléfono, sin nececidad de conectarse a internet (solo se precisa conectarse una vez para bajarlos). Además como el GPS funciona aunque no tenga conexión a la red celular, tengo toda la funcionalidad que necesito.&lt;br /&gt;
&lt;br /&gt;
La aplicación se llama &lt;a href="http://www.mapswithme.com/"&gt;Maps With Me&lt;/a&gt;, y si bien tiene una versión paga (cuesta U$S4.99), la versión grátis es bastante completa y se pueden usar los mapas sin restricciones. La versión paga agrega funcionalidad que puede resultar útil pero no es imprescindible: búsquedas y marcadores son las que me parecieron más necesarias.&lt;br /&gt;
&lt;br /&gt;
Los mapas por lo que vi están basados en &lt;a href="http://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt; y son muy completos. Tiene mapas de ciudades y también de rutas, en algunos casos como por ejemplo en Montevideo, hasta con los números de puerta.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=j_5G5hjRbqk:EhvMT7E3Fv8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=j_5G5hjRbqk:EhvMT7E3Fv8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=j_5G5hjRbqk:EhvMT7E3Fv8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=j_5G5hjRbqk:EhvMT7E3Fv8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=j_5G5hjRbqk:EhvMT7E3Fv8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/j_5G5hjRbqk/maps-with-me-mapas-sin-conexion-para.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Fc_-2giMsvE/UQaYIKfv3YI/AAAAAAAAB-c/FLeMqexA_aE/s72-c/MapsWithMe.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/01/maps-with-me-mapas-sin-conexion-para.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4599389537145106700</guid><pubDate>Thu, 03 Jan 2013 18:58:00 +0000</pubDate><atom:updated>2013-01-03T16:58:42.706-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tecnología</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>Construir tus propios "Google Glasses"</title><description>No, no es que en el 2013 me voy a dedicar al hardware, ni les voy a enseñar como hacer sus propios "Google Glasses", pero vi esta nota en Lifehacker que me pareció interesante:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;a href="http://lifehacker.com/5972691/build-your-own-google-glass+style-wearable-computer"&gt;Build Your Own Google Glass-Style Wearable Computer&lt;/a&gt;&lt;/blockquote&gt;
El autor del artículo original (al que refiere la nota en Lifehacker) cuenta como se hizo unos lentes sobre los que proyecta una pantalla, con partes que compró en eBay.&lt;br /&gt;
&lt;br /&gt;
Lo interesante del caso es que si bien Google parece ser el único que está desarrollando de forma seria esta tecnología, si alguien lo puede hacer por sus propios medios, puede ser que aparezca alguna empresa nueva (startup) que se dedique a fabricar estos tipos de aparatos.&lt;br /&gt;
&lt;br /&gt;
No es una tarea fácil, porque además del hardware se necesita desarrollar el software que lo acompañe, pero Google no planea liberar el producto antes de 2014, y acceder a un prototipo (que se supone va a ser este año) cuesta 1.500 dólares.&lt;br /&gt;
&lt;br /&gt;
Quien sabe, a lo mejor alguien se anima a competirle a Google. Sería interesante...&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=m9IEb6gc47Q:gTIcwSwQRp8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=m9IEb6gc47Q:gTIcwSwQRp8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=m9IEb6gc47Q:gTIcwSwQRp8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=m9IEb6gc47Q:gTIcwSwQRp8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=m9IEb6gc47Q:gTIcwSwQRp8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/m9IEb6gc47Q/construir-tus-propios-google-glasses.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2013/01/construir-tus-propios-google-glasses.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-396161737446573628</guid><pubDate>Wed, 12 Dec 2012 13:28:00 +0000</pubDate><atom:updated>2012-12-12T11:28:28.171-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Objective-C se moderniza: subscripting</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s1600/xcode_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s200/xcode_logo.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
Objective-C es un lenguaje bastante distinto en su sintaxis a otros lenguajes de programación como ser C#, Java o Ruby. Como tal, es un lenguaje que a primer golpe de vista parece dificil de entender.&lt;br /&gt;
&lt;br /&gt;
Además, es un lenguaje que por sus características, es más "verbose" que los demás, y esto a su vez puede hacer que parezca que hay que escribir mucho código.&lt;br /&gt;
&lt;br /&gt;
Esta última característica no es siempre mala. Por ejemplo, en Java (o cualquier otro lenguaje que no incluya los nombres de los parámetros en el nombre del método), si uno no conoce la API en detalle, y ve este código:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
String result = "some sample string".replace( 'a', 's' );&lt;/tt&gt;&lt;/blockquote&gt;
puede no quedarle claro si se va a remplazar la 'a' por la 's' o la 's' por la 'a'. En Objective-C, esto se escribe así:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;NSString *result = [@"some sample string" stringByReplacingOccurrencesOfString:@"a" withString:@"s"];&lt;/tt&gt;&lt;/blockquote&gt;
Es verdad que es mucho más código, pero el mismo se entiende sin necesidad de conocer la API ni de ir a la documentación.&lt;br /&gt;
&lt;br /&gt;
Nota: es un ejemplo "tonto", pero se complica si se tienen funciones con varios parámetros.&lt;br /&gt;
&lt;br /&gt;
Sin embargo, hay casos en que tanto código puede resultar innecesario. Por ejemplo, cuando se quiere acceder a un elemento de un array:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
id item = [someArray objectAtIndex:index];&lt;/tt&gt;&lt;/blockquote&gt;
o peor, cuando se quiere almacenar un elemento en un array (mutable):&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
[someMutableArray insertObject:item atIndex:index];&lt;/tt&gt;&lt;/blockquote&gt;
Por suerte, Objective-C es un lenguaje en evolución, y hay varias cosas que están cambiando. Ya hablamos de &lt;a href="http://blog.marcoscrispino.com/2012/07/automatic-reference-counting-en.html"&gt;Automatic Reference Counting&lt;/a&gt; y de &lt;a href="http://blog.marcoscrispino.com/2011/02/blocks-en-objective-c-ios-4.html"&gt;Blocks&lt;/a&gt;, funcionalidades que se agregaron recientemente al lenguaje/compilador, pero también por ejemplo literales para arrays, diccionarios o números (de lo que hablaré en algún otro momento).&lt;br /&gt;
&lt;br /&gt;
A partir de Xcode 4.4, el acceso a los elementos de un array, tanto para leer como para modificar, se puede hacer de forma más concisa:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
id item = someArray[index];&lt;br /&gt;
someMutableArray[index] = item;&lt;/tt&gt;&lt;/blockquote&gt;
Esto también aplica para los diccionarios, que se puede acceder por clave por ejemplo con:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
id item = someDictionary[key];&lt;br /&gt;
someMutableDictionary[key] = item;&lt;/tt&gt;&lt;/blockquote&gt;
Pueden ver más información en la &lt;a href="http://clang.llvm.org/docs/ObjectiveCLiterals.html"&gt;documentación del LLVM&lt;/a&gt; al respecto.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=u7wJEiaAV_g:bbSMypeLd78:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=u7wJEiaAV_g:bbSMypeLd78:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=u7wJEiaAV_g:bbSMypeLd78:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=u7wJEiaAV_g:bbSMypeLd78:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=u7wJEiaAV_g:bbSMypeLd78:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/u7wJEiaAV_g/objective-c-se-moderniza-subscripting.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s72-c/xcode_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/12/objective-c-se-moderniza-subscripting.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5689473708138439466</guid><pubDate>Mon, 03 Dec 2012 22:29:00 +0000</pubDate><atom:updated>2012-12-03T20:29:00.559-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tecnología</category><category domain="http://www.blogger.com/atom/ns#">ted</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>Los robots nos van a dejar sin trabajo?</title><description>Estuve viendo esta charla de TED que me pareció interesante, y la iba a "tuitear" pero no estoy del todo de acuerdo con las conclusiones, así que me pareció mejor comentarla acá...&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" mozallowfullscreen="mozallowfullscreen" scrolling="no" src="http://embed.ted.com/talks/andrew_mcafee_are_droids_taking_our_jobs.html" webkitallowfullscreen="webkitallowfullscreen" width="560"&gt;&lt;/iframe&gt;

&lt;br /&gt;
En la charla, Andrew McAfee se hace esta pregunta, y llega a la conclusión de que sí, en gran medida vamos a ser reemplazados por robots.&lt;br /&gt;
&lt;br /&gt;
Uno de los ejemplos que pone también me parece interesante. Dice que en Estados Unidos, hay más de 3 millones de camioneros, que potencialmente van a perder el trabajo cuando se perfeccionen los vehículos autónomos. No se cuanto dará el número si se le suman los taxistas, repartidores, conductores a ambulancias, etc.&lt;br /&gt;
&lt;br /&gt;
Es verdad que ahora puede parecer ciencia ficción, pero la tecnología va a llegar en 5, 10 o 15 años, y a las empresas les va a servir más que contratar seres humanos, porque va a ser mucho más barato.&lt;br /&gt;
&lt;br /&gt;
McAfee dice ser optimista, que a pesar de que los robots nos van a dejar sin trabajo, la tecnología va a resolver los problemas, y que nosotros vamos a estar más libres para hacer otras cosas.&lt;br /&gt;
&lt;br /&gt;
Yo también soy optimista con respecto a la tecnología, pero en el largo plazo. Creo que si la perdida de trabajo se da de golpe van a haber crisis muy importantes, que no van a ser despreciables como parece dar a entender el autor de la charla.&lt;br /&gt;
&lt;br /&gt;
Lo que una cosa sí estamos de acuerdo: &lt;i&gt;we ain't seen nothing yet&lt;/i&gt;...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1PDbMVJYWHk:Q7UXVNSuxg0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1PDbMVJYWHk:Q7UXVNSuxg0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1PDbMVJYWHk:Q7UXVNSuxg0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=1PDbMVJYWHk:Q7UXVNSuxg0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=1PDbMVJYWHk:Q7UXVNSuxg0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/1PDbMVJYWHk/los-robots-nos-van-dejar-sin-trabajo.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>4</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/12/los-robots-nos-van-dejar-sin-trabajo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-3844199031864179133</guid><pubDate>Thu, 01 Nov 2012 22:24:00 +0000</pubDate><atom:updated>2012-11-01T20:24:00.844-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">open source</category><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">subversion</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">mac_os_x</category><title>Script Bash para sincronizar cambios entre repositorios SVN</title><description>Creo que es algo bastente común, cuando se está trabajando con distintas versiones del mismo producto, tener que sincronizar cambios de una versión a otra.&lt;br /&gt;
&lt;br /&gt;
En particular en Artech tenemos el código en un repositorio SVN, y en este momento tengo cuatro versiones del cliente de iOS en las que estoy trabajando:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;la versión prácticamente cerrada del Upgrade 2 de la Evolution 2&lt;/li&gt;
&lt;li&gt;la rama de upgrades (Upgrade 3 y posteriores) de la Evolution 2&lt;/li&gt;
&lt;li&gt;la versión oficial de Tilo (nombre código de la próxima versión de GeneXus)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;una versión inestable de Tilo donde estoy haciendo cambios que no quiero hacer commit porque están "atados con alambre"&lt;/li&gt;
&lt;/ul&gt;
Llevar los cambios de una versión a otra puede ser bastante complicado, si se trata de un fuente que tiene cambios en más de una versión. Es un proceso bastante manual.&lt;br /&gt;
&lt;br /&gt;
Para facilitar este proceso hice un script Bash que se fija los cambios en la versión de origen y muestra el comparador (File Merge, viene con Xcode) para los archivos modificados, o copia directamente los archivos que son nuevos.&lt;br /&gt;
&lt;br /&gt;
Estoy en fase de beta-test... para las primeras comparaciones que hice me funcionó.&lt;br /&gt;
&lt;br /&gt;
Si a alguien le sirve, &lt;a href="https://gist.github.com/3995062"&gt;quedó disponible en GitHub&lt;/a&gt;. Lo único que hay que cambiar es la función pathForName, el mapeo entre los nombres de las versiones y los directorios.&lt;br /&gt;
&lt;br /&gt;
Aclaro que no soy experto en Bash ni mucho menos, así que seguramente haya muchas mejoras para hacerle. Cualquier aporte es bienvenido.&lt;br /&gt;
&lt;br /&gt;
Por último, repetir que no está muy probado, así que quien lo quiera usar, hágalo bajo su propio riesgo. El soporte que le de dependerá del tiempo que pueda dedicarle. En principio, los cambios que le haga van a ser para poder usarlo yo de forma razonable en el día a día.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;script src="https://gist.github.com/3995062.js"&gt; &lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-EVshkc_Bl4:5BcM41RnhgY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-EVshkc_Bl4:5BcM41RnhgY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-EVshkc_Bl4:5BcM41RnhgY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-EVshkc_Bl4:5BcM41RnhgY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-EVshkc_Bl4:5BcM41RnhgY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/-EVshkc_Bl4/script-bash-para-sincronizar-cambios.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>8</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/11/script-bash-para-sincronizar-cambios.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-1069068022363383723</guid><pubDate>Thu, 04 Oct 2012 15:59:00 +0000</pubDate><atom:updated>2012-10-04T12:59:19.477-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">genexus</category><category domain="http://www.blogger.com/atom/ns#">eventos</category><title>Encuentro #GX22</title><description>&lt;a href="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" /&gt;&lt;/a&gt;
Los pasados días, del 1 al 3 de octubre, se llevó a cabo como todos los años el Encuentro GeneXus, esta vez en su edición número 22.&lt;br /&gt;
&lt;br /&gt;
Este año no me tocó dar charla, así que fue más tranquilo :)&lt;br /&gt;
&lt;br /&gt;
Como siempre un lujo la organización. Viéndolo desde adentro se ve que hay mucha gente que trabaja mucho para que todo funcione y salga como tiene que salir, así que mis felicitaciones a todos los involucrados.&lt;br /&gt;
&lt;br /&gt;
Pero vamos a las charlas...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Lunes&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GeneXus y el contexto tecnológico&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En su charla sobre GeneXus, Nicolás Jodal contó algunas de las cosas que tenemos en la Evolution 2, contó sobre las aplicaciones que (conocemos que) se hicieron con el generador de Smart Devices, y que sumadas tienen más de 250.000 descargas de las respectivas tiendas de aplicaciones.&lt;br /&gt;
&lt;br /&gt;
Luego contó alguna cosa de lo que vamos a tener en GeneXus Tilo, entre ellas el generador Windows 8. Para esta parte de la charla invitó a Eduardo Mangarelli de Microsoft que mostró una tableta con Windows 8 y algunas aplicaciones, y luego a Alejandro Silva del equipo de desarrollo que mostró las cosas que se pueden hacer con el generador para esta plataforma.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GeneXus X Evolution 2&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Armin Bachman y Franklin Buitron presentaron la versión Evolution 2 de GeneXus, que se liberó el pasado mes de marzo, y contaron varias de las funcionalidades y ventajas que tiene.&lt;br /&gt;
&lt;br /&gt;
Fue un repaso completo de las mejoras de la versión, y por lo tanto no dio para profundizar en cada tema. La ventaja que al ser una de las primeras charlas del evento, daba la posibilidad al que le interesara de ir a la charla correspondiente a enterarse en más detalle de cada tema.&lt;br /&gt;
&lt;br /&gt;
Quedé contento que en la parte que presentó Franklin usó de ejemplo la aplicación de &lt;a href="http://blog.marcoscrispino.com/2012/06/equipos-applicacion-iphone-y-android.html"&gt;Equipos&lt;/a&gt; :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Bienvenido a la Comunidad&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En la charla sobre comunidad, Gabriel Icasuriaga contó sobre los recursos que tenemos disponibles los desarrolladores GeneXus: training, wiki, foros, etc., y contó sobre dos casos de personas que usaron estos recursos para lograr aprender GeneXus y mejorar en el uso de la herramienta.&lt;br /&gt;
&lt;br /&gt;
Además presentaron su experiencia personal Sebastián del Río y Matías Preciozzi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Migrando KB Grandes: Protegiendo los activos más valiosos para empresas de software&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Enrique Almeida contó su experiencia en migraciones de KBs grandes, en este caso de GeneXus 9.0 a la Evolution 2, pero dando tips y presentando una metodología que creo sirven como base para cualquier migración.&lt;br /&gt;
&lt;br /&gt;
Hubo mucha gente en la sala, se ve que es un tema que interesa a la comunidad.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Panel de tecnología: Amazon, Google y Microsoft&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Fui a esta charla pensando que se podía armar un debate interesante, pero me encontré con que estaban todos de acuerdo en todo...&lt;br /&gt;
&lt;br /&gt;
Lo que esperaba era que representantes de tres empresas que están en competencia directa y en varios frentes, plantearan una discusión con más discrepancias.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Generación automática de test: probando su aplicación con un solo clic&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Me pareció espectacular la funcionalidad de GXTest que presentó Sebastián Grattarola en esta charla, que permite generar de forma automática todos los tests básicos (altas, bajas, modificaciones, búsquedas) de los objetos generados por el pattern WorkWith.&lt;br /&gt;
&lt;br /&gt;
Por lo que dijo, hasta el 80% de los casos de prueba se pueden generar de esta forma, pero además para el 20% restante, se pueden utilizar los casos generados como bloques básicos de construcción para hacer cosas más complejas.&lt;br /&gt;
&lt;br /&gt;
Además tienen planes de soportar todos los patterns: WorkWithPlus, K2B y PXTools.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Aplicaciones offline para Smart Devices +&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Offline Smart Device Apps, estado del arte con GeneXus y casos +&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Café con Offline Smart Device Apps&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El lunes de tarde hubo tres charlas relacionadas con el tema de aplicaciones offline para Smart Devices (aplicaciones que fucionan ocasionalmente o completamente desconectadas).&lt;br /&gt;
&lt;br /&gt;
Gustavo Proto hizo una presentación teórica del tema con los escenarios que va a resolver esta tecnología.&lt;br /&gt;
&lt;br /&gt;
En la siguiente charla, Pablo Mazzilli comentó sobre los proyectos y clientes que están en proceso de alpha-test de la funcionalidad, y mostró un ejemplo funcionando en Android con sincronización de datos mediantes procedimientos REST.&lt;br /&gt;
&lt;br /&gt;
Le faltó mostrar el ejemplo en iOS, pero la media hora que tenía para la charla quedaba corta.&lt;br /&gt;
&lt;br /&gt;
El "café con" estuvo interesante, hubo varios planteos y discusiones. Me resulta interesante el formato de estas charlas...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Martes&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Diseño y Desarrollo: en busca de la integración&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Estuvo muy interesante la charla de Lucía Guedes y Alejandro Cimas donde contaron como se hace el diseño de la "user experience" de la aplicación, antes de empezar con el desarrollo.&lt;br /&gt;
&lt;br /&gt;
Creo que es el camino correcto para desarrollar aplicaciones para Smart Devices: hacer el diseño primero en papel, incluyendo a la gente de desarrollo y de diseño, e iterar en esta etapa hasta lograr algo que convenza a todos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¡Listo! Tengo el diseño... ¿cómo sigo?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Esta charla fue la continuación de la anterior, donde Fabián Bonilla contó como integrar el diseño de la charla anterior a la aplicación GeneXus.&lt;br /&gt;
&lt;br /&gt;
Si alguien está pensando en hacer una aplicación SD y no tiene experiencia en el tema, le recomiendo estas dos charlas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sabemos cómo hacerlo y ¿para qué?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ana Berta contó sobre la experiencia del equipo de desarrollo de GeneXus, en lo que se dio en llamar el "Challenge Developer Edition".&lt;br /&gt;
&lt;br /&gt;
Para los que no conocen, esta fue una competencia de dos semanas donde los integrantes del equipo de desarrollo desarrollamos varias aplicaciones para Smart Devices con GeneXus.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Desarrollo móvil – Mi experiencia personal&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ignacio Roqueta contó su experiencia en el desarrollo de aplicaciones para Smart Devices con GeneXus, y dio algunos consejos y datos acerca de la publicación de las mismas, principalmente en el AppStore de iOS.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Una década de videojuegos uruguayos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La charla de Gonzalo Frasca de este año se centró en la historia (bastante rica, por cierto) del desarrollo de juegos en Uruguay.&lt;br /&gt;
&lt;br /&gt;
Estuvo divertida, fue casi un "stand up", sin PPTs y con varios chistes...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Nuestra experiencia en la AppStore&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pablo Realini de Iron Game Studio contó cual fue su experiencia en la AppStore con el exitoso juego Kingdom Rush.&lt;br /&gt;
&lt;br /&gt;
Es muy interesante conocer como fue el proceso y ver cuales fueron las distintas etapas que pasaron en cuanto a monetización de la aplicación.&lt;br /&gt;
&lt;br /&gt;
En resumen, la mejor forma de ganar plata con una aplicación parece ser mediante "In-App Purchase"... que tendremos disponible en GeneXus a partir del Upgrade 2 de la versión Evolution 2.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Todo lo que se puede hacer utilizando el generador para Smart Devices&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Armando Cardozo contó sobre las aplicaciones que están haciendo en Simplifica con el generador de Smart Devices y también las extensiones que están desarrollando para este generador.&lt;br /&gt;
&lt;br /&gt;
En particular, hubo dos cosas que hicieron que pueden ser muy útiles: el objeto externo para imprimir usando bluetooth en Android, y el user control que permite firmar en el dispositivo y captura la imagen.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cara a Cara SD Generators&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Obviamente fui a esta charla... pero estuve del otro lado.&lt;br /&gt;
&lt;br /&gt;
No me gusta demasiado el formato de los "cara a cara". Hubo varias preguntas que respondimos (eso espero...), pero es un formato de "charla" donde es difícil que la gente se anime a preguntar. Me gusta más el formato de los "café con"&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Miércoles&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Charla abierta con el equipo de desarrollo&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El miércoles arrancamos temprano con la charla con el equipo de desarrollo. Hubo varias preguntas y alguna sugerencia interesante.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tilo Overview&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Gastón Milano contó sobre las cosas que estamos trabajando para la versión Tilo, en un repaso rápido por varios de los temas.&lt;br /&gt;
&lt;br /&gt;
Media hora es poco para este tipo de charlas, pero igual que en la de Evolution 2, había oportunidad de ir a las que le seguían para ver en más detalle alguna de estas funcionalidades.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Café con Proyectos SD&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Vino mucha gente al café con proyectos de Smart Devices, tanta que no alcanzaron las sillas...&lt;br /&gt;
&lt;br /&gt;
La gente que ya tiene aplicaciones liberadas contó un poco las cosas que estuvieron trabajando, y después hubo tiempo para varias preguntas.&lt;br /&gt;
&lt;br /&gt;
Aprovechamos que después de la charla había un "break" de 30 minutos y extendimos la charla, porque media hora nos hubiera quedado corta.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ZetaCuentas para todos y todas … las plataformas&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Quería ver en que había estado trabajando la gente de ZetaCuentas, porque había visto alguna versión de la aplicación para iOS.&lt;br /&gt;
&lt;br /&gt;
Realmente la aplicación está disponible para todas las plataformas: web, web mobile (ambas con WorkWithPlus), y ahora están por liberar versiones para Android e iOS.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GeneXus Server Evolution 2: desarrollo profesional, eficiente y bajo control&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
José Lamas habló principalmente sobre buenas prácticas y metodología, enfocándose en como GXServer ayuda en ese sentido a quienes trabajan con GeneXus.&lt;br /&gt;
&lt;br /&gt;
Creo que vale la pena verla aunque no usen el producto. Las buenas prácticas de las que habla aplican prácticamente a cualquier escenario de desarrollo de software.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GeneXus Tilo: Una nueva experiencia de usuario en aplicaciones web&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Nicolás Cardelino mostró las cosas en las que está trabajando el equipo de los generadores web para la versión Tilo.&lt;br /&gt;
&lt;br /&gt;
En esta versión se van a hacer varias mejoras en la forma en que se generan las aplicaciones web, que facilitan el desarrollo, mejoran la experiencia de usuario y también el rendimiento de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
Entre los cambios que se vienen, hay modificaciones en como se disparan los eventos en web, pero no se preocupen, porque hay una propiedad para mantener la compatibilidad en las KBs migradas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Potenciando nuestras aplicaciones con la nube&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Daniel Monza contó su experiencia con la nube de Amazon, y varios de los recursos que utilizó para desarrollar su aplicación.&lt;br /&gt;
&lt;br /&gt;
Estuvo interesante, hay mucha cosa para probar de Amazon que puede servir, creo que para poner una aplicación en producción vale la pena dedicarle un rato a enterarse que cosas se pueden usar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Entrevista a los creadores de Kingdom Rush&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Muy buena la entrevista, de nuevo, es interesante conocer cual fue el proceso que los llevó a tener su juego en el número 2 del AppStore de iPad.&lt;br /&gt;
&lt;br /&gt;
Lo único malo fue que faltó la pregunta más interesante: ¿cuánta plata hicieron con el juego? :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Industrias creativas: creando lo imposible&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
No lo conocía a Carlos Argüello, un nicaragüense criado en Guatemala que ha trabajado en la parte de efectos especiales en varias películas de Hollywood.&lt;br /&gt;
&lt;br /&gt;
Ahora se dedica a hacer producciones desde varios países de latinoamérica, donde capacita jóvenes para que puedan competir en una industria que en principio es difícil de entrar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cierre del evento&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como siempre la charla deportiva de Nicolás Jodal fue muy interesante. Es difícil de resumir, así que si no la vieron, háganlo...&lt;br /&gt;
&lt;br /&gt;
Por último Breogán Gonda habló sobre la guerra de patentes, sobre educación, y en un final muy emotivo nombró a Jodal como nuevo presidente de Artech, y anunció que va a dedicarse a lo que a él le gusta: la investigación.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como siempre un muy buen evento, con un excelente nivel de charlas y oradores, donde se pudieron ver las cosas nuevas de la industria, de GeneXus, y en particular algo que me interesaba mucho, ver las cosas que se están haciendo con el generador de Smart Devices.&lt;br /&gt;
&lt;br /&gt;
Me quedaron varias charlas por ver, que iré viendo en estos días &lt;a href="http://www.genexus.com/encuentro2012/xxii-encuentro-genexus--programa?es"&gt;en el sitio del encuentro&lt;/a&gt;. Si tienen alguna para recomendar, es bienvenido el dato :)&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Ljg0xG7QuI:41SqdHgyOoM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Ljg0xG7QuI:41SqdHgyOoM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Ljg0xG7QuI:41SqdHgyOoM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Ljg0xG7QuI:41SqdHgyOoM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Ljg0xG7QuI:41SqdHgyOoM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/-Ljg0xG7QuI/encuentro-gx22.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s72-c/GXLogo.gif" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/10/encuentro-gx22.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-3376886788010621547</guid><pubDate>Tue, 25 Sep 2012 23:55:00 +0000</pubDate><atom:updated>2012-09-25T20:55:00.045-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">celulares</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>¿Qué pasa cuando los celulares alcancen a los notebooks?</title><description>En el 2008, uno de los mejores celulares en cuanto a características era sin duda el &lt;a href="http://www.gsmarena.com/apple_iphone_3g-2424.php"&gt;iPhone 3G&lt;/a&gt;&lt;sup&gt;[1]&lt;/sup&gt;, que tenía:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;CPU:&amp;nbsp;single core, 412MHz&lt;/li&gt;
&lt;li&gt;RAM: 128MB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
El iPhone 5 que salió hace unos días, tiene:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;CPU: dual core, 1.2GHz&lt;/li&gt;
&lt;li&gt;RAM: 1GB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Eso da un factor de mejora de 3x en el procesador y de 8x en la memoria.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Sin embargo, el &lt;a href="http://www.gsmarena.com/apple_iphone_5-4910.php"&gt;iPhone 5&lt;/a&gt; a pesar de que (dicen que) &lt;a href="http://www.pcmag.com/article2/0,2817,2410034,00.asp"&gt;es el teléfono más rápido en el mercado&lt;/a&gt;, no es el que tiene mejor especificación técnica.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El &lt;a href="http://www.gsmarena.com/lg_optimus_g_e973-4941.php"&gt;LG Optimus G&lt;/a&gt;, que se espera que salga en los próximos días, tiene las siguientes características:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;CPU: quad core, 1.5GHz&lt;/li&gt;
&lt;li&gt;RAM: 2GB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Eso representa una mejora de 4x en el procesador con respecto al iPhone 3G de hace 4 años, y una mejora de 16x en la memoria.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Esto es en cuanto a celulares. Pero, ¿qué ha pasado mientras tanto con los notebooks?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Buscando en Google por "best notebooks 2008" o "best notebooks&amp;nbsp;2012" aparecen varios sitios con reseñas de los mejores en cada año, y entre los primeros siempre aparecen las MacBooks correspondientes a cada uno de los años&lt;sup&gt;[2]&lt;sup&gt;&lt;/sup&gt;&lt;/sup&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Por ejemplo, la &lt;a href="http://support.apple.com/kb/SP5"&gt;MacBook Pro de 2008&lt;/a&gt;, tenía:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;CPU: dual core, 2.1 o 2.4GHz&lt;/li&gt;
&lt;li&gt;RAM: 1 o 2GB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
La &lt;a href="http://www.apple.com/macbook-pro/specs/"&gt;MacBook Retina de 2012&lt;/a&gt;, tiene:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;CPU: quad core, 2.3 o 2.6GHz&lt;/li&gt;
&lt;li&gt;RAM: 8GB&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Comparando las versiones más potentes de ambos años, nos da que la velocidad del procesador no cambia significativamente, y la memoria se multiplica por 4x.&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Todo parece indicar que los celulares van a seguir mejorando rápidamente, mientras que los notebooks están prácticamente estancados. Hace unos días &lt;a href="http://www.codinghorror.com/blog/2012/09/the-last-pc-laptop.html"&gt;Coding Horror&lt;/a&gt; comentaba algo relacionado, y se plantea si el notebook que tiene ahora es el último que va a comprar...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Entonces lo que decía en el título...&amp;nbsp;¿Qué pasa cuando los celulares alcancen a los notebooks?&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
&lt;span style="font-size: x-small;"&gt;[1] Seguramente hubiera alguno con mejor especificación técnica, lo pueden poner en los comentarios :)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;[2] Detractores de Apple: es un ejemplo, pero elijan la marca que quieran y les va a dar más o menos lo mismo...&lt;/span&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ioviNixRu8w:4SDIs2BjlbM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ioviNixRu8w:4SDIs2BjlbM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ioviNixRu8w:4SDIs2BjlbM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ioviNixRu8w:4SDIs2BjlbM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ioviNixRu8w:4SDIs2BjlbM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/ioviNixRu8w/que-pasa-cuando-los-celulares-alcancen.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>5</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/09/que-pasa-cuando-los-celulares-alcancen.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8170052502046788667</guid><pubDate>Fri, 14 Sep 2012 23:41:00 +0000</pubDate><atom:updated>2012-09-14T20:41:27.612-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">internet</category><category domain="http://www.blogger.com/atom/ns#">educación</category><title>Educación on-line</title><description>En &lt;a href="http://blog.marcoscrispino.com/2012/09/la-educacion-prohibida.html"&gt;la última nota que hablaba sobre el documental La Educación Prohibida&lt;/a&gt;, decía que pienso que en el siglo XXI tiene que haber mejores formas de acceder a la educación que la escuela tradicional.&lt;br /&gt;
&lt;br /&gt;
Básicamente me refiero al mundo de posibilidades (literalmente) que se abren con Internet, y en particular quiero mencionar tres servicios gratuitos de excelente calidad que están disponibles en la red para el que los quiera usar.&lt;br /&gt;
&lt;br /&gt;
Lo bueno de acceder a distintos servicios de educación on-line, es que uno puede hacer uso de ellos en cualquier momento, puede aprender lo que tenga ganas en el momento que quiera, y no solo durante la etapa escolar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Este sitio nace por el 2006, fundado por &lt;a href="http://en.wikipedia.org/wiki/Salman_Khan_(educator)"&gt;Salman Khan&lt;/a&gt;, a partir de unos videos en YouTube que había filmado para explicarle temas de álgebra a sus primos...&lt;br /&gt;
&lt;br /&gt;
Actualmente tiene más de 3.300 videos, pero no solo eso, tiene además ejercicios interactivos, y la posibilidad de tener tutores o docentes que guíen a sus estudiantes por los distintos temas.&lt;br /&gt;
&lt;br /&gt;
Pueden ver la charla de TED &lt;a href="http://www.ted.com/talks/salman_khan_let_s_use_video_to_reinvent_education.html"&gt;Let's use video to reinvent education&lt;/a&gt;, altamente recomendable.&lt;br /&gt;
&lt;br /&gt;
Hace no mucho, el plan &lt;a href="http://twitter.com/mbrechner/status/238029568945053696"&gt;Ceibal incorporó los videos de Khan Academy en español&lt;/a&gt;, una muy buena iniciativa.&lt;br /&gt;
&lt;br /&gt;
Si tienen niños en edad escolar, creo que es un recurso indispensable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="http://duolingo.com/"&gt;Duolingo&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Duolingo es un sitio para aprender idiomas, también de forma gratuita, y que también &lt;a href="http://www.ted.com/talks/luis_von_ahn_massive_scale_online_collaboration.html"&gt;vi por primera vez en una charla de TED&lt;/a&gt;, muy divertida además.&lt;br /&gt;
&lt;br /&gt;
Tienen un objetivo bastante modesto, además de enseñar idiomas: traducir todo el contenido de Internet.&lt;br /&gt;
&lt;br /&gt;
No he tenido demasiado tiempo para dedicarle, pero por lo que llegué a ver está bueno.&lt;br /&gt;
&lt;br /&gt;
Si alguien tiene ganas de aprender alguno de los idiomas que ya tienen (no son muchos por ahora, pero han ido ampliando de a poco), lo puede probar y después me cuenta como le fue :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://www.coursera.org/"&gt;Coursera&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Coursera es un sitio que brinda cursos de nivel universitario también de forma gratuita. A diferencia de los dos anteriores, los cursos tienen una fecha de comienzo y de fin, y tienen entregables además de las clases, es decir, uno debe hacer ejercicios y mandarlos antes de una determinada fecha.&lt;br /&gt;
&lt;br /&gt;
Las universidades que brindan los cursos son de primer nivel, como por ejemplo Princeton o Stanford.&lt;br /&gt;
&lt;br /&gt;
Adivinarán que llegué a este sitio también a partir de &lt;a href="http://www.ted.com/talks/daphne_koller_what_we_re_learning_from_online_education.html"&gt;una charla en TED&lt;/a&gt;...&lt;br /&gt;
&lt;br /&gt;
Para ver como era, me anoté a un &lt;a href="https://www.coursera.org/course/algs4partI"&gt;curso de algoritmos&lt;/a&gt; que resultó bastante interesante. Nada demasiado nuevo, pero viene bien para repasar algunas cosas que vi hace años en la facultad. Además, al ser un tema más o menos conocido, me da la posibilidad de evaluar el nivel del curso, que resultó ser muy bueno.&lt;br /&gt;
&lt;br /&gt;
Ahora que está por terminar, me anoté también a un curso sobre &lt;a href="https://www.coursera.org/course/progfun"&gt;programación funcional en Scala&lt;/a&gt;, que empieza la semana próxima... A propósito, quien dicta el curso es&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Martin_Odersky"&gt;Martin Odersky&lt;/a&gt;, inventor del lenguaje.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Las opciones para aprender en Internet son sin dudas ilimitadas, y estos tres ejemplos muestran que se puede lograr educación de calidad accesible para todo el mundo.&lt;br /&gt;
&lt;br /&gt;
El modelo de salón de clase tradicional pierde entonces un poco de sentido, y debería reinventarse para sacar el mayor provecho a estos nuevos recursos.&lt;br /&gt;
&lt;br /&gt;
Por último, quería&amp;nbsp;&lt;a href="https://twitter.com/nikodc/status/243747559116525568"&gt;destacar la iniciativa de OpenFING&lt;/a&gt;, que pretende publicar los videos de las clases de la Facultad de Ingeniería para que estén disponibles en la red. No hay mucho por ahora, solo Fundamentos de Bases de Datos, pero esperemos que se amplíe. Por otro lado, creo que no sería mala idea intentar contactarse con la gente de Coursera para brindar cursos a través de ese sitio...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=W1pAO8Elp2w:Ix8xguDQYBo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=W1pAO8Elp2w:Ix8xguDQYBo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=W1pAO8Elp2w:Ix8xguDQYBo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=W1pAO8Elp2w:Ix8xguDQYBo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=W1pAO8Elp2w:Ix8xguDQYBo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/W1pAO8Elp2w/educacion-on-line.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/09/educacion-on-line.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5260131168913053923</guid><pubDate>Tue, 04 Sep 2012 22:23:00 +0000</pubDate><atom:updated>2012-09-04T19:23:43.004-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">películas</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">educación</category><title>La Educación Prohibida</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-OxmKijDeqtM/UEZ_T2X0xYI/AAAAAAAAB9c/bRSSPHB57Kc/s1600/laEducacionProhibida.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60" src="http://2.bp.blogspot.com/-OxmKijDeqtM/UEZ_T2X0xYI/AAAAAAAAB9c/bRSSPHB57Kc/s200/laEducacionProhibida.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href="http://www.educacionprohibida.com/"&gt;La Educación Prohibida&lt;/a&gt; es un documental que habla sobre los defectos que tiene el sistema educativo actual, y hace propuestas de como debería mejorarse. Creo que vale la pena verlo, la película se puede bajar grátis del sitio, de hecho invitan a hacerlo y a compartirla.&lt;br /&gt;
&lt;br /&gt;
Las ideas que plantea no son nuevas, y creo que tampoco pretenden serlo. Por ejemplo &lt;a href="http://sirkenrobinson.com/skr/"&gt;Ken Robinson&lt;/a&gt; en su &lt;a href="http://www.ted.com/talks/ken_robinson_says_schools_kill_creativity.html"&gt;charla de TED de 2006&lt;/a&gt; (la más vista de las charlas TED), habla del tema.&lt;br /&gt;
&lt;br /&gt;
Básicamente lo que plantea es que el modelo de la escuela que se tiene hoy, donde un maestro dicta clase para 25, 30 o más alumnos, que están todos sentados mirando para el mismo lado prestando atención, no es adecuado para los tiempos que corren.&lt;br /&gt;
&lt;br /&gt;
Este modelo viene de la revolución industrial, y es sin duda mucho mejor a lo que había antes (donde la educación era para unos pocos). Probablemente incluso fuera lo mejor a lo que se podía aspirar en los siglos XIX y XX. Pero en el siglo XXI, tiene que haber una forma mejor de pensar la educación.&lt;br /&gt;
&lt;br /&gt;
La escuela como la conocemos, si bien intenta transmitir valores, no los practica. Pretende enseñar a cooperar, pero no permite que los alumnos trabajen en equipo, y promueve la individualidad haciendo que los niños compitan por una nota.&lt;br /&gt;
&lt;br /&gt;
El otro problema que tiene, y esto es algo que me ha molestado bastante, es que muchas veces se enseñan fórmulas (por ejemplo en física o matemática), que tienen una historia atrás, una motivación, pero se enseñan como que son verdades absolutas que se conocen desde siempre, con lo cual se pierde la "diversión" de descubrirlas por uno mismo, de entender de donde salen.&lt;br /&gt;
&lt;br /&gt;
De todas formas hay algunas cosas que no me terminan de cerrar del documental, pero capaz que es porque tengo ya una idea pre-concebida de lo que es la educación. Por ejemplo, plantea que cada niño debe seguir su propio camino de aprendizaje, pero en realidad, hay cosas que tienen que aprender obligatoriamente (no son muchas) como ser leer, escribir y las operaciones aritméticas básicas...&lt;br /&gt;
&lt;br /&gt;
Creo que el documental está bien encaminado, y creo que el sistema educativo tiene que cambiar. Sería muy bueno que se planteara un debate de hacia donde queremos que vaya, y empezar a recorrer el camino. De hecho, sería bueno (aunque la veo difícil) que eso pasara en Uruguay, que tiene todas las condiciones por ser un país chico y tener una educación bastante deteriorada para experimentar en este sentido.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=pYj82W0a4bU:DASAzbmxDrk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=pYj82W0a4bU:DASAzbmxDrk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=pYj82W0a4bU:DASAzbmxDrk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=pYj82W0a4bU:DASAzbmxDrk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=pYj82W0a4bU:DASAzbmxDrk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/pYj82W0a4bU/la-educacion-prohibida.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-OxmKijDeqtM/UEZ_T2X0xYI/AAAAAAAAB9c/bRSSPHB57Kc/s72-c/laEducacionProhibida.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/09/la-educacion-prohibida.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2758896362665496625</guid><pubDate>Sun, 12 Aug 2012 22:12:00 +0000</pubDate><atom:updated>2012-08-12T19:12:00.445-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">apps</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>Navegación guiada en Montevideo con Waze</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-KRgNgKaoviU/UCFybTsY2sI/AAAAAAAAB8o/un_-jEd_0_Q/s1600/waze-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-KRgNgKaoviU/UCFybTsY2sI/AAAAAAAAB8o/un_-jEd_0_Q/s1600/waze-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Desde hace unos días estoy probando una aplicación para el iPhone, que tiene navegación guiada&amp;nbsp;en Montevideo&amp;nbsp;(o "turn-by-turn navigation" en inglés), y por ahora estoy muy conforme.&lt;br /&gt;
&lt;br /&gt;
La aplicación se llama &lt;a href="http://www.waze.com/"&gt;Waze&lt;/a&gt;, es gratuita, y está disponible tanto para iOS como para Android.&lt;br /&gt;
&lt;br /&gt;
Por las pruebas que he hecho, la ruta que encuentra es en general una buena opción, aunque no siempre elige la que yo seguiría :). Acá va una foto de la aplicación en ejecución:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-uM2_lE4gB1E/UCF1yC-EGeI/AAAAAAAAB88/jVrmI1EG8Y0/s1600/waze-screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-uM2_lE4gB1E/UCF1yC-EGeI/AAAAAAAAB88/jVrmI1EG8Y0/s320/waze-screenshot.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En el sitio web, definen a la aplicación como:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;a fun, community-based GPS traffic and navigation app.&lt;/i&gt;&lt;/blockquote&gt;
y justamente es la parte de&amp;nbsp;&lt;i&gt;community-based&lt;/i&gt;&amp;nbsp;que le da su mayor potencia.&lt;br /&gt;
&lt;br /&gt;
Es que la aplicación se alimenta de los datos de quienes la están usando para saber los lugares donde hay algún accidente, donde el tránsito está muy pesado, o donde hay algún desvío.&lt;br /&gt;
&lt;br /&gt;
Además de esta información, uno puede reportar errores en la ruta. Por ejemplo, hubo un caso en que me recomendaba doblar a la izquierda en un semáforo donde no podía, lo reporté, y al otro día me llegó un mail confirmando que habían aceptado el arreglo (aunque no pude comprobar si quedó bien...).&lt;br /&gt;
&lt;br /&gt;
Otra cosa interesante que tiene, supuestamente, es que aprende de la ruta que uno sigue. Digo supuestamente, porque la estoy usando para ir de casa al trabajo y por ahora no ha aprendido: me quiere hacer doblar en un punto donde no doblo nunca...&lt;br /&gt;
&lt;br /&gt;
Así que los invito a probarla y generar datos para que todos tengamos información más confiable :)&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=JiaHghVQZj4:s5KOYo68iAQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=JiaHghVQZj4:s5KOYo68iAQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=JiaHghVQZj4:s5KOYo68iAQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=JiaHghVQZj4:s5KOYo68iAQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=JiaHghVQZj4:s5KOYo68iAQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/JiaHghVQZj4/navegacion-guiada-en-montevideo-con-waze.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KRgNgKaoviU/UCFybTsY2sI/AAAAAAAAB8o/un_-jEd_0_Q/s72-c/waze-logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/08/navegacion-guiada-en-montevideo-con-waze.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-9075764495404881909</guid><pubDate>Thu, 09 Aug 2012 13:07:00 +0000</pubDate><atom:updated>2012-08-09T10:07:53.966-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>Nuevo blog: GeneXus Tips</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s1600/GXLogo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;
El mes pasado algunos compañeros de soporte de Artech empezaron a escribir un blog con tips de GeneXus. Ese blog que hasta el martes pasado estaba privado, quedó ahora público.&lt;br /&gt;
&lt;br /&gt;
Muy amablemente me invitaron a participar, así que de vez en cuando van a ver alguna nota mía en dicho blog :)&lt;br /&gt;
&lt;br /&gt;
Así que sin más, les dejo el link: &lt;a href="http://tips.genexus.com/"&gt;GeneXus Tips&lt;/a&gt;.&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
Espero que les resulte útil.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=J90hVKinB5g:koRFKiYZRWA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=J90hVKinB5g:koRFKiYZRWA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=J90hVKinB5g:koRFKiYZRWA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=J90hVKinB5g:koRFKiYZRWA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=J90hVKinB5g:koRFKiYZRWA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/J90hVKinB5g/nuevo-blog-genexus-tips.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-FkK1JXGYx_Q/Sha53dlr_-I/AAAAAAAAA2o/3Css6RsEvGU/s72-c/GXLogo.gif" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/08/nuevo-blog-genexus-tips.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6635156381813625796</guid><pubDate>Tue, 07 Aug 2012 23:22:00 +0000</pubDate><atom:updated>2012-08-07T20:22:00.493-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">internet</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">televisión</category><title>El futuro de la televisión es Internet, segunda parte</title><description>Creo que lo que dice el título de la nota no sorprende a nadie (o no debería), a esta altura es bastante obvio.&lt;br /&gt;
&lt;br /&gt;
Hace unos días por ejemplo, veíamos &lt;a href="http://www.bgr.com/2012/08/02/cable-tv-subscriber-stats-q2-2012-satellite"&gt;esta noticia&lt;/a&gt; (vía &lt;a href="https://twitter.com/ealmeida/status/231162062305386496"&gt;@ealmeida&lt;/a&gt;) donde dice que 400.000 hogares en EE.UU. dieron de baja el cable en lo que va del año, y cito:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;Reuters points to high unemployment rates, a weak housing market and regular programming factors as key contributing factors for the drop, &lt;b&gt;but other factors may include the increasing amount of available Web-based content&lt;/b&gt; and high costs of cable and satellite-based TV service.&lt;/i&gt;&lt;/blockquote&gt;
La televisión por cable, o más en general, la televisión para abonados, según yo lo veo tiene dos grandes problemas:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Estoy pagando por muchos canales que no veo. En general, de las varias decenas de canales que tengo, solo miro 3 o 4 de forma habitual, más alguna película en los canales que pasan cine.&lt;/li&gt;
&lt;li&gt;Para ver algo, tengo que adecuarme a la grilla dictada por los canales, en vez de los canales adaptarse a mis horarios.&lt;/li&gt;
&lt;/ol&gt;
Esos dos problemas no existen (o se diluyen) si miro contenido en Internet...&lt;br /&gt;
&lt;br /&gt;
Pero, ¿Internet es una opción viable, hoy, en Uruguay?&lt;br /&gt;
&lt;br /&gt;
Yo creo que se están dando varias cosas más o menos al mismo tiempo, que hacen que la respuesta a esta pregunta sea cada vez más afirmativa.&lt;br /&gt;
&lt;br /&gt;
Primero que nada, la disponibilidad de películas y series, ya sea con servicios pagos como Netflix por U$S 8 por mes, u otros medios como Cuevana o "torrents". Pero de esto, &lt;a href="http://blog.marcoscrispino.com/2011/09/el-futuro-de-la-television-es-internet.html"&gt;ya hablé hace un tiempo&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Segundo, los aumentos de velocidad y baja de precios en las conexiones de banda ancha de Antel, &lt;a href="http://tanconectados.com/2012/07/26/estos-son-los-nuevos-precios-y-velocidades-de-la-fibra-optica-de-antel"&gt;como se anunció hace unos días&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Lo último que está faltando es poder disponer de eventos en vivo trasmitidos por Internet. En ese sentido, si la transmisión que está haciendo Antel de los juegos olímpicos (retransmitiendo los canales de Terra) es un indicador de algo, estamos muy cerca de tenerlo.&lt;br /&gt;
&lt;br /&gt;
Para los que hayan visto esta transmisión, debería quedar más que claro que supera en mucho la transmisión televisiva: tengo muchos más canales y puedo elegir ver el deporte que quiero sin depender de lo que elija el director de cámara en cada canal.&lt;br /&gt;
&lt;br /&gt;
Para los que no hayan visto la transmisión on-line, véanla: &lt;a href="http://www.terra.com.ar/"&gt;http://www.terra.com.ar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, la duda que me queda es si esto es parte de una estrategia de Antel, o si es un hecho aislado.&lt;br /&gt;
&lt;br /&gt;
Más allá de lo poco ético que pueda resultar que Antel se meta en este rubro&lt;sup&gt;[1]&lt;/sup&gt;, tiene mucho sentido como estrategia comercial. Si Antel garantiza acceso a cierto número de eventos deportivos, entonces va a ser más interesante la oferta de conexiones de alta velocidad por fibra óptica, que es lo que quieren vender.&lt;br /&gt;
&lt;br /&gt;
Hasta creo que sería razonable para Antel pensar en tener una cajita con Android que se puede conectar a los televisores por HDMI, para facilitar el acceso a este tipo de contenidos...&lt;br /&gt;
&lt;br /&gt;
&lt;sup&gt;[1]&lt;/sup&gt; Digo poco ético, porque cuando los cables quisieron distribuir Internet por el cable coaxial, la &lt;a href="http://www.ursec.gub.uy/"&gt;URSEC&lt;/a&gt; no los dejó porque entraba en conflicto con el monopolio de Antel. Que ahora Antel se meta en el terreno de los cables sin rever la otra decisión, parece por lo menos desleal... De todas formas, desde el punto de vista del consumidor final, sería una buena noticia.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=kjkW9RP43ZM:sv_Y0Hjnx6o:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=kjkW9RP43ZM:sv_Y0Hjnx6o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=kjkW9RP43ZM:sv_Y0Hjnx6o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=kjkW9RP43ZM:sv_Y0Hjnx6o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=kjkW9RP43ZM:sv_Y0Hjnx6o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/kjkW9RP43ZM/el-futuro-de-la-television-es-internet.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/08/el-futuro-de-la-television-es-internet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8355403171305054270</guid><pubDate>Tue, 24 Jul 2012 02:44:00 +0000</pubDate><atom:updated>2012-07-23T23:44:11.884-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Automatic Reference Counting en Objective-C</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s1600/xcode_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s200/xcode_logo.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
Cuando uno empieza a programar en Objective-C, una de las mayores dificultades que se encuentra es con el manejo de memoria.&lt;br /&gt;
&lt;br /&gt;
Objective-C utiliza una técnica que se llama "reference counting", que resuelve el manejo de memoria en tiempo de compilación (a diferencia de "garbage collection"), pero que hasta la aparición de iOS 5 y OS X 10.7, lo dejaba en manos del programador.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cómo funciona el "reference counting"&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Básicamente, la técnica de "reference counting" funciona así:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;cuando quiero quedarme con una referencia a un objeto tengo que mandarle un &lt;i&gt;retain&lt;/i&gt;, esto incrementa el &lt;i&gt;retainCount&lt;/i&gt; en uno&lt;/li&gt;
&lt;li&gt;cuando ya no lo necesito más le mando un &lt;i&gt;release&lt;/i&gt;, esto&amp;nbsp; decremente el &lt;i&gt;retainCount&lt;/i&gt; también en uno&lt;/li&gt;
&lt;li&gt;si no quiero quedarme con una referencia pero tampoco quiero que el objeto se libere inmediatamente, puedo mandarle un &lt;i&gt;autorelease&lt;/i&gt; que hace un &lt;i&gt;release&lt;/i&gt; pero en el futuro&lt;sup&gt;(1)&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;cuando el objeto queda con &lt;i&gt;retainCount&lt;/i&gt; en cero, el mismo objeto se encarga de llamar a su propio método &lt;i&gt;dealloc&lt;/i&gt; que libera la memoria.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;sup&gt;(1)&lt;/sup&gt;La explicación de como funciona el &lt;i&gt;autorelease&lt;/i&gt; puede ser un poco compleja si no se conoce el mecanismo. El &lt;i&gt;autorelease&lt;/i&gt; se ejecuta en el contexto de un "autorelease pool" que mantiene una referencia a cada uno de los objetos que se les envió el mensaje, y cuando se libera manda un &lt;i&gt;release&lt;/i&gt; por cada &lt;i&gt;autorelease&lt;/i&gt; que hice.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Además en Objective-C se usan convenciones de nombres para saber si un método devuelve un objeto con o sin &lt;i&gt;retain&lt;/i&gt;. Por ejemplo, si el nombre del método empieza con "new", ya viene con el &lt;i&gt;retain&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Esto si se usa bien funciona, pero puede generar dos tipos de errores:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;memory leaks: a un objeto se le mandan más &lt;i&gt;retain&lt;/i&gt; que &lt;i&gt;release&lt;/i&gt;, por lo que la memoria nunca se libera&lt;/li&gt;
&lt;li&gt;zombies: el objeto se usa luego de quedar con &lt;i&gt;retainCount&lt;/i&gt; en cero, y por lo tanto se accede a memoria que contiene basura, ya que el objeto fue liberado al llegar a cero.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Automatic Reference Counting&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La solución de Apple a partir de iOS 5 y OS X 10.7 es el Automatic Reference Counting (ARC).&lt;br /&gt;
&lt;br /&gt;
Con ARC, se mantiene el mismo esquema de manejo de memoria con "reference counting", solo que no lo hace el programador, sino que lo hace el compilador de forma automática.&lt;br /&gt;
&lt;br /&gt;
Esta técnica tiene ventajas sobre el "garbage collector" usado por otros lenguajes, ya que no es necesario contar con un proceso que recorra la memoria buscando objetos en desuso, que puede (y de hecho lo hace) causar problemas de performance en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
Por lo tanto, con ARC, se tiene lo mejor de dos mundos: el manejo de memoria se hace en tiempo de compilación, y no depende del programador el que se haga bien.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sobre la "migración"&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para los que venimos programando en Objective-C, al principio ver código escrito para ARC puede resultar un poco chocante. Algunos ejemplos:&lt;br /&gt;
&lt;br /&gt;
Cuando se hace un &lt;i&gt;alloc&lt;/i&gt;, siempre corresponde hacer un &lt;i&gt;release&lt;/i&gt; en algún momento, y el no verlo cuando se tiene ARC hace pensar que el programa está dejando memory leaks.&lt;br /&gt;
&lt;br /&gt;
El método &lt;i&gt;dealloc&lt;/i&gt; con ARC no es muy usado, porque el objeto no tiene que liberar memoria, pero a veces se necesita por ejemplo para dejar de recibir notificaciones. En ese caso, se implementa el método &lt;i&gt;dealloc&lt;/i&gt;, pero que no llama al &lt;i&gt;[super dealloc]&lt;/i&gt;, por lo que a primera vista da toda la impresión de estar mal.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Referencia a objetos ya liberados&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Otro problema bastante común, es mantener una referencia a un objeto que ya se liberó.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, cuando se tiene una referencia de tipo &lt;i&gt;weak&lt;/i&gt; (o &lt;i&gt;assign&lt;/i&gt; en nomenclatura pre-ARC), si el objeto referenciado quedaba con &lt;i&gt;retainCount&lt;/i&gt; en cero, se liberaba y quedaba la referencia apuntando a memoria basura.&lt;br /&gt;
&lt;br /&gt;
Con ARC en iOS 5, estas referencias se borran automáticamente al liberarse el objeto, y quedan con valor &lt;i&gt;nil&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Lamentablemente si la aplicación debe funcionar con iOS 4, si bien se puede usar ARC, las referencias no pueden ser de tipo &lt;i&gt;weak&lt;/i&gt; y no quedan con &lt;i&gt;nil&lt;/i&gt; luego de liberarse el objeto. Se deben declarar como &lt;i&gt;assign&lt;/i&gt; o &lt;i&gt;unsafe_unretained&lt;/i&gt;, y se deben seguir manejando igual que antes.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ARC es bastante mejor a lo que teníamos: el manejo de memoria de forma manual, aunque puede costar un poco acostumbrarse.&lt;br /&gt;
&lt;br /&gt;
Además se hicieron mejoras de performance, que junto con las optimizaciones que realiza el compilador, deberían mejorar el rendimiento y el uso de memoria de las aplicaciones.&lt;br /&gt;
&lt;br /&gt;
En GeneXus ya estamos pasando los proyectos a ARC, y el Upgrade 2 de la Evolution 2 será compilado bajo este esquema.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=_OvFbrXt7sc:3X82b_xKJU0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=_OvFbrXt7sc:3X82b_xKJU0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=_OvFbrXt7sc:3X82b_xKJU0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=_OvFbrXt7sc:3X82b_xKJU0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=_OvFbrXt7sc:3X82b_xKJU0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/_OvFbrXt7sc/automatic-reference-counting-en.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zDarByNM2JE/TDd3wIPN--I/AAAAAAAABNw/ixSmlMk0LLU/s72-c/xcode_logo.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/07/automatic-reference-counting-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6246170177316885800</guid><pubDate>Thu, 21 Jun 2012 22:43:00 +0000</pubDate><atom:updated>2012-06-21T19:43:00.496-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>La importancia de respetar los estándares</title><description>Una discusión que tenemos de forma bastante recurrente en el equipo de iOS en Artech, es hasta donde es conveniente salirse de los estándares de la plataforma.&lt;br /&gt;
&lt;br /&gt;
En ese sentido iOS es bastante particular, porque las guías de desarrollo llevan a que las aplicaciones sean bastante uniformes, lo que hace que los usuarios se acostumbren a que las cosas se hagan de determinada forma.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, ¿es razonable en una aplicación sacar la barra de navegación? ¿Conviene usar un ícono no estándar para una acción estándar? ¿Vale la pena hacer una implementación "custom" de algún control que está disponible de forma nativa?&lt;br /&gt;
&lt;br /&gt;
En general, la respuesta a todas estas preguntas es que NO, que lo mejor es ajustarse a lo nativo. Por supuesto existen excepciones y casos en los que sí me quiero salir de lo estándar, pero hay que hacerlo a conciencia y con mucho cuidado.&lt;br /&gt;
&lt;br /&gt;
¿A qué viene todo esto? Que hace unos días actualicé una aplicación que uso todos los días, e hicieron un cambio que me complicó...&lt;br /&gt;
&lt;br /&gt;
La aplicación se llama Reeder, y es un excelente lector de RSS que entre otras cosas se integra con Google Reader y permite compartir noticias muy fácilemente via Twitter.&lt;br /&gt;
&lt;br /&gt;
El cambio que hicieron fue al leer una noticia, sacaron la Navigation Bar. En esta barra se encuentra el botón para volver a la pantalla anterior, es decir a la lista de noticias.&lt;br /&gt;
&lt;br /&gt;
El botón de "back" que perdieron al sacar la barra de navegación, lo pusieron mediante un botón en el mismo control donde se muestra la noticia, con lo cual no queda más remedio que hacer todo el "scroll" hasta arriba para encontrarlo.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-aTzcoZ1jBbg/T-Np9mX0NOI/AAAAAAAABnQ/sejGvzG6OQQ/s1600/Reeder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-aTzcoZ1jBbg/T-Np9mX0NOI/AAAAAAAABnQ/sejGvzG6OQQ/s320/Reeder.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Este cambio, que en principio parece razonable para ganar espacio, complica al usuario acostumbrado a hacer las cosas de cierta manera.&lt;br /&gt;
&lt;br /&gt;
Claro, hicieron esto y agregaron otra opción: hacer un "swipe" con un dedo de izquierda a derecha para volver a la pantalla anterior. El problema con esto es que hay que descubrirlo, ya que no es algo natural en la plataforma.&lt;br /&gt;
&lt;br /&gt;
En conclusión: si existe un estándar de la plataforma, no conviene hacer lo mismo de otra forma, porque los usuarios no van a saber como reaccionar.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=lxVTjZ-bB6M:6AjnpyKm-mk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=lxVTjZ-bB6M:6AjnpyKm-mk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=lxVTjZ-bB6M:6AjnpyKm-mk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=lxVTjZ-bB6M:6AjnpyKm-mk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=lxVTjZ-bB6M:6AjnpyKm-mk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/lxVTjZ-bB6M/la-importancia-de-respetar-los.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-aTzcoZ1jBbg/T-Np9mX0NOI/AAAAAAAABnQ/sejGvzG6OQQ/s72-c/Reeder.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/06/la-importancia-de-respetar-los.html</feedburner:origLink></item></channel></rss>
