miércoles, 7 de abril de 2010

Where is Uruguay?

Fuí al correo porque tenía que enviar una carta a Uruguay.

Para cobrarme y poner los sellos debían saber donde estaba enviando la carta, en el sobre decía y obviamente yo les dije también: el país a enviar la carta es Uruguay.

Luego de pasar de una computadora a otra, parece que en el sistema de la primera no aparecía Uruguay, se dieron cuenta que el sistema es el mismo, independiente de la computadora y se percataron que ese país llamado Uruguay no aparecía en el sistema o al menos escrito de la forma "Uruguay".

En la oficina trabajaban unas 4 o 5 personas y ninguna sabía de la existencia de tan raro país, luego de preguntas tales como: Rusia? (está cercano a Rusia), Europe? (es un país de Europa?), había que recurrir a la clásica y ya trillada explicación:

1. South America
2. Movimiento de manos, explicando donde esta Asia, Europa, Amercia del Norte (USA) y América del Sur
3. Brazil
4. Argentina
5. Otra vez movimiento de manos, ubicando donde estaba Brasil y Argentina, para luego pasar si a...
6. Uruguay

Obviamente la amabilidad nunca la dejaron de lado y las disculpas por no saber donde estaba no tardaron en llegar. De todos modos me pregunto:

- es tan raro el país donde vivimos?
- Geografía, se enseña en los colegios?
- globos terráqueos existen por Asia?

Por otro lado también es cierto que si Japón y los japoneses son un punto muy pequeño en el mundo, explicado de forma muy clara acá, quizás es razonable pensar que no existamos, no?

Sigamos jugando, ahora Twitter

Hace un tiempo subí al GeneXus Server una KB que usaba una librería de las tantas que existen para interactuar con la API de Twitter, más específicamente la Yedda Twitter C# Library. La idea era jugar un poco con twitter desde GeneXus.

Para usar la librería utilizo un External Object, que encapsula toda la funcionalidad de la dll. En aquel momento solo probé traer mi lista de followers y mostrarla en un webpanel, algo que quedaba así de simple:

&userString = &twitter.GetFollowersAsJSON(&user,&password)

siendo &twitter mi external object y &userString el json con toda la lista de followers, y luego levantaba la info para poder utilizarla mediante un SDT haciendo:

&Users.FromJson(&userString), siendo &Users un sdt con toda la info que necesito asociada a los followers.

Pero ahora quería poder twittear. Cuando fui a utilizar dicho método, UpdateAsJSON, me encuentro con que al ejecutar se presenta un error (en la librería) que me lo impedía, quizás a causa de no estar actualizada la dll.

A diferencia de lo que buscaba cuando estaba jugando con facebook, ahora no quería utilizar una librería javascript y desarrollar un UC para resolver la integración, dado que no necesitaba nada de interfaz simplemente quería twittear, algo tan simple como pasar mi user y pass y actualizar mi status en twitter.

Así que opte por usar otra librería, ahora java, JTwitter. Como casi todas las librerías, esta tenía muchas mas funcionalidades de las que quería, y además tuve un error al importarla directamente en GeneXus, por lo cual opte por hacer un wrapper, solo disponibilizar aquello que necesitaba y crear un external object en base a ese wrapper:

getStatus(): devuelve el status del usuario
setStatus(text): twittea el texto text
getStatusesCount(): devuelve la cantidad de tweets del usuario
getProfileImageUrl(): devuelve la url de la picture del profile del usuario

Con esos cuatro métodos tengo todo lo que necesito para twittear y mostrar la info del usuario en mi webpanel:



Si quieren pueden bajarse la KB: Twitter desde Genexus Server, y seguir jugando.

Luego que tengan armado el ambiente deben copiar jtwitter.jar y twitter.jar (ambos archivos están en la KB) al directorio lib de su webapp, y ambos deben estar en su classpath. En los Files de la KB también esta el proyecto de NetBeans con el que hice el wrapper, twitter.zip, por si quieren seguir haciendo cosas.

domingo, 4 de abril de 2010

Jugando con Facebook

El dilema era: crear otro blog para escribir cosas mas técnicas y menos diarias o seguir usando este...como se puede ver abajo el dilema fue resuelto.

Desde hace un tiempo tenía ganas de poder integrar Facebook con GeneXus, de hecho en la charla que dimos con Javier Larrosa en la  XVIII GeneXus Meeting del 2008 algo habíamos mostrado. En esa oportunidad lo hicimos a través de los External Objects de GeneXus, utilizamos una librería desarrollada por Microsoft para interactuar con Facebook. La idea no estaba mal y de hecho pudimos comunicarnos muy fácilmente a través de dicha librería.

El problema con esto es que estábamos usando un producto de un tercero pudiéndolo hacerlo directamente a través de la API de Facebook. Esto tenía como inconveniente que siempre que ese tercero cambie nosotros debemos cambiar nuestro External Object para actualizar la lista de métodos/propiedades.

Eso fue justamente lo que nos paso luego del evento, Microsoft cambió varias interfaces de dicha librería debido a cambios en la propia API de Facebook, y lo que nosotros teníamos funcionando y que de hecho mostramos en la demo de la charla dejó de funcionar.

Lo interesante de utilizar un External Object era que teníamos la API de Facebook encapsulada en dicho objeto y era muy fácil su utilización.

Podíamos seguir en la línea de utilizar una librería de un tercero o podíamos nosotros mismos interactuar con la API de Facebook sin necesidad de un tercero, y esa es justamente la línea que elegimos, desarrollar una serie de User Controls que resuelvan la comunicación con Facebook desde nuestros objetos.

En cualquier caso, ya sea utilizando una librería de un tercero o accediendo a la API directamente, tenemos que crear una aplicación en Facebook, para lo cual primero que nada debemos agregar a nuestro perfil de Facebook la application: Developer. Y luego crear una nueva Application, esto nos permitirá obtener una ApiKey con la cual podremos acceder a la API. Acá pueden saber un poco mas al respecto.

La idea de los User Controls es utilizar la JavaScript Client Library, para acceder a la API a través de código javascript. No queremos hostear una app en Facebook, por lo cual cuando creemos nuestra app en Developer solo nos interesará:

Basic -  API Key, Key necesaria para poder interactuar con la API


Connect - Connect URL, url donde Facebook enviará una session válida para comunicarnos con ellos

Como pueden ver, también configuré un valor para Base Domain, en este caso localhost. Esto se debe a que tendremos una comunicación entre nuestra app y Facebook a través de js, por lo cual habrá una Cross Domain Communication, por lo cual debemos crear un Channel entre nuestra app y Facebook, para lo cual necesitamos crear un archivo xd_receiver.htm y almacenarlo en nuestro server. Pueden obtener mas detalles aquí, pero a los efectos de la utilización de los User Controles en GeneXus solo tenemos que tener en cuenta dos cosas:

1. cuando creamos la app en Facebook indicar un Base Domain, con lo cual indicamos el nombre del dominio en el cual estará el archivo xd_receiver.htm
2. cuando utilicemos el User Control: FacebookConnect, el cual nos permitirá conectarnos con Facebook, debemos indicar la ruta a dicho archivo a través de la property xdChannelUrl, cuyo valor por defecto es "/xd_receiver.htm".


Por lo cual si en el UC indicamos como xdChannelUrl el valor "/xd_receiver.htm",  entonces en el caso de .Net debemos almacenar el archivo en: C:\Inetpub\wwwroot, y en el caso de Java utilizando tomcat como webserver en: C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\ROOT.

Los tres User Controls que tenemos al día de hoy son:

FacebookConnect: necesario para establecer la conexión entre nuestra app y Facebook.

Text: text del botón que se agregara a nuestro form y que nos permitirá establecer la comunicación con Facebook, valor por defecto: "Connect with Facebook".

ApiKey: como mencionamos antes es la Key asociada a la app que creamos en Facebook.

xdChannelUrl: url o ruta al archivo xd_receiver.htm que nos permitirá establecer una cross domain communication entre nuestra app y Facebook, valor por defecto: "/xd_receiver.htm"

Size: tamaño del boton, valores posibles: small, medium, large, or xlarge, valor por defecto: "medium".

FacebookLoggedUser: muestra la foto de perfil y el nombre del usuario logeado a Facebook.

Width: width de la foto, valor por defecto: 50

Height: height de la foto, valor por defecto: 50

FacebookLogo: true/false, indica si se quiere mostrar el logo de Facebook o no en la foto, valor por defecto: true.

Linked: true/false, indica si se quiere tener un link al perfil de Facebook en la foto de perfil, valor por defecto: true.

FacebookShare: permite compartir un link en el muro del usuario logeado

Link: link a compartir una vez que el user hace click en el boton asociado

Type: tipo de boton, valores posibles: box_count, button_count, button, icon, or icon_link, valor por defecto: button_count

Pueden obtener los controles en la gallery de GeneXus.

Si se fijan el código de estos User Controls es muy simple, por lo cual pueden chequear la docum de la JavaScript Client Library de Facebook y desarrollar el propio en base a sus necesidades.

update


Dado algunos cambios que sufrió la api de Facebook he realizado algunos cambios. Paso a hacer deprecated la JavaScript Client Library y con ello varios métodos y formas de realizar determinadas acciones.

Eliminé los user controls FacebookLoggedUser y FacebookShare dado que el Facebook Markup Language (FBML), lenguage utilizado en dichos controles, paso a ser deprecated (o en vías de serlo). De todos modos quedó todo armado hacer lo que hacían estos controles

Realicé cambios en la implementación del FacebookConnect los cuales son transparentes para quien utiliza el control, pero que eran necesarios para que funcione la autorización y autenticidad con Facebook.

Agregué un nuevo user control, FacebookFriends, que me pareció interesante pensando en el desarrollo de una aplicación que lo utilizara para explotar los datos obtenidos. Como su nombre lo indica el FacebookFriends obtiene la lista de los amigos del usuario logeado, deja cargada una colección con dichos datos.

Para que funcione el FacebookFriends es necesario tener un FacebookConnect de modo de resolver la autorizcion y autenticacion, una vez que el usario se logea a Facebook y permite acceso para que nuestra app
acceda a la lista de sus amigos obtendremos la collection de amigos a través de un sdt.

Cuando se arrastra el user control FacebookFriends se importa el xpz con el sdt que utilizara el uc para cargar la lista de amigos, la información de los amigos que se esta cargando hoy en día (podría agregarse mas data) son: id y nombre.

Para cargar la foto de todos mis amigos en un free style grid podría hacer algo como esto:


Event FacebookFriends1.AfterFriendsLoaded
for &friend in &friends
&imagesDataItem = new()
&imagesDataItem.Id = &friend.id
&imagesDataItem.Thumbnail = "http://graph.facebook.com/" + &friend.id + "/picture"
&imagesDataItem.Image = "http://graph.facebook.com/"+ &friend.id + "/picture?type=large"
&imagesDataItem.Caption = &friend.name
&imagesData.Add(&imagesDataItem)
endfor
&tic = Servernow()
 
EndEvent

en el evento AfterFriendsLoaded del user control FacebookFriends  cargo un sdt con la información de los amigos (id, name y foto).

Event grid1.Load
for &imagesDataItem in &imagesData
image1.FromURL(&imagesDataItem.Image)
grid1.Load()
endfor
EndEvent


y luego en el evento load de la grid cargo las fotos.


Notar que estoy usando otra sdt para cargar los datos de cada amigo cuando en realidad el UC podría ya devolver dicha información, esto es solo a los efectos de mostrar que dado el id de un user en Facebook puedo obtener información de dicho user consultando la Graph API.


Toda la documentación necesaria para interactuar con Facebook vía js esta en la JavaScript SDK.

Estos dos controles los pueden encontrar en el Marketplace de GeneXus.

jueves, 11 de febrero de 2010

Volviendo o yendo?

Hoy estoy regresando a Japón (esta vez con visa por lo cual espero pueda entrar :-))...para lo cual los amigos organizaron un asado "obrero" para hacerme entrega de la celeste y despedirme, unos grandes! Gracias: Maxi, Pali, Sollita, Javi, Dario, Schubert, Negro, Carlitos, Chato, Chango, Templi, Richard, Pirri, Pocho, Seba, Diego, Zanella, Mario, Barreto!!

Para completar los amigos de La Cachila, me hacen entrega de la taza con la foto del último campeonato ganado el año pasado!! Nooooo así es difícil irse!! Gracias: Pablo, Topo, Alex, Barreto, Willy, Carlin, Sollita, Colo, Victor, Manolo, Sergio y al resto de la gloriosa negra y roja!!

Gracias locos!!
Nos vemos pronto!!!

sábado, 5 de diciembre de 2009

Volviendo

Otra vez como hace un año estoy volviendo, From Tokyo to Punta Espinillo, el balance fue muy bueno, espectacular experiencia laboral, muchos amigos, nuevos lugares, y algo, muy poco de japones aprendido.

Algunas cosas ya se comienzan a extrañar...muchas buenas y algunas otras no tan buenas....

El tren!! ver el reloj en tu reoloj y la hora de llegada del tren que allí esta parado y que coincidan!
La máquina de bebidas disponibles a toda hora y todo lugar.
El shushi.
El ramen.
El sochu.
El excelente, y el exagerado, trato al cliente.
El altísimo grado de exigencia con el trato al cliente.
El sumimasen, el arigato-gozaimasu y el ohaio-gozaimasu
Roppongi!
Shibuya!
El fútbol de los findes.
El olor a humo de cigarrillo insoportable en todo lugar cerrado!
La gente fumando en el cenizero y no caminando por la calle.
El cenizero portatil.
Las Onho.
Carlitos.
Imperio.
Pinche puto cabron.
El río en la ventana.
Los frikis.
La Miso soap.
El soba.
La músiquita de las 5.
Los terremotos.
Los tifones.
Reciclar.
Los yenes (o los muchos necearios).
El vivero de abajo, con todas las plantas en la calle a disposición de quien las quiera sin pagar.
El obrero que te indica donde tenes que pasar en cada obra vial.
El lavarropas del trecer piso a 200 yenes.
El convenience store (o la cerveza).
Los borrachos del tren.
A los tokiatas.

viernes, 6 de noviembre de 2009

Tercer tiempo en Shibuya

Como les conté en otro post, los fines de semana estoy jugando fútbol en un equipo de Tokyo de una liga amateur. Los partidos son sábados y a veces domingo también, estamos en el medio de tabla, y no tenemos un equipo muy fuerte pero tampoco somos un desastre. Pero lo mejor muchas veces está en el tercer tiempo, como por ejemplo el último fin de semana donde quisimos explicar a los tokiatas como se juega de cabecita con la pelota :-)

martes, 3 de noviembre de 2009

De Seoul a Tokyo

Mi estadía en Japón se tuvo que extender hasta diciembre, pero mi visa solo me permitía estar aquí hasta octubre así que la única alternativa para extender la visa por otros 90 días era salir de Japón y volver a entrar. Lo cual no es lo mejor y lo mas adecuado pero era la única alternativa.

Así fue que un viernes al mediodía salí para Seoul (en otro post debería escribir un poco sobre esa ciudad) y el domingo ya estaba volviendo para Tokyo. Hasta acá todo bien, el tema fue cuando llegó el momento de pasar por inmigración. Fue ahí, en ese preciso e incómodo momento que recordé que no llevaba conmigo nada que me ligara a la empresa japonesa en la que estoy trabajando ni tampoco nada que me ligara a la empresa uruguaya, es más, ni siquiera llevaba conmigo una bussines card.

Obviamente no me creyeron que era un ingeniero uruguayo que venía a japón a dar consultoría a un software uruguayo que una empresa japonesa vendía. Era como muy fuerte para un agente de inmigración del aeropuerto de tokyo encontrarse con esa sitación, le parecía una tomada de pelo. Así que me llevaron a la oficina de otro señor agente japones, en la que nos pasamos hablando las siguientes 4 horas. Lo mío se limitaba pura y exclusivamente a explicarle que hacía en japón, y lo de él a tratar de entender lo que este personaje extranjero que venía de Korea pero que vivía y trabajaba en Sudamerica, y mas precisamente en Uruguay, en este caso yo, pretendía explicar.

Por suerte llevaba conmigo el teléfono y dirección de donde trabajo en Tokyo, por lo cual puedieron corroborar toda la info que les había dado y no hubo ningún problema en volver a entrar a Japón y quedarme hasta 90 días más.

De no tener esa info conmigo el titulo del post sería De Seoul a Montevideo pasando por Tokyo :-)