foo-bar Un blog sobre esto y lo otro 2009-09-12T19:50:22+00:00
This is an Atom syndication feed. It is intended to be viewed in a news aggregator or syndicated to another site. Please visit the Atom Project for more information.
Cine the-shaker: that blog/flickr/multimedia-aggregator kind of thing foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2009/09/12/el-nino-ya-cuenta-flickr El niño ya tiene cuenta en Flickr 2009-09-12T19:50:22+00:00 2009-09-12T19:50:22+00:00 <p>Se pueden ver sus fotos organizadas en <a href="http://www.flickr.com/photos/juanpablo-santos/sets/">álbumes</a>, por <a href="http://www.flickr.com/photos/juanpablo-santos/tags/">etiquetas</a> o en la <a href="http://www.flickr.com/photos/juanpablo-santos/">galería</a>. El <a href="http://api.flickr.com/services/feeds/photos_public.gne?id=39809498@N04&lang=es-us&format=rss_200">feed RSS</a> correspondiente ya ha sido añadido en la sección de enlaces de la derecha. Y de regalo, una fotico:</p> <p><a href="http://www.flickr.com/photos/juanpablo-santos/3905018492/" title="cielo y mar por juanpablo.santosrodriguez, en Flickr"><img class="imgcen" src="http://s3.amazonaws.com/lcp/foobar/myfiles/cielo-y-mar.jpg" alt="" /></a></p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2009/06/11/habilitar-jmx-un-entorno-produccion habilitar JMX en un entorno de producción 2009-06-11T18:52:49+00:00 2009-06-11T18:52:49+00:00 <p>Esta anotación describe como habilitar las extensiones JMX con autenticación y/o SSL. Hace poco tuvimos que hacerlo en el trabajo y dado que no he encontrado documentación al respecto en casi ningún sitio, se queda aquí para que no se me olvide.</p> <p><a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html" title="JMX">JMX</a> por cierto, es una de las técnicas que se usa para interactuar con una JVM remota:</p> <p><img src="http://s3.amazonaws.com/lcp/foobar/myfiles/arch-jmx-overview.jpg" alt="arquitectura JMX" title="arquitectura JMX" class="imgcen" width="460" /></p> <p>Casi cualquier tutorial disponible en Internet tiende a centrarse más en el uso del API que en su configuración, la cual se suele resumir en arrancar la máquina virtual con al menos tres parámetros (<i>java -D..</i>):</p> <ul> <li><b>com.sun.management.jmxremote.port</b>: puerto a través del cuál nos conectamos a la JVM remota, por poner un ejemplo, el <i>8888</i>.</li> <li><b>com.sun.management.jmxremote.ssl</b>: establece el uso de SSL; para no complicarse mucho la vida se suele poner a <i>false</i>.</li> <li><b>com.sun.management.jmxremote.authenticate</b>: establece si hay que identificarse para poder conectarse a la JVM remota; para no complicarse mucho la vida se suele poner a <i>false</i>.</li> </ul> <p>Esto, que está muy bien para hacer pruebecillas caseras, no es muy aconsejable en entornos de producción. De hecho, no es nada aconsejable: los servidores de aplicaciones suelen publicar MBeans JMX que permiten interactuar con prácticamente cualuiqer funcionalidad del servidor, por ejemplo, pueden permitir ejecutar una query (cualquier query) SQL para "comprobar" el estado de un pool de conexiones, se puede mandar una orden al servidor para que se apague... Como éstas, se pueden hacer 200 más, por lo que se hace necesario securizar el acceso por JMX a una JVM. Para esto tenemos dos opciones, no exclusivas:</p> <p><b>1) Securizar el acceso usando usuario/contraseña</b></p> <p>Tal cómo se explica en <a href="http://www.javapassion.com/handsonlabs/jconsole/index.html" title="javapassion LAB-1045">javapassion</a>, hay que configurar dos ficheros, la propiedad <b>com.sun.management.jmxremote.authenticate</b> debe ir a <i>true</i>, y deben añadirse dos propiedades más cuándo se lanza la JVM:</p> <ul> <li><b>com.sun.management.jmxremote.access.file</b>: especifica la ruta al fichero de acceso.</li> <li><b>com.sun.management.jmxremote.password.file</b>: especifica la ruta al fichero de contraseñas.</li> </ul> <p>Por motivos de seguridad, ambos ficheros deben ser accesibles únicamente por el usuario que arranca la JVM. Bajo Linux/Unix esto se consigue con las órdenes:</p> <div class="codefoo"> $ chmod 0600 jmx.access<br /> $ chmod 0600 jmx.password </div> <p>Bajo Windows hay que dar <a href="http://www.javapassion.com/handsonlabs/jconsole/docs/security.html#How_to_set_permission" title="establece permisos a un fichero para dar acceso a un solo usuario">alguna vuelta más</a>, o bien se puede ejecutar desde una consola de comandos las siguientes órdenes, que para el caso va a ser lo mismo:</p> <div class="codefoo"> $ cacls jmxremote.password /P [username]:R<br /> $ cacls jmxremote.access /P [username]:R </div> <p>siendo <b>[username]</b> el usuario con el que queremos tener acceso al fichero. En caso de no aplicar estas políticas de seguridad a los ficheros, nos encontraremos con errores del tipo "Password file read access must be restricted".</p> <p><b>2) Securizar el acceso usando SSL</b></p> <p>Por un lado, la JVM que monitoriza (el cliente JMX) debe arrancarse con la propiedad <b>com.sun.management.jmxremote.ssl.need.client.auth</b> a <i>true</i>, mientras que la JVM monitorizada debe ir con la propiedad <b>com.sun.management.jmxremote.ssl</b> a <i>true</i>. Una vez esta última propiedad está a <i>true</i>, se deben indicar el resto de propiedades <b><a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#properties" title="propiedades SSL específicas de JMX">com.sun.management.jmxremote.ssl.*</a></b>, que vienen convenientemente detalladas en el enlace anterior. </p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2009/01/15/restrospecter-scout-corrupto restrospecter - el scout corrupto 2009-01-15T23:41:33+00:00 2009-01-15T23:41:33+00:00 <object width="425" height="344"> <param name="movie" value="http://www.youtube.com/v/9QqygfGrK44&hl=es&fs=1&color1=0x006699&color2=0x54abd6"></param> <param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <embed src="http://www.youtube.com/v/9QqygfGrK44&hl=es&fs=1&color1=0x006699&color2=0x54abd6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed> </object> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/09/18/detalle-la-estatua-daniel-o-connell-o-connell-street Detalle de la estatua de Daniel O'Connell, O'Connell street, Dublín 2008-09-18T22:33:18+00:00 2009-09-11T21:54:50+00:00 <p><a href="http://www.flickr.com/photos/juanpablo-santos/3903989717/" title="detalle de la estatua de daniel o'connell (1) por juanpablo.santosrodriguez, en Flickr"><img src="http://www.lacoctelera.com/myfiles/foobar/IMGP0206_sm.JPG" alt="Detalle de la estatua de Daniel O'Connell, O'Connell street, Dublín" class="imgcen"></a> </p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/09/15/uso-del-plugin-cobertura-dentro-un-proyecto-multi-modulo-en Uso del plugin Cobertura dentro de un proyecto multi-módulo en Maven 2 2008-09-15T20:54:46+00:00 2009-06-09T23:51:07+00:00 <p><strong>Situación inicial:</strong> supongamos la siguiente estructura de proyecto</p> <div class='codefoo'> ./project<br /> |-pom.xml<br /> |-project-api<br /> | |- pom.xml<br /> |-project-impl-1<br /> | |- pom.xml<br /> |-project-tests<br /> | |- pom.xml </div> <ul> <li>En este proyecto los tests correspondientes a project-api se encuentran en el módulo <tt>project-tests</tt>, lo cuál está considerado como una buena práctica. Este módulo únicamente contiene los tests, es decir, las carpetas <tt>./src/main/java</tt>, <tt>./src/main/resources</tt>, etc. están vacías.</li> <li>El plugin de <a href="http://mojo.codehaus.org/cobertura-maven-plugin/usage.html">Cobertura</a> se encuentra configurado correctamente.</li> </ul> <p><strong>El problema:</strong> los tests de <tt>project-tests</tt> se ejecutan correctamente, si bien no se está obteniendo la cobertura de los mismos, el plugin de Cobertura solamente es capaz de dar la cobertura del código dentro de un mismo módulo.</p> <p><strong>Análisis:</strong> Cobertura sólo instrumenta las clases dentro de un mismo módulo, dejándolas en el directorio <tt>./target/generated-classes/cobertura</tt>, para luego usarlas al calcular la cobertura del código. Buscando la manera de solucionar todo esto, la única referencia la he encontrado en la <a href="http://seamframework.org/Documentation/SeamTestCoverageWithCobertura">documentación de Seam</a>, el framework open source de la gente de Hibernate y compañía (de hecho este post <strike>ha sido fusilado</strike>tiene exactamente la misma estructura que la página referenciada). </p> <p>La solución que se propone en el enlace anterior pasa por incrustar un script de Ant que copia las clases instrumentadas de un módulo a otro, ejecuta el plugin de Cobertura y deja los resultados en el proyecto inicial. La solución que se va a exponer deja los resultados del test de cobertura en el proyecto correspondiente a los tests (lo cual me parece más correcto), es más concisa y más a la <em>Maven way</em>.</p> <p><strong>Solución:</strong> el plugin de Cobertura se ejecuta al lanzar el <tt>site</tt> del proyecto, por lo que vamos a aprovechar para montar un jar con las clases instrumentadas y subirlo a nuestro repositorio local (es decir, ejecutar un <tt>install</tt> y no un <tt>deploy</tt>, ya que no nos interesará que este nuevo <tt>.jar</tt> esté en nuestro repositorio público). Enlazaremos la ejecución de los <em>plugins</em> a la fase de <tt>site</tt>, que es cuándo se generan las clases instrumentadas de Cobertura.</p> <p>Así pues, en el <tt>pom.xml</tt> del módulo <tt>project-impl-1</tt> incluimos las siguientes entradas:</p> <div class='codefoo'> [...]<br /> &lt;build><br /> [...]<br /> &lt;plugins><br /> [...]<br /> &lt;plugin><br /> &lt;groupId>org.apache.maven.plugins&lt;/groupId><br /> &lt;artifactId>maven-jar-plugin&lt;/artifactId><br /> &lt;executions><br /> &lt;execution>&lt;!-- jar con las clases instrumentadas por cobertura --><br /> &lt;id>cobertura-jar&lt;/id><br /> &lt;phase>site&lt;/phase><br /> &lt;goals><br /> &lt;goal>jar&lt;/goal><br /> &lt;/goals><br /> &lt;configuration><br /> &lt;classifier>cobertura&lt;/classifier><br /> &lt;classesDirectory>${basedir}/target/generated-classes/cobertura&lt;/classesDirectory><br /> &lt;/configuration><br /> &lt;/execution><br /> &lt;/executions><br /> &lt;/plugin></p> <p> &lt;plugin>&lt;!-- instalamos el jar en el repositorio local --><br /> &lt;groupId>org.apache.maven.plugins&lt;/groupId><br /> &lt;artifactId>maven-install-plugin&lt;/artifactId><br /> &lt;executions><br /> &lt;execution><br /> &lt;id>cobertura-install&lt;/id><br /> &lt;phase>site&lt;/phase><br /> &lt;goals><br /> &lt;goal>install&lt;/goal><br /> &lt;/goals><br /> &lt;configuration><br /> &lt;classifier>cobertura&lt;/classifier><br /> &lt;/configuration><br /> &lt;/execution><br /> &lt;/executions><br /> &lt;/plugin><br /> [...]<br /> &lt;/plugins><br /> [...]<br /> &lt;/build><br /> [...] </div> <p>La clave está en el elemento <tt>classifier</tt>, que nos permite generar el jar que queremos añadiéndole el sufijo que le indicamos, lo cual nos permite generar varios <tt>.jars</tt> distintos dentro de un mismo proyecto Maven 2.</p> <p>En el módulo de tests, configuramos el plugin de Cobertura para que utilice el <tt>.jar</tt> con las clases instrumentadas (esto es, lo añadimos como dependencia al plugin) y sobreescribimos el elemento <tt>sourceDirectory</tt>. Este último paso es necesario debido a que Cobertura necesita tener acceso a los fuentes para generar el informe de cobertura del código. En fin, que en el <tt>pom.xml</tt> correspondiente a <tt>project-tests</tt> incluimos las siguientes entradas:</p> <div class='codefoo'> &lt;build><br /> &lt;sourceDirectory>${basedir}/../project-impl-1/src/main/java&lt;/sourceDirectory></p> <p> &lt;plugins><br /> &lt;plugin><br /> &lt;groupId>org.codehaus.mojo&lt;/groupId><br /> &lt;artifactId>cobertura-maven-plugin&lt;/artifactId><br /> &lt;dependencies><br /> &lt;dependency>&lt;!-- cobertura necesita tener las clases instrumentadas en el classpath --><br /> &lt;groupId>atlas.dpugd&lt;/groupId><br /> &lt;artifactId>project-impl-1&lt;/artifactId><br /> &lt;version>1.0.0&lt;/version>&lt;!-- se sobreentiende que esta versión es la generada en el pom de &lt;tt>project-impl-1&lt;/tt> --><br /> &lt;classifier>cobertura&lt;/classifier><br /> &lt;/dependency><br /> &lt;/dependencies><br /> &lt;/plugin><br /> &lt;/plugins></p> <p> &lt;/build> </div> <p><em>et le vôila</em>, ya hemos conseguido la cobertura de los tests dentro de un proyecto multi-módulo de Maven 2 y lo más importante, integrándolo de un modo transparente dentro del proceso de generación de la documentación, sin tener que efectuar ningún paso intermedio adicional. </p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/08/13/pintada-lavapies Pintada en Lavapiés 2008-08-13T19:05:53+00:00 2009-09-11T21:52:54+00:00 <p><a href="http://www.flickr.com/photos/juanpablo-santos/3904077903/" title="pintada en lavapiés por juanpablo.santosrodriguez, en Flickr"><img class="imgCen" title="pintada en Lavapiés" src="http://www.lacoctelera.com/myfiles/foobar/lavapies-sm.JPG" alt="pintada en Lavapiés" width="431" height="323" /></a></p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/07/26/incluir-fuentes-y-javadocs-un-proyecto-maven-2 Incluir fuentes y javadocs en un proyecto Maven 2 2008-07-26T12:45:45+00:00 2008-07-26T12:45:45+00:00 <p>Por defecto, cuando se instala un artefacto en el repositorio de Maven 2, se incluye nada más que el ejecutable (.jar, .war, etc.) generado. Si más gente va a trabajar con nuestro desarrollo puede ser buena idea incluir en nuestro repositorio tanto los fuentes como los javadocs asociados al proyecto, cosa que hacen la gran mayoría de proyectos open source que usan Maven 2. Vamos a ver cómo se hace:</p> <p>Para instalar los fuentes, en el pom.xml deberemos añadir la siguiente configuración:</p> <div class="codefoo"> <p>&lt;project><br /> ...<br /> &lt;build><br /> &lt;plugins><br /> &lt;plugin><br /> &lt;groupId>org.apache.maven.plugins&lt;/groupId><br /> &lt;artifactId>maven-source-plugin&lt;/artifactId><br /> &lt;executions><br /> &lt;execution><br /> &lt;id>attach-sources&lt;/id><br /> &lt;phase>verify&lt;/phase><br /> &lt;goals><br /> &lt;goal>jar&lt;/goal><br /> &lt;/goals><br /> &lt;/execution><br /> &lt;/executions><br /> &lt;/plugin><br /> &lt;/plugins><br /> &lt;/build><br /> ...<br /> &lt;/project></p> </div> <p>Para adjuntar los javadocs hay que incluir una configuración similar, pero dado que generarlos provoca que el proceso de build sea bastante más largo, compensa incluirlo dentro de un profile. De este modo, incluiremos los javadocs únicamente cuando nos interese (normalmente, cuando vayamos a liberar una nueva versión estable). La configuración a incluir es ésta:</p> <div class="codefoo"> &lt;project><br /> ...<br /> &lt;profiles><br /> &lt;profile><br /> &lt;id>install-javadocs&lt;/id><br /> &lt;build><br /> &lt;plugins><br /> &lt;plugin><br /> &lt;groupId>org.apache.maven.plugins&lt;/groupId><br /> &lt;artifactId>maven-javadoc-plugin&lt;/artifactId><br /> &lt;executions><br /> &lt;execution><br /> &lt;id>attach-javadocs&lt;/id><br /> &lt;verify&lt;/phase><br /> &lt;goals><br /> &lt;goal>jar&lt;/goal><br /> &lt;/goals><br /> &lt;/execution><br /> &lt;/executions><br /> &lt;/plugin><br /> &lt;/plugins><br /> &lt;/build><br /> &lt;/profile><br /> &lt;/profiles><br /> ...<br /> &lt;/project></p> </div> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/05/21/pila-ejecucion-java-desde-http-hasta-jdbc-un-vistazo Pila de ejecución Java - desde HTTP hasta JDBC de un vistazo 2008-05-21T22:43:18+00:00 2008-05-21T22:46:46+00:00 <p>Buscando información esta tarde en el trabajo he ido a dar a parar con un <a href="http://ptrthomas.wordpress.com/2006/06/06/java-call-stack-from-http-upto-jdbc-as-a-picture/" title="Java call stack - from HTTP upto JDBC as a picture" id=link_0>post</a> que ilustra una pila de ejecución completa de una aplicación web escrita en Java, desde que entra la petición HTTP hasta la ejecución del código JDBC. </p> <p>Es un post que ya tiene algo más de dos años, pero que sigue siendo interesante de ver. Alrededor del código desarrollado, el código servidor de aplicaciones, Acegi, Spring MVC, Spring WebFlow, AOP, el wrapper de Spring para Hibernate, el propio Hibernate y su traducción a JDBC.</p> <p>Como una imagen vale más que mil palabras (click en ella para ver una versión algo más grande):</p> <p><a href="http://www.lacoctelera.com/myfiles/foobar/jtrac-callstack1.png" title="click para ver una versión algo más grande" target='_blank' id=link_1><img src='http://www.lacoctelera.com/myfiles/foobar/jtrac-callstack2.png' width='437' height='419' class='imgCen'/></a></p> <p>No me voy a para a hacer consideraciones, ya están hechas en el anotación enlazada. A todo esto, en dicho post también se puede leer cómo se ha obtenido la traza y descargar una versión en PDF con la imagen anterior a una resolución bastante mayor.</p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/05/19/aprovechando-tiempo Aprovechando el tiempo 2008-05-19T22:43:51+00:00 2008-05-19T22:48:28+00:00 <blockquote style='font-size: 115%;'><p>En 96 horas, Jack Bauer ha matado a 93 personas y salvado el mundo 4 veces. ¿Qué <abbr title='coño'>c***</abbr> has hecho tú con tu vida?</p></blockquote> <p>(<a href="http://www.notrly.com/jackbauer/index.php?topthirty" title="Jack Bauer Facts" id=link_0>uno de tantos</a> hechos sobre la vida y obra de Jack Bauer) </p> foo-bar http://s3.amazonaws.com/lcp/foobar/myfiles/self65x65.JPG http://foobar.lacoctelera.net/post/2008/05/19/vendedor-periodicos-seis-anos Vendedor de Periódicos de Seis Años 2008-05-19T12:48:47+00:00 2008-05-19T12:48:47+00:00 <blockquote><p>La foto está tomada en 1910 en Sant Louis (Estados Unidos).<br /> Debía ser un figura…</p></blockquote> <p><img src='http://www.lacoctelera.com/myfiles/foobar/ninoseisanos2.jpg' width='464' height='510' class='imgCen' alt='Vendedor de Periódicos de Seis Años' /></p> <p>p.s.: <a href="http://www.ladruida.com/historia/?p=456" title="Vendedor de Periódicos de Seis Años" id=link_0>post</a> fusilado enteramente de <a href="http://www.ladruida.com/historia" title="La Druida de la Historia y del Arte" id=link_1>La Druida de la Historia y del Arte</a>, cuyo feed rss fue a parar hace unos días a mi Netvibes personal. </p>