<?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>Wed, 01 Feb 2012 21:17:42 +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>269</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-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>2</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><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-3685717044161404321</guid><pubDate>Thu, 16 Jun 2011 21:00:00 +0000</pubDate><atom:updated>2011-06-16T18:22:13.281-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">git</category><category domain="http://www.blogger.com/atom/ns#">desarrollo</category><category domain="http://www.blogger.com/atom/ns#">subversion</category><title>Subversion vs. Git</title><description>Cuando se habla de control de versiones, hay dos grandes formas de&amp;nbsp;encarar el tema: centralizado o distribuido.&lt;br /&gt;
&lt;br /&gt;
Durante un año estuve usando &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; (un sistema de control de versiones&amp;nbsp;distribuido), y ahora hace un mes y medio que estoy usando &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;&amp;nbsp;(que es centralizado).&lt;br /&gt;
&lt;br /&gt;
Lo que sigue es un intento de comparar ambas herramientas, desde mi&amp;nbsp;punto de vista personal, sin intención de hacer una comparación&amp;nbsp;exhaustiva ni del todo objetiva.&lt;br /&gt;
&lt;br /&gt;
Lo primero que hay que aclarar es que ni Git es del todo&amp;nbsp;"distribuido" (ya que se suele mantener un repositorio centralizado), ni Subversion es totalmente centralizado (porque se trabaja sobre una copia local). La diferencia&amp;nbsp;en realidad es donde ocurren las operaciones (branch, commit, etc.).&amp;nbsp;En el caso de Git (y los demás que son distribuidos como Mercurial),&amp;nbsp;las operaciones son locales, mientras que en Subversion ocurren en el&amp;nbsp;servidor.&lt;br /&gt;
&lt;br /&gt;
Esto quiere decir que en Git puedo hacer N commits antes de mandar los&amp;nbsp;cambios al servidor, mientras que en Subversion cada commit se hace en&amp;nbsp;el servidor.&lt;br /&gt;
&lt;br /&gt;
Algunas consecuencias de esto son que:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;En Subversion los números de cada revisión son consecutivos,&amp;nbsp;mientras que en Git cada commit se identifica con un UUID&lt;/li&gt;
&lt;li&gt;En Git puedo hacer commits intermedios, sin necesidad de tener una&amp;nbsp;versión "estable", porque puedo hacer el push al final. En Subversion,&amp;nbsp;cuando hago un commit tengo que tener una versión consistente antes de&amp;nbsp;hacer el commit para no romper nada que pueda necesitar alguien más.&amp;nbsp;Ese commit puede ser eventualmente bastante grande.&lt;/li&gt;
&lt;/ol&gt;
Otra diferencia es que en el caso de Git, no es posible hacer un&amp;nbsp;"checkout" parcial, lo que es bastante natural en Subversion. Por lo&amp;nbsp;tanto, si el repositorio es grande, obtener la versión inicial puede&amp;nbsp;ser bastante más costoso con Git.&lt;br /&gt;
&lt;br /&gt;
Una de las cosas que no me convencen del todo de Subversion, es que no puedo dejar un cambio por la mitad, para hacer por ejemplo un arreglo en la última versión estable. En Git, aunque tenga cambios pendientes, puedo moverlos a un nuevo branch, arreglar lo que sea que estuviera roto, y volver a poner arriba de eso los cambios que moví temporalmente. En Subversion, la mejor alternativa que encontré a esto, sería hacer un checkout en otro directorio para hacer el arreglo ahí.&lt;br /&gt;
&lt;br /&gt;
Eso nos lleva a otra diferencia: en Git hacer un branch es totalmente natural. De hecho, cada copia local puede verse como un branch. Llevado al extremo, hay quienes hacen un branch para cada nueva feature que van a estar trabajando. En Subversion, un branch se usa solamente para congelar una versión, y no es posible hacerlo de forma local.&lt;br /&gt;
&lt;br /&gt;
Por último, hace unos días apareció &lt;a href="http://www.readwriteweb.com/hack/2011/06/github-has-passed-sourceforge.php"&gt;esta noticia&lt;/a&gt;, que dice que GitHub es el repositorio más popular (para proyectos open source al menos). Puede ser un punto a considerar al momento de elegir.&lt;br /&gt;
&lt;br /&gt;
En conclusión, si me dan a elegir, me quedo con Git. Pero lo verdaderamente importante, sea cual sea la herramienta que se use, es tener algún tipo de manejo de versiones.&lt;br /&gt;
&lt;br /&gt;
Si alguien se quedó con ganas de saber más, acá les dejo &lt;a href="https://git.wiki.kernel.org/index.php/GitSvnComparison"&gt;una comparación más seria de los dos&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-3685717044161404321?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ms818gqWHbw:BBLezFEwf7I: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=ms818gqWHbw:BBLezFEwf7I:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ms818gqWHbw:BBLezFEwf7I:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ms818gqWHbw:BBLezFEwf7I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ms818gqWHbw:BBLezFEwf7I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ms818gqWHbw:BBLezFEwf7I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ms818gqWHbw:BBLezFEwf7I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ms818gqWHbw:BBLezFEwf7I: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=ms818gqWHbw:BBLezFEwf7I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ms818gqWHbw:BBLezFEwf7I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/ms818gqWHbw/subversion-vs-git.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>10</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/06/subversion-vs-git.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-2848204936575250930</guid><pubDate>Wed, 08 Jun 2011 13:42:00 +0000</pubDate><atom:updated>2011-06-09T09:54:19.639-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">genexus_x_ev2</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>User Controls para iOS, parte 2</title><description>Hace unos días &lt;a href="http://blog.marcoscrispino.com/2011/05/user-controls-para-smart-devices.html"&gt;les contaba&lt;/a&gt; que estuve trabajando en un User Control para el generador iOS (una galería de imágenes), y que se estaba trabajando en un mecanismo para poder definir controles desarrollados por terceros.&lt;br /&gt;
&lt;br /&gt;
Hoy ese mecanismo ya está funcionando (build superior a 44260), y de hecho en este momento tenemos 4 user controls externos, tres para listas (image gallery, maps y chart)&lt;sup&gt;[1]&lt;/sup&gt;&amp;nbsp;y uno para atributos (star rating).&lt;br /&gt;
&lt;br /&gt;
El código de los user controls está disponible y se distribuye con GeneXus, los pueden ver en la carpeta iOS/UserControls/src (build superior a 44297)&lt;br /&gt;
&lt;br /&gt;
Como decía más arriba, hay dos tipos de user controls: los que aplican a una lista y los que aplican a un item (un atributo por ejemplo). La forma de implementarlos es distinta, y de hecho heredan de clases diferentes.&lt;br /&gt;
&lt;br /&gt;
Así que si alguien tiene alguna idea de un user control que quiera desarrollar, me avisa que le paso la versión alfa de la documentación. Eventualmente quedará disponible en el Wiki, pero por ahora no está...&lt;br /&gt;
&lt;br /&gt;
Les dejo una foto del Star Rating, que fue el otro control en el que estuve trabajando.&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/-sbwkFKgXXOc/Te9_wKC0drI/AAAAAAAABYY/lire2noZV1s/s1600/Captura+de+pantalla+2011-06-07+a+las+16.14.45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-sbwkFKgXXOc/Te9_wKC0drI/AAAAAAAABYY/lire2noZV1s/s1600/Captura+de+pantalla+2011-06-07+a+las+16.14.45.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
[1] Cabe aclarar que los controles map y chart no los hice yo... yo solo los moví a otro proyecto.&lt;br /&gt;
&lt;br /&gt;
Actualización, 9/6/2011 9:50: &lt;a href="https://twitter.com/#!/a_cardoso"&gt;@a_cardoso&lt;/a&gt; actualizó la documentación en el wiki. Pueden ver &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?15827"&gt;acá&lt;/a&gt; y &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?15828"&gt;acá&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-2848204936575250930?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=uhfXMslDRtI:XtKsu9LknWc: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=uhfXMslDRtI:XtKsu9LknWc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=uhfXMslDRtI:XtKsu9LknWc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=uhfXMslDRtI:XtKsu9LknWc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=uhfXMslDRtI:XtKsu9LknWc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=uhfXMslDRtI:XtKsu9LknWc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=uhfXMslDRtI:XtKsu9LknWc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=uhfXMslDRtI:XtKsu9LknWc: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=uhfXMslDRtI:XtKsu9LknWc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=uhfXMslDRtI:XtKsu9LknWc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/uhfXMslDRtI/user-controls-para-ios-parte-2.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-sbwkFKgXXOc/Te9_wKC0drI/AAAAAAAABYY/lire2noZV1s/s72-c/Captura+de+pantalla+2011-06-07+a+las+16.14.45.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/06/user-controls-para-ios-parte-2.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-4067686887701398105</guid><pubDate>Fri, 13 May 2011 18:46:00 +0000</pubDate><atom:updated>2011-05-13T15:46:06.776-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">genexus_x_ev2</category><category domain="http://www.blogger.com/atom/ns#">genexus</category><title>User Controls para Smart Devices</title><description>La primera tarea que me tocó en &lt;a href="http://blog.marcoscrispino.com/2011/05/cambio-de-trabajo.html"&gt;mi nuevo trabajo en Artech&lt;/a&gt;, fue la de desarrollar un User Control para el generador de iOS, para poder mostrar una lista en forma de galería de imágenes.&lt;br /&gt;
&lt;br /&gt;
El control se llama "SD ImageGallery", y ya estaba disponible para Android. Acá les dejo &lt;a href="http://wiki.gxtechnical.com/commwiki/servlet/hwikibypageid?15291"&gt;la documentación que hay en el wiki&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
La versión para iOS va a estar disponible en la próxima versión del KB Navigator... Está basado en el control &lt;a href="https://github.com/kirbyt/KTPhotoBrowser"&gt;KTPhotoBrowser&lt;/a&gt;&amp;nbsp;(con algunas modificaciones), que tiene una &lt;a href="http://es.wikipedia.org/wiki/MIT_License"&gt;licencia MIT&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Para usarlo, es muy fácil. Simplemente en el patter Work With Smart Devices se selecciona el View correspondiente a la lista (el pattern define vistas para el master, que es una lista, y para el detail, que muestra un item determinado), y se cambia la propiedad "ControlType" a "SD ImageGallery".&lt;br /&gt;
&lt;br /&gt;
Si no se configura nada más, toma la primer imagen que haya disponible en el registro (no es determinístico si es que hay más de una). Sin embargo se le puede decir, también en las propiedades, que atributo contiene la imagen que queremos mostrar, cual es el que tiene el título y cual el que tiene la descripción.&lt;br /&gt;
&lt;br /&gt;
Pero lo interesante del caso, es que es un User Control. Esto quiere decir que en los generadores para Smart Devices, se van a poder definir controles implementados por terceros.&lt;br /&gt;
&lt;br /&gt;
Por ahora el mecanismo para hacerlo está muy verde (o no está...), y este control en particular se desarrollo dentro del mismo proyecto que el resto del KB Navigator, pero la idea es poder hacerlo por fuera y que se pueda integrar de alguna forma.&lt;br /&gt;
&lt;br /&gt;
Obviamente el desarrollo de User Controls no va a ser para cualquiera, porque requiere tener conocimientos en el desarrollo de la plataforma (Objective-C y la API para iPhone en este caso), pero va a abrir posibilidades para los que quieran publicar controles, como se hace hoy en web mediante el &lt;a href="http://marketplace.genexus.com/home.aspx"&gt;Marketplace&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Así es como se ve en el iPhone:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Pev6czgHgVs/Tc17Cw6k4FI/AAAAAAAABYU/NMiZ82nqiN8/s1600/SDImageGallery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Pev6czgHgVs/Tc17Cw6k4FI/AAAAAAAABYU/NMiZ82nqiN8/s1600/SDImageGallery.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-4067686887701398105?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zIGsEysosxI:yVI0Q63bMBQ: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=zIGsEysosxI:yVI0Q63bMBQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zIGsEysosxI:yVI0Q63bMBQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zIGsEysosxI:yVI0Q63bMBQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zIGsEysosxI:yVI0Q63bMBQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zIGsEysosxI:yVI0Q63bMBQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zIGsEysosxI:yVI0Q63bMBQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=zIGsEysosxI:yVI0Q63bMBQ: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=zIGsEysosxI:yVI0Q63bMBQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=zIGsEysosxI:yVI0Q63bMBQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/zIGsEysosxI/user-controls-para-smart-devices.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Pev6czgHgVs/Tc17Cw6k4FI/AAAAAAAABYU/NMiZ82nqiN8/s72-c/SDImageGallery.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/05/user-controls-para-smart-devices.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-135455713753227563</guid><pubDate>Mon, 02 May 2011 16:23:00 +0000</pubDate><atom:updated>2011-05-02T13:23:04.233-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">varios</category><title>Cambio de trabajo</title><description>Hace unos 11 meses, &lt;a href="http://blog.marcoscrispino.com/2010/06/cambios-o-despedida-de-concepto.html"&gt;anunciaba en el blog&lt;/a&gt;, después de unos cuantos años de estabilidad laboral, que iba a cambiar de trabajo. Hoy escribo para hacer un anuncio similar. Espero que no se me esté haciendo costumbre ;)&lt;br /&gt;
&lt;br /&gt;
Desde junio de 2010 vengo trabajando full-time para &lt;a href="http://www.alkeo.fr/"&gt;Alkeo&lt;/a&gt;, una empresa francesa que se dedica al desarrollo de aplicaciones móviles (aunque había empezado a hacer alguna cosa con ellos desde noviembre de 2009). Todo este tiempo estuve trabajando en el desarrollo de aplicaciones para iPhone/iPad, y también algún back-end en Ruby on Rails.&lt;br /&gt;
&lt;br /&gt;
El trabajo para Alkeo fue muy interesante, tanto por las cosas nuevas que tuve que aprender como por la modalidad de trabajo (a distancia, desde casa, con coordinación por mail), que era nueva para mi.&lt;br /&gt;
&lt;br /&gt;
Pero ahora surgió otra oportunidad, así que decidí cambiar...&lt;br /&gt;
&lt;br /&gt;
A partir de mañana (3 de mayo de 2011) voy a estar trabajando para &lt;a href="http://www.genexus.com/portal/hgxpp001.aspx?2,69,1102,O,S,0,MNU;E;226;7;241;1;MNU;,"&gt;Artech&lt;/a&gt;, en el equipo de desarrollo de &lt;a href="http://www.genexus.com/"&gt;GeneXus&lt;/a&gt;, en principio en el generador para iOS (iPhone y iPad).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-135455713753227563?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=cjA8iDUqo1s:oRZqSLabyes: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=cjA8iDUqo1s:oRZqSLabyes:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=cjA8iDUqo1s:oRZqSLabyes:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=cjA8iDUqo1s:oRZqSLabyes:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=cjA8iDUqo1s:oRZqSLabyes:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=cjA8iDUqo1s:oRZqSLabyes:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=cjA8iDUqo1s:oRZqSLabyes:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=cjA8iDUqo1s:oRZqSLabyes: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=cjA8iDUqo1s:oRZqSLabyes:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=cjA8iDUqo1s:oRZqSLabyes:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/cjA8iDUqo1s/cambio-de-trabajo.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>19</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/05/cambio-de-trabajo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5228917076479061883</guid><pubDate>Thu, 14 Apr 2011 15:42:00 +0000</pubDate><atom:updated>2011-04-14T13:09:23.256-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">redes sociales</category><title>fbcmd: listar los próximos cumpleaños</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s1600/facebook_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s1600/facebook_logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Hace unos días &lt;a href="http://blog.marcoscrispino.com/2011/04/sobre-el-uso-de-facebook.html"&gt;escribí&lt;/a&gt; sobre &lt;a href="http://fbcmd.dtompkins.com/"&gt;fbcmd&lt;/a&gt;, como forma de consultar la actividad de los amigos en Facebook.&lt;br /&gt;
&lt;br /&gt;
Lo que no encontré, fue una forma de ver cuales son los próximos cumpleaños, así que hice mi propio comando :)&lt;br /&gt;
&lt;br /&gt;
Este es el código del nuevo comando:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/919705.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Para usarlo, hay que seguir los siguientes pasos:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Bajar el &lt;a href="https://gist.github.com/gists/919705/download"&gt;archivo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Copiarlo a&amp;nbsp;&lt;i&gt;/usr/local/lib/fbcmd/support&lt;/i&gt; (en Mac OS X, no se en otros sistemas)&lt;/li&gt;
&lt;li&gt;Ejecutar &lt;i&gt;php /usr/local/lib/fbcmd/support/birthdays_fbcmd.php BIRTHDAYS&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Se le puede pasar una lista de amigos y la cantidad de items a mostrar. Por ejemplo,&lt;br/&gt;&lt;br /&gt;
&lt;i&gt;php /usr/local/lib/fbcmd/support/birthdays_fbcmd.php BIRTHDAYS _familia 5&lt;/i&gt;&lt;br/&gt;lista los 5 primeros cumpleaños de los amigos que estén en la lista "familia".&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-5228917076479061883?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=BeK5mPurhqY:Wsbio_CS0gY: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=BeK5mPurhqY:Wsbio_CS0gY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=BeK5mPurhqY:Wsbio_CS0gY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=BeK5mPurhqY:Wsbio_CS0gY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=BeK5mPurhqY:Wsbio_CS0gY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=BeK5mPurhqY:Wsbio_CS0gY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=BeK5mPurhqY:Wsbio_CS0gY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=BeK5mPurhqY:Wsbio_CS0gY: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=BeK5mPurhqY:Wsbio_CS0gY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=BeK5mPurhqY:Wsbio_CS0gY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/BeK5mPurhqY/fbcmd-listar-los-proximos-cumpleanos.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s72-c/facebook_logo.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/04/fbcmd-listar-los-proximos-cumpleanos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5623850362403935325</guid><pubDate>Wed, 13 Apr 2011 12:55:00 +0000</pubDate><atom:updated>2011-04-13T09:55:42.855-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">uruguay</category><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><title>El final de la democracia (representativa)</title><description>En Uruguay existe la llamada &lt;a href="http://es.wikipedia.org/wiki/Ley_de_Caducidad_de_la_Pretensi%C3%B3n_Punitiva_del_Estado"&gt;Ley de Caducidad&lt;/a&gt;, que da amnistía a policias y militares por los crímenes que cometieron (torturas, asesinatos, desapariciones, etc.) durante la última dictadura militar (1973-1985).&lt;br /&gt;
&lt;br /&gt;
Es una ley que fue votada en el parlamento en 1986, confirmada en un referendum (ya que se juntaron firmas para intentar derogarla) en 1989, y confirmada nuevamente por la ciudadanía en un plebiscito en el año 2009, al no alcanzar el 50%+1 necesarios para su anulación.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.montevideo.com.uy/notnoticias_135680_1.html"&gt;Ayer el senado uruguayo, aprobó una ley interpretativa&lt;/a&gt; que la deja sin efecto, yendo en contra de la opinión del pueblo. Todavía falta que la apruebe la cámara de diputados, pero es un hecho que va a ser así.&lt;br /&gt;
&lt;br /&gt;
Antes de seguir, quiero hacer dos aclaraciones:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Cuando se me preguntó en 2009, voté por anularla. Por las dudas que alguno crea que escribo esto por estar en contra de este hecho en particular...&lt;/li&gt;
&lt;li&gt;No estoy de acuerdo en como se realizó el plebiscito de 2009. No había forma de no participar. Si uno quería anular la ley, debía poner una papeleta por el SÍ. Para dejarla como estaba, no había que hacer nada. Eso quiere decir que hubo gente que no puso papeleta ya sea por desconocimiento, o porque no quería participar, votando explícitamente al NO. Si además le sumamos que el SÍ alcanzó casi el 48%, creo que el resultado hubiera sido otro si el NO hubiera tenido también papeleta.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;Así y todo, creo que un plebiscito es la máxima expresión de la democracia, por lo tanto respeto el resultado. Por eso me parece que es una burla lo que hicieron ayer los senadores.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Hace unos días &lt;a href="http://www.enriquedans.com/"&gt;Enrique Dans&lt;/a&gt; escribía en su blog un artículo titulado "&lt;a href="http://www.enriquedans.com/2011/04/democracia-frente-a-partitocracia.html"&gt;Democracia frente a partitocracia&lt;/a&gt;", donde cuenta la realidad española, que tristemente aplica a la perfección a la realidad uruguaya. Eso es lo que tenemos hoy, una &lt;a href="http://es.wikipedia.org/wiki/Partitocracia"&gt;partitocracia&lt;/a&gt;. El ejemplo más claro de esto es el senador &lt;a href="http://es.wikipedia.org/wiki/Eleuterio_Fern%C3%A1ndez_Huidobro"&gt;Eleuterio Fernandez Huidobro&lt;/a&gt;, &lt;a href="http://www.canal10.com.uy/noticias/14433-eleuterio-fern%C3%A1ndez-huidobro-renunci%C3%B3-esta-tarde-a-su-banca-por-el-proyecto-que-deja-sin-efecto-la-ley-de-caducidad-"&gt;quien renunció a su banca en el senado, pero antes votó la ley interpretativa&lt;/a&gt; por disciplina partidaria a pesar de estar en contra (según dice...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://es.wikipedia.org/wiki/Jos%C3%A9_Gervasio_Artigas"&gt;Artigas&lt;/a&gt; dijo una frase que ha sido repetida innumerables veces: "&lt;i&gt;mi autoridad emana de vosotros y ella cesa ante vuestra presencia soberana&lt;/i&gt;". Claramente los políticos de hoy en día no la respetan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Cada vez estoy más convencido que la democracia representativa no es la forma adecuada de gobierno... Es, sin duda, lo mejor a lo que podíamos aspirar en el siglo XX. Pero en pleno siglo XXI, &lt;a href="http://blog.marcoscrispino.com/2009/06/tecnologia-de-votacion.html"&gt;creo que se podría hacer mejor&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;La democracia representativa era necesaria, porque era prácticamente imposible hacer participar a toda la población en las decisiones. Hoy en día, la tecnología hace posible que la participación popular se haga en tiempo real, por lo que ya no necesitamos representates.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Lo veo como algo muy difícil de implementar, porque siempre es complicado luchar contra la inercia del sistema actual, pero creo que sería hora de replantear lo que entendemos como democracia, y diseñar un sistema nuevo, de cero, que sea más justo y que permita a la población (a los que les interese) participar en forma directa.&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-5623850362403935325?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=XiG7uY2jTI4:iQIVy-Dkpp8: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=XiG7uY2jTI4:iQIVy-Dkpp8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=XiG7uY2jTI4:iQIVy-Dkpp8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=XiG7uY2jTI4:iQIVy-Dkpp8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=XiG7uY2jTI4:iQIVy-Dkpp8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=XiG7uY2jTI4:iQIVy-Dkpp8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=XiG7uY2jTI4:iQIVy-Dkpp8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=XiG7uY2jTI4:iQIVy-Dkpp8: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=XiG7uY2jTI4:iQIVy-Dkpp8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=XiG7uY2jTI4:iQIVy-Dkpp8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/XiG7uY2jTI4/el-final-de-la-democracia.html</link><author>noreply@blogger.com (Marcos Crispino)</author><thr:total>4</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/04/el-final-de-la-democracia.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-5632443805904262575</guid><pubDate>Wed, 06 Apr 2011 22:24:00 +0000</pubDate><atom:updated>2011-04-06T19:24:00.398-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">facebook</category><category domain="http://www.blogger.com/atom/ns#">útiles</category><title>Sobre el uso de Facebook</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s1600/facebook_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s1600/facebook_logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Soy usuario de Facebook desde hace tiempo, pero nunca lo llegué a usar "de verdad". Hay varias cosas que no me convencen del todo...&lt;br /&gt;
&lt;br /&gt;
Para publicar contenido, me gusta más Twitter. En alguna ocasión use Facebook para compartir algo semi-privado, solo con la gente que me interesaba (fotos de algún viaje, por ejemplo), pero no es algo a lo que me acostumbre.&lt;br /&gt;
&lt;br /&gt;
Lo que sí quiero usarlo es para consumir contenido. Hay gente que usa Facebook para publicar, que sí me interesa saber lo que están diciendo.&lt;br /&gt;
&lt;br /&gt;
El problema con Facebook, es que trata a todos los amigos por igual, y esa no es la mejor forma de encarar el tema, porque en realidad hay amigos que me interesan más que otros. Muchas veces lo que publican estos amigos (los que quiero saber en que andan), queda perdido entre lo que publican otros tantos, que si tengo tiempo los leo, pero si no, quiero poder acceder rápido a lo que me interesa.&lt;br /&gt;
&lt;br /&gt;
Además Facebook en su página web me muestra cosas que en general no me interesan, como por ejemplo cuando alguien comenta una foto o una nota de uno de sus amigos (que no es amigo mio). Eso hace que sea todavía más difícil encontrar las cosas que de verdad me interesan.&lt;br /&gt;
&lt;br /&gt;
Por último, el otro problema que le veo es que la página con las noticias está demasiado sobrecargada. Hay demasiadas cosas que distraen, como publicidad, sugerencia de amigos, etc. También las cosas que ya leí, que igual siguen apareciendo.&lt;br /&gt;
&lt;br /&gt;
Estuve leyendo un poco sobre la API de Facebook como para intentar hacer algo que me convenza, pero no tuve necesidad de avanzar mucho, porque encontré una herramienta que hace lo que quiero :)&lt;br /&gt;
&lt;br /&gt;
La herramienta se llama &lt;a href="http://www.facebook.com/fbcmd"&gt;fbcmd&lt;/a&gt;, y permite acceder a Facebook desde una línea de comandos. Sí, ya se, una herramienta así no es para cualquiera, pero a mi me sirve.&lt;br /&gt;
&lt;br /&gt;
Tiene muchas más cosas que las que yo necesito, como por ejemplo permite publicar álbumes de fotos. Yo en realidad uso algunos pocos comandos.&lt;br /&gt;
&lt;br /&gt;
Para consultar la actividad de la gente que más me interesa:&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fbcmd fstream _familia,_amigos new&lt;/tt&gt;&lt;/blockquote&gt;donde "familia" y "amigos" son grupos de gente que cree en Facebook. En realidad definí un alias&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;alias fb='fbcmd fstream _familia,_amigos'&lt;/tt&gt;&lt;/blockquote&gt;por lo que el comando pasa a ser&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fb new&lt;/tt&gt;&lt;/blockquote&gt;Para consultar la actividad de todos mis contactos&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fbcmd fstream =all new&lt;/tt&gt;&lt;/blockquote&gt;o usando otro alias&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fball new&lt;/tt&gt;&lt;/blockquote&gt;Además de pasarle "new", que muestra solo lo que hay nuevo, se le puede pasar un número que indica la cantidad de items que muestra. Por ejemplo&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fb 10&lt;/tt&gt;&lt;/blockquote&gt;muestra los últimos 10 items.&lt;br /&gt;
&lt;br /&gt;
Para ir a la página de Facebook a ver un item determinado (de la lista que devuelven los otros comandos, que está numerada)&lt;br /&gt;
&lt;blockquote&gt;&lt;tt&gt;fbcmd go post 3&lt;/tt&gt;&lt;/blockquote&gt;donde 3 es el número de item en la lista.&lt;br /&gt;
&lt;br /&gt;
Además tiene funcionalidades para comentar desde la línea de comandos, hacer un "like", etc. Pueden ver los comandos disponibles en &lt;a href="https://sites.google.com/a/dtompkins.com/fbcmd/commands"&gt;la página correspondiente del Wiki de fbcmd&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Por último, la aplicación es open source, escrita en PHP y bastante bien documentada, por lo que no debería ser difícil de extender. Igual por ahora con lo que tiene me alcanza y me sobra.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-5632443805904262575?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=QYHgGw0HYsA:6IumwMTtLYA: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=QYHgGw0HYsA:6IumwMTtLYA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=QYHgGw0HYsA:6IumwMTtLYA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=QYHgGw0HYsA:6IumwMTtLYA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=QYHgGw0HYsA:6IumwMTtLYA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=QYHgGw0HYsA:6IumwMTtLYA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=QYHgGw0HYsA:6IumwMTtLYA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=QYHgGw0HYsA:6IumwMTtLYA: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=QYHgGw0HYsA:6IumwMTtLYA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=QYHgGw0HYsA:6IumwMTtLYA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/QYHgGw0HYsA/sobre-el-uso-de-facebook.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-C2cTXjbChP0/TZxqwXEXhWI/AAAAAAAABXQ/8iXXDCt2OOQ/s72-c/facebook_logo.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/04/sobre-el-uso-de-facebook.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-33066466.post-1463408676240378457</guid><pubDate>Thu, 31 Mar 2011 12:08:00 +0000</pubDate><atom:updated>2011-03-31T09:08:09.169-03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">reflexiones</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>Por qué es probable que no use Google +1</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PAUWwjY-QWg/TZRsCjVaISI/AAAAAAAABW8/Lx4QJMCqjSo/s1600/google-%252B1-logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-PAUWwjY-QWg/TZRsCjVaISI/AAAAAAAABW8/Lx4QJMCqjSo/s1600/google-%252B1-logo.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Ayer Google &lt;a href="http://googleblog.blogspot.com/2011/03/1s-right-recommendations-right-when-you.html"&gt;anunció el lanzamiento de "+1"&lt;/a&gt;, un sistema de recomendación de páginas web similar al "me gusta" de Facebook.&lt;br /&gt;
&lt;br /&gt;
Básicamente el "+1" es un ícono que aparece al lado del link en los resultados de las búsquedas. Cuando encuentro algo que me interesa compartir, aprieto el botón "+1" para que todo el mundo vea que me pareció interesante.&lt;br /&gt;
&lt;br /&gt;
Esta información la va a usar luego Google para mejorar los resultados de su algoritmo de búsqueda.&lt;br /&gt;
&lt;br /&gt;
El problema es que después que hice una búsqueda, entré a varios links a ver cual me servía y encontré uno que tenía lo que estaba buscando, es muy difícil que vuelva a la página de la búsqueda para decirle a Google cual fue el que me sirvió.&lt;br /&gt;
&lt;br /&gt;
Es verdad que también hay un botón que se puede poner en las páginas web, otra vez igual que el "me gusta" de Facebook, pero ese tampoco le veo demasiado uso.&lt;br /&gt;
&lt;br /&gt;
Ahora cuando quiero compartir algo lo hago en Twitter. No voy a dejar de compartir las cosas en Twitter, y por supuesto tampoco voy a compartir en todas las redes sociales en las que participo... Para eso es público lo que pongo en Twitter, que Google lo tome de ahí.&lt;br /&gt;
&lt;br /&gt;
Acá tienen &lt;a href="http://www.google.com/+1/button/"&gt;más información sobre +1&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33066466-1463408676240378457?l=blog.marcoscrispino.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ODTiEv8hCoo:fsCrX5RApW0: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=ODTiEv8hCoo:fsCrX5RApW0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ODTiEv8hCoo:fsCrX5RApW0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ODTiEv8hCoo:fsCrX5RApW0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ODTiEv8hCoo:fsCrX5RApW0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ODTiEv8hCoo:fsCrX5RApW0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ODTiEv8hCoo:fsCrX5RApW0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/mcrispino?a=ODTiEv8hCoo:fsCrX5RApW0: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=ODTiEv8hCoo:fsCrX5RApW0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/mcrispino?i=ODTiEv8hCoo:fsCrX5RApW0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/mcrispino/~3/ODTiEv8hCoo/por-que-es-probable-que-no-use-google-1.html</link><author>noreply@blogger.com (Marcos Crispino)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-PAUWwjY-QWg/TZRsCjVaISI/AAAAAAAABW8/Lx4QJMCqjSo/s72-c/google-%252B1-logo.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.marcoscrispino.com/2011/03/por-que-es-probable-que-no-use-google-1.html</feedburner:origLink></item></channel></rss>

