domingo 11 de mayo de 2008

Grails: por qué no has venido antes

Grails es un framework de desarrollo web basado en la utilización del lenguaje Groovy, que complementa el desarrollo web basado en Java.



Se ejecuta en una máquina virtual Java y está basado en librerías como Spring, Hibernate, Acegi, log4j, etc, aunque el desarrollador no tiene que preocuparse de la configuración de estos componentes.
El objetivo principal: facilitar la vida al desarrollador.

INSTALACIÓN
Es muy fácil de instalar. Teniendo la máquina virtual Java: descomprimir un zip, configurar una variable de entorno y listo!
Cuenta con plugins para distintos IDEs.

CoC y DRY
Sigue el paradigma de convención sobre la configuración (al igual que Ruby on Rails).
Para crear una aplicación nueva con la estructura estándar de carpetas basta hacer:
grails create-app
Consigue que el programador tenga que encargarse de configurar lo mínimo imprescindible (principio DRY): se acabaron los ficheros XML de Spring, Hibernate y Struts o JSF.

EL ANDAMIAJE MVC
Sigue el patrón Modelo-Vista-Controlador.
Tiene una característica muy interesante, el scaffolding, que permite generar vistas y controladores dinámicamente (en tiempo de ejecución), para las entidades del modelo de dominio que así se definan.
¡¡ Puedes llegar a generar la versión inicial de una aplicación completamente a partir del modelo de dominio !!
class BookController {
def scaffold = true
...
}
De esta manera, los métodos del controlador y las vistas son las que se definen por defecto en base a plantillas, a no ser que se definan métodos o vistas nuevas, o se sobreescriban las estándar.
Estas plantillas (para las operaciones típicas CRUD) son adaptables por el programador.
grails install-templates
También se pueden generar las vistas y controladores de forma estática en tiempo de programación, que se pueden tomar como versión inicial para empezar a programar.
grails generate-all

PLUGINS
Cuenta con plugins que amplían la funcionalidad disponible: búsquedas basadas en Lucene, seguridad basada en Acegi, informes JasperReports, etc.


En definitiva: viene muy bien para crear una aplicación web con arquitectura JEE que sea fundamentalmente CRUD en un tiempo record !

Para más información, continuar con la introducción y los tutoriales.

sábado 10 de mayo de 2008

Mejora de productividad con Groovy

Ya sabemos que Groovy es un lenguaje:

  • ágil y dinámico que se ejecuta en la máquiva virtual Java.
  • compila como bytecodes Java, de forma que puedes utilizarlo allí donde puedes usar Java.
  • se integra con todos los objetos y librerías Java existentes.
  • proporciona toda la potencia de Java y proporciona características adicionales basadas en lenguajes como Python, Ruby y Smalltalk.
  • disminuye la curva de aprendizaje.
  • incrementa la productividad del desarrollo web, de interfaz de usuario, de acceso a base de datos o de consola.
  • simplifica el desarrollo de pruebas.
  • soporta lenguajes de dominio específicos y otras sintaxis para que el código sea más fácil de mantener.
Aquí va un ejemplo:

Con Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class WalkFile {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("../simpleFile.txt"));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Con Groovy:
new File("../simpleFile.txt" ).eachLine{line ->
println line

Y es que no es sólo cuestión de líneas de código...

Estás son algunas características que este lenguaje nos ofrece:
  • imports automáticos. Igual que Java permite utilizar java.lang.* sin hacer imports, Groovy permite utilizar muchos más paquetes de la JDK y GDK.
  • El punto y coma es opcional, si una línea tiene sólo un comando.
  • Los paréntesis son opcionales al llamar a un método.
  • También es opcional indicar "return" cuando un método devuelve un resultado.
  • Es opcional declarar los tipos de datos, de forma que el lenguaje es dinámicamente tipado.
  • El manejo de excepciones es opcional.
  • Existe sobrecarga de operadores. Por ejemplo: a[b]=c es a.putAt(b,c)
  • Hay una forma sencilla de ignorar los NullPointerException, sin tener que recurrir ala tediosa formade estar haciendo if antes. Ejemplo: s?.doSomething()

¿Cuántos afinadores de piano hay en Chicago?

En algún sitio he visto que esta es una de las típicas preguntas que hacen en las entrevistas de trabajo de Google... ¿para desconcertarte y analizar tu actitud? ¿para ver tu capacidad de inventar soluciones creativas? ¿para comprobar tu capacidad de análisis? ¿para observar tus métodos de trabajo?...

Rápidamente se te pueden ocurrir cosas como esta:

  • Hay 5 millones de personas viviendo en Chicago.
  • En promedio, viven dos personas en cada casa de Chicago.
  • Una de cada veinte casas tiene un piano que es afinado regularmente.
  • Dichos pianos son afinados una vez por año.
  • A un afinador de pianos le lleva dos horas afinar un piano, incluyendo el tiempo de viaje.
  • Cada afinador trabaja 8 horas por día, 5 días a la semana y 50 semanas en un año.
Este es un ejemplo de lo que llaman Problema de Fermi.

¿Te fiarías de una solución de este tipo para decidir si empezar un negocio en Chicago que provea equipamiento de afinación?

miércoles 7 de mayo de 2008

Objetividad vs confianza

En una negociación: proceder siempre objetivamente, con independencia de la confianza.

Fisher y Ury (1991)


Esta regla se puede flexibilizar cuando estamos razonablemente seguros de que el contexto es totalmente cooperativo o cuando están incluidas en la situación las garantías adecuadas.

Pero aún en tales casos es bueno mantener los procedimientos de verificación, porque aunque no exista peligro de engaño sí existen siempre posibilidades de errores en los datos o en las interpretaciones, malentendidos y confusiones.

domingo 27 de abril de 2008

Formularios y validaciones con estilo

Dos utilidades muy atractivas:

  • Niceforms, que convierte los elementos de los formularios mediante CSS y JavaScript. Se degrada fácilmente si no se dispone de JavaScript. Ver ejemplo.
  • FormCheck2, que crea mensajes de validación muy estéticos asociados a cada elemento del formulario. Ver ejemplo.
Un caso de utilización de ambos a la vez es LightForm:

Validación de entidades Java

JaValid es un framework que facilita la validación de objetos de dominio utilizando para ello anotaciones Java: @NotNull, @NotEmpty, @MinLength (length=4), etc. (ver anotaciones disponibles).
De esta manera, se puede invocar al validador en cualquier momento y éste devolverá la lista de mensajes de validación correspondiente.
El framework tiene conversores de mensajes de validación para JSF y para Spring.

Ver ejemplo básico.

También permite crear grupos de validación, de manera que al validar se le pueda pedir que realice sólo las validaciones que correspondan al grupo. Esto es útil por ejemplo para validaciones en la creación, que pueden ser diferentes a las que se realicen en la modificación o en otras operaciones.

Ver ejemplo con grupos.

sábado 26 de abril de 2008

Generación de datos aleatorios

¿Necesitas generar datos aleatorios para hacer pruebas?
Con Data Generator de generatedata.com puedes generar tablas de datos en Excel, HTML, XML, CSV y SQL. Permite definir cualquier número de campos con diversos métodos de generación: en forma de fechas, textos, números, seleccionando de una lista, etc.

Ver demo:


La aplicación está realizada con PHP y MySQL.
Se puede descargar gratuitamente aquí. Licencia GNU Open Source.