viernes, 31 de agosto de 2012

Deshabilitar el parámetro jsessionid

Java
En las aplicaciones web java cuando un usuario accede por primera vez a una página de la aplicación se le añade a los enlaces que se generan el parámetro jsessionid para que en caso de que se tengan las cookies desactivadas poder mantener y determinar la sesión del usuario. Esto puede ser un problema ya que los rastreadores de los buscadores indexarán las páginas con ese parámetro añadido a la URL.

Para desactivar esta reescritura de los enlaces no hay más que añadir en el archivo web.xml de la aplicación lo siguiente:

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

La cabecera del web.xml debe ser la siguiente, es decir, se necesita la versión 3.0 de servlets API soportada por Tomcat 7.0 entre otros servidores:

<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

Referencia:
http://andrius.miasnikovas.lt/2010/07/whats-new-in-tomcat-7/
http://stackoverflow.com/questions/962729/is-it-possible-to-disable-jsessionid-in-tomcat-servlet

viernes, 24 de agosto de 2012

Páginas PageCatalog, ServiceStatus e HibernateStatistics de Tapestry

Apache Tapestry
Como ya he comentado en alguna ocasión anterior una de las buenas características de Tapestry es la buena información que dá cuando algo va mal con la página de Informe de error (Exception Report). También podemos obtener un montón de trazas (I, II) para conocer que es lo que está haciendo internamente en cada momento y que ayuda a resolver los problemas cuando los hay más rápidamente.

Otra buena fuente de información además de la página de un informe de error y el sistema de trazas están las páginas incluidas en el propio framework (builtin) PageCatalog, ServiceStatus y la página de estadísticas de Hibernate.

La página PageCatalog permite monitorizar el estado de las páginas de la aplicación, cuantas ha sido cargadas, que idiomas se están usando, cuantas veces se han usado, cuanto tiempo han tardado en construirse, cuantos componentes tienen y alguna cosa más. Otra cosa interesante acerca de esta página es que permite cargar todas las páginas de la aplicación permitiendo descubrir rápidamente si alguna contiene errores.


La página ServiceStatus muestra toda la lista de servicios encontrados en los diferentes módulos. Ahí podemos ver su identificativo, la interfaz que implementa, su ámbito y su estado. Para monitorizar una aplicación o descrubrir algún tipo extraño de error quizá nos resulte interesante conocer esta información.


Otra muy buena página que tapestry nos proporciona «out-of-the-box» cuando usamos Hibernate es la completa página de estadísticas del mismo. En ella obtendremos una extensa información sobre el estado de Hibernate que nos permiritá monitorizar, detectar posibles fuentes de problemas o puntos donde nuestra aplicación no so comporta de forma óptima y con ello ajustar las caches o nuestra aplicación para proporcionar un mayor rendimiento o disminuir el consumo de recursos. Los apartados de esta página son las estadísticas de Session Factory, Collections, Queries y Second Level Cache. El significado de los datos proporcionados puede consultarse en el enlace anterior. En las siguientes imágenes puede verse la página de una aplicación nada más iniciarse y después de un poco de uso, se aprecia como van aumentando los hits, misses, load count, etc...


Para obtener esta información es necesario modificar el archivo de configuración de Hibernate añadiendo la propiedad «hibernate.generate_statistics» con valor «true».

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    
<hibernate-configuration>
 <session-factory>
    ...
    <property name="hibernate.generate_statistics">true</property>    
  </session-factory>
</hibernate-configuration>

Estas páginas son únicamente accesibles por defecto desde la máquina local (127.0.0.1) y en el modo desarrollo por seguridad.

Referencia:
Documentación sobre Apache Tapestry
http://tapestry.apache.org/service-status.html

viernes, 17 de agosto de 2012

Desempaquetado («unboxing») de Amazon Kindle Touch

Amazon.es
Desde hace unos meses el lector de libros electrónicos de Amazon Kindle Touch ya está disponible para la compra desde la página española de Amazon. Una de mis dudas cuando compré el Kindle Touch era como era la experiecia de lectura, como convertir libros en formato pdf o formato ebook epub/mobi/doc a los nativos del libro electrónico, como quedaban esas conversiones y si en una página entraba el mismo texto que en un libro tradicional. Otra de mis dudas era como se leerían los pdfs de libros técnicos, cambiando la orientación de lectura a horizontal se dejan leer bastante bien aunque hay que hacer varios pasos de página en el kindle para leer una página del libro. Para mi, la experierincia es lo suficientemente buena como para haber merecido la compra a pesar de tener algunos contras.

Un lector de libros tiene varias ventajas sobre los libros tradicionales entre ellas:
  • Los libros suelen tener un precio más bajo que los libros en papel.
  • Permite tomar notas, subrayar párrafos y relizar búsquedas.
  • Permite modificar el tamaño y tipo de la fuente según nuestras preferencias o necesidades.
  • Los libros electrónicos no ocupan espacio físico y no hay que almacenarlos despues de una lectura (da pena adquirir un objeto que normalmente solo le vamos a dar un solo uso).
  • Hasta ahora solía ir a la bibilioteca municipal para obtener los libros, ahora no tengo que desplazame hasta ella y no tengo que esperar si hay otro usuario de la bilbioteca leyendo el libro que quiero aunque me pierdo la sensación de entrar a un «templo del conocimiento».
Y en la parte de contras están:
  • Las conversiones al formato nativo no son perfectas y el texto no queda igual que el libro físico.
  • Las conversiones para que queden aceptables requieren que les dediquemos parte de nuestro tiempo.
  • Los libros que incluyen alguna imagen como un mapa de la historia no se leen muy bien por lo pequeño que se ven.
  • Las últimas novedades puede que no las encontremos en formato electrónico. Aunque cualquier libro con ya un tiempo y algo conocido suele encontrarse.
  • En mi opinión, la lectura del libro tradicional sigue siendo mejor que la del libro electónico. Pero en los próximos años seguramente vendrán mas mejoras como pantallas de libro electŕonico a color, mayor velocidad de refresco que los harán útiles para ver animaciones o incluso vídeos.
  • Al ser táctil la pantalla acaba por ensuciarse con la grasilla de los dedos y de vez en cuando hay que limpiarla aunque que con un plástico protector puede ser suficiente.
En cuanto al Kindle Touch es bastante fino y pequeño ya que no tiene teclado físico, prácticamente es todo pantalla con unos bordes no muy grandes, pero al ser táctil la pantalla hay que sujetarlo de forma adecuada para no pasar de página sin querer. Su peso es bastante ligero y no cansa tenerlo en la mano. El pasar de página es rápido y no entorpece la lectura. La batería dura bastante, de sobra para leer un libro entero de unas 300-350 páginas en un libro físico con una sola carga. El transmitir los libros electrónicos al Kindle lo podemos hacer de dos formas, conectándolo mediante un cable USB al ordenador y copiando archivos como si fuera una memoria USB o enviándolos adjuntos en un correo electrónico a una dirección de correro electrónico que proporciona Amazon para nuestro Kindle y que se copia automáticamente en el Kindle cuando activamos el WIFI. La carga de la batería se hace mediante un cable micro-USB con cualquier cargador de móvil, con el Kindle viene un cable adaptador USB a micro USB aunque el cargador lo tendremos que comprar a parte si como digo no tenemos un cargador de móvil.

También cuando compré el kindle adquirí una funda Belkin que tiene cierto acolchado. Esta era de las más barata que hay y aún así sigue siendo un poco cara para lo que es.

En otra entrada explicaré como realizar las conversiones para que queden lo mejor posible para la lectura utilizando los programas CalibreSigil o Mukomix (una pequeña utilidad que he desarrollado).

Aquí dejo una colección de imagenes del desempaquetado y como se ve un libro en el Kindle Touch:


















Si prefieres ver un vídeo del unboxing del kindle touch en el enlace anterior se puede ver junto con la comparación con el kindle no táctil.


Después de dos años de que compré el Kindle Touch Amazon ha sacado al mercado dos versiones mejoradas denominadas Kindle Paperwhite que ofrecen más resolución (de 600x800 del Touch a 758x1024 del Paperwhite) y con un mayor contraste con su pantalla más blanca proporcionada por una leve iluminación entre otras mejoras, en la wikipedia pueden compararse y ver las características de los diferentes modelos que Amazon ha lanzado hasta el momento.


Amazon Kindle Touck
Revisión por picodotdev el .
Galería de fotos y comentarios del desempaquetado del libro electrónico
Valor: 5

Referencia:
http://www.amazon.es/
Kindle Paperwhite

viernes, 10 de agosto de 2012

Análisis estático de código con PMD

PMD
Si seguimos las buenas prácticas de las metodologías ágiles en los proyectos que desarrollemos realizaremos pruebas unitarias y de integración a la vez que desarrollamos nuestro código. Ello nos permitirá no tener que realizar pruebas manualmente y asegurarnos de que las cosas siguen funcionando cuando hacemos cambios, si además disponemos de en servidor de integración continua las pruebas se podrán lanzar para cada cambio detectado en la herramienta de control de versiones que usemos.

Las pruebas unitarias y de integración son una cosa deseable y para algunos imprescindible, sin embargo, solo nos dicen que las partes probadas funcionan como se espera, no analiza nuestro código fuente. Analizar el código fuente puede proporcionarnos información para encontrar posibles errores, código muerto y que no se usa, código ineficiente, código demasiado complejo y código duplicado, ... que pasado el tiempo y con las diversas modificaciones seguramente tendremos. Siguiendo las indiciones de una herramienta de análisis de código podemos detectar esos posibles problemas de forma automatizada. Además, es seguro que en un equipo que desarrollan varias personas cada una codifique de una forma diferente, con una herramienta de estas como Checkstyle podemos establecer reglas de estilo de tal forma que consigamos un código más homogeneo y de nuevo más mantenible para todos.

Una de las herramientas más conocidas en la plataforma Java es PMD. Se puede integrar con la mayoría de IDEs y herramientas como Ant y Maven. Si queremos automatizar las pruebas lo integraremos con Ant, Maven o Gradle para no depender de un IDE y realizar las pruebas en la construcción de nuestro proyecto asi como poder ejecutarlas en el servidor de integración continua. Estos serían los trozos necesarios para integrar PMD con Gradle.

...
configurations {
    pmd
}

dependencies {
 ...
 pmd 'net.sourceforge.pmd:pmd:5.0.0'
 ...
}
...
task pmd << {
 ant.mkdir(dir:'build/pmd')
 ant.taskdef(name: 'pmd', classname: 'net.sourceforge.pmd.ant.PMDTask', classpath: project.configurations.pmd.asPath)
 ant.pmd {
  ruleset('java-basic,java-braces,java-codesize,java-naming,java-optimizations,java-unusedcode')
  formatter(type: 'html', toFile: 'build/pmd/pmd.html')
  fileset(dir: 'src/main/java') {
   include(name: '**/*.java')
  }
 }
}
...

Este es el informe que genera PMD para la aplicación Hola mundo con Tapestry 5.


En el siguiente enlace podemos ver las reglas ya predefinidas y que podemos aplicar a nuestro código. Si queremos analizar código groovy tenemos la herramienta CodeNarc.

Referencia:
http://pmd.sourceforge.net/
http://pmd.sourceforge.net/ant-task.html
http://pmd.sourceforge.net/rules/index.html
http://checkstyle.sourceforge.net/
http://www.gradle.org/
Elegir herramientas para un proyecto Java

viernes, 3 de agosto de 2012

JodaTime y como integrarlo con Hibernate

Java
Las clases proporcionadas en la API de Java para trabajar con fechas tienen varios defectos. JodaTime es una librería alternativa a las clases del JDK que trata de arreglarlos o no tenerlos, sus características son las siguientes:
    Hibernate
  • Fácil de usar: dispone de métodos para acceder de forma sencilla al año o al día del año entre otros.
  • Más fácil de exterder: se le pueden añadir nuevos calendarios de forma más sencilla que la necesaria en la API de Java.
  • Conjunto de características completo: proporciona mayor funcionalidad para el cálculo de fechas.
  • Interoperabilidad sencilla: es fácil de realizar conversiones entre el JDK y JodaTime.
  • Mejor rendimiento: solo realiza las operaciones minimas necesarias.
  • Documentación completa: tiene una guía de usuario y una API en javadoc
  • Madurez: está ampliamente probada desde su inicio de desarrollo en el 2002.
  • Código abierto: tiene una licencia Apache.
Aparte de estas características una de las más destacadas es que facilita la automatización de casos de pruebas que dependan de fechas ya que podemos establecer que la fecha altual de joda time sea una que esté en el pasado o en el futuro de forma sencilla (esto es haciendo new JodaTime() en vez de tener la fecha del sistema podemos hacer que la fecha sea la que queramos). Solo por esto ya merece la pena usarla aunque hay otras razones. Además de poder representar fechas con JodaTime pueden ser representados otros conceptos:
  • Instante: Representa un instante en el tiempo medido en milisegundos transcurridos desde el 1970-01-01T00:00Z.
  • Parcial: Un parcial no contiene contiene todos los campos pero añadiendoselos se puede obtener un instante (parcial + campos faltantes + zona horaria = instante).
  • Intervalo: Representa el periodo de tiempo de un instante a otro instante.
  • Duracion: Representa una duración de tiempo medido en milisegundos, instante + duracion = instante.
  • Periodo: Representa un perido de tiempo medido en terminos de campos como años, meses, días u horas. Un periodo de tiempo puede ser inexacto en términos de tiempo ya que tiene en cuenta cosas como los años bisiestos o los cambios de hora.
Además puede se integrada perfectamente con Hibernate de tal forma que en nuestras entidades de dominio podamos tener por ejemplo propiedades del tipo DateTime entre otras, evintandonos conversiones entre nuestro modelo y la representación con la que realizamos los cálculos y operaciones. Lo primero que deberemos hacer para tener esta integración entre Hibernate y JodaTime es incluir la propia librería de JodaTime y el soporte para Hibernate como dependencias a nuestro proyecto. Son las siguientes:
  • joda-time:joda-time:2.1
  • joda-time:joda-time-hibernate:1.3
La librería joda-time-hibernate proporciona soporte para la versión 3.6 de hibernate, si usamos hibernate 4 deberemos usar usertype:
  • org.jadira.usertype:usertype.parent:3.0.0.CR1
Ya usemos hibernate 3.6 o hibernate 4 y una u otra librería su uso es muy similar en ambas y se hace a través de anotaciones, aunque tambien se puede hacer a traves de los ficheros de mapeo de hibernate, las anotaciones son más recomendables y son de la siguiente forma:

...
import org.joda.time.DateTime;
...
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime fecha;
...

No hay más que usar la anotación @Type, es así de sencillo y una migración de los Date del JDK a DateTime de JodaTime no de debería ser muy complicada con la ayuda de un buen editor.

Si queremos establecer la fecha actual en el pasado o en el futuro podemos hacer uso del método de utilidad DateTimeUtils.setCurrentMillisFixed.

Referencia:
http://joda-time.sourceforge.net/contrib/hibernate/index.html
https://forums.oracle.com/forums/thread.jspa?threadID=1982257&start=0&tstart=0
http://joda-time.sourceforge.net/contrib/hibernate/userguide.html
http://usertype.sourceforge.net/