<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Bits y Bytes</title>
	<atom:link href="http://ivanator.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://ivanator.wordpress.com</link>
	<description>Desarrollo de software, agilismo y Java</description>
	<lastBuildDate>Tue, 22 Dec 2009 10:51:53 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='ivanator.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/55516fa87678300b6cc434d14988dbba?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Bits y Bytes</title>
		<link>http://ivanator.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://ivanator.wordpress.com/osd.xml" title="Bits y Bytes" />
		<item>
		<title>Botones no funcionan en Eclipse Galileo tras actualizar a Ubuntu 9.10</title>
		<link>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/</link>
		<comments>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:18:06 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=326</guid>
		<description><![CDATA[El viernes pasado antes de irme para casa dejé el Ubuntu 9.04 del trabajo actualizando a la recién estrenada y flamante versión 9.10. Al llegar esta mañana a la oficina acabé el proceso de instalación (no, Synaptic, no me borres mi configuración del MySQL, bueno Synaptic te dejo que me cambies la versión del Firefox, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=326&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El viernes pasado antes de irme para casa dejé el Ubuntu 9.04 del trabajo actualizando a la recién estrenada y flamante versión 9.10. Al llegar esta mañana a la oficina acabé el proceso de instalación (no, Synaptic, no me borres mi configuración del MySQL, bueno Synaptic te dejo que me cambies la versión del Firefox, etc, descarga kernel, compila y rebota) e iba a ponerme manos a la obra con la nueva iteración recién estrenada, cuando al ir a configurar un nuevo proyecto Java para la nueva branch del repositorio, los botones de mi Eclipse Galileo se manifestaron en huelga.</p>
<p>Los botones están ahí, pero no funcionan, es decir al hacer click sobre ellos la acción asociada no se ejecuta. Yo tengo el Eclipse instalado descargándolo directamente de su web y no de los paquetes de la distribución. Los compañeros que están usando el Eclipse de la distribución no han experimentado problemas.</p>
<p>Googleando un poco he encontrado rápidamente la solución en <a href="http://www.norio.be/blog/2009/10/problems-eclipse-buttons-ubuntu-910">este post</a>. Aparentemente es un bug de Eclipse en la biblioteca de gestión de ventanas GTK que será resuelto en próximas versiones. Por el momento tenemos un workaround para seguir trabajando con la versión actual arrancando Eclipse mediante el siguiente scrtipt:</p>
<pre>
#!/bin/sh
export GDK_NATIVE_WINDOWS=1
/PATH_AL_ECLIPSE/eclipse
</pre>
 Tagged: Eclipse, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/326/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/326/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/326/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=326&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/11/02/botones-no-funcionan-en-eclipse-galileo-tras-actualizar-a-ubuntu-9-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Configurar log4j para JUnit</title>
		<link>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/</link>
		<comments>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/#comments</comments>
		<pubDate>Mon, 25 May 2009 12:44:23 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=319</guid>
		<description><![CDATA[Es muy habitual que a la hora de programar nuestras aplicaciones utilicemos algún tipo de librería de log. Tradicionalmente hay dos familias log4j (la pionera) y la nativa de Java (java.util.logging) que vino un poco después &#8220;inspirándose&#8221; bastante en la filosofía del proyecto de Apache.
Personalmente soy usuario de log4j por varios motivos: estuvo disponible antes, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=319&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Es muy habitual que a la hora de programar nuestras aplicaciones utilicemos algún tipo de librería de log. Tradicionalmente hay dos familias <a href="http://logging.apache.org/log4j/1.2/index.html" target="_blank">log4j</a> (la pionera) y la nativa de Java (<a href="http://java.sun.com/javase/6/docs/api/java/util/logging/package-summary.html" target="_self">java.util.logging</a>) que vino un poco después &#8220;inspirándose&#8221; bastante en la filosofía del proyecto de Apache.</p>
<p>Personalmente soy usuario de log4j por varios motivos: estuvo disponible antes, es el logging nativo de mi servidor de aplicaciones habitual (JBoss) y me gusta más <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Por otro lado, mi manera habitual de desarrollo es TDD, así que el IDE pasa una parte importante del tiempo ejecutando suites de tests JUnit.</p>
<p>Cualquiera de los frameworks de <em>logging</em> que utilicemos tiene el concepto de <em>appender</em> que es el destino en el que se escriben los mensajes. Destinos habituales suelen ser la consola o un fichero, por ejemplo. La configuración de los <em>appenders</em> de una aplicación se suele hacer durante el <em>bootstrap</em> (o la inicialización, si lo preferís) de la misma. Sin embargo cuando estamos corriendo tests, dicha inicialización no se produce así que perdemos todos los mensajes de <em>logging</em> que, si alguien se molestó en escribirlos, seguro que son muy útiles (especialmente cuando estamos desarrollando).</p>
<p>En &#8220;modo desarrollo&#8221; seguramente tenemos suficiente con una configuración básica en el que todos los mensajes se redirijan a la consola (que obviamente puede estar integrada en nuestro IDE). En el caso de log4j existe el método estático</p>
<pre>org.apache.log4j.BasicConfigurator.configure()</pre>
<p>que hace precisamente eso (creo recordar que java.util.logging tiene un mecanismo análogo). Ahora sólo resta saber dónde hacer la llamada al método. Obviamente no tiene sentido que lo pongamos en cada <em>TestCase</em>. Como en general agrupamos los diferentes <em>tests</em> en suites, parece que este es un buen lugar para configurarlo. Por ejemplo:</p>
<pre>@RunWith(Suite.class)
@Suite.SuiteClasses(value={
    nq.quota.QuotaTest.class,
    nq.quota.FrequencyTest.class,
    })
public class AllTests {
<strong>    @BeforeClass</strong>
    public static void startup() {
        <strong>BasicConfigurator.configure();</strong>
    }
}</pre>
<p>En el código precedente se ve la configuración de una test suite con JUnit 4 y etiquetamos un método de inicialización como <em>@BeforeClass</em> para asegurarnos que se ejecuta una única vez y antes de que la suite lance todos los tests configurados.</p>
<p>Esta misma idea puede utilizarse para configurar todos aquellos compartidos por los diferentes tests: variables de entorno, conexiones a bases de datos, etc.</p>
<pre></pre>
 Tagged: JUnit, logging, TDD <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/319/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/319/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/319/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=319&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/05/25/configurar-log4j-para-junit-suites/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Bug con el tracker en Ubuntu 9.04 &#8211; Jaunty Jackalope</title>
		<link>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/</link>
		<comments>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/#comments</comments>
		<pubDate>Sun, 24 May 2009 17:35:01 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Jaunty Jackalope]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=315</guid>
		<description><![CDATA[Como sabéis soy bastante pro-Ubuntu. Me parece un gran entorno de escritorio y de desarrollo y sólo cambio a otros (y dentro de una máquina virtual, por supuesto) ante la falta de sensibilidad de algunos fabricantes de dispositivos (Apple, TomTom, Logitech, por citar algunos) que te obligan a utilizar software no compatible con Linux para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=315&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Como sabéis soy bastante pro-Ubuntu. Me parece un gran entorno de escritorio y de desarrollo y sólo cambio a otros (y dentro de una máquina virtual, por supuesto) ante la falta de sensibilidad de algunos fabricantes de dispositivos (Apple, TomTom, Logitech, por citar algunos) que te obligan a utilizar software no compatible con Linux para utilizar las características avanzadas de dichos dispositivos. También es lamentable que para utilizar algunas páginas web (especialmente de la administración pública) tengas que recorrer al Internet Explorar. Pero bueno, esto es otra guerra.</p>
<p>Hace poco se lanzó la versió Ubuntu 9.04 (alias Jaunty Jackalope) e hice el upgrade hace unas semanas. Los upgrades de Ubuntu también dan gusto: todo se hace de manera automática, no pierdes el control sobre tus cofiguraciones propias (ficheros de configuración de servicios como MySQL, Samba, etc.) y todo funciona correctamente.</p>
<p>No obstante venía observando que a la que la máquina llevaba un rato encendida, se me disparaba el uso de una de las CPU, el ordenador no paraba de rascar disco duro y se recalentaba que daba gusto, de hecho hasta incluso llegar a colgarse en alguna ocasión. La verdad es que hace unos meses le metí mano al hardware del portátil y le metí un disco mucho mayor (como estaba metido en temas de formación necesitaba tener instaladas unas cuantas máquinas virtuales simultáneamente) y mucho más rápido y, que por tanto, se calentaba más y pensé que a lo mejor no había sido muy buena idea&#8230; Pero no tenía sentido, porque no había tenido ningún problema antes con el Ubuntu 8.10 y al arrancarlo ahora en modo Windows (sí, soy culpable, tengo una partición nativa Windows para casos de urgencia) tampoco había problema.</p>
<p>Tirando de <em>top</em> en un momento que se disparaba el uso vi que había un proceso comiéndose una CPU entera y accediendo sospechosamente al disco: <em>tracker-indexer</em>. Este proceso se corresponde con la utilidad <em>tracker</em> que es algo parecido al <em>locate</em> de toda la vida, un proceso que analiza el disco, e indexa su contenido para tener un acceso rápido en las búsquedas. Me sorprendió un poco porque creía haberlo desinstalarlo hace mucho tiempo (desde luego no aperecía como antes en la interfaz <em>gnome</em>) y además había instalado el <a href="http://desktop.google.com/es/linux/" target="_blank"><em>Google Desktop</em></a> que es un software análogo pero que personalmente me gusta más.</p>
<p>En cualquier caso, el <em>tracker</em> no debería comerse una CPU y llevar el portátil hasta la extenuación por calor del disco duro. Googleando un poco se ve que es un <em>bug</em> conocido en la nueva versión de Ubuntu. La verdad es que no me he molestado mucho en mirar si tiene solución, porque, como he dicho, es un software que no utilizo, así que simplemente he abierto el Synaptic, he buscado el paquete asociado y lo he desinstalado efectivamente y todo solucionado.</p>
<p>Por cierto, con una instalación &#8220;limpia&#8221; deJaunty Jackalope, el <em>tracker</em> no vien pre-instalado.</p>
 Tagged: Jaunty Jackalope, Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/315/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/315/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/315/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=315&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/05/24/bug-con-el-tracker-en-ubuntu-9-04/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Teclas de función y modificadores no funcionan en VMware Workstation 6.5 en Ubuntu 8.10</title>
		<link>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/</link>
		<comments>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 18:42:21 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VMware]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=306</guid>
		<description><![CDATA[Mi estación de trabajo es un Ubuntu 8.10 workstation. Estoy muy contento con el sistema operativo tanto para desarrollo como para el resto de tareas que necesito hacer con un ordenador (ofimática, multimedia, internet, etc.). Sigo teniendo un arranque dual con el Windows XP que venía preinstalado en mi portátil (no me dejaron elegir  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=306&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Mi estación de trabajo es un Ubuntu 8.10 workstation. Estoy muy contento con el sistema operativo tanto para desarrollo como para el resto de tareas que necesito hacer con un ordenador (ofimática, multimedia, internet, etc.). Sigo teniendo un arranque dual con el Windows XP que venía preinstalado en mi portátil (no me dejaron elegir <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ), aunque la verdad es que no suelo arrancar casi nunca la partición con el sistemas operativo de Microsoft.</p>
<p>De todos modos para algunas herramientas muy concretas todavía no he podido librarme al 100% del Windows. Para no tener que estar reiniciando la máquina continuamente, tengo una máquina virtual con una imagen de XP que arranco cuando me hace falta usar alguna de estas herramientas. También utilizo máquinas virtuales para hacer pruebas varias y para poder poder provisionar rápidamente máquinas.</p>
<p>En su momento evalué varias máquinas virtuales, incluyendo <a href="http://www.virtualbox.org/">VirtualBox</a> (un proyecto open source muy interesante) y <a href="http://www.vmware.com/es/">VMware</a>. Finalmente, por facilidad de instalación y mantenimiento y por estabilidad en huéspedes Windows me decanté por la segunda.</p>
<p>Todo perfecto. El 95% del trabajo en Linux y cuando necesitaba sin remedio Windows, arrancaba la máquina virtual y listo.</p>
<p>El problema surgió tras una actualización de Ubuntu (aunque no sabría decir cuál concreta causó el problema): cuando arrancaba las máquinas virtuales, habían dejado de funcionar las teclas especiales, teclas tales como las flechas, el pad numérico, Inicio, Fin, etc.</p>
<p>Tras googlear un poco, ha resultado que la solución es bastante sencilla. Sólo hay que modificar el fichero de configuración del VMware, que en Ubuntu está en <em>/etc/vmware/config </em>para añadir la línea siguiente<em>:</em></p>
<pre>xkeymap.nokeycodeMap = "true"<em>
</em></pre>
<p>Me ha funcionado tanto con huéspedes Windows como Ubuntu.</p>
<p>ACTUALIZACIÓN:</p>
<p>La solución anterior aparentemente funcionaba bien pero la tecla <em>ALT GR</em> seguía sin funcionar. Investigando un poco más he encontrado la siguiente solución que sí que ha funcionado para todas las teclas. Consiste en establecer un mapeo manual de todas las teclas. Así pues, en el mismo fichero de configuración, borramos la línea anterior y añadimos las siguientes:</p>
<pre>xkeymap.keycode.108 = 0x138 # Alt_R
xkeymap.keycode.106 = 0x135 # KP_Divide
xkeymap.keycode.104 = 0x11c # KP_Enter
xkeymap.keycode.111 = 0x148 # Up
xkeymap.keycode.116 = 0x150 # Down
xkeymap.keycode.113 = 0x14b # Left
xkeymap.keycode.114 = 0x14d # Right
xkeymap.keycode.105 = 0x11d # Control_R
xkeymap.keycode.118 = 0x152 # Insert
xkeymap.keycode.119 = 0x153 # Delete
xkeymap.keycode.110 = 0x147 # Home
xkeymap.keycode.115 = 0x14f # End
xkeymap.keycode.112 = 0x149 # Prior
xkeymap.keycode.117 = 0x151 # Next
xkeymap.keycode.78 = 0x46 # Scroll_Lock
xkeymap.keycode.127 = 0x100 # Pause
xkeymap.keycode.133 = 0x15b # Meta_L
xkeymap.keycode.134 = 0x15c # Meta_R
xkeymap.keycode.135 = 0x15d # Menu</pre>
 Tagged: Ubuntu, VMware <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/306/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/306/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/306/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=306&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/03/08/teclas-de-funcion-y-modificadores-no-funcionan-en-vmware-workstation-65-en-ubuntu-810/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Métricas de calidad con NetBeans y Hudson</title>
		<link>http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/</link>
		<comments>http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 18:21:41 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Ant]]></category>
		<category><![CDATA[calidad]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/</guid>
		<description><![CDATA[



Este artículo como PDF.
Introducción
En un post anterior expliqué  cómo montar un entorno de integración continua básico, que luego completamos para que también se convirtiera en un verdadero  entorno TDD con tests y métricas de cobertura. El siguiente paso para tener un entorno totalmente ágil consiste en añadir métricas de calidad de código para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=297&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div>
<div>
<p style="margin-bottom:.5cm;font-weight:normal;text-align:left;">
</div>
<p class="western">Este artículo como <a href="http://ivanator.files.wordpress.com/2009/03/metricas-de-calidad-con-netbeans-y-hudson.pdf">PDF</a>.</p>
<h1 class="western">Introducción</h1>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">En un post anterior expliqué  <a href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/">cómo montar un entorno de integración continua básico</a>, que luego completamos para que también se convirtiera en un verdadero  <a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/">entorno TDD</a> con tests y métricas de cobertura. El siguiente paso para tener un entorno totalmente ágil consiste en añadir métricas de calidad de código para favorecer la mejora continua del trabajo hecho por todo el equipo y para que los gestores puedan tener una perspectiva algo más “objetiva” del nivel de calidad. Continuaré en este tutorial sobre el mismo ejemplo, así que en numerosos puntos haré referencias a los artículos previos para no tener que repetirme más de lo necesario.</p>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Nótese que he puesto la palabra  <em>objetiva</em> entre comillas. En este artículo vamos a ver una serie de herramientas que detectarán malas prácticas, bugs potenciales o puntos mejorables y generarán informes al respecto. El desarrollo de software es algo muy complejo y la medida de su calidad real no es automatizable (si así fuera, también lo sería su desarrollo y aún no hemos llegado a ese punto), ni hay un convenio universal de en qué consiste, con lo cual hay que saber leer e interpretar el resultado que producen estas herramientas. Si están avisando de que nuestro código tiene problemas, muy probablemente tengan razón y deberemos poner medidas correctoras. Lo contrario, sin embargo, no implica que nuestro código sea de alta calidad, sino que no se han encontrado aquellas cosas que se sabe que producen problemas. No se podrá automatizar, por ejemplo, cosas como la detección de uso inadecuado de patrones de diseño o la escalabilidad de la plataforma, que podríamos estar de acuerdo que son medidas de calidad. Simplificando mucho:  <em>se puede detectar que el código de un proyecto tiene poca calidad de manera automática, pero no se puede decir que para aquellos para los que no se ha detectado, el código sea de alta calidad</em>.</p>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Hechas estas matizaciones, en este artículo vamos a explicar cómo integrar las siguientes herramientas en  <a href="http://www.netbeans.org/">NetBeans</a> y  <a href="https://hudson.dev.java.net/">Hudson</a> usando  <a href="http://ant.apache.org/">Ant</a>:</p>
<ul>
<li>
<p class="western" style="text-align:justify;"><a href="http://checkstyle.sourceforge.net/"><span style="font-style:normal;"><span style="font-weight:normal;">Checkstyle</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">: genera informes sobre el grado de seguimiento del código a los estándares de codificación establecidos.</span></span></p>
</li>
<li>
<p class="western" style="text-align:justify;"><a href="http://www.redhillconsulting.com.au/products/simian/"><span style="font-style:normal;"><span style="font-weight:normal;">Simian</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">: detector de copia de bloques de código.</span></span></p>
</li>
<li>
<p class="western" style="text-align:justify;"><a href="http://pmd.sourceforge.net/"><span style="font-style:normal;"><span style="font-weight:normal;">PMD</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">: analizador de código estático en busca de posibles bugs y malas prácticas.</span></span></p>
</li>
<li>
<p class="western" style="text-align:justify;"><a href="http://findbugs.sourceforge.net/"><span style="font-style:normal;"><span style="font-weight:normal;">FindBugs</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">: similar al anterior.</span></span></p>
</li>
</ul>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">El procedimiento de instalación de las herramientas va a ser análogo para cada una de ellas:</p>
<ol>
<li>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Instalación del plugin correspondiente en el NetBeans (si lo hubiere) y configuración del mismo.</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Instalación de las bibliotecas de la herramienta en la máquina de desarrollo.</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Modificación del script del Ant para poder lanzar el análisis sin la ayuda del IDE.</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Instalación del plugin correspondiente en el Hudson.</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;text-align:justify;">Modificación del  <em>job</em> para incluir la generación y publicación de informes correspondientes.</p>
</li>
</ol>
<h1 class="western">Checkstyle</h1>
<p class="western">Cuando hablo de estilo de codificación (o convenciones de código) me refiero a cosas como el nivel de indentación, utilizar espacios o tabuladores, añadir comentarios, cómo organizar las llaves de los bloques de código, el tamaño máximo de la línea, etcétera.</p>
<p class="western">Parece un hecho ampliamente aceptado que la uniformidad de estilo a la hora de codificar facilita el grado de cohesión del equipo de desarrollo, la mantenibilidad de la base de código y en definitiva la productividad. Si todo el equipo trabaja con un mismo estilo, puede entender la estructura del programa más fácilmente de un vistazo.</p>
<p class="western">En el mundo Java, Sun proporcionó unas guías de estilo que han sido ampliamente adoptadas por la comunidad. En  <a href="http://java.sun.com/docs/codeconv/">este documento</a> las podéis encontrar junto con los motivos que hay detrás de cada convención.</p>
<p class="western"><a href="http://checkstyle.sourceforge.net/">Checkstyle</a> es una herramienta que genera informes del nivel de seguimiento de estas convenciones. Seguir el estilo al pie de la letra puede resultar algo duro en ocasiones, así que también es posible rebajar el nivel de exigencia decidiendo para qué convenciones se quiere generar una alarma y cuáles se puede ignorar o incluso para definir nuestras propias convenciones.</p>
<p class="western">Checkstyle lo tenemos disponible en las tres vertientes: plugin para el NetBeans, como  <em>task</em> <span style="font-style:normal;">del Ant y como plugin del Hudson.</span></p>
<h2 class="western" style="font-style:normal;">Plugin para NetBeans del Checkstyle</h2>
<p class="western"><span style="font-style:normal;">El plugin no forma parte de los repositorios estándar, así que el primer paso para instalarlo será</span> <span style="font-style:normal;">añadir el repositorio correspondiente. Para ello iremos a:</span> <em>Tools -&gt; Plugins -&gt; Settings -&gt; Add</em> <span style="font-style:normal;">y añadiremos la siguiente</span> <em>url</em> <span style="font-style:normal;">:</span> <a href="http://www.sickboy.cz/checkstyle/autoupdate/autoupdate.xml"><span style="font-style:normal;">http://www.sickboy.cz/checkstyle/autoupdate/autoupdate.xml</span></a> <span style="font-style:normal;">tal y como se muestra en las siguientes imágenes.</span></p>
<p class="western" style="font-style:normal;"><img class="alignnone" style="border:0 none;text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorio-checkstyle.jpg?w=500&#038;h=179" border="0" alt="" width="500" height="179" /></p>
<p class="western" style="font-style:normal;"><img class="alignnone" style="border:0 none;text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorios.jpg?w=500&#038;h=331" border="0" alt="" width="500" height="331" /></p>
<p class="western"><span style="font-style:normal;">A continuación hacemos click en la pestaña de</span> <em>Available Plugins</em> <span style="font-style:normal;">y seleccionamos</span> <em>Checkstyle Beans Library</em> <span style="font-style:normal;">y</span> <em>Checkstyle Beans Plugin</em> <span style="font-style:normal;">y los instalamos (seguimos los pasos indicados por el asistente y cuando nos pregunte si queremos instalar plugins no firmados le decimos que sí)</span> <em>.</em> <span style="font-style:normal;">Ahora sólo resta reiniciar el NetBeans para que cargue el plugin.</span></p>
<p class="western" style="font-style:normal;">
<p class="western" style="font-style:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/netbeans-plugins-disponibles.jpg?w=500&#038;h=330" border="0" alt="" width="500" height="330" /></p>
<p class="western" style="font-style:normal;">Ahora cada vez que alguna línea de código no conforme con respecto a las convenciones de Sun, aparecerá una etiqueta a modo de aviso. Poniendo el ratón encima de la etiqueta, mostrará cuál es la convención que no se está siguiendo.</p>
<p class="western" style="font-style:normal;">
<p class="western" style="font-style:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/netbeans-editor-checkstyle.jpg?w=500&#038;h=294" border="0" alt="" width="500" height="294" /></p>
<p class="western"><span style="font-style:normal;">Como decía, se pueden utilizar plantillas con convenciones personalizadas. Para ello deberemos editar la configuración por defecto que se encuentra en:</span> <em>Tools -&gt; Options -&gt; Miscellaneous -&gt; Checkstyle.</em></p>
<p class="western">
<p class="western"><img class="alignnone" style="border:0 none;text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/netbeans-opciones-checkstyle.jpg?w=500&#038;h=370" border="0" alt="" width="500" height="370" /></p>
<h2 class="western">Incluir Checkstyle en el script de Ant del NetBeans</h2>
<p class="western">Como ya he explicado en otros artículos, NetBeans realiza todas sus tareas mediante scripts Ant que autogenera y el  <em>build.xml</em> <span style="font-style:normal;">que hay en la raíz del proyecto es extensible para que los desarrolladores podamos introducir nuestros propios</span> <em>targets</em> <span style="font-style:normal;">.</span></p>
<p class="western"><span style="font-style:normal;">Lo primero que tenemos que hacer es</span> <a href="http://sourceforge.net/project/showfiles.php?group_id=29721"><span style="font-style:normal;">descargarnos la distribución del Checkstyle</span></a> <span style="font-style:normal;">(en el momento de escribir este artículo la versión 5 sigue siendo</span> <em>beta</em> <span style="font-style:normal;">, así que yo me decanto por la versión 4.4) que, entre otras cosas, aporta los</span> <em>tasks</em> <span style="font-style:normal;">necesarios para invocarlo desde Ant. A continuación habremos de descomprimir el paquete en algún lugar de la máquina de desarrollo. Yo, siguiendo mi propio estándar, lo situaré en el directorio</span> <em>/srv</em> <span style="font-style:normal;">y luego lo enlazaré con un link simbólico para no tener que</span> <em>hardcodear</em> <span style="font-style:normal;">la ruta hacia una versión concreta en ningún fichero de configuración o script que haga uso del mismo. También crearé un enlace simbólico al</span> <em>jar</em> <span style="font-style:normal;">que contiene la implementación del</span> <em>task</em> <span style="font-style:normal;">por el mismo motivo.</span></p>
<pre class="western" style="font-style:normal;">root@hargon:/srv# tar -zxf checkstyle-4.4.tar.gz
<span lang="zxx">root@hargon:/srv# ln -s checkstyle-4.4 checkstyle</span>
<span lang="zxx">root@hargon:/srv# ls -alh checkstyle</span>
<span lang="zxx">lrwxrwxrwx 1 root root 14 2009-02-25 16:24 checkstyle -&gt; checkstyle-4.4</span>
<span lang="zxx">root@hargon:/srv# rm checkstyle-4.4.tar.gz</span>
<span lang="zxx">root@hargon:/srv# cd checkstyle</span>
<span lang="zxx">root@hargon:/srv/checkstyle# ln -s checkstyle-all-4.4.jar checkstyle-all .jar</span></pre>
<p class="western"><span style="font-style:normal;">El siguiente paso consiste en modificar el</span> <em>build.xml</em> <span style="font-style:normal;">. Lo primero que vamos a necesitar es importar el</span> <em>task</em> <span style="font-style:normal;">tal y como sigue:</span></p>
<pre class="western" style="font-style:normal;">&lt;taskdef
<span lang="zxx">    resource="checkstyletask.properties"</span>
<span lang="zxx">    </span><span lang="zxx">classpath="${checkstyle.dir}/checkstyle-all.jar"/&gt;</span></pre>
<p class="western"><span style="font-style:normal;">Puesto que el valor de</span> <em>checktyle.dir</em> <span style="font-style:normal;">puede ser diferente en la máquina de diferentes desarrolladores o en la máquina que contiene en el servidor de integración, esta propiedad la definimos en el fichero de propiedades privadas del proyecto (que recordemos no forma parte del repositorio de código):</span> <em>nbproject/private/private.properties.</em></p>
<pre class="western" style="font-style:normal;">checkstyle.dir=/srv/checkstyle</pre>
<p class="western" style="font-style:normal;">Como yo estoy partiendo del mismo ejemplo del  <a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/">artículo previo</a> donde explicaba cómo integrar Cobertura, yo ya tengo definido un  <em>import</em> en el  <em>build.xml</em> del fichero de propiedades privadas, si no lo tuvierais acordaros de añadirlo.</p>
<pre class="western">&lt;property file="nbproject/private/private.properties"/&gt;</pre>
<p class="western">A continuación definimos el  <em>target</em> <span style="font-style:normal;">que construirá los informes en el</span> <em>build.xml</em> <span style="font-style:normal;">:</span></p>
<pre class="western" style="font-style:normal;">&lt;target name="checkstyle-report"&gt;

<span lang="zxx">    </span><span lang="zxx">&lt;property</span><span lang="zxx"> </span><span lang="zxx">file="nbproject/project.properties"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;mkdir dir="${checkstyle.report.dir}"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;checkstyle failOnViolation="false"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">config="${checkstyle.dir}/sun_checks.xml"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;fileset dir="${src.dir}" includes="**/*.java"/&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;formatter type="xml"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">toFile="${checkstyle.report.dir}/checks.xml"/&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;formatter type="plain"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">toFile="${checkstyle.report.dir}/checks.txt"/&gt;</span>
<span lang="zxx">    </span><span lang="zxx">&lt;/checkstyle&gt;</span>
<span lang="zxx">&lt;/target&gt;</span></pre>
<p class="western"><span style="font-style:normal;">El</span> <em>target</em> <span style="font-style:normal;">es bastante fácil de entender. En primer lugar construimos el directorio donde se generarán los diferentes informes. A continuación lanzamos el</span> <em>task</em> <span style="font-style:normal;">del Checkstyle indicándole que siga procesando el</span> <em>build.xml</em> <span style="font-style:normal;">aunque se encuentren fallos de formato (</span> <em>failOnViolation=”false”</em> <span style="font-style:normal;">) y que utilice las convenciones definidas en el fichero</span> <em>sun_checks.xml</em> <span style="font-style:normal;">que forma parte de la distribución estándar de Checkstyle. Este fichero es donde se describen, en un formato que escapa al ámbito de este artículo, cuáles son las convenciones que caso de no seguirse generan un aviso. Obviamente podemos editar o sustituir este fichero por otro adaptado a nuestras necesidades, pero si dejamos éste, forzamos las convenciones de Sun que, como ya había indicado previamente, se describen en</span> <a href="http://java.sun.com/docs/codeconv/"><span style="font-style:normal;">este documento</span></a> <span style="font-style:normal;">.</span></p>
<p class="western" style="font-style:normal;">Finalmente generamos los informes en dos formatos: en texto plano y en XML. El primero es más sencillo de leer por humanos pero el segundo es el adecuado para integrarlo con Hudson.</p>
<p class="western"><span style="font-style:normal;">En este</span> <em>target</em> <span style="font-style:normal;">presuponemos inicializadas las propiedades</span> <em>checkstyle.dir</em> <span style="font-style:normal;">,</span> <em>src.dir</em> <span style="font-style:normal;">y</span> <em>checstyle.report.dir</em> <span style="font-style:normal;">. La primera ya la hemos configurado en el punto anterior, la segunda forma parte de las propiedades creadas por NetBeans y la última la tenemos que definir.</span> <span style="font-style:normal;"><span style="font-weight:normal;">Las añadiremos como propiedades del proyecto en el</span></span> <em><span style="font-weight:normal;">nbproject/project.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">:</span></span></p>
<pre class="western" style="font-style:normal;font-weight:normal;">reports.dir=${build.dir}/reports
<span lang="zxx">checkstyle.report.dir=${reports.dir}/checkstyle-report</span></pre>
<h2 class="western">Integrando Checkstyle con Hudson</h2>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Para generar los informes en Hudson nos aprovecharemos del</span></span> <em><span style="font-weight:normal;">target</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">que acabamos de definir en el</span></span> <em><span style="font-weight:normal;">build.xml</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">del NetBeans, por tanto el proceso va a ser sencillo:</span></span></p>
<ol>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">añadir el plugin del Checkstyle al Hudson,</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">instalar las bibliotecas del Checkstyle en la máquina donde reside el Hudson,</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">añadir las propiedades privadas a mano (recordad que este fichero no forma parte del Subversion),</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">añadir el nuevo target en la construcción del proyecto,</p>
</li>
<li>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">configurar el</span></span> <em><span style="font-weight:normal;">job</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">para que utilice el</span></span> <em><span style="font-weight:normal;">target</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
</li>
</ol>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">El proceso para instalar el plugin, ya lo hemos visto en el post donde explicaba</span></span> <a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"><span style="font-style:normal;"><span style="font-weight:normal;">cómo añadir el plugin de Cobertura</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">. Básicamente, seleccionarlo de la lista de plugins disponibles, instalarlo con el asistente y reiniciar el Hudson.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-instalar-checkstyle-plugin.jpg?w=500&#038;h=383" border="0" alt="" width="500" height="383" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Utilizaré el mismo procedimiento y ruta para instalar la distribución del Checkstyle en el servidor donde se ejecuta el Hudson, así que repetiré exactamente los mismos pasos que hice en la máquina de desarrollo.</p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">A continuación tenemos que modificar las propiedades privadas para añadir la ruta al Checkstyle. Nos situaremos en el directorio del</span></span> <em><span style="font-weight:normal;">job</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y editaremos (o crearemos) el fichero</span></span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">para añadir la línea:</span></span></p>
<pre class="western" style="font-style:normal;font-weight:normal;">checkstyle.dir=/srv/checkstyle</pre>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Finalmente añadimos</span></span> <em><span style="font-weight:normal;">checkstyle-report</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">a la lista de</span></span> <em><span style="font-weight:normal;">tagets</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">a construir y configuramos el job para que lea los informes generados en</span></span> <em><span style="font-weight:normal;">xml</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y los publique. Adicionalmente podemos configurar opciones avanzadas como los límites a partir de los cuales el</span></span> <em><span style="font-weight:normal;">build</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">debe considerarse inestable o roto.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="border:0 none;text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-checkstyle-en-el-job.jpg?w=500&#038;h=337" border="0" alt="" width="500" height="337" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Ahora ya sólo resta ver los informes que genera el Hudson:</p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-checkstyle.jpg?w=500&#038;h=437" border="0" alt="" width="500" height="437" /></p>
<h1 class="western">Simian</h1>
<p class="western">Alguna vez oí, aunque no recuerdo la fuente, que en informática la duplicación es el diablo y yo no puedo estar más de acuerdo. En ciertas ocasiones requerimientos no funcionales, como por ejemplo eficiencia, puede requerir duplicar información (denormalización de tablas en bases de datos, materialización de cálculos de agregación de información, etc), pero ello debe ser consecuencia de una decisión de diseño meditada y no de la dejadez. La replicación de código, en general, es menos justificable e introduce un gran coste en mantenibilidad y calidad: modificaciones en cualquiera de las copias debería llevar aparejadas actualizaciones en el resto, lo cual se hace muy tedioso y complicado de implementar.</p>
<p class="western">Por todo lo anterior, si tenemos repetido un bloque de código de un tamaño razonable, probablemente ello está descubriendo un mal diseño y ese código debería encapsularse de alguna manera para que exista en un único punto.</p>
<p class="western"><a href="http://www.redhillconsulting.com.au/products/simian/">Simian</a> es la herramienta que nos va a permitir encontrar replicación de bloques de código (o de texto en general) en una gran cantidad de lenguajes de programación y formatos de texto. Hasta donde yo sé, no existe como plugin para NetBeans (aunque sí para Eclipse e IntelliJ). Sí que existe el  <em>task</em> <span style="font-style:normal;">para Ant y como plugin para el Hudson y por tanto veremos estas configuraciones.</span></p>
<p class="western" style="font-style:normal;">Como el procedimiento para incluir nuevas herramientas de análisis y métricas va a ser siempre muy similar a lo que he explicado en el caso del Checkstyle, no explicaré el proceso de una manera tan detallada (entre otras cosas porque no aporta nada y sólo hace crecer el documento).</p>
<h2 class="western" style="font-style:normal;">Incluir Simian en el script de Ant del NetBeans</h2>
<p class="western"><span style="font-style:normal;">Lo primero es obtener y configurar la herramienta en el entorno de desarrollo, para ello lo</span> <a href="http://www.redhillconsulting.com.au/products/simian/"><span style="font-style:normal;">descargamos</span></a> <span style="font-style:normal;">, lo descomprimimos en</span> <em>/srv</em> <span style="font-style:normal;">/ (id con cuidado porque el paquete no contiene un directorio raíz) y creamos el enlace simbólico correspondiente.</span></p>
<pre class="western" style="font-style:normal;">root@hargon:/srv# mkdir simian-2.2.24
<span lang="zxx">root@hargon:/srv# cd simian-2.2.24</span>
<span lang="zxx">root@hargon:/srv/simian-2.2.24# mv ../simian-2.2.24.tar.gz .</span>
<span lang="zxx">root@hargon:/srv/simian-2.2.24# tar -zxf simian-2.2.24.tar.gz</span>
<span lang="zxx">root@hargon:/srv/simian-2.2.24# rm simian-2.2.24.tar.gz</span>
<span lang="zxx">root@hargon:/srv/simian# cd bin/</span>
<span lang="zxx">root@hargon:/srv/simian/bin# ln -s simian-2.2.24.jar simian.jar</span>
<span lang="zxx">root@hargon:/srv/simian-2.2.24# cd ../..</span>
<span lang="zxx">root@hargon:/srv# ln -s simian-2.2.24 simian</span></pre>
<p class="western"><span style="font-style:normal;">A continuación configuramos el</span> <em>build.xml</em> <span style="font-style:normal;">de manera análoga al Checkstyle:</span></p>
<pre class="western" style="font-style:normal;">&lt;taskdef
<span lang="zxx">    resource="simiantask.properties"</span>
<span lang="zxx">    </span><span lang="zxx">classpath="${simian.dir}/bin/simian.jar"/&gt;</span>

<span lang="zxx">&lt;target name="simian-report"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">&lt;property</span><span lang="zxx"> </span><span lang="zxx">file="nbproject/project.properties"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;mkdir dir="${simian.report.dir}" /&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;simian&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx"><span style="font-style:normal;">&lt;fileset dir="${src.dir}" includes="**/*.java"/&gt;</span></span>

<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;formatter type="xml"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">toFile="${simian.report.dir}/simian.xml"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;formatter type="plain"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">toFile="${simian.report.dir}/simian.txt"/&gt;</span>
<span lang="zxx">    </span><span lang="zxx">&lt;/simian&gt;</span>
<span lang="zxx">&lt;/target&gt;</span></pre>
<p class="western"><span style="font-style:normal;">Las propiedades las definiremos allí donde toca: el</span> <em>simian.dir</em> <span style="font-style:normal;">(con valor</span> <em>/srv/simian</em> <span style="font-style:normal;">) en el</span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y el</span></span> <em><span style="font-weight:normal;">simian.report.dir</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">(con valor</span></span> <em><span style="font-weight:normal;">${reports.dir}/simian-report</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">) en el</span></span> <em><span style="font-weight:normal;">nbproject/project.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">El</span></span> <em><span style="font-weight:normal;">task</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">de Simian es muy sencillo. En su configuración simple tal y como tenemos, tan sólo hace falta especificar el directorio que contiene el código a analizar y el formato de los informes (en XML para integrarse con el Hudson y en texto plano para que sea más legible por humanos).</span></span></p>
<h2 class="western">Integrando Simian con Hudson</h2>
<p class="western">Como en el caso del Checkstyle, replicamos la instalación de Simian en la máquina donde se encuentra el Hudson y definimos la propiedad  <em>simian.dir</em> <span style="font-style:normal;">en el</span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">El siguiente paso debería consistir en instalar el plugin del Simian para el Hudson, pero cuando lo</span></span> <span style="font-style:normal;"><span style="font-weight:normal;">buscamos en la lista de plugins disponibles nos damos cuenta que no aparece. Afortunadamente existe un plugin llamado</span></span> <em><span style="font-weight:normal;">Violations</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">que integra diferentes herramientas de análisis estático de código (de hecho podríamos utilizar este mismo plugin para otras de las tratadas en este artículo) y que tiene soporte para Simian. Lo instalamos de la manera habitual, reiniciamos el Hudson para que lo cargue y el siguiente paso consiste en configurar el</span></span> <em><span style="font-weight:normal;">job</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">. Como siempre, añadiremos el</span></span> <em><span style="font-weight:normal;">simian-report</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">a la lista de</span></span> <em><span style="font-weight:normal;">targets</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">a construir por el Ant y a continuación configuramos el plugin tal y como se muestra en la ilustración (también podemos definir los límites a partir de los cuales se rompe el</span></span> <em><span style="font-weight:normal;">build</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">).</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-simian-en-el-job.jpg?w=500&#038;h=390" border="0" alt="" width="500" height="390" /></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Tras construir el</span></span> <em><span style="font-weight:normal;">job</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">podremos ver los informes de replicación de código de manera integrada en el Hudson.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-1.jpg?w=500&#038;h=436" border="0" alt="" width="500" height="436" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-2.jpg?w=500&#038;h=436" border="0" alt="" width="500" height="436" /></p>
<h1 class="western">PMD</h1>
<p class="western" style="font-style:normal;font-weight:normal;">Tanto  <a href="http://pmd.sourceforge.net/">PMD</a> como  <a href="http://findbugs.sourceforge.net/">FindBugs</a>, son herramientas de análisis estático de código (analizan el código y no el programa en ejecución) en busca de estructuras potencialmente peligrosas tales como:</p>
<ul>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">posibles bugs,</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">código “muerto” (variables no accedidas, bloques de ejecución inalcanzables, etc.),</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">código subóptimo,</p>
</li>
<li>
<p class="western" style="font-style:normal;font-weight:normal;">bloques con una estructura poco legible o más complicada de lo necesario.</p>
</li>
</ul>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Estas herramientas son especialmente útiles integradas en el IDE porque de esta manera el</span></span> <span style="font-style:normal;"><span style="font-weight:normal;">programador puede ir viendo mientras escribe el código las posibles alertas. Obviamente también tienen</span></span> <em><span style="font-weight:normal;">tasks</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">de Ant lo que permite integrarlas fácilmente en Hudson para obtener los informes correspondientes.</span></span></p>
<h2 class="western">Plugin para NetBeans del PMD</h2>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">En este caso el plugin del PMD no está accesible mediante un repositorio, por lo que para instalarlo procederemos a la</span></span> <a href="http://sourceforge.net/project/showfiles.php?group_id=56262&amp;package_id=63621"><span style="font-style:normal;"><span style="font-weight:normal;">descarga del mismo</span></span></a> <span style="font-style:normal;"><span style="font-weight:normal;">y a su instalación local.</span></span></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Una vez tenemos el fichero, deberemos descomprimirlo y nos quedamos con el plugin empaquetado en el fichero</span></span> <em><span style="font-weight:normal;">pmd.nbm</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">que instalaremos a través la pestaña</span></span> <em><span style="font-weight:normal;">Downloaded</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">del gestor de plugins: primero lo añadimos a la lista mediante el botón</span></span> <em><span style="font-weight:normal;">Add Plugins</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y después le damos a</span></span> <em><span style="font-weight:normal;">Install</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugins-downloaded-pmd.jpg?w=500&#038;h=326" border="0" alt="" width="500" height="326" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Aceptamos la licencia, asumimos el riesgo de instalar un plugin “no firmado” y rebotamos el IDE para que se reflejen los cambios.</p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-warning1.jpg?w=375&#038;h=229" border="0" alt="" width="375" height="229" /></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">En este momento el plugin debería estar listo para ser utilizado. Mientras trabajamos PMD monitorizará el código que escribimos y nos pondrá una marca en el editor cuando algo no le guste. Si ponemos el puntero encima de la marca, se nos mostrará un mensaje informativo del problema en forma de</span></span> <em><span style="font-weight:normal;">tooltip</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-en-accion.jpg" border="0" alt="" width="75%" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Si queremos obtener un informe de todos los posibles problemas en una carpeta de código, paquete o clase, sobre la ventana</span></span> <em><span style="font-weight:normal;">Projects</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">hacemos</span></span> <em><span style="font-weight:normal;">click derecho en el elemento correspondiente -&gt; Tools -&gt; Run PMD.</span></em></p>
<p class="western" style="font-weight:normal;">
<p class="western" style="font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-generar-informe.jpg" border="0" alt="" width="455" height="360" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Ello abrirá una nueva pestaña de informe con todas los avisos disponibles en forma de tabla (permitiendo ordenación por las diferentes columnas). Haciendo doble click sobre cualquiera de las advertencias, el editor se desplazará a la línea de código correspondiente.</p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-informe.jpg" border="0" alt="" width="500" height="170" /></p>
<p class="western" style="font-style:normal;"><span style="font-weight:normal;">PMD puede ser muy estricto y es posible que nos interese personalizar el tipo de alertas generadas y, quizá, desactivar algunas. Hay que encontrar un compromiso entre lo razonable y la calidad. Por ejemplo, algunas de las estructuras autogeneradas por el IDE (como el</span> <em><span style="font-weight:normal;">equals</span></em> <span style="font-weight:normal;">mostrado en el ejemplo unas líneas más arriba) producen advertencias que podríamos ignorar con tranquilidad ya que NetBeans</span> <em><span style="font-weight:normal;">sabe lo que hace</span></em> <span style="font-weight:normal;">. Para modificar la configuración del plugin y el tipo de reglas que aplicar, nos vamos al menú de opciones:</span> <em><span style="font-weight:normal;">Tools -&gt; Options -&gt; Miscellaneous.</span></em></p>
<p class="western" style="font-weight:normal;">
<p class="western" style="font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-configuracion.jpg" border="0" alt="" width="500" height="257" /></p>
<p class="western" style="font-style:normal;"><span style="font-weight:normal;">Las reglas se gestionan mediante</span> <em><span style="font-weight:normal;">rulesets</span></em> <span style="font-weight:normal;">temáticos. Es decir un</span> <em><span style="font-weight:normal;">ruleset</span></em> <span style="font-weight:normal;">puede contener todas aquellas reglas (</span> <em><span style="font-weight:normal;">rules)</span></em> <span style="font-weight:normal;">que tengan que ver, por ejemplo, con código muerto. Mediante el menú de</span> <em><span style="font-weight:normal;">rulesets</span></em> <span style="font-weight:normal;">podemos incluir o no las incluidas con PMD y añadir otras propias generadas por nosotros o por terceros. En el menú</span> <em><span style="font-weight:normal;">Manage rules</span></em> <span style="font-weight:normal;">se nos permite la activación o desactivación de reglas individuales.</span></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-rule-editor.jpg" border="0" alt="" width="75%" /></p>
<h2 class="western">Incluir PMD en el script del Ant de NetBeans</h2>
<p class="western"><span style="font-weight:normal;">De manera análoga a las herramientas anteriores,</span> <a href="http://downloads.sourceforge.net/pmd/pmd-bin-4.2.5.zip?use_mirror=dfn"><span style="font-weight:normal;">descargamos</span></a> <span style="font-weight:normal;">e instalamos la herramienta en</span> <em><span style="font-weight:normal;">/srv</span></em> <span style="font-weight:normal;">.</span></p>
<pre class="western" style="font-weight:normal;">root@hargon:/srv# unzip -q pmd-bin-4.2.5.zip
<span lang="zxx">root@hargon:/srv# ln -s pmd-4.2.5/ pmd</span>
<span lang="zxx">root@hargon:/srv# rm pmd-bin-4.2.5.zip</span>
<span lang="zxx">root@hargon:/srv# cd pmd/lib/</span>
<span lang="zxx">root@hargon:/srv/pmd/lib# ln -s pmd-4.2.5.jar pmd.jar</span></pre>
<p class="western">A continuación modificaros el  <em>build.xml</em> <span style="font-style:normal;">de manera adecuada.</span></p>
<pre class="western" style="font-style:normal;">&lt;taskdef name="pmd"
<span lang="zxx">    classname="net.sourceforge.pmd.ant.PMDTask"</span>
<span lang="zxx">    </span><span lang="zxx">classpath="${pmd.dir}/lib/pmd.jar"/&gt;</span>

<span lang="zxx">&lt;target name="pmd-report"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">&lt;property
</span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">file="nbproject/project.properties"/&gt;</span>
<span lang="zxx"><span style="font-style:normal;">
</span></span><span lang="zxx">    </span><span lang="zxx"><span style="font-style:normal;">&lt;mkdir dir="${pmd.report.dir}" /&gt;</span></span>

<span lang="zxx">    </span><span lang="zxx">&lt;pmd shortFilenames="true"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;ruleset&gt;unusedcode,basic,design,controversial&lt;/ruleset&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx"><span style="font-style:normal;">&lt;formatter type="xml"
</span></span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx"><span style="font-style:normal;">toFile="${pmd.report.dir}/pmd.xml"</span></span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">linkPrefix="http://pmd.sourceforge.net/xref/" /&gt;</span>

<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;formatter type="html"
</span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">toFile="${pmd.report.dir}/pmd.html"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">linkPrefix="http://pmd.sourceforge.net/xref/" /&gt;</span>

<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;fileset dir="${src.dir}"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;include name="**/*.java"/&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;/fileset&gt;</span>
<span lang="zxx">    </span><span lang="zxx">&lt;/pmd&gt;</span>
<span lang="zxx">&lt;/target&gt;</span></pre>
<p class="western"><span style="font-style:normal;">Las propiedades las añadimos al fichero correspondiente: el</span> <em>pmd.dir</em> <span style="font-style:normal;">(con valor</span> <em>/srv/pmd</em> <span style="font-style:normal;">) en el</span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y el</span></span> <em><span style="font-weight:normal;">pmd.report.dir</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">(con valor</span></span> <em><span style="font-weight:normal;">${reports.dir}/pmd-report</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">) en el</span></span> <em><span style="font-weight:normal;">nbproject/project.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><span style="font-style:normal;">El</span> <em>task</em> <span style="font-style:normal;">del PMD</span> <span style="font-style:normal;">es sencillo de utilizar. Primeramente indicamos qué</span> <em>rulesets</em> <span style="font-style:normal;">de los estándar queremos analizar (podríamos también especificar</span> <em>rulesets</em> <span style="font-style:normal;">personalizados) y a continuación indicamos en qué formatos queremos generar los informes. Como es habitual, tendremos los informes en XML que se integran bien con Hudson y en formato HTML para ser leídos por humanos.</span></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/pmd-html-report2.jpg" border="0" alt="" width="500" height="357" /></p>
<h2 class="western">Integrando PMD con Hudson</h2>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Al igual que las dos herramientas anteriores, instalamos PMD en el servidor de integración y definimos la propiedad</span></span> <em><span style="font-weight:normal;">pmd.dir</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">en el</span></span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><a id="DDE_LINK7" name="DDE_LINK7"></a> <span style="font-style:normal;"><span style="font-weight:normal;">A continuación instalamos el plugin del PMD del Hudson de la manera habitual (no olvidéis rebotar lo) y ya podemos proceder a la configuración del</span></span> <em><span style="font-weight:normal;">job</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">tal y como se muestra en la siguiente captura. Obviamente podemos establecer los límites que por defecto, como casi siempre, están desactivados.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-pmd-en-el-job.jpg" border="0" alt="" width="499" height="223" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Y estos serían los informes generados.</p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-1.jpg" border="0" alt="" width="500" height="404" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-21.jpg" border="0" alt="" width="500" height="464" /></p>
<h1 class="western">FindBugs</h1>
<p class="western">Sin entrar en demasiados detalles,  <a href="http://findbugs.sourceforge.net/">FindBugs</a> es una herramienta similar a la anterior. En el momento de escribir este tutorial todavía no existe una versión compatible del plugin para NetBeans 6.5, pero los ingenieros de FindBugs  <a href="http://kenai.com/projects/sqe/forums/forum/topics/377-findbugs-plugin-for-netbeans-6-5">están trabajando en ello</a> y me imagino que estará disponible en breve (sí que existen versiones funcionales para otros IDEs).</p>
<h2 class="western">Incluir FindBugs en el plugin de Ant de NetBeans</h2>
<p class="western">Procedemos a  <a href="http://findbugs.sourceforge.net/downloads.html">descargar</a> el paquete para instalarlo de la manera habitual.</p>
<pre class="western">root@hargon:/srv# tar -zxf findbugs-1.3.7.tar.gz
<span lang="zxx">root@hargon:/srv# ln -s findbugs-1.3.7 findbugs</span>
<span lang="zxx">root@hargon:/srv# ls -alh findbugs</span>
<span lang="zxx">lrwxrwxrwx 1 root root 14 2009-03-05 15:55 findbugs -&gt; findbugs-1.3.7</span></pre>
<p class="western">A continuación modificamos el  <em>build.xml</em> <span style="font-style:normal;">para añadir un</span> <em>target</em> <span style="font-style:normal;">que use el</span> <em>task</em> <span style="font-style:normal;">del NetBeans.</span></p>
<pre class="western" style="font-style:normal;">&lt;taskdef name="findbugs"
<span lang="zxx">    </span><span lang="zxx"><span style="font-style:normal;">classname="edu.umd.cs.findbugs.anttask.FindBugsTask"</span></span>
<span lang="zxx">    </span><span lang="zxx">classpath="${findbugs.dir}/lib/findbugs.jar" /&gt;</span>

<span lang="zxx">&lt;target name="findbugs-report" depends="compile"&gt;</span>
<span lang="zxx">
</span><span lang="zxx">    </span><span lang="zxx">&lt;property file="nbproject/project.properties"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;mkdir dir="${findbugs.report.dir}"/&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;findbugs home="${findbugs.dir}"
</span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">output="xml"</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">outputFile="${findbugs.report.dir}/findbugs.xml"&gt;</span>
<span lang="zxx">    </span><span lang="zxx">
</span><span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;sourcePath path="${src.dir}" /&gt;</span>
<span lang="zxx">    </span><span lang="zxx">    </span><span lang="zxx">&lt;class location="${build.classes.dir}" /&gt;</span>

<span lang="zxx">    </span><span lang="zxx">&lt;/findbugs&gt;</span>
<span lang="zxx">&lt;/target&gt;</span></pre>
<p class="western"><span style="font-style:normal;">Como en los casos anteriores, añadimos las propiedades a los ficheros correspondientes: el</span> <em>findbugs.dir</em> <span style="font-style:normal;">(con valor</span> <em>/srv/findbugs</em> <span style="font-style:normal;">) en el</span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y el</span></span> <em><span style="font-weight:normal;">findbugs.report.dir</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">(con valor</span></span> <em><span style="font-weight:normal;">${reports.dir}/findbugs-report</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">) en el</span></span> <em><span style="font-weight:normal;">nbproject/project.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><span style="font-style:normal;">El</span> <em>task</em> <span style="font-style:normal;">del FindBugs requiere no sólo el código fuente sino también las clases compiladas y por ello el</span> <em>target</em> <span style="font-style:normal;">tiene una dependencia del</span> <em>target</em> <span style="font-style:normal;">estándar de NetBeans</span> <em>compile</em> <span style="font-style:normal;">. Las clases compiladas se referencian mediante una propiedad también estándar de NetBeans:</span> <em>build.classes.dir</em> <span style="font-style:normal;">.</span></p>
<p class="western" style="font-style:normal;">El resto de propiedades son las típicas que hemos ido viendo, el directorio de instalación de la herramienta y el directorio de salida de los informes.</p>
<p class="western" style="font-style:normal;">En este caso estamos generando los informes en XML que son los que entiende Hudson, pero también pueden generarse en otros formatos, como en texto plano o en HTML.</p>
<h2 class="western" style="font-style:normal;">Integrando FindBugs con Hudson</h2>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Como siempre, replicamos la instalación del FindBugs en la máquina donde está instalado el Hudson y definimos la propiedad</span></span> <em><span style="font-weight:normal;">findbugs.dir</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">apuntando al directorio correspondiente en el</span></span> <em><span style="font-weight:normal;">nbproject/private/private.properties</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">FindBugs también tiene un plugin nativo para Hudson, así que lo instalamos y reiniciamos. A continuación, de manera totalmente análoga al PMD, configuramos el nuevo</span></span> <em><span style="font-weight:normal;">target</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">y las opciones de FindBugs.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-findbugs-en-el-job.jpg" border="0" alt="" width="75%" /></p>
<p class="western" style="font-style:normal;font-weight:normal;">Finalmente ya podemos ver los informes generados.</p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-1.jpg" border="0" alt="" width="500" height="414" /></p>
<p class="western" style="font-style:normal;font-weight:normal;"><img style="text-align:left;" src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-2.jpg" border="0" alt="" width="500" height="458" /></p>
<h1 class="western">Conclusión</h1>
<p class="western" style="font-style:normal;font-weight:normal;">En este artículo hemos aprendido que existen herramientas que nos pueden ayudar a generar métricas sobre la calidad de nuestro código. También hemos enfatizado el hecho que obtener un 100% de puntuación no garantiza un software de calidad.</p>
<p class="western"><span style="font-style:normal;"><span style="font-weight:normal;">Hemos visto que las herramientas suelen venir en tres “sabores”: como plugin para el IDE que dan un feedback inmediato al programador, como</span></span> <em><span style="font-weight:normal;">task</span></em> <span style="font-style:normal;"><span style="font-weight:normal;">del Ant que permiten ejecutarlas en modo consola e integrarlas con otros sistemas y como plugin para Hudson que permite publicar los informes correspondientes de una manera agradable para los humanos.</span></span></p>
<p class="western" style="font-style:normal;font-weight:normal;">Existen muchas más herramientas de calidad. En próximos artículos tocaré algunas mas.</p>
</div>
 Tagged: Agile, Ant, calidad, Hudson, Java, NetBeans <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/297/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/297/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/297/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=297&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorio-checkstyle.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorios.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/netbeans-plugins-disponibles.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/netbeans-editor-checkstyle.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/netbeans-opciones-checkstyle.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-instalar-checkstyle-plugin.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-checkstyle-en-el-job.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-informes-checkstyle.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-simian-en-el-job.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-1.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-2.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugins-downloaded-pmd.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-warning1.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-en-accion.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-generar-informe.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-informe.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-configuracion.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-rule-editor.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/pmd-html-report2.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-pmd-en-el-job.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-1.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-21.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-findbugs-en-el-job.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-1.jpg" medium="image" />

		<media:content url="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-2.jpg" medium="image" />
	</item>
		<item>
		<title>Problemas desplegando unidades de persistencia en JBoss 5</title>
		<link>http://ivanator.wordpress.com/2009/02/24/problemas-desplegando-unidades-de-persistencia-en-jboss-5/</link>
		<comments>http://ivanator.wordpress.com/2009/02/24/problemas-desplegando-unidades-de-persistencia-en-jboss-5/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 19:02:03 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[j2ee]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=237</guid>
		<description><![CDATA[En los últimos cursos que he dado sobre tecnologías JEE he utilizado los productos open source de Sun porque se integran bastante bien y además los considero más adecuados para formación que otras posibles alternativas. En particular, he estado utilizando NetBeans y Glassfish para explicar EJB 3.0 y las apis de persistencia y transaccionalidad (JPA [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=237&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En los últimos cursos que he dado sobre tecnologías JEE he utilizado los productos open source de Sun porque se integran bastante bien y además los considero más adecuados para formación que otras posibles alternativas. En particular, he estado utilizando <a href="http://www.netbeans.org/" target="_self">NetBeans</a> y <a href="https://glassfish.dev.java.net/" target="_blank">Glassfish</a> para explicar EJB 3.0 y las apis de persistencia y transaccionalidad (JPA y JTA).</p>
<p>Hace unos días me bajé <a href="http://www.jboss.org/jbossas/" target="_blank">JBoss AS 5</a> para ver las novedades que presentaba (ya que en el pasado trabajé bastante con él) y al ir a desplegar algún <em>jar</em> que había funcionado perfectamente en Glassfish me ha dado problemas. Como sospechaba, el problema estaba en el <em>context.xml</em> y en que JBoss AS se ha vuelto un poco más pijo.</p>
<p>Veámoslo con un ejemplo. Este es el <em>persistence.xml</em> que funcionaba sin problemas en Glassfish y que reventaba en el JBoss:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;persistence&gt;
  &lt;persistence-unit name="Banco" transaction-type="JTA"&gt;
    &lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;
    &lt;jta-data-source&gt;banco&lt;/jta-data-source&gt;
    &lt;exclude-unlisted-classes&gt;false&lt;/exclude-unlisted-classes&gt;
    &lt;properties&gt;
      &lt;property name="hibernate.hbm2ddl.auto" value="update"/&gt;
    &lt;/properties&gt;
  &lt;/persistence-unit&gt;
&lt;/persistence&gt;</pre>
<p>Esta es la salida que producía en el log del JBoss:</p>
<pre>2009-02-24 19:28:42,832 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (HDScanner) Error installing to Parse: name=vfszip:/home/ivan/jboss-5.0.0.GA/server/all/deploy/titan.jar state=Not Installed mode=Manual requiredState=Parse
org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfszip:/home/ivan/jboss-5.0.0.GA/server/all/deploy/titan.jar
	at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:49)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:337)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:297)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:269)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.deploy(AbstractParsingDeployerWithOutput.java:230)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:545)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:290)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:221)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.jboss.xb.binding.JBossXBException: Failed to parse source: Failed to resolve schema nsURI= location=persistence
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:203)
	at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
	at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:199)
	at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:170)
	at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:132)
	at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:118)
	at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parseAndInit(AbstractVFSParsingDeployer.java:256)
	at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parse(AbstractVFSParsingDeployer.java:188)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:323)
	... 27 more
Caused by: org.jboss.xb.binding.JBossXBRuntimeException: Failed to resolve schema nsURI= location=persistence
	at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:313)
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:401)
	at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
	at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
	at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:199)
	... 35 more
2009-02-24 19:28:42,848 WARN  [org.jboss.system.server.profileservice.hotdeploy.HDScanner] (HDScanner) Failed to process changes
org.jboss.deployers.client.spi.IncompleteDeploymentException: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

*** CONTEXTS IN ERROR: Name -&gt; Error

vfszip:/home/ivan/jboss-5.0.0.GA/server/all/deploy/titan.jar -&gt; org.jboss.xb.binding.JBossXBRuntimeException: Failed to resolve schema nsURI= location=persistence

	at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:863)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:665)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:293)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:221)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)</pre>
<p>La solución ha sido más o menos sencilla: definir el espacio de nombres XML tal y como sigue y la unidad de persistencia se ha desplegado sin más problemas:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;persistence
    version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;
   &lt;persistence-unit name="titan"&gt;
      &lt;jta-data-source&gt;java:/DefaultDS&lt;/jta-data-source&gt;
      &lt;properties&gt;
         &lt;property name="hibernate.hbm2ddl.auto" value="create-drop"/&gt;
      &lt;/properties&gt;
   &lt;/persistence-unit&gt;
&lt;/persistence&gt;</pre>
<p>Tendré que echar un ojo a la especificación de JPA para ver si definir el espacio de nombres es obligatorio, aunque me parece recordar que esto no era una exigencia en versiones anteriores de JBoss AS&#8230;</p>
 Tagged: j2ee, Java, JBoss, logging <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/237/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=237&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/02/24/problemas-desplegando-unidades-de-persistencia-en-jboss-5/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>
	</item>
		<item>
		<title>Configuración de logging global en Java</title>
		<link>http://ivanator.wordpress.com/2009/02/19/configuracion-de-logging-global-en-java/</link>
		<comments>http://ivanator.wordpress.com/2009/02/19/configuracion-de-logging-global-en-java/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 13:04:38 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=227</guid>
		<description><![CDATA[



Image via Wikipedia



Hoy me he pasado unas cuantas horas peleándome con una tontería. La típica cosa que cuando ves lo que es te da una rabia infinita  
Aunque en el pasado había trabajado bastante con JBoss AS aún no me había dado tiempo a probar la versión 5 que se liberó en diciembre, así [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=227&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div class="zemanta-img" style="display:block;margin:1em;">
<div>
<dl class="wp-caption alignright">
<dt class="wp-caption-dt"><a href="http://commons.wikipedia.org/wiki/Image:Wave.svg"><img title="Duke, the Java Mascot, in the waving pose. Duk..." src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Wave.svg/202px-Wave.svg.png" alt="Duke, the Java Mascot, in the waving pose. Duk..." width="84" height="150" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution">Image via <a href="http://commons.wikipedia.org/wiki/Image:Wave.svg">Wikipedia</a></dd>
</dl>
</div>
</div>
<p>Hoy me he pasado unas cuantas horas peleándome con una tontería. La típica cosa que cuando ves lo que es te da una rabia infinita <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<p>Aunque en el pasado había trabajado bastante con <a href="http://www.jboss.org/">JBoss AS</a> aún no me había dado tiempo a probar la versión 5 que se liberó en diciembre, así que he decidido utilizarlo para un pequeño proyectito y así tener la excusa de ver qué novedades presenta.</p>
<p>Mi sorpresa ha sido que al ponerlo en marcha se ha puesto a sacar tal cantidad de información de logging por la consola que el pobre ha tardado más de 10 minutos en arrancar. Cara de póquer. Como me conozco el servidor, me voy a ver la configuración de logging del mismo que está en:</p>
<pre>JBOSS_HOME/server/default/conf/jboss-log4j.xml</pre>
<p>Si no recuerdo mal en anteriores versiones el fichero se llamaba a secas log4j.xml, pero al echarle un vistazo su estructura es la misma que en versiones anteriores. Sigue utilizando <a href="http://logging.apache.org/log4j/"><em>log4j</em></a> en vez de la api de logging de de la JSE y por defecto configura dos <em>appenders</em>: uno de consola con límite en el nivel <em>WARN</em> y otro de fichero.</p>
<p>Ahora sí que no entendía nada: ¿cómo es posible que la consola esté sacando tanto mensaje de logging y además con un nivel <em>TRACE</em> cuando la configuración limita al nivel a <em>WARN</em>?</p>
<p>Sigo investigando y compruebo que la información de logging que se corresponde con lo que yo voy configurando en dichero fichero sale por la salida estándar y que los mensajes &#8220;okupas&#8221; en realidad están saliendo por el canal de error&#8230; Además otros dos detalles, estos mensajes se corresponden con clases de la JSE y no tienen el mismo formato (<em>pattern</em>) que el resto de mensajes&#8230; Es más, parece que tienen formato del paquete de <em>logging</em> estándar de JSE&#8230;</p>
<p>Fallo localizado, tengo activado el <em>logging</em> estándar de la JSE (<em>javax.util.logging</em>) al nivel más alto. Ahora sólo falta averiguar por qué. Tras probar una serie de cosas estrambóticas, el fallo estribaba en que en algún momento (que no logro recordar) había cambiado la configuración global del <em>logging</em> estándar; ¿cómo se hace esto? Editando un fichero que se encuentra en la carpeta <em>lib </em>de la JRE instalada, en particular:</p>
<p>JAVA_HOME/jre/lib/logging.properties</p>
<p>En dicho fichero tenía establecido lo que llaman el <em>&#8220;Default global logging level&#8221;</em> a <em>ALL</em>. Al cambiarlo a <em>WARNING</em> todo volvió a la normalidad.</p>
<pre>../..
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= WARNING
../..</pre>
<div class="zemanta-pixie" style="margin-top:10px;height:15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/f1075cf5-1a26-41a6-876c-981a28f715e4/"><img class="zemanta-pixie-img" style="border:medium none;float:right;" src="http://img.zemanta.com/reblog_e.png?x-id=f1075cf5-1a26-41a6-876c-981a28f715e4" alt="Reblog this post [with Zemanta]" /></a></div>
 Tagged: Java, logging <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=227&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/02/19/configuracion-de-logging-global-en-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Wave.svg/202px-Wave.svg.png" medium="image">
			<media:title type="html">Duke, the Java Mascot, in the waving pose. Duk...</media:title>
		</media:content>

		<media:content url="http://img.zemanta.com/reblog_e.png?x-id=f1075cf5-1a26-41a6-876c-981a28f715e4" medium="image">
			<media:title type="html">Reblog this post [with Zemanta]</media:title>
		</media:content>
	</item>
		<item>
		<title>DZone y Refcardz</title>
		<link>http://ivanator.wordpress.com/2009/02/11/dzone-y-refcardz/</link>
		<comments>http://ivanator.wordpress.com/2009/02/11/dzone-y-refcardz/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 19:10:12 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ingeniería del software]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=220</guid>
		<description><![CDATA[
Una de las suscripciones que tengo en mi GoogleReader es el feed de DZone. En esta web se pueden leer artículos muy interesantes, bien redactados y estructurados y, en muchas ocasiones, escritos por eminencias en diferentes campos de la ingeniería del software. Las temáticas que cubren son diversas (patrones de diseño, antipatrones), metodologías, lenguajes, tecnologías [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=220&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://www.dzone.com"><img class="alignnone" title="DZone" src="http://www.dzone.com/links/themes/reader/images/dzlogo-tagline-small.gif" alt="" width="209" height="50" /></a></p>
<p>Una de las suscripciones que tengo en mi <a href="http://www.google.es/reader/">GoogleReader</a> es el feed de <a href="http://www.dzone.com/">DZone</a>. En esta web se pueden leer artículos muy interesantes, bien redactados y estructurados y, en muchas ocasiones, escritos por eminencias en diferentes campos de la ingeniería del software. Las temáticas que cubren son diversas (patrones de diseño, antipatrones), metodologías, lenguajes, tecnologías concretas, tendencias, comparativas, etc. Cuando aparece un nuevo <em>post</em> suele ser uno de los <em>feeds</em> que tienen preferencia en mi orden de lectura.</p>
<p>Al margen de los artículos, son los encargados de publicar las <a href="http://refcardz.dzone.com/">Refcardz</a>. Son unos documentos PDF con un estilo vistoso, funcional, uniforme y, sobre todo, breve que cuben en pocas páginas las ideas fundamentales de una tecnología concreta. Generalmente encajan en alguna de las siguientes categorías: herramientas, lenguajes y frameworks y, más raramente, arquitectura.</p>
<p>Yo las utilizo bajo dos puntos de vista:</p>
<ol>
<li>Cuando conozco la tecnología, las utilizo como guía de referencia rápida (por ejemplo, <a href="http://refcardz.dzone.com/refcardz/netbeans">la de NetBeans</a> tiene tablas con todas las combinaciones de teclas o con las diferentes plantillas de código y <a href="http://refcardz.dzone.com/refcardz/getting-started-with-jpa">la de JPA</a> tiene resúmenes de todas las etiquetas disponibles). Además suelen incluir ejemplos muy prácticos que permiten recordar de un vistazo cómo usar la tecnología que están ilustrando.</li>
<li>Cuando es una tecnología que no conozco en profundidad o que me es desconocida las utilizo para hacerme una primera idea de las posibilidades que ofrece. Además suelen ofrecer punteros a otras fuentes de documentación o libros.</li>
</ol>
<p>Estas fichas tecnológicas tienen una gran calidad de edición y de contenidos (se nota que el proceso de producción hasta que se hacen disponibles está muy cuidado) y están escritas por expertos en la materia que ilustran.</p>
<p>Además son GRATIS y se pueden usar sin restricciones. El truco es que el autor de la misma incrementa su reputación por tener la ficha y además se reserva un pequeño espacio donde éste puede publicitar su libro (siempre referente a la tecnología de la ficha en custión).</p>
<p>También existe un <a href="http://feeds.dzone.com/zones/refcardz">feed</a> que informa de la publicación de nuevas fichas. Cuando aparece una nueva entrada no puedo evitar bajarme rápidamente el PDF.</p>
 Tagged: ingeniería del software <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/220/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=220&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/02/11/dzone-y-refcardz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://www.dzone.com/links/themes/reader/images/dzlogo-tagline-small.gif" medium="image">
			<media:title type="html">DZone</media:title>
		</media:content>
	</item>
		<item>
		<title>Presentación de administración de Tomcat</title>
		<link>http://ivanator.wordpress.com/2009/02/09/presentacion-de-administracion-de-tomcat/</link>
		<comments>http://ivanator.wordpress.com/2009/02/09/presentacion-de-administracion-de-tomcat/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 19:30:47 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Presentación]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=209</guid>
		<description><![CDATA[



Image via Wikipedia



Hola,
Os cuelgo una presentación (creo que completita) que preparé para un curso de administración de Tomcat. Esta vez os lo cuelgo en un formato decente: en PDF.
La distribuyo bajo licencia . Si alguien quiere hacer un uso comercial que se ponga en contacto conmigo.
En algunas transparencias aparece en rojo &#8220;Ejercicio MxEy&#8221;, lo que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=209&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><div class="zemanta-img" style="display:block;margin:1em;">
<div>
<dl class="wp-caption alignright">
<dt class="wp-caption-dt"><a href="http://en.wikipedia.org/wiki/Image:Tomcat.png"><img title="Apache Tomcat" src="http://upload.wikimedia.org/wikipedia/en/1/1f/Tomcat.png" alt="Apache Tomcat" width="130" height="92" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution">Image via <a href="http://en.wikipedia.org/wiki/Image:Tomcat.png">Wikipedia</a></dd>
</dl>
</div>
</div>
<p>Hola,</p>
<p>Os cuelgo una presentación (creo que completita) que preparé para un curso de administración de Tomcat. Esta vez os lo cuelgo en un formato decente: en <a href="http://ivanator.files.wordpress.com/2009/02/instalacion-y-administracion-de-tomcat-v1-2008-07.pdf" target="_blank">PDF</a>.</p>
<p>La distribuyo bajo licencia <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/es/"><img class="size-full wp-image-161 alignnone" title="licencia" src="http://ivanator.files.wordpress.com/2009/02/licencia.png?w=88&#038;h=31" alt="licencia" width="88" height="31" /></a>. Si alguien quiere hacer un uso comercial que se ponga en contacto conmigo.</p>
<p>En algunas transparencias aparece en rojo &#8220;Ejercicio MxEy&#8221;, lo que quiere decir que en ese punto de la presentación había previsto un ejercicio correspondiente al módulo <em>x</em> con número de ejercicio <em>y</em>. Si alguien quiere los enunciados y las soluciones, que me los pida sin ningún problema (es una pena que wordpress no deje subir <em>zips</em> o <em>tars</em>).</p>
<p>Aprovecho para comentar que en este momento soy profesional freelance y que me ofrezco para temas de asesoría y/o formación en los temas sobre los que posteo.</p>
<p>El índice de la presentación es el siguiente:</p>
<ol>
<li>Introducción</li>
<li>Instalación de Tomcat</li>
<li>Aplicaciones web con Java</li>
<li>Configurar Tomcat</li>
<li>Gestionar aplicaciones web</li>
<li>Características avanzadas</li>
<li>Conexión con bases de datos</li>
<li>Conectores</li>
<li>Seguridad</li>
<li>Alojamiento compartido</li>
</ol>
<div class="zemanta-pixie" style="margin-top:10px;height:15px;"><a class="zemanta-pixie-a" title="Zemified by Zemanta" href="http://reblog.zemanta.com/zemified/782b8aaa-37d0-461b-b2fb-66c6e9b5cc13/"><img class="zemanta-pixie-img" style="border:medium none;float:right;" src="http://img.zemanta.com/reblog_e.png?x-id=782b8aaa-37d0-461b-b2fb-66c6e9b5cc13" alt="Reblog this post [with Zemanta]" /></a></div>
 Tagged: Java, Presentación, Tomcat <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/209/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/209/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/209/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=209&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/02/09/presentacion-de-administracion-de-tomcat/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/en/1/1f/Tomcat.png" medium="image">
			<media:title type="html">Apache Tomcat</media:title>
		</media:content>

		<media:content url="http://ivanator.files.wordpress.com/2009/02/licencia.png" medium="image">
			<media:title type="html">licencia</media:title>
		</media:content>

		<media:content url="http://img.zemanta.com/reblog_e.png?x-id=782b8aaa-37d0-461b-b2fb-66c6e9b5cc13" medium="image">
			<media:title type="html">Reblog this post [with Zemanta]</media:title>
		</media:content>
	</item>
		<item>
		<title>Presentación desarrollo del software para no informáticos</title>
		<link>http://ivanator.wordpress.com/2009/02/08/desarrollo-software-para-no-informaticos/</link>
		<comments>http://ivanator.wordpress.com/2009/02/08/desarrollo-software-para-no-informaticos/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 11:39:49 +0000</pubDate>
		<dc:creator>Iván Párraga García</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[calidad]]></category>
		<category><![CDATA[ingeniería del software]]></category>
		<category><![CDATA[Presentación]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ivanator.wordpress.com/?p=160</guid>
		<description><![CDATA[Os cuelgo una presentación sobre ingeniería informática y desarrollo de software que hice hace unos meses para una audiencia no informática que se dedica a programar. Hablo de bastantes temas pero desde un punto de vista muy divulgativo y poco profundo. El formato es un pptx (lo siento  ).
La distribuyo bajo licencia  y se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=160&subd=ivanator&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Os cuelgo una presentación sobre ingeniería informática y desarrollo de software que hice hace unos meses para una audiencia no informática que se dedica a programar. Hablo de bastantes temas pero desde un punto de vista muy divulgativo y poco profundo. El formato es un pptx (lo siento <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ).</p>
<p>La distribuyo bajo licencia <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/es/"><img class="size-full wp-image-161 alignnone" title="licencia" src="http://ivanator.files.wordpress.com/2009/02/licencia.png?w=88&#038;h=31" alt="licencia" width="88" height="31" /></a> y se puede <a href="http://ivanator.files.wordpress.com/2009/02/desarrollo-de-software.pptx">descargar aquí</a>. Si alguien quiere utilizarla con propósitos comerciales que se ponga en contacto conmigo.</p>
<p>El índice de la presentación es el siguiente:</p>
<ol>
<li>Ingeniería del Software y Metodologías
<ol>
<li>La problemática de la construcción de software</li>
<li>La ingeniería del software como solución</li>
<li>Partes fundamentales de la ingeniería del software</li>
<li>Ciclos de vida de construcción de software</li>
</ol>
</li>
<li>Arquitectura de aplicaciones
<ol>
<li>Componentes de un sistema</li>
<li>Evolución y tipos de arquitecturas</li>
<li>Patrones de diseño</li>
</ol>
</li>
<li>Metodologías
<ol>
<li>Por qué las metodologías tradicionales no son suficiente</li>
<li>Metodologías ágiles</li>
<li>TDD</li>
</ol>
</li>
<li>Entornos y herramientas
<ol>
<li>Entornos de desarrollo</li>
<li>IDEs</li>
<li>Plugins e integración de herramientas</li>
</ol>
</li>
<li>Buenas prácticas
<ol>
<li>Buenas prácticas generales</li>
<li>Particularidades del software científico</li>
<li>Checkpoints</li>
</ol>
</li>
<li>Programación paralela
<ol>
<li>Qué es la programación paralela</li>
<li>Conceptos y clasificaciones</li>
<li>Programación paralela</li>
<li>Qué ayudas tiene el programador</li>
</ol>
</li>
<li>Asincronía y colas
<ol>
<li>Sincronía vs asincronía</li>
<li>Sistemas de colas</li>
</ol>
</li>
<li>Midiendo
<ol>
<li>Debugging</li>
<li>Logging</li>
<li>Profiling</li>
<li>Benchmarking</li>
</ol>
</li>
<li>Definición de flujos</li>
</ol>
 Tagged: Agile, calidad, ingeniería del software, Presentación, TDD <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/160/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/160/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/160/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&blog=6092394&post=160&subd=ivanator&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://ivanator.wordpress.com/2009/02/08/desarrollo-software-para-no-informaticos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">ivanator</media:title>
		</media:content>

		<media:content url="http://ivanator.files.wordpress.com/2009/02/licencia.png" medium="image">
			<media:title type="html">licencia</media:title>
		</media:content>
	</item>
	</channel>
</rss>