viernes, 29 de septiembre de 2006

Nueva apariencia para Google Reader

As of today, Google Reader has a new look — and even more important, a lot of new features

Official Google Reader Blog: Something looks... different.

Google Reader es un sitio que permite suscribirse a distintos sitios de noticias (mediante RSS o Atom). Lo único que se necesita tener es una cuenta de Google para empezar a usarlo.

La versión anterior me resultaba poco amigable, no tenía una interfaz fácil de usar cuando se tenían muchas suscripciones.

La nueva versión creo que ha mejorado mucho. Sobre todo el panel lateral, donde ahora se muestran las suscripciones agrupadas por categoría, y se indica la cantidad de elementos sin leer en cada suscripción. Era algo que sin duda le faltaba.

Vale la pena probarlo...

jueves, 28 de septiembre de 2006

GeneXus Extension: Open Command Prompt

Algo que siempre pensé que le falta a GeneXus, es una opción para abrir una línea de comandos en el directorio de la base de conocimientos.

Ahora con GeneXus Rocha, tenemos la posibilidad de hacer nuestras propias extensiones, así que decidí implementarlo...

Las extensiones se desarrollan en Visual Studio 2005 (o con Visual C# 2005 Express a partir del build que subieron hoy), y se desarrolla en C#. El SDK cuenta con un wizard que crea una primer instancia del proyecto, lo cual facilita bastante el proceso.

En la versión actual del wizard hay una forma de agregar una opción de menú, que no estaba en la primer versión, por lo que ahora debería ser más fácil hacer esto. De todas formas, siempre es bueno saber como hacer las cosas "a mano".

El proyecto para VS2005 se puede descargar de GXOpen. Si alguien quiere solo incorporar la extensión a GeneXus, lo puede hacer copiando el archivo GXCmdPrompt.dll (que está en GXCmdPrompt\GXCmdPrompt\bin\Debug) a la carpeta Packages debajo de la instalación de GX Rocha, y reiniciar GeneXus.

Para agregar esta funcionalidad, fue necesario modificar varios archivos:

  • un archivo XML donde se definen los componentes de la extensión (GXCmdPrompt.xml),
  • un archivo .resx de recursos (GXCmdPrompt.resx),
  • dos clases para que la opción de menú pueda realizar acciones (CommandKey y CommandManager),
  • y una clase para el paquete (Package).

Veamos en más detalle como implementar esta extensión.

GXCmdPrompt.xml

Lo primero que debemos hacer es crear el archivo GXCmdPrompt.xml, que tiene lo siguiente:

<?xml version="1.0" encoding="utf-8" ?>
<Package xmlns:gx='http://schemas.genexus.com/addin/v1.0'
id="f0c16daa-a732-43a9-b3eb-2a40824975cf"
name="GXCmdPrompt" >
<Resources>
<Resource type="strings" name="MCrispino.Packages.GXCmdPrompt.GXCmdPrompt"/>
</Resources>

<Commands>
<CommandDefinition id="OpenCommandPrompt" />
</Commands>
<Menues>
<Menu type="menubar">
<Popup name="Extensions" insertBefore="Help" >
<Command refid="OpenCommandPrompt" insertBefore="CopyModel" />
</Popup>
</Menu>
</Menues>
</Package>

El tag Package tiene un atributo id, que debe ser (obligatoriamente) el GUID de la clase Package, que se genera automáticamente cuando creamos la extensión con el wizard. Además tiene un atributo name, que indica el nombre del paquete.

Dentro de Resources, deben ir todos los archivos de recursos, en este caso el único era GXCmdPrompt.resx, que está en el namespace MCrispino.Packages.GXCmdPrompt.

Dentro de Commands deben ir los comandos, en este caso solo tenemos OpenCommandPrompt.

Dentro de Menues se define la estructura de los menues que vamos a tener, en este caso en la barra de menues aparece la opción Extensions (<Popup name="Extensions") antes de la opción Help (insertBefore="Help"). Dentro de este menú aparece el comando OpenCommandPrompt.

Dos comentarios importantes con respecto a este archivo:

  • La propiedad Build Action debe decir Embedded Resource, para que el archivo quede dentro del assembly.
  • Es conveniente configurar el Schema, poniendo la ruta completa al archivo GXPackageDeclaration.xsd, para tener intellitips en la edición.

GXCmdPrompt.resx

En el archivo de recursos lo único que se definió fue el texto que debe aparecer en el menú. Es un archivo que tiene pares de (nombre, valor), en este caso la única entrada es name=OpenCommandPrompt (igual que el comando), value=Open Command Prompt.

Package.cs

La clase Package se crea por defecto cuando se genera el paquete con el wizard. No voy a mostrar el código completo, para que funcione es necesario crear dos métodos:

private void LoadCommandTargets()
{
AddCommandTarget(new CommandManager());
}

public override Artech.Packages.Definition.Package GetPackageDeclarations()
{
try
{
return GetPackageDeclarationsFromResource("MCrispino.Packages.GXCmdPrompt.GXCmdPrompt.xml");
}
catch (System.Exception e)
{
System.Windows.Forms.MessageBox.Show("Error loading package GXCmdPrompt:\n" + e.ToString());
return null;
}
}

Además hay que invocar al método LoadCommandTargets en el método Initialize. Este método es el que agrega la funcionalidad al paquete, creando la clase CommandManager y agregándola como Command target.

El método GetPackageDeclarations, carga las definiciones del archivo XML que se describió más arriba.

CommandKeys.cs

Aún no me queda muy claro para que se necesita esta clase, pero así funciona :). Lo que se definen acá son los comandos, que luego se usan en la clase CommandManager. Pienso que no es necesaria, y que se podría usar new CommandKey(Package.guid, "OpenCommandPrompt") donde se usa CommandKeys.OpenCommandPrompt...

En todo caso, el código es:

public class CommandKeys

{

private static CommandKey cmdPrompt = new CommandKey(Package.guid, "OpenCommandPrompt");

public static CommandKey OpenCommandPrompt { get { return cmdPrompt; } }

}

CommandManager.cs

Esta es la clase que hace la mágia, es la que le da vida a la opción de menú que agregamos.

El nombre de la clase en sí no es importante, lo que debemos tener en cuenta es que debe heredar de la clase CommandDelegator.

En el constructor tenemos:

public CommandManager()
{
AddCommand(CommandKeys.OpenCommandPrompt, new ExecHandler(ExecOpenCommandPrompt), new QueryHandler(QueryOpenCommandPrompt));
}

donde:

  • tenemos una llamada al método AddCommand, que es el que registra el comando
  • el primer parámetro es CommandKeys.OpenCommandPrompt, que es el comando que definimos en la clase CommandKeys
  • el segundo parámetro es el método que se va a invocar cuando se haga click en la opción, en este caso ExecOpenCommandPrompt
  • el tercer parámetro es el método que se va a invocar para determinar si la opción debe estar habilitada o no, en este caso QueryOpenCommandPrompt

El método ExecOpenCommandPrompt está definido como

public bool ExecOpenCommandPrompt(object[] parameters)
{
IKBService kbserv = UIServices.KB;
if (kbserv != null && kbserv.CurrentKB != null)
{
string kbDirectory = kbserv.CurrentKB.Location;

Process p = new Process();
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("comspec");
p.StartInfo.Arguments = "/K cd /D " + kbDirectory;
p.Start();
}

return true;
}

Lo que hace es fijarse el directorio de la KB (primero verifica que haya una KB abierta), y luego invocar al cmd.exe (obtiene la ruta con System.Environment.GetEnvironmentVariable("comspec");) pasandole el comando necesario para posicionarse en el directorio de la KB. Por último devuelve true, para indicar que el evento fue procesado.

El método QueryOpenCommandPrompt está definido como

private bool QueryOpenCommandPrompt(ICommandAdapter adap, ref CommandStatus status)
{
status.State = CommandState.Disabled;

IKBService kbserv = UIServices.KB;
if (kbserv != null && kbserv.CurrentKB != null)
{
status.State = CommandState.Enabled;
}

return true;
}

Es decir, por defecto el estado (variable por referencia status) lo pone como deshabilitado, y solo si la KB está abierta lo habilita.

Conclusiones

La experiencia de construir esta extensión fue muy positiva, no solo por haber logrado desarrollar la extensión, sino también por el aprendizaje que queda.

Creo que es muy bueno tener un mecanismo para extender GeneXus. Si bien desarrollar estas extensiones no es trivial, es algo que se puede hacer sin demasiado esfuerzo (después que uno averigua donde tocar).

De aquí en más queda mucho por hacer. Para Artech, escribir lo más que puedan de documentación, implementar más wizards con los escenarios más comunes, y proveer ejemplos. Para la comunidad, desarrollar las extensiones que consideremos necesarias, que sin duda van a ser muchas.

jueves, 21 de septiembre de 2006

GeneXus en la onda Web 2.0

Ayer en la charla de GeneXus en el corto y mediano plazo, Nicolás Jodal comentó acerca de las nuevas tecnologías web, llamadas Web 2.0, y usó como ejemplo Writely, que es un editor de texto silimar a Microsoft Word, pero que se ejecuta dentro del navegador.

No es la única aplicación de este tipo, además de procesadores de texto existen planillas electrónicas, calendarios, herramientas para hacer presentaciones, etc.

Además mencionó como socio estratégico a Amazon, que hace poco lanzó un servicio que permite utilizar su infrastructura (la de Amazon) para ejecutar aplicaciones.

Estos dos comentarios me hicieron pensar, que no sería demasiado dificil tener una versión de "GeneXus Web 2.0". Es decir, una versión de GeneXus que se ejecute en un navegador con una interfaz con AJAX, que esté en un servidor, y que se pueda contratar por tiempo de uso (por ejemplo, tiempo de especificación y de generación).

Si bien una aplicación así no sería para todo el mundo, creo que podría traer muchas ventajas:

  • poder desarrollar con GeneXus desde cualquier PC, sin necesidad de hacer ninguna instalación
  • tener la posibilidad de realizar proyectos colaborativos (verdaderos Collaborative Proyects, donde haya gente de distintas partes del mundo trabajando sobre el mismo proyecto al mismo tiempo)
  • desarrollar aplicaciones con GeneXus sin necesidad de comprar una liciencia, simplemente alquilando el tiempo necesario para el desarrollo
  • mayor facilidad para la prototipación de aplicaciones web, ya que si GeneXus está en un servidor, las aplicaciones web generadas se podría instalar automáticamente en ese servidor sin necesidad de contar con ningún tipo de infrastructura en el cliente.

Creo que sería muy interesante ver una versión de GeneXus con estas características.

XVI Encuentro Internacional GeneXus

Esta semana, de lunes a miércoles se llevó a cabo el XVI Encuentro Internacional GeneXus.

Charlas

Rocha: un panorama de la próxima versión de GeneXus, partes 1 y 2

Se presentó la nueva versión de GeneXus, de nombre Rocha, que cuenta con muchas funcionalidades interesantes a pesar de ser una versión CTP (previo a una versión beta).

En la primera parte se realizó una demo donde se mostraron las funcionalidades, y en la segunda parte se hizo una presentación teórica de las mismas.

Entre las cosas más destacables se encuentran:

  • Nuevo ambiente de desarrollo mucho más moderno que la versión anterior
  • La eliminación del modelo de Diseño (o al menos que sea transparente para el usuario)
  • Mejoras en las reorganizaciones, se usa más SQL y además es posible ver las sentencias que se van a ejecutar en el listado de la reorganización
  • Mejoras en las fórmulas, deja de existir la diferencia entre las fórmulas verticales y las aggregate-select, y además se optimiza la generación
  • Nuevo tipo de objeto DataProvider que encapsula lógica que puede ser reutilizada

Además se realizó el lanzamiento del proceso de beta-testing de la versión, que ya está disponible para bajar.

Reutilizando conocimiento en la versión Rocha : Fórmulas y Data Providers

Se profundizó más en las mejoras que se hicieron a las fórmulas, y en el nuevo tipo de datos DataProvider.

El DataProvider es un objeto muy interesante, que permite definir condiciones, órdenes, parámetros, etc. que luego pueden ser usados en otros objetos como procedimientos o web panels.

Rocha y más allá: Extensiones para GeneXus Rocha

Además de las nuevas funcionalidades que trae la versión Rocha, también cuenta con herramientas de desarrollo (SDK para Visual Studio 2005) que permiten realizar extensiones de una forma que parece ser muy sencilla.

De hecho, esta versión de GeneXus se compone del núcleo del ambiente de desarrollo, y todo lo demás son extensiones, incluidos los generadores, los distintos editores, los objetos, etc.

Cara a Cara GeneXus IDE

En general de los "cara a cara" no hay mucho para decir. En este en particular, algo para destacar es que muchas de las respuestas fueron del tipo "eso va a estar en la versión Rocha". Para los que todavía estamos con la versión 8.0, puede ser algo preocupante...

Potenciando la Comunidad GeneXus: Collaborative Projects

Se realizó una presentación genérica contando el funcionamiento de los Collaborative Proyects, y los casos de exito que ya fueron llevados a cabo.

Comunidad: experiencias en el desarrollo de Collaborative Projects

Se contaron con un poco más de detalle las experiencias de tres de los proyectos colaborativos: ForumSR, GXUnit y SummarizedBy Pattern.

Café con Pattern "SummarizedBy"

En esta charla solo estuve un rato al final, lo más destacable es el formato de los "Café con..." donde un grupo de personas con un interes en común se sientan a conversar del tema, con la presencia de gente de Artech.

GeneXus en el corto y mediano plazo

En esta charla Nicolás Jodal presentó su visión de cual es el futuro de GeneXus y del desarrollo de aplicaciones en general.

Las tres plataformas que siguen fuertes son Java, .net y LAMP. De estas la única que no está disponible en GeneXus es LAMP (falta el generador PHP), pero se está trabajando en esto. Aunque aún no han decidido si hacer un generador PHP o un generador Ruby.

También comentó acerca de otras tecnologías que están creciendo en adopción, como son RSS y Web 2.0.

Participación

En lo que a mi respecta, me tocó participar de la charla Comunidad: experiencias en el desarrollo de Collaborative Projects, debido a que participé del desarrollo del SummarizedBy Pattern, que fue uno de los proyectos presentados en esta charla.

Además, Concepto participó de otras charlas:

  • SummarizedBy Pattern – Un ejemplo de cómo desarrollar tu propio pattern
  • Café con Pattern "SummarizedBy"
  • Seguridad en aplicaciones GeneXus - Algunos consejos prácticos.

Conclusiones

En general todos los encuentros GeneXus tienen un tema que es el que se destaca. Creo que este año fue GeneXus Rocha, por toda la expectativa que genera esta nueva versión.

Además hubieron otros dos temas que también tuvieron mucha fuerza, que fueron las charlas del K2B (es el nuevo ERP de Artech) y los proyectos colaborativos, de los cuales el SummarizedBy Pattern creo que fue el más destacado.

En general las charlas a las que fui fueron de buen nivel. Me quedé con ganas de ir a otras que no pude por falta de tiempo, alguna de ellas ya las veré en video.

martes, 12 de septiembre de 2006

Búsqueda de imágenes con FlickrStorm

FlickrStorm es un sitio que permite realizar búsquedas de imágenes en Flickr, pero con una interfaz de usuario que me resulta mucho más práctica.

Los resultados se muestran en forma más compacta, que permite ver más fotos sin necesidad de ir a otra página. Al hacer click en una imagen no me saca de la pantalla de resultados, sino que muestra la imagen seleccionada a un costado.

Además, mantiene una lista (siempre visible) con las fotos que acabo de visitar, y tiene la posibilidad de "guardar" un conjunto de fotos seleccionadas. Las comillas son porque lo que en realidad hace, es generar una página web con todas las imágenes seleccionadas, que queda en el servidor y que se puede visitar en cualquier momento.

Desde hace un tiempo es el sitio que uso para buscar imágenes, me gusta más que las búsquedas de imágenes de Google y de Yahoo!. Creo que vale la pena probarlo.

Blogged with Flock

lunes, 11 de septiembre de 2006

GeneXus Rocha CTP

The first CTP is going to be released in the GeneXus XVI International Meeting.It will be announced and showed on Monday morning's sessions.

Welcome to GeneXus Rocha

Este lunes se liberará una primer versión (Community Technical Preview) de GeneXus Rocha.

Si bien esta primer versión aparentemente tendrá muchas limitaciones, también parece tener muchas funcionalidades interesantes:

  • IDE: por las fotos que he visto, GeneXus Rocha mejora mucho la interfaz del ambiente de desarrollo.
  • Data providers: es un nuevo tipo de objetos, que permite reutilizar navegaciones.
  • Formulas: se eliminan algunas restricciones que tenían las fórmulas, y además se optimiza la generación de las sentencias SQL.
  • Búsqueda de objetos: se van a poder realizar búsquedas por texto en los objetos, y también por propiedades.
  • Reorganizaciones: se podrá ver el SQL correspondiente a las reorganizaciones antes de ejecutarlas!, además de otras optimizaciones.
  • Workflow: la herramienta GXFlow estará mucho más integrada al ambiente de desarrollo.
Va a ser interesante probar esta primer versión, para jugar con estas nuevas funcionalidades.

Blogged with Flock

sábado, 9 de septiembre de 2006

CAPTCHA Image

En muchos sitios de Intrernet, por ejemplo cuando nos queremos registrar en algún sitio, o cuando queremos escribir un comentario en un blog (como en este), se nos pide que ingresemos el texto que se muestra en una imagen que aparece distorcionada.

Más allá de las molestias que esto parece causar, existe una buena razón para usar este tipo de controles: permiten diferenciar entre un usuario humano y una máquina.

CAPTCHA significa Completely Automated Public Turing test to tell Computers and Humans Apart, es decir Prueba de Turing pública y automática para diferenciar a máquinas y humanos.

La imagen mostrada contiene un texto que es relativamente simple de leer para un humano, pero no es para nada fácil hacer un programa que lea el texto. De esta forma se evita que se use un programa para registrarse al sitio, ingresar comentarios, o lo que sea que se quiera restringir.

Hace unos días me encontré con la necesidad de incorporar una de estas validaciones en una aplicación web, para lo cual estuve buscando implementaciones en Internet (para ASP.NET 2.0), y encontré un muy buen artículo en The Code Proyect, con el código fuente.

También se puede ver más información en Wikipedia.

viernes, 1 de septiembre de 2006

Flock

Flock es un navegador web basado en Firefox, y que agrega varias funcionalidades bastante interesantes.

Bookmarks (marcadores/favoritos)

Cuando se agrega un marcador a una página web en Flock, existe la posibilidad de almacenarlo en forma local, o de publicarlo en algún sitio en Internet. Los dos servicios que están disponibles son del.icio.us (que es el que estoy usando) y Shadows.

Además, en el campo de búsqueda, aparecen primero los favoritos que cumplen la condición, tanto los locales como los que están publicados en Internet.

Esta forma de almacenar y buscar los favoritos tiene varias ventajas:

  • al almacenarlos en un sitio web, están disponibles desde cualquier lugar donde los quiera ver
  • buscar un marcador es mucho más fácil escribiendo unas pocas letras, que tratar de recordar en que carpeta está

Feeds

La interfaz que utiliza Flock para suscribirse y para leer las suscripciones web (RSS Feeds) me resulta muy cómoda y facil de usar.

En las páginas que publican RSS o Atom, aparece un ícono anaranjado (igual que en Firefox y ahora en Internet Explorer 7). Al hacer click sobre este ícono, aparece una página donde se muestra el contenido del sitio, y un botón que permite suscribirse al mismo.

Flock cuenta con un panel lateral llamado "My News", donde se muestra cada una de las suscripciones junto con un número que indica la cantidad de noticias sin leer. Al hacer click sobre alguna de estas, se muestra una página web donde aparecen primero las noticias no leidas, luego las salvadas y por último las ya leidas.

Blogs

Una funcionalidad muy interesante es poder escribir en un Blog directamente desde el navegador.

En Flock es posible configurar varios Blogs, y en cualquier página con el botón secundario del ratón aparece una opción del menú contextual que dice "Blog this", que crea una nueva entrada de Blog con el contenido seleccionado, y que puede publicarse en cualquiera de los sitios configurados.

Aunque es bueno tener esta funcionalidad en el navegador, para notas más elaboradas, prefiero usar Windows Live Writer (donde estoy escribiendo esta nota), porque hereda el estilo del Blog, y por lo tanto a medida que escribo ya voy viendo como va a quedar. En Flock, si bien es un editor HTML, no se puede ver como va a quedar la nota publicada antes de hacerlo.

Imágenes

La integración que tiene Flock con Flickr es muy interesante. Además de poder configurar una cuenta y poder subir imágenes sin necesidad de ir al sitio de Flickr, cuenta con una barra donde se pueden ver las imágenes de un determinado usuario.

Por ejemplo, si estoy viendo una imágen en Flickr, al pasar el puntero del ratón sobre la imagen aparece un ícono, y haciendo click se despliega la barra de imágenes mostrando todas las imágenes del usuario que publicó esa foto.

Otras funcionalidades

  • Búsqueda en el historial: junto con la búsqueda en los favoritos como se comentaba más arriba, al buscar desde el navegador aparecen los resultados de la historia.
  • Snippets: permite almacenar texto o imágenes de cualquier página web que se esté visitando para utilizarlos más adelante.

Desventajas

  • La versión disponible aún es una versión beta, por lo que puede no ser aconsejable para todos los usuarios. Sin embargo, es suficientemente estable como para usarlo sin problemas.
  • Está basado en Firefox 1.5, y no en la versión 2.0 (que también está en beta). Es inevitable que en este aspecto siempre esté un paso atrás.
  • La cantidad de extensiones disponibles, que es uno de los puntos fuertes de Firefox, no es tan grande como los disponibles para Firefox, aunque he encontrado que la mayoría de las extensiones que usaba sí están disponibles para Flock.

Conclusión

Actualmente es el navegador que estoy usando, por lo que puedo recomendarlo.

Lo que más me gusta es la forma en que maneja las suscripciones a páginas web y también la posibilidad de buscar entre los favoritos. La integración con otros sitios como Flickr o Blogger es muy interesante también.

Creo que vale la pena probarlo, y comenzar a utilizar las funcionalidades con las que cuenta.