4 Trabes

Sitemaps autogenerados con Mephisto

Publicado por el Viernes, 29 de Diciembre de 2006

Estos días hemos decidido que nos interesa que mephisto haga el solito sus deberes. El primer paso es que genere su sitemap, para sugerirle educadamente a Google que rutas quiere que sean indexadas. El segundo paso será entrenarlo para que notifique a los technorati y demás familia por si solo cuando haya cambios.

En teoría hacer lo primero es muy sencillo, porque hay un plugin que se supone que ya lo hace. Nada más fácil que esto...en teoria. Pero en la práctica esto no es del todo asi.

La buena noticia es que el plugin si que genera un sitemap, pero la mala es que simplemente con leerlo por encima nos damos cuenta de que este sitemap tiene algunos errores. Asi que vamos a arreglarlo para que sea algo más correcto. No buscamos una solución general, ni hacer un nuevo plugin, solo que funcione bien para nuestro caso.

El primer gran error, y el más garrafal en mi opinión, es que genera entradas en el sitemap para los articulos que aun no están publicados. Es decir, que todo lo que esté como draft va a aparecer igual en el sitemap, por supuesto con una ruta inválida. Localizar el código que hace esto es sencillo, está en el fichero index.rxml en la ruta /app/views/google_site_map/ del plugin. Echemos un vistazo a ver que puede estar pasando:

xml.instruct! :xml, :version=> '1.0', :encoding => 'UTF-8'

xml.urlset( :xmlns => 'http://www.google.com/schemas/sitemap/0.84') do
  render :partial => "page", :locals => { 
    :xm => xml, 
    :loc => MephistoGoogleSiteMap.site_uri,
    :changefreq => MephistoGoogleSiteMap.home_frequency,
    :priority => MephistoGoogleSiteMap.home_priority,
    :lastmod => MephistoGoogleSiteMap.lastmod(@last_article)
  }
  for section in @sections do 
    for article in section.articles do
      render :partial => "page", :locals => {
        :xm => xml,
        :loc => MephistoGoogleSiteMap.location(@site, article.to_liquid, section),
        :changefreq => MephistoGoogleSiteMap.change_frequency(section),
        :priority => MephistoGoogleSiteMap.article_priority,
        :lastmod => MephistoGoogleSiteMap.lastmod(article)
      }
    end
  end
end

El error parece evidente: para cada sección se iteran los artículos de la misma y para cada uno de ellos se pinta la entrada correspondiente en el sitemap. Buen intento, pero sería mejor hacerlo solo para aquellos artículos que estén publicados. Asi evitariamos meter los drafts en el sitemap. Solventar este pequeño problema es fácil. Con un if vamos sobrados:

 for section in @sections do
   for article in section.articles do
     if article.published?
       render :partial => "page", :locals => {
         :xm => xml,
         :loc => MephistoGoogleSiteMap.location(@site, article.to_liquid, section),
         :changefreq => MephistoGoogleSiteMap.change_frequency(section),
         :priority => MephistoGoogleSiteMap.article_priority,
         :lastmod => MephistoGoogleSiteMap.lastmod(article)
       }
      end
    end
  end

Podría escribirse de forma más elegante, pero dificilmente más sencillo. Bien, ya no nos salen los drafts, primer break point superado. Vamos a por el partido. El segundo problema que he detectado es que si un artículo está contenido en varias secciones - pongamos que está publicado en n secciones-, la entrada correspondiente del sitemap va a aparecer repetida n veces. Esto es de una utilidad discutible, asi que será mejor arreglarlo. Podriamos hacer una comprobación de si ya hemos generado una entrada o no...pero parece que esto se pone complejo, y no debería serlo, ¿no?...a lo mejor es que este bucle no está muy bien pensado, ¿por qué razón estamos iterando las secciones ?¿Para asignar la prioridad?¿Por qué existe la posibilidad de generar entradas de distinta prioridad para la misma url?...aqui veo lagunas no se...creo que se puede hacer muuucho más simple y además que funcione bien. Comentar que el tema de las secciones no-blog lo voy a eliminar, porque nosotros no lo usamos . Vamos a empezar por el controlador. No necesitamos iterar las secciones, con un listado de articulos ya nos llega, y además podemos poner la condición de que esté publicado directamente en el find, con lo que quitamos lógica de negocio de la vista, por aquello del estructurar. Asi, el método index de nuestro controlador google_site_map_controller.rb pasa de ser algo asi:

def index
  headers['Content-Type'] = 'text/xml; charset=utf-8'
  @sections = site.sections
  @last_article = Article.find_by_date(:limit => 1).first
end

a convertirse en algo como esto:

def index
  headers['Content-Type'] = 'text/xml; charset=utf-8'
  @articles = Article.find(:all,:conditions=>'published_at is not null')
  @last_article = Article.find_by_date(:limit => 1).first
end

Simplificamos un poco la clase del lib, eliminando algun método y simplificando algún otro:

  def get_frequency_for_article
       self.blog_frequency
  end
    
  def location(site, article)
     filters = FiltersProxy.instance
     article.instance_variable_set("@site", site)
     self.site_uri +  article.url
   end

Como hemos comentado más arriba, hemos eliminado la particularidad de las secciones no-blog. Asi las cosas, el bucle de la vista que genera el sitemap, pasa a ser algo como esto:

 for article in @articles do
      render :partial => "page", :locals => {
        :xm => xml,
        :loc => MephistoGoogleSiteMap.location(@site, article.to_liquid),
        :changefreq => MephistoGoogleSiteMap.get_frequency_for_article,
        :priority => MephistoGoogleSiteMap.article_priority,
        :lastmod => MephistoGoogleSiteMap.lastmod(article)
      }
 end

Ya no tenemos los borradores en el sitemap ni entradas duplicadas, con lo que google estará más contento y más predispuesto a ser amiguito de nuestra página ;)

Pero aun no podemos cantar victoria: el formato en que se generan las fechas no es acorde a lo definido por el W3C. Esto es fácil de subsanar: en el init.rb del plugin se encuentra definido el simbolo :w3. Solo hay que tocar esa definición para añadirle información sobre vuestra zona horaria:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.update(:w3 => '%Y-%m-%dT%H:%M:%S+01:00')

Y ahora si que es posible que tengamos un sitemap decentillo.

David Heinemeier deja 37signals

Publicado por el Jueves, 28 de Diciembre de 2006

David Hennemeier Hanson, creador de la plataforma Ruby On Rails, anuncia que dejará 37signals la empresa en la que ha trabajado durante los últimos años para pasar a formar parte de la plantilla de Sun Microsystems. (Yeah man, you read it right! Google translator is not kidding you, DHH joins Sun!).

David ha tomado la decisión tras haber disfrutado de una suculenta comida de Navidad en casa de su buen amigo James Gosling, creador de Java, con el que trabajará en estrecha colaboración. Se sabe que el menú estuvo formado por arenques en vinagre y pavo asado preparados de forma excelsa por la esposa de Gosling. David y James se conocieron en la Java One Conference 2006 a la que DHH acudió de incógnito, desde entonces ha existido entre los dos una gran amistad que culmina con esta noticia.

En su nueva etapa en Sun, DHH pasará a formar parte del equipo que desarrolla la nueva versión de Java 7.0 (Dolphin) a la que aportará su experiencia en el trabajo con Ruby. Por otra parte colaborará en la publicación de los nuevos Java blueprints que en su opinión son una “referencia indespensable en el mundo de la programación, tanto en Java como en cualquier lenguaje”.

Afortunadamente disponemos del video del momento en el que DHH hace pública esta sorprendente decisión. David asegura que siempre ha querido trabajar al lado de gente tan importante como su gran amigo Gosling y que tras años buscando la belleza sin encontrarla necesita reorientar su vida y darle un poco de orden. Aquí podeis ver sus declaraciones.

Por su parte el CEO de 37signals Jason Fried afirma que respeta la decisión de David y que lo apoyará en el futuro. En distintos foros y blogs technogeeks se apunta que en los últimos meses la relación de Fried y Heinnemeier se había deteriorado. El motivo de las tensiones podría ser la aficción por los arenques en vinagre que DHH comparte con James Gosling.

Ciertamente se trata de una noticia conmocionate, si hoy no fuera 28 de Diciembre diría que se trata de una broma ;-)

TextMate en Windows... Intype

Publicado por el Miércoles, 06 de Diciembre de 2006

Si trabajas con Rails seguro que sabes lo que es TextMate. Puede que nunca lo hayas probado, pero seguro que lo conoces, en parte porque si has visto El screencast te habrás preguntado qué editor es ése que parece sufrir de incontinencia verbal, por así decirlo; y en parte porque si no tienes un Mac y te has puesto a desarrollar con Rails, seguro que te has topado con este archiconocido (en el mundo rails, entiéndase) editor y te habrás preguntado: ¿y yo, que no soy un tipo/a elegante y molón y no tengo un Mac, qué puedo hacer para editar mis ficheros .rb y .rhtml con tanta soltura?.

La mejor respuesta a esta pregunta, desde mi punto de vista, es: utiliza RadRails, un IDE multiplataforma para desarrollo Rails que incorpora un editor de código Ruby y plantillas .rhtml que, aunque no es tan espectacular como el citado TextMate, es una herramienta perfectamente válida, y gana muchos puntos si tenemos en cuenta que el resto del entorno simplifica notablemente el desarrollo de aplicaciones Rails (RadRails proporciona integración con SVN, gestión de proyectos, gestión de servidores, de plugins, de tareas rake, etc.).

Es más, aún a riesgo de parecer voluble llevándome la contraria a sólo un párrafo de distancia, diría que la mejor opción, tal y como se encuentra RadRails en este momento (todavía anda por la versión 0.7.1), es integrarlo como plugin en un Eclipse, instalando también el plugin de Web Tools para facilitar la tarea de editar los ficheros rhtml (esta es, para mí, la mayor debilidad de RadRails). Aquí tienes un artículo en el que se explica cómo hacerlo (habla del Eclipse para Windows, pero es extrapolable a cualquier plataforma. Ah! la parte en la que explica cómo configurar Eclipse para generar modelos, controladores, etc. te la puedes saltar: las versiones recientes de RadRails integran esa funcionalidad).

InType

Y ahora viene el tema del post (un poco tarde, cierto): ¿y qué pasa si trabajas en Windows y eres un valiente, un tipo duro, un bucanero del código fuente, empeñado en seguir siempre el camino más duro, en seguir la senda tortuosa del desarrollo con editores de texto, atajos de teclado y macros bravías? En ese caso, InType es tu opción… o lo será cuando aparezca. Mejor léelo en su web/blog/cosa, pero por lo que cuentan será un editor con la potencia de TextMate, al menos al nivel de espectacularidad verborreica:

No, Intype is not a TextMate clone or port. We really like TextMate and it inspired us a lot. And altough Intype is using the same terminology as TextMate, it is completely different editor. We hope Intype will provide Windows users with the same (or even better) comfort and work flow as does TextMate for Mac users.

Cita que, traducida (en todos los sentidos) viene a decir: “No estamos haciendo un TextMate para Windows, pero lo que estamos haciendo se va a parecer mucho a un TextMate para Windows”. O eso entiendo yo.

Si te queda alguna duda, te aconsejo que visites la página o le eches un vistazo al FAQ. Ah, una mala noticia para terminar. InType se inspira tanto en TextMate que tampoco va a ser gratuito. Eso sí, al igual que su imitado colega Macoso, su precio no va a ser muy elevado:

Intype will cost between $25 to $45 (€20 to €35). One license will be valid for one version of Intype and all updates for this version (for example version 1.0 with updates until version 1.9).

Date a conocer

Publicado por el Martes, 05 de Diciembre de 2006

En Riding Rails han publicado un par de post (1 y 2) breves pero interesantes. Comentan la exsitencia de dos webs para darse a conocer dentro de la comunidad Rails.

En workingwithrails.com podeis publicar vuestro perfil como programadores Rails. Si probais a buscar por “trabe” veréis como aparecen las 4Trabes. También están apuntados otros ilustres como el señor Heinemeier.

Cuando tengáis una apliación Rails digna de ser mostrada al mundo podéis visitar happycodr.com y darla de alta. Esta página es un directorio de aplicaciones Rails y en ella aparecen sitios tan conocidos como basecamp o 43 Places.

Material de nuestra charla en la Conferencia Rails

Publicado por el Domingo, 03 de Diciembre de 2006

Asís y David de charla Si no habeis visitado nuestra página web desde el Miércoles pasado, os recuerdo que ya está disponible el material de la charla que dimos Asís y yo en la Conferencia Rails acerca de soluciones para internacionalizar aplicaciones Rails. Si os interesa podeis descargar las transparencias en formato PDF desde la sección de charlas de nuestra web.

Instalando Ruby on Rails en linux Fedora Core 6

Publicado por el Viernes, 01 de Diciembre de 2006

No, no es la primera vez que instalo Rails, tanto en Windows como en linux (¿y en Mac?, preguntaréis algunos. ¿Mac, eso qué es, una hamburguesa?, os contesto)., pero por alguna extraña razón, cada vez que lo hago, al menos en linux, acabo teniendo el mismo problema: nunca funciona a la primera. Así que, por un lado para dejar esto escrito y poder consultarlo en próximas ocasiones, y por otro lado, como no, para que aquél que se encuentre con el mismo problema que yo pueda solucionarlo, aquí van unas breves instrucciones:

En este caso se trata de una instalación de una Fedora Core 6 en un portátil HP – compaq nx7010. Al instalar el SO he incluido todos los paquetes de Ruby que he visto. Para instalar Rails, sigo las instrucciones de la página.

Me descargo RubyGems, el sistema estándar de gestión de paquetes Ruby.

Tras descomprimirlo, lo instalo, ejecutando como root:

ruby setup.rb

Ahora ya puedo pasar a instalar Rails, ejecutando:

gem install rails --include-dependencies -y
(le he añadido la opción -y para no tener que decir yes a todas las dependencias y paquetes, que aún son unos cuantos).Todo parece ir correctamente, pero entonces…
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rdoc/rdoc (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/doc_manager.rb:71:in `load_rdoc'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/doc_manager.rb:41:in `generate_ri'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:283:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:282:in `each'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:282:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:220:in `each'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_commands.rb:220:in `execute'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/command.rb:69:in `invoke'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/cmd_manager.rb:117:in `process_args'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/cmd_manager.rb:88:in `run'
        from /usr/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:29:in `run'
        from /usr/bin/gem:23
¡Auch! Tanta belleza, tanta simplicidad… menos mal que uno ya ha instalado esto y sabe de qué va el tema, que sino se iba a creer lo de la belleza y la simplicidad la señora Hansson. Divago. El problema es fácil de resolver. Un poco de google y me entero de que lo que sucede es que no tengo instalado el Rdoc (un generador de documentación a partir de los comentarios presentes en código Ruby). Así que lo instalo, añadiendo un par de cosillas que a buen seguro no le harán mal a mi sistema (entre ellas el módulo ruby-mysql, dado que voy a trabajar con bases de datos mysql).
yum install ruby-libs ruby-mode ruby-rdoc ruby-irb ruby-ri ruby-docs ruby-mysql -y

Y tras esto ya puedo instalar Rails

gem instal rails --include-dependencies -y
Need to update 1 gems from http://gems.rubyforge.org
.
complete
Successfully installed rails-1.1.6

y utilizarlo para crear una aplicación

rails my_new_app

Documentación para todos

Publicado por el Viernes, 01 de Diciembre de 2006

Se supone que uno de los objetivos de 4Trabes es compartir parte de nuestras experiencias y conocimientos con nuestros lectores, así que como primer post compartiré uno de mis bookmarks más preciados: GotAPI. Es una colección de APIs online que te permite crear tu propia página con las diferentes APIs que uses y buscar en ellas a gran velocidad. Merece la pena echarle un vistazo.