May 31

MoinMoinWiki

 

Acabo de descubrir una wiki para instalar la mar de interesante, se llama MoinMoinWiki. Necesita Phyton para funcionar, así que los usuarios de windows tendrán que instalarse ActivePython o algo parecido.

Supongo que se puede poner en un servidor Apache, aunque no lo he probado. Sin embargo, lo que más me ha llamado la atención es que se puede arrancar stand-alone, sin necesidad de tener ningún servidor web y sin ningún tipo de configuración. Te bajas el zip, lo despempaquetas, te vas al directorio principal, ejecutas

python moin.py

y listo, en localhost:8080 tienes funcionando una wiki. Por supuesto, puedes meterte en los ficheros de configuración y tocar lo que necesites, como el número de puerto o cualquier otra cosa. Esta característica lo hace ideal para una wiki particular donde organizar tus apuntes en tu ordenador o para una red pequeña (entre compañeros de trabajo, por ejemplo).

Otra de las cosas buenas que tiene esta wiki es que tiene un editor wysiwyg, además del típico editor en formato texto para texto en formato wiki. De esta forma, los más experimentados pueden seguir con su formato texto, pero los novatos pueden usar el modo wysiwyg.

Otra característica realmente interesante es que puedes hacer dibujos sobre la marcha. Hay un botón que al pulsarlo sale un editor sencillo de dibujos, estilo el tradicional paint de windows. Cuando salvas el dibujo, se inserta en la página que estás editando.

Y finalmente, otra característica muy interesante, es que tiene sintaxis coloreada para los lenguajes de programación, al menos para python. Yo he probado java y también sale coloreado.

Por último, comentar que es la wiki que se usa en Community Ubuntu Documentation, Apache General Wiki y varios otros sitios.

May 29

¿Es tan bueno maven?

Habitualmente usamos maven en el trabajo y estoy encantado. Hay muchas cosas que resuelve él solito y cuando lo tienes ya todo configurado es realmente una maravilla.

Sin embargo, hay un pequeño problema, que aunque conozco de hace tiempo, todavía no lo había sufrido o, aunque lo hubiera sufrido, no me había afectado. Sin embargo, hoy ha "cantado".

El problema son las dependencias. Imagina por ejemplo que tu proyecto decides depender de log4j-1.2.15.jar y de otra-libreria-1.3.jar. Aunque tú no lo ves, esta librería puede a su vez decir que depende de log4j-1.2.13.jar. Cuando compilas, haces tu despliegue, etc, etc … tienes en el classpath y en todos lados dos versiones de distintas de log4j. Si no son muy compatibles, puedes tener problemas al compilar o en ejecución.

Existe forma de decir que no quieres que se traiga las dependencias anidadas, pero eso ya requiere que las vayas identificando para decir "esta sí", "esta no".

El problema que se nos ha presentado hoy ha sido el siguiente: En un módulo que estamos desarrollando nuevo hemos metido un plugin de maven pmd que revisa las métricas del código (complejidad ciclomática, métodos largos, etc, etc), de forma que el compilado falla si las métricas no se cumplen. Pues bien, la versión en CVS a unos les compilaba y a otros les daba fallo de métricas.

Así que nos pusimos en dos ordenadores, uno en el que sí compilaba y oto en el que daba fallo. Revisamos que el proyecto está correctamente sacado de CVS sin cambios en ninguno de los dos lados, que toda la jerarquía de pom.xml hasta el padre es igual y nada, seguimos teniendo el problema.

Cogemos en ambos ordenadores y en el repositorio local de jars de maven borramos el del plugin de pmd. Compilamos … y sorpresa. Cada uno se baja una versión distinta de pmd. Una casca y la otra no. En ningún sitio ponemos la versión de pmd que queremos, así que maven se baja la que le apetece según algún criterio misterioso.

Así que ahí estamos, pensando si obligar a maven a bajar una determinada versión de pmd o si pasar del plugin este y dejar a la complejidad ciclomática evolucionar a su libre albedrío.

May 28

¿Cuánto mide el columpio de Heidi?

 

Esto no tiene mucho que ver con informática, pero supongo que no se puede ir por la vida sin saber cuánto mide el columpio de Heidi

La solución aquí : http://forum.lawebdefisica.com/showthread.php?t=1477

May 25

Sábado entretenido

 

Ayer, sábado lluvioso, encerrado en casa, decidí entretenerme con el ordenador. Al final, es curioso cómo pasas la tarde, yendo de un lado a otro, sin hacer nada concreto, pero aprendiendo un montón. Ahí va mi pequeña historia del sábado y cómo se van encadenando las cosas.

  • Tenía en mente una pequeña aplicación que me podía resultar de utilidad en el trabajo. Por supuesto la aplicación debía ser web y la iba a hacer en JSP. Me instalé Tomcat en Ubuntu e hice unas pruebas para ver que estaba bien instalado.
  • Me cree con maven y eclipse mi proyecto web con JSP para empezar a trabajar.
  • Mi aplicación va contra base de datos. Por cosas que había leído, me daba la impresión de que Tomcat puede gestionar las conexiones a base de datos con un pool de conexiones, liberando a la aplicación de tener que abrirse sus propias conexiones, así que me pongo a investigar el tema.
  • Encuentro tutoriales, hago todo lo que se supone que hay que hacer, pero no me funciona. Siempre obtengo una excepción de acceso denegado, no hay permisos. Me pongo a investigar cómo gestiona Tomcat el tema de permisos y descubro el fichero catalina.policy.
  • Por supuesto, no es tan fácil como tocar ese fichero. Tomcat lo genera automáticamente en el arranque machacando los cambios que hayas hecho, así que hay que buscar y tocar los ficheros que usa Tomcat para generar ese catalina.policy. Y por supuesto me doy cuenta de ese detalle después de tres o cuatro intentonas fallidas de tocar catalina.policy directamente.
  • Una vez que funciona todo, como no encontré ningún tutorial que diga como configurar el pool de conexiones y además te advierta del tema de permisos, me decido a escribir el mio propio en la wiki: Configurar un DataSource y dar permisos en Tomcat.
  • Al escribir el tutorial, además de explicar cómo se tocan los ficheros a mano, pongo que se puede hacer con el navegador si tenemos instalada la aplicación de administración de Tomcat. Se me ocurre poner una foto del panel de administración, pero pensando un poco, decido que queda más "guay" un video, así podría subir mi video a youtube. Pero claro, hay que capturar el video del escritorio.
  • Me pongo a buscar aplicaciones que capturen video del escritorio en Ubuntu. Encuentro un par de ellas y las pruebo. No me van bien. Al final, una de ellas graba bien pero si la lanzas desde línea de comandos, no desde la interface gráfica de usuario. Al arrancarla desde línea de comandos, en el video capturado se ve la ventana de comandos donde arranco la aplicación, cómo la oculto, cómo la vuelvo a visualizar y cómo paro la grabación.
  • Eso no es bonito, así que decido buscar un editor de video para cortar esos cachos. Encuentro uno pero …. no lee el formato .ogg ni .ogm que es en el que graba la aplicación anterior. Sospecha gorda. ¿admitirá youtube este formato?. Por supuesto, no. Hay que buscar un conversor de formatos.
  • Me pongo a ello, encuentro varios que no me funcionan bien o no me dejan el video como quiero. Al final lo consigo, como no, usando directamente la línea de comandos con ffmpeg. Y ahora empezamos con los "return":
    • Convierto el video a avi
    • Edito el video y le corto lo que sobra
    • Subo el video a youtube
    • termino el tutorial en la chuwiki
    • escribo otro tutorial sobre las herramientas de video probadas.
    • y ya son las y pico de la madrugada y me voy a la cama.

Al final, pasé toda la tarde (y parte de la noche) entretenido, no hice nada de la aplicación que quería hacer, pero he subido mi primer video a youtube (no tiene demasiada buena calidad), he escrito par de tutoriales en la wiki y he aprendido algunas cosas sobre Tomcat: DataSources y permisos.

¿De verdad los ordenadores ahorran trabajo?

May 24

Perdiendo el horizonte

 

No recuerdo dónde, así que no puedo poner el enlace, pero hace unos días leí en un foro a una persona que comentaba haber hecho un proyecto/programa de software y que ahora le pedían hacer la documentación del mismo. Dicha persona preguntaba por herramientas que hicieran algo de ingeniería inversa y le facilitaran el proceso de generar dicha documentación.

Ese post tenía algo así como tres mil respuestas y alguna más. Todas ellas, sin excepción y hasta donde alcancé a leer, criticaban a la persona diciendo cosas como "primero se hace la documentación y luego el código", "hay que pensar antes de codificar", "te pones a codificar a lo loco y así te va".

Bien, esa es la idea generalizada de todo el mundo. Todos "sabemos" que hay que hacer el diseño y la documentación antes que el código. Y lo hacemos porque "sabemos" que hay que hacerlo … pero ¿realmente hay que hacerlo?

La persona del foro no daba detalles en absoluto de su proyecto, pero por cosas como "he hecho" y "ahora me piden" podía perfectamente ser un trabajo de clase. No sé la envergadura de dicho programa, pero si es un trabajo de clase y no un proyecto fin de carrera, posiblemente sea un pequeño software de prácticas que se hace en unas semanas a ratos perdidos (cuando no estás en clase o estás estudiando otras asignaturas y no tienes la resaca del día anterior).

¿Por qué hay entonces que hacerle antes la documentación? ¿Por qué hay que plasmar en un papel lo que vas a hacer antes de hacerlo?

Este señor, posiblemente si pensó antes en lo que iba a hacer. Es más, ante un programa cuyo esfuerzo no se mide en hombres/mes, sino en persona/ratos libres, es perfectamente posible pensar sólo un poco la idea general antes y dejar para mientras se programa el pensar los detalles. Al ser sólo una persona y un programa pequeño, no necesita en absoluto dejar un documento oficial con su "declaración de intenciones", diseño preliminar, detallado, trazabilidad de requisitos, plan de proyecto, protocolos de pruebas…. Si lo hace, nadie nunca va a leerlo o usarlo y además se le pasará el curso. Es posible que esta persona mientras lo programa necesite consultar algo que haya apuntado previamente, pero lo había hecho en una hojilla guarra de papel, que le sirve perfectamente.

Si suponemos que el programa es para una práctica. Es decir, una vez que apruebe, nunca nadie jamás de los jamases va a volver a mirar ese programa. Posiblemente, incluso se pierda. Tampoco es necesaria en absoluto una documentación para su mantenimiento. Es más, salvo que sea con fines académicos, posiblemente el código ni siquiera necesite comentarios, que nunca nadie jamás va a leer.

Me da la impresión, sobre todo en gente con poca experiencia, que se cogen las cosas como "dogma de fé" sin pararse a pensar el por qué. Las cosas hay que hacerlas "así" porque se hacen "así".

Casi con seguridad al 100%, toda la necesidad y buenas costumbres de documentar antes de empezar el proyecto, partió de grandes empresas con grandes proyectos, plazos largos y muchos, muchos programadores involucrados. Ahí sí es imprescindible hacer una documentación seria al principio, de forma que todo el mundo tenga claro como encajan las cosas y que tiene que hacer o no hacer. Pero eso no hace en absoluto que documentar antes sea una buena práctica en TODAS las demás situaciones. Un claro ejemplo es el programa de prácticas de nuestro amigo, que posiblemente le "han pedido" la documentación como parte de su trabajo de clase, pero que no tiene ni tendrá nunca utilidad ninguna.

Y de hecho, para proyectos no demasiado grandes y con un grupo reducido de programadores, posiblemente también sea excesiva e inútil una documentación excesivamente oficial. Cuatro o cinco programadores pueden pensar en reuniones lo que van a hacer, plasmar si hace falta en papel los bloques principales de su proyecto, cómo se relacionan, y ponerse a codificar, con reuniones y pruebas de integración frecuentes. ¿no os suena de algo? Pues sí, justo lo que dicen la mayoría de las metodologías ágiles.

May 20

MessageFormat en Java

 

Java nos proporciona la clase MessageFormat para la construcción de mensajes de texto que se muestran en pantalla. En vez de construir un mensaje concatenando cadenas (para los puristas: no pongo StringBuilder para simplificar)

String mensaje = "se han encontrado " + numeroErrores + "errores";

deberíamos usar la clase MessageFormat, de esta manera

String mensaje = MessageFormat.format ("se han encontrado {0} errores", numeroErrores);

En este caso, MessageFormat reemplaza {0} por el valor de la variable que le pasamos. Podemos poner más variables poniendo {1}, {2}  y así sucesivamente.

¿Por qué es importante usar MessageFormat en vez de construir la cadena como en el primer ejemplo?

Aparte de que MessageFormat tiene más posibilidades que no menciono aquí, un motivo importante es la posible traducción a otros idiomas de nuestra aplicación. Antes de nada, que quede claro que no tengo ni papa de inglés, así que el ejemplo que pongo seguro que es totalmente incorrecto. Quédate con la idea y no con los detalles.

Supongamos que usamos la primera forma, construyendo el String a partir de varios cachos. Si para preparar el código para otro idioma usamos la internacionalización de nuestro IDE, lo más probable es que nos saque un fichero de propiedades con algo como esto

propiedad1=se han encontrado
propiedad2=errores

Ahora vamos y le damos esto a nuestro traductor favorito. El ve un trozo de frase y una palabra. De ninguna forma puede adivinar que forman parte de la misma frase, así que traduce cada cacho separado y nos lo da

propiedad1=have been found
propiedad2=errors

y la frase en nuestro código quedará como "have been found 3 errors". Ya digo que no sé inglés, pero posiblemente esta frase no está bien construida para un inglés.

Sin embargo, si hubiesemos usado MessageFormat, habríamos obtenido este fichero de propiedades

propiedad1=se han encontrado {0} errores

y advirtiendo al traductor que los {0} serán datos que se pongan en esa posición de la frase, él posiblemente lo traduzca por algo como

propiedad1={0} errors have been found

y el texto quedará "3 errors have been found". Insisto en que no sé inglés, pero posiblemente esta frase esté mejor construida que la anterior.

 

May 18

Ubuntu y los pen-drives

 

Bueno, pues tocó el momento de pelearme para que ubuntu me permita montar los pen-drive sobre la marcha.

Según se instaló, no lo hace. Cuando pongo un pen-drive, me da problema de permisos. Puse rápidamente unos chmod y chown del ejecutable ntfs-3g que encontré en el enlace, pero tampoco me funcionó, así que lo dejé temporalmente.

El otro día decidí ponerme a ello. Como no tenía a mano mi pen-drive de 2Gigas, cogí uno antiguo del ordenador, de 512Megas. ¡¡ Sorpresa !!. Lo puse y se instaló correctamente, con permisos de escritura y todo. ¿Quizás alguna actualización automática había arreglado el problema?. Iluso de mí, ilusionado, me fuí por mi pen-drive de 2Gigas y efectivamente, no se montó bien. Ya empezamos con las tonterías. Si uno sí y otro no, va a ser que no es problema del driver ni de permisos, sino otra cosa más "profunda".

Me voy a la página mencionada en el enlace anterior y me la leo con calma. Dice que necesito ntfs-3g versión 1.2506 o superior. Miro mi gestor de paquetes synaptic y la versión es 1.22xx. Pues nada, a actualizar. Voy a la página de instalación de ntfs-3g y sigo las instrucciones allí. Todo correcto y sin problemas, salvo una pequeña excepción, el pen-drive sigue sin montarse.

Eso sí, si arranco el ordenador con el pen-drive en su sitio, entonces se monta bien en el arranque y a partir de ahí puedo montarlo y demontarlo todas las veces que quiera, hasta que apago.

Bueno, volveré a dejarlo para más adelante.

May 15

Descastigado por google

 

Hace tiempo comenté que me habían crakeado el blog, metiendo enlaces ocultos de spam y que google me había castigado por ello, disminuyendo de forma considerable mi número de visitas.

De aquella actualicé mi versión de wordpress a la última versión disponible de forma automática en mi hosting. Pero eso no bastó. Al poco tiempo había vuelto a ser crakeado, así una y otra vez. El número de visitas seguía cada vez más bajo.

Al final me decidí a lanzarme de cabeza al agua. Me descargué manualmente la última versión de wordpress y la instalé a mano totalmente en mi hosting. Tuve el consabido problema de los acentos, pero que ya sé cómo arreglar. La instalación no me dio ningún problema especial.

Y ha sido todo un éxito. Con esta nueva versión no solo no me han vuelto a crakear, sino que a los pocos días noté el efecto en las visitas, como se puede ver en el gráfico. Google me había descastigado

Estadísticas google analytics

 

May 14

chuidiang-editores

 

Acabo de subir a google-code los fuentes de otro pequeño proyecto que me traigo entre manos, chuidiang-editores.

De momento son simplemente unas clases que heredan de JFormattedTextField y hace de editores simples: un EditorNumerico, EditorDate, EditorLongitud, EditorLatitud, etc. Por supuesto, intentando que sólo admitan números correctos, que se puedan poner restricciones, como que el número esté entre un mínimo y un máximo, etc.

También hay un EditorPanelGeneral. Es un JPanel al que se añaden editores de una forma simple y él se encarga del Layout y de colocarlos de forma automática. Este JPanel admite como dato un Hashtable. Con las claves identifica a qué editor pertenece el dato y se lo pasa. En el método getDato() devuelve un Hashtable con los datos de cada uno de los editores.

Y eso es más o menos lo que hay. La intención final es ligar todo esto con base de datos, de forma que para un conjunto de columnas dadas de unas tablas, se construya automáticamente el formulario y más adelante, facilitar también el tema de consultas e inserciones, así como la presentación en un JTable de los resultados, con sus botones de crear/editar/borrar, filtro, etc.

Ahí van algunos enlaces:

y sólo falta lo de siempre, porque empezar he empezado con ganas. Lo que hay que ver es lo que dura.

May 12

log4j 1.2.15

 

Normalmente en mis proyectos maven añado el log4j, siempre la versión 1.2.12. No por ningún motivo en particular. Símplemente era la versión disponible la primera vez que lo añadí a un proyecto maven y luego ha prevalecido el copy-paste de esa dependencia de un proyecto a otro.

El otro día cree un proyecto en casa y no tenía ningún sitio de donde copiar esta dependencia, así que me fuí a internet y busqué cómo ponerla. Puse la 1.2.15, que es la última que encontré disponible para maven.

Me pongo a compilar con maven, a generar el proyecto para eclipse y … ¡¡ Sorpresa !!. Da fallo. Busco el motivo y resulta que entre los jar que no puede bajarse, está el javamail, el activation.jar y algún otro más de los de SUN. Efectivamente, SUN no permite distribuir sus jar, por lo que oficialmente no se puede hacer. En los repositorios maven que hay por el mundo, no están estos jar de SUN, así que maven no se los puede bajar. Hay que bajárselos a mano y ponerlos en tu repositorio local de maven.

Y digo yo… ¿necesito javamail para log4j? Y aunque sea así, ¿voy a usarlo?. Pues más bien no. No tengo ningún interes en recibir por correo el log de mi aplicación y tampoco tengo ningún enemigo al que odie lo bastante como para mandárselo. Mejor dicho, sí lo tengo, pero lo que no tengo son ganas de quedarme de patitas en la calle.

Creo que esta vez se han pasado un poco. Entiendo que un momento dado, ante un error crítico, alguna aplicación crítica quiera enviar un correo a alguien. Pero, ¿es con un log.error(…) la mejor forma de hacerlo?. Desde luego puede ser cómoda en vez de usar javamail directamente, pero ¿tienen que cargar todas las aplicaciones que quieran un uso normal de log4j cargar con javamail?. A mi, desde luego, no me gusta.

Y aquí es donde llegamos a un punto donde siempre he tenido mis dudas. Por un lado la lógica y la elegancia me dicen que debería hacerse algo como log4j-core.jar con lo básico de log4j, es decir, sacar los log por pantalla o por fichero y poco más. Luego, deberían hacerse otros jar de amplicación, como log4j-mail.jar, log4j-bd.jar, etc, de forma que cada uno cargue sólo con lo que necesita. Sin embargo, la pereza me pediría que hubiera un único log4j-con-todo.jar y despreocuparme de andar buscando los que debo. Si me sobra el 90% del jar, da igual, no pasa nada.

Y esas dudas son las que siempre me corroen en el trabajo. Ante un proyecto gigante… ¿hacemos muchos jar pequeñitos por temas, de forma que en otros proyectos podamos llevarnos aquellos mini-jar que necesitamos? o por el contrario ¿hacemos un mega jar con todo y si un proyecto no necesita parte de él no pasa nada?

En la primera opción, al empezar un proyecto, debemos empezar a elegir jars que necesitamos y a coger también los jar de los que dependen esos jar. Afortunadamente maven nos ayuda en el proceso. Sin embargo, la segunda opción es menos elegante pero infinitamente más cómoda. Cuando empiezo el proyecto, me copio el mega-jar-que-lo-tiene-todo y a trabajar, sin más complicaciones.

¿Tú qué eliges?. ¿Elegancia o pereza?