<?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: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>Fri, 18 May 2012 13:57:28 +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>reflexiones</category><category>libros</category><category>git</category><category>web 2.0</category><category>rss</category><category>nintendo</category><category>internet</category><category>televisión</category><category>tecnología</category><category>email</category><category>windows</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>ruby_on_rails</category><category>blog</category><category>tags</category><category>xcode</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>277</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-4836274647678231511</guid><pubDate>Wed, 02 May 2012 18:16:00 +0000</pubDate><atom:updated>2012-05-02T15:16:14.201-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>Comparación de strings por aproximación</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;
Para una aplicación que estoy haciendo con GeneXus (después cuento de que se trata...), necesitaba poder comparar dos strings, pero no necesito que sean exáctamente iguales, me alcanza con que sean aproximados.&lt;br /&gt;
&lt;br /&gt;
El primer intento fue hacer que uno de los dos strings fuera por lo menos la mitad del largo del otro y que estuviera contenido. Como aproximación está bien, pero si por ejemplo uno de los dos tiene un tilde y el otro no, da que son diferentes.&lt;br /&gt;
&lt;br /&gt;
Gracias a Matías me enteré que existe un algoritmo, llamado &lt;a href="http://es.wikipedia.org/wiki/Distancia_de_Levenshtein"&gt;Distancia de Levenshtein&lt;/a&gt;, que se usa justamente para esto. Según Wikipedia:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;En Teoría de la información y Ciencias de la Computación se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter. Esta distancia recibe ese nombre en honor al científico ruso Vladimir Levenshtein, quien se ocupara de esta distancia en 1965. Es útil en programas que determinan cuán similares son dos cadenas de caracteres, como es el caso de los correctores de ortografía.&lt;/i&gt;&lt;/blockquote&gt;
Dejo acá el algoritmo en GeneXus, por si a alguien más le resulta útil:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;
/*&lt;br /&gt;
 * Distancia de Levenshtein&lt;br /&gt;
 *&lt;br /&gt;
 * Fuente: http://es.wikipedia.org/wiki/Distancia_de_Levenshtein&lt;br /&gt;
 *&lt;br /&gt;
 * parm(in:&amp;amp;str1, in:&amp;amp;str2, out:&amp;amp;distance);&lt;br /&gt;
 *&lt;br /&gt;
 * Todas las variables son N(4) salvo &amp;amp;str1 y &amp;amp;str2 que son C(100)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lenStr1 = &amp;amp;str1.Length()&lt;br /&gt;
if &amp;amp;lenStr1 &amp;gt; 99&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;amp;lenStr1 = 99&lt;br /&gt;
endif&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lenStr2 = &amp;amp;str2.Length()&lt;br /&gt;
if &amp;amp;lenStr2 &amp;gt; 99&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;amp;lenStr2 = 99&lt;br /&gt;
endif&lt;br /&gt;
&lt;br /&gt;
for &amp;amp;i = 1 to &amp;amp;lenStr1+1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;amp;distMatrix(&amp;amp;i, 1) = &amp;amp;i-1&lt;br /&gt;
endfor&lt;br /&gt;
for &amp;amp;j = 1 to &amp;amp;lenStr2+1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;amp;distMatrix(1, &amp;amp;i) = &amp;amp;j-1&lt;br /&gt;
endfor&lt;br /&gt;
&lt;br /&gt;
for &amp;amp;i = 2 to &amp;amp;lenStr1+1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; for &amp;amp;j = 2 to &amp;amp;lenStr2+1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &amp;amp;str1.Substring(&amp;amp;i, 1) = &amp;amp;str2.Substring(&amp;amp;j, 1)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;costo = 0&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;costo = 1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; endif&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;val1 = &amp;amp;distMatrix(&amp;amp;i-1, &amp;amp;j)+1    // deletion&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;val2 = &amp;amp;distMatrix(&amp;amp;i, &amp;amp;j-1)+1    // insertion&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;val3 = &amp;amp;distMatrix(&amp;amp;i-1, &amp;amp;j-1) + &amp;amp;costo // substitution&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;min = &amp;amp;val1&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &amp;amp;val2 &amp;lt; &amp;amp;min&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;min = &amp;amp;val2&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; endif&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &amp;amp;val3 &amp;lt; &amp;amp;min&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;min = &amp;amp;val3&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; endif&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;distMatrix(&amp;amp;i, &amp;amp;j) = &amp;amp;min&lt;br /&gt;
&amp;nbsp; &amp;nbsp; endfor&lt;br /&gt;
endfor&lt;br /&gt;
&lt;br /&gt;
&amp;amp;distance = &amp;amp;distMatrix(&amp;amp;lenStr1+1, &amp;amp;lenStr2+1)&lt;/tt&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4836274647678231511?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=Y36lWMRHRyY:qqsFXDNV9E4: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=Y36lWMRHRyY:qqsFXDNV9E4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=Y36lWMRHRyY:qqsFXDNV9E4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=Y36lWMRHRyY:qqsFXDNV9E4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=Y36lWMRHRyY:qqsFXDNV9E4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=Y36lWMRHRyY:qqsFXDNV9E4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=Y36lWMRHRyY:qqsFXDNV9E4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=Y36lWMRHRyY:qqsFXDNV9E4: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=Y36lWMRHRyY:qqsFXDNV9E4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=Y36lWMRHRyY:qqsFXDNV9E4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/Y36lWMRHRyY/comparacion-de-strings-por-aproximacion.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>5</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/05/comparacion-de-strings-por-aproximacion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8733839426482172531</guid><pubDate>Sat, 14 Apr 2012 14:56:00 +0000</pubDate><atom:updated>2012-04-14T11:56:49.962-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>iPhone 4s vs. iPhone 3Gs</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s1600/iphone-4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s1600/iphone-4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace unos días, &lt;a href="http://blog.marcoscrispino.com/2012/04/desbloqueo-oficial-de-iphone.html"&gt;ya que pude desbloquear el 3Gs&lt;/a&gt;&amp;nbsp;para venderlo, me compré el iPhone 4s...&lt;br /&gt;
&lt;br /&gt;
Acá va una comparación de ambos&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;La pantalla&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La pantalla "retina display" del 4s es espectacular. Mirando uno al lado del otro se nota claramente la diferencia. Estas son fotos de pantalla, una de cada uno de los teléfonos (click para agrandar)&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/-Tqsx3s0vAp0/T4mJgWYTtYI/AAAAAAAABhI/0mVEQI8S62w/s1600/pantalla4s.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://4.bp.blogspot.com/-Tqsx3s0vAp0/T4mJgWYTtYI/AAAAAAAABhI/0mVEQI8S62w/s320/pantalla4s.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-DYjzplYW-yI/T4mJfAvwSiI/AAAAAAAABhA/GbcN8uVaNSY/s1600/pantalla3gs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://3.bp.blogspot.com/-DYjzplYW-yI/T4mJfAvwSiI/AAAAAAAABhA/GbcN8uVaNSY/s320/pantalla3gs.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;La cámara&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La diferencia en las fotos que se pueden sacar, también salta a la vista. La cámara del 4s es mucho mejor que la del 3Gs, y no solo por el tamaño de las fotos, sino también por la nitidez y la calidad de los colores que se obtienen.&lt;br /&gt;
&lt;br /&gt;
Ni hablar de que el 4s además de la cámara tiene flash.&lt;br /&gt;
&lt;br /&gt;
También tiene más funciones, como por ejemplo &lt;a href="http://es.wikipedia.org/wiki/HDR"&gt;HDR&lt;/a&gt; (high dynamic range), que mejora por software (y mediante la captura de varias fotos en una sola exposición) las fotos que tienen una variación muy grande de luz.&lt;br /&gt;
&lt;br /&gt;
Acá pueden ver tres fotos comparativas: la primera con el 3Gs, la segunda con el 4s y la tercera usando HDR.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-TRpMUj7_QZA/T4mMCO0wHJI/AAAAAAAABhQ/bfdnNZa0jeY/s1600/IMG_1034.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-TRpMUj7_QZA/T4mMCO0wHJI/AAAAAAAABhQ/bfdnNZa0jeY/s320/IMG_1034.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-p7mODAEny6U/T4mMLmvt7VI/AAAAAAAABhY/xT-E5nSYDw8/s1600/IMG_0008.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-p7mODAEny6U/T4mMLmvt7VI/AAAAAAAABhY/xT-E5nSYDw8/s320/IMG_0008.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-vulSxeyZQcg/T4mMOVGAdkI/AAAAAAAABhg/mGCytgEBRDk/s1600/IMG_0009.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-vulSxeyZQcg/T4mMOVGAdkI/AAAAAAAABhg/mGCytgEBRDk/s320/IMG_0009.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Todavía no he tenido oportunidad de jugar mucho con la cámara, pero la primer impresión es que es muy superior.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Rendimiento&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Con el 3Gs, ya había cosas que se notaba que tenía problemas de performance. Con el 4s cualquier cosa que haga es instantanea.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Batería&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Aunque parezca mentira, en estos días la batería del 4s me ha durado más que lo que duraba la del 3Gs. El uso que le doy es el mismo, así que parece ser que dura más.&lt;br /&gt;
&lt;br /&gt;
También es verdad que el 3Gs ya tenía 2 años y medio, y las baterías van perdiendo capacidad a medida que pasa el tiempo. Para hacer una comparación seria, habría que probar con los dos nuevos...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Forma, dimensiones y peso&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El 3Gs me resultaba más cómodo de sostener en la mano, gracias a que la parte de atrás es redondeada. Igual el 4s no resulta tan incómodo como pensé que iba a ser. Después de un par de días uno se acostumbra.&lt;br /&gt;
&lt;br /&gt;
La ventaja que tiene la forma del 4s (y del 4 ya que estamos) es que al no tener curvas, permite acomodar mejor los componentes internos, y eso hace que sea más chico.&lt;br /&gt;
&lt;br /&gt;
Con respecto al peso no noté demasiada diferencia entre uno y otro. Aparentemente el 4s es 5 gramos más pesado.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Si tienen un 3Gs y están pensando en cambiarlo, no lo piensen más :) Vale la pena.&lt;br /&gt;
&lt;br /&gt;
Si tienen un iPhone 4, no me queda tan claro que convenga cambiarlo, a lo mejor conviene esperar a la siguiente generación...&lt;br /&gt;
&lt;br /&gt;
Si quieren una comparación más seria, funcionalidad por funcionalidad, &lt;a href="http://www.gsmarena.com/compare.php3?idPhone1=2826&amp;amp;idPhone2=4212"&gt;la pueden ver en GSMArena&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-8733839426482172531?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=K7YYg3fVMcE:2nPZhRd6hoo: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=K7YYg3fVMcE:2nPZhRd6hoo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=K7YYg3fVMcE:2nPZhRd6hoo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=K7YYg3fVMcE:2nPZhRd6hoo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=K7YYg3fVMcE:2nPZhRd6hoo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=K7YYg3fVMcE:2nPZhRd6hoo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=K7YYg3fVMcE:2nPZhRd6hoo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=K7YYg3fVMcE:2nPZhRd6hoo: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=K7YYg3fVMcE:2nPZhRd6hoo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=K7YYg3fVMcE:2nPZhRd6hoo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/K7YYg3fVMcE/iphone-4s-vs-iphone-3gs.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s72-c/iphone-4.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/04/iphone-4s-vs-iphone-3gs.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-1309054652679396806</guid><pubDate>Fri, 13 Apr 2012 23:12:00 +0000</pubDate><atom:updated>2012-04-13T20:12:00.819-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>Desbloqueo oficial de iPhone</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s1600/iphone-4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s1600/iphone-4.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
Hasta hace poco, pensaba que el desbloquear un iPhone era un proceso no aprobado por Apple, casi que ilegal digamos.&lt;br /&gt;
&lt;br /&gt;
Pero resulta que no, que hay una forma de desbloquear un iPhone de forma totalmente legal, aunque no hay mucha información al respecto.&lt;br /&gt;
&lt;br /&gt;
Para eso, el operador tiene que ofrecer el desbloqueo (&lt;a href="http://support.apple.com/kb/HT1937?viewlocale=es_ES"&gt;ver lista de operadores&lt;/a&gt;), que en el caso de Uruguay está disponible tanto en Movistar como en Claro.&lt;br /&gt;
&lt;br /&gt;
Les cuento como fue el proceso, por si alguien más necesita hacerlo...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mi experiencia con Movistar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En mi caso, tengo un iPhone 3Gs de Movistar, que se venció el contrato original a fines de 2011.&lt;br /&gt;
&lt;br /&gt;
Cuando me enteré que se podía desbloquear, pregunté en Movistar como tenía que hacer, y me dijeron que tenía que ir simplemente al local que está en Soca y Rivera, que ahí lo hacen. Después alguien que comentó que en el Palacio Salvo también se puede, pero no tuve la oportunidad de confirmarlo.&lt;br /&gt;
&lt;br /&gt;
Fui un día al local de Movistar indicado, y me dijeron que sí lo podían desbloquear, pero que lo tenía que autorizar la gerencia y podía demorar hasta dos meses. Así que dejé el pedido hecho...&lt;br /&gt;
&lt;br /&gt;
No demoraron tanto, más o menos a los 10 días me llamaron para pedirme el IMEI del celular, se los pasé, y al otro día me llamaron para avisar que ya estaba pronto, y lo único que debía hacer era conectarlo a una computadora que tuviera conexión a internet, y abrir iTunes.&lt;br /&gt;
&lt;br /&gt;
El proceso de desbloqueo, aparentemente, consiste en que la operadora le pasa a Apple los datos del teléfono, y Apple de alguna forma lo marca como desbloqueado.&lt;br /&gt;
&lt;br /&gt;
Estuve una semana más o menos conectando el aparato a iTunes, pero nada, nunca se desbloqueó.&lt;br /&gt;
&lt;br /&gt;
Volví a ir a Movistar a reclamar, y me dijeron que ese era el procedimiento correcto, y que tenía que esperar.&lt;br /&gt;
&lt;br /&gt;
Esperé... unos diez días más aproximadamente.&lt;br /&gt;
&lt;br /&gt;
Así que volví a ir a Movistar a reclamar, y después de que la vendedora se lo llevó un rato, para que lo viera el técnico, volvió a decirme que ellos ya habían hecho su parte y que no tenían nada más para hacer. Pedí para hablar con el técnico, pero me dijeron que no atienden público, y que me pusiera en contacto con soporte de Apple.&lt;br /&gt;
&lt;br /&gt;
Al final lo logré desbloquear, pero no gracias Movistar, ya que quienes atienden al público que no tienen ni idea...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;El proceso de desbloqueo&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Para hacer un resumen, los pasos para desbloquear el teléfono son:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Asegurarse que la operadora ofrezca ese servicio, y esperar al fin del contrato&lt;/li&gt;
&lt;li&gt;Pedir a la operadora que haga el desbloqueo, pagar lo que corresponda (pueden llegar a cobrar algo, no fue mi caso)&lt;/li&gt;
&lt;li&gt;Esperar a que la operadora nos confirme que ya hizo el pedido a Apple&lt;/li&gt;
&lt;li&gt;Conectar el teléfono a iTunes, con conexión a internet, y restaurar los ajustes originales.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Lo que nunca me dijeron en Movistar, es que para que se aplique el desbloqueo hay que restaurar el teléfono.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
En el paso 4, puede ser que sea necesario ponerle un chip de otra compañía. Yo lo hice, pero no se si es obligatorio...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
El paso de restaurarlo, es bien simple y funciona sin ningún problema. Eso sí, no se olviden de hacer un respaldo antes (iTunes pregunta antes de empezar la restauración) si pretenden mantener los datos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-1309054652679396806?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9mY2BqKIC6Q:qluIEJxWA0g: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=9mY2BqKIC6Q:qluIEJxWA0g:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9mY2BqKIC6Q:qluIEJxWA0g:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9mY2BqKIC6Q:qluIEJxWA0g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9mY2BqKIC6Q:qluIEJxWA0g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9mY2BqKIC6Q:qluIEJxWA0g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9mY2BqKIC6Q:qluIEJxWA0g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9mY2BqKIC6Q:qluIEJxWA0g: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=9mY2BqKIC6Q:qluIEJxWA0g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9mY2BqKIC6Q:qluIEJxWA0g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/9mY2BqKIC6Q/desbloqueo-oficial-de-iphone.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7GyU3yozadU/T4dcwNCV2cI/AAAAAAAABgQ/ZKcG7P3VpVU/s72-c/iphone-4.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/04/desbloqueo-oficial-de-iphone.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8177719084848446290</guid><pubDate>Thu, 12 Apr 2012 11:32:00 +0000</pubDate><atom:updated>2012-04-12T08:32:09.014-03:00</atom:updated><title>La venta de entradas para Paul McCartney por internet</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-LXdXfZWVfSw/T4a3grDqjVI/AAAAAAAABf0/72xl6J_OfP0/s1600/on-the-run-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-LXdXfZWVfSw/T4a3grDqjVI/AAAAAAAABf0/72xl6J_OfP0/s1600/on-the-run-logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
A menos que haya algún despistado... todos sabrán que el próximo 15 de abril viene Paul McCartney a tocar al Estadio Centenario.&lt;br /&gt;
&lt;br /&gt;
Como buen fanático de los Beatles, tenía ganas de ir, así que me dispuse a comprar las entradas.&lt;br /&gt;
&lt;br /&gt;
Las que se vendieron en Abitab volaron, algo así como 28.000 entradas en menos de una hora. Y eso que los precios no eran precisamente baratos.&lt;br /&gt;
&lt;br /&gt;
Mi idea era comprar de esas, pero no pensé que se vendieran tan rápido y no conseguí. En internet cuando me fui a fijar quedaban entradas solo con tarjeta del Citi.&lt;br /&gt;
&lt;br /&gt;
Para la segunda tanda de 5.000 tampoco pude ir a la hora que se ponían a la venta, pero tenía la esperanza de poder comprar por internet. El problema fue que también eran solo con tarjeta del Citi.&lt;br /&gt;
&lt;br /&gt;
Así que lo que hice fue preguntar en Twitter si alguien tenía y me podía prestar, y por suerte un amigo (Gabriel) me ofreció la de él.&lt;br /&gt;
&lt;br /&gt;
Acá empieza la parte divertida.&lt;br /&gt;
&lt;br /&gt;
El proceso de compra por internet fue razonable. No se para que me pidieron registrarme en el sitio donde se vendían, pero es algo aceptable.&lt;br /&gt;
&lt;br /&gt;
Durante el proceso de compra me pidieron la dirección de entrega, como que me las iban a mandar, pero en el mail de confirmación decía que había que retirarlas en algún lugar que no indicaba.&lt;br /&gt;
&lt;br /&gt;
Unos días después me llegó otro mail con el lugar donde había que retirarlas, los horarios, y que se podía ir a partir del lunes 9 de abril. Además decía que tenía que ir el titular de la tarjeta con documento válido.&lt;br /&gt;
&lt;br /&gt;
Así que quedamos de encontrarnos con Gabriel el lunes para retirarlas. Él llego antes que yo, y cuando las fue a retirar, le pidieron el mail impreso con la confirmación de la compra, que obviamente no tenía porque no decía en ningún lado que se precisaba. Me avisó, volví a imprimirlo (porque ya estaba en camino) y allá fui con el mail impreso.&lt;br /&gt;
&lt;br /&gt;
Otra vez a la ventanilla, ahora con el titlar de la tarjeta y el mail impreso. ¿Qué nos dijeron? Que las entradas compradas en abril iban a estar a partir del miércoles... Eso a pesar de que el mail decía que se podían retirar a partir del lunes.&lt;br /&gt;
&lt;br /&gt;
Además nos enteramos, de casualidad porque a alguien adelante nuestro lo rebotaron, que además de ir el titular de la tarjeta con la cédula, tenía que llevar la tarjeta.&lt;br /&gt;
&lt;br /&gt;
Como que así pierde la gracia de comprar por internet, ¿no? Yo me pregunto si en Londres por ejemplo, donde tocó hace unos días será igual...&lt;br /&gt;
&lt;br /&gt;
El miércoles sí, finalmente, pudimos retirar las entradas. Igual escuchamos decir que no estaban todas, que habían algunas que no estaban impresas todavía y había que retirarlas el jueves...&lt;br /&gt;
&lt;br /&gt;
Todo esto me hizo acordar al estereotipo de trámite en organismo público, donde siempre te rebotan porque falta un papel, nunca nadie te dice todo lo que se precisa y si le preguntas a dos personas distintas te dicen cosas contradictorias.&lt;br /&gt;
&lt;br /&gt;
Es lamentable que estas cosas funcionen así...&lt;br /&gt;
&lt;br /&gt;
En fin, final de la historia, el domingo es el recital que seguramente va a estar muy bueno.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-8177719084848446290?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=rxCzdfj6JEk:rRgSj5kH030: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=rxCzdfj6JEk:rRgSj5kH030:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=rxCzdfj6JEk:rRgSj5kH030:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=rxCzdfj6JEk:rRgSj5kH030:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=rxCzdfj6JEk:rRgSj5kH030:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=rxCzdfj6JEk:rRgSj5kH030:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=rxCzdfj6JEk:rRgSj5kH030:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=rxCzdfj6JEk:rRgSj5kH030: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=rxCzdfj6JEk:rRgSj5kH030:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=rxCzdfj6JEk:rRgSj5kH030:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/rxCzdfj6JEk/la-venta-de-entradas-para-paul.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-LXdXfZWVfSw/T4a3grDqjVI/AAAAAAAABf0/72xl6J_OfP0/s72-c/on-the-run-logo.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/04/la-venta-de-entradas-para-paul.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6993090774338208514</guid><pubDate>Fri, 30 Mar 2012 22:21:00 +0000</pubDate><atom:updated>2012-03-30T19:21:37.390-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">libros</category><category domain="http://www.blogger.com/atom/ns#">televisión</category><title>Game of Thrones: el libro y la serie de TV</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-7GFT6K8IBrU/T3TjGgHWg1I/AAAAAAAABfA/BTXKojWfW60/s1600/GoT.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://2.bp.blogspot.com/-7GFT6K8IBrU/T3TjGgHWg1I/AAAAAAAABfA/BTXKojWfW60/s320/GoT.jpg" width="109" /&gt;&lt;/a&gt;&lt;/div&gt;
Acabo de terminar de ver la primera temporada de Game of Thrones, después de haber leído el libro.&lt;br /&gt;
&lt;br /&gt;
Cuando empezaron a dar la serie Game of Thrones en HBO parecía interesante, y me dieron ganas de verla, pero la verdad cada vez me parece más complicado tener un horario fijo para poder ver algo en la tele&lt;sup&gt;[1]&lt;/sup&gt;. Así que, después de ver el primer capítulo, no vi más...&lt;br /&gt;
&lt;br /&gt;
Poco tiempo después me enteré que estaba &lt;a href="http://www.amazon.com/gp/product/B000QCS8TW/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=blodemarcri-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B000QCS8TW"&gt;basada en un libro&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=blodemarcri-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B000QCS8TW" style="border: none !important; margin: 0px !important;" width="1" /&gt;, así que me puse a leer el libro antes de ver la serie.&lt;br /&gt;
&lt;br /&gt;
El libro está bueno.&amp;nbsp;La historia en sí es atrapante, pero después de leer las 700 páginas, la sensación que me quedó es que fue una especie de introducción, que quedaron muchos cabos sueltos. Claro, es el primero de 5 libros (hasta ahora...), y como tal, no es la historia completa.&lt;br /&gt;
&lt;br /&gt;
Después de leer el libro, me puse a ver la serie &lt;a href="http://www.cuevana.tv/#!/series/3622/game-of-thrones"&gt;gracias a Cuevana&lt;/a&gt;. Es una excelente adaptación, bastante fiel a la historia original, y creo que vale la pena verla aunque no se haya leído el libro.&amp;nbsp;La gran ventaja que tiene el libro es que permite profundizar mucho más en los personajes, y por las cosas que pasan por la cabeza de cada uno de ellos.&lt;br /&gt;
&lt;br /&gt;
Creo que haber leído el libro primero fue una buena decisión, y pienso repetirla para la &lt;a href="http://www.imdb.com/title/tt1971833/"&gt;segunda temporada que está por comenzar&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;sup&gt;[1]&lt;/sup&gt;Nota aparte: hay una gran oportunidad de negocio para el que resuelva bien el tema de distribuir contenido a demanda. No me refiero a la solución técnica, que ya existe (por ejemplo Netflix o Cuevana), sino a entregar contenido de calidad de forma simple para el usuario y con un costo razonable. Me llama la atención que las operadoras de cable no lo hayan visto todavía...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-6993090774338208514?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=YLFPXAq6tu8:DM3XPv2kJmM: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=YLFPXAq6tu8:DM3XPv2kJmM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=YLFPXAq6tu8:DM3XPv2kJmM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=YLFPXAq6tu8:DM3XPv2kJmM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=YLFPXAq6tu8:DM3XPv2kJmM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=YLFPXAq6tu8:DM3XPv2kJmM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=YLFPXAq6tu8:DM3XPv2kJmM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=YLFPXAq6tu8:DM3XPv2kJmM: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=YLFPXAq6tu8:DM3XPv2kJmM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=YLFPXAq6tu8:DM3XPv2kJmM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/YLFPXAq6tu8/game-of-thrones-el-libro-y-la-serie-de.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-7GFT6K8IBrU/T3TjGgHWg1I/AAAAAAAABfA/BTXKojWfW60/s72-c/GoT.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/03/game-of-thrones-el-libro-y-la-serie-de.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8199996160972599813</guid><pubDate>Thu, 22 Mar 2012 23:37:00 +0000</pubDate><atom:updated>2012-03-22T20:37:00.172-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">xcode</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Detectar problemas de memoria con Instruments</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-pwgwAk2LWlw/T2tAMRU1ykI/AAAAAAAABdo/D6l509YwQ3w/s1600/instruments_logo.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/-pwgwAk2LWlw/T2tAMRU1ykI/AAAAAAAABdo/D6l509YwQ3w/s1600/instruments_logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
En Objective-C, cuando se maneja la memoria "a mano" con retain/release/autorelease, es bastante común que aparezcan problemas de memoria.&lt;br /&gt;
&lt;br /&gt;
Estos problemas no deberían aparecer si se usa ARC (Automatic Reference Counting) en el proyecto, ya que todo el manejo lo hace automáticamente el compilador.&lt;br /&gt;
&lt;br /&gt;
Los problemas que pueden aparecer son de dos clases:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Leaks: un objeto se retiene más veces que las que se libera, por lo que queda memoria en uso, a la que no se puede acceder.&lt;/li&gt;
&lt;li&gt;Zombies: un objeto que se libera más veces de las que se retiene, por lo que la aplicación da un error cuando se le intenta mandar un mensaje.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Los Zombies en general son más fáciles de detectar ejecutando la aplicación, porque la aplicación termina con un error. De todas formas, a partir del error, no siempre es fácil detectar donde se produce o por que.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para ambos casos, Xcode viene con una aplicación llamada Instruments, que permite detectarlos.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Para poder ejecutar Instruments, se debe ejecutar la aplicación con "Profile" (en lugar de "Run"), lo que va a mostrar una pantalla como sigue:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Yxs9qr1h7YU/T2tD4yMP7dI/AAAAAAAABdw/4Ac9xlCfk5I/s1600/Instruments1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://1.bp.blogspot.com/-Yxs9qr1h7YU/T2tD4yMP7dI/AAAAAAAABdw/4Ac9xlCfk5I/s320/Instruments1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
En esta pantalla se elige que es lo que queremos buscar (Leaks o Zombies), y luego se abre la ventana de Instruments correspondiente y la aplicación en el Simulator.&lt;br /&gt;
&lt;br /&gt;
Al ejecutar la aplicación, si aparece algún problema de memoria, se va a ver en esta ventana.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, cuando tenemos "leaks":&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/-YQqJmZaWF1A/T2tE4g7fOvI/AAAAAAAABeA/d6-b2LyvJQc/s1600/Instruments2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/-YQqJmZaWF1A/T2tE4g7fOvI/AAAAAAAABeA/d6-b2LyvJQc/s320/Instruments2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
En la parte superior de la pantalla, nos muestra en azul la memoria que va usando, y en rojo cuando aparece un "leak".&lt;br /&gt;
&lt;br /&gt;
En la parte de abajo, muestra los objetos que no se liberaron. Ahí se puede ver la clase del objeto, quien fue la biblioteca responsable, y donde fue que se produjo el "leak". Si hacemos click en la flechita al lado de Address, entonces muestra toda la historia de ese objeto: cuando fue que se creo, cuando se retuvo y cuando se liberó.&amp;nbsp;Eso permite tener una idea bastante clara de donde fue que se produjo el problema.&lt;br /&gt;
&lt;br /&gt;
Si bien no nos da la ubicación exacta de donde está el problema (es decir, donde se debió haber liberado la memoria y no se hizo), da mucha información que permite encontrarlo de forma relativamente fácil.&lt;br /&gt;
&lt;br /&gt;
Lo mismo ocurre con los "zombies", cuando la aplicación da un error de tipo "EX_BAD_ACCESS", es seguramente porque tenemos un objeto que se liberó de más.&lt;br /&gt;
&lt;br /&gt;
Cuando corremos la aplicación con Instruments, si aparece un "zombie" muestra una cartel indicándolo, y si hacemos click en la flechita, muestra toda la historia del objeto, cuando se le hizo "retain" y "release", lo que permite encontrar de forma bastante rápida donde está el problema.&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/-ZM79yUrx9sM/T2tG0-ed5gI/AAAAAAAABeI/li9ECjyQ6KA/s1600/Instruments3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://3.bp.blogspot.com/-ZM79yUrx9sM/T2tG0-ed5gI/AAAAAAAABeI/li9ECjyQ6KA/s320/Instruments3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Con Instruments se pueden hacer muchas más cosas. Estas dos tal vez sean las más comunes, pero es una aplicación que tiene mucha potencia. Vale la pena dedicarle un rato, para ver las cosas que tiene. La parte de "Leaks" sobre todo es fundamental para encontrar problemas de memoria, que si no, son muy difíciles de detectar.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-8199996160972599813?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=UR4XXuVUn-Q:49ZaHqpQdvA: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=UR4XXuVUn-Q:49ZaHqpQdvA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=UR4XXuVUn-Q:49ZaHqpQdvA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=UR4XXuVUn-Q:49ZaHqpQdvA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=UR4XXuVUn-Q:49ZaHqpQdvA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=UR4XXuVUn-Q:49ZaHqpQdvA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=UR4XXuVUn-Q:49ZaHqpQdvA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=UR4XXuVUn-Q:49ZaHqpQdvA: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=UR4XXuVUn-Q:49ZaHqpQdvA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=UR4XXuVUn-Q:49ZaHqpQdvA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/UR4XXuVUn-Q/detectar-problemas-de-memoria-con.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-pwgwAk2LWlw/T2tAMRU1ykI/AAAAAAAABdo/D6l509YwQ3w/s72-c/instruments_logo.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/03/detectar-problemas-de-memoria-con.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-7208638330198909919</guid><pubDate>Wed, 07 Mar 2012 22:10:00 +0000</pubDate><atom:updated>2012-03-07T20:10:00.242-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">email</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Administrando el correo con GMail</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s1600/gmail.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/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s1600/gmail.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Si hay algo que me gusta tener ordenado es el correo. No sigo la filosofía de &lt;a href="http://inboxzero.com/"&gt;inbox zero&lt;/a&gt; (ni soy experto en el tema), pero me gusta tener la bandeja de entrada limpia en todo momento.&lt;br /&gt;
&lt;br /&gt;
La idea de esta nota es contar como me organizo, ya que creo haber encontrado una metodología que me convence, y capaz que le puede servir a alguien más. Obviamente si alguien piensa que se puede mejorar, escucho los comentarios.&lt;br /&gt;
&lt;br /&gt;
Para el correo, tanto personal como laboral, uso Gmail. En algún momento probé algún otro cliente (Thunderbird y Sparrow), pero no lograron convencerme del todo. Gmail tiene el Priority Inbox, que facilita bastante la organización.&lt;br /&gt;
&lt;br /&gt;
El Priority Inbox de Gmail permite definir hasta cuatro secciones, que en mi caso son:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;Important and unread&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;etiqueta &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Everything else&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
En &lt;b&gt;&lt;i&gt;Important and unread&lt;/i&gt;&lt;/b&gt;&amp;nbsp;va eso, mensajes que Gmail etiqueta como importantes y que todavía no leí. Hay que entrenar un poco a Gmail para que sepa que cosas tienen que estar marcadas como importantes&amp;nbsp;y cuales no, pero después de un tiempo el algoritmo es bastante bueno (aunque igual a veces se equivoca).&lt;br /&gt;
&lt;br /&gt;
En esa sección no puede haber nada... Cuando chequeo la bandeja de entrada, si hay un mail ahí, entonces hay que prestarle atención. Las opciones son varias:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Si el mail no era importante, entonces lo primero es marcarlo como tal, para que Gmail vaya mejorando la heurística.&lt;/li&gt;
&lt;li&gt;Si es un mail informativo, pero no requiere ninguna acción de mi parte, se lee y se archiva. En caso que tenga información que voy a necesitar más adelante, puede quedar en la sección de &lt;b&gt;&lt;i&gt;Everything else&lt;/i&gt;&lt;/b&gt; como leído.&lt;/li&gt;
&lt;li&gt;Si el mail requiere una acción, pero no urgente, se le pone la etiqueta &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt; para verlo más adelante.&lt;/li&gt;
&lt;li&gt;Si requiere atención urgente, y no estoy con nada urgente en el momento, se lo marca como &lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt;. Si ya estoy con otra cosa, entonces va también a &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Para los mails sin leer que aparecen en &lt;b&gt;&lt;i&gt;Everything else&lt;/i&gt;&lt;/b&gt; (los que Gmail no marca como importantes) se sigue el mismo procedimiento, pero pueden quedar sin leer si estoy con algo urgente en el momento.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
La sección &lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt; es para las cosas que estoy viendo en el momento. Por ejemplo, cuando empiezo a trabajar en un issue, el mail correspondiente lo marco con una estrella, y cuando termino lo desmarco.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obviamente en esta sección no puede haber mucha cosa. Es difícil que esté activamente en más de un tema a la vez, por lo tanto solo pueden estar los mails que corresponden a ese tema. También puede haber algún tema que tenga en espera de una respuesta si pienso que va a llegar rápido, pero si demora mucho, va para &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt;&amp;nbsp;o se archiva (ya va a llegar otro mail con la respuesta...).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Cuando no hay nada en &lt;b&gt;&lt;i&gt;Important and unread&lt;/i&gt;&lt;/b&gt; ni en &lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt;, entonces le toca el turno a &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt;. De los mails que están ahí, se toma el que parezca más importante, se le saca la etiqueta de &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt; y se lo marca como &lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
En este momento tengo:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;0 mails en &lt;b&gt;&lt;i&gt;Important and unread&lt;/i&gt;&lt;/b&gt; :)&lt;/li&gt;
&lt;li&gt;2 mails en &lt;b&gt;&lt;i&gt;Starred&lt;/i&gt;&lt;/b&gt; (uno de un tema que empecé a ver y todavía no terminé y otro esperando una respuesta)&lt;/li&gt;
&lt;li&gt;10 mails en &lt;b&gt;&lt;i&gt;Follow up&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;11 mails en &lt;b&gt;&lt;i&gt;Everything else&lt;/i&gt;&lt;/b&gt;, todos leídos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-7208638330198909919?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ZHvdk7OzkOE:uxBGgL2Yn2s: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=ZHvdk7OzkOE:uxBGgL2Yn2s:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ZHvdk7OzkOE:uxBGgL2Yn2s:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ZHvdk7OzkOE:uxBGgL2Yn2s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ZHvdk7OzkOE:uxBGgL2Yn2s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ZHvdk7OzkOE:uxBGgL2Yn2s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ZHvdk7OzkOE:uxBGgL2Yn2s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ZHvdk7OzkOE:uxBGgL2Yn2s: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=ZHvdk7OzkOE:uxBGgL2Yn2s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ZHvdk7OzkOE:uxBGgL2Yn2s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/ZHvdk7OzkOE/administrando-el-correo-con-gmail.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s72-c/gmail.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/03/administrando-el-correo-con-gmail.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-3174147809760046648</guid><pubDate>Sun, 26 Feb 2012 18:37:00 +0000</pubDate><atom:updated>2012-02-27T11:13:57.267-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">internet</category><title>HTTPS y sitios uruguayos</title><description>Hace unos días leí un artículo en el blog de Jeff Atwood, que hablaba sobre &lt;a href="http://www.codinghorror.com/blog/2012/02/should-all-web-traffic-be-encrypted.html"&gt;si se debería encriptar todo el tráfico de internet usando HTTPS&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La conclusión que llega, con la que estoy totalmente de acuerdo, es que sí se debe usar HTTPS siempre que el usuario esté logueado y se puede usar HTTP para el contenido público. De todas formas, el costo de usar HTTPS hoy en día es muy bajo (en términos de recursos).&lt;br /&gt;
&lt;br /&gt;
El protocolo HTTPS lo que hace (muy básicamenete), es encriptar la comunicación entre el servidor y el cliente, utilizando un certificado de clave pública/privada del lado del servidor. Para eso, el sitio que va a utilizar HTTPS, necesita tener un certificado válido.&lt;br /&gt;
&lt;br /&gt;
Cuando un cliente se quiere conectar le pide el certificado al servidor, verifica que sea válido, y si lo es se lleva a cabo la comunicación.&lt;br /&gt;
&lt;br /&gt;
La parte de "verifica que sea válido" es la más compleja, porque ambas partes tienen que confiar en alguien común, que valide el certificado, es decir, que asegure que el servidor es quien dice ser.&lt;br /&gt;
&lt;br /&gt;
Para eso existen las entidades certificadoras, que tienen certificados que son de conocimiento público (porque vienen instalados con el sistema operativo o con el navegador web), y que usan para firmar los certificados de los demás sitios web. Así, por ejemplo, si veo el certificado de GMail, veo que la raíz del certificado es de confianza.&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/-XGC5RzeBcPU/T0p6kA6MpMI/AAAAAAAABbk/cSowSLlk1A0/s1600/Captura+de+pantalla+2012-02-26+a+la(s)+16.30.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://1.bp.blogspot.com/-XGC5RzeBcPU/T0p6kA6MpMI/AAAAAAAABbk/cSowSLlk1A0/s320/Captura+de+pantalla+2012-02-26+a+la(s)+16.30.14.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En Uruguay, quien emite certificados, es el Correo. ¿Y adivinen qué?: el certificado no está firmado por una entidad de confianza:&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/-X5kqhMa5-jc/T0p6jUIOI_I/AAAAAAAABbc/Lzavh4B53Zw/s1600/Captura+de+pantalla+2012-02-26+a+la%2528s%2529+16.14.39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://4.bp.blogspot.com/-X5kqhMa5-jc/T0p6jUIOI_I/AAAAAAAABbc/Lzavh4B53Zw/s320/Captura+de+pantalla+2012-02-26+a+la%2528s%2529+16.14.39.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Por lo tanto, cuando quiero ir a la página del Banco de Previsión Social, Chrome me muestra lo siguiente:&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/-d6Fz3TiHUBY/T0p6ihST8oI/AAAAAAAABbU/z3fZ2aQeR7U/s1600/Captura+de+pantalla+2012-02-26+a+la%2528s%2529+16.13.53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://3.bp.blogspot.com/-d6Fz3TiHUBY/T0p6ihST8oI/AAAAAAAABbU/z3fZ2aQeR7U/s320/Captura+de+pantalla+2012-02-26+a+la%2528s%2529+16.13.53.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Por suerte el país está discutiendo el tema de la firma digital...&lt;br /&gt;
&lt;br /&gt;
Ah, y por si fuera poco, después que uno se registra (ignorando este tema de que el certificado no es de confianza), le mandan la contraseña generada automáticamente a la dirección de e-mail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-3174147809760046648?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zArDl0CnFFw:hQhSVnvy_PM: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=zArDl0CnFFw:hQhSVnvy_PM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zArDl0CnFFw:hQhSVnvy_PM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zArDl0CnFFw:hQhSVnvy_PM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zArDl0CnFFw:hQhSVnvy_PM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zArDl0CnFFw:hQhSVnvy_PM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zArDl0CnFFw:hQhSVnvy_PM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zArDl0CnFFw:hQhSVnvy_PM: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=zArDl0CnFFw:hQhSVnvy_PM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zArDl0CnFFw:hQhSVnvy_PM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/zArDl0CnFFw/https-y-sitios-uruguayos.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-XGC5RzeBcPU/T0p6kA6MpMI/AAAAAAAABbk/cSowSLlk1A0/s72-c/Captura+de+pantalla+2012-02-26+a+la(s)+16.30.14.png" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/02/https-y-sitios-uruguayos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6079495998596430334</guid><pubDate>Fri, 20 Jan 2012 11:30:00 +0000</pubDate><atom:updated>2012-01-20T09:30:38.335-02: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 for Smart Devices</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;
Esta nota es solo para contarles que estamos empezando un nuevo blog: &lt;a href="http://genexus-sd.blogspot.com/"&gt;GeneXus for Smart Devices&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La idea es tener un lugar donde contar las cosas que estamos haciendo, nuevas funcionalidades, tips, como extender los generadores, etc.&lt;br /&gt;
&lt;br /&gt;
Los invito a que lo visiten y se suscriban (&lt;a href="http://feeds.feedburner.com/GenexusSD"&gt;por RSS&lt;/a&gt;). Ya tiene un par de notas, la bienvenida y una nota contando una funcionalidad nueva :)&lt;br /&gt;
&lt;br /&gt;
El blog está en inglés, porque &lt;a href="http://www.codinghorror.com/blog/2009/03/the-ugly-american-programmer.html"&gt;parece lo más razonable para una comunidad de desarrolladores&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-6079495998596430334?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=31kAB-Vqzyo:RNKeoa7bo50: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=31kAB-Vqzyo:RNKeoa7bo50:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=31kAB-Vqzyo:RNKeoa7bo50:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=31kAB-Vqzyo:RNKeoa7bo50:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=31kAB-Vqzyo:RNKeoa7bo50:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=31kAB-Vqzyo:RNKeoa7bo50:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=31kAB-Vqzyo:RNKeoa7bo50:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=31kAB-Vqzyo:RNKeoa7bo50: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=31kAB-Vqzyo:RNKeoa7bo50:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=31kAB-Vqzyo:RNKeoa7bo50:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/31kAB-Vqzyo/nuevo-blog-genexus-for-smart-devices.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>5</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2012/01/nuevo-blog-genexus-for-smart-devices.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2749050155114942492</guid><pubDate>Thu, 12 Jan 2012 13:21:00 +0000</pubDate><atom:updated>2012-01-12T11:21:54.136-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">user controls</category><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">genexus_x_ev2</category><category domain="http://www.blogger.com/atom/ns#">objective-c</category><title>Implementar un User Control para el generador iOS</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;
En los generadores para Smart Devices en GeneXus X Evolution 2, tenemos la posibilidad de crear user controls, para extender el comportamiento del generador.&lt;br /&gt;
&lt;br /&gt;
La idea de esta nota es contar como desarrollar un nuevo user control para el generador iOS.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Nota&lt;/i&gt;: crear un nuevo user control involucra varios pasos: implementación en la plataforma, definición del control, implementar resolvers para las propiedades, distribución, etc. Ahora me voy a concentrar solo en la parte de implementación.&lt;br /&gt;
&lt;br /&gt;
Como ejemplo, voy a mostrar como implementar el SD ImageMap. Básicamente lo que hace es mostrar una imagen de fondo con un conjunto de imágenes en posiciones determinadas, que cuando se seleccionan tiene la posibilidad de disparar una acción.&lt;br /&gt;
&lt;br /&gt;
El código completo del control (al día de hoy) lo pueden ver en&amp;nbsp;&lt;a href="https://gist.github.com/1600064"&gt;https://gist.github.com/1600064&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Clase base&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como decía, el control muestra una lista de imágenes con una imagen grande de fondo. Esa lista puede venir de una tabla en la base de datos, o de un SDT collection. En cualquier caso, los controles que reciben una lista de registros, se implementan a partir de un control Grid en GeneXus, cambiando la propiedad Control Type según corresponda.&lt;br /&gt;
&lt;br /&gt;
Lo primero que tenemos que hacer entonces es crear la clase &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;GXControlImageMap&lt;/span&gt;, como subclase de &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;GXControlGridBase&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Advertencia&lt;/i&gt;: los nombres que empiezan con "GX" están reservados. En este caso el control es parte del Framework, por lo tanto puede llamarse así. Cuando implementen sus controles usen algún otro nombre...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Creación de la vista&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Lo primero que debemos implementar es el método que crea la vista que va a utilizar el control. La forma de hacerlo es implementar el método&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;newGridViewWithFrame:&lt;/span&gt;, que será llamado por la clase base cuando se haga el &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadView&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Es importante notar que no es aconsejable implementar el &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadView&lt;/span&gt; directamente, ya que la clase base hace varias cosas además de crear la vista del control (por ejemplo crea otra vista donde coloca la vista que estamos creando, le aplica la propiedad "Visible", etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (UIView *)newGridViewWithFrame:(CGRect)frame {
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
    [imageView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];

    NSString *imageName = [self imageName];
    if (imageName) {
        UIImage *embededImage = [GXResources imageForName:imageName];
        if (embededImage) {
            [imageView setImage:embededImage];
        }
        else {
            NSURL *imageUrl = [GXResources urlForImageName:imageName];
            [imageView setImageWithURL:imageUrl placeholderImage:nil];
        }
    }
    
    [imageView setUserInteractionEnabled:YES];
    
    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleImageTap:)];
    
    [imageView addGestureRecognizer:tapGestureRecognizer];
    
    [tapGestureRecognizer release];
    
    return imageView;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
El método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;newGridViewWIthFrame:&lt;/span&gt; hace lo siguiente:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;crea un &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UIImageView&lt;/span&gt; donde va a dibujar la imagen de fondo&lt;/li&gt;
&lt;li&gt;carga la imagen, el valor lo obtiene usando el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;imageName&lt;/span&gt; (ver más adelante)&lt;/li&gt;
&lt;li&gt;agrega un "tap gesture recognizer" para poder detectar cuando se hace un tap sobre alguna de las imágenes&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Acceso a la vista del control&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UIImageView&lt;/span&gt; que estamos creando en este método queda accesible usando el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gridView&lt;/span&gt; de la clase base. Es recomendable implementar un método que permita acceder a esta vista con el tipo de datos correcto, ya el &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;gridView&lt;/span&gt; es un &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UIView&lt;/span&gt; genérico. Por lo tanto, el control implementa el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;imageView
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (UIImageView *)imageView {
    return (UIImageView *)[self gridView];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Propiedades definidas en GeneXus&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El control también va a necesitar acceso a las propiedades definidas en GeneXus. Para eso define nueve métodos, uno por cada una de las propiedades:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (NSString *)imageName;
- (NSString *)imageAtt;
- (NSString *)imageField;
- (NSString *)horizontalCoordinateAtt;
- (NSString *)horizontalCoordinateField;
- (NSString *)verticalCoordinateAtt;
- (NSString *)verticalCoordinateField;
- (NSString *)sizeAtt;
- (NSString *)sizeField;
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
La propiedad &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;imageName&lt;/span&gt; tiene el nombre de la imagen de fondo a usar.&lt;br /&gt;
&lt;br /&gt;
Las demás propiedades vienen en pares, una con sufijo "Att" y la otra con sufijo "Field". La propiedad con sufijo "Att" indica el nombre del atributo o variable que contiene el valor. La propiedad con sufijo "Field" contiene el "field specifier", que se usa en el caso que el "Att" sea un SDT, e indica el nombre del miembro del SDT.&lt;br /&gt;
&lt;br /&gt;
Ejemplos:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Si usamos el atributo MyAttribute, en la propiedad "Att" viene "MyAttribute" y la propiedad "Field" viene vacía&lt;/li&gt;
&lt;li&gt;Si usamos la variable &amp;amp;MyVar, en la propiedad "Att" viene "&amp;amp;MyVar" y la propiedad "Field" viene vacía.&lt;/li&gt;
&lt;li&gt;Si usamos un miembro de un SDT, &amp;amp;MySDT.Item, entonces en la propiedad "Att" viene "&amp;amp;MySDT" y en la propiedad "Field" viene "Item"&lt;/li&gt;
&lt;/ul&gt;
Los cuatro grupos de propiedades que tienen esta característica son:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;image: contiene la imagen del ítem a mostrar&lt;/li&gt;
&lt;li&gt;horizontalCoordinate: la posición horizontal donde se debe mostrar, relativo al tamaño de la imagen de fondo (el origen de coordenadas {0,0} está en la parte superior izquierda de la imagen de fondo)&lt;/li&gt;
&lt;li&gt;verticalCoordinate: la posición vertical&lt;/li&gt;
&lt;li&gt;size: el tamaño con el que se debe mostrar la imagen, relativo al tamaño de la imagen de fondo.&lt;/li&gt;
&lt;/ul&gt;
Las propiedades se leen de forma muy simple, por ejemplo:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (NSString *)horizontalCoordinateAtt {
    return [[self properties] getPropertyValueString:@"@SDImageMapHCoordAtt"];    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
La única que tiene algo más de complejidad es &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;imageName&lt;/span&gt;, que por ser una imagen viene con un prefijo que es el GUID de las imágenes, y debemos separarlo para poder usarla:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (NSString *)imageName {
    NSString *imageName = [[self properties] getPropertyValueString:@"@SDImageMapImage"];
    imageName = [GXObjectHelper parseObjectNameOfType:kGXObjectIdImage from:imageName];
    return imageName;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Carga de datos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La carga de datos la maneja la clase base, y cuando termina de obtener los datos del servidor le manda el mensaje &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;reloadData&lt;/span&gt; al control.&lt;br /&gt;
&lt;br /&gt;
En este caso la implementación invoca un método privado &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadData:&lt;/span&gt; pasándole la cantidad de registros que tiene el proveedor de datos:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (void)reloadData {
    [self loadData:[[self entityDataListProvider] numberOfLoadedEntitiesInSection:0]];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
El método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadData:&lt;/span&gt; es más interesante.&lt;br /&gt;
&lt;br /&gt;
Lo primero que hace es borrar cualquier imagen que tuviera ya cargada, porque las va a volver a agregar:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;[[[self imageView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Luego obtiene los valores de las propiedades configuradas en GeneXus:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;NSString *imageNameAtt = [self imageAtt];
NSString *imageNameField = [self imageField];
NSString *hCoordAtt = [self horizontalCoordinateAtt];
NSString *hCoordField = [self horizontalCoordinateField];
NSString *vCoordAtt = [self verticalCoordinateAtt];
NSString *vCoordField = [self verticalCoordinateField];
NSString *sizeAtt = [self sizeAtt];
NSString *sizeField = [self sizeField];
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Lo siguiente es iterar sobre los registros disponibles (la cantidad se le pasa como parámetro al &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadData:&lt;/span&gt;&amp;nbsp;en la variable &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;count&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;for(NSUInteger index = 0; index &amp;lt; count; index++)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
y para cada uno, obtener los valores. Para eso usamos el método&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;valueForEntityDataFieldName:fieldSpecifier:indexPath:&lt;/span&gt; de la clase base:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
NSString *imageName = [self valueForEntityDataFieldName:imageNameAtt fieldSpecifier:imageNameField indexPath:indexPath];
NSNumber *hCoord = [self valueForEntityDataFieldName:hCoordAtt fieldSpecifier:hCoordField indexPath:indexPath];
NSNumber *vCoord = [self valueForEntityDataFieldName:vCoordAtt fieldSpecifier:vCoordField indexPath:indexPath];
NSNumber *size = [self valueForEntityDataFieldName:sizeAtt fieldSpecifier:sizeField indexPath:indexPath];
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Nótese que el &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;indexPath&lt;/span&gt; le indica al proveedor de datos cual es el registro que estamos procesando.&lt;br /&gt;
&lt;br /&gt;
El resto del código del evento es específico al control y no viene mucho al caso, lo pueden ver en el link con el código completo. Lo único para destacar es que con los valores de las propiedades leídas crea un &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;UIImageView&lt;/span&gt; para cada ítem y lo agrega a la vista principal del control con&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;[[self imageView] addSubview:itemView];
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Disparo de acciones&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Por último, lo que hace el control es disparar la "default action" cuando se selecciona una de las imágenes.&lt;br /&gt;
&lt;br /&gt;
Eso se configuró en el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;newGridViewWithFrame:&lt;/span&gt; cuando agregamos el "tap gesture recognizer", que va a invocar el método handleImageTap:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;- (void)handleImageTap:(UITapGestureRecognizer *)sender {
    UIView *mainView = [self imageView];
    
    CGPoint tapPoint = [sender locationInView:mainView];
    UIView *tappedView = [mainView hitTest:tapPoint withEvent:nil];
    
    if (tappedView &amp;amp;&amp;amp; tappedView != mainView) {
        NSUInteger index = [tappedView tag];
        [self executeDefaultActionForEntityAtSection:0 row:index];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Este método determina sobre cual ítem se hizo el tap, y luego simplemente llama al método&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;executeDefaultActionForEntityAtSection:row:&lt;/span&gt; de la clase base para que se encargue.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Resumen&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La nota quedó bastante larga, pero en realidad no es mucho lo que hay que hacer para implementar un user control. La parte más compleja se encarga la clase base: obtener los datos (ya sea de un data provider o de un SDT), lectura de propiedades, manejo de la vista del control, manejo de eventos, etc.&lt;br /&gt;
&lt;br /&gt;
En resumen, lo que tiene que hacer el control es:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;crear la vista, en el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;newGridViewWithFrame:&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;implementar el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;reloadData&lt;/span&gt; para cargar los datos que vienen en el provider (en este caso se implementó en un método privado &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;loadData:&lt;/span&gt;, pero es lo mismo)&lt;/li&gt;
&lt;li&gt;determinar cuándo se debe disparar una acción y cuál es el ítem que corresponde.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-2749050155114942492?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Q08x4G6pWQ:UQl4x7Pe0Lg: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=-Q08x4G6pWQ:UQl4x7Pe0Lg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Q08x4G6pWQ:UQl4x7Pe0Lg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Q08x4G6pWQ:UQl4x7Pe0Lg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Q08x4G6pWQ:UQl4x7Pe0Lg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Q08x4G6pWQ:UQl4x7Pe0Lg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Q08x4G6pWQ:UQl4x7Pe0Lg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=-Q08x4G6pWQ:UQl4x7Pe0Lg: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=-Q08x4G6pWQ:UQl4x7Pe0Lg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=-Q08x4G6pWQ:UQl4x7Pe0Lg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/-Q08x4G6pWQ/implementar-un-user-control-para-el.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/2012/01/implementar-un-user-control-para-el.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4096460988081360114</guid><pubDate>Thu, 05 Jan 2012 13:41:00 +0000</pubDate><atom:updated>2012-01-05T11:41:48.858-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: implementar método de forma opcional en runtime</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;
Una de las ventajas que tiene Objective-C, es que es un lenguaje dinámico.&lt;br /&gt;
&lt;br /&gt;
Eso permite tener protocolos (interfaces en otros lenguajes...) con métodos declarados como opcionales, y preguntar en tiempo de ejecución si la clase que voy a usar implementa el método.&lt;br /&gt;
&lt;br /&gt;
Esta característica está buena, pero ahora necesito ir un paso más lejos. Quiero que una clase implemente o no un método, pero según alguna condición que solo conozco en tiempo de ejecución.&lt;br /&gt;
&lt;br /&gt;
El caso de uso es el siguiente. Cuando se tiene una tabla (UITableView) se pueden mostrar los registros agrupados en secciones, y en esos casos se puede cambiar la apariencia de lo títulos de las secciones.&lt;br /&gt;
&lt;br /&gt;
En GeneXus tenemos la posibilidad de cambiar estos títulos usando la clase del tema GroupSeparator (es nueva, la estamos implementando...)&lt;br /&gt;
&lt;br /&gt;
El problema es que esa propiedad puede estar vacía, y en ese caso lo que quiero es que la tabla muestre el separador por defecto, que tiene un fondo con gradiente, letra con sombra, etc.&lt;br /&gt;
&lt;br /&gt;
Entonces lo que quiero es que el control Grid implemente el método&amp;nbsp;&lt;i&gt;tableView:viewForHeaderInSection: &lt;/i&gt;solamente si tiene tema y si el tema tiene la propiedad "Group Separator".&lt;br /&gt;
&lt;br /&gt;
Si bien en el lenguaje es natural tener métodos opcionales, no es evidente como hacer para que una clase implemente un método a veces sí y a veces no...&lt;br /&gt;
&lt;br /&gt;
La solución que encontré creo que es bastante buena... y consiste en implementar el método &lt;i&gt;respondsToSelector:&lt;/i&gt;, y devolver lo que corresponda. Para el resto de los métodos, podemos dejar que el lenguaje resuelva de forma automática.&lt;br /&gt;
&lt;br /&gt;
La implementación del método&amp;nbsp;&lt;i&gt;respondsToSelector:&lt;/i&gt;&amp;nbsp;queda entonces así:&lt;br /&gt;
&lt;code style="font-size: small;"&gt;
- (BOOL)respondsToSelector:(SEL)aSelector {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; if (aSelector == @selector(tableView:viewForHeaderInSection:)) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return [[self themeClassList] groupSeparatorThemeClass] != nil;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; return [super respondsToSelector:aSelector];&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Hay un detalle con esta implementación. La tabla le pregunta al delegate si implementa el método solo una vez, y se guarda el resultado. Por lo tanto, cuando cambia alguna de las condiciones (en este caso, cuando se le aplica el tema al control) hay que poner el delegate en nil y volver a asignarlo para que vuelva a preguntar si implementa el método.&lt;br /&gt;
&lt;br /&gt;
Otra opción puede ser tener una clase proxy que tenga una lista de selectors que se tienen que ignorar en tiempo de ejecución, e implementar los métodos &lt;i&gt;respondsToSelector:&lt;/i&gt; y &lt;i&gt;forwardInvocation:&lt;/i&gt; en el proxy para que pasen solo los permitidos. Puede ser una mejor opción si se usa mucho esta técnica. Para un caso puntual como este, la sobrecarga de&amp;nbsp;&lt;i&gt;respondsToSelector:&lt;/i&gt;&amp;nbsp;es mucho más simple.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4096460988081360114?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VqsLOX0s_y4:e5Y_OjLB2Wk: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=VqsLOX0s_y4:e5Y_OjLB2Wk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VqsLOX0s_y4:e5Y_OjLB2Wk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VqsLOX0s_y4:e5Y_OjLB2Wk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VqsLOX0s_y4:e5Y_OjLB2Wk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VqsLOX0s_y4:e5Y_OjLB2Wk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VqsLOX0s_y4:e5Y_OjLB2Wk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VqsLOX0s_y4:e5Y_OjLB2Wk: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=VqsLOX0s_y4:e5Y_OjLB2Wk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VqsLOX0s_y4:e5Y_OjLB2Wk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/VqsLOX0s_y4/objective-c-implementar-metodo-de-forma.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/2012/01/objective-c-implementar-metodo-de-forma.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4130374961376724365</guid><pubDate>Mon, 12 Dec 2011 21:22:00 +0000</pubDate><atom:updated>2011-12-12T19:22:00.113-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">curiosidades</category><title>Serie numérica</title><description>Hace un tiempo en un pizarrón en la oficina apareció la siguiente serie:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;1&lt;br /&gt;
11&lt;br /&gt;
21&lt;br /&gt;
1211&lt;br /&gt;
111221&lt;br /&gt;
312211&lt;br /&gt;
13112221&lt;/code&gt;
&lt;br /&gt;
&lt;code&gt;1113213211&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Algunas preguntas:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;¿Cuál es el próximo elemento de la serie y como se construye?&lt;/li&gt;
&lt;li&gt;¿Cuál es el dígito más grande que puede aparecer? Tip: es menor que 9 :)&lt;/li&gt;
&lt;li&gt;Tengo una conjetura: el largo de un elemento de la serie no puede ser menor que el largo del elemento anterior. ¿Alguien se anima a demostrarlo?&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4130374961376724365?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9vyoYwtbfM8:pvniQKM5hS4: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=9vyoYwtbfM8:pvniQKM5hS4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9vyoYwtbfM8:pvniQKM5hS4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9vyoYwtbfM8:pvniQKM5hS4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9vyoYwtbfM8:pvniQKM5hS4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9vyoYwtbfM8:pvniQKM5hS4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9vyoYwtbfM8:pvniQKM5hS4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=9vyoYwtbfM8:pvniQKM5hS4: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=9vyoYwtbfM8:pvniQKM5hS4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=9vyoYwtbfM8:pvniQKM5hS4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/9vyoYwtbfM8/serie-numerica.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>4</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/12/serie-numerica.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2750596397143739192</guid><pubDate>Sat, 10 Dec 2011 15:19:00 +0000</pubDate><atom:updated>2011-12-12T08:57:10.797-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>Sobre la comparación entre lenguaje de programación</title><description>El otro día en un almuerzo salió el tema de si tiene sentido comparar distintos lenguajes de programación.&lt;br /&gt;
&lt;br /&gt;
Una de las posturas era que en realidad, con cualquier lenguaje de programación moderno (léase Java, C#, Objective-C, Ruby, etc.) puedo solucionar cualquier problema que pueda solucionar con otro de estos lenguajes.&lt;br /&gt;
&lt;br /&gt;
De todas formas yo creo que sí se pueden comparar, y que si bien con cualquiera se pueden resolver los problemas, no se obtiene la misma productividad.&lt;br /&gt;
&lt;br /&gt;
Voy a poner un ejemplo, usando una muy pequeña característica de los lenguajes de programación: los loops de tipo "for".&lt;br /&gt;
&lt;br /&gt;
El caso más simple, es querer recorrer una colección partiendo del primer item hasta el último, avanzando de a uno. Para eso me alcanza una construcción del tipo:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for index = 0 to count-1 {&lt;br /&gt;&amp;nbsp; // hacer algo con index&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
¿Qué pasa ahora si quiero contar de dos en dos? ¿Me sirve la construcción anterior? Bueno, sí... puedo escribir lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for fakeIndex = 0 to (count-1)/2 {&lt;br /&gt;
&amp;nbsp; index = fakeIndex * 2&lt;br /&gt;&amp;nbsp; // hacer algo con index&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
No es complicado, pero no parece muy práctico. Un lenguaje que le pueda decir el "step" al comando "for" no es más potente, pero sí más práctico. La forma de escribirlo quedaría entonces:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for index = 0 to count-1 step 2 {&lt;br /&gt;
&amp;nbsp; // hacer algo con index&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
El problema que tiene esto, es que si quiero que el step sea variable, por ejemplo quiero iterar sobre las potencias de 2, con el step solo no me alcanza. Lo puedo resolver, pero queda más complicado. Una solución es usar la sintaxis que usa C, donde se le indica el valor inicial, la condición de parada, y el incremento. Así:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for (int index = 1; index &amp;lt;= someValue; index *= 2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;// hacer algo con index&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Esta iteración sí la puedo construir con el primer tipo de "for", pero es más difícil: hay que pensar como mapear el índice de la iteración con el índice que realmente quiero manejar.&lt;br /&gt;
&lt;br /&gt;
De todas formas, cuando uno tiene este "for" como es el caso de C y todos sus lenguajes derivados, lo más común es usarlo para acceder a los elementos de una colección:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for (int index = 0; index &amp;lt; array.count; index++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;value = array[index];&lt;br /&gt;&amp;nbsp;&amp;nbsp;// hacer algo con value&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
En general, el índice se termina usando solo para acceder al elemento correspondiente de la colección. El valor inicial, el final y el incremento son una construcción artificial. Lo que realmente quiero es poder iterar sobre los elementos de mi colección.&lt;br /&gt;
&lt;br /&gt;
Supongamos ahora que tengo una construcción que me permite hacer esto:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;for (value in array) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;// hacer algo con value&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
¿Es esta construcción más potente que la anterior? No, las dos permiten expresar lo mismo. Pero sin duda es mucho más conveniente, aumenta la productividad y minimiza el riesgo de cometer errores (por ejemplo si uso "index &amp;lt;= array.count" en vez de "index &amp;lt; array.count", error bastante común).&lt;br /&gt;
&lt;br /&gt;
¿Se puede hacer mejor? Sí, se puede, y lo curioso del caso es que para la forma de mejorarlo es eliminar la construcción "for", que es lo que se tiene en Ruby (donde sí existe el "for" pero no se usa...).&lt;br /&gt;
&lt;br /&gt;
Si no tengo el comando "for", entonces tengo que buscar otra forma de iterar sobre una colección o conjunto de valores. Esto en Ruby se resuelve con el método "each" (o "each_index") de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;array.each do |value|&lt;br /&gt;&amp;nbsp;&amp;nbsp;# hacer algo con value&lt;br /&gt;
end&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
o&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;(0..5).each do |index|&lt;br /&gt;&amp;nbsp;&amp;nbsp;# hacer algo con index&lt;br /&gt;
end&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
¿Por qué esto es mejor? Porque si el "each" es un método y no una construcción del lenguaje, quiere decir que el lenguaje me permite iterar de la forma que quiera. Ahora puedo separar el uso del "for" según para que lo quiera.&lt;br /&gt;
&lt;br /&gt;
Las cosas más comunes para las que recorro una colección son para transformar los elementos en otra colección, filtrar los valores según alguna condición, o acumular en una variable. Entonces puedo tener métodos que hagan estas cosas, y en mi programa no voy a necesitar la iteración, porque en realidad lo que quería no era iterar sino hacer algo de más alto nivel a la colección.&lt;br /&gt;
&lt;br /&gt;
En conclusión, es verdad que no hay nada que no pueda resolver con las construcciones más simples, y por lo tanto no hay un lenguaje más potente que otro, lo que sí hay son lenguajes más productivos.&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;
Actualización, 12/12/11 8:56: Willy me encontró un bug, así que lo corregí... Había un loop que empezaba en cero e incrementaba multiplicando por dos, por lo que nunca iba a salir...&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-2750596397143739192?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=CdH0VVXkQaQ:BVNGd3wmk10: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=CdH0VVXkQaQ:BVNGd3wmk10:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=CdH0VVXkQaQ:BVNGd3wmk10:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=CdH0VVXkQaQ:BVNGd3wmk10:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=CdH0VVXkQaQ:BVNGd3wmk10:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=CdH0VVXkQaQ:BVNGd3wmk10:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=CdH0VVXkQaQ:BVNGd3wmk10:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=CdH0VVXkQaQ:BVNGd3wmk10: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=CdH0VVXkQaQ:BVNGd3wmk10:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=CdH0VVXkQaQ:BVNGd3wmk10:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/CdH0VVXkQaQ/sobre-la-comparacion-entre-lenguaje-de.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/12/sobre-la-comparacion-entre-lenguaje-de.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-6262505304637334116</guid><pubDate>Mon, 14 Nov 2011 22:32:00 +0000</pubDate><atom:updated>2011-11-14T20:32:00.161-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">eventos</category><title>RubyConf Uruguay 2011</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-EwW3lM6W9sI/Tr7V8XR6EWI/AAAAAAAABak/5Pgt6OZZXCg/s1600/Captura+de+pantalla+2011-11-12+a+las+18.22.31.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/-EwW3lM6W9sI/Tr7V8XR6EWI/AAAAAAAABak/5Pgt6OZZXCg/s1600/Captura+de+pantalla+2011-11-12+a+las+18.22.31.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Los días 11 y 12 de noviembre se llevó a cabo el evento &lt;a href="http://rubyconfuruguay.org/"&gt;RubyConf Uruguay 2011&lt;/a&gt;. Este año (es la segunda vez que se hace) tuve la suerte de poder ir.&lt;br /&gt;
&lt;br /&gt;
El evento fue en el &lt;a href="http://www.antel.com.uy/antel/institucional/nuestra-empresa/complejo-torre/complejo-cultural/auditorio"&gt;Auditorio de Antel&lt;/a&gt;&amp;nbsp;que está muy bueno, nunca había ido.&lt;br /&gt;
&lt;br /&gt;
El formato del evento fue de charlas de 30 minutos, de a una por vez (había una sola sala).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Oradores&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Una cosa que me sorprendió fue el buen nivel de los oradores. Trajeron gente de varias partes del mundo (Argentina, Brasil, Chile, Estados Unidos, Alemania, Australia, Japón y seguramente alguno más...). Pero no solo eso, trajeron algunas personalidades importantes del mundo de Ruby, como por ejemplo&amp;nbsp;&lt;a href="http://scottchacon.com/"&gt;Scott Chacon&lt;/a&gt;, uno de los creadores de &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;, o&amp;nbsp;&lt;a href="http://twitter.com/bmizerany"&gt;Blake Mizerany&lt;/a&gt;, creador de &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Una curiosidad con respecto a los oradores internacionales: varios de habla inglesa dieron su charla en español, pero todos los brasileros que vi (3 por lo menos) la dieron en inglés...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Audiencia&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Siendo un evento técnico, para desarrolladores, la audiencia éramos todos (o la gran mayoría) desarrolladores.&lt;br /&gt;
&lt;br /&gt;
Otra característica es que la inmensa mayoría eran hombres. Diría que un 95%, pero tengo miedo de quedarme corto...&lt;br /&gt;
&lt;br /&gt;
Con respecto a la vestimenta de la gente, era sumamente informal. Y lo digo yo que durante años fui vestido de forma informal (pero no tanto) a los encuentros GeneXus... Había por ejemplo gente de la organización de short y chinelas, o expositores que dieron la charla de bermudas.&lt;br /&gt;
&lt;br /&gt;
Otra cosa que me llamó la atención es que un buen número de las personas que asistieron estaban con su notebook, y lo tenían abierto y prendido durante las charlas. Los notebooks, habían muchas Macs, y las que no eran Macs por lo que se veía tenían Linux. Creo que no vi a nadie usar un Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Organización&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La organización estuvo bastante bien:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;el wi-fi funcionó muy bien todo el tiempo,&lt;/li&gt;
&lt;li&gt;las charlas empezaron y terminaron con una puntualidad bastante aceptable (claro, uno se mal acostumbra y lo compara con los encuentros GeneXus...),&lt;/li&gt;
&lt;li&gt;el lugar en sí está bueno para un evento de este tamaño.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Charlas&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Con respecto a las charlas, hubo momentos donde me perdí un poco, porque al no estar metido de lleno en la tecnología hay cosas que me resultaron demasiado específicas.&lt;br /&gt;
&lt;br /&gt;
De todas formas, hubo varias que me gustaron. Creo que &lt;a href="http://www.eventials.com/rubyconfuy"&gt;se pueden ver acá&lt;/a&gt; (aunque no probé...)&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;A Tale of Three Trees&lt;/b&gt;, por Scott Chacon sobre git, y más específicamente sobre el comando git-reset y como maneja internamente la última versión confirmada, los cambios para confirmar y el directorio de trabajo.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JRuby: Introduciendo Ruby en el mundo enterprise&lt;/b&gt;, por Jano Gonzalez.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lean Startups for the Ruby Hacker&lt;/b&gt;, por Evan Henshaw-Plath.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Winning strategies in the battle against code smells&lt;/b&gt;, por Nigel Fernandes.&lt;/li&gt;
&lt;/ul&gt;
Hubo varios temas recurrentes, como metodologías ágiles de desarrollo, TDD o pair programming. De este último me llama la atención, porque hay varios que dijeron que usan pair programming todo el tiempo. Yo le veo la utilidad, pero más para cosas específicas. No se si me convencen de hacer pair programming todo el tiempo...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Me gustó el evento, creo que valió la pena ir. Sirve para salir un poco de lo que uno está acostumbrado y ver en que anda la gente de otras comunidades.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-6262505304637334116?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=nAT9N7UtQP8:yn7Hlbdsiug: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=nAT9N7UtQP8:yn7Hlbdsiug:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=nAT9N7UtQP8:yn7Hlbdsiug:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=nAT9N7UtQP8:yn7Hlbdsiug:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=nAT9N7UtQP8:yn7Hlbdsiug:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=nAT9N7UtQP8:yn7Hlbdsiug:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=nAT9N7UtQP8:yn7Hlbdsiug:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=nAT9N7UtQP8:yn7Hlbdsiug: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=nAT9N7UtQP8:yn7Hlbdsiug:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=nAT9N7UtQP8:yn7Hlbdsiug:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/nAT9N7UtQP8/rubyconf-uruguay-2011.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-EwW3lM6W9sI/Tr7V8XR6EWI/AAAAAAAABak/5Pgt6OZZXCg/s72-c/Captura+de+pantalla+2011-11-12+a+las+18.22.31.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/11/rubyconf-uruguay-2011.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4338841919500608581</guid><pubDate>Wed, 09 Nov 2011 22:37:00 +0000</pubDate><atom:updated>2011-11-09T20:37:00.762-02:00</atom:updated><title>Por qué creo que Objective-C es mejor que Java</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;
Hace unos días &lt;a href="https://twitter.com/#!/GMilano"&gt;@GMilano&lt;/a&gt; &lt;a href="https://twitter.com/#!/gmilano/status/133208370344763392"&gt;hacía una comparación en Twitter&lt;/a&gt; donde decía que&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;Android vs iOS&lt;br /&gt;IDEs:Eclipse &amp;gt; XCode&lt;br /&gt;Language: Java &amp;gt; Objective-C&lt;br /&gt;Framework: Cocoa &amp;gt; Android&lt;br /&gt;Emulator: iOS &amp;gt; Android&lt;br /&gt;Analysis: iOS &amp;gt; Android&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
y &lt;a href="https://twitter.com/#!/mcrispino/status/133293269139456001"&gt;mi respuesta&lt;/a&gt; fue que&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;Casi de acuerdo, solo que Objective-C &amp;gt; Java... Pero, no es algo evidente al principio.&lt;/i&gt;&lt;/blockquote&gt;
Esa respuesta tiene tiene una justificación, pero como verán lleva un poco más de 140 caracteres.&lt;br /&gt;
&lt;br /&gt;
Aclaraciones:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Trabajo con Objective-C desde hace unos dos años, pero hace mucho que no programo en Java en serio. Si cometo algún error en la comparación agradezco que me lo hagan notar.&lt;/li&gt;
&lt;li&gt;Hasta hace no mucho, tenía la idea de que todos los lenguajes de programación "modernos" eran más o menos equivalentes. Si tienen esa misma idea, primero lean este artículo de Joel Spolsky: &lt;a href="http://www.joelonsoftware.com/items/2006/08/01.html"&gt;Can your programming language do this?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Muchas veeces uno no puede elegir (iOS = Objective-C, Android = Java), pero no por eso la comparación deja de ser válida :)&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Extensibilidad de clases estándar&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;
En Objective-C, uno puede agregar métodos a las clases estándar. Digamos por ejemplo que uno quiere agregar el método &lt;i&gt;year&lt;/i&gt; a la clase &lt;i&gt;NSDate&lt;/i&gt; para invocarlo con
&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;int year = [myDate year];&lt;/tt&gt;&lt;/blockquote&gt;
en vez de hacer&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:myDate];&lt;br /&gt;
int year = [comp year];&lt;/tt&gt;&lt;/blockquote&gt;
Eso se puede hacer de forma muy simple, creando una "category" con la implementación
&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;@interface NSDate (Helpers)&lt;br /&gt;
- (int)year;&lt;br /&gt;
@end&lt;br /&gt;
@implementation NSDate&lt;br /&gt;
- (int)year {&lt;br /&gt;&amp;nbsp; &amp;nbsp; NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:self];&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return [comp year];&lt;br /&gt;
}&lt;br /&gt;
@end&lt;/tt&gt;&lt;/blockquote&gt;
Esto &lt;a href="http://stackoverflow.com/questions/4359979/java-equivalent-to-c-sharp-extension-methods/4359990#4359990"&gt;en Java no es posible&lt;/a&gt;. Se puede crear una subclase, o hacer un método estático en alguna otra clase, pero no modificar las clases ya existentes.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Blocks y selectors&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En Objective-C, se pueden definir métodos que reciban un bloque de código o un "selector" (básicamente es el nombre de un método). En Java el &lt;a href="http://stackoverflow.com/questions/4685563/how-to-pass-a-function-as-a-parameter-in-java"&gt;pasaje de funciones por parámetro&lt;/a&gt; es bastante más complicado e involucra crear una clase específica que contenga el método.&lt;br /&gt;
&lt;br /&gt;
Pasar funciones o bloques de código por parámetro permite por ejemplo implementar el método &lt;i&gt;map:&lt;/i&gt; en la clase &lt;i&gt;NSArray&lt;/i&gt; (combinando con lo que decía más arriba de las categories) de esta forma&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;- (NSArray *)map:(id (^)(id element))block {&lt;br /&gt;
&amp;nbsp;   if (!self) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return nil;&lt;br /&gt;
&amp;nbsp;   }&lt;br /&gt;
&amp;nbsp;   NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:[self count]];&lt;br /&gt;
&amp;nbsp;   for (id element in self) {&lt;br /&gt;
&amp;nbsp;   &amp;nbsp;   [tempArray addObject:block(element)];&lt;br /&gt;
&amp;nbsp;   }&lt;br /&gt;
&amp;nbsp;   return [tempArray autorelease];&lt;br /&gt;
}&lt;/tt&gt;&lt;/blockquote&gt;
¿Cuál es la gracia? Que si quiero construir un array a partir de otro, solo tengo que pasarle al método &lt;i&gt;map: &lt;/i&gt;el bloque de código de la transformación, sin tener que escribir todo el código accesorio: crear el nuevo array, iterar, manejo de memoria, casos de borde (if !self), etc.&lt;br /&gt;
&lt;br /&gt;
Además si en algún momento se hace alguna optimización o algún arreglo, queda para todos los que lo usan.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Manejo de memoria&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En lo que tiene que ver con el manejo de memoria, tanto Objective-C como Java tienen Garbage Collector.&lt;br /&gt;
&lt;br /&gt;
Claro, eso no es cierto para el caso de iOS... donde Objective-C usa una técnica llamada "reference counting". Si bien esto es más complejo para el programador, es mejor en tiempo de ejecución (si se hace bien) porque la memoria se libera en el momento que se deja de usar, no hay que esperar por un proceso que lo haga (GC)&lt;br /&gt;
&lt;br /&gt;
Antes de iOS 5, era el programador que tenía que encargarse de retener/liberar los objetos, cosa que es bastante tediosa al principio y genera buena parte de los errores que cometen los novatos.&lt;br /&gt;
&lt;br /&gt;
Con la liberación de iOS 5 y las herramientas asociadas, se incluye una nueva opción: dejar que el compilador se encargue. Esto se llama Automatic Reference Counting (ARC) y tiene lo mejor de los dos mundos: es mejor en tiempo de ejecución y no es una carga para el programador.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sintaxis&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Con respecto a la sintaxis, tengo que reconocer que ahí sí, Java le gana &amp;nbsp;a Objective-C. Tener que acceder a un elemento de un array con&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;[myArray objectAtIndex:0];&lt;/tt&gt;&lt;/blockquote&gt;
es bastante tedioso...&lt;br /&gt;
&lt;br /&gt;
Por eso decía en Twitter que no es evidente que Objective-C es mejor que Java, porque la primer impresión que uno se lleva con el lenguaje es que es bastante complicado, sintácticamente hablando.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Estas son algunas de las diferencias que tienen ambos lenguajes. Seguramente hay muchas más, y alguno tendrá votos a favor para cualquiera de los dos lenguajes. Lo que quería con este post era justificar mi respuesta en Twitter, dando mi punto de vista al respecto.&lt;br /&gt;
&lt;br /&gt;
En una próxima entrega agregaré también la comparación con C# y Ruby...&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4338841919500608581?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=3-Ld4amLwuE:gAQZrygeXZk: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=3-Ld4amLwuE:gAQZrygeXZk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=3-Ld4amLwuE:gAQZrygeXZk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=3-Ld4amLwuE:gAQZrygeXZk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=3-Ld4amLwuE:gAQZrygeXZk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=3-Ld4amLwuE:gAQZrygeXZk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=3-Ld4amLwuE:gAQZrygeXZk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=3-Ld4amLwuE:gAQZrygeXZk: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=3-Ld4amLwuE:gAQZrygeXZk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=3-Ld4amLwuE:gAQZrygeXZk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/3-Ld4amLwuE/por-que-creo-que-objective-c-es-mejor.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>4</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/11/por-que-creo-que-objective-c-es-mejor.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8838386762458583160</guid><pubDate>Sat, 05 Nov 2011 00:09:00 +0000</pubDate><atom:updated>2011-11-04T22:09:43.625-02:00</atom:updated><title>Pésimo servicio de Movistar</title><description>Soy cliente de Movistar desde hace poco más de dos años, cuando les compre el iPhone.&lt;br /&gt;
&lt;br /&gt;
En octubre de este año se me vencía el contrato que tenía, y como era más de lo que necesitaba, antes que se renovara automáticamente hice otro más barato y con menos prestaciones. El contrato nuevo entró en vigencia a partir del 1º de noviembre.&lt;br /&gt;
&lt;br /&gt;
Con esto del nuevo contrato, ya había algo que me parecía abusivo por parte de Movistar, que paso a explicar. Cuando uno compra un iPhone tiene la opción de hacer un contrato a uno o dos años. Con el contrato a un año, el teléfono cuesta algo mas de $11.000. Con el que es a dos años, cuesta algo más de $7.000.&lt;br /&gt;
&lt;br /&gt;
La diferencia de precio es obviamente porque con el contrato se paga parte del teléfono. Si no es así, que alguien me explique los $4.000 de diferencia.&lt;br /&gt;
&lt;br /&gt;
Cuando llamé para decir que quería hacer otro contrato y que obviamente tenía que ser más barato, me dijeron que el único contrato que había con el iPhone era el que ya tenía. Pero bueno, después de explicar que no precisaba ese contrato, me dijeron que sí podía hacer otro...&lt;br /&gt;
&lt;br /&gt;
Allá fuí entonces, a hacer mi nuevo contrato, y elegí uno que tiene cierta cantidad de tráfico para navegar por internet. Este es el que entró en vigencia el 1º de noviembre.&lt;br /&gt;
&lt;br /&gt;
Lo primero que pasó con este contrato, fue que me decía que no tenía saldo, con lo que no podía hacer llamadas ni mandar SMSs, ni navegar por internet.&lt;br /&gt;
&lt;br /&gt;
Después de la llamada para reclamar y esperar casi 24 horas, puedo hacer llamadas. Algo "curioso", es que dos minutos después de llamar para reclamar, me llegó un SMS que decía:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;i&gt;Te estas por quedar sin saldo! Envia CARGA al 550 para recargar $200 y lo pagas en tu proxima factura. Podes pedirlo una vez al mes. Vto. carga 60 dias&lt;/i&gt;&lt;/blockquote&gt;
¿Habrá sido casualidad? Les voy a dar el beneficio de la duda, porque no quiero pensar que me mandaron publicidad engañosa, ya que tenía vigente un contrato con saldo...&lt;br /&gt;
&lt;br /&gt;
Lo que no puedo hacer todavía es usar el plan de datos.&lt;br /&gt;
&lt;br /&gt;
Hoy volví a llamar. Primero me dijeron que apagara el teléfono y probara en 10 minutos. Nada. Después que le sacara el chip. Nada. La tercera vez fue la que me hizo calentar, cosa que no es para nada sencilla.&lt;br /&gt;
&lt;br /&gt;
La respuesta fue que el contrato que tengo no me sirve para usar con el iPhone, porque el iPhone precisa una conexión 3G especial.&lt;br /&gt;
&lt;br /&gt;
Esto es absolutamente falso, y fue lo que le expliqué varias veces a la persona que me atendió, pero nada. Le terminé pidiendo que me pasara con alguien que me pudiera dar una explicación técnica, y después de esperar otros dos minutos, volvió para repetirme lo mismo que ya me había dicho.&lt;br /&gt;
&lt;br /&gt;
Estoy con muchas ganas de ir a cancelar el servicio y volver a Ancel, pero lo que me hace dudar es que de esa forma pierdo el número.&lt;br /&gt;
&lt;br /&gt;
¿Alguien tiene algún conocido en Movistar que me pueda dar una respuesta? En todo caso acepto sugerencias.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-8838386762458583160?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5NjnvnzBU6c:r3yJzm9ahmU: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=5NjnvnzBU6c:r3yJzm9ahmU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5NjnvnzBU6c:r3yJzm9ahmU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5NjnvnzBU6c:r3yJzm9ahmU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5NjnvnzBU6c:r3yJzm9ahmU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5NjnvnzBU6c:r3yJzm9ahmU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5NjnvnzBU6c:r3yJzm9ahmU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5NjnvnzBU6c:r3yJzm9ahmU: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=5NjnvnzBU6c:r3yJzm9ahmU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5NjnvnzBU6c:r3yJzm9ahmU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/5NjnvnzBU6c/pesimo-servicio-de-movistar.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>6</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/11/pesimo-servicio-de-movistar.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4288616954785415618</guid><pubDate>Thu, 03 Nov 2011 22:34:00 +0000</pubDate><atom:updated>2011-11-03T20:34:09.433-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">email</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">apple</category><title>Gmail.app</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s1600/gmail.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/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s1600/gmail.png" /&gt;&lt;/a&gt;&lt;/div&gt;
En el día de ayer, &lt;a href="http://gmailblog.blogspot.com/2011/11/introducing-gmail-app-for-iphone-ipad.html"&gt;Google anunció la aplicación nativa de Gmail para iOS&lt;/a&gt;, y al rato la tuvieron que bajar... Yo fui uno de los afortunados que la llegó a instalar en el rato que estuvo en el aire :)&lt;br /&gt;
&lt;br /&gt;
El motivo por el cual la bajaron, es porque da un error al entrar:&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/-qSlxcY4iTuM/TrMUScNBvhI/AAAAAAAABac/39-EcmEid1g/s1600/Foto+03-11-11+20+03+34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-qSlxcY4iTuM/TrMUScNBvhI/AAAAAAAABac/39-EcmEid1g/s320/Foto+03-11-11+20+03+34.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Lo que me llama la atención, es que haya pasado el filtro de Apple, esta gente se durmió en los laureles y están bajando el estándar...&lt;br /&gt;
&lt;br /&gt;
Más allá de eso la aplicación está buena, y es más rápida que la aplicación de Mail de Apple, sobre todo para acceder a las etiquetas. Además tiene acceso al "priority inbox", que con la aplicación del iPhone no se puede acceder.&lt;br /&gt;
&lt;br /&gt;
Una desventaja que tiene, sin embargo, es que no soporta múltiples cuentas, aunque supongo que eso lo van a resolver. Lo otro que no tiene son las notificaciones, que es por el error que muestra al entrar, que también lo van a resolver.&lt;br /&gt;
&lt;br /&gt;
Con respecto a la aplicación, y sin saber demasiado como la hicieron, es bastante parecida a la interfaz web, por lo que parece que está hecha en HTML5, y lo que es nativo es el cascarón de afuera.&lt;br /&gt;
&lt;br /&gt;
El mismo enfoque es el que tuvo Facebook con su última versión de la aplicación, con el objetivo de unificar los desarrollos en todas las plataformas.&lt;br /&gt;
&lt;br /&gt;
¿Será que se está convirtiendo en tendencia?&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4288616954785415618?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=0Q4xIN0KdDo:h8l-eYAFbpY: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=0Q4xIN0KdDo:h8l-eYAFbpY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=0Q4xIN0KdDo:h8l-eYAFbpY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=0Q4xIN0KdDo:h8l-eYAFbpY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=0Q4xIN0KdDo:h8l-eYAFbpY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=0Q4xIN0KdDo:h8l-eYAFbpY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=0Q4xIN0KdDo:h8l-eYAFbpY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=0Q4xIN0KdDo:h8l-eYAFbpY: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=0Q4xIN0KdDo:h8l-eYAFbpY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=0Q4xIN0KdDo:h8l-eYAFbpY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/0Q4xIN0KdDo/gmailapp.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-u7yKMUq7FQg/S5ka_YNTwTI/AAAAAAAABKA/pvekb0B_VfQ/s72-c/gmail.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/11/gmailapp.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5807190540593898985</guid><pubDate>Wed, 05 Oct 2011 11:35:00 +0000</pubDate><atom:updated>2011-10-05T12:04:19.021-02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">apple</category><title>iPhone 4 vs. iPhone 4S</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-hso1GxRcmdk/TH6Z2ZUaZpI/AAAAAAAABQQ/nrK5gfE4fPU/s1600/apple-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/-hso1GxRcmdk/TH6Z2ZUaZpI/AAAAAAAABQQ/nrK5gfE4fPU/s1600/apple-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;
En el día de ayer, Apple en un evento especial, anunció el lanzamiento del nuevo iPhone, llamado iPhone 4S.&lt;br /&gt;
&lt;br /&gt;
La información relativa al iPhone 4S ya está disponible en el &lt;a href="http://www.apple.com/"&gt;sitio de Apple&lt;/a&gt;, donde cuentan las características y hay algún video explicativo.&lt;br /&gt;
&lt;br /&gt;
No tenía intención de escribir sobre esto, pero &lt;a href="https://twitter.com/#!/mvignale1987/status/121388857043329024"&gt;Mauricio me preguntó por Twitter&lt;/a&gt; que me parecía, y no me dio para contestarle en 140 caracteres...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Las diferencias entre el iPhone 4 y el iPhone 4S&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como era de esperarse, hay varias cosas que cambiaron en esta nueva versión del teléfono de Apple.&lt;br /&gt;
&lt;br /&gt;
Usa un procesador A5, en lugar del A4, que según dicen duplica la velocidad del dispositivo. También aumenta varias veces la velocidad de la tarjeta gráfica, fundamental para los que lo usan como una consola de juegos.&lt;br /&gt;
&lt;br /&gt;
La cámara de fotos salta de 5MP a 8Mp, pero además tiene otras mejoras como la cantidad de luz que captura, la velocidad, etc. (no se mucho de fotografía, pero sí que la cantidad de pixeles no es lo único que importa).&lt;br /&gt;
&lt;br /&gt;
La duración de la batería creo que es de los puntos más fuertes. En estos dispositivos, la batería es un problema. Si uno pretende usar el teléfono todo el día sin cargarlo, tiene que estar cuidando no quedarse sin batería. Según dijeron, el iPhone 4S mejora mucho en este aspecto.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Actualización, 12:03&lt;/u&gt;: Me hace notar &lt;a href="http://twitter.com/#!/palsina"&gt;@palsina&lt;/a&gt;&amp;nbsp;que la duración de la batería aumenta para hablar, pero baja de 300 horas a 200 en "stand by". Habrá que ver como afecta esto la duración global de la batería... Más información en&amp;nbsp;&lt;a href="http://www.apple.com/iphone/compare-iphones/"&gt;http://www.apple.com/iphone/compare-iphones/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Por último anunciaron Siri, un asistente personal al que se le puede hablar en lenguaje natural para pedirle que haga cosas como consultar el estado del tiempo, agendar una cita en el calendario, contestar un mensaje de texto, buscar en Wikipedia, y muchas otras cosas más. Lo que no me quedó claro es si es solo para el 4S o si es una funcionalidad de iOS 5. Seguramente precise del procesador más rápido para algunas cosas...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Lo que no se anunció&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El nombre, llamarlo 4S en vez de 5, fue una decepción para varios.&lt;br /&gt;
&lt;br /&gt;
Como siempre en estos eventos, había mucha&amp;nbsp;expectativa&amp;nbsp;y mucha especulación, con lo que siempre hay gente que pronostica de más...&lt;br /&gt;
&lt;br /&gt;
Se pensaba que podía haber un iPhone 5 y un iPhone 4S más barato, lo que no sucedió.&lt;br /&gt;
&lt;br /&gt;
También se suponía que iba a contar con un chip NFC (Near Field Communication, para pagos móviles como tiene Google Wallet), que no apareció.&lt;br /&gt;
&lt;br /&gt;
La tecnología 4G, aunque no muy difundida aún, también era algo con lo que se especulaba.&lt;br /&gt;
&lt;br /&gt;
A mi personalmente me hubiera gustado un cambio de forma. No he usado mucho el iPhone 4, pero me parece más cómodo de usar el 3GS con la parte de atrás redondeada, como que se ajusta mejor a la mano.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Entonces, ¿qué me pareció y qué pienso hacer?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Actualmente tengo un iPhone 3GS que ya tiene 2 años, y estoy con ganas de cambiarlo.&lt;br /&gt;
&lt;br /&gt;
Del iPhone 4S, lo que más me motiva es la duración de la batería. La velocidad del procesador también me parece que está bueno tenerlo, pero con el 3GS tengo buen rendimiento, no creo que con el 4 tuviera problema.&lt;br /&gt;
&lt;br /&gt;
La cámara no me motiva demasiado. Sí, está bueno tener una cámara mejor, pero solo eso no me motiva a cambiar.&lt;br /&gt;
&lt;br /&gt;
Siri parece interesante, pero por ahora solo va a estar disponible en inglés, francés y alemán, por lo que no me parece que lo vaya a usar mucho al principio. Además no me veo dandole órdenes al teléfono con la voz... Sí está bueno para probarlo y ver que han hecho de inteligencia artificial :)&lt;br /&gt;
&lt;br /&gt;
De las cosas que no tiene, el 4G y el chip NFC no me cambian nada, porque de todas formas en Uruguay no los iba a poder usar.&lt;br /&gt;
&lt;br /&gt;
Que hubiera un iPhone 5 con estas cosas agregadas y un 4S con lo que anunciaron ayer sí hubiera estado bueno, para poder comprar el 4S más barato :)&lt;br /&gt;
&lt;br /&gt;
El tema de la forma del teléfono sí es un punto en contra para el 4S, porque me hubiera motivado más tener algo más parecido al 3GS...&lt;br /&gt;
&lt;br /&gt;
En conclusión: cuando llegue el 4S a Uruguay voy a cambiar mi 3GS. Lo que todavía no me decidí es por cual, si por el 4 o por el 4S. Dependerá de la diferencia de precio que haya entre uno y otro, y si la duración de la batería justifica pagar esa diferencia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-5807190540593898985?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=mmwBlFB4bxI:K5rWB8vYN3c: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=mmwBlFB4bxI:K5rWB8vYN3c:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=mmwBlFB4bxI:K5rWB8vYN3c:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=mmwBlFB4bxI:K5rWB8vYN3c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=mmwBlFB4bxI:K5rWB8vYN3c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=mmwBlFB4bxI:K5rWB8vYN3c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=mmwBlFB4bxI:K5rWB8vYN3c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=mmwBlFB4bxI:K5rWB8vYN3c: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=mmwBlFB4bxI:K5rWB8vYN3c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=mmwBlFB4bxI:K5rWB8vYN3c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/mmwBlFB4bxI/iphone-4-vs-iphone-4s.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-hso1GxRcmdk/TH6Z2ZUaZpI/AAAAAAAABQQ/nrK5gfE4fPU/s72-c/apple-logo.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/10/iphone-4-vs-iphone-4s.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-7896731745387254861</guid><pubDate>Thu, 15 Sep 2011 15:18:00 +0000</pubDate><atom:updated>2011-09-15T14:14:53.546-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 #GX21</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;
Pasó otro encuentro GeneXus más, y este año me tocó vivirlo desde el otro lado, desde el lado de la organización.&lt;br /&gt;
&lt;br /&gt;
Se vive distinto, pero no tanto el evento en sí, sino más bien la previa, donde vi lo que trabajaron todos para llegar con todo pronto en fecha.&lt;br /&gt;
&lt;br /&gt;
Del evento en sí, el estar adentro le quita el componente de la sorpresa, de ver en que estuvieron trabajando en el último año. Así y todo, hubo momentos en los que tuve que elegir, porque había más de una charla que me interesaba.&lt;br /&gt;
&lt;br /&gt;
Este año no me dio el tiempo de hacer una reseña por día como venía haciendo en años anteriores, así que hago una sola con los tres días.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Lunes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sobre las charlas, vi las primeras, de &lt;a href="http://twitter.com/#!/breogan_gonda"&gt;@breogan_gonda&lt;/a&gt;, &lt;a href="http://twitter.com/#!/guscarr"&gt;@guscarr&lt;/a&gt; y &lt;a href="http://twitter.com/#!/gmilano"&gt;@gmilano&lt;/a&gt; en la sala 4CR donde se trasmitían en vivo, porque la 2B quedo chica... Como introducción estuvieron muy bien, para que todos estemos más al tanto de lo que se iba a hablar en el resto del evento. Lástima que a&amp;nbsp;&lt;a href="http://twitter.com/#!/guscarr"&gt;@guscarr&lt;/a&gt;&amp;nbsp;no le anduvo apagar la lámpara desde el teléfono...&lt;br /&gt;
&lt;br /&gt;
La de &lt;a href="http://twitter.com/#!/arminbachmann"&gt;@arminbachmann&lt;/a&gt; y &lt;a href="http://twitter.com/#!/rorro"&gt;@rorro&lt;/a&gt; sí la vi en vivo (pero parado al fondo porque tampoco había lugar) y estuvo muy bien. Los diálogos salieron muy naturales :). En resumen, hicieron una aplicación móvil (para las tres plataformas) en 50 minutos... Como toda charla con demo en vivo, les falló cuando quisieron hacer el "deploy to cloud" por un tema de red, pero pruébenlo que funciona :)&lt;br /&gt;
&lt;br /&gt;
La charla "A que le llamamos distancia" por &lt;a href="http://twitter.com/#!/cimasan"&gt;@cimasan&lt;/a&gt; y Fabian Bonilla estuvo buena, contando la experiencia de vivir en Japón. No es fácil... Saliendo de lo técnico, estuvo muy interesante.&lt;br /&gt;
&lt;br /&gt;
La última que vi en la mañana fue la de &lt;a href="http://twitter.com/#!/pablobrenner"&gt;@pablobrenner&lt;/a&gt; donde presentó una nueva red social para cuidar el medio ambiente: &lt;a href="http://greentizen.com/"&gt;Greentizen&lt;/a&gt;. La idea es interesante, pero no se si va a funcionar... se supone que uno va a comentar y proponer acciones en las redes sociales, y ganar puntos por eso.&lt;br /&gt;
&lt;br /&gt;
En la tarde llegué al final de la otra charla de&amp;nbsp;&lt;a href="http://twitter.com/#!/cimasan"&gt;@cimasan&lt;/a&gt;, así que no vi mucho.&lt;br /&gt;
&lt;br /&gt;
Después fui al 15/15 de GeneXus Cotidiano. Fueron varias presentaciones cortas con tips, que me resultaron algunos demasiado específicos (por ejemplo relacionados con DBFs...), y con mucho cambio de tema muy rápido. La otra queja es que no se usaron PPTs, se presentó desde una página del wiki que no se veía nada desde el fondo. Cosas para mejorar de una charla que vale la pena tener en los encuentros.&lt;br /&gt;
&lt;br /&gt;
La charla de &lt;a href="http://twitter.com/#!/frascafrasca"&gt;@frascafrasca&lt;/a&gt; como siempre muy entretenida. Habló sobre "gamification", es decir, como usar técnicas usadas en los videojuegos, pero en la vida real. Véanla...&lt;br /&gt;
&lt;br /&gt;
Después vi la segunda parte de la charla donde se presentaron los proyectos del Smart Challenge. Está bueno ver en las cosas que estuvieron trabajando.&lt;br /&gt;
&lt;br /&gt;
El keynote de Mike Culver, estuvo interesante, fue una mezcla entre una charla comercial y una charla técnica.&lt;br /&gt;
&lt;br /&gt;
La charla deportiva de &lt;a href="http://twitter.com/#!/njodal"&gt;@njodal&lt;/a&gt; estuvo buena, como siempre bien dada y amena. Habló sobre "exaptación" (sí, yo tampoco lo había oído nunca...). Básicamente presento un modelo para estudiar que hace que se produzca determinado comportamiento. Es un modelo que involucra la motivación, la habilidad y disparadores. Véanla...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Martes&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El martes arranqué viendo las charlas de Silvia Keymetlian primero y luego de &lt;a href="http://twitter.com/#!/pablomazzilli"&gt;@PabloMazzilli&lt;/a&gt;, donde mostraron como hacer una aplicación y después la arquitectura de las aplicaciones para Smart Devices. Estuvieron las dos muy bien, con conceptos claros y bien explicadas. Si se van a meter en el tema, son recomendables.&lt;br /&gt;
&lt;br /&gt;
Después estuve en la charla de &lt;a href="http://dvelop.com.uy/"&gt;DVelop&lt;/a&gt;, que presentaban el pattern &lt;a href="http://dvelop.com.uy/productos_WorkWhithPlus.aspx"&gt;WorkWithPlus&lt;/a&gt;. La verdad que parece estar muy bueno el pattern. Por lo que mostraron parece muy completo.&lt;br /&gt;
&lt;br /&gt;
A las 11 estuve en el Café con Comunidad, en el piso 25. Espectacular la vista, les dejo un par de fotos que puse en twitter.&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/-DmYz-B4HZbE/TnIJ7cN84-I/AAAAAAAABZ0/t-LzcZM7oqQ/s1600/396970777.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-DmYz-B4HZbE/TnIJ7cN84-I/AAAAAAAABZ0/t-LzcZM7oqQ/s320/396970777.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-W1J5CWeOvLs/TnIJ-8iLF_I/AAAAAAAABZ4/RwcaBB5hCVU/s1600/396971515.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-W1J5CWeOvLs/TnIJ-8iLF_I/AAAAAAAABZ4/RwcaBB5hCVU/s320/396971515.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
El café en sí estuvo bueno, se habló principalmente de user controls y Marketplace, a pesar que el tema era "comunidad". Pero bueno, esa es la dinámica de estas charlas...&lt;br /&gt;
&lt;br /&gt;
Luego fui un rato a la charla que dió Marcelo Vignolo de &lt;a href="http://www.concepto.com.uy/"&gt;Concepto&lt;/a&gt; sobre precintos electrónicos en la aduana. No es de las charlas que suelo ir, pero parece interesante el sistema que están haciendo. El problema es que media hora se pasa volando, y entre que el café se extendió unos minutos más y bajar del piso 25 lleva tiempo, llegué cuando ya iban por la mitad...&lt;br /&gt;
&lt;br /&gt;
La charla de &lt;a href="http://twitter.com/#!/martinoliveri"&gt;@martinoliveri&lt;/a&gt; sobre el &lt;a href="http://marketplace.genexus.com/"&gt;GeneXus Marketplace&lt;/a&gt; estuvo interesante, contó algunas cosas que se han hecho para mejorar el sitio y las que se tienen pensadas a futuro.&lt;br /&gt;
&lt;br /&gt;
Después fui a la charla de Alejandro Blengio sobre como publicar aplicaciones en las distintas "stores" de Apple, BlackBerry y Google. Yo sabía que publicar una aplicación en la tienda de Apple era complicado, porque involucra varios pasos, pero me quedo tranquilo que en las otras dos tampoco es trivial...&lt;br /&gt;
&lt;br /&gt;
A las 15:00 estuvo mi charla. Pueden &lt;a href="http://www.genexus.com/encuentro2011/conferencia-materiales?es,0,,2428"&gt;ver el video en el sitio del evento&lt;/a&gt;,&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/40920867/GX21%20-%20Extensibilidad%20en%20Smart%20Devices.ppt"&gt;bajar las PPTs&lt;/a&gt;, o &lt;a href="http://www.slideshare.net/mcrispino/gx21-extensibilidad-en-smart-devices"&gt;verla en SlideShare&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
A continuación tuve el cara a cara de Smart Devices, por suerte con un break de 15 minutos para poder cambiar de sala.&lt;br /&gt;
&lt;br /&gt;
El keynote de Juan Grompone fue interesante, pero me resultó un poco pesado. La presentación tenía demasiado texto, y por momentos se hacía difícil de seguir...&lt;br /&gt;
&lt;br /&gt;
A la charla de &lt;a href="http://twitter.com/#!/eliax"&gt;@eliax&lt;/a&gt; fui un rato, pero no me pude quedar hasta el final, así que la veré después...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Miércoles&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El miércoles arrancamos temprano con el cara a cara con desarrollo. Como siempre en estas charlas, a las 8 había poca gente, pero fueron llegando y a las 9 terminamos a sala llena. Hubieron varias preguntas, por suerte no me tocó responder ninguna :)&lt;br /&gt;
&lt;br /&gt;
La charla de Gastón sobre el generador de Smart Devices empezó unos 10 minutos tarde, porque hubo que sacar las sillas que estaban en el escenario y lleva tiempo. Contó básicamente las cosas en las que se estuvo trabajando, cual es el roadmap de la Evolution 2 de aquí en más (liberar una RC antes de fin de año y la versión Release poco después), y las cosas que están faltando.&lt;br /&gt;
&lt;br /&gt;
Luego vino la charla de &lt;a href="http://twitter.com/#!/finthamoussu"&gt;@finthamoussu&lt;/a&gt;, donde contó cual es el estado actual de la plataforma iOS y lo que se viene en la versión 5. Una lástima que no pudo hacerla por AirPlay, porque el proyector no tenía entrada HDMI que es la salida del Apple TV...&lt;br /&gt;
&lt;br /&gt;
A continuación fui a ver la charla que daba la gente de&amp;nbsp;&lt;a href="http://www.concepto.com.uy/"&gt;Concepto&lt;/a&gt;&amp;nbsp;sobre su experiencia con &lt;a href="http://abstracta.com.uy/"&gt;GXtest&lt;/a&gt;. Por lo que contaron, los comienzos fueron duros, con una herramienta que no estaba del todo estable, pero hoy a un año de haber empezado con la experiencia, tienen buenos resultados y van a seguir por ese camino. Una buena noticia, porque se precisaba en la comunidad una buena herramienta de testing.&lt;br /&gt;
&lt;br /&gt;
Después vi la charla de &lt;a href="http://twitter.com/#!/minipanizza"&gt;@minipanizza&lt;/a&gt; sobre Android. Contó sobre la plataforma, sobre lo que si hizo en GeneXus y sobre lo que queda por hacer antes de liberar la Evolution 2.&lt;br /&gt;
&lt;br /&gt;
Lo irónico es que Fabian hizo la charla sobre iOS con fondo negro, y Fernando la de Android con fondo blanco, al revés de lo que se usa en cada una de las plataformas :)&lt;br /&gt;
&lt;br /&gt;
La charla sobre pagos móviles estuvo interante también. Contaron algunas de las cosas que hay a nivel mundial y lo que hay disponible en Uruguay, que por ahora no es mucho. Algo de VISA y algo de OCA Cel, pero muy limitados a cosas específicas. Pronostican que va a haber una explosión de este tema en la región en los próximos años. Veremos.&lt;br /&gt;
&lt;br /&gt;
En la charla "Las crónicas de Smart Devices: El termómetro, la lámpara.. y GeneXus!" se mostró algo bien distinto a lo que estamos acostumbrados a ver con GeneXus: una aplicación que controla dispositivos físicos como por ejemplo un portón o el encendido y apagado de una lámpara. Lo que hicieron fue un external object que encapsula la interacción con un controlador que permite interactuar con estos dispositivos físicos, y lo invocan tanto desde un web panel como desde una aplicación móvil.&lt;br /&gt;
&lt;br /&gt;
En la tarde del miércoles tuvimos una charla motivacional por parte de Alfredo Barragán, capitan de la expedición Atlantis que en 1984 atravesaron el océano Atlántico desde las Islas Canarias hasta Venezuela en una balsa sin timón. Me resultó más interesante el video con el que abrieron la charla contando sobre la expedición, que la charla en sí, pero bueno, tampoco soy muy fanático de este tipo de charlas...&lt;br /&gt;
&lt;br /&gt;
Luego vino el keynote de&amp;nbsp;&lt;a href="http://twitter.com/#!/njodal"&gt;@njodal&lt;/a&gt;&amp;nbsp;donde habló sobre el estado actual de la industria, sobre GeneXus y sobre la comunidad.&lt;br /&gt;
&lt;br /&gt;
Por último estuvo el cierre por parte&amp;nbsp;&lt;a href="http://twitter.com/#!/breogan_gonda"&gt;@breogan_gonda&lt;/a&gt;, invitando a que hagamos aplicaciones, ya que tanto la tecnología, como la comunidad y la actitud están.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Las que me faltaron ver&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Hubieron varias charlas que me faltaron ver, porque tenía alguna otra charla o actividad al mismo tiempo.&lt;br /&gt;
&lt;br /&gt;
Dejo una lista de las que no vi, e iré viendo de a poco en el sitio del evento:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Que aprendí haciendo PesoBook, por Juan Mateo&lt;/li&gt;
&lt;li&gt;Mesa redonda de Cloud Computing&lt;/li&gt;
&lt;li&gt;Avances, novedades y futuro de GeneXus Server, por José Lamas&lt;/li&gt;
&lt;li&gt;Las más lindas son mejores, por&amp;nbsp;Ursula Bartram y Ma. Ines Carriquiry&lt;/li&gt;
&lt;li&gt;Native applications Rock!, por&amp;nbsp;Franklin Buitron&lt;/li&gt;
&lt;li&gt;La vuelta al mundo en 80 pixels, por&amp;nbsp;Javier Larrosa&lt;/li&gt;
&lt;li&gt;Mesa redonda, el PC ha muerto?&lt;/li&gt;
&lt;li&gt;Desarrollando aplicaciones seguras con GeneXus, por&amp;nbsp;Alejandro Silva&lt;/li&gt;
&lt;li&gt;Probar GeneXus code con GeneXus code&lt;/li&gt;
&lt;li&gt;¿Qué hace y cómo se utiliza la Seguridad Integrada a GeneXus?, por&amp;nbsp;Alejandro Zeballos&lt;/li&gt;
&lt;li&gt;Plataforma BB: overview y estado del arte, por&amp;nbsp;Felipe Herrera&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Cosas para mejorar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La organización del evento fue espectacular como siempre, pero igual hay algunos puntos que me parece se puede mejorar:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Programa impreso: este año no se entregó programa impreso, porque estaban las aplicaciones en las tres plataformas. Sin embargo, hay mucha gente que no tiene un "smarte device", y se vio gente con el programa impreso desde el web o mirando el que se había pegado en una pared en el segundo piso. Creo que se debería tener la opción de tenerlo impreso...&lt;/li&gt;
&lt;li&gt;Las conferencias son cortas, de media hora, y no se tiene en cuenta el tiempo que lleva el cambio de orador. Entre las charlas que no hay un break, el programa debería contemplar tener 5 minutos entre charla y charla, para poder hacer el cambio más tranquilo. Además le permite a la gente cambiar de sala, que a veces implica subir o bajar de piso.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-7896731745387254861?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VeAFgq6BaDI:0Oh008qWxGk: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=VeAFgq6BaDI:0Oh008qWxGk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VeAFgq6BaDI:0Oh008qWxGk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VeAFgq6BaDI:0Oh008qWxGk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VeAFgq6BaDI:0Oh008qWxGk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VeAFgq6BaDI:0Oh008qWxGk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VeAFgq6BaDI:0Oh008qWxGk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=VeAFgq6BaDI:0Oh008qWxGk: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=VeAFgq6BaDI:0Oh008qWxGk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=VeAFgq6BaDI:0Oh008qWxGk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/VeAFgq6BaDI/encuentro-gx21.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/2011/09/encuentro-gx21.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-105601669001145587</guid><pubDate>Wed, 07 Sep 2011 02:19:00 +0000</pubDate><atom:updated>2011-09-06T23:19:49.031-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">tecnología</category><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">varios</category><category domain="http://www.blogger.com/atom/ns#">televisión</category><title>El futuro de la televisión es internet</title><description>Ya hace un tiempo que estaba con ganas de escribir sobre este tema, y no encontraba tiempo para hacerlo. Pero visto los anuncios de los últimos días, es ahora o nunca...&lt;br /&gt;
&lt;br /&gt;
Hace unos meses, cuando acá en Uruguay se discutía sobre que norma de televisión digital usar, si la japonesa o la europea, yo pensaba que la discusión iba mal encaminada. Para el 2015, cuando empiece a funcionar este sistema, ya va a ser obsoleto, porque la batalla la habrá ganado internet.&lt;br /&gt;
&lt;br /&gt;
Me terminé de convencer hace un par de meses, cuando "descubrí" el sitio &lt;a href="http://www.cuevana.tv/"&gt;cuevana.tv&lt;/a&gt;. Es un sitio que se dedica a catalogar series y películas (hosteadas en otros sitios) y que permite verlas on-line. La calidad del contenido no es espectacular, pero es más que aceptable&lt;br /&gt;
&lt;br /&gt;
Ahora a partir de mañana, además de cuevana.tv que es un servicio "ilegal" (más sobre esto en seguida), en la región va a estar disponible &lt;a href="https://signup.netflix.com/global"&gt;Netflix&lt;/a&gt;, que es completamente legal. El costo además es muy barato comparado con los servicios de televisión por cable (U$S8 contra unos U$S40 por mes).&lt;br /&gt;
&lt;br /&gt;
Hay que ver que contenidos trae Netflix para la región, pero que se cuiden los cables o se van a quedar sin negocio...&lt;br /&gt;
&lt;br /&gt;
Las ventajas de poder ver una película por internet son muchas, pero yo creo que la principal es que la puedo ver en cualquier momento, y no a la hora que el proveedor de cable quiere que la vea.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sobre la ilegalidad de servicios como cuevana.tv&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
No se mucho de leyes, pero me parece difícil que ver contenido on-line sea ilegal. Es decir, si veo un video en YouTube (por poner un ejemplo), no creo que esté haciendo nada ilegal, aunque no sepa si el que subió el video tenía los derechos de autor o no. Lo mismo si escucho música en Grooveshark...&lt;br /&gt;
&lt;br /&gt;
Tampoco lo que hace cuevana.tv parece ilegal, porque ellos ni siquiera tienen los archivos en sus servidores. Simplemente tienen un catálogo de links y un reproductor de videos que se ejecuta en el navegador del cliente. Probablemente sí sea ilegal subir las películas si no tengo derecho de autor...&lt;br /&gt;
&lt;br /&gt;
Pero volviendo a la parte de consumir contenido. Puede que no sea ilegal, pero ¿es inmoral?&lt;br /&gt;
&lt;br /&gt;
Supongamos que tengo contratado un servicio de televisión por cable, que tiene un determinado canal que transmite una serie que quiero ver, pero en un horario que no me sirve. ¿Es inmoral verlo en internet? ¿Por qué habría de serlo, si ya pagué por ese contenido?&lt;br /&gt;
&lt;br /&gt;
En todo caso, lo inmoral es que los proveedores de cable no nos permitan ver el contenido en el momento que nos queda mejor... O que cobren 5 veces más caro que un servicio similar...&lt;br /&gt;
&lt;br /&gt;
Claro, ver algo por lo que nunca pagué, seguramente sea más discutible, y no me voy a meter en ese tema.&lt;br /&gt;
&lt;br /&gt;
De todas formas, creo que un servicio pago, al precio que propone Netflix, puede tener ventajas como por ejemplo mejor calidad de los contenidos o más variedad. Habrá que esperar a ver que ofrecen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-105601669001145587?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=HRYk3ykI1Us:Z1utUBe5gBk: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=HRYk3ykI1Us:Z1utUBe5gBk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=HRYk3ykI1Us:Z1utUBe5gBk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=HRYk3ykI1Us:Z1utUBe5gBk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=HRYk3ykI1Us:Z1utUBe5gBk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=HRYk3ykI1Us:Z1utUBe5gBk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=HRYk3ykI1Us:Z1utUBe5gBk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=HRYk3ykI1Us:Z1utUBe5gBk: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=HRYk3ykI1Us:Z1utUBe5gBk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=HRYk3ykI1Us:Z1utUBe5gBk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/HRYk3ykI1Us/el-futuro-de-la-television-es-internet.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>7</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/09/el-futuro-de-la-television-es-internet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-1388950479969200178</guid><pubDate>Fri, 19 Aug 2011 00:59:00 +0000</pubDate><atom:updated>2011-08-18T21:59:36.750-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><title>La simplicidad de Ruby</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ZblmxtPsOKw/Tk2zC8WY5xI/AAAAAAAABZo/VAUgp1A0Nmg/s1600/ruby.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ZblmxtPsOKw/Tk2zC8WY5xI/AAAAAAAABZo/VAUgp1A0Nmg/s1600/ruby.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;
Una de las cosas que me gustan de Ruby, es la simplicidad.&lt;br /&gt;
&lt;br /&gt;
Hoy necesitaba generar números hexadecimales de largo 24, de forma aleatoria, así que me hice un programita...&lt;br /&gt;
&lt;br /&gt;
Hay seguramente muchas formas de hacerlo, yo elegí esta:&lt;br /&gt;
&lt;br /&gt;
Seudocódigo:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;24 veces:&lt;br /&gt;
&amp;nbsp; elegir un dígito aleatorio entre 0 y F (hexadecimal)&lt;br /&gt;
&amp;nbsp; imprimirlo&lt;/tt&gt;&lt;/blockquote&gt;
Código Ruby:&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;hexaDigit = ('0'..'9').to_a + ('A'..'F').to_a&lt;br /&gt;24.times do&lt;br /&gt;&amp;nbsp; print hexaDigit[rand(16)]&lt;br /&gt;
end&lt;/tt&gt;&lt;/blockquote&gt;
Simple, ¿no? Se puede escribir más corto, pero no mucho más claro que esto...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-1388950479969200178?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=hzBVf1l1q3Q:IJopUlvkTuE: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=hzBVf1l1q3Q:IJopUlvkTuE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=hzBVf1l1q3Q:IJopUlvkTuE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=hzBVf1l1q3Q:IJopUlvkTuE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=hzBVf1l1q3Q:IJopUlvkTuE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=hzBVf1l1q3Q:IJopUlvkTuE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=hzBVf1l1q3Q:IJopUlvkTuE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=hzBVf1l1q3Q:IJopUlvkTuE: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=hzBVf1l1q3Q:IJopUlvkTuE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=hzBVf1l1q3Q:IJopUlvkTuE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/hzBVf1l1q3Q/la-simplicidad-de-ruby.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ZblmxtPsOKw/Tk2zC8WY5xI/AAAAAAAABZo/VAUgp1A0Nmg/s72-c/ruby.jpeg" height="72" width="72" /><thr:total>15</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/08/la-simplicidad-de-ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-7175114692927059168</guid><pubDate>Sat, 13 Aug 2011 17:18:00 +0000</pubDate><atom:updated>2011-08-13T14:18:19.978-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mac_os_x</category><title>Primeras impresiones de OS X Lion</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-aezQIbEjaqY/TkapU4W4XCI/AAAAAAAABZc/Leh5ipMxIG0/s1600/lion_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" id=":current_picnik_image" src="http://2.bp.blogspot.com/-qzkKc7atXQI/TkaplQrgL5I/AAAAAAAABZk/EFPIRVRmEmk/s1600/15803631969_ChnSg.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace unos días me instalé Lion, la última versión de Mac OS X.&lt;br /&gt;
&lt;br /&gt;
Hay varias cosas que han cambiado, algunas más notorias que otras. Si quieren leer algo mucho más completo (y mucho más largo también), les recomiendo &lt;a href="http://arstechnica.com/apple/reviews/2011/07/mac-os-x-10-7.ars"&gt;el review de ars technica&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
No estaba dentro de mis planes instalarlo tan pronto, pero al final lo tuve que instalar para probar algunas cosas que geolocalización de GeneXus que precisaba el SDK de iOS 5...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Instalación&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La instalación fue realmente muy sencilla. Lo único que tuve que hacer fue desinstalar XCode, que igual quería instalar la última beta (4.2), así que lo iba a desinstalar de todas formas...&lt;br /&gt;
&lt;br /&gt;
Después de eso, lo único que hice fue meter el disco (sí, me lo pasaron en DVD, si no hay que bajar como 5GB) y darle "next" a unas cuantas pantallas.&lt;br /&gt;
&lt;br /&gt;
Demoró media hora aproximadamente, y cuando levantó ya estaba con la versión nueva. No tuve ningún problema de compatibilidad de aplicaciones ni perdí ningún dato de lo que tenía en Snow Leopard.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Gestos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ya en Snow Leopard se podían usar gestos en el trackpad, pero en Lion parece que son bastante más importantes.&lt;br /&gt;
&lt;br /&gt;
Hay gestos para varias cosas: dos dedos para hacer scroll, tres dedos para mostrar Mission Control o las ventanas de la aplicación actual, pinch para mostrar el Launchpad o el escritorio, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Scroll&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Dentro de los distintos gestos, hay uno que se destaca por haber tenido un cambio significativo: el scroll.&lt;br /&gt;
&lt;br /&gt;
En todos los sistemas operativos de escritorio, cuando uno quiere moverse hacia abajo por ejemplo en una página en un navegador, mueve los dedos o la ruedita del ratón hacia abajo. Es decir, se indica hacia donde quiere que se haga el movimiento.&lt;br /&gt;
&lt;br /&gt;
En iOS esto es al revés. Si quiero ir hacia abajo, lo que tengo que hacer es mover el contenido hacia arriba, por lo que selecciono y muevo el contenido de la página.&lt;br /&gt;
&lt;br /&gt;
En Lion, el comportamiento por defecto es como en iOS (aunque se puede cambiar) y al principio marea un poco.&lt;br /&gt;
&lt;br /&gt;
Lo curioso es que en dos o tres días me acostumbré y ahora hago el scroll bien (casi siempre...)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mission Control&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Es la aplicación que permite ver todas las ventanas y aplicaciones a pantalla completa que tengo corriendo en el momento.&lt;br /&gt;
&lt;br /&gt;
Es práctico, está bien diseñada, y funciona. No tengo mucho más para decir...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Launchpad&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Esta aplicación se agregó para poder tener una forma fácil y centralizada de ver todas las aplicaciones instaladas. La interfaz de usuario es una copia casi exacta de la pantalla principal del iPad.&lt;br /&gt;
&lt;br /&gt;
De todas formas la carpeta de aplicaciones sigue estando en el Dock, se ve que no se animaron a sacarla.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Creo que es una versión que se puede instalar porque funciona muy bien.&lt;br /&gt;
&lt;br /&gt;
Hay varias cosas que cambiaron, y las que tienen que ver con la experiencia del usuario, la mayoría fueron cambios para que se parezca más a iOS. Parece que ese va a ser el rumbo a partir de ahora.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-7175114692927059168?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fl9uSCJsYFg:kHsv3ZF0Wmc: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=fl9uSCJsYFg:kHsv3ZF0Wmc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fl9uSCJsYFg:kHsv3ZF0Wmc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fl9uSCJsYFg:kHsv3ZF0Wmc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fl9uSCJsYFg:kHsv3ZF0Wmc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fl9uSCJsYFg:kHsv3ZF0Wmc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fl9uSCJsYFg:kHsv3ZF0Wmc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=fl9uSCJsYFg:kHsv3ZF0Wmc: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=fl9uSCJsYFg:kHsv3ZF0Wmc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=fl9uSCJsYFg:kHsv3ZF0Wmc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/fl9uSCJsYFg/primeras-impresiones-de-os-x-lion.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-qzkKc7atXQI/TkaplQrgL5I/AAAAAAAABZk/EFPIRVRmEmk/s72-c/15803631969_ChnSg.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/08/primeras-impresiones-de-os-x-lion.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2953451426825928047</guid><pubDate>Wed, 27 Jul 2011 15:37:00 +0000</pubDate><atom:updated>2011-08-05T16:16:18.032-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>Métodos privados y "protected" en Objective-C</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-PR4oI3CY3Vs/SwsIHIG29sI/AAAAAAAABCM/v4-JUoEXUVs/s1600/xcode.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="120" src="http://1.bp.blogspot.com/-PR4oI3CY3Vs/SwsIHIG29sI/AAAAAAAABCM/v4-JUoEXUVs/s200/xcode.png" width="120" /&gt;&lt;/a&gt;&lt;/div&gt;
El lenguaje Objective-C tiene algunas cosas a las que todavía no me termino de acostumbrar, después de más de un año de estar trabajando con él.&lt;br /&gt;
&lt;br /&gt;
Una de estas cosas es la visibilidad de los métodos.&lt;br /&gt;
&lt;br /&gt;
Me explico: en los lenguajes orientados a objetos, se suele tener por lo menos tres tipos de métodos: públicos, que son accesibles por todos; privados, que son solo accesibles dentro de la clase que los define; y "protected" que son visibles para la clase que los define y para sus clases derivadas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Métodos públicos&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En Objective-C todos los métodos son públicos, en el sentido que siempre se pueden ejecutar aunque no estén declarados como tal.&lt;br /&gt;
&lt;br /&gt;
Para declarar un método como público y que quede visible para el resto del mundo, simplemente se declara en la definición de la clase en el .h&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Métodos privados&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Si bien cualquier método se puede invocar, los que no están declarados en el .h son considerados privados.&lt;br /&gt;
&lt;br /&gt;
Al no declararlos en el .h, no es fácil conocer la firma de estos métodos, por lo que tampoco es fácil invocarlos. Además, si se usa un método privado, el compilador muestra un aviso que puede ser que el objeto no responda a ese método.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Métodos protected&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En el lenguaje no hay forma de definir un método como protected. Lo que mejor que se puede hacer, es definirlo como privado, y documentarlo de alguna forma.&lt;br /&gt;
&lt;br /&gt;
El problema es que al definirlo como privado, el compilador va a dar un warning de que no existe el método.&lt;br /&gt;
&lt;br /&gt;
El "work arround" que encontré, es volver a declararlo en una categoría, para que el compilador sepa que existe.&lt;br /&gt;
&lt;br /&gt;
Supongamos que tenemos una clase MySuperClass, que define un método privado&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;-(void)myProtectedMethod&lt;/tt&gt;&lt;/blockquote&gt;
y que tengo una clase MyDerivedClass que hereda de MySuperClass.&lt;br /&gt;
&lt;br /&gt;
Si quiero usar el método en MyDerivedClass sin que me de un warning, puedo en el archivo MyDerivedClass.m, declarar una categoría para MySuperClass donde defino este método. Suena complicado, el código no lo es tanto.&lt;br /&gt;
&lt;blockquote&gt;
&lt;tt&gt;// MyDerivedClass.m&lt;br /&gt;
&lt;br /&gt;
#import "MyDerivedClass.h"&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt; @interface MySuperClass (Protected)&lt;br /&gt;
-(void)myProtectedMethod;&lt;br /&gt;
@end&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
@implementation MyDerivedClass&lt;br /&gt;
...&lt;br /&gt;
@end&lt;/tt&gt;&lt;/blockquote&gt;
&lt;br /&gt;
No se si es la mejor opción, pero es efectiva. Por supuesto, si alguien lo resolvió de otra forma, son bienvenidos los comentarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-2953451426825928047?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5oKK-bUOKzY:qmjJQZ3ZsIc: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=5oKK-bUOKzY:qmjJQZ3ZsIc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5oKK-bUOKzY:qmjJQZ3ZsIc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5oKK-bUOKzY:qmjJQZ3ZsIc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5oKK-bUOKzY:qmjJQZ3ZsIc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5oKK-bUOKzY:qmjJQZ3ZsIc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5oKK-bUOKzY:qmjJQZ3ZsIc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=5oKK-bUOKzY:qmjJQZ3ZsIc: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=5oKK-bUOKzY:qmjJQZ3ZsIc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=5oKK-bUOKzY:qmjJQZ3ZsIc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/5oKK-bUOKzY/metodos-privados-y-protected-en.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-PR4oI3CY3Vs/SwsIHIG29sI/AAAAAAAABCM/v4-JUoEXUVs/s72-c/xcode.png" height="72" width="72" /><thr:total>12</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/07/metodos-privados-y-protected-en.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-8589628354786995999</guid><pubDate>Sat, 23 Jul 2011 22:39:00 +0000</pubDate><atom:updated>2011-07-23T19:39:45.204-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">genexus_x_ev2</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><category domain="http://www.blogger.com/atom/ns#">ipad</category><title>Layout Enabled y nuevos controles</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;
En el &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?14602"&gt;Night Build&lt;/a&gt; del 20 de junio de GeneXus X Evolution 2, aparece una nueva propiedad en el IDE, para los objetos de tipo Work With Smart Devices: Layout Enabled.&lt;br /&gt;
&lt;br /&gt;
Esta propiedad está a nivel del Detail del pattern, e indica como dice su nombre, si se toma en cuenta el layout definido en el objeto (poniéndola en &lt;i&gt;true&lt;/i&gt;), o si se dibuja un campo debajo de otro como se hacía hasta el momento (dejándola en &lt;i&gt;false&lt;/i&gt; que por ahora es el valor por defecto).&lt;br /&gt;
&lt;br /&gt;
Además de respetar el layout definido en el objeto, permite usar controles que antes no estaban disponibles.&lt;br /&gt;
&lt;br /&gt;
Estos son algunas de las cosas en las que estuve trabajando y ahora quedan visibles.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tab control&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El Tab control permite agregar componentes en distintos tabs.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-CQTtI5PN8cI/Tis4xeMPtEI/AAAAAAAABZI/P9vq_Q8Cv40/s1600/Captura+de+pantalla+2011-07-23+a+las+18.09.43.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-CQTtI5PN8cI/Tis4xeMPtEI/AAAAAAAABZI/P9vq_Q8Cv40/s320/Captura+de+pantalla+2011-07-23+a+las+18.09.43.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
En la imagen se ven solo los tabs sin datos, porque fue como me quedó el ejemplo, también se pueden poner datos...&lt;br /&gt;
&lt;br /&gt;
No se si en el último Night Build ya está en el IDE el control tab, pero si no está sale en el próximo...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Wheel control&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Permite elegir valores usando una ruedita.&lt;br /&gt;
&lt;br /&gt;
Funciona para enumerados y para campos numéricos, en estos últimos se le dice el rango de valores y el step, es decir, cuanto varía entre cada valor. Si el step es un decimal (por ejemplo 0.1 como en la imagen), se muestra una ruedita para los enteros y otra para los decimales.&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/-jkXDoAnFdN4/Tis20Jj4Q9I/AAAAAAAABZA/9jYp589EJ6U/s1600/Captura+de+pantalla+2011-07-23+a+las+18.01.27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-jkXDoAnFdN4/Tis20Jj4Q9I/AAAAAAAABZA/9jYp589EJ6U/s320/Captura+de+pantalla+2011-07-23+a+las+18.01.27.png" width="170" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mapas a pantalla completa&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En el iPad, se puede hacer que la aplicación se ejecute a pantalla completa (por defecto usa un split view: las listas a la izquierda y los detalles a la derecha). Para que ejecute a pantalla completa, hay que cambiar una propiedad: Navigation Style = Flip.&lt;br /&gt;
&lt;br /&gt;
En este caso, cuando se usa el control SD Maps, se oculta la barra de navegación y la toolbar, quedando el mapa a pantalla completa (esto va a ser opcional mediante una propiedad, hoy es siempre que se pone Flip).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-0hKy_Fijuec/Tis4CzJu3jI/AAAAAAAABZE/w60xEZiYf-I/s1600/Captura+de+pantalla+2011-07-22+a+las+14.59.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://2.bp.blogspot.com/-0hKy_Fijuec/Tis4CzJu3jI/AAAAAAAABZE/w60xEZiYf-I/s320/Captura+de+pantalla+2011-07-22+a+las+14.59.02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
También se ve en la imagen, que cada uno de los marcadores usa una imagen distinta. Esto también es nuevo. Se agregaron dos propiedades para el control SD Maps: Pin Image y Pin Image Attribute. La Pin Image es una imagen estática, y usa para todos los marcadores la misma. El Pin Image Attribute permite poner una imagen distinta para cada marcador.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sobre el uso de estas funcionalidades&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Todas estas cosas van a estar disponibles en todos los generadores, aunque en este momento es posible que solo estén en iOS... así como también hay cosas que solo están en Android o en BlackBerry.&lt;br /&gt;
&lt;br /&gt;
Además en general no van a funcionar con el Knowledge Base Navigator que está en el App Store, porque esa versión está sincronizada con la beta 3 y estos cambios son (pueden ser...) posteriores. Si los quieren usar, van a tener que compilar la aplicación usando una Mac o esperar a la&amp;nbsp;próxima&amp;nbsp;versión del KBN.&lt;br /&gt;
&lt;br /&gt;
También aclaro que esto son solo algunas de las cosas que hay, y en particular son algunas en las que trabajé yo. En los Night Builds hay muchas más cosas, que se anuncian en el wiki.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-8589628354786995999?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=q5yAiFSLaGs:YZhonDnVkhM: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=q5yAiFSLaGs:YZhonDnVkhM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=q5yAiFSLaGs:YZhonDnVkhM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=q5yAiFSLaGs:YZhonDnVkhM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=q5yAiFSLaGs:YZhonDnVkhM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=q5yAiFSLaGs:YZhonDnVkhM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=q5yAiFSLaGs:YZhonDnVkhM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=q5yAiFSLaGs:YZhonDnVkhM: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=q5yAiFSLaGs:YZhonDnVkhM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=q5yAiFSLaGs:YZhonDnVkhM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/q5yAiFSLaGs/layout-enabled-y-nuevos-controles.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>5</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/07/layout-enabled-y-nuevos-controles.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4686196683773255689</guid><pubDate>Sat, 25 Jun 2011 23:15:00 +0000</pubDate><atom:updated>2011-06-25T20:18:55.436-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">música</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><title>Música para correr</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Wmgw5HNEcSU/TgZNQCKOC_I/AAAAAAAABYc/V88PrxCaMjg/s1600/Jog.fm.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/-Wmgw5HNEcSU/TgZNQCKOC_I/AAAAAAAABYc/V88PrxCaMjg/s1600/Jog.fm.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Hace un tiempo encontré el sitio &lt;a href="http://jog.fm/"&gt;jog.fm&lt;/a&gt;, que permite buscar música para correr, con la particularidad que busca la música más adecuada para el ritmo que uno elige.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, se puede buscar música para correr a 6 minutos por km, y encuentra canciones que sirven para correr a ese ritmo.&lt;br /&gt;
&lt;br /&gt;
También sirve para buscar música para otras actividades, como caminar o andar en bicicleta.&lt;br /&gt;
&lt;br /&gt;
En el sitio se pueden escuchar las canciones, comprarlas en Amazon o iTunes, armar listas de reproducción (que no se como la escucho mientras voy corriendo...), escuchar listas de otros usuarios, etc.&lt;br /&gt;
&lt;br /&gt;
Además tienen una aplicación para el iPhone, pero no me convenció demasiado. La aplicación procesa toda la biblioteca, y cuando uno va a hacer ejercicio puede decirle a que ritmo quiere correr o que detecte el ritmo automáticamente. Supuestamente se van a reproducir las canciones adecuadas.&lt;br /&gt;
&lt;br /&gt;
Digo supuestamente porque hice una prueba y me parece que no me funcionó muy bien. Algunas mejoras que le haría:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;poder elegir música de una lista, yo ya tengo una que se llama "música para correr"...&lt;/li&gt;
&lt;li&gt;tener alguna forma más fácil de decirle que canciones no quiero que use, por ejemplo un botón en el reproductor.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Con esos dos cambios sí sería más usable.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Sobre la corrida&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
En mi punto más alto (diciembre 2010 - enero 2011), llegué a correr 7km hasta tres o cuatro veces por semana, y corrí una carrera de 10km, de esas que hay un montón en primavera.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Desde ahí, vengo bajando. Primero en frecuencia y después en distancia. Es impresionante como se va perdiendo el estado físico por la falta de ejercicio. Ahora estoy corriendo una vez por semana (sábado o domingo, porque entre semana es imposible), y corro 5.7km. Pero cada vez cuesta más...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Lo bueno es que aumentar la distancia y mejorar el tiempo es algo relativamente fácil, si uno tiene la constancia necesaria. Cuando empecé, en agosto de 2010, hacía un recorrido de 2.5km, y a veces no me daba para hacerlo todo corriendo. De a poco fui subiendo, primero 3.5km, 4.5km, 6km, hasta llegar a los 7km y la carrera.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Así que cuando vuelvan los días más largos, trataré de salir a correr más seguido para estar mejor que en mi mejor época :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Una mención especial&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Hay dos canciones que se ajustan particularmente bien a mi ritmo de corrida. No las encontré en jog.fm, ya las tenía en mi biblioteca. Se las dejo para que las escuchen (en un dispositivo que soporte Flash...):&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;object height="40" width="250"&gt;&lt;param name="movie" value="http://grooveshark.com/songWidget.swf" /&gt;

&lt;param name="wmode" value="window" /&gt;

&lt;param name="allowScriptAccess" value="always" /&gt;

&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=25421444&amp;style=water&amp;p=0" /&gt;

&lt;embed src="http://grooveshark.com/songWidget.swf" type="application/x-shockwave-flash" width="250" height="40" flashvars="hostname=cowbell.grooveshark.com&amp;songIDs=25421444&amp;style=water&amp;p=0" allowScriptAccess="always" wmode="window" /&gt;&lt;/object&gt;&amp;nbsp;The Ramones - I Wanna Be Sedated&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;object height="40" width="250"&gt;&lt;param name="movie" value="http://grooveshark.com/songWidget.swf" /&gt;

&lt;param name="wmode" value="window" /&gt;

&lt;param name="allowScriptAccess" value="always" /&gt;

&lt;param name="flashvars" value="hostname=cowbell.grooveshark.com&amp;songIDs=31385333&amp;style=water&amp;p=0" /&gt;

&lt;embed src="http://grooveshark.com/songWidget.swf" type="application/x-shockwave-flash" width="250" height="40" flashvars="hostname=cowbell.grooveshark.com&amp;songIDs=31385333&amp;style=water&amp;p=0" allowScriptAccess="always" wmode="window" /&gt;&lt;/object&gt;&amp;nbsp;Astroboy - Did I Tell You?&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4686196683773255689?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=x6XKY4OI3YM:2wlTz-E3yvY: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=x6XKY4OI3YM:2wlTz-E3yvY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=x6XKY4OI3YM:2wlTz-E3yvY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=x6XKY4OI3YM:2wlTz-E3yvY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=x6XKY4OI3YM:2wlTz-E3yvY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=x6XKY4OI3YM:2wlTz-E3yvY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=x6XKY4OI3YM:2wlTz-E3yvY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=x6XKY4OI3YM:2wlTz-E3yvY: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=x6XKY4OI3YM:2wlTz-E3yvY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=x6XKY4OI3YM:2wlTz-E3yvY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/x6XKY4OI3YM/musica-para-correr.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Wmgw5HNEcSU/TgZNQCKOC_I/AAAAAAAABYc/V88PrxCaMjg/s72-c/Jog.fm.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/06/musica-para-correr.html</feedburner:origLink></item></channel></rss>

