<?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,2012: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>2011-12-23T11:39:12Z</updated>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-12-23:6234</id>
    <published>2011-12-23T11:35:00Z</published>
    <updated>2011-12-23T11:39:12Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/12/23/disfrutad-de-las-fiestas-mordiendo" rel="alternate" type="text/html"/>
    <title>Disfrutad de las fiestas mordiendo</title>
<content type="html">
            &lt;p&gt;No es una tradición, pero casi, porque ya es el segundo año. En este 2011 que ahora acaba hemos intentado hacer llegar a clientes y amigos un poco de grasa camuflada como magdalenas. Esperamos que os hayan gustado y que vuestras arterias nos disculpen. Ya veremos qué os trae el 2012. ¡Felices fiestas a todos!&lt;/p&gt;


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

&lt;/div&gt;

	&lt;p&gt;P.D.- si nuestros amigos de Autoradio han perpetrado el mismo atentado con todos los paquetes, pegándoles una gran etiqueta sobre el lazo y la tarjeta, la mayoría no habréis visto esta última. Lo sentimos. Venía a felicitar las fiestas, nada más. Lo bueno estaba dentro :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-12-01:6232</id>
    <published>2011-12-01T13:01:00Z</published>
    <updated>2011-12-01T13:02:29Z</updated>
    <category term="Ruby on Rails"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/12/1/rvm-bundler-y-binstubs" rel="alternate" type="text/html"/>
    <title>RVM, bundler y binstubs</title>
<content type="html">
            &lt;p&gt;&lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundler&lt;/a&gt; tiene una opción maravillosa: &lt;a href=&quot;http://gembundler.com/man/bundle-exec.1.html&quot;&gt;&lt;code&gt;--binstubs&lt;/code&gt;&lt;/a&gt;, que instala en el directorio de nuestra elección (por defecto &lt;code&gt;./bin&lt;/code&gt;) scripts que invocan los ejecutables de las gemas contenidas en el &lt;em&gt;bundle&lt;/em&gt;, permitiendo invocar directamente dichos ejecutables sin recurrir a &lt;code&gt;bundle exec&lt;/code&gt;. Si hacemos esto, lo más cómodo es añadir &lt;code&gt;./bin&lt;/code&gt; como primer elemento de nuestro &lt;code&gt;PATH&lt;/code&gt;. Por desgracia, si usamos &lt;a href=&quot;http://beginrescueend.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt;&lt;/a&gt; esto no funciona. Dado su funcionamiento, &lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt; necesita ajustar el &lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt; cada vez que invocamos un &lt;code&gt;rvm use&lt;/code&gt;. Nuestro gozo en un pozo.&lt;/p&gt;


	&lt;h4&gt;.rvmrc al rescate&lt;/h4&gt;


	&lt;p&gt;Los ficheros &lt;a href=&quot;http://beginrescueend.com/workflow/rvmrc/&quot;&gt;&lt;code&gt;.rvmrc&lt;/code&gt;&lt;/a&gt;&lt;/code&gt; valen para mucho más que fijar la versión de ruby o el &lt;em&gt;gemset&lt;/em&gt; que queremos usar en un proyecto concreto; son scripts de shell en toda regla. Podemos, por lo tanto, utilizarlos para modificar el &lt;code&gt;PATH&lt;/code&gt; y dar prioridad a nuestro &lt;code&gt;.bin&lt;/code&gt;, arreglando el problema.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;rvm use ruby-1.9.2-p290
export PATH=./bin:$PATH&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;La alternativa: rbenv&lt;/h4&gt;


	&lt;p&gt;Si esto os parece incómodo o sucio, siempre podéis utilizar &lt;a href=&quot;https://github.com/sstephenson/rbenv&quot;&gt;rbenv&lt;/a&gt; en lugar de &lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt;. Yo he empezado a usarlo en casa y estoy bastante contento; en lo básico es muy parecido a &lt;span class=&quot;caps&quot;&gt;RVM&lt;/span&gt; y es menos intrusivo con el shell.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>asis</name>
    </author>
    <id>tag:4trabes.com,2011-11-17:6228</id>
    <published>2011-11-17T10:55:00Z</published>
    <updated>2011-11-17T11:03:38Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/11/17/movember-at-trabe" rel="alternate" type="text/html"/>
    <title>Movember at Trabe</title>
<content type="html">
            &lt;p&gt;Noviembre es el mes de &lt;a href=&quot;http://es.movember.com&quot;&gt;Movember&lt;/a&gt;, un movimiento que &#8220;pide a hombres de todo el mundo que se dejen bigote con el objetivo de recaudar fondos y aumentar la sensibilización sobre la salud del hombre&#8221;.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://es.movember.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;En Trabe hemos decidido hacer una interpretación particular de esta iniciativa, dándole la vuelta: en lugar de dejarnos crecer el bigote, hemos decidido sacrificar nuestras barbas por tan solidaria iniciativa.&lt;/p&gt;


	&lt;p&gt;Para que seáis conscientes de lo impactante del proceso, hemos preparado una miniweb que resume por lo que hemos pasado estos días: &lt;a href=&quot;http://trabesoluciones.com/movember&quot;&gt;http://trabesoluciones.com/movember&lt;/a&gt;. Os animamos a todos a visitarla. Cuidado, es posible que no os podáis resistir a nuestro encanto bigotudo :)&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://trabesoluciones.com/movember&quot;&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;También podéis visitar nuestro espacio en la web de Movember en &lt;a href=&quot;http://mobro.co/trabe&quot;&gt;http://mobro.co/trabe&lt;/a&gt; para ver más fotos y poder aportar vuestro donativo. Venga, no seáis agarrados, que es por una buena causa :)&lt;/p&gt;


	&lt;p&gt;¡Gracias a todos!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; Nos habíamos olvidado de hacer mención especial a &lt;a href=&quot;http://twitter.com/bugyou&quot;&gt;@bugyou&lt;/a&gt; y agradecerle desde aquí que cediera su bigote de forma desinteresada :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-10-24:6221</id>
    <published>2011-10-24T15:02:00Z</published>
    <updated>2011-10-24T15:02:27Z</updated>
    <category term="Tecnolog&#237;a"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/10/24/svn-branching-y-merging-en-8-comandos" rel="alternate" type="text/html"/>
    <title>SVN: branching y merging en 8 comandos</title>
<content type="html">
            &lt;p&gt;Trabajar con ramas en &lt;a href=&quot;subversion.tigris.org&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt;&lt;/a&gt; es un dolor de muelas (sobre todo si estás acostumbrado a &lt;a href=&quot;http://git-scm.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GIT&lt;/span&gt;&lt;/a&gt;), pero eso no es razón para no utilizarlas. Sólo hace falta conocer 8 sencillos comandos.&lt;/p&gt;


	&lt;h4&gt;1. Branching&lt;/h4&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ svn copy http://my.svn.com/myrepo/trunk \
           http://my.svn.com/myrepo/branches/featurex \
           -m &amp;quot;Created featurex branch from trunk&amp;quot;
$ svn switch http://my.svn.com/myrepo/featurex&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;2. Algunos commits después: Merging&lt;/h4&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ svn switch http://my.svn.com/myrepo/trunk
$ svn up&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Tomemos la revisión que nos indica el comando y llamémosla YY.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ svn log --stop-on-copy http://my.svn.com/branches/featurex&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Cojamos ahora, la revisión del último mensaje de log y llamémosla XX.&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ svn merge -rXX:YY http://my.svn.com/branches/featurex
$ svn ci -m &amp;quot;Merge branch featurex into trunk [XX:YY]&amp;quot;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;3. Un poco de limpieza (opcional)&lt;/h4&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;$ svn delete http://my.svn.com/branches/featurex \
             -m &amp;quot;Removed featurex branch&amp;quot;&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,2011-10-19:6220</id>
    <published>2011-10-19T15:02:00Z</published>
    <updated>2011-10-19T15:05:42Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/10/19/pry-buffers-1-0-0" rel="alternate" type="text/html"/>
    <title>pry-buffers 1.0.0</title>
<content type="html">
            &lt;p&gt;Ayer, mientras Fuco y yo depurabamos una aplicación utilizando esa pequeña maravilla que es &lt;a href=&quot;http://pry.github.com&quot;&gt;Pry&lt;/a&gt;, sentimos la necesidad de evaluar varios fragmentos de código. Para esto, Pry proporciona el comando &#8220;edit&#8221; que ofrece dos posibilidades: 1) utilizar fichero temporal (la opción -t) , o 2) indicar una ruta donde leer/escribir un fichero. En el primer caso no podemos reutilizar el contenido del fichero por lo que más nos vale no equivocarnos al teclear, y en el segundo nos vemos obligados a indicar dónde guardar los ficheros, lo que es tedioso si sólo pretendemos hacer algo temporal. No pasa nada,  pry-buffers al rescate.&lt;/p&gt;


	&lt;p&gt;Con pry-buffers lo que queremos es juntar lo mejor de 1) y 2), permitiendo manejar buffers persistentes. Veamos cómo es una sesión pry con pry-buffers.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;pry(main)&amp;gt; buf
    ...  Aquí un rato con el vim (o con lo que uséis)...
This is de default buffer
pry(main)&amp;gt; buf -l
Available buffers: default
pry(main)&amp;gt; buf -s default
puts &amp;quot;This is the default buffer&amp;quot;
pry(main)&amp;gt; buf test
    ...  Aquí otro rato más con el vim...
This is a test 2
pry(main)&amp;gt; buf -s test
Buffer test contents:
puts &amp;quot;This is a test #{1 + 1}&amp;quot;
pry(main)&amp;gt; buf -l
Available buffers: default, test
pry(main)&amp;gt; buf -d test
Buffer test cleaned&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;En resumen, podéis usar y gestionar tantos buffers como queráis y estos serán persistentes entre comandos (y entre sesiones Pry).&lt;/p&gt;


	&lt;p&gt;Para lograrlo hemos uttilizado el mecanismo de extensión de Pry, que permite definir nuevos comandos a través del fichero de configuración de pry ($HOME/.pryrc) o mediante plugins (como pry-doc o pry-remote). Nosotros hemos optado por la segunda opción.  Si os apetece probarlo instalad la gema&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;gem install pry-buffers&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Y si tenéis curiosidad, el &lt;a href=&quot;https://github.com/davidbarral/pry-buffers&quot;&gt;código fuente está en github&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Esta es una gema para uso interno (vamos, para que Fuco sea feliz) pero esperamos que os resulte útil a alguno.&lt;/p&gt;


	&lt;p&gt;Happy Prying!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-10-12:6218</id>
    <published>2011-10-12T19:16:00Z</published>
    <updated>2011-10-17T12:05:36Z</updated>
    <category term="Tecnolog&#237;a"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/10/12/tunnelblick-y-m-ltiples-push-dhcp-option-domain" rel="alternate" type="text/html"/>
    <title>Tunnelblick y m&#250;ltiples push dhcp-option DOMAIN</title>
<content type="html">
            &lt;p&gt;Para el que no lo conozca, &lt;a href=&quot;http://code.google.com/p/tunnelblick&quot;&gt;Tunnelblick&lt;/a&gt; es un &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt; gratuito y open-source que permite controlar OpenVPN en Mac &lt;span class=&quot;caps&quot;&gt;OS X&lt;/span&gt;, y que viene siendo lo que usamos los maqueros de Trabe en nuestras casas para conectarnos a la feliz &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt; de Trabe. Es un software muy interesante pero tiene un bug que impide tener múltiples dominios de búsqueda configurados.&lt;/p&gt;


	&lt;p&gt;Como no quiero resultar pesado, este post tiene dos versiones: la corta, que va al grano y da una solución, y la extendida que explica un poquillo las cosas para el que quiera entender el problema y la solución (TL;DR).&lt;/p&gt;


	&lt;h4&gt;La versión corta&lt;/h4&gt;


	&lt;p&gt;Si vuestra &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt; publica varios dominios de búsqueda Tunnelblick sólo se va a quedar con él último dominio (un fallo conocido y documentado: issue 144). Para solucionarlo sólo es necesario explorar los contenidos de la aplicación Tunnelblick.app (versión 3.2beta32) y modificar el contenido del fichero client.3.up.tunnelblick.sh (en Contents/Resources/) con el script que os dejo en este &lt;a href=&quot;https://gist.github.com/1282101&quot;&gt;gist&lt;/a&gt; (el diff por un lado y el script completo por otro). Configurais la &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt; para usar el método de establecimiento de &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; &#8220;Asignar servidores de nombre (alternativa 1)&#8221; (en inglés &#8220;Set nameserver (alternate 1)&#8221;) y listo.&lt;/p&gt;


	&lt;h4&gt;La versión extendida (con explicaciones y todo eso)&lt;/h4&gt;


	&lt;p&gt;En Trabe tenemos un &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; interno y varios dominios de búsqueda y los resolv.conf de nuestras máquinas se parecen a esto:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;search pizza.it moussaka.gr tortilla.es
nameserver 192.168.1.10&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;La &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt; está configurada para que envíe esta información a los clientes, utilizando directivas push en la configuración del servidor OpenVPN:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;push &amp;quot;dhcp-option DNS 192.168.1.10&amp;quot;
push &amp;quot;dhcp-option DOMAIN pizza.it&amp;quot;
push &amp;quot;dhcp-option DOMAIN moussaka.gr&amp;quot;
push &amp;quot;dhcp-option DOMAIN tortilla.es&amp;quot;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Tunnelblick tiene un modo de funcionamiento que teóricamente detecta esta información y modifica el resolv.conf de la máquina cliente de manera adecuada (&#8220;Asignar servidores de nombre (alternativa 1)&#8221;  en castellano y &#8220;Set nameserver (alternate 1)&#8221; en inglés). Por desgracia no funciona correctamente y sólo tiene en cuenta la última entrada, es decir, que nuestro resolv.conf una vez conectados queda así:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;search tortilla.es
nameserver 192.168.1.10&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;El problema está en el script que detecta estas opciones y le indica al cliente que modifique su configuración. La cosa comienza a torcerse en la línea 105 del script client.3.up.tunnelblick.sh:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;while vForOptions=foreign_option_$nOptionIndex; [ -n &amp;quot;${!vForOptions}&amp;quot; ]; do
  {
  vOptions[nOptionIndex-1]=${!vForOptions}
  case ${vOptions[nOptionIndex-1]} in
    *DOMAIN* )
      domain=&amp;quot;$(trim &amp;quot;${vOptions[nOptionIndex-1]//dhcp-option DOMAIN /}&amp;quot;)&amp;quot;
      ;;
    *DNS*    )
      vDNS[nNameServerIndex-1]=&amp;quot;$(trim &amp;quot;${vOptions[nOptionIndex-1]//dhcp-option DNS /}&amp;quot;)&amp;quot;
      let nNameServerIndex++
      ;;
    *WINS*    )
      vWINS[nWINSServerIndex-1]=&amp;quot;$(trim &amp;quot;${vOptions[nOptionIndex-1]//dhcp-option WINS /}&amp;quot;)&amp;quot;
      let nWINSServerIndex++
      ;;
  esac
  let nOptionIndex++
  }
done &lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;La opción &lt;span class=&quot;caps&quot;&gt;DOMAIN&lt;/span&gt; se trata como un campo univaluado y hay que modificar el script para tratarlo como multivaluado, al igual que se hace con el campo &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt;.  En este &lt;a href=&quot;https://gist.github.com/1282101&quot;&gt;gist&lt;/a&gt; podéis encontrar el script modificado. Para ponerlo a funcionar os remito a la versión corta del post ;).&lt;/p&gt;


	&lt;p&gt;Ya hemos notificado todo esto a la gente que hace Tunnelblick y esperamos que lo tengan en cuenta para próximas releases y evitar tener que andar parcheando la aplicación.&lt;/p&gt;


	&lt;p&gt;Happy VPNing!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-10-12:6217</id>
    <published>2011-10-12T18:10:00Z</published>
    <updated>2011-10-12T19:28:24Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/10/12/sugarfreeconfig-2-0-0" rel="alternate" type="text/html"/>
    <title>SugarfreeConfig 2.0.0</title>
<content type="html">
            &lt;p&gt;La semana pasada publicamos la versión 2.0.0 de &lt;a href=&quot;https://github.com/davidbarral/sugarfree-config&quot;&gt;SugarfreeConfig&lt;/a&gt;, nuestra pequeña gema para acceder de manera sexy a valores de configuración almacenados en un fichero &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Coincidiendo con el arranque de un par de proyectos Rails 3.1 hemos aprovechado para actualizar la gema: hemos modificado levemente el &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; para hacer SugarfreeConfig un poco más configurable y que se pueda usar fuera de Rails (eliminado la dependencia con ActiveSupport) y hemos cubierto todo el código con tests (utilizando specs de &lt;a href=&quot;https://github.com/seattlerb/minitest&quot;&gt;MiniTest&lt;/a&gt; para comparar su uso con &lt;a href=&quot;https://www.relishapp.com/rspec&quot;&gt;RSpec&lt;/a&gt;, pero esa es otra historia).&lt;/p&gt;


	&lt;p&gt;Más detalles acerca de SugarfreeConfig en github: &lt;a href=&quot;https://github.com/davidbarral/sugarfree-config&quot;&gt;https://github.com/davidbarral/sugarfree-config&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>asis</name>
    </author>
    <id>tag:4trabes.com,2011-09-22:6215</id>
    <published>2011-09-22T11:51:00Z</published>
    <updated>2011-10-12T18:11:17Z</updated>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2011/9/22/rails-3-1-algunas-impresiones-y-un-temazo" rel="alternate" type="text/html"/>
    <title>Rails 3.1: algunas impresiones y un temazo</title>
<content type="html">
            &lt;p&gt;Durante este verano hemos estado desarrollando una aplicación con Rails 3.1
para uno de nuestros clientes.&lt;/p&gt;


	&lt;p&gt;La nueva versión de Rails (y aquí me refiero a Rails 3.x) es un
&lt;a href=&quot;http://www.youtube.com/watch?v=WosrUnjb2UQ&amp;amp;feature=youtu.be&amp;amp;t=1m&quot;&gt;melocotonazo de miedo&lt;/a&gt;.&lt;/p&gt;


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

&lt;/div&gt;
&lt;br /&gt;

	&lt;p&gt;A nivel interno, las &#8220;tripas&#8221; de Rails han cambiado para mucho mejor y a nivel
externo las mejoras se dejan notar en todas las partes del framework. En
concreto, tras la experiencia de estos pasados meses, nosotros nos quedamos con
esto:&lt;/p&gt;


	&lt;h4&gt;Lo bueno&lt;/h4&gt;


	&lt;h5&gt;Bundler&lt;/h5&gt;


	&lt;p&gt;Rails 3 y &lt;a href=&quot;http://gembundler.com/&quot;&gt;Bundler&lt;/a&gt; se integran tan bien que pensar en
cómo desarrollábamos antes, cuando no había &lt;em&gt;Gemfile&lt;/em&gt;, me da escalofríos. Con
Bundler, la gestión de dependencias &lt;em&gt;es chicle&lt;/em&gt; para cualquiera :).&lt;/p&gt;


	&lt;h5&gt;Routing&lt;/h5&gt;


	&lt;p&gt;El nuevo &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt; para la definición de las rutas de la aplicación es mucho más
directo y sencillo de utilizar. En concreto, la sintaxis &lt;em&gt;controlador#acción&lt;/em&gt;,
que permite decir cosas como:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt; match &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sessions#new&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;h5&gt;ActiveRecord Query Interface&lt;/h5&gt;


	&lt;p&gt;El &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; para consultas del &#8220;nuevo&#8221; ActiveRecord (básicamente,
&lt;a href=&quot;https://github.com/rails/arel&quot;&gt;Arel&lt;/a&gt;) simplifica muchísimo el trabajo a la hora
de escribir y utilizar los modelos de la aplicación. Cambiamos los hashes con
miles de parámetros por el encadenamiento de métodos (y esto nos permite
refactorizar el código de acceso a datos de una manera mucho más natural,
¡claro!).&lt;/p&gt;


	&lt;h5&gt;ActiveModel&lt;/h5&gt;


	&lt;p&gt;Gracias al esfuerzo de modularización llevado a cabo en Rails 3, extender el
framework con nuestro propio código (y hacerlo sin recurrir a trucos oscuros)
es &lt;a href=&quot;http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/&quot;&gt;casi trivial&lt;/a&gt;.
En el caso de ActiveModel, proporciona mecanismos para disponer de todas las
ventajas de los modelos Rails en nuestras clases: validación,
internacionalización, &lt;em&gt;callbacks&lt;/em&gt;, integración con los &lt;em&gt;helpers&lt;/em&gt; de generación
de formularios, etc.&lt;/p&gt;


	&lt;h5&gt;Asset Pipeline&lt;/h5&gt;


	&lt;p&gt;La &lt;a href=&quot;http://guides.rubyonrails.org/asset_pipeline.html&quot;&gt;joya de la corona&lt;/a&gt; de la
versión 3.1.  Como en el caso de ActiveRecord y Arel, aquí los cambios se
pueden resumir en la adopción de
&lt;a href=&quot;https://github.com/sstephenson/sprockets&quot;&gt;Sprockets&lt;/a&gt; para la gestión de los
&lt;em&gt;assets&lt;/em&gt; de la aplicación. Además, el &lt;em&gt;asset pipeline&lt;/em&gt; ha llegado acompañado de
una decisión polémica: apostar por
&lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;CoffeeScript&lt;/a&gt; como solución &#8220;por
defecto&#8221; para escribir Javascript (sin escribirlo, claro); y de otra no tan
polémica: &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt; para escribir &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;En general, la impresión es muy positiva: &lt;strong&gt;CoffeeScript&lt;/strong&gt; es mucho más compacto
que Javascript y es realmente sencillo de usar (aunque creo que es muy
interesante tener un &lt;em&gt;background&lt;/em&gt; más o menos amplio en cuanto a Javascript,
principalmente cuando llega el momento de depurar el código generado :P). No es
un cambio que me parezca fundamental y escribir Javascript no me parece
&#8220;peor&#8221;...  pero el hecho es que hemos utilizado CoffeeScript :D&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Sass&lt;/strong&gt; (o &lt;a href=&quot;http://lesscss.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;LESS&lt;/span&gt;&lt;/a&gt;), por contra, no ofrece discusión.
Escribir CSSs &#8220;a pelo&#8221; es tan desesperante que la mínima mejora es bienvenida.
Y en el caso de este tipo de &#8220;extensiones&#8221; a las &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, las mejoras son tantas y
de tanto calado (reglas anidadas, &lt;em&gt;mixin&lt;/em&gt; de estilos, variables, operadores,
funciones, bucles, etc.) que uno lo tiene claro: jamás volveré a escribir CSSs
&#8220;a pelo&#8221; si puedo evitarlo.&lt;/p&gt;


	&lt;h5&gt;jQuery&lt;/h5&gt;


	&lt;p&gt;Adiós &lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;Prototype&lt;/a&gt;, hola
&lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;. Arrastrados por las anteriores versiones de Rails,
siempre habíamos sido más &#8220;prototyperos&#8221;. Y ahora, arrastrados de nuevo por
Rails, estamos reconvirtiéndonos y adaptándonos a jQuery. Y la verdad es que la
experiencia, dejando a un lado los primeros &amp;mdash; y tambaleantes &amp;mdash;
pasos, ha sido muy positiva. Es posible que se deba a haber adquirido un mayor
y más profundo conocimiento del lenguaje (Javascript, me refiero) y no sea solo
cuestión del cambio de &lt;em&gt;framework&lt;/em&gt;, pero la sensación que me queda es que el
&#8220;estilo jQuery&#8221; está más directamente ligado al Javascript que el &#8220;estilo
Prototype&#8221;. Lo dicho, impresiones mías.&lt;/p&gt;


	&lt;h5&gt;ActiveSupport&lt;/h5&gt;


	&lt;p&gt;Hay mucho más en
&lt;a href=&quot;http://guides.rubyonrails.org/active_support_core_extensions.html&quot;&gt;ActiveSupport&lt;/a&gt;,
pero sólo voy a mencionar una cosa. Ahora se puede decir:&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;.in? [&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;] &lt;span class=&quot;c&quot;&gt;#=&amp;gt; true&lt;/span&gt;
&lt;span class=&quot;i&quot;&gt;4&lt;/span&gt;.in? [&lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;3&lt;/span&gt;] &lt;span class=&quot;c&quot;&gt;#=&amp;gt; false&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


	&lt;p&gt;Y esto hacía falta :D&lt;/p&gt;


	&lt;h4&gt;Lo no tan bueno&lt;/h4&gt;


	&lt;p&gt;El &lt;em&gt;asset pipeline&lt;/em&gt;, con todas sus ventajas, también trae de la mano algunos
inconvenientes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;A la hora de desplegar en producción hay que ser especialmente cuidadoso con
  la configuración y con las referencias &lt;em&gt;interassets&lt;/em&gt; (por ejemplo, las
  imágenes en las hojas de estilos). Hay nuevos &lt;em&gt;helpers&lt;/em&gt; para ayudar con esto,
  así que no es para tanto.&lt;/li&gt;
		&lt;li&gt;En desarrollo todo funciona un poco más lento por la necesidad de compilar
  los &lt;em&gt;coffeescripts&lt;/em&gt; y los &lt;em&gt;scss&lt;/em&gt;. No es una barbaridad, pero a veces se nota.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Y poco más en este apartado :D&lt;/p&gt;


	&lt;h4&gt;En resumen&lt;/h4&gt;


	&lt;p&gt;Lo dicho: un &lt;a href=&quot;http://www.youtube.com/watch?v=WosrUnjb2UQ&amp;amp;feature=youtu.be&amp;amp;t=1m&quot;&gt;melocotonazo de miedo&lt;/a&gt;.&lt;/p&gt;


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

&lt;/div&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-08-30:6212</id>
    <published>2011-08-30T10:42:00Z</published>
    <updated>2011-08-30T15:33:25Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/8/30/see-you-soon-victor" rel="alternate" type="text/html"/>
    <title>See you soon Victor</title>
<content type="html">
            &lt;p&gt;El tiempo vuela y ya han pasado los dos meses que duraban &lt;a href=&quot;http://4trabes.com/2011/7/4/welcome-v-ctor&quot;&gt;las prácticas de Victor en Trabe&lt;/a&gt;. Hoy ha tocado despedirse, aunque no es un adiós, es un hasta luego. Nos ha encantado tenerlo en Trabe, aunque sólo fuesen dos meses escasos. Gran informático y gran persona, ya es uno más de nuestra pequeña familia.&lt;/p&gt;


	&lt;p&gt;Esperemos que en el futuro nuestros caminos vuelvan a juntarse. Hasta entonces: ¡Suerte con todo!. Nos vemos.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>admin</name>
    </author>
    <id>tag:4trabes.com,2011-08-16:6210</id>
    <published>2011-08-16T12:11:00Z</published>
    <updated>2011-08-16T12:40:07Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/8/16/farewell-lucas" rel="alternate" type="text/html"/>
    <title>Farewell Lucas</title>
<content type="html">
            &lt;p&gt;El viernes pasado nuestro querido Lucas se despidió de Trabe con el siguiente tweet:&lt;/p&gt;


	&lt;p&gt;&lt;cite&gt;
1 &lt;span class=&quot;caps&quot;&gt;PFC&lt;/span&gt;, 3 años, 687 bollos, 5496 horas y 8mil risas después: hoy cierro el mejor período de mi vida en @trabe y comienza mi viaje. Ojalá se repita
&lt;/cite&gt;&lt;/p&gt;


	&lt;p&gt;Nosotros teníamos que despedirnos de él con un post que he estado posponiendo 
porque no encontraba las palabras adecuadas para decirle &#8220;hasta luego&#8221; a este pedazo de ser humano. Después de 
una épica fiesta de despedida y una resaca descomunal sigo sin encontrarlas. No voy a intentarlo. Lucas, sólo te diré que
te queremos un montón, que te echaremos mucho de menos y que esta es tu casa y siempre lo será. Graciñas por todo.&lt;/p&gt;


	&lt;p&gt;Disfruta de tu nueva aventura transoceánica y envíanos muchas postales :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-07-18:6207</id>
    <published>2011-07-18T08:28:00Z</published>
    <updated>2011-07-18T08:28:47Z</updated>
    <category term="Java"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/7/18/thymeleaf-1-0-0" rel="alternate" type="text/html"/>
    <title>Thymeleaf 1.0.0</title>
<content type="html">
            &lt;p&gt;Ayer nuestro amigo Dani publicó la primera versión estable de &lt;a href=&quot;http://www.thymeleaf.org/&quot;&gt;Thymeleaf&lt;/a&gt; (la 1.0.0), un motor de plantillas &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;, xHTML y &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; que pretende ser una alternativa a &lt;span class=&quot;caps&quot;&gt;JSP&lt;/span&gt; + &lt;span class=&quot;caps&quot;&gt;JSTL&lt;/span&gt; (o a otras cosas, como puede ser Velocity), y que, además, dispone de un módulo de integración con Spring &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; &#8220;out of the box&#8221;.&lt;/p&gt;


	&lt;p&gt;En Trabe estamos realizando algunos proyectos con Spring &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; y Thymeleaf como motor de plantilas y de momento las sensaciones son buenas. A ver si la gente que está directamente involucrada en estos proyectos se anima a hacer un post introductorio (venga, vamos, a qué estáis esperando).&lt;/p&gt;


	&lt;p&gt;Os invito a que le echéis un ojo al proyecto, a que lo probéis y que, si os interesa, colaboréis con Dani enviando parches, escribiendo tutoriales, etc. Y para terminar, y como curiosidad, deciros que Dani también es el padre de &lt;a href=&quot;http://www.jasypt.org/&quot;&gt;Jasypt&lt;/a&gt; una librería de encriptación que lleva tiempo dando guerra y que seguramente muchos de vosotros ya habréis usado.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-07-07:6206</id>
    <published>2011-07-07T13:08:00Z</published>
    <updated>2011-07-07T13:09:21Z</updated>
    <category term="Java"/>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/7/7/usando-un-keystore-con-play-versi-n-1-2-2" rel="alternate" type="text/html"/>
    <title>Usando un keystore con Play, versi&#243;n 1.2.2</title>
<content type="html">
            &lt;p&gt;Hace un tiempo, cuando empecé a trastear con &lt;a href=&quot;http://www.playframework.org&quot;&gt;Play&lt;/a&gt;, tuve que &lt;a href=&quot;http://4trabes.com/2010/7/27/usando-un-keystore-con-play&quot;&gt;modificar el script de arranque de Play para poder utilizar un keystore de Java&lt;/a&gt;. Dicha solución era valida para las versiones 1.0.x del framework. En versiones posteriores (de la 1.1 a la actual 1.2.2) los señores que hacen Play han dividido y ordenado el código del script de arranque. Para que todo vuelva a funcionar sólo tenemos que editar el fichero &lt;code&gt;${PLAY_HOME}/framework/pym/play/application.py&lt;/code&gt; y en la línea 251 (por ejemplo) pegar el siguiente código (fijaos en la sutil diferencia con la versión anterior, un par de selfs).&lt;/p&gt;


&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;trustStore = &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.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 = &lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.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;&lt;strong&gt;Ojo a los espacios, que esto es Python ;)&lt;/strong&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-07-04:6203</id>
    <published>2011-07-04T11:01:00Z</published>
    <updated>2011-07-04T11:11:49Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/7/4/welcome-v-ctor" rel="alternate" type="text/html"/>
    <title>Welcome V&#237;ctor</title>
<content type="html">
            &lt;p&gt;Si la semana pasada dabamos la &lt;a href=&quot;http://4trabes.com/2011/7/1/welcome-fuco&quot;&gt;bienvenida a Fuco&lt;/a&gt;, hoy toca dársela a  &lt;a href=&quot;http://twitter.com/vicpenap&quot;&gt;Víctor&lt;/a&gt;, que va a estar de prácticas con nosotros este verano. Víctor es uno de los papás de &lt;a href=&quot;http://www.filloadev.com/otempo&quot;&gt;O tempo&lt;/a&gt;, una aplicación para iOS que un servidor viene usando desde hace una temporada. Como curiosidad os diré que Víctor es hermano de &lt;a href=&quot;http://twitter.com/spenap&quot;&gt;Simón&lt;/a&gt;, al que Asís y yo dimos clase en el Master de Software Libre y al que, además, &lt;a href=&quot;http://4trabes.com/2010/7/27/usando-un-keystore-con-play&quot;&gt;dedicamos un post en este blog&lt;/a&gt;. ¡Qué pequeño es el mundo!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2011-07-01:6200</id>
    <published>2011-07-01T06:32:00Z</published>
    <updated>2011-07-01T06:34:24Z</updated>
    <category term="Trabe"/>
    <category term="es"/>
    <link href="http://4trabes.com/2011/7/1/welcome-fuco" rel="alternate" type="text/html"/>
    <title>Welcome Fuco</title>
<content type="html">
            &lt;p&gt;Hoy volvemos a ser siete en Trabe. &lt;a href=&quot;http://blog.tenako.com/&quot;&gt;Fuco&lt;/a&gt;, que estuvo haciendo su proyecto de fin de carrera con nosotros hace algo más de un año, se convierte en nuestro fichaje estrella del verano. Llevábamos mucho tiempo fantaseando con su llegada y por fin lo hemos conseguido.&lt;/p&gt;


	&lt;p&gt;¡Welcome fiera!, esperamos que disfrutes de la Trabe aventura.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>marcos</name>
    </author>
    <id>tag:4trabes.com,2011-06-29:6199</id>
    <published>2011-06-29T09:12:00Z</published>
    <updated>2011-06-29T09:15:03Z</updated>
    <category term="Tecnolog&#237;a"/>
    <link href="http://4trabes.com/2011/6/29/post-instalaci-n-de-oracle-xe-10-en-ubuntu-server" rel="alternate" type="text/html"/>
    <title>Post instalaci&#243;n de Oracle XE 10 en Ubuntu Server</title>
<content type="html">
            &lt;p&gt;
Hace un par de años (como pasa el tiempo), escribí este &lt;a href=&quot;http://4trabes.com/2008/12/18/instalar-oracle-xe-en-ubuntu-8-04-lts-de-64-bits&quot;&gt;pequeño paso a paso sobre como hacer que oracle XE 10 funcione en ubuntu server de 64 bits&lt;/a&gt;. Hoy me ha tocado instalar XE de nuevo, y los pasos descritos en el artículo me han ahorrado mucho más tiempo del que en su día me llevó escribirlo.
&lt;/p&gt;
&lt;p&gt;
Sin embargo, me he dado cuenta que una parte de las instrucciones, la correspondiente a &quot;ciertos procesos de post-instalación&quot;, sólo estaba en un wiki trabe-privado. Son pequeñas cosas, pero si no &quot;aciertas&quot;, puedes perder un montón de tiempo, con lo que las dejo apuntadas por aquí por si pudieran ayudar a alguien (quien sabe, quizás incluso ayuden a no perder tiempo al marcos del futuro).
&lt;/p&gt;

&lt;p&gt;
Una vez instalado y configurado Oracle, necesitaremos meter en el path el directorio bin de la distribución, para tener acceso a las herramientas oracleras. Para ello podemos añadir algo como esto a nuestro .bashrc:
&lt;/p&gt;

&lt;pre&gt;
export PATH=$PATH:/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/
&lt;/pre&gt;

&lt;p&gt;
También es necesario fijar la variable ORACLE_HOME. Mucho ojo, si ponéis un slash (/) al final de la cadena, tendréis problemas:
&lt;/p&gt;

&lt;pre&gt;
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
&lt;/pre&gt;

&lt;p&gt;
Si ahora intentamos lanzar sqlplus, muy probablemente obtendremos el siguiente error:
&lt;/p&gt;

&lt;pre&gt;
ORA-12162: TNS:net service name is incorrectly specified
&lt;/pre&gt;

&lt;p&gt;
Esta es la curiosa forma que tiene oracle de decirnos que tenemos que fijar la variable ORACLE_SID.  Editamos de nuevo nuestro .bashrc:
&lt;/p&gt;

&lt;pre&gt;
export ORACLE_SID=XE
&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;CUIDADO: &lt;/strong&gt; la XE ha de estar en mayúsculas. Si hacemos mal este paso, luego tendremos errores imposibles de descifrar y &lt;strong&gt;perderemos mucho tiempo&lt;/strong&gt;.
&lt;/p&gt;

&lt;p&gt;
Ahora que ya tenemos nuestras variables de entorno, sqlplus debería funcionar correctamente...pero no es así. Si intentamos ejecutarlo, tendremos un nuevo error:
&lt;/p&gt;

&lt;pre&gt;
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
&lt;/pre&gt;

&lt;p&gt;
Great, vamos avanzando, el error ahora ya es específico de nuestra plataforma. Tras algo de investigación y ensayo-error, llegamos a la solución a este problema:
&lt;/p&gt;

&lt;pre&gt;
chmod 6750 /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/tnslsnr 
&lt;/pre&gt;

&lt;p&gt;
Si, tal como lo leeis, problemas de permisos...increible pero cierto. Una vez cambiados los permisos, reiniciamos el servicio de oracle-xe y todo debería funcionar. 
&lt;/p&gt;
          </content>  </entry>
</feed>

