jueves, 13 de diciembre de 2007

Así da gusto!

Hace una semana que hemos liberado la beta 2 y sin lugar a dudas el equipo de desarrollo se merecía un festejo luego de trabajar tan arduamente para dicha liberación.
Fue así que sobre el viernes pasado con muy buen tino Mastro ofreció las instalaciones de su morada para realizar una reunión sobre el fin de semana. La idea sin dudas era muy buena, pero no tomó en cuenta el detalle de que hace varios fines de semana que veníamos trabajando, dejando de lado a la familia, por lo cual seguramente la gran parte de nosotros ya habíamos programado un fin de semana en familia. Fue así como casi todos fuimos cancelando la invitación por lo cual la reunión no se realizó.

De todas formas surgió otra propuesta que consistía en realizar un día de semana una reunión a la que dimos en llamar “pseudo-laboral” en la cual podíamos aprovechar para realizar el festejo de liberación de la beta 2 y además luego realizar la planificación de la RC y liberación de la Rocha.

Hoy fue el día de dicho evento!!!

Ya desde hace un par de días que lo veníamos preparando, se realizaría en el country Carmel (donde vive Mastro) que es un lugar ideal para realizar la parte “pseudo” de la reunión, léase jugar al tenis, bañarse en la piscina y porque no hacer algún fulbito. Surgieron algunos desafíos como el que realizaron Levin y Brown al tenis, apostando 3 kilos de masas para todo el grupo a ser abonadas por el perdedor del mismo.

Bien temprano fuimos arribando todos al country incluso algunos llegaron mas temprano de los que nos tienen habituados en un día de trabajo normal :).

De a poco cada uno se iba arrimando a realizar alguna actividad… Se podía ver al mismo tiempo un partido de truco, otro de “chin-chon”, partidos de tenis, de futbol y otros en la piscina.

Luego llego el momento del tan mentado desafío Levin-Brown. En realidad apenas empezaron los peloteos todos nos dimos cuenta que no era partido y que Levin iba a tener que pagar la apuesta sin lugar a dudas. Y fue así nomas, con un claro 6-1 Brown vapuleó al ahora deudor de 3 kilos de masas.

Llego la hora de la comida, todo muy bien organizado por Proto y Mastro. Sin dudas Proto ya nos demostró en reiteradas ocasiones (y esta fue una mas) que sabe lo que hace cuando se pone detrás de una parrilla. Nos deleito con un estupendo asado, cerdo, chorizo y morcillas por supuesto comprados en “su” Tienda Inglesa. La charla a la hora de la comida sin desperdicios, sobre todo cuando más de uno de los comensales dio cátedra sobre lo que es la noche montevideana y de otras ciudades locales y extranjeras.

Mientras degustábamos un rico heladito se empezó a preparar la parte laboral de la reunión.De esta parte no voy a contar mucha cosa, porque es secreto de estado :)…. Pero sin dudas tengo que mencionar la formidable siesta con ronquidos incluidos que se mandó Panizza mientras cada uno iba contando las cosas que para uno tenia que tener la versión liberada… eso si cuando llego su turno de hablar se despertó de una como por arte de magia.
Luego de varias horas de “amenas discusiones” sobre la planificación la reunión fue llegando a su fin.

Verdaderamente en días como el de hoy cuando uno baja las revoluciones se pone a pensar que tiene que estar agradecido a la vida por poder “trabajar” en lo que a uno le gusta y poder hacerlo en un ambiente laboral fuera de serie y con un grupo humano formidable.
Como dice el titulo de este post… Así da gusto!!!!

PD: Viste Brown que no puse nada sobre como te gane al tenis, no sea cosa que después digan que soy un baboso ;)

miércoles, 21 de noviembre de 2007

Recarga de webapplication en Tomcat

Tomcat es sin dudas uno de los motores de servlets mas usados para prototipar aplicaciones Java web generadas con Genexus.
Incluso en la versión Rocha GeneXus busca si está tomact instalado en la maquina de desarrollo y en caso de ser así realiza todas las configuraciones para que se cree en forma automática una webapplication con el nombre de la KB y se copie en forma automática todos los archivos para realizar la ejecución.
Muchas veces doy con personas que me cuentan que luego de estar un rato desarrollando en ese ciclo de implementación, ejecución, modificación y de nuevo ejecución notan que la memoria del tomcat se va a las nubes.
Este post intenta explicar porqué es que ocurre o puede ocurrir ese uso excesivo de memoria.

Una de las características que tiene tomcat es que usa una sola VM de Java para ejecutar todas las webapplication que existan dentro del mismo. Esto hace que cuando se baja, o se intenta recargar una webapplication no sea tan simple como bajar y subir una nueva VM, sino que se crea un nuevo classloader y se intenta liberar la memoria del classloader que antes era el encargado de ejecutar la webapplication. De esta forma si uno como programador no tiene cuidado puede dejar levantada toda la memoria del classloader si hay alguna de las clases que no puede ser liberada. Un caso muy común es programar usando singletons, en ese caso es seguro que cada vez que se baje o se reinicie la webapplication toda la memoria del classloader que maneja esa clase no va a ser liberada.
Como dije anteriormente este se ve acentuado sobre todo cuando se prototipa porque tomcat por defecto hace recarga de la webapplication cuando se mueve una nueva clase, entonces cada nueva clase que se mueve se suma toda la memoria del classloader que no pudo liberar.

Sobre todo para los usuarios GeneXus , que son los que mas leen este blog (eso espero ;)) es bueno saber que en las clases estándar del generador Java teníamos este problema porque hacíamos uso de algunos singletos. Ese comportamiento quedo solucionado a partir del U4 del generador Java de la versión 9.0 de GeneXus.

De todas formas puede pasar que la webapplication sigua sin liberar la memoria del classloader aunque se esta usando el U4 de Java. Generalmente las aplicaciones hacen uso de varias bibliotecas además de las clases estándar del generador… por ejemplo drivers JDBC o clases para el manejo de pdfs, etc. Si algunas de esta bibliotecas no libera sus clases entonces todo el classloader de esa webapp no se libera.
En ese caso la solución es copiar el jar o zip de esa biblioteca el directorio LIB general del tomcat en lugar del directorio LIB propio de la webapplication. Las clases que están en el LIB general del tomcat no se intenta “reciclar” cuando se reinicia una webapplication porque esas clases se cargan en otro classloader que es compartido por todas las webapplications.

Este último tip de copiar las bibliotecas que tienen este problema al LIB general del tomcat puede ser usado también en caso de estar usando las clases estándar de la versión anterior al U4 del generador Java. Eso si, en ese caso todas las webapplication GeneXus que están en el tomcat tienen que estar desarrolladas en la misma versión.

lunes, 5 de noviembre de 2007

Gphone es en realidad Android

Hace tiempo que había rumores de que google estaba desarrollando un teléfono móvil, al cual se le llamaba GPhone.
Hoy nos enteramos que en realidad no era un aparato en lo que estaba google, sino que era una plataforma para teléfonos móviles a la cual llaman Android.
La plataforma es open source y tendría todo lo necesario para construir un teléfono celular. O sea no seria como dicen por ahí solo un sistema operativo para celulares basado en Linux que competiría con el Windows mobile.

Según dicen son mas de 34 compañías las que vienen trabajando en conjunto en este proyecto por más de 3 años, entre las cuales se encuentran Intel, Nividia, Motorola, LG, Samsung, Spring y T-Mobile.

Se esta anunciando el SDK para el 12 de Noviembre y los primeros apartitos basados en esa plataforma para la primera mitad del 2008.

No tengo dudas que esto será un éxito, considerando la pobreza general en términos de software que para mi tienen los teléfonos celulares hoy en día.
Y para todos los que alguna vez hemos intentado desarrollar aplicaciones para teléfonos móviles que tiene Java, seria un sueño vuelto realidad el tener una verdadera plataforma única en la cual algo que se desarrolla funcione de igual forma en todos los teléfonos que lo implementan.

miércoles, 3 de octubre de 2007

GeneXus for dummies

Hace algún tiempo estaba junto a un gran amigo haciendo un asado en el fondo de casa. Solemos reunirnos regularmente junto con su mujer y su hijo que se lleva muy bien con mi niña.

Entre papitas, maníes y whisky la charla derivó al trabajo y en determinado momento hizo la pregunta que seguramente muchos de los que lean este post alguna vez escuchó por parte de un outsider … ¿Pero que es lo que hace a GeneXus algo único?

Si alguno se enfrentó a esa pregunta o alguna similar estará de acuerdo que no es algo fácil de explicar, por lo cual enseguida intenté pensar en alguna analogía que me permitiera trasmitir las bases de GeneXus a una persona que sabe poco y nada de computación. Esto es más o menos lo que me salió:

Los programadores para “escribir” las aplicaciones que usas en tu maquina utilizan lo que llamamos un lenguaje de programación. A los lenguajes de programación los podes ver como idiomas, por ejemplo chino, japonés, ingles, francés, etc. Digamos que para aprender a programar tienes que aprender un idioma en particular y aprender a usar las reglas sintácticas y semánticas de ese idioma.

En un determinado momento hay algunos idiomas que se puede decir que son los que están de moda y son los más usados por los programadores; pongamos por ejemplo el inglés y el chino. El problema es que cada cierto tiempo esos idiomas se vuelven obsoletos y los programadores necesitan empezar a utilizar otros idiomas para poder escribir sus aplicaciones, por ejemplo japonés y francés. Esto trae muchos problemas claros a los programadores, pero los más importantes son:

· Se necesita aprender los nuevos idiomas.
· Se necesita reescribir toda la aplicación del chino al japonés por ejemplo.

La idea es que Genexus propone otro idioma al cual podríamos llamar esperanto. Internamente además GeneXus tiene un traductor que permite traducir del esperanto a los leguajes más usado en el momento, por ejemplo inglés y chino. A su vez GeneXus garantiza a sus usuarios que a medida que vayan saliendo nuevos idiomas realizará nuevos traductores del esperanto a esos nuevos idiomas.

Con esto GeneXus resuelve los problemas que había mencionado anteriormente:

· Solo se necesita saber un idioma… el esperanto
· No se necesita reescribir toda la aplicación cuando se quiera tener el programa en uno de los nuevos idiomas.

Adicionalmente el esperanto es un idioma mucho mas fácil de aprender y en el cual hay que escribir muchas menos palabras para expresar una idea.
Por ejemplo para “describir” un automovil en un idioma al cual podríamos llamar español hay que escribir algo así :

· Un auto es un vehículo que se impulsa mediante un motor que usa combustible. Tiene una caja de cambios, un caño de escape, frenos, embrague, volante, velocímetro, cuenta kilómetros, etc….

En esperanto (el idioma de GeneXus) esto lo podríamos describir como:

· Un auto es un vehículo para transportar personas de un lugar a otro.

Esto luego por medio del traductor GeneXus al español se traduce a lo escrito en primer lugar.

Hasta acá notaba que mi amigo escuchaba atentamente, pero en realidad seguramente estaba mas preocupado en que no se quemaran los chorizos y estaría pensando para que caramelos habré hecho esa maldita pregunta… Yo mientras tanto pensaba que más o menos había explicado la multiplataformidad y facilidad de programación de GeneXus… me falta explicar las reorganizaciones y estoy cumplido. …
Pensé, pensé, pero no se me ocurría ninguna analogía para explicar las reorganizaciones sin confundir a mi interlocutor y teniendo en cuenta que ya hace un rato que estaba hablando y si lo seguía haciendo iba a dejar todo el asado quemado la deje por ahí.

Pregunte entonces… entendiste mas o menos?Si, si dice mi amigo…. Los chorizos ya están prontos no?... dijo mi amigo como para cambiar de tema.

Pa… este loco no entendió nada, pensaba para mí. Fue ahí cuando me dice… Che, lo que seria una pegada seria poder hacer un traductor de alguno de los idiomas de moda a esperanto no? así podes hacer que esa gente que no usaba GeneXus pueda pasar sus aplicaciones a lo nuevos idiomas y ya quedan enganchados con GeneXus.

Sin lugar a dudas mi amigo es una persona muy inteligente! :)

domingo, 30 de septiembre de 2007

Medir, ajustar, monitorear.

Acá viene mi primer post técnico…

Sobre el final del cara a cara de java del último evento recomendé a los asistentes el uso de JMX. Una vez fuera de la sala una asistente me preguntó si tenía algo escrito sobre JMX en mi blog. Mi respuesta con un poco de verguenza…. “No tengo blog”.

Internamente me prometí que cuando empezara mi blog uno de los primeros post iba a ser sobre JMX en GeneXus y aquí estamos.

JMX (Java Management eXtensions) es una tecnología que permite monitorizar y administrar aplicaciones hechas en Java. Sobre .NET existe algo similar llamado WMI.

GeneXus hace uso de esa tecnología para hacer dos tipos de cosas en las aplicaciones generadas: Monitorear y medir la performance general.

Cuando estamos hablando de medir la performance general nos referimos a lo siguiente:

Encontrar las sentencias SQL que se ejecutan mas veces, las que tienen peor tiempo promedio, las que ocupan mas tiempo total de la aplicación, etc.

A la vez permite encontrar medidas similares para el caso de procedimientos.

Mi recomendación siempre es la de hacer un stress test antes de poner una aplicación en producción y sobre ese stress test analizar las medidas que nos tira JMX. De esa forma podemos analizar las sentencias SQL mas problemáticas y podemos realizar alguna tarea en el DBMS, o cambiar el código GeneXus para que la sentencias generada sea mas eficiente o porque no? usar cache de datos sobre esa tabla en caso de ser posible.

Como dije anteriormente lo otro que nos permite el uso de JMX en GeneXus es el monitorear el comportamiento de la aplicación.

A diferencia de la parte de performance que claramente es una tarea para hacer antes de poner una aplicación en producción, la tarea de monitoreo es sobre todo una operación para realizar sobre producción.

Entre las cosas que se pueden monitorear están, el uso del pool de conexiones, el estado de cada una de las conexiones a la base de datos, el estado del cache de datos, etc.

Además se pueden realizar operaciones en caliente sin tener que bajar la aplicación, como ser aumentar el tamaño del pool de conexiones o matar alguna conexión problemática.

A modo de ejemplo un posible caso de uso podria ser el encontrar un loqueo en la aplicación. Podriamos por ejemplo ver en el DBMS cuales son las conexiones que estan loqueadas, luego ir a buscar esas conexiones en JMX, y ver cada una de las conexiones cual es la sentencias que esta ejecutando y cual es el procedimiento que esta ejecutando esas sentencias. Eso tal vez nos permita encontar un posible error de programación.

Adicionalmente JMX permite el programar “alarmas”. Esto quiere decir disparar alguna acción como por ejemplo mandar un mail o un SMS a algún administrador en caso de que alguno de los medidores este dando un valor no deseado, por ejemplo que haya contención en el pool de conexiones o que alguna sentencia SQL fundamental en la aplicación este dando tiempos no esperados.

Todo lo anterior pretendió ser una explicación “marketinera” sin ir al detalle de la implementación, ni de su configuración en GeneXus, sino más bien para incitar a los desarrolladores de aplicaciones GeneXus a su conocimiento y su uso.

Los detalles para su uso los pueden encontrar en esta dirección:
http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Application+Monitoring+and+Management%3A+using+a+JMX+or+WMI+monitor,

viernes, 28 de septiembre de 2007

El ajedrez y Yo

Este post viene de historia, y es sobre unas de mis pasiones… el ajedrez.


No recuerdo bien cuando fue que mi padre me inculco el gusto por el ajedrez, pero seguro que fue de muy pequeño.
Mis primeros contactos los recuerdo de muy pequeño cuando mi padrino Jorge venia a jugar a casa con mi padre y Yo les acomodaba las piezas antes que empezaran a jugar.
Recuerdo verlos horas y horas ahí sentados mirando el tablero y cada tanto moviendo alguna pieza sin emitir ninguna palabra mientras tanto.
No se muy bien porque pero todo ese “espectáculo silencioso” me fascinaba.


Una cosa que hizo mi padre que para mi fue notable aunque alguien pueda decir que no es recomendable fue nunca dejarme ganar.
Seguramente en algún momento me regalaba alguna pieza para hacer el partido más interesante, pero al final él siempre terminaba ganando.
Porque digo que es fue bueno es porque hasta el día de hoy recuerdo el día que le gane mi primer partido.
Fue en un verano en Marindia, en una casa llamada rancho alondra, donde solíamos veranear.
Los nervios que sentía a medida que me iba dando cuenta que podía ganar y la alegría que sentí en el momento que vi el jaque mate fueron indescriptibles.
Seguramente mi padre sintió la misma alegría al ver como su alumno lo había vencido usando los conocimientos que le había dado, aunque no lo demostró :)


A partir de ese momento, mi pasión por el ajedrez fue creciendo y llego el momento de leer sobre el tema.
Aperturas, finales, desarrollo.. todo libro que pasaba cerca mío sobre el tema lo devoraba (no había internet en esa época).


Mas tarde formamos junto con mi padre, mi padrino y un amigo de mi padre (Meijon) un grupo que nos reuníamos todos los jueves por la noche a jugar entre nosotros.
Cada jueves nos reuníamos en una casa distinta y nos quedábamos hasta tarde jugando y comentando cada una de las jugadas del otro tablero en secreto para que los que estaban jugando no escucharan de las grandes jugadas que veíamos desde afuera.
Eso duró hasta que Meijon se fue para España; a partir de ahí ya pasamos a jugar en forma mas esporádica.


Pero llego el momento de internet… Un día navegando encontré un sitio interesante de ajedrez por correspondencia que parecía ser la solución para volver a jugar entre todos sin problemas de tiempo y espacio.
Convencer a mi padrino fue fácil (es gran fanático de internet), convencer a mi padre no lo fue tanto aunque finalmente lo logré.
Así que si alguien quiere unirse, el sitio se llama http://redhotpawn.com/ y mi usuario es iroqueta, el de mi padre cjroqueta y el de mi padrino abu1502.


Bueno, el post ya me esta quedando largo así que termino contando que le estoy enseñando (así como lo hizo mi padre desde chico) a jugar a mi hija Sol.
Ella es muy chica, tiene 3 años, pero ya aprendió a colocar las piezas en su lugar.Aun no esta muy interesada a aprender los movimientos de cada una de las piezas, sino que mas bien ella inventa su propio juego, pero cada vez que saco el tablero y las piezas del armario se pone muy entusiasmada.
De algo estoy seguro y es que voy a hacer lo mismo que hizo mi padre con migo y no la voy a dejar ganar hasta que lo logre por méritos propios :)

Empezando

Bueno, aquí estoy...
Varias veces me había planteado el tener un blog.
Un blog Yo??... naaaaa, para que?... a quien le puede interesar?.... de que voy a hablar?....
Durante el evento me encontré sorprendido al notar que la gente te pide la dirección de blog así como te pide la dirección de mail.
Y para rematar en el "cara a cara" de Java recomendé el uso de JMX y al final de la charla una persona me para y me pregunta "Sobre lo que recomendaste de JMX tienes algo escrito en tu blog"???... plop!!!!
Después de esa dije, bueno va a ver que apechugar y armar un blog, porque ya el decir "no tengo blog" me da un poco de verguencita.
Así que aquí vamos, vamos a ver que resulta de esto y cuanto dura.