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>

miércoles, 11 de abril de 2007

Dos medialunas de frente

Imagen de "Dos medialunas de frente"Era viernes a las seis de la tarde y sabiendo que necesitaba quedarme a trabajar hasta la noche, decidí acudir al local de Subway, que está en la planta baja de nuestro edificio (@3 de ZONAMERICA) en busca de un par de medialunas rellenas.

Mientras esperaba que me atendieran, pude notar que si bien no había a la vista ninguna ya preparada, más atrás, desde dentro de una caja plástica, asomaba lo que sin dudas era una bolsa conteniendo unas cuantas medialunas. Lo peor que podía pasar, me dije, era que tuviera que esperar a que me las rellenaran. Pero claro, si la vida fuera tan simple, no estaría escribiendo este artículo.

— Dos medialunas rellenas para llevar, por favor — le dije al muchacho que me atendió.
— No, no me quedan.

Hmm... ¿quizá no sabía de la bolsa que yo estaba viendo detrás de él? ¿Tal vez sabía pero prefería mentirme para no tener que rellenarlas? Veamos:

— ¿Qué es lo que hay en aquella bolsa? — con mi mejor cara de inocente.
— Er... bueno sí, medialunas, pero no te puedo vender — con cara de total desconsuelo.

A continuación se lanzó a explicar algo que en mi perplejidad fui incapaz de comprender pero que hablaba de cantidades semanales, cantidades por día, y no sé qué otras cosas. Intenté cortar camino:

— Decime, ¿no podés simplemente agarrar dos medialunas de aquella bolsa, rellenarlas, y vendérmelas?
— No. Te entiendo... pero no, no te las puedo vender — y doy fe de que por su cara realmente entendía lo absurdo que era todo esto.
— ¿Y entonces esas medialunas para qué son?
— Son para vender mañana — ¡Plop!

Comprendí que toda argumentación adicional era en vano. En el fondo, guardo la esperanza de que realmente exista una razón lógica por la cual Subway prefiere no vender medialunas un día, para así poder vender medialunas viejas al siguiente, y deseo de todo corazón, que algún día alguien pueda explicármelo. Mientras tanto, me confieso incapaz de comprenderlo. ♦

lunes, 9 de abril de 2007

Ya es hora

Imagen de "Ya es hora" La verdad es que nunca pensé que lo arreglaran tan rápido. Quiero decir, rápido con respecto al artículo anterior sobre ANCEL, en el que indicaba que el servicio de sincronización horaria para los celulares, no daba la hora correcta.

Por supuesto que, con respecto al 12 de marzo, sigue siendo casi un mes pero, justo es decirlo, aunque hayan tardado, al menos lo corrigieron.

No sé en qué momento fue que hicieron el arreglo, pero yo lo noté el sábado pasado (7 de abril), como a las 11 de la noche.

Nada más; para que conste, como debe ser. ♦

miércoles, 4 de abril de 2007

Ni la hora

Imagen de "Ni la hora"Cuando compré mi teléfono celular, allá por fines del 2005, intenté configurarlo para que actualizara la hora automáticamente de ANCEL, pero lamentablemente ese servicio no funcionaba.

Más recientemente, cuando pasamos del horario de verano (GMT -0200) a nuestro horario habitual (GMT -0300), ya que andaba por los menúes de configuración de la hora, volví a intentarlo y descubrí con alegría que ahora sí funcionaba. La alegría duró poco, ya que lamentablemente, la hora no era la correcta; todavía estaba con el horario de verano.

Dado que el cambio se había hecho recién en la noche anterior, y ese día era domingo, decidí darle el beneficio de la duda y esperar, confiando en que al día siguiente, actualizarían la hora. Eso fue el 12 de marzo, y aún estoy esperando.

Mi duda es ¿llegarán a arreglarlo en algún momento o esperarán a que volvamos al horario de verano para que se arregle solo? ♦