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.

viernes 25 de abril de 2008

sIFR: tipografía rica y accesible

sIFR (Scalable Inman Flash Replacement) es una técnica que permite, con JavaScript y Flash, mostrar tipografías más ricas que las habitualmente disponibles en los navegadores, manteniendo la accesibilidad.

Ver el siguiente ejemplo, con sIFR:



Sin JavaScript ni Flash:



Estas son las instrucciones de uso.

Internacionalización: Unicode y UTF-8

De este artículo sobre internacionalización de Google:

El juego de carácteres (charset) es la tabla que traduce de un número a un "carácter" (o para ser más precisos un "codepoint"), y la codificación (encoding) es el algoritmo que hemos seguido para guardar ese número.

El consorcio Unicode se lanzó a la creación de un juego de carácteres que incluyese todos los carácteres usados en el mundo. De esta forma será posible tener páginas con mezcla en varios idiomas.

Ken Thompson y Rob Pike inventaron una codificación de tamaño variable llamada UTF-8. UTF-8 es idéntico a ASCII para todos los carácteres inferiores a 128, y usa uno o varios bytes extra (hasta un máximo de 4) cuando tiene que almacenar un número superior a 128. Cualquier texto ASCII en inglés es automáticamente un texto UTF-8 válido. Los textos europeos son en torno a un 2% más grandes que usando ISO-8859-15, ya que sólo los carácteres acentuados aumentan de tamaño. Los únicos que realmente salen perdiendo son aquellos que tenían un alfabeto pequeño (griego, ruso, ...) sin nada en común con el inglés, ya que antes podían codificar cada carácter con un 1 byte y ahora necesitan más. UTF-8 no usa ningún byte 0 en su codificación, y funciones como strcpy de C funcionan con textos UTF-8.

La recomendación es usar UTF-8 tanto en la base de datos como en la interfaz web.


NOTA: Al editar un texto en Windows como UTF-8 hay muchas posibilidades de que el editor añada un "BOM" (también llamado "signature"). El BOM era útil para UTF-16, pero para UTF-8 es totalmente irrelevante. Pero en Windows lo siguen escribiendo para poder distinguir texto codificado en UTF-8. Es necesario usar un editor que permita guardar en UTF-8 sin BOM, o las páginas tendrán tres bytes de más al principio de cada página web (EF BB BF). Esto puede ocasionar problemas por ejemplo con PHP.

sábado 19 de abril de 2008

Adobe Flex

Flex es un framework de Adobe para la construcción de aplicaciones Flash. Permite crear aplicaciones con interfaz de usuario rico (RIA) que se ejecutan en cliente, en el propio reproductor Flash.



El framework está disponible con una SDK gratuita y un IDE basado en eclipse llamado Flex Builder. Incluye un compilador que también puede ejecutarse "standalone". Cuenta con bastantes herramientas y componentes estándar que facilitan el desarrollo. Los componentes de interfaz de usuario pueden extenderse y personalizarse.

Las aplicaciones Flex se construyen con MXML y/o ActionScript, y son compiladas en forma de archivos SWF.
  • MXML es un formato basado en XML para diseñar la interfaz de usuario basada en componentes (como ocurre con JSF con las propias páginas .jsf o .jspx).
  • ActionScript es un lenguaje de scripts orientado a objetos para definir la lógica de la aplicación Flex.
Ver este tutorial, bastante bueno, sobre cómo crear una aplicación RIA para buscar y mostrar fotos de Flickr. Este es el resultado. Aquí puede verse en acción.

También permite el intercambio de datos con el servidor. La aplicación en servidor puede ser Java, ASP .NET, PHP o ColdFusion.
La comunicación puede ocurrir en texto plano o en XML, vía HTTP. También permite acceder a servicios web (SOAP) o a métdos remotos.

Ver este tutorial sobre aspectos de intercambio de datos con servidor.

viernes 18 de abril de 2008

Snippets

Texter es una utilidad Windows para gestionar los snippets (recortes de código reutilizable que habitualmente guardamos en ficheros de texto para "copiar y pegar" mientras programamos).



Permite definir snippets y asociarles unas palabras clave (shift+ctrl+h), insertarlo en el código escribiendo las palabras clave y pulsando la tecla que hayas definido (tabulador, enter, espacio o instantáneo), y puedes gestionarlos en cualquier momento (shift+ctrl+m).

Esta herramienta tiene la ventaja de ser bastante cómoda, es independiente del entorno de desarrollo con el que trabajes y almacena internamente los recortes de código en forma de archivos de texto.

Descargar

Algunos sitios web con snippets:
¿Conoces alguna herramienta o web de este tipo?

htmlSQL

htmlSQL es una clase PHP que permite acceder a los valores de un contenido HTML usando una sintaxis similar a la de SQL.


Ver demo.

¿Existe algo similar para Java?

Botones clásicos para la web

En WebResourcesDepot muestran este conjunto de botones clásicos, construidos a partir de los iconos silk de famfamfam.



Descargar archivo PSD.

Muy recomendable esta web, que ofrece todos los días recursos gratuitos para el desarrollo web.

viernes 11 de abril de 2008

Interpretar erróneamente las preguntas

Los políticos emplean un método comadrejil de evitar la verdad sin mentir. Se llama "ofrecer un análisis somero". La técnica implica interpretar erróneamente las preguntas como si fuera un alienígena que aprendio toda su habilidad para el lenguaje gracias a haberse leido el diccionario.

Reportero: Senador, ¿ha asesinado a su esposa?

Senador: No puedo decirle con seguridad que lo hiciera.

Reportero: ¿No le asesto 65 puñaladas?

Senador: No estaba contando.

Reportero: Pero una decena de testigos le vieron apuñalar a su esposa hasta matarla. ¿Eso no significa que usted la mató?

Senador: ¿Cómo saben esos testigos que no habría muerto por su cuenta? ¿Acaso son médicos?

Reportero: Pero... ¿admite que ha apuñalado a su esposa?
No, el cuchillo la apuñaló. ¡Y no descansare hasta que no haya castigado a ese cuchillo!...

(De Dilbert y la estrategia de la comadreja).

sábado 5 de abril de 2008

Calcula el día de la semana

¿Qué día de la semana fue el 31 de diciembre de 1975?
Según el algoritmo de Doomsday:

  • Toma la parte entera de dividir las 2 últimas cifras por 12: 75/12 -> 6
  • Toma el resto de la división anterior: 3
  • Toma la parte entera de dividir el número anterior por 4: 3/4 -> 0
  • Toma el marcador del siglo (5 para 18xx, 3 para 19xx, 2 para 20xx, 7 para 21xx, etc): 3
  • Suma todo y toma el resto de dividir por 7: 6+3+0+3=12, 12/7 -> restan 5
Este es el día maldito (Doomsday) del año 1975: el viernes (5).

Para cualquier año, los días 4 de abril (4/4), 6 de junio (6/6), 8 de agosto(8/8), 10 de octubre (10/10) y 12 de diciembre (12/12) siempre caen en el mismo día de la semana, siendo éste el mismo día de la semana en el que cae el último día de febrero.


A partir de esto, si el 12 de diciembre fue viernes... también fue viernes el 19 y el 26... con que el 31 de diciembre tuvo que ser... MIÉRCOLES !! (comprobado).

(Vía Microsiervos).

sábado 22 de marzo de 2008

Cómo editar los metadatos de tus fotografías

Mi opción preferida es la utilidad ExifTool de Phil Harvey.
Es gratuita y se puede descargar de 3 formas: como librería perl independiente de la plataforma, como ejecutable Windows o como ejecutable Mac OS.
Es muy potente y soporta gran cantidad de formatos de archivo y tipos de metadatos (EXIF, GPS, IPTC, XMP, JFIF, GeoTIFF, ICC Profile, Photoshop IRB, FlashPix, AFCP e ID3).
En realidad es una uilidad para ejecutar en línea de comandos, pero existen bastante programas de interfaz de usuario para esta herramienta.
Por ejemplo, para Windows, ExifTool GUI está bastante bien. Una funcionalidad muy práctica que ofrece es la de desplazar la fecha y hora de un conjunto de imágenes, para el caso en que tomases tus fotos cuando tu cámara no tenía bien ajustada la fecha y la hora.
Puedes consultar otras herramientas relacionadas en la própia página del producto.

Otra aplicación muy práctica es Microsoft Photo Info, para Windows.
También es gratuita y permite la edición desde el propio exploradorde Windows.
Sin embargo, no es tan potente y sólo permite editar un número reducido de metadatos.

Otras herramientas: PhotoMe, Quick EXIF Editor y Exif Pilot (esta última no es gratuita).


NOTA: Si lo que quieres es cambiar la fecha y hora de creación o de modificación del archivo físico, y no del metadato correspondiente de la fotografía, puedes utilizar herramientas como SetFileDate.

¿Conoces otras herramientas interesantes de este tipo?

domingo 16 de marzo de 2008

La genealogía de la moral

Necesitamos una crítica de los valores morales, hay que poner alguna vez en entredicho el valor mismo de esos valores --y para esto se necesita tener conocimiento de las condiciones y circunstancias de que aquéllos surgieron, en las que se desarrollaron y modificaron (la moral como consecuencia, como síntoma, como máscara, como tartufería, como enfermedad, como malentendido; pero también la moral como causa, como medicina, como estímulo, como freno, como veneno), un conocimiento que hasta ahora ni ha existido ni tampoco se lo ha siquiera deseado.

Friedrich Nietzsche
La Genealogía de la Moral


(Vía Aula de Filosofía).

sábado 15 de marzo de 2008

Con la ternura de un robot

Sí, este tema tiene ya unos años.
Pero es un buen ejemplo de sexualidad con elegancia, pulcritud, ternura, con sentimiento,...y amor.
Todo está lleno de amor.
Amor electrónico.

Es "All Is Full Of Love" de Björk.

API para utilizar YouTube

Además de las APIs JavaScript para controlar el visor de YouTube o para diseñar un visor propio, existe también un API para poder usar YouTube desde tus programas o sitios web: YouTube Data API Protocol:

  • Subir y modificar vídeos.
  • Realizar búquedas.
  • Escribir comentarios y respuestas.
  • Recuperar listas de reproducción, perfiles, suscripciones, etc.
Existe una API en Java y otra en PHP (framework Zend) para facilitar las labores de acceso a estos servicios de Google basados en GData (protocolo para las APIs de Google).

Para más información, ver también el blog de la API de YouTube.

viernes 14 de marzo de 2008

Las funciones de un arquitecto

En este artículo de "coding the architecture" se muestran las principales funciones de un arquitecto de aplicaciones o de sistemas en un proyecto de desarrollo de software.
El objetivo es el de asesorar en una entrevista de trabajo o también para identificar áreas de desarrollo en la carrera profesional.
Estos son los puntos a evaluar:

  • Arquitectura: definición de arquitectura, arquitectura de sistemas, vista física, vista lógica, principios de arquitectura, seguridad, etc. ¿La has definido o has contribuido a definirla?
  • Selección de software: pilas de aplicaciones, bases de datos, librerías, frameworks, estándares tecnológicos, etc. ¿Para un sistema nuevo (greenfield) o para uno existente?
  • Selección de infraestructura: sistemas operativos, hardware, redes, sistemas de recuperación, etc. ¿Para un sistema nuevo o para uno existente?
  • Requisitos no funcionales: rendimiento, escalabilidad, seguridad, etc. ¿Entrega, justificación o pruebas?
  • Liderazgo: liderazgo técnico, responsabilidad y autoridad, dirección de equipos, etc. ¿Lo has realizado o has contribuido?
  • Coaching y mentoring: ayuda sobe problemas técnicos, ayuda en la evolución profesional, etc. ¿En el diseño y codificación o en la arquitectura?
  • Metodología de proyectos: estructura de proyectos, metodologías (Waterfall, Scrum, RUP, XP...). ¿La has definido o has contribuido?
  • Procesos de desarrollo: control de versiones de código fuente, procesos de construcción, integración continua, automatización de pruebas y otros procesos y herramientas de desarrollo. ¿Los has definido o has contribuido?
  • Prácticas y estándares: estándares de codificación y libros blancos, selección de herramientas, etc. ¿Los has definido, has contribuido o han sido impuestos?
  • Diseño, desarrollo y pruebas: diagramas UML, codificación, pruebas unitarias, etc.
  • Experiencia: Conocimiento sobre tecnologías y arquitecturas.
  • Desarrollo de software y tendencias tecnológicas: Agile, Web 2.0, SOA, lightweight Java EE, etc. ¿Estás al día, opiniones?
¿Cuál tienes que mejorar?