KEMBAR78
Blog de Iván López: Grails
Mostrando entradas con la etiqueta Grails. Mostrar todas las entradas
Mostrando entradas con la etiqueta Grails. Mostrar todas las entradas

domingo, 27 de octubre de 2013

Codemotion 2013

El pasado fin de semana tuvo lugar la segunda edición de Codemotion en el que participé, además de como representante de Madrid-GUG, como ponente.

Para el que no lo conozca, Codemotion es un evento por y para las comunidades. Es un punto de encuentro en el que nos reunimos todas las comunidades: Groovy, Java, Python, Ruby, Php,... A lo largo de dos días, 8 tracks y más de 100 charlas se han reunido en el Campus Sur de la Universidad Politécnica de Madrid más de 1500 personas para hablar y disfrutar de su pasión.

En cuanto a las charlas, las del viernes me parecieron más flojas que las del sábado, aunque también es cierto que el viernes hubo muchas charlas de patrocinadores que no me llamaban tanto la atención. La organización fue muy buena teniendo en cuenta el número de asistentes y todo lo que había que coordinar.

Para los que estén interesados en mi charla, a continuación teneis las slides y el código fuente de las demos se encuentra disponible en mi github.

domingo, 27 de enero de 2013

Ponente en Greach 2013 e impresiones

El pasado viernes 25 de Enero empezó la 2ª Edición de Greach que en esta ocasión ha durado dos días. Este año he tenido la suerte de asistir como ponente y dar una charla con el título Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails. Al principio estaba muy nervioso pero al final todo salió muy bien. De hecho, mucha gente me comentó después que les había gustado mucho la charla y que habían aprendido unas cuantas cosas. ¡Muchas gracias a todos!

Respecto al resto de las charlas, mis comentarios:
1.- Keynote Groovy 2.0 update: Cedric Champeau fue el encargado de la Keynote de apertura. En esta ocasión Guillaume Laforge no pudo venir aunque conectamos con él via chat y anunció la publicación de Groovy 2.1.0 en la Keynote. La keynote fue muy parecida a la que vi en diciembre en el Grails Exchange de Londres.
2.- Road to Grails 3.0: Graeme Rocher fue el encargado de contarnos la novedades que vendrán en las próximas versiones de Grails.
3.- Hybrid mobile app in minutes, not days: Charla por Fabrice Matrat, Sebastien Blanc y Corinne Krych que crearon en 45 minutos un pequeño clon de Foursquare con el plugin html5 mobile scaffolding. La charla fue muy interesante y la parodia que hicieron durante la presentación fue muy divertida. "Hello, Mr.very-very-rich man" :-P
4.- Test motherFucker... Test!!!: Mario García nos contó qué plugins utiliza él durante los tests de sus aplicaciones Grails y cual es la aproximación que realiza a la hora de testear la aplicación.
5.- Cómo crear una plataforma de libros electrónicos: Roberto Martin y Alberto Vilches nos contaron su experiencia real en una plataforma de libros electrónicos, los problemas que han ido encontrando y cómo los han superado.
6.- vert.x - Effortless asynchronous application development for the modern web and enterprise: Aunque inicialmente la charla la iba a dar Stuart Williams, al final no pudo asistir y fue su compañero Stéphane Maldini el que la dio. No estuvo mal aunque me esperaba un poco más.
7.- Buscando (y encontrando) la pareja ideal. Taller de desarrollo de aplicaciones Web con Grails 2: Taller para el desarrollo de una aplicación Grails por parte de Fernando Redondo. Aunque muchas cosas ya las sabía, aprendí algún pequeño truco.
8.- A GPars Programming Workshop: Taller de lujo con Russel Winder sobre GPars. Aunque fue un taller la verdad es que no hubo demasiado tiempo para programar.
9.- From big-GORM-centered into a cloud of fast nodes: Jorge Uriarte nos contó cómo han adaptado la plataforma TicketBis desde una "simple" aplicación Grails con tomcat, mysql, terracotta,... a una más moderna con Redis y nodos "ligeros" para poder seguir creciendo y soportando la carga.
10.- Testing the Grails Spring Security Plugins: Interesante charla de Burt Beckwith en la que nos mostraba distintas alternativas para probar Spring Security.
11.- Building a scalable API with Grails: Tanausú Cerdeña nos contó cual fue el proceso de creación y las distintas decisiones de diseño que tomaron en la creación del API de Geosophic.

Como veis, dos días muy intensos llenos de Groovy/Grails y demás tecnologías.

No quiero terminar sin dar la enhorabuena a Alberto Vilches por el gran trabajo de estos últimos meses y por arriesgar tanto para dar lo mejor a todo el mundo: Cambio de ubicación a un hotel en pleno centro de Madrid en lugar de en las afueras, dos días de conferencias en lugar de uno, aumento del precio de 10€-20€ a 90€-120€ (si compraba en early-bird o no), comida excelente en el restaurante del hotel,... Creo que ha sido magnífico y todos hemos quedado encantados. ¡Kudos!

Ah, y finalmente, por si hay algún interesado, las slides de mi charla:

ACTUALIZADO: Ya está disponible el video, aunque es una pena que los primeros 2-3 minutos de la presentación no estén.

jueves, 27 de diciembre de 2012

Pusheame: Notificaciones push al navegador

Esta semana pasada, en Kaleidos hemos celebrado la 3ª Edición de nuestra PiWeek. Aunque en la web viene explicado lo que es, la PiWeek es la Personal Innovation Week y básicamente consiste en que cada 6 meses, "cerramos" una semana para hacer proyectos de innovación. Existen únicamente dos reglas, sólo se permite usar software libre para el desarrollo y al final de la semana hay que hacer una demo funcional.

En esta ocasión he aprovechado la semana para probar los plugins de grails platform-core y events-push de los que ya hablé en mi anterior artículo sobre la Groovy & Grails eXchange.

La idea que hay detrás de "notificaciones push" del servidor al cliente es enviar información en tiempo real al navegador justo en el momento en que se obtiene. Normalmente, cuando desde una aplicación web queremos actualizar un contador, número de mensajes,... lo que solemos hacer es preguntar cada cierto tiempo (10-30 segundos) al servidor si hay mensajes nuevos. Esto implica estar constantemente haciendo llamadas al servidor y además tener un pequeño retraso en la obtención de los mensajes. Con el paradigma push es el servidor el que envía los datos al cliente sin que éste tenga que estar preguntando constantemente.

Mi idea era hacer una pequeña prueba de concepto haciendo push de números aleatorios desde el servidor al cliente. Una vez conseguido, he utilizado el API en tiempo real de Instagram para obtener fotos geolocalizadas e irlas mostrando en un mapa y en un muro.

El resultado es Pusheame, que se encuentra desplegado en http://pusheame.cloudfoundry.com.
Una vez ahí existen dos páginas de pruebas, el mapa, que muestra fotos geoetiquetadas de 28 ciudades de Estado Unidos.



y el muro, que muestra esas mismas fotos en formato muro o album de fotos:



Lo único que tenéis que hacer es abrir el navegador y esperar a que vayan apareciendo las fotos automáticamente.

Si no quieres esperar también puedes ver este pequeño vídeo que he hecho.

Pusheame: Instagram Real-Time pictures from Iván López on Vimeo.


Como indico en la página, para los curiosos, el código fuente del proyecto se encuentra disponible en mi cuenta de github: https://github.com/lmivan/pusheame.

Si perteneces a una empresa tecnológica y te gustaría participar en la próxima edición de la PiWeek, no dudes en contactar con nosotros.
En la primera edición celebrada en diciembre de 2011 sólo participamos Kaleidos. En la segunda edición de julio de 2012 participaron junto con nosotros Secuoyas y Yaco, y finalmente, en esta tercera edición se han apuntado de nuevo Secuoyas y también Wadobo.

martes, 18 de diciembre de 2012

Groovy & Grails eXchange 2012 en Londres

El pasado jueves y viernes (13 y 14 de diciembre) estuve en el Groovy & Grails eXchange 2012 en Londres (GGX). Se trata de una de las conferencias más importantes en torno a Grails, Groovy, Griffon,... de Europa.

Las charlas estaban divididas en dos tracks y en casi todas elegí las de Grails.

1.- Keynote on Groovy: Guillaume Laforge abrió la keynote contando novedades de la versión 2.0 de Groovy: Un core más modular, uso de invokeDynamic, las nuevas transformaciones para comprobación de errores de compilación... Interesante saber hacia dónde se dirige el lenguaje en las próximas versiones.

2.- Grails for Hipsters: Espectacular charla de Robbert Fletcher en la que usando Grails, Vertx, Handlebars, Backbone y un montón de tecnologías hacía un clon de Instagram con publicaciones push, ajax,... Realmente instructiva y con el código fuente disponible en github.

3.- Using Grails Platform Core: Marc Palmer nos contó el nuevo plugin Platform-Core que ha desarrollado junto a Stephane Maldini y que pretende sentar las bases de un nuevo API sobre el que desarrollar nuevos y potentes plugins. Incluye abstracciones de Seguridad, Navigación, UI, y, para mí la parte más interesante, Events.

4.- Under the hood: Using Spring in Grails: Desde hacía tiempo tenía ganas de asistir a una charla de Burt Beckwith y no me decepcionó. Contó cómo integrar Spring clásico en Grails, Inyección de Dependencias, distintas formas de interactuar y engancharnos al ciclo de vida de los beans,... Muy útil y formativa.

5.- Theming & UIs with Grails Platform UI: De nuevo Marc Palmer no habló sobre Platform Core, pero está vez centrado en la parte de UI. Las distintas abstracciones, taglibs,... que ha desarrollado para poder hacer interfaces en las que cambiar el diseño sea tan sencillo como descargar e instalar un nuevo tema de manera similar a como se hace con Wordpress.

6.- Leveraging Social Media in Grails: Para terminar el día, Bobby Warner nos contó los distintos plugins y librerías que existen en la actualidad para integrar nuestras aplicaciones Grails con las distintas redes sociales: Facebook, Twitter, Google+, LinkedIn.

7.- Grails Keynote: El 2º día comenzó con la Keynote de Grails por parte de su project leader Graeme Rocher. Se centró en las novedades introducidas desde Grails 2.0 y para mi gusto se detuvo demasiado en ellas y no le dio tiempo a entrar en profundidad en lo que se incluirá en las siguiente versiones 2.3 y 3.0

8.- Debugging Grails Database Performance: Interesante charla de Tom Dunstan sobre un plugin que había desarrollado para mostrar de manera muy visual en cada vista que renderizamos el tiempo total que ha llevado incluyendo el desglose en los distintos servicios, el número de consultas sql que se han realizado, el tiempo de las mismas e incluso la propia consulta. Hay que prestar atención a este plugin porque tiene pinta de ser muy útil durante el desarrollo.

9.- Groovier testing with Spock: En esta ocasión Robert Fletcher nos mostraba código Java con sus correspondientes tests en Junit e iba explicando de una manera muy sencilla cómo convertir estos tests a Spock y por qué deberíamos usar Spock para probar en lugar del clásico Junit. Por suerte yo ya lo llevo usando desde hace tiempo :-)

10.- Reactive Grails - Event Oriented Architecture: Para mí la mejor charla de todas. Stephane Maldini explicó la parte de Events de platform-core junto con un par de plugins que había desarrollado y que complementaban al anterior. El mejor sin duda events-push, que sirve para poder recibir en el navegador notificaciones push en tiempo real desde el servidor de una manera muy sencilla. Hizo dos demos a cual más espectacular, una de video en tiempo real y la otra de un juego multijugador.

11.- Securing Grails Applications: Burt Beckwith comentó los 10 problemas más importantes de seguridad de las aplicaciones web, cómo estos pueden afectar a nuestras aplicaciones grails y cómo prevenirlos. Además contó un nuevo plugin que está desarrollando y que estará disponible junto con la versión 2.3 de Grails.

12.- Building an ecommerce business with gr8 technologies in Latin America: Domingo Suarez contó su experiencia desarrollando clickonero y cómo evolucionó la plataforma. Es una continuación de la charla que dio en el pasado Spring IO 2012 en Madrid. Muy interesante la peculiar forma en la que han diseñado la nueva arquitectura para poder soportar una gran carga de usuarios.

Y con esto acabaron las charlas. Hubo sorteo de ebooks de grails pero esta vez no me tocó ninguno.

La verdad es que ha sido una gran experiencia estar rodeado de dos días de tantos "cracks" del entorno Groovy y Grails. Tengo muchas ideas en el cuaderno y cosas que quiero probar y que haré haciendo poco a poco.

Si no has podido asistir pero te interesan estos temas, ya están todos los videos de las charlas publicados por lo que no hay excusa para no ir viéndolas poco a poco a ratos.

domingo, 13 de noviembre de 2011

Crónica de Greach: Conferencia de Groovy

El pasado viernes 4 de noviembre acudí a Greach, una conferencia sobre el lenguaje Groovy y los frameworks en torno a él: Grails, Griffon,... celebrada en la Universidad San Pablo CEU de Madrid. La conferencia estuvo muy bien y las charlas a las que asistí me gustaron casi todas.

Después del registro y la presentación empezaron las charlas en sí:

1.- Groovy 1.8 and beyond!: Guillaume Laforge, project manager de Groovy nos contó las novedades de la versión 1.8 y nos adelantó algunas de las nuevas características que tendremos disponibles en groovy 1.9 como grandes mejoras en el rendimiento o un compilador más estricto que permitirá detectar más errores en tiempo de compilación en lugar de retrasarlos hasta la ejecución.
2.- Novedades de Grails 2.0: Álvaro Sánchez-Mariscal, después de una presentación con un video con la intro de "The Day of the Tentacle", nos contó las novedades que incluye la versión 2.0 de Grails respecto a la 1.3.7: Scaffolding en HTML5, uso por defecto de jQuery en lugar de prototype, muchas mejoras en la parte de tests,...
3.- Deconstructing i18n-fields. Nacimiento y evolución de un power-plugin de Grails, sin cortes, sin censuras: Bajo este título, Jorge Uriarte nos contó las ventajas de la arquitectura de plugins de Grails, lo fácil que es crear un plugin y cómo le surgió la necesidad de crear este plugin. Con él, se puede internacionalizar campos de la base de datos de manera muy fácil y sencilla. Nos contó las distintas aproximaciones y evoluciones que ha tenido el plugin, vimos fragmentos de código,... La charla me pareció muy interesante y al final de ella pude hablar un rato con Jorge para comentarle que yo ya estoy utilizando su plugin en un proyecto y que me está resultando muy útil.
Después de esto tuvimos una pequeña pausa para tomar un café y recuperar algo de fuerzas con una pastas y volvimos a la carga con el siguiente bloque de charlas
4.- Volando con Griffon: Griffon es un framework que utiliza el lenguaje Groovy para escribir aplicaciones Java de escritorio basadas en Swing. La charla la dió Andrés Almiray, creador de Griffon. Tenía puestas muchas expectativas en esta charla pero al final me decepcionó un poco, según la agenda íbamos a ver cómo crear una aplicación con REST habilitado y al final sólo vimos cómo crear una aplicación con un par de cajas de texto y poco más.
5.- Gana velocidad y facilita la escalabilidad: Optimiza tus webs Grails: Dani Latorre nos contó una serie de tips generales para optimizar aplicaciones web y fue poniendo ejemplos de cómo implementarlos en Grails. Nos contó una gran variedad de plugins existentes actualmente con los que poder llevar a cabo dichas optimizaciones. La charla, sin ser magnífica, sí que me sirvió para replantearme ciertas cosas.
6.- Grails and Cloud Foundry: Después de la parada para la comida, volvimos con Graeme Rocher, lider del proyecto Grails, que nos contó la plataforma Cloud Foundry para el despliegue de aplicaciones "en la nube". Después de una pequeña introducción nos contó la existencia de un plugin de Grails que permite la integración y despligue de nuestras aplicaciones Grails de una manera rápida y sencilla. Vimos una demo de cómo funciona y aunque parece muy prometedor, todavía tiene bastantes limitaciones: no hay persistencia en el sistema de ficheros, no se puede acceder a la base de datos,... Graeme nos contó que están trabajando en solucionar todos estos problemas.
7.- Groovy Code Generation: Esta sin duda fue la charla más espesa de todas. Hamlet D'Arcy habló de transformaciones AST en Groovy. Hubo bastantes ejemplos y la charla fue muy interesante, aunque se requieren bastantes conocimientos para poder empezar con ello.
8.- Creación de plugins en Griffon: Mario García nos contó cómo funcionan los plugins de Griffon y nos hizo una demo sobre cómo crear uno para acceder a una instancia Solr.
9.- Engrandeciendo Grails con MongoDB: Esta fue una de las charlas que más me gustó. Enrique Medina nos habló sobre su experiencia en la integración de MondoDB con Grails, problemas que ha tenido, formas de resolver los distintos tipos de relaciones 1:1, 1:N y N:M. Me gustó mucho la charla y me abrió un poco los ojos respecto a una base de datos NoSQL. Es posible que en un futuro no muy lejano le dé una oportunidad a MongoDB en algún proyecto.

Y después de todas estas charlas llegó la parte final, se sorteó un curso de HTML5 y CSS3, una licencia de WebStorm y otra de Intelli J y finalmente libros de Grails in Action y Griffon in Action. A mi me tocó uno de Grails in Action :-).
Respecto a la organización, me pareció muy buena. Quiero dar las gracias a Alberto Vilches, padre del evento y a todos los colaboradores porque todo salió muy bien. Por ejemplo, el tema de la comida fue mucho mejor que en el pasado Spring IO en donde sólo tuvimos un sandwich frío. Esta vez pudimos comer en el comedor de la universidad.
Como punto negativo, al igual que en el Spring IO, la wifi se caía de vez en cuando, aunque esto es algo ajeno a los organizadores ya que es totalmente dependiente de la universidad.

viernes, 28 de octubre de 2011

Creando Hibernate Criteria en Grails

   La situación es la siguiente: Tenemos una aplicación grails en la que tenemos que buscar por nombre de usuario. La primera aproximación sería utilizar ilike para buscar en los campos nombre y apellidos y todo funcionaría perfectamente hasta que llegamos a los nombres con tildes. ¿Qué ocurre si el usuario está dado de alta como Iván y nosotros introducimos Ivan, pues que sencillamente no aparecerá.
   Hay varias formas de afrontar el problema incluyendo el full text search con plugins como searchable o elasticsearch, pero si no queremos complicarnos en configurarlos o nuestra situación no requiere de búsquedas complejas, podemos usar otra solución.
   En mi caso estoy utilizando PostgreSQL como base de datos en su versión 9.0. A partir de esta versión se incluye por defecto (sólo es necesario instalarla) la función unaccent que elimina todas las tildes de un campo. Así, la consulta que contruiríamos a mano sería algo como:
select * from user
where unaccent("name") ilike unaccent('%iván%')
Y devolvería cualquier usuario que se llamase: ivan, Iván, iván, IVÁN,...   Todo esto está muy bien, pero que ocurre si ya tenemos el siguiente criteria de grails:
def users = User.createCriteria().list() {
    ilike('name', '%' + value + '%')
}
¿Cómo añadimos esa llamada a la función unaccent?. Vamos a crear nuestro propio Hibernate Criteria.
Editamos el archivo BootStrap.groovy y añadimos lo siguiente:
HibernateCriteriaBuilder.metaClass.unaccent = { String propertyName, Object propertyValue ->

 if (!validateSimpleExpression()) {
  throwRuntimeException(new IllegalArgumentException("Call to [unaccent] with propertyName [" +
    propertyName + "] and other property name [" + otherPropertyName + "] not allowed here."));
 }

 propertyName = calculatePropertyName(propertyName);
 propertyValue = calculatePropertyValue(propertyValue);

 def query = "unaccent(\"${propertyName}\") ilike unaccent('%${propertyValue}%')"
 return addToCriteria(Restrictions.sqlRestriction(query));

 def query = "unaccent(\"${propertyName}\") ilike unaccent(?)"
 def value = "%${propertyValue}%"
 return addToCriteria(Restrictions.sqlRestriction(query.toString(), value.toString(), Hibernate.STRING));
}
[ACTUALIZACIÓN]: He cambiado la forma de generar la consulta para que evitar posibles ataques por inyección de sql.

Lo que estamos haciendo es inyectar al HibernateCriteriaBuilder un método llamado unaccent que recibe como parámetros un string con el nombre de la propiedad y un objeto con el valor que queremos comparar.
Con esto podemos reescribir la consulta anterior de la siguiente manera:
def users = User.createCriteria().list() {
    // Old method
    //ilike('name', '%' + name + '%')
    unaccent('name', value)
}
Si ejecutamos el criteria vemos que la consulta es la siguiente:
select
        this_.id as id19_0_,
        this_.name as name19_0_
     from
        user this_
     where
        unaccent("name") ilike unaccent('%iván%')
Que efectivamente devuelve los mismos registros de antes :-)
   Todo esto se puede mejorar puesto que en función del número de registros que esperemos tener en la tabla, aplicar la función unaccent a la columna obliga a la base de datos a hacer un full scan en toda la tabla. Podríamos crear un índice, usar un campo paralelo para realizar las búsquedas que se mantenga automáticamente con un trigger, controlar este campo desde la aplicación grails con los métodos afterSave() y afterUpdate() de la clase de dominio User,... en fin, unas cuantas alternativas.