<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Planeta NetBeans</title>
    <link>http://www.planetnetbeans.org/es/</link>
    <language>es</language>
    <description>Planeta NetBeans - http://www.planetnetbeans.org/es/</description>
    <item>
      <title>Avbravo: NetBeans 6.7 en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-5797882441527647891</guid>
      <link>http://avbravo.blogspot.com/2009/06/netbeans-67-en-espanol.html</link>
      <description>&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/Skkl5H4GaBI/AAAAAAAACDY/PFukGsYp960/s320/download-netbeans-125x125.gif" /&gt;&lt;br /&gt;&lt;br /&gt;Ya esta disponible la versión final de NetBeans 6.7&lt;br /&gt;&lt;a href="http://www.netbeans.org/downloads/index.html"&gt;Puedes descargarlo desde aqui&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SkjhwnQ1CbI/AAAAAAAACDI/3bM5OAkwcHk/s320/nb67.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SkjhwhhaP8I/AAAAAAAACDQ/-97jqT9_xrI/s320/nb2.png" /&gt;&lt;br /&gt;Quiero agradecer a todos los miembros del equipo de traducción en español por este esfuerzo realizado , realmente mis agradecimientos. Podemos decir que es un trabajo de la comunidad.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netbeans.org/features/"&gt;Ver las caracteristicas aqui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-5797882441527647891?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 29 Jun 2009 20:37:24 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: JFormattedTextField y el método selectAll()</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/?p=329</guid>
      <link>http://cafelojano.wordpress.com/2009/06/28/jformattedtextfield-y-el-metodo-selectall/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;Una pregunta que nos hicieron en otro post era: ¿qué se debe hacer para que cuando un JFormattedTextField gane el foco se sobreescriba el texto que se muestra actualmente?&lt;/p&gt; &lt;p&gt;Mi primer respuesta fue programar el evento focusGained (cuándo gana el foco) e invoca al método selectAll() que permite seleccionar el texto que muestra el JFormattedTextField. En teoría funciona, pero resulta que no es así. La explicación es la
      siguiente:&lt;/p&gt; &lt;p&gt;Existe un bug, el &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4740914" target="_blank" title="Bug"&gt;4740914&lt;/a&gt;, que ha sido reportado desde la versión 1.4 y que en breves palabras nos dice que existe un problema cuando se llama al método selectAll() de un JFormattedTextField.&lt;/p&gt; &lt;p&gt;La solución se muestra en el mismo reporte del bug. Y es la siguiente:&lt;/p&gt; &lt;pre name="code" class="java"&gt; private void
      jFormattedTextField1FocusGained(java.awt.event.FocusEvent evt) { SwingUtilities.invokeLater(new Runnable() { public void run() { jFormattedTextField1.selectAll(); } }); } &lt;/pre&gt; &lt;p&gt;Básicamente lo que se hace es crear un hilo que llama al método selectAll sobre el JFormattedTextField. En mi caso lo programé en el método que maneja el evento focusGained. Existe una nota que dice:&#160;Please note that this solution does not work when this component is used as an editor in a JTable with
      surrender-focus enabled.&lt;/p&gt; &lt;p&gt;Espero que les ayude, en especial a quién hizo la pregunta.&lt;/p&gt; &lt;a href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/329/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/329/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/329/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/329/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/329/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/329/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/329/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/329/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/329/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/329/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=329&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt=""
      border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 28 Jun 2009 23:26:07 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7 RC3</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-2802742430955047311</guid>
      <link>http://avbravo.blogspot.com/2009/06/netbeans-67-rc3.html</link>
      <description>Ya esta disponible la versión de NetBeans 6.7 RC3, Diego Silva miembro del equipo de traducción comenta al respecto en su &lt;a href="http://apuntesdejava.blogspot.com/2009/06/netbeans-67-rc-3.html"&gt;blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-2802742430955047311?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 16 Jun 2009 17:30:44 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Bugzilla desde NetBeans 6.7</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-5615120137574855537</guid>
      <link>http://avbravo.blogspot.com/2009/06/bugzilla-desde-netbeans-67.html</link>
      <description>Nuestro amigo Diego Silva, continua con nuestra serie blogs acerca de las caracteristicas de NetBeans. 6.7, hace unos dias hable de la integración con Kenia, ahora Diego nos habla sobre Bugzilla, un interesente blog que no debes dejar de visitar.&lt;br /&gt;&lt;a href="http://apuntesdejava.blogspot.com/2009/06/bugzilla-desde-netbeans-67.html"&gt;Bugzilla desde NetBeans 6.7&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-5615120137574855537?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 16 Jun 2009 17:28:06 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: SwingWorker &amp; SwingX</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/?p=321</guid>
      <link>http://cafelojano.wordpress.com/2009/06/06/swingworker-swingx/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;A los tiempos escribo.&lt;/p&gt; &lt;p&gt;El tema que les presentaré utiliza varias técnologías: SwingWorker, JXBusyLabel y Java Web Start. El propósito es mostrar cómo funcionan, en parte, cada una de ellas. Paso a explicar mis intenciones.&lt;/p&gt; &lt;p&gt;La aplicación es bastante sencilla, imagínese que al hacer clic en un botón se lanza una tarea que demara alguna cantidad significativa de tiempo, para señalarle al usuario que
      el programa está trabajando (y no dar la impresión que el programa se colgó) se muestra una animación. Luego que la tarea se ha cumplido la animación deja de trabajar. Para cumplir con lo propuesto se utiliza lo siguiente:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;SwingWorker. Una especialización de la clase Thread, que permite realizar tareas ‘por debajo’ de la GUI. La clase SwingWorker crea un hilo que se encarga de hacer la tarea compleja para ello se cuenta con el método
      &lt;em&gt;&lt;strong&gt;doInBackground &lt;/strong&gt;&lt;/em&gt;y cuando la tarea concluye automáticamente se llama al método &lt;em&gt;&lt;strong&gt;done&lt;/strong&gt;&lt;/em&gt;. Además la clase SwingWorker trabaja con genéricos de tal forma que permite que el programador defina los tipos de datos de retorno del método doInBackground, en mi caso usé el tipo boolean.&lt;/li&gt; &lt;/ul&gt; &lt;pre name="code" class="java"&gt; protected Boolean doInBackground() throws Exception { int i = 0; while(i
      &amp;lt; 100 &amp;amp;&amp;amp; !isCancelled()){ Thread.sleep(100); i ++; } return true; } public void done(){ try { etiqueta.setBusy(!get()); boton.setEnabled(get()); } catch (InterruptedException ex) { Logger.getLogger(Tarea.class.getName()).log(Level.SEVERE, null, ex); } catch (ExecutionException ex) { Logger.getLogger(Tarea.class.getName()).log(Level.SEVERE, null, ex); } } &lt;/pre&gt; &lt;p&gt;Dentro del método &lt;em&gt;&lt;strong&gt;done&lt;/strong&gt;&lt;/em&gt; se puede ver que se existe una
      llamada al método get() que lo que hace es obtener el valor que retornó el método doInBackground en nuestro caso obtendría true. SwingWorker es un hilo que permite que el hilo que se encarga de la GUI siga trabajando sin interrumpirlo, de esa manera se dá se evita que la GUI se congele. Se creó un clase denominada Tarea que hereda de SwingWorker y posee propiedades del tipo JXBusyLabel y JButton que serán referencias a los elementos que se encuentran en el JFrame.&lt;/p&gt; &lt;p&gt;SwingWorker se
      encuentra definido desde la versión 1.6 así que es necesario contar con esa versión del JDK.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://swinglabs.org/" target="_blank" title="SwingX"&gt;SwingX&lt;/a&gt; es un conjunto de componentes que extienden a los existentes en Swing, entre esos componentes existen uno denominado JXBusyLabel que es un componente que muestra un grupo de líneas colocadas formando una circunferencia (existen otras formas de presentación), cada línea cambia de color dándole
      así una animación y el la idea de que se está trabajando y que espere hasta que se concluya con la tarea. Veamos el código&lt;/li&gt; &lt;/ul&gt; &lt;pre name="code" class="java"&gt; BusyPainter painter = new BusyPainter( new RoundRectangle2D.Float(0, 0, 15.000001f, 5.0f, 10.0f, 10.0f), new Ellipse2D.Float(7.5f, 7.5f, 35.0f, 35.0f)); painter.setTrailLength(4); painter.setPoints(8); painter.setFrame(-1); jxblTrabajando.setPreferredSize(new Dimension(50, 50)); jxblTrabajando.setIcon(new EmptyIcon(50,
      50)); jxblTrabajando.setBusyPainter(painter); &lt;/pre&gt; &lt;p style="padding-left: 30px;"&gt;Aún estoy estudiando el código así que no puedo decir mucho, pero podemos ver que no es complicado. El objeto de la clase JXBusyLabel se denomina jxblTrabajando y utiliza la clase BusyPrinter para poder trabajar. Es importante decir que para iniciar la animación se debe llamar al método&lt;strong&gt;&lt;em&gt; setBusy(true);&lt;/em&gt;&lt;/strong&gt; en el programa que analizamos se ejecuta dicho método
      cuándo se hace clic en el botón Iniciar.&lt;/p&gt; &lt;p style="padding-left: 30px;"&gt;Las clases de SwingX son muchas y además existen otros proyectos como JXLayer, Timingframework que permiten hacer muchas otras cosas.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Finalmente Java Web Start es una tecnología Java que permite deployar (descargar e instalar) las aplicaciones desde una página Web superando algunos de los incovenientes que se presentan cuándo se instalan aplicaciones cliente – servidor, como por
      ejemplo la actualización ya que las aplicaciones JWS primero revisan si la versión de la aplicación instalada en el computador es la misma que la que se encuentra en el servidor, sino es así se descargará la última versión del servidor.&#160; Para realizar ésto se utilizó las facilidades que posee NetBeans. Para ello se hizo clic derecho sobre el proyecto, propiedades y luego se busca la opción Web Start se habilita esa opción y listo. Cuando se hace un Clean&amp;amp;Build se generan un archivo jnlp
      y página html que contienen un link al archivo jnlp.&#160; Antes de poder ejecutar las aplicaciones de ésta manera es necesario verificar que tú servidor Web maneje apropiadamente vía tipo MIME los archivo jnlp, verificando si existe la línea: application/x-java-jnlp-file JNLP . Mayores detalles puedes encontrarlos en &lt;a href="http://java.sun.com/docs/books/tutorial/deployment/webstart/deploying.html" target="_blank" title="Tutoria JNLP"&gt;Deploying Java Web Start
      Applications&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;h3 style="padding-left: 60px;"&gt;Para ejecutar la aplicación vía Web Start clic &lt;a href="http://jorgaf.loxa.ec/jws/launch.jnlp" title="Ejecutar la aplicaicón"&gt;aquí&lt;/a&gt;&lt;/h3&gt; &lt;p&gt;En la aplicación se agregó un check box y un radio button con la final de mostrar cómo la tarea se ejecuta de manera independiente de la GUI. SwingLabs posee muchos componentes muy interesantes y útiles pueden ver los demás aquí y en algún momento la
      aplicación debería ser &lt;a href="https://jxlayer.dev.java.net/webstart/LockableDemo.jnlp" title="LocakableDemo"&gt;así&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para descargar el código haga clic &lt;a href="http://www.box.net/shared/n7hmqlqrcy" title="Código fuente"&gt;aquí&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos.&lt;/p&gt; &lt;a href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/321/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/321/"
      alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/321/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/321/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/321/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/321/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/321/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/321/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/321/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/321/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img
      src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=321&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 06 Jun 2009 05:05:12 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7RC2 disponible</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7473237876961042421</guid>
      <link>http://avbravo.blogspot.com/2009/06/netbeans-67rc2-disponible.html</link>
      <description>&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/Sil7qg-tAAI/AAAAAAAACC8/KD86ydsH_EQ/s320/NBRC2.png" /&gt;&lt;br /&gt;Hace unos días fue liberado el RC1 de NetBeans 6.7, ahora le toca la oportunidad al RC2 de NetBeans 6.7, que son las versiones previas antes del lanzamiento oficial de NetBeans 6.7.&lt;br /&gt;&lt;a href="http://download.netbeans.org/netbeans/6.7/rc2/"&gt;Descargarlo desde aqui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-7473237876961042421?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 05 Jun 2009 20:11:05 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Integración JIRA en NetBeans 6.7RC1</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-1154924353851211004</guid>
      <link>http://avbravo.blogspot.com/2009/06/integracion-jira-en-netbeans-67rc1.html</link>
      <description>David Salter nos muestra en su blog el uso de NB6.7RC1 con JIRA&lt;br /&gt;&lt;a href="http://davidsalter.co.uk/blog/?p=348"&gt;http://davidsalter.co.uk/blog/?p=348&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pasos:&lt;br /&gt;1. Instalar los plugins desde el menú &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Herramientas&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Complementos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SiVYuaNU1PI/AAAAAAAACBU/7BDkCrMZS8c/s320/jira4.png" /&gt;&lt;br /&gt;Al terminar de instalar reiniciamos el IDE&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SiVZIvlMB1I/AAAAAAAACBc/9ZK_QLmoZDI/s320/jira5.png" /&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a prestaciones, seleccionamos Issue Tracker,&lt;br /&gt;damos click derecho y seleccionamos Create Issue Tracker...&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SiVZrZxhUII/AAAAAAAACBk/vW-7cmluBYY/s320/isue1.png" border="0" /&gt;&lt;br /&gt;Indicamos los datos que se solicitan&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SiVb1sQFmII/AAAAAAAACBs/Do53NDEhaCk/s320/jira5.png" /&gt;&lt;br /&gt;&lt;br /&gt;Tenemos el issue agregado&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SiVcSoC_xFI/AAAAAAAACB0/IyeEC0-5kvI/s320/jira6.png" /&gt;&lt;br /&gt;Damos click derecho y se muestra
      el menu&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SiVgQkbXNQI/AAAAAAAACB8/lP_mQheso04/s320/jirareportes.png" /&gt;&lt;br /&gt;Tenemos una muestra&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SiVgk7QKFwI/AAAAAAAACCE/F05MESF8y9w/s320/reportes.png" /&gt;&lt;br /&gt;&lt;br /&gt;Integración de Kenai desde NetBeans&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SiVXBDUZOVI/AAAAAAAACBM/8lurqYvYLMc/s320/jira2.png" /&gt;&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-1154924353851211004?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 02 Jun 2009 17:26:46 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7RC1 en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7916824633690372365</guid>
      <link>http://avbravo.blogspot.com/2009/06/netbeans-67rc1-en-espanol.html</link>
      <description>Ayer comentaba sobre algunas características de NetBeans 6.7 RC1, creo que es importante mencionar que este ha sido liberado en 16 idiomas,&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.netbeans.org/netbeans/6.7/rc/"&gt;http://download.netbeans.org/netbeans/6.7/rc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Seleccionamos el idioma que deseamos descargarlo.&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SiU45VctBhI/AAAAAAAACA8/IpagZKKgL8U/s320/nbs3.png" /&gt;&lt;br /&gt;Luego
      nos envía a la pagina de descarga;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SiU4nCr0YTI/AAAAAAAACA0/O3xV4lAwMlQ/s320/nb67mensaje.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aquí tenemos una muestra del IDE en español.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SiU3BdRTowI/AAAAAAAACAc/bi2X2wXwBPo/s320/nbs1.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SiU3BQY_vzI/AAAAAAAACAk/mGusWIn8Tm0/s320/nbs2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Es importante recordar que estas traducciones aun no han concluido y faltan varios módulos por traducir y revisar, si encuentran errores pueden comunicarlo.&lt;br /&gt;Tambien para felicitar a los miembros del equipo de traducción de NetBeans que colaboran grandemente para que este IDE este disponible en español.&lt;br /&gt;&lt;br /&gt;saludos a todos&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-7916824633690372365?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 02 Jun 2009 14:41:24 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Tutorial Creando un Proyecto en Kenai en NB6.7</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-1763609577516905442</guid>
      <link>http://avbravo.blogspot.com/2009/06/tutorial-creando-un-proyecto-en-kenai.html</link>
      <description>En el sitio de documentos de NetBeans se ha creado un tutorial que muestra como utilizar Kenia desde NetBeans.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netbeans.org/kb/docs/ide/kenai-create-project.html?intcmp=925655"&gt;http://www.netbeans.org/kb/docs/ide/kenai-create-project.html?intcmp=925655&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tambien se publico el otro tutorial&lt;br /&gt;&lt;a href="http://www.netbeans.org/kb/docs/java/maven-hib-java-se.html?intcmp=925655"&gt;Creating a Maven
      Swing Application Using Hibernate - NetBeans IDE 6.7 Tutorial&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-1763609577516905442?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 01 Jun 2009 20:04:08 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7RC1 disponible</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7694148510986293186</guid>
      <link>http://avbravo.blogspot.com/2009/06/netbeans-67rc1-disponible.html</link>
      <description>&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SiPw0V03MwI/AAAAAAAACAU/DGFDnX4HYLQ/s320/nbrc1.png" border="0" /&gt;&lt;br /&gt;Ya esta disponible el RC1 de NetBeans 6.7, lo puedes descargar &lt;a href="http://download.netbeans.org/netbeans/6.7/rc/"&gt;aqui&lt;/a&gt;.&lt;br /&gt;Entre algunas características de esta nueva versión:&lt;br /&gt;Integración con Kenai&lt;br /&gt;Integración Bugzilla&lt;br /&gt;Maven&lt;br /&gt;&lt;br /&gt;&lt;a
      href="http://wiki.netbeans.org/NewAndNoteWorthyNB67"&gt;Mas detalles aqui&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-7694148510986293186?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 01 Jun 2009 15:16:53 +0000</pubDate>
    </item>
    <item>
      <title>diesil java: JavaScript en NetBeans 6.1</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-5893125674034194816.post-7207083767282318497</guid>
      <link>http://diesil-java.blogspot.com/2008/04/javascript-en-netbeans-61.html</link>
      <description>Esta entrada fue movida a&lt;br /&gt;&lt;br /&gt;&lt;a href="http://apuntesdejava.blogspot.com/2008/04/javascript-en-netbeans-61.html"&gt;http://apuntesdejava.blogspot.com/2008/04/javascript-en-netbeans-61.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/5893125674034194816-7207083767282318497?l=diesil-java.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 28 May 2009 19:43:57 +0000</pubDate>
    </item>
    <item>
      <title>Le Funes » NetBeans: Agregando en NetBeans la Javadoc de librerias opcionales del JDK</title>
      <guid isPermaLink="false">http://lefunes.wordpress.com/2009/05/27/agregando-en-netbeans-la-javadoc-de-librerias-opcionales-del-jdk/</guid>
      <link>http://lefunes.wordpress.com/2009/05/27/agregando-en-netbeans-la-javadoc-de-librerias-opcionales-del-jdk/</link>
      <description>Cuando agregamos librerías opcionales del JDK al mismo, por ejemplo Comm API o JAI, notaremos que sus clases se encontrarán disponibles automáticamente para utilizar dentro del IDE, pero no conseguiremos poder ver su Javadoc. Para poder indicarle a NB donde se encuentra la Javadoc a cargar tenemos que ir al menú ...</description>
      <pubDate>Wed, 27 May 2009 11:16:08 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Traducción de NetBeans 6.7 en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7310984357959537628</guid>
      <link>http://avbravo.blogspot.com/2009/05/traduccion-de-netbeans-67-en-espanol.html</link>
      <description>El equipo de traducción de NetBeans en español se encuentra trabajando en la versión 6.7, por lo cual estas invitado a colaborar en el mismo.&lt;br /&gt;En nuestro &lt;a href="http://wiki.netbeans.org/SpanishTranslation"&gt;Wiki &lt;/a&gt;puedes encontrar los pasos para unirte al grupo y colaborar con la traducción.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-7310984357959537628?l=avbravo.blogspot.com" height="1" width="1"
      /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 19 May 2009 21:04:14 +0000</pubDate>
    </item>
    <item>
      <title>diesil java: Mudado...!!</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-5893125674034194816.post-2438856781749201379</guid>
      <link>http://diesil-java.blogspot.com/2009/05/mudado.html</link>
      <description>Si eras una de las personas que visitaba este humilde blog, pues te informo que todo lo he cambiado a otra dirección:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0); font-size: 130%;"&gt;&lt;a href="http://apuntesdejava.blogspot.com/"&gt;http://apuntes&lt;span style="color: rgb(51, 51, 255);"&gt;de&lt;/span&gt;java.blogspot.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahí están todos los posts... menos los comentarios.&lt;br /&gt;&lt;br /&gt;Por
      ahora no he activado el foro ya que... vamos... no me da tiempo de responder las preguntas.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/5893125674034194816-2438856781749201379?l=diesil-java.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 06 May 2009 18:52:36 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: ubuntu 9.04 parecido a windows</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-3328885637614707182</guid>
      <link>http://avbravo.blogspot.com/2009/04/ubuntu-904-parecido-windows.html</link>
      <description>Instale Ubuntu 9.04 en varias pc con ext4 y se me parece mas ha Windows XP, se congela a cada rato, varios programas no estan en los repositorios, entre ellos MySQL, PostGreSQL.&lt;br /&gt; sudo apt-get install mysql-server&lt;br /&gt;Leyendo lista de paquetes... Hecho&lt;br /&gt;Creando árbol de dependencias &lt;br /&gt;Leyendo la información de estado... Hecho&lt;br /&gt;Tal vez quiera ejecutar `apt-get -f install' para corregirlo:&lt;br /&gt;Los siguientes paquetes tienen dependencias
      incumplidas:&lt;br /&gt; mysql-server: Depende: mysql-server-5.0 pero no va a instalarse&lt;br /&gt; shutter: Depende: libxml-simple-perl pero no va a instalarse&lt;br /&gt; Depende: libwww-mechanize-perl pero no va a instalarse&lt;br /&gt; Depende: libgnome2-gconf-perl pero no va a instalarse&lt;br /&gt; Depende: libgnome2-wnck-perl pero no va a instalarse&lt;br /&gt; Depende: imagemagick&lt;br /&gt; Depende: perlmagick&lt;br /&gt; Depende: libgtk2-imageview-perl pero no va a instalarse&lt;br /&gt;
      Depende: libx11-protocol-perl pero no va a instalarse&lt;br /&gt; Depende: libgtk2-trayicon-perl pero no va a instalarse&lt;br /&gt; Depende: libgoo-canvas-perl pero no es instalable&lt;br /&gt; Depende: gnome-web-photo pero no va a instalarse&lt;br /&gt;E: Dependencias incumplidas. Intente 'apt-get -f install' sin paquetes (o especifique una solución).&lt;div class="blogger-post-footer"&gt;&lt;img src="http://res1.blogblog.com/tracker/11140295-3328885637614707182?l=avbravo.blogspot.com" height="1"
      width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 30 Apr 2009 20:45:37 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7 Beta</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-3481848987657199776</guid>
      <link>http://avbravo.blogspot.com/2009/04/netbeans-67-beta.html</link>
      <description>&lt;a href="http://bits.netbeans.org/netbeans/6.7/community/beta/"&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/Sfcy_USt-UI/AAAAAAAAB_8/2qmCUaTcFH8/s320/dl-nb-ide.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ya esta disponible la versión 6.7 Beta de NetBeans&lt;br /&gt;puedes obtener información aquí.&lt;br /&gt;&lt;a href="http://www.netbeans.org/community/releases/67/index.html"&gt;http://www.netbeans.org/community/releases/67/index.html&lt;/a&gt;&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-3481848987657199776?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 28 Apr 2009 16:50:02 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Alexandre Oliva en FLISOL Panama 2009</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-8070570260923782422</guid>
      <link>http://avbravo.blogspot.com/2009/04/alexandre-oliva-en-flisol-panama-2009.html</link>
      <description>&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/Sed-C75cbRI/AAAAAAAAB_s/-StWzQTT2h8/s320/alexanderoliva.png" /&gt;&lt;br /&gt;La fraternidad de Software Libre de Panamá, esta organizando junto con otras comunidades en Panamá el "Festival Latinoamericano de Software Libre " FLISOL 2009.&lt;br /&gt;Se contaran con talleres, charlas, installfest, para promover el uso del software libre.&lt;br /&gt;En esta ocasión se contara con la presencia de &lt;a
      href="http://www.lsd.ic.unicamp.br/~oliva/"&gt;Alexandre Oliva &lt;/a&gt;&lt;br /&gt;Puedes visitar su pagina principal &lt;a href="http://www.lsd.ic.unicamp.br/~oliva/"&gt;aqui&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Este evento se realizara simultáneamente en varias ciudades de Panamá.&lt;br /&gt;PanamaJUG esta organizando FLISOL 2009 en la península de Azuero.&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-8070570260923782422?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 16 Apr 2009 18:52:20 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Cambios importantes en NetBeans</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-5108445123019256499</guid>
      <link>http://avbravo.blogspot.com/2009/04/cambios-importantes-en-netbeans.html</link>
      <description>Como comenta James Branam algunos cambios que serán aplicados a NetBeans&lt;br /&gt;entre ellos UML, Visual Web, y SOA seran movidos al Update Center.&lt;br /&gt;Puedes visitar el enlace en el blog de James&lt;br /&gt;&lt;a href="http://blogs.sun.com/branajam/entry/uml_visual_web_and_soa"&gt;http://blogs.sun.com/branajam/entry/uml_visual_web_and_soa&lt;/a&gt;&lt;br /&gt;&lt;h1 class="weblogName"&gt;&lt;br /&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-5108445123019256499?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 16 Apr 2009 13:24:06 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Java Cup 2009</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7434184546844394118</guid>
      <link>http://avbravo.blogspot.com/2009/04/java-cup-2009.html</link>
      <description>&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SePAuSI2hwI/AAAAAAAAB_c/GOowoD9EfgA/s320/logo_small.gif" /&gt;&lt;br /&gt;Amigos, para este año 2009, ya esta abierta Java Cup 2009.&lt;br /&gt;&lt;a href="http://javahispano.org/contenidos/es/comienza_la_javacup_2009/?menuId=ANNOUNCEMENTS"&gt;Información en JavaHispano&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La revista &lt;a href="http://www.revistasprofesionales.com/"&gt;Sólo Programadores&lt;/a&gt;,&lt;a href="http://es.sun.com/"&gt; Sun
      Microsystems Ibérica&lt;/a&gt; y la organización sin ánimo de lucro &lt;a href="http://www.javahispano.org/"&gt;javaHispano &lt;/a&gt;hemos organizado la tercera versión del torneo virtual de fútbol JavaCup donde cada equipo es una clase Java que implementa una interfaz predefinida. El concurso cuenta con el patrocinio de las empresas &lt;a href="http://www.kotasoft.com/"&gt;Kotasoft&lt;/a&gt;, en calidad de patrocinador de oro, y &lt;a href="http://www.salenda.es/"&gt;Salenda&lt;/a&gt; como
      patrocinadores de plata. La participación está abierta a cualquier hispanohablante, sin importar su nacionalidad.&lt;br /&gt;&lt;br /&gt;Desarrollar un equipo de fútbol es simple ya que el software en el cual se basa el concurso se encarga de dibujar en la pantalla y gestionar los movimientos de la pelota y de los dos equipos. Para crear un equipo lo único que hay que indicar es qué movimientos quieres que realice tu equipo en cada situación, lo cual es sencillo gracias a la API que expone a los
      equipos el software.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como recordaran en la versión 2008 del torneo no se modifico el framework original, en cambio, para esta nueva versión se ha reescrito por completo el framework, añadiendo características nuevas, tanto en la gráfica, como en el audio, y en la lógica del juego. Pese a esto, se desea mantener la estructura básica original de las JavaCup anteriores.&lt;br /&gt;&lt;br /&gt;Premios&lt;br /&gt;&lt;br /&gt;El ganador del concurso recibirá 1000 €, el
      segundo clasificado recibirá 500 €, el tercero 250 € y el cuarto 125 €. Además, todos ellos recibirán una suscripción anual a la revista Sólo Programadores. Los ganadores del concurso se anunciarán en el evento tecnológico OpenJavaDay, que se celebrará el 18 y 19 de junio en España, Madrid.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://javahispano.org/contenidos/es/comienza_la_javacup_2009/?menuId=ANNOUNCEMENTS"&gt;Recuerden visitar el enlace en JavaHispano con toda la documentación al
      respecto.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-7434184546844394118?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 13 Apr 2009 22:47:13 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Flisol Panama 2009</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-8917080082195137327</guid>
      <link>http://avbravo.blogspot.com/2009/04/flisol-panama-2009.html</link>
      <description>&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SeNM9zW3WRI/AAAAAAAAB-8/7esG-FEuSVE/s320/Afiche-FLISOL.jpg" /&gt;&lt;br /&gt;PanamaJUG se ha unido a otras comunidades de software libre en el Festival Latinoamericano de Instalación de Software Libre, con el lema "Tu crees que eres libre si tu software no lo es"&lt;br /&gt;que se realizara en varias ciudades de la República de Panamá, a la cual eres invitado a participar, este evento se realizara el día 25 de Abril&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-8917080082195137327?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 13 Apr 2009 14:35:15 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Sistema de Actualizacion usando FTP solamente</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-2680475816469564159</guid>
      <link>http://avbravo.blogspot.com/2009/04/sistema-de-actualizacion-usando-ftp.html</link>
      <description>Hay muchas formas de actualizar nuestro proyecto Desktop, Java Web Start es una gran alternativa. Miremos otra situación, tal vez nuestros clientes poseen una conexión de Internet limita a un ancho de banda muy pequeño o con cualquier otra limitación como inconsistencia en el mismo.&lt;br /&gt;Si la situación es esta , desarrollar una aplicación Web no es factible, y queremos implementar una alternativa a Java Web Start, si esta es nuestra decisión, podemos desarrollar una aplicación
      Desktop, donde dividimos nuestro proyecto en pequeños módulos o sub-proyectos, que seran integrados en el proyecto principal, y a cada modulo crearemos una clase que contendrá la versión del módulo, con un formato sencillo: año.mes.dia.horaminutos, luego crearemos una clase que generara un archivo xml con la información del numero de versión de todos los módulos y este archivo junto con los módulos que sufran cambios serán subidos por el desarrollador al servidor ftp. En el cliente al iniciar el
      sistema simplemente descarga el archivo .xml que contiene las versiones de los modulos en el servidor ftp, y los compara con las versiones de los módulos local mente, y si hay cambios solo se descargaran aquellos que han cambiado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Desarrollador: Generar archivo xml de versiones&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/Sd1PbIawQLI/AAAAAAAAB-M/21nwNfUmkdg/s320/generar.png" /&gt;&lt;br /&gt;&lt;br /&gt;Generando la versión de cada
      módulo en el archivo xml.&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/Sd1PbacNE5I/AAAAAAAAB-U/dBiDb1V9NoU/s320/generarmodulos2.png" /&gt;&lt;br /&gt;&lt;br /&gt;El desarrollador sube el archivo xml&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/Sd1QsTVsR_I/AAAAAAAAB-s/VVpzWbo601Y/s320/ftp1.png" /&gt;&lt;br /&gt;&lt;br /&gt;y los modulos que se han actualizado (archivos .jar)&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://1.bp.blogspot.com/_fWhXbpnpdnc/Sd1QsVgwG-I/AAAAAAAAB-k/wm4T39GZyeg/s320/ftp2.png" /&gt;&lt;br /&gt;&lt;br /&gt;Cuando el usuario entra al sistema&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/Sd1Pa6Z5aAI/AAAAAAAAB98/T-vDu-uJozQ/s320/login.png" /&gt;&lt;br /&gt;Mensaje de Actualización en el menu&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/Sd1PbKiQiWI/AAAAAAAAB-E/joBLjXxxooE/s320/menu.png" /&gt;&lt;br /&gt;&lt;br /&gt;Actualizamos los modulos, el sistema
      nos indica las diversas versiones, locales y web de los modulos que han sido actualizados.&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/Sd1QsDp3rOI/AAAAAAAAB-c/JsoK0GIYyIQ/s320/actualizar.png" /&gt;&lt;br /&gt;Mensaje de terminación de actualización de módulos(descarga de los .jar actualizados).&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/Sd1RkCLbCvI/AAAAAAAAB-0/SF8dkK0LyMc/s320/actualizdo.png" /&gt;&lt;br /&gt;&lt;br /&gt;Esta es solo otra forma de hacerlo, existen
      muchas más, era un simple ejemplo que podemos implementar en nuestros proyectos.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-2680475816469564159?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 09 Apr 2009 01:40:44 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.7 M3 para descarga</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-154956901418753706</guid>
      <link>http://avbravo.blogspot.com/2009/04/netbeans-67-m3-para-descarga.html</link>
      <description>&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SdTCiLdiVKI/AAAAAAAAB90/WxLlj5U62AY/s320/nb6.7m3.png" /&gt;&lt;br /&gt;Ya esta disponible el M3 de NetBeans 6.7, puedes descargarlo desde el siguiente enlace.&lt;br /&gt;&lt;a href="http://bits.netbeans.org/download/6.7/m3/"&gt;http://bits.netbeans.org/download/6.7/m3/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-154956901418753706?l=avbravo.blogspot.com" height="1"
      width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 02 Apr 2009 13:50:42 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Comparativa de Tomcat y GlassFish</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-8270757121983631066</guid>
      <link>http://avbravo.blogspot.com/2009/03/comparativa-de-tomcat-y-glassfish.html</link>
      <description>Sun Inner Circle publica un innforme comparativo entre GlassFish vs Tomcat.&lt;br /&gt;¿GlassFish o Tomcat? ¿Cuál le conviene?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sun.com/emrkt/innercircle/newsletter/0209/feature-itm.html"&gt;http://www.sun.com/emrkt/innercircle/newsletter/0209/feature-itm.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a
      href="http://mx.sun.com/emrkt/innercircle/newsletter/0209/feature-itm.html?cid=e7959f"&gt;http://mx.sun.com/emrkt/innercircle/newsletter/0209/feature-itm.html?cid=e7959f&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-8270757121983631066?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 27 Mar 2009 20:19:03 +0000</pubDate>
    </item>
    <item>
      <title>Héctor: RECASPITAS</title>
      <guid isPermaLink="false">http://my.opera.com/hreyes/blog/3084685</guid>
      <link>http://my.opera.com/hreyes/blog/show.dml/3084685</link>
      <description>Que memoria la mia :doh: sabia que olvidaba algo, no cabe duda que la edad hace estagos :lol: :lol: &lt;br /&gt;&lt;br /&gt;El mes pasado (febrero) &lt;span style="color: darkred;"&gt;&lt;strong&gt;el blog cumplio 3 años&lt;/strong&gt;&lt;/span&gt;!! :no: como pude olvidarlo :no: &lt;br /&gt;&lt;br /&gt;:hat: :drunk: un poco tarde pero siempre es motivo de festejar :drunk: :hat: &lt;br /&gt;&lt;br /&gt;&lt;span class="aligncenter"&gt;&lt;a href="http://my.opera.com/"&gt;&lt;img
      src="http://promote.opera.com/myopera/myopera.jpg" alt="My Opera - Blog and photo community" height="60" width="234" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Aun no se que hace que lo mantenga o no he encontrado una razon para dejarlo.</description>
      <pubDate>Tue, 24 Mar 2009 05:00:21 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: CRUD Application on the NetBeans Platform (Part 1)</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-2058136444122553338</guid>
      <link>http://avbravo.blogspot.com/2009/03/crud-application-on-netbeans-platform.html</link>
      <description>Geertjan Wielenga , presenta este vídeo acerca de &lt;a href="http://netbeans.dzone.com/videos/crud-application-netbeans"&gt;CRUD Application on the NetBeans Platform.&lt;/a&gt;&lt;br /&gt;Es una serie de dos vídeos, en esta primera parte integra una base de datos MySQL en NetBeans Platform utilizando EclipseLink. &lt;br /&gt;&lt;br /&gt;Sin duda no debes perder la oportunidad de verlo.&lt;br /&gt;&lt;br /&gt;Actualización:&lt;br /&gt;&lt;br /&gt;Geertjan, completo el video de la
      creación de la aplicación CRUD on the NetBeans Platform&lt;br /&gt;&lt;a href="http://blogs.sun.com/geertjan/entry/completed_crud_application_on_the"&gt;http://blogs.sun.com/geertjan/entry/completed_crud_application_on_the&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-2058136444122553338?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 21 Mar 2009 19:06:50 +0000</pubDate>
    </item>
    <item>
      <title>Héctor: unable to connect</title>
      <guid isPermaLink="false">http://my.opera.com/hreyes/blog/3046039</guid>
      <link>http://my.opera.com/hreyes/blog/show.dml/3046039</link>
      <description>Me encuentro haciendo un sitio web como proyecto de una materia en la uni, usando PHP, Apache, MySQL y claro GNU/Linux :) .&lt;br /&gt;&lt;br /&gt;El problema es que hago uso de los &lt;a href="http://maps.google.es/" target="_blank"&gt;google maps&lt;/a&gt;, para desarrollar uso netbeans y su modulo para &lt;a href="http://www.netbeans.org/features/php/" target="_blank"&gt;php&lt;/a&gt; ya que permite incluir el servicio de una manera muy facil:&lt;br /&gt;&lt;span
      class="imgcenter"&gt;&lt;img src="http://files.myopera.com/hreyes/blog/google.png" alt="" /&gt;&lt;/span&gt; &lt;br /&gt;Lo malo es que hasta el domingo se mostraba el mapa sin problemas, pero hoy solo muestra:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;fsockopen() [function.fsockopen]: unable to connect to maps.google.com:80 (php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;¿Que opinan?</description>
      <pubDate>Tue, 10 Mar 2009 19:27:50 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: JavaFX e interacción con base de datos</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/?p=314</guid>
      <link>http://cafelojano.wordpress.com/2009/03/07/javafx-e-interaccion-con-base-de-datos/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;Buscando ejemplos de aplicaciones JavaFx, me he encontrado con el siguinte blog &lt;a href="http://jfxstudio.wordpress.com/" target="_blank" title="Blog JavaFX"&gt;JFXStudio&lt;/a&gt;, el mismo que muestra una gran cantidad de ejemplos sobre JavaFx, acompañados de su código fuente.&lt;/p&gt; &lt;p&gt;&lt;a href="http://jfxstudio.wordpress.com/2009/03/03/the-graphic-database-front-end/" target="_blank" title="Ejemplo JavaFX y
      JDBC"&gt;Uno&lt;/a&gt; de los ejemplos que más me ha llamado la atención es uno que trabaja con base de datos. El ejemplo es una evolución de otro, que se detalla &lt;a href="http://java.dzone.com/tips/javafx-and-jdbc" target="_blank" title="Ejemplo JavaFX y JDBC"&gt;aquí&lt;/a&gt;. En la evolución se puede ver una interfaz más desarrollada y enriquecida que la original.&lt;/p&gt; &lt;p&gt;Lo interesante del post original es que detalla el trabajo con base de datos, una de las tareas que son
      necesarias en cualquier tipo de aplicación. En éste ejemplo podemos ver el potencial para la creación de GUI que posee JavaFX y cómo interactuar con bases de datos. Pueden encontrar el código fuente del proyecto de NetBeans.&lt;/p&gt; &lt;p&gt;Un imagen de ejemplo: tomada desde JavaFXStudio&lt;/p&gt; &lt;div style="width: 410px;" class="wp-caption alignleft"&gt;“]&lt;a href="http://jfxstudio.wordpress.com/2009/03/03/the-graphic-database-front-end/"&gt;&lt;img
      src="http://www.javafx.me/crudfx/examples/gderby.jpg" alt="GUI JavaFX y base de datos" height="280" title="Imagén de ejemplo" width="400" /&gt;&lt;/a&gt;&lt;p class="wp-caption-text"&gt;GUI JavaFX y base de datos [Tomada desde: http://jfxstudio.wordpress.com/2009/03/03/the-graphic-database-front-end/&lt;/p&gt;&lt;/div&gt; &lt;p&gt;Espero que les ayude.&lt;/p&gt; &lt;a href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/314/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/314/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/314/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/314/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/314/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/314/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/314/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/314/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/314/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/314/"
      alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=314&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 07 Mar 2009 05:28:36 +0000</pubDate>
    </item>
    <item>
      <title>Bits y Bytes » NetBeans: Métricas de calidad con NetBeans y Hudson</title>
      <guid isPermaLink="false">http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/</guid>
      <link>http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;div&gt; &lt;div&gt; &lt;p style="margin-bottom: .5cm; font-weight: normal; text-align: left;"&gt; &lt;/p&gt;&lt;/div&gt; &lt;p class="western"&gt;Este artículo como &lt;a href="http://ivanator.files.wordpress.com/2009/03/metricas-de-calidad-con-netbeans-y-hudson.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt; &lt;h1 class="western"&gt;Introducción&lt;/h1&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;En
      un post anterior expliqué &lt;a href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/"&gt;cómo montar un entorno de integración continua básico&lt;/a&gt;, que luego completamos para que también se convirtiera en un verdadero &lt;a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"&gt;entorno TDD&lt;/a&gt; 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.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Nótese que he puesto la palabra
      &lt;em&gt;objetiva&lt;/em&gt; 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: &lt;em&gt;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&lt;/em&gt;.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Hechas estas matizaciones, en este artículo vamos a explicar cómo integrar las siguientes herramientas en &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt;
      y &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt; usando &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p style="text-align: justify;" class="western"&gt;&lt;a href="http://checkstyle.sourceforge.net/"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Checkstyle&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: genera informes sobre el grado
      de seguimiento del código a los estándares de codificación establecidos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="text-align: justify;" class="western"&gt;&lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Simian&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: detector de copia de bloques de
      código.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="text-align: justify;" class="western"&gt;&lt;a href="http://pmd.sourceforge.net/"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;PMD&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: analizador de código estático en busca de posibles bugs y malas prácticas.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;li&gt;
      &lt;p style="text-align: justify;" class="western"&gt;&lt;a href="http://findbugs.sourceforge.net/"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;FindBugs&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: similar al anterior.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;El procedimiento
      de instalación de las herramientas va a ser análogo para cada una de ellas:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Instalación del plugin correspondiente en el NetBeans (si lo hubiere) y configuración del mismo.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Instalación de las bibliotecas de la herramienta en la máquina de
      desarrollo.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Modificación del script del Ant para poder lanzar el análisis sin la ayuda del IDE.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal; text-align: justify;" class="western"&gt;Instalación del plugin correspondiente en el Hudson.&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal; text-align:
      justify;" class="western"&gt;Modificación del &lt;em&gt;job&lt;/em&gt; para incluir la generación y publicación de informes correspondientes.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h1 class="western"&gt;Checkstyle&lt;/h1&gt; &lt;p class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;En el mundo Java, Sun proporcionó unas guías de estilo que han sido ampliamente
      adoptadas por la comunidad. En &lt;a href="http://java.sun.com/docs/codeconv/"&gt;este documento&lt;/a&gt; las podéis encontrar junto con los motivos que hay detrás de cada convención.&lt;/p&gt; &lt;p class="western"&gt;&lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt; 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.&lt;/p&gt; &lt;p class="western"&gt;Checkstyle lo tenemos disponible en las tres vertientes: plugin para el NetBeans, como &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del Ant y como plugin del Hudson.&lt;/span&gt;&lt;/p&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Plugin para NetBeans del Checkstyle&lt;/h2&gt; &lt;p
      class="western"&gt;&lt;span style="font-style: normal;"&gt;El plugin no forma parte de los repositorios estándar, así que el primer paso para instalarlo será&lt;/span&gt; &lt;span style="font-style: normal;"&gt;añadir el repositorio correspondiente. Para ello iremos a:&lt;/span&gt; &lt;em&gt;Tools -&gt; Plugins -&gt; Settings -&gt; Add&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y añadiremos la siguiente&lt;/span&gt; &lt;em&gt;url&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;:&lt;/span&gt; &lt;a href="http://www.sickboy.cz/checkstyle/autoupdate/autoupdate.xml"&gt;&lt;span style="font-style: normal;"&gt;http://www.sickboy.cz/checkstyle/autoupdate/autoupdate.xml&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;tal y como se muestra en las siguientes imágenes.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorio-checkstyle.jpg?w=500&amp;amp;h=179"
      style="border: 0 none; text-align: left;" height="179" width="500" alt="" border="0" class="alignnone" /&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/netbeans-repositorios.jpg?w=500&amp;amp;h=331" style="border: 0 none; text-align: left;" height="331" width="500" alt="" border="0" class="alignnone" /&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;A continuación hacemos click en la pestaña
      de&lt;/span&gt; &lt;em&gt;Available Plugins&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y seleccionamos&lt;/span&gt; &lt;em&gt;Checkstyle Beans Library&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y&lt;/span&gt; &lt;em&gt;Checkstyle Beans Plugin&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y los instalamos (seguimos los pasos indicados por el asistente y cuando nos pregunte si queremos instalar plugins no firmados le decimos que sí)&lt;/span&gt; &lt;em&gt;.&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;Ahora sólo resta reiniciar el NetBeans para que cargue el plugin.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/netbeans-plugins-disponibles.jpg?w=500&amp;amp;h=330" style="text-align: left;" height="330" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/netbeans-editor-checkstyle.jpg?w=500&amp;amp;h=294" style="text-align: left;" height="294" width="500"
      alt="" border="0" /&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Como decía, se pueden utilizar plantillas con convenciones personalizadas. Para ello deberemos editar la configuración por defecto que se encuentra en:&lt;/span&gt; &lt;em&gt;Tools -&gt; Options -&gt; Miscellaneous -&gt; Checkstyle.&lt;/em&gt;&lt;/p&gt; &lt;p class="western"&gt; &lt;/p&gt;&lt;p class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/02/netbeans-opciones-checkstyle.jpg?w=500&amp;amp;h=370" style="border: 0 none; text-align: left;" height="370" width="500" alt="" border="0" class="alignnone" /&gt;&lt;/p&gt; &lt;h2 class="western"&gt;Incluir Checkstyle en el script de Ant del NetBeans&lt;/h2&gt; &lt;p class="western"&gt;Como ya he explicado en otros artículos, NetBeans realiza todas sus tareas mediante scripts Ant que autogenera y el &lt;em&gt;build.xml&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;que hay en la raíz del proyecto es extensible para que los desarrolladores podamos introducir nuestros propios&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Lo primero que tenemos que hacer es&lt;/span&gt; &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=29721"&gt;&lt;span style="font-style: normal;"&gt;descargarnos la
      distribución del Checkstyle&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;(en el momento de escribir este artículo la versión 5 sigue siendo&lt;/span&gt; &lt;em&gt;beta&lt;/em&gt; &lt;span style="font-style: normal;"&gt;, así que yo me decanto por la versión 4.4) que, entre otras cosas, aporta los&lt;/span&gt; &lt;em&gt;tasks&lt;/em&gt; &lt;span style="font-style: normal;"&gt;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&lt;/span&gt; &lt;em&gt;/srv&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y luego lo enlazaré con un link simbólico para no tener que&lt;/span&gt; &lt;em&gt;hardcodear&lt;/em&gt; &lt;span style="font-style: normal;"&gt;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&lt;/span&gt; &lt;em&gt;jar&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;que contiene la implementación del&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;por el mismo motivo.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;root@hargon:/srv# tar -zxf checkstyle-4.4.tar.gz &lt;span lang="zxx"&gt;root@hargon:/srv# ln -s checkstyle-4.4 checkstyle&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# ls -alh checkstyle&lt;/span&gt; &lt;span lang="zxx"&gt;lrwxrwxrwx 1 root root 14
      2009-02-25 16:24 checkstyle -&gt; checkstyle-4.4&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# rm checkstyle-4.4.tar.gz&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# cd checkstyle&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/checkstyle# ln -s checkstyle-all-4.4.jar checkstyle-all .jar&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El siguiente paso consiste en modificar el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;. Lo primero que vamos a necesitar es importar el&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;tal y como sigue:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;taskdef &lt;span lang="zxx"&gt; resource="checkstyletask.properties"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;classpath="${checkstyle.dir}/checkstyle-all.jar"/&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p
      class="western"&gt;&lt;span style="font-style: normal;"&gt;Puesto que el valor de&lt;/span&gt; &lt;em&gt;checktyle.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;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):&lt;/span&gt;
      &lt;em&gt;nbproject/private/private.properties.&lt;/em&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;checkstyle.dir=/srv/checkstyle&lt;/pre&gt; &lt;p style="font-style: normal;" class="western"&gt;Como yo estoy partiendo del mismo ejemplo del &lt;a href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"&gt;artículo previo&lt;/a&gt; donde explicaba cómo integrar Cobertura, yo ya tengo definido un &lt;em&gt;import&lt;/em&gt; en el
      &lt;em&gt;build.xml&lt;/em&gt; del fichero de propiedades privadas, si no lo tuvierais acordaros de añadirlo.&lt;/p&gt; &lt;pre class="western"&gt;&amp;lt;property file="nbproject/private/private.properties"/&gt;&lt;/pre&gt; &lt;p class="western"&gt;A continuación definimos el &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que construirá los informes en el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;pre
      style="font-style: normal;" class="western"&gt;&amp;lt;target name="checkstyle-report"&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;property&lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;file="nbproject/project.properties"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;mkdir dir="${checkstyle.report.dir}"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;checkstyle
      failOnViolation="false"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;config="${checkstyle.dir}/sun_checks.xml"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;fileset dir="${src.dir}" includes="**/*.java"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;formatter type="xml"&lt;/span&gt;
      &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;toFile="${checkstyle.report.dir}/checks.xml"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;formatter type="plain"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt;toFile="${checkstyle.report.dir}/checks.txt"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;/checkstyle&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;es bastante fácil de entender. En primer lugar construimos el directorio donde se generarán los diferentes
      informes. A continuación lanzamos el&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del Checkstyle indicándole que siga procesando el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;aunque se encuentren fallos de formato (&lt;/span&gt; &lt;em&gt;failOnViolation=”false”&lt;/em&gt; &lt;span style="font-style: normal;"&gt;) y que utilice las convenciones definidas en el fichero&lt;/span&gt; &lt;em&gt;sun_checks.xml&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;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&lt;/span&gt; &lt;a
      href="http://java.sun.com/docs/codeconv/"&gt;&lt;span style="font-style: normal;"&gt;este documento&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;En
      este&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;presuponemos inicializadas las propiedades&lt;/span&gt; &lt;em&gt;checkstyle.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;,&lt;/span&gt; &lt;em&gt;src.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y&lt;/span&gt; &lt;em&gt;checstyle.report.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. 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.&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Las añadiremos como propiedades del proyecto en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/project.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal; font-weight:
      normal;" class="western"&gt;reports.dir=${build.dir}/reports &lt;span lang="zxx"&gt;checkstyle.report.dir=${reports.dir}/checkstyle-report&lt;/span&gt;&lt;/pre&gt; &lt;h2 class="western"&gt;Integrando Checkstyle con Hudson&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Para generar los informes en Hudson nos aprovecharemos del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;target&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;que acabamos de definir en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;build.xml&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;del NetBeans, por tanto el proceso va a ser sencillo:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight:
      normal;" class="western"&gt;añadir el plugin del Checkstyle al Hudson,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;instalar las bibliotecas del Checkstyle en la máquina donde reside el Hudson,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;añadir las propiedades privadas a mano (recordad que este fichero no forma parte del Subversion),&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p
      style="font-style: normal; font-weight: normal;" class="western"&gt;añadir el nuevo target en la construcción del proyecto,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;configurar el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;para que utilice
      el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;target&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;El proceso para instalar el plugin, ya lo hemos visto en el post donde explicaba&lt;/span&gt;&lt;/span&gt; &lt;a
      href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;cómo añadir el plugin de Cobertura&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;. Básicamente, seleccionarlo de la lista de plugins disponibles, instalarlo con el asistente y reiniciar el Hudson.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;
      font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-instalar-checkstyle-plugin.jpg?w=500&amp;amp;h=383" style="text-align: left;" height="383" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;A continuación tenemos que modificar las propiedades privadas para añadir la ruta al Checkstyle. Nos situaremos en el directorio del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y editaremos (o crearemos) el
      fichero&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;para añadir la línea:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal; font-weight: normal;" class="western"&gt;checkstyle.dir=/srv/checkstyle&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight:
      normal;"&gt;Finalmente añadimos&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;checkstyle-report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;a la lista de&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;tagets&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;a construir y configuramos el job para que lea los informes generados
      en&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;xml&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y los publique. Adicionalmente podemos configurar opciones avanzadas como los límites a partir de los cuales el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;build&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;debe
      considerarse inestable o roto.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-checkstyle-en-el-job.jpg?w=500&amp;amp;h=337" style="border: 0 none; text-align: left;" height="337" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;Ahora ya sólo resta ver los informes que genera el Hudson:&lt;/p&gt;
      &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-checkstyle.jpg?w=500&amp;amp;h=437" style="text-align: left;" height="437" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;Simian&lt;/h1&gt; &lt;p class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;&lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;Simian&lt;/a&gt; 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 &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;para Ant y como plugin para el Hudson y por tanto veremos estas configuraciones.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;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).&lt;/p&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Incluir Simian en el script de Ant del NetBeans&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Lo primero es obtener y configurar la herramienta en el entorno de desarrollo, para ello lo&lt;/span&gt; &lt;a
      href="http://www.redhillconsulting.com.au/products/simian/"&gt;&lt;span style="font-style: normal;"&gt;descargamos&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;, lo descomprimimos en&lt;/span&gt; &lt;em&gt;/srv&lt;/em&gt; &lt;span style="font-style: normal;"&gt;/ (id con cuidado porque el paquete no contiene un directorio raíz) y creamos el enlace simbólico correspondiente.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;root@hargon:/srv# mkdir
      simian-2.2.24 &lt;span lang="zxx"&gt;root@hargon:/srv# cd simian-2.2.24&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian-2.2.24# mv ../simian-2.2.24.tar.gz .&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian-2.2.24# tar -zxf simian-2.2.24.tar.gz&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian-2.2.24# rm simian-2.2.24.tar.gz&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian# cd bin/&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian/bin# ln -s
      simian-2.2.24.jar simian.jar&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/simian-2.2.24# cd ../..&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# ln -s simian-2.2.24 simian&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;A continuación configuramos el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de manera análoga al Checkstyle:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;"
      class="western"&gt;&amp;lt;taskdef &lt;span lang="zxx"&gt; resource="simiantask.properties"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;classpath="${simian.dir}/bin/simian.jar"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;target name="simian-report"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;property&lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;file="nbproject/project.properties"/&gt;&lt;/span&gt;
      &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;mkdir dir="${simian.report.dir}" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;simian&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt;&amp;lt;fileset dir="${src.dir}" includes="**/*.java"/&gt;&lt;/span&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;
      &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;formatter type="xml"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;toFile="${simian.report.dir}/simian.xml"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;formatter type="plain"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;toFile="${simian.report.dir}/simian.txt"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;/simian&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Las propiedades las definiremos allí donde toca: el&lt;/span&gt; &lt;em&gt;simian.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(con valor&lt;/span&gt;
      &lt;em&gt;/srv/simian&lt;/em&gt; &lt;span style="font-style: normal;"&gt;) en el&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;simian.report.dir&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;(con
      valor&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;${reports.dir}/simian-report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;) en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/project.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p
      class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;El&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;task&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 class="western"&gt;Integrando Simian con Hudson&lt;/h2&gt; &lt;p class="western"&gt;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 &lt;em&gt;simian.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;en el&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;El siguiente paso debería consistir en instalar el plugin del Simian para el Hudson, pero cuando lo&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight:
      normal;"&gt;buscamos en la lista de plugins disponibles nos damos cuenta que no aparece. Afortunadamente existe un plugin llamado&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Violations&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;. Como siempre, añadiremos el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;simian-report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;a la lista de&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;targets&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;build&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-configurar-simian-en-el-job.jpg?w=500&amp;amp;h=390" style="text-align: left;" height="390" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;Tras construir el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;podremos ver los informes de replicación de código de manera integrada en el Hudson.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-1.jpg?w=500&amp;amp;h=436" style="text-align: left;" height="436" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-informes-simian-2.jpg?w=500&amp;amp;h=436" style="text-align: left;" height="436" width="500"
      alt="" border="0" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;PMD&lt;/h1&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;Tanto &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt; como &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt;, 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:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p style="font-style:
      normal; font-weight: normal;" class="western"&gt;posibles bugs,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;código “muerto” (variables no accedidas, bloques de ejecución inalcanzables, etc.),&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;código subóptimo,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;bloques con una
      estructura poco legible o más complicada de lo necesario.&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Estas herramientas son especialmente útiles integradas en el IDE porque de esta manera el&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;programador puede ir viendo mientras escribe el código las posibles alertas. Obviamente también
      tienen&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;tasks&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;de Ant lo que permite integrarlas fácilmente en Hudson para obtener los informes correspondientes.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 class="western"&gt;Plugin para NetBeans del PMD&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;En
      este caso el plugin del PMD no está accesible mediante un repositorio, por lo que para instalarlo procederemos a la&lt;/span&gt;&lt;/span&gt; &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=56262&amp;amp;package_id=63621"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;descarga del mismo&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y a su instalación
      local.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Una vez tenemos el fichero, deberemos descomprimirlo y nos quedamos con el plugin empaquetado en el fichero&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;pmd.nbm&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;que instalaremos a través la
      pestaña&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Downloaded&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;del gestor de plugins: primero lo añadimos a la lista mediante el botón&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Add Plugins&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y después le damos
      a&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Install&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugins-downloaded-pmd.jpg?w=500&amp;amp;h=326"
      style="text-align: left;" height="326" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;Aceptamos la licencia, asumimos el riesgo de instalar un plugin “no firmado” y rebotamos el IDE para que se reflejen los cambios.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-warning1.jpg?w=375&amp;amp;h=229" style="text-align: left;" height="229" width="375" alt="" border="0" /&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;tooltip&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-en-accion.jpg" style="text-align: left;" border="0" alt="" width="75%" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Si queremos obtener un informe de todos los posibles problemas en una carpeta de código, paquete o clase, sobre la ventana&lt;/span&gt;&lt;/span&gt;
      &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Projects&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;hacemos&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;click derecho en el elemento correspondiente -&gt; Tools -&gt; Run PMD.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt; &lt;p style="font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-weight: normal;" class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-generar-informe.jpg" style="text-align: left;" height="360" width="455" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-informe.jpg" style="text-align: left;" height="170" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;equals&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;mostrado en el ejemplo unas líneas más arriba) producen advertencias que podríamos ignorar con tranquilidad ya que NetBeans&lt;/span&gt;
      &lt;em&gt;&lt;span style="font-weight: normal;"&gt;sabe lo que hace&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;. Para modificar la configuración del plugin y el tipo de reglas que aplicar, nos vamos al menú de opciones:&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Tools -&gt; Options -&gt; Miscellaneous.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt; &lt;p style="font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-weight: normal;"
      class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-configuracion.jpg" style="text-align: left;" height="257" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;&lt;span style="font-weight: normal;"&gt;Las reglas se gestionan mediante&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;rulesets&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;temáticos. Es decir un&lt;/span&gt;
      &lt;em&gt;&lt;span style="font-weight: normal;"&gt;ruleset&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;puede contener todas aquellas reglas (&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;rules)&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;que tengan que ver, por ejemplo, con código muerto. Mediante el menú de&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;rulesets&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight:
      normal;"&gt;podemos incluir o no las incluidas con PMD y añadir otras propias generadas por nosotros o por terceros. En el menú&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Manage rules&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;se nos permite la activación o desactivación de reglas individuales.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;"
      class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/netbeans-plugin-pmd-rule-editor.jpg" style="text-align: left;" border="0" alt="" width="75%" /&gt;&lt;/p&gt; &lt;h2 class="western"&gt;Incluir PMD en el script del Ant de NetBeans&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-weight: normal;"&gt;De manera análoga a las herramientas anteriores,&lt;/span&gt; &lt;a href="http://downloads.sourceforge.net/pmd/pmd-bin-4.2.5.zip?use_mirror=dfn"&gt;&lt;span
      style="font-weight: normal;"&gt;descargamos&lt;/span&gt;&lt;/a&gt; &lt;span style="font-weight: normal;"&gt;e instalamos la herramienta en&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;/srv&lt;/span&gt;&lt;/em&gt; &lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-weight: normal;" class="western"&gt;root@hargon:/srv# unzip -q pmd-bin-4.2.5.zip &lt;span lang="zxx"&gt;root@hargon:/srv# ln -s pmd-4.2.5/ pmd&lt;/span&gt; &lt;span
      lang="zxx"&gt;root@hargon:/srv# rm pmd-bin-4.2.5.zip&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# cd pmd/lib/&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv/pmd/lib# ln -s pmd-4.2.5.jar pmd.jar&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;A continuación modificaros el &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de manera adecuada.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;taskdef name="pmd" &lt;span
      lang="zxx"&gt; classname="net.sourceforge.pmd.ant.PMDTask"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;classpath="${pmd.dir}/lib/pmd.jar"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;target name="pmd-report"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;property &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;file="nbproject/project.properties"/&gt;&lt;/span&gt;
      &lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt;&amp;lt;mkdir dir="${pmd.report.dir}" /&gt;&lt;/span&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;pmd shortFilenames="true"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt;&amp;lt;ruleset&gt;unusedcode,basic,design,controversial&amp;lt;/ruleset&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt;&amp;lt;formatter type="xml" &lt;/span&gt;&lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&lt;span style="font-style:
      normal;"&gt;toFile="${pmd.report.dir}/pmd.xml"&lt;/span&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;linkPrefix="http://pmd.sourceforge.net/xref/" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;formatter type="html" &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;toFile="${pmd.report.dir}/pmd.html"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;linkPrefix="http://pmd.sourceforge.net/xref/" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;fileset dir="${src.dir}"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;include name="**/*.java"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;/fileset&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;/pmd&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Las
      propiedades las añadimos al fichero correspondiente: el&lt;/span&gt; &lt;em&gt;pmd.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(con valor&lt;/span&gt; &lt;em&gt;/srv/pmd&lt;/em&gt; &lt;span style="font-style: normal;"&gt;) en el&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span
      style="font-weight: normal;"&gt;pmd.report.dir&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;(con valor&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;${reports.dir}/pmd-report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;) en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;nbproject/project.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del PMD&lt;/span&gt; &lt;span style="font-style: normal;"&gt;es sencillo de utilizar. Primeramente indicamos qué&lt;/span&gt; &lt;em&gt;rulesets&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;de los estándar queremos analizar (podríamos también especificar&lt;/span&gt; &lt;em&gt;rulesets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;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.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;
      &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/pmd-html-report2.jpg" style="text-align: left;" height="357" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;h2 class="western"&gt;Integrando PMD con Hudson&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Al igual que las dos herramientas anteriores, instalamos PMD en el servidor de
      integración y definimos la propiedad&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;pmd.dir&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p
      class="western"&gt;&lt;a name="DDE_LINK7" id="DDE_LINK7"&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;tal y como se
      muestra en la siguiente captura. Obviamente podemos establecer los límites que por defecto, como casi siempre, están desactivados.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-pmd-en-el-job.jpg" style="text-align: left;" height="223" width="499" alt="" border="0" /&gt;&lt;/p&gt;
      &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;Y estos serían los informes generados.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-1.jpg" style="text-align: left;" height="404" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;"
      class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-pmd-21.jpg" style="text-align: left;" height="464" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;FindBugs&lt;/h1&gt; &lt;p class="western"&gt;Sin entrar en demasiados detalles, &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; 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 &lt;a href="http://kenai.com/projects/sqe/forums/forum/topics/377-findbugs-plugin-for-netbeans-6-5"&gt;están trabajando en ello&lt;/a&gt; y me imagino que estará disponible en breve (sí que existen versiones funcionales para otros IDEs).&lt;/p&gt; &lt;h2 class="western"&gt;Incluir FindBugs en el plugin de Ant de NetBeans&lt;/h2&gt; &lt;p class="western"&gt;Procedemos a
      &lt;a href="http://findbugs.sourceforge.net/downloads.html"&gt;descargar&lt;/a&gt; el paquete para instalarlo de la manera habitual.&lt;/p&gt; &lt;pre class="western"&gt;root@hargon:/srv# tar -zxf findbugs-1.3.7.tar.gz &lt;span lang="zxx"&gt;root@hargon:/srv# ln -s findbugs-1.3.7 findbugs&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# ls -alh findbugs&lt;/span&gt; &lt;span lang="zxx"&gt;lrwxrwxrwx 1 root root 14 2009-03-05 15:55 findbugs -&gt; findbugs-1.3.7&lt;/span&gt;&lt;/pre&gt; &lt;p
      class="western"&gt;A continuación modificamos el &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;para añadir un&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que use el&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del NetBeans.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;taskdef name="findbugs" &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&lt;span
      style="font-style: normal;"&gt;classname="edu.umd.cs.findbugs.anttask.FindBugsTask"&lt;/span&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;classpath="${findbugs.dir}/lib/findbugs.jar" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;target name="findbugs-report" depends="compile"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;property file="nbproject/project.properties"/&gt;&lt;/span&gt;
      &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;mkdir dir="${findbugs.report.dir}"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;findbugs home="${findbugs.dir}" &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;output="xml"&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span
      lang="zxx"&gt;outputFile="${findbugs.report.dir}/findbugs.xml"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;sourcePath path="${src.dir}" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt; &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;class location="${build.classes.dir}" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;
      &lt;/span&gt;&lt;span lang="zxx"&gt;&amp;lt;/findbugs&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Como en los casos anteriores, añadimos las propiedades a los ficheros correspondientes: el&lt;/span&gt; &lt;em&gt;findbugs.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(con valor&lt;/span&gt; &lt;em&gt;/srv/findbugs&lt;/em&gt; &lt;span style="font-style: normal;"&gt;) en el&lt;/span&gt;
      &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;findbugs.report.dir&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;(con valor&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;${reports.dir}/findbugs-report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;) en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/project.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El&lt;/span&gt;
      &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del FindBugs requiere no sólo el código fuente sino también las clases compiladas y por ello el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;tiene una dependencia del&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;estándar de NetBeans&lt;/span&gt; &lt;em&gt;compile&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Las clases compiladas se referencian mediante una
      propiedad también estándar de NetBeans:&lt;/span&gt; &lt;em&gt;build.classes.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt;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.&lt;/p&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Integrando FindBugs con Hudson&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Como siempre, replicamos la instalación del FindBugs en la máquina donde está instalado el Hudson y definimos la propiedad&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;findbugs.dir&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;apuntando al directorio correspondiente en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;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&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;target&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y las opciones de FindBugs.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;
      font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/hudson-configurar-findbugs-en-el-job.jpg" style="text-align: left;" border="0" alt="" width="75%" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;Finalmente ya podemos ver los informes generados.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img
      src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-1.jpg" style="text-align: left;" height="414" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/03/hudson-informes-findbugs-2.jpg" style="text-align: left;" height="458" width="500" alt="" border="0" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;Conclusión&lt;/h1&gt; &lt;p style="font-style: normal;
      font-weight: normal;" class="western"&gt;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.&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Hemos visto que las herramientas suelen venir en tres “sabores”: como plugin para el IDE que dan un feedback
      inmediato al programador, como&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;task&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;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.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight:
      normal;" class="western"&gt;Existen muchas más herramientas de calidad. En próximos artículos tocaré algunas mas.&lt;/p&gt; &lt;/div&gt; Tagged: Agile, Ant, calidad, Hudson, Java, NetBeans &lt;a href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/297/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/297/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/297/"
      rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/297/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/297/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/297/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/297/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/297/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/297/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/297/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;amp;blog=6092394&amp;amp;post=297&amp;amp;subd=ivanator&amp;amp;ref=&amp;amp;feed=1" alt="" border="0"
      /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 05 Mar 2009 18:21:41 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans Community Docs 300</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-6205939109696455874</guid>
      <link>http://avbravo.blogspot.com/2009/03/netbeans-community-docs-300.html</link>
      <description>&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/Savw7cNsrtI/AAAAAAAAB9s/Xg2H-KS2D5c/s320/community.png" /&gt;&lt;br /&gt;La participación de la comunidad cada vez es más influyente, ya llegamos a los 300 documentos en el &lt;a href="http://wiki.netbeans.org/CommunityDocs"&gt;NetBeans Community Docs&lt;/a&gt;&lt;br /&gt;Todos son invitados a colaborar aportando sus documentos y compartiendo sus conocimientos con los demas miembros de la comunidad.&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-6205939109696455874?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 02 Mar 2009 14:47:00 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Integrando Gtalk en una aplicacion Desktop</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-2451114806261662210</guid>
      <link>http://avbravo.blogspot.com/2009/02/integrando-gtalk-en-una-aplicacion.html</link>
      <description>&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/Sac584p-VVI/AAAAAAAAB9k/dBRjgxoQJp0/s320/chat1.png" /&gt;&lt;br /&gt;Luego de varias semanas sin escribir en mi blog, ya que estado super ocupado con unos proyectos, escribo nuevamente para colocar un ejemplo bastante simple de como integrar un chat para Gtalk en nuestras aplicaciones Desktop.&lt;br /&gt;&lt;br /&gt;El codigo lo puedes encontrar en el wiki del Community Docs, en este&lt;a
      href="http://wiki.netbeans.org/TaT_AvbravoGtalk"&gt; enlace&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Su funcionamiento es muy simple, el cliente tiene una cuenta en Gmail, y simplemente al entrar automaticamente se configura para enviar mensajes a mi cuenta avbravo@gmail.com, de esta manera, establezco comunicación con el cliente sin que el tenga que salir de su aplicacion Desktop.&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/11140295-2451114806261662210?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 27 Feb 2009 00:59:00 +0000</pubDate>
    </item>
    <item>
      <title>Bits y Bytes » NetBeans: Cobertura con NetBeans y Hudson</title>
      <guid isPermaLink="false">http://ivanator.wordpress.com/?p=142</guid>
      <link>http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;div&gt; &lt;p style="text-align: justify;" class="western"&gt;Este artículo como &lt;a href="http://ivanator.files.wordpress.com/2009/02/cobertura-con-netbeans-y-hudson.pdf"&gt;PDF&lt;/a&gt;.&lt;/p&gt; &lt;h1 style="text-align: justify;" class="western"&gt;Introducción&lt;/h1&gt; &lt;p style="text-align: justify;" class="western"&gt;Una vez tenemos montado un &lt;a
      href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/"&gt;entorno TDD,&lt;/a&gt; y si efectivamente estamos trabajando con esta orientación, nuestro proyecto empezará a acumular tests unitarios con &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; o cualquier otro framework lo que permitirá a nuestro servidor de integración (Hudson) utilizarlos como &lt;a href="http://en.wikipedia.org/wiki/Regression_testing"&gt;tests de
      regresión&lt;/a&gt;.&lt;/p&gt; &lt;p class="western"&gt;Si estamos siendo estrictos en la aplicación de una &lt;a href="http://es.wikipedia.org/wiki/Desarrollo_guiado_por_pruebas"&gt;metodología TDD&lt;/a&gt;, en principio el grado de cobertura del código (el porcentaje de líneas de código que son evaluadas por un test) debería estar cerca del 100% por aquello del &lt;a href="http://www.ibm.com/developerworks/java/library/j-xp042203/"&gt;“ escribe primero el test y luego el código que lo
      supera”&lt;/a&gt;. Sin embargo bien porque seamos principiantes aplicando la metodología o bien porque escribamos los tests como parte del proceso de calidad en una metodología diferente, puede resultar muy complicado calcular el grado de cobertura mediante técnicas manuales. Incluso en un entorno TDD maduro, la propia complejidad del software puede complicar extraer esta información. Es por ello que se han desarrollado una serie de frameworks y herramientas que permiten automatizar este
      proceso.&lt;/p&gt; &lt;p class="western"&gt;Como decía, no estamos solos ante el peligro y tenemos herramientas diversas y con todo tipo de licencias. Por citar algunas: &lt;a href="http://www.atlassian.com/software/clover/"&gt;Clover&lt;/a&gt;, &lt;a href="http://emma.sourceforge.net/"&gt;EMMA&lt;/a&gt;, &lt;a href="http://www.vectorcast.com/"&gt;VectorCAST&lt;/a&gt; o &lt;a href="http://cobertura.sourceforge.net/"&gt;Cobertura&lt;/a&gt;. Mi elección en este caso será la última por varios motivos:
      es un producto open source (por los que tengo debilidad, especialmente cuando uno es autónomo), ofrece &lt;em&gt;tasks&lt;/em&gt; &lt;span style="font-style: normal;"&gt;para usarlo desde Ant y tiene plugins para Hudson. Es una lástima que no tenga un plugin nativo para NetBeans, aunque como el IDE nos permite ejecutar&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de Ant fácilmente, se lo podemos perdonar.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span
      style="font-style: normal;"&gt;Por cierto, existe un&lt;/span&gt; &lt;a href="http://codecoverage.netbeans.org/"&gt;&lt;span style="font-style: normal;"&gt;plugin&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;de análisis de cobertura de código para NetBeans. No he jugado mucho con él, pero parece que es un servicio que sólo puede activarse para proyectos de JSE y no está disponible, por ejemplo, para un proyecto web. Si alguien tiene experiencia con el mismo, se agradecerá el
      feedback.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Gran parte de la información necesaria que he usado para escribir esta entrada la he obtenido de&lt;/span&gt; &lt;a href="http://weblogs.java.net/blog/fabriziogiudici/archive/2007/02/automating_test.html"&gt;&lt;span style="font-style: normal;"&gt;este post&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;h1 class="western"&gt;Configurar Cobertura en el
      NetBeans&lt;/h1&gt; &lt;p class="western"&gt;El proceso es sencillo:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p style="margin-bottom: 0;" class="western"&gt;descargar el software,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="margin-bottom: 0;" class="western"&gt;instalarlo,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p class="western"&gt;modificar el &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del NetBeans.&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;p class="western"&gt;Así
      pues, lo primero que tenemos que hacer es &lt;a href="http://cobertura.sourceforge.net/download.html"&gt;descargarnos&lt;/a&gt; el software desde SourceForge. Nosotros vamos a contentarnos con la versión binaria y dejaremos el hacking para otro momento. A continuación procederemos a la instalación que no es más que descomprimirlo en una carpeta de la máquina de desarrollo. Yo tengo la costumbre de instalar estas cosas en el directorio &lt;em&gt;/srv&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;y además suelo crear un&lt;/span&gt; &lt;em&gt;&lt;span style="font-style: normal;"&gt;enlace simbólico&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(que será el que referencie desde los proyectos) que no incluya el número de versión para que cada vez que haga una actualización no tenga que recorrer todos los scripts para corregir la referencia.&lt;/span&gt;&lt;/p&gt; &lt;pre class="western"&gt;root@hargon:/srv# tar -zxf cobertura-1.9.1-bin.tar.gz &lt;span
      lang="zxx"&gt;root@hargon:/srv# ln -s cobertura-1.9.1 cobertura&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# ls -alh &lt;/span&gt;&lt;span lang="zxx"&gt;total 684K&lt;/span&gt; &lt;span lang="zxx"&gt;drwxr-xr-x 7 root root 4,0K 2009-02-07 13:42 .&lt;/span&gt; &lt;span lang="zxx"&gt;drwxr-xr-x 21 root root 4,0K 2009-02-07 11:23 ..&lt;/span&gt; &lt;span lang="zxx"&gt;lrwxrwxrwx 1 root root 15 2009-02-07 13:42 cobertura -&gt; cobertura-1.9.1&lt;/span&gt; &lt;span lang="zxx"&gt;drwxr-xr-x 4 root
      root 4,0K 2009-02-04 21:23 cobertura-1.9.1&lt;/span&gt; &lt;span lang="zxx"&gt;-rw-r--r-- 1 root root 649K 2009-02-04 21:40 cobertura-1.9.1-bin.tar.gz&lt;/span&gt; &lt;span lang="zxx"&gt;root@hargon:/srv# rm cobertura-1.9.1-bin.tar.gz&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Como&lt;/span&gt; &lt;a href="http://ivanator.wordpress.com/2009/02/06/pasar-propiedades-de-sistema-a-los-tasks-junit-de-los-scripts-de-netbeans/"&gt;&lt;span style="font-style:
      normal;"&gt;ya he explicado&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;en alguna ocasión, NetBeans usa scripts de Ant para realizar todas sus tareas y están modularizados de manera que podamos introducir nuestros propios&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y personalizaciones. En particular el fichero que podemos “tocar” tranquilamente es el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que está en
      la raíz del proyecto así que, mientras no diga lo contrario, todos los fragmentos de código deberán picarse en este fichero.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Lo primero que tendremos que hacer proporcionar a Ant los diferentes&lt;/span&gt; &lt;em&gt;tasks&lt;/em&gt; &lt;span style="font-style: normal;"&gt;proporcionados por Cobertura.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;path
      id="cobertura.classpath"&gt; &lt;span lang="zxx"&gt;&amp;lt;fileset dir="${cobertura.dir}"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;include name="cobertura.jar" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;include name="lib/**/*.jar" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/fileset&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/path&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;taskdef classpathref="cobertura.classpath" &lt;/span&gt; &lt;span
      lang="zxx"&gt;resource="tasks.properties" /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Esto es uso estándar de Ant. La ruta a la raíz del frameworks lo indicamos en la propiedad&lt;/span&gt; &lt;em&gt;cobertura.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que a su vez cargamos del fichero de propiedades privadas. Usamos el fichero de propiedades privadas&lt;/span&gt; &lt;em&gt;(nbproject/private/private.properties)&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;porque la ruta del framework tiene sentido que pueda ser diferente en las máquinas de desarrollo y en el servidor de integración y, recordemos, si tenemos bien montado el repositorio de código el directorio&lt;/span&gt; &lt;em&gt;nbproject/private&lt;/em&gt; &lt;span style="font-style: normal;"&gt;no suele incluirse en el mismo. Para que todo esto funcione deberemos cargar desde el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;directamente dicho fichero de propiedades:&lt;/span&gt;&lt;/p&gt; &lt;pre class="western"&gt;&lt;span style="font-style: normal;"&gt;&amp;lt;property file="&lt;/span&gt;&lt;span style="font-style: normal;"&gt;nbproject/private/private.properties&lt;/span&gt;&lt;span style="font-style: normal;"&gt;"/&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;y efectivamente añadir la propiedad en&lt;/span&gt;
      &lt;em&gt;nbproject/private/private.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;cobertura.dir=/srv/cobertura&lt;/pre&gt; &lt;p style="font-style: normal;" class="western"&gt;Los pasos para usar Cobertura son los siguientes:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p style="font-style: normal;" class="western"&gt;instrumentalizar el código bajo testing,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style:
      normal;" class="western"&gt;ejecutar los tests unitarios con JUnit que genera los datos de cobertura y&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal;" class="western"&gt;parsear los datos de cobertura para generar informes.&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Instrumentalizar el código&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Cobertura (y la mayoría de de frameworks de este tipo) funciona de
      manera que al ejecutar los tests unitarios se analiza qué parte de las clases bajo testing están siendo accedidas por las pruebas y qué partes no y se vuelca esta información en un archivo. Para que el framework de testing (en nuestro caso JUnit) pueda obtener esta información, Cobertura habrá tenido que instrumentalizar previamente las clases bajo test. Es decir, antes de ejecutar los tests, habremos tenido que permitir a Cobertura que genere un&lt;/span&gt; &lt;em&gt;bytecode&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;modificado (instrumentalizado) para cada una de las clases bajo testing. Es un proceso similar a como funcionan algunos&lt;/span&gt; &lt;em&gt;profilers&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Para obtener las clases instrumentalizadas lo haremos de la siguiente manera:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;target name="cobertura-instrument" depends="compile"&gt; &lt;span
      lang="zxx"&gt;&amp;lt;cobertura-instrument &lt;/span&gt; &lt;span lang="zxx"&gt;todir="${cobertura.classes.dir}"&lt;/span&gt; &lt;span lang="zxx"&gt;datafile="${cobertura.ser.file}" &gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;fileset dir="${build.classes.dir}"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;include name="**/*.class"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/fileset&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/cobertura-instrument&gt;&lt;/span&gt; &lt;span
      lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Creo que el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;se entiende bastante fácilmente: básicamente estamos especificando donde guardaremos las las clases instrumentalizadas (&lt;/span&gt; &lt;em&gt;cobertura.classes.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;), en qué fichero se escribirán los datos de cobertura (&lt;/span&gt;
      &lt;em&gt;cobertura.ser.file&lt;/em&gt; &lt;span style="font-style: normal;"&gt;) y dónde residen las clases a instrumentalizar (&lt;/span&gt; &lt;em&gt;build.classes.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;). Esta última propiedad es una de las propiedades estándar que residen en el&lt;/span&gt; &lt;em&gt;nbproject/properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;; las otras dos deberemos introducirlas en dicho fichero.&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style:
      normal;" class="western"&gt;cobertura.ser.file=${build.dir}/cobertura.ser &lt;span lang="zxx"&gt;cobertura.classes.dir=${build.dir}/cobertura/classes&lt;/span&gt;&lt;/pre&gt; &lt;p style="margin-bottom: 0; font-style: normal;" class="western"&gt; &lt;/p&gt;&lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Como nuestro&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;requiere los bytecode de las clases a instrumentalizar tiene como dependencia
      el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;estándar&lt;/span&gt; &lt;em&gt;compile&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que es el que usa NetBeans para compilar el proyecto. Entre las dependencias del propio&lt;/span&gt; &lt;em&gt;compile&lt;/em&gt; &lt;span style="font-style: normal;"&gt;se encuentra el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;em&gt;init&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que, entre otras cosas, es el
      encargado de cargar el fichero de propiedades (y por eso nosotros no tenemos que hacer de manera explícita la carga del mismo).&lt;/span&gt;&lt;/p&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Ejecutar los tests&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El siguiente paso consiste en ejecutar los tests sobre las clases instrumentalizadas para así extraer la información de cobertura. Aquí también podemos aprovecharnos de los scripts generados por NetBeans.
      Nuestro nuevo&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;, que llamaremos&lt;/span&gt; &lt;em&gt;test-cobertura&lt;/em&gt; &lt;span style="font-style: normal;"&gt;básicamente será una copia del&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;em&gt;test&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(que es el que normalmente usa NetBeans para ejecutar las diferentes tests unitarios) con pequeñas modificaciones. Esta es la pinta que debería
      tener:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;target name="cobertura-test" &lt;span lang="zxx"&gt;depends="set-cobertura-file, init,compile-test,&lt;/span&gt; &lt;span lang="zxx"&gt;-pre-test-run,cobertura-instrument,&lt;/span&gt; &lt;span lang="zxx"&gt;-do-test-run,test-report,-post-test-run,-test-browse"&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style:
      normal;"&gt;Con respecto al original, hemos añadido dos nuevas dependencias. Por un lado&lt;/span&gt; &lt;em&gt;cobertura-instrument&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que es una referencia al&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;anterior para asegurarnos que existen las clases instrumentalizadas. Por otro lado hemos definido otra dependencia a otro&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que también
      debemos construir y que muestro a continuación:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;&amp;lt;target name="set-cobertura-file" depends="init"&gt; &lt;span lang="zxx"&gt;&amp;lt;property &lt;/span&gt; &lt;span lang="zxx"&gt;name="test-sys-prop.net.sourceforge.cobertura.datafile"&lt;/span&gt; &lt;span lang="zxx"&gt;value="${cobertura.ser.file}"/&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span
      style="font-style: normal;"&gt;Este&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;es necesario para establecer un parámetro de sistema que debemos pasar a todos los tasks de JUnit usados en los diferentes&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de los ficheros de scripting incluidos desde el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(en particular el&lt;/span&gt;
      &lt;em&gt;build-impl.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;). Necesitamos pasar este parámetro para que los&lt;/span&gt; &lt;em&gt;tasks&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del JUnit sepan dónde escribir la información de cobertura mientras ejecuta los tests.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El nombre de la propiedad de sistema a pasar es&lt;/span&gt; &lt;em&gt;net.sourceforge.cobertura.datafile&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;el porqué se pasa el parámetro de sistema en una propiedad con un nombre algo diferente, lo tengo explicado en&lt;/span&gt; &lt;a href="http://ivanator.wordpress.com/2009/02/06/pasar-propiedades-de-sistema-a-los-tasks-junit-de-los-scripts-de-netbeans/"&gt;&lt;span style="font-style: normal;"&gt;este otro post&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;. El valor de la propiedad, como ya hemos visto (pues es un propiedad que ya he necesitado
      en&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;anteriores), está dentro del fichero&lt;/span&gt; &lt;em&gt;nbproject/project.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y por eso nuestro&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;tiene una dependencia del&lt;/span&gt; &lt;em&gt;target init&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que es el que se encargaba de cargar las propiedades definidas en ese
      fichero.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Falta un detalle adicional: especificar al JUnit que ejecute las clases instrumentalizadas y no las generadas directamente en la fase de compilación. Para hacer esto sólo tenemos que introducir unos pequeños cambios en el&lt;/span&gt; &lt;em&gt;classpath&lt;/em&gt; &lt;span style="font-style: normal;"&gt;utilizado por los&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de
      testing lo que implica cambiar la propiedad&lt;/span&gt; &lt;em&gt;run.test.classpath&lt;/em&gt; &lt;span style="font-style: normal;"&gt;definida en el&lt;/span&gt; &lt;em&gt;nbproject/project.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;para que quede así:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;run.test.classpath=\ &lt;span lang="zxx"&gt;${cobertura.dir}/cobertura.jar:\&lt;/span&gt; &lt;span lang="zxx"&gt;${cobertura.classes.dir}:\&lt;/span&gt;
      &lt;span lang="zxx"&gt;${javac.test.classpath}:\&lt;/span&gt; &lt;span lang="zxx"&gt;${build.test.classes.dir}&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Si hemos hecho todo correctamente al ejecutar el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;em&gt;cobertura-test&lt;/em&gt; &lt;span style="font-style: normal;"&gt;deberían ejecutarse los tests unitarios como siempre pero además debería haberse construido el fichero&lt;/span&gt;
      &lt;em&gt;build/cobertura.ser&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que contiene la información de cobertura.&lt;/span&gt;&lt;/p&gt; &lt;h2 style="font-style: normal;" class="western"&gt;Crear los informes de cobertura&lt;/h2&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;El fichero&lt;/span&gt; &lt;em&gt;build/cobertura.ser&lt;/em&gt; &lt;span style="font-style: normal;"&gt;, como decíamos, contiene la información de cobertura pero está en formato binario porque ha
      tenido que generase en tiempo de ejecución de los tests de manera eficiente. Para extraer información legible hay que parsear dicho fichero. Para ello Cobertura nos proporciona el&lt;/span&gt; &lt;em&gt;task cobertura-report&lt;/em&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Este&lt;/span&gt; &lt;em&gt;task&lt;/em&gt; &lt;span style="font-style: normal;"&gt;permite generar los informes en dos formatos:
      en&lt;/span&gt; &lt;em&gt;XML&lt;/em&gt; &lt;span style="font-style: normal;"&gt;o en&lt;/span&gt; &lt;em&gt;HTML&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Nosotros generaremos ambos. El primero lo necesitaremos para pasárselo al plugin correspondiente en el Hudson. El segundo nos proporcionará una vista agradable y legible. Veamos el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que tenemos que definir:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style:
      normal;" class="western"&gt;&amp;lt;target name="cobertura-report" depends="cobertura-test"&gt; &lt;span lang="zxx"&gt;&amp;lt;cobertura-report&lt;/span&gt; &lt;span lang="zxx"&gt;datafile="${cobertura.ser.file}"&lt;/span&gt; &lt;span lang="zxx"&gt;format="xml"&lt;/span&gt; &lt;span lang="zxx"&gt;destdir="${cobertura.report.dir}"&lt;/span&gt; &lt;span lang="zxx"&gt;&lt;span style="font-style: normal;"&gt;srcdir="${src.dir}" /&gt;&lt;/span&gt;&lt;/span&gt; &lt;span
      lang="zxx"&gt;&amp;lt;cobertura-report&lt;/span&gt; &lt;span lang="zxx"&gt;datafile="${cobertura.ser.file}"&lt;/span&gt; &lt;span lang="zxx"&gt;format="html"&lt;/span&gt; &lt;span lang="zxx"&gt;destdir="${cobertura.report.dir}"&lt;/span&gt; &lt;span lang="zxx"&gt;srcdir="${src.dir}" /&gt;&lt;/span&gt; &lt;span lang="zxx"&gt;&amp;lt;/target&gt;&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Creo que aquí no hay mucho que explicar. Defino dónde está el fichero
      que contiene la información de cobertura, dónde quiero generar los informes y el formato de los mismos. Como siempre habremos de definir la propiedad&lt;/span&gt; &lt;em&gt;cobertura.report.dir&lt;/em&gt; &lt;span style="font-style: normal;"&gt;en el&lt;/span&gt; &lt;em&gt;nbproject/project.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;" class="western"&gt;reports.dir=${build.dir}/reports &lt;span
      lang="zxx"&gt;cobertura.report.dir=${reports.dir}/cobertura-report&lt;/span&gt;&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Si ahora ejecutamos este&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;span style="font-style: normal;"&gt;deberían generarse los informes en el directorio especificado. Si le echamos un ojo a los informes de tipo&lt;/span&gt; &lt;em&gt;HTML&lt;/em&gt; &lt;span style="font-style: normal;"&gt;vemos que básicamente ha generado unas páginas al estilo
      de la documentación de las API pero con la información de cobertura. Una manera muy útil e intuitiva de mostrar la información.&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal;" class="western"&gt; &lt;/p&gt;&lt;p style="font-style: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/cobertura-report-main.jpg?w=500&amp;amp;h=354" style="border: 0 none; text-align: left;" height="354" width="500" alt="" border="0" class="alignnone" /&gt;&lt;/p&gt; &lt;p
      style="text-align: center;" class="western"&gt; &lt;/p&gt;&lt;p class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/cobertura-report-class-detail.jpg?w=500&amp;amp;h=660" style="border: 0 none; text-align: left;" height="660" width="500" alt="" border="0" class="alignnone" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;Configurar el Hudson&lt;/h1&gt; &lt;p class="western"&gt;Una vez hemos configurado todo lo anterior, ya tenemos hecho el trabajo duro. La configuración del Hudson,
      afortunadamente, es bastante sencilla. Estos son los pasos:&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p class="western"&gt;instalar Cobertura,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p class="western"&gt;instalar el plugin de Cobertura y&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p class="western"&gt;configurar el &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;:&lt;/span&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p style="font-style: normal;" class="western"&gt;configurar el workspace para indicar
      dónde está Cobertura,&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal;" class="western"&gt;añadir el &lt;em&gt;cobertura-report&lt;/em&gt; en la lista de &lt;em&gt;targets&lt;/em&gt; que tiene que ejecutar el Ant y&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p style="font-style: normal;" class="western"&gt;configurar el directorio donde están los informes en XML&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt; &lt;/li&gt; &lt;/ol&gt; &lt;h2 class="western"&gt;&lt;span style="font-family:
      Albany;"&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Instalar Cobertura&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p class="western"&gt;Para que el Ant lanzado por Hudson al construir el proyecto sea capaz de instanciar los &lt;em&gt;tasks&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del&lt;/span&gt; &lt;span style="font-style: normal;"&gt;Cobertura, éste tendrá que ser instalado en la máquina donde reside Hudson. El proceso de instalación será exactamente análogo al
      que hemos hecho en el entorno de desarrollo: descargar el paquete, descomprimirlo&lt;/span&gt; &lt;span style="font-style: normal;"&gt;en el directorio&lt;/span&gt; &lt;em&gt;/srv&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y establecer un enlace simbólico.&lt;/span&gt;&lt;/p&gt; &lt;h2 class="western"&gt;&lt;span style="font-family: Albany;"&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Instalar el plugin&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt; &lt;p
      class="western"&gt;Una vez tenemos Hudson instalado, añadir plugins es trivial. Desde la interfaz web vamos a &lt;em&gt;&lt;strong&gt;Hudson -&gt; Manage Hudson -&gt; Manage Plugins -&gt; Available&lt;/strong&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y entonces seleccionamos&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Hudson Cobertura plugin&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;y le damos a&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;. El asistente entonces instala el plugin tras los cual habrá que reiniciar Hudson.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2 class="western"&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Configurar
      el&lt;/span&gt;&lt;em&gt;job&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt; &lt;p class="western"&gt;Aquí estamos presuponiendo que ya existe un &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;previo correctamente configurado y al que simplemente vamos a añadir el soporte de cobertura. Si no fuera así, echadle un ojo a este&lt;/span&gt; &lt;a href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/"&gt;&lt;span style="font-style:
      normal;"&gt;otro post&lt;/span&gt;&lt;/a&gt; &lt;span style="font-style: normal;"&gt;que ya publiqué en su momento.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Lo primero que haremos es configurar el&lt;/span&gt; &lt;em&gt;workspace&lt;/em&gt; &lt;span style="font-style: normal;"&gt;para que sea capaz de encontrar Cobertura durante la fase de construcción del proyecto. Para ello, nos vamos al directorio&lt;/span&gt;
      &lt;em&gt;nbproject/private/private.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;del&lt;/span&gt; &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;correspondiente y añadimos la propiedad que indica dicha ruta:&lt;/span&gt;&lt;/p&gt; &lt;pre class="western"&gt;cobertura.dir=/srv/cobertura&lt;/pre&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;A continuación modificaremos los&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;de Ant que usa Hudson para construir el&lt;/span&gt; &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Si tuviéramos el&lt;/span&gt; &lt;em&gt;target&lt;/em&gt; &lt;em&gt;test&lt;/em&gt; &lt;span style="font-style: normal;"&gt;lo eliminaríamos y a continuación añadiremos el&lt;/span&gt; &lt;em&gt;target cobertura-report&lt;/em&gt; &lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-style: normal;"&gt;Lo siguiente
      es configurar el plugin para que utilice el informe&lt;/span&gt; &lt;em&gt;XML&lt;/em&gt; &lt;span style="font-style: normal;"&gt;generado:&lt;/span&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p class="western"&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Publish Cobertura Coverage Report&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: activamos la opción para que Hudson muestre la información de
      cobertura.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p style="text-align: left;" class="western"&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Cobertura xml report pattern&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: build/reports/cobertura-report/coverage.xml&lt;br /&gt; Aquí ponemos la ruta al fichero donde hemos generado el informe en formato XML.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
      &lt;li&gt; &lt;p style="text-align: left;" class="western"&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Coverage Metric Targets&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: este apartado nos permite definir las métricas a partir de las cuales la construcción del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span
      style="font-weight: normal;"&gt;se considera estable o no.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-cobertura-configuration.jpg" style="border: 1px solid black; text-align: left;" height="NaN" width="NaN" alt="" border="1" class="alignnone" /&gt;&lt;br /&gt; &lt;/span&gt;&lt;/p&gt; &lt;p
      style="text-align: left;" class="western"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;En principio ya está todo. Ahora podríamos lanzar una construcción para comprobarlo. Si todo va bien, Hudson mostrará los informes de cobertura bajo el enlace&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;Coverage Report&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;en la raíz
      del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;" class="western"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/hudson-cobertura-report.jpg" style="border: 0 none; text-align: left;" height="556" width="500" alt="" border="0" class="alignnone"
      /&gt;&lt;/p&gt; &lt;div&gt; &lt;p style="margin-top: .5cm; margin-bottom: .4cm; font-weight: normal; text-align: center;"&gt;- 8 -&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; Tagged: Agile, calidad, Hudson, Java, NetBeans &lt;a href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/142/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/142/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/142/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/142/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/142/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/142/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/142/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/142/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/142/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/142/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img
      src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;amp;blog=6092394&amp;amp;post=142&amp;amp;subd=ivanator&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 07 Feb 2009 19:00:41 +0000</pubDate>
    </item>
    <item>
      <title>Bits y Bytes » NetBeans: Pasar propiedades de sistema a los tasks JUnit de los scripts de NetBeans</title>
      <guid isPermaLink="false">http://ivanator.wordpress.com/?p=138</guid>
      <link>http://ivanator.wordpress.com/2009/02/06/pasar-propiedades-de-sistema-a-los-tasks-junit-de-los-scripts-de-netbeans/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;Como ya he explicado alguna vez, NetBeans utiliza scripts de Ant para realizar las diferentes tareas que lleva acabo el IDE, como compilar el proyecto, lanzar los tests, ejecutarlo, desplegarlo, etc.&lt;/p&gt; &lt;p&gt;NetBeans genera los scripts de manera modular de manera que el usuario pueda personalizarlo de forma adecuada. Genera el &lt;em&gt;build.xml&lt;/em&gt; principal en la raíz del proyecto que a su vez incluye otros tantos
      recursos del subdirectorio de &lt;em&gt;nbproject&lt;/em&gt;. Estos recursos son ficheros de propiedades y de scripting adicionales con la implementación real de los diferentes &lt;em&gt;targets. &lt;/em&gt;&lt;/p&gt; &lt;p&gt;La idea de esta estructuración es que los ficheros con &lt;em&gt;targets&lt;/em&gt; en el directorio &lt;em&gt;nbproject&lt;/em&gt; (&lt;em&gt;build-impl.xml&lt;/em&gt;, por ejemplo) nunca deberían tocarse ya que se pueden regenerar (y por tanto se perdería toda nuestra
      personalizacion) en función de las diferentes opciones que definamos para nuestro proyecto a través de la propia interfaz del IDE. Por contra, el &lt;em&gt;build.xml&lt;/em&gt; principal no se regenerará y es por tanto en este fichero donde personalizaremos los scripts (añadir nuevos &lt;em&gt;targets&lt;/em&gt;, definir propiedades, etc.).&lt;/p&gt; &lt;p&gt;El problema surge cuando queremos modificar el comportamiento de algunos de los &lt;em&gt;targets&lt;/em&gt; definidos en los ficheros
      “intocables”. Por ejemplo, un requerimiento que puede surgir fácilmente (veremos algún ejemplo en próximos posts) es la necesidad de pasar parámetros de sistema a los &lt;em&gt;tasks&lt;/em&gt; que ejecutan las pruebas unitarias con JUnit.&lt;/p&gt; &lt;p&gt;Afortunadamente el equipo de NetBeans ha previsto esta situación y la solución es bastante sencilla. Imaginemos que queremos pasar una propiedad de sistema que se llama &lt;em&gt;MiPropiedad &lt;/em&gt;con valor &lt;em&gt;MiValor&lt;/em&gt;, la
      solución pasa por definir en el &lt;em&gt;build.xml &lt;/em&gt;una propiedad que se llame &lt;em&gt;test-sys-prop.MiPropiedad&lt;/em&gt; y todos los &lt;em&gt;taks &lt;/em&gt;Junit de los scripts generados automáticamente recibirán la propiedad &lt;em&gt;MiPropiedad&lt;/em&gt; con el valor que le hayamos indicado. Si necesitáramos pasar más de una propiedad repetiríamos el mismo proceso con otro nombre de parámetro.&lt;/p&gt; &lt;p&gt;En código, habría que incluir el siguiente tag en el
      &lt;em&gt;build.xml&lt;/em&gt; principal:&lt;/p&gt; &lt;pre&gt;&amp;lt;property name="test-sys-prop.MiPropiedad" value="MiValor" /&gt;&lt;/pre&gt; &lt;p&gt;Si queréis entender el motivo exacto y hackear los scripts de NetBeans, echadle un ojo a &lt;a href="http://weblogs.java.net/blog/fabriziogiudici/archive/2007/01/setting_propert.html" target="_blank"&gt;este post&lt;/a&gt;.&lt;/p&gt; Tagged: Ant, JUnit, NetBeans &lt;a href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/138/"
      rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/138/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/138/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/138/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/138/" rel="nofollow"&gt;&lt;img
      src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/138/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/138/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/138/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/138/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/138/" alt=""
      border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;amp;blog=6092394&amp;amp;post=138&amp;amp;subd=ivanator&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 06 Feb 2009 19:59:46 +0000</pubDate>
    </item>
    <item>
      <title>Bits y Bytes » NetBeans: Monitorizar Hudson desde NetBeans</title>
      <guid isPermaLink="false">http://ivanator.wordpress.com/?p=131</guid>
      <link>http://ivanator.wordpress.com/2009/02/06/monitorizar-hudson-desde-netbeans/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;div&gt; &lt;p&gt;En un &lt;a href="http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/"&gt;post anterior&lt;/a&gt; explicaba como montar un entorno básico para poder empezar a trabajar en un entorno TDD. El ide que elegí fue NetBeans y el servidor de integración continua Hudson. El siguiente paso natural es poder monitorizar Hudson desde el propio NetBeans sin tener que abrir el
      navegador web. Para poder llevar a cabo esta tarea, existe un plugin desarrollado por el propio equipo de Hudson. Aunque su uso es muy sencillo, en este post explicaré cómo instalarlo, configurarlo y utilizarlo. Los desarrolladores del plugin tienen un &lt;a href="http://hudson.gotdns.com/wiki/display/HUDSON/NetBeansPlugin"&gt;entrada en su wiki&lt;/a&gt;, así que mi post es un poco redundante &lt;img src="http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif" alt=":-P" class="wp-smiley"
      /&gt; &lt;/p&gt; &lt;h1 class="western"&gt;Instalar el plugin&lt;/h1&gt; &lt;p&gt;El primer paso consiste en instalar el plugin. Para ello tenemos varias alternativas.&lt;/p&gt; &lt;p&gt;Podemos &lt;a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=2178"&gt;descargarlo desde el NetBeans Plugin Portal&lt;/a&gt; como un fichero &lt;em&gt;nbm&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que luego instalaremos a través del gestor de plugins del
      NetBeans:&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Tools -&gt; Plugins -&gt; Downloaded -&gt; Add Plugins&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y seleccionaremos el fichero descargado.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;La otra alternativa, que prefiero, es hacerlo directamente desde la pestaña de plugins disponibles siempre que tengamos configurado el &lt;em&gt;Update Center&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;del&lt;/span&gt; &lt;em&gt;Plugin Portal&lt;/em&gt; &lt;span style="font-style: normal;"&gt;:&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Tools -&gt; Plugins -&gt; Available Plugins -&gt; Install&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;"&gt; &lt;/p&gt;&lt;p style="font-style: normal;
      font-weight: normal;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/gestorpluginsnetbeans.jpg" style="text-align: left;" height="41%" width="75%" alt="" border="0" /&gt;&lt;/p&gt; &lt;h1 class="western"&gt;Configurar el plugin&lt;/h1&gt; &lt;p style="font-style: normal; font-weight: normal;"&gt;Una vez instalado lo tenemos disponible en la pestaña &lt;em&gt;&lt;strong&gt;Services&lt;/strong&gt;&lt;/em&gt; junto con los servidores, los SGBDs y demás, valga la redundancia,
      servicios.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;"&gt;Haciendo click derecho sobre el icono del Hudson, nos aparece la opción de añadir una instancia (podríamos monitorizar simultáneamente diferentes servidores de integración). Simplemente tendremos que completar el asistente dándole un nombre a esa instancia, asignándole la &lt;em&gt;url&lt;/em&gt; donde reside el servidor y una frecuencia de refresco del estado del mismo.&lt;/p&gt; &lt;h1 class="western"&gt;Usar el
      plugin&lt;/h1&gt; &lt;p&gt;A partir de ese momento podemos ver el estado de Hudson de un vistazo. Por un lado podemos ver el estado de todos los &lt;em&gt;jobs&lt;/em&gt; &lt;span style="font-style: normal;"&gt;con códigos de colores (correcto, roto o inestable)&lt;/span&gt; y el estado de ocupación de la cola de construcción. Por otro lado podemos programar nuevas construcciones de cualquier &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;haciendo&lt;/span&gt; &lt;span
      style="font-style: normal;"&gt;&lt;strong&gt;click derecho sobre el&lt;/strong&gt;&lt;/span&gt; &lt;em&gt;&lt;strong&gt;job&lt;/strong&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;-&gt; Start job&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;o ver una información más extendida del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;haciendo doble click sobre el mismo (lo que abre una ventana en el panel del editor). Obviamente podemos saltar directamente a la página web correspondiente en el navegador haciendo&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;click derecho sobre el nodo correspondiente -&gt; Open in Browser&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight:
      normal;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;a href="http://ivanator.files.wordpress.com/2009/02/netbeans_service_hudson.jpg"&gt;&lt;/a&gt;&lt;a href="http://ivanator.files.wordpress.com/2009/02/netbeans_service_hudson1.jpg"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/netbeans_service_hudson1.jpg" title="netbeans_service_hudson1" height="386" width="510" alt="netbeans_service_hudson1" class="aligncenter size-full wp-image-133"
      /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;El “problema” de monitorizar de esta manera es que nos fuerza a acceder a la pantalla de servicios. Afortunadamente el plugin también proporciona una alerta a manera de iconito rojo parpadeante y estresante en el margen inferior izquierdo del NetBeans. El icono omnipresente persiste hasta que se arregle el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight:
      normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;roto. Clickando sobre el mismo nos da información del&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;job&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;(o&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;jobs&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;&lt;span style="font-weight: normal;"&gt;) que están causando la alerta.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;"&gt;Disfrutadlo.&lt;/p&gt; &lt;p style="font-style: normal; font-weight: normal;"&gt; &lt;/p&gt;&lt;/div&gt; Tagged: Hudson, NetBeans &lt;a href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/131/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/131/" alt=""
      border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/131/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/131/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/131/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/131/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/131/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/131/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/131/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/131/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img
      src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;amp;blog=6092394&amp;amp;post=131&amp;amp;subd=ivanator&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 06 Feb 2009 17:30:01 +0000</pubDate>
    </item>
    <item>
      <title>Vida amarilla: Programar en PC-BSD con Netbeans IDE</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-25158020.post-7013917608682603909</guid>
      <link>http://miguelcrux.blogspot.com/2007/09/programar-en-pc-bsd-con-netbeans-ide.html</link>
      <description>Autor: Miguel A. Cruz. C. (miguelcrux [a] gmail [dot] com) Fecha: 19 setiembre del 2007Gentil colaboración para PC-BSD Perú: http://www.pcbsd-pe.orgParte de NetBeans Blogging Contest siteLo que es Netbeans 6.1 beta Netbeans es un IDE para el desarrollo de aplicaciones basadas en Netbeans Plataform. Netbeans es muy extensible: posee un constructor de interfaces gráficas llamado Matisse, soporte</description>
      <pubDate>Mon, 26 Jan 2009 22:04:31 +0000</pubDate>
    </item>
    <item>
      <title>My Travels: Reflections on the lake</title>
      <guid isPermaLink="false">http://web.mac.com/atellezf/alejandro/NetBeans/3a8ab8df-b244-4100-8fb0-8cae0d47749f</guid>
      <link>http://web.me.com/atellezf/alejandro/NetBeans/Entries/2009/1/19_Reflections_on_the_lake.html</link>
      <description>&lt;a href="http://web.me.com/atellezf/alejandro/NetBeans/Entries/2009/1/19_Reflections_on_the_lake_files/rbhh_0053B.jpg"&gt;&lt;img src="http://web.me.com/atellezf/alejandro/NetBeans/Media/object014.jpg" style="float: left; padding-right: 10px; padding-bottom: 10px; width: 364px; height: 173px;" /&gt;&lt;/a&gt;Consectetuer arcu ipsum ornare pellentesque vehicula, in vehicula diam, ornare magna erat felis wisi a risus. Justo fermentum id. Malesuada eleifend, tortor molestie, a fusce a
      vel et. Mauris at suspendisse, neque aliquam faucibus adipiscing, vivamus in. Wisi mattis leo suscipit nec amet, nisl fermentum tempor ac a, augue in eleifend in venenatis, cras sit id in vestibulum felis in, sed ligula. In sodales suspendisse mauris quam etiam erat, quia tellus convallis eros rhoncus diam orci, porta lectus esse adipiscing posuere et, nisl arcu vitae laoreet.&lt;br /&gt;&lt;br /&gt;Zelus torqueo velit ad suscipit vindico luptatum premo. Ut metuo suscipere autem suscipit si fere
      facilisi abluo ille. Mos duis, rusticus facilisis inhibeo suscipit loquor indoles, sagaciter opto capto, premo. Regula os, ea zelus torqueo ideo, consectetuer, iustum jugis. Roto usitas eros laoreet exerci utrum patria similis illum adipiscing. Ulciscor, tation utinam ut molior et, te in aliquip. Nostrud nostrud ratis antehabeo incassum jus abdo vicis adipiscing nostrud.&lt;br /&gt;&lt;br /&gt;Dignissim hendrerit similis amet quis abico oppeto appellatio conventio suscipit haero
      commodo.</description>
      <pubDate>Mon, 19 Jan 2009 15:51:53 +0000</pubDate>
    </item>
    <item>
      <title>Bits y Bytes » NetBeans: Montando un entorno de integración continua (Hudson + Ant + SVN + NetBeans)</title>
      <guid isPermaLink="false">http://ivanator.wordpress.com/?p=3</guid>
      <link>http://ivanator.wordpress.com/2009/01/12/montando-un-entorno-integracion-continua-hudson-ant-svn-netbeans/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;div&gt; &lt;p&gt;Este post como artículo en &lt;a href="http://ivanator.files.wordpress.com/2009/02/montando-un-entorno-de-integracion-continua-doc-v12.pdf"&gt;PDF&lt;/a&gt;&lt;/p&gt; &lt;h1&gt;Introducción&lt;/h1&gt; &lt;p&gt;Cuando uno lee posts, libros y escucha experiencias de la aproximación ágil al desarrollo del software y empieza a profundizar y a aprender conceptos tales como el TDD (test driven development) y la integración
      continua, se le despiertan una ganas irrefrenables de empezar a trabajar de este modo. En este post lo que intentaré explicar es cómo montar un entorno sencillo que nos permita tener los cimientos de un sistema ágil que cada uno podrá extender para satisfacer sus propias necesidades. Como se menciona en &lt;a href="http://architects.dzone.com/articles/the-three-pillars-continuous-i" target="_blank"&gt;este post&lt;/a&gt;, tres de los pilares de la integración continua son: un repositorio de datos, un
      servidor de integración continua y una herramienta que permita automatizar la construcción de la aplicación. Yo además añadiría un cuarto: un IDE que se integre bien con el resto del entorno. No es el propósito de este post discutir la utilidad de estos componentes (el post mencionado anteriormente puede ser un buen punto de partida para los recién llegados), sino elegir unas herramientas concretas y describir su configuración e integración. En mi caso he hecho la siguiente elección (que no tiene por
      qué ser la única ni la mejor):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;repositorio de código: SVN&lt;/li&gt; &lt;li&gt;servidor de integración continua: Hudson&lt;/li&gt; &lt;li&gt;herramienta de construcción: ANT&lt;/li&gt; &lt;li&gt;IDE: NetBeans 6.5&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Por simplicidad he distribuido el entorno entre una máquina Linux (Ubuntu 8.10) con IP 192.168.1.10 (dato que es relevante para tareas de configuración que iremos viendo) que actúa simultáneamente como repositorio de datos y de
      integración continua y un número arbitrario de máquinas de desarrollo (también Ubuntu 8.10) que contienen los IDE’s y el entorno con el que trabajan los desarrolladores. En cualquier caso, otras distribuciones tienen exactamente la misma complicación y los pasos requeridos son directamente extrapolables y fácilmente adaptables. Para explicar los diferentes pasos utilizaré un mismo ejemplo ya que considero que hablar con algo concreto suele ser más sencillo, tanto para el que explica como para el que
      intenta entender, que hacerlo en general o en abstracto. Presupongo la inteligencia de los potenciales lectores para hacer las adaptaciones requeridas en cada punto a sus propias necesidades. No es muy relevante, pero utilizaré un proyecto personal que estoy empezando estos días que sirve para hacer un seguimiento de las valoraciones de mis cursos y que se titula, en un alarde de originalidad, “Encuestas”.&lt;/p&gt; &lt;p&gt;En el siguiente diagrama muestro el entorno que acabaremos montando. Las
      rutas que aparecen en el servidor no tenemos por qué entenderlas ahora pero servirán como referencia a medida que vayamos construyendo la solución.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/sbres-1233750052-0.jpg" style="text-align: left;" height="25%" width="75%" alt="" border="0" /&gt;&lt;/p&gt; &lt;h1&gt;Configuración Subversion&lt;/h1&gt; &lt;p&gt;He elegido Subversion porque es un repositorio más o menos potente que supera algunas de
      las limitaciones de nuestro querido y viejo CVS y aún a día de hoy es una de las herramientas que, bajo mi humilde opinión, están más extendidas en la industria. No voy a entrar en los detalles de instalación y de configuración del propio Subversion. Para ello ya hay mucha documentación online (por ejemplo &lt;a href="http://svnbook.red-bean.com/" target="_blank"&gt;aquí&lt;/a&gt;). Me centraré en la creación de un repositorio para nuestro proyecto. Es cierto que se puede usar el mismo repositorio
      para más de un proyecto, pero yo prefiero tenerlo separado (alguno de los motivos aparecerán más adelante, aunque también se puede justificar razonadamente la otra postura).&lt;/p&gt; &lt;h2&gt;Crear el repositorio del SVN que almacenará el proyecto&lt;/h2&gt; &lt;p&gt;Como decía, presupongo que el servidor que actuará como repositorio de datos tiene instalado el Subversion y sus herramientas administrativas (si no es así, nuestro querido &lt;em&gt;apt-get&lt;/em&gt; o &lt;em&gt;Synaptic&lt;/em&gt;
      vendrán a nuestro rescate). Lo primero que hay que hacer es determinar en qué ruta almacenaré el repositorio. Yo tiendo a almacenar los diferentes repositorios de cada uno de los proyectos bajo una misma raíz y así mantengo el servidor más o menos organizado. La ruta también debería ser vistosa porque luego formará parte de la configuración que utilicen los clientes (como los IDE’s) para conectarse con dicho repositorio. Trabajando con Ubuntu, y si hemos instalado el Subversion desde paquetes, se
      crea un usuario &lt;em&gt;svn&lt;/em&gt;. Para que todo funcione de manera correcta, deberíamos asegurarnos que el propietario del repositorio es este usuario. Una manera de hacerlo es ejecutar los comandos de administración del Subversion con este usuario y otro es cambiar después el propietario del directorio (y su contenido) con el comando &lt;em&gt;chown&lt;/em&gt; (chown -fR svn .)/Encuestas-2). En definitiva, para crear el repositorio haremos lo siguiente:&lt;/p&gt; &lt;pre
      style="margin-bottom: .5cm;"&gt;svnadmin create /srv/svn/Encuestas-2&lt;/pre&gt; &lt;p&gt;El directorio &lt;em&gt;/srv/svn&lt;/em&gt; es la raíz de todos mis repositorios y &lt;em&gt;Encuestas-2&lt;/em&gt; es el que usaré para este proyecto en particular. Si ahora nos situamos en en el ese directorio y hacemos un listado deberíamos ver (más o menos) lo siguiente:&lt;/p&gt; &lt;pre&gt;ivan@hargon:/srv/svn/Encuestas-2$ ls -alh total 36K drwxr-xr-x 7 svn root 4,0K 2009-01-11 10:43 . drwxr-xr-x 6 svn
      root 4,0K 2009-01-11 10:43 .. drwxr-xr-x 2 svn root 4,0K 2009-01-11 10:43 conf drwxr-xr-x 2 svn root 4,0K 2009-01-11 10:43 dav drwxr-sr-x 5 svn root 4,0K 2009-01-11 10:43 db -r--r--r-- 1 svn root 2 2009-01-11 10:43 format drwxr-xr-x 2 svn root 4,0K 2009-01-11 10:43 hooks drwxr-xr-x 2 svn root 4,0K 2009-01-11 10:43 locks -rw-r--r-- 1 svn root 229 2009-01-11 10:43 README.txt&lt;/pre&gt; &lt;h2&gt;Establecer la seguridad del repositorio&lt;/h2&gt; &lt;p&gt;Cuando se crea un repositorio en el Subverson
      es, obviamente, para que los desarrolladores puedan utilizarlo. Por tanto un paso importante es la parte de securización y autorización del mismo: establecer quién podrá acceder y sus credenciales. Subversion tiene diferentes mecanismos de autenticación y de transporte seguro de la información (incluyendo &lt;em&gt;ssh&lt;/em&gt;). No voy a entrar en los detalles y explicaré cómo hacerlo de la manera más sencilla. Para más información os remito al &lt;a href="http://svnbook.red-bean.com/"
      target="_blank"&gt;anterior enlace&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;En mi caso, todas las máquinas residen en el interior de mi red de área local, que puede considerarse “zona segura”. Un punto importante es que los mecanismos de seguridad (y otros más) se establecen por repositorio (en contraposición a una configuración global para todos ellos) lo que nos permite que convivan repositorios con diferentes configuraciones (este es uno de los motivos por los que prefiero tener un repositorio por proyecto).
      Lo primero es determinar el modo de autenticación. Para ello habremos de editar el fichero&lt;/p&gt; &lt;pre style="margin-bottom: .5cm;"&gt;/srv/svn/Encuestas/conf/svnserve.conf&lt;/pre&gt; &lt;p&gt;para que quede más o menos así:&lt;/p&gt; &lt;pre&gt;[general] anon-access = none auth-access = write password-db = passwd realm = My Realm&lt;/pre&gt; &lt;p&gt;De hecho estas opciones seguramente preexisten en el fichero generado en el repositorio y lo único que habrá que hacer es descomentarlas.
      También es posible que en el fichero haya otras tantas opciones comentadas que no vamos a necesitar para nuestra configuración básica, así como diferentes comentarios descriptivos. Yo los he obviado por claridad. Con esta configuración lo que estamos haciendo es decirle al Subversion que busque los usuarios y las credenciales en un fichero de texto plano. El siguiente paso, precisamente, consiste en configurar qué usuarios y con qué credenciales podrán acceder al repositorio editando dicho fichero
      que se encuentra en:&lt;/p&gt; &lt;pre style="margin-bottom: .5cm;"&gt;/srv/svn/Encuestas/conf/passwd&lt;/pre&gt; &lt;p&gt;que editaremos para que quede algo parecido a lo siguiente:&lt;/p&gt; &lt;pre&gt;[users] ivan = super-secret-passwd ana = top-secret-passwd&lt;/pre&gt; &lt;p&gt;Estos serán los usuarios y passwords que habrá que configurar en los clientes (en nuestro caso usaremos NetBeans).&lt;/p&gt; &lt;h1&gt;Configuración NetBeans&lt;/h1&gt; &lt;p&gt;Supongamos que nuestra aplicación de
      ejemplo &lt;em&gt;Encuestas&lt;/em&gt; es una aplicación web típica que va a correr encima de un Tomcat 6. Así pues lo primero que haremos es crear un nuevo proyecto web mediante los asistentes del IDE. Asumo que estos pasos los sabréis llevar a cabo pero, en cualquier caso, no son el tema del presente post y lo pasaré muy rápido.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/netbeans-crear-web-project1.jpg" style="text-align: bottom;"
      height="168" width="510" alt="Asistente del NetBeans para crear un proyecto web" border="0" /&gt;&lt;/p&gt; &lt;h2&gt;Conexión con el Subversion&lt;/h2&gt; &lt;p&gt;Una vez tenemos creado el proyecto web, lo siguiente es enlazarlo con el Subversion. Para ello haremos &lt;strong&gt;click derecho&lt;/strong&gt; en el nombre del &lt;strong&gt;proyecto&lt;/strong&gt;, y en el menú &lt;strong&gt;versioning&lt;/strong&gt; seleccionaremos la opción &lt;strong&gt;Import&lt;/strong&gt; &lt;strong&gt;into
      Subversion Repository&lt;/strong&gt; que nos abrirá un asistente para configurar la conexión. En mi versión de NetBeans (la 6.5) el aspecto que tiene es el que podéis ver en la siguiente captura de pantalla.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/asistente-svn-paso-11.jpg" style="text-align: bottom;" height="194" width="510" alt="Asistente del NetBeans para configurar el SVN - Paso 1" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Los siguientes
      pasos nos permiten seleccionar qué ficheros importar al repositorio. En este punto se podría abrir una discusión sobre si sólo subir los ficheros de código y recursos necesarios para el proyecto desde un punto de vista de independencia del IDE utilizado o si bien subir también los ficheros y recursos asociados al IDE. Puede ser una discusión interesante, pero la dejaremos para otro momento. En esta ocasión, para simplificar (y en mi caso es siempre la opción preferida), subiremos todos los recursos
      tal y como muestra el tercer paso del asistente.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/asistente-svn-paso-3.jpg" style="text-align: bottom;" height="372" width="574" alt="bla bla" border="0" /&gt;&lt;/p&gt; &lt;p&gt;En este momento ya tenemos conectado el IDE con el repositorio. Los pasos e ideas fundamentales son los mismos para otros entornos como Eclipse y CVS. Quizá en otro post puedo explicar cómo configurar alguna de estas otras
      opciones. Para utilizar el NetBeans como cliente de Subversion tan sólo hay que hacer &lt;strong&gt;click derecho&lt;/strong&gt; sobre el recurso correspondiente (un directorio o un fichero) y elegir la opción &lt;strong&gt;Subversion&lt;/strong&gt; del menú contextual. La siguiente captura de pantalla lo ilustra.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/netbeans-uso-svn.jpg" style="text-align: bottom;" height="50%" width="50%"
      alt="Usando NetBeans como cliente de SVN" border="0" /&gt;&lt;/p&gt; &lt;h2&gt;Tests unitarios con JUnit en NetBeans&lt;/h2&gt; &lt;p&gt;En posts siguientes explicaré cómo integrar en el entorno ágil que estamos montando diferentes herramientas que aumenten nuestra productividad y la calidad de nuestro código ( &lt;a href="http://pmd.sourceforge.net/" target="_blank"&gt;PMD&lt;/a&gt;, &lt;a href="http://checkstyle.sourceforge.net/"&gt;CheckStyle&lt;/a&gt;, &lt;a
      href="http://findbugs.sourceforge.net/" target="_blank"&gt;FindBugs&lt;/a&gt;, herramientas de cobertura…), pero por el momento me centraré en aquellas herramientas mínimas que requiere un entorno ágil que quiera trabajar con TDD: test unitarios. La idea es la siguiente: imaginemos que queremos trabajar con el framework de tests unitarios &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;. Instalaríamos la herramienta en tres “lugares”:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Como plug-in del IDE, lo que
      permite un uso integrado en el entorno de desarrollo del programador, con todas la ventajas de uso que ello conlleva.&lt;/li&gt; &lt;li&gt;Como &lt;em&gt;target&lt;/em&gt; en el &lt;em&gt;build.xml&lt;/em&gt; del Ant. Este &lt;em&gt;target&lt;/em&gt; nos permitirá ejecutar las mismas tareas desde la línea de comandos sin ayuda del IDE pero además, y más importante, permitirá al servidor de integración continua lanzar la tarea y generar los diferentes informes (en el caso de JUnit serán ficheros XML)
      especificando qué tests han sido superados, cuáles han fallado, etcétera.&lt;/li&gt; &lt;li&gt;Como plug-in (que a veces puede venir preinstalado) del servidor de integración continua (en nuestro caso Hudson), de manera que pueda utilizar los informes generados en el &lt;em&gt;target&lt;/em&gt; del Ant para mostrar información útil y gráfica y determinar si la construcción ha fallado o no entre otras cosas.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;En este apartado veremos el primer punto y el resto los iré
      desarrollando a lo largo del post. También os aconsejo que leáis &lt;a href="http://www.netbeans.org/kb/docs/java/junit-intro.html"&gt;este magnífico post&lt;/a&gt; sobre cómo usar JUnit en NetBeans del propio blog oficial del IDE. El plug-in de JUnit ya está instalado por defecto en la mayoría (si no en todas) las distribuciones de NetBeans como IDE Java. Incluye además las dos versiones que se utilizan hoy día (la familia 3.X y la familia 4.X). Yo personalmente me decanto por la versión 4 porque me
      gusta poder utilizar anotaciones. Al crear cualquier proyecto Java con los asistentes de NetBeans, éste ya está preconfigurado para utilizar el framework (aunque nosotros podamos ignorarlo). Lo podéis comprobar en dos sitios: por un lado en la ventana &lt;strong&gt;Projects&lt;/strong&gt; podemos ver que se ha creado un directorio &lt;strong&gt;Test Packages&lt;/strong&gt; y por otro lado si hacemos &lt;strong&gt;click derecho&lt;/strong&gt; sobre el nombre del &lt;strong&gt;proyecto&lt;/strong&gt;,
      y abrimos el diálogo &lt;strong&gt;Properties&lt;/strong&gt; en la sección &lt;strong&gt;Libraries – Compile Test&lt;/strong&gt; veremos que están están agregadas las bibliotecas correspondientes.&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/netbeans-properties-junit-libraries.jpg" style="text-align: bottom;" height="396" width="509" alt="Configuración por defecto de librerias en un proyecto web de NetBeans" border="0" /&gt;&lt;/p&gt;
      &lt;p&gt;La manera de construir un test unitario con NetBeans es muy simple. Simplemente tenemos que &lt;strong&gt;seleccionar&lt;/strong&gt; la clase que queremos &lt;strong&gt;testear&lt;/strong&gt;, hacer &lt;strong&gt;click derecho&lt;/strong&gt;, seleccionar &lt;strong&gt;Tools&lt;/strong&gt; y finalmente &lt;strong&gt;Create JUnit Tests&lt;/strong&gt; que lanzará un menú modal en el que podremos seleccionar qué código autogenerar en el unit test que se va a crear (en el primero unit test que
      creemos, el entorno nos preguntará qué versión de JUnit querremos usar y ya la mantendrá para el resto del proyecto).&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/netbeans-crear-unit-test.jpg" style="text-align: bottom;" height="478" width="510" alt="Crear un unit test a partir de una clase" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Una vez codifiquemos el test unitario, lo siguiente es poder ejecutarlo; nada más sencillo: &lt;strong&gt;Run -&gt;
      Test Project&lt;/strong&gt; (o la combinación &lt;strong&gt;ALT + F6&lt;/strong&gt;) y el resultado indicando si se pasan o no los tests se mostrará por la consola del IDE.&lt;/p&gt; &lt;h1&gt;Configuración del Ant&lt;/h1&gt; &lt;p&gt;Supongo que en este punto no tengo que explicar qué es &lt;a href="http://ant.apache.org/" target="_blank"&gt;Ant&lt;/a&gt; y asumo que conocéis su funcionamiento. Si bien trabajando en local, el IDE puede hacernos transparentes todos aquellos aspectos engorrosos como
      configurar el CLASSPATH, compilar, generar documentación, correr herramientas de análisis, desplegar en el servidor de aplicaciones, etcétera, cuando tenemos que hacerlo de manera remota, o hacer el despliegue en producción, o automatizar cualquiera de estas tareas dentro de un script, o, lo que más nos interesa en este post, permitir a un servidor de integración continua que construya nuestro proyecto, necesitamos una herramienta independiente del IDE. Ant es una opción que nos permite llevar esto a
      cabo (otra opción, por ejemplo, sería &lt;a href="http://maven.apache.org/" target="_blank"&gt;Maven&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Trabajando con Eclipse, hasta donde llega mi conocimiento, no tenemos más remedio que construir los &lt;em&gt;build.xml&lt;/em&gt; a mano. De todos modos una vez que se ha hecho uno, si se organiza y parametriza de forma adecuada, el resto de proyectos pueden ir reutilizando una misma “plantilla” con cambios mínimos.&lt;/p&gt; &lt;p&gt;Trabajando con NetBeans podemos
      tener parte del trabajo resuelto. Ello se debe a que todas las tareas que realiza el IDE (compilar, testear, configurar los diferentes CLASSPATH, desplegar, etc.), lo hace con Ant mediante ficheros &lt;em&gt;build.xml&lt;/em&gt; (y otros ficheros auxiliares) que construye dinámicamente en función de lo que nosotros configuremos de manera gráfica en la interfaz de NetBeans o a través de cualquiera de sus asistentes. Nosotros podemos aprovecharnos de estos ficheros generados para utilizarlos desde
      fuera del IDE para nuestros propios propósitos. La propia estructura de los scripts preveen diferentes &lt;em&gt;targets&lt;/em&gt; “hook” donde añadir nuestro propio scripting si el generado no es suficiente.&lt;/p&gt; &lt;p&gt;A primera vista esto podría parecer genial y bueno, en gran parte lo es, pero hay que tener en cuenta una serie de consideraciones. La principal es que los scripts generados no son totalmente independientes del IDE ni de la máquina en la que se han generado porque utilizan
      recursos (bibliotecas y &lt;em&gt;tasks&lt;/em&gt;) que sólo existen en los directorios de instalación del IDE y algunas de las rutas generadas son absolutas y por tanto dependientes de la máquina en donde se generaron. Por tanto si estos ficheros quieren utilizarse en otro contexto habrá que hacer algunos ajustes a mano. Dependiendo del tipo de proyecto en el que estemos trabajando (no será lo mismo una aplicación JSE que una aplicación J2EE con dependencias de un servidor de aplicaciones) la
      cantidad de esfuerzo requerida para hacer los scripts portables será mayor o menor. En &lt;a href="http://weblogs.java.net/blog/fabriziogiudici/archive/2006/11/setting_up_netb.html" target="_blank"&gt;este post&lt;/a&gt; se muestran algunos de los perfiles de aplicaciones y sus posibles problemas y soluciones (se corresponde con una versión de NetBeans algo vieja, pero la mayor parte de lo que se explica todavía aplica a las versiones actuales).&lt;/p&gt; &lt;p&gt;NetBeans genera el
      &lt;em&gt;build.xml&lt;/em&gt; en la raíz del proyecto. Si lo abrís podéis ver que básicamente es un script vacío que lo que hace es importar otros tantos ficheros (más o menos dependiendo del tipo de proyecto) que se encuentran en la subcarpeta &lt;strong&gt;nbproject&lt;/strong&gt;. NetBeans utiliza esta carpeta como su directorio de trabajo y para contener los diferentes metadatos del proyecto. En principio no deberíamos tocar ninguno de los ficheros contenidos bajo esta jerarquía de directorios a
      no ser que sepamos exactamente lo que estamos haciendo. Dentro de nbproject tenemos otra carpeta especial: &lt;strong&gt;private&lt;/strong&gt;. Deberemos ir con cuidado de no incluir esta carpeta en el repositorio (por defecto el asistente ya lo hace bien) ya que contiene ficheros de parámetros con paths absolutos y dependientes de la máquina de cada desarrollador (o servidor de integración) usados por, entre otras cosas, por los scripts de Ant. Esto será parte de lo que tendremos que replicar a
      mano en el servidor de integración adaptándolo adecuadamente. (pero ya lo veremos más adelante).&lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/netbeans-ant-build.jpg" style="text-align: bottom;" height="546" width="510" alt="Detalle del build.xml generado por el NetBeans" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Al abrir el &lt;em&gt;build.xml&lt;/em&gt; desde el propio NetBeans, la ventana Navigator nos muestra las tareas disponibles. Si queréis
      detalles, investigad un poco, pero bueno tenemos todos aquellos &lt;em&gt;targets&lt;/em&gt; que esperaríamos encontrar y que podemos necesitar (y muchos más), por ejemplo:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;clean&lt;/li&gt; &lt;li&gt;compile&lt;/li&gt; &lt;li&gt;debug&lt;/li&gt; &lt;li&gt;dist&lt;/li&gt; &lt;li&gt;javadoc&lt;/li&gt; &lt;li&gt;test&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Los incrédulos podéis abrir una consola y comprobar como podéis invocar las tareas desde la línea de comandos. Para ello sólo
      os tenéis que situar en el directorio raíz del proyecto y ejecutar el ant como lo haríais con cualquier otro build.xml.&lt;/p&gt; &lt;h1&gt;Configuración Hudson&lt;/h1&gt; &lt;p&gt;Sólo resta la última pieza del puzle: automatizar la construcción del proyecto desde nuestro servidor de integración continua (Hudson) conectándolo al repositorio. También explicaré como automatizar el hecho que se programe una nueva construcción automática cada vez que hay un &lt;em&gt;commit&lt;/em&gt; en el repositorio.
      &lt;a href="https://hudson.dev.java.net/" target="_blank"&gt;La instalación y configuración inicial de Hudson&lt;/a&gt; es trivial pero está fuera del ámbito de este tutorial (baste decir que básicamente consiste en desplegar un &lt;em&gt;war&lt;/em&gt; en un servidor de aplicaciones o un contenedor web como Tomcat).&lt;/p&gt; &lt;h2&gt;Automatización de la construcción&lt;/h2&gt; &lt;p&gt;Hudson automatiza la construcción de proyectos en lo que denomina
      &lt;em&gt;&lt;strong&gt;j&lt;/strong&gt;&lt;/em&gt; &lt;strong&gt;&lt;em&gt;obs&lt;/em&gt;&lt;/strong&gt;, así pues un mismo proyecto software puede tener diferentes &lt;em&gt;jobs&lt;/em&gt;. Por ejemplo, tener configurado un &lt;em&gt;job&lt;/em&gt; que se ejecute cada vez que se haga un &lt;em&gt;commit&lt;/em&gt; en el repositorio y que lo único que compruebe es que el proyectos es compilable y que se pasan los test unitarios y tener otro &lt;em&gt;job&lt;/em&gt; programado para ejecutarse tres
      veces al día para correr tests de aceptación o de integración más pesados. Nosotros empezaremos por algo muy sencillo, configurando un &lt;em&gt;job&lt;/em&gt; para que haga lo que explicaba en el primer ejemplo (compilación más tests unitarios).&lt;/p&gt; &lt;p&gt;Hudson tiene una interfaz muy sencilla de utilizar. A diferencia de otros servidores de integración, tanto la creación como la configuración de los &lt;em&gt;jobs&lt;/em&gt; se hace íntegramente desde la interfaz web.&lt;/p&gt; &lt;p
      style="text-align: center;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/01/hudson-dashboard.jpg" style="text-align: bottom;" height="347" width="510" alt="Página principal del Hudson" border="0" /&gt;&lt;/p&gt; &lt;p&gt;Para crear nuestro &lt;em&gt;job&lt;/em&gt; haremos click en &lt;span style="font-style: normal;"&gt;&lt;strong&gt;New Job&lt;/strong&gt;&lt;/span&gt; y se iniciará el asistente de creación. Lo primero que tenemos que hacer es dar un nombre a nuestro
      &lt;em&gt;job&lt;/em&gt; que será utilizado tanto en la interfaz e internamente en el servidor de integración. Se puede utilizar cualquier símbolo en el nombre e incluso espacios, pero yo prefiero (manía personal) utilizar nombres con una sola palabra porque cuando luego se quiere navegar “a mano” (mediante la consola) por los &lt;em&gt;jobs&lt;/em&gt; siempre es más cómodo no tener espacios puesto que el nombre que usemos se corresponderá con el nombre del directorio donde residirá toda la
      información asociada a dicho &lt;em&gt;job&lt;/em&gt;. En nuestro ejemplo: &lt;strong&gt;Encuestas-2&lt;/strong&gt;. Lo siguiente es elegir el tipo de &lt;em&gt;job&lt;/em&gt; que estamos construyendo; nosotros construiremos un &lt;em&gt;job&lt;/em&gt; estándar que es lo que Hudson llama un &lt;strong&gt;&lt;span style="font-style: normal;"&gt;Build a free-style software project&lt;/span&gt;&lt;/strong&gt;. Lo seleccionamos y le damos a &lt;span style="font-style:
      normal;"&gt;&lt;strong&gt;OK&lt;/strong&gt;&lt;/span&gt; para ir a la siguiente pantalla del asistente. En esta nueva pantalla tenemos todos los elementos de configuración del &lt;em&gt;job&lt;/em&gt; que rellenaremos (aquéllos que haga falta) como sigue:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Source Code Managment:&lt;/strong&gt; Subversion &lt;ul&gt; &lt;li&gt; &lt;p style="text-align: left;"&gt;&lt;strong&gt;Repository URL:&lt;/strong&gt;
      svn://192.168.1.10/srv/svn/Encuestas-2/Encuestas&lt;br /&gt; Aquí hay que tener en cuenta una cosa. La raíz del repositorio es &lt;em&gt;Encuestas-2&lt;/em&gt; &lt;span style="font-style: normal;"&gt;pero configuramos la url hasta&lt;/span&gt; &lt;em&gt;Encuestas&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Si no fuera así, el&lt;/span&gt; &lt;em&gt;workspace&lt;/em&gt; &lt;span style="font-style: normal;"&gt;generado para construir&lt;/span&gt; &lt;span style="font-style: normal;"&gt;este
      job tendría un subdirectorio&lt;/span&gt; &lt;em&gt;Encuestas&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(lo que complicaría la configuración del resto de elementos del&lt;/span&gt; &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Build Triggers&lt;/strong&gt;: permite definir en qué momento Hudson tiene que construir el proyecto. Hay diferentes políticas con las que podéis experimentar.
      Nuestro propósito para este &lt;em&gt;job&lt;/em&gt; es que se construya cada vez que hay modificaciones en el repositorio. Para implementar esta política hay dos posibles maneras: o bien Hudson va preguntando al repositorio “¿ha habido cambios en el código?” de forma periódica (lo que se conoce como mecanismo por encuesta y que se corresponde con la opción “poll”) o bien que el propio Subversion avise a Hudson cada vez que ha habido un cambio. Esta última aproximación es más eficiente (y a mí
      parecer más elegante), pero se trata más bien de una configuración del Subversion (que veremos más adelante) y no del Hudson. Así pues no activaremos ningún tipo de &lt;em&gt;trigger&lt;/em&gt; (lo dejamos tal y como está).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt;: nos permite configurar cómo Hudson debe construir el proyecto. Existen diferentes mecanismos pero nosotros en este post vemos cómo se hace mediante Ant, así que será esta la opción que elegiremos. &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;Ant version&lt;/strong&gt;: dejaremos la “Default” con lo que Hudson utilizará la versión que encuentre en el path (esto está presuponiendo que existe un Ant configurado correctamente en la máquina donde reside Hudson).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Targets&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-weight: normal;"&gt;:&lt;/span&gt;&lt;/strong&gt; compile test javadoc&lt;br /&gt; Aquí tendremos que especificar los &lt;em&gt;targets&lt;/em&gt; definidos en el
      &lt;em&gt;build.xml&lt;/em&gt; que queremos que Hudson ejecute. Como estamos utilizando el &lt;em&gt;build.xml&lt;/em&gt; automáticamente generado por NetBeans tendremos que tener en cuenta algunas consideraciones que explico más adelante (como había comentado el &lt;em&gt;build.xml&lt;/em&gt; generado no es del todo independiente del NetBeans y habrá que poner algún parche para que funcione desde Hudson).&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;Publish Javadoc&lt;/strong&gt;
      &lt;span style="font-weight: normal;"&gt;:&lt;/span&gt; &lt;span style="font-weight: normal;"&gt;marcamos esta opción para publicar los documentos generados por&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;javadoc&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;asociados a nuestro proyecto. Los&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;javadoc&lt;/span&gt;&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;se generarán porque hemos definido&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;target&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;correspondiente en la sección previa.&lt;/span&gt;&lt;/span&gt; &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Javadoc directory&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;:Encuestas/dist/javadoc&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Publish JUnit test result report&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: marcamos esta opción
      para publicar los informes (y gráficas) de los resultados producidos por los diferentes test unitarios creados en el proyecto.&lt;/span&gt;&lt;/span&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;&lt;span style="font-style: normal;"&gt;Test report XMLs&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;: Encuestas/build/test/results/*.xml&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p style="font-style: normal;
      font-weight: normal;"&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/sbres-1233750052-9.jpg" style="text-align: left;" height="65%" width="75%" alt="" border="1" /&gt;&lt;br /&gt; &lt;/span&gt;&lt;/p&gt; &lt;h2&gt;Configurar el workspace del Hudson y añadir dependencias externas al Subversion&lt;/h2&gt; &lt;p&gt;Hudson almacena todos los ficheros que necesita para su funcionamiento así como los diferentes artefactos para cada uno de
      los &lt;em&gt;job&lt;/em&gt; en un directorio raíz conocido como el HUDSON_HOME. No es el propósito de este artículo explicar cómo configurarlo, pero puesto que necesitaremos modificar algunos aspectos de nuestro &lt;em&gt;job&lt;/em&gt; sí que necesitamos saber cuál es su valor. Para verlo, desde la página principal de Hudson accedemos al menú de configuración y es el primer parámetro que nos encontramos (Hudson Home -&gt; Manage Hudson -&gt; System Configuration -&gt; Home directory). En mi caso es
      el siguiente&lt;/p&gt; &lt;pre style="margin-bottom: .5cm;"&gt;HUDSON_HOME = /srv/hudson_home&lt;/pre&gt; &lt;p&gt;Dentro de este directorio existe el subdirectorio &lt;em&gt;jobs&lt;/em&gt; que contiene una entrada para cada &lt;em&gt;job&lt;/em&gt; configurado. Así pues aquí tendremos un subdirectorio &lt;em&gt;Encuestas-2&lt;/em&gt; (que, como decía, se corresponde con el nombre que le asignamos al &lt;em&gt;job&lt;/em&gt; cuando lo configuramos previamente). Dentro del directorio correspondiente
      a cada job, uno de los subdirectorios es &lt;em&gt;workspace&lt;/em&gt; &lt;em&gt;&lt;span style="font-style: normal;"&gt;(si no existiera, le daríamos a construir el job desde la&lt;/span&gt;&lt;/em&gt; &lt;em&gt;&lt;span style="font-style: normal;"&gt;interfaz del Hudson)&lt;/span&gt;&lt;/em&gt;. Este directorio contiene los ficheros descargados desde el repositorio de código cada vez que se lanza una construcción del job (el código fuente, los ficheros a usar por Ant, las bibliotecas incluidas en
      el proyecto, etc) y los artefactos generados en la construcción del proyecto. Lo remarco de nuevo: &lt;strong&gt;contiene los ficheros descargados desde el repositorio&lt;/strong&gt;. Lo que quiere decir que si el proyecto para ser construido necesita artefactos que existen en los entornos de desarrollo pero que no están incluidos en el repositorio (o sus localizaciones son diferentes a las especificadas en los diferentes scripts de construcción), la construcción inevitablemente fallará. Con las
      herramientas con las que estamos trabajando habrá que hacer lo siguiente:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;opcionalmente, si es un proyecto J2EE o requiere bibliotecas externas al contenido del repositorios de código, hacerlas accesibles al Hudson,&lt;/li&gt; &lt;li&gt;añadir algunas otras dependencias de NetBeans que tiene el &lt;em&gt;build.xml&lt;/em&gt; generado,&lt;/li&gt; &lt;li&gt;construir el directorio &lt;em&gt;/nbproject/private&lt;/em&gt; y su contenido para solucionar las
      dependencias.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Nuestro proyecto es un proyecto web que hemos configurado de manera que haga uso de la implementación de Servlets de Tomcat. Ello significa que en nuestro entorno de desarrollo tenemos un Tomcat y por tanto tendremos que replicar su instalación en la máquina donde reside Hudson para que pueda usar dichas bibliotecas. Lo más sencillo es empaquetar el Tomcat instalado en uno de los entornos de desarrollo y desempaquetarlo tal cual en el servidor de
      integración. En mi caso lo situaré en &lt;em&gt;/srv/apache-tomcat-6.0.18&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;La manera más sencilla de solucionar las dependencias que tienen los scripts del Ant del NetBeans es seguir una aproximación similar a la del caso del servidor de aplicaciones: copiar el propio NetBeans en la máquina donde reside el servidor de integración para que éste tenga acceso directo a todos los recursos. Obviamente es posible usar una aproximación menos “drástica” y copiar sólo aquellos
      recursos necesarios, pero sin duda copiar todo el entorno es la manera más rápida que hacerlo y la única penalización que obtenemos es ocupar unos cuantos MB más en el disco duro. Personalmente prefiero “malgastar” esos pocos a MB a tener que estar hackeando los scripts para ver qué necesito exactamente o pelearme con posibles y sutiles errores difíciles de trazar. Recapitulando: empaquetaremos el NetBeans de una de las máquinas de desarrollo y en mi caso lo situaré en
      &lt;em&gt;/srv/netbeans-6.5&lt;/em&gt;. Adicionalmente NetBeans también guarda parte de la configuración en un directorio oculto en el &lt;em&gt;home&lt;/em&gt; del usuario en un directorio oculto llamado &lt;em&gt;.netbeans&lt;/em&gt; &lt;span style="font-style: normal;"&gt;(esto es útil para que diferentes usuarios en una misma máquina física puedan tener configuraciones diferentes). En este caso no será necesario copiarlo absolutamente todo (un poco más adelante daré los
      detalles).&lt;/span&gt;&lt;/p&gt; &lt;p&gt;A continuación hemos de construir el directorio &lt;em&gt;private&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que contiene los metadatos donde, entre otras cosas, se está configurando parte de la información local a utilizar por Ant y que por ello no se ha incluido en el Subversion. El tipo de proyecto que estamos usando (proyecto web usando Tomcat) sólo genera un fichero en esta carpeta,&lt;/span&gt; &lt;em&gt;build.properties&lt;/em&gt; &lt;span
      style="font-style: normal;"&gt;. Construiremos la carpeta&lt;/span&gt; &lt;em&gt;private&lt;/em&gt; &lt;span style="font-style: normal;"&gt;como un subdirectorio de la carpeta&lt;/span&gt; &lt;em&gt;nbproject&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y copiaremos el fichero&lt;/span&gt; &lt;em&gt;properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;de uno de los entornos de desarrollo.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Los cambios que aplicaremos (todos relacionados con el cambio de
      rutas absolutas diferentes en desarrollo y en integración) son los siguientes:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a name="DDE_LINK" id="DDE_LINK"&gt;&lt;/a&gt;cambiar la ruta al Tomcat por la que corresponde (sustituir la cadena &lt;em&gt;/home/ivan/apache-tomcat-6.0.18&lt;/em&gt; &lt;span style="font-style: normal;"&gt;por la cadena&lt;/span&gt; &lt;em&gt;/srv/apache-tomcat-6.0.18&lt;/em&gt;),&lt;/li&gt; &lt;li&gt;cambiar la ruta del Netbeans (sustituir la cadena
      &lt;em&gt;/home/ivan/.netbeans-6.5&lt;/em&gt; &lt;span style="font-style: normal;"&gt;por la cadena&lt;/span&gt; &lt;em&gt;/srv/netbeans-6.5&lt;/em&gt;),&lt;/li&gt; &lt;li&gt;cambiar las referencias al directorio de configuración del &lt;em&gt;home&lt;/em&gt; (sustituir la cadena &lt;em&gt;/home/ivan/.netbeans&lt;/em&gt; &lt;span style="font-style: normal;"&gt;por&lt;/span&gt; &lt;em&gt;/srv/.netbeans&lt;/em&gt;).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;La primera
      línea del&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/&lt;/span&gt;&lt;/em&gt; &lt;em&gt;properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;pasará a referenciar al archivo de configuración del Tomcat a la nueva ubicación en el servidor de integración en la ruta&lt;/span&gt; &lt;em&gt;/srv/.netbeans/6.5/tomcat60.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Editaremos el fichero para adaptarlo al nuevo entorno; de hecho realmente la
      única línea que habremos de modificar es la que define el directorio donde reside el Tomcat porque el resto sólo tienen sentido si queremos arrancar el propio Tomcat (circunstancia que se da en las máquinas de desarrollo pero no, en principio, en el servidor de integración). Tras modificar el fichero tendríamos algo así:&lt;/span&gt;&lt;/p&gt; &lt;pre&gt;tomcat.home=/srv/apache-tomcat-6.0.18 tomcat.password=super-password-de-administracion-de-Tomcat tomcat.url=http://localhost:8084
      tomcat.username=ide&lt;/pre&gt; &lt;p&gt;Otro fichero referenciado en el &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private/&lt;/span&gt;&lt;/em&gt; &lt;em&gt;properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que también tendemos que modificar será el&lt;/span&gt; &lt;em&gt;/srv/.netbeans/6.5/build.properties&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Este fichero gestiona una gran cantidad de propiedades. Afortunadamente con sólo sustituir todas las
      ocurrencias de la cadena que indica la ruta de la raíz de la instalación del NetBeans por la nueva ruta en el servidor de integración será suficiente (en mi caso, sustituir&lt;/span&gt; &lt;em&gt;/home/ivan/netbeans-6.5&lt;/em&gt; &lt;span style="font-style: normal;"&gt;por&lt;/span&gt; &lt;em&gt;/srv/netbeans-6.5&lt;/em&gt; &lt;span style="font-style: normal;"&gt;).&lt;/span&gt;&lt;/p&gt; &lt;h2 style="font-style: normal;"&gt;Comprobando que el job está bien configurado&lt;/h2&gt; &lt;p
      style="font-style: normal;"&gt;¡Felicidades! El camino ha sido más o menos largo y tedioso (no tanto, ¿verdad?), pero ya hemos casi terminado.&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;Para asegurarnos que todo se ha configurado correctamente intentaremos construir el proyecto desde la consola del servidor de integración. Para ello nos situaremos en el directorio&lt;/span&gt; &lt;em&gt;Encuestas&lt;/em&gt; &lt;span style="font-style: normal;"&gt;dentro del workspace del job que
      estamos configurando&lt;/span&gt; &lt;em&gt;(/srv/hudson_home/jobs/Encuestas-2/workspace/Encuestas)&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que define la raíz del proyecto tal y como está en el Subversion. En ese directorio tenemos el&lt;/span&gt; &lt;em&gt;build.xml&lt;/em&gt; &lt;span style="font-style: normal;"&gt;así que podemos invocar al Ant tranquilamente. Una buena idea es probar todos los&lt;/span&gt; &lt;em&gt;targets&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que
      querremos ejecutar desde el Hudson (&lt;/span&gt; &lt;em&gt;compile, test&lt;/em&gt; &lt;span style="font-style: normal;"&gt;y&lt;/span&gt; &lt;em&gt;javadoc&lt;/em&gt; &lt;span style="font-style: normal;"&gt;). Si se ejecutan sin problemas tenemos la garantía que Hudson también podrá hacerlo.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;La prueba de fuego será construir el job desde la interfaz del&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span
      style="font-weight: normal;"&gt;Hudson:&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Hudson Home -&gt; Encuestas-2 -&gt; Build Now&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;lo que programa una ejecución. Al terminar la misma, tendremos una nueva entrada en la&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Build History&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight:
      normal;"&gt;que tendrá una bullet azul o roja en función de si el proyecto se ha podido construir de forma correcta o de si ha habido algún error.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;Los links&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Javadoc&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight:
      normal;"&gt;y&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;strong&gt;Latest Test Result&lt;/strong&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;nos permiten acceder respectivamente a la documentación del proyecto y a los informes de testing generados por los diferentes tests unitoarios (Junit).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;img src="http://ivanator.files.wordpress.com/2009/02/sbres-1233750052-10.jpg"
      style="text-align: left;" height="442" width="680" alt="" border="0" /&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;En este punto no estaría de más hacer una copia de seguridad del directorio&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;nbproject/private&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;y todo su contenido. El resto del workspace lo podéis regenerar al
      momento desde el repositorio, pero los cambios que habéis aplicado a los ficheros contenidos en el&lt;/span&gt;&lt;/span&gt; &lt;em&gt;&lt;span style="font-weight: normal;"&gt;private&lt;/span&gt;&lt;/em&gt; &lt;span style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;no los tenéis en ningún otro sitio. Puesto que a priori, como decía, podemos recuperar (casi) todo el workspace desde el Subversion, en según qué circunstancias podemos decidir borrarlo sin acordarnos de todas las
      modificaciones que hemos tenido que hacer manualmente.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;h2&gt;Conexión con el SVN&lt;/h2&gt; &lt;p&gt;Podríamos dejarlo aquí, pero uno de los requisitos que queríamos configurar es que el &lt;em&gt;job&lt;/em&gt; se construyera automáticamente cada vez que hiciéramos un &lt;em&gt;commit&lt;/em&gt; en el Subversion. Para conseguir este comportamiento tenemos que configurar el Subversion para que avise al Hudson cada vez que detecte esta situación.&lt;/p&gt;
      &lt;p&gt;Una de las características que tiene Hudson es que permite programar la construcción de un &lt;em&gt;job&lt;/em&gt; &lt;span style="font-style: normal;"&gt;haciendo una petición&lt;/span&gt; &lt;em&gt;GET&lt;/em&gt; &lt;span style="font-style: normal;"&gt;sobre una&lt;/span&gt; &lt;em&gt;url&lt;/em&gt; &lt;span style="font-style: normal;"&gt;asociada al proyecto en cuestión. Siguiendo con nuestro ejemplo dicha&lt;/span&gt; &lt;em&gt;url&lt;/em&gt; &lt;span style="font-style:
      normal;"&gt;sería&lt;/span&gt; &lt;em&gt;http://192.168.1.10:8180/hudson/job/Encuestas-2/build.&lt;/em&gt;&lt;/p&gt; &lt;p style="font-style: normal;"&gt;Por otro lado, el Subversion prevee una serie de eventos que pueden ser detectados y asociarles un script. Tenemos una serie de plantillas de los scripts y eventos que se pueden detectar en la carpeta &lt;em&gt;hooks&lt;/em&gt; del repositorio que estamos utilizando. Puesto que nosotros queremos activar la construcción del proyecto cada vez que
      hacemos un commit, el script que necesitamos codificar es uno que se llame &lt;em&gt;post-commit&lt;/em&gt;:&lt;/p&gt; &lt;pre&gt;svn@hargon:/srv/svn/Encuestas-2/hooks$ ls post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl svn@hargon:/srv/svn/Encuestas-2/hooks$ cp post-commit.tmpl post-commit svn@hargon:/srv/svn/Encuestas-2/hooks$ chmod ug+x post-commit&lt;/pre&gt; &lt;p&gt;El fichero que
      hemos copiado es una simple plantilla. Ahora la editaremos para que efectivamente haga una petición &lt;em&gt;GET&lt;/em&gt; &lt;span style="font-style: normal;"&gt;. Esto lo podemos hacer de múltiples maneras, aunque una muy fácil es utilizar Perl y algunas de sus bibliotecas (el gestor de paquetes&lt;/span&gt; &lt;em&gt;apt-get&lt;/em&gt; &lt;span style="font-style: normal;"&gt;o&lt;/span&gt; &lt;em&gt;Synaptic&lt;/em&gt; &lt;span style="font-style: normal;"&gt;nos permitirá&lt;/span&gt; &lt;span
      style="font-style: normal;"&gt;&lt;span style="font-weight: normal;"&gt;instalar todas las bibliotecas requeridas de una manera sencilla&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: normal;"&gt;). Una posible implementación de este script es la siguiente:&lt;/span&gt;&lt;/p&gt; &lt;pre style="font-style: normal;"&gt;#!/usr/bin/perl use LWP::Simple; use HTML::LinkExtor; my $content = get("http://192.168.1.10:8180/hudson/job/Encuestas-2/build");&lt;/pre&gt; &lt;p&gt;Comprobemos que el script
      funciona ejecutándolo desde la consola. Si todo va bien, al abrir el Hudson veremos que se ha lanzado una construcción del job.&lt;/p&gt; &lt;p&gt;El último paso es probar que la integración con el Subversion funciona correctamente. Simplemente tenemos que hacer un &lt;em&gt;commit&lt;/em&gt; &lt;span style="font-style: normal;"&gt;que modifique cualquier fichero y el Hudson debería construir el job.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;ACTUALIZACIÓN: &lt;a
      href="http://ivanator.wordpress.com/2009/02/07/cobertura-con-netbeans-y-hudson/"&gt;2ª Parte – Añadir métricas de cobertura de código de los tests unitarios&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-style: normal;"&gt;ACTUALIZACIÓN: &lt;a href="http://ivanator.wordpress.com/2009/03/05/metricas-de-calidad-con-netbeans-y-hudson/"&gt;3ª Parte – Métricas de calidad con NetBeans y Hudson&lt;/a&gt;&lt;br /&gt; &lt;/span&gt;&lt;/p&gt;&lt;/div&gt; Tagged: Agile, Ant, Hudson, Integración
      Continua, Java, JUnit, NetBeans, SVN, TDD &lt;a href="http://feeds.wordpress.com/1.0/gocomments/ivanator.wordpress.com/3/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/ivanator.wordpress.com/3/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/ivanator.wordpress.com/3/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/ivanator.wordpress.com/3/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/gostumble/ivanator.wordpress.com/3/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/ivanator.wordpress.com/3/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/ivanator.wordpress.com/3/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/ivanator.wordpress.com/3/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/ivanator.wordpress.com/3/"
      rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/ivanator.wordpress.com/3/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=ivanator.wordpress.com&amp;amp;blog=6092394&amp;amp;post=3&amp;amp;subd=ivanator&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 12 Jan 2009 18:24:45 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Unete al NetBeans Community Docs en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-2502583633923081907</guid>
      <link>http://avbravo.blogspot.com/2009/01/unete-al-netbeans-community-docs-en.html</link>
      <description>Este año 2009, es un año interesante de muchos cambios y actividades. A finales del 2008 el &lt;span style="font-weight: bold;"&gt;Programa Community Docs&lt;/span&gt; se ha hecho multilingue (Ingles, Alemán y Español)&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SWSz345T1pI/AAAAAAAAB5U/pWcDmK2k3LM/s320/community01.png" alt="" style="cursor: pointer; width: 320px; height: 160px;" border="0" id="BLOGGER_PHOTO_ID_5288549635186742930" /&gt;&lt;br /&gt;Entre algunos de los
      proyectos que podemos ampliar, serian la creación de documentos sobre NetBeans, y enlazarlos en el wiki de NetBeans Community Docs en Español, en este enlace. &lt;a href="http://wiki.netbeans.org/CommunityDocs_ES"&gt;http://wiki.netbeans.org/CommunityDocs_ES&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SWSz4NcLi2I/AAAAAAAAB5c/YMXkrrqx2Jw/s320/community02.png" alt="" style="cursor: pointer; width: 320px; height: 202px;" border="0"
      id="BLOGGER_PHOTO_ID_5288549640701709154" /&gt;&lt;br /&gt;&lt;br /&gt;Aquí puedes compartir con otros miembros de la comunidad tus conocimientos sobre Java y NetBeans, como lo han hecho Diego Silva y Luis Enrique LeFunes, eres bienvenido a la comunidad en español.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SWSz4c_h0XI/AAAAAAAAB5k/2O9dofkegH4/s320/community03.png" alt="" style="cursor: pointer; width: 320px; height: 104px;" border="0"
      id="BLOGGER_PHOTO_ID_5288549644876501362" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-2502583633923081907?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 07 Jan 2009 14:14:12 +0000</pubDate>
    </item>
    <item>
      <title>Le Funes » NetBeans: Generando el SerialVersionUID de una clase desde NetBeans</title>
      <guid isPermaLink="false">http://lefunes.wordpress.com/2009/01/05/generando-el-serialversionuid-de-una-clase-desde-netbeans/</guid>
      <link>http://lefunes.wordpress.com/2009/01/05/generando-el-serialversionuid-de-una-clase-desde-netbeans/</link>
      <description>Anteriormente vimos como generar el serialVersionUID de una clase mediante el comando serialver. Ahora veremos como generar el mismo valor desde NetBeans IDE haciendo uso del plugin serialVersionUID generator for netbeans 6.5. Instalación Ver actualización al final del post Para instalarlo tenemos que seguir unos simples pasos: Descargar el plugin según la versión del ...</description>
      <pubDate>Tue, 06 Jan 2009 00:15:02 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: T-shirt NB 10 años</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-4098225010205940563</guid>
      <link>http://avbravo.blogspot.com/2008/12/t-shirt-nb-10-aos.html</link>
      <description>Hace unos dias me llego el T-shirt conmemorativo de los 10 años de NetBeans.&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SU_D9oAMDLI/AAAAAAAAB5M/LYRyo_4wZ7I/s320/netbeans10.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SU_D8yb70eI/AAAAAAAAB5E/BkQAGoOXpIc/s320/nb1002.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-4098225010205940563?l=avbravo.blogspot.com"
      height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 22 Dec 2008 16:45:53 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 7.0 Milestone 1</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-5111697798669957542</guid>
      <link>http://avbravo.blogspot.com/2008/12/netbeans-70-milestone-1.html</link>
      <description>Ya esta disponible &lt;a href="http://bits.netbeans.org/netbeans/7.0/m1/"&gt;NetBeans 7.0 Milestone 1&lt;/a&gt;, sin duda una versión muy previa del IDE, pero sin lugar a dudas permite conocer algunas de las nuevas caracteristicas.&lt;br /&gt;Estas invitado a &lt;a href="http://bits.netbeans.org/netbeans/7.0/m1/"&gt;descargarla&lt;/a&gt;, e iniciar tus pruebas&lt;br /&gt;&lt;br /&gt;Aqui tenemos el&lt;span style="color: rgb(153, 0, 0);"&gt; RoadMap&lt;/span&gt;&lt;br /&gt;&lt;img
      src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SUxXcbD-95I/AAAAAAAAB4s/dyL2HxRQmAU/s320/roadmap.gif" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-5111697798669957542?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 20 Dec 2008 02:26:12 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Woodstock migra a ICEface</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7112653182492789529</guid>
      <link>http://avbravo.blogspot.com/2008/12/woodstock-migra-iceface.html</link>
      <description>&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SUmZd90PzzI/AAAAAAAAB4c/WvysPWoXDQA/s320/icefaces02.png" /&gt;&lt;br /&gt;Desde hace unos años, cuando se libero Java Studio Creator, el desarrollo de aplicaciones JSF poseia un diseñador visual, algunos recordaran los problemas iniciales de JSC, consumo excesivo de recursos, y algunos problemas con los componentes, esto fue rapidamente solucionado, luego llego la migración a NetBeans, mediante Visual Web Pack, un paquete de componentes
      que dotaba al IDE de un diseñador Visual para JSF, al cabo de un tiempo y de muchas mejoras, contamos con los componentes Woodstock, que ofrecian un conjunto de componentes muy utiles para nuestras aplicaciones.&lt;br /&gt;Recientemente el proyecto Woodstock, no seguira , y por lo tanto existen muy buenos recursos para continuar con el desarrollo de aplicaciones Web, una de ellas es ICEFaces.&lt;br /&gt;La comunidad NetBeans esta colaborando con la comunidad ICEFaces para facilitar la migración de
      Woodstock a ICEFaces.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;a href="http://www.icefaces.org/main/product/woodstock-migration.iface"&gt;Página de migración de Woodstock a ICEfaces&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Descargar el &lt;a href="http://www.icefaces.org/main/downloads/os-downloads.iface?category=NetBeans"&gt;Pluging ICEfaces&lt;/a&gt; desde ICEfaces.org, o desde &lt;b&gt;NetBeans Update Center&lt;/b&gt; seleccionando&lt;i&gt; Tools -&gt; Plugins&lt;/i&gt;
      desde el IDE NetBeans&lt;/li&gt;&lt;li&gt;Lea &lt;a href="http://www.netbeans.org/kb/docs/web/icefaces-migration-1.html"&gt;Guía de Woodstock a ICEfaces &lt;/a&gt;&lt;/li&gt;&lt;li&gt;Lea &lt;a href="http://www.icefaces.org/main/resources/woodstock-icefaces-mapping.iface"&gt;Matriz de migración de componentes Woodstock a ICEfaces &lt;/a&gt; &lt;/li&gt;&lt;li&gt;Unase a &lt;a href="http://www.icefaces.org/JForum/forums/list.page"&gt;Foro de migración de Woodstock a
      ICEfaces&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SUmY2GmBZOI/AAAAAAAAB4U/4flRbZn81oQ/s320/icefaces01.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-7112653182492789529?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 18 Dec 2008 00:38:49 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: JavaFX Picture Puzzle una aplicación JavaFX para Facebook</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/2008/12/09/javafx-puzzle-una-aplicacion-javafx-para-facebook/</guid>
      <link>http://cafelojano.wordpress.com/2008/12/09/javafx-puzzle-una-aplicacion-javafx-para-facebook/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;Via un RSS de Sun, me he enterado de la existencia de una aplicación Java desarrollada para Facbook, bueno hasta ahí ninguna novedad. Lo interesante es que ha sido desarrollada utilizando JavaFX.&lt;/p&gt; &lt;p&gt;Detallando un poco la aplicación: se trata de un Puzzle o rompecabezas, que se forma a partir de una imgén que es tomada de tú album de fotos. Para ver en funcionamiento dicha aplicación debes buscar JavaFX y el segundo link
      te mostrará ésta aplicación, luego sigues los pasos que se muestran y estarás disfrutando de ésta aplicación.&lt;/p&gt; &lt;p&gt;Ésta aplicación, podría ser la primera aplicación JavaFX, que se lanza a producción y que tiene miles de usuarios potenciales. Lamentablemente para quienes estamos utilizando Ubuntu y no tenemos instalado el jre6u10 esté mundo FX está aún lejano. (No instalo el jre6u10, porque no aparece en Synaptic)&lt;/p&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/301/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/301/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/301/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/301/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/301/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/301/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/301/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/301/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/301/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/301/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=301&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 02:02:06 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Conferencia NetBeans en Panamá</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-3218165121624647909</guid>
      <link>http://avbravo.blogspot.com/2008/12/conferencia-netbeans-en-panam.html</link>
      <description>Hace unas semanas participe de una conferencia en la Universidad Nacional de Panamá, donde hable sobre NetBeans en la educación, y mi amigo Eivar hablo sobre Ubuntu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/ST58J5yyEDI/AAAAAAAAB3w/cNJAgrgkOIE/s320/fotoactividad5.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/ST58I6hSeuI/AAAAAAAAB3o/WkpCjMBe960/s320/fotoactividad2.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://1.bp.blogspot.com/_fWhXbpnpdnc/ST58IS5zREI/AAAAAAAAB3g/028KgESdzyE/s320/fotoactividad1.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-3218165121624647909?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 09 Dec 2008 14:12:52 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: Sun lanza la plataforma JavaFX</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/2008/12/05/sun-lanza-la-plataforma-javafx/</guid>
      <link>http://cafelojano.wordpress.com/2008/12/05/sun-lanza-la-plataforma-javafx/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;p&gt;Revisando el &lt;a href="http://java.sun.com" target="_blank"&gt;sitio de Sun&lt;/a&gt; he podido ver cómo se hace el lanzamiento de la plataforma JavaFX, para la cual han creado un &lt;a href="http://javafx.com/" target="_blank"&gt;sitio&lt;/a&gt;, en el cual pueden ver vídeos, descargar el SDK, ver ejemplos y demos de lo que se puede hacer con ésta plataforma para la construcción de interfaces de aplicaciones.&lt;/p&gt;
      &lt;p&gt;Adicionalmente la gente de NetBeans anunció (y me enteré vía correo) que se puede actualizar la versión 6.5 para soportar JavaFX, aún no sé si con un editor visual o a puras sentencias.&lt;/p&gt; &lt;p&gt;Esperemos y veamos como se adopta ésta nueva tecnología.&lt;/p&gt; &lt;a href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/294/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/294/" alt="" border="0" /&gt;&lt;/a&gt;
      &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/294/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/294/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/294/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/294/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/294/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/294/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/294/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/294/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img
      src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=294&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 05 Dec 2008 21:29:47 +0000</pubDate>
    </item>
    <item>
      <title>Héctor: GOOGLEMAPS + PHP + NETBEANS</title>
      <guid isPermaLink="false">http://my.opera.com/hreyes/blog/2783013</guid>
      <link>http://my.opera.com/hreyes/blog/show.dml/2783013</link>
      <description>Tenia un proyecto para desarrollar un sitio, el cual termino muy bruscamente :( pero bueno ya ni modo.&lt;br /&gt;&lt;br /&gt;En este proyecto tenia la idea de hacer uso de los &lt;a href="http://maps.google.es/" target="_blank"&gt;google maps&lt;/a&gt; pero no me quede con las ganas de al menos hacer una pequeña implementacion, se requiere, de PHP, Apache, &lt;a href="http://www.netbeans.org/" target="_blank"&gt;netbeans&lt;/a&gt; y el &lt;a href="http://code.google.com/apis/maps/"
      target="_blank"&gt; API Key&lt;/a&gt; para poder hacer uso del google maps.&lt;br /&gt;&lt;br /&gt;Se inicia un nuevo proyecto y en "source folder" &lt;span style="color: darkred;"&gt;yo coloque&lt;/span&gt; la ruta al directorio de apache, despues indican la URL del proyecto (debe de ser "visible" por apache) con esto tendremos el proyecto creado, ahora viene lo mas complicado, Busca la pestaña de "Services" busca "getGoogleMap" y arrastralo dentro del &lt;span style="color:
      darkred;"&gt;&amp;lt;body&gt;&amp;lt;/body&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="imgcenter"&gt;&lt;img src="http://files.myopera.com/hreyes/blog/Pantallazo-2.png" alt="" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;html&gt; &amp;lt;head&gt; &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt; &amp;lt;title&gt;&amp;lt;/title&gt; &amp;lt;/head&gt; &amp;lt;body&gt; Colocar el "getGooogleMap" aqui &amp;lt;/body&gt; &amp;lt;/html&gt; &lt;/pre&gt;&lt;br /&gt;Despues
      extienden "&lt;span style="color: darkred;"&gt;Source Files"/org_netbeans_saas_google&lt;/span&gt;" en el estara el archivo "&lt;span style="color: darkred;"&gt;GoogleMapsServiceProfile.php&lt;/span&gt;" y en el colocan el APY Key, en la variable &lt;span style="color: green;"&gt;$apiKey&lt;/span&gt;.&lt;br /&gt;Unos pequeños cambios y se tendra esto:&lt;br /&gt; &lt;span class="imgcenter"&gt;&lt;img src="http://files.myopera.com/hreyes/blog/Pantallazo-3.png" alt="" /&gt;&lt;/span&gt; &lt;br /&gt;Que
      facil es con Netbeans</description>
      <pubDate>Thu, 04 Dec 2008 21:39:34 +0000</pubDate>
    </item>
    <item>
      <title>NETBEANS AN ADAPTIVE POWERFUL IDE: Nuevas características en MySQL 5.1</title>
      <guid isPermaLink="false">http://web.mac.com/atellezf/alejandro/NetBeans/9e6e559e-72ed-439e-bc63-29eb9de5e5ee</guid>
      <link>http://web.me.com/atellezf/alejandro/NetBeans/Entries/2008/11/28_Nuevas_caracter%C3%ADsticas_en_MySQL_5.1.html</link>
      <description>&lt;a href="http://web.me.com/atellezf/alejandro/NetBeans/Entries/2008/11/28_Nuevas_caracter%C3%ADsticas_en_MySQL_5.1_files/mysql_logo.jpg"&gt;&lt;img src="http://web.me.com/atellezf/alejandro/NetBeans/Media/mysql_logo_1.jpg" style="float: left; padding-right: 10px; padding-bottom: 10px; width: 357px; height: 176px;" /&gt;&lt;/a&gt;Particionamiento. Que permite distribuir porciones de tablas en el sistema de archivos, de acuero a reglas las cuales pueden ser establecidas cuando la tabla
      es creada. &lt;br /&gt;Replicación a nivel de fila. Originalmente se utilizan para la propagación de sentencias SQL dentro de un clúster de servidores de datos. &lt;br /&gt;API de plugins. Ahora que está de moda el hacer extensibles nuestras aplicaciones por medio de módulos o plug-ins, esta capacidad es ahora introducida a MySQL para permitir la carga de componentes al motor de la base de datos sin necesidad de reiniciarlo. &lt;br /&gt;Agenda de eventos. Tal como los servicios cron en UNIX, ahora es
      posible disparar sentencias almacenadas de acuerdo a un evento originado por tiempo, de esta manera se pueden ejecutar tareas diariamente, mensual, anual, por las noches, por las mañanas, o el momento de configurarlas. &lt;br /&gt;Tablas de log. Ademas de tener la posibilidad de que el servidor lleve un registro en archivos log de las sentencias ejecutadas, tenemos la características de definir tablas log para optimizar su búsqueda y análisis.&lt;br /&gt;&lt;br /&gt;Esto por solo mencionar algunas de
      sus recientes características, pero no están por de más, las mejoras realizadas al módulo de clúster, backup de espacios de tablas, funciones XML utilizando XPath, (aunque para mi gusto le faltó soporte para XQuery).&lt;br /&gt;&lt;br /&gt;Muchas felicidades al equipo de MySQL (ahora división de Sun) por esta nueva liberación que esperabamos con ansias.</description>
      <pubDate>Sat, 29 Nov 2008 04:19:44 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Visita de Bruno Souza en Panamá</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-6749841380306783822</guid>
      <link>http://avbravo.blogspot.com/2008/11/visita-de-bruno-souza-en-panam.html</link>
      <description>Tuvimos la visita en Panamá de un gran amigo y figura muy importante de Sun Microsystem, Bruno Souza, quien asistio a una serie de reuniones y conferencias para hablar sobre Java, NetBeans, Open Source.&lt;br /&gt;&lt;br /&gt;Algunas Fotos&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SSoGGQ8764I/AAAAAAAAB3I/Z_d3XC_kttU/s320/bruno.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SSoEyHle5oI/AAAAAAAAB24/p6gvjqSEYcQ/s320/arisbruno.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SSoFgFIQErI/AAAAAAAAB3A/ay7ywhQKfJU/s320/grupo.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;Asistentes a las conferencias en Chitre&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SSoGmy2rOzI/AAAAAAAAB3Q/dWOQ--toAiU/s320/asistentes.JPG" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SSoHpTAaS8I/AAAAAAAAB3Y/e2PVOk-ui4w/s320/franciscojoseaida.JPG" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-6749841380306783822?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 24 Nov 2008 02:10:58 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Bruno Souza en Panama</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-3667088296936798061</guid>
      <link>http://avbravo.blogspot.com/2008/11/bruno-souza-en-panama.html</link>
      <description>&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SR24vcnSI1I/AAAAAAAAB2o/jwsn6akPuDU/s320/9615.jpeg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pronto tendremos la visita de Bruno Souza en Panamá.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; Bruno Souza es Director de las Comunidades Open Source en Sun Microsystems, donde se centra en el crecimiento y el apoyo de todo el mundo al movimiento de código abierto. Conocido como el brasileño "JavaMan", Bruno es un evangelista de Java y de open source
      que ha sido el fomento de la mayoría de las comunidades en su carrera profesional.&lt;br /&gt;&lt;br /&gt; En Sun, Bruno era el Administrador de la Comunidad NetBeans y también apoya los grupos de usuarios OpenSolaris . Como fundador y coordinador de SouJava (la Sociedad de Usuarios de Java) que trabajan con Java y muchos grupos de usuarios, Bruno a ayudado a impulsar el crecimiento de la Comunidad de Grupos de Usuarios en todo el mundo.&lt;br /&gt;&lt;br /&gt; Es un desarrollador de Java desde los
      primeros días de la tecnología Java, Bruno participó en algunos de los mayores proyectos de Java en Brasil y tiene cientos de presentaciones de nivel internacional.&lt;br /&gt;&lt;br /&gt; Bruno es también Director de la Open Source Initiative donde se discute la evolución del movimiento open source. Cuando no está delante de un ordenador, Bruno disfruta de su tiempo con su familia en un pequeño escondite cerca de Sao Paulo.&lt;br /&gt;&lt;br /&gt;&lt;img
      src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SR25H1O7wNI/AAAAAAAAB2w/jPsonBMcUq4/s320/garland_logo.png" /&gt;&lt;br /&gt; Open Source InitiativeOpen Source Initiative.&lt;br /&gt;&lt;br /&gt; El OSI esta activamente involucrado en construir comunidades Open Source y en la educación. Los miembros del OSI frecuentemente viajan por todo el mundo dictando conferencias sobre el Open Source, asistiendo a eventos y reuniones con gobiernos, ejecutivos de entidades publicas y privadas acerca del uso de la
      tecnología, licencias, las ventajas de este modelo para la economía y la educación.&lt;br /&gt;&lt;br /&gt;Bruno se ha reunido con importantes empresas y gobiernos a nivel mundial, recientemente estuvo reunido con el presidente Lula Da Silva en Brasil , conversando sobre este modelo.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-3667088296936798061?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 24 Nov 2008 02:10:30 +0000</pubDate>
    </item>
    <item>
      <title>Le Funes » NetBeans: Agregando tareas al script de ANT en un proyecto de NetBeans</title>
      <guid isPermaLink="false">http://lefunes.wordpress.com/2008/11/06/agregando-tareas-al-script-de-ant-en-un-proyecto-de-netbeans/</guid>
      <link>http://lefunes.wordpress.com/2008/11/06/agregando-tareas-al-script-de-ant-en-un-proyecto-de-netbeans/</link>
      <description>Si queremos agregar tareas adicionales al script de ANT que NetBeans genera para un proyecto ,por ejemplo para actualizar archivos, generar ejecutables, etc. , primero que nada deberemos entender donde NetBeans organiza las tareas de compilación, empaquetamiento, generación de javadoc, etc. NetBeans genera dos archivos de ANT: nbproject/build-impl.xml build.xml Podremos verlos desde la ...</description>
      <pubDate>Sat, 22 Nov 2008 08:14:23 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Nuevo Miembro de la comunidad NetBeans en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-8129147805359055767</guid>
      <link>http://avbravo.blogspot.com/2008/11/nuevo-miembro-de-la-comunidad-netbeans.html</link>
      <description>&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQ3bG8qRUEI/AAAAAAAAB2g/54P5w666JjQ/s320/AlbertNetbeans.jpg" /&gt;&lt;br /&gt;Sin duda, la comunidad NetBeans en Español crece constantemente, y se mantiene colaborando para unir a muchos paises de habla hispana, y ofrecerles una herramienta y documentación en su idioma.&lt;br /&gt;Presentamos a Albert , el hijo de nuestro amigo Amaury, quien es un gran colaborador.&lt;br /&gt;&lt;br /&gt;Me comenta Amaury que Albert seguira sus pasos
      desde Cuba, colaborando con la traducción de NetBeans y aportando a la comunidad.&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/11140295-8129147805359055767?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 02 Nov 2008 17:00:17 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.5 RC2 en Español en Ubuntu 8.10</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-1491994914482972841</guid>
      <link>http://avbravo.blogspot.com/2008/10/netbeans-65-rc2-en-espaol-en-ubuntu-810.html</link>
      <description>&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQvDid05xxI/AAAAAAAAB2Q/I2fbEbtxuW4/s320/figura02.png" /&gt;&lt;br /&gt;Ayer fue el lanzamiento de Ubuntu 8.10 , coincidencia con la liberación de NetBeans 6.5 RC2 en español, asi que procedi a instalarla:&lt;br /&gt;Proceso de instalación&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQu4tJvSR-I/AAAAAAAAB1w/O_e7mQDbzF0/s320/figura01.png" /&gt;&lt;br /&gt;El IDE en ejecución&lt;br /&gt;&lt;img
      src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQvJqFJyyUI/AAAAAAAAB2Y/VNFSvYpU8QQ/s320/figura03.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://blogger.googleusercontent.com/tracker/11140295-1491994914482972841?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 01 Nov 2008 03:29:08 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans 6.5 RC2 en Español</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-416241420601581935</guid>
      <link>http://avbravo.blogspot.com/2008/10/netbeans-rc2-en-espaol_29.html</link>
      <description>Ya esta disponible para descarga NetBeans 6.5 RC2 en Español.&lt;br /&gt;Anuncio en el blog de &lt;a href="http://blogs.sun.com/katakai/entry/netbeans_6_5_rc2_community"&gt;Masaki&lt;/a&gt;&lt;br /&gt;Sin duda un gran esfuerzo de la comunidad hispana.&lt;br /&gt;Los módulos disponibles son platform, javase.&lt;br /&gt;Los demás se descargaran desde el Update Center a medida que se terminen.&lt;br /&gt;Página de descarga &lt;br /&gt;&lt;a
      href="http://bits.netbeans.org/netbeans/6.5/community/rc2/ml/"&gt;http://bits.netbeans.org/netbeans/6.5/community/rc2/ml/&lt;/a&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SQjtpNZTEMI/AAAAAAAAB0Q/MPG63We8EXo/s320/figura00.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Seleccionar los paquetes&lt;br /&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SQnOzbqkYcI/AAAAAAAAB04/Kj2EMPtyolg/s320/figura06.png" /&gt;&lt;br /&gt;&lt;br /&gt;Proceso
      instalación&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_fWhXbpnpdnc/SQjtpH4evaI/AAAAAAAAB0Y/3duN61ouG_8/s320/figura01.png" /&gt;&lt;br /&gt;&lt;br /&gt;Terminación de la instalación&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SQnSEZlmOPI/AAAAAAAAB1A/6TX4HOIV8nU/s320/figura010.png" /&gt;&lt;br /&gt;&lt;br /&gt;Iniciando el IDE&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQnW3EjoLPI/AAAAAAAAB1I/B6ybPdjWubI/s320/figura11.png" /&gt;&lt;br /&gt;&lt;br /&gt;IDE
      &lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_fWhXbpnpdnc/SQnYM2SDCKI/AAAAAAAAB1Q/u9-kSG1ZDEM/s320/figura20.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://blogger.googleusercontent.com/tracker/11140295-416241420601581935?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 30 Oct 2008 16:00:44 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Project WebSynergy</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-7509678802219177820</guid>
      <link>http://avbravo.blogspot.com/2008/10/project-websynergy.html</link>
      <description>&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQiJOGQpaII/AAAAAAAABz4/wGw8eIMbG3A/s320/figura06.png" /&gt;&lt;br /&gt;&lt;br /&gt;Es un interesante proyecto de Sun, que puedes probar basado en Liferay Portal Server, GlassFish v3, y MySQL. &lt;br /&gt;&lt;br /&gt;&lt;a href="https://portal.dev.java.net/public/GetWebSynergy.html"&gt;Página Oficial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SQiJNnxWDnI/AAAAAAAABzw/ZmTNB2Sxues/s320/figura05.png"
      /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/SpanishTranslationTutorialesWebSinergy"&gt;Un tutorial sencillo &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://blogger.googleusercontent.com/tracker/11140295-7509678802219177820?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 29 Oct 2008 16:04:14 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Prueba la traducción de NetBeans 6.5</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-5273493821031323076</guid>
      <link>http://avbravo.blogspot.com/2008/10/prueba-la-traduccin-de-netbeans-65.html</link>
      <description>&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SQDK081eiQI/AAAAAAAABzo/GkqeorX02qM/s320/traduccion.png" /&gt;&lt;br /&gt;Pronto estara disponible la versión 6.5 de NetBeans, te invitamos a realizar las pruebas necesarias, aqui encontras un tutorial de los pasos para relizarlo.&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/AvbravotutorialLocalizaciones"&gt;http://wiki.netbeans.org/AvbravotutorialLocalizaciones&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a
      href="http://wiki.netbeans.org/SpanishTranslationerroresnb65_es"&gt;Pueden reportar los errores en el wiki.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://blogger.googleusercontent.com/tracker/11140295-5273493821031323076?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 23 Oct 2008 19:05:20 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans IDE 6.5 RC1 Download Started</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-4359027934187739086</guid>
      <link>http://avbravo.blogspot.com/2008/10/netbeans-ide-65-rc1-download-started.html</link>
      <description>Ya esta disponible para su descarga la versión &lt;a href="http://download.netbeans.org/netbeans/6.5/rc/"&gt;NetBeans IDE 6.5 RC1&lt;/a&gt;&lt;br /&gt;puedes &lt;a href="http://download.netbeans.org/netbeans/6.5/rc/"&gt;descargarla desde este sitio.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://blogger.googleusercontent.com/tracker/11140295-4359027934187739086?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 21 Oct 2008 15:58:54 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Community Docs</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-402307861855989924</guid>
      <link>http://avbravo.blogspot.com/2008/10/community-docs.html</link>
      <description>Contribuye con los tutoriales en &lt;a href="http://wiki.netbeans.org/CommunityDocs"&gt;Community Docs.&lt;/a&gt;&lt;br /&gt;Es importante aportar con documentos de manera que ayuden a otras personas.&lt;br /&gt;La comunidad es un gran lugar donde tenemos acceso a mucha información valiosa, pero es más importante lo que puedas contribuir en base a tus conocimientos y experiencias.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/CommunityDocs"&gt;Wiki Community
      Docs&lt;/a&gt;&lt;br /&gt;blog&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nb-community-docs.blogspot.com/"&gt;NetBeans Community Docs Blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://res1.blogblog.com/tracker/11140295-402307861855989924?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 20 Oct 2008 15:02:20 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: Celebrando los 10 años de NetBeans</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-3282109837617371664</guid>
      <link>http://avbravo.blogspot.com/2008/10/celebrando-los-10-aos-de-netbeans.html</link>
      <description>&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SPyYX3YNL2I/AAAAAAAABzY/BJCkR72eC3U/s320/logo-10y-nb-outline-180.png" /&gt;&lt;br /&gt;&lt;a href="http://www.netbeans.org/birthday/"&gt;Celebrating 10 Years of NetBeans!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Puedes participar del Decatlón &lt;br /&gt;&lt;a href="http://www.netbeans.org/birthday/decathlon.html"&gt;&lt;br /&gt;Enter the NetBeans Decathlon!&lt;/a&gt;&lt;br /&gt;&lt;img
      src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SPyZCo1rRgI/AAAAAAAABzg/lo5jhtHcaHk/s320/birthday-tshirt-large.png" style="cursor: pointer; cursor: hand;" /&gt;&lt;br /&gt;Las reglas son sencillas:&lt;br /&gt;. 10 events, each worth a different amount of points.&lt;br /&gt;.Complete any number of events that tally up to 50 points.&lt;br /&gt;.IMPORTANT: Keep track of links to blog entries, forums, and so on. You will need to submit these links in the Decathlon Entry Form.&lt;br /&gt;. The first 300
      participants to complete the Decathlon form will be eligible to receive a limited edition NetBeans 10th Anniversary T-shirt.&lt;br /&gt;. There is no judging, so be creative, reminisce, and have fun!&lt;br /&gt;. The Decathlon ends on Monday, October 27th, 2008.&lt;div class="blogger-post-footer"&gt;&lt;img src="http://res1.blogblog.com/tracker/11140295-3282109837617371664?l=avbravo.blogspot.com" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 20 Oct 2008 14:48:13 +0000</pubDate>
    </item>
    <item>
      <title>Programa en Java y disfruta de un café lojano » Java – Netbeans: Movimiento de una cámara de vigilancia desde un celular</title>
      <guid isPermaLink="false">http://cafelojano.wordpress.com/?p=284</guid>
      <link>http://cafelojano.wordpress.com/2008/10/16/movimiento-de-una-camara-de-vigilancia-desde-un-celular/</link>
      <description>&lt;div class="snap_preview"&gt;&lt;br /&gt;&lt;div class="mceTemp mceIEcenter"&gt;&lt;a href="http://cafelojano.files.wordpress.com/2008/10/vascom.png"&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt; &lt;dl class="wp-caption aligncenter"&gt; &lt;dt class="wp-caption-dt"&gt;&lt;a href="http://cafelojano.files.wordpress.com/2008/10/esquema_proyecto.png"&gt;&lt;img src="http://cafelojano.files.wordpress.com/2008/10/esquema_proyecto.png?w=332&amp;amp;h=242" title="esquema_proyecto" height="242"
      width="332" alt="esquema del proyecto" class="size-medium wp-image-285" /&gt;&lt;/a&gt;&lt;/dt&gt; &lt;dd class="wp-caption-dd"&gt;esquema del proyecto&lt;/dd&gt; &lt;/dl&gt; &lt;/div&gt; &lt;div style="text-align: left;" class="mceTemp mceIEcenter"&gt; &lt;p class="MsoNormal"&gt;&lt;span&gt;Bueno durante esta secuencia de tutoriales que desarrollaremos en este presente mes les iremos comentando un proyecto que desarrollamos para la materia de ARQUITECTURA DE COMPUTADORES, el tema del mismo fue
      control de una “&lt;strong&gt;Cámara de vigilancia manipulado desde un celular”.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span&gt;Para el desarrollo del presente proyecto comenzaremos por una descripción breve del mismo, a continuación daremos un poco de marco teórico, aunque un poco aburrida es muy necesaria para el desarrollo del mismo.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p
      class="MsoNormal"&gt;&lt;strong&gt;&lt;span&gt;Descripción:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Vale mencionar que en sus principios JAVA fue diseñado para la manipulación de componentes electrónicos. Partiendo de estos antecedentes hemos creído conveniente utilizar esta plataforma para realizar el software para este proyecto. &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Con el presente tema pretendemos tener una
      cámara de video, la cual nos va estar trasmitiendo en tiempo real lo que está captando. &lt;strong&gt; &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Dicha transmisión será visualizada en un computador central. Desde este computador los usuarios podrán cambiar el ángulo de visualización de la cámara para tener un mejor panorama del objetivo. A este servicio de movimiento de la cámara se lo pretende migrar a una aplicación de celular. El usuario se conecta
      desde el celular al computador, y podrá mover el ángulo de la cámara.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Debido a que por las noches la cámara no se puede visualizar bien el objetivo, se pretende, dependiendo el tiempo contar con un sistema de pretendido automático de las luces del lugar en el cual se encuentra la cámara.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Vale aclarar que en la primera parte del
      proyecto se va conectar a un computador y en una segunda fase lo migraremos para controlarlo desde un celular.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Para el movimiento de la cámara se construirá una base metálica a la cual le adaptaremos dos cerbos; para tener una manipulación tanto en el eje de la “X” y otro en las “Y”.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span lang="ES-EC"&gt;Detalles Técnicos:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;-&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;La conexión desde la cámara hacia el computador se lo realizara a través de un &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;cable serial.&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;-&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;La transmisión del video se lo
      realizara a través de un cable USB, propio de la cámara.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;-&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Además para el control del movimiento vamos a utilizar un micro controlador, el cual interpretara las ordenes desde el computador hacia los motores de la cámara los cuales están encargados de del movimiento de la cámara. Además este controlador esta encardo de la iluminación de la
      cámara.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span lang="ES-EC"&gt;Objetivos de este post: &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span lang="ES-EC"&gt;Construir un instrumento electrónico que nos permite rotar la cámara, y además permita ser manipulado desde la computadora.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span
      lang="ES-EC"&gt;Desarrollar un software para la manipulación de la cámara (rotación de la cámara).&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span lang="ES-EC"&gt;Además este software permitirá visualizar lo que este transmitiendo lo que capta la cámara.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span lang="ES-EC"&gt;&lt;span&gt; &lt;/span&gt;El mismo software deberá receptar las conexiones
      del celular que se conecte a la maquina central.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span lang="ES-EC"&gt;El software antes mencionado dotarlo de un servicio de mail, para la notificación de alertas a los usuarios.&lt;em&gt; &lt;/em&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span&gt;ü&lt;/span&gt; &lt;span lang="ES-EC"&gt;Construir la parte de electrónica para el prendido de luces desde el computador.
      &lt;em&gt; &lt;/em&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span lang="ES-EC"&gt;Tecnología que se utilizara:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Para el desarrollo del software que estará en la maquina central se lo construirá en la plataforma JAVA. &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Para la captación del video desde la cámara se utilizara un api de JAVA llamado
      “&lt;strong&gt;JavaTM Media Framework 2.1.1e”. &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Además utilizaremos una librería para el &lt;strong&gt;Sistema Operativo Windows Xp, &lt;/strong&gt;la misma que nos permite transmitir datos atreves de un cable serial o paralelo, el nombre de librería es “&lt;strong&gt;COMM.JAR&lt;/strong&gt;”. &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Para la programación del micro controlador
      se utilizara el siguiente Software: &lt;strong&gt;“Vascom-Avr”&lt;/strong&gt;. En su versión: &lt;strong&gt;&lt;span&gt; &lt;/span&gt;&lt;span style="text-decoration: underline;"&gt;1.11.9.1 document build 20&lt;/span&gt;&lt;/strong&gt;.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Un vistazo de este software:&lt;/span&gt;&lt;/p&gt; &lt;/div&gt; &lt;p style="text-align: center;"&gt;&lt;a href="http://cafelojano.files.wordpress.com/2008/10/vascom.png"
      target="_blank"&gt;&lt;img src="http://cafelojano.files.wordpress.com/2008/10/vascom.png?w=300&amp;amp;h=225" title="vascom" height="225" width="300" alt="" class="size-medium wp-image-286 aligncenter" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;En el presente tutorial pondremos algunas referencias sobre el manejo de este software.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Para la simulación del circuito electrónico, utilizaremos el
      siguiente software:&lt;span&gt; &lt;/span&gt;“Proteus versión 7”.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Un vistazo de este software:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt; &lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;&lt;a href="http://cafelojano.files.wordpress.com/2008/10/proteus.png"&gt;&lt;img src="http://cafelojano.files.wordpress.com/2008/10/proteus.png?w=300&amp;amp;h=225" title="proteus" height="225" width="300" alt=""
      class="size-medium wp-image-287 aligncenter" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoNormal"&gt;&lt;span lang="ES-EC"&gt;Los elementos que componen nuestro circuito para la manipulación son:&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Micro controlador 16PU&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family:
      Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;6 Leds &lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;1 Led de alta luminosidad&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Capacitores de 1
      Microfaradio&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;4 Resistencias de 370&lt;span&gt; &lt;/span&gt;ohmios&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Max 232 para trabajar con el puerto serial&lt;/span&gt;&lt;/p&gt; &lt;p
      class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Pulsadores para resetear y enviar mensaje a la computadora&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol;"&gt;&lt;span&gt;·&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Cable serial&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span lang="ES-EC"&gt;&lt;/span&gt;&lt;/p&gt;
      &lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;span lang="ES-EC"&gt;División de este articulo:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;1.&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Definir tecnologías para el presente proyecto.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;2.&lt;/span&gt; &lt;/span&gt;&lt;span
      lang="ES-EC"&gt;Desarrollar una simulación del dispositivo.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;3.&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Construir el software para receptar el video en la computadora.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;4.&lt;/span&gt; &lt;/span&gt;&lt;span lang="ES-EC"&gt;Construir el
      software para manipulación de hardware del circuito electrónico para el movimiento.&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span lang="ES-EC"&gt;&lt;span&gt;5.&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-EC"&gt;Construcción de software para el celular.&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span
      lang="ES-EC"&gt;&lt;span&gt;6.&lt;/span&gt;&lt;/span&gt;&lt;span lang="ES-EC"&gt;Prueba en un servidor para manipulación desde la web (incluye el servicio mail).&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt; &lt;/p&gt;&lt;p&gt;&lt;span lang="ES-EC"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="MsoListParagraphCxSpLast"&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p
      class="MsoListParagraphCxSpLast"&gt; &lt;/p&gt;&lt;p class="MsoListParagraphCxSpLast"&gt; &lt;a href="http://feeds.wordpress.com/1.0/gocomments/cafelojano.wordpress.com/284/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/comments/cafelojano.wordpress.com/284/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godelicious/cafelojano.wordpress.com/284/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/delicious/cafelojano.wordpress.com/284/"
      alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/gostumble/cafelojano.wordpress.com/284/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/stumble/cafelojano.wordpress.com/284/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.wordpress.com/1.0/godigg/cafelojano.wordpress.com/284/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/digg/cafelojano.wordpress.com/284/" alt="" border="0" /&gt;&lt;/a&gt; &lt;a
      href="http://feeds.wordpress.com/1.0/goreddit/cafelojano.wordpress.com/284/" rel="nofollow"&gt;&lt;img src="http://feeds.wordpress.com/1.0/reddit/cafelojano.wordpress.com/284/" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://stats.wordpress.com/b.gif?host=cafelojano.wordpress.com&amp;amp;blog=533426&amp;amp;post=284&amp;amp;subd=cafelojano&amp;amp;ref=&amp;amp;feed=1" alt="" border="0" /&gt;&lt;/p&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 17 Oct 2008 00:41:33 +0000</pubDate>
    </item>
    <item>
      <title>Avbravo: NetBeans Innovators Grant Contest</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-11140295.post-4599113536445694667</guid>
      <link>http://avbravo.blogspot.com/2008/10/netbeans-innovators-grant-contest.html</link>
      <description>Hace unos dias se realizo el anuncio oficial de la culminación de&lt;a href="http://www.netbeans.org/grant/"&gt;NetBeans Innovators Grant Contest&lt;/a&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_fWhXbpnpdnc/SOZQrOSvfQI/AAAAAAAABV0/QnQwCbFQTHw/s320/Screeny+2008.10.03.11.04.11.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;En este caso cree un tutorial de Cube°n, un buen proyecto que nos permite gestionar nuestros proyectos en JIRA o localmente.&lt;br /&gt;&lt;a
      href="http://code.google.com/p/cubeon"&gt;Sitio oficial del proyecto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/AvbravotutorialCuben"&gt;Tutorial Usando Cube°n&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_fWhXbpnpdnc/SOZRoii4ujI/AAAAAAAABV8/vo3eY38PvzM/s320/006tarea.png" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="http://res1.blogblog.com/tracker/11140295-4599113536445694667?l=avbravo.blogspot.com" height="1" width="1"
      /&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 03 Oct 2008 17:10:09 +0000</pubDate>
    </item>
    <item>
      <title>{ Radamanthys } » NetBeans: Sacandole el jugo a JCalendar</title>
      <guid isPermaLink="false">http://radamanthys.homelinux.org/?p=75</guid>
      <link>http://radamanthys.homelinux.org/?p=75</link>
      <description>&lt;div align="center"&gt;&lt;a href="http://radamanthys.homelinux.org/wordpress/images/jc0.png"&gt;&lt;img src="http://radamanthys.homelinux.org/wordpress/images/thumbnail/tb_jc0.png" alt="jcalendar" border="0" title="jcalendar" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Una vez agregado JCalendar al classpath del proyecto(no lo voy a utilizar desde el diseñador esta vez xD) me he puesto a trastear con el y utilizarlo en una aplicacion donde el usuario debe llenar un campo de texto de un
      formulario respetando un formato para la fecha, pero el usuario no debera editar directamente este campo si no que seleccionara la fecha presionando un boton que cargara una ventana tipo &lt;em&gt;pop up&lt;/em&gt;, en la cual vera un calendario y un boton de aceptar(que al ser presionado, guardara los datos de la fecha elejida y que posteriormente podemos obtener mediante los metodos que provee la clase(una que me he creado), posteriormente cerrara la ventana).&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div
      class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="java"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;/* * Clase, uso de JCalendar como una ventana tipo Pop Up * Copyright (C) 2008 Moises Brenes, http://mbrenes.blogspot.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This
      program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Any non-GPL usage of this software or parts of this
      software is strictly * forbidden. */&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;package&lt;/span&gt; datepicker; &#160; &lt;span style="color: #808080; font-style: italic;"&gt;/** * * @author shakka */&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; CDatePicker &lt;span style="color: #000000; font-weight: bold;"&gt;extends&lt;/span&gt; javax.&lt;span
      style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JDialog&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; com.&lt;span style="color: #006600;"&gt;toedter&lt;/span&gt;.&lt;span style="color: #006600;"&gt;calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;JCalendar&lt;/span&gt; jCal; &lt;span style="color: #000000; font-weight:
      bold;"&gt;private&lt;/span&gt; javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JPanel&lt;/span&gt; pnlDatePicker; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JButton&lt;/span&gt; btnAccept; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color:
      #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; year; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; month; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; day; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; CDatePicker&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Frame&lt;/span&gt; parent&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;super&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;parent, &lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;)&lt;/span&gt;; &#160; initComponents&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; initExtra&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;static&lt;/span&gt; &lt;span style="color:
      #993333;"&gt;void&lt;/span&gt; main&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; args&lt;span style="color: #66cc66;"&gt;[&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;]&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; java.&lt;span style="color: #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight:
      bold;"&gt;EventQueue&lt;/span&gt;.&lt;span style="color: #006600;"&gt;invokeLater&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;Runnable&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight:
      bold;"&gt;public&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; run&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; CDatePicker dialog = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; CDatePicker&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; javax.&lt;span style="color:
      #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JFrame&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; dialog.&lt;span style="color: #006600;"&gt;addWindowListener&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; java.&lt;span style="color:
      #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #006600;"&gt;event&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;WindowAdapter&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; windowClosing&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #006600;"&gt;event&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;WindowEvent&lt;/span&gt; e&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;System&lt;/span&gt;.&lt;span style="color: #006600;"&gt;exit&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; dialog.&lt;span style="color: #006600;"&gt;setVisible&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; initComponents&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span
      style="color: #66cc66;"&gt;{&lt;/span&gt; setDefaultCloseOperation&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;WindowConstants&lt;/span&gt;.&lt;span style="color: #006600;"&gt;DISPOSE_ON_CLOSE&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; setSize&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;290&lt;/span&gt;,&lt;span
      style="color: #cc66cc;"&gt;275&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; setModal&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; setTitle&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"Calendario."&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; setResizable&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; setLayout&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; &lt;span style="color: #808080; font-style: italic;"&gt;/* Centrar pantalla */&lt;/span&gt; setLocationRelativeTo&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; pnlDatePicker = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JPanel&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; pnlDatePicker.&lt;span
      style="color: #006600;"&gt;setLayout&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; pnlDatePicker.&lt;span style="color: #006600;"&gt;setBorder&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;BorderFactory&lt;/span&gt;.&lt;span
      style="color: #006600;"&gt;createEtchedBorder&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; pnlDatePicker.&lt;span style="color: #006600;"&gt;setBounds&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;278&lt;/span&gt;, &lt;span
      style="color: #cc66cc;"&gt;250&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; add&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;pnlDatePicker&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; jCal = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; com.&lt;span style="color: #006600;"&gt;toedter&lt;/span&gt;.&lt;span style="color: #006600;"&gt;calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;JCalendar&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; jCal.&lt;span style="color: #006600;"&gt;setWeekOfYearVisible&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; jCal.&lt;span style="color: #006600;"&gt;setBounds&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;3&lt;/span&gt;, &lt;span
      style="color: #cc66cc;"&gt;2&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;271&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;204&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; pnlDatePicker.&lt;span style="color: #006600;"&gt;add&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; btnAccept = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; javax.&lt;span style="color:
      #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JButton&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; btnAccept.&lt;span style="color: #006600;"&gt;setText&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;"Aceptar"&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; btnAccept.&lt;span style="color:
      #006600;"&gt;setMnemonic&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'A'&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; btnAccept.&lt;span style="color: #006600;"&gt;setBounds&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;3&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;206&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;271&lt;/span&gt;, &lt;span style="color:
      #cc66cc;"&gt;32&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; pnlDatePicker.&lt;span style="color: #006600;"&gt;add&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;btnAccept&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; btnAccept.&lt;span style="color: #006600;"&gt;addActionListener&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; java.&lt;span style="color:
      #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #006600;"&gt;event&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;ActionListener&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; actionPerformed&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #006600;"&gt;event&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;ActionEvent&lt;/span&gt; ev&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; btnAccept_Click&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span
      style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; initExtra&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; year = &lt;span style="color: #000000; font-weight:
      bold;"&gt;new&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;""&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; month = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color:
      #ff0000;"&gt;""&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; day = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;""&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight:
      bold;"&gt;public&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; getYear&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; year; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color:
      #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt; getMonth&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; month; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #aaaadd; font-weight: bold;"&gt;String&lt;/span&gt;
      getDay&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; day; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; btnAccept_Click&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span
      style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; year = &lt;span style="color: #aaaadd; font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color:
      #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;util&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;YEAR&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; month = &lt;span style="color: #aaaadd; font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color:
      #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;util&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span
      style="color: #006600;"&gt;MONTH&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; + &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; day = &lt;span style="color: #aaaadd; font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;util&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;DATE&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; dispose&lt;span
      style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;En este metodo de la clase, en la version que utilizo en la vida real hago uso de una clase propia(CPadding) que rellena con ceros a la izquierda los datos miembro de la clase, ya que lo ocupo de esa manera.&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div
      class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="java"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; btnAccept_Click&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; CPadding yearPad = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; CPadding&lt;span style="color:
      #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color:
      #006600;"&gt;util&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;YEAR&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; CPadding monthPad = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; CPadding&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #aaaadd;
      font-weight: bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;util&lt;/span&gt;.&lt;span style="color:
      #aaaadd; font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;MONTH&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; + &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; CPadding dayPad = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; CPadding&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #aaaadd; font-weight:
      bold;"&gt;Integer&lt;/span&gt;.&lt;span style="color: #006600;"&gt;toString&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;jCal.&lt;span style="color: #006600;"&gt;getCalendar&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;get&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;util&lt;/span&gt;.&lt;span style="color: #aaaadd;
      font-weight: bold;"&gt;Calendar&lt;/span&gt;.&lt;span style="color: #006600;"&gt;DATE&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; year = yearPad.&lt;span style="color: #006600;"&gt;padLeft&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'0'&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;4&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;)&lt;/span&gt;; month = monthPad.&lt;span style="color: #006600;"&gt;padLeft&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'0'&lt;/span&gt;, &lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; day = dayPad.&lt;span style="color: #006600;"&gt;padLeft&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'0'&lt;/span&gt;, &lt;span style="color:
      #cc66cc;"&gt;2&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &#160; dispose&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Ya en el formulario, el boton que cargara la ventana que contiene el bean calendario lo hara mediante el evento tipico de este componente(click).&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div
      class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="java"&gt;&lt;span style="color: #808080; font-style: italic;"&gt;/* Evento del boton */&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #993333;"&gt;void&lt;/span&gt; btnSel004ActionPerformed&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;java.&lt;span style="color: #006600;"&gt;awt&lt;/span&gt;.&lt;span style="color: #006600;"&gt;event&lt;/span&gt;.&lt;span style="color:
      #aaaadd; font-weight: bold;"&gt;ActionEvent&lt;/span&gt; evt&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt; &lt;span style="color: #808080; font-style: italic;"&gt;/* Se crea la instancia y se hace visible */&lt;/span&gt; CDatePicker dlgDate = &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; CDatePicker&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt;
      javax.&lt;span style="color: #006600;"&gt;swing&lt;/span&gt;.&lt;span style="color: #aaaadd; font-weight: bold;"&gt;JFrame&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; dlgDate.&lt;span style="color: #006600;"&gt;setVisible&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;)&lt;/span&gt;; &#160; &lt;span style="color: #808080; font-style: italic;"&gt;/* Cuando el usuario simplemente cierra la ventana * con boton de cerrar del dialogo, aunque seleccione una fecha * la informacion que obtenemos de la fecha mediante los metodos de la clase * estaran vacios, caso contrario cuando presiona el boton aceptar. */&lt;/span&gt; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;dlgDate.&lt;span style="color:
      #006600;"&gt;getDay&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;.&lt;span style="color: #006600;"&gt;compareTo&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;""&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; != &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;{&lt;/span&gt;
      txtCampoFecha.&lt;span style="color: #006600;"&gt;setText&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;(&lt;/span&gt; dlgDate.&lt;span style="color: #006600;"&gt;getYear&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; + &lt;span style="color: #ff0000;"&gt;"/"&lt;/span&gt; + dlgDate.&lt;span style="color: #006600;"&gt;getMonth&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color:
      #66cc66;"&gt;)&lt;/span&gt; + &lt;span style="color: #ff0000;"&gt;"/"&lt;/span&gt; + dlgDate.&lt;span style="color: #006600;"&gt;getDay&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;)&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Mas informacion: &lt;a
      href="http://www.toedter.com/en/jcalendar/api/com/toedter/calendar/JCalendar.html" title="jcalendar api"&gt;http://www.toedter.com&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 03 Oct 2008 02:46:57 +0000</pubDate>
    </item>
  </channel>
</rss>
