<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEUGRHs8eSp7ImA9WxBREU8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957</id><updated>2009-12-29T14:37:05.571-08:00</updated><title>Weblog de Alejandro Scandroli</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://weblog.amneris.es/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://weblog.amneris.es/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/amneris" /><feedburner:info uri="amneris" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEUGRHk6fSp7ImA9WxBREU8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-4227700379762545968</id><published>2009-12-29T14:15:00.000-08:00</published><updated>2009-12-29T14:37:05.715-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-29T14:37:05.715-08:00</app:edited><title>Repositorios Maven en dev.java.net</title><content type="html">No estoy seguro que es lo que pasa últimamente con los repositorios Maven de dev.java.net. Todos los archivos descargados desde estos repositorios están fallando con un error del tipo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;slf4j-simple-1.5.8.jar; error in opening zip file&lt;/blockquote&gt;&lt;br /&gt;Parece ser que han trasladado los servidores de &lt;a href="https://maven-repository.dev.java.net/nonav/repository" target="_blank"&gt;https://maven-repository.&lt;wbr&gt;dev.java.net/nonav/repository&lt;/a&gt; a &lt;a href="http://download.java.net/"&gt;http://download.java.net/&lt;/a&gt;  y en lugar de usar un HTTP Redirect 301 están usando algún otro tipo de redirección que Maven no es capaz de procesar.&lt;br /&gt;&lt;br /&gt;Para evitar el uso de estos servidores he escaneado mi &lt;span style="font-style: italic;"&gt;~/.m2/repository&lt;/span&gt; en busca de &lt;span style="font-style: italic;"&gt;poms&lt;/span&gt; con referencias a java.net y he creado una especie de &lt;span style="font-style: italic;"&gt;blacklist&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;profile&lt;/span&gt; que permite ignorarlos.&lt;br /&gt;&lt;br /&gt; &amp;lt;profile&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;blacklist&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;repositories&amp;gt;&lt;br /&gt;   &amp;lt;repository&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;maven-repository.dev.java.net&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;url&amp;gt;https://maven-repository.dev.java.net/nonav/repository&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;releases&amp;gt;&lt;br /&gt;     &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;    &amp;lt;/releases&amp;gt;&lt;br /&gt;    &amp;lt;snapshots&amp;gt;&lt;br /&gt;     &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;    &amp;lt;/snapshots&amp;gt;&lt;br /&gt;   &amp;lt;/repository&amp;gt;&lt;br /&gt;   &amp;lt;repository&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;java.net&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;url&amp;gt;https://maven-repository.dev.java.net/nonav/repository&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;releases&amp;gt;&lt;br /&gt;     &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;    &amp;lt;/releases&amp;gt;&lt;br /&gt;    &amp;lt;snapshots&amp;gt;&lt;br /&gt;     &amp;lt;enabled&amp;gt;false&amp;lt;/enabled&amp;gt;&lt;br /&gt;    &amp;lt;/snapshots&amp;gt;&lt;br /&gt;   &amp;lt;/repository&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/repositories&amp;gt;&lt;br /&gt; &amp;lt;/profile&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;luego &lt;span style="font-style:italic;"&gt;mvn compile -P blacklist&lt;/span&gt; y voilà&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-4227700379762545968?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/ADl3jjlAerk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/4227700379762545968/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=4227700379762545968" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/4227700379762545968?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/4227700379762545968?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/ADl3jjlAerk/repositorios-maven-en-devjavanet.html" title="Repositorios Maven en dev.java.net" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/12/repositorios-maven-en-devjavanet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8DQX06fip7ImA9WxNVF08.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-2664590870113347793</id><published>2009-10-28T01:45:00.000-07:00</published><updated>2009-10-28T02:41:10.316-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-28T02:41:10.316-07:00</app:edited><title>Trails is dead, long live Tynamo!</title><content type="html">Repitiendo un poco lo que mi compañero Kalle Korhonen comentó en la lista de desarrollo y en la web de &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt;: Trails is dead, long live &lt;a href="http://tynamo.org/"&gt;Tynamo&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;El titular es un poco amarillista intentando atraer un poco de atención, pero la verdad es que Trails no está muerto, sino que Trails 1.x está en "maintenance mode" y Trails 2 (la nueva versión basada en &lt;a href="http://tapestry.apache.org/tapestry5.1/"&gt;Tapestry5&lt;/a&gt;) ha sido renombrado a &lt;span style="font-weight: bold;"&gt;Tynamo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Un resumen (editado de la lista de correos) de las razones del cambio de nombre:&lt;br /&gt;&lt;blockquote&gt;En segundo plano (en realidad en la lista de desarrolladores) hemos estado discutiendo de cual debería ser nuestra estrategia respecto de Tapestry5. Hace más de un año &lt;span style="font-style: italic;"&gt;"perdimos"&lt;/span&gt; el dominio trailsframework.org (esto es bastante largo de explicar, pero la versión corta es que los committers actuales nunca tuvimos posesión del dominio) y desde ese entonces estamos analizando varias alternativas acerca de como lidiar con esto. Hace un par de meses finalmente decidimos que lo más fácil para nosotros sería renombrar el proyecto y relanzar Trails2 con un nuevo nombre: Tynamo&lt;br /&gt;Esto todavía esta sin publicitar, pero la mudanza ya está en camino, el código ya ha sido trasladado al nuevo repositorio y todos los módulos y paquetes han sido renombrados.&lt;br /&gt;Creemos que hay una gran posibilidad de tener preparada la release inicial de Tynamo para antes de  fin de año. Cuando la tengamos haremos el anuncio formal correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Así que ya pueden venir a visitarnos a &lt;a href="http://tynamo.org/"&gt;&lt;span style="text-decoration: underline;"&gt;http://tynamo.org/&lt;/span&gt;&lt;/a&gt; (esta vez somos los dueños del dominio). El site está prácticamente vacío porque estamos trabajando en él y preparando las releases. Las snapshots ya están disponibles en: &lt;a href="http://ci.repository.codehaus.org/org/tynamo/"&gt;http://ci.repository.codehaus.org/org/tynamo/&lt;/a&gt;&lt;br /&gt;El repositorio ya está completamente migrado (con log histórico completo), el nuevo dominio funcionando y nuestros continuous integration builds ejecutándose exitosamente, así que estamos nuevamente en carrera con Tynamo. Para el momento en el que anunciemos el proyecto Tynamo a una audiencia más grande, ya deberíamos tener varios nuevos módulos preparados para el release como así también documentación decente (este nunca fue nuestro fuerte) y ejemplos que los acompañen.&lt;br /&gt;&lt;br /&gt;Como adelanto puedo comentar que tendremos un nuevo módulo para &lt;a href="http://www.jboss.org/envers/"&gt;Envers&lt;/a&gt; y uno para &lt;a href="http://www.jboss.org/resteasy/"&gt;RESTeasy&lt;/a&gt;. También puedo adelantar que haremos open source la integración con &lt;a href="http://labs.jboss.com/jbossjbpm/"&gt;jBPM&lt;/a&gt; (tapestry5-jbpm y tynamo-jbpm) que teníamos desarrollada en la empresa.&lt;br /&gt;&lt;br /&gt;Como comentaba antes, la versión basada en Tapestry4 está en "maintenance mode" pero nosotros seguimos dando soporte en la lista de usuarios y si se encuentran problemas serios los solucionaremos.&lt;br /&gt;&lt;br /&gt;Los desarrolladores queremos agradecer a &lt;a href="http://codehaus.org/"&gt;Codehaus&lt;/a&gt; y especialmente a Ben Walding por pacientemente acompañarnos en la transición dándonos soporte y solucionándonos numerosos problemas.&lt;br /&gt;&lt;br /&gt;Espero poder comunicarles más novedades pronto.&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-2664590870113347793?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/uSRiABIvgKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/2664590870113347793/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=2664590870113347793" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/2664590870113347793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/2664590870113347793?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/uSRiABIvgKw/trails-is-dead-long-live-tynamo.html" title="Trails is dead, long live Tynamo!" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/10/trails-is-dead-long-live-tynamo.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYARXozeyp7ImA9WxNQEEs.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-8458104289506113763</id><published>2009-09-15T16:30:00.000-07:00</published><updated>2009-09-15T17:15:44.483-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-15T17:15:44.483-07:00</app:edited><title>Involucrados y comprometidos según Michael Jordan</title><content type="html">El fin de semana estaba mirando el video del discurso de Michael Jordan en la ceremonia del Hall of Fame de la NBA y una parte del discurso me llamó mucho la atención.&lt;br /&gt;A ver si a alguno de uds esto les suena a la parábola de "cerdos y gallinas" (aka: Ham 'n Eggs).&lt;br /&gt;&lt;br /&gt;Juzguen ustedes mismos (comienza en el minuto 12):&lt;br /&gt;&lt;br /&gt;&lt;script src="http://i.cdn.turner.com/nba/nba/.element/js/1.1/xmp/module.js?vid=/video/channels/hall_of_fame/2009/09/11/nba_20090911_hof_jordan_speech.nba" type="text/javascript"&gt;&lt;/script&gt;&lt;noscript&gt;Embedded video from &lt;a href="http://www.nba.com/video"&gt;NBA Video&lt;/a&gt;&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;El dijo (en referencia a Jerry Krause) las organizaciones ganan campeonatos, pero yo no vi a la organización jugar engripada en Utah, no la vi jugando con el tobillo lesionado. Las organizaciones arman equipos, pero es el equipo el que tiene que salir a jugar, así que los jugadores ganan campeonatos. No me mal interpreten, por supuesto que las organizaciones tienen mucho que ver con el campeonato, pero no pongan a la organización por encima de los jugadores porque al final del día son los jugadores quienes tienen que salir a jugar, la organización es quien tiene que pagarnos pero somos los jugadores los que tenemos que dar la cara y salir a jugar.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;UPDATE&lt;/span&gt;: por alguna extraña razón el video embebido no funciona,  aquí dejor el link al video original: &lt;a href="http://www.nba.com/video/channels/hall_of_fame/2009/09/11/nba_20090911_hof_jordan_speech.nba/"&gt;http://www.nba.com/video/channels/hall_of_fame/2009/09/11/nba_20090911_hof_jordan_speech.nba/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-8458104289506113763?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/OdFGLJMe0TU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/8458104289506113763/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=8458104289506113763" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8458104289506113763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8458104289506113763?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/OdFGLJMe0TU/involucrados-y-comprometidos-segun.html" title="Involucrados y comprometidos según Michael Jordan" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/09/involucrados-y-comprometidos-segun.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUINRXo6eCp7ImA9WxNSE08.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-2047786622982742181</id><published>2009-08-26T15:50:00.000-07:00</published><updated>2009-08-26T15:59:54.410-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-26T15:59:54.410-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="magnolia" /><category scheme="http://www.blogger.com/atom/ns#" term="jbpm" /><category scheme="http://www.blogger.com/atom/ns#" term="tapestry5" /><category scheme="http://www.blogger.com/atom/ns#" term="trails" /><category scheme="http://www.blogger.com/atom/ns#" term="tapestry4" /><title>Cambios en en el stack de Amneris (Tiempo de Balances 1)</title><content type="html">El &lt;a href="http://www.amneris.es/servicios.html#stack"&gt;stack&lt;/a&gt; de Amneris ha sufrido grandes cambios en los últimos meses. Tenemos 3 nuevas incorporaciones, 2 jubilaciones, y un retiro por invalidez :)&lt;br /&gt;&lt;br /&gt;En primer lugar damos la bienvenida oficial a &lt;a href="http://tapestry.apache.org/tapestry5.1/"&gt;Tapestry5&lt;/a&gt; que si bien ya hacia tiempo que estaba dando vueltas por los alrededores, no había sido debidamente presentado. La adopción de Tapestry5 deja a &lt;a href="http://tapestry.apache.org/tapestry4.1/"&gt;Tapestry4&lt;/a&gt; relegado al mantenimiento de aplicaciones legacy.&lt;br /&gt;&lt;br /&gt;De la misma manera que Tapestry4, se retira con honores &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt; 1.x, que ya ha cumplido su ciclo, para dejar paso al todavía en desarrollo Trails 2 basado en Tapestry5. Trails 2 está todavía muy lejos de ofrecer todas las prestaciones que ofrece se hermano menor, pero no tiene sentido seguir invirtiendo tiempo en Trails 1 cuando el framework principal en el que se basa está ya completamente obsoleto. Esto conlleva también el esfuerzo de ir migrando de a poco todos nuestros otros frameworks y librerías que se basaban en Trails.&lt;br /&gt;&lt;br /&gt;La incorporación de Tapestry5 al stack desplaza también a &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt; como framework de &lt;a href="http://martinfowler.com/articles/injection.html"&gt;IoC&lt;/a&gt; por defecto del stack. Spring (a mi parecer) a dejado de innovar en el espacio de la IoC y en estos momentos hay ofertas muchísimo más interesantes como &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; y &lt;a href="http://tapestry.apache.org/tapestry5/tapestry-ioc/"&gt;Tapestry5 IoC&lt;/a&gt;. La cantidad de código basado en Spring IoC que tenemos es tal que reemplazarlo no será tarea fácil, pero de ahora en adelante Spring no será la primer alternativa a la hora de implementar IoC en nuestras aplicaciones. Trails2 será completamente independiente de Spring. Completamente compatible SI, pero independiente al fin.&lt;br /&gt;&lt;br /&gt;Ya he mencionado la incorporación de Tapestry5 y Trails2 pero el gran fichaje de la temporada es &lt;a href="http://www.magnolia-cms.com/"&gt;Magnolia CMS&lt;/a&gt;. Trails nos estaba quedando un poco chico para según que cosas y necesitábamos incorporar una solución robusta que nos garantizara estabilidad pero con flexibilidad.  Magnolia se usa detrás de los sitios de InfoQ y JBoss.org, así que si puede con la carga de esos dos sitios, podrá manejar nuestra carga sin ningún inconveniente. Otra gran característica de Magnolia es la implementación de Java Content Repository (&lt;a href="http://jcp.org/en/jsr/detail?id=170"&gt;JCR - JSR-170&lt;/a&gt;) que nos da una gran tranquilidad respecto de que nuestros datos son almacenados siguiendo un estándar abierto para la gestión de contenido.&lt;br /&gt;&lt;br /&gt;Bienvenidos Magnolia, Tapestry5 y Trails 2!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-2047786622982742181?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/rlrRKJpVtLI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/2047786622982742181/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=2047786622982742181" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/2047786622982742181?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/2047786622982742181?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/rlrRKJpVtLI/cambios-en-en-el-stack-de-amneris.html" title="Cambios en en el stack de Amneris (Tiempo de Balances 1)" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/08/cambios-en-en-el-stack-de-amneris.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYDSHg_eip7ImA9WxJTE0g.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-4414521178845629025</id><published>2009-04-21T15:35:00.000-07:00</published><updated>2009-04-21T16:22:59.642-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T16:22:59.642-07:00</app:edited><title>Escribir software es como ..... Escribir (by Bruce Eckel)</title><content type="html">El gran Bruce Eckel como siempre dando justo en la tecla con la última entrada de su blog: &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898"&gt;&lt;span class="ts"&gt;Writing Software is Like ... Writing&lt;/span&gt;&lt;/a&gt; en donde presenta una analogía de los programadores como escritores.&lt;br /&gt;&lt;br /&gt;Vale la pena leerlo todo y asimilarlo bien.&lt;br /&gt;Algunas de las cosas que me parecieron más interesantes:&lt;br /&gt;&lt;blockquote&gt;¿Porqué necesitamos una analogía? &lt;span style="font-weight: bold;"&gt;Nosotros&lt;/span&gt; sabemos lo que hacemos. Programamos computadoras, con todo lo que eso conlleva. Y nosotros sabemos lo que eso significa, porque nosotros lo hacemos. Pero para los stakeholders -- managers, CEOs, clientes, accionistas, etc -- el desarrollo de software es un misterio. Ellos no quieren saber todo al respecto, pero quieren saber lo suficiente como para poder predecir el comportamiento del desarrollo de software, aunque sea aproximadamente.&lt;br /&gt;&lt;/blockquote&gt;No estamos solos en este trabajo, y nuestros colaboradores necesitan poder entender que es lo que hacemos y como trabajamos, las analogías pueden ser útiles en este sentido.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;(...) "Si los programadores son como ingenieros, Yo debería ser capaz de reemplazar a un ingeniero por otro y obtener resultados similares, correcto?"&lt;br /&gt;&lt;/blockquote&gt;Todavía me parece escuchar la voz de un antiguo jefe: "no hay problema, total después contratamos otro? no?"&lt;br /&gt;&lt;br /&gt;JA!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;(...) Aquí esta mi propuesta. Creo que explica todo. Será muy insatisfactoria para los stakeholders que quieren un comportamiento completamente predecible y que quieren reemplazar un programador con otro y obtener resultados similares. (Eso aún no pasará. La única compensación para la impredecibilidad son aproximaciones como la de los métodos Ágiles, que incrementan el ancho de banda de la comunicación con los stakeholders). &lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;Hay 3 cosas que pueden salvarnos: Comunicación, Comunicación y Comunicación!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Somos Escritores.&lt;/blockquote&gt;Interesante, no?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;(...) Aunque los stakeholders no necesariamente entiendan los intrincados detalles de los procesos de escribir y publicar, típicamente entienden que hay diferentes maneras de escribir y que habilidad artesanal de escribir es rara, inconmensurable y un procesos artístico que no puede garantizar resultados. Así que aunque "programar sea como escribir" y esto no necesariamente vaya a incrementar la predictibilidad de lo que hacemos, puede que aunque sea ayude a los no-programadores a entender su &lt;span style="font-weight: bold;"&gt;impredecibilidad&lt;/span&gt;.&lt;/blockquote&gt;Aprovecho esta oportunidad para saludar a todos los que tienen que lidiar con mi falta de capacidad para explicar porque no puedo predecir, con un margen de error de 5 minutos, cuanto tiempo me llevará encontrar la linea de código que está haciendo que la memoria se vaya a las nubes y los invito a leer (a conciencia) al querido Bruce:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=255898"&gt;&lt;span class="ts"&gt;Writing Software is Like ... Writing&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-4414521178845629025?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/1p0msVirwFs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/4414521178845629025/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=4414521178845629025" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/4414521178845629025?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/4414521178845629025?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/1p0msVirwFs/escribir-software-es-como-escribir-by.html" title="Escribir software es como ..... Escribir (by Bruce Eckel)" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/04/escribir-software-es-como-escribir-by.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4HRng9fyp7ImA9WxVWE0k.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7846792645779985337</id><published>2009-02-22T11:35:00.000-08:00</published><updated>2009-02-22T15:22:17.667-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-22T15:22:17.667-08:00</app:edited><title>La deuda técnica</title><content type="html">Desde principio de año la &lt;a style="font-style: italic;" href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;deuda técnica&lt;/a&gt; es un tema constantemente en consideración en la empresa.&lt;br /&gt;Para los que no están al tanto, la &lt;span style="font-weight: bold; font-style: italic;"&gt;deuda técnica&lt;/span&gt; es una metáfora de la deuda en la que se incurre al avanzar en el desarrollo de manera &lt;span style="font-style: italic;"&gt;quick and dirty&lt;/span&gt;, sin prestar la debida atención a la calidad del código. Esta deuda, como la financiera, tiene intereses que se irán acumulando y que finalmente terminaremos pagando de una u otra manera. La deuda se puede ir cancelando, por ejemplo con &lt;span style="font-style: italic;"&gt;refactoring&lt;/span&gt; que aunque puede costar un esfuerzo extra sirve para recortar el pago de grandes intereses en un futuro.&lt;br /&gt;&lt;br /&gt;La semana pasada en un &lt;span style="font-style: italic;"&gt;thread&lt;/span&gt; de la lista de &lt;a href="http://www.agile-spain.com/"&gt;agile-spain&lt;/a&gt;: &lt;a href="http://groups.google.es/group/agile-spain/browse_thread/thread/8ceaa34339160351?hl=es"&gt;Quien deberia pagar la deuda ?&lt;/a&gt; el usuario Ángel Medinilla escribió una GRAN verdad:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Lo que no es planteable en software es decir "Ups. cometisteis un error. Os toca venir el fin de semana a arreglarlo, ya que yo no os pago por solucionar errores". En software se cometen errores. Punto. Si la tasa de errores es demasiado elevada, o se piden overtimes y se quema al equipo o se va invirtiendo poco a poco en mejorar la tasa, tanto a priori como a posteriori. La vía de Agile es la segunda. Las consultoras no opinan lo mismo :_D&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Me gusta tanto que me voy a imprimir en una remera (camiseta) la frase:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;En software se cometen errores. Punto.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;¿Quién no ha recorrido alguna vez (sino muchas) los interminables caminos de la primera vía?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7846792645779985337?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/MiOhs1F5ZwI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7846792645779985337/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7846792645779985337" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7846792645779985337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7846792645779985337?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/MiOhs1F5ZwI/la-deuda-tecnica.html" title="La deuda técnica" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/02/la-deuda-tecnica.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEADSHo-cSp7ImA9WxVXFEU.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-6405386842929673814</id><published>2009-02-12T15:30:00.000-08:00</published><updated>2009-02-12T15:52:59.459-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T15:52:59.459-08:00</app:edited><title>JBoss 5.0.0.GA error: SocketProcessId.getpid could not get unique port.</title><content type="html">Un pequeño error en la configuración de resolución de nombres de mi Ubuntu, impedía que que el JBoss 5.0 levantará normalmente con una configuración local en mi maquina de desarrollo.&lt;br /&gt;&lt;br /&gt;El log de error no es muy descriptivo que digamos:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;23:29:34,795 INFO  [TransactionManagerService] JBossTS Transaction Service (JTA version) - JBoss Inc.&lt;br /&gt;23:29:34,795 INFO  [TransactionManagerService] Setting up property manager MBean and JMX layer&lt;br /&gt;23:29:35,287 ERROR [AbstractKernelController] Error installing to Create: name=TransactionManager state=Configured&lt;br /&gt;com.arjuna.ats.arjuna.exceptions.FatalError: [com.arjuna.ats.internal.arjuna.utils.SocketProcessId_2] - SocketProcessId.getpid could not get unique port.&lt;br /&gt; at com.arjuna.ats.internal.arjuna.utils.SocketProcessId.getpid(SocketProcessId.java:105)&lt;br /&gt; at com.arjuna.ats.arjuna.utils.Utility.getpid(Utility.java:277)&lt;br /&gt; at com.arjuna.ats.arjuna.common.Uid.&lt;init&gt;(Uid.java:105)&lt;br /&gt; at com.arjuna.ats.arjuna.utils.Utility.getProcessUid(Utility.java:289)&lt;br /&gt; at com.arjuna.ats.internal.arjuna.recovery.TransactionStatusManagerItem.&lt;init&gt;(TransactionStatusManagerItem.java:366)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;La solución es fácil, aunque costo un poco encontrarla. &lt;span style="font-weight:bold;"&gt;El S.O. tiene que poder resolver correcta y bidirecionalmente su &lt;span style="font-style:italic;"&gt;hostname&lt;/span&gt;.&lt;/span&gt; &lt;br /&gt;Para verificarlo probar que funcione correctamente el comando:&lt;br /&gt;&lt;blockquote&gt;$ ping `hostname`&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style:italic;"&gt;En un PC de desarrollo el hostname comúnmente resuelve a 127.0.0.1&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Si el comando no funciona revisar la configuración de resolución de nombres, en mi caso fue suficiente con editar &lt;span style="font-style:italic;"&gt;"/etc/hosts"&lt;/span&gt; y agregar una linea que resuelva correctamente mi hostname a 127.0.0.1&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-6405386842929673814?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/f0y08xQFHTU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/6405386842929673814/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=6405386842929673814" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6405386842929673814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6405386842929673814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/f0y08xQFHTU/jboss-500ga-error-socketprocessidgetpid.html" title="JBoss 5.0.0.GA error: SocketProcessId.getpid could not get unique port." /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/02/jboss-500ga-error-socketprocessidgetpid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYDRX48cSp7ImA9WxVRFko.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7509432858178693389</id><published>2009-01-22T16:01:00.000-08:00</published><updated>2009-01-22T16:22:54.079-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-22T16:22:54.079-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="magnolia" /><title>Gmail &amp; Magnolia &amp; JavaMail [FIXED]</title><content type="html">(continuación de &lt;a href="http://weblog.amneris.es/2009/01/gmail-magnolia-javamail.html"&gt;Gmail &amp; Magnolia &amp; JavaMail&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Finalmente lo entendí! y resulta que los simpáticos muchachos de SUN tenían razón. Hay que leer hasta entender.&lt;br /&gt;&lt;br /&gt;Lo que estaba haciendo mal era agregar un SSLSocketFactory cuando la comunicación era TLS.&lt;br /&gt;Claro, ahora es fácil decirlo: &lt;span style="font-weight:bold;"&gt;"si es TLS obviamente no necesita socket SSL!"&lt;/span&gt;, pero costó sangre darse cuenta.&lt;br /&gt;&lt;br /&gt;La configuración finalmente queda así:&lt;br /&gt;&lt;blockquote&gt;        &lt;br /&gt;        if (Boolean.valueOf((String) this.mailParameters.get(SMTP_SSL)).booleanValue()) { // port 465&lt;br /&gt;              props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");&lt;br /&gt;              props.put("mail.smtp.socketFactory.fallback", "false");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (Boolean.valueOf((String) this.mailParameters.get(SMTP_TLS)).booleanValue()) { // port 587&lt;br /&gt;              props.put("mail.smtp.starttls.enable", "true");&lt;br /&gt;        }&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Gracias a Teresa Miyar el parche ya está integrado en el trunk de &lt;a href="http://www.magnolia-cms.com/"&gt;Magnolia&lt;/a&gt;. :)&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7509432858178693389?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/gr4dp7dgOkk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7509432858178693389/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7509432858178693389" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7509432858178693389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7509432858178693389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/gr4dp7dgOkk/gmail-magnolia-javamail-fixed.html" title="Gmail &amp; Magnolia &amp; JavaMail [FIXED]" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/01/gmail-magnolia-javamail-fixed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8DSH48eip7ImA9WxVRE00.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-6875714886362612421</id><published>2009-01-18T09:20:00.000-08:00</published><updated>2009-01-18T11:27:59.072-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-18T11:27:59.072-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="magnolia" /><title>Gmail &amp; Magnolia &amp; JavaMail</title><content type="html">Estaba trabajando en agregar soporte para Gmail en Magnolia (&lt;a href="http://jira.magnolia-cms.com/browse/MAGNOLIA-2420"&gt;MAGNOLIA-2420&lt;/a&gt;), dándome la cabeza contra la pared con errores de JavaMail cuando me encontré con este grato aviso en la documentación&lt;br /&gt;&lt;blockquote&gt;Note also that &lt;strong&gt;THERE IS NOT SUFFICIENT DOCUMENTATION HERE TO USE THESE FEATURES!!!&lt;/strong&gt;  You will need to read the appropriate RFCs mentioned above to understand what these features do and how to use them.  Don't just start setting properties and then complain to us when it doesn't work like you expect it to work.  &lt;strong&gt;READ THE RFCs FIRST!!!&lt;/strong&gt;&lt;/blockquote&gt;(Las negritas también son originales: &lt;a href="http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html"&gt;http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Que simpáticos los muchachos de SUN!!!&lt;br /&gt;&lt;br /&gt;Para conectar JavaMail con Gmail la misma &lt;a href="http://java.sun.com/products/javamail/FAQ.html#gmail"&gt;FAQ&lt;/a&gt; oficial de JavaMail propone usar unos parámetros de configuración "smtp&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;" (notar la &lt;span style="font-weight: bold;"&gt;S&lt;/span&gt; final) que no aparecen en ningún otro lugar de la documentación y que, como siempre, a mi  no me funcionan. Buscando por la red he encontrado varias referencias a la configuración con "smtp&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;", pero ninguna oficial. &lt;a href="http://www.google.com/search?q=%22mail.transport.protocol%22++site%3Ajava.sun.com"&gt;http://www.google.com/search?q=%22mail.transport.protocol%22++site%3Ajava.sun.com&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Dado que la documentación no me ayudaba decidí seguir sus consejos y esto es lo que encontré:&lt;br /&gt;&lt;br /&gt;La &lt;a href="http://mail.google.com/support/bin/answer.py?hl=en&amp;amp;answer=13287"&gt;documentación de Gmail&lt;/a&gt; indica que Gmail soporta 2 puertos para la conexión SMTP: el 465 y el 587, e indica también que debe usarse el comando STARTTLS.&lt;br /&gt;&lt;br /&gt;El comando STARTTLS debería iniciar una comunicación encriptada sobre el  &lt;span style="font-style: italic;"&gt;submission port&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;587&lt;/span&gt; siguiendo el protocolo &lt;span style="font-weight: bold;"&gt;TLS&lt;/span&gt; según el RFC 2476: &lt;span style="font-weight: bold;"&gt;Message Submission&lt;/span&gt;. Pero por alguna razón (que todavía no he descubierto) JavaMail da un mensaje de error al intentar usar este puerto. Después de probar varias configuraciones decidí probar el otro puerto, que si que funcionó al primer intento.&lt;br /&gt;El puerto &lt;span style="font-weight: bold;"&gt;465&lt;/span&gt; es "&lt;span style="font-style: italic;"&gt;menos&lt;/span&gt;" estándar (incluso hay otro servicio, el URD - “URL Rendesvous Directory for SSM” registrado por Cisco en el mismo puerto) y utiliza el protocolo &lt;span style="font-weight: bold;"&gt;SSL&lt;/span&gt;. El puerto &lt;span style="font-weight: bold;"&gt;465&lt;/span&gt; se menciona en el apendice A de la especificación: &lt;a href="http://wp.netscape.com/eng/ssl3/draft302.txt"&gt;The SSL Protocol Version 3.0&lt;/a&gt;  “Simple Mail Transfer Protocol with SSL” de 1996.&lt;br /&gt;&lt;br /&gt;La diferencia entre SSL y TLS es muy sutil y es simplemente la versión. SSL hace referencia a SSL 3.0 y TLS hace referencia a TLS 1.0 que es igual a SSL 3.1&lt;br /&gt;Repito:&lt;br /&gt;&lt;div style="text-align: center;"&gt;TLS 1.0 == SSL 3.1&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Aunque el protocolo permanece sustancialmente igual existen pequeñas diferencias entre SSL 3.0 y TLS 1.0.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Al final la configuración del JavaMail para Gmail quedó algo así:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style=";font-family:Verdana;font-size:10;"  &gt;        Properties props = new Properties();&lt;br /&gt;        props.put("mail.smtp.host",   "smtp.gmail.com");&lt;br /&gt;        props.put("mail.smtp.auth",   "true");&lt;br /&gt;        props.put("mail.smtp.port",   "465");&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:10;"  &gt;           props.&lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:10;"  &gt;put("mail.smtp.starttls.enable", "true");&lt;br /&gt;        props.put("mail.smtp.socketFactory.port",   "465");&lt;br /&gt;          props.put("mail.smtp.socketFactory.class",   "javax.net.ssl.SSLSocketFactory");&lt;br /&gt;          props.put("mail.smtp.socketFactory.fallback",   "false");&lt;br /&gt;     &lt;br /&gt;        props.put("mail.debug",   "true");&lt;br /&gt;&lt;br /&gt;        Session session = Session.getInstance(props);&lt;/span&gt;&lt;/blockquote&gt;&lt;span style=";font-family:Verdana;font-size:10;"  &gt;&lt;/span&gt;(Java 1.6 valida automáticamente los certificados de Gmail así que no hay necesidad de agregarlos a mano a la &lt;span style="font-style: italic;"&gt;truststore)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Aunque encontré una solución a mi problema, y el código ya está funcionando me quedé muy intrigado de porqué no funciona con el puerto 587 y porqué en la red hay tantas referencias a la configuración "smtp&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;" pero la única referencia oficial está en la FAQ, así que, aunque sea para sacarme la duda, seguiré investigando.&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-6875714886362612421?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/Cl-Fms8qwdc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/6875714886362612421/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=6875714886362612421" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6875714886362612421?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6875714886362612421?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/Cl-Fms8qwdc/gmail-magnolia-javamail.html" title="Gmail &amp; Magnolia &amp; JavaMail" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://weblog.amneris.es/2009/01/gmail-magnolia-javamail.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QNQnY8cCp7ImA9WxRaFUw.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-6218080553673099718</id><published>2008-12-17T03:51:00.000-08:00</published><updated>2008-12-17T04:03:13.878-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T04:03:13.878-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flowcharts" /><title>Diagramas de flujos según xkcd</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/flow_charts.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 740px; height: 534px;" src="http://imgs.xkcd.com/comics/flow_charts.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;a href="http://xkcd.com/518/"&gt;http://xkcd.com/518/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;jejejejejejejejeja&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-6218080553673099718?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/Yhq6-4pIvAI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/6218080553673099718/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=6218080553673099718" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6218080553673099718?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6218080553673099718?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/Yhq6-4pIvAI/diagramas-de-flujos-segn-xkcd.html" title="Diagramas de flujos según xkcd" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/12/diagramas-de-flujos-segn-xkcd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIHQ3Y6eSp7ImA9WxRVGUw.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-3465290593833881454</id><published>2008-11-17T01:10:00.000-08:00</published><updated>2008-11-17T02:08:52.811-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T02:08:52.811-08:00</app:edited><title>iBicing disponible en el App Store</title><content type="html">Después de varias idas y vueltas con el lenguaje, con las tecnologías, con el IDE, con las apis, con los límites de la memoria, con los certificados de provisionamiento, con el proceso de  registro de aplicaciones, con la censura, etc,  AL FIN! ya está disponible en el &lt;a href="http://www.apple.com/es/iphone/appstore/"&gt;App Store&lt;/a&gt; una aplicación que contiene una buena parte de mi código en su ADN.&lt;br /&gt;&lt;br /&gt;Se trata de la app de &lt;a href="http://www.bicing.com/"&gt;Bicing&lt;/a&gt; para el &lt;a href="http://www.apple.com/es/iphone/"&gt;iPhone&lt;/a&gt; desarrollada por &lt;a href="http://www.mimundoiphone.com/"&gt;Mi Mundo iPhone&lt;/a&gt;.&lt;br /&gt;El objetivo de la aplicación es el acceso a información en tiempo real de:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Estaciones más cercanas&lt;/li&gt;&lt;li&gt;  Listado de estaciones favoritas&lt;/li&gt;&lt;li&gt;  Bicis disponibles&lt;/li&gt;&lt;li&gt;  Sitios libres&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;iBicing es extremadamente útil,  sobretodo en horas pico cuando realmente hace mucha diferencia saber de antemano que no hay espacios disponibles para dejar la bici en ninguna de las estaciones de plaza  Catalunya, así que es mejor dejarla en Urquinaona de pasada y caminar las otras 2 calles.&lt;br /&gt;&lt;br /&gt;Si tenés un iPhone y el carnet de Bicing esta es una app &lt;span style="font-weight: bold;"&gt;indispensable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=296701552&amp;amp;mt=8"&gt;iBicing  &lt;span style="font-weight: bold;"&gt;ya&lt;/span&gt; disponible en el App Store cortesía de Mi Mundo iPhone.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-3465290593833881454?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/GXk_CUrqTDc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/3465290593833881454/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=3465290593833881454" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/3465290593833881454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/3465290593833881454?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/GXk_CUrqTDc/ibicing-disponible-en-el-app-store.html" title="iBicing disponible en el App Store" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/11/ibicing-disponible-en-el-app-store.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYAQ3Y4cCp7ImA9WxNQFUo.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7738710696085880751</id><published>2008-10-07T09:00:00.000-07:00</published><updated>2009-09-21T14:55:42.838-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-21T14:55:42.838-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tapestry5" /><category scheme="http://www.blogger.com/atom/ns#" term="trails" /><title>Extrañando a los recolectores de basura de mi barrio.</title><content type="html">Me pasé toda la semana pasada trabajando con ObjectiveC, prestando muchísima atención al código, especialmente a la declaración de variables, para no ir dejando &lt;span style="font-style: italic;"&gt;memory leaks&lt;/span&gt; desparramados por ahí. A buena hora me vengo a enterar que ObjetiveC es muy sensible a los &lt;span style="font-style: italic;"&gt;memory leaks&lt;/span&gt;. Para un Java adicto GC dependiente como yo, esto de andar contando la cantidad de referencias a un objeto para luego "destruir" (liberar) las variables a mano, es una experiencia completamente nueva.&lt;br /&gt;&lt;br /&gt;Después de una semana con ObjetiveC el sábado retome el trabajo con &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt;, preparando lo que será el codebase para Trails 2.0.x (el ".x" del final es a propósito para que no parezca un &lt;span style="font-style: italic;"&gt;buzzword&lt;/span&gt;). La nueva versión de Trails estará basada en &lt;a href="http://tapestry.apache.org/tapestry5/"&gt;Tapestry5&lt;/a&gt; y como este trae su propio contenedor IoC la mayor parte del trabajo fue portar servicios, beans y configuración de &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; al nuevo &lt;a href="http://tapestry.apache.org/tapestry5/tapestry-ioc/"&gt;Tapestry5 IoC&lt;/a&gt;. Una de las principales diferencias entre los dos contenedores es que la inyección de dependencias en Tapestry5 se realiza por &lt;span style="font-weight: bold;"&gt;contructor&lt;/span&gt; en lugar de por &lt;span style="font-weight: bold;"&gt;setters&lt;/span&gt;. Esta fue la principal razón que impidió que el port de un IoC a otro fuera completamente automático.&lt;br /&gt;&lt;br /&gt;Mientras reescribía los constructores noté que muchos de los servicios tenían variables de instancia con referencias a otros servicios que ahora ya no era necesario mantener como variable de instancia. Saltó la alarma:&lt;br /&gt;&lt;div style="text-align: center;"&gt;POSIBLE MEMORY LEAK!!!! POSIBLE MEMORY LEAK!!! POSIBLE MEMORY LEAK!!!!.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Estas variables de instancia tranquilamente podían convertirse a variables internas de métodos (constructores) o simplemente eliminarse. Como consecuencia de esta reducción en variables de instancia se reduce considerablemente la cuenta total de referencias de instancias de varios de los servicios. Llegando en varias ocasiones a tener servicios procesados por el GC y eliminados completamente de la memoria.&lt;br /&gt;&lt;br /&gt;La conclusión final es que muchos de los servicios de Spring configurados con &lt;span style="font-style: italic; font-weight: bold;"&gt;"init-method"&lt;/span&gt; o que utilizan &lt;span style="font-style: italic; font-weight: bold;"&gt;afterPropertiesSet()&lt;/span&gt;, o algún mecanismo similar, terminan conteniendo referencias a servicios que solo son necesarios durante &lt;span style="font-style: italic;"&gt;bootstrap&lt;/span&gt; y por ende aumentando la cuenta de referencias de esos objetos que no son necesarios para continuar con la ejecución de la aplicación.&lt;br /&gt;&lt;br /&gt;Soy consiente de que en un entorno clásico de IoC (Tapestry, Spring o cualquiera), los males provenientes pura y exclusivamente de mantener estos objetos en memoria son despreciables y que seguramente se podría lograr una reducción similar en Spring rediseñando los servicios. Pero este post no se trata de eso, este post es simplemente una reflexión sobre lo que damos por sentado los Java adictos GC dependientes como yo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7738710696085880751?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/vJJ_shlV2Ds" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7738710696085880751/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7738710696085880751" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7738710696085880751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7738710696085880751?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/vJJ_shlV2Ds/extraando-los-recolectores-de-basura-de.html" title="Extrañando a los recolectores de basura de mi barrio." /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/10/extraando-los-recolectores-de-basura-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYGRXw7eSp7ImA9WxNQFUo.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-1465273530158906828</id><published>2008-09-15T04:28:00.000-07:00</published><updated>2009-09-21T14:55:24.201-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-21T14:55:24.201-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tapestry" /><category scheme="http://www.blogger.com/atom/ns#" term="trails" /><title>Trails 1.2.1</title><content type="html">Desde hace unos días está disponible la nueva versión de &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt;, la 1.2.1. Esta nueva versión está basada en &lt;a href="http://tapestry.apache.org/"&gt;Tapestry&lt;/a&gt; 4.1.5 y será la última versión &lt;span style="font-style: italic;"&gt;major&lt;/span&gt; basada en Tapestry4.&lt;br /&gt;&lt;br /&gt;La característica más destacada y notable desde el punto de vista del usuario es el nuevo mapeo de URLs "user/seo friendly".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;URLs 1.1.1:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://localhost:8080/external.svc?page=DefaultList&amp;amp;sp=Dorg.trails.demo.Apple&lt;/li&gt;&lt;li&gt;http://localhost:8080/DefaultList,$NewLink.link.sdirect&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;URL 1.2.1:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://localhost:8080/trails/list/Apple&lt;/li&gt;&lt;li&gt;http://localhost:8080/trails/new/Apple&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Este nuevo mecanismo de procesamiento de URLs conlleva un gran cambio en el manejo del ciclo de vida de las páginas de Trails que repercute en una considerable mejora en la performance. Este cambio en el ciclo de vida de las páginas también permite que Trails pueda ser configurado para  funcionar completamente stateless (aunque sacrificando el callback stack), multitab y multiwindow.&lt;br /&gt;&lt;br /&gt;Otras nuevas características de la versión 1.2.1 son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;un nuevo componente para combos anidados (kudos a Pablo Graña y Pablo Ruggia)&lt;/li&gt;&lt;li&gt;soporte para claves compuestas&lt;/li&gt;&lt;li&gt;soporte para nuevos tipos de página, y un nuevo tipo de página para vistas "readonly"&lt;/li&gt;&lt;li&gt;mejoras en el manejo de archivos binarios&lt;/li&gt;&lt;li&gt;y otros tantos &lt;span style="font-style: italic;"&gt;minor tweaks&lt;/span&gt; que pueden consultarse en el &lt;a href="http://jira.codehaus.org/browse/TRAILS?report=com.atlassian.jira.plugin.system.project:changelog-panel"&gt;changelog del JIRA&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Lamentablemente, a partir de la aparición de Tapestry5, Trails ha pasado a un gran segundo plano dentro del mundo Tapestry dado que Tapestry5 ya incorpora "out of the box" muchas de las carácterísticas que Trails ofrece para Tapestry4.&lt;br /&gt;&lt;br /&gt;La próxima &lt;span style="font-style: italic;"&gt;major&lt;/span&gt; release de Trails será basada en Tapestry5, intentaremos aportar aún más valor que el que ya aporta Tapestry5 para el desarrollo rápido de aplicaciones.&lt;br /&gt;Tarea que no va ser fácil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-1465273530158906828?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/26qu_O9kKj0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/1465273530158906828/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=1465273530158906828" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1465273530158906828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1465273530158906828?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/26qu_O9kKj0/trails-121.html" title="Trails 1.2.1" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/09/trails-121.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYERX06eyp7ImA9WxNQFUo.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-8708908552997539844</id><published>2008-06-23T07:58:00.000-07:00</published><updated>2009-09-21T14:55:04.313-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-21T14:55:04.313-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="trails" /><title>3 días para el taller de Trails en el OpenJavaDay 2008</title><content type="html">Ya hay cerca de 80 personas inscriptas para el &lt;a href="http://javahispano.org/openjavaday/detalle.html?id=195"&gt;taller&lt;/a&gt; de &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt; en el &lt;a href="http://javahispano.org/openjavaday"&gt;OpenJavaDay Madrid 2008&lt;/a&gt;.&lt;br /&gt;Dada la cantidad de inscriptos me preocupa la performance de la red wifi  ya que el kickstart de Trails baja unos 45Mb de librerías desde los repositorios de Maven.&lt;br /&gt;Para el taller intentaremos configurar un servidor de Maven local con todas las librerías necesarias. Pero.... nunca está de más ser prevenido, así que para evitar problemas yo recomendaría a los participantes venir con todas las librerías ya bajadas a sus correspondientes repositorios locales de Maven.&lt;br /&gt;&lt;br /&gt;Para esto hay dos opciones:&lt;br /&gt;1)&lt;br /&gt;&lt;blockquote&gt;  &lt;span style="font-family:courier new;"&gt;$ mvn archetype:create -DarchetypeGroupId=org.trailsframework&lt;/span&gt; &lt;div id="1el4" class="ArwC7c ckChnd"&gt;&lt;span style="font-family:courier new;"&gt; -DarchetypeArtifactId=trails&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;-archetype -DarchetypeVersion=1.2-SNAPSHO&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;T&lt;/span&gt; &lt;span style="font-family:courier new;"&gt; -DgroupId=org.javahispano -DartifactId=openjavaday&lt;/span&gt; &lt;span style="font-family:courier new;"&gt; -DremoteRepositories=&lt;/span&gt;&lt;a style="font-family: courier new;" href="http://snapshots.repository.codehaus.org/" target="_blank"&gt;http://snapshots.repository&lt;wbr&gt;.codehaus.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ cd openjavaday&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ mvn jetty:run&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div id="1el4" class="ArwC7c ckChnd"&gt;Con estos 3 simples pasos se bajan y se instalan todas (o casi todas) las librerías necesarias para seguir el taller.&lt;br /&gt;&lt;br /&gt;2) Para los más perezosos.&lt;br /&gt;He creado un archivo comprimido con las librerías necesarias, partiendo de un repositorio local vacío y siguiendo los pasos mencionados anteriormente. &lt;a href="http://amneris.s3.amazonaws.com/javahispano/m2_repository.tar.gz"&gt;Descargar&lt;/a&gt; (35Mb)&lt;br /&gt;&lt;br /&gt;Recuerden traer instalado Maven, y configurados sus IDEs :)&lt;br /&gt;Nos vemos el Jueves.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-8708908552997539844?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/apjnaVoetac" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/8708908552997539844/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=8708908552997539844" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8708908552997539844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8708908552997539844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/apjnaVoetac/3-das-para-el-taller-de-trails-en-el.html" title="3 días para el taller de Trails en el OpenJavaDay 2008" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/06/3-das-para-el-taller-de-trails-en-el.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAHQ3Y8fSp7ImA9WxdQFUg.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-6002148093301055371</id><published>2008-06-15T10:00:00.000-07:00</published><updated>2008-06-15T10:58:52.875-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-15T10:58:52.875-07:00</app:edited><title>Yo soy P R O G R A M A D O R</title><content type="html">Juan Palacio denuncia en su blog una actitud que, lamentablemente, es muy común entre los programadores:  &lt;a href="http://www.navegapolis.net/content/view/792/53/"&gt;"A ver cuando me ascienden para dejar de programar"&lt;/a&gt;&lt;br /&gt;El post generó una interesante discusión en los comentarios, y &lt;a href="http://betawriting.blogspot.com/"&gt;Betawriter&lt;/a&gt; hace un &lt;a href="http://www.navegapolis.net/content/view/792/53/#comment-1404"&gt;más que interesante análisis&lt;/a&gt; de los porqués de esta actitud, de la enumeración de Betawriter me quedo con:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- Aburrimiento: Seamos realistas. En general, la programación empresarial más típica es tremendamente aburrida. En la mayoría de las empresas los problemas suelen ser siempre los mismos aunque estén asociados a distintas tecnologías e incluso los buenos programadores acaban rindiendo poco por puro aburrimiento. El tipo de reto que supone un proyecto tras otro, o un proyecto empresarial largo, no es lo que la mayoría se espera.&lt;br /&gt;&lt;br /&gt;- Decepción: Sí, asumámoslo. Gran parte del esfuerzo y del código de muchos programadores acaba en la basura. Directamente. En otros casos acaba en programas de baja calidad, protestas de los clientes o parcheo continuo de monstruos inmantenibles. El programador es visto como el "responsable directo" (y en cierta medida obviamente lo es). También siente decepción al ver las cosas como realmente son y no como se ven desde fuera.&lt;br /&gt;&lt;br /&gt;- Instatisfacción: El buen programador tiene al perfeccionismo, a la belleza, al minimalismo. El contacto continuo con código basura y su conciencia de la generalmente mediocre calidad y de la gran cantidad de fallos que pueden ocurrir en su aplicación, de la imposibilidad de tender hacia una mejora continua por cuestiones económicas y de calendario, le provocan insatisfacción.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Gracias Betawriter, yo no lo podría haber escrito mejor.&lt;br /&gt;Yo, por mi parte, soy PROGRAMADOR y hago un gran esfuerzo por no dejar de serlo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-6002148093301055371?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/NDmfUH5xqu4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/6002148093301055371/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=6002148093301055371" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6002148093301055371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6002148093301055371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/NDmfUH5xqu4/yo-soy-p-r-o-g-r-m-d-o-r.html" title="Yo soy P R O G R A M A D O R" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/06/yo-soy-p-r-o-g-r-m-d-o-r.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcDR3c7cSp7ImA9WxNQFUo.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7616340159166675207</id><published>2008-06-02T02:13:00.000-07:00</published><updated>2009-09-21T14:54:36.909-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-21T14:54:36.909-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="trails" /><title>Trails en el OpenJavaDay 2008</title><content type="html">A fines de Junio tendré la oportunidad de presentar &lt;a href="http://trails.codehaus.org/"&gt;Trails&lt;/a&gt; en el OpenJavaDay 2008.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://es.sun.com/"&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;a href="http://es.sun.com/"&gt;Sun Microsystems&lt;/a&gt; y &lt;a href="http://www.javahispano.org/"&gt;javaHispano&lt;/a&gt; organizan el &lt;a href="http://javahispano.org/openjavaday/"&gt;OpenJavaDay&lt;/a&gt;, un evento sobre tecnología Java creado por la comunidad y para la comunidad que se celebrará los días 26 y 27 de junio, en la Universidad Complutense de Madrid. Este encuentro constituye la undécima edición en España de este evento para desarrolladores.&lt;/blockquote&gt;&lt;br /&gt;Noticia en javaHispano: &lt;a href="http://www.javahispano.org/contenidos/es/agenda_del_openjavaday_2008/"&gt;http://www.javahispano.org/contenidos/es/agenda_del_openjavaday_2008/&lt;/a&gt;&lt;br /&gt;Inscripción Gratuita: &lt;a href="http://javahispano.org/openjavaday/registro.html"&gt;http://javahispano.org/openjavaday/registro.html&lt;br /&gt;&lt;/a&gt;Agenda del Evento: &lt;a href="http://javahispano.org/openjavaday"&gt;http://javahispano.org/openjavaday&lt;/a&gt;&lt;br /&gt;Detalle del taller de Trails: &lt;a href="http://javahispano.org/openjavaday/detalle.html?id=195"&gt;http://javahispano.org/openjavaday/detalle.html?id=195&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La idea del taller de Trails será construir una aplicación con Trails en una hora.&lt;br /&gt;Estoy explorando varios modelos de dominio para usar como ejemplo, y el que más me gusta hasta ahora es el &lt;a href="http://docs.jboss.org/jbpm/v3/userguide/taskmanagement.html#theidentitymodel"&gt;identity model de jBPM&lt;/a&gt;, creo que da una buena base para explorar todas las características de Trails. También existe la posibilidad de no usar ningún modelo base previamente preparado y codificar un modelo con el input de los asistentes, pero esto depende de la cantidad de asistentes, si somos demasiados no será viable.&lt;br /&gt;&lt;br /&gt;También tendré la oportunidad de participar en la &lt;a href="http://javahispano.org/openjavaday/detalle.html?id=224"&gt;Mesa redonda sobre frameworks web&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nos vemos en el OpenJavaDay!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7616340159166675207?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/_kFvPxKfurg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7616340159166675207/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7616340159166675207" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7616340159166675207?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7616340159166675207?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/_kFvPxKfurg/trails-en-el-openjavaday-2008.html" title="Trails en el OpenJavaDay 2008" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/06/trails-en-el-openjavaday-2008.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCRnozeCp7ImA9WxZbGUg.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-8543723653661821604</id><published>2008-04-23T03:47:00.000-07:00</published><updated>2008-04-23T05:04:27.480-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-23T05:04:27.480-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="jbpm" /><title>jBPM performance</title><content type="html">Existen ciertos falsos mitos sobre la performance de &lt;a href="http://www.jboss.org/jbossjbpm/"&gt;jBPM&lt;/a&gt;. Estos mitos informáticos pueden hacer que un cliente descarte una tecnología sin siquiera haber tenido una evaluación real de los beneficios de su uso. &lt;a href="http://www.jorambarrez.be/blog/"&gt;Joram Barrez&lt;/a&gt; ha salido, como los cazadores de mitos, a refutar la fama de mala performance de jBPM con una muy interesante presentación: &lt;a href="http://www.jorambarrez.be/blog/2008/04/03/some-real-life-jbpm-action/" title="Permanent Link to Some real-life jBPM action: PoC jBPM Orchestration"&gt;Some real-life jBPM action: PoC jBPM Orchestration&lt;/a&gt;. Esta presentación ha causado una muy buena impresión en el mismísimo creador de jBPM y ha dado pie a una &lt;a href="http://processdevelopments.blogspot.com/2008/04/awsome-jbpm-performance-numbers.html"&gt;interesante discusión en el blog de Tom Bayens&lt;/a&gt; y a un nuevo post de Joram, con un benchmark más exhaustivo: &lt;a href="http://www.jorambarrez.be/blog/2008/04/14/short-jbpm-performance-showdown/"&gt;Short jBPM Performance Showdown&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entre las optimizaciones que menciona Joram destacan:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Deshabilitar el logging a JBPM_LOG&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;jBPM tiene por defecto muchísimo logging. Simplemente deshabilitando el servicio de logging de jBPM permitió ejecutar &lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;250.000&lt;/strong&gt; procesos más en una hora, eso significa que los procesos se ejecutan 3 veces más rápido que con el logging habilitado.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;configurar Log4j a nivel ERROR&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;y así reducir aún más las entradas de los logs.&lt;br /&gt;&lt;br /&gt;&lt;li style="font-weight: bold;"&gt;poner la propiedad &lt;span style="font-style: italic;"&gt;"show_sql"&lt;/span&gt; en false.&lt;/li&gt;&lt;br /&gt;Con esta propiedad configurada en true, Hibernate imprime en los logs TODAS sus queries SQL.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Según Joram la mejor ayuda a la performance de jBPM es configurar correctamente la cache de Hibernate.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;jBPM ejecuta una gran cantidad de queries, y muchas de ellas pueden ser cacheadas sin ningún problema. El 90% del tiempo jBPM está haciendo tareas de Hibernate.&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt; Por supuesto que todo esto es solo para cuando se quiere exprimir al máximo hasta el último ciclo del procesador. Porque en mi opinión, para el uso estándar de jBPM la configuración por defecto es lo suficientemente buena.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-8543723653661821604?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/YjiWfgftqUU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/8543723653661821604/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=8543723653661821604" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8543723653661821604?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8543723653661821604?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/YjiWfgftqUU/jbpm-performance.html" title="jBPM performance" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/04/jbpm-performance.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFRH8ycCp7ImA9WxZbFE8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-928976934473948263</id><published>2008-04-17T00:52:00.000-07:00</published><updated>2008-04-17T01:15:15.198-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-17T01:15:15.198-07:00</app:edited><title>History Meme</title><content type="html">Contribuyendo al ruido de la red:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ascandroli@gualicho:~$ history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head&lt;br /&gt;115 mvn&lt;br /&gt;102 cd&lt;br /&gt;92 sudo&lt;br /&gt;36 exit&lt;br /&gt;32 ll&lt;br /&gt;21 history&lt;br /&gt;20 .&lt;br /&gt;18 ssh&lt;br /&gt;12 svn&lt;br /&gt;10 ps&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ascandroli@hermes:~$ history | awk '{a[$2]++}END{for(i in a){print a[i] " "i}}' | sort -rn | head&lt;br /&gt;122 cd&lt;br /&gt;74 mvn&lt;br /&gt;53 ll&lt;br /&gt;41 exit&lt;br /&gt;31 sudo&lt;br /&gt;25 .&lt;br /&gt;21 svn&lt;br /&gt;19 cg&lt;br /&gt;14 ps&lt;br /&gt;11 ssh&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Que dicen estos comandos de mi:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;mvn:&lt;/span&gt; ;-)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;. : &lt;/span&gt;que tengo demasiados scripts para cambiar las variables de entorno.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;exit:&lt;/span&gt; que cierro los tabs de las consolas desde la misma linea de comandos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;history:&lt;/span&gt; que no me acuerdo de memoria los comandos para  usar javarebel o para hacer debug con jetty y maven.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;ps&lt;/span&gt;: que el tomcat se cuelga demasiado y que tengo que ir a matarlo manualmente.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-928976934473948263?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/UweQQ8Cyx64" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/928976934473948263/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=928976934473948263" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/928976934473948263?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/928976934473948263?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/UweQQ8Cyx64/history-meme.html" title="History Meme" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/04/history-meme.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQMSXwzeyp7ImA9WxZUFE8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-1015610122226411739</id><published>2008-04-05T10:28:00.000-07:00</published><updated>2008-04-05T11:33:08.283-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-05T11:33:08.283-07:00</app:edited><title>Git y Cogito</title><content type="html">He abogado por el uso de &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; en varias oportunidades. Lo he intentado usar en varios proyectos, pero solo lo he logrado en mis propios proyectos o en proyectos que no son Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Por qué solo en proyectos que no son Java?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Porque el programador Java medio tiene un extraño rechazo visceral por las herramientas de línea de comandos y lamentablemente Git todavía no está integrado ni a &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;, ni a &lt;a href="http://www.netbeans.org/"&gt;NetBeans&lt;/a&gt; ni a &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt;.&lt;br /&gt;Lo curioso es que ahora que los &lt;a href="http://www.loudthinking.com/posts/24-gits-avalanche"&gt;chicos "cool" del barrio planean mudarse a Git&lt;/a&gt; yo recibo más consultas en un día que nunca.&lt;br /&gt;&lt;br /&gt;Así que si sos capaz de superar el trauma emocional que implica abandonar el mundo de las ventanas y querés probar de que están hablando nuestros vecinos &lt;span style="font-style: italic;"&gt;más ágiles&lt;/span&gt;, acá va mi arenga:&lt;br /&gt;&lt;br /&gt;La GRAN GRAN ventaja de Git es el &lt;span style="font-style: italic;"&gt;"working tree"&lt;/span&gt; (árbol de trabajo),  el repositorio local al PC del programador. Todos los &lt;span style="font-style: italic;"&gt;"commits"&lt;/span&gt; suceden en local y no se suben al repositorio hasta que no se hace un &lt;span style="font-style: italic;"&gt;"push"&lt;/span&gt;. Esta copia local del repositorio, permite hacer &lt;span style="font-style: italic;"&gt;branches&lt;/span&gt; en local sin siquiera la necesidad de cambiar de directorio o hacer un nuevo &lt;span style="font-style: italic;"&gt;checkout&lt;/span&gt;. Gracias a esto yo puedo estar trabajando un mi &lt;span style="font-style: italic;"&gt;trunk&lt;/span&gt; local, crear un &lt;span style="font-style: italic;"&gt;branch&lt;/span&gt; para trabajar en un parche urgente, subir todos los cambios del &lt;span style="font-style: italic;"&gt;branch&lt;/span&gt; al repositorio central y volver a trabajar en mi &lt;span style="font-style: italic;"&gt;trunk&lt;/span&gt;, todo sin cambiar del  proyecto abierto en el Eclipse.  Otra característica de Git difícil de digerir para los usuarios de &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; es que Git jamás se confunde en un &lt;span style="font-style: italic;"&gt;merge&lt;/span&gt;, &lt;span style="font-weight: bold; font-style: italic;"&gt;JAMÁS!.&lt;/span&gt; Y créanme, he intentando sin éxito "hacerle pisar el palito", porque me costaba creerlo.&lt;br /&gt;&lt;br /&gt;Para adentrarse en el mundo de Git, en realidad es preferible empezar usando &lt;a href="http://git.or.cz/cogito/"&gt;Cogito&lt;/a&gt;, Cogito es meramente una interfaz de Git, que ha sido especialmente adaptada para el hombre de a pie. Cogito es completamente compatible con GIT (aunque hay que seguir ciertas convenciones) y hace que la transición SVN &gt; Git sea más amena.&lt;br /&gt;Por ejemplo el comando de Cogito:&lt;blockquote  style="font-style: italic; font-weight: bold;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;$ cg-init&lt;/span&gt;&lt;/blockquote&gt;&lt;b id="ptz0"&gt;&lt;i id="g8d9"&gt;&lt;/i&gt;&lt;/b&gt;&lt;blockquote&gt; &lt;/blockquote&gt;equivale a los comandos de Git:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;b id="vkbc"&gt;&lt;i id="dr6-"&gt;$ git init &amp;amp;&amp;amp; git add . &amp;amp;&amp;amp; git commit&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;b id="vkbc"&gt;&lt;i id="dr6-"&gt;&lt;/i&gt;&lt;/b&gt;Incluso &lt;b id="rcv9"&gt;&lt;i id="pm2t"&gt;cg-init&lt;/i&gt;&lt;/b&gt;, por defecto, ignora los &lt;span style="font-style: italic;"&gt;.svn&lt;/span&gt;, cosa que Git no hace.&lt;br /&gt;&lt;br /&gt;Lo más fácil para los que recién comienzan, es empezar imitando el flujo de trabajo que tiene Subversion, que aunque limita algunas de las carácterísticas de Git, es suficiente como para un primer acercamiento. Para esto basta con  crear un repositorio central contra el que trabajar. Este tipo de repositorios centrales se llaman "bare". Un repositorio "bare"  es un repositorio que no es una copia activa, que no tienen un árbol de trabajo (working tree), es decir un repositorio al que nadie hace un &lt;span style="font-style: italic;"&gt;cg-commit&lt;/span&gt; (tener en cuenta que &lt;span style="font-style: italic;"&gt;svn commit&lt;/span&gt; no es conceptualmente igual a &lt;span style="font-style: italic;"&gt;cg-commit&lt;/span&gt;)&lt;br /&gt;La mayoría de los repositorios Git que se ofrecen via web (ej: &lt;a href="http://github.com/"&gt;github&lt;/a&gt;), son de este tipo de repositorios "bare".&lt;br /&gt;&lt;br /&gt;Crear un repositorio "bare" en un servidor es tan fácil como:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;blockquote&gt;$ cg-admin-setuprepo -g gitpushers /srv/git/myproyecto.git&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;El valor indicado en "-g" es el &lt;span style="font-style: italic;"&gt;groupid&lt;/span&gt; de los usuarios que tienen permisos de &lt;span style="font-style: italic;"&gt;"push"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego en local en el directorio donde esté el proyecto que se quiera subir:&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;$ cg-init&lt;/span&gt; (inicializa la copia local, ignora los &lt;span style="font-style: italic;"&gt;.svn&lt;/span&gt; en caso de que existan, así que se puede usar Cogito y Subversion a la misma vez)&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;$ cg-branch-add origin git+ssh://git.amneris.es/srv/git/myproyecto.git&lt;/span&gt; (le indica a la copia local que en realidad es un branch del repositorio git.amneris.es/srv/git/myproyecto.git, el nombre &lt;span style="font-style: italic;"&gt;"origin"&lt;/span&gt; es una convención de Cogito)&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;$ cg-push&lt;/span&gt; (sube la copia a local al repositorio central)&lt;/span&gt;&lt;/blockquote&gt;Cada usuario que se quiera bajar una copia del proyecto (&lt;span style="font-style: italic;"&gt;svn co&lt;/span&gt;) tendrá que ejecutar:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;" &gt;&lt;blockquote&gt;$ cg-clone git+ssh://git.amneris.es/srv/git/myproyecto.git&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;para bajar cambios del repositorio:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;" &gt;&lt;blockquote&gt;$ cg-update&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;para hacer commit de las modificaciones&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;$ cg-commit -m "No olvidarse de comentar todos los checkins aunque sean locales"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;y cuando ya tengan todo listo y estén preparados para subir sus cambios al repo central:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left; font-weight: bold; font-style: italic;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;$ cg-push&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:courier new;" &gt;&lt;/span&gt;&lt;/span&gt;Los invito a probarlo, vale la pena el esfuerzo, aunque sea simplemente para conocer otro paradigma de SCM.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;PS: Lo que daría yo por tener un 1% del poder de influencia que tiene &lt;a href="http://www.loudthinking.com/"&gt;DHH&lt;/a&gt; y &lt;a href="http://www.37signals.com/"&gt;37signals&lt;/a&gt;. La verdad es que a veces siento que mis opiniones provocan una reacción en la dirección opuesta.&lt;br /&gt;Algo así como que ahora todos los lectores de este post abandonan el uso de Subversion pero en dirección CVS :(&lt;/span&gt;&lt;span style=";font-family:monospace;font-size:100%;"  &gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-1015610122226411739?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/ETt3b8ptsL8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/1015610122226411739/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=1015610122226411739" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1015610122226411739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1015610122226411739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/ETt3b8ptsL8/git-y-cogito.html" title="Git y Cogito" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/04/git-y-cogito.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUECQXYzfyp7ImA9WxZWEEU.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-1567227592849064698</id><published>2008-03-09T09:35:00.000-07:00</published><updated>2008-03-09T10:27:40.887-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-09T10:27:40.887-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tuneup" /><title>re: Análisis de rendimiento y la necesidad de contratar especialistas</title><content type="html">Hace tiempo que vengo pensando en como presentar el tema de la contratación de especialistas y me encanta cuando alguien me ahorra el trabajo: &lt;a href="http://brigomp.blogspot.com/2008/03/anlisis-de-rendimiento-y-la-necesidad.html"&gt;Pensamientos ágiles: Análisis de rendimiento y la necesidad de contratar especialistas&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Me cansé de escuchar: "eso lo podemos hacer entre nosotros, no necesitamos contratar a nadie para que se dedique a X" donde X pertenece a {diseño web, maquetación, análisis funcional, documentación, manual de usuario, análisis de performance, testing funcional, testing de usabilidad, optimización de queries, deploy,  gestión de carga y load balancing, etc.... }&lt;br /&gt;&lt;br /&gt;Muchas de esas tareas necesitan de una persona exclusivamente dedicada a eso. Esta persona puede ser parte del "equipo titular" siempre y cuando su función esté claramente definida. Hay que considerar que los programadores de la aplicación no pueden hacer TODO (especialmente no en el mismo pliegue espacio/temporal) y hay que asignar una partida presupuestaria para estas tareas desde el comienzo del proyecto.&lt;br /&gt;&lt;br /&gt;Volviendo al problema puntual que se planteaba en el &lt;a href="http://brigomp.blogspot.com/"&gt;blog de Martín&lt;/a&gt;, yo también le recomendaría, a quien hizo la consulta, que contrate a un especialista. Si es muy impaciente y mientras tarda en llegar el especialista puede ir probando habilitando Hibernate Statistics y JAMon para Spring, esto le ayudará a determinar los valores exactos de cantidad de conexiones a la DB, cantidad de sesiones Hibernate (OJO! que no son lo mismo que las conexiones), número de transacciones y número de llamadas a los métodos de servicios. Con estos valores en la mano podrá tener una mejor perspectiva que le permita determinar donde está el problema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;"Una cosa es ir al médico de cabecera, o quedarse en casa automedicarse y otra muy diferente es ir al especialista"&lt;/span&gt;.&lt;/blockquote&gt;&lt;br /&gt;Gracias Martín.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-1567227592849064698?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/RZWXLVc65ss" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/1567227592849064698/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=1567227592849064698" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1567227592849064698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/1567227592849064698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/RZWXLVc65ss/re-anlisis-de-rendimiento-y-la.html" title="re: Análisis de rendimiento y la necesidad de contratar especialistas" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/03/re-anlisis-de-rendimiento-y-la.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ERnc8cCp7ImA9WxZQFkQ.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-5533028931885060012</id><published>2008-02-22T06:36:00.000-08:00</published><updated>2008-02-22T07:40:07.978-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-22T07:40:07.978-08:00</app:edited><title>Bicing y usabilidad.</title><content type="html">Alzado.org ha &lt;a href="http://www.alzado.org/articulo.php?id_art=711"&gt;publicado una buena reseña&lt;/a&gt; de &lt;a href="http://www.bicing.com/"&gt;bicing&lt;/a&gt; desde el punto de vista del diseño y usabilidad.&lt;br /&gt;Reconozco muchos de los aciertos de los diseñadores de bicing que se mencionan en el artículo, pero en los "aspectos a mejorar" se han olvidado del detalle más importante de todos. El detalle que puede hacer que yo deje de considerar y utilizar bicing como medio de transporte público diario para relegarlo solo a momentos de ocio.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Muchas veces no hay lugar para dejar las bicicletas.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Que es peor desde el punto de vista de la usabilidad?&lt;br /&gt;1) que el usuario llegue a una estación y no encuentre bicicletas.&lt;br /&gt;2) que el usuario siempre encuentre bicicletas en las estación de partida, pero que no encuentre lugar para dejarla en la estación de destino (o en las 4 estaciones más cercanas).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-5533028931885060012?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/xeeX7zddipI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/5533028931885060012/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=5533028931885060012" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/5533028931885060012?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/5533028931885060012?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/xeeX7zddipI/bicing-y-usabilidad.html" title="Bicing y usabilidad." /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/02/bicing-y-usabilidad.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHRnoycCp7ImA9WxZREk0.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-6271846206448387413</id><published>2008-02-05T01:12:00.000-08:00</published><updated>2008-02-05T01:45:37.498-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-05T01:45:37.498-08:00</app:edited><title>Ergonomía por Geert Bevin</title><content type="html">Ando en la búsqueda constante de la configuración ideal de mi espacio de trabajo. La silla más cómoda, el mejor teclado, un buen monitor, un mouse ergonómico, etc.  Una incansable lucha en contra de las contracturas y del dolor de espalda.&lt;br /&gt;En esa búsqueda estaba cuando un conocido programador me recomendó  el &lt;a href="http://www.alphagrips.com/"&gt;AlphaGrip&lt;/a&gt; , un muy buen teclado, que todavía me cuesta manejar y que me ha convertido en blanco de las más viles bromas y cargadas. Mi amiga Itxaso se queja: &lt;span style="font-style: italic;"&gt;"pero que freakies que sois"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;El programador que me recomendó el &lt;a href="http://www.alphagrips.com/"&gt;AlphaGrip&lt;/a&gt; se llama &lt;a href="http://rifers.org/blogs/gbevin"&gt;Geert Bevin&lt;/a&gt;, es el creador del framework web &lt;a href="http://rifers.org/"&gt;Rife&lt;/a&gt; y ayer mismo comentaba en su blog  que se vio obligado a ir un paso más adelante en la &lt;a href="http://rifers.org/blogs/gbevin/2008/2/4/programming_while_lying_on_back"&gt;batalla por la ergonomía&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Gracias Geert por ir abriendo el camino. Espero que te mejores pronto de las hernias de disco.&lt;br /&gt;&lt;br /&gt;Ahora me pregunto, que me diría Itxaso si me viera programando en esa posición?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-6271846206448387413?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/5OvcbQFyJ_k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/6271846206448387413/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=6271846206448387413" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6271846206448387413?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/6271846206448387413?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/5OvcbQFyJ_k/ergonoma-por-geert-bevin.html" title="Ergonomía por Geert Bevin" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/02/ergonoma-por-geert-bevin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcFQHgyeCp7ImA9WxZREU8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-8747800381390418172</id><published>2008-02-04T12:00:00.000-08:00</published><updated>2008-02-04T03:03:31.690-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-04T03:03:31.690-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tapestry" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="ztt" /><category scheme="http://www.blogger.com/atom/ns#" term="tapestry4" /><title>ZTT y Tapestry4</title><content type="html">&lt;span style="font-size:85%;"&gt;Este es el cuarto en una serie de posts donde hablo de ZTT en mi proceso de desarrollo.&lt;br /&gt;&lt;br /&gt;1) &lt;a href="http://weblog.amneris.es/2008/01/desarrollador-gil-java-oxmoron.html"&gt;Desarrollador ágil JAVA. ¿Oxímoron?&lt;/a&gt;&lt;br /&gt;2) &lt;a href="http://weblog.amneris.es/2008/01/ztt-y-tapestry5.html"&gt;ZTT y Tapestry5&lt;/a&gt;&lt;br /&gt;3) &lt;a href="http://weblog.amneris.es/2008/01/matt-raible-acerca-de-ztt.html"&gt;Matt Raible acerca de ZTT&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;Live Template Reloading&lt;/h2&gt;&lt;a href="http://tapestry.apache.org/tapestry4.1/"&gt;Tapestry4&lt;/a&gt; tiene un muy promocionado &lt;span style="font-style: italic;"&gt;"modo desarrollador"&lt;/span&gt; en el cual los cambios en los templates html se reflejan en la aplicación sin necesidad de reiniciar el servidor de aplicaciones.&lt;br /&gt;Basta con agregar &lt;code&gt;-Dorg.apache.tapestry.disable-caching=true&lt;/code&gt; al comando de ejecución del servidor de apps.&lt;br /&gt;&lt;br /&gt;Si bien esta simple configuración es muy útil, tiene sus inconvenientes. El primero es que recarga &lt;span style="font-weight: bold; font-style: italic;"&gt;todos&lt;/span&gt; los templates por cada request, hayan o no sido modificados. Cuando la cantidad de componentes en una página es muy grande (como suele ser mi caso) y cuando la cantidad de requests es mucha (como cuando se utiliza AJAX) la velocidad de respuesta de la aplicación se vuelve intolerable y después de la 5 o 6 recargas de la página suele dar algún que otro  &lt;a href="http://www.google.es/search?q=tapestry+permgen"&gt;problema de memoria&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una mejor alternativa es habilitar el servicio de reset usando &lt;code&gt;-Dorg.apache.tapestry.enable-reset-service=true&lt;/code&gt;. Con este servicio habilitado es posible resetear la caché de templates y el pool de componentes simplemente accediendo a la URL &lt;span style="font-style: italic;"&gt;/app?service=reset&amp;amp;page=Home&lt;/span&gt; o&lt;span style="font-style: italic;"&gt; /reset.svc?page=Home&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existen varias propuestas de mecanismos para facilitarle al programador el acceso al servicio de reset. La opción tradicional es dejar abierto un tab del firefox en esa URL y hacer F5 cada vez que se quiera hacer reset. &lt;a href="http://blog.andyhot.gr/"&gt;Andreas Andreu&lt;/a&gt; (uno de los commiters de tapestry) &lt;a href="http://blog.andyhot.gr/a/java/2006/09/23/Implementing-a-Firefox-Plugin-for-Tapestrys-Reset-Service.html"&gt;propone hacerlo&lt;/a&gt; desde un script de &lt;a href="http://www.greasespot.net/"&gt;greasemonkey&lt;/a&gt;. Yo, en cambio, prefiero usar una tarea de &lt;a href="http://ant.apache.org/"&gt;ant&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;telnet port="8080" server="localhost" timeout="20"&amp;gt;&lt;br /&gt; &amp;lt;read&amp;gt;&lt;br /&gt;     &amp;lt;write&amp;gt;GET /reset.svc?page=Home HTTP/1.0&amp;lt;/write&amp;gt;&lt;br /&gt;     &amp;lt;write&amp;gt;&amp;lt;/write&amp;gt;&lt;br /&gt; &amp;lt;/read&amp;gt;&lt;br /&gt;&amp;lt;/telnet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;El servicio de reset está desabilitado por defecto porque en producción podría ser muy fácilmente explotado para obtener una denegación de servicio.&lt;br /&gt;Para habilitar reloading de templates en producción fui un paso más allá de lo documentado y expuse el servicio de reset via JMX (gracias a &lt;a href="http://hivemind.apache.org/"&gt;HiveMind&lt;/a&gt;) de tal manera de poder automatizar el reset de la cache tomando las mayores precauciones de seguridad (y así evitar un posible DoS).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;hivemodule.xml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt; &amp;lt;contribution configuration-id="hivemind.EagerLoad"&amp;gt;&lt;br /&gt;     &amp;lt;load service-id="hivemind.management.MBeanRegistry"/&amp;gt;&lt;br /&gt; &amp;lt;/contribution&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;contribution configuration-id="hivemind.management.MBeans"&amp;gt;&lt;br /&gt;     &amp;lt;mbean service-id="TapestryMBean"/&amp;gt;&lt;br /&gt; &amp;lt;/contribution&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;service-point id="TapestryMBean" interface="&lt;/code&gt;&lt;code&gt;org.amneris.tapiz4&lt;/code&gt;&lt;code&gt;.jmx.TapestryMBean"&amp;gt;&lt;br /&gt;     &amp;lt;invoke-factory&amp;gt;&lt;br /&gt;         &amp;lt;construct class="org.amneris.tapiz4.jmx.TapestryMBeanImpl"&amp;gt;&lt;br /&gt;             &amp;lt;set-object property="resetEventHub" value="infrastructure:resetEventHub"/&amp;gt;&lt;br /&gt;         &amp;lt;/construct&amp;gt;&lt;br /&gt;     &amp;lt;/invoke-factory&amp;gt;&lt;br /&gt; &amp;lt;/service-point&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;contribution style="font-weight: bold; font-style: italic;" id="hivemind.EagerLoad"&gt;&lt;load id="hivemind.management.MBeanRegistry"&gt;&lt;/load&gt;&lt;/contribution&gt;&lt;contribution style="font-weight: bold; font-style: italic;" id="hivemind.management.MBeans"&gt;&lt;mbean id="TapestryMBean"&gt;&lt;/mbean&gt;&lt;/contribution&gt;&lt;service-point style="font-weight: bold; font-style: italic;" id="TapestryMBean" interface="com.amneris.muba.jmx.TapestryMBean"&gt;&lt;invoke-factory&gt;&lt;construct class="com.amneris.muba.jmx.TapestryMBeanImpl"&gt;&lt;set-object property="resetEventHub" value="infrastructure:resetEventHub"&gt;&lt;/set-object&gt;&lt;/construct&gt;&lt;/invoke-factory&gt;&lt;/service-point&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;java&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;import org.apache.tapestry.services.ResetEventHub;&lt;br /&gt;&lt;br /&gt;public class TapestryMBeanImpl implements TapestryMBean&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;ResetEventHub resetEventHub;&lt;br /&gt;&lt;br /&gt;public void resetTapestryCache()&lt;br /&gt;{&lt;br /&gt;resetEventHub.fireResetEvent();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setResetEventHub(ResetEventHub resetEventHub)&lt;br /&gt;{&lt;br /&gt;this.resetEventHub = resetEventHub;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Live Class Reloading&lt;/h2&gt;En cuanto a class reloading en Tapestry4, ya comenté en el &lt;a href="http://weblog.amneris.es/2008/01/matt-raible-acerca-de-ztt.html"&gt;post anterior&lt;/a&gt; que solo conozco 2 alternativas (si alguien de alguna más por favor que me lo comente).&lt;br /&gt;&lt;br /&gt;1) &lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html"&gt;Sysdeo tomcat launcher plugin&lt;/a&gt; (open source)&lt;br /&gt;2) &lt;a href="http://www.zeroturnaround.com/javarebel/"&gt;JavaRebel&lt;/a&gt; de &lt;a href="http://www.zeroturnaround.com/"&gt;ZeroTurnaround&lt;/a&gt; (software de pago, altamente recomendado)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-8747800381390418172?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/AHpEMe3Yi3M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/8747800381390418172/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=8747800381390418172" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8747800381390418172?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/8747800381390418172?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/AHpEMe3Yi3M/ztt-y-tapestry4.html" title="ZTT y Tapestry4" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/01/ztt-y-tapestry4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cGQHY4fyp7ImA9WxZSEks.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7914221762608163903</id><published>2008-01-24T14:33:00.000-08:00</published><updated>2008-01-25T03:37:01.837-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-25T03:37:01.837-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tapestry" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="ztt" /><category scheme="http://www.blogger.com/atom/ns#" term="appfuse" /><title>Matt Raible acerca de ZTT</title><content type="html">En un &lt;a href="http://raibledesigns.com/rd/entry/all_web_frameworks_should_support"&gt;reciente post&lt;/a&gt; Matt Raible dice que si tuviera que pedir un deseo para el 2008 sería que todos los frameworks web en Java tuvieran soporte para ZTT.&lt;br /&gt;&lt;br /&gt;Matt no usa el término ZTT sino que le dice "hot deploy", pero el concepto es el mismo. En su post menciona &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, &lt;a href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt; (que está en Groovy), &lt;a href="http://www.jboss.com/products/seam"&gt;Seam&lt;/a&gt; y &lt;a href="http://tapestry.apache.org/tapestry5/"&gt;Tapestry5&lt;/a&gt; como frameworks que ya lo soportan "out of the box", y comenta que no debería ser necesario comprar &lt;a href="http://www.zeroturnaround.com/javarebel/"&gt;JavaRebel&lt;/a&gt; para poder usar ZTT en Java sino que debería ser obligación de todo framework proveer esta funcionalidad (cosa que veo un poco difícil).&lt;br /&gt;&lt;br /&gt;Yo soy un feliz usuario de &lt;a href="http://www.zeroturnaround.com/javarebel/"&gt;JavaRebel&lt;/a&gt; y lo recomiendo. La única alternativa &lt;a href="http://en.wikipedia.org/wiki/FOSS"&gt;FLOSS&lt;/a&gt; que conozco es el &lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html"&gt;tomcat launcher plugin de Sysdeo&lt;/a&gt; (si alguien conoce alguna más por favor que me lo comente), que viene con un classloader propio.  El plugin de sysdeo es excelente pero tiene sus limitaciones, sólo funciona con el IDE &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; y con el servidor de aplicaciones &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt; (cualquiera de sus versiones) y, además, tiene varios problemas especialmente cuando se agregan métodos nuevos a una clase o cuando se cambian parámetros en anotaciones.&lt;br /&gt;JavaRebel, en cambio, funciona con cualquier IDE (incluso funciona con maven :D ) y con &lt;a href="http://www.zeroturnaround.com/javarebel/installation/"&gt;varios servidores de aplicaciones&lt;/a&gt;. Como contra tiene que no es open source y que su licencia cuesta $150 (aunque bien valen la pena).&lt;br /&gt;&lt;br /&gt;Ambas alternativas son incompatibles con cambios de estructura en el modelo Hibernate. Me pregunto como hará Seam para manejar los cambios en el modelo? los detectará? Hmmm tendré que hacer la prueba.&lt;br /&gt;&lt;br /&gt;Por cierto, si no saben lo que es JavaRebel no se pierdan el simpático corto animado: &lt;a href="http://www.zeroturnaround.com/a-javarebel-story/"&gt;"La historia de un rebelde Java" (A Story of a Java Rebel)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7914221762608163903?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/PYDXqZ4JYYY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7914221762608163903/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7914221762608163903" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7914221762608163903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7914221762608163903?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/PYDXqZ4JYYY/matt-raible-acerca-de-ztt.html" title="Matt Raible acerca de ZTT" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/01/matt-raible-acerca-de-ztt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUHQHs_eip7ImA9WxZTEk8.&quot;"><id>tag:blogger.com,1999:blog-4233719084522656957.post-7324513289012504477</id><published>2008-01-13T03:52:00.000-08:00</published><updated>2008-01-13T04:10:31.542-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-13T04:10:31.542-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tapestry" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tapestry5" /><category scheme="http://www.blogger.com/atom/ns#" term="ztt" /><title>ZTT y Tapestry5</title><content type="html">&lt;br&gt;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=45000" target="_blank"&gt;&lt;/a&gt;Al comenzar a hablar de ZTT en java hay que hacer la siguiente aclaración: es prácticamente imposible asegurar que cualquier estrategia para ZTT para java funcionará en el 100% de los casos.&lt;br&gt;La principal razón para esto es que no hay una manera estándar establecida de hacer manipulación de bytecode de clases (weaving), y entonces cada framework o librería implementa su manera: algunos usan &lt;a title="AspectJ" href="http://es.wikipedia.org/wiki/AspectJ" id="yyr0"&gt;AspectJ&lt;/a&gt;, otros &lt;a title="Javassist" href="http://en.wikipedia.org/wiki/Javassist" id="kfk2"&gt;Javassist&lt;/a&gt;, otros &lt;a title="Jakarta Commons JCI" href="http://commons.apache.org/jci/" id="u8iu"&gt;Jakarta Commons JCI&lt;/a&gt; y otros como &lt;a title="Tapestry5" href="http://tapestry.apache.org/tapestry5/" id="tiec"&gt;Tapestry5&lt;/a&gt; implementan su propio &lt;a title="ClassLoader" href="http://es.wikipedia.org/wiki/Java_classloader" id="mp.u"&gt;ClassLoader&lt;/a&gt;. &lt;br&gt;Esto lleva a que varios esfuerzos para aproximarse a ZTT resulten incompatibles entre si  y con determinados frameworks. El caso más típico es &lt;a title="Hibernate" href="http://www.hibernate.org/" id="zmux"&gt;Hibernate&lt;/a&gt;. En esta serie de post veremos diferentes estrategias para acelerar el desarrollo al utilizar frameworks como &lt;a title="Trails" href="http://www.trailsframework.org/" id="xnm4"&gt;Trails&lt;/a&gt;, Tapestry4, Tapestry5, &lt;a title="Spring" href="http://www.springframework.org/" id="di13"&gt;Spring&lt;/a&gt;. Pero cuando se trata de Hibernate siempre hay que hacer consideraciones aparte, porque al realizar una modificación sobre una clase del modelo Hibernate, no todas las estrategias para ZTT funcionan correctamente. Hibernate tiene su propio weaving de classes (weaving estático con Javassist) que no permite hacer el cambio "on the fly" de una clase sin notificarle a Hibernate y recargar &lt;i&gt;toda&lt;/i&gt; la configuración. En otro post mostraré de que manera se puede disminuir el impacto de esta limitación de Hibernate recargando el contexto de Spring.&lt;br&gt;&lt;br&gt;&lt;h3&gt;Tapestry5 seamless ZTT&lt;/h3&gt;&lt;br&gt;Una de las nuevas características de Tapesty5 es la recarga automática ("on the fly") de clases o templates que hayan sido modificados (&lt;a title="Live Class and Template Reloading" href="http://tapestry.apache.org/tapestry5/tapestry-core/guide/reload.html" id="d7vz"&gt;Live Class and Template Reloading&lt;/a&gt;).&lt;br&gt;Lo mejor de la implementación de Tapestry5 es que funciona exactamente igual en desarrollo que en producción y no necesita (prácticamente) ninguna configuración o consideración extra.&lt;br&gt;Para verlo en funcionamiento se pueden consultar los excelentes &lt;a title="screencasts de Tapestry5" href="http://tapestry.apache.org/tapestry5/screencast.html" id="dptv"&gt;screencasts de Tapestry5&lt;/a&gt; que Howard ha preparado como introducción a las diferentes características del framework.&lt;br&gt;Incluso es realmente fácil de probar para aquellos familiarizados con &lt;a title="Maven" href="http://maven.apache.org/" id="s.oz"&gt;Maven&lt;/a&gt;. Existe un &lt;a title="archetype para Tapestry5" href="http://tapestry.apache.org/tapestry5/quickstart/" id="fks5"&gt;archetype&lt;/a&gt; que permite probar estás caracteristicas de Tapesty5 en 10 minutos.&lt;br&gt;&lt;b&gt;&lt;i&gt;Las limitaciones:&lt;/i&gt;&lt;/b&gt; Tapestry5 implementa su propio ClassLoader y debido a la ambigüedades en las especificaciones de "class loading" (&lt;a title="que han generado varias discuciones" href="http://tapestryjava.blogspot.com/2007/02/fighting-with-tomcat.html" id="eyaf"&gt;lo que ha generado varias discuciones&lt;/a&gt;) para servidores de aplicaciones, hay que tener &lt;a title="ciertas precauciones" href="http://tapestry.apache.org/tapestry5/tomcat.html" id="ui3v"&gt;ciertas precauciones&lt;/a&gt; al usar otros servidores de aplicaciones que no sean &lt;a href="http://www.mortbay.org/"&gt;Jetty&lt;/a&gt;. &lt;br&gt;Otra limitación es que el class reloading se limita a clases controladas por &lt;a title="Tapestry5 IoC" href="http://tapestry.apache.org/tapestry5/tapestry-ioc/" id="t9i8"&gt;Tapestry5 IoC&lt;/a&gt;, por lo que si el cambio ha sido en clases del modelo Hibernate o alguna clase que se inyecta via Spring, estos cambios no serán detectados.&lt;br&gt;&lt;br&gt;Tapestry5 &lt;a href="http://tapestry.apache.org/tapestry5/tapestry-core/guide/reload.html"&gt;"Live Class and Template Reloading"&lt;/a&gt; es &lt;b&gt;LO MEJOR&lt;/b&gt; (dentro del open source) que he visto para facilitar la vida del desarrollador web java y reducir el tiempo del ciclo de deployment al mínimo posible. Gracias a esta característica creo se convertirá en &lt;b&gt;"él"&lt;/b&gt; framework web java del 2008 y seguramente volverá a ganar el premio que otorga Sun a la innovación en Java.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4233719084522656957-7324513289012504477?l=weblog.amneris.es' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amneris/~4/hjicA0TfDs8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://weblog.amneris.es/feeds/7324513289012504477/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4233719084522656957&amp;postID=7324513289012504477" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7324513289012504477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4233719084522656957/posts/default/7324513289012504477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/amneris/~3/hjicA0TfDs8/ztt-y-tapestry5.html" title="ZTT y Tapestry5" /><author><name>Alejandro Scandroli</name><uri>http://www.blogger.com/profile/00282844417152255966</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00715996911655466475" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://weblog.amneris.es/2008/01/ztt-y-tapestry5.html</feedburner:origLink></entry></feed>
