lunes, 14 de noviembre de 2011

RubyConf Uruguay 2011

Los días 11 y 12 de noviembre se llevó a cabo el evento RubyConf Uruguay 2011. Este año (es la segunda vez que se hace) tuve la suerte de poder ir.

El evento fue en el Auditorio de Antel que está muy bueno, nunca había ido.

El formato del evento fue de charlas de 30 minutos, de a una por vez (había una sola sala).

Oradores

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 Scott Chacon, uno de los creadores de Git, o Blake Mizerany, creador de Sinatra.

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...

Audiencia

Siendo un evento técnico, para desarrolladores, la audiencia éramos todos (o la gran mayoría) desarrolladores.

Otra característica es que la inmensa mayoría eran hombres. Diría que un 95%, pero tengo miedo de quedarme corto...

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.

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.

Organización

La organización estuvo bastante bien:
  • el wi-fi funcionó muy bien todo el tiempo,
  • las charlas empezaron y terminaron con una puntualidad bastante aceptable (claro, uno se mal acostumbra y lo compara con los encuentros GeneXus...),
  • el lugar en sí está bueno para un evento de este tamaño.

Charlas

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.

De todas formas, hubo varias que me gustaron. Creo que se pueden ver acá (aunque no probé...)
  • A Tale of Three Trees, 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.
  • JRuby: Introduciendo Ruby en el mundo enterprise, por Jano Gonzalez.
  • Lean Startups for the Ruby Hacker, por Evan Henshaw-Plath.
  • Winning strategies in the battle against code smells, por Nigel Fernandes.
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...

Conclusión

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.

miércoles, 9 de noviembre de 2011

Por qué creo que Objective-C es mejor que Java

Hace unos días @GMilano hacía una comparación en Twitter donde decía que
Android vs iOS
IDEs:Eclipse > XCode
Language: Java > Objective-C
Framework: Cocoa > Android
Emulator: iOS > Android
Analysis: iOS > Android
y mi respuesta fue que
Casi de acuerdo, solo que Objective-C > Java... Pero, no es algo evidente al principio.
Esa respuesta tiene tiene una justificación, pero como verán lleva un poco más de 140 caracteres.

Aclaraciones:
  1. 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.
  2. 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: Can your programming language do this?
  3. Muchas veeces uno no puede elegir (iOS = Objective-C, Android = Java), pero no por eso la comparación deja de ser válida :)
Extensibilidad de clases estándar

En Objective-C, uno puede agregar métodos a las clases estándar. Digamos por ejemplo que uno quiere agregar el método year a la clase NSDate para invocarlo con
int year = [myDate year];
en vez de hacer
NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:myDate];
int year = [comp year];
Eso se puede hacer de forma muy simple, creando una "category" con la implementación
@interface NSDate (Helpers)
- (int)year;
@end
@implementation NSDate
- (int)year {
    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:self];
    return [comp year];
}
@end
Esto en Java no es posible. Se puede crear una subclase, o hacer un método estático en alguna otra clase, pero no modificar las clases ya existentes.

Blocks y selectors

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 pasaje de funciones por parámetro es bastante más complicado e involucra crear una clase específica que contenga el método.

Pasar funciones o bloques de código por parámetro permite por ejemplo implementar el método map: en la clase NSArray (combinando con lo que decía más arriba de las categories) de esta forma
- (NSArray *)map:(id (^)(id element))block {
  if (!self) {
    return nil;
  }
  NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:[self count]];
  for (id element in self) {
    [tempArray addObject:block(element)];
  }
  return [tempArray autorelease];
}
¿Cuál es la gracia? Que si quiero construir un array a partir de otro, solo tengo que pasarle al método map: 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.

Además si en algún momento se hace alguna optimización o algún arreglo, queda para todos los que lo usan.

Manejo de memoria

En lo que tiene que ver con el manejo de memoria, tanto Objective-C como Java tienen Garbage Collector.

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)

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.

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.

Sintaxis

Con respecto a la sintaxis, tengo que reconocer que ahí sí, Java le gana  a Objective-C. Tener que acceder a un elemento de un array con
[myArray objectAtIndex:0];
es bastante tedioso...

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.

Conclusión

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.

En una próxima entrega agregaré también la comparación con C# y Ruby...

viernes, 4 de noviembre de 2011

Pésimo servicio de Movistar

Soy cliente de Movistar desde hace poco más de dos años, cuando les compre el iPhone.

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.

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.

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.

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...

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.

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.

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:
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
¿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...

Lo que no puedo hacer todavía es usar el plan de datos.

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.

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.

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.

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.

¿Alguien tiene algún conocido en Movistar que me pueda dar una respuesta? En todo caso acepto sugerencias.

jueves, 3 de noviembre de 2011

Gmail.app

En el día de ayer, Google anunció la aplicación nativa de Gmail para iOS, 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 :)

El motivo por el cual la bajaron, es porque da un error al entrar:


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...

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.

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.

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.

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.

¿Será que se está convirtiendo en tendencia?