<?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"
	>

<channel>
	<title>Software Pills</title>
	<atom:link href="http://www.softwarepills.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.softwarepills.com</link>
	<description>Software en prácticas píldoras</description>
	<pubDate>Thu, 08 Apr 2010 17:35:09 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>JavaScript y JSON para J2ME</title>
		<link>http://www.softwarepills.com/?p=206</link>
		<comments>http://www.softwarepills.com/?p=206#comments</comments>
		<pubDate>Sun, 20 Dec 2009 21:44:13 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Programación]]></category>

		<category><![CDATA[JavaScript JSON J2ME Java Programación]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=206</guid>
		<description><![CDATA[Recientemente he necesitado utilizar JavaScript y JSON en un proyecto J2ME y he tenido la suerte de encontrar un par de librerías que me han facilitado mucho la labor.
Se trata de MiniJoe, un interprete JavaScript, y org.json.me, una librería JSON en J2ME.


Con MiniJoe puedes ejecutar JavaScript en el móvil. Aunque tiene algunas limitaciones y no [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente he necesitado utilizar JavaScript y JSON en un proyecto J2ME y he tenido la suerte de encontrar un par de librerías que me han facilitado mucho la labor.</p>
<p>Se trata de <a href="http://minijoe.com/" target="_blank"><em>MiniJoe</em></a>, un interprete JavaScript, y <a href="http://www.json.org/" target="_blank"><em>org.json.me</em></a><em>,</em> una librería JSON en J2ME.</p>
<p><span id="more-206"></span></p>
<p><a href="http://www.softwarepills.com/wp-content/uploads/minijoe.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 0px 0px; border-right-width: 0px" src="http://www.softwarepills.com/wp-content/uploads/minijoe-thumb.png" border="0" alt="minijoe" width="38" height="37" align="left" /></a></p>
<p>Con MiniJoe puedes ejecutar JavaScript en el móvil. Aunque tiene <a href="http://code.google.com/p/minijoe/wiki/DifferencesToJavasctipt" target="_blank">algunas limitaciones</a> y no es ni de lejos tan potente como <a href="http://www.mozilla.org/rhino/" target="_blank"><em>Rhino</em></a>, por ejemplo, hace su trabajo con un API tan restrictivo como CLDC 1.1.</p>
<p>El problema es que la <a href="http://code.google.com/p/minijoe/w/list" target="_blank">documentación</a> es escasa y solo estudiando el código consigues hacerte una idea de como se utiliza.</p>
<p>A continuación, incluyo algunos fragmentos de código Java que te pueden ser útiles si te ves en la circunstancia de tener que utilizar esta librería:</p>
<pre class="javascript">// Mi propio objeto JSON en Java visible desde JS
public class JSON extends JsObject
{
	// ID de la función JS parse implementada en Java
	static final int ID_PARSE = 101;

	// ID de la función JS stringify implementada en Java
	static final int ID_STRINGIFY = 102;

	public JSON()
	{
		super(new JsObject(OBJECT_PROTOTYPE));

		// Añado la función parse que recibe un parámetro
		addNative("parse", ID_PARSE, 1);

		// Añado la función stringify que recibe un parámetro
		addNative("stringify", ID_STRINGIFY, 1);
	}

	// Implemementación de los métodos JSON nativos en Java
	public void evalNative(int id, JsArray stack, int sp, int parCount)
	{
		switch(id)
		{
			// Los parámetros se obtienen de la pila
			// sp + 2 = primer parámetro, sp + 3 = segundo, ...
	    		case ID_PARSE:
	    			stack.setObject(sp, parse(stack.getString(sp + 2)));
		    		break;

		    	case ID_STRINGIFY:
		    		stack.setObject(sp, stringfy((JsObject)stack.getObject(sp + 2)));
	    			break;

		    	default:
		    		super.evalNative(id, stack, sp, parCount);
		}
	}	

	// De String a JsObject
	private JsObject parse(String str)
	{
		...
	}

	// De JsObject a String
	public static String stringfy(JsObject obj)
	{
		...
	}
}</pre>
<pre class="javascript">// Esta clase proveerá funciones y variables globales
// En concreto una función trace y la variable global JSON
public class MyEnvironment extends Eval
{
	// ID de la función JS trace implementada en Java
	static final int ID_TRACE = 101;

	public MyEnvironment()
	{
		super();

		// Añado la función trace que recibe un parámetro
		addVar("trace", new JsFunction(ID_TRACE, 1));

		// Añado la variable global JSON
		// Los objetos deben ser subclases de JsObject
		addVar("JSON", new JSON());
	}

	// Implemementación de funciones nativas en Java
	public void evalNative(int id, JsArray stack, int sp, int parCount)
	{
		 switch(id)
	    	{
	    		case ID_TRACE:
	    			trace(stack.getString(sp + 2));
		    		break;

			default:
	    			super.evalNative(id, stack, sp, parCount);
	    }
	}

	// Implementación de trace en Java
	private void trace(String text)
	{
		System.out.println("Traza: " + text);
	}
}</pre>
<pre class="javascript">// Punto de entrada
	public static void main(String args[])
	{
		// Obtener el script
		String script = ...

		// Ejecutarlo en un entorno que contiene la función trace y el objeto JSON
		MyEnviroment env = new MyEnviroment();
		MyEnvironment.eval(script, env);

	}</pre>
<p>La otra librería, <em>org.json.me</em> es mas sencilla y dispone de mas <a href="http://java.sun.com/developer/technicalArticles/javame/json-me/" target="_blank">documentación</a>. Aún así, el siguiente fragmento de código te puede ser útil para empezar:</p>
<pre class="javascript">// PARSE

// Cadena JSON
String str = ...

// Convertir a JSON (parse)
JSONObject json = new JSONObject(str);

// Obtener campos de JSON
System.out.println(json.getString("campo1"));
System.out.println(json.getBoolean("campo2"));</pre>
<pre class="javascript">// STRINGIFY

// Cambiar el vlor de algunos campos
json.put("campo1", "Prueba");

// Convertir a cadena
System.out.println(json.toString());</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=206</wfw:commentRss>
		</item>
		<item>
		<title>Ya est&#225; aqu&#237; Java EE 6</title>
		<link>http://www.softwarepills.com/?p=181</link>
		<comments>http://www.softwarepills.com/?p=181#comments</comments>
		<pubDate>Fri, 11 Dec 2009 20:37:12 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[GlassFish NetBeans  J2EE]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=181</guid>
		<description><![CDATA[A finales de noviembre fue aprobada por votaci&#243;n la especificaci&#243;n Java EE 6 (JSR-316) que incluye una larga lista novedades agrupadas en tres documentos:

Java EE 6 Specification. 
Java EE Web Profile Specification. 
Java EE 6 Managed Beans Specification. 

Puedes encontrar informaci&#243;n al respecto en numerosos blogs, pero probablemente el mejor sitio para empezar es el [...]]]></description>
			<content:encoded><![CDATA[<p>A finales de noviembre fue aprobada por <a href="http://jcp.org/en/jsr/results?id=5025" target="_blank">votaci&#243;n</a> la especificaci&#243;n <a href="http://jcp.org/en/jsr/detail?id=316" target="_blank">Java EE 6 (JSR-316</a>) que incluye una larga lista novedades agrupadas en tres documentos:</p>
<ul>
<li>Java EE 6 Specification. </li>
<li>Java EE Web Profile Specification. </li>
<li>Java EE 6 Managed Beans Specification. </li>
</ul>
<p>Puedes encontrar informaci&#243;n al respecto en numerosos blogs, pero probablemente el mejor sitio para empezar es el <a href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html" target="_blank">art&#237;culo de Ed Ort en SDN</a>.</p>
<p>Por otro lado, como era de esperar, la primera implementaci&#243;n completa ha venido de la mano de SUN con <a href="https://glassfish.dev.java.net/downloads/v3-final.html" target="_blank">GlassFish v3</a><sup>[1]</sup> que llega acompa&#241;ado de <a href="http://netbeans.org/community/news/show/1449.html" target="_blank">NetBeans 6.8</a>, con lo que ya existe un ecosistema completo J2EE 6.</p>
<p>Una de las cr&#237;ticas que se hac&#237;an a <em>GlassFish</em> era su car&#225;cter monol&#237;tico respecto a, por ejemplo, <em>JBoss</em> pero parece que con la infraestructura OSGi y las nuevas caracter&#237;sticas de Java EE 6 en este sentido, ya no es un argumento v&#225;lido.</p>
<p>Hasta el momento me he mantenido utilizando<em> JBoss 4.x</em> y Eclipse esperando a que <em>JBoss 5.x</em> alcance la madurez, pero teniendo en cuenta lo anterior y lo que he sufrido buceando en los foros de JBoss para encontrar informaci&#243;n y documentaci&#243;n v&#225;lida puede que sea el momento de pasarse a <em>GlassFish</em> y quien sabe si tambi&#233;n a <em>NetBeans</em>.</p>
<ol class="footnotes">
<li id="footnote_0_181" class="footnote"><a title="http://blogs.sun.com/kevinschmidt/entry/glassfish_enterprise_server_v3_the" href="http://blogs.sun.com/kevinschmidt/entry/glassfish_enterprise_server_v3_the">http://blogs.sun.com/kevinschmidt/entry/glassfish_enterprise_server_v3_the</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=181</wfw:commentRss>
		</item>
		<item>
		<title>MANIFIESTO EN DEFENSA DE LOS DERECHOS FUNDAMENTALES EN INTERNET</title>
		<link>http://www.softwarepills.com/?p=180</link>
		<comments>http://www.softwarepills.com/?p=180#comments</comments>
		<pubDate>Fri, 04 Dec 2009 13:51:08 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=180</guid>
		<description><![CDATA[MANIFIESTO EN DEFENSA DE LOS DERECHOS FUNDAMENTALES EN INTERNET
Ante la inclusi&#243;n en el Anteproyecto de Ley de Econom&#237;a sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresi&#243;n, informaci&#243;n y el derecho de acceso a la cultura a trav&#233;s de Internet, los periodistas, bloggers, usuarios, profesionales y creadores de Internet manifestamos [...]]]></description>
			<content:encoded><![CDATA[<p><strong>MANIFIESTO EN DEFENSA DE LOS DERECHOS FUNDAMENTALES EN INTERNET</strong></p>
<p>Ante la inclusi&#243;n en el Anteproyecto de Ley de Econom&#237;a sostenible de modificaciones legislativas que afectan al libre ejercicio de las libertades de expresi&#243;n, informaci&#243;n y el derecho de acceso a la cultura a trav&#233;s de Internet, los periodistas, <em>bloggers</em>, usuarios, profesionales y creadores de Internet manifestamos nuestra firme oposici&#243;n al proyecto, y declaramos que:</p>
<ol>
<li>Los derechos de autor no pueden situarse por encima de los derechos fundamentales de los ciudadanos, como el derecho a la privacidad, a la seguridad, a la presunci&#243;n de inocencia, a la tutela judicial efectiva y a la libertad de expresi&#243;n. </li>
<li>La suspensi&#243;n de derechos fundamentales es y debe seguir siendo competencia exclusiva del poder judicial. Ni un cierre sin sentencia. Este anteproyecto, en contra de lo establecido en el art&#237;culo 20.5 de la Constituci&#243;n, pone en manos de un &#243;rgano no judicial -un organismo dependiente del ministerio de Cultura-, la potestad de impedir a los ciudadanos espa&#241;oles el acceso a cualquier p&#225;gina web. </li>
<li>La nueva legislaci&#243;n crear&#225; inseguridad jur&#237;dica en todo el sector tecnol&#243;gico espa&#241;ol, perjudicando uno de los pocos campos de desarrollo y futuro de nuestra econom&#237;a, entorpeciendo la creaci&#243;n de empresas, introduciendo trabas a la libre competencia y ralentizando su proyecci&#243;n internacional. </li>
<li>La nueva legislaci&#243;n propuesta amenaza a los nuevos creadores y entorpece la creaci&#243;n cultural. Con Internet y los sucesivos avances tecnol&#243;gicos se ha democratizado extraordinariamente la creaci&#243;n y emisi&#243;n de contenidos de todo tipo, que ya no provienen prevalentemente de las industrias culturales tradicionales, sino de multitud de fuentes diferentes. </li>
<li>Los autores, como todos los trabajadores, tienen derecho a vivir de su trabajo con nuevas ideas creativas, modelos de negocio y actividades asociadas a sus creaciones. Intentar sostener con cambios legislativos a una industria obsoleta que no sabe adaptarse a este nuevo entorno no es ni justo ni realista. Si su modelo de negocio se basaba en el control de las copias de las obras y en Internet no es posible sin vulnerar derechos fundamentales, deber&#237;an buscar otro modelo. </li>
<li>Consideramos que las industrias culturales necesitan para sobrevivir alternativas modernas, eficaces, cre&#237;bles y asequibles y que se adecuen a los nuevos usos sociales, en lugar de limitaciones tan desproporcionadas como ineficaces para el fin que dicen perseguir. </li>
<li>Internet debe funcionar de forma libre y sin interferencias pol&#237;ticas auspiciadas por sectores que pretenden perpetuar obsoletos modelos de negocio e imposibilitar que el saber humano siga siendo libre. </li>
<li>Exigimos que el Gobierno garantice por ley la neutralidad de la Red en Espa&#241;a, ante cualquier presi&#243;n que pueda producirse, como marco para el desarrollo de una econom&#237;a sostenible y realista de cara al futuro. </li>
<li>Proponemos una verdadera reforma del derecho de propiedad intelectual orientada a su fin: devolver a la sociedad el conocimiento, promover el dominio p&#250;blico y limitar los abusos de las entidades gestoras. </li>
<li>En democracia las leyes y sus modificaciones deben aprobarse tras el oportuno debate p&#250;blico y habiendo consultado previamente a todas las partes implicadas. No es de recibo que se realicen cambios legislativos que afectan a derechos fundamentales en una ley no org&#225;nica y que versa sobre otra materia.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=180</wfw:commentRss>
		</item>
		<item>
		<title>Adobe va a liberar la especificaci&#243;n del protocolo RTMP</title>
		<link>http://www.softwarepills.com/?p=176</link>
		<comments>http://www.softwarepills.com/?p=176#comments</comments>
		<pubDate>Thu, 22 Jan 2009 18:40:28 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Adobe]]></category>

		<category><![CDATA[Darwin]]></category>

		<category><![CDATA[FFMPEG]]></category>

		<category><![CDATA[Flash Player]]></category>

		<category><![CDATA[H.263]]></category>

		<category><![CDATA[H.264]]></category>

		<category><![CDATA[MPEG4IP]]></category>

		<category><![CDATA[QuickTime]]></category>

		<category><![CDATA[RTMP]]></category>

		<category><![CDATA[RTSP]]></category>

		<category><![CDATA[VideoLAN]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=176</guid>
		<description><![CDATA[Seg&#250;n una nota de prensa publicada en su Web, Adobe pretende liberar la especificaci&#243;n del protocolo RTMP (Real Time Messaging Protocol)durante la primera mitad de 2009.
RTMP es un protocolo de comunicaciones propietario de Adobe Systems&#160; para la transmisi&#243;n de audio, v&#237;deo y datos entre el Flash Player y el servidor. No solo permite crear streams [...]]]></description>
			<content:encoded><![CDATA[<p>Seg&#250;n una <a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200901/012009RTMP.html" target="_blank">nota de prensa</a> publicada en su Web, <em>Adobe</em> pretende liberar la <a href="http://www.adobe.com/devnet/rtmp/" target="_blank">especificaci&#243;n del protocolo <em>RTMP</em></a> (Real Time Messaging Protocol)durante la primera mitad de 2009.</p>
<p>RTMP es un protocolo de comunicaciones propietario de <em>Adobe Systems</em>&#160; para la transmisi&#243;n de audio, v&#237;deo y datos entre el <em>Flash Player</em> y el servidor. No solo permite crear streams de audio/v&#237;deo, sino que tambi&#233;n permite transmitir en tiempo real y en ambas direcciones otros tipos de datos con numerosas aplicaciones pr&#225;cticas (<em>Remote Shared Objects</em>, etc.).</p>
<p>Tras liberar el c&#243;digo de <a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK" target="_blank"><em>Flex</em></a> y <a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/" target="_blank"><em>Blaze DS</em></a>, y la <a href="http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf" target="_blank">especificaci&#243;n <em>AMF</em></a>, Adobe da un paso mas en la estrategia de abrir sus productos y tecnolog&#237;as y libera esta pieza clave del ecosistema de Flash.</p>
<p>Se trata de una inmejorable noticia para los que, en su d&#237;a, apostamos por utilizar Flash en nuestros desarrollos <em>RIA</em> y nos ofrece un importante respaldo frente a los recelos que suscita utilizar una tecnolog&#237;a propietaria.</p>
<p>La noticia tiene numerosas implicaciones, especialmente en el &#225;mbito de las aplicaciones multimedia, de juegos y para dispositivos m&#243;viles.</p>
<p> <span id="more-176"></span>
<p>Hasta la fecha, una alternativa razonable para la transmisi&#243;n de audio y v&#237;deo era <a href="http://sourceforge.net/projects/rtspspec" target="_blank"><em>RTSP</em></a> (Real Time Streaming Protocol) ya que la especificaci&#243;n de este protocolo es p&#250;blica. Este hecho ha favorecido que haya sido adoptado por numerosos fabricantes y productos, entre los que destaca <em>Apple</em> con <em>iTunes</em> y <em>QuickTime</em>.</p>
<p>Basadas en RTSP y el formato <a href="http://www.apple.com/quicktime/technologies/mpeg4/" target="_blank"><em>ISMA MPEG-4</em></a>, disponemos de varias herramientas <em>open source</em> que, combinadas o por separado, nos permiten crear aplicaciones de distribuci&#243;n de contenidos multimedia. Entre ellas encontramos kits open source para codificar, transmitir y reproducir audio y v&#237;deo, como <a href="http://mpeg4ip.sourceforge.net/" target="_blank">MPEG4IP</a>, <a href="http://ffmpeg.org/" target="_blank">FFMPEG</a> o <a href="http://www.videolan.org/" target="_blank">VideoLAN</a>, o servidores de streaming como el <a href="http://developer.apple.com/opensource/index.html" target="_blank">Darwin</a> de Apple.</p>
<p>Sin embargo, Flash no soporta el protocolo RTSP lo que, en principio, no permite crear aplicaciones que combinen clientes Flash con servidores RTSP. Es cierto que es posible desarrollar soluciones h&#237;bridas utilizando Flash y un cliente RTSP como QuickTime o <a href="http://www.videolan.org/vlc/" target="_blank">VLC</a>, pero las posibilidades de integraci&#243;n son limitadas y el resultado suele ser pobre.</p>
<p>Por otra parte, parece poco l&#243;gico utilizar un componente extra para reproducir audio y v&#237;deo desde una aplicaci&#243;n Flash cuando, precisamente, este es uno de los puntos fuertes del Flash Player. Hay que tener en cuenta que desde la versi&#243;n 9, Flash Player es capaz de reproducir v&#237;deo en formato H.264 (MPEG-4) adem&#225;s de los formatos previos H.263 (Sorenson Spark) y VP6 (On2). Todo ello con poco m&#225;s de 1MB, una implantaci&#243;n del 95% y con versiones para Windows, Mac o Linux.</p>
<p>Teniendo en cuenta lo anterior, hoy por hoy, si tu plataforma en el cliente es Flash, lo deseable es utilizar RTMP. El problema es que el coste de las herramientas comerciales para la codificaci&#243;n y retransmisi&#243;n de audio/v&#237;deo, como el <a href="http://www.adobe.com/products/flashmediaserver/" target="_blank">FMS</a> o el <a href="http://www.adobe.com/products/flashmediaencoding/" target="_blank">FME</a> de Adobe, est&#225; fuera del alcance de la mayor&#237;a de los presupuestos.</p>
<p>Al abrir la especificaci&#243;n de RTMP, Adobe facilita que surjan nuevas herramientas open source basadas en este protocolo lo que a su vez nos permitir&#225; crear aplicaciones basadas 100% en Flash con un coste final asequible.</p>
<p>Ciertamente, ya exist&#237;an algunas alternativas open source&#160; como <a href="http://mammothserver.org/" target="_blank">Mammoth</a> y, sobre todo, el excelente <a href="http://osflash.org/red5" target="_blank">Red5</a>, sin embargo est&#225;n basados en ingenier&#237;a inversa del protocolo, lo que supone que no se benefician de todas sus prestaciones, especialmente en la retransmisi&#243;n de H.264, y plantea algunas dudas sobre su legalidad.</p>
<p>Con la publicaci&#243;n de la especificaci&#243;n y a falta de leer &quot;letra peque&#241;a&quot; es de esperar que los productos open source que ya exist&#237;an mejoren sustancialmente y que veamos nacer muchos otros.</p>
<p>&#161;Felicidades Adobe!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=176</wfw:commentRss>
		</item>
		<item>
		<title>Software para compartir teclado y rat&#243;n</title>
		<link>http://www.softwarepills.com/?p=163</link>
		<comments>http://www.softwarepills.com/?p=163#comments</comments>
		<pubDate>Tue, 13 Jan 2009 12:48:17 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Herramientas]]></category>

		<category><![CDATA[Control remoto]]></category>

		<category><![CDATA[InputDirector]]></category>

		<category><![CDATA[KM]]></category>

		<category><![CDATA[KVM]]></category>

		<category><![CDATA[MaxiVista]]></category>

		<category><![CDATA[Synergy]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=163</guid>
		<description><![CDATA[Si habitualmente utilizas m&#225;s de un ordenador y no tienes espacio en tu mesa para los conjuntos de teclado y rat&#243;n o te molesta cambiar de uno a otro continuamente, puede que te interese este art&#237;culo.
Como ya sabr&#225;s, en el mercado existen equipos hardware denominados KM switch (para teclado y rat&#243;n) o KVM switch (para [...]]]></description>
			<content:encoded><![CDATA[<p>Si habitualmente utilizas m&#225;s de un ordenador y no tienes espacio en tu mesa para los conjuntos de teclado y rat&#243;n o te molesta cambiar de uno a otro continuamente, puede que te interese este art&#237;culo.</p>
<p>Como ya sabr&#225;s, en el mercado existen equipos hardware denominados <em>KM switch</em> (para teclado y rat&#243;n) o <em>KVM switch</em> (para teclado, monitor y rat&#243;n) que te permiten compartir teclado, monitor y rat&#243;n entre dos o mas equipos. Sin embargo, estos aparatos necesitan cableado adicional y pueden llegar a ser bastante caros. En este art&#237;culo te presento algunas alternativas basadas en software para realizar esta labor. </p>
<p> <span id="more-163"></span>
</p>
<p>Los <em>KM o KVM software switches</em> son programas que utilizan la red de &#225;rea local para compartir teclado, rat&#243;n y monitor por lo que, adem&#225;s de reducir el cableado, se reduce el coste que en muchos casos puede ser nulo. Adem&#225;s, los switches por software ofrecen mas funcionalidades que sus hom&#243;logos hardware como el clipboard compartido o la posibilidad de mover/copiar archivos entre los equipos, entre otras.</p>
<h2>Categor&#237;as </h2>
<h4></h4>
<p>Atendiendo a la funci&#243;n principal, podemos clasificar este tipo de software en tres categor&#237;as:</p>
<h4>Para compartir el teclado y el rat&#243;n (KM)</h4>
<p>Cada equipo tiene su propio monitor pero solo se utiliza un conjunto teclado-rat&#243;n conectado a uno de los equipos. </p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="252" alt="km_ani" src="http://www.softwarepills.com/wp-content/uploads/km-ani2.gif" width="388" border="0" />&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Cuando el puntero del rat&#243;n alcanza el borde del monitor de un equipo, el teclado y el rat&#243;n pasan a gobernar el equipo anexo. Tambi&#233;n se puede utilizar una combinaci&#243;n de teclas para alternar el control entre los equipos disponibles.</p>
<p>Normalmente disponen de la posibilidad de definir la posici&#243;n f&#237;sica de los equipos para indicar cual es el ordenador que est&#225; a izquierda y derecha o incluso arriba y abajo.</p>
<h4>Para compartir teclado, monitor y rat&#243;n (KVM o control remoto)</h4>
<p>Solo un equipo tiene monitor, teclado y rat&#243;n. Utilizamos la pantalla de &#233;ste para gobernar el resto.</p>
<p>En esta categor&#237;a estar&#237;a el terminal remoto de Windows o el conocido <a href="http://www.realvnc.com/" target="_blank">VNC</a>.</p>
<h4>Para extender el escritorio utilizando la pantalla de otro ordenador</h4>
<p>Estamos acostumbrados a ver equipos con dos monitores conectados a la tarjeta gr&#225;fica de un &#250;nico ordenador, lo cual nos permite extender el escritorio de Windows a ambos. Sin embargo, en ocasiones deseamos hacer &#233;sto mismo cuando disponemos de varios ordenadores cada uno con su propio monitor.</p>
<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="91" alt="4screens" src="http://www.softwarepills.com/wp-content/uploads/4screens.gif" width="400" border="0" /> </p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Si disponemos de una tarjeta gr&#225;fica con dos salidas podremos conectar un segundo monitor desconect&#225;ndolo de su ordenador original, pero &#191;que ocurre si queremos un tercer monitor o si el monitor que queremos reutilizar es el de nuestro port&#225;til?.</p>
<p>El software de esta tercera categor&#237;a nos permite extender el escritorio de Windows a los monitores de otros equipos, incluyendo port&#225;tiles, sin tocar el cableado. El ordenador maestro se apropia de los monitores del resto de los equipos utiliz&#225;ndolos como si estuvieran conectados directamente a &#233;l.</p>
<h2>Sofware evaluado</h2>
<p>En mi caso buscaba software de la primera categor&#237;a (KM), aunque no me he podido resistir a hacer algunas pruebas con la segunda y la tercera. Lo cierto es que algunos de los programas que he encontrado abarcan incluso las tres categor&#237;as.</p>
<p><a href="http://synergy2.sourceforge.net/" target="_blank">Synergy</a></p>
<p>Es el software KM m&#225;s veterano. </p>
<p>Es open source y su caracter&#237;stica m&#225;s destacable es que es multiplataforma, por lo que podremos compartir el teclado y el rat&#243;n entre equipos Windows, Mac o Linux.</p>
<p>Es muy estable y hace lo que promete.</p>
<p>Como inconvenientes he encontrado que:</p>
<ul>
<li>Tras apagar un equipo hay que volver a conectarlo manualmente (no detecta la presencia autom&#225;ticamente). </li>
<li>No permite compartir ficheros mediante el clipboard. </li>
<li>La configuraci&#243;n es dif&#237;cil para un profano. </li>
</ul>
<p><a href="http://www.inputdirector.com/" target="_blank">InputDirector</a></p>
<p>Se trata de software gratuito (freeware) y <u>es el que he decidido utilizar</u>.</p>
<p>No tiene los problemas de <em>Synergy</em>, por ejemplo, permite el intercambio de ficheros mediante el clipboard siempre que las carpetas est&#233;n compartidas.</p>
<p>Sin embargo, solo corre en Windows (2000, XP o Vista).</p>
<p><a href="http://www.maxivista.com/" target="_blank">MaxiVista Professional</a></p>
<p>Aunque es comercial, el precio es aceptable y las prestaciones son espectaculares, ya que engloba las tres categor&#237;as.</p>
<p>No lo he seleccionado por que no soporta el interfaz <em>Aero</em> de <em>Windows Vista</em> y porque, adem&#225;s, supera mis necesidades inmediatas.</p>
<p>Te lo recomiendo si tienes un ordenador de sobremesa y un port&#225;til.</p>
<h2>Otros no evaluados</h2>
<p><a href="http://www.stardock.com/products/multiplicity/" target="_blank">Multiplicity</a></p>
<p>KM. Comercial.</p>
<p><a href="http://www.kavoom.biz/" target="_blank">KaVoom!</a></p>
<p>Varios productos: KM, KVM y ExtraMon. Comercial.</p>
<p><a href="http://fredrik.hubbe.net/win2vnc.html" target="_blank">Win2VNC</a> </p>
<p>KM. Principal Windows y secundarios Windows o Linux. Basado en VNC. Freeware.</p>
<p><a href="http://www.abyssoft.com/software/teleport/" target="_blank">Teleport</a> </p>
<p>Solo Mac. Freeware.</p>
<p><a href="http://www.derman.com/KMremoteControl/KMrC-Overview.html" target="_blank">KMremoteControl</a> </p>
<p>Solo Mac. Freeware.</p>
<p><a href="http://www.screenrecycler.com/home.html" target="_blank">ScreenRecycler</a> </p>
<p>Similar a MaxiVista. Prinicpal Mac y secundarios Mac o Windows. Comercial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=163</wfw:commentRss>
		</item>
		<item>
		<title>iPill: la p&#237;ldora inteligente</title>
		<link>http://www.softwarepills.com/?p=156</link>
		<comments>http://www.softwarepills.com/?p=156#comments</comments>
		<pubDate>Fri, 14 Nov 2008 10:24:37 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Robótica]]></category>

		<category><![CDATA[hardware]]></category>

		<category><![CDATA[píldora]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=156</guid>
		<description><![CDATA[ 
Un amigo me ha advertido de esta noticia de Reuters y no pod&#237;a dejar pasar la ocasi&#243;n de escribir unas l&#237;neas al respecto. 
Parece que Philips ha desarrollado un prototipo de &#34;p&#237;ldora inteligente&#34; con tecnolog&#237;a inal&#225;mbrica destinada al tratamiento de enfermedades del aparato digestivo.
Dispone de sensores de acidez y temperatura, y de un dep&#243;sito [...]]]></description>
			<content:encoded><![CDATA[<p><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="303" alt="image" src="http://www.softwarepills.com/wp-content/uploads/image.png" width="454" border="0" /> </p>
<p>Un amigo me ha advertido de esta <a href="http://www.reuters.com/article/technologyNews/idUSTRE4AA52V20081112?feedType=RSS&amp;feedName=technologyNews" target="_blank">noticia</a> de <em>Reuters</em> y no pod&#237;a dejar pasar la ocasi&#243;n de escribir unas l&#237;neas al respecto. </p>
<p>Parece que <em>Philips</em> ha desarrollado un prototipo de &quot;p&#237;ldora inteligente&quot; con tecnolog&#237;a inal&#225;mbrica destinada al tratamiento de enfermedades del aparato digestivo.</p>
<p>Dispone de sensores de acidez y temperatura, y de un dep&#243;sito para dispensar las medicinas donde y cuando se necesitan.</p>
<p>Ya conoc&#237;amos las p&#237;ldoras de software&#8230; &#161;Demos la bienvenida a las p&#237;ldoras de hardware!.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=156</wfw:commentRss>
		</item>
		<item>
		<title>Forzar la carga de clases en Flex</title>
		<link>http://www.softwarepills.com/?p=152</link>
		<comments>http://www.softwarepills.com/?p=152#comments</comments>
		<pubDate>Tue, 21 Oct 2008 17:18:38 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[as3]]></category>

		<category><![CDATA[classloading]]></category>

		<category><![CDATA[reflection]]></category>

		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=152</guid>
		<description><![CDATA[Recientemente he estado experimentando con las posibilidades del API de introspecci&#243;n y Reflexi&#243;n de ActionScript 3 y me he encontrado con un problema inesperado: se produce un error al tratar de crear mediante reflexi&#243;n un objeto de una clase que no se instancia expl&#237;citamente en ninguna otra parte del c&#243;digo de la aplicaci&#243;n.
El mensaje de [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente he estado experimentando con las posibilidades del API de introspecci&#243;n y <em>Reflexi&#243;n</em> de <em>ActionScript 3</em> y me he encontrado con un problema inesperado: se produce un error al tratar de crear mediante reflexi&#243;n un objeto de una clase que no se instancia expl&#237;citamente en ninguna otra parte del c&#243;digo de la aplicaci&#243;n.</p>
<p>El mensaje de error en estos casos suele ser algo como <code>Error #1065: No se ha definido la variable MyClass</code>.</p>
<p>Se trata de un problema de <em>classloading</em> y se debe a que el compilador de Flex no incluye en el archivo SWF las clases que no se referencian expl&#237;citamente en el c&#243;digo.</p>
<p> <span id="more-152"></span>
<p>Por ejemplo, el siguiente c&#243;digo fallar&#225; a menos que la clase <code>MyClass</code> se utilice en alguna otra parte:</p>
<pre class="javascript" name="code">import com.softwarepills.MyClass;

var clazz:Class = getDefinitionByName(&quot;com.softwarepills.MyClass&quot;) as Class;
var instance:Object = new clazz();					</pre>
<p>A pesar de utilizar <code>import</code>, el SWF resultante no incluye la clase <code>MyClass</code>.</p>
<p>Para que el compilador incluya la clase es necesario utilizarla como en:</p>
<pre class="javascript" name="code">import com.softwarepills.MyClass;

var clazz:Class = getDefinitionByName(&quot;com.softwarepills.MyClass&quot;) as Class;
var instance:MyClass = new clazz() as MyClass;					</pre>
<p>Si, esto si funciona, pero si usamos <em>reflection</em> es porque, precisamente, no queremos incluir una referencia expl&#237;cita a la clase.</p>
<p>Buscando en la Red he encontrado varias soluciones<sup>[1]</sup>. Una consiste en utilizar en una variable &quot;dummy&quot; en un punto arbitrario del c&#243;digo, por ejemplo:</p>
<pre class="javascript" name="code">import com.softwarepills.MyClass;

var dummy:MyClass = new MyClass();					</pre>
<p>Este sistema no me gusta porque puede llevar a confusi&#243;n y, adem&#225;s, es demasiado c&#243;digo para tan poca cosa. </p>
<p>El segundo m&#233;todo que se menciona consiste en crear un librer&#237;a SWF con todas las clases que necesitamos y compilar la aplicaci&#243;n con ella, pero esto me parece demasiado aparatoso y propenso a errores. </p>
<p>Investigando un poco m&#225;s he encontrado la que me parece la soluci&#243;n &quot;menos mala&quot;, que consiste en utilizar un bloque de c&#243;digo est&#225;tico como en el siguiente ejemplo:</p>
<pre class="javascript" name="code">import com.softwarepills.MyClass;
import com.softwarepills.MyOtherClass;

{MyClass,MyOtherClass}</pre>
<p>Esta es para mi la forma mas compacta y menos aparatosa; se trata de enumerar las clases dentro de un bloque est&#225;tico en cualquier cualquier fichero <code>.as</code> o <code>.mxml </code>de la aplicaci&#243;n. </p>
<p>&#191;No sabias que exist&#237;a un bloque est&#225;tico de c&#243;digo? Yo tampoco. Lo encontr&#233; en un <a href="http://www.insideria.com/2008/05/more-on-static-code.html" target="_blank">art&#237;culo</a> de <em>insideria.com</em>, donde tambi&#233;n puedes enterarte de otras formas de trabajar con c&#243;digo est&#225;tico o de incializaci&#243;n.</p>
<ol class="footnotes">
<li id="footnote_0_152" class="footnote">Como en <a title="http://thillerson.wordpress.com/2007/03/01/runtime-class-instantiation-in-actionscript-30/" href="http://thillerson.wordpress.com/2007/03/01/runtime-class-instantiation-in-actionscript-30/" target="_blank">http://thillerson.wordpress.com/2007/03/01/runtime-class-instantiation-in-actionscript-30/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=152</wfw:commentRss>
		</item>
		<item>
		<title>Se busca sustituto de Cairngorm</title>
		<link>http://www.softwarepills.com/?p=147</link>
		<comments>http://www.softwarepills.com/?p=147#comments</comments>
		<pubDate>Thu, 16 Oct 2008 09:00:55 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Cairngorm]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[Guasax]]></category>

		<category><![CDATA[Mate]]></category>

		<category><![CDATA[Prana]]></category>

		<category><![CDATA[PureMVC]]></category>

		<category><![CDATA[Swiz]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=147</guid>
		<description><![CDATA[Estoy agradecido a Cairngorm porque, en su d&#237;a, fue un buen punto de partida y, a muchos, nos ha introducido en el mundo de los RIA y de Flex por el camino de las buenas pr&#225;cticas. 
Sin embargo, despu&#233;s de varios meses aplic&#225;ndolo descubres que tiene sus inconvenientes: Cairngorm requiere mucho c&#243;digo repetitivo y, en [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy agradecido a <em>Cairngorm </em>porque, en su d&#237;a, fue un buen punto de partida y, a muchos, nos ha introducido en el mundo de los RIA y de Flex por el camino de las buenas pr&#225;cticas. </p>
<p>Sin embargo, despu&#233;s de varios meses aplic&#225;ndolo descubres que tiene sus inconvenientes: Cairngorm requiere mucho c&#243;digo repetitivo y, en ocasiones, es demasiado &quot;retorcido&quot; en situaciones que no lo justifican. Entonces, te empiezas a preguntar si quiz&#225; existe una arquitectura mejor, que requiera menos c&#243;digo y que te permita concentrarte m&#225;s en la aplicaci&#243;n y menos en los detalles de implementaci&#243;n. </p>
<p>En esta entrada indagar&#233; en las alternativas que existen en &#233;ste momento y seleccionar&#233; las mejores candidatas a suceder a Cairngorm.</p>
<p>Para empezar, voy a tratar de enumerar las debilidades de Cairngorm y cuales deber&#237;an ser, desde mi punto de vista, las caracter&#237;sticas de su sucesor.</p>
<p> <span id="more-147"></span><br />
<h2>Las debilidades de Cairngorm</h2>
<p>Cualquiera que utilice Cairngorm lo ha sufrido; hay que escribir un mont&#243;n de<strong> </strong>c&#243;digo repetitivo: el evento, el comando, el <em>BusisnessDelegate</em>,&#8230; y ya sabemos que m&#225;s c&#243;digo significa m&#225;s trabajo para mantenerlo.</p>
<p>Se abusa de los <em>singletons</em>, lo que hace que la aplicaci&#243;n sea m&#225;s monol&#237;tica y los componentes est&#233;n demasiado acoplados; por ejemplo, los comandos son dif&#237;cilmente reutilizables. En Java hace ya tiempo que los abandonamos (<em>ServiceLocator</em>, <em>ModelLocator</em>, etc.) en favor de otras t&#233;cnicas como el <em>IoC</em>.</p>
<p>Por otro lado, para hacer que los componentes de las vistas sean algo m&#225;s reutilizables se aconseja no usar los singletons en los componentes internos y hacerlo solo en los componentes de nivel superior. Esto implica que debemos utilizar variables para propagar los datos desde las vistas de nivel superior a los componentes mas internos y eventos para el recorrido inverso. Esto implica que muchos componentes manejan datos que no utilizan, solo para pas&#225;rselos a un componente de nivel superior o inferior.</p>
<p>No hay una soluci&#243;n limpia para implementar las acciones de usuario que implican la ejecuci&#243;n de varias tareas as&#237;ncronas. Los comandos encadenados son un parche y no una verdadera soluci&#243;n para este caso de uso<sup>[1]</sup>.</p>
<p>Aunque Cairngorm pretende separar las responsabilidades y establecer la metodolog&#237;a y el modelo de programaci&#243;n, en muchos casos es ambiguo y los programadores tienen problemas para identificar cuando una variable es de estado o del modelo, cuando se puede actuar directamente sobre la vista o hay que utilizar un evento-comando, etc.</p>
<p>Otro aspecto que no me gusta, es que utiliza un sistema de despachado de eventos propio. No comprendo la necesidad de hacer esto cuando Flex dispone de una gesti&#243;n de eventos muy completa y eficiente.</p>
<p>Finalmente, aunque es posible conseguir una aplicaci&#243;n modular con Cairngorm, la soluci&#243;n no es inmediata. En mi caso fue necesario modificar algunas de las clases del n&#250;cleo para conseguir algo parecido a una aplicaci&#243;n modular.</p>
<p>&#160;</p>
<h2>Los requisitos</h2>
<p>El nuevo framework debe aportar soluciones a las debilidades de Cairngorm, empezando por abandonar el uso de singletons y facilitar el desacoplamiento de los componentes. Una buena alternativa es el uso de IoC que, como luego veremos, est&#225; empezando a ser muy com&#250;n tambi&#233;n en los frameworks de Flex. </p>
<p>Debe reducir y simplificar el c&#243;digo de modo que el programador no se pierda en los detalles de la implementaci&#243;n y pueda centrarse en la funcionalidad. </p>
<p>Tambi&#233;n ser&#237;a deseable que facilite la construcci&#243;n de aplicaciones modulares y que utilice al m&#225;ximo las caracter&#237;sticas propias de Flex. Despu&#233;s de todo Flex es, en s&#237;, un framework de aplicaci&#243;n y lo que buscamos es una arquitectura y unas utilidades que nos faciliten la vida<sup>[2]</sup>.</p>
<p>Por &#250;ltimo, debe facilitar los <em>unit tests</em> y el uso de <em>mock objects</em> y, por supuesto debe ser <em>open source</em> y, como para cualquier otro software, es deseable que disponga de buena documentaci&#243;n, de una comunidad de desarrolladores activa, que tenga gran implantaci&#243;n y perspectivas de continuidad.</p>
<p>&#160;</p>
<h2>Alternativas descartadas</h2>
<p>Flex adquiri&#243; popularidad con el lanzamiento de la versi&#243;n 2 en 2006. Por aquel entonces muchos decidimos utilizar Cairngorm porque pr&#225;cticamente era el &#250;nico framework de arquitectura disponible. Desde entonces, es sorprendente la cantidad de alternativas que han surgido.</p>
<p>Dado el n&#250;mero de candidatos, he descartado aquellos que, a primera vista, no cumplen los requisitos o que, estudiados m&#225;s de cerca, no parecen aportar ventajas significativas respecto a Cairngorm.</p>
<p>La lista de candidatos rechazados es la siguiente:</p>
<h4><a href="http://osflash.org/projects/arp " target="_blank">ARP</a></h4>
<p>Es uno de los mas veteranos, ya que se ven&#237;a usando en aplicaciones Flash, y es gen&#233;rico para AS2/AS3.</p>
<h4><a href="http://www.servebox.com/foundry/doku.php" target="_blank">Servebox Foundry</a></h4>
<p>Incluye ciertas prestaciones de alto nivel como browsing (navegaci&#243;n), globalizaci&#243;n, b&#250;squedas y control de acceso, para lo cual debes usar subclases de sus propios objetos aplicaci&#243;n, form, etc.</p>
<p>Es un conjunto de soluciones, incluyendo parte servidor, que utilizaba la empresa <em>ServerBox</em> en sus desarrollos y que han decidido convertir en un proyecto open source.</p>
<h4><a href="http://flicc.sourceforge.net/" target="_blank">Flicc</a> </h4>
<p>Es un implementaci&#243;n IoC basada en MXML. </p>
<p>No resuelve nada en el resto de aspectos (MVC, comunicaci&#243;n con el servidor, etc).</p>
<h4><a href="http://code.google.com/p/flest/" target="_blank">Flest</a></h4>
<p>Utiliza <em>closures</em> como comandos.</p>
<p>Conserva muchos de los puntos d&#233;biles de Cairngorm. </p>
<p>Parece que no hay actividad desde Agosto del 2007.</p>
<h4><a href="http://code.google.com/p/flex-ioc/" target="_blank">Flex IOC</a></h4>
<p>Como <em>Flicc</em>, es solo una implementaci&#243;n del patr&#243;n IoC, pero con anotaciones y en menos de 100 l&#237;neas de c&#243;digo. </p>
<p>Lo conozco hace tiempo y creo que fue el primero en utilizar anotaciones (probablemente sea el origen de la idea).</p>
<h4><a href="http://www.gaiaflashframework.com/" target="_blank">Gaia</a></h4>
<p>Est&#225; orientado a aplicaciones Flash (AS2/AS3). </p>
<h4><a href="http://www.guasax.com/guasax/web/en/index.php" target="_blank">Guasax</a></h4>
<p>Se basa en una filosof&#237;a similar a Struts, donde los acciones se declaran en XML (los m&#233;todos de los Business Objects). </p>
<p>Dispone de interceptores para las llamadas y de una gesti&#243;n de roles de usuarios.</p>
<p>Reduce el c&#243;digo, al eliminar el evento y el comando de Cairngorm, sustituy&#233;ndolo por llamadas con arrays y el XML de acciones, y moviendo el c&#243;digo del comando y el <em>BusinessDelegate</em> a los <em>Business Objects</em>.</p>
<p>El uso de XML y de arrays hace que el compilador no pueda ayudarnos en la detecci&#243;n de errores de tipo.</p>
<p>En resumen, sigue utilizando singletons pero reduce el c&#243;digo repetitivo. </p>
<p>La &#250;ltima actualizaci&#243;n es de Septiembre de 2007.</p>
<h4><a href="http://www.model-glue.com/flex.cfm" target="_blank">Model-Glue: Flex</a></h4>
<p>Creado a partir de una versi&#243;n para ColdFusion.</p>
<p>Utiliza clases helper e invocaci&#243;n impl&#237;cita para eliminar c&#243;digo repetitivo (los componentes lanzan eventos que recoge el contenedor).</p>
<p>Tiene escasa documentaci&#243;n y el proyecto parece estar detenido en una versi&#243;n <em>Alpha</em>. </p>
<h4><a href="http://www.adobe.com/devnet/flex/articles/blueprint.html" target="_blank">MVCS</a></h4>
<p>No es un framework, es un dise&#241;o&#160; o <em>blueprint</em>.</p>
<h4><a href="http://www.spicefactory.org/parsley/" target="_blank">Parsley (SpiceFactory)</a></h4>
<p>Incluye IoC basado en XML, MVC y prestaciones de localizaci&#243;n (v&#237;a XML).</p>
<p>Tiene los componentes esenciales para ser una buena plataforma y, adem&#225;s, dispone de muy buena documentaci&#243;n, pero faltan herramientas b&#225;sicas para el trabajo con RemoteObjects. Esto se debe a que la misma empresa distribuye&#160; un componente servidor llamado <em>Cinnamon Remoting</em> que tiene sus propios mecanismos de acceso.</p>
<p>Puede que en el futuro sea una opci&#243;n interesante. </p>
<h4><a href="http://www.flexpasta.com/index.php/2008/04/19/introducing-the-penne-framework-for-flex-3/" target="_blank">Penne</a></h4>
<p>Otra simplificaci&#243;n de Cairngorm (en este caso quiz&#225; una sobre-simplificaci&#243;n).</p>
<p>El autor tiene obsesi&#243;n por la pasta y utiliza nombres del estilo &quot;getPastaTypes&quot; o &quot;IPastaRemoteRequest&quot;. En fin&#8230;</p>
<h4><a href="http://www.pranaframework.org/" target="_blank">Prana</a></h4>
<p>Es una implementaci&#243;n IoC basada en Spring y XML. Creo que fue la primera y, probablemente, es la mas establecida y la m&#225;s documentada.</p>
<p>Lo interesante es que tiene soporte para Cairngorm y PureMVC.</p>
<p>El uso de XML y contextos de aplicaci&#243;n puede ser aplicable para crear aplicaciones modulares.</p>
<h4><a href="http://puremvc.org/" target="_blank">PureMVC/Flex</a></h4>
<p>Quiz&#225; sea el framework MVC para Flex m&#225;s adoptado despu&#233;s de Cairngorm.</p>
<p>Esta muy bien documentada, pero se trata de una implementaci&#243;n neutral disponible para varios lenguajes, de modo que no utiliza a fondo las prestaciones de Flex en cuanto a gesti&#243;n de eventos o bindings.</p>
<p>Utiliza algunos singletons como el ServiceLocator ya que no hace uso de IoC.</p>
<p>En <a title="http://www.techper.net/2008/10/05/4-things-to-hate-about-puremvc/" href="http://www.techper.net/2008/10/05/4-things-to-hate-about-puremvc/">http://www.techper.net/2008/10/05/4-things-to-hate-about-puremvc/</a> se describen algunos otros defectos. </p>
<p>La descarto, no sin muchas dudas, por que intuyo que la curva de aprendizaje es larga y que, adem&#225;s, no va a simplificar la programaci&#243;n. Al contrario, me temo que su adopci&#243;n implicar&#237;a meternos en un mar de patrones que &quot;formalmente&quot; ser&#237;a lo aconsejable, pero en la pr&#225;ctica puede ser excesivo.</p>
<h4><a href="http://code.google.com/p/flex-slide/" target="_blank">Slide</a></h4>
<p>La documentaci&#243;n es casi nula. </p>
<h4><a href="http://code.google.com/p/smartypants-ioc/" target="_blank">Smartypants IOC</a></h4>
<p>De nuevo una implementaci&#243;n de IoC pero, a diferencia de la mayor&#237;a, est&#225; basada en la filosof&#237;a de <em>Guice</em> y no en Spring. </p>
<h4><a href="http://code.google.com/p/vegas/" target="_blank">VEGAS</a></h4>
<p>Se trata de un conglomerado de librer&#237;as para AS1/2/3. Entre ellas encontramos implementaciones de patrones MVC e IoC.</p>
<p>&#160;</p>
<h2>Los finalistas </h2>
<p>Despu&#233;s de la primera criba, estos son mis dos finalistas: <em>Mate</em> y <em>Swiz</em>. </p>
<p>Por el camino he abandonado otras opciones que no descarto retomar si estos dos no est&#225;n a la altura de mis expectativas. Sin embargo, los dos tienen aspectos interesantes y&#160; novedosos que los hacen merecedores de un estudio en profundidad. </p>
<h4><a href="http://mate.asfusion.com/" target="_blank">Mate</a></h4>
<p><em>Mate</em> es uno de los nuevos frameworks que &#250;ltimamente ha adquirido una gran popularidad. Seguramente es el m&#225;s adoptado despu&#233;s de Cairngorm y PureMVC.</p>
<p>Mate no impone un patr&#243;n, sino que ofrece una serie de herramientas que te permiten crear aplicaciones RIA con MVC de una forma no intrusiva, es decir, observando el c&#243;digo no encontrar&#225;s referencias al framework. Es el framework quien, desde &quot;fuera&quot;, gestiona las clases de tu aplicaci&#243;n utilizando t&#233;cnicas de IoC.</p>
<p>Para ello se utiliza un fichero MXML central, el <em>EventMap</em>, que incluye los tags que definen como se va a comportar tu aplicaci&#243;n. Por ejemplo, mediante el tag <em>Injectors</em> es posible inyectar valores en la vistas tras obtener del servidor los resultados de una petici&#243;n.</p>
<p>Adem&#225;s, Mate es un proyecto muy activo y dispone de suficiente documentaci&#243;n.</p>
<p>El &#250;nico aspecto negativo que puedo intuir en este momento es que los EventMaps pueden llegar a ser muy extensos y dif&#237;ciles de interpretar en aplicaciones grandes, al estilo de lo que ven&#237;a ocurriendo con Spring.</p>
<p>Estos son algunos enlaces que te pueden ser &#250;tiles para conocer un poco mejor este framework:</p>
<ul>
<li><a href="http://link.brightcove.com/services/player/bcpid1733261879?bclid=1729365228&amp;bctid=1738801386" target="_blank">La presentaci&#243;n en v&#237;deo</a>. </li>
<li><em><a href="http://www.flashmagazine.com/reviews/detail/mate_event_driven_framework_for_flex/" target="_blank">Art&#237;culo de flashmagazine.com</a>.</em> </li>
<li><a href="http://www.fusioncube.net/index.php/flex-frameworks-mate-review " target="_blank">Otra revisi&#243;n</a>. </li>
<li><a href=" http://www.techper.net/2008/09/10/mate-the-good-the-bad-and-the-ugly/ " target="_blank">Un art&#237;culo que destaca sus puntos d&#233;biles</a>. </li>
<li><a href="http://flexblog.faratasystems.com/?p=342" target="_blank">Un diagrama de su arquitectura</a>.&#160; </li>
</ul>
<h4><a href="http://code.google.com/p/swizframework/ " target="_blank">Swiz</a></h4>
<p>Es probablemente el framework mas innovador y mas reciente, pero ya ha cautivado la atenci&#243;n de la comunidad de desarrolladores de Flex (y la m&#237;a tambi&#233;n).</p>
<p>Se basa en un n&#250;cleo IoC que utiliza ficheros MXML llamados <em>BeanLoaders</em> para definir los componentes (al estilo Spring) y anotaciones para definir los puntos de inyecci&#243;n (por lo que no es necesario el uso de XML). Esto, de entrada, elimina la necesidad de singletons expl&#237;citos. </p>
<p>Cuando creamos una vista, el contendor de IoC detecta que se ha a&#241;adido un componente al <em>stage</em> y autom&#225;ticamente inyecta las variables necesarias sin necesidad de c&#243;digo adicional; simplemente anotando la variable con <em>Autowire</em>.</p>
<p>Por si esto fuera poco, adem&#225;s, incluye una serie de utilidades que permiten trabajar con las llamadas as&#237;ncronas de una forma muy c&#243;moda y poco aparatosa gracias a las clases DynamicCommand y DynamicResponder que se crean bajo demanda &quot;en el aire&quot;. Incluso puedes encadenar varias llamadas as&#237;ncronas con la clase <em>CommandChain</em>.</p>
<p>Tambi&#233;n dispone de una anotaci&#243;n <em>Mediate</em> que permite asociar los eventos con las funciones que los atienden en el controlador, por medio de lo que el autor llama <em>DynamicMediators</em>. Esto elimina tambi&#233;n el t&#237;pico c&#243;digo que llama a una funci&#243;n al recibir el evento.</p>
<p>En la gesti&#243;n de eventos no reinventa la rueda y utiliza la infraestructura de Flex, lo cual hace el framework a&#250;n menos intrusivo.</p>
<p>En esencia, en una aplicaci&#243;n Swiz solo intervienen las vistas , los eventos, el controlador y, si se quiere as&#237;, los <em>Busisness Delagates</em>. El resultado es sorprendente: desaparece todo el c&#243;digo repetitivo y se entiende a la perfecci&#243;n.</p>
<p>Tengo que decir que, por ahora, es la opci&#243;n que m&#225;s me atrae, sobre todo, por su simplicidad. </p>
<p>Sin embargo, tambi&#233;n tengo algunas dudas: la documentaci&#243;n es escasa (pero es que&#8230; es tan sencillo!), me preocupa la continuidad del proyecto y su nivel de aceptaci&#243;n, y a&#250;n queda ver como se comporta en aplicaciones grandes y modulares. En resumen, la apuesta es arriesgada.</p>
<p>Otro aspecto no resuelto, por el momento, es el tema de los <em>mock objects</em>, pero seguro que hay alguna soluci&#243;n si se estudia detenidamente<sup>[3]</sup></p>
<p>Algunos enlaces relacionados son:</p>
<ul>
<li><a href="http://www.onflex.org/ted/2008/09/360flex-sj-2008-introduction-to-swiz.php " target="_blank">La presentaci&#243;n en v&#237;deo</a>. </li>
<li><a href="http://cdscott.blogspot.com/" target="_blank">El blog del autor</a>. </li>
<li><a href="http://soenkerohde.com/2008/09/swiz-framework-brutally-simple/ " target="_blank">Un art&#237;culo de alguien tan impresionado como yo</a>. </li>
</ul>
<p>&#160;</p>
<h2>Otros recursos en Internet</h2>
<ul>
<li><a href="http://www.infoq.com/news/2008/01/flex-mvc" target="_blank">Un art&#237;culo similar</a>. </li>
<li><a href="http://www.simonwhatley.co.uk/ria-flex-air-frameworks" target="_blank">Otro art&#237;culo</a> </li>
<li><a href="https://admin.adobe.acrobat.com/_a200985228/p12266504/ " target="_blank">V&#237;deo de un charla en Adobe comparando frameworks</a>. </li>
</ul>
<p>&#160;</p>
<p>Ahora toca estudiar en detalle los tres finalistas y hacer algunos ensayos con diferentes casos de uso para ver qui&#233;n es el digno sucesor de Cairngorm. </p>
<p>Mientras tanto si tienes experiencia con alguno de ellos, te agradecer&#237;a un comentario con tus impresiones.</p>
<ol class="footnotes">
<li id="footnote_0_147" class="footnote">Utilizando <a href="http://umcairngorm.riaforge.org/" target="_blank">Universal Mind Cairngorm Extensions</a> se solucionan parcialmente este y otros problemas de Cairngorm</li>
<li id="footnote_1_147" class="footnote">Esta es una conversaci&#243;n interesante sobre la necesidad de usar un framework en Flex: <a title="http://flexblog.faratasystems.com/?p=280" href="http://flexblog.faratasystems.com/?p=280">http://flexblog.faratasystems.com/?p=280</a></li>
<li id="footnote_2_147" class="footnote">En este art&#237;culo se describe una alternativa: <a title="http://soenkerohde.com/2008/10/conditional-compilation-to-mock-with-swiz/" href="http://soenkerohde.com/2008/10/conditional-compilation-to-mock-with-swiz/">http://soenkerohde.com/2008/10/conditional-compilation-to-mock-with-swiz/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=147</wfw:commentRss>
		</item>
		<item>
		<title>Gesti&#243;n de dependencias con Maven (I)</title>
		<link>http://www.softwarepills.com/?p=136</link>
		<comments>http://www.softwarepills.com/?p=136#comments</comments>
		<pubDate>Mon, 13 Oct 2008 17:58:18 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Herramientas]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[dependencias]]></category>

		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=136</guid>
		<description><![CDATA[Tengo que reconocer que cuanto m&#225;s uso Maven m&#225;s me gusta. Un sistema de construcci&#243;n de proyectos est&#225;ndar, extensible y basado en una lenguaje declarativo[1] es, al menos en su planteamiento, una herramienta muy prometedora.
Sin embargo, el proceso de aprendizaje ha sido largo y duro, entre otras cosas, porque Maven parece estar en un continuo [...]]]></description>
			<content:encoded><![CDATA[<p>Tengo que reconocer que cuanto m&#225;s uso <em>Maven</em> m&#225;s me gusta. Un sistema de construcci&#243;n de proyectos est&#225;ndar, extensible y basado en una lenguaje declarativo<sup>[1]</sup> es, al menos en su planteamiento, una herramienta muy prometedora.</p>
<p>Sin embargo, el proceso de aprendizaje ha sido largo y duro, entre otras cosas, porque Maven parece estar en un continuo estado de inestabilidad, plagado de detalles indocumentados, de versiones <em>Beta,</em> actualizaciones, etc. Tanto es as&#237;, que a&#250;n despu&#233;s de haber le&#237;do los dos libros gratuitos que hay en la Red<sup>[2]</sup>, la <a href="http://maven.apache.org/" target="_blank">documentaci&#243;n</a> y numerosos foros y art&#237;culos, todav&#237;a me quedan muchos puntos oscuros.</p>
<p>Hasta ahora Maven me ha sido muy &#250;til en temas como en la automatizaci&#243;n del proceso de construcci&#243;n, almacenamiento de los artefactos de forma ordenada utilizando repositorios compartidos o la obtenci&#243;n de artefactos de terceros almacenados en repositorios en Internet y, sin embargo, me he encontrado muchos problemas en lo que se supone que es un punto fuerte de Maven: la gesti&#243;n de dependencias.</p>
<p>Aqu&#237; comienza una serie de tres entradas en las que voy a tratar de explicar como funciona la gesti&#243;n de dependencias en Maven pero, sobre todo, voy a profundizar en los aspectos que no est&#225;n claros en la documentaci&#243;n (o que no lo estaban para mi) y que he aprendido, a las malas, con la experiencia.</p>
<p>En esta entrada hablar&#233; sobre los aspectos b&#225;sicos de la gesti&#243;n de dependencias con Maven, la segunda tratar&#225; caracter&#237;sticas avanzadas y la tercera y &#250;ltima estar&#225; dedicada a dise&#241;o y buenas pr&#225;cticas<sup>[3]</sup>.</p>
<p> <span id="more-136"></span>
</p>
<h3>Versiones</h3>
<p>Maven utiliza un esquema de versiones que consta de las siguientes partes:</p>
<p><code>&lt;major version&gt;.&lt;minor version&gt;.&lt;incremental version&gt;-&lt;qualifier&gt;</code></p>
<ul>
<li><em>Versi&#243;n mayor</em>:&#160; normalmente un cambio de versi&#243;n mayor denota incompatibilidad con las versiones anteriores. </li>
<li><em>Versi&#243;n menor</em>: se incrementa cuando se incorporan nuevas funcionalidades, pero compatibles. </li>
<li><em>&quot;Bug fix&quot; o versi&#243;n incremental</em>: se cambia cada vez que se lanza una nueva versi&#243;n que repara alg&#250;n error. </li>
<li>&quot;<em>Qualifier&quot; o &quot;Build Number&quot;</em>: se separa por un gui&#243;n y marca hitos o &quot;millestones&quot; previos a la distribuci&#243;n del artefacto, por ejemplo, <code>alpha</code>, <code>beta</code> o&#160; <code>GA</code>. </li>
</ul>
<p>Aunque este es el esquema est&#225;ndar de versionado, con frecuencia encontrar&#225;s que no siempre se utilizan todas las partes de una versi&#243;n y que se recurre a versiones abreviadas como <code>1.2</code>, <code>2.0-beta</code>, etc.</p>
<p>Normalmente, para determinar si una versi&#243;n es superior a otra se utiliza una comparaci&#243;n num&#233;rica, lo cual funcionar&#225; siempre que se respete el esquema anterior. Sin embargo es frecuente encontrar versiones con partes que incluyen n&#250;meros adem&#225;s de letras y entonces Maven realizar&#225; una comparaci&#243;n alfanum&#233;rica que puede no ser siempre correcta.&#160; Esto es especialmente habitual en los calificadores. Por ejemplo <code>1.2.3-alpha-10</code> se considerar&#225; inferior a <code>1.2.3-alpha-2</code>.</p>
<p>Las versiones se utilizan para etiquetar cada lanzamiento o &quot;release&quot; de un artefacto, son inmutables y corresponden a un conjunto de fuentes etiquetados a su vez en el control de versiones. Sin embargo, durante el desarrollo se generan artefactos temporales denominados &quot;SNAPHOSTS&quot; que no corresponden a un hito; simplemente se utilizan para hacer ensayos o para trabajar en equipo.</p>
<p>El versionado de los snapshots es parcialmente generado por Maven en base al momento de la construcci&#243;n del artefacto.</p>
<p><a href="http://www.softwarepills.com/wp-content/uploads/version.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="110" alt="version" src="http://www.softwarepills.com/wp-content/uploads/version-thumb.png" width="260" border="0" /></a></p>
<p>El ejemplo muestra la versi&#243;n de un snapshot; en este caso el snapshot corresponde a un artefacto temporal generado el d&#237;a 11/2/2006 a las 13:11:14 durante el desarrollo para alcanzar la versi&#243;n <code>1.0.1-1</code>. </p>
<p>Este esquema de versionado se utiliza cuando interesa conservar varios snapshots y as&#237; poder volver a un estado anterior del desarrollo, pero tambi&#233;n se puede configurar Maven para que solo se utilice una versi&#243;n &#250;nica de snapshot, en cuyo caso se sustituye el build number por el texto fijo <code>SNAPSHOT</code>, por ejemplo, <code>1.0.1-SNAPSHOT-1</code>. Cuando Maven se configura de este modo cada snaphsot sustituye al anterior, es decir, solo se conserva una copia del snapshot correspondiente a la &#250;ltima construcci&#243;n<sup>[4]</sup></p>
<h3>Dependencias</h3>
<p>Para especificar las dependencias en Maven se utiliza la secci&#243;n <code>dependency</code> del POM:</p>
<pre class="xml" name="code">&lt;project&gt;
	...
	&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
  	&lt;artifactId&gt;sample&lt;/artifactId&gt;
  	&lt;version&gt;1.0&lt;/version&gt;
  	...
	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;log4j&lt;/groupId&gt;
			&lt;artifactId&gt;log4j&lt;/artifactId&gt;
			&lt;version&gt;1.2&lt;/version&gt;
			&lt;type&gt;jar&lt;/type&gt;
		&lt;/dependency&gt;
		...
	&lt;/dependencies&gt;
	...
&lt;/project&gt;</pre>
<p>Como veremos m&#225;s adelante, no siempre es necesario enumerar aqu&#237; todas las dependencias, ya que nuestro POM puede adquirirlas por otros mecanismos.</p>
<h3>Herencia</h3>
<p>El primero de estos mecanismos es la herencia:</p>
<pre class="xml" name="code">&lt;project&gt;
	...
	&lt;parent&gt;
		&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
		&lt;artifactId&gt;sample&lt;/artifactId&gt;
		&lt;version&gt;1.0&lt;/version&gt;
	&lt;/parent&gt;
	&lt;artifactId&gt;sample-app&lt;/artifactId&gt;
	&lt;version&gt;1.0&lt;/version&gt;
	...
&lt;/project&gt;</pre>
<p>En el ejemplo, al declarar un padre, nuestro POM adquiere las dependencias de &#233;ste (log4j). El concepto de herencia tiene el mismo significado que en POO: el hijo hereda las caracter&#237;sticas del padre.</p>
<p>Por el momento a nosotros solo nos interesan las dependencias, pero es necesario aclarar que tambi&#233;n se heredan otros atributos del POM padre por lo que no siempre la herencia es el mejor m&#233;todo para compartir y transmitir dependencias.</p>
<p>Para comprobar como queda el POM incluyendo las aportaciones de los padres podemos utilizar el comando:</p>
<p><code>mvn help:effective-pom</code></p>
<h3>Dependencias transitivas</h3>
<p>Las dependencias transitivas son aquellas que se establecen indirectamente, es decir, si el artefacto <code>A</code> depende de <code>B</code> y <code>B</code> depende de <code>C</code>, entonces se establece una dependencia transitiva entre <code>A</code> y <code>C</code>.</p>
<p>Gracias a esta caracter&#237;stica introducida&#160; por primera vez en Maven 2.0, podemos especificar solo las dependencias directas y dejar que Maven se encargue de recopilar el resto, o lo que es lo mismo, no tenemos que especificar todas y cada una de las dependencias transitivas en nuestro POM.</p>
<p>Utilizando las dependencias transitivas, Maven construye el &#225;rbol de dependencias que se utilizar&#225; m&#225;s adelante con diferentes prop&#243;sitos. </p>
<p>Para visualizar el &#225;rbol de dependencias podemos ejecutar el comando:</p>
<p><code>mvn dependency:tree</code></p>
<h3>Composici&#243;n</h3>
<p>Como en POO, adem&#225;s de la herencia, en Maven existe otro mecanismo con el que transmitir y compartir atributos o funcionalidad: la composici&#243;n.</p>
<p>Gracias a la transitividad de las dependencias&#160; podemos agrupar un conjunto de versiones en un POM y hacer uso de ellas en diferentes artefactos. En el siguiente ejemplo se agrupan las dependencias relacionadas con el framework<em> Spring</em>:</p>
<pre class="xml" name="code">&lt;project&gt;
	...
	&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
  	&lt;artifactId&gt;spring-deps&lt;/artifactId&gt;
	&lt;version&gt;${spring.version}&lt;/version&gt;
	&lt;packaging&gt;pom&lt;/packaging&gt;
  	...
	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.springframework&lt;/groupId&gt;
			&lt;artifactId&gt;spring-core&lt;/artifactId&gt;
			&lt;version&gt;${spring.version}&lt;/version&gt;
		&lt;/dependency&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;org.springframework&lt;/groupId&gt;
			&lt;artifactId&gt;spring-beans&lt;/artifactId&gt;
			&lt;version&gt;${spring.version}&lt;/version&gt;
		&lt;/dependency&gt;
		...
	&lt;/dependencies&gt;
	...
	&lt;properties&gt;
		&lt;spring.version&gt;2.0.5&lt;/spring.version&gt;
	&lt;/properties&gt;
	...
&lt;/project&gt;</pre>
<p>En este caso, adem&#225;s,utilizamos la variable <code>spring.version</code> para almacenar la versi&#243;n. Esta t&#233;cnica hace que nuestros POMs sean m&#225;s legibles y f&#225;ciles de mantener. </p>
<p>Luego, en uno o mas artefactos propios podr&#237;amos hacer uso del conjunto de dependencias declarando una dependencia del POM de Spring, como en el siguiente ejemplo:</p>
<pre class="xml" name="code">&lt;project&gt;
	...
	&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
  	&lt;artifactId&gt;spring-project&lt;/artifactId&gt;
  	&lt;version&gt;1.0&lt;/version&gt;
  	...
	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
			&lt;artifactId&gt;spring-deps&lt;/artifactId&gt;
			&lt;version&gt;2.0.5&lt;/version&gt;
			&lt;type&gt;pom&lt;/type&gt;
		&lt;/dependency&gt;
		...
	&lt;/dependencies&gt;
	...
&lt;/project&gt;</pre>
<p>El principio &quot;prefiere la composici&#243;n a la herencia&quot; que aconseja en el dise&#241;o POO, tambi&#233;n rige aqu&#237;. La herencia es un mecanismo muy c&#243;modo pero tambi&#233;n muy r&#237;gido. Si abusas de ella te puedes encontrar problemas a la hora de incorporar modificaciones sobrevenidas.</p>
<h3>Resoluci&#243;n de versiones</h3>
<p>El objetivo de la gesti&#243;n de dependencias es obtener el conjunto de artefactos o classpath que se utilizar&#225; en una determinada fase de la construcci&#243;n del proyecto. Hasta ahora hemos hablado del &#225;rbol de dependencias, pero es evidente que no es lo que necesitamos&#8230; un &#225;rbol tiene ramas y una misma dependencia puede aparecer en m&#225;s de una rama y, lo que es peor, puede aparecer con diferente versi&#243;n.</p>
<p>&#160;<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="maven-tree-depth" src="http://www.softwarepills.com/wp-content/uploads/maven-tree-depth2.png" width="206" border="0" /> </p>
<p>Por ejemplo, en el gr&#225;fico adjunto se muestra un &#225;rbol de dependencias en el que el artefacto <code>E</code> aparece en dos ramas con diferentes versiones.</p>
<p>La resoluci&#243;n de versiones consiste en obtener un classpath sin artefactos duplicados a partir del &#225;rbol de versiones. El algoritmo que utiliza Maven para determinar la versi&#243;n correcta se basa en la profundidad de la dependencia dentro del&#160; &#225;rbol. Ante un conflicto, Maven siempre va a seleccionar la versi&#243;n m&#225;s cercana en el &#225;rbol. As&#237;, en el ejemplo, Maven resolver&#225; que la versi&#243;n del artefacto <code>E</code> a incluir en el classpath ser&#225; la <code>1.2</code> pues est&#225; en un nodo menos &quot;profundo&quot; que la versi&#243;n <code>1.1</code>.</p>
<p>En caso de que las diferentes versiones se encuentren a la misma profundidad, a falta de un criterio l&#243;gico,&#160; Maven seleccionar&#225; una cualquiera de forma arbitraria.</p>
<p>Hasta ahora solo hemos hablado de versiones &quot;blandas&quot;. Con ellas damos &quot;pistas&quot; a Maven para que seleccione la versi&#243;n apropiada pero, para acotar la resoluci&#243;n de versiones de forma m&#225;s estricta, podemos usar rangos:</p>
<table cellspacing="0" cellpadding="2" width="766" border="1">
<tbody>
<tr>
<td valign="top" width="118"><strong>Rango</strong></td>
<td valign="top" width="646"><strong>Descripci&#243;n</strong></td>
</tr>
<tr>
<td valign="top" width="123"><code>(,1.0]</code></td>
<td valign="top" width="642">x &lt;= 1.0</td>
</tr>
<tr>
<td valign="top" width="127"><code>1.0</code></td>
<td valign="top" width="638">Requerimiento &quot;blando&quot; de 1.0 (es solo una recomendaci&#243;n que ayuda a seleccionar la versi&#243;n si cuadra con todos los rangos)</td>
</tr>
<tr>
<td valign="top" width="131"><code>[1.0]</code></td>
<td valign="top" width="635">Requerimiento estricto de 1.0</td>
</tr>
<tr>
<td valign="top" width="134"><code>[1.2,1.3]</code></td>
<td valign="top" width="632">1.2 &lt;= x &lt;= 1.3</td>
</tr>
<tr>
<td valign="top" width="137"><code>[1.0,2.0)</code></td>
<td valign="top" width="630">1.0 &lt;= x &lt; 2.0</td>
</tr>
<tr>
<td valign="top" width="139"><code>[1.5,)</code></td>
<td valign="top" width="628">x &gt;= 1.5</td>
</tr>
<tr>
<td valign="top" width="141"><code>(,1.0],[1.2,)</code></td>
<td valign="top" width="626">x &lt;= 1.0 o x &gt;= 1.2. Varios rangos separados por coma.</td>
</tr>
<tr>
<td valign="top" width="143"><code>(,1.1),(1.1,)</code></td>
<td valign="top" width="625">Excluye la 1.1</td>
</tr>
</tbody>
</table>
<p>Utilizando rangos en vez de versiones &quot;blandas&quot; limitamos las posibilidades a la hora de resolver las dependencias y, por tanto, puede llegar a darse el caso de que el classpath sea irresoluble.</p>
<p>Al utilizar rangos hayq ue tener cuenta que las versiones snapshot siempre se consideran inferiores a las releases, as&#237; que, por ejemplo, <code>[1.2,)</code> no incluye <code>1.2-SNAPSHOT</code>.</p>
<p>Podemos comprobar como se resuelven las dependencias con el comando:</p>
<p><code>mvn dependency:resolve</code></p>
<p>Como veremos en el siguiente apartado, la resoluci&#243;n de versiones no es &#250;nica. Durante el ciclo de vida de la construcci&#243;n de un proyecto se generan diferentes &#225;rboles de dependencias que dan como resultado diferentes conjuntos de versiones para distintos contextos o &quot;scopes&quot;.</p>
<h3>&#193;mbitos de dependencia</h3>
<p>El &#225;mbito o &quot;scope&quot; de cada dependencia afecta a la construcci&#243;n del proyecto en tres vertientes:</p>
<ol>
<li>Las dependencias se resuelven por separado en cada fase pudiendo resultar diferentes classpaths en cada una de ellas. </li>
<li>Cada tarea individual, cada plugin, puede actuar de diferente forma seg&#250;n el scope. </li>
<li>Pueden afectar a la transitividad. </li>
</ol>
<p>Los &#225;mbitos disponibles en Maven son:</p>
<ul>
<li><code>compile</code> (por defecto): las dependencias se incluyen en todos los classpath y se propagan a los proyectos dependientes. </li>
<li><code>provided</code>: se utiliza para indicar que la dependencia la provee el entorno de ejecuci&#243;n (o contenedor como <em>JBoss</em>) y, por tanto, no se incluye en las fases de empaquetado. Las dependencias de este tipo no son transitivas. </li>
<li><code>runtime</code>: se utiliza solo en ejecuci&#243;n, por tanto, se incluye en los classpath de ejecuci&#243;n y tests pero no en la compilaci&#243;n. </li>
<li><code>test</code>: solo se utiliza en las fases de compilaci&#243;n y ejecuci&#243;n de los tests. </li>
<li><code>system</code>: en concepto es similar a <code>provided</code> pero se debe indicar la ruta donde est&#225; el JAR. No se obtendr&#225; de un repositorio y estar&#225; siempre disponible. Se utilizan para extras del JDK, JDBC, etc. </li>
<li><code>import</code>: importa las dependencias declaradas de la secci&#243;n <code>dependencyManagement</code> de un POM en la misma secci&#243;n de otro<sup>[5]</sup>. </li>
</ul>
<p>El siguiente ejemplo, declara la dependencia de <em>JUnit </em>con scope <code>provided</code>:</p>
<pre class="xml" name="code">&lt;project&gt;
	...
	&lt;groupId&gt;com.softwarepills&lt;/groupId&gt;
  	&lt;artifactId&gt;sample&lt;/artifactId&gt;
  	&lt;version&gt;1.0&lt;/version&gt;
  	...
	&lt;dependencies&gt;
		&lt;dependency&gt;
			&lt;groupId&gt;junit&lt;/groupId&gt;
			&lt;artifactId&gt;junit&lt;/artifactId&gt;
			&lt;version&gt;4.0&lt;/version&gt;
			&lt;type&gt;jar&lt;/type&gt;
			&lt;scope&gt;test&lt;/scope&gt;
		&lt;/dependency&gt;
		...
	&lt;/dependencies&gt;
	...
&lt;/project&gt;</pre>
<p>Adem&#225;s, para terminar de complicar el asunto, los &#225;mbitos de dependencia se transmiten de forma transitiva seg&#250;n la siguiente tabla:</p>
<p><code></p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="80">&#160;</td>
<td valign="top" width="80"><strong>compile</strong></td>
<td valign="top" width="80"><strong>provided</strong></td>
<td valign="top" width="80"><strong>runtime</strong></td>
<td valign="top" width="80"><strong>test</strong></td>
</tr>
<tr>
<td valign="top" width="80"><strong>compile</strong></td>
<td valign="top" width="80">compile</td>
<td valign="top" width="80">-</td>
<td valign="top" width="80">runtime</td>
<td valign="top" width="80">-</td>
</tr>
<tr>
<td valign="top" width="80"><strong>provided</strong></td>
<td valign="top" width="80">provided</td>
<td valign="top" width="80">provided</td>
<td valign="top" width="80">provided</td>
<td valign="top" width="80">-</td>
</tr>
<tr>
<td valign="top" width="80"><strong>runtime</strong></td>
<td valign="top" width="80">runtime</td>
<td valign="top" width="80">-</td>
<td valign="top" width="80">runtime</td>
<td valign="top" width="80">-</td>
</tr>
<tr>
<td valign="top" width="80"><strong>test</strong></td>
<td valign="top" width="80">test</td>
<td valign="top" width="80">-</td>
<td valign="top" width="80">test</td>
<td valign="top" width="80">-</td>
</tr>
</tbody>
</table>
<p></code></p>
<p>En la tabla, la dependencia entre <code>A</code> y <code>B</code> determina la fila, la dependencia entre <code>B</code> y <code>C</code> determina la columna, la intersecci&#243;n determina la dependencia entre <code>A</code> y <code>C</code>.</p>
<p>Como consejo para simplificar el dise&#241;o de tu POM, inicialmente, piensa solo en el concepto que subyace en cada sope: <code>compile</code> es una dependencia &quot;normal&quot; sin ninguna connotaci&#243;n especial,&#160; <code>provided</code> es una dependencia que aporta el contenedor y, por tanto, no tenemos que distribuirla con nuestro artefacto, etc. Con esto, tienes un buen punto de partida que probablemente ser&#225; suficiente.</p>
<p>Si es necesario, en una fase posterior, puedes refinarlo analizando las tres vertientes antes mencionadas. Por ejemplo, cuando declaramos que una dependencia es de tipo <code>provided </code>obtenemos que:</p>
<ol>
<li>Se incluir&#225; en todos los classpath (como si fuera compile). </li>
<li>Normalmente no se empaquetar&#225; (en un WAR, por ejemplo). </li>
<li>No ser&#225; transitiva: si <code>A</code> depende de <code>B</code> y <code>B</code> depende de <code>C</code> como <code>provided</code>, <code>A</code> no depende de <code>C</code> a menos que <code>C</code> se declare como dependencia directa en <code>A</code><sup>[6]</sup>. </li>
</ol>
<p>En la pr&#243;xima entrada tratar&#233; el resto de elementos que intervienen en la gesti&#243;n de dependencias en Maven: la secci&#243;n <code>dependencyManagement</code>, las exclusiones y la gesti&#243;n de snapshots.</p>
<ol class="footnotes">
<li id="footnote_0_136" class="footnote">Al contrario que <em>Apache Ant</em>, que tiene un enfoque procedural.</li>
<li id="footnote_1_136" class="footnote">En la &#250;ltima entrada incluir&#233; rese&#241;as bibliogr&#225;ficas y de otros recursos en Internet.</li>
<li id="footnote_2_136" class="footnote">Todo lo que se refiere en esta serie de art&#237;culos est&#225; basado en la versi&#243;n <code>2.1.0-M1</code>. Como ya he dicho, Maven est&#225; en continua evoluci&#243;n y puede que tu versi&#243;n no se comporte igual en ciertos aspectos.</li>
<li id="footnote_3_136" class="footnote">En la pr&#243;xima entrada explicar&#233; en detalle la gesti&#243;n de snaphots.</li>
<li id="footnote_4_136" class="footnote">Lo explicar&#233; en la segunda entrada de esta serie</li>
<li id="footnote_5_136" class="footnote">La no transtividad de las dependencias <code>provided</code>, desde mi punto de vista no tiene mucho sentido. Es algo que se est&#225; debatiendo en este momento y que probablemente cambie en pr&#243;ximas versiones de Maven</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=136</wfw:commentRss>
		</item>
		<item>
		<title>Procesando anotaciones Java con Maven y m2eclipse</title>
		<link>http://www.softwarepills.com/?p=121</link>
		<comments>http://www.softwarepills.com/?p=121#comments</comments>
		<pubDate>Sat, 27 Sep 2008 17:18:35 +0000</pubDate>
		<dc:creator>Oscar</dc:creator>
		
		<category><![CDATA[Herramientas]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[APT]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[m2eclipse]]></category>

		<category><![CDATA[Maven]]></category>

		<guid isPermaLink="false">http://www.softwarepills.com/?p=121</guid>
		<description><![CDATA[La herramienta APT del JDK sirve para procesar las anotaciones presentes en el c&#243;digo Java permitiendo,&#160; por ejemplo, generar nuevas clases a partir de los metadatos que contienen.
Si quieres integrar esta herramienta en la construcci&#243;n de un proyecto con Maven puedes utilizar el maven-apt-plugin de Tobago[1]. Este plugin hace casi todo el trabajo pero, como [...]]]></description>
			<content:encoded><![CDATA[<p>La herramienta APT del JDK sirve para procesar las anotaciones presentes en el c&#243;digo Java permitiendo,&#160; por ejemplo, generar nuevas clases a partir de los metadatos que contienen.</p>
<p>Si quieres integrar esta herramienta en la construcci&#243;n de un proyecto con <em>Maven</em> puedes utilizar el <code><a href="http://myfaces.apache.org/tobago/tobago-tool/maven-apt-plugin/index.html" target="_blank">maven-apt-plugin</a></code> de <em>Tobago</em><sup>[1]</sup>. Este plugin hace casi todo el trabajo pero, como veremos m&#225;s adelante, es necesario realizar algunos ajustes para que el proyecto se construya de forma adecuada en la l&#237;nea de comandos y en <em>Eclipse</em> con <em>m2eclipse</em>.</p>
<p> <span id="more-121"></span>
<p>&#160;</p>
<p>El siguiente fragmento de POM muestra la configuraci&#243;n&#160; b&#225;sica de este plugin: </p>
<pre class="java" name="code">&lt;!-- Generaci&#243;n de clases a partir de las anotaciones --&gt;
&lt;plugin&gt;
	&lt;groupId&gt;org.apache.myfaces.tobago&lt;/groupId&gt;
	&lt;artifactId&gt;maven-apt-plugin&lt;/artifactId&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;id&gt;generate-java&lt;/id&gt;
			&lt;phase&gt;generate-sources&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;execute&lt;/goal&gt;
			&lt;/goals&gt;
			&lt;configuration&gt;
				&lt;factory&gt;com.softwarepills.apt.MyAnnotationProcessorFactory&lt;/factory&gt;
				&lt;includes&gt;
					&lt;include&gt;com/softwarepills/myapp/*.java&lt;/include&gt;
				&lt;/includes&gt;
				&lt;generated&gt;src/main/apt_generated&lt;/generated&gt;
				&lt;force&gt;true&lt;/force&gt;
				&lt;nocompile&gt;true&lt;/nocompile&gt;
			&lt;/configuration&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;</pre>
<p>Con esta configuraci&#243;n conseguimos que las clases situadas en el paquete <code>com.softwarepills.myapp</code> sean procesadas por <code>com.softwarepills.apt.MyAnnotationProcessorFactory</code> y el resultado quede en el directorio <code>src/main/apt_generated</code>.</p>
<p>Los elementos que intervienen en esta configuraci&#243;n son:</p>
<ul>
<li><code>phase</code>: el proceso de las anotaciones ocurre en la fase <code>generate-sources</code>, es decir, antes de la compilaci&#243;n. </li>
<li><code>factory</code>: clase encargada de procesar las anotaciones y de generar el c&#243;digo fuente derivado<sup>[2]</sup>. </li>
<li><code>includes</code>: filtro de las clases y paquetes que queremos procesar. </li>
<li><code>generated</code>: directorio donde deseamos que se escriba el c&#243;digo fuente generado. </li>
<li><code>force</code>: forzamos que las anotaciones se procesen cada vez que se ejecuta Maven sin comprobar si el c&#243;digo fuente original ha cambiado. Es algo m&#225;s lento, pero evita problemas. </li>
<li><code>nocompile</code>: este plugin es capaz de compilar el c&#243;digo generado. Sin embargo, es preferible que no lo haga y dej&#225;rselo al plugin de compilaci&#243;n. As&#237; todo el c&#243;digo fuente (el original y el generado) se trata de la misma forma. </li>
</ul>
<p>Si desde la l&#237;nea de comando ejecutamos <code>mvn package</code> con esta configuraci&#243;n, lo primero que observamos es que, adem&#225;s del directorio est&#225;ndar de fuentes <code>src/main/java</code>, se habr&#225; creado otro <code>src/main/apt_generated</code> con el c&#243;digo generado autom&#225;ticamente a partir de las anotaciones. Adem&#225;s, como resultado de la ejecuci&#243;n obtenemos nuestro JAR con todas las clases (originales y generadas) debidamente compiladas.</p>
<p>Hasta aqu&#237;, todo perfecto; los problemas comienzan cuando queremos compilar el proyecto en Eclipse&#8230;</p>
<p>Normalmente, al importar un proyecto en Eclipse, m2eclipse detecta todos los par&#225;metros de configuraci&#243;n y actualiza los settings del proyecto en consecuencia. Si, por ejemplo, un plugin a&#241;ade un nuevo directorio de c&#243;digo fuente, m2eclipse, a su vez, lo a&#241;ade en la configuraci&#243;n del proyecto Eclipse. Como ya digo, esto ocurre en casi todos los plugins pero, por alguna raz&#243;n, no con el plugin de Tobago. En este caso, al importar el proyecto Eclipse no se entera de que existe el directorio <code>src/main/apt_generated</code> y, en consecuencia, no compila los fuentes generados ni, por supuesto, los incluye en el JAR.</p>
<p>Buscando una soluci&#243;n al problema he encontrado <code><a href="http://mojo.codehaus.org/build-helper-maven-plugin/" target="_blank">build-helper-plugin</a></code> que permite, entre otras cosas, a&#241;adir directorios de c&#243;digo fuente a nuestro proyecto Maven:</p>
<pre class="xml" name="code">&lt;!--  A&#241;adir el directorio de fuentes donde se generan el c&#243;digo --&gt;
&lt;plugin&gt;
	&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
	&lt;artifactId&gt;build-helper-maven-plugin&lt;/artifactId&gt;
	&lt;executions&gt;
		&lt;execution&gt;
			&lt;id&gt;add-generated-source-path&lt;/id&gt;
			&lt;phase&gt;generate-sources&lt;/phase&gt;
			&lt;goals&gt;
				&lt;goal&gt;add-source&lt;/goal&gt;
			&lt;/goals&gt;
			&lt;configuration&gt;
				&lt;sources&gt;
					&lt;source&gt;src/main/apt_generated&lt;/source&gt;
				&lt;/sources&gt;
			&lt;/configuration&gt;
		&lt;/execution&gt;
	&lt;/executions&gt;
&lt;/plugin&gt;</pre>
<p>Con esto conseguimos que m2eclipse sea consciente de que existe tal directorio y en consecuencia lo configura en Eclipse. Normalmente lo har&#225; al importar el proyecto pero si haces las modificaciones sobre un POM existente deber&#225;s utilizar el men&#250; <em>Maven&#8211;&gt;Update project configuration</em><sup>[3]</sup>. </p>
<p>As&#237;, nuestro proyecto queda perfectamente configurado en Eclipse o para ser lanzado desde la l&#237;nea de comandos.</p>
<p>Para terminar, tambi&#233;n es aconsejable incluir el directorio de fuentes generados en la fase de limpieza de Maven, ya que, por defecto, no se hace:</p>
<pre class="xml" name="code">&lt;!--  Limpiar el directorio de fuentes donde se generan el c&#243;digo --&gt;
&lt;plugin&gt;
	&lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;
	&lt;configuration&gt;
		&lt;filesets&gt;
			&lt;fileset&gt;
				&lt;directory&gt;src/main/apt_generated&lt;/directory&gt;
			&lt;/fileset&gt;
		&lt;/filesets&gt;
	&lt;/configuration&gt;
&lt;/plugin&gt;</pre>
<ol class="footnotes">
<li id="footnote_0_121" class="footnote">Existen otras formas mas &quot;artesanales&quot; de hacerlo como, por ejemplo, &#233;sta: <a title="http://blogs.steeplesoft.com/maven-and-annotations-not-as-easy-as-it-should-be/" href="http://blogs.steeplesoft.com/maven-and-annotations-not-as-easy-as-it-should-be/" target="_blank">http://blogs.steeplesoft.com/maven-and-annotations-not-as-easy-as-it-should-be/</a></li>
<li id="footnote_1_121" class="footnote">No entraremos en los detalles implementaci&#243;n. Si est&#225;s interesado en ello puedes consultar la <a href="http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html" target="_blank">documentaci&#243;n de APT</a>.</li>
<li id="footnote_2_121" class="footnote">Si quieres que la carpeta no aparezca en Eclipse para que no se pueda tocar a mano puedes utilizar un nombre precedido de un punto, como &quot;.apt_generated&quot;, y de este modo la carpeta quedar&#225; oculta</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarepills.com/?feed=rss2&amp;p=121</wfw:commentRss>
		</item>
	</channel>
</rss>

