31 octubre 2006

No es oro todo lo que reluce

Como ya he comentado, llevo varios días jugando y poniendo en marcha varias herramientas que se supone ayudan a las costumbres de buena programación: Cruise Control, Maven, Bugzilla, etc.

En el caso concreto de Maven estoy contento y ahorra mucho trabajo. También hay muchas cosas que es capaz de hacer y que ayudan, pero....

Maven es una herramienta gratuita desarrollada en plan libre y con montones de plug-ins propios o de terceros también en plan libre. El problema que tiene todo esto es que la documentación es escasa y dispersa por internet. El caso es que cuando quiero hacer algo, me puedo pasar unas cuantas horas buceando por google en busca de una respuesta.

Por ejemplo, no me funciona el comando mvn site:stage, y por lo que veo en internet, simplemente no funciona bien.

Tampoco acabo de encontrar cómo trata maven con las clases Remote de rmi y el rmic. Veo que había un plugin para maven 1, pero todavía estoy buscando a ver si encuentro algo para maven 2.

El plugin de cobertura, que ya mencioné en alguna ocasión, se encuentra fácilmente en la página de maven para maven 1, pero no para maven 2. Hay que irse a la página oficial de cobertura para desde ahí llegar el plugin para maven 2.

Algo similar me pasa con eclipse. Existen muchos plugins de terceros, pero algunos dan problemas o van retrasados respecto a las versiones nuevas. Me acabo de bajar eclipse 3.2 y el plugin de jalopy, para formatear código, me da problemas, a veces va, a veces no.

De todas formas, sigue mereciendo la pena meterse en estas cosas, ahorran mucho trabajo y es mejor pelearse o no disponer de alguna de estas funcionalidades secundarias que andar haciendo todo desde cero y a pelo.

26 octubre 2006

SimpleDateFormat y DecimalFormat

Últimamente me he tenido que pelear un poco con SimpleDateFormat y DecimalFormat.

No es que me haya tendio que pelear, porque tampoco son clases tan dificiles de usar, pero por un lado me he visto en la necesidad de convertir fechas en formato ddMMyy a formato dd/MM/yyyy y viceversa (cosas del trabajo).

Por otro lado, en algún foro y creo que ha sido a más de una persona, he contestado algunas dudas sobre el DecimalFormat. Además, según puse en un post anterior, me tropecé con una curiosidad que no sabía sobre los porcentajes y DecimalFormat.

En fin, que todo esto me ha animado a escribir en la Chuwiki un pequeño ejemplo de DecimalFormat comentando algunas de sus peculiaridades y otro con SimpleDateFormat.

25 octubre 2006

Cobertura Plugin Usage

Comenté de un plugin para maven que permite sacar un informe en el que sale qué trozos de código se han recorrido en los test unitarios y que trozos no se han recorrido.

Aquí está el cómo configurar maven para que coja ese pluging

Cobertura Plugin Usage: " org.codehaus.mojo cobertura-maven-plugin "

Una sesión de herramientas

Ultimamente me he instalado casi todas las herramientas instalables. Lo siguiente viene a ser más o menos un día de trabajo entre herramientas.

Cuando me pongo a trabajar, que no suele coincidir con el momento en el que llego al trabajo, abro el eclipse. Un plugin de eclipse, llamado mylar, se va a revisar nuestra página de bugzilla y me trae a eclipse todos los errores que alguien ha levantado en el proyecto. Simultánemente, veo en el thunderbird que bugzilla me ha enviado correos con los mismos bugs que se han levantado y mylar me ha traido a eclipse.

Reviso los errores y elijo uno para ponerme a trabajar. Con mylar lo marco como activo y en ese momento se pone en marcha automáticamente un cronómetro. Me dedico a revisar ficheros java, depurar y así hasta que encuentro el error. Desactivo (paro el cronómetro) del bug a la hora del café, cuando me interrumpen, etc y vuelvo a activarlo cuando sigo.

Cuando encuentro el error y lo corrijo, le digo a mylar que meta en cvs todos los ficheros que he tocado. Automáticamente pone un comentario en CVS del estilo "progresando en el bug ###". Añado al comentario algo más específico de lo que he hecho.

Le digo también a mylar que adjunte al bug de bugzilla mi contexto de eclipse. Esto guarda en bugzilla junto al bug un fichero xml en el que se dice qué ficheros he tocado para corregir el bug. Cualquier otro que tenga el mismo proyecto en eclipse con mylar, puede ver qué ficheros he tocado.

Finalmente, con mylar en eclipse marco el bug como "resolved fixed" o como "no me da la gana corregirlo (wontfix que diría bugzilla)" y mylar se encarga de tocar la página de bugzilla. Este último envía un correo a la persona que ha levantado el bug. Me autocomplazco un rato mirando con mylar el histórico de bugs que he resuelto en los últimos días y viendo cuánto tiempo he tardado en cada uno de ellos. Otras veces hago lo mismo, pero tirándome de los pelos viendo que un pueñetero bug lleva un par de días abierto y todavía no tengo ni idea de por donde van los tiros.

Un rato después, CruiseControl ve que he tocado ficheros en CVS del proyecto, así que automáticamente saca dichos ficheros y compila el proyecto entero desde cero. Cuando termina, me envía un correo diciéndome si los fuentes que he metido en CVS compilan o no correctamente.

Y todo herramientas gratuitas.

24 octubre 2006

jakarta commons io

Acabo de enterarme de otro proyecto de jakarta, el commons io, en el que hay montones de utilidades para java para el manejo de entradas/salidas. Entre otras, está por ejemplo la posibilidad de ver el espacio libre en disco duro, copia de ficheros, manejo de nombres de ficheros, manejo de ficheros de texto a base de leer líneas, etc, etc.

Aparte de la posible utilidad de todo esto, lo que más me llama la atención, como ando metido con maven y con sus informes sobre el proyecto, son los informes maven que han metido en su documentación.

El de checkstyle no lo conocía, pero parece que revisa las cosas típicas de estilo de java, como poner nombres de clases con mayúscula primero y minúscula después, métodos empiezan con minúscula, etc.

Me ha llamado especialmente la atención el de cobertura. Básicamente nos por qué partes de código han pasado nuestros test de JUnit y qué partes no han tocado. De esta forma sabemos lo completos que son nuestros test. Además, pinchando en las clases del informe, acabamos llegando al listado del fuente, en el que se marcan en verde y rojo las líneas por las que pasa o no pasa el test.

También me ha llamado la atención JDiff, que nos muestra las diferencias entre dos APIS de nuestro proyecto en distintas versiones, indicándonos qué clases se han añadido, borrado o modificado de una versión a otra, al igual que los métodos. Es curioso ver, por ejemplo, el JDiff aplicado a las versiones 1.4.2 y 1.5.0 de java.

Es increible la cantidad de cosas que hace la gente por el mundo, y lo más increible, gratis.

21 octubre 2006

Math.pow()

Es curioso, pero en este post del foro de java comentan que al hacer

Math.pow(-3.0, 1.0/3.0)

que teóricamente es la raíz cúbica de -3, que debería dar -1.44 aproximadamente, lo haces en java y sale NaN (Not a Number).

Revisando la API de Math.pow() vemos una cosa realmente curiosa, dice que ese es el comportamiento esperado
  • If the first argument is finite and less than zero
    • if the second argument is a finite even integer, the result is equal to the result of raising the absolute value of the first argument to the power of the second argument
    • if the second argument is a finite odd integer, the result is equal to the negative of the result of raising the absolute value of the first argument to the power of the second argument
    • if the second argument is finite and not an integer, then the result is NaN.



Bueno, pues no deja de ser curioso este comportamiento tan inesperado que impide echar ciertas cuentas. No el caso de la raíz cúbica, que se puede hacer con el método Math.cbrt() (CuBic RooT), pero sí el de las raices impares de más rango que la cúbica.

19 octubre 2006

Reconocedor de idiomas

Hace mucho, mucho tiempo leí en una revista "Scientific American" la forma de que un programa pueda reconocer un idioma o incluso generar un texto, por ejemplo en Alemán, de forma que aunque el texto no tenga sentido ninguno, una persona que no sepa Alemán lo identificaría inmediatamente como Alemán.

El algoritmo es bien sencillo. Basta tener varios textos de muestra en varios idiomas y hacer unas estadísticas sobre el número de apariciones de las letras o de las parejas de letras o de trios de letras. Por ejemplo, "hola", tiene las parejas "ho", "ol" y "la".

Cuando queramos saber un texto de qué idioma es, basta con comparar sus grupos de letras con los que tenemos en los distintos idiomas, para ver a cual se parece más.

En cuanto a generar el texto, sólo hay que apuntar después de cada pareja de letras, qué letra suele seguir a esa pareja concreta, qué probabilidades tiene cada letra de seguir a una pareja. En inglés, por ejemplo, detrás de un "th" es bastante posible que vaya una vocal y casi imposible que vaya otra consonante. Para generar el texto basta con elegir la primera pareja de letras e ir generando las siguientes letras de acuerdo con esas probabilidades.

Bien, pues al menos de la primera parte, la de reconocer el idioma, he hecho un pequeño programa de ejemplo en java, que por supuesto puedes probar en forma de Applet, bajarte los fuentes o el jar como aplicación independiente. Por supuesto, también, no garantizo en absoluto que funcione bien y sólo sirve para jugar un poco con él si te interesa el tema.

Lo de generar el texto, seguramente lo añada dentro de poco.

Dreamweaver

La verdad es que soy un poco "rupestre".

Empecé con la informática allá en los tiempos del sinclair zx81 (anterior al Spectrum). Luego seguí con los ordenadores de fósforo verde y aprendí a escribir a máquina antes de usarlos. En el trabajo caí en un cutre-empresa que trabajaba con estaciones de trabajo unix y no se gastaban un duro en entornos de desarrollo, así que pasé muchos años programando con el vi (uno de los mejores editores del mundo), pero que está muy orientado a comandos desde teclado.

Todo esto hace que sea un usuario muy orientado a usar el teclado y que el ratón muchas veces sea más una molestia, algo que retarda el hacer las tareas, más que una ayuda.

Por ello quizás, siempre me han gustado los programas simples, sin demasiadas ventanas y con posibilidad de hacer las cosas con teclas en vez de ir con el ratón a un menú y navegar entre submenus y submenus de submenus.

Hasta no hace mucho, para mi página web, usaba el netscape composer. Una herramienta gratuita y simple, pero que permitía escribir fácilmente y tocar directamente el código html. Para mí siempre ha sido una de las herramientas más cómodas para trabajar con html. Probé por encima varias más avanzadas, como la de microsoft que venía con visual studio 6 (no recuerdo el nombre), dreamveaver, etc. Todas me parecieron muy engorrosas. Para hacer una simple página web pedían cosas como montar un sitio web, definir un montón de parámetros, si te descuidas te lo suben al servidor web, etc.

Sin embargo, hace poco me puse Dreamveaver y me puse a mirarlo con un poco más de detalle. Sigue pareciendome una herramienta engorrosa. Nada más abrirla sale un "ventanón" con montones de subventanas que no sé para qué sirven (ni las he usado en el tiempo que llevo) y el espacio de trabajo (para escribir tu página) es más bien reducido.

Pero he visto que tiene pequeñas maravillas. Todo lo que echaba en falta en una herramienta simple como netscape composer, lo tiene esta herramienta. Las cosas más útiles que he encontrado son:
  • Revisa todos los vínculos de tu sitio, indicándote si hay alguno erroneo. Para un sitio como el mio tarda un rato, pero lo hace
  • Si cambias el nombre de una página o la mueves de directorio, arregla todos los links en las demás. Con netscape composer ese era el principal motivo para NO mover las cosas. netscape no hace eso. ¡¡La de horas que me he pasado cambiando y revisando links!!
  • Y lo mejor de todo, el tema de plantillas. Puedes hacer un esqueleto de página web con huecos para rellenar más adelante. Ese esqueleto se graba como plantilla. Cuando luego quieras crear la página, le dices que es según la plantilla y llisto. Te sale la página con su formato y los huecos para que pongas el texto. Si cambias la plantilla, se cambia automáticamente el formato de todas las páginas. ¡¡La de horas que me he pasado cambiando el aspecto de las páginas una a una!!
Modernizarse o morir...

17 octubre 2006

Jasper Report

Con un ejemplo tonto que me hizo un compañero de trabajo y el correo que me envió John, de Colombia, he hecho un guia-burros de Jasper Report. No es más que una especie de "Hola mundo", pero por algo se empieza.

Espero que algún Rodrigo de riolambre, que creo que un poquito de esto sabe, colabore y meta más cosas en la Chuwiki esa. Si no, cualquier otro que sepa un poco del tema está invitado a tocarlo.

14 octubre 2006

DecimalFormat

Una pequeña estupidez, que está comentada, pero me he tropezado con ella, sobre la clase DecimalFormat de java.

Resulta que si como formato de números ponemos "%" o algo con ese caracter, como "###.##%", la clase multiplica el número por 100 y lo pone en formato de tanto por ciento.

DecimalFormat formateador = new DecimalFormat("%");
System.out.println (formateador.format(0.344));

devuelve como salida

%34

Mientras que

DecimalFormat formateador = new DecimalFormat("###.## %");
System.out.println (formateador.format(0.344));

devuelve como salida

34,4 %

Es una buena forma de evitar ir multiplicando o dividiendo el número en código. Normalmente para cuentas con porcentajes suele venir mejor usar el tanto por uno. Lo del tanto por ciento normalmente es para mostrar en pantalla.

Me explico:
  • Para calcular el 34% de un numero, lo más fácil es hacer numero*0.34 y no la cuenta habitual de numero*34.0/100.0
  • Para calcular qué porcentaje es un número a de un número b, lo fácil es hacer a/b que lo devuelve en tanto por uno, y no lo de a/b*100.0 que lo devolvería en tanto por ciento.
  • etc, etc.
Vaya, que nos ahorramos andar arrastrando por el código el dichoso 100...

13 octubre 2006

ono

Me acabo de dar de alta en ono y ya puestos a hacer gasto, lo he cogido todo: televisión, teléfono e internet.

Me dí de alta por teléfono un martes. Ese mismo día me dijeron que el técnico vendría a ponerme los cables el siguiente martes sobre las cinco y media, hora que yo había solicitado. El técnico aparecio puntual y tardó casi dos horas en instalar todo. No es complejo, pero son tres cables que tiene que llevar por la casa y dos aparatos a instalar, el decodificador de tv y el cable modem para el internet. Cuando se fué sólo funcionaba internet. El decodificador que trajo estaba mal y el teléfono no lo probamos, poque me comentó que el cajetín de telefonos de la calle estaba mal y a mí no me llegaba señal.

Volvió al día siguiente por la mañana, con un decodificador nuevo y habiendo arreglado lo del teléfono. Con ello ya tenía el decodificador de TV en condiciones y señal en el teléfono. Sin embargo, el teléfono iba a medias, podía hacer llamadas interprovinciales pero no locales. La tele seguía sin ir. El tema es que todavía no me habían dado de alta en el servicio.

Esta mañana tempranito (Viernes después de un Jueves festivo) ya estaba todo funcionando. El internet funcionó desde el primer día. El teléfono y la televisión, desde que llamé para darme de alta hasta que lo he tenido en marcha, han pasado semana y media.

En general, salvo esas pequeñas vicisitudes que se solucionaron rápido, el servicio ha ido bastante bien. El técnico puntual, venía cuando decía que iba a venir.

12 octubre 2006

Ares

En su día probé un poco con e-mule y con Kazaa.

El primero me dejaba el ordenador colgado. Después de mucho mirar, buscar por los foros y demás vi que no era el único al que le pasaba y la conclusión a la que llegué al final es que era algún tipo de incompatibilidad con mi tarjeta de red, una D-Link Airplus DWL-520+

El Kazaa no tenía ese problema, al menos con tanta frecuencia, aunque sí me dejaba colgado el ordenador de pascua en ramos.

Ahora, aparte de que tengo otra tarjeta de red (no wi-fi), acabo de hacer unas pruebas con Ares. Me ha dejado maravillado este programa, comparado con los otros dos. No hay tantísimos ficheros para descargar como había en e-mule, pero es miles de veces más rápido bajando cosas. Aparentemente no lleva ningún tipo de ad-ware como llevaba kazaa y no hay que andar configurando cosas raras como en e-mule. En fin, un programa sencillo de usar y muy veloz descargando.

10 octubre 2006

Eclipse y CVS

Bueno, ahora que han pasado unas horas desde mi última experiencia de eclipse con cvs, creo que no voy a echar demasiados juramentos.

Mi experiencia con el cvs de eclipse, "team" según el menú de eclipse, no es nada buena. Le veo muchas pegas que o bien no he sabido solucionar, o bien no se puede. Voy a enumerar algunas de las que menos me gustan:

  1. No puedes poner en eclipse un proyecto cvs que ya tengas fuera. Eclipse obliga a hacer él el checkout del proyecto. Al hacerlo así, mete además con los fuentes sus ficheros de proyecto .classpath y .project. No he conseguido hacer funcionar cvs sobre un proyecto de cvs que tuviera previamente sacado.
  2. No consigo hacer updates recursivos por los directorios. Cuando alguien toca algo en cvs, debo irme desde línea de comandos de ms-dos o bash al directorio en cuestión y hacer el update a mano, o bien ir en eclipse, paquete por paquete, haciendo update.
  3. Si cambio de nombre un paquete, con las opciones de refactor, eclipse "borra" el paquete viejo, pero no de cvs. Sin embargo, haciendo updates tampoco lo saca. Debe acordarse que ese paquete tiene ahora otro nombre. ¿Como borro el paquete de cvs?. Desde eclipse imposible, porque ni siquiera puedo verlo. Hay que irse nuevamente a una ventana de ms-dos o bash y hacerlo a mano.
  4. De vez en cuando falla y marca paquetes como que los tengo editados, pero no muestra ningún fichero editado. Veo también que se "corrompe" el fichero Root de algunos directorios CVS, de forma que queda inutilizable y no me queda más remedio que repararlo a mano.
En fin, Eclipse me parece maravilloso en muchos aspectos, como la cantidad de plug-ins gratuitos que tiene, muchos más que netbeans. También me parece maravilloso su forma de hacer código y las opciones de refactoring. Pero desde luego, con cvs es mejor no meterse si no quieres perder la ilusión por este IDE.

Eclipse y CVS

Bueno, ahora que han pasado unas horas desde mi última experiencia de eclipse con cvs, creo que no voy a echar demasiados juramentos.

Mi experiencia con el cvs de eclipse, "team" según el menú de eclipse, no es nada buena. Le veo muchas pegas que o bien no he sabido solucionar, o bien no se puede. Voy a enumerar algunas de las que menos me gustan:

  1. No puedes poner en eclipse un proyecto cvs que ya tengas fuera. Eclipse obliga a hacer él el checkout del proyecto. Al hacerlo así, mete además con los fuentes sus ficheros de proyecto .classpath y .project. No he conseguido hacer funcionar cvs sobre un proyecto de cvs que tuviera previamente sacado.
  2. No consigo hacer updates recursivos por los directorios. Cuando alguien toca algo en cvs, debo irme desde línea de comandos de ms-dos o bash al directorio en cuestión y hacer el update a mano, o bien ir en eclipse, paquete por paquete, haciendo update.
  3. Si cambio de nombre un paquete, con las opciones de refactor, eclipse "borra" el paquete viejo, pero no de cvs. Sin embargo, haciendo updates tampoco lo saca. Debe acordarse que ese paquete tiene ahora otro nombre. ¿Como borro el paquete de cvs?. Desde eclipse imposible, porque ni siquiera puedo verlo. Hay que irse nuevamente a una ventana de ms-dos o bash y hacerlo a mano.
  4. De vez en cuando falla y marca paquetes como que los tengo editados, pero no muestra ningún fichero editado. Veo también que se "corrompe" el fichero Root de algunos directorios CVS, de forma que queda inutilizable y no me queda más remedio que repararlo a mano.
En fin, Eclipse me parece maravilloso en muchos aspectos, como la cantidad de plug-ins gratuitos que tiene, muchos más que netbeans. También me parece maravilloso su forma de hacer código y las opciones de refactoring. Pero desde luego, con cvs es mejor no meterse si no quieres perder la ilusión por este IDE.

04 octubre 2006

Cruise Control

Bueno, ya he estado jugando más y tengo más claro lo de Cruise Control.

Una vez instalado y configurado Cruise Control, tiene asignada un area de trabajo con los fuentes de los proyectos. Normalmente está dormido y espera cierto tiempo (el que le digamos en la configuración) para despertar. Cuando despierta, mira los proyectos (a través de CVS o el sistema de control de versiones que usemos) para ver si alguien ha cambiado algún fichero fuente. Si ve que ha habido cambios, puede o no traerse los nuevos fuentes (según le indiquemos en la configuración) y llama al script de compilado del proyecto. Se lleva bien con maven y con ant, por lo que nos vale perfectamente con el pom.xml (de maven) o el build.xml (de ant).

Si la compilación es correcta, en http://localhost:8080 se puede ver que todo ha ido bien. Si falla, se ve el fallo en el mismo sitio y además puede incluso enviar un correo a la persona que indiquemos.

Es curioso, pero en esa página de localhost se ve si ha ido bien o no la compilación y los fuentes que se han tocado y provocado la compilación.

En fin, que lo tengo arrancado y en marcha con un par de proyectos y parece que funciona bien. En cuanto alguien mete algo en CVS que no compila, la herramienta se "chiva" al jefe de proyecto ;-).

03 octubre 2006

Cruise Control

Siguiendo, en el trabajo, con la manía de probar nuevas herramientas que se supone que nos pueden ayudar, ayer me bajé e instalé Cruise Control.

Es una herramienta, gratis por supesto para que se la pueda permitir mi cutre-empresa, que supuestamente compila los proyectos desde cero todos los días (o cada cierto tiempo que le indiquemos). Si el proyecto tiene test de JUnit o similar, también los ejecuta. Si algo falla, se puede configurar para que envíe un correo a la gente implicada, responsables del proyecto o lo que sea.

La instalación para windows es fácil, simplemente se ejecuta el instalable y ya está. El tema de la configuración me ha parecido más complejo.

En primer lugar, los resultados del compilado parece que se pueden ver en formato web con jsp. Eso parece indicar que es necesario instalar un Tomcat o similar, pero no. Cruise Control viene con una cosa (creo que se llama Jetty) que hace las veces.

La documentación que da parece que está un poco obsoleta para la versión más moderna. En los ficheros de configuración de ejemplo que copie, tuve que descomentar algunas lineas que venían comentadas y comentar (eliminar) otras que estaban sin comentar. En fin, que a base de probar y de intuición "femenina" conseguí, en unos minutos que me compilara un proyecto y después de varias horas, ver los resultados en un navegador.

Para que Cruise Control pueda compilar el proyecto, es necesario que haya un build.xml de ant o un pom.xml de maven que sea capaz de compilar el proyecto, puesto que Cruise Control lo unico que hace es llamar a uno de esos y recoger los resultados. Cruise Control también es capaz de detectar si ha cambiado algún fuente en cvs de forma que hace o no la compilación según lo considera necesario.

Me queda configurar lo de que envíe correos.