<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>4Trabes - De todo un poco</title>
  <id>tag:4trabes.com,2008:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</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>2008-07-06T09:54:56Z</updated>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-07-06:468</id>
    <published>2008-07-06T09:53:00Z</published>
    <updated>2008-07-06T09:54:56Z</updated>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2008/7/6/rails-2-1" rel="alternate" type="text/html"/>
    <title>Rails 2.1</title>
<content type="html">
            &lt;p&gt;Sobre &lt;a href=&quot;http://weblog.rubyonrails.org/2008/6/1/rails-2-1-time-zones-dirty-caching-gem-dependencies-caching-etc&quot;&gt;Rails 2.1&lt;/a&gt; sólo puedo decir que es &lt;strong&gt;más de lo mismo, pero mejor&lt;/strong&gt;. Podéis comprobarlo leyendo el &lt;a href=&quot;http://www.nomedojogo.com/2008/06/09/new-free-book-ruby-on-rails-21-whats-new/&quot;&gt;libro gratuíto&lt;/a&gt; que el amigo &lt;a href=&quot;http://www.nomedojogo.com/&quot;&gt;Carlos Brando&lt;/a&gt; ha tenido a bien publicar y que recopila todas las novedades de esta versión.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>marcos</name>
    </author>
    <id>tag:4trabes.com,2008-07-05:467</id>
    <published>2008-07-05T16:32:00Z</published>
    <updated>2008-07-05T16:33:35Z</updated>
    <category term="Tecnolog&#237;a"/>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/7/5/instalar-ubuntu-sin-cds-dvds-ni-dispositivos-usb-utilizando-&#250;nicamente-la-red-pxe" rel="alternate" type="text/html"/>
    <title>Instalar Ubuntu sin CDs, DVDs ni dispositivos USB utilizando &#250;nicamente la red (PXE)</title>
<content type="html">
            &lt;p&gt;
El título ha quedado un poco largo, pero eso es exactamente lo que acabo de hacer hace un rato, y como me parece algo interesante, voy a explicar brevemente cómo conseguirlo.
&lt;/p&gt;
&lt;p&gt;
La base del proceso es &lt;a href=&quot;http://en.wikipedia.org/wiki/Preboot_Execution_Environment&quot;&gt;PXE&lt;/a&gt;, que para definirlo en pocas palabras viene a ser un &quot;modo de arrancar un ordenador&quot; utilizando para ello únicamente el interfáz de red. Como podéis ver en el enlace a la wikipedia, PXE es básicamente una mezcla de DHCP y TFTP.
&lt;/p&gt;
&lt;h3&gt; Paso 1: el ordenador ha de ser capaz de &lt;em&gt;arrancar desde la red&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;
Para poder instalar nuestro sistema utilizando esta tática, es necesario que éste sea capaz de hacer el boot desde un dispositivo de red. La mayoría de los PCs  soportan esta característica, por lo que no debería de ser un requisito difícil de satisfacer. Una vez que nos aseguremos de que el PC  &quot;sabe arrancar desde la red&quot;, ya solo nos falta instalar un servidor que le responda adecuadamente a sus peticiones.
&lt;/p&gt;

&lt;h3&gt; Paso 2: instalar el servidor&lt;/h3&gt;
&lt;p&gt;
En este caso, el ordenador que va a servir los ficheros de arranque es un humilde PC con windows ya instalado, por lo que la herramienta que utilizaremos es &lt;a href=&quot;http://tftpd32.jounin.net&quot;&gt;TFTPD32&lt;/a&gt;. Esta herramienta es una de esas pequeñas joyas que a cambio de muy pocos KB son capaces de hacer un montón de cosas, como podéis observar en la página del autor.
&lt;/p&gt;
&lt;p&gt;
Una vez descargado el programa, ponerlo a funcionar es tan simple como crear una carpeta, digamos que c:\tftp y copiar en ella el fichero tftpd32.exe. Lo ejecutamos y ya tenemos el servidor andando. Así de fácil.
&lt;/p&gt;
&lt;h3&gt;Paso 3: descargarse la imagen de ubuntu &lt;em&gt;peparada para estas labores&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;
El siguiente paso será descargarse la imagen de ubuntu lista para ser servida utilizando PXE. Para conseguir este objetivo tendremos que descargarnos la carpeta &lt;strong&gt;ubuntu-installer&lt;/strong&gt; que podremos encontrar en el respositorio de ubuntu. En mi caso particular, esta carpeta podía descargarse de:
&lt;/p&gt;
&lt;pre&gt;
ftp://archive.ubuntu.com/ubuntu/dists/hardy/main/installer-i386/current/images
&lt;/pre&gt;

&lt;h3&gt;Paso 4: configurar el servidor&lt;/h3&gt;
&lt;p&gt;
Una vez descargada esta carpeta, deberemos de copiarla en c:\tftp. Además, debemos de asegurarnos de:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;copiar a c:\tftp la carpeta pxelinux.cfg desde ubuntu-installer/i386/&lt;/li&gt;
&lt;li&gt;copiar a c:\tftp el fichero pxelinux.0 desde ubuntu-installer/i386/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Ahora ya podemos configurar el tftpd32. En la pestaña DHCP, deberemos poner 'pxelinux.0' en el campo boot file y deberemos rellenar el resto de valores ajustándose a la realidad de nuestra red. Es importante que el valor del campo 'IP pool starting address' sea una IP válida en nuestra red y que se refiera a un rango de IPs no utilizado en la misma. Una vez cubiertos todos los campos, pulsamos save y ya tenemos nuestro servidor configurado. Así de fácil,
&lt;/p&gt;
&lt;h3&gt;Paso 5: arrancar el pc que queremos instalar&lt;/h3&gt;
&lt;p&gt;
Con nuestro servidor perfectamente configurado, ya podemos arrancar el pc en el que queremos instalar ubuntu. Si todo va bien y los cables están bien enchufados, podremos ver que comienzan a aparecer entradas en la pestaña 'Log viewer' de tftpd32. Se establece la comunicación entre el PC que arranca utilizando PXE y nuestro servidor. Al cabo de unos instantes,  el PC que está tratando de arrancar acaba recibiendo por TFTP la imagen de instalación basada en red de ubuntu. A partir de ahi sólo nos queda continuar con una instalación basada en red de lo más normal, (lenta),  y aburrida.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-06-23:459</id>
    <published>2008-06-23T09:33:00Z</published>
    <updated>2008-06-23T09:36:05Z</updated>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2008/6/23/vulnerabilidades-en-ruby" rel="alternate" type="text/html"/>
    <title>Vulnerabilidades en Ruby</title>
<content type="html">
            &lt;p&gt;Hoy iba a escribir sobre &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt;  2.1, pero lo voy a posponer ya que parece ser que hay una serie de &lt;a href=&quot;http://weblog.rubyonrails.com/2008/6/21/multiple-ruby-security-vulnerabilities&quot;&gt;vulnerabiliades en la MV de Ruby&lt;/a&gt; y eso es una noticia más importante. Dicen que es buena idea actualizar la versión de Ruby&#8230; más adelante. Se ve que con las prisas es peor el remedio que la enferemedad, quiero decir la actualización que el riesgo de ataque. El personal se está quejando de errores extraños. A ver cuando tardan en sacar un nuevo parche que no tire abajo las aplicaciones Rails. ¿Habrán parcheado ya la versión &lt;a href=&quot;http://www.rubyenterpriseedition.com&quot;&gt;enterprise&lt;/a&gt;?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-06-19:453</id>
    <published>2008-06-19T12:35:00Z</published>
    <updated>2008-06-24T14:09:11Z</updated>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/6/19/en-busca-de-la-felicidad" rel="alternate" type="text/html"/>
    <title>En busca de la felicidad...</title>
<content type="html">
            &lt;p&gt;Hay quien la busca con la &lt;a href=&quot;http://www.37signals.com/svn/posts/893-workplace-experiments&quot;&gt;semana de 4 días&lt;/a&gt;. A nosotros, aunque no nos disgusta la idea, nos es imposible aplicarla. Hoy hemos dado un paso más en la búsqueda de la felicidad&#8230; a nuestra manera: ahora en &lt;a href=&quot;https://www.trabesoluciones.com&quot;&gt;Trabe&lt;/a&gt; trabajamos en zapatillas. Como en casa. Cómodos.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-06-15:451</id>
    <published>2008-06-15T21:24:00Z</published>
    <updated>2008-06-18T20:43:48Z</updated>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/6/15/ya-somos-seis" rel="alternate" type="text/html"/>
    <title>Ya somos seis</title>
<content type="html">
            &lt;p&gt;Primero fueron las 4 trabes: Asís, Marcos, Óscar y un &lt;a href=&quot;http://www.davidbarral.com&quot;&gt;servidor&lt;/a&gt;. Luego llegó Alejandro (Alejo para los amigos) en noviembre del año pasado. Ahora le toca el turno a &lt;a href=&quot;http://adrian.otero.ws/blog&quot;&gt;Adrián&lt;/a&gt;, que se ha incorporado a la pequeña familia de Trabe el miércoles pasado tras responder a nuestra &lt;a href=&quot;http://4trabes.com/2008/4/12/%C2%BFquieres-trabajar-en-trabe-soluciones&quot;&gt;oferta de trabajo&lt;/a&gt;. Esperamos aprender mucho de él y que él aprenda mucho con nosotros, pero sobre todo, esperamos que se lo pase bien trabajando en &lt;a href=&quot;https://www.trabesoluciones.com&quot;&gt;Trabe&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-06-12:449</id>
    <published>2008-06-12T08:05:00Z</published>
    <updated>2008-06-12T08:06:35Z</updated>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/6/12/4trabes-historias-de-una-empresa-en-100-m2" rel="alternate" type="text/html"/>
    <title>4Trabes: historias de una empresa en 100 m2</title>
<content type="html">
            &lt;p&gt;Como ya os conté hace poco, &lt;a href=&quot;http://4trabes.com/2008/5/30/nos-mudamos-al-fin&quot;&gt;nos hemos mudado&lt;/a&gt;. Para celebrar la amplitud de nuestras nuevas instalaciones (100 metros cuadrados, ¡que lujo!) hemos decidido rebautizar el blog. Adios a 4Trabes: historias de una start-up en 20 m&lt;sup&gt;2&lt;/sup&gt;; bienvenido 4Trabes: historias de una empresa en 100 m&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;


	&lt;p&gt;Espero que este post, además,  valga para reactivar un poco el blog, que estaba algo abandonado con el lío de la mudanza&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-05-30:447</id>
    <published>2008-05-30T08:09:00Z</published>
    <updated>2008-05-30T08:10:09Z</updated>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/5/30/nos-mudamos-al-fin" rel="alternate" type="text/html"/>
    <title>Nos mudamos... al fin</title>
<content type="html">
            &lt;p&gt;Tras muchos avatares &lt;a href=&quot;http://www.trabesoluciones.com&quot;&gt;Trabe Soluciones&lt;/a&gt; se traslada a una &#8220;renovada&#8221; oficina en el centro de Coruña. Han pasado muchas cosas desde que colgamos de este blog &lt;a href=&quot;http://4trabes.com/2008/3/17/nos-mudamos-o-en-esas-estamos&quot;&gt;nuestro bocetillo de la nueva oficina&lt;/a&gt;: Negociaciones, pintura, suelos, electricidad, telefonía, datos, un viaje relampago a Ikea, cajas para un lado, cajas para otro, llaves allen y destornilladores&#8230; una locura. Hoy por fin nos mudamos. A partir del lunes nuestra dirección cambia y es la siguiente:&lt;/p&gt;


	&lt;p&gt;&lt;cite&gt;
Trabe Soluciones S.L.
&lt;br /&gt;
Arzobispo Lago 4-6 1ºIzq
&lt;br /&gt;
15004 A Coruña
&lt;br /&gt;
tfno: 981.91.41.91
&lt;/cite&gt;&lt;/p&gt;


	&lt;p&gt;Cuando terminemos con los detalles ya colgaremos unas fotillos para que se vea el resultado de nuestros esfuerzos.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Lamentamos la ausencia de posts en el blog esta temporada pero la mudanza ha consumido todo el tiempo libre que nos han dejado nuestros clientes.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>marcos</name>
    </author>
    <id>tag:4trabes.com,2008-05-13:444</id>
    <published>2008-05-13T17:44:00Z</published>
    <updated>2008-05-13T23:11:58Z</updated>
    <link href="http://4trabes.com/2008/5/13/apache-dice-13-permission-denied-proxy-http-attempt-to-connect-to-127-0-0-1-8080-failed" rel="alternate" type="text/html"/>
    <title>Apache dice:  (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8080 (*) failed</title>
<content type="html">
            &lt;p&gt;
Hoy he sufrido un episodio de estos que llegan a exasperarte un poco.  Se trataba de crear una serie de virtualhosts para emular en un servidor local el comportamiento de un apache &quot;de producción&quot;. El servidor local tiene instalada una Fedora 7 y un apache &quot;limpio&quot;. 
&lt;/p&gt;
&lt;p&gt;
Entre otros cambios poco relevantes para este problema, introducimos un virtualhost que simplemente hace de proxy delegando las peticiones en otro servidor, algo parecido a:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;VirtualHost *:80&gt;
  ServerName midominio.com
  ServerAlias www.midominio.com
  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass /app/ http://abc.blabla.com:8080/path/
  ProxyPassReverse /app/ http://abc.blabla.com:8080/path/
  ProxyPass / http://abc.blabla.com:8080/path/
  ProxyPassReverse / http://abc.blabla.com:8080/path/
&amp;lt;/VirtualHost&gt;
&lt;/pre&gt;

&lt;p&gt;
Una vez realizados los cambios en el httpd.conf y reiniciado el servicio, comprobamos con gran dolor que el proxy no está funcionando correctamente, dándonos el siguiente error:
&lt;/p&gt;

&lt;pre&gt;
[error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8080 (*) failed
&lt;/pre&gt;

&lt;p&gt;
Tras comprobar que todos los permisos estaban bien, que ninguna directiva evitaba que todo funcionase, etc. Me decidí a buscar ayuda en google. Y la encontré. &lt;a href=&quot;http://www.dharwadkar.com/weblog/apache_fc6_01&quot;&gt;En este enlace&lt;/a&gt; podéis ver la solución con más detalle, pero el resumen es que SELinux está bloqueando la conexión, y debemos de configurarlo para evitar que esto ocurra. Debemos de marcar la opción &quot;Allow HTTPD scripts and modules to connect to the network&quot; en la pantalla de configuración de Firewall, como podéis ver en el enlace anterior.
&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-05-12:442</id>
    <published>2008-05-12T13:03:00Z</published>
    <updated>2008-05-12T13:07:17Z</updated>
    <link href="http://4trabes.com/2008/5/12/galicia-global-2-0-gallegos-conectados" rel="alternate" type="text/html"/>
    <title>Galicia Global 2.0: gallegos conectados</title>
<content type="html">
            &lt;p&gt;Como ya os &lt;a href=&quot;http://4trabes.com/2008/3/31/1000-galegos-globais-lo-celebramos-con-m%C3%A1s-galicia-global&quot;&gt;comenté&lt;/a&gt; hace tiempo hemos estado preparado una nueva versión de &lt;a href=&quot;http://www.galiciaglobal.com&quot;&gt;Galicia Global&lt;/a&gt; (algo así como una 2.0) para conmemorar la &lt;a href=&quot;http://www.maisinternetmaisgalego.org/&quot;&gt;edición 2008 del día de Internet y las letras gallegas&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Lo más destacable de este &#8220;upgrade&#8221; (que ya está en producción) es que ahora es posible definir amistades entre usuarios y crear redes entre ellos. Si ya os habíais registrado como gallegos globales podéis pasaros por la web a jugar un rato con las novedades, y si no lo habéis hecho ya, registraos ¿A qué estáis esperando?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-05-08:437</id>
    <published>2008-05-08T19:54:00Z</published>
    <updated>2008-05-08T19:54:53Z</updated>
    <link href="http://4trabes.com/2008/5/8/evitando-problemas-con-el-firebug-debug-y-m-l-a-console" rel="alternate" type="text/html"/>
    <title>Evitando problemas con el Firebug: debug y M.l.A. console</title>
<content type="html">
            &lt;p&gt;&lt;cite&gt;
Missing in action (M.I.A) is a status assigned to a member of the armed services who is reported missing following combat and may be injured, captured, or dead.
&lt;/cite&gt;&lt;/p&gt;


	&lt;p&gt;Sí amigos: desaparecer en combate. Eso es lo que le puede pasar al útil objeto &lt;a href=&quot;http://www.getfirebug.com/console.html&quot;&gt;console&lt;/a&gt; de la herramienta &lt;a href=&quot;http://www.getfirebug.com&quot;&gt;Firebug&lt;/a&gt; (que me imagino usarán/conocerán casi la totalidad de &#8220;hackers&#8221; javascript del mundo).&lt;/p&gt;


	&lt;p&gt;Si, como nosotros, la usáis, meted la siguiente línea de código como preambulo a vuestros javascripts. Os evitaréis alguna que otra excepción si olvidáis de vez en cuando un inocente &lt;code&gt;console.debug&lt;/code&gt; en vuestro código.&lt;/p&gt;


&lt;pre&gt;
if (!window.console) { var console = { debug : function(value) { }}}
&lt;/pre&gt;

	&lt;p&gt;Y, por cierto,  el Firebug últimamente tiene tendencía a dejar al &lt;a href=&quot;http://www.mozilla-europe.org/es/products/firefox/&quot;&gt;Firefox&lt;/a&gt; atontado&#8230; o es el Firefox el que está empezando a arrastrarse&#8230; no sé&#8230;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-05-06:435</id>
    <published>2008-05-06T22:28:00Z</published>
    <updated>2008-05-06T22:29:58Z</updated>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/5/6/&#191;cu&#225;nto-te-gusta-programar" rel="alternate" type="text/html"/>
    <title>&#191;Cu&#225;nto te gusta programar?</title>
<content type="html">
            &lt;p&gt;Hace unas horas nos preguntaron a Asís, Marcos y a mi cuánto nos gustaba programar&#8230; difícil respuesta.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-05-02:433</id>
    <published>2008-05-02T08:56:00Z</published>
    <updated>2008-05-02T08:56:54Z</updated>
    <category term="Java"/>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2008/5/2/eliminar-c&#243;digo-tambi&#233;n-es-refactorizar" rel="alternate" type="text/html"/>
    <title>Eliminar c&#243;digo tambi&#233;n es refactorizar</title>
<content type="html">
            &lt;p&gt;Quizás el título de este post pueda dar lugar a equívocos. Obviamente, una de las consecuencias de &lt;a href=&quot;http://en.wikipedia.org/wiki/Refactoring&quot;&gt;refactorizar&lt;/a&gt; suele ser la reducción del código. A lo  que me refiero con  &lt;em&gt;&#8220;eliminar código es refactorizar&#8221;&lt;/em&gt; es a erradicar toda señal de código innecesario en una aplicación.&lt;/p&gt;


	&lt;h3&gt;Las preguntas a hacerse&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;¿Se utiliza este código en alguna parte de la aplicación?&lt;/li&gt;
		&lt;li&gt;¿Es el código parte de un plugin y se utiliza en otras aplicaciones?&lt;/li&gt;
		&lt;li&gt;¿Se utiliza o no se utiliza?&lt;/li&gt;
	&lt;/ol&gt;


	&lt;h3&gt;Si la respuesta es no, no,no&lt;/h3&gt;


	&lt;p&gt;Si te pareces a  &lt;a href=&quot;http://www.google.es/url?sa=t&#38;ct=res&#38;cd=4&#38;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLD5sahXoj0U&#38;ei=E9QaSL2vMpKAwgGF-LT7Cw&#38;usg=AFQjCNG4HK8hxmOlO1tIO02tEBDBT7W6Tg&#38;sig2=Gh1xNSa3Npwa5t5YSiWkcA&quot;&gt;Amy Winehouse&lt;/a&gt; borra ese código.&lt;/p&gt;


	&lt;p&gt;Borrar código es bueno. Eliminas puntos de fallo. Reduces el número de tests necesarios. Abrevias la documentación. Es decir: reduces el &lt;a href=&quot;http://es.wikipedia.org/wiki/Ruido&quot;&gt;ruido&lt;/a&gt; en tú aplicación.&lt;/p&gt;


	&lt;h3&gt;Y si te arrepientes más adelante de borrarlo&lt;/h3&gt;


	&lt;p&gt;Usa el control de versiones&#8230; ¿o no estás usando ninguno?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-04-30:430</id>
    <published>2008-04-30T08:26:00Z</published>
    <updated>2008-04-30T08:29:53Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/4/30/rails-rest-e-i18n" rel="alternate" type="text/html"/>
    <title>Rails, REST e i18n </title>
<content type="html">
            &lt;p&gt;Ahora que estamos utilizando a tope &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Rails 2.0&lt;/a&gt; y toda la parafernalia &lt;a href=&quot;http://es.wikipedia.org/wiki/Representational_State_Transfer&quot;&gt;&lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;&lt;/a&gt; en nuestras aplicaciones, nos hemos dado de bruces con un pequeño problema de rutas.&lt;/p&gt;


&lt;h3&gt;La solución pre-REST&lt;/h3&gt;

	&lt;p&gt;Digamos que nuestras aplicaciones están internacionalizadas y que tenemos la costumbre de poner el código de idioma en la &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, utilizando un filtro para forzar que este código aparezca en la misma mediante una redirección. Una técnica bastante habitual y extensamente documentada.&lt;/p&gt;


&lt;pre&gt;
# application.rb
before_filter :set_language

def set_language     
  unless (locale = params[:locale]).blank? &#38;&#38; Languages.supported?(locale)
    set_locale(@locale = locale)        
  else
    redirect_to params.merge(:locale =&amp;gt; Languages.default)
    return false
  end
end

# routes.rb
map.connect ':locale/:controller/:action/:id' 
map.connect ':controller/:action/:id'
&lt;/pre&gt;

	&lt;p&gt;De este modo, la primera petición a la aplicación que no lleve el idioma en la &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; recibirá como respuesta una redirección a la misma &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; con el añadido del idioma.&lt;/p&gt;


&lt;h3&gt;El problema con &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;&lt;/h3&gt;

	&lt;p&gt;Si añadimos un recurso, las rutas generadas y los helpers para crear &lt;em&gt;paths&lt;/em&gt; y &lt;em&gt;urls&lt;/em&gt; no incluirán el código de idioma, por lo tanto, si no hacemos nada, al pasar por el filtro cada petición recibirá como respuesta un redirect. Mal asunto.&lt;/p&gt;


&lt;pre&gt;
# routes.rb
ActionController::Routing::Routes.draw do |map|   
  map.resources :customers
end
&lt;/pre&gt;

&lt;h3&gt;La solución&lt;/h3&gt;

	&lt;p&gt;En primer lugar necesitamos modificar ligeramente las rutas para que estas incluyan el código de idioma.&lt;/p&gt;


&lt;pre&gt;
ActionController::Routing::Routes.draw do |map|   
  map.with_options(:path_prefix =&amp;gt; ':locale') do |localized_map|
    localized_map.resources :order
  end
end
&lt;/pre&gt;

	&lt;p&gt;Por último debemos lidiar con la generación de rutas. Como quedaría feo (y no muy &lt;a href=&quot;http://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;&lt;/a&gt;) tener que andar pasando el código de idioma a cada helper (léase &lt;code&gt;order_path(@current_locale, @order)&lt;/code&gt;) lo que necesitamos es modificar el comportamiento de Rails para que lo haga él solito. Y qué suerte la nuestra, ya existe un plugin para eso:  &lt;a href=&quot;http://www.artweb-design.de/2007/5/13/concise-localized-rails-url-helpers-solved-twice&quot;&gt;localize_url_helpers&lt;/a&gt;, que de forma transparente incluye el idioma y nos permite usar los helpers como de costumbre.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;C&#8217;est voila&lt;/em&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-04-29:429</id>
    <published>2008-04-29T08:53:00Z</published>
    <updated>2008-04-29T09:04:58Z</updated>
    <category term="Ruby on Rails"/>
    <link href="http://4trabes.com/2008/4/29/kilos-y-kilos-de-refactoring" rel="alternate" type="text/html"/>
    <title>Kilos y kilos de refactoring</title>
<content type="html">
            &lt;p&gt;Las últimas semanas de desarrollo con &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt; en &lt;a href=&quot;http://www.trabesoluciones.com&quot;&gt;Trabe Soluciones&lt;/a&gt; se han dividido a partes iguales entre el desarrollo de una nueva aplicación y la modificación y mejora de otras dos. Trabajar con código antiguo (entiéndase por antiguo: con al menos un mes de vida) es siempre una invitación para la mejora y el &lt;a href=&quot;http://en.wikipedia.org/wiki/Refactoring&quot;&gt;refactoring&lt;/a&gt;. Es indiscutible que a lo largo de un mes un programador evoluciona de manera tal que todo lo que ha hecho hasta el  momento le parece malo (o al menos peor que lo que hace actualmente). Demos paso al refactoring.&lt;/p&gt;


	&lt;p&gt;Podemos enfocar esta tarea de un modo sistemático y enfermizo, en busca de un código excelso cuya sola contemplación nos haga entrar en una suerte de experiencia mística (perdiendo tiempo y salud mental) o bien podemos dejar que &lt;a href=&quot;http://4trabes.com/2008/2/10/trabe-ruby-rails-y-el-hip-hop&quot;&gt;fluya sin más&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Un ejemplo: vamos a simplificar la definición de las típicas acciones &lt;strong&gt;index&lt;/strong&gt; que sólo delegan. Cuando te encuentras por segunda o tercera vez con algo como esto:&lt;/p&gt;


&lt;pre&gt;
def index
  list
  render :action =&amp;gt; list
end
&lt;/pre&gt;

	&lt;p&gt;... decides cambiarlo por algo como &#8230;&lt;/p&gt;


&lt;pre&gt;
index_as :list

# Refactoring ohh yeah!!!
def self.index_as(method)
  define_method :index do
    send(method)
    render :action =&amp;gt; method
  end      
end
&lt;/pre&gt;

	&lt;p&gt;10 minutos después la aplicación ha perdido peso y todos lo agradecemos (y más ahora que llega el verano y la playa).&lt;/p&gt;


	&lt;p&gt;Parece poca cosa, pero cualquier refactoring, por pequeño que sea, es bueno.  El principio de &lt;a href=&quot;http://en.wikipedia.org/wiki/DRY&quot;&gt;no repetirse&lt;/a&gt; no es una idea feliz de un loco cualquiera; es un concepto fundamental en el desarrollo de aplicaciones de calidad, y si aún no lo practicas ya es momento de empezar.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://4trabes.com/">
    <author>
      <name>david</name>
    </author>
    <id>tag:4trabes.com,2008-04-24:422</id>
    <published>2008-04-24T19:52:00Z</published>
    <updated>2008-04-24T19:54:40Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Trabe"/>
    <link href="http://4trabes.com/2008/4/24/conclusiones-tras-el-seminario-introductorio-de-ruby-on-rails" rel="alternate" type="text/html"/>
    <title>Conclusiones tras el seminario introductorio de Ruby on Rails</title>
<content type="html">
            &lt;p&gt;Ya ha terminado el seminario (bueno, hace un par de horas) y estamos muy satisfechos con el resultado final. La gente ha participado, parece que no se ha aburrido (demasiado) y han aguantado como campeones las casi cuatro horas de &lt;a href=&quot;http://www.ruby-lang.org&quot;&gt;Ruby&lt;/a&gt; y &lt;a href=&quot;http://www.rubyonrails.org&quot;&gt;Rails&lt;/a&gt;. Tanto Asís como yo y el resto de gente en Trabe Soluciones queremos agradecer a todo el mundo su asistencia.  También queremos darles las gracias a &lt;a href=&quot;http://www.tic.udc.es/~fbellas&quot;&gt;Fernando Bellas&lt;/a&gt; y &lt;a href=&quot;http://www.tic.udc.es/~viccar/&quot;&gt;Víctor Carneiro&lt;/a&gt; por su ayuda y colaboración para montar el seminario.&lt;/p&gt;


	&lt;p&gt;Por cierto, ya hemos dejado para descargar &lt;a href=&quot;http://downloads.trabesoluciones.com/lectures/introrails/ruby_on_rails.pdf&quot;&gt;las trasparencias en &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; de la charla.&lt;/p&gt;


	&lt;p&gt;Nos vemos en la próxima.&lt;/p&gt;
          </content>  </entry>
</feed>
