lunes, 28 de noviembre de 2011

GROOVY - Curried closure

En esta ocasión os voy a hablar de unos métodos de los closures de Groovy que no conocía hasta hace poco tiempo (lo sé lo sé, seguro que muchos ya los conocíais de antes...), se trata de los métodos curry, rcurry y ncurry.

GROOVY- Trabajando con XML

Todos sabemos que crear o tratar ficheros con Java puede ser bastante engorroso, pero con groovy la cosa es muy diferente.
En este post pondré un breve ejemplo de cómo crear un documento XML y cómo leerlo con Groovy.

martes, 20 de septiembre de 2011

GRAILS - Cliente de servicios web con WS-Client

Hoy le toca al turno al plugin WSClient para grails. Utilizando este plugin podremos crear un cliente de un servicio web fácil fácil.

Un ejemplo para ver como funciona.

lunes, 19 de septiembre de 2011

GRAILS - Servicios web con CXF

A la hora de crear servicios web el plugin cxf de grails nos facilita mucho esta tarea, permitiéndonos crear un servicio web en cuestión de minutos. (He de puntualizar que tardas poco si son servicios web sencillos, como te plantees cosas más complejas como devolver o aceptar mapas por parámetros la cosa se complica...)

Veamos cómo poner un servicio web en funcionamiento usando este plugin.

miércoles, 29 de junio de 2011

GRAILS - Remote pagination plugin

Esta vez toca una pequeña explicación de un plugin útil y muy fácil de utilizar. Se trata de Remote Pagination, el cual ofrece los tags remotePaginate y remoteSortableColumn que permiten paginar y ordenar las columnas de forma remota.

martes, 28 de junio de 2011

GRAILS - Evitar envío duplicado del formulario

Muchas veces (por no decir siempre) nos encontramos con el problema de evitar que un usuario envíe dos o más veces el mismo formulario (ya sabemos todos que existen usuarios que parece que tienen un tick nervioso en el dedo y no parar de dar a los botones por si no les ha hecho caso...).

jueves, 23 de junio de 2011

NUTCH - Combinar índices

Dentro del script que he empleado para hacer el crawl de distintas páginas, decidí que los nuevos crawls se harían en directorios distintos y después de juntarían con uno general. Este es el código que utilizo para mezclar los crawldb.
Path crawlDb = new Path(dir + "/crawldb_"+id);
Path crawlDbDestino = new Path(dir+"/crawldb");
Path crawlDbNuevo = new Path(dir+"/crawldb2");
//Aquí hay más código, pero no relacionado con este tema

Path[] crawlDbs;
if (!fs.exists(crawlDbDestino))
{
 crawlDbs = new Path[1];
 crawlDbs[0] = crawlDb;
 crawldbMerger.merge(crawlDbDestino, crawlDbs, false, false);
 fs.delete(crawlDb,true);
}
else
{
 crawlDbs = new Path[2];
 crawlDbs[0] = crawlDb;
 crawlDbs[1] = crawlDbDestino;
 crawldbMerger.merge(crawlDbNuevo,crawlDbs,false,false);
 fs.delete(crawlDbDestino, true);
 fs.rename(crawlDbNuevo, crawlDbDestino);
 fs.delete(crawlDb,true);
}

GROOVY - Elvis Operator

Elvis operator (?:) es una versión corta del operador ternario de Java. Literalmente es la abreviación de "if-then-else". Este operador es muy útil para, por ejemplo, definir valores por defecto si no se han indicado antes, lo que significa que tendrán valor null o false.

Veamos un par de ejemplos.
def nombre = nombre?:"desconocido" 
def otro = nombre=="desconocido"?"a":"b"

En el primer ejemplo, si el nombre tiene algún valor, se asigna ese valor, y en caso contrario se le asigna el string "desconocido". La primera parte del operador se conoce como expresión. Si esa expresión se evalúa a false o null, entonces el valor después de : es devuelto, si no el posterior a ? es el que será devuelto. En el segundo caso, si el nombre es "desconocido", la variable otro tendrá valor "a" y si no "b".

Puede que al principio cueste un poco acostumbrarse a este operador, pero una vez que lo hagáis, os daréis cuenta de que lo podéis usar en muchos sitios para abreviar código.

Enjoy!

GROOVY - Expresiones regulares

Groovy, como Java, permite el uso de expresiones regulares y lo hace de una manera sencilla. Además, añade tres operadores que facilitan aún más la labor.

martes, 19 de abril de 2011

GRAILS - Google Analytics plugin

Hace unos días tuve que habilitar google analytics para una aplicación web creada con Grails. Mi primera opción fue introducir el código que proporciona google analytics para que las páginas sean analizadas, pero después encontré un plugin (cómo no, en Grails siempre, o casi, puedes encontrar un plugin que te facilite lo que quieres hacer) que facilita esta labor, al menos en mi opinión.

Os dejo el enlace al plugin para que podáis ver directamente todas sus opciones: Grails Google Analytics Plugin

A pesar de tener en la documentación del plugin la información suficiente para hacerlo funcionar, os voy a mostrar mi solución por si os sirve de aclaración.

lunes, 7 de marzo de 2011

GROOVY - Collections

En groovy tenemos disponibles varios tipos de colecciones que nos facilitarán bastante la vida: arrays, listas, rangos, sets y mapas. Véamos un poco cada uno de ellos.

miércoles, 2 de marzo de 2011

GROOVY - Strings

En este post voy a extenderme algo más de lo normal, pero creo que es bueno compartir esta información, que ya me ha tocado recordar más de una vez entre mis compañeros.

Hablaré brevemente (o al menos esa es mi intención inicial) sobre los tipos de Strings en groovy, string multi-linea y sobre los 'slashy strings' (strings delimitados por barras). ¡Manos a la obra!

jueves, 17 de febrero de 2011

GRAILS - Parámetros multivaluados y params.list()

De nuevo os traigo un truquito que he leido en el observatorio, concretamente en el post SQ31 – Intermedio – Parámetros web multivaluados.

¿Nunca habéis tenido que recoger de los parámetros un campo con varios valores? Pues yo sí, y antes de leer este post he de decir que me volvía loca para convertir lo que recibía en algo que pudiera manipular cómodamente.

miércoles, 16 de febrero de 2011

GRAILS - Establecer puerto por defecto

Como todos sabéis (y si  no a partir de ahora lo haréis), el puerto por defecto que utiliza grails para las aplicaciones es el 8080, pero podemos cambiar fácilmente de puerto si nos es necesario.

Si queremos cambiar el puerto sólo ocasionalmente, opino que lo mejor es indicarlo a la hora de arrancar la aplicación. Si quisieramos arrancar la aplicación en el puerto 8090, bastaría con lanzar la ejecución de la siguiente forma.

grails -Dserver.port=8090 run-app

Pero claro, ¿y si lo que queremos es arrancar la aplicación siempre en el puerto 8090?. No resultaría muy práctico tener que incluir la opción cada vez que arrancamos la aplicación. Como no podía ser de otra manera, grails nos permite definir el puerto por defecto poniendo la siguiente línea en BuildConfig.groovy.

grails.server.port.http=8090

Enjoy!

viernes, 11 de febrero de 2011

GROOVY - Split en listas y mapas

Esta vez os traigo el método split para listas (List) y mapas (Map) en groovy. Se añaden a las propias clases mediante metaprogramación.

Si estáis utilizando grails, podéis incluirlos en el Bootstrap de vuestra aplicación para tenerlos siempre disponibles.

lunes, 7 de febrero de 2011

GRAILS - Establecer la ordenación de las asociaciones

Después de unos días de ausencia... os traigo un truquito nuevo que he leído en el Observatorio de grails, concretamente en este post.

No sé si os habréis encontrado alguna vez con la necesidad de obtener las relaciones de un objeto ordenadas siempre de la misma manera, pero yo sí. Hasta ahora lo que hacía era, si necesitaba que estuvieran ordenadas por id, añadía una propiedad List con el nombre de la relación. También he utilizado SortedSet para obtener una ordenación personalizada de esa relación. Y, por supuesto, definir el orden cada vez que hacía una consula, es decir, .findAllByNombre(nombre,[sort:'nombre',order:'asc']).

miércoles, 19 de enero de 2011

GRAILS - get, read o load?

A la hora de obtener un objeto de dominio, ¿qué metodo debemos utilizar, read, get o load?.

lunes, 17 de enero de 2011

GRAILS - Highlight tag

Bueno, esta vez os traigo una etiqueta bastante simple pero que puede resultaros útil, aunque en casos muy concretos.

Lo que hace este tag es resaltar (highlight) ciertas palabras de un texto. En mi caso lo he empleado para marcar las palabras en los resultados de una búsqueda (sí, lo sé, lucene tiene su propio highlight, pero en este caso concreto no me servía...).
El resaltado de las palabras lo hace englobándolas dentro de un , por lo que sólo tendréis que adaptar los estilos a esa clase para ponerlo a vuestro gusto.

viernes, 14 de enero de 2011

NUTCH - Configurar recrawl

¿No os ha pasado que según en qué foro o tutorial leáis os dicen una u otra forma de cómo configurar nutch para hacer recrawl de las páginas? Pues a mí sí...

En un primer momento intenté llamar a la clase Crawl con la opción de -addDays, después de unos días me dí cuenta de que no hacía mucho caso.
Después vino la gran idea de crearme mi propia clase Crawl y a la hora de hacer el fetch, establecer el tiempo como el actual más 7 días, por ejemplo. Tampoco me hizo mucho caso.
Y finalmente, ¡creo que he encontrado la solución más práctica y que funciona!

jueves, 13 de enero de 2011

GRAILS - Tag para truncar texto

Bueno, esta es una etiqueta que me ha venido bien ya en un par de ocasiones. Lo que hace es simplemente truncar un texto según el número de caracteres que se indique, poniendo puntos suspensivos al final del texto si ha tenido que truncarse.

Basta con que os creéis un tagLib e incluyáis este trozo de código.

def truncarNombre = {attrs ->
 def maximo = new Integer(attrs['max'])
 def max = (attrs['nombre'].length()-1>maximo)?maximo:attrs['nombre'].length()-1
 def nombre = attrs['nombre'][0..max]
 if (attrs['nombre'].length()-1>maximo)
  nombre = nombre +'...'
 out << nombre.encodeAsHTML()
}


Luego, en el gsp en el que queráis utilizarlo, basta con que pongáis lo siguiente para utilizarla:

<g:truncarTexto texto='texto que queréis truncar por ser demasiado largo' max='10'/>

Espero que os sirva :)

NUTCH - ParserChecker – Una forma de comprobar el resultado del Parser

Al hacer unas consultas en el maillist de nutch, me mostraron el uso de esta clase.

Si desde linea de comandos ejecutamos lo siguiente, obtenemos el resultado de hacer el parse de esa url, con todos los posibles enlaces de salida y el contenido.

bin/nutch org.apache.nutch.parse.ParserChecker

Creedme, puede resultar muy útil cuando no sabes por qué dominios no te está haciendo bien el crawl y resulta que es porque te estaba dando una excepción el parser de pdfs...

Twitter Delicious Facebook Digg Stumbleupon Favorites More