<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="es-ES" xmlns="http://www.w3.org/2005/Atom">
  <title>4Trabes - De todo un poco</title>
  <id>tag:4trabes.com,2010:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  <link href="http://4trabes.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://4trabes.com/" rel="alternate" type="text/html"/>
  <updated>2010-07-27T08:15:00Z</updated>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-07-27:6157</id>
    <published>2010-07-27T08:08:00Z</published>
    <updated>2010-07-27T08:15:00Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/7/27/usando-un-keystore-con-play" rel="alternate" type="text/html"/>
    <title>Usando un keystore con Play</title>
<content type="html">
            &lt;p&gt;&lt;cite&gt;
Este post es para &lt;a href=&quot;https://twitter.com/spenap&quot;&gt;Simón&lt;/a&gt;. El otro día mientras le dábamos  clase en el &lt;a href=&quot;http://www.mastersoftwarelibre.com&quot;&gt;Master de Software Libre&lt;/a&gt; nos dijo que últimamente no escribíamos mucho. Acto seguido le prometimos un post dedicado. Seguro que se lo tomó a broma :) 
&lt;/cite&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play&lt;/a&gt; en su versión actual (1.0.3.1) no soporta keystores, sin embargo, con un poquito de Python podemos modificar el script &lt;code&gt;play&lt;/code&gt; para que lo haga.&lt;/p&gt;


	&lt;p&gt;Alrededor de la línea 468 del fichero &lt;code&gt;$PLAY_HOME/play&lt;/code&gt; (en el contexto del método &lt;code&gt;do_java&lt;/code&gt;) metemos un código parecido a este:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;trustStore = readConf(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java.trustStore&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;kw&quot;&gt;not&lt;/span&gt; trustStore == &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;:
    &lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; os.path.exists(trustStore):
        &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~ using keystore &lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; % trustStore
        java_args.append(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;-Djavax.net.ssl.trustStore=%s&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; % trustStore)
        trustStorePassword = readConf(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java.trustStore.password&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)
        &lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; trustStorePassword == &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;:
            &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~ WARNING: No java.trustStore.password key found in config. You need a password to use a keystore&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;kw&quot;&gt;else&lt;/span&gt;:
            java_args.append(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;-Djavax.net.ssl.trustStorePassword=%s&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; % trustStorePassword)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Y ya podemos configurar nuestro keystore en el fichero &lt;code&gt;conf/application.conf&lt;/code&gt; de nuestra aplicación.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;java.trustStore=/home/david/opt/javacerts/development
java.trustStore.password=123456&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;code&gt;play run&lt;/code&gt; y a correr.
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-06-23:6149</id>
    <published>2010-06-23T11:10:00Z</published>
    <updated>2010-06-23T11:10:46Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/6/23/timestamps-autom-ticos-para-los-modelos-de-play" rel="alternate" type="text/html"/>
    <title>Timestamps autom&#225;ticos para los modelos de Play</title>
<content type="html">
            &lt;p&gt;Una de las cosas a las que me he acostumbrado al trabajar con &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; es al mantenimiento automático de timestamps (a saber, fecha de creación y fecha de actualización).  El framework &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play&lt;/a&gt; no tiene nada del estilo, así que aquí os dejo la clasecilla que usamos nosotros para obtener este comportamiento. Con sólo dejarla en &lt;code&gt;app/models&lt;/code&gt; todos los modelos tendrán los atributos &lt;code&gt;createdAt&lt;/code&gt; y &lt;code&gt;updatedAt&lt;/code&gt; y sus valores se actualizarán automáticamente. A nosotros nos gusta así, pero podéis afinar el comportamiento a vuestro gusto.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kw&quot;&gt;package&lt;/span&gt; models;

&lt;span class=&quot;kw&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;ic&quot;&gt;java.util&lt;/span&gt;.*;
&lt;span class=&quot;kw&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;ic&quot;&gt;javax.persistence&lt;/span&gt;.*;
&lt;span class=&quot;kw&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;ic&quot;&gt;play.db.jpa&lt;/span&gt;.*;

&lt;span class=&quot;at&quot;&gt;@MappedSuperclass&lt;/span&gt;
&lt;span class=&quot;di&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;ty&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Model&lt;/span&gt; &lt;span class=&quot;di&quot;&gt;extends&lt;/span&gt; play.db.jpa.Model {

    &lt;span class=&quot;di&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;Date&lt;/span&gt; createdAt;

    &lt;span class=&quot;di&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;Date&lt;/span&gt; updatedAt;

    &lt;span class=&quot;at&quot;&gt;@PrePersist&lt;/span&gt;
    &lt;span class=&quot;ty&quot;&gt;void&lt;/span&gt; onPrePersist() {
        &lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;lv&quot;&gt;this&lt;/span&gt;.createdAt == &lt;span class=&quot;pc&quot;&gt;null&lt;/span&gt;) {
            &lt;span class=&quot;lv&quot;&gt;this&lt;/span&gt;.createdAt = &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;Date&lt;/span&gt;();
        }
        &lt;span class=&quot;lv&quot;&gt;this&lt;/span&gt;.updatedAt = &lt;span class=&quot;lv&quot;&gt;this&lt;/span&gt;.createdAt;
    }

    &lt;span class=&quot;at&quot;&gt;@PreUpdate&lt;/span&gt;
    &lt;span class=&quot;ty&quot;&gt;void&lt;/span&gt; onPreUpdate() {
        &lt;span class=&quot;lv&quot;&gt;this&lt;/span&gt;.updatedAt = &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;Date&lt;/span&gt;();
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-06-02:6142</id>
    <published>2010-06-02T15:36:00Z</published>
    <updated>2010-06-02T16:35:43Z</updated>
    <category term="Git"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/6/2/git-1-7-me-hace-m-s-feliz" rel="alternate" type="text/html"/>
    <title>Git 1.7 me hace m&#225;s feliz</title>
<content type="html">
            &lt;p&gt;La versión 1.7 de &lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt;  incluye, entre otras novedades, una nueva opción para el comando &lt;code&gt;git branch&lt;/code&gt;: &lt;code&gt; --set-upstream&lt;/code&gt;, que facilita fijar que una rama local haga tracking de una rama remota (útil en nuestro primer push por ejemplo).&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ git remote add origin git@myawesomerepo.com:myproject.git
$ git push origin master
$ git branch --set-upstream master origin/master&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;La última línea sustituye a los mecanismos anteriores:  llamar a &lt;code&gt;git config&lt;/code&gt; de un modo oscuro&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ git config branch.master.merge refs/heads/master&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
 

	&lt;p&gt;...o bien usar una herramienta externa tipo &lt;a href=&quot;http://github.com/webmat/git_remote_branch&quot;&gt;git_remote_branch&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ grb track master origin&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Pefiero usar esta nueva opción.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-05-19:6139</id>
    <published>2010-05-19T14:29:00Z</published>
    <updated>2010-06-02T15:37:21Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/5/19/play-framework-fix-para-el-m-dulo-de-ivy" rel="alternate" type="text/html"/>
    <title>Play framework: fix para el m&#243;dulo de Ivy</title>
<content type="html">
            &lt;p&gt;La versión 1.0 del módulo de &lt;a href=&quot;http://www.playframework.org/modules/ivy&quot;&gt;Ivy&lt;/a&gt; tiene un pequeño bug que hace que los comandos &lt;a href=&quot;http://www.playframework.org&quot;&gt;Play&lt;/a&gt; de otros módulos no puedan ejecutarse. No voy a entrar en explicaciones, sólo os dejo el fix: tenéis que eliminar la última línea del fichero &lt;code&gt;${play.path}/modules/ivy-1.0/commans.py&lt;/code&gt;.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~ Application dependencies ~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;~~~~~~~~~~~~~~~~~~~~~~~~~~~~&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;kw&quot;&gt;for&lt;/span&gt; jar &lt;span class=&quot;kw&quot;&gt;in&lt;/span&gt; os.listdir(os.path.join(application_path, &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;)):
        print(jar)
    &lt;span class=&quot;kw&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

sys.exit(&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;)  &lt;span class=&quot;c&quot;&gt;# ¡Esta línea es maligna!&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>asis</name>
    </author>
    <id>tag:4trabes.com,2010-05-12:6138</id>
    <published>2010-05-12T13:49:00Z</published>
    <updated>2010-05-12T14:12:35Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/5/12/maven-a-todo-color" rel="alternate" type="text/html"/>
    <title>Maven a todo color</title>
<content type="html">
            &lt;p&gt;Hay una cosa que siempre me ha fastidiado de la salida que escupe maven al ejecutar los tests: nunca sé, así de un vistazo, si todo ha ido bien o si ha fallado algo. Así que tras googlear un poco me he topado con esto &lt;a href=&quot;http://ju-n.net/colorize-maven-output&quot;&gt;http://ju-n.net/colorize-maven-output&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Se trata de una función bash que utiliza sed para procesar la salida de maven y colorearla.&lt;/p&gt;


	&lt;p&gt;Para poder utilizarlo también con &lt;a href=&quot;http://github.com/mynyml/watchr&quot;&gt;watchr&lt;/a&gt; (sobre el que David ha &lt;a href=&quot;http://4trabes.com/2010/5/10/watchr-aplicado-autotesting-con-maven&quot;&gt;blogueado&lt;/a&gt; &lt;a href=&quot;http://4trabes.com/2010/5/7/watchr-aplicado-junit-autotesting-con-ant&quot;&gt;recientemente&lt;/a&gt;) hemos (gracias David) introducido un par de modificaciones en el script que aparece en el enlace anterior:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;  # aquí irían todos los exports de colores
  ...
  # hacemos un alias del comando sed que aparece en el enlace de más
  # arriba sin olvidarnos de resetear los estilos al final
  alias colorize-mvn-output='sed -e [...] &amp;amp;&amp;amp; echo -ne ${RESET_FORMATTING}'

  mvn-color() {
      $(which mvn) $@ | colorize-mvn-output
  }
  alias mvn=&amp;quot;mvn-color&amp;quot;

  mvn-watchr() {
      watchr $@ | colorize-mvn-output
  }

  # como usamos watchr para más cosas que ejecutar tests 
  # de maven, no creamos un alias que sobreescriba el comando 
  # watchr&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Ahora, cuando hagamos directamente&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;  $ mvn test&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;o bien utilicemos watchr llamando a&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt; $ mvn-watchr path/to/script.file&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;obtendremos unos resultados muchos más coloridos.&lt;/p&gt;


&lt;div class=&quot;image&quot;&gt;

&lt;/div&gt;

	&lt;p&gt;Y con esto queda explicado &lt;a href=&quot;http://twitter.com/asischao/status/13844278377&quot;&gt;mi extraño tweet&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-05-10:6137</id>
    <published>2010-05-10T22:16:00Z</published>
    <updated>2010-05-10T22:17:00Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/5/10/watchr-aplicado-autotesting-con-maven" rel="alternate" type="text/html"/>
    <title>Watchr aplicado: autotesting con Maven</title>
<content type="html">
            &lt;p&gt;Variante de la &lt;a href=&quot;http://4trabes.com/2010/5/7/watchr-aplicado-junit-autotesting-con-ant&quot;&gt;receta&lt;/a&gt; que os traje el otro día. Esta vez utilizando &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; en lugar de Ant. Sólo hay que modificar un poco el fichero de configuración de &lt;a href=&quot;http://github.com/mynyml/watchr&quot;&gt;Watchr&lt;/a&gt; y listo.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;watch( &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;src/main/java/(.*)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;\.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; )  &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |md|
    file = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;md[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    test(file) &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.exists?(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;src/test/java/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;file&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

watch( &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;src/test/java/(.*Test)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;\.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; ) { |md| test(md[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]) }

&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;test&lt;/span&gt;(file)
    system(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mvn test -Dtest=&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;file.gsub(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-05-07:6132</id>
    <published>2010-05-07T12:19:00Z</published>
    <updated>2010-05-07T12:19:38Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/5/7/watchr-aplicado-junit-autotesting-con-ant" rel="alternate" type="text/html"/>
    <title>Watchr aplicado: JUnit autotesting con Ant</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;Ingredientes&lt;/strong&gt;&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://github.com/mynyml/watchr&quot;&gt;Watchr&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Fichero de configuración de Watchr&lt;/li&gt;
		&lt;li&gt;Tarea &lt;a href=&quot;http://ant.apache.org&quot;&gt;Ant&lt;/a&gt; para testear una clase con &lt;a href=&quot;http://www.junit.org/&quot;&gt;JUnit&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;&lt;strong&gt;Preparación&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Instalamos Watchr en nuestro sistema (es necesario disponer de &lt;a href=&quot;http://ruby-lang.org/es&quot;&gt;Ruby&lt;/a&gt; en nuestra cocina para preparar esta receta):&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ gem install watchr&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Preparamos un fichero de configuración de Watchr (&lt;code&gt;watchr.conf&lt;/code&gt;) y reservamos:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;watch( &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;src/(.*)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;\.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; )  &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |md|
    file = &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;md[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    test(file) &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.exists?(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test/&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;file&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

watch( &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test/(.*Test)&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;\.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;java&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; ) { |md| test(md[&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;]) }

&lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;test&lt;/span&gt;(file)
    system(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ant -Dtest=&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;file.gsub(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; test-file&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Es importante elegir los sabores adecuados de expresiones regulares para que Watchr vigile tanto el código fuente como, los ficheros de test.&lt;/p&gt;


	&lt;p&gt;Después creamos una tarea Ant que testea una clase indicada mediante párametro:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ ant -Dtest=mi.paquete.MiClase test-file&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Sazonamos la tarea al gusto. El chef recomienda:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test-file&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;depends&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;test-compile&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;junit&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;classpath&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;refid&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;project.classpath.test&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;formatter&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;brief&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;usefile&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${test}&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/junit&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Mezclamos todo y emplatamos:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ watchr watchr.conf&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Algunos chefs, prefieren presentar el plato usando Ant:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;autotest&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;exec&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;command&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;watchr&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;arg&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;watchr.conf&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/exec&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Esto último es opcional, sólo para aquellos cocineros que quieran manejar todo lo relativo a su proyecto con Ant.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-04-29:6127</id>
    <published>2010-04-29T16:17:00Z</published>
    <updated>2010-04-29T17:25:07Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/4/29/gesti-n-de-dependencias-en-aplicaciones-play-versi-n-inicial-ant-maven" rel="alternate" type="text/html"/>
    <title>Gesti&#243;n de dependencias en aplicaciones Play!, versi&#243;n inicial: Ant + Maven</title>
<content type="html">
            &lt;p&gt;Uno de los cambios derivados de nuestra migración a &lt;a href=&quot;http://www.playframework.org&quot;&gt;Play!&lt;/a&gt; como framework &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; para aplicaciones web Java, es el uso de &lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; como gestor de builds. En &lt;a href=&quot;http://www.trabesoluciones.com&quot;&gt;Trabe&lt;/a&gt; utilizamos &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; habitualmente, ya que nuestros proyectos se adaptan bien a la estructura y ciclo de vida que marca esta herramienta, sin embargo, las aplicaciones Play! y sus módulos definen su propia estructura de directorios y utilizan Ant. Maven está muy bien cuando te ciñes a su estructura de proyecto, pero si haces algo distinto se hace necesario escribir descriptores gigantes y, francamente, el soporte Ant de Play está suficientemente bien como para aceptar el cambio.&lt;/p&gt;


	&lt;p&gt;Usar Ant en este contexto sólo tiene un problema: Ant no gestiona dependencias. Para solventarlo, como no tenía mucho tiempo para pensármelo, opté inicialmente por combinar Ant y Maven. Esta solución es aplicable a cualquier proyecto que utilice Ant como gestor de builds, no sólo a los proyectos Play!&lt;/p&gt;


	&lt;p&gt;Para gestionar las dependencias con Maven, lo primero es crear un &lt;span class=&quot;caps&quot;&gt;POM&lt;/span&gt; con lo mínimo:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;project&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;xmlns&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://maven.apache.org/POM/4.0.0&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;an&quot;&gt;xmlns:xsi&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; 
         &lt;span class=&quot;an&quot;&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;http://maven.apache.org/POM/4.0.0 &lt;/span&gt;
                             &lt;span class=&quot;k&quot;&gt;http://maven.apache.org/maven-v4_0_0.xsd&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span class=&quot;ta&quot;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.4trabes&lt;span class=&quot;ta&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;awesome&lt;span class=&quot;ta&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;jar&lt;span class=&quot;ta&quot;&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span class=&quot;ta&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;4Trabes awesome Play library&lt;span class=&quot;ta&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;ta&quot;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;ta&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;ta&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.op4j&lt;span class=&quot;ta&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;ta&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;op4j&lt;span class=&quot;ta&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;ta&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0&lt;span class=&quot;ta&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;

    &lt;span class=&quot;ta&quot;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;ta&quot;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;ta&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class=&quot;ta&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;ta&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-dependency-plugin&lt;span class=&quot;ta&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;ta&quot;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
                    &lt;span class=&quot;ta&quot;&gt;&amp;lt;outputDirectory&amp;gt;&lt;/span&gt;lib/&lt;span class=&quot;ta&quot;&gt;&amp;lt;/outputDirectory&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;ta&quot;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;ta&quot;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Mínima información acerca del proyecto, nuestra lista de dependencias (sin preocuparse de los scopes) y, muy importante, la configuración del plugin de dependencias para que copie las librerías en el directorio &lt;code&gt;lib&lt;/code&gt; (o en otro lado, a gusto del consumidor).&lt;/p&gt;


	&lt;p&gt;Ahora es cuestión de añadir a nuestro &lt;code&gt;build.xml&lt;/code&gt; una tarea que invoque el goal &lt;code&gt;copy-dependencies&lt;/code&gt; del plugin &lt;code&gt;dependency&lt;/code&gt; de Maven:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;target&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;name&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;deps&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;exec&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;executable&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mvn&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;arg&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;-f&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;arg&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;deps.xml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;ta&quot;&gt;&amp;lt;arg&lt;/span&gt; &lt;span class=&quot;an&quot;&gt;value&lt;/span&gt;=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;dependency:copy-dependencies&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ta&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;ta&quot;&gt;&amp;lt;/exec&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Pan comido. Cada vez que ejecutemos &lt;code&gt;ant deps&lt;/code&gt; se descargarán las librerías que no tengamos.&lt;/p&gt;


	&lt;p&gt;Si se trata de un proyecto Play!, es buena idea configurar el plugin de dependencias para que excluya las librerías que vienen
de serie con el framework para evitar conflictos. Aquí os dejo las exclusiones para la versión 1.0.2.1 (creo que están todas).&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;excludeArtifactIds&amp;gt;&lt;/span&gt;
    activation,antlr,backport-util-concurrent,bcprov-jdk15,c3p0,
    cglib-nodep,commons-beanutils,commons-codec,commons-fileupload,
    commons-httpclient,commons-lang,commons-logging,core,dom4j,
    ehcache,ejb3-persistence,ezmorph,filters,geronimo-servlet_2.5_spec,
    groovy-all,gson,hibernate,hibernate-core,
    hibernate-commons-annotations,hibernate-entitymanager,hsqldb,
    jamon,jaxen,jsr107cache,jta,junit,log4j,lucene-analyzers,
    lucene-core,mail,oval,snakeyaml,slf4j-api,slf4j-log4j12
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/excludeArtifactIds&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Aunque esta solución es válida decidí investigar un poco más y finalmente decidí cambiar Maven2 por &lt;a href=&quot;http://ant.apache.org/ivy/&quot;&gt;Ivy&lt;/a&gt;, que me parece más &#8220;natural&#8221;. Pero eso lo dejo para otro post.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>lucas</name>
    </author>
    <id>tag:4trabes.com,2010-04-28:6111</id>
    <published>2010-04-28T10:36:00Z</published>
    <updated>2010-05-07T09:00:30Z</updated>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2010/4/28/rvm-rails3-beta-y-ruby1-9-1" rel="alternate" type="text/html"/>
    <title>rvm + rails3.0.0.beta + ruby 1.9.1</title>
<content type="html">
            &lt;p&gt;Desde hace unos meses estoy  &#8220;viviendo en edge&#8221;. Para ello estoy usando &lt;a href=&quot;http://rvm.beginrescueend.com/&quot;&gt;rvm&lt;/a&gt; , que nos permite tener varias versiones de ruby con sus correspondientes gemas.&lt;/p&gt;


	&lt;p&gt;Tras actualizar a la beta de rails e intentar ejecutar la consola (con el nuevo comando &lt;code&gt;rails console&lt;/code&gt; ) me topé con el siguiente error:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ rails console
/home/andion/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/irb/completion.rb:9:in `require': no such file to load -- readline (LoadError)
    from /home/andion/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/irb/completion.rb:9:in `&amp;lt;top (required)&amp;gt;'
    from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands/console.rb:3:in `require'
    from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands/console.rb:3:in `&amp;lt;top (required)&amp;gt;'
    from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands.rb:32:in `require'
    from /home/andion/.rvm/gems/ruby-1.9.1-p378/gems/railties-3.0.0.beta/lib/rails/commands.rb:32:in `&amp;lt;top (required)&amp;gt;'
    from /home/andion/git/efimera-eopages/script/rails:10:in `require'
    from /home/andion/git/efimera-eopages/script/rails:10:in `&amp;lt;main&amp;gt;'&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Cuando me encontré con el problema estaba usando &lt;code&gt;rvm0.1.23&lt;/code&gt;, &lt;code&gt;rails3.0.0.beta&lt;/code&gt; y &lt;code&gt;ruby1.9.1&lt;/code&gt; pero supongo que la solución será extensible a las siguientes betas de rails &lt;em&gt;(ahora mismo uso rails3 beta 3 y ruby 1.9.2 y todo sigue bien tras el fix)&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;Revisé algunas soluciones, pero todas estaban orientadas al uso de un ruby  &lt;em&gt;de sistema&lt;/em&gt; y no a través de rvm, además, la &lt;a href=&quot;http://rvm.beginrescueend.com/support/troubleshooting/&quot;&gt;solución&lt;/a&gt; que ofrece la web de rvm aunque parecía lógica, tampoco me funcionaba:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ rvm package install readline
Package 'readline' is unknown.
Usage: 'rvm package {install,uninstall} {openssl,zlib,readline,iconv,ncurses}'&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Googleando un poco más si que he visto alguna gente con el mismo problema por &lt;a href=&quot;http://gist.github.com/340091&quot;&gt;aquí&lt;/a&gt; y por &lt;a href=&quot;http://gist.github.com/339301&quot;&gt;allá&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;La solución para mí: una mezcla de las solución que da rvm y la sabiduría popular: &lt;strong&gt;reinstalar ruby 1.9.1&lt;/strong&gt; con el flag: readline-dir a un directorio válido para rvm:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ rvm uninstall 1.9.1
$ rvm install 1.9.1 --with-readline-dir=$rvm_path/.rvm/usr&lt;/code&gt;&lt;/pre&gt;

 &lt;br /&gt; &lt;br /&gt; 
 &lt;div class=&quot;edited&quot;&gt; 

	&lt;h5&gt;Edit  06/05/2010&lt;/h5&gt;


	&lt;p&gt;Tras actualizar a Ubuntu Lynx y con &lt;code&gt;rvm 0.1.29&lt;/code&gt; el problema se mantiene, pero la &lt;a href=&quot;http://rvm.beginrescueend.com/support/troubleshooting/&quot;&gt;solución&lt;/a&gt; que poponen en la web de rvm lo arregla:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;$ rvm package install readline ; rvm remove 1.9.1 ; rvm install 1.9.1 -C --with-readline-dir=$rvm_path/usr&lt;/code&gt;&lt;/pre&gt;

 &lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-04-12:6116</id>
    <published>2010-04-12T16:50:00Z</published>
    <updated>2010-04-12T16:53:07Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/4/12/rock-n-troll" rel="alternate" type="text/html"/>
    <title>Rock 'n' Troll</title>
<content type="html">
            &lt;p&gt;Debido a algunos comentarios recibidos en el blog hemos decidido incluir un sistema de &lt;em&gt;trolling&lt;/em&gt;.
Como no se trata de censurar sino de denunciar que un comentario es inapropiado, que está fuera de 
lugar o que es ofensivo, los comentarios de &lt;em&gt;trolls&lt;/em&gt; aparecerán marcados con la etiqueta  &lt;em&gt;Rock &#8216;n&#8217; troll&lt;/em&gt; y su 
texto estará sombreado. Seguirá siendo posible leer su contenido, pero ya avisamos que probablemente se trate
de una ventosidad mental y no merezca la pena perder el tiempo leyéndolo.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-03-08:6106</id>
    <published>2010-03-08T08:55:00Z</published>
    <updated>2010-03-08T09:03:20Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/3/8/op4j-bending-the-java-spoon" rel="alternate" type="text/html"/>
    <title>Op4j: bending the Java Spoon</title>
<content type="html">
            &lt;p&gt;Del creador  de &lt;a href=&quot;http://www.jasypt.org&quot;&gt;Jasypt&lt;/a&gt; 
llega ahora la beta de &lt;a href=&quot;http://www.op4j.org/&quot;&gt;op4j&lt;/a&gt;: una librería pensada para hacer 
felices a los programadores Java.&lt;/p&gt;


	&lt;p&gt;&lt;cite&gt;
It is a Java library aimed at improving quality, semantics, cleanness and readability of Java code, especially auxiliary code like data conversion, structure iteration, filtering, mapping
&lt;/cite&gt;&lt;/p&gt;


	&lt;p&gt;Básicamente, mediante encadenamiento de métodos podremos realizar las típicas
tareas &#8220;coñazo&#8221; del código Java en una sola línea, con un enfoque más declarativo 
(qué hacer y no cómo hacerlo).&lt;/p&gt;


	&lt;p&gt;Se entiende  mejor con un ejemplo extraído de la documentación: obtener a partir de una lista de
cadenas con fechas en formato &#8220;dd/MM/yyyy&#8221; un conjuto de objetos Calendar que no incluya ni nulos ni fechas futuras.&lt;/p&gt;


	&lt;h4&gt;Antes&lt;/h4&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt; now = &lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;.getInstance();
&lt;span class=&quot;pt&quot;&gt;SimpleDateFormat&lt;/span&gt; dateFormat = &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;SimpleDateFormat&lt;/span&gt;(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;dd/MM/yyyy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);
&lt;span class=&quot;pt&quot;&gt;Set&lt;/span&gt;&amp;lt;&lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;&amp;gt; set = &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;pt&quot;&gt;LinkedHashSet&lt;/span&gt;&amp;lt;&lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;&amp;gt;();
&lt;span class=&quot;kw&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;pt&quot;&gt;String&lt;/span&gt; element : list) {
  &lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; (element != &lt;span class=&quot;pc&quot;&gt;null&lt;/span&gt;) {
      &lt;span class=&quot;kw&quot;&gt;try&lt;/span&gt; {
          date = dateFormat1.parse(element);
      } &lt;span class=&quot;kw&quot;&gt;catch&lt;/span&gt; (&lt;span class=&quot;ex&quot;&gt;ParseException&lt;/span&gt; e) {
          &lt;span class=&quot;kw&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;kw&quot;&gt;new&lt;/span&gt; SomeException(e);
      }
      &lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt; calendar = &lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;.getInstance();
      calendar.setTimeInMillis(date.getTime());
      &lt;span class=&quot;kw&quot;&gt;if&lt;/span&gt; (!calendar.after(now)) {
          set.add(calendar);
      }
  }
}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;Después&lt;/h4&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt; now = &lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;.getInstance();
&lt;span class=&quot;pt&quot;&gt;Set&lt;/span&gt;&amp;lt;&lt;span class=&quot;pt&quot;&gt;Calendar&lt;/span&gt;&amp;gt; set = Op.on(list).toSet().
    map(FnString.toCalendar(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;dd/MM/yyyy&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)).
        removeAllNullOrTrue(FnCalendar.after(now)).get();&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;No está nada mal.  Podéis probarlo y colaborar a su desarrollo ofreciendo &lt;em&gt;feedback&lt;/em&gt; a su autor.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-01-23:6082</id>
    <published>2010-01-23T23:56:00Z</published>
    <updated>2010-02-04T16:58:45Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Tecnolog&#237;a"/>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/1/23/m-s-fypurl" rel="alternate" type="text/html"/>
    <title>M&#225;s FypURL</title>
<content type="html">
            &lt;p&gt;No sé si os acordáis de &lt;a href=&quot;http://fypurl.com&quot;&gt;FypURL&lt;/a&gt;, una &lt;a href=&quot;http://4trabes.com/2007/4/23/fypurl-compartir-urls-de-manera-sencilla-y-rápida&quot;&gt;pequeña aplicación&lt;/a&gt; que montamos Asís y &lt;a href=&quot;http://davidbarral.com&quot;&gt;yo&lt;/a&gt; por impulso/capricho en una tarde de abril hace casi tres años. Desde entonces hemos seguido dando servicio a su humilde base de usuarios.&lt;/p&gt;


	&lt;p&gt;Últimamente he estado pensando que era una pena no haber ofrecido ninguna novedad en estos tres años y aprovechando que algunos &lt;a href=&quot;http://trabe.github.com&quot;&gt;Trábicos&lt;/a&gt; hemos comenzado a jugar con las &lt;a href=&quot;http://code.google.com/chrome/extensions&quot;&gt;extensiones de Google Chrome&lt;/a&gt;, he publicado &lt;a href=&quot;https://chrome.google.com/extensions/detail/chodknndfkinilmiahlghfflbnhhbomm&quot;&gt;una extensión para usar FypURL&lt;/a&gt;: ofrece un acceso directo a los bookmarklets de fypeo y desfypeo y permite crear una lista de enlaces a las fypurls de nuestros conocidos. No está mal como experimento.&lt;/p&gt;


&lt;div class=&quot;image&quot;&gt;

&lt;/div&gt;

	&lt;p&gt;Esto no es lo último que voy a hacer con FypURL. Tengo planeadas algunas cosas y habrá que ver si hago un hueco para llevarlas a cabo (o hacemos, si lío a alguien más, jeje). De partida responderé a la petición de bastante gente y en brevé liberaré el código fuente de FypURL. A día de hoy ya he liberado el código de la extensión para Chrome y está &lt;a href=&quot;http://github.com/davidbarral/chrome-fypurl&quot;&gt;disponible en Github&lt;/a&gt;. No es nada del otro mundo pero puede ser interesante con fines educativos.&lt;/p&gt;


	&lt;p&gt;Si queréis seguir al tanto de lo que pasa con FypURL sólo teneís que seguir a &lt;a href=&quot;http://twitter.com/fypurl&quot;&gt;FypURL en Twitter&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2010-01-14:6077</id>
    <published>2010-01-14T11:17:00Z</published>
    <updated>2010-01-14T11:22:12Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2010/1/14/el-cuadro" rel="alternate" type="text/html"/>
    <title>El cuadro</title>
<content type="html">
            &lt;p&gt;Llevabamos un tiempo pensando en colgar cuadros por la &lt;a href=&quot;http://trabesoluciones.com&quot;&gt;oficina&lt;/a&gt; para darle algo de ambientillo, aunque  no habíamos empezado porque necesitabamos un primer cuadro. Gracias a la artista de  &lt;a href=&quot;http://carolinagonzalez.es&quot;&gt;Carolina&lt;/a&gt; y a nuestra querida &lt;a href=&quot;http://e-mm-irates.blogspot.com/&quot;&gt;Marta&lt;/a&gt;  ya lo tenemos y hemos estrenado las pared. 
Esperemos que sea el primero de muchos.&lt;/p&gt;


&lt;div class=&quot;image&quot;&gt;

&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>4trabes</name>
    </author>
    <id>tag:4trabes.com,2009-12-31:6073</id>
    <published>2009-12-31T10:46:00Z</published>
    <updated>2009-12-31T11:36:29Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2009/12/31/feliz-2010" rel="alternate" type="text/html"/>
    <title>Feliz 2010</title>
<content type="html">
            &lt;p&gt;El deseo de los miembros de &lt;a href=&quot;http://trabesoluciones.com&quot;&gt;Trabe&lt;/a&gt; para todo el mundo: mucha felicidad en 2010.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://4trabes.com/2009/1/2/el-bamb%C3%BA-de-trabe-soluciones-os-desea-un-feliz-2009&quot;&gt;Como el año pasado&lt;/a&gt;, el bambú también os desea feliz año.&lt;/p&gt;


&lt;div class=&quot;image&quot;&gt;

&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2009-12-31:6072</id>
    <published>2009-12-31T09:47:00Z</published>
    <updated>2009-12-31T10:50:51Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2009/12/31/bye-bye-galicia-global" rel="alternate" type="text/html"/>
    <title>Bye bye Galicia Global</title>
<content type="html">
            &lt;p&gt;Ya &lt;a href=&quot;http://4trabes.com/2009/11/13/galicia-global-cierra-sus-puertas-el-31-de-diciembre&quot;&gt;lo habíamos anunciado&lt;/a&gt;. &lt;a href=&quot;http://galiciaglobal.com&quot;&gt;Galicia Global&lt;/a&gt; ha cerrado sus puertas hoy 31 de diciembre de 2009.  Este cierre es definitivo, hemos eliminado todos los datos que teníamos almacenados, backups, etc. No hay vuelta atrás.&lt;/p&gt;


	&lt;p&gt;Ha sido una experiencia gratificante. Os agradecemos a todos vuestra participación.&lt;/p&gt;
          </content>  </entry>
</feed>
