<?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>AQuA.it</title>
	<atom:link href="http://blog.aquait.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aquait.info</link>
	<description>Blog técnico de AQuA.it</description>
	<lastBuildDate>Mon, 17 Oct 2011 12:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JBoss AS 7- Primera parte: Trucos nuevos de un perro viejo</title>
		<link>http://blog.aquait.info/2011/08/jboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo/</link>
		<comments>http://blog.aquait.info/2011/08/jboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 20:48:09 +0000</pubDate>
		<dc:creator>Alejandro</dc:creator>
				<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Arquitectura]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[JBoss]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=261</guid>
		<description><![CDATA[Hace muy poco que RedHat liberó la versión 7 de su servidor de aplicaciones.  Con esta nueva versión nos muestra como una empresa grande es capaz de lanzar un producto &#8220;viejo&#8221; totalmente renovado adecuado a las necesidades actuales. Esta versión no solo soporta Java EE6 sino que también plantea un cambio drástico en la arquitectura [...]]]></description>
			<content:encoded><![CDATA[<p>Hace muy poco que RedHat liberó la versión 7 de su servidor de aplicaciones.  Con esta nueva versión nos muestra como una empresa grande es capaz de lanzar un producto &#8220;viejo&#8221; totalmente renovado adecuado a las necesidades actuales. Esta versión no solo soporta Java EE6 sino que también plantea un cambio drástico en la arquitectura del servidor de aplicaciones.  Nuestra intensión es sacar una serie de artículos mostrando cuales son los cambios introducidos. Estos no intentan ser una guía completa sobre JBoss 7 sino más bien un vistazo general para que ustedes puedan aprender junto con nosotros que se trae esta nueva versión. Les aclaramos que la  información presentada en estos artículos está tomada en parte de la propia documentación de JBoss, de algunos comentarios del foro de JBoss y de nuestra &#8220;experimentação&#8221;.<br />
Ahora basta de cháchara y arranquemos.</p>
<p><span id="more-261"></span><strong>Primero lo primero &#8211; Instalando el JBoss AS 7</strong></p>
<p>Cuando vayamos a <a title="Home JBoss" href="www.jboss.org" target="_blank">www.jboss.org</a> veremos que por primera vez existen dos versiones del servidor para bajarnos.</p>
<ul>
<li> Web Profile Only (Java EE6 Certfied)</li>
<li> Everthing (NOT Java EE6 Certfied)</li>
</ul>
<p>La primera como su nombre lo indica está orientada al la ejecución de aplicaciones Web y como se puede apreciar es una configuración certificada en cumplir con todos los requerimientos de un servidor Java EE6 con web profile. La otra configuración es lo que se conoce por Full profile pero que todavía no ha sido certificada y no soporta todos lo que necesita un servidor Full Profile,  por lo cual es llamada &#8220;Full preview profile&#8221;.<br />
Yendo a lo concreto, la diferencia entre el Web y el Full es básicamente es la siguiente</p>
<ul>
<li> JSR 914 &#8211; Soporte de JMS</li>
<li> JSR 224- Java API 2.2 para WebServices basados en XML (JAX-WS)</li>
</ul>
<p>Cualquiera de las configuraciones la podemos bajar desde la <a title="download JBoss AS 7" href="http://www.jboss.org/jbossas/downloads" target="_blank">página de download de JBoss</a>.<br />
Para los ejemplos acá planteados cualquiera de las dos es indistinta. Si no piensan usar JMS y WebServices entonces con la Web van a estar más que bien. Tengan en cuenta que ambas vienen con la variación Lite del contenedor de EJB especificado en la <a href="http://jcp.org/en/jsr/detail?id=318">JSR-381</a>. Este contenedor es una versión limitada la cual NO soporta:</p>
<ul>
<li> Remote interfaces</li>
<li> RMI-IIOP Interoperability</li>
<li> JAX-WS Web Service Endpoints</li>
<li> EJB Timer Service (@Schedule, @Timeout)</li>
<li> Asynchronous session bean invocations (@Asynchronous)</li>
<li> Message-driven beans</li>
</ul>
<p>Los que quieran ver un poco más sobre que soporta y que no cada una de las versiones pueden consultar la tabla que hay en la <a title="Guia JBoss AS 7" href="https://docs.jboss.org/author/display/AS7/Getting+Started+Guide">guía de JBoss</a></p>
<p><strong>Ahora a los bifes &#8211; Ejecutando el JBoss AS 7.0</strong><br />
Para ejecutar el servidor debemos tener descomprimido el archivo bajado  (el zip o el tar.gz) en una carpeta donde mejor nos quede. Por ejemplo en mi caso yo lo instale en <em>Users/ale/opt/Applications/jboss-as-web-7.0.0.Final</em>.<br />
El único requerimiento que tenemos es que debemos tener instalada una versión de la JDK que sea la 6 o superior.</p>
<p>Luego debemos abrir una terminal o consola, dependiendo del sistema en que estamos, y posicionarnos en la carpeta raíz donde instalamos el servidor.<br />
Ahí ponemos nuestro asiento en posición vertical, nos abrochamos los cinturones y ejecutaremos:</p>
<ul>
<li> bin\stanadalone.bat si es que estamos en windows</li>
<li> bin/stanadalone.sh si estamos en cualquier variante de Unix</li>
</ul>
<p>Paren las rotativas!!! ¿Que es esto de standalone?  Por  ahora para la comprensión de este artículo solo diremos que standalone es uno de los dos modos de ejecución que trae la versión 7. De las dos opciones esta es la más similar en su funcionamiento a las versiones anteriores de JBoss.</p>
<p>Ahora sí, levantemos el JBoss AS 7!!!. tecleamos <em>bin/stanadalone.sh [ENTER]</em><br />
Podemos ver como en muy pocos segundos ya está el JBoss AS 7 levantado!!! . Ahora sabemos de primera mano que esta nueva versión levanta con una velocidad mucho mayor que cualquiera de sus versiones anteriores. Eso no es por casualidad y se debe a su nuevo diseño el cual nos provee de un nuevo proceso de carga de componentes. Este proceso tiene dos grandes cambios:</p>
<ol>
<li> Carga concurrente de los servicios, aprovechando los múltiples procreadores que tengamos</li>
<li>Solo levanta los servicios críticos para el correcto funcionamiento del servidor. Cualquier otro servicio no crítico queda levantado en forma pasiva hasta que sea utilizado por primera vez.</li>
</ol>
<p>Según RedHat esta versión ofrece una reducción de 10 veces en el tiempo de arranque con respecto a las versiones anteriores.<br />
Esto podemos confirmar si miramos la última linea impresa por el JBoss, la cual debe decir algo así:</p>
<pre class="brush: shell">...
...
...
17:30:11,370 INFO  [org.jboss.as.jmx.JMXConnectorService] (MSC service thread 1-4) Starting remote JMX connector
17:30:11,405 INFO  [org.jboss.as.ee] (Controller Boot Thread) Activating EE subsystem
17:30:11,878 INFO  [org.jboss.as.remoting] (MSC service thread 1-3) Listening on /127.0.0.1:9999
17:30:12,049 INFO  [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-8) Starting Coyote HTTP/1.1 on http--127.0.0.1-8080
17:30:12,742 INFO  [org.jboss.as.connector] (MSC service thread 1-7) Starting JCA Subsystem (JBoss IronJacamar 1.0.0.CR2)
17:30:13,360 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-4) Bound data source [java:jboss/datasources/ExampleDS]
17:30:14,120 INFO  [org.jboss.as.deployment] (MSC service thread 1-4) Started FileSystemDeploymentService for directory /Users/ale/opt/Applications/jboss-as-web-7.0.0.Final/standalone/deployments
17:30:14,132 INFO  [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.Final "Lightning" started in 7885ms - Started 92 of 147 services (55 services are passive or on-demand)</pre>
<p>En este caso podemos ver como en JBoss levanto en casi 8 segundos.</p>
<p>Para bajar el JBoss no hay misterios, hacemos como siempre hasta ahora <em>Ctrl+C</em>.</p>
<p><strong>Me parece que vi un lindo gatito &#8211; Nueva consola Web</strong><br />
Una vez que tenemos el servidor levantado pasemos a ver otra de las mejoras que trae que es su consola web de administración. Esta consola si la comparamos con la anterior es un avance importante en cuanto a la estética. La consola es una aplicación GWT lo cual la hacen mucho más rica en su funcionamiento. Dentro de esta podemos hacer varias actividades de administración, como ser:</p>
<ul>
<li> Configuración de los datasource</li>
<li> Configuración de los logs</li>
<li> Configuración de los conectores web y virtual host</li>
<li> Realizar  deployments con al posibilidad de, habilitar, deshabilitar, subir y eliminar aplicaciones</li>
<li> Configuración de los puertos</li>
</ul>
<p>Para conectarnos a esta nueva consola tenemos que abrir un browser e ingresar: <a title="consola web" href="http://localhost:9990/console" target="_blank">http://localhost:9990/console</a></p>
<p>Una funcionalidad que se ha eliminado es la consola JMX. Este cambio se debe a que con JMX no se podía dar soporte a la nueva administración de dominios (hablaremos de ella en otro artículo). Ahora la forma de administrar es usando el modo nativo de administración. Desde este modo podemos configurar y accederá a todas las propiedades de los servidores. JBoss viene con una extensión que hace de puente entre JMX y la API nativa y nos permite conectarnos con un cliente JMX como el <em>jconsole</em>. En mis pruebas lo que si pude detectar es que no estaban todas las funcionalidades presentes en la consola JMX.</p>
<p>La consola web no es la única forma de acceder a la interfaz nativa de administración. Tenemos estás cuatro opciones:</p>
<ul>
<li> La consola web que como vimos es limitada</li>
<li> Con un cliente de linea de comando, muy completo por cierto.</li>
<li> Una API java que se puede acceder directamente con java remoting</li>
<li> Una API REST-like para enviar comando por http</li>
</ul>
<p>De estas vale la pena mencionar que la CLI que trae está muy completa, por  ejemplo soporta auto completado. Para describir esta consola necesitaríamos una artículo entero. Los interesados pueden leer más sobre esta en <a title="JBoss AS 7 CLI" href="https://docs.jboss.org/author/display/AS7/Management+Clients" target="_blank">JBoss CLI</a></p>
<p><strong>A la carga &#8211; Haciendo nuestro primer deploy</strong><br />
Como ya mencionamos una forma de hacer deploy es por medio del uso de la consola web. Esta forma es muy simple por lo cual no nos vamos a detener en explicar. Lo que si vamos a ver es como hacer un deploy a la vieja usanza copiando el archivo en el directorio de deployment. Para variar esto también ha cambiado, yo estoy convencido de que luego de tantos años de manejar la misma estructura del servidor la gente de JBoss se aburrió y para hacer su trabajo más divertido nos cambio todo!!! Por suerte los cambios son para mejor.</p>
<p>Entonces, ¿Donde debemos copiar nuestra aplicación? Como tenemos levantado el JBoss en modo standalone debemos copiar el artefacto (jar, war o ear) al directorio standalone/deployments. Y listo nuestra aplicación queda levantada y funcionando.</p>
<p><strong>Resumiendo</strong></p>
<p>Los más importante que vimos en el artículo es:<br />
Que versiones están disponibles para bajar<br />
Como levantar el servidor en modo <em>standalone: bin/standalone.sh</em><br />
Conectarnos a la consola Web: <a title="JBoss console" href="http://localhost:9990/console" target="_blank">http://localhost:9990/console</a><br />
Hacer un deployment: Copiar nuestra aplicación a<em> standalone/deployments</em></p>
<p>Por último espero que hayan visto que esta nueva versión incluye una cantidad de cambios aparte del soporte a Java EE 6.</p>
<p><strong>Para la próxima</strong></p>
<p>En el próximo artículo veremos más sobre los deploy y revelaremos el misterioso <em>&#8220;Sandalone&#8221;</em>. Antes de despedirme les dejo un deber, ¿luego de hacer el deploy, no ven nada extraño en el directorio deployments?</p>
<p>Saludos y hasta la próxima.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F08%2Fjboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo%2F&amp;linkname=JBoss%20AS%207-%20Primera%20parte%3A%20Trucos%20nuevos%20de%20un%20perro%20viejo" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F08%2Fjboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo%2F&amp;linkname=JBoss%20AS%207-%20Primera%20parte%3A%20Trucos%20nuevos%20de%20un%20perro%20viejo" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F08%2Fjboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo%2F&amp;linkname=JBoss%20AS%207-%20Primera%20parte%3A%20Trucos%20nuevos%20de%20un%20perro%20viejo" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F08%2Fjboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo%2F&amp;linkname=JBoss%20AS%207-%20Primera%20parte%3A%20Trucos%20nuevos%20de%20un%20perro%20viejo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2011%2F08%2Fjboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo%2F&amp;title=JBoss%20AS%207-%20Primera%20parte%3A%20Trucos%20nuevos%20de%20un%20perro%20viejo" id="wpa2a_2"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2011/08/jboss-as-7-primera-parte-trucos-nuevos-de-un-perro-viejo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Testing FTW</title>
		<link>http://blog.aquait.info/2011/02/testing-ftw/</link>
		<comments>http://blog.aquait.info/2011/02/testing-ftw/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 19:49:54 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[Managment]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=256</guid>
		<description><![CDATA[Algunas frases que he escuchado y que en algún momento hasta he dicho (y no estoy particularmente orgulloso): El testing no sirve para nada Esto es bien simple, no necesita testing Que testén los usuarios El testing es una pérdida de tiempo Testear es improductivo Testear es aburrido Bueno, déjenme decirles algo: todas estas afirmaciones [...]]]></description>
			<content:encoded><![CDATA[<p><!-- p { margin-bottom: 0.08in; } -->Algunas frases que he escuchado y que en algún momento hasta he dicho (y no estoy particularmente orgulloso):</p>
<ul>
<li>El testing no sirve para nada</li>
<li>Esto es bien simple, no necesita 	testing</li>
<li>Que testén los usuarios</li>
<li>El testing es una pérdida de 	tiempo</li>
<li>Testear es improductivo</li>
<li>Testear es aburrido</li>
</ul>
<p><span id="more-256"></span></p>
<p>Bueno, déjenme decirles algo: todas estas afirmaciones están equivocadas. Sí, incluso la última. Testear tiene muchos beneficios, incluso tiene beneficios no directamente relacionados con el testing. Pero no nos adelantemos.</p>
<p>Tal vez la primera -El testing no sirve para nada- sea una de las más dichas y escuchadas. Esta frase la dice la gente que nunca testeó. No conozco a nadie con disciplina de testing que piense esto.</p>
<p>Otra frase nefasta es la tercera -Que testén los usuarios-. No hay peor cosa que entregarle al usuario que un software plagado de errores. La confianza del usuario es una de las cosas más importantes en un proyecto. Al usuario hay que tenerlo de nuestro lado ya que él/ella es la razón por la cual estamos haciendo ese sistema. La confianza se puede perder en un abrir y cerrar de ojos por un error que lleva 5 minutos eliminarlo. Y cuando sucede esto, volver a ganar la confianza cuesta mucho.</p>
<p>Pero ¿por qué se le tiene tanta idea al testing? y sobre todo por la gente que no tiene disciplina testeadora. Yo creo que es porque el testing nos expone a nuestros errores e inconscientemente tratamos de evitar esto. Y mientras haya errores, obviamente, la tarea no está terminada.</p>
<p>Cómo sería la implementación de una funcionalidad para un programador que no testea disciplinadamente:</p>
<ol>
<li>Programación de la funcionalidad</li>
<li>Probar un par de veces (en el 	mejor de los casos)</li>
<li>Deploy</li>
</ol>
<p>Para cualquier funcionalidad más o menos compleja, esto lleva a que haya un caso que no se consideró en el punto 2 y por lo tanto a un error en el sistema. Entonces:</p>
<ol>
<li>Corregir el error</li>
<li>Probar un par de veces (ahora un 	poco mejor por el sentimiento de culpa <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Deploy</li>
</ol>
<p>Seis pasos, suponiendo que el error queda arreglado.</p>
<p>Como sería el mismo ciclo, pero con disciplina de test:</p>
<ol>
<li>Programación de la funcionalidad</li>
<li>Programación del test de la 	funcionalidad</li>
<li>Probar la funcionalidad</li>
<li>Deploy</li>
</ol>
<p>Cuatro pasos.</p>
<p>Les aseguro que la calidad del producto es mucho más alta y no quedamos pegados con el usuario. El “simple” hecho de programar el test, no hace pensar más. Y ¿tardamos más? Generalmente no, porque no hay que corregir errores ni volver a pasar a producción. Igualmente, sería preferible tardar más que por tratar de sacar el sistema antes, se escape un error se dañe la confianza del usuario.</p>
<p><strong>Herramientas</strong></p>
<p>Bueno, basta de psicología barata. Ahora voy a nombrar algunas herramientas que asisten al testing.</p>
<p>Simplemente voy a nombrarlas, hay mucha literatura en Internet sobre estas herramientas.</p>
<p><strong>Unitarios</strong></p>
<p>Para hacer tests unitarios hay básicamente dos frameworks JUnit y TestNG. El segundo es más abarcativo que el primero.</p>
<p><strong>Integración</strong></p>
<p>Para hacer tests de integración, también hay frameworks que nos facilitan la vida, jMock o Mockito por nombrar dos.</p>
<p><strong>Cobertura</strong></p>
<p>La cobertura de código es sin duda una de las herramientas más interesantes para tener una idea de la calidad de nuestro test. Con esta herramienta es muy fácil saber si se nos escaparon casos en nuestros tests, ya que van a aparecer lineas de código son cubrir. La idea es aproximarse lo más posible a 100%.</p>
<p>El hecho de testar, produce efectos secundario (positivos) en nuestro código:</p>
<ol>
<li>Con el tiempo produce métodos más 	simples: Es más fácil testear métodos cortos y simples, que 	largos y complejos. Cuando programamos pensando en el testing esto 	surge naturalmente. El código simple es más fácil de mantener.</li>
<li>Los tests tienden a mejorar la 	modularización del sistema, ya que pueden exponer problemas de 	dependencias entre los módulos. Ej: dependencias circulares.</li>
<li>Los tests tiene un efecto 	psicológico en el desarrollador, dándole confianza en su producto 	y fomentando la motivación. Esto hace que testear sea “divertido”.</li>
</ol>
<p><strong>Notas finales</strong></p>
<p>El test debe ser tomado con profesionalismo: la tarea no está terminada si no tiene el test correspondiente. Está de más decir que el test tiene que ser de alta calidad.</p>
<p>El test sirve para verificar y descubrir errores cuando estamos programando la funcionalidad, pero más importante aún, es que nos da la tranquilidad de que dentro de 6 meses cuando se realizaron un montón de cambios, nuestra funcionalidad se sigue comportando como esperamos.</p>
<p>Implantar el testing en un equipo no es tarea fácil. Requiere tiempo, esfuerzo y no bajar los brazos. Siempre hay rechazo a algo nuevo. Incluso la gente que reconoce el valor del testing, le cuesta arrancar a testear profesionalmente.</p>
<p>El testing (cómo cualquier otra cosa) no puede ser algo impuesto al equipo; por el contrario, tiene que ser aceptado por el equipo, haciéndole ver los beneficios del testing profesional en el día a día. Bien vale la pena el esfuerzo.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F02%2Ftesting-ftw%2F&amp;linkname=Testing%20FTW" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F02%2Ftesting-ftw%2F&amp;linkname=Testing%20FTW" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F02%2Ftesting-ftw%2F&amp;linkname=Testing%20FTW" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2011%2F02%2Ftesting-ftw%2F&amp;linkname=Testing%20FTW" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2011%2F02%2Ftesting-ftw%2F&amp;title=Testing%20FTW" id="wpa2a_4"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2011/02/testing-ftw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java AppServer-04: Ejemplo</title>
		<link>http://blog.aquait.info/2010/10/java-appserver-04-ejemplo/</link>
		<comments>http://blog.aquait.info/2010/10/java-appserver-04-ejemplo/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 22:49:34 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=247</guid>
		<description><![CDATA[Mucho artículo, mucho artículo&#8230; pero ¿cómo se usa? Bien, en este vamos a ver un ejemplo de como usar el AppServer. Antes de continuar, es muy importante tener en la cabeza el post http://blog.aquait.info/2009/10/180/ pues presenta la configuración del servidor. ¿Qué, cómo, dónde? Primero, vamos a definir “qué” queremos hacer. Una vez más, voy a [...]]]></description>
			<content:encoded><![CDATA[<p>Mucho artículo, mucho artículo&#8230; pero ¿cómo se usa? Bien, en este vamos a ver un ejemplo de como usar el AppServer. Antes de continuar, es muy importante tener en la cabeza el post <a href="http://blog.aquait.info/2009/10/180/">http://blog.aquait.info/2009/10/180/</a> pues presenta la configuración del servidor.<span id="more-247"></span></p>
<p>¿Qué, cómo, dónde?<br />
Primero, vamos a definir “qué” queremos hacer. Una vez más, voy a utilizar el clásico ejemplo de obtener PI desde el servidor. Luego veremos el “cómo”.</p>
<p>El “qué” refiere a la interfaz del servicio y el “cómo” a la implementación. Entonces tenemos que crear:</p>
<pre class="brush: java">package  ejemplo.client.services

// El “qué”
public interface MathService extends com.aquait.rpc.client.service.Service {
    double getPi();
}</pre>
<pre class="brush: java">// El “cómo”
package ejemplo.server.services

public class MathServiceImpl extends com.aquait.rpc.server.service.Service implements ejemplo.client.services.MathService {
    public double getPi() {
        return Math.PI;
    }
}</pre>
<p>¿Y ahora? Ahora hay que decir el “dónde”. Para esto configuramos el servidor. En el archivo services.config agregamos:</p>
<pre class="brush: java">service[math_service].interface = ejemplo.client.services.MathService
service[math_service].implementation =  ejemplo.server.services.MathServiceImpl</pre>
<p>Recordar “math_service” que será utilizado más adelante.<br />
El siguiente paso sería crear un jar con las clases e interfaces y copiar ese jar en el subdirectorio application.<br />
Con el comando start levantamos el servidor y deberíamos ver en el log, en el reporte de servicios, al querido MathService.</p>
<p>Mozo! Un PI por favor!<br />
Si todo está bien (y esperemos que así sea) estamos en condiciones de hacerle pedidos al servidor. Para esto, desde el cliente tenemos que conectarnos e invocar al servicio:</p>
<pre class="brush: java">// 1 – Nos conectamos al servidor
AppServerClient appServerClient = new AppServerClient("localhost", 6666);

// 2 - Obtenemos un proxy del servicio desado: “math_service”
MathService mathService = (MathService)appServerClient.getService("math_service");

// 3 - Invocamos al método deseado como si lo tuvieramos local
double pi = mathService.getPi();
System.out.println(pi);</pre>
<p>Todo esto y mucho más<br />
Esta es la versión simple. Pero en realidad, el servidor soporta seguridad, parámetros de inicialización de los servicios, pool de conexión a la base de datos, mensajería, módulos, etc. Esto se puede ver en el código fuente publicado en el artículo AppServer-03 en un módulo que se llama test.</p>
<p>Good luck!</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F10%2Fjava-appserver-04-ejemplo%2F&amp;linkname=Java%20AppServer-04%3A%20Ejemplo" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F10%2Fjava-appserver-04-ejemplo%2F&amp;linkname=Java%20AppServer-04%3A%20Ejemplo" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F10%2Fjava-appserver-04-ejemplo%2F&amp;linkname=Java%20AppServer-04%3A%20Ejemplo" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F10%2Fjava-appserver-04-ejemplo%2F&amp;linkname=Java%20AppServer-04%3A%20Ejemplo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F10%2Fjava-appserver-04-ejemplo%2F&amp;title=Java%20AppServer-04%3A%20Ejemplo" id="wpa2a_6"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/10/java-appserver-04-ejemplo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Es fácil comenzar a utilizar Scala?&#8230; That is the question!!!</title>
		<link>http://blog.aquait.info/2010/09/es-facil-scala/</link>
		<comments>http://blog.aquait.info/2010/09/es-facil-scala/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 02:23:04 +0000</pubDate>
		<dc:creator>Alejandro</dc:creator>
				<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=238</guid>
		<description><![CDATA[¿Es Scala simple o complejo, fácil o difícil? Estas preguntas están sonando mucho en Internet. Pero hay una pregunta que nos estamos olvidando hacer y es ¿Que tan difícil es comenzar a utilizar el lenguaje?]]></description>
			<content:encoded><![CDATA[<p><!-- p { margin-bottom: 0.08in; }a:link {  } --></p>
<p lang="es-AR">Primero, antes de comenzar para los que no saben que es Scala <em>(en este caso no se como han llegado acá?)</em> les cuento que es un lenguaje que mezcla la programación funcional y la orientada a objetos tratando de brindar lo mejor de ambos paradigmas. Este lenguaje cuenta con su propio compilador &#8220;scalac&#8221; el cual genera clases Java que pueden ser interpretada por una JVM. Esta particularidad hace que se puedan utilizar todas las librerías existentes en Java así como también utilizar nuestro código dentro de otras aplicaciones Java.</p>
<p lang="es-AR">Actualmente mucho se ha escrito y discutido mucho de si Scala es un lenguaje fácil o difícil, simple o complicado. El problema con lo que he leído no es la opinión que se da, sino desde el punto desde el cual se enfoca la pregunta. ¿A que me refiero con esto? A mi entender necesitamos re-formular la pregunta <strong><em>¿Es fácil para un programador Java aprender Scala?</em></strong> Para poder obtener una respuesta útil. La pregunta que deberíamos hacernos es: <em>¿<strong>Es fácil para un programador Java comenzar a utilizar Scala?</strong></em></p>
<p><span id="more-238"></span></p>
<p lang="es-AR">La diferencia entre ambas preguntas es que para comenzar a utilizar un lenguaje no es necesario SABERLO!!! A medida que uno utiliza un lenguaje va aprendiendo sus virtudes y sus trucos y así va mejorando su conocimiento con la practica. Yo pregunto ¿Ustedes estudiaron toda la teoría de Java antes de comenzar o arrancaron utilizándolo poco a poco? ¿Quien no agarra un código propio de sus años de inicio y no se sonroja por las barbaridades que programo? Como docente he visto que a los alumnos se les hace cuesta arriba cuando comienza a utilizar Java y tratan de entender el lenguaje y al mismo tiempo quieren utilizar toda su potencia. Cuando uno habla de todas las funcionalidades que Java tiene puede ver como los ojos se les quedan en blanco tratando de ver como van hacen para dominar <em>“el monstruo”</em>, y ni que hablar si nos encontramos con un grupo que viene de trabajar en C# con Visual Studio. En este caso agarrate catalina que les van a llover las quejas sobre <em>&#8220;lo complejo que es Java&#8221;</em>.</p>
<p lang="es-AR">La mayoría de los artículos opinan sobre si Scala es difícil o fácil?, o si es complejo o simple? pero para poder responder estas preguntas es necesario saber y entender el lenguaje y si tenemos este conocimiento seguramente no nos vamos a estar haciéndonos esta pregunta <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Lo que le interesa saber a un programador que quiere comenzar a utilizar Scala es: <em> <strong>¿Es difícil llegar a tener un conocimiento profundo del lenguaje?</strong></em><strong> </strong>. La respuesta es OBVIA, claro que SI!!!. Pero esto no es un problema de Scala sino de cualquier lenguaje. No creo que exista un lenguaje de programación que permita que en poco tiempo seamos unos expertos<em> ( y VB no califica como lenguaje <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</em>. Todos tienen sus vueltas y nos lleva su tiempo lograr comprender como realmente funcionan y cual es la mejor forma de usarlos, y para rematarla por lo general no hay una única forma de hacer las cosas. Hoy cuando nos hacemos esta pregunta nos encontramos que ya dominamos un lenguaje, un paradigma  y nuestra ansiedad hace que queramos comenzar a utilizar <em>ya!!!</em> Scala en todas su potencia. Pero nos olvidamos que para llegar al mismo nivel en este nuevo lenguaje no solo tenemos que aprender una nueva sintaxis y una nueva API sino que también tenemos que dominar un nuevo paradigma&#8230; ¿Como alguien puede pretender que esto sea una tarea fácil? No duden que va a ser un camino largo al igual que fue el camino de dominar Java y la programación orientada a objetos.</p>
<p lang="es-AR">Ahora si cambiamos la pregunta a <strong><em>¿Es fácil para un programador Java comenzar a utilizar Scala?</em></strong> La respuesta es un rotundo <strong>SI</strong>.</p>
<p lang="es-AR">¿En que me baso para dar ésta respuesta?</p>
<ul>
<li>
<p lang="es-AR">Primero en mi 	experiencia personal <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</li>
<li>
<p lang="es-AR">Segundo Scala tiene 	la dualidad de ser orientado a Objeto y Funcional, con lo cual se 	puede comenzar a utilizar orientado a objetos y una vez dominada la 	sintaxis y las principales API podemos comenzar a aprender los 	aspectos funcionales del lenguaje.</p>
</li>
<li>
<p lang="es-AR">Tercero si bien la 	sintaxis es diferente a Java en el diseño del lenguaje se ha puesto 	mucho hincapié en lograr el equilibrio entre eliminar sintaxis 	innecesaria y crear un código legible. Obviamente como todo 	lenguaje con un poquito de empeño cualquier programador puede crear 	código ilegible <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , pero no vamos a tener problema si nos 	mantenemos en las recomendaciones y no intentamos escribir métodos 	complicados en una sola linea .</p>
</li>
<li>
<p lang="es-AR">Cuarto hay mucha 	información en Internet y fácilmente se puede acceder a libros 	sobre el lenguaje y la mayoría orientados a programadores Java que quieran utilizar Scala.</p>
</li>
<li>
<p lang="es-AR">Por último el tener 	soporte de las principales IDE como ser Eclipse, NetBeans y IntelliJ 	con soporte de auto-completado de código hace que el arranque no 	sea tan tedioso.</p>
</li>
</ul>
<p lang="es-AR">
<p lang="es-AR">Para finalizar los invito leer algunos articulos en la red teniendo presente la pregunta <em><strong>¿Es fácil para un programador Java comenzar a utilizar Scala?</strong>. </em>Yo no voy a escribir código habiendo tan buenos ejemplos, les dejo unos link que hacen un buen trabajo por mi.</p>
<p lang="es-AR"><a href="http://michid.wordpress.com/2010/08/24/so-scala-is-too-complex/">http://michid.wordpress.com/2010/08/24/so-scala-is-too-complex/</a></p>
<p lang="es-AR"><a href="http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/">http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/</a></p>
<p lang="es-AR"><a href="http://lamp.epfl.ch/%7Eodersky/blogs/isscalacomplex.html">http://lamp.epfl.ch/~odersky/blogs/isscalacomplex.html</a></p>
<p lang="es-AR">Saquen sus propias conclusiones y posten su comentario.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/09/es-facil-scala/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Juegos en JME (o cómo convertir tu celular en una mini consola de video juegos)</title>
		<link>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/</link>
		<comments>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 22:39:02 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[j2me]]></category>
		<category><![CDATA[jme]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=224</guid>
		<description><![CDATA[Con el poder de procesamiento que tienen los dispositivos móviles hoy en día y en particular los celulares, se puede -con un poco de esfuerzo, paciencia y muchas ganas- implementar juegos interesantes en Java para el celular. El “celular” de hoy en día es como una computadora con un montón de periféricos integrados: cámara, teclado, [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Con el poder de procesamiento que tienen los dispositivos móviles hoy en día y en particular los celulares, se puede -con un poco de esfuerzo, paciencia y muchas ganas- implementar juegos interesantes en Java para el celular.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">El “celular” de hoy en día es como una computadora con un montón de periféricos integrados: cámara, teclado, pantalla, teléfono celular, lector de memoria externa, wifi, gps, gsm, etc. Y todo esto en la palma de la mano.<span id="more-224"></span></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Algunos de estos dispositivos móviles traen sistemas operativos propietarios, otros utilizan alguna versión de Windows, Linux o Symbian OS. Pero hay una características que la gran mayoría tienen en común: Java. Obviamente no es la versión de Java full power que se instala en nuestro desktop, laptop o servidor. Se trata de una versión adaptada a dispositivos móviles en los cuales no se cuenta con Gigas de RAM, o múltiples CPUs con frecuencias de reloj del orden de los Giga Hetrz.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Sorprendentemente, Java Micro Edition (JME, A.K.A. J2ME) tiene las características que la hacen una plataforma bien interesante para desarrollar aplicaciones y particularmente juegos. Y estos últimos son los que vamos a explorar.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><br />
</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><strong>Primero un poco de teoría</strong></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Dada la cantidad de dispositivos móviles -todos con características diferentes- se inventaron los “perfiles de capacidades”: MIDP por Mobile Information Device Profile. Dependiendo de la versión de MIDP, el dispositivo va a tener más o menos capacidades de: comunicación, presentación, audio, etc.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Además de MIDP, existe otra especificación llamada CLDC por Connected Limited Device Configuration, que define capacidades de bajo nivel del dispositivo, por ejemplo, si tiene la capacidad de manejar número con punto flotante.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">MIDP se apoya en CLDC para formar la plataforma Java ME. La idea es desarrollar en la plataforma más compatible que se pueda. Hoy por hoy, la mayoría de los celulares soportan MIDP 2.0 y CLDC 1.1, pero si podemos restringirnos a CLDC 1.0 mejor. El Motorola V360 es un ejemplo de teléfono móvil con MIDP 2.0 y CLDC 1.0.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Entonces cuando empecemos a desarrollar, tenemos que elegir que versión de MIDP y CLDC vamos a utilizar. En la página de Oracle (http://java.sun.com/javame/technology/index.jsp), se puede encontrar más información y el SDK (http://java.sun.com/javame/downloads/index.jsp).</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Bien, tenemos el SDK instalado, tenemos nuestra IDE de confianza configurada. ¿Y ahora qué? ¡A programar! Bueno, no tan rápido. ¿Cómo se programa un juego? Esto es algo que los que venimos haciendo IT desde ya hace años, no tenemos muy claro. En Internet hay mucha documentación, pero la realmente buena es escasa.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Primero que nada, veremos como es el esqueleto de un juego -en pseudocódigo-:</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<pre class="brush: java">proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
goto 1
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Santo patrono de la informática, perdón por el goto.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">No hay nada revelador en estas 4 lineas, pero lo que si se pueden empezar a ver algunos problemas. Por ejemplo: este juego va a ejecutar a distinta velocidad según de la potencia del celular. Algo claramente no deseable. Obviamente queremos que nuestro juego funcione a la misma velocidad en cualquier celular, sin importar la potencia del mismo.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Para esto, hacemos un pequeño cambio:</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"></p>
<pre class="brush: java">proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
esperar X milisegundos
goto 1
</pre>
<p></span></span><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"></span></span></p>
<ul></ul>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Ahora variando X, podemos variar la velocidad del juego. Fácil&#8230; ¿no? Queda en manos del usuario elegir X mediante, por ejemplo, el menú el juego. Pero, ¿no se podría determinar X automáticamente? Mejor aún, ¿no se podría determinar X dinámicamente en cada vuelta del ciclo?  Claro que sí. Ahora vemos como:</span></span></p>
<pre class="brush: java">ciclos_por_segundo = 30
milisegundos_por_ciclo = 1000 / ciclos_por_segundo
t_inicial = ahora()
proceso entrada del usuario
actualizo el estado del juego
dibujo la pantalla
t_ciclo = ahora() - t_inicial
si (t_ciclo &lt; milisegundos_por_ciclo) entonces
    esperar (milisegundos_por_ciclo - t_ciclo) milisegundos
goto 3
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Nota: La función ahora() devuelve la hora actual en milisegundos, algo como lo que hace System.currentTimeMillis() en Java.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Lo que se hace es, tomar el tiempo que toma un ciclo completo (4, 5 y 6). Si ese tiempo es menor que la cantidad de tiempo que establecimos para cada ciclo en 1 y 2, entonces esperamos esa diferencia de tiempo. Así, todos los ciclos demoran lo mismo y el tiempo de espera se ajusta dinámicamente. </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">De esta forma logramos un rendimiento igual entre celulares de distinta potencia. Este método se puede mejorar implementando saltos de ciclos (frame skipping) cuando el celular es de muy baja potencia, pero corremos el riesgo de que el juego se vuelva injugable. Así, el juego ejecutará más lento en celulares de poca potencia, ya que todo el tiempo se consumirá en los puntos 4, 5 y 6 y nunca entrará en espera.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Es sorprendente la cantidad de cosas interesantes que se pueden hacer utilizando esta sencilla técnica.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;"><strong>A la práctica</strong></span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Vamos a implementar, con esta técnica, el “hola mundo” de los juegos: el PONG de a uno.</span></span></p>
<div id="attachment_225" class="wp-caption aligncenter" style="width: 219px"><a href="http://blog.aquait.info/wp-content/uploads/2010/06/Screenshot.png"><img class="size-full wp-image-225" title="Pong" src="http://blog.aquait.info/wp-content/uploads/2010/06/Screenshot.png" alt="Pong" width="209" height="202" /></a><p class="wp-caption-text">Pong</p></div>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Es como si fuera un Arkanoid, pero sin los ladrillos. Es verdad, no es muy divertido.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La implementación en Java del bucle principal sería algo así:</span></span></p>
<pre class="brush: java">final int CICLOS_POR_SEGUNDO = 30;
final int MILISEGUNDOS_POR_CICLO = 1000 / CICLOS_POR_SEGUNDO;
while (true) {
    long tInicial = System.currentTimeMillis();
    procesarEntradaDelUsuario();
    actualizarEstadoDelJuego();
    dibujarLaPantalla();
    long tCiclo = System.currentTimeMillis() - tInicial;
    if (tCiclo &lt; MILISEGUNDOS_POR_CICLO) {
        Thread.sleep(MILISEGUNDOS_POR_CICLO - tCiclo);
    }
}
</pre>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Notar que hasta ahora no hay nada hecho particularmente para el PONG. Lo particular estará en las funciones procesarEntradaDelUsuario(), actualizarEstadoDelJuego() y dibujarLaPantalla().</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La primera tiene la responsabilidad de tomar la entrada del usuario y modificar algo en el juego, en este caso sería la posición de la paleta. Sí, la paleta es ese rectángulo verde.. hay que tener imaginación <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La segunda debe actualizar el estado interno del juego. En este juego, esta función tiene dos objetivos: a) mover la pelota y b) si la pelota se va hacia abajo, entonces el juego termina con el fatídico “Game Over”. </span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">La tercer y última función, debe tomar el estado del juego y dibujarlo en la pantalla.</span></span></p>
<p><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">El código fuente se puede bajar desde acá: <a href="http://blog.aquait.info/wp-content/uploads/2010/06/pong-scr.tar.gz">pong-scr.tar</a>. En esta implementación, nunca se pierde. Cuando la pelota se va para abajo, aparece nuevamente en el medio de la pantalla. Un buen ejercicio, sería agregarle vidas, que aumente la velocidad de la pelota, darle aceleración a la paleta, mejorar los gráficos, agregarle ladrillitos, sonidos, powerups y ponerle un nombre marketinero (que no sea Arkanoid, claro <img src='http://blog.aquait.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) y de ahí, a la fama!</span></span></p>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: x-small;">Enjoy!</span></span></p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;linkname=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F06%2Fjuegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos%2F&amp;title=Juegos%20en%20JME%20%28o%20c%C3%B3mo%20convertir%20tu%20celular%20en%20una%20mini%20consola%20de%20video%20juegos%29" id="wpa2a_8"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/06/juegos-en-jme-o-como-convertir-tu-celular-en-una-mini-consola-de-video-juegos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando SessionBeans en Grails</title>
		<link>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/</link>
		<comments>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 19:17:21 +0000</pubDate>
		<dc:creator>Alejandro</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=204</guid>
		<description><![CDATA[¿SessionBeans y Grails? Una de la cualidades de Grails que personalmente más me gusta es su integración con JEE. Desde Grails podemos utilizar tags JSP, Session Beans y EntityBeans como si fueran parte integral del framework. En este post nos centraremos en como podemos invocar SessionBeans ya sean remotos o locales desde nuestro código Grails. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>¿SessionBeans y Grails?</strong></p>
<p>Una de la cualidades de Grails que personalmente más me gusta es su integración con JEE. Desde Grails podemos utilizar tags JSP, Session Beans y EntityBeans como si fueran parte integral del framework.<br />
En este post nos centraremos en como podemos invocar SessionBeans ya sean remotos o locales desde nuestro código Grails. <span id="more-204"></span> Esta posibilidad junto con el manejo de los EntityBeans le aportan a Grails  adaptabilidad y escalabilidad. A que me refiero con esto, a que siendo prolijos podemos desarrollar una aplicación entera en Grails y luego más adelante pasar los modelos y los servicios a Entities y SessionBeans respectivamente. De esta forma podemos comenzar rápidamente a desarrollar nuestra aplicación haciendo uso de las ventajas de estar en un ambiente dinámico y luego cuando la aplicación está más definida y los cambios no son lo común entonces podemos pasar la capa de negocios a JEE. Este cambio no afecta a ningún otro componente de Grails como ser controladores o vistas.<br />
Para lograr esto último todo lo que debemos hacer es sustituir el código de las operaciones de los servicios por delegación a la misma operación en los SessionBeans creados.</p>
<p>A continuación veremos como se configura Grails para utilizar SessionBeans tanto para EJB3.0 como EJB2.1</p>
<p><strong>Inyectando los SessionBeans</strong><br />
Grails permite inyectar tanto en los servicios como en los controladores cualquier SB al igual que lo hace con sus servicios. Al Grails utilizar Spring en el manejo de sus componentes es posible utilizar todas las ventajas de este dentro de Grails. La forma más sencilla de configurar los objetos a ser inyectados dentro de los controladores o servicios, y en especial los SB, es utilizando el archivo resources.groovy. Este archivo es equivalente a el archivo applicationContext.xml de Spring solo que en vez de ser un archivo XML es una clase groovy que utiliza el SpringBuilder como DSL para la configuración. Por defecto el archivo resources que se encuentra en grails-app/conf/spring y tiene el siguiente contenido:</p>
<pre class="brush: groovy">// Place your Spring DSL code here
beans = {

}</pre>
<p>Dentro del closure es donde se deben agregar las definiciones de los beans.</p>
<p><strong>Configuración de servidor JNDI</strong><br />
Para poder acceder a cualquier componente que se encuentra en un servidor de aplicaciones debemos hacerlo utilizando JNDI. Para esto Spring provee una clase utilitaria la cual facilita las operaciones sobre un servidor de nombres JNDI como ser lookup y a su vez actúa como un proveedor de contexto JNDI. Para esto hay que agregar la siguiente definición en el resources.groovy</p>
<pre class="brush: groovy">	ejbJndi(org.springframework.jndi.JndiTemplate){
		environment = [
			"java.naming.factory.initial" : "org.jnp.interfaces.NamingContextFactory",
			"java.naming.provider.url" : "jnp://http://localhost:1099</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>ejbJndi </dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre del bean el cual es de tipo <em>org.springframework.jndi.JndiTemplate</em>.  Este nombre puede ser cualquiera. Es a este nombre que se hará referencia para determinar el servidor de nombres que provee el acceso a un objeto. </dd>
</dl>
<ul>
<li>
<dl>
<dt>environment </dt>
</dl>
</li>
</ul>
<dl>
<dd>Es la propiedad de JndiTempalte la cual se configura con un Mapa que tiene las propiedades JNDI </dd>
</dl>
<p>En un archivo podrían existir tantas definiciones de JndiTemplate como proveedores JNDI se necesiten acceder.</p>
<p><strong>Configuración de servidor JNDI por ENVIRONMENT</strong><br />
Es muy probable y necesario, que el servidor JNDI requiera diferente configuración de IP y puerto según sea el ambiente desarrollo, producción o testing. Para lograr esto se debe anexar a la configuración anterior lo siguiente:</p>
<ul>
<li>Colocar el valor de la IP y puerto del JBoss en cada environment del Config.groovy.</li>
<li>Importar la clase ConfigurationHolder en el archivo resources.groovy</li>
<li>Sustituir la ip y puerto de la variable "java.naming.provider.url" por las cargadas en la configuración.</li>
</ul>
<p><em>Ejemplo</em><br />
<strong>Config.groovy</strong></p>
<pre class="brush: groovy">  ...
  environments {
    development {
        ...
        jboss.ip = "10.200.8.173"
        jboss.port = "1099"
        ...
    }
    production {
        ...
        jboss.ip = "172.16.2.105"
        jboss.port = "1099"
        ...
    }</pre>
<p><strong>Resources.groovy</strong></p>
<pre class="brush: groovy">     import org.codehaus.groovy.grails.commons.*
     ...
	ejbJndi(org.springframework.jndi.JndiTemplate){
		environment = [
			"java.naming.factory.initial" : "org.jnp.interfaces.NamingContextFactory",
			"java.naming.provider.url" : "jnp://"+ConfigurationHolder.config.jboss.ip+":"+ConfigurationHolder.config.jboss.port]
	}</pre>
<p><strong>Configuración de componentes EJB 3.0</strong><br />
Para poder inyectar componentes EJB 3.0 tenemos que agregar la siguiente configuración:</p>
<pre class="brush: groovy">	xXXServices(org.springframework.jndi.JndiObjectFactoryBean){
		jndiName = "XXXServices/remote"
		jndiTemplate = ref("ejbJndi")
	}</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>xXXServices</dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre que se le dará a la referencia remota al SB y que será utilizado para inyectar esta en los controladores y servicios. Cualquier controlador o servicio que tenga una propiedad con nombre xXXServices se le inyectara la referencia al SB remoto definido por ese nombre en el archivo resources.groovy. La primer <strong>x</strong> es en minúscula para indicar que por convención el nombre debe comenzar en minúscula.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiName</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre por el cual se va a buscar la referencia al SB en el servidor JNDI</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiTemplate</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre del bean que se va a utilizar como provider para acceder al objeto JNDI. Es el definido en el punto anterior.</dd>
</dl>
<p>Para utilizar el SB en un servicio sería:</p>
<pre class="brush: groovy">public class EjemploServices {
	def xXXServices

	void unMetodo(param1, param2) {
		xXXServices.invocoMetodoEnEJB(param1, param 2)
	}
}</pre>
<p><strong>Configuración de componentes EJB 2.1</strong><br />
Para poder inyectar componentes EJB 2.1 tenemos que agregar la siguiente configuración que es similar a la vista para EJB 3.0.</p>
<pre class="brush: groovy"> xXXServices(org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean) {
		jndiName = "EJBXXXServices"
		businessInterface = "biz.aquait.yyy.ejb.EJBXXXServices"
		jndiTemplate = ref("ejbJndi")
		refreshHomeOnConnectFailure = true
                lookupHomeOnStartup=false

	}</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>xXXServices</dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre que se le dará a la referencia remota al SB y que será utilizado para inyectar esta en los controladores y servicios. Cualquier controlador o servicio que tenga una propiedad con nombre xXXServices a esta se le inyectara la referencia al SB remoto definido por ese nombre en el archivo resources.groovy. La primer <strong>x</strong> es en minúscula para indicar que por convención el nombre debe comenzar en minúscula.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiName</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre por el cual se va a buscar la referencia al SB en el servidor JNDI</dd>
</dl>
<ul>
<li>
<dl>
<dt>refreshHomeOnConnectFailure</dt>
</dl>
</li>
</ul>
<dl>
<dd>Refresca la home cuando detecta un fallo en la conexión, por ejemplo cuando se reinicia el servidor</dd>
</dl>
<ul>
<li>
<dl>
<dt>lookupHomeOnStartup</dt>
</dl>
</li>
</ul>
<dl>
<dd>Hace que la aplicación no haga el lookup a levantar sino al utilizar servicios del SB.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiTemplate</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre del bean que se va a utilizar como provider para acceder al objeto JNDI. Es el definido en el primer punto.</dd>
</dl>
<ul>
<li>
<dl>
<dt>businessInterface</dt>
</dl>
</li>
</ul>
<dl>
<dd>La interfaz remota del SB, es decir la que extiende EJBObject.</dd>
</dl>
<p>La forma de utilizar el SB dentro de un servicio u otro componente es la misma forma que las referencias a SB implementados  con EJB 3.0.</p>
<p><strong>Conclusión</strong></p>
<p>Siguiendo los pasos presentados arriba podemos decir que configurar Grails para utilizar  SB no es engorroso y que el uso de estos dentro del framework es transparente ya que se usan de la misma forma que un servicio de Grails.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;title=Usando%20SessionBeans%20en%20Grails" id="wpa2a_10"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SCRUM &#8211; Cuando comprendas esta metodología de proyectos sentirás que lo sabías desde hace tiempo</title>
		<link>http://blog.aquait.info/2010/01/scrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo/</link>
		<comments>http://blog.aquait.info/2010/01/scrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 19:21:34 +0000</pubDate>
		<dc:creator>Gabriel</dc:creator>
				<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=198</guid>
		<description><![CDATA[Hace nueve años comencé a gestionar procesos de desarrollo de software, utilice varias metodologías ortodoxas que me ayudaron a lograr los objetivos de mis proyectos. En la medida que adquiría experiencia me daba cuenta que faltaba algo. Tenía la sensación que lograba las metas con un esfuerzo personal muy importante, pero mi equipo lo hacía [...]]]></description>
			<content:encoded><![CDATA[<p>Hace nueve años comencé a gestionar procesos de desarrollo de software, utilice varias metodologías ortodoxas que me ayudaron a lograr los objetivos de mis proyectos.</p>
<p>En la medida que adquiría experiencia me daba cuenta que faltaba algo. Tenía la sensación que lograba las metas con un esfuerzo personal muy importante, pero mi equipo lo hacía de forma irregular.</p>
<p>Luego de decenas de proyectos comencé a buscar la verdadera razón del éxito. Comprendí que éste radica en la naturaleza de las personas que trabajan en él, sumado al conocimiento técnico adecuado. Por esta razón, siempre considere a mi equipo de trabajo como el “gran actor” de un proyecto y siempre intente generar el contexto más adecuado para obtener el mayor rendimiento de ellos, incluyendo la motivación personal.<br />
<span id="more-198"></span><br />
También aprendí que si quieres hacer un proyecto exitoso debes estar dispuesto a darle paso a quienes te acompañan en el trabajo cotidiano. Sin importar el nivel jerárquico, todos quieren ser reconocidos, todos quieren proponer, todos quieren aportar al objetivo. He aquí lo difícil, intentar satisfacer estas necesidades. Siempre intente hacerlo, convencido que era fundamental para lograr el objetivo.</p>
<p>Hace un par de años atrás, descubrí que muchas de esas premisas, en las cuales yo me basaba intuitivamente, estaban plasmadas en algo llamado SCRUM. Comencé a leer con ahínco, y poco a poco me daba cuenta que había encontrando lo que desde hace tiempo buscaba. Un marco de trabajo que pone por escrito el sentido común, basándose en el valor que aportan las personas, el vínculo, la creatividad, la crítica constructiva, la auto-enseñanza y la auto-organización.</p>
<p>¿Acaso alguien cree que es un buen project manager por hacer cronogramas, calcular presupuestos, hacer cumplir órdenes? Si estás o has estado desempeñando este rol, seguramente pienses que nada de lo anterior fue fundamental en el éxito de un proyecto. En mi opinión, un buen project manager es quién logra llevar a cabo un proyecto sintiendo que realmente tuvo el control del proyecto, fue el gestor, pero sabe perfectamente que sin el equipo de trabajo, solamente con su aporte individual no lograba el objetivo.</p>
<p>Del análisis anterior surge el tipo de líder que propone SCRUM,  el líder que articula, orquesta, comanda, pero prácticamente no aparece en escena. Logrando el compromiso profesional de su equipo de trabajo plasmado en productos tangibles, que agreguen valor al cliente. Todo esto, conjugado con ciclos de desarrollo cortos, permiten corregir en base al empirismo y siempre con riesgo de bajo costo.</p>
<p>Muchas veces, al hablar de metodologías ágiles, tales como SCRUM, los project manager pensamos en anarquía y poca intensidad, cuando en realidad es exactamente lo contrario. Para practicar correctamente SCRUM se exige disciplina e intensidad, sostenidas en el tiempo.</p>
<p>Podría haber escrito un artículo que explicara aburridamente SCRUM, pero iría contra la esencia de éste método, por tal razón, los invito a aprender SCRUM. Luego habrá tiempo para decidir si lo practican o no, pero no lo quiten de sus escenarios por desconocimiento. Piensen, por algo está siendo utilizado por las grandes empresas del mundo de tecnología; Google, Yahoo, Microsoft, HP, Novell, SAP, Nokia, Xerox, etc.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F01%2Fscrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo%2F&amp;linkname=SCRUM%20%26%238211%3B%20Cuando%20comprendas%20esta%20metodolog%C3%ADa%20de%20proyectos%20sentir%C3%A1s%20que%20lo%20sab%C3%ADas%20desde%20hace%20tiempo" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F01%2Fscrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo%2F&amp;linkname=SCRUM%20%26%238211%3B%20Cuando%20comprendas%20esta%20metodolog%C3%ADa%20de%20proyectos%20sentir%C3%A1s%20que%20lo%20sab%C3%ADas%20desde%20hace%20tiempo" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F01%2Fscrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo%2F&amp;linkname=SCRUM%20%26%238211%3B%20Cuando%20comprendas%20esta%20metodolog%C3%ADa%20de%20proyectos%20sentir%C3%A1s%20que%20lo%20sab%C3%ADas%20desde%20hace%20tiempo" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F01%2Fscrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo%2F&amp;linkname=SCRUM%20%26%238211%3B%20Cuando%20comprendas%20esta%20metodolog%C3%ADa%20de%20proyectos%20sentir%C3%A1s%20que%20lo%20sab%C3%ADas%20desde%20hace%20tiempo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F01%2Fscrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo%2F&amp;title=SCRUM%20%26%238211%3B%20Cuando%20comprendas%20esta%20metodolog%C3%ADa%20de%20proyectos%20sentir%C3%A1s%20que%20lo%20sab%C3%ADas%20desde%20hace%20tiempo" id="wpa2a_12"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/01/scrum-cuando-comprendas-esta-metodologia-de-proyectos-sentiras-que-lo-sabias-desde-hace-tiempo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GWT Reflection</title>
		<link>http://blog.aquait.info/2009/12/gwt-reflection/</link>
		<comments>http://blog.aquait.info/2009/12/gwt-reflection/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 00:32:02 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=188</guid>
		<description><![CDATA[Intro Siguiendo en la linea de la introspección, hoy vamos a ver una simple reflexión que nos va a permitir invocar sobre una instancia de una clase a métodos por su nombre. What for? La reflexión es una característica interesante, que se hace fundamental a la hora de diseñar componentes genéricos. Nos permite crear instancias [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0in;">Intro</p>
<p style="margin-bottom: 0in;">Siguiendo en la linea de la introspección, hoy vamos a ver una simple reflexión que nos va a permitir invocar sobre una instancia de una clase a métodos por su nombre.</p>
<p style="margin-bottom: 0in;"><span id="more-188"></span></p>
<p style="margin-bottom: 0in;">What for?</p>
<p style="margin-bottom: 0in;">La reflexión es una característica interesante, que se hace fundamental a la hora de diseñar componentes genéricos. Nos permite crear instancias de determinada clase con el nombre de la clase o también invocar métodos sobre una instancia de una clase teniendo el nombre del método. Esto, por ejemplo, nos simplifica enormemente la implementación del patrón command.</p>
<p style="margin-bottom: 0in;">How? What?!</p>
<p style="margin-bottom: 0in;">En GWT (al menos hasta la 1.7) no hay reflexión. Lo que vamos a hacer en esta implementación de reflexión, es proveer un mecanismo para invocar métodos por nombre. Suponiendo que tenemos una clase llamada <strong>MiClase</strong> que tiene un método llamado <strong>miMetodo</strong> buscamos poder hacer algo así:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">MiClase instancia = new MiClase();</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">String nombreMetodo = “miMetodo”;</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">Object[] parametros = new Object[]{...};</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">invocar(instancia, nombreMetodo, parametros);</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Enter generators!</p>
<p style="margin-bottom: 0in;">Lo que vamos a hacer es que GWT genere la clase MiClaseReflection. ¿Cómo? Usando generators. Esta es una característica bien interesante de GWT. El foco de este artículo no está en explicar generators, hay mucha literatura en Internet. Acá va un link: <a href="http://code.google.com/intl/es/webtoolkit/doc/1.6/DevGuideCodingBasics.html#DevGuideDeferredBinding">http://code.google.com/intl/es/webtoolkit/doc/1.6/DevGuideCodingBasics.html#DevGuideDeferredBinding</a>. Igual no hay que ser un experto para entender lo que vamos a hacer.</p>
<p style="margin-bottom: 0in;">Básicamente vamos a escribir una clase que genere el código de MiClaseReflection, que tiene un único método -invocar- que es una cadena if..elseif..else que pregunta por cada método de MiClase y si alguna coincide, se lo invoca. Sería algo como esto:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">if (nombreMetodo.equals(“miMetodo1”)) {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    target.miMetodo1(params);  // void</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">} else if (nombreMetodo.equals(“miMetodo2”)) {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    return target.miMetodo2(params); // no void</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">} else {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    throw new Exception(“método no encontrador: ” + nombreMetodo);</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">}</span></span></pre>
<p style="margin-bottom: 0in;">Obviamente falta chequeos de parámetros.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Para no tener que realizar ningún paso previo a la compilación generando la clase con alguna utilidad externa vamos a usar la API que tiene GWT que permite extender el compilador (com.google.gwt.core.ext). NOTA: Los que hayan utilizado APT de Java van ver unas cuantas similitudes (<a href="http://java.sun.com/javase/6/docs/technotes/guides/apt/index.html">http://java.sun.com/javase/6/docs/technotes/guides/apt/index.html</a>).</p>
<p style="margin-bottom: 0in;">Cuando el compilador de GWT encuentra con la instrucción GWT.create(class) –que devuelve una implementación de la interfaz class– invoca al generador asociado a la interfaz class (esta asociación se declara en el gwt.xml del módulo). En este generador se “escribe” el código que implementa la interfaz class. Para escribir este código tenemos la asistencia de la API com.google.gwt.core.ext.typeinfo que recuerda mucho a la API Mirror Reflection de Java.</p>
<p style="margin-bottom: 0in;">Generate</p>
<p style="margin-bottom: 0in;">La instrucción GWT.create() toma una interfaz y devuelve una implementación de la misma. Entonces vamos definir una interfaz de marca y la vamos a llamar Reflectable. Toda clase que queramos tener soporte de reflexión va a tener que implementar esta interfaz:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">public interface Reflectable {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">}</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Entonces la clase MiClase:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">public class MiClase implements Reflectable {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    void miMetodo1();</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    int miMetodo2();</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">}</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Además, tenemos que tener la interfaz de idioma de la reflexión:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">public interface Reflection&lt;I extends Reflectable&gt; {</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    Object invoke(I target, String methodName, Object... params)</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    throws InvocationException;</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">}</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Para obtener una reflexión y usarla suponiendo que <strong>miMetodo</strong> no tiene parámetros:</p>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">MiClase objeto = new MiClase();</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">Reflection&lt;MiClase&gt; reflection = GWT.create(MiClase.class);</span></span></pre>
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">reflection.invoke(objeto, “miMetodo”);</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Para asociar el generador con la interfaz Reflectable, agregamos el siguiente fragmento al :</p>
<p style="margin-bottom: 0in;">
<pre style="margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    &lt;generate-with class="com.aquait.utils.gwt.rebind.ReflectionGenerator"&gt;</span></span></pre>
<pre style="margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">        &lt;when-type-assignable class="com.aquait.utils.gwt.reflection.Reflectable"/&gt;</span></span></pre>
<pre style="margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">    &lt;/generate-with&gt;</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Así, cuando el compilador de GWT encuentra GWT.create(MiClase.class), llama al generador pues la clase MiClase implementa Reflectable. Luego, tenemos una implementación de la interfaz Reflectable para la clase MiClase.</p>
<p style="margin-bottom: 0in;">Para usarlo en un proyecto, hay que agregar esto en el &lt;modulo&gt;.gwt.xml:</p>
<p style="margin-bottom: 0in;">
<pre style="margin-left: 0.49in; margin-bottom: 0in;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">&lt;inherits name="com.aquait.utils.gwt.Reflection"/&gt;</span></span></pre>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">El JAR se puede descargar de acá: <a href="http://blog.aquait.info/wp-content/uploads/2009/12/introspection-reflection4gwt.jar_.gz">introspection-reflection4gwt.jar</a></p>
<p style="margin-bottom: 0in;">Nota: Este JAR tiene una versión actualizada de la introspección que elimina los métodos getIntrospectable() y setIntrospectable() de la interfaz Introspection. Por lo tanto, los métodos getProperty() y setProperty() toman como primer parámetro al Introspectable.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F12%2Fgwt-reflection%2F&amp;linkname=GWT%20Reflection" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F12%2Fgwt-reflection%2F&amp;linkname=GWT%20Reflection" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F12%2Fgwt-reflection%2F&amp;linkname=GWT%20Reflection" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F12%2Fgwt-reflection%2F&amp;linkname=GWT%20Reflection" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F12%2Fgwt-reflection%2F&amp;title=GWT%20Reflection" id="wpa2a_14"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/12/gwt-reflection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java AppServer-03: Configuración y código</title>
		<link>http://blog.aquait.info/2009/10/180/</link>
		<comments>http://blog.aquait.info/2009/10/180/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 01:08:40 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[AppServer]]></category>
		<category><![CDATA[RPC]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=180</guid>
		<description><![CDATA[Este es el último artículo de esta serie. En este voy a presentar como se configura el servidor y además voy a subir el código fuente. Estructura de directorios: aquait-appserver/ application/ db_connection_pool.config Configuración del módulo pool de conexiones a la base modules.config Configuración de los módulos services.config Configuración de los servicios messaging.config Configuración del módulo [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } 		A:link { so-language: zxx } --></p>
<p style="margin-bottom: 0in; font-weight: normal;">Este es el último artículo de esta serie. En este voy a presentar como se configura el servidor y además voy a subir el código fuente.</p>
<p style="margin-bottom: 0in; font-weight: normal;"><span id="more-180"></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">Estructura de directorios:</p>
<p style="margin-bottom: 0in;"><strong>aquait-appserver/</strong></p>
<ul>
<li><strong> application/</strong>
<ul>
<li>db_connection_pool.config	Configuración del módulo pool de conexiones a la base</li>
<li>modules.config		Configuración de los módulos</li>
<li>services.config 		Configuración de los servicios</li>
<li>messaging.config		Configuración del módulo de mensajería</li>
<li>security.config 		Configuración de seguridad</li>
</ul>
</li>
<li><strong> lib/</strong>
<ul>
<li>aquaitrt-bin_2009r1.jar	Runtime</li>
<li>mail.jar 			Servicio de mail</li>
</ul>
</li>
<li><strong> log/</strong></li>
<li>logging.config				Configuración de logging</li>
<li>server.config				Configuración del servidor</li>
<li>start.sh</li>
<li>stop.sh</li>
<li>start.cmd				       Scripts para iniciar y detener al servidor</li>
<li>start.sh</li>
<li>stop.cmd</li>
<li>stop.sh</li>
</ul>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;"><strong>logging.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.level = ALL </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.pattern = ./log/server.%u.txt </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.limit = 50000 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.count = 1 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.FileHandler.formatter = com.aquait.utils.logging.ServerFormatter </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.ConsoleHandler.level = INFO </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">java.util.logging.ConsoleHandler.formatter = com.aquait.utils.logging.ServerFormatter </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Archivo que configura el logging. El servidor usa la API estándar de Java SE para logear. El archivo por defecto define dos handlers. El primero que genera archivos y el segundo logea a la consola. Por más detalles, ver http://java.sun.com/javase/6/docs/api/java/util/logging/package-summary.html.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>server.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Server config </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Server listening port </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">port = 6666 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Worker pool size </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">workers.poolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Shutdown password </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">shutdown.password = _shut_down_now_server_ </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo define tres parámetros del servidor. Primero el puerto TCP/IP en el cual el servidor escucha conexiones. Los clientes se deberán conectar a este puerto. El segundo parámetro define la cantidad de workers (hilos) que atienden los pedidos de los clientes. Y el tercero es la contraseña para bajar el servidor. Se baja mediante el script stop que se comunica al puerto definido y manda un mensaje especial. El servidor solamente se puede bajar desde el mismo host en donde está ejecutando.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>db_connection_pool.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># DBConnectionPoolModule configuration </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Examples: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#     url = jdbc:oracle:thin:@&lt;host&gt;:&lt;port&gt;:&lt;database&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#     driverclass = oracle.jdbc.driver.OracleDriver </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">enable = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">url = &lt;url&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">username = &lt;user&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">password = &lt;pass&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">driverclass = &lt;driver_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">autocommit = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">poolsize = 5 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">maxpoolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo controla los parámetros del pool de conexiones a la base de datos.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>modules.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Modules to load </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       module.name = &lt;module_name&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       module[&lt;module_name&gt;].class = &lt;module_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#</span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">En este archivo se delcaran los módulos que van a desplegarse en el servidor. Cada módulo puede tener una cantidad varible de parámetros.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>messaging.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># MessagingModule configuration </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">enable = false </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">poolsize = 10 </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"> # Security realms </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format (&lt;n&gt; starts at 0): </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       security_realm[&lt;n&gt;] = &lt;security_realm_class&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#</span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo configura la seguridad del servidor. Se pueden definir varios realms que se ejecutan en orden  para cada pedido de los clientes.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;"><strong>services.config</strong></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Services </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># Format: </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].interface = &lt;service_interface&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].implementation = &lt;service_implementation&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;">#       service[&lt;service_name&gt;].parameter[&lt;param_name&gt;] = &lt;param_value&gt; </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;"><span style="font-family: Liberation Mono,monospace;"><span style="font-size: x-small;"># </span></span></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Este archivo configura los servicios que se publican en el servidor. Para cada servicio hay que configurar la interfaz y la implementación de esta. Además, opcionalmente, se pueden agregar parámetros de inicialización.</p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">
<p style="margin-bottom: 0in; font-weight: normal;">Con esto finalizamos esta serie. Siempre estoy a las orden ante cualquier consulta que tengan al respecto de este servidor.</p>
<p style="margin-bottom: 0in; font-weight: normal;">Bajar código fuente: <a href="http://blog.aquait.info/wp-content/uploads/2009/10/aquaitrt_2009-10-14.tar.gz">aquaitrt_2009-10-14.tar.gz</a></p>
<p style="margin-bottom: 0in; font-weight: normal;">
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;linkname=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2F180%2F&amp;title=Java%20AppServer-03%3A%20Configuraci%C3%B3n%20y%20c%C3%B3digo" id="wpa2a_16"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/10/180/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java AppServer-02: DBPool + Messaging</title>
		<link>http://blog.aquait.info/2009/10/java-appserver-02-dbpool-messaging/</link>
		<comments>http://blog.aquait.info/2009/10/java-appserver-02-dbpool-messaging/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 18:17:16 +0000</pubDate>
		<dc:creator>Enrique</dc:creator>
				<category><![CDATA[AppServer]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Lab]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=175</guid>
		<description><![CDATA[Siguiendo la exploración de los principales componentes de servidor, en este artículo vamos a ver el el componente de conexiones a la base de datos y el de mensajería. Los dos componentes se diseñaron e implementaron separadamente del servidor de aplicaciones, por lo que no están acoplados de ninguna forma. Para “agregarlos” al servidor, se [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Siguiendo la exploración de los principales componentes de servidor, en este artículo vamos a ver el el componente de conexiones a la base de datos y el de mensajería. Los dos componentes se diseñaron e implementaron separadamente del servidor de aplicaciones, por lo que no están acoplados de ninguna forma. Para “agregarlos” al servidor, se implementaron módulos del servidor que los adaptan. <span id="more-175"></span></p>
<p style="margin-bottom: 0in;">Pool de conexiones a la base de datos</p>
<p style="margin-bottom: 0in;">El pool implementado es muy sencillo. Tiene una colección de conexiones con un tamaño inicial (configurable) y en caso de que el cliente (en este caso el servidor de aplicaciones) necesite más, crea hasta un máximo (también configurable).</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_176" class="wp-caption aligncenter" style="width: 570px"><a href="http://blog.aquait.info/wp-content/uploads/2009/10/Java-AppServer-02-fig1.png"><img class="size-full wp-image-176 " title="Java-AppServer-02-fig1" src="http://blog.aquait.info/wp-content/uploads/2009/10/Java-AppServer-02-fig1.png" alt="Diseño del pool de conexiónes a la BD" width="560" height="426" /></a><p class="wp-caption-text">Diseño del pool de conexiónes a la BD</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">Los métodos startup() y shutdown() del módulo manejan el ciclo de vida del pool. El primero carga de un archivo de configuración -que veremos más adelante- los datos para crear el pool y el segundo mata a las conexiones activas.</p>
<p style="margin-bottom: 0in;">
<p style="margin-bottom: 0in;">Mensajería</p>
<p style="margin-bottom: 0in; font-weight: normal;">El servicio de mensajería también es sencillo, pero potente. Poseé un pool de hilos que procesan los mensajes en form asíncrona. La clase Messaging tiene un conjunto de MessageHandlers que son los responsables de procesar los mensajes. Cuando llega un mensaje, este se le pasa a todos los handlers y cada uno es responsable de si lo procesa o no.</p>
<p style="margin-bottom: 0in; text-align: center;">
<div id="attachment_177" class="wp-caption aligncenter" style="width: 634px"><a href="http://blog.aquait.info/wp-content/uploads/2009/10/Java-AppServer-02-fig2.png"><img class="size-full wp-image-177 " title="Java-AppServer-02-fig2" src="http://blog.aquait.info/wp-content/uploads/2009/10/Java-AppServer-02-fig2.png" alt="Diseño del servicio de mensajería" width="624" height="435" /></a><p class="wp-caption-text">Diseño del servicio de mensajería</p></div>
<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in; font-weight: normal;">En el próximo artículo voy presentar la configuración del servidor y también voy a subir el código fuente. Hasta el próximo!</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2Fjava-appserver-02-dbpool-messaging%2F&amp;linkname=Java%20AppServer-02%3A%20DBPool%20%2B%20Messaging" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2Fjava-appserver-02-dbpool-messaging%2F&amp;linkname=Java%20AppServer-02%3A%20DBPool%20%2B%20Messaging" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2Fjava-appserver-02-dbpool-messaging%2F&amp;linkname=Java%20AppServer-02%3A%20DBPool%20%2B%20Messaging" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2Fjava-appserver-02-dbpool-messaging%2F&amp;linkname=Java%20AppServer-02%3A%20DBPool%20%2B%20Messaging" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2009%2F10%2Fjava-appserver-02-dbpool-messaging%2F&amp;title=Java%20AppServer-02%3A%20DBPool%20%2B%20Messaging" id="wpa2a_18"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2009/10/java-appserver-02-dbpool-messaging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

