miércoles, 25 de abril de 2007

Uno por noche: GeneXus Rocha Night Builds

Imagen de 'Uno por noche: GeneXus Rocha Night Builds'Todas las noches un proceso automático toma los últimos cambios registrados y ejecuta todos los procesos que intervienen para convertir los archivos de código fuente en un nuevo setup de la versión Rocha. En algún momento, uno de estos setups se convertirá en un nuevo CTP, una Beta, o en la versión final liberada. La novedad es que a partir de ahora, ¡todas estas versiones intermedias también estarán disponibles en forma pública para descargar y probar!

Como anunciara hoy Gustavo Proto en el foro de GeneXus Rocha, a partir de hoy es posible acceder a los GeneXus Rocha Night Builds. Tienen su propio foro, y se descargan siempre desde la misma página. Además, es posible ir viendo cuáles son los cambios que se van haciendo día a día.

El proceso de armado arranca a las 11:00 PM 01:00 AM de Montevideo (GMT -0300), y en general demora unos 30 a 45 minutos. Si todo sale bien, cerca de cada medianoche las 02:00 AM (hora uruguaya) debería estar pronto un nuevo build. [Actualizados los horarios 27 Abril 2007]

Creo que esto va a ser particularmente útil en dos situaciones. La primera es el caso de los beta testers que avisan de un problema a través del foro y se les contesta que acaba de ser corregido. Antes tenían que esperar a que se liberara el siguiente CTP para poder verlo y probarlo. Ahora, si lo desean, no tendrán que esperar más de un día desde que se les informa que se corrigió.

Pero fundamentalmente, a quienes creo que va a ayudar más, es a los que están desarrollando GXextensions. En la medida en que comiencen a profundizar, y hacer cosas más sofisticadas, podremos responder mucho más rápidamente a los problemas que puedan encontrar, de manera que el desarrollo no se detenga. Por otra parte, todos los cambios que sea necesario hacer en una GXextension por razones de compatibilidad, pueden hacerse y probarse mucho antes, de la misma manera que hacemos con las que desarrollamos internamente.

Veremos cómo nos va, y ya nos dirán qué tal les resulta. ♦

martes, 24 de abril de 2007

Canelones entre Lechuga y Tomate

Imagen de 'Canelones entre Lechuga y Tomate'Hoy pedí comida a El Refugio, Grill and pasta specialties, que es uno de los restaurantes dentro de Zonamerica. Figura incluso en el manual de supervivencia en ZA de Rodrigo, lo que no es poca cosa. Lo que no figura en ese manual, es la peculiar política de El Refugio con respecto a los pedidos de comida para llevar.

La cosa es más o menos así: "usted pida lo que quiera, que ya veremos qué le llevamos". Yo no sé los demás, pero cuando tengo ganas de comer pasta pido pasta, y si quiero comer ensalada pido ensalada. Lo que es seguro, es que si pido canelones, no estoy esperando que me vayan a traer medio plato de canelones junto con (como si en verdad les diera vergüenza por mandar sólo medio plato) ¡medio plato de ensalada de lechuga y tomate!

Porque no es que sirvan un plato razonable de canelones y luego le pongan unas hojitas de lechuga para decorar. No, señor. Viene algo que, aunque quizá sea un poco más que media, seguro no llega a una porción, y a eso le agregan una guarnición de algo que nadie pidió, como para rellenar y que no se note. ¿Saben qué? Se nota; la imagen lo dice todo.

Por otra parte, si yo tuviera que complementar un plato de canelones con alguna otra cosa, no sé con qué lo haría, pero seguro que no se me ocurriría mezclar pasta con lechuga y tomate. Es como si para complementar una porción escasa de pescado, le agregaran patitas de pollo, o algo así.

Hmm..., ¿quizá sea una opción dietética?... Es decir, así como a alguien se le ocurrió inventar los cigarrillos 'light' con el simple truco de hacer pequeños agujeros en el filtro (de manera que no es que uno fume un cigarrillo con un tabaco más liviano, sino que en realidad uno fuma mitad cigarrillo y mitad aire), ¿será que El Refugio inventó los canelones dietéticos?
"¿Que los canelones engordan? Pues no hay problema, nosotros le damos canelones light: mitad canelones, mitad ensalada. Y no se pierda nuesta torta de chocolate light: mitad torta, mitad ensalada de fruta. Consulte por otros platos light."
Aunque después de todo, a mí se me hace que han de tener alguna especie de obsesión con la lechuga y el tomate. Porque cuando uno pide pastel de carne, es decir, cuando espera que le llegue una porción de pastel de carne, pues resulta que lo que llega es también mitad pastel de carne, mitad lechuga y tomate.

Hablando de obsesiones, no debería cerrar este artículo sin mencionar otra de la que hacen gala. Es así: usted pide una tarta de jamón, queso, y aceitunas. Imagínesela. ¿Ya se la imaginó? Bueno, resulta que lo que le llega es una cosa como de siete centímetros de altura, compuesta casi exclusivamente de ricota, con algunos pedacitos de jamon y de aceitunas entreverados... Sí, claro, ya sé que la ricota es parecida al queso. Pero no es queso y, al menos en este pais, cuando se pide una tarta de jamón y queso, nadie espera que le venga una tarta de ricota, ¿o sí? Es mucho peor todavía si le pasa como a mí, que me gusta el queso (colonia, gruyere, parmesano, dambo, muzzarella, y otros de ese estilo), pero no soporto la ricota.

Ahora, ¿qué puede pasar entonces si junto con la tarta de jamón, queso, y aceitunas, usted encarga una Ensalada Caprese, como hice yo? Es que yo me las ligo todas... Pues que le mandan una ensalada hecha con tomate, albahaca, y pedacitos de..., adivine, adivine..., ¡Sí! ¡Acertó! ¡Ricota! Con lo de la tarta, hasta podría (remotamente, estando de buen humor) llegar a comprenderlo. Porque siempre podrían decirme "bueno, mire señor protestón, la tarta de queso de El Refugio es así, con ricota". Pero ya una Ensalada Caprese... Ahí como que no hay mucha opción: o es una Ensalada Capresse o no lo es, y una Ensalada Caprese definitivamente no es con ricota. De otra forma, es como si me dijeran "aquí para el pesto usamos espinaca en lugar de albahaca".

A propósito, ¿alguien quiere una guarnición de lechuga y tomate que me sobró? ♦

martes, 17 de abril de 2007

¡La Rocha CTP4 ya está disponible!

Imagen de "¡La Rocha CTP4 ya está disponible!" Finalmente, después de mucho esfuerzo, pero con mucho entusiasmo, hemos liberado la versión CTP4 de GeneXus Rocha.

Como siempre, en el wiki de la comunidad encontrarán la información detallada de la Rocha CTP4, pero por supuesto, nada como descargarla y probarla uno mismo.

Por supuesto que junto con esta versión, hemos liberado también el correspondiente GXextensions SDK, que pueden obtener desde aquí.

Esperamos sus comentarios en los foros. ♦

lunes, 16 de abril de 2007

La historieta vuelve a repetirse

Imagen de "La historieta vuelve a repetirse"Creo que era inevitable; tenía que pasar y pasó. Es que si a mí me gusta Dilbert, a Cristian le gusta Garfield. Así que ahora tenemos una nueva GXextension llamada Daily Garfield publicada en GXOpen, y que también podrán instalar automáticamente desde GeneXus Rocha CTP4.

¿Es que acaso aquí sólo pensamos en historietas? De ninguna manera: sé de alguien que quiere hacer una GXextension que contenga un juego.

Como pueden ver en esta imagen la interfaz de Daily Garfield es mucho más potente que la de Dilbert. Permite por ejemplo acceder a las tiras de diferentes fechas ya sea yendo al día anterior o siguiente, como eligiendo una fecha específica. También es posible elegir si se quiere ver en inglés o en español. ♦

sábado, 14 de abril de 2007

KBDesigner: una GXextension de Nicolás Castagnet

Imagen de "KBDesigner: una GXextension de Nicolás Castagnet"Desde que comenzó el programa de Early Adopters de GXextensions, Nicolás Castagnet, de De Larrobla & Asociados, ha sido uno de los más entusiastas y participativos. Nicolás está trabajando duramente en un proyecto como parte de sus estudios, y ese proyecto incluye el desarrollo de una GXextension.

En algunas conversaciones "de pasillo" me contó lo que estaba haciendo y como me pareció algo muy interesante, el mes pasado lo invité a que viniera a ARTech para mostrarnos lo que estaba haciendo al equipo de desarrollo. La idea era que nos mostrara de qué se trataba exactamente, y ver si en base a su experiencia, había algo que podíamos hacer para dar mejor soporte a quienes desarrollan extensiones.

La verdad es que nos impresionó muy gratamente, y de hecho Nicolás Jodal aprovechó la oportunidad para comprometerlo a que dé una conferencia en el próximo encuentro de usuarios. Para una primera descripción del KBDesigner, voy a recurrir a sus propias palabras:

"Brinda un modelo para definir Consultas e Ingresos de Datos en un Sistema de Información a través de Diagramas de Navegación sobre las relaciones de la Base de Datos. Incluye un diseñador de diagramas, otro de formularios, y un generador que a partir de esta información crea los objetos GeneXus necesarios para implementar el sistema. La extensión no aspira a permitir diseñar sistemas complejos. Más que nada apunta a dar una solución para crear sistemas sencillos rápidamente (que tengan consultas e ingresos de datos)."
Lo que se ve en la imagen, es precisamente un objeto Navigation (es un tipo de objeto adicional, definido por el KBDesigner) y su correspondiente diagrama, cuyo editor también fue desarrollado por Nicolás. Estos diagramas se usan para diseñar la navegación que se desea que el usuario pueda hacer dentro de una aplicación. En el ejemplo, que corresponde a un sistema de manejo de proyectos, se ve cómo a partir de un proyecto, se podrá acceder a distintos formularios que muestren listas de requerimientos, documentos, o asignaciones de personas. Cada uno de esas listas a su vez habilitará el acceso a la edición de cada elemento particular, y por ejemplo a partir de un requerimiento, se podrá navegar a una lista de documentos o a una de personas asignadas, a partir de las cuales existen otras navegaciones posibles, y así sucesivamente.

Además de las navegaciones, es posible diseñar los formularios de cada una de las etapas, utilizando un editor también proporcionado por el KBDesigner, con el que de una forma guiada y muy declarativa, se realiza ese trabajo de manera rápida y potente.

Finalmente, a partir de las navegaciones y formularios, el KBDesigner utiliza su propio generador (basado en la misma tecnología de plantillas que emplean los GXPatterns), para construir (y mantener) los objetos GeneXus que implementan el sistema. Impresionante, ¿no?

De manera que para el próximo encuentro de usuarios, estén atentos a la conferencia sobre el KBDesigner; estoy seguro de que valdrá la pena ♦

viernes, 13 de abril de 2007

Instalación automática de GXextensions en Rocha CTP4

Imagen de "Instalación automática de GXextensions en Rocha CTP4"Para la versión CTP 4 de GeneXus Rocha que estamos próximos a liberar, hemos incorporado un nuevo diseño de la Start Page, y entre otros cambios, aparece una sección con una lista de GXextensions listas para descargar e instalar.

Como pueden ver en esta captura, al usar la opción de "Install", es posible descargar la extensión e instalarla automáticamente. Una vez hecho esto, GeneXus ofrecerá la posibilidad de salir y volver a entrar para que se cargue la nueva extensión.

Otra cosa que se puede notar en la imagen, es que Open Command Prompt de Marcos Crispino, que fuera la primera extensión hecha fuera de ARTech, es también la primera extensión compatible con la CTP4 y disponible a través de este mecanismo. Como los fuentes estaban disponibles a través de GXOpen, pudimos convertir la extensión a la versión CTP4, y aprovecharla para experimentar.

La segunda extension disponible para instalar, es Daily Dilbert, de la que hablaba en el artículo anterior. Pero la lista es totalmente abierta: aquellos interesados en saber cómo hacer para publicar sus extensiones pueden ponerse en contacto conmigo. Una vez publicadas, automáticamente aparecerán en la Start Page de todos los que estén usando la CTP4. ♦

Dilbert dentro de GeneXus Rocha

Imagen de "Dilbert dentro de GeneXus Rocha"Estamos a punto de liberar la CTP4 de GeneXus Rocha, y también su correspondiente GXextensions SDK.

Una de las novedades en este SDK es un nuevo proyecto ejemplo, llamado Daily Dilbert, que muestra cómo incorporar una ventana en el IDE de GeneXus que muestra diariamente una tira de Dilbert.

Más allá de Dilbert, creo que es un buen ejemplo de cómo utilizar XSL y RSS para mostrar contenido dinámico dentro de una ventana de GeneXus. Aquí lo que se muestra es una historieta, pero perfectamente podría ser cualquier otro tipo de información. Podrían ser cotizaciones, resultados deportivos, noticias, información interna de la empresa, o lo que se les ocurra.

El proyecto es muy parecido al ejemplo ToolWindow que ya existía. La única diferencia es el contenido del form, y la forma de cargarlo.

En el form, se colocó un control System.Windows.Forms.WebBrowser, indicando Fill para la propiedad Dock, de manera que ocupe todo el form.

Para cargar el contenido, se utiliza una transformación XSL precompilada, que es la encargada de construir el contenido HTML que cargaremos en el control, a partir del XML que obtenemos de un RSS. Pero vayamos por partes, para que no parezca complicado algo que en realidad es bastante sencillo.

En primer lugar tenemos un archivo XSLT que contiene las instrucciones acerca de cómo crear HTML a partir de un XML dado. Estas instrucciones las analizaremos luego, pero por el momento lo importante es que el contenido de ese archivo está disponible en la propiedad Transform de la clase Resources.

Dentro de la clase DilbertWindow, que es nuestra derivada de AbstractToolWindow, agregamos una propiedad para construir y almacenar nuestra transformación, de la siguiente manera:


private XslCompiledTransform transform;

public XslCompiledTransform Transform
{
get
{
if (transform == null)
{
XmlDocument xmlTransform = new XmlDocument();
xmlTransform.LoadXml(Resources.Transform);
transform = new XslCompiledTransform();
transform.Load(xmlTransform);
}

return transform;
}
}

Luego, hacemos override del método OnLoad(), para cargar el RSS, aplicarle la transformación y cargar el resultado en el control, utilizando el siguiente código:


protected override void OnLoad(EventArgs e)
{
StringWriter textWriter = new StringWriter(CultureInfo.InvariantCulture);
Transform.Transform("http://feeds.feedburner.com/tapestrydilbert",
new XsltArgumentList(),
textWriter);
webBrowser.DocumentText = textWriter.ToString();
}


El archivo XSLT que mencionábamos arriba es bastante sencillo. En forma resumida, escribe un documento HTML conteniendo únicamente una imagen con un link. Los datos para la imagen y para el link los toma del nodo del XML cuya ruta es /rss/channel/item/. Normalmente en el XML habrá más de un nodo item, por lo que se tomará el primero, que corresponde al último publicado. El contenido completo del archivo XSLT es el siguiente:


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>
<body>
<a target="_blank">
<xsl:attribute name="href">
<xsl:value-of
select="/rss/channel/item/link"/>
</xsl:attribute>
<img border="0">
<xsl:attribute name="src">
<xsl:value-of
select="/rss/channel/item/enclosure/@url" />
</xsl:attribute>
</img>
</a>
</body>
</html>
</xsl:template>
</xsl:stylesheet>