miércoles, 22 de diciembre de 2010

GeneXus Knowledge Interchange Protocol

En el día de hoy se liberó el GeneXus Knowledge Interchange Protocol (KIP), como había prometido Breogán Gonda en el pasado XX Encuentro GeneXus.

Esta es una gran noticia. Todos los que alguna vez desarrollamos alguna aplicación que generaba o interactuaba con un XPZ, sabemos lo tedioso del proceso de hacer la ingeniería reversa para entender la estructura del mismo.

Sin duda tener la especificación va a facilitar el trabajo de los que tengan que trabajar con el formato.

Pero por otro lado, creo que el KIP se queda corto.

Citando la noticia en GXTechnical:
Con la publicación del GX KIP se pretende contribuir a la consolidación del paradigma de desarrollo de sistemas basados en conocimiento, y a su vez, atender las necesidades empresariales desatendidas por la programación manual.
[...]
GeneXus, y cualquier herramienta inteligente basada en conocimiento que pueda existir en el futuro, trabajan con una KB (Knowledge Base). La KB está formada por dos componentes: una base de datos, donde se almacena el conocimiento y una “máquina” capaz de procesar automáticamente dicho conocimiento.
El problema con el XPZ, es que es demasiado dependiente de la implementación actual de GeneXus. El conocimiento no solo es independiente de la tecnología utilizada, también debería ser independiente de la forma de representarlo.

Es decir, el hecho de que represente una entidad en un objeto Transaction de GeneXus, es independiente de la existencia de dicha entidad. La entidad con su estructura y sus reglas de negocio existen, independientemente de la forma de representarla en un WebForm. Lo que se tiene en el XPZ, es una mezcla de todo eso.

Sería interesante ver el XPZ separado en dos: una parte que describiera el conocimiento de la forma más pura posible, y otra que describiera la capa de presentación como la ve GeneXus. De esa forma sí sería una representación más fiel (y transportable a otras aplicaciones) del conocimiento almacenado en la base de conocimiento.

jueves, 16 de diciembre de 2010

Alkeo Blog App

BlogReader es una aplicación en la que estuve trabajando para Alkeo (ahora conocida oficialmente como Alkeo Blog App), que permite transformar un blog en una aplicación nativa para iPhone/iPad, Android y próximamente Windows Phone 7 (*).

Desde hace un tiempo, está disponible la aplicación Blog Shane, y desde hoy hay dos nuevos blogs que están disponibles en la App Store: Shunrize y Thibault Piron.

Advertencia: todo el contenido está en francés...

Les dejo un video de BlogShane para que conozcan la aplicación:



(*) Aclaro que yo solamente desarrolle la aplicación para iOS...

jueves, 9 de diciembre de 2010

Primeras impresiones de Ruby on Rails

Esta semana empecé a desarrollar una aplicación en Ruby on Rails, que no es una plataforma que domino, y quedé gratamente sorprendido por lo fácil que es empezar y las cosas que se logran con poco esfuerzo.

Pero primero que nada, ¿qué es Ruby on Rails? De hecho son dos cosas. Ruby es el lenguaje de programación, que tiene como característica que es bastante flexible. Como lenguaje me resultó sumamente interesante.

Rails por su parte, es un framework que extiende el lenguaje y se utiliza para crear aplicaciones web.

Scaffolding

Ruby on Rails se basa en el patrón Model-View-Controller, que (muy) básicamente permite separar la capa de presentación (view) de la capa de datos (model) y las conecta mediante un intermediario (controller).

Una funcionalidad muy buena de Rails, es que permite generar un Model con sus correspondientes Views y Controller en un solo comando. Esta operación se realiza con el comando scaffold (la traducción sería algo así como "andamio").

Para generar una nueva entidad, digamos por ejemplo Persona, con los campos nombre, apellido y fecha de nacimiento, sería algo así:
rails generate scaffold Persona nombre:string apellido:string fecha_nacimiento:datetime
Esto genera:
  • La clase Persona (model) con los campos persona_id, nombre, apellido, fecha_nacimiento, y por defecto agrega campos created_at y updated_at
  • El script para migrar la base de datos creando la nueva tabla
  • El controller para manejar varias operaciones: index (lista de elementos), show (detalle de un item), edit, delete, new y create.
  • Los archivos HTML correspondientes a las vistas, para cada una de las operaciones anteriores.
Si lo fuera a comprar con GeneXus, sería como generar la transacción y el patter WorkWith con los valores por defecto, con un solo comando...

Programación declarativa

No se si ese es el nombre que se le da, pero es la forma en que se programan muchas cosas.

Por ejemplo, si quiero agregar seguridad a mi aplicación usando Devise (ver más adelante), alcanza con poner la siguiente línea dentro de la clase controller
before_filter :authenticate_user!
Otro ejemplo, si quiero que el nombre de la persona sea obligatorio, puedo agregar una validación en la clase model, con lo siguiente:
validates :nombre, :presence => true
Listo, con ese código, si al crear una nueva persona dejo en blanco el nombre, me va a dar un error.

Gems

Las Gems en Ruby, son las bibliotecas de funciones.

Existen muchas que funcionan con Rails agregando funcionalidad específica, por ejemplo para agregar autenticación de usuarios y autorización.

Devise (autenticación)

Devise agrega una capa de autenticación de usuarios. Es sumamente flexible y a la vez fácil de instalar y configurar (no voy a entrar en detalles).

Para agregar autenticación alcanza con instalar este gem, ejecutar un par de comandos para que genere un model para los usuarios, y agregar el before_filter que figura más arriba para exigir que el usuario esté logueado para acceder a una determinada página.

CanCan (autorización)

CanCan se encarga de la autorización, y se integra con Devise o con cualquier otro sistema de autenticación.

Agregar autorización es tan simple como definir en un archivo que cosas puede hacer un usuario dado su rol, y preguntar si el usuario tiene permisos para realizar una determinada acción. Por ejemplo, para saber si el usuario puede modificar una persona, el código a agregar es el siguiente:
if can? :update, Persona
  # seguir adelante
else
  # ir a alguna página de error
end
Recursos

Con respecto a los recursos, para aprender un poco sobre Rails estuve leyendo Ruby on Rails Tutorial, que está bastante interesante y da una buena idea de como se trabaja en Rails. Además usa Test Driven Development como metodología, así que ya viene bien para conocer un poco de TDD.

Hay un sitio web llamado Railscasts que tiene videos que explican paso a paso como hacer varias cosas. Con más de 240 videos, hay como para entretenerse.

Conclusión

Me gustó tanto el lenguaje (Ruby) como la plataforma (Rails). Se pueden lograr cosas muy interesantes con relativamente poco esfuerzo.

Todavía soy un novato en este tema, pero parece ser muy bueno.

lunes, 6 de diciembre de 2010

Manejo de fechas en Objective-C

El lenguaje Objective-C tiene una carencia importante según yo lo veo, que es que hay cosas que deberían ser simples y llevan una cantidad importante de trabajo.

Un ejemplo es concatenar dos strings. En cualquier otro lenguaje, sería algo como:
result = s1 + s2;
En Objective-C, hacer lo mismo lleva mucho más código:
result = [NSString stringWithFormat:@"%@%@", s1, s2];
En particular, una de las cosas que me parecen de las más complicadas en Objective-C (desde el punto de la sintaxis), es el manejo de fechas.

Por ejemplo, para crear una fecha, el código es el siguiente:
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:2010];
[comps setMonth:12];
[comps setDay:6];

NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

[comps release];
También si quiero obtener el día, mes y año de una fecha dada, es complicado:
NSDate *tmpDate = [NSDate date]; // today
NSDateComponents *comp = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:tmpDate];

int day = [comp day];
int month = [comp month];
int year = [comp year];
Claro que estas complicaciones tienen algunas ventajas. Por ejemplo, puedo tener una fecha y consultar el año en distintos calendarios (gregoriano, budista, hebreo, etc.), pero de todas formas, debería haber alguna forma más fácil de trabajar con fechas.

Por suerte, en Objective-C uno puede agregar métodos a clases ya existentes, por lo que es posible agregar algunos métodos a la clase NSDate para facilitar el trabajo. Por ejemplo:
@implementation NSDate (DateHelper)

+ (NSDate *) dateWithYear:(int)year month:(int)month day:(int)day {
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:year];
[comps setMonth:month];
[comps setDay:day];

NSDate *tmpDate = [[NSCalendar currentCalendar] dateFromComponents:comps];

[comps release];

return tmpDate;
}

- (int) getDay {
NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSDayCalendarUnit fromDate:self];
return [comp day];
}

- (int) getMonth {
NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit fromDate:self];
return [comp month];
}

- (int) getYear {
NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSYearCalendarUnit fromDate:self];
return [comp year];
}

@end
Ahora entonces para crear una nueva fecha, podemos hacer simplemente:
NSDate *date = [NSDate dateWithYear:2010 month:12 day:6];
y para obtener el año de dicha fecha
int year = [date getYear];

viernes, 3 de diciembre de 2010

El portal del estado uruguayo y pagos a través de ANTEL

Hace un rato, tenía que ver como era el tema para renovar la cédula de identidad (documento que identifica a las personas en Uruguay...).

¿Cuál es el lugar para buscar esa información? Obviamente, el portal del estado uruguayo.

Busqué por "renovación cédula de identidad" y el resultado que estoy buscando aparece en el segundo o tercer lugar. Bien.

Primer problema: el sitio con la información correspondiente usa HTTPS pero el certificado no es de confianza... Por lo tanto Google Chrome me muestra una página toda roja, que generaría alarma en cualquier usuario desprevenido.

Viendo el certificado de la página, veo que fue emitido por el Correo Uruguayo, que obviamente no es reconocido como proveedor de confianza...

Sigo adelante.

Llego a una página donde me da toda la información de a qué número de teléfono tengo que llamar, la dirección de la oficina, etc., y un link para hacer el pedido de hora on-line. ¡Espectacular!

En el sitio dice que se puede pagar con Banred (que no tengo) o mediante ANTEL y viene el costo en la próxima factura del teléfono. Bien, pero antes, hay que registrarse en ANTEL.

Voy a la página de ANTEL y me registro. Me piden nombre, apellido, número de cédula, número de cuenta de ANTEL (que aparece en la factura), que elija un nombre de usuario y contraseña, pregunta de seguridad (!), y varios datos más.

Ahora que ingresé todo, confirmo. Y al confirmar me dice que la solicitud va a ser procesada el primer día hábil, y me van a mandar un mail cuando esté habilitado.

Yo pregunto... ¿por qué tiene que ser un día hábil? Si ya tienen todos mis datos, ¿no es hacer un select en la base de datos para ver que los datos sean correctos? Es más, yo se los escribo:
select count(*) from USUARIOS where Nombre = ? and Apellido = ? and Cedula = ? and Telefono = ? and NroCuenta = ?
Si eso da mayor que cero, entonces los datos están bien...

Recién me llamaron... para pedirme el número de cédula que ya se los dí en el sitio web, y dice que me va a llegar un mail en dos horas con la confirmación de la habilitación.

Como hay gente que le gusta hacer las cosas complicadas...

martes, 23 de noviembre de 2010

Sobre paros y huelgas en empresas de servicios

Los últimos días parece que la cantidad de paros y conflictos laborales ha explotado. No hay gremio que no esté reclamando algo... o por lo menos así parece. La cobertura de los informativos sobre estos conflictos también es mucho mayor que el año anterior.

Cuando los empleados hacen paro en una empresa, digamos por ejemplo una fábrica, el objetivo es perjudicar al patrón para que atienda sus reclamos. Cuando es una empresa que produce bienes, en general haciendo un paro esto se logra.

Ahora, cuando la empresa brinda servicios, no es el patrón el principal perjudicado, sino que son los usuarios. Por ejemplo, el conflicto de la limpieza...

Esto lleva además a empeorar la imagen de los gremios, que en vez de tener a la opinión publica de su lado, se ponen a la gente en contra. O si no, ¿a quién le cae simpático el gremio de ADEOM por ejemplo?

Creo que a los gremios les está faltando un poco de imaginación, además de un poco de sentido de responsabilidad social. Me parece bien que reclamen lo que quieran (siempre que sea razonable), pero no a costa de perjudicar al resto de la población. Tendrían que buscar medidas de lucha que no nos afecten a todos.

Por ejemplo el transporte público. ¿No sería mejor, en vez de hacer paro y que no haya transporte, salir a la calle y no cobrar boleto? Al patrón lo estás perjudicando igual o más que haciendo paro, pero sin afectar al resto de la población...

lunes, 22 de noviembre de 2010

Mi primer aplicación iOS con GeneXus

Hace unos días se liberó la posibilidad de generar aplicaciones para dispositivos iOS usando GeneXus X Evolution 2 (beta), así que me puse a hacer alguna prueba...

Lo primero que me encontré fue la falta de documentación específica para esta plataforma. La página correspondiente en el Wiki explica que se debe bajar una aplicación desde el App Store, pero no dice nada de como configurar el modelo.

La documentación correspondiente a Android es mucho más completa, y ahí sí explica la configuración necesaria (para Android, pero sirve de ejemplo...), con lo que pude configurar el modelo.

Siguiendo este instructivo hay algunas cosas a tener en cuenta:

  1. El generador para iOS no requiere ningún tipo de emulador, por lo que la configuración es mucho más sencilla que para Android.
  2. En las preferencias correspondientes al generador para Smart Devices, se debe configurar iOS como Main Platform, porque por defecto es Android.
Esa fue toda la configuración necesaria para poder correr la aplicación en un iPhone. La aplicación muestra los datos correctamente. El único problema que tuve fue que se cierra cuando quiero agregar... pero eso es para el foro y no para el blog.

Me pareció muy bueno lo que se puede lograr en poco tiempo con este generador. La principal ventaja que tiene es la velocidad con que se pueden desarrollar las aplicaciones. Es impensable crear una aplicación y su back-end correspondiente en media hora programando a "mano". En este punto me parece difícil de superar.

La principal contra que le veo es que la aplicación generada es muy básica en cuanto a su diseño. Sería bueno (no se si estará en los planes) que se pudiera generar el proyecto XCode de la aplicación para poder realizarle modificaciones. Esto último es peligroso porque al volver a generar pierdo los cambios, pero lo veo como algo necesario al menos hasta que se pueda tener mayor control desde dentro de GeneXus.

En conclusión, creo que viene muy bien encaminado.

lunes, 1 de noviembre de 2010

Invocación dinámica de funciones en Objective-C

Tengo el siguiente problema: tengo un objeto que tiene tres propiedades (o métodos, en Objective-C se pueden invocar como métodos), que tienen nombres "sourceUrl1", "sourceUrl2" y "sourceUrl3".

En una determinada función, recibo por parámetro el número de la propiedad que quiero usar.

El código "tradicional" para hacer esto, sería con un switch, discriminando por el valor del parámetro. Algo así:
NSString *strUrl;
switch (indexPath.row) {
  case 0:
    strUrl = question.sourceUrl1;
    break;
  case 1:
    strUrl = question.sourceUrl2;
    break;
  case 2:
    strUrl = question.sourceUrl3;
    break;
}
Pero Objective-C tiene la ventaja de ser dinámico. De esa forma, puedo construir el nombre de la propiedad usando un string, e invocarlo a partir de ese nombre.

El código usando esta propiedad del lenguaje es:
NSString *selectorName = [NSString stringWithFormat:@"sourceUrl%d", indexPath.row+1];
NSString *strUrl = [question performSelector:NSSelectorFromString(selectorName)];
Me gusta cuando encuentro que se pueden resolver las cosas de una forma más simple :)

lunes, 25 de octubre de 2010

Ideas para nueva extensión de GeneXus

Desde que en el pasado encuentro GeneXus anunciaron que va a haber un marketplace para vender extensions y user controls, estoy con ganas de hacer algo para comercializar.

El problema, es que no se muy bien que hacer... Como no he trabajado con las últimas versiones en ambientes de producción (solo usé la Evolution 1 para alguna prueba), no se muy bien que cosas se pueden precisar.

Así que los invito a que tiren ideas :D. Entre las ideas que propongan, veremos de hacer una votación a ver cual gana.

Hay una lista de ideas en el wiki, y hay otra lista de propuestas de proyectos para los Collaborative Projects, pero quisiera hacer algo que efectivamente sirva y se vaya a usar.

Como premio, los que participen podrán ser beta testers y tendrán una versión gratis de la extensión una vez que esté liberada.

viernes, 15 de octubre de 2010

Blogger Action Day 2010: Agua

Blog Action Day es un evento anual, que tiene lugar todos los 15 de octubre, que une a los bloggers del mundo escribiendo sobre un mismo tema, el mismo día, con la intensión de fomentar la discusión y generar acciones.

Este año el tema es el agua. Así que dejo un video de TED que habla sobre como filtrar el agua para potabilizarla.



Me enteré de este día a través de este artículo en el blog de Google.

miércoles, 13 de octubre de 2010

Libro: El factor humano

Terminé de leer "El factor humano". Lo puedo recomendar. Para los más vagos, pueden ver Invictus (yo no la ví) que se supone está basada en el libro.

El libro trata sobre la unificación de Sudáfrica, que hasta el momento estaba divida por el apartheid y al borde de una guerra civil. Se centra básicamente en la figura de Mandela, y cuenta como la final del mundial de rugby de 1995 terminó de unir al país mediante un logro deportivo.

Me hizo acordar de dos cosas. Primero, como los resultados de Uruguay en el mundial de Sudáfrica hicieron salir a todo el mundo a la calle a festejar. Se ve que el deporte tiene la capacidad de generar ese clima de unidad.

La segunda es un poco más "geek"... En el libro se pinta a Mandela como una persona que logró convencer a todos de su plan para Sudáfrica, incluso a sus peores enemigos. En la Segunda Fundación de Asimov (tercer libro de la trilogía), hay un personaje llamado "El Mulo" (The Mule en el original en inglés...), que tiene la capacidad de alterar las mentes de las personas. De esa forma, se propone conquistar toda la galaxia. Lo que logra Mandela (si es como lo cuenta el libro), luego de estar 27 años en prisión, es digno de una novela de ciencia ficción.

jueves, 7 de octubre de 2010

Guerra de navegadores

Leo en ALT1040 que Internet Explorer bajó del 50% de mercado de los navegadores.

Yo se que este blog no es representativo, porque los que lo leen son usuarios más técnicos que el promedio, pero me pareció interesante hacer una comparación...

La comparación es entre los meses de setiembre de 2009 y 2010 en el blog, y el porcentaje global de mercado a setiembre de 2010.

BlogGlobal
NavegadorSetiembre/2009Setiembre/2010VariaciónSetiembre/2010
Firefox
39.1%
35.9%
-8%
31.5%
Chrome
15.9%
29.4%
+85%
11.5%
Internet Explorer
40.2%
27.1%
-33%
49.9%
Safari
2.0%
4.0%
+100%
4.4%
Otros2.8%3.6%
+29%
2.7%

Nótese el crecimiento que ha tenido Chrome en el último año, robándole mercado tanto a Internet Explorer (principalmente) como a Firefox. El otro que tuvo un crecimiento importante fue Safari, pero sin llegar a ser significativo.

El crecimiento de Safari y el de "Otros", se puede explicar por dos motivos:

  1. Un aumento en las visitas desde Mac OS X, pasando de 2% hace un año al 7.3% ahora
  2. Un aumento en las visitas desde dispositivos móviles (iOS, Android, Symbian y Blackberry), pasando de 0.9% al 3.8%. Este número me resulta un poco bajo todavía, tiene mucho para crecer...

miércoles, 29 de septiembre de 2010

GeneXus en StackExchange: Commitment

Hace unos minutos la propuesta para crear un foro de GeneXus en StackEchange superó la etapa de "definition", y ahora está en la etapa de "commitment".

En esta etapa es necesario que las personas se registren y se comprometan a usar el sitio de preguntas y respuestas. El único requisito es registrarse con el nombre completo... Por lo que vi de otras propuestas, se precisan unas 200 personas anotadas.

Los invito a que se anoten siguiendo este link.

Por más información, pueden ver la nota anterior en el blog, y también las transparencias de la charla que di en el XX Encuentro GeneXus sobre el tema.

lunes, 20 de septiembre de 2010

Actualizaciones de XCode

Esta nota es para quejarme... a ver si Apple me hace caso.

¿Por qué cada vez que hay una versión nueva de XCode o del iOS SDK tengo que bajar todo de nuevo? El instalador son casi 3GB... ¿no sería mejor bajar solo una actualización?

Para instalar el SDK 4.0, 3GB. Para el 4.0.1, 3GB. Para el 4.0.2, 3GB. Ahora para el 4.1, 3GB... ¿O acaso no saben en Apple que acá tenemos velocidades de conexión lentas?

Además por si fuera poco, el ADSL se corta a las 12 horas, y hay que bajarlo todo de nuevo, aunque ya haya bajado 2.8GB LRPMQLP...

Me cuesta creer que no puedan empaquetar solo lo que cambió y hacer un upgrade.

Y yo que me quejaba de GeneXus que hace lo mismo, pero con un tamaño de 180MB...

viernes, 17 de septiembre de 2010

Usos de Twitter

Hace un tiempo escribí un artículo sobre Twitter, diciendo que no lo entendía.

Actualmente lo uso, y los que me siguen en Twitter, Google Buzz o Facebook tuvieron la oportunidad de comprobarlo durante el encuentro GeneXus, ya que se vieron saturados de mensajes :)

Claramente algo cambió en mi perspectiva con respecto a esta herramienta. Es más, como decía Rorro en un comentario en aquella oportunidad, se ha convertido casi en un vicio.

¿Para que uso Twitter?

En el artículo que escribí en el 2008, no entendía el tipo de comentarios que ponía la gente:
Básicamente lo que no me cierra, es por qué alguien querría publicar algo como "voy a tomar un café", o "estoy abriendo GeneXus", o "me voy a dormir, hasta mañana"...
Todavía sostengo que esa clase de información es prácticamente inútil.

A mi me resulta sumamente útil como filtro de información. Cuando alguien a quien sigo, comparte algún link de algo, es porque le parece interesante. Si es una persona con intereses similares a los mios (en general ese es mi criterio para seguir a alguien), entonces es probable que a mi también me parezca interesante.

Si además alguien más lo vuelve a compartir (mediante un RT o "retwitt"), la probabilidad de que me resulte interesante pasa a ser bastante mayor.

Además lo uso como forma de compartir cosas que me parecen interesantes a mi, y que le pueden servir o interesar a alguien más. Pueden ser un conjunto de fotos, opiniones de algún tipo, compartir anuncios, o algún artículo que me resulte interesante.

Además, también sirve como una especie de foro, o un lugar donde preguntar y obtener una respuesta. Por ejemplo este caso, donde me quejé de que un sitio web no tenía RSS, y a los 5 minutos obtuve una respuesta diciendo que sí tiene y la URL. Si no hubiera sido por Twitter, esta interacción no se hubiera dado, me habría quedado con que no tenían RSS, y listo. Gracias a que lo publiqué, pude acceder al contenido.

Una anécdota

El otro día en el encuentro GeneXus, estaba en la charla de Gonzalo Frasca, e hizo una propuesta, de tener un sitio para reportar problemas en la ciudad. Lo publiqué en Twitter, y a los 5 minutos tenía una respuesta, de otra persona, que no estaba viendo la charla, que decía que ya tiene ese sitio en camino.

Obviamente le contesté (todo esto por Twitter...) que se pusiera en contacto con Frasca, a lo cual me pidió la información de contacto, por lo que le pasé el usuario de Twitter.

Nuevamente, esta interacción y las cosas que pueden resultar de ella, no hubieran sido posible si no fuera por Twitter.

Conclusión

El principal uso de Twitter, según yo lo veo, es para decir o compartir cosas interesantes.

Si yo tengo algo interesante para decir, pero no se lo digo a nadie, entonces esa información va a ser totalmente inútil. En cambio, si comparto estas cosas, entonces puede ser que a alguien más le sirva y haga algo interesante con ella.

jueves, 16 de septiembre de 2010

XX Encuentro GeneXus, día 3

Pensé que este tercer día iba a ser el más flojo con respecto al interés de las charlas, pero la verdad que me gustaron todas las charlas que fui...

Charlando con Mastro

Muy divertida la entrevista a Mastro. Lo que eso sí, lo hicieron transpirar...

El plan Ceibal y la amenaza zombie

Cuando fui a la charla no sabía cual era la amenaza zombie... pero empezó diciendo algo así como: cómo es que niños sanos, criados en una pradera suavemente ondulada, alimentándose de pasto (de vacas que comen pasto), se terminan convirtiendo en empleados públicos?

Después aclaró por supuesto que no todos los empleados públicos eran zombies...

La charla estuvo muy interesante, básicamente contó como funciona el aprendizaje en un video juego. Cuando uno empieza a jugar va aprendiendo cosas que le sirven en el nivel que está. Cuando avanza al siguiente nivel, se da cuenta de lo que aprendió en el anterior no le sirve como está, sino que debe incorporar algún otro conocimiento. De esta forma, pasando de nivel en nivel, uno va adquiriendo todo el conocimiento que necesita pero de forma gradual.

Nunca lo había pensado, pero parece ser una buena forma de aprender...

Autenticación y permisos en mi aplicación GeneXus

En el programa original que me había armado no estaba esta charla, iba a ir a una de K2B mobile, pero después que hablaron del GAM en la Evolution 2 decidí cambiar...

El GAM (GeneXus Acces Manager) es un conjunto de bibliotecas externas y propiedades que se agregan a la KB (supongo que mediante una extension), que permiten definir la autenticación de la aplicación de forma declarativa.

Mediante el GAM se podrá autenticar contra una base de datos local, contra OpenId, o también contra Twitter o Facebook. Mostró el código de estas dos últimas, y es una sola línea de código.

También se podrá autenticar contra otros servicios, como por ejemplo GXTechnical.

Además, si yo implemente un sistema de seguridad propio, mediante el GAM voy a poder exponerlo como proveedor de OpenId.

Testing: el camino para que confíen en nuestro software

Federico Toledo contó las 5 principales excusas que les dan para no automatizar el testeo, y explicó por que ninguna de ellas son válidas.

Estas son:
  1. No tengo tiempo
  2. Es muy costoso automatizar
  3. Mi jefe no me asigna horas
  4. No hay herramientas que me solucionen todo
  5. Me aburro, me desmotivo
Yo creo que las he usado todas :)

Cuando estaba en el cuarto punto, dijo que bueno, que si él fuera vendedor les diría que GXTest soluciona todos los problemas, pero que él como vendedor es un buen tester, así que no lo dijo... La herramienta soluciona varios problemas, pero no evita que tengamos que pensar.

Aplicando metodología a la innovación

Me gustó la charla de Pablo Brenner, vale la pena verla.

Más allá de los límites

No conocía a Gonzalo Vilariño, que fue director técnico de "los murciélagos" (selección de fútbol de ciegos de Argentina) por 10 años.

También me gustó la charla, me impresionó como mueven la pelota los ciegos. Creo que no me gustaría jugar un partido contra ellos...

Keynote de Nicolás Jodal

Como siempre las charlas de Jodal vale la pena verlas. Como resumen... hoy (16 de setiembre de 2010) hay que comprar un smart device.

Entrega de reconocimientos

Felicito nuevamente a la gente de Concepto, en particular a Federico Alvarez con quien trabajé muchos años, por el reconocimiento como beta testers de GXTest.

Keynote de Breogán Gonda

Las charlas de Gonda no son las más divertidas, pero me queda claro que sabe de lo que habla. Otra que si tienen tiempo valdría la pena ver.

Lo que me preocupa es que no lo escuché decir la palabra "sinergia", una fija en casi todos sus keynotes... ¿Alguien me puede confirmar el dato? ;)

Un anuncio que hizo, que se venía pidiendo desde hace tiempo, es que van a publicar el formato de intercambio de información de GeneXus (XPZ supongo, aunque no lo nombró explícitamente), usando alguna licencia libre para que cualquiera pueda usar y modificar el protocolo.

Actualización, 11:20: Acabo de leer la nota de Montevideo Comm sobre esta charla, creo que es un buen resumen.

Show de cierre

En el cierre del evento estuvo Emil Montgomery. No es mi música favorita... pero fue un espectáculo interesante.

Conclusión

Se fue otro encuentro GeneXus...

Primero que nada felicitar a la gente de Artech, por lo bien organizado que estuvo el evento. Todas las charlas empezaron en hora, no hubo problemas ni con máquinas ni con proyectores ni nada (en las que estuve yo al menos), la conexión a internet mediante Wi-Fi impecable.

Siempre me gusta ir a estos eventos, tuve la suerte de poder aprovechar los tres días, viendo en que anda Artech, y encontrándome con varios amigos.

Con respecto a GeneXus, creo que con la Evolution 2 y con la versión Pinar se vienen cosas muy interesantes. Hay varias mejoras que creo que van a ser bienvenidas. También está GeneXus SDX, que abre un montón de nuevas posibilidades, habrá que probarlo.

Y con respecto a la tecnología en general, se nos viene una etapa interesante... El tema de los smart devices nos va a dar algunos dolores de cabeza al principio, como toda tecnología nueva, pero es una tecnología que vino para quedarse. Y si bien no van a sustituir el PC (en el corto plazo al menos...), es una nueva plataforma que no se puede ignorar.

Bueno, nada más. Otra vez felicitaciones, y hasta el encuentro que viene :)

martes, 14 de septiembre de 2010

XX Encuentro GeneXus, día 2

Experiencias en la nube, mesa redonda

En la mesa redonda se trataron varios temas, en algunas opiniones coincidían los exponentes, en otras no tanto... Voy a tratar de resumir lo que me quedó.

Confianza: las empresas todavía no confían en poner todos los datos en la nube, es un tema cultural o de costumbre, hicieron la analogía con los bancos: ¿donde tenés la plata, en tu casa o en el banco?

El tema de la confidencialidad de los datos todavía no está del todo resuelto, pero se ha avanzado mucho en el tema con contratos de confidencialidad.

Los gobiernos, va a ser difícil que publiquen los datos en un data center fuera del país, por un tema de soberanía sobre los datos. Por lo tanto, deberán surgir data centers locales.

Contaron la experiencia de un data center en Brasil vs. Amazon, y en Amazon es más barato, más rápido y el tema de la latencia no fue un problema.

Características que debe tener una aplicación para poder estar en la nube: debe ser web, escalable, multitennant, tener buena seguridad, buena performance.

Modelo de negocio: no hay un estandar. A veces se cobra por número de usuarios, se podría cobrar por volumen de datos o de facturación de la empresa, o algún otro esquema. En las aplicaciones SaaS el modelo de negocio es distinto, hay que pensar más a largo plazo que cuando se venden licencias.

Los motivos para migrar a una arquitectura SaaS: si no lo hacemos nosotros lo van a hacer otros, los clientes lo empiezan a pedir. Contaron una anécdota que llamó un cliente para pedir una aplicación que tuviera determinadas características y que estuviera en la nube. Ante la pregunta de en qué nube, la persona contestó que "Ah, no se, a mi me pidieron que dijera eso"...

Próximas evoluciones

Las próximas versiones de GeneXus van a tener unas cuantas cosas interesantes.

Evolution 2

GeneXus Access Manager (GAM): mecanizmos de autenticación y autorización integrados a GeneXus que se definen de forma declarativa. Se va a poder autenticar contra la aplicación, pero también con OpenId, Facebook, Twitter y otros.

Reportes adaptables en tiempo de ejecución. Va a haber un editor de layout que va a permitir cambiar el aspecto del reporte, sin necesidad de tener GeneXus ni de regenerar la aplicación. Cada cliente va a poder tener su propia versión del mismo reporte.

Aplicaciones multitennant sin tener que hacer cambios de programación.

Versión Pinar

Modulos. Los objetos van a pertenecer a un módulo y van a poder ser públicos para toda la KB o privados dentro del módulo.

Embedded data providers, son data providers que se definen inline dentro del código de otro objeto.

Los tipos de datos básicos, los extendidos, los SDTs y los dominios, pasan a ser todos dominios. Estos nuevos dominios tendrán semántica (por ejemplo datos de geolocalización), comportamiento (se pueden definir métodos) y presentación (se puede definir como se deben mostrar, por ejemplo un mapa con un pin).

Event driven programming. Se podrán programar eventos, por ejemplo un evento que se dispare siempre que se da de alta un cliente. En ese caso me imagino que será como un AfterTrn pero global a toda la KB.

Módulos 1.0

Los módulos van a ser un nuevo objeto en GeneXus, parecido a los folders actuales (que van a seguir existiendo).

Todo (casi todo...) objeto en una KB va a estar dentro de un módulo. Hay algunas excepciones, como ser los dominios, imágenes, objetos Language y alguna más.

Un objeto dentro de un módulo podrá tener visibilidad:

  • público: se puede invocar desde cualquier otro objeto de la KB
  • privado: solo se puede usar dentro del módulo
  • interno: solo se puede usar dentro del módulo y sus submódulos.
Los atributos y las tablas van a estar dentro del módulo al que pertenece la Transaction que lo define. Si hay varias trns paralelas, deberán estar en el mismo módulo.

El nombre del objeto pasa a ser módulo.objeto, por lo que pueden haber varios objetos con el mismo nombre en la KB, siempre que estén en distinto módulo.

Las KBs actuales, en la Evolution 1, van a funcionar igual a como funcionan hoy al migrar a la versión Pinar. Seguramente no haya compatibilidad para ir hacia atrás, es decir, para distribuir objetos de Pinar y consolidarlos en la Ev1.

Mejoras en el lenguaje GeneXus para futuras versiones

Los objetos podrán tener distintos puntos de entrada (distintas reglas parm). No es lo mismo que tener parámetros opcionales, pero se acerca bastante.

Las subrutinas tendrán parámetros.

Se agrega como optimización al for each la generación de sentencias con "group by" en el SQL, cuando sea posible.

En los "for each" sobre colecciones podrán usarse clausulas "where" y "when none" como se hace en el "for each" que va a la base de datos. Es algo muy bueno que va a mejorar el código. No puedo decir que es algo que había pedido, pero sí surgió en los comentarios de algo que había escrito por el estilo.

Se tendrán BCs y SDTs genéricos, para poder crear algoritmos que se aplican a cualquier colección. Las variables de estos tipos tendrán métodos como setValue y getValue para acceder a los campos de cada elemento. Lo que falta es poder invocar métodos por nombre, o por lo menos no lo mencionaron.

Metaprogramming. Se va a poder acceder en tiempo de ejecución a la metadata de la aplicación, por ejemplo, la lista de las transacciones. En la demo, mostraron un caso de estos, donde tenían un Work With genérico, que como parámetro recibía el nombre de la transacción, y mediante el uso de BCs genéricos creaba registros. Todo esto sin tener programación específica para la transacción que usó de ejemplo.

Realmente son muchas las mejoras que se vienen, que eran necesarias para potenciar el lenguaje de programación.

Cloud computing para pequeñas y medianas empresas

Fue un buen repaso de las características y las ventajas que tiene tener la aplicación en la nube.

En cuanto a usos alternativos (si no queremos tener la aplicación en la nube), se mencionaron 2:
  • para hacer pruebas de concepto, por ejemplo si tengo mi aplicación en C# con SQL Server y quiero ver como se comporta en Linux/Java/MySQL, puedo hacerlo sin necesidad de comprar hardware, simplemente alquilo lo que preciso por el tiempo que lo voy a usar
  • para hacer pruebas de performance, que nuevamente es más económico alquilar el hardware para ver como escala mi aplicación que tener que comprarlo.
Desde GeneXus se podrá hacer el deploy en Windows Azure o en Amazon, configurando solamente algunas propiedades.

Como RDBMS también se soportan los de Microsoft y Amazon, que son instancias de SQL Server y MySQL respectivamente. El único cambio que se debe hacer en GeneXus es el nombre del servidor y de la base en las propiedades de conexión.

También habrá soporte mediante el uso de objetos externos para usar el almacenamiento de Windows Azure.

Elevator Speech: Extensibilidad y sus oportunidades

Es verdad que 5 minutos no dan para mucho, pero esperaba que se hablara de cosas más concretas que de lo que se habló. Sacando algún caso puntual, la charla no me gustó demasiado.

Elevator Speech: Pro Comunidad

Este conjunto de charlas me parece que fue más aprovechable que la tanda anterior.

Disclaimer: yo di una charla de 5 minutos en este espacio... pero no cuento la mia porque es difícil opinar desde arriba del estrado.

En cuanto a mi charla sobre StackExchange, creo que no logré convencer demasiada gente, porque la propuesta tiene solamente un seguidor más que lo que tenía ayer. :(

Pueden ver la PPT de la charla en SlideShare, o supongo que se publicará también en el sitio del encuentro.

El poder de lo simple

Como siempre la charla de Rodrigo Alvarez me resultó interesante y muy amena. Se las recomiendo.

Ahora que lo pienso, nuestra mente se equivoca mucho

Igual que la anterior, las charlas de José Lamas vale la pena verlas. No tiene mucho sentido que haga un resumen.

La singularidad tecnológica

Fue más o menos lo que me esperaba. La charla estuvo bastante bien, solo que muchas de las cosas no las mostró por falta de tiempo. Yo creo que si hubiera tenido dos horas tampoco le daba para presentar todo.

El tema me resulta sumamente interesante, soy uno de los convencidos que la singularidad va a llegar, y más o menos las cosas que nombró ya las conocía.

Igual me impresionó algunos de los avances que contó sobre todo relacionados con la medicina. Por ejemplo, que ya existe la posibilidad de imprimir piel sobre tejido quemado, o crear un órgano artificial a partir de células madre. También toda la parte de robótica aplicada a la medicina, como por ejemplo brazos artificiales.

No se si recomendar la charla, me parece que vale más la pena leer el libro de Ray Kurzweil.

lunes, 13 de septiembre de 2010

XX Encuentro GeneXus, día 1

GeneXus en el corto y mediano plazo

Hubieron varios anuncios en la charla de Nicolás Jodal.

Va a haber una versión Evolution 2 que se va a enfocar en Smart Devices, con una versión beta para los próximos meses. Se van a soportar las plataformas iOS, Android y BlackBerry, y en un futuro también podría estar Windows Phone y tal vez Nokia.

Las demás mejoras que tenían pensadas para la Evolution 2, quedan para la siguiente versión, que tendrá nombre código "Pinar".

Habrá una nueva versión de GeneXus, llamada GeneXusSDX por "Smart Devices eXpress", que va a permitir gener aplicaciones para estos aparatos, con un IDE en la nube, y con las aplicaciones generadas también hosteadas en la nube. Es algo que hace algún tiempo habíamos comentado que se podía venir. Es bueno ver que se hace realidad :)

Esta versión de GeneXus estará próximamente en beta, la cual será por invitación (quiero una...).

También anunció el GeneXus Marketplace, que será una tienda donde los desarrolladores podrán publicar Extensions y User Controls para vender (o eventualmente grátis). Me imagino algo similar al App Store de Apple o al Application Marketplace de Android. Hay una charla sobre este tema el miércoles a las 10:30.

Me parece una buena idea que la charla de GX en el corto y mediano plazo sea la primera, porque si queda para el final pierde mucho de la sorpresa.

Un año de GeneXus X Evolution 1

La charla de Armin fue una reseña de algunas mejoras que tiene la Ev1 con respecto a versiones anteriores, donde contó acerca de la madurez de la herramienta.

La sugerencia es que todos se pasen cuanto antes a esta versión...

La era de los Smart Devices

En esta charla Gastón Milano amplió la información que había dado Jodal en su charla sobre este tema, que sin duda viene siendo el tema del XX Encuentro (por lo menos de las charlas que yo he ido, capaz que tengo una visión muy parcial del tema...)

El target de las aplicaciones que pretenden generar son obviamente aplicaciones del tipo "productivity applications".

Las interfaces para los distintos generadores móviles (iOS, Android y BlackBerry) se definen mediante el uso de Patterns, crearon patterns específicos para esta tarea. Los datos en las aplicaciones que mostró salen de otra KB que publica web services ReST.

En el iPad, mostró como se prototipa, para lo cual utilizan un "flexible client", que es una aplicación que se instala en el dispositivo y luego permite ejecutar cualquier otra aplicación generada. Esto que a priori parece difícil de hacer, ya que Apple no permite descargar código para ejecutar, lo logran teniendo pre-definidas las pantallas, y luego transfiriendo solo la metadata de la aplicación y los datos de la misma.

Luego mostró una aplicación Android, donde se puede compartir información utilizando alguna aplicación que tenga el usuario instalada, por ejemplo en Twitter, Facebook, mail, SMS, etc.

Las aplicaciones tendrán un cache para poder ver la información aún estando desconectado.

También podrán interactuar con la cámara, teléfono, aplicaciones, etc. Todo esto lo mostró en Android, no se si será para todas las plataformas igual.

Están siguiendo las guías de diseño de cada plataforma.

El roadmap:

  • beta: octubre de 2010
  • beta 2: diciembre de 2010
  • release candidate: febrero de 2011
  • versión final: marzo 2011
Están trabajando en varios temas más;
  • Ads
  • Deployment
  • Temas
  • Autenticación y autorización
  • Multitenant
Aplicaciones para dispositivos Android

Fernando Panizza estuvo mostrando en más detalle todo lo que tiene el generador para Android.

Primero contó algunos detalles sobre la plataforma, algunas consideraciones a tener en cuenta, como que la gama de dispositivos es muy amplia y con varias versiones distintas del sistema operativo, y que tienen distintas características.

También hizo un repaso de los componentes que tiene una aplicación.

Por último hizo una demo con tres aplicaciones creadas por GeneXus, donde mostró que puede manejar distintos tipos de datos como ser números de teléfono, direcciones de e-mail, URLs, datos de localización, y en cada caso el dato es manejado por la aplicación que corresponde.

La oportunidad iPad

Si bien la gente de SouthLabs no está desarrollando con GeneXus, en la charla se habló de varios temas de interés, y se dieron algunos tips que pueden ser útiles.

Aplicaciones para dispositivos iOS

La charla fue bastante parecida a la de Android, donde se mostró lo que tienen para iOS.

Para las aplicaciones para smart devices, hay un nuevo objeto GeneXus llamado Dashboard, que es lo más parecido que hay a un menú :)

Lo más curioso de la charla fue que la hizo toda con el iPad... desde la presentación hasta las demos.

Aplicaciones para plataforma BlackBerry

La charla estuvo interesante, pero otra vez, bastante parecida a la de Android e iOS...

Lo particular del generador para BlackBerry es que no lo está desarrollando Artech, sino que lo hace la gente de DVelop.

De los tres generadores para smart devices parece ser el que está más verde.

Twitter, nueva plataforma, nuevas oportunidades

La charla pintaba interesante, pero lamentablemente me tuve que ir antes que terminara, así que la tendré que ver en video...

jueves, 9 de septiembre de 2010

Mi agenda para el XX Encuentro GeneXus

Siguiendo el ejemplo de Eugenio García, les dejo la lista de charlas a las que pienso ir en el XX Encuentro GeneXus.

Como en los últimos dos encuentros, pienso hacer un resumen de las charlas a las que vaya. Pero además, este año seguramente haga el seguimiento en vivo a través de Twitter. Si quieren ver en que ando, vayan a twitter.com/mcrispino :)

También si andan por Twitter, no dejen de buscar el tag #XXGX.

Lunes

9:15 - GeneXus en el corto y mediano plazo
Nicolás Jodal - Artech

10:45 - Un año de GeneXus X Evolution 1
Armin Bachmann - Artech

11:15 - La era de los Smart Devices
Gastón Milano - Artech

12:00 - Got Android?
Cecilia Abadie - Full Swing Golf Inc.

12:30 - Aplicaciones para Dispositivos Android
Fernando Panizza - Artech

14:30 - La oportunidad iPad
Daniel Gómez - SouthLabs

15:00 - Aplicaciones para Dispositivos iOS: iPhone, iPod Touch & iPad
Fabián Inthamoussu - Artech

15:45 - Aplicaciones para plataforma BlackBerry (RIM)
Agustin Napoleone, Felipe Herrera - DVelop

16:15 - Twitter: nueva plataforma, nuevas oportunidades
Leonardo Vernazza - ComponentOne

Martes

9:00 - Experiencias en la Nube. Mesa redonda con sus protagonistas de la comunidad GeneXus (partes 1 y 2)
Enrique Almeida - Concepto (moderador) / Mario Celano - ZetaSoftware / Victor Villar - Montevideo Comm / Fernando Lazcano - CPG Soft / Marcos Abellón - W5 / José Lamas - Artech

10:30 - Proximas Evoluciones
Gustavo Proto - Artech

11:00 - Módulos 1.0
Ana Berta - Artech

11:45 - Mejoras en el lenguaje GeneXus para futuras versiones
Gustavo Brown - Artech

12:15 - Cloud Computing para pequeñas y medianas empresas (y las demás también)
Sebastian Gómez - Artech

14:30 - Elevator Speech: Extensibilidad y sus Oportunidades
David Giordano - De Larrobla y Asociados , Lucas Santos Sanches - Daniel Coellar - GeneXus USA , Federico Lopez Calsina - Ingeniería y Software , José Lamas Rios - Artech

15:00 - Elevator Speech: Pro Comunidad
Gabriela Ria l- K2B, Paulo Renato Amaral, Nataniel Strack, Marcos Crispino, Gustavo Carriquiry - Artech

15:45 - El poder de lo simple
Rodrigo Alvarez - Artech

16:15 - Ahora que lo pienso, nuestra mente se equivoca mucho
José Lamas - Artech

17:15 - La singularidad tecnológica y su futuro impacto en los negocios (partes 1 y 2)
José Elias - Eliax.com

Miércoles

9:30 - Charlando con Mastro
Jorge Mastropietro - Artech

10:30 - El Plan Ceibal y la amenaza zombie
Gonzalo Frasca - Powerful Robot Games

11:00 - K2B Mobile: la empresa en sus manos
Carla Demarchi , Fernando Curi - K2B

11:45 - Testing: el camino para que confíen en nuestro software
Federico Toledo - Abstracta

12:15 - Probando aplicaciones GeneXus con la ayuda de GXtest
Matías Reina - Abstracta , Gabriela Rial - K2B , Enrique Almeida - Concepto , Eliene Baliosian - Cybernet

Y en la tarde del miércoles voy a las keynotes...

Lo que queda afuera

Hay otras charlas que también me parecieron interesantes, pero como son varias al mismo tiempo, no voy a poder ir... Habrá que ver el video después...

En general en los encuentros GeneXus me pasa que hay muchas charlas que quiero ver. Lo que no se si en alguno hubieron tantas charlas que me parezcan interesantes, como hay este año.

Todo lo que quería saber de HTML5 y no se animaba a preguntar
Wilson Pais - Microsoft

Los caminos hacia la X
Pablo Mazzilli - Artech

Programación Declarativa vs Programación Procedural. ¡Es momento de la transición!
Juan Marcelo Bustamante - PuntoExe Consultores

Tengo una pregunta para usted: Entrevista a Breogán Gonda
Breogán Gonda, Gustavo Carriquiry , Gisela Bertelli- Artech

Desarrollando en equipo con GXserver (partes 1 y 2)
José Lamas - Artech / Marcela Corbo - GXC / Alexandre Luchini - Heurys

Multitenant Applications con GeneXus
Federico Azzato - Artech

HTML 5 y GeneXus
Nicolás Cardelino - Artech

Evolucionando los reportes
Ignacio Roqueta - Artech

Consultas dinámicas en tiempo de desarrollo, implantación y producción
Gustavo Martínez , Pablo Musso - Artech

Aplicando Metodología a la Innovación
Pablo Brenner

lunes, 6 de septiembre de 2010

5 cosas que me gustan de la Mac

Después de un tiempo de usar la Mac como computadora principal, hay varias cosas que me he encontrado me gustan más que en Windows.

Acá va una lista de las 5 principales.

5. Quicksilver

Técnicamente no es propiamente de la Mac, pero es el único sistema operativo donde funciona.

Quicksilver es una aplicación para Mac OS X, que permite realizar acciones, mediante el teclado, digamos que con poco esfuerzo.

Por ejemplo, una de las cosas que permite es iniciar aplicaciones de forma muy fácil. Para esto, presionamos Ctrl+Space para abrir Quicksilver y luego empezamos a escribir el nombre de la aplicación, y con las primeras letras ya aparece la aplicación seleccionada.

Otra cosa que se puede hacer es buscar archivos, también de forma muy fácil.

Tiene muchas más cosas, sin duda yo no lo estoy usando ni cerca en todo su potencial.


4. Vista rápida de archivos

Hace unos días escribí sobre esto, estando en el Finder, seleccionando un archivo y presionando Espacio, muestra el contenido del mismo. Esto funciona casi para cualquier tipo de archivo: texto, imágenes, PDF, documentos de Word, Excel y Powerpoint, etc.


3. Hardware

Tengo una Mac Mini, y sin duda el hardware es espectacular.

Primero que nada el ruido que hace: cero ruido. Nunca vi un PC que no haga ruido, ni siquiera un notebook, pero con la Mac Mini lo lograron. Ahora cuando prendo el PC (Windows), se escucha como que va a despegar un avión.

Lo otro es el tamaño. Una máquina que tiene más o menos lo mismo que un PC "común", cabe en mucho menos espacio. Las dimensiones de la Mac son: 16,5cm de ancho x 16,5cm de profundidad por 5,1cm de alto. Un PC puede ocupar unas 50 veces más espacio que la Mac Mini...

2. Terminal.app

La aplicación Terminal (consola de comandos) es una consola UNIX, con todas las ventajas que eso tiene sobre DOS, que era lo que estaba acostumbrado en Windows.

Para alguien que usa bastante la línea de comandos, sin duda es una ventaja.
1. Instalación de aplicaciones

La instalación de la mayoría de las aplicaciones es bien simple. Alcanza con copiar la aplicación al directorio de aplicaciones del sistema (/Applications) o a cualquier otro lugar para poder usarla. En estos casos no se precisa correr un instalador, ni copiar bibliotecas de funciones a ningún directorio del sistema operativo, ni modificar el registro (ni idea si existe en Mac OS), ni nada.

Por supuesto también hay aplicaciones que requieren hacer cambios en el sistema, pero son las menos.

Hace un tiempo, Miguel de Icaza proponía un modelo similar para Windows...
Conclusión

La Mac tiene sin duda muchas cosas interesantes. Los que son usuarios (calculo que pocos en este blog...), ¿cuáles son las cosas que más les gustan?

miércoles, 1 de septiembre de 2010

GeneXus en StackExchange

StackExchange es un sitio que permite crear comunidades para preguntas y respuestas. Está basado en el popular sitio para desarrolladores, StackOverflow.

Tiene varias ventajas sobre un foro común, lo cual explica muy bien Joel Spolsky...

Hace un tiempo Enrique había pedido tener algo de esto para discutir sobre GeneXus, y lo volvió a sugerir en Twitter.

Así que bueno, acá está hecho el pedido para tener un sitio dedicado a GeneXus en StackExchange.

Lo que hay que hacer ahora es:
  1. Registrarse en el sitio de Area 51 (es donde se proponen nuevos sitios)
  2. Ir a http://area51.stackexchange.com/proposals/19860/genexus y hacer un "follow" (se precisa 60 personas en esta primer etapa)
  3. Proponer alguna pregunta de ejemplo, que puede ser on-topic u off-topic (se precisan 5 de cada una)
  4. Marcar las preguntas que ya están como on-topic u off-topic.
Así que, a participar, a ver si podemos crear el sitio :)

Evento de Apple 1/9/2010

En el día de hoy, Apple llevó a cabo uno de sus tradicionales eventos, donde realizan anuncios de productos. Por primera vez (hasta donde yo se), el evento se transmitió en vivo.

Hubieron varios anuncios, algunos esperados, otros capaz que no tanto, y hubieron algunas cosas que faltaron.

Por una buena cobertura de los que fue el evento, pueden ver acá. Mi intensión es hacer algunos comentarios, no hacer una cobertura completa.

La calidad del video en general fue muy buena, salvo que en un par de momentos el video se reseteo y volvió al principio. Se arreglaba con hacer un refresh de la página...

iOS 4.1 y 4.2


El sistema operativo de los dispositivos móviles de Apple tendrá una nueva versión en los próximos días para el iPhone y iPod Touch, y en noviembre con la versión 4.2 para iPad.

En el caso de iOS 4.1, creo que lo más interesante que tiene es con respecto a la fotografía. Usan una técnica para mejorar las fotos, que llaman HDR, que consiste en sacar tres fotos con distinto nivel de exposición y juntarlas en una. De esa forma logran capturar detalles de las zonas muy iluminadas o muy oscuras, que con una sola exposición no son posibles.

Esta nueva versión trae también Game Center, que permite algunas cosas interesantes en el mundo de los juegos. Mostraron un nuevo juego de Epic Games que parece estar muy bueno.

Para el iPad, en Noviembre va a estar disponible la versión 4.2 de iOS, que trae multitarea y todas las demás cosas que traia iOS 4 al iPhone.

iPods

Toda la gama de iPods tiene cambios.

El iPod Shuffle vuelve a incorporar los botones que se habían quitado en la última generación.

El iPod Nano pasa a tener una pantalla multitouch, y es la mitad de lo que era la versión anterior en cuanto a tamaño y peso. Se ve realmente muy lindo. Sale U$S 149 la versión de 4GB, por si alguien tiene pensado hacerme un regalo :)

El iPod Touch incorpora una cámara de fotos que permite grabar video en HD, y también una cámara para video conferencias (FaceTime). Además pasa a tener una pantalla como la del iPhone 4 con Retina Display.

iTunes 10

En el evento se anunció el lanzamiento de iTunes 10 a partir de hoy, que como característica principal incorpora una red social en torno a la música, llamada Ping.

No creo que sea sorpresa que Apple entre en el mundo de las redes sociales. Es decir... ¿quien falta?

Ping está disponible solo en los países donde está disponible iTunes Store (23 en total). No se por que no está en Uruguay... sería bueno.

Además cambia el ícono de la aplicación, sacan el CD...

Apple TV

Debe hacer como dos meses que en los blogs de tecnología se habla de una probable actualización de Apple TV, que hoy se confirmó.

Por la demo que hicieron parece muy interesante, lamentablemente tampoco está disponible en Uruguay.

Cierre del evento

En el cierre del evento, estuvo el vocalista de Coldplay, Chris Martin, cantando en vivo algunas canciones, entre ellas Yellow y Viva la vida. Muy bueno.

Lo que faltó

Hay un par de productos de Apple que se suponía podían tener alguna actualización, que brillaron por su ausencia. Me refiero a las Mac, que se suponía podían incorporar iOS con pantallas multitouch, y al iPad, de quien se esperaba alguna otra versión con cosas como cámara y distintos tamaños de pantalla.

domingo, 29 de agosto de 2010

Uso básico de Git

Git es un sistema de control de versiones distribuido.

Un sistema de control de versiones, es un software que administra los cambios realizados en un conjunto de archivos, pudiendo ver el estado de cualquier elemento en cualquier momento dado, combinar cambios realizados por otros, ver las diferencias, etc.

Al ser distribuido, cada "clon" del repositorio tiene toda la información necesaria así como la historia completa, pudiendo realizar todas las operaciones sin necesidad de estar conectado al servidor centralizado (en caso que exista).

No es el único producto que hace esto, existen muchos más, como por ejemplo Mercurial o SubVersion (este último es centralizado).

Git se usa para el trabajo en equipo (generalmente para el desarrollo de software), ya que permite que cada uno de los integrantes del equipo tenga su propia versión, realiza sus propios cambios, y luego combina las modificaciones realizadas (merge).

Pero en realidad, Git también sirve para equipos de una sola persona. Por ejemplo a mi me da mucha más tranquilidad trabajar con un control de versiones que me permite volver a un estado anterior, que tener cualquier otra clase de respaldo. Cuando se que atrás tengo un control de versiones, me resulta mucho más fácil hacer modificaciones para hacer pruebas.

Veamos entonces un poco del uso de Git.

Hay dos formas de inicializar un repositorio. Una es creando un nuevo repositorio, lo que se hace (en el directorio donde queremos realizar el control de versiones) con
git init
La otra alternativa es clonar un repositorio que ya existe, para esto usamos
git clone [url_del_repositorio]
En la medida que se hacen cambios en los archivos o se agregan archivos nuevos, estos se deben ir agregando con
git add [nombre_archivo]
En cualquier momento podemos ver el estado del repositorio con
git status
Esto muestra varias cosas:
  • archivos modificados/agregados/borrados que todavía no se han incorporado al repositorio (falta un git add/rm
  • archivos modificados/agregados/borrados que ya se agregaron al repositorio
  • commits por delante o por detrás del repositorio centralizado
Una vez que tenemos los cambios y ya están agregados, se debe hacer un commit
git commit -m "descripción del commit"
Si queremos volver a la versión anterior de un archivo (y todavía no se hizo el commit)
git checkout -- [nombre_archivo]
Nótese que este commit no envía los cambios al repositorio centralizado (en caso que exista). Para eso, debemos hacer
git push [url_del_repositorio]
La cantidad de opciones disponibles en Git es mucho mayor que esta. En general está bien documentado y se puede encontrar toda la información necesaria buscando en internet.

Una de las cosas que facilita mucho Git, es hacer "branches". Esto es, creo una nueva versión en que es independiente del "trunk" (rama principal del desarrollo) en la cual realizo cambios, que en algún momento son combinados con el desarrollo principal o descartados. Les dejo de deberes la sintaxis :)

sábado, 28 de agosto de 2010

Animar la interfaz de usuario en iOS

Una de las cosas que tienen mucho las aplicaciones para el iPhone, son animaciones en la interfaz de usuario, por ejemplo en las transiciones entre pantallas.

Esta animación, la que se da al pasar de una pantalla a otra, es bien simple. Lo único que se precisa es pasar un parámetro a la función que muestra la siguiente vista. Algo así:
[navigationController pushViewController:newViewController animated:YES];
Pero además, también es muy sencillo crear animaciones más complejas, de forma totalmente trivial. Alcanza con encerrar el código que modifica la interfaz de usuario en un bloque de animación.
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];

//código del cambio que queremos hacer en la UI

[UIView commitAnimations];
La duración de la animación está expresada en segundos.

Por ejemplo, supongamos que tenemos una toolbar en la parte inferior de la pantalla, y queremos que desaparezca deslizándose hacia abajo cuando presionamos un botón. El código es el siguiente:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];

CGRect frame = toolbar.frame;
frame.origin.y += frame.size.height + 1;
toolbar.frame = frame;

[UIView commitAnimations];
Si además quiero que vaya desapareciendo (haciéndose transparente) a medida que se va deslizando hacia abajo, alcanza con agregar:
toolbar.alpha = 0;
antes de hacer el commit de la animación.

Otro ejemplo. Tengo un UIView (clase base para los componentes que tienen interfaz gráfica) que quiero reemplazar por otro girando la interfaz 180º. ¿Qué tan complicado es?

Este es el código:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.7f];
[UIView setAnimationBeginsFromCurrentState:NO];
[UIView
  setAnimationTransition:UIViewAnimationTransitionFlipFromRight
  forView:viewThatRotates
  cache:YES];

[oldView removeFromSuperview];

UIView * newView;
// agregar código para inicializar newView...

[self.view newView];

[UIView commitAnimations];

viernes, 13 de agosto de 2010

Vista rápida de archivos en Mac OS X

Acabo de encontrar de forma accidental una funcionalidad en Mac OS X (10.5 y superior) que es espectacular.

Apretando "espacio" cuando se tiene seleccionado un archivo, muestra una vista rápida del mismo ("quick look" en inglés).

Hasta ahí no tiene nada de extraño. Lo que lo hace espectacular es que ¡se pueden abrir archivos para los cuales no tengo un programa instalado!

Por ejemplo puede abrir archivos de MS Office que normalmente abro con Google Docs. Pero también abre imágenes, videos, código fuente (con syntax coloring), PDFs, y cualquier otra cosa que haya encontrado en mi disco...

Si se quiere recorrer todos los archivos de una carpeta, se puede hacer con tab o shift-tab una vez que se abrió la vista rápida.

Acá pueden encontrar más información sobre accesos de teclado en Mac OS X.

miércoles, 28 de julio de 2010

Agenda de contactos

Hoy en día lo más común es tener nuestras agendas de contactos (con números de teléfono, direcciones, direcciones de e-mail, etc.)  en formato electrónico, ya sea en el teléfono celular, en la computadora, en la nube (como por ejemplo los contactos de Google), etc.

Hay algo que me llama la atención, y es que ninguna de las aplicaciones que conozco para almacenar información de contactos está normalizada.

Por ejemplo, uno de mis contactos es una empresa. De la empresa tengo cierta información, como ser la dirección y el teléfono. Por otro lado, tengo un segundo contacto que trabaja en dicha empresa (información que le dí a la aplicación). ¿Por qué entonces me pide que ingrese el número de teléfono del trabajo? ¡Ese dato ya está en la agenda!

Hasta ahí parece trivial... ¿Por qué nadie lo ha implementado? O capaz que la aplicación existe y no la conozco.

Hay algún detalle más, por ejemplo, de una empresa tengo el teléfono, pero de una persona quisiera también conocer la extensión que tiene. De todas formas, el número de teléfono debería ser una referencia al teléfono de la empresa.

Otra cosa que puede pasar es que la empresa tenga dos direcciones, porque tiene dos oficinas distintas. Dada una persona que trabaja en dicha empresa, va a trabajar en una sola de esas oficinas. Pero tampoco sería complicado hacer que la referencia sea a una de las direcciones en lugar de ser a la entidad "empresa".

Cuanto más lo pienso más natural me parece la implementación... No me queda claro por qué nadie lo ha hecho así.

lunes, 26 de julio de 2010

Se terminan las direcciones IP(v4)?

Leo en ReadWriteWeb, que aparentemente en menos de un año se terminan las direcciones IPv4...

Hay una página en Twitter que lleva la cuenta regresiva. En este momento dice que en 340 días se terminan las direcciones IP.

¿Qué significa que se terminan? Significa que cuando alguien quiera publicar un nuevo sitio web, no va a poder.

Por suerte desde hace años existe el protocolo IPv6, que en lugar de usar direcciones de 32 bits usa direcciones de 128 bits, con lo cual se resuelve el problema por un buen tiempo (hay que multiplicar la cantidad de direcciones actuals por 7,9x1028 = 79,000,000,000,000,000,000,000,000,000 para obtener la cantidad que se pueden usar con el nuevo protocolo).

El único problema es que la adopción de IPv6 ha sido un tanto lenta... Capaz que a partir de ahora se empieza a acelerar.

El otro tema es la compatibilidad. El protocolo IPv6 es compatible hacia atrás, y por lo tanto puede acceder a direcciones IPv4. Pero el recíproco no es cierto... Si yo tengo una dirección IPv4, no puedo acceder a la red IPv6.

No es para que entren en pánico... pero ¿alguien sabe si ANTEL está trabajando en este tema?

Cambiando de tema... ¿Alguien ha notado que no existe un logo para Internet? Estaba buscando una foto para poner en la nota (buscando en Google aparecen muchos logos de Internet Explorer), pero no existe... ¿Alguien se anima a crearlo, y hacemos fuerza para que se adopte como estándar? :)

miércoles, 21 de julio de 2010

Cambio en la numeración telefónica en Uruguay

El próximo 29 de agosto, en Uruguay cambia la numeración de los teléfonos fijos, pasando a tener todos 8 dígitos.

Las reglas para el cambio de numeración no son muy complicadas:
  • Los números 0800, 0900, y los números cortos, no cambian.
  • Los demás, se les agrega la característica adelante, y pueden pasar dos cosas:
    • el número queda de 8 dígitos => ese es el número (es el caso de Montevideo y Maldonado)
    • el número queda de 7 dígitos => se le agrega un 4 adelante (para el resto del país).
Hay más información en el sitio de ANTEL.

Para los impacientes (como yo), que tienen todos los números en la agenda del celular, acá les dejo un tip. Si hoy el número es X XXX XXX, desde un celular se puede discar +598 2X XXX XXX, y funciona. Es de suponer que a partir del 29 de agosto también va a funcionar, porque ese es el número internacional...

Lo que no dice nada que vayan a cambiar los números de los celulares, que hoy son de 9 dígitos aunque el primero siempre es un cero (y como todos sabemos los ceros a la izquierda no cuentan...). De todas formas el tip también sirve: si el número es un celular, y por lo tanto es de la forma 09X XXX XXX, se puede discar +598 9X XXX XXX, y funciona ahora y seguramente funcione en el futuro.

Ahora, una reflexión un poco más profunda... ¿Qué sentido tiene tener "números" de teléfono? Es decir, el número en sí tiene muy poca información (la localidad o la zona, o si es móvil, pero nada más).

En pleno siglo XXI, pienso que podría hacerse mejor. Un número de 8 dígitos no significa nada... Claramente el motivo de que sean todos dígitos, tiene sus raíces en los comienzos de la telefonía, hace al rededor de 150 años.

Si yo tuviera que inventar una "numeración" telefónica hoy en día, la haría más parecida a una dirección de e-mail... Digamos, algo así como nombre@antel.tel.uy. Tiene bastante más información que un número de 8 dígitos, ¿no? Por supuesto, también tiene sus desventajas... ¿Qué pasa cuando hay dos personas con el mismo nombre? Tampoco es demasiado práctico si hay que "discarlo" en vez de buscarlo en la agenda.

En todo caso no es mi intensión dar una solución, sino plantear el problema... Seguramente si se le dedica más de 30 segundos a pensarlo se encuentre una solución mejor que los 8 dígitos.

sábado, 17 de julio de 2010

Matemática... ¿Estás ahí?

Hace unos días terminé de leer el libro Matemática... ¿Estás ahí? de Adrián Paenza.

Realmente está muy bueno, vale la pena leerlo. Se puede bajar (legalmente, para uso personal) del sitio de la Universidad de Bs. As., junto con el resto de los libros de la serie (cinco en total, pero por ahora solo leí el primero).

Me tomo la libertad de reproducir acá un fragmento, donde demuestra por el absurdo que todos los números naturales son "interesantes".
Números interesantes
Voy a probar ahora que todos los números naturales son números “interesantes”. Claro, la primera pregunta que surge es: ¿qué quiere decir que un número sea interesante? Vamos a decir que un número lo es cuando tiene algún atractivo, algo que lo distinga, algo que merezca destacarlo de los otros, que tenga algún borde o alguna particularidad. Creo que todos entendemos ahora lo que quiero decir con interesante. Ahora, la demostración.
El número uno es interesante porque es el primero de todos. Lo distingue entonces el hecho de ser el más chico de todos los números naturales.
El número dos es interesante por varias razones: es el primer número par, es el primer número primo. Creo que con estos dos argumentos ya podemos distinguirlo.
El número tres también es interesante, porque es el primer número impar que es primo (por elegir una razón de las muchas que habría).
El número cuatro es interesante porque es una potencia de dos.
El número cinco es interesante porque es un número primo. Y de aquí en adelante deberíamos ponernos de acuerdo en que cuando un número es primo, ya tiene una característica fuerte que lo distingue y lo podríamos considerar interesante sin buscar otros argumentos.
Sigamos un poco más.
El número seis es interesante porque es el primer número compuesto (o sea, no es un número primo) que no sea una potencia de dos. Recuerde que el primer número compuesto que apareció es el cuatro, pero es una potencia de dos.
El número siete es interesante, y no hace falta argumentar más porque es primo.
Y así podríamos seguir. Lo que quiero probar con ustedes es que:
“Dado un número entero positivo cualquiera siempre... siempre... hay algo que lo transforma en ‘interesante’ o ‘atractivo’ o ‘distinguible’”.
¿Cómo hacer para probar esto con todos los números, si son infinitos? Supongamos que no fuera así. Entonces, eso quiere decir que hay números que llamaremos no interesantes. A esos números los ponemos en una bolsa (y supondremos que esta bolsa no está vacía). Es decir, tenemos una bolsa llena de números no interesantes. Vamos a ver que esto nos lleva a una contradicción. Esa bolsa —como todos los números que contiene son números naturales, o sea, enteros positivos— tiene que tener un primer elemento. Es decir, un número que sea el menor de todos los que están en la bolsa.
Pero entonces, el supuesto primer número no interesante se transforma en interesante. El hecho que lo distingue es que sería el primero de todos los números no interesantes, una razón más que suficiente para declararlo interesante. ¿No les parece? El error, entonces, provino de haber pensado que había números no interesantes. No es así. Esa bolsa (la de los números no interesantes) no puede contener elementos, porque si los tiene, alguno tiene que ser el primero, con lo que pasaría a ser interesante un número que por estar en la bolsa debería ser no interesante.
MORALEJA: “Todo número natural ES interesante”.
Simplemente genial :)

miércoles, 14 de julio de 2010

Propiedades en Objective-C y el manejo de memoria

Hace unos días comentaba sobre el manejo de memoria en Objective-C.

Hoy quería hablar en particular sobre las propiedades.

Cuando un declara un propiedad en una clase,  con la directiva @property, el setter de dicha propiedad puede tener una de las siguiente semánticas:

  • assign: se usa una asignación simple, es el valor por defecto
  • retain: se le envía un mensaje de "retain" al valor que se va a asignar a la propiedad
  • copy: se le envía un mensaje de "copy" (se crea una copia) al valor que se va a asignar.
Cuando se va a implementar el método setter (si no se usa la directiva @synthesize para que lo cree por defecto) se debe tener en cuenta la semántica que se le quiere dar a dicha propiedad.

Assign

Supongamos que tenemos una propiedad definida como 
@property (nonatomic, assign) NSObject *myProperty;
El método setter de dicha propiedad deberá ser de la siguiente forma:
- (void) setMyProperty:(NSObject *)valor {
    myProperty = valor;
    // custom implementation
}
Retain

Si en cambio la propiedad está definida como
@property (nonatomic, retain) NSObject *myProperty;
Entonces el método setter deberá ser:
- (void) setMyProperty:(NSObject *)valor {
    if (myProperty)
        [myProperty release];
    myProperty = [valor retain];
    // custom implementation
}
Copy

Por último, si la propiedad se declara como
@property (nonatomic, copy) NSObject *myProperty;
El método setter deberá ser:
- (void) setMyProperty:(NSObject *)valor {
    if (myProperty)
        [myProperty release];
    myProperty = [valor copy];
    // custom implementation
}
Método dealloc

En el caso que se haya declarado la propiedad como retain o como copy, en el método dealloc se debe liberar la memoria con
[myProperty release];
Esto no se debe hacer en el caso que la propiedad sea de tipo assign