martes, 22 de mayo de 2012

Embeber font en app iOS

Como embeber una font (true type font) en una app para iOS desarrollada con GeneXus?

La idea es embeber una font que no esta dentro del set standard de fuentes, en mi caso queria usar una llamada OSP-DIN.

1. Una que se obtiene el archivo .ttf (OSP-DIN.ttf) instalarlo en el MAC, doble click -> install font.

2. En GeneXus cambiar la propiedad font-familiy de la clase en cuestión, en mi caso la TabPage:


Notar que el nombre a colocar en font-family debe coincidir con el nombre de la font que instalé en el MAC donde voy a compilar la app, para saber el nombre de la fuente dar doble click sobre el archivo ttf.

3. Luego de dar F5 mi app luce así en el emulador:


O sea, hasta ahora no se esta teniendo en cuenta la font que coloque en la class.

4. Agregar el archivo .ttf al folder GXResources del proyecto Xcode


5. Agregar la entrada 'Fonts provided by application' donde el valor sea el nombre del archivo de la font


6. Listo, la font quedó embebida y la app luce así




miércoles, 20 de julio de 2011

Think outside the box

Hace unos años atrás Rodrigo en su charla sobre construcción de aplicaciones fuera de contexto me entusiasmo con la idea de desarrollar aplicaciones con GeneXus que fueran mas allá de las clásicos ERPs, CRMs, Portales, Sistemas contables, de logística, etc.

De un tiempo a esta parte he estado jugando con aplicaciones web y user controls entorno al desarrollo de aplicaciones fuera de contexto, y ahora con la GeneXus Evolution 2 y específicamente con el nuevo Smart Devices Generator se abre la posibilidad de incursionar en el desarrollo de este tipo de aplicaciones y de las otras  también para plataformas como Apple, Androiod y Blackberry.

A diferencia de Rodrigo que se metía en el mundo de los juegos basados en web, a mi me gusto la idea de jugar con la integración con redes sociales como twitter y facebook.

Acá les dejo MySDTwit,



una aplicación desarrollada con el nuevo Smart Devices Generator donde podemos hacer búsquedas sobre Twitter. Por ahora es muy básica pero la idea es seguir el desarrollo hasta que se convierta en un cliente de twiter by GeneXus, por el momento puede ser útil para ver conceptos como:

- traer cosas desde twitter
- toJson
- Work With for Smart Devices
- HTML & Image domain
- enviar mensajes

update:

- regular expressions
- data selectors

Pueden bajarse la KB desde aca












domingo, 13 de marzo de 2011

Japon: conflicto de emociones

Son las 12:34 de la noche en el aeropuerto de Osaka, unas horas antes un amigo en Alemania,
mis amigos de Artech en Uruguay y yo en Japon buscabamos un pasaje que me devolviera a Uruguay
luego de lo que todos sabemos sucedio y sigue sucediendo en Japon.
No pude tomar un vuelo que me llevara a Frankfurt porque hubo problemas con mi tarjeta de credito,
asi que debo pasar la noche por aca.

No se exactamente lo que quiero escribir, es una mezcla muy extrana de muchos sentimientos al mismo tiempo, que van desde: el alivio por haber pasado ileso todo lo que sucedio, el miedo por no saber lo que esta pasado y pasara, la felicidad de saber que tengo mucha gente que me quiere y se preocupa mucho por mi, la alegria y orgullo de trabajar donde trabajo y de tener companeros que se preocupan y hacen lo imposible por mi vuelta y mi bienestar, y la impotencia por no poder transmitir toda la tranquilidad necesaria a mi esposa, mi hermano, mis padres, mis sobrinos, y mi familia toda.

Soy un privilegiado en todo esto que esta pasando, a pesar que obviamente no haya sido bueno para nadie.
Luego del terremoto tuve la suerte de volver a mi casa y no tener que pasar la noche en la calle.

No estaba cerca de las ciudades afectadas por el tsunami ni tampoco cerca del problema en la planta de energia nuclear.

Tambien soy un privilegiado porque cuando tuve miedo me tome un tren y me fui a kilometros de distancia.
Y ahora estoy intentando volverme a Uruguay.

Ese privilegio en parte se debe a que soy un alien en esta tierra, soy un extranjero que vino a trabajar, no soy de aqui mi familia, mis amigos, mis companeros estan en Uruguay, es un realidad. y debo celebrarlo y festejarlo.

Pero existe otra realidad, desde hace 4 anos vengo a Japon. He estado trabajando fisicamente en japon practicamente 2 anos, y he estado otros 2 anos trabajando desde Uruguay incluso en el mismo horario que ellos. Muchos companeros de trabajo de la empresa donde trabajo han pasado a ser grandes amigos, conozco sus vidas, sus familias, he ido a sus casas, he salido con ellos, me han dado mucho carino, me han ayudado en practicamente todo. Entonces es dificil festejar y celebrar cuando yo estoy volviendo a mi pais a ver a mi familia y los estoy dejando solos en este momento.

Si no me he ido antes es porque he pensado mucho en todos ellos y en lo bien que me han tratado todo este tiempo, Owaki, Yonekura, Takeshi, Akiko, Yokoi, Ando, Egawa, Yoko, Kawanishi, Oseki, Minsung, y muchos mas.

A pesar de estar bien, y que pronto volvere a Uruguay, es un momento de mierda, donde se chocan varios sentimientos y emociones.

lunes, 14 de febrero de 2011

LRMenu: GeneXus User Control

Haba visto la idea en una aplicacion del amigo @agareppe y me pareció que estaría bueno tenerlo como un user control para que sea un poco mas facil su utilización. Así que luego de hacer algunos cambios deje publicado en el marketplace un control para que podamos agregar una lista de links a nuestra aplicacion de una forma para nada intrusiva:



Por ahora solo es posible modificar algunas propiedades:

Width & Height: ancho y largo
Location: top-right o top-left, la position del control es absoluta, es decir se dibujara arriba a la derecha o arriba a la izquierda de nuestra pantalla
Links: lista de links a incluir, es una collection de pares (url, description)
MenuTitle: titulo a colocar en el menu

Como verán el control es muy simple y tiene algunas propiedades básicas, para personalizar a nuestro gusto el menu: color, font, background, etc., se debe modificar el css correspondiente (LRMenu.css).

miércoles, 26 de enero de 2011

MyIsValid: GeneXus User Control

Hace un tiempo atrás hice un user control para darle un poco mas de potencia a las aplicaciones generadas. La idea del control es poder validar un valor y hacer determinadas acciones luego de validado, pero mi principal objetivo era el siguiente: validar un campo, por ejemplo validar algo tan simple como que el valor ingresado tenga una determinada cantidad de caracteres, y si dicha validación no satisfactoria mostrar un mensaje de error.

La idea para esto es tener un control que pueda asociarlo a la att/var que quiero validar y luego programar el evento myisvalid asociado, donde pueda escribir la validación que yo desee.

Por lo tanto podríamos tener algo como:

Event Start
   MyIsValidCtrl.AttachedControl =  &myvariable.InternalName
EndEvent

de esta forma asociamos la var/att que queremos validar con el user control. Si se quieren validar muchos campos se debe tener un myisvalid control por cada var/att a validar.

Luego programamos el evento myisvalid asociado a dicho control:

Event MyIsValidCtrl.MyIsValid
  if &myvariable.lenght() < 8
MyIsValidCtrl.PopUpUrl = Error.Link("your variable lenght must to be higher than 8")
MyIsValidCtrl.ShowPopUp = "true"
  else
MyIsValidCtrl.ShowPopUp = "false"
  endif
EndEvent

de esta forma estamos chequeando que la longuitud de la variable &myvariable sea mayor a 8, y en caso que sea menor a 8 vamos a mostrar un error (popup). Para mostrar dicho mensaje de error estamos seteando las propiedades ShowPopUp en true y la propiedad PopUpUrl con la url del webpanel que usaremos para mostrar el mensaje de error, en el ejemplo se llamara al webpanel Error en caso que la longuitud no sea la que esperamos.

Fácil no?

Pero lo mejor del control es que controla donde va a parar el foco luego de cerrar la popup de error, por lo tanto es ideal para los casos donde queremos validar un campo y en caso de error seguir parados en ese campo hasta que se corrija el valor ingresado.

Consideraciones:

- El user control fue pensado para que siempre que se ingrese un valor erróneo en el campo asociado al control el foco vuelva a ese campo luego de mostrar un mensaje de error.

Por tal motivo se utilizó el evento onblur de javascript para asociar al control y no el onchange. Esto ocasiona que el evento MyIsValid se dispare siempre que se pierda el foco del control independientemente de haber ingresado o no un valor en el campo.

- Para que funcione correctamente en Free Style Grids se debe tener el U1 de GXEv1 o superior.

Lo pueden bajar desde el marketplace.

Cualquier cosa me encuentran en mi mail o en @cimasan.

Enjoy!

lunes, 24 de enero de 2011

View Source Part: GeneXus Extension

Luego de resolver algunas referencias incorrectas y levantar algunos warnings quedo disponible una nueva versión de la extension View Source en el GeneXus Marketplace compatible con GXEV1 U3 o superior.

Para los que nunca la usaron, es una extension muy simple que nos permite colocar un nuevo tab en los objetos de forma de poder ver el código fuente generado (java, c#) para dicho objeto.

sábado, 22 de enero de 2011

Primeras impresiones

Otra vez en tierras niponas.

A pocas horas de haber llegado me cope para escribir las "primeras" impresiones.

Basta tomarse un avión e irse a miles de km de distancia para que me vengan las ganas de escribir las impresiones que ya no deberían asombrarme pero que felizmente o infelizmente lo siguen haciendo.

Lo primero y principal es volver a tener la posibilidad de comer comida japonesa, sin dudas una de las mejores cosas de estar tan lejos de Uruguay y estar en un país asiático; la diversidad, la calidad, lo balanceado y lo saludable hacen que sea un placer comer...afuera obvio. No solo japonesa, india (el curry con nan de lo mejor que he probado) , koreana (tan buena como la japonesa), thailandesa, vietnamita, etc.).

Bueno y para los que ya me conocen me sigue asombrando lo vivo que nos creemos los latinos:
  • Seguimos creyendo que cuanto menos laburemos y estudiemos mas vivos somos, esta gente de Asia labura mínimo 9 horas y no menos, y antes cuando estudiaban tenían solo 2 meses de vacaciones al ano mientras nosotros los vivos laburamos la menor cantidad de horas que podamos o el sindicato consiga, y cuando vamos a la escuela deseamos que vengan los 3 meses de vacaciones, el feriado, el finde largo, el paro de maestros, la enfermedad de la maestra y la asamblea técnico docente para no ir. Ahora me entero que dado que no les fue bien reduciendo la jornada de estudios de niños,  adolescentes y jóvenes (países como China, Singapur o Coreo del Sur los están pasando por arriba  a nivel de avances, calidad de vida, y todo lo de mas) volverán a tener clases los sábados y jornadas mas largas. Los muy vivos se creen que mejoraran con mas y mejor educación.
  • Cuanto mas ruido hace el caño de nuestra moto o el escape del auto mas interesantes somos como personas. 
  • Cruzar la calle antes que el semáforo lo permita nos hace terriblemente cool, y eso que supuestamente el nivel de vida nuestro es mas lento que el de los asiáticos, increíblemente los giles de los ponjas esperan a que la verde habilite y nunca pero nunca cruzan antes, que ingenuos! pudiéndose ahorrar tantos minutos al día, de ultima en que jode que se hagan mierda algunos cada tanto no?
  • Los muy giles se guardan el papel en el bolsillo y lo tiran cuando ven un tacho en lugar de tirarlo en la calle y junto a 25 millones de japoneses hacer de la ciudad el basurero mas grande que imaginemos. En esto nosotros si que somos los mas vivos, porque siendo 3 millones tiramos mas basura en la calle que 25 millones.  
  • Parece joda, pero aun no se enteraron de la viveza criolla, yo pensaba que hoy en día todo era mas globalizado y todo llegaba a todos lados, pero los muy estúpidos aun no se avivaron de los beneficios que pueden sacar con ese invento latino, te siguen devolviendo lo que dejaste olvidado o lo que se te cayo en la calle, y siguen siendo extremadamente honestos en todo. 
  • Cuando hacen pis tiran de la "cadena" que gasta menos agua, y cuando hacen lo segundo la "cadena" que tira mas agua, que estúpidos! pudiendo tirar siempre la cadena que tira mas agua y olvidarse de si se hizo lo primero o lo segundo y del agua que se tira.
  • El inodoro en invierno es calentito, el macho latino se sienta en el inodoro helado sea invierno o verano.
  • Miles de sanitarios quedaron sin trabajo porque inventaron un sistema para separar los sólidos de lo liquido en las cañerías por lo cual todo el mundo tira el papel en el inodoro y nunca se tapa, los líos con el sindicato de sanitarios que abran tenido! por no quedarse quietos y seguir como estaban poniendo un papelito que diga: "no arrojar el papel en el inodoro" y llamando al sanitario cuando se tapaba.
  • Siguen insistiendo con no tener guardas en los ómnibus!! lo que se pierden por se fríos y calculadores, perfectamente podrían contratar a un guarda para hablar con los pasajeros, tomarse un mate mientras les explica de forma totalmente amable que linea puedo tomarme para llegar al estadio.
  • Cuando ellos fueron nosotros fuimos, vinimos y volvimos a ir. Son humildes, y siempre miran que pueden aprender del otro para mejorar. Boludos! quieren seguir mejorando en vez de hacer la plancha.
  • De las peores cosas que vi, si hacen mal las cosas los rajan! nunca pensé fueran tan papanatas.
  • Miran mal al que llega tarde a una reunión!! no podes! pudiendo llegar una hora tarde, y hacer perder tiempo a quien llego en hora, mira que son!
  • Dicen gracias! piden permiso! y se disculpan! saladoooooo pensar que es tan fácil ser un mal educado y cagarse en el de al lado. 
  • Los muy bobos tratan de buscarte una mesa y atenderte con amabilidad cuando vas a comer afuera, pudiendo dejar al cliente que busque su mesa, y espere una horita mientras alguien viene a preguntarle que desea. 


Please let me know If you are japanese and you are reading this using a automatic translator (like google translator), may you won't understand it.



miércoles, 29 de diciembre de 2010

Esto no da para mas

Estoy re podrido, al punto de estar pensando en ser un moroso, de no pagar más una sola cuenta, que en algún momento de mi vida pagaré convenio tras convenio.

Desde hace unos años pasé a ser profesional y cada año que pasa no paró de pagar una nueva cuenta, un nuevo impuesto o un recargo por un impuesto que debí pagar por tener un titulo intermedio hace 5 años por el cual nadie en ningún momento dio aviso, onda: "mirá que debiste pagar el año pasado del impuesto tal y tal, tenes tiempo hasta tal fecha para hacerlo sino luego tendrás multas y recargos".

De todos modos no es algo de los profesionales, lo vive cualquiera que labura. Obviamente los que no laburan, viven del aire o de la gracia divina de vaya a saber quien, no tiene estos problemas. Quizás deberían hacerse descuentos a esas gracias divinas por cada hora menos laburada.

Cada año que pasa, algo nuevo para engrosar la lista.

No solo alcanza con eso, si vivís en Montevideo tenes varios extras que te hacen la vida cada día mas fácil, que te hacen sentir orgulloso de vivir y pagar cada impuesto con una sonrisa en la cara:

- tenes que pagar la patente del auto 2, 3, 4, o 5 veces mas cara que otro departamento de este bendito Uruguay. A que se debe esto? entiendo que hay mas calles y cosas que hacer que alguna de las ciudades del resto del país, pero se da el caso que un mismo auto pague en Colonia 2000 pesos y en montevideo 18.000! parece joda.

- si necesitas asistencia médica, y salvo que pagues extra, seguramente conseguirás para que un especialista te atienda en el mes próximo.

- cada vez que queres hacer un trámite en cualquier oficina que dependa del estado o del municipio tenes que pagar un extra para que el mismo sea realizado en forma eficiente, o sea, mas rápido que el trámite ineficiente o llamado popularmente "común".

- los empleados de todos estos establecimientos (no todos pero la mayoría) vive en un constante mal humor, con el deseo de volver a su casa a tomar mate y mirar a tinelli lo mas rápido que pueda. Es un ejercicio sumamente divertido ver como estos seres apuran su ritmo cardíaco minutos antes de la hora de salida, apurando finalizar la tarea que están realizando, importando bastante poco si la están haciendo bien o mal.

- cada un determinado período de tiempo (parece cronometrado), algún sindicato (y no necesariamente privado) siente la necesidad de "luchar" por sus derechos olvidando por completo sus OBLIGACIONES. 

- si para colmo de males algunos de esos gremios o sindicatos o como se les llame, de casualidad son ADEOM o AEBU, tenemos que vivir entre la mugre o tenes que esperar a que a dos gordos barbudos tomando mate en el fresco del aire acondicionado decidan que se levante la medida de lucha pero que siguen en conflicto y se tomaran 6 meses para analizar la situación, para que por fin tu plata llegue a tu cuenta y puedas pagar todas las cuentas, muchas de las cuales sirven de pago para alimentar todo este circulo. Obviamente teniendo amnesia de lo sucedido en el caso que tengas que pagar multas y recargos.

- no alcanza con todo lo anterior, sino que si a esta gente se les exige (mala palabra en el diccionario de estos seres divinos) trabajar como mínimo 6 horas, se arma quilombo y chan otro pausa en las actividades.

No se ustedes pero yo estoy re podrido de vivir de esta forma.

No creo que la solución sea levantarte un día y dejar de pagar todo lo que deberías como propuse en el principio del mail, pero cada año que pasa estoy seguro que una o dos personas se levantan y lo piensan, lo cual es bastante malo.

Yo no veo mal que me saquen un poco, un poquito o mucho de lo que gane, pero si eso repercute en una mejor calidad de vida, sino me están robando la plata, y eso es lo que siento hoy en día.

miércoles, 8 de diciembre de 2010

Montevideo cruel

Desde hace un tiempo vivo un poco mas alejado a la zona donde siempre viví, de todos modos casi todas las tardes me hago un tiempo para ir por allí, mi familia y mis amigos viven en la zona, y no solo eso, me viene bien para hacer un poco de ejercicio las veces que voy corriendo.

Estos últimos años he estado mucho tiempo fuera del país y me he perdido de cosas que ahora estoy como “descubriendo”. De hecho son cosas que sucedieron estando yo acá, pero que no había percibido como consecuencia del ritmo de vida. Ahora no ha cambiado mucho el ritmo de vida pero algunas cosas son un poco más lentas.

En realidad los que me conocen saben que hay varios temas que me “mueven”, y hay uno de ellos que últimamente me ha movido bastante, y es la sustentabilidad. De hecho con algunos amigos creamos el blog: greenuy.blogspot.com en el cual, ahora un poco menos, hemos tratado de crear un poco de conciencia, tarea para nada simple.

En particular me he topado con que de un momento a otro, y no se que estuve haciendo en el medio o no se que paso que no me di cuenta lo que estaba pasando, la zona rural donde vivía poco a poco ha dejado de serlo, y cada día deja de serlo un poco mas.

El primer indicio de esto fueron las canchas de fútbol, o complejos con varias canchas, lo que antes eran granjas hoy son complejos con varias canchas de futbol. Lo otro asombrosamente extraño es la instalación de una industria en plena zona rural muy cerca de la casa de mis padres. Lo cual no deja de sorprenderme, dado que una zona rural que además es protegida, justamente para que no pasen cosas como esas sino que sentido tiene que sea una zona rural, se instale una industria.

Resulta sumamente extraño que se le haya dado un permiso a un emprendimiento con dichas características, me pregunto que pasara mañana cuando otro quiera hacer lo mismo. Otra cosa que me pregunto es si alguien controla una vez otorgado el permiso lo que esa industria esta haciendo en la zona.

Ya me han dicho: pero que importa, lo importante es que da trabajo a muchos. Ahora, que pasa si el dar trabajo a muchos significa tirar no se que desechos a la cañada por ejemplo, la cual va a parar al arroyo o río, será que será sustentable. La ecuación mucho no me cierra.

Por otro lado están proliferando los grandes galpones para logística, talleres, contenedores, etc.

Esta de más decir que no me cae para nada en gracia y para ninguno de los que allí habitaron toda la vida, esta clase de cosas. No es lindo.

Obviamente no domino el tema del urbanismo, la planificación de una ciudad o área dentro de una ciudad, pero suena bastante razonable pensar en que una zona es para determinada actividad, se me ocurre: vivienda, industria, rural, y comercio quizás. No suena muy prolijo que sea un mix de cosas. Pinta a desequilibrio.



jueves, 12 de agosto de 2010

Tweet Button

Siguiendo la linea de TweetThis y aprovechando el lanzamiento oficial del Tweet Button por parte de twitter, dejé en el gallery un nuevo user control para facilitar su uso en nuestras aplicaciones.

Las ventaja de este nuevo user control es que podemos ver la cantidad de veces que twitteamos determinado link o texto.

url: url que vamos a twittear
title: texto a incluir junto con la url
count: podemos especificar si queremos el contador de tweets y su align, valores posibles: [horizontal, vertical, none]
via: podemos indicar si lo twitteado lo leímos a través de un usuario particular, vía @cimasan
button_text: texto a incluir en el tweet button
lang: lenguage en el que aparecerá el texto del button



Download TweetButton

miércoles, 11 de agosto de 2010

User Control: Tweet

Hace un tiempo subí al gallery el user control Tweet, con la idea de poder tener los últimos tweets de un user en mi aplicación.

Para usar el UC simplemente arrastramos el control al form de nuestro objeto y configuramos en tiempo de diseño o pragmáticamente las siguientes propiedades:

username: el username del usuario de twitter
width: ancho que tendrá el contenedor donde se mostraran los tweets
avatarsize: es el tamaño a asignar a la foto de perfil del user, ej: 32 (32x32).
autojointextdefault: texto a colocar para tweets escritos por el user
autojointexted: texto a colocar para tweets pasados
autojointexting: texto a colocar para tweets en presente
autojointextreply: texto a colocar cuando el user responde a otro user
autojointexturl: text a colocar cuando se twittea un link
count: cantidad de tweets que queremos mostrar

En ejecución se ve mas o menos así:


update: version 1.1, ahora es posible hacer consultas para buscar determinados tweets, por ejemplo para buscar los tweets con el tag: #XXGX se programaría algo como:

Tweet1.Query = "%23XXGX"

siendo Tweet1, el nombre del user control.
Por más información sobre qué consultas se pueden realizar ver Twitter's Search API

lunes, 9 de agosto de 2010

TweetThis

Dejé en marketplace.genexus.com un nuevo UC para poder agregar un link en nuestra app que nos permita twittear un texto y una url. El UC utiliza http://bit.ly/ para el shorten de la url a tweetear.

 Debemos especificar:

- title, texto a incluir
- url, url que queramos compartir
- login, usuario de http://bit.ly/
- ApiKey, apikey proporcionado por http://bit.ly/ para el usuario especificado en login

Ejemplo:

Event Start

        TweetThis1.title = "tweetthis"
        TweetThis1.url = "http://cimasan.blogspot.com"
        TweetThis1.ApiKey = "mykey"
        TweetThis1.Login = "cimasan"

EndEvent

Download TweetThis

miércoles, 28 de julio de 2010

No siempre son palos

En estos días tuve que hacer varios trámites, tanto en el ámbito privado como público, y me he llevado algunas sorpresas, y la mayoría buenas sorpresas.

Tuve que justificar el no haber votado en las últimas elecciones por estar fuera del país, salvo por el hecho que la oficina donde debí hacer el trámite comenzaba a atender público a las 13 hs., el resto fue "un trámite", en pocos minutos estaba fuera con mi justificación. De este experiencia algunos comentarios: por qué no se atiende al público durante todo el día? por qué comienza a las 13 y no a las 9 o 10 como toda oficina? comienzan a trabajar a efectivamente a las 13 o van antes? si comienzan a trabajar a las 13 hs, solo trabajan 4 horas diarias? si van a las 9, qué hacen hasta las 13? Para terminar: señora que quiere justificar su no-voto y no lleva credencial ni cédula, por favor, no arme alboroto, pida disculpas y vuelva a su casa.

Tuve que hacerme socio de una mutualista, en este sentido es mas entendible que las cosas sean rápidas y se reciba un trato amable, pero créanme no siempre es así, de todos modos esta no fue una de esas veces y no tuve inconvenientes.

Solicitar servicio de ADSL en Antel, y  no solo adsl, sino linea telefónica y asociar mi teléfono celular al adsl movil asociado al servicio. Fuí pensando en que debería ir tres veces: una para solicitar teléfono, otra luego de tener el teléfono para solicitar adsl, y quizás otra para poder tener el servicio 3g en mi celular. Aún no puedo creer como salí de Antel, primero: feliz por el trato brindado, y segundo: feliz porque ya me iba con el servicio en mi celular y con fecha para instalación de linea telefónica para luego seguir con el adsl. Veamos como me va con las instalaciones, pero hasta ahora nada mal.

Para completar la semana, debía ir al Registro Civil, si, leen bien, fui al Registro Civil, me caso :-) pero no es la idea hablar de ese tema, lo que quiero comentar es el buen trato que recibimos, tanto allí como luego en el Diario Oficial, principalmente eso, el buen trato y el buen humor con el que fuimos atendidos.

Será casualidad?
Tuve un día de suerte?
Algo está cambiando?
Será por lo de Uruguay en el mundial?

martes, 18 de mayo de 2010

Irashaimase, Arigato gaozaimas, Sumimasen

Si, si antes me han leído van a notar que soy reiterativo en este tema, pero es que me sigue sorprendiendo y cada día no puedo evitar sorprenderme otra vez. De que les hablo? de la atención al cliente, cualquiera sea, en Japón.

Seguramente mi asombro es mayor por mi procedencia sudamericana, quizás en países de Europa o Oceanía el trato al cliente es mas cercano al japones y no se note tanto, pero no lo sé, nunca he estado allí por lo cual quiero contarles mi experiencia.

Casi todos los días oficio de cliente en por lo menos dos locales comerciales, un super o un restaurante. En ambos lugares y sin importar si estas vistiendo un traje, un pantalón destrozado por los efectos del trabajo duro de una obra, o si elijes el plato mas barato del menú, o simplemente compras una botella de agua, el trato es y será el mismo. Automáticamente al ser visto por algún integrante del staff te dirán: Irashaimase (bienvenido) y seguirá, dependiendo de la hora del día, un Konichiwa (buenas/hola) o Kombawa (buenas noches).

Imagino que trabajando unas ocho horas diarias esta gente pronuncia esas palabras unas 50 o mas veces al día. Como les decía antes, no para de sorprenderme cómo esta gente aguanta una rutina como esta. Pero es parte de su cultura, por lo cual no creo que se aburran de hacerlo algún un día (aunque me imagino existen casos de gente que dijo basta alguna vez).

Bueno, han crecido y han visto desde el nacimiento como todos lo hacen, con lo cual si voy a pedir trabajo a algún lugar de atención al cliente ya sé, de antemano, cuales son las reglas. De hecho cuando ellos son compradores esperan lo mismo del vendedor.

Está de más decir que durante la compra el trato sigue siendo el mismo, no disminuye dado que el inicio fue bueno, es decir, en el inicio, en el durante y en el final se recibe el mismo nivel de atención.

Lo mismo pasa cuando se va al correo a enviar una carta, al banco a cambiar plata, o a una oficina del gobierno un domingo, para resolver algún trámite que no pudiste hacer en la semana por motivos laborales, a las cuatro de la tarde, una hora antes de cerrar.

Esta bueno? si esta bueno, de hecho esta gente no entiende que no sea así, es decir no existe en su universo llegar a algún lugar y que nadie les de la bienvenida o que luego de la compra no se les diga gracias.

Está mal? y...no creo que este mal, quizás en otros países en un puesto de atención al cliente se le de la bienvenida a algunos, las gracias a otros, y otras veces no se diga nada, por lo cual para algunos puede llegar a ser un poco molesto en ocasiones.

Dos ejemplos de los que me sorprenden:

1. cuando vas a la peluquería, luego de pagar esperas un gracias y un hasta la próxima o algo así no? bueno acá van un poco mas allá, el peluquero que te atendió, junto con quién te cobró y quizás sumado a quién te hizo algún otro servicio te acompañan a la puerta, salen afuera contigo y te despiden en la calle hasta que vos, agradecido, emprendes viaje con el nuevo look.

2. similar al caso de la peluquería, cuando sos parte de una empresa y vas a visitar a otra, ya sea para presentar un producto, para una simple reunión o para ver un problema que puedan tener en un servicio o producto, luego de terminada la sesión pasará lo mismo que con el peluquero, incluso al punto de llamar al ascensor y esperar contigo la llegada del mismo para si finalmente despedirte.

Lo que hablaba antes del servicio al cliente en un restaurant o super se traslada al nivel empresarial obviamente. El cliente es lo máximo y siempre pero siempre se tratará de satisfacerlo y mimarlo. En este sentido sucede que cuando una empresa decide comprar un servicio o un producto a otra, deposita en ella toda su confianza y difícilmente el vinculo se rompa algún día.

Pero obviamente para ganar esa confianza hay que decir muchos: "Irashaimase", "Arigato gaozaimas" (gracias) y "Sumimasen" (disculpe).

martes, 27 de abril de 2010

User Control: FocusController

Cuando se carga una página GeneXus se encarga de colocar el foco en el primer campo editable que encuentra, pero que pasa si queremos poner el foco en determinado campo de la pantalla?

En muchos casos queremos que el foco vaya a un campo particular del form que no necesariamente es el primer campo de la pantalla. Es más, nos puede pasar que queramos que el usuario ingrese datos en un grid apenas se cargue la página,  para lo cual desearíamos poner el foco en el primer campo de la primera fila de un grid.

Para cumplir con ese deseo de controlar donde irá el foco luego de cargada la página, y en especial que vaya a un campo de un grid, surge la idea de desarrollar el user control, FocusController.

Como funciona?

Imaginen un ejemplo muy simple de un grid con un par de variables y el siguiente evento load para cargar los valores:

Event Grid1.Load
    for &I=1 to 5
        &Var1 = &i
        &Var2 = &i
        grid1.Load()
    endfor
EndEvent

Pero la idea es que al cargar el webpanel el foco vaya al campo asociado a &Var1 en la primera fila del grid, entonces lo que hacemos es colocar el user control FocusController en el form y cambiamos el evento load de la siguiente manera:

Event Grid1.Load
    for &I=1 to 5
        if &I=1
            FocusController1.OnLoadControlFocus = &Var1.InternalName
        endif
        &Var1 = &i
        &Var2 = &i
        grid1.Load()
    endfor
EndEvent

La propiedad OnLoadControlFocus del user control debe ser cargada con el InternalName (nombre interno que se le dará al campo en el html generado) de un campo que pueda recibir el foco, como por ejemplo: var/att editables, imagenes, o botones.

Nota: el user control fue desarrollado y testeado con la versión GeneXus Evolution 1, no se asegura su funcionamiento con versiones anteriores o posteriores de GeneXus.

lunes, 19 de abril de 2010

Problemas con Favicon.ico

Hace unos días me contaron que en el log del servidor aparecía el siguiente error:

[error] [client 192.168.51.251] File does not exist: /opt/jboss-ews-1.0_A/httpd/www/html/favicon.ico

El error aparecía en el Apache http server el cual se utiliza como "load balancer" entre los distintos application server, Jboss.

A primera vista es obvio pensar que se esta referenciando al archivo favicon.ico en la ruta mencionada en el error y dicho archivo no se encuentra, lo cual se confirmó luego de mi prueba, pero de todos quise armar un ambiente y efectivamente obtener el mismo error, la única diferencia sería hacerlo en un ambiente Windows y no Linux.

Lo primero que necesitaba era poder contar con varios jboss de forma de poder hacer el balanceo de carga, pero la idea era hacer todo en mi máquina, así que configuré dos IP's virtuales de forma de levantar una instancia de jboss en cada una de ellas.

Para hacer esto agregué un nuevo Network adapter (Add new hardware device - > (manual) Network Adapter - > Microsoft Loopback Adapter) y le configuré dos IP's (que no estuvieran en el rango de mi red). Para hacer eso se debe ir a las propiedades de la conexión recién creada y en las properties de la sección Internet Protocol (TCP/IP) configurar una IP, ej: 192.168.1.140, y luego en Advanced agregar una nueva IP, ej: 192.168.1.141.

Lo siguiente fue instalarme el Apache Http Server, y luego el modulo mod_jk de forma tal que mi Apache http server se pueda encargar del load balancing. El archivo a bajar tendrá un nombre de la forma mod_jk-x.x.xx-httpd-x.x.xx.so, dependiendo de la versión, en mi caso me baje la última disponible en ese momento, 1.2.30. Para instalarlo se debe copiar al directorio APACHE_HOME/modules y renombrarlo a mod_jk.so.

Ya tenía instalado Jboss por lo cual no fue necesario instalarlo.

 A partir de este momento tenía todo lo necesario, ahora solo restaba comenzar con las configuraciones..

Configuraciones a hacer en Apache:

1. Editar el httpd.config ubicado en apache-home\conf y agregar:

#mod_jk setup
Include conf/extra/mod_jk.conf


2. Crear el archivo mod_jk.conf en apache-home\conf\extra y agregar lo siguiente:

# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so

# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat  "[%a %b %d %H:%M:%S %Y]"

# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat "%w %V %T"
             
# Mount your applications
JkMount /MYAPP_NAME/* loadbalancer

# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties             

# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
            
# Add jkstatus for managing runtime data

    JkMount status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1


Aquí se debe reemplazar MYAPP_NAME por el nombre de la webapp en la que queremos hacer load balancing.

3. Crear el archivo workers.properties en apache-home\conf\ con el siguiente contenido:

# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status

# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=192.168.1.140
worker.node1.type=ajp13
worker.node1.lbfactor=1


# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host=192.168.1.141
worker.node2.type=ajp13
worker.node2.lbfactor=1


# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=1
#worker.list=loadbalancer

# Status worker for managing load balancer
worker.status.type=status


Aquí estamos definiendo los nodos donde estarán nuestros jboss para hacer el load balancing entre ellos, en este caso el node1 estará en la IP 192.168.1.140 y el node2 en la IP 192.168.1.141, que son las IPs que configuré al principio, en caso de haber usado otras se deben colocar esos números de IP aqui.


4. Crear el archivo uriworkermap.properties en apache-home\conf\ con el siguiente contenido:

# Simple worker configuration file# Mount the Servlet context to the ajp13 worker
/MYAPP_NAME=loadbalancer
/MYAPP_NAME/*=loadbalancer


al igual que antes MYAPP_NAME es el nombre de la webapp que queremos "balancear".

Hasta acá todo lo necesario a configurar en el Apache HTTP Server.

Configuraciones a hacer en JBoss:

1. Como dije antes la idea es levantar dos instancias de JBoss en mi máquina, para hacer esto debemos hacer dos copias del dir jboss-home\server\default, llamar a una node1 y a la otra node2, estos nombres se corresponden con los que configuramos en el archivo workers.properties.

2. Editar el archivo jboss-home\server\node1\deploy\jboss-web.deployer\server.xml y  setear:

< Engine name="jboss.web" defaultHost="localhost" jvmRoute="node1" >


3. Editar el archivo jboss-home\server\node1\deploy\jboss-web.deployer\META-INF\jboss-service.xml y  setear:

< attribute name="UseJK" > true < /attribute >

4. Repetir el paso 2 y 3 para el node2

5. Debemos hacer el deploy de nuestra webapp, MYAPP_NAME, en ambas instancias del jboss, node1 y node2.

Por último solo nos resta levantar las dos instancias de JBoss, para hacer esto podemos hacer lo siguiente:

run.bat --host=192.168.1.140 --configuration=node1 -Djboss.messaging.ServerPeerID=1
run.bat --host=192.168.1.141 --configuration=node2 -Djboss.messaging.ServerPeerID=2

con esto tenemos las dos instancias de JBoss corriendo en nuestra máquina, una en la IP  192.168.1.140 y la otra en la IP 192.168.1.141.

Solo nos resta levantar Apache y comenzar a usar la app.

Cuando levantamos Apache podemos llegar a tener un error como este:

(OS 10048)Only one usage of each socket address (protocol/network address/por
is normally permitted.  : make_sock: could not bind to address localhost:
no listening sockets available, shutting down
Unable to open logs


Para solucionarlo podemos editar el archivo httpd.conf y setear la IP de nuestra máquina en lugar de localhost:

Listen 192.168.10.21:80

Lo mismo o un error similar puede pasar si tenemos corriendo el IIS en el mismo puerto (80).

Listo, cuando accedamos a http://localhost/MYAPP_NAME estaremos haciendo load balancing, podemos bajar un node y notar como seguirá funcionando nuestra app.

Volviendo al problema original, cuando accedemos a nuestra app el browser buscaba por el favicon.ico en apache-home\htdocs y el mismo no estaba allí, por lo cual copiando favicon.ico a dicho directorio el problema quedó resuelto.

viernes, 16 de abril de 2010

Cosas que no se ven habitualmente por mi barrio

Típica imagen de metro luego de las 10 de la noche.


Yorugua sacando ticket de tren con Pilsen en mano

Si vas a reusar las sábanas pone esto en la puerta para que no las cambien

Bar con todas botellas de wisky o sake

Tomate la cerveza y tira el vaso donde se debe

Máquina para elegir que vas a comer y pagar

Cerveza cusqueña

Voluntario que indica a los peatones cuando deben cruzar el seáforo

Típico escritorio de Uruguayo

Agarrate que se mueve todo

WTF

El padrino en el baño

Te leo las manos

 Todo bien con dejarla en la calle pero sacale las llaves

Se enojó

 Boy scouts

 Antes que te corte el pelo paga tú ticket

Haciendo té

Vista del cementerio desde la habitación

Nieve en primavera


jueves, 15 de abril de 2010

Cambiar dinero en Japón

....tarea por demás interesante.

Hace un tiempo hablé de la amabilidad con la que uno es atendido cuando va al banco, eso no ha cambiado y nada tengo para decir al respecto. Ahora, algo tan simple como cambiar plata en Japón, dolares a yenes en mi caso, puede llegar a ser una experiencia religiosa.

Hoy tenía que cambiar dinero porque ya no tenía yenes, por lo cual fui al primer banco que vi caminando por la calle, no voy a decir que banco dado que no aporta (pero era el Mizuho Bank), no tenía el pasaporte conmigo por lo cual no me fue posible cambiar.

Volver a casa a buscar el pasaporte o ir a otro banco e intentarlo? ir a otro banco.

Quiero cambiar dinero le dije a la señora amable que esta para atender a los clientes que entran al banco.
A la pregunta sobre que clase de cambio, le dije Dolares a Yenes.
Me entregó un formulario donde debía poner mi dirección y teléfono en Japón, mi nombre, y cuanto dinero debía cambiar.

Un embole, pero todo bien...

Espero (casi nada) y me llaman.
Me siento,  y entrego mi formulario a la funcionaria.
Olvidé poner el signo de dolares, shit!
Me pregunto: que raro? el formulario es especial para dolares a yenes, sino me hubieran dado otro de otro color y con un titulo que diría euros a yenes por ejemplo. Ok.

Siguiente pregunta: en esta dirección vive?

Siguiente respuesta: no, allí trabajo, me acabo de mudar y no se mi nueva dirección.
Cara de asombro por parte de funcionaria.
Espere un momento por favor, tengo un mapa con mi nueva dirección en mi bolsillo, le digo.
Entrego mapa con dirección.

Puedo sacar una copia, dice la funcionaria.

Si, por supuesto, respondo ya un tanto cansado.
Me pregunto nuevamente: por qué tanta vueltas por dios? enseguida recuerdo un cambio de Montevideo, o a una cholita en Bolivia cambiando dolares por bolivianos sentada en una silla en el medio de la frontera con Perú.

Luego de hacer la copia, ingresar algo en la computadora, otra vez se acerca la funcionaria al escritorio.

Debo admitir que en este momento estuve a punto de levantarme e irme, pero no tenía mis dolares conmigo, los tenía la funcionaria haciéndole algún super chequeo para corroborar que no fueran falsos.
Otra vez pienso: en realidad esta bien todo este chequeo de información, esto les permite tener un trace interesante de cada transacción y en caso de algún problema no habría dudas de donde ir a buscar al autor de la irregularidad, en este caso yo. Pero nuevamente me pregunto, solo quiero cambiar unos pocos dolares, por qué es tan complicado? Y otra vez se me viene a la mente la cholita boliviana.

Por fin! llegan los yenes en una bandejita junto con la funcionaria.

Pero...nueva pregunta: como se llama su empresa?

Mmm más preguntas, qué lindo!, eso pensé, pero no usando esas palabras.

No dije nada, solo le mostré mi tarjeta personal donde decía el nombre y a continuación leí el nombre de la empresa.

La dirección de la empresa que puso en el formulario se corresponde con el nombre de su empresa?

Respuesta: Si

Me entrega el dinero, lo cuento, todo esta ok, muchas gracias, chau hasta mañana.

Como decía mas arriba: una experiencia religiosa!

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?