Crónica de la Grails Exchange 2010 en Londres (parte 2)

Ha pasado más de una semana desde que finalizó la Grails Exchange. Tenía el post a medio escribir desde el sábado que tenía que haber vuelto a Madrid, pero los aeropuertos de Londres no han funcionado con normalidad y hemos sido muchos los que nos hemos quedado casi hasta nochebuena allí atrapados. Yo al menos tuve suerte, el miércoles 22, y tras dos intentos fallidos, mi avión despegó y pude volver a tiempo, aunque me consta que ese mismo día hubo bastantes cancelaciones. Tras pasada nochebuena y navidad, por fin he tenido algo tiempo para terminar esta crónica de la Grails Exchange.

El segundo día de la Grails Exchange estuvo dedicado casi en exclusiva a Grails (ver la crónica del primer día aquí), fue un día muy productivo, con charlas muy interesantes y grandes figuras. A continuación un resumen de las ponencias más destacadas:

Keynote – In Search of the Grail of Developer Productivity

A Grails Roadmap Update

En esta keynote, Graeme Rocher comienza contando un poco la historia de Grails y cita algunos sitios interesantes desarrollados con esta herramienta como eHarmony, Northwestern Memorial Hospital y Hashable. Acto seguido pasa a hacer una demostración en vivo sobre el uso de Spring Insight con Grails desde SpringSource Tool. En este mismo blog ya hemos hablado antes sobre Spring Insight (posts y seminarios), así que es gratificante ver como Graeme apuesta por esta herramienta también para monitorizar aplicaciones Grails, ya que a nosotros también nos parece una herramienta muy buena de análisis y profilling.

Después pasa a comentar las novedades que lleva la versión 1.3 (la versión 1.3.6 fue liberada el miércoles, hacía tan solo 3 días) que son Groovy 1.7, JUnit 4, chaining named criteria y soporte para repositorios Maven. Nos cuenta que ha estado bastante ocupado trabajando en los plugins NoSQL para MondoDB, RedisRiak y Gemfire y una gran cantidad de nuevos módulos de autenticación para Spring Security. Y cita las novedades para Grails 1.4:

  • Actualización a Groovy 1.8, Hibernate 3.6 y Spring 3.1
  • Mejoras en el autocargado de clases al modificarlas en caliente (nos dice que no le gusta como está y que tiene que mejorarlo)
  • Nuevas funcionalidades para Gorm como migraciones, ingeniería inversa (que ya está disponible como plugin), herencia abstracta y un mejor soporte para tests.
  • Mejor manejo de los recursos estáticos (más adelante hay una ponencia de Marc Palmer sobre esto)
  • Cambio de Prototype por jQuery como framework Javascript por defecto.

Después continúa con la demo en vivo sobre el uso de criteria querys y named querys funcionando completamente con el plugin NoSQL inconsequential (usando un ConcurrentHashMap)

Finalmente comenta las nuevas mejoras que tendrá Grails 2.0, que saldrá en diciembre de 2011 como Gorm for REST (al salvar una clase de dominio con save(), invoca una llamada http PUT, y al leer hace un GET, etc. de manera transparente, al estilo como lo hace Ruby on Rails) y Scaffolding con Ajax con una nueva taglib para scaffolding.

Ver vídeo de la ponencia.

What’s hot in Grails land

En esta ponencia Peter Ledbrook hace un repaso a los plugins más interesantes y populares de Grails. Entre ellos cita:

  • Resources plugin, que se puede usar en combinación con zipped resources y cached resources (los tres del mismo autor, Marc Palmer, que después hará una ponencia específica sobre estos plugins) y cuyas características principales son:
    • Empaquetar recursos estaticos en modulos reutilizables entre GSPs.
    • Cachear y zipear los recursos para servir paginas más rápido.
    • Identificadores únicos de recursos a partir de su hash.
    • Añadir cache headers a los recursos estaticos. YSlow.
  • Spring Cache plugin que permite:
    • Cache de contenidos. Podemos usar en nuestros controladores las anotaciones @Cacheable(“x”) para activar la cache y @CacheFlush(“x”) para eliminarla (en un save por ejemplo)
    • Cache de metodos de servicios.
    • Cache de fragmentos de paginas, de taglibs, control de cabeceras.
  • Markdown plugin: un taglib que permite utilizar la sintaxis Wiki en tus gsps.
  • Bean Fields plugin: generación simplificada de formularios (obtiene automáticamente el tipo de input según el tipo del dato, visualiza los errores automáticamente):
    <bean:withBean beanName="form">
    <bean:field property="firstName"/>
    <bean:field property="lastName"/>
    <bean:field property="company"/>
    <bean:field property="email"/>
    </bean:withBean>
  • Reskin plugin que permite usar HTML5
  • Melody, un plugin de monitorización
  • Pretty time, un etiqueta  <prettytime:display date="${someDate}" /> que genera “right now”, “2 days ago”, or “3 months from now”
  • Itunes service, un plugin que se conecta a los servicios web de Apple de Itunes y permite hacer búsquedas.

Ver vídeo de la ponencia.

Design for simplicity

Glenn Saqui y Dave Scott, de sky.com, una compañía de entretenimiento y broadcasting de vídeo, nos cuentan la arquitectura de sus 7 portales que han realizado integramente con Grails y Groovy (98% de código es Groovy, 2% Java). Incluso los scripts de administración están escritos en Groovy. Tienen 6 millones de hits al día y más de 30 editores trabajando constantemente para añadir contenidos.
Solo usan un único war para todos sus portales, delegan los diferencias de configuración en archivos externos. Cachean todo lo posible, incluso cachean contenidos estáticos en los propios ordenadores clientes de los editores, mientras que para datos públicos, delegan los recursos en CDNs. Tienen pruebas funcionales de prácticamente todo y su primera regla es que todo sea lo más simple posible. Una ponencia que demuestra con un ejemplo real que el uso de Grails en servidor no penaliza (yo mismo defiendo esa idea en “¿se puede realizar una GRAN aplicación con Groovy y Grails?“)

Ver vídeo de la ponencia.

Introducing the new static resources framework for Grails

Aquí Marc Palmer, commiter de Grails, creador de Wecemm (un CMS  que se puede usar como aplicación independiente, o como plugin Grails para tu proyecto) y creador de los plugin static-resource, cached-resources y zipped-resources nos cuenta en que consisten estos tres plugins, que pasarán a formar parte del core de Grails en siguientes versiones.
Statis-resources es un plugin que permite definir los recursos (imagenes, css, javascript) de nuestras aplicaciones Grails en módulos, de manera que estos luego puedan ser usados desde nuestras páginas y layouts GSP. Soluciona el problema que supone que tanto la aplicación principal como cada uno de los plugins que esta usa posean cada uno sus propios css, javascript y recursos, dando lugar a lo que el llama “Optimizacion hell”: ¿quién (tu aplicación, el plugin A, el plugin B) es el que debe incluir los recursos y en que orden? Además, con este plugin podemos empaquetar nuestros estáticos fuera del archivo WAR para que puedan ser servidos desde un Apache o cualquier otro servidor HTTP, de esta manera podemos liberar a nuestro servidor de aplicaciones (o contenedor de Servlets) de la pesada tarea que es servir estáticos. Durante la ponencia, Marc muestra como utilizar y sacarle provecho, paso a paso, todos estos tres plugins.

Ver vídeo de la ponencia.

Grails Sans SQL

Graeme nos cuenta en esta ponencia que el futuro de las aplicaciones Web tiende a usar otros sistemas de almacenamiento distintos a las bases de datos relacionales. Grails incorpora de serie el acceso a un gran número de bases de datos diferentes con Gorm, gracias al uso que hace de Hibernate por detrás, así que es necesario llegar a otro tipos de manera de guardar nuestros datos que no sean tablas, relaciones, columnas y filas. El reto de Graeme es que los programadores de Grails puedan usar todas estas nuevas bases de datos NoSQL sin usar Apis específicas, solo con Gorm.
Primero hace un repaso sobre los diferentes tipos de bases de datos NoSQL:

  1. Document Stores (CouchDb y MongoDb)
  2. Column Family Stores (Cassandra, Bigtable)
  3. Grapth Tree (Neo4J, JCR)
  4. Map structures (Redis, Riak, Gemfire)

Y nos presenta Inconsequential: una abstracción sobre Gorm que soporta Redis, Gemfire, Riak, MongoDb y ConcurrentHashMap (actualmente está trabajando en Cassandra, CouchDb y JCR) y pasa a la práctica con una demo de Gorm con Redis: creando un proyecto desde cero y arrancando un servidor local de Redis (arranque instantáneo) y una consola para consultar el contenido de la “base de datos”. Es necesario indicar en el mapping de nuestras clases de dominio los campos por los que vamos a realizar consultas con index:true. Redis es un sistema de almacenamiento de pares clave/valor y permite almacenar tipos de datos ricos: strings, lists, sets y sorted set. Los datos se van guardando en memoria y posteriormente se van volcando a disco. Permite replicación master/slave replicación y tiene un rendimiento excelente (+100.000 lecturas/escrituras por segundo). La demo consiste en operaciones de creación, modificación, búsqueda y borrados sobre Redis usando solamente clases de domínio y Gorm.

La segunda demo consiste en realizar una aplicación en Grails con scaffolding usando Gemfire. Como nota adicional en este motor de base de datos NoSQL, es posible utilizar el espacio de nombres cq dentro de todas las clases de dominio con el que hacer búsquedas contínuas. Este tipo de búsquedas se realizan en background y ejecutan un Closure como evento cada vez que se encuentran valores definidos en la propia consulta (al guardar o sincronizar entre servidores). La tercera y última demo consiste en reutilizar la aplicación sin modificar el código simplemente desinstalando el plugin de Gemfire, instalando el de MongoDb y reiniciando. La conclusión final es que el soporte para base de datos NoSQL en Grails está bastante avanzado, al menos de manera básica, para un número considerable de sistemas y que poco a poco se irán añadiendo más.