sábado, 28 de julio de 2007

Se viene el GeneXus Challenge...

... y en Concepto vamos a participar con dos proyectos.

Por más información, ver el Petroglifo.

martes, 17 de julio de 2007

Implementando una progress bar en un web panel GeneXus

Hoy me encontré con un problema, que con GeneXus no tiene una solución fácil. En una aplicación full web con GeneXus 9.0, tengo un proceso que puede demorar varios minutos, y mientras el proceso corre en el servidor, no hay forma de que el usuario se entere de lo que está haciendo.

La versión original

En la versión original, lo que tenía era un web panel, que hacía un call a un procedimiento, y cuando el procedimiento terminaba, llamaba a otro web panel. Algo así:

Event 'Accion'
call(PProcesa)
call(HMuestraResultado)
EndEvent

El problema con esta arquitectura es que por más que ponga mensajes en el evento, no se van a mostrar hasta que haya terminado de procesar.

Arquitectura de la solución

La solución fue llamar al procedimiento usando el comando submit, con lo que el procedimiento queda ejecutándose, pero el control vuelve de inmediato al web panel.

El código queda entonces así:

Event 'Accion'
submit(PProcesa, '')
call(HMuestraProgreso)
EndEvent

Además, se implementaron dos procedimientos, uno que devuelve la cantidad a procesar y otro que devuelve la cantidad que fueron procesados hasta el momento.

El web panel MuestraProgreso, invoca a estos dos procedimientos en el evento Start, de forma de saber el porcentaje de avance, y muestra un mensaje "Procesados n de N". Este web panel hace un refresh automático cada 3 segundos, de forma de ir mostrando el progreso. Veamos el código.

Event Start
&Total = udp(PCantidadTotal)
&Procesados = udp(PCantidadProcesados)

if &Procesados >= &Total
call(HMuestraResultado)
else
Form.MetaEquiv.AddItem('refresh', '3')
tbkMensaje.Caption = 'Procesados ' + trim(str(&Procesados, 9, 0)) + ' de ' + trim(str(&Total, 9, 0)) + '.'

do 'Progress bar'
endif
EndEvent // Start

El refresh automático se hace colocando un tag HMTL en el cabezal de la página, en el código es la línea con:

Form.MetaEquiv.AddItem('refresh', '3')

Mostrando una barra de progreso

Para mostrar la barra de progreso (progress bar) se necesita un poco más de código HTML. Hay muchas formas de hacerlo, en este caso elegí usar una tabla con varias celdas que se van pintando de algún color a medida que avanza.

Sub 'Progress bar'
&pbDivisiones = 100
&pbAvance = round(&Procesados * &pbDivisiones / &Total, 0)
tbkProgressBar.Caption = '<table id="ProgressBar" cellpadding="0" cellspacing="0" style="width:100%;" border="1" rules="none"><tr>'
for &i = 1 to &pbDivisiones
if &i <= &pbAvance
&style = ' style="BACKGROUND-COLOR: #005B5B"'
else
&style = ''
endif
tbkProgressBar.Caption += '<td' + &style + '>&nbps;</td>'
endfor
tbkProgressBar.Caption += '</tr></table>'
EndSub // 'Progress bar'

El control tbkProgressBar es un text block que se encuentra en el web form del web panel, y que tiene la propiedad Format = HTML.

El resto de la subrutina se debería poder usar tal cual, sin hacerle modificaciones.

jueves, 12 de julio de 2007

Integración entre FeedBurner y Blogger

Ahora que Google compró FeedBurner, hicieron más fácil la integración con Blogger: FeedBurner Integration for Blogspot Blogs

Antes se podía hacer, pero daba un poco más de trabajo. Había que editar el fuente de la plantilla del Blog. Ahora simplemente es poner el link al feed en un campo.

Determinación del índice usando clausulas where del for each

Estaba leyendo las release notes del preview del upgrade 4 del Development Environment de GeneXus 9.0, y me encontré con que implementaron esto:
SAC 20452- No se considera condiciones explícitas (where) para buscar el mejor Order/índice.
Hasta ahora GeneXus suponía que el DBMS elige el índice que usa para resolver la consulta solo tomando en cuenta la cláusula "order", cuando en realidad la mayoría de las veces se basa en el contenido de la clausula "where".

Con este cambio, probablemente el índice que reporte GX en la navegación sea más acertado, y van a dejar de aparecer algunos warnings.

¡Una muy buena noticia!

miércoles, 11 de julio de 2007

Flock 0.9

Hace un tiempo había escrito una nota sobre Flock. En ese momento la versión disponible era la 0.7 que estaba basado en Firefox 1.5 y era el browser que usaba. Después volví a Firefox 2.0, el principal motivo es una funcionalidad espectacular que no estaba en 1.5, que es poder abrir un tab que cerré hace poco...

Ahora, la semana pasada, se liberó la versión 0.9 de Flock que está basado en Firefox 2.0... Entonces se me plantea el dilema si volver a Flock o si quedarme en Firefox.

La interfaz de Flock 0.9 está muy buena, tiene una barra con accesos directos para:
  • My World: es una página que concentra una lista de los sitios favoritos, los feeds y "favorite media", que son imágenes y videos de gente a la cual me puedo suscribir.
  • Media bar: muestra fotos y videos en una barra entre la página web y la lista de tabs.
  • Favorite sites
  • Accounts and services: Flock permite configurar la integración con varios servicios: Flickr, Photobucket, YouTube, Blogger, Blogsome, LiveJournal, Typepad, Wordpress, Xanga, del.icio.us y Magnolia.
  • Feeds: el mejor lector de feeds que encontré...
  • Web clipboard: permite seleccionar imágenes y texto del web para usar en otras aplicaciones
  • Blog: permite crear notas y publicarlas en distintos blogs, ahora estoy escribiendo esta nota en el editor de Flock
  • Uploader: permite subir imágenes a Flickr o videos a YouTube (y a otros servicios...).
Es verdaderamente muy completo para quienes usan algunos de los sitios con los que tiene integración.

De estos servicios uso algunos, y he encontrado buenas extensiones para Firefox que suplantan bastante bien los servicios que tiene integrado Flock.

Bookmarks. Uso el servicio de del.icio.us, que tiene una extensión que permite administrar los links desde la interfaz misma de Firefox. Se puede agregar un nuevo link a la colección, y se puede buscar por categoría (tag) o por descripción. Con esta extensión, dejé de usar los bookmarks de Firefox (ya en Flock no los usaba, de hecho ni siquiera existen como tal...)

Feed reader. Como lector de feeds, tiene la gran ventaja que no es necesario abrir otra aplicación. Cuando abro el navegador ya se conecta a los sitios a los que me suscribí y baja lo que haya nuevo. Además está realmente bueno. En Firefox no encontré una extensión que me convenciera, pero estoy usando Google Reader, que también está muy bueno, y tiene la ventaja que puedo leer las noticias desde cualquier lado. Igual es como si fuera otra aplicación, en el sentido que tengo que ir a la página para enterarme si hay algo nuevo, pero una cosa compensa la otra...

Firefox tiene integrado un "lector de feeds" si es que se puede llamar así, porque deja mucho que desear. Lo que sí tiene, que está bueno, es que puedo decirle que cuando hago click en algún link para suscribirme, agrega el feed automáticamente a Google Reader.

Nota: no me gusta la palabra "feed", pero no conozco una palabra en español que represente lo mismo... si alguien la conoce que me avise.

Blogs. En Firefox estoy usando una extensión que me permite escribir las notas en Windows Live Writer (lo curioso es que es un producto de Microsoft, y tiene una extensión para Firefox). La integración es casi tan buena como la que tiene el editor de Flock, y además tiene la ventaja que la edición se hace usando el mismo tema que tiene el blog, por lo que ya voy viendo como va a quedar.

Conclusiones... Es muy bueno que Flock haya liberado una versión basado en Firefox 2.0. Me parece que es un excelente browser. Sin embargo, creo que he encontrado los equivalentes en funcionalidad en extensiones para Firefox, por lo que por ahora me quedo con este último. Sin embargo, cuando salga la versión 1.0 de Flock la voy a probar nuevamente.

lunes, 9 de julio de 2007

Distintas formas de visualizar Amazon

En 5 Alternative Ways to Browse Amazon, se muestran cinco aplicaciones que permiten navegar por Amazon con distintas formas de visualizar la información.

Me gustaron LivePlasma y Tuneglue, tienen buenas formas de ver los elementos relacionados.

sábado, 7 de julio de 2007

Comandos de texto en interfases gráficas

Estuve leyendo un artículo muy interesante de Alex Faaborg (Mozilla Labs) sobre The Graphical Keyboard User Interface, donde hace algunos comentarios interesantes sobre el uso de comandos de texto en interfases gráficas, en particular, algunas ideas que tiene para Firefox 3.

También hace referencia a un artículo que está muy interesante titulado Command Line for the Common Man: The Command Line Comeback.

Yo uso bastante la línea de comando de Windows para varias cosas (abrir archivos, copiar, mapear discos, etc). Obviamente no digo que hay que usar solo línea de comandos, pero hay cosas que son más rápidas o más fáciles de hacer con un comando que con una GUI. Sobre todo más rápido...

Hay otras aplicaciones que uso donde para realizar un acción se escribe un comando de texto.

Bookmarks en Firefox, con la extensión de del.icio.us. del.icio.us es un sitio que permite almacenar una lista de links, la extensión agrega mis links como una lista de favoritos en Firefox. En vez de usar una estructura de carpetas para almacenar los bookmarks, tengo una lista plana y un campo de texto, donde al digitar una letra se va filtrando. Digitando 4 o 5 letras, llego fácilmente al link que quiero.

Slickrun es una aplicación que agrega un campo de texto que flota sobre la pantalla, donde se pueden escribir comandos, por ejemplo, para buscar una palabra en el diccionario de la Real Academia Española (ojo, este comando no viene por defecto...). En lugar de abrir el navegador, buscar el link correspondiente, esperar que se cargue la página, ingresar la palabra en el cuadro de texto correspondiente, y presionar un botón, simplemente escribo "rae" en Slickrun, se abre otra ventana con un cuadro de texto, escribo la palabra, y doy Enter. Mucho más fácil :)

En GeneXus, por ejemplo para abrir un objeto. En una KB con más de 6.000 objetos como tenemos en Concepto, acordarse del folder de cada uno es imposible. El dialogo para abrir un objeto escribiendo una parte del nombre o de la descripción, es mucho más práctico.

Las aplicaciones generadas con GeneXus a partir de 9.0, tienen la posibilidad de ingresar valores mediante la descripción, y con una lista de opciones gracias al suggest. Hay que ver si los usuarios se acostumbran a esta forma de usar las aplicaciones, yo creo que hay casos en que es mucho más práctico que un prompt o un combo.

domingo, 1 de julio de 2007

GXOpen, versiones de los proyectos y KBManager

GXOpen es un muy buen sitio para compartir proyectos entre los miembros de la comunidad GeneXus, pero tiene una limitante que creo que es muy importante: el proyecto consiste de un solo archivo donde tiene que estar todo.

Sería muy bueno poder tener distintos archivos asociados a una versión de un determinado proyecto. Por ejemplo, deberían poder subirse los fuentes por un lado, los archivos binarios en el caso que haya, la documentación, screenshots, etc. Y todo debería forma parte de una determinada versión.

Además, si bajo un proyecto y quiero hacerle algún cambio, cuando lo vuelvo a publicar tengo que volver a subir todo el proyecto, sin importar el tamaño del cambio que haya hecho.

Para otros lenguajes de programación hay buenas herramientas para publicar distintas versiones de los fuentes, pero con GX es más difícil, porque los objetos de la KB no son archivos que se puedan subir a un repositorio.

KBManager es el proyecto de grado (de la Facultad de Ingeniería) de Federico Alvarez, Diego Crutas y Daniel Latorres, que entre otras cosas tiene la capacidad de almacenar en un repositorio centralizado las distintas versiones de los objetos de una KB. Es exactamente lo que le falta a GXOpen.

La solución es simple y efectiva: si yo parto de una determinada versión y hago un cambio en algún objeto, puedo subir mediante un XPZ los objetos modificados al repositorio centralizado, donde se procesa y almacena el XPZ de cada uno de los objetos. Del repositorio puedo obtener la última versión de un objeto o de toda la KB, y puedo fácilmente obtener también una versión anterior.

Creo que sería muy bueno contar con una funcionalidad similar a esta en GXOpen...

Además el KBManager permite hacer otras cosas, como por ejemplo comparar dos versiones de un objeto, crear consultas sobre los objetos, marcar objetos como que pertenecen al mismo "bug fix", etc., pero esto ya sería "funcionalidad avanzada" para lo que se necesita en GXOpen.