<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ßeta perpetua</title>
	<atom:link href="http://jmbarroso.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://jmbarroso.es</link>
	<description>El blog personal de Juan Manuel Barroso</description>
	<lastBuildDate>Mon, 16 Apr 2012 19:47:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Predicando sobre Clean Code</title>
		<link>http://jmbarroso.es/2012/04/predicando-sobre-clean-code/</link>
		<comments>http://jmbarroso.es/2012/04/predicando-sobre-clean-code/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 17:16:42 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[charlas]]></category>
		<category><![CDATA[clean code]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=333</guid>
		<description><![CDATA[Charla sobre algunos de los principios básicos del libro Clean Code para el Code MotionCanarias]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El pasado mes tuvo lugar el <a href="http://www.codemotion.es/">CodeMotion</a>, un eventazo al que desafortunadamente no pude asistir, y que sirvió de sinergia para que en la semana anterior al evento las comunidades locales crearán eventos/charlas/talleres a modo de &#8220;calentamiento&#8221;.</p>
<p>El grupo local <a href="http://twitter.com/#!/agilecanarias">AgileCanarias</a> se unió al llamamiento, y con la colaboración de la <a href="http://www.ull.es/view/centros/etsii/Inicio/es">ETSII</a>,  organizó un pequeño evento de dos días. La idea era hablar de temas con un nivel introductorio para que pudieran asistir alumnos o cualquier persona interesada.</p>
<p>En vista a que yo siempre he tenido la firme convicción de que el libro <a href="http://www.amazon.es/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> debería impartirse en la universidad, me animé a dar una charla sobre el tema. No tenía demasiado tiempo para prepararla, ni tampoco podía ser una charla muy larga así que plasmé en una presentación lo que me pareció más básico del libro.</p>
<p>A continuación se muestran las diapositivas usadas en la charla:</p>
<p>&nbsp;</p>
<p style="text-align: center;"><![if !IE]><iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fjmbarroso.es%2Fwp-content%2Fuploads%2F2012%2F04%2FClean_Code_presentation.pdf&amp;embedded=true" class="pdf" frameborder="0" style="height:600px;width:500px;border:0" width="500" height="600"></iframe><![endif]><!--[if IE]><object width="500" height="600" type="application/pdf" data="http://jmbarroso.es/wp-content/uploads/2012/04/Clean_Code_presentation.pdf" class="pdf ie">
<div style="width:500;height:600;text-align:center;background:#fff;color:#000;margin:0;border:0;padding:0">Unable to display PDF<br /><a href="http://jmbarroso.es/wp-content/uploads/2012/04/Clean_Code_presentation.pdf">Click here to download</a></div>
<p></object><![endif]--></p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2012/04/predicando-sobre-clean-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Predicando sobre integración continua</title>
		<link>http://jmbarroso.es/2012/02/predicando-sobre-integracion-continua/</link>
		<comments>http://jmbarroso.es/2012/02/predicando-sobre-integracion-continua/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 17:27:42 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[Integración continua]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[charlas]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[IC]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=316</guid>
		<description><![CDATA[El pasado martes, mi compañero Fran Reyes y yo nos dispusimos a predicar un poco sobre los beneficios de la integración continua. Para ello hicimos una pequeña charla/taller apoyada en la herramienta Jenkins. El objetivo era acercar a los asistentes  a los conceptos básicos y darle la oportunidad de jugar un poco con la herramienta. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El pasado martes, mi compañero <a href="http://www.linkedin.com/in/franreyesperdomo" target="_blank">Fran Reyes</a> y yo nos dispusimos a predicar un poco sobre los beneficios de la <a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank">integración continua</a>. Para ello hicimos una pequeña charla/taller apoyada en la herramienta <a href="http://en.wikipedia.org/wiki/Jenkins_(software)" target="_blank">Jenkins</a>.</p>
<p style="text-align: justify;">El objetivo era acercar a los asistentes  a los conceptos básicos y darle la oportunidad de jugar un poco con la herramienta.</p>
<p style="text-align: justify;">Los asistentes estaban habituados a trabajar con <a href="http://es.wikipedia.org/wiki/Control_de_versiones" target="_blank">herramientas de control de versiones</a> pero la mayoría usaba el eclipse para generar los artefactos sin ser conscientes de que esto no es una buena práctica.</p>
<p style="text-align: justify;">A continuación se muestran las diapositivas usadas en la charla.</p>
<p style="text-align: center;"><![if !IE]><iframe src="http://docs.google.com/viewer?url=http%3A%2F%2Fjmbarroso.es%2Fwp-content%2Fuploads%2F2012%2F02%2FIC_presentacion.pdf&amp;embedded=true" class="pdf" frameborder="0" style="height:600px;width:500px;border:0" width="500" height="600"></iframe><![endif]><!--[if IE]><object width="500" height="600" type="application/pdf" data="http://jmbarroso.es/wp-content/uploads/2012/02/IC_presentacion.pdf" class="pdf ie">
<div style="width:500;height:600;text-align:center;background:#fff;color:#000;margin:0;border:0;padding:0">Unable to display PDF<br /><a href="http://jmbarroso.es/wp-content/uploads/2012/02/IC_presentacion.pdf">Click here to download</a></div>
<p></object><![endif]--></p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2012/02/predicando-sobre-integracion-continua/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En testing lo primero es F.I.R.S.T</title>
		<link>http://jmbarroso.es/2012/01/en-testing-lo-primero-es-f-i-r-s-t/</link>
		<comments>http://jmbarroso.es/2012/01/en-testing-lo-primero-es-f-i-r-s-t/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 16:33:37 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[clean code]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=275</guid>
		<description><![CDATA[El testing es un pilar fundamental del desarrollo de software pues es lo único que nos garantiza que dicho software funciona. Pero no es suficiente con hacer testing, hay que hacerlo bien. Si hay algo peor que no tener pruebas, es tener pruebas mal hechas. Malas pruebas nos dan la falsa seguridad de que las [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El testing es un pilar fundamental del desarrollo de software pues es lo único que nos garantiza que dicho software funciona.  Pero no es suficiente con hacer testing, hay que hacerlo bien. <strong>Si hay algo peor que no tener pruebas, es tener pruebas mal hechas</strong>.</p>
<p style="text-align: justify;">Malas pruebas nos dan la falsa seguridad de que las cosas funcionan, nos hacen mantener un código que no aporta valor y si están mal diseñadas, y tenemos que mantenerlas, son un auténtico dolor de cabeza.</p>
<p style="text-align: justify;">Creo que los principios que plantea <a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin">Robert C. Martin</a> en su libro <a href="http://www.amazon.es/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> son perfectos para comenzar. Me voy a centrar en los principios F.I.R.S.T añadiendo algunos elementos con los cuales me he tropezado en proyectos heredados, con código legacy que obligan a desviarse del camino ideal, y sobre todo desde un punto de vista de testing de integración.</p>
<p style="text-align: justify;">Es conveniente recordar que el código de los test es tan importante como el de producción, <strong>el esfuerzo por mantener un código limpio, legible, sin duplicidad debe hacerse sin distinguir el objetivo del código que estamos escribiendo</strong>.</p>
<p><span style="color: #000080;"><span style="color: #000000;">Las siglas </span><strong> F.I.R.S.T</strong></span> son 5 reglas que significan: <span style="color: #000080;"><strong>F</strong></span>ast, <span style="color: #000080;"><strong>I</strong></span>ndependent, <span style="color: #000080;"><strong>R</strong></span>epeatable, <span style="color: #000080;"><strong>S</strong></span>elf-validating y <span style="color: #000080;"><strong>T</strong></span>imely.</p>
<p style="text-align: justify;"><strong>Fast:</strong> Los test deberían ser rápidos. Baterias de test lentos nos rompen el flujo de trabajo y generan indisposición a  ejecutarlos. Si no los ejecutamos no podremos detectar fallos con frecuencia, ni a tiempo.<br />
A esta regla me gustaría añadirle un aspecto más. Es cierto que debemos intentar que los test sean rápidos en su ejecución pero en ocasiones no podemos evitar que un gran número de pruebas de integración/funcionales en sistemas complejos tarden un quantum de tiempo mayor al deseado. En estos casos debemos considerar la importancia de que la acción de lanzar los test se pueda hacer de manera sencilla y que se pueda llevar a cabo rápidamente.<br />
Algunas ideas en este punto son la creación de suites de prueba que permitan desde un único punto ejecutar todos los test relacionados, o contar con una herramienta como <a href="http://es.wikipedia.org/wiki/Jenkins">Jenkins</a> en la que a golpe de click se puedan lanzar todos los tests para en un instante posterior consultar los resultados.<br />
De esta manera conseguimos que no sea tedioso lanzar las pruebas, e incluso que se puedan ejecutar en background mientras nosotros seguimos trabajando.<br />
En sistemas compuestos por diferentes módulos, o equipos divididos por dominios de la aplicación, la inclusión de las baterías de pruebas de integración de los diferentes módulos de nuestro sistema en Jenkins puede ser un gran acierto, porque hacen que todo el equipo tenga acceso a las pruebas de todos los módulos, y que se pueda comprobar el impacto de nuestros cambios en los módulos relacionados sin necesidad de tener un conocimiento profundo de todos esos módulos.</p>
<p style="text-align: justify;"><strong>Independent: </strong>Los test no deberían depender entre ellos, ningún test debería ser una pre-condición de otro test. Partiendo de esta regla tenemos un sistema en el que podemos lanzar cualquier test de manera independiente y en cualquier orden.<br />
Si nos encontramos nuevamente con test de integración/funcionales podemos extender esta regla a otros recursos que pudieran necesitar los test. Cada test debería preparar de manera independiente las pre-condiciones, y debería evitar dar por sentado que los recursos que necesitan estarán disponibles en el sistema. Si el test tiene como pre-requisito que exista un registro en BBDD se debería crear ese registro en el momento previo de lanzar el test, si el test necesita que exista un documento previo en el gestor documental se debería subir ese documento en el momento previo de lanzar el test, y cuando sea realmente imposible crear esa pre-condición deberíamos controlarla generando errores que fácilmente nos informen de que el problema es la pre-condición, <strong>y que no de lugar a pensar que la funcionalidad que comprueba el test se ha roto</strong>.<br />
Con esto buscamos que nuestro tests se independicen del entorno y de las circunstancias. Podemos comprobar la funcionalidad  en desarrollo, en producción, con una nueva BBDD sin registros o incluso no vernos afectados si alguien borra los documentos del gestor documental.</p>
<p style="text-align: justify;"><strong>Repeteable: </strong>El test debería ser repetible en cualquier entorno y para cualquier desarrollador del equipo. Este apartado guarda relación con la regla anterior, cada test debería preparar su entorno para que todos los recursos estén controlados en el propio test.<br />
El punto más común de fallo es que el test pasa en el ordenador de la persona que lo desarrolló pero no al resto de miembros. Los motivos pueden ser varios, desde configuración hasta recursos no sincronizados correctamente en la herramienta de control de versiones del código.<br />
La mejor medicina para evitar este gran problema es disponer de una maquina independiente que corra un servidor de integración como Jenkins para que ejecute los test de manera automática. Todos los test deberán poder ser lanzados por Jenkins cada vez que se realiza un cambio, y a poder ser <a href="http://jmbarroso.es/2011/11/senales-visuales/" target="_blank">crear señales visuales que mantengan al equipo informado</a> <img src='http://jmbarroso.es/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p style="text-align: justify;"><strong>Self-Validating:</strong> Los test deben tener una salida booleana, pasan o no pasan. Pruebas que dejen su resultado en una cadena de texto que debemos revisar, o tests sin asserts deben evitarse.<br />
Me gustaría extender este apartado con otra mala costumbre que me he encontrado muchas veces, y que probablemente alguna vez padecí, que es que el test no valida lo que está probando. Ejemplos bastante significativos de esto pueden ser los tests de búsquedas que no comprueban que los elementos recibidos cumplen los requisitos de la búsqueda o test sin asserts que sólo fallan cuando el código genera una preciosa excepción.<br />
<strong>Es importante que tengamos claro el objetivo del test para crear las validaciones acorde a dicho objetivo.</strong></p>
<p style="text-align: justify;"><strong>Timely: </strong>Los tests deben ser creados antes que le código de producción, cuando hacemos TDD esto está implicito, pero tambien debemos hacerlo con el resto de tipos de tests (funcionales, integración). Cuando un usuario nos reporta un bug, o cuando queremos cambiar el comportamiento de una funcionalidad debemos reflejar ese bug o ese nuevo comportamiento en uno o varios tests, de esta manera sabremos realmente cuando la funcionalidad esta terminada o cuando el bug está solucionado. Además que es mucho más sencillo escribir el test sin pensar en una implementación que ya hemos codificado.</p>
<p style="text-align: justify;">Pueden haber excepciones que nos obliguen a romper alguna de las reglas, estas excepciones deberían estar documentadas y sobre todo no debemos permitir que se generalicen.</p>
<p style="text-align: justify;">Si tenemos un test de un caso muy particular no deberíamos mezclarlo con el resto del tests, para estas cosas suelo usar un test case denominado SandBoxTests que se excluye de los test automatizados, o usar la notación de JUnit @Ignore con una descripción que explique la circunstancias especiales que me llevaron a escribir el test, por ejemplo que <em>el usuario Julio no puede subir el fichero comic.pdf pero si cualquier otro</em>.</p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2012/01/en-testing-lo-primero-es-f-i-r-s-t/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contexto de una aplicación en JBOSS</title>
		<link>http://jmbarroso.es/2012/01/contexto-de-una-aplicacion-en-jboss/</link>
		<comments>http://jmbarroso.es/2012/01/contexto-de-una-aplicacion-en-jboss/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 19:15:41 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[jboss]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=247</guid>
		<description><![CDATA[El contexto raíz de una aplicación web determina las URLs que serán delegadas por el servidor a nuestra aplicación, esto quiere decir que si tenemos un contexto raiz myapplication el servidor delegará a nuestra aplicación todas las peticiones del tipo myapplication/*. El contexto raíz se carga durante el despliegue, y dependiendo del tipo de artefacto [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">El contexto raíz de una aplicación web determina las URLs que serán delegadas por el servidor a nuestra aplicación, esto quiere decir que si tenemos un contexto raiz <em><strong>myapplication </strong></em>el servidor delegará a nuestra aplicación todas las peticiones del tipo <em>myapplication/*.</em></p>
<p style="text-align: justify;">El contexto raíz se carga durante el despliegue, y dependiendo del tipo de artefacto (EAR,  WAR) puede encontrarse en lugares diferentes.</p>
<p style="text-align: justify;">Cuando estamos trabajando con un EAR el contexto de la aplicación debe ser especificado en el fichero <em>application.xml</em>, específicamente en la etiqueta &lt;context-root/&gt; del módulo correspondiente:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;application</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://java.sun.com/xml/ns/j2ee&quot;</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.4&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span>
<span style="color: #009900;">    <span style="color: #000066;">xsi:schemaLocation</span>=<span style="color: #ff0000;">&quot;http://java.sun.com /xml/ns/j2ee</span>
<span style="color: #009900;">                             http://java.sun.com/xml/ns/j2ee/application_1_4.xsd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;display-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>MyApplication<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/display-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;web-uri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>myApplication.war<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web-uri<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>myNewContext<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ejb<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>my-library.jar<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ejb<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/application<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Si nuestra aplicación va a ser desplegada en un .war directamente, debemos modificar el fichero jboss-web.xml de la carpeta  WEB-INF:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jboss-web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>myNewContext<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/context-root<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jboss-web<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p style="text-align: justify;">De esta manera las peticiones a <em>myNewContext/*</em> serán delegadas a nuestra aplicación.</p>
<p style="text-align: justify;">Si no especificamos un contexto al WAR, se usará el mismo nombre del fichero .war. Por ejemplo, para el desplegable <em>otra-aplicacion.war </em>se usará el contexto <strong>otra-aplicacion.</strong></p>
<p>Esto puede ser útil cuando necesitemos publicar nuestra aplicación en una ruta del tipo: <em>producto/consolas/myAplicacion</em>.</p>
<p style="text-align: justify;">Un caso real donde tuve que cambiar el contexto de una aplicación, fue desplegando un aplicación Grails que delegaba la parte de seguridad en SpringSecurity y sólo podía ser accesible desde una redirección de Apache. El problema era que el plugin no era capaz de redirigir desde la página de login a la primera página de la aplicación. Como solución inmediata cambie el contexto de la aplicación para que coincidiera con la URL de la redirección y problema solucionado.<br />
Probablemente el plugin podía ser configurado para solucionar el problema, pero en aquel momento la aplicación debía estar en producción sin retrasos.</p>
<p><em>Probado con JBOSS 5 y Grails 1.3.7</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2012/01/contexto-de-una-aplicacion-en-jboss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Señales visuales, ¡grandes aliadas!</title>
		<link>http://jmbarroso.es/2011/11/senales-visuales/</link>
		<comments>http://jmbarroso.es/2011/11/senales-visuales/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 03:22:10 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[equipos]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[señales]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=206</guid>
		<description><![CDATA[La primera vez que escuche eso de las &#8220;señales visuales&#8221; fue hace un año atrás, en un curso de Scrum Manager con Juan Palacios y Claudia Ruata. La verdad que en aquel momento no terminé de captar la esencia, mira que nos cuesta entender a los informáticos que hay cosas que están mejor  fuera de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">La primera vez que escuche eso de las &#8220;señales visuales&#8221; fue hace un año atrás, en un curso de <a href="http://www.scrummanager.net/">Scrum Manager</a> con Juan Palacios y Claudia Ruata. La verdad que en aquel momento no terminé de captar la esencia, mira que nos cuesta entender a los informáticos que hay cosas que están mejor  fuera de una aplicación o del e-mail.</p>
<div id="attachment_209" class="wp-caption alignright" style="width: 224px"><a href="http://jmbarroso.es/wp-content/uploads/2011/11/IMG_0892.jpg"><img class="size-full wp-image-209 " title="DEFCON" src="http://jmbarroso.es/wp-content/uploads/2011/11/IMG_0892.jpg" alt="" width="214" height="462" /></a><p class="wp-caption-text">DEFCON en nivel 5. Sólo el día del sorteo de la lotería de navidad fue visto así.</p></div>
<p style="text-align: justify;">La primera señal que tuvimos, sin saber que realmente era un señal, fue un <a href="http://es.wikipedia.org/wiki/DEFCON">DEFCON</a> recortable. Todo empezó a modo de chiste pero sin darnos cuenta se convirtió en un medidor del estado de estrés del equipo. Los fallos en producción, las neuras del cliente o sencillamente el sorteo de la lotería de navidad alteraban el estado del dichoso trozo de cartón.</p>
<p style="text-align: justify;">Y cuando presencié intercambio de opiniones (a.k.a discusiones) sobre el nivel que debía tener el DEFCON en función de las &#8220;cosas&#8221; que el proyecto tenía pendiente, empecé a entender lo que Juan y Claudia querían transmitirnos.</p>
<p style="text-align: justify;">Las señales visuales transmiten el estado del proyecto de manera general y natural, no deberíamos tener que abrir una aplicación o revisar el correo para saber si la aplicación de producción se ha caído, o abrir la aplicación de gestión de tickets y lanzar una consulta para ver que tenemos un cuello de botella en las tareas de testing planificadas.  En lugar de esto podemos buscar una pantalla vieja y poner un radiador de información que ponga la pantalla roja cuando la aplicación se ha caído o una pizarra kanban/scrumban que muestre de manera global las tareas acumuladas. Herramientas como estas se camuflan en la oficina y nos transmiten información de manera transparente, al levantarnos para ir al baño, al parar para hablar con un compañero o sencillamente cuando estemos tomando un café.</p>
<p style="text-align: justify;">Sólo tenemos que estar atentos a cosas que podemos expresar visualmente y dedicar un instante de tiempo a implantarlas. Lo mejor es comenzar por cosas sencillas, y es importante que no moleste de manera directa a un compañero. No quitarle espacio de trabajo por ejemplo.</p>
<p style="text-align: justify;">En mi caso instalé el <a href="https://wiki.jenkins-ci.org/display/JENKINS/Radiator+View+Plugin">radiator plugin</a> en <a href="http://jenkins-ci.org/">Jenkins</a>, la intención era tener de manera muy visible el estado de los entornos. La instalación no llevo más de 15 minutos y aporta una información muy valiosa al equipo. Ya no tenemos que mirar el correo para ver si nuestra plataforma tiene problemas, ahora somos más rápidos detectando problemas (lo de corregirlos es otro tema :p) y hemos descargado nuestra cabeza de la presión de mirar los correos para ver si los entornos se encuentra estable.</p>
<div id="attachment_213" class="wp-caption aligncenter" style="width: 492px"><a href="http://jmbarroso.es/wp-content/uploads/2011/11/IMG_2918.jpg"><img class="size-full wp-image-213 " title="Radiator Plugin para Jenkins" src="http://jmbarroso.es/wp-content/uploads/2011/11/IMG_2918.jpg" alt="" width="482" height="334" /></a><p class="wp-caption-text">La pantalla está en un lugar visible para todo el equipo y muestra el estado de los test de monitorización lanzados por Jenkins</p></div>
<p style="text-align: justify;">Algunas cosas no funcionarán como esperas, no tendrán el efecto deseado, pero eso no debe ser un impedimento para intentar mejorar cada día nuestro trabajo y el del equipo. Mi corta experiencia me dice que <strong>no siempre debemos pedir aprobación</strong> pues muchas veces nos dirán que es una perdida de tiempo, debemos lanzarnos con cosas pequeñas y simples como un DEFCON , plugins para las herramientas de integración continua (<a href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Sounds+plugin">también valen las señales acústicas</a>) o incluso usar una pizarra grande para marcar lista de objetivos que se necesitan conseguir a muy corto plazo y donde vamos tachando los conseguidos.</p>
<p style="text-align: justify;">Por cierto, me olvide de decir que el primer DEFCON fue idea de <a href="http://jjcoellov.es/">@jjcoellov</a> y lo consiguió en <a href="http://www.microsiervos.com/archivo/microciervadas-varias/defcon-recortable.html">Microsiervos</a>.</p>
<p>&nbsp;<br />
<iframe width="420" height="315" src="http://www.youtube.com/embed/0HtECMwfxY8?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>Edito: Para entender el vídeo anterior tenemos que ver Toy Story 3 o el siguiente vídeo:</p>
<p>&nbsp;</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/EBJOK9iAh6A" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2011/11/senales-visuales/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Grails: Testing unitario de controladores que usan &#8216;bindData&#8217;</title>
		<link>http://jmbarroso.es/2011/10/grails-testing-unitario-de-controladores-que-usan-binddata/</link>
		<comments>http://jmbarroso.es/2011/10/grails-testing-unitario-de-controladores-que-usan-binddata/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 12:51:06 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=187</guid>
		<description><![CDATA[Grails permite hacer data binding en las acciones de los controladores. Es una manera muy práctica de cargar los parámetros que nos llegan a través de los submit de los formularios a objetos de dominio. El problema lo tenemos con los test unitarios de nuestro controlador. Al lanzarlos no se encontrará el método bindData, y [...]]]></description>
			<content:encoded><![CDATA[<p>Grails permite hacer <em><a href="http://grails.org/doc/1.3.7/guide/single.html#6.1.6%20Data%20Binding">data binding</a> </em>en las acciones de los controladores. Es una manera muy práctica de cargar los parámetros que nos llegan a través de los <em>submit</em> de los formularios a objetos de dominio.</p>
<p>El problema lo tenemos con los test unitarios de nuestro controlador. Al lanzarlos no se encontrará el método <strong><em>bindData</em></strong>, y obtendremos un error del tipo <em>&#8220;No signature of method:&#8230;.&#8221;</em></p>
<p>Para evitar este problema podemos inyectar el método <em><strong>bindData</strong></em> al objeto controlador que estamos probando unitariamente. A continuación se muestra un código que realiza dicha tarea:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">private</span> <span style="color: #993333;">void</span> addBindataToController<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  controller.<span style="color: #006600;">metaClass</span>.<span style="color: #006600;">bindData</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> objectInstance, params <span style="color: #66cc66;">-&gt;</span>
     <span style="color: #000000; font-weight: bold;">def</span> excludeProperties <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'class'</span> , <span style="color: #ff0000;">'metaClass'</span> <span style="color: #66cc66;">&#93;</span>
     params.<span style="color: #663399;">each</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #000000; font-weight: bold;">property</span>, value <span style="color: #66cc66;">-&gt;</span>
       <span style="color: #000000; font-weight: bold;">try</span> <span style="color: #66cc66;">&#123;</span>
         <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">!</span>excludeProperties.<span style="color: #CC0099;">contains</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">property</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
           objectInstance.<span style="color: #ff0000;">&quot;$property&quot;</span> <span style="color: #66cc66;">=</span> value
         <span style="color: #66cc66;">&#125;</span>
       <span style="color: #66cc66;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #66cc66;">&#40;</span>MissingPropertyException ex<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> <span style="color: #66cc66;">&#125;</span>
     <span style="color: #66cc66;">&#125;</span>
     <span style="color: #000000; font-weight: bold;">return</span> objectInstance
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Sólo debemos añadir el  método anterior a la clase en la que implementamos  las pruebas unitarias de nuestro controlador, e invocarlo en el <em>setup</em> de nuestros test.</p>
<p>Con esto podemos saltarnos la limitación de hacer testing unitario sobre controladores que usan el método <em><strong>bindData</strong></em>. Este limitación ha estado presente, al menos, hasta la versión 1.3.7 de Grails. Es muy posible que futuras versiones del framework den solución al problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2011/10/grails-testing-unitario-de-controladores-que-usan-binddata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Useful Tips: VIM &#8211; Guardar cambios fichero sólo lectura</title>
		<link>http://jmbarroso.es/2011/06/useful-tips-vim-guardar-cambios-fichero-solo-lectura/</link>
		<comments>http://jmbarroso.es/2011/06/useful-tips-vim-guardar-cambios-fichero-solo-lectura/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 22:30:55 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Useful Tips]]></category>
		<category><![CDATA[VI]]></category>
		<category><![CDATA[VIM]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=171</guid>
		<description><![CDATA[Hay fallos en los que soy muy recurrente, uno de ellos es editar ficheros del sistema sin haber hecho el previo sudo. Si usamos VIM podemos hacer el sudo sin tener que salir de la edición, y por tanto sin perder nuestros cambios, para ello tecleamos en modo comando lo siguiente: :w !sudo tee % [...]]]></description>
			<content:encoded><![CDATA[<p>Hay fallos en los que soy muy recurrente, uno de ellos es editar ficheros del sistema sin haber hecho el previo<em> <a href="http://es.wikipedia.org/wiki/Sudo">sudo</a></em>.</p>
<p>Si usamos <a href="http://es.wikipedia.org/wiki/Vim">VIM</a> podemos hacer el <em>sudo</em> sin tener que salir de la edición, y por tanto sin perder nuestros cambios, para ello tecleamos en modo comando lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">:<span style="color: #c20cb9; font-weight: bold;">w</span> <span style="color: #000000; font-weight: bold;">!</span><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">tee</span> <span style="color: #000000; font-weight: bold;">%</span></pre></div></div>

<p>Gracias a <a href="http://twitter.com/#!/fran_reyes">@fran_reyes</a> por el tip!</p>
<p>Más información sobre el comando <em><strong>tee</strong></em> <a href="http://en.wikipedia.org/wiki/Tee_%28command%29">aquí</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2011/06/useful-tips-vim-guardar-cambios-fichero-solo-lectura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectando Grails y EJB3</title>
		<link>http://jmbarroso.es/2011/06/conectando-grails-y-ejb3/</link>
		<comments>http://jmbarroso.es/2011/06/conectando-grails-y-ejb3/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 21:30:40 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[EJB]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=66</guid>
		<description><![CDATA[Me he encontrado con la necesidad de construir una aplicación web sobre un servicio EJB3 que implementa el acceso a datos y gran parte de la lógica de negocio, y como era de esperar, Grails me ha facilitado enormemente el mecanismo para la integración. La idea es que la aplicación Grails (1.3.6) pueda desplegarse en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Me he encontrado con la necesidad de construir una aplicación web sobre un servicio <a href="http://es.wikipedia.org/wiki/Enterprise_JavaBeans">EJB3</a> que implementa el acceso a datos y gran parte de la lógica de negocio, y como era de esperar, Grails me ha facilitado enormemente el mecanismo para la integración.</p>
<p style="text-align: justify;">La idea es que la aplicación Grails (1.3.6) pueda desplegarse en un servidor diferente a donde se encuentra el EJB3, para esto usaremos  <a href="http://es.wikipedia.org/wiki/JNDI">JNDI</a> y la interfaz remota del servicio.</p>
<p style="text-align: justify;">Lo primero que debemos hacer es añadir los beans correspondientes al fichero <em><strong>conf/spring/resources.groovy</strong></em>:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">ejbJndi<span style="color: #66cc66;">&#40;</span>org.<span style="color: #006600;">springframework</span>.<span style="color: #006600;">jndi</span>.<span style="color: #006600;">JndiTemplate</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
   environment <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>
      <span style="color: #ff0000;">&quot;java.naming.factory.initial&quot;</span> : <span style="color: #ff0000;">&quot;org.jnp.interfaces.NamingContextFactory&quot;</span>,
      <span style="color: #ff0000;">&quot;java.naming.provider.url&quot;</span> : <span style="color: #ff0000;">&quot;jnp://servidorEJb3.net:1099&quot;</span>
   <span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Lo que hemos hecho es construir un bean, con nombre <em>ejbJndi</em>, a partir  de la clase <em><a href="http://www.dosideas.com/wiki/JndiTemplate">org.springframework.jndi.JndiTemplate</a>. </em>Le damos valor a la variable <em>environment </em>especificando las propiedades que Spring usará para encontrar nuestro EJB3.</p>
<p style="text-align: justify;">Luego procedemos a declarar nuestro bean remoto añadiendo al fichero anterior una nueva entrada:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">beanServicioRemoto<span style="color: #66cc66;">&#40;</span>org.<span style="color: #006600;">springframework</span>.<span style="color: #006600;">jndi</span>.<span style="color: #006600;">JndiObjectFactoryBean</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    jndiName <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;aplicacion/ejbName/remote&quot;</span>
    jndiTemplate <span style="color: #66cc66;">=</span> ref<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;ejbJndi&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Hemos llamado a nuestro bean <em>beanServicioRemoto</em>, y lo hemos inicializado con el nombre del EJB (especificando la interfaz remota)  y la referencia a nuestro template  <em>ejbJndi. </em><em> </em></p>
<p style="text-align: justify;">El <em>beanServicioRemoto </em>puede ser usado desde los controladores o servicios como un servicio más:<em> </em></p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">def</span> beanServicioRemoto</pre></div></div>

<p style="text-align: justify;">Pero antes de poder usarlo debemos añadir algunas librerías al directorio <em>lib </em>de nuestra aplicación:</p>
<p style="text-align: justify;">La primera a añadir deberá ser la que contenga la interfaz del EJB3 remoto y todos las clases que se usen en dicha interfaz. Dicha librería puede obtenerse empaquetando en un JAR las clases del EJB3</p>
<p style="text-align: justify;">Adicionalmente, es muy probable que se necesiten añadir librerías clientes del servidor donde se encuentre desplegado el EJB3. Para <em>JBOSS 4.2.3 </em>se han añadido las siguientes librerías:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">jbossall<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span>
jboss<span style="color: #339933;">-</span>aop<span style="color: #339933;">-</span>jdk50<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span>
jboss<span style="color: #339933;">-</span>aspect<span style="color: #339933;">-</span>jdk50<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span>
jboss<span style="color: #339933;">-</span>common<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span>
jboss<span style="color: #339933;">-</span>ejb3<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span>
jboss<span style="color: #339933;">-</span>j2ee.<span style="color: #006633;">jar</span>
jnp<span style="color: #339933;">-</span>client.<span style="color: #006633;">jar</span></pre></div></div>

<p>Si la aplicación levanta, enhorabuena, en caso contrario es muy probable que aparezca el demonio de los conflictos de librerías y tengas que pelearte con él. En mi caso me apareció el siguiente error:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Server failed to start<span style="color: #339933;">:</span> java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">LinkageError</span><span style="color: #339933;">:</span>
   <span style="color: #000000; font-weight: bold;">Class</span> javax<span style="color: #339933;">/</span>management<span style="color: #339933;">/</span>MBeanServer violates loader constraints</pre></div></div>

<p style="text-align: justify;">Problema que solucione cambiando el servidor de aplicaciones embebido a <em>jetty</em>. Este cambio me lo pude permitir porque el contenedor destino de la aplicación  era JBOSS, y en tiempo de desarrollo me daba igual <em>tomcat</em> que <em>jetty</em>.</p>
<p style="text-align: justify;">Para desinstalar tomcat e instalar jetty:</p>

<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">grails uninstall<span style="color: #66cc66;">-</span>plugin tomcat</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="groovy" style="font-family:monospace;">grails install<span style="color: #66cc66;">-</span>plugin jetty</pre></div></div>

<p>Si en lugar de EJB3 tenemos EJB2 se deberán cambiar las clases de Spring que se usan en el <em>resources.groovy</em>. Puede consultarse <a href="http://dave-klein.blogspot.com/2008/03/integrating-grails-with-ejb-2.html">aquí</a> dicho escenario.</p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2011/06/conectando-grails-y-ejb3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¡Enciendan maquinas!</title>
		<link>http://jmbarroso.es/2010/11/%c2%a1enciendan-maquinas/</link>
		<comments>http://jmbarroso.es/2010/11/%c2%a1enciendan-maquinas/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 13:09:09 +0000</pubDate>
		<dc:creator>Juanma</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://jmbarroso.es/?p=39</guid>
		<description><![CDATA[Demasiado tiempo ha pasado desde que tuve la idea de crear este sitio hasta tenerlo operativo, me costo encontrar un diseño que no me disgustara y mucho más  robarle algunas horas a la universidad, al trabajo y a la vida social para montar este tinglado. Ahora no queda más que intentar darle forma, no tengo [...]]]></description>
			<content:encoded><![CDATA[<p>Demasiado tiempo ha pasado desde que tuve la idea de crear este sitio hasta tenerlo operativo, me costo encontrar un diseño que no me disgustara y mucho más  robarle algunas horas a la universidad, al trabajo y a la vida social para montar este <a href="http://www.wordreference.com/definicion/tinglado" target="_blank">tinglado</a>.</p>
<p>Ahora no queda más que intentar darle forma, no tengo claro la forma que espero conseguir pero comenzaré plasmando ideas, recetas e incluso algunas de esas diarreas mentales que con alguna frecuencia inundan mi cabeza. Es muy probable que se toquen temas diversos, en ocasiones puede que tengan poca o ninguna conexión pero la mayoría girará en torno a la tecnología y al desarrollo de software.</p>
<p>Ponemos la maquinaría en marcha y  esperamos no morir en el intento.</p>
<p><span style="font-size: 13.3333px;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://jmbarroso.es/2010/11/%c2%a1enciendan-maquinas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
