Ya es 2007. Ha tenido que pasar todo un año para atragantarnos de nuevo con las uvas. Desde 4trabes.com, los miembros de Trabe Soluciones: Óscar, Marcos, Asís y David os desean un feliz año 2007.
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 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 ;-)
Buscando otras cosas, el azar me ha llevado a conocer un proyecto bastante curioso. Se llama The Uniform Server y se trata de un servidor web completo (Apache+Mysql+PHP+Perl) para plataformas Windows que no necesita de ningún tipo de instalación y ocupa algo menos de 6 MB (algo más cuando lo descomprimes).
Aparte de utilidades super frikis como llevar tu propio servidor en tu memoria USB, este miniservidor puede ser de mucha utilidad para hacer pruebas en ordenadores que no tienen un servidor instalado, o simplemente para probar cosas sin "contaminar" tu Apache de cabecera...
A pesar de los pocos bytes que ocupa, funciona y hasta tiene un completo panel de control. Tiene sus lagunillas y sus defectos (por ejemplo, en la versión que yo he descargado, con el locale español, phpMyAdmin da un error y no funciona,...) pero por encima de estos defectos, a mi me parece una herramienta muy recomendable para poder tener un servidor de pruebas en sitios tan insospechados como el PC de mi hermana ;)
Saludos
Hacía un tiempo que no me tocaba tener que hacer labores de editor amateur de video. Pero como toda cosa tediosa, acaba tocando de vez en cuando. El reto era conseguir que una pelicula en divx pudiera ser vista en un dvd normal.
Como muchos sabreis, hay cientos de formas para hacer esto. Unas son más cómodas que otras pero todas son engorrosas. El problema es que este proceso aparentemente tan sencillo implica remuestrear audio y video, generar los ficheros necesarios (VOBs y demás familia), generar una imagen del disco y finalmente plancharla en un DVD.
Tras probar varias alternativas, lo que mejor me ha funcionado ( en el sentido de que me ha facilitado el trabajo y minimizado las molestias) es un programita freeware que se llama Avi2Dvd. y que puedes descargarte de aqui.
La ventaja de este programa es que hace casi todo de un golpe. Es decir, tu le indicas el archivo de video que quieres procesar y el se encarga de hacer tooodo lo necesario para proporcionarte una imagen iso lista para tostar. Puede parecer poco impresionante, pero viendo el resto de alternativas que he probado...es todo un logro. Es lentillo (no más que otros) pero hace su trabajo.
Espero que esta entrada os ahorre algo de tiempo googleando.
Sun ha anunciado la publicación de la versión final de JSE6 que ya está disponible para descarga. Será interesante ver la acogida que recibe esta nueva versión de Java en un momento en el que el uso de la versión anterior (JSE5) aun no está muy extendido.
Por otra parte, Google ha publicado la última versión de su Web Toolkit bajo licencia Apache2.0, la noticia se puede ver en el blog de Google Web Toolkit.
En el mercado existe un gran abanico de sistemas de gestión documental comerciales. También existe un buen número de soluciones open-source, muchas de ellas con versión comercial, algunas de estas soluciones combinan la funcionalidad de gestión documental con la de gestión de contenidos y otras están más enfocadas a ese cometido concreto.
En la web de Optaros se puede encontrar un white-paper titulado “Unleashing the Power of Open Source in Document Management” que compara siete de las soluciones de gestión documental open-source más conocidas:
El white-paper con la comparativa está disponible en la siguiente url: http://www.optaros.com/en/publications/white_papers_reports
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).
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).
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.
A veces el domingo no es el típico día en que te tiras en el sofa a ver la vida pasar y recuperar fuerzas para ir el lunes a trabajar con un mínimo de alegría. A veces, el domingo, te dedicas a hacer labores de consultoría para los conocidos, amigos, familiares y demás. Hoy ha sido un domingo de esos. Y no uno llevadero, ha sido uno en el que te preguntas cada 20 segundos por qué leches te levantaste de la cama con lo bien que estabas roncando. En fin. Me estoy desviando del tema.
Nota mental: no olvidar el var.
Para ser breve, diré que mi labor de consultoría incluía la creación de un tag JSP que generaba un complicado formulario, que para más inri tenía que hacer filigranas JavaScript. La cosa iba como la seda, hasta que necesitamos recursión. Sí, recursión. No recuerdo haber necesitado hacer nada recursivo en JavaScript en mi vida, pero las circunstancias mandaban y no era el momento de buscar otras alternativas…
function hazAlgoConElNodo(nodo) { var nombreNodo = nodo.nodeName; var claseNodo = nodo.className; // etc, etc. for (i = 0; i < nodo.childNodes.length; i++) { hazAlgoConElNodo(nodo.childNodes[i]); } }
... código inocente donde los haya, con una recursión trivial. Pues nada, vamos a probarlo y ¡Upss! el navegador explota. ¡No me puedo creer que entremos en un bucle infinito!, ¡es imposible!, ¡mi%xc%$!, ¡c$j$s! y demás improperios. Nos calmamos, depuramos un poco, y … ¬_¬U … por qué leches me levanté de la cama con lo bien que estaba roncando.
for (var i = 0; i < nodo.childNodes.length; i++) {
Mucho mejor. Es lo que pasa cuando uno trabaja cuando debería estar descansando y no es capaz de leer lo que tiene delante. Hay que ver lo fácil que es olvidarse de un keyword importante en un lenguaje como JavaScript y no darse cuenta. Hay que tener mucho cuidado con el susodicho var que marca el ámbito de las variables (o scope, según el gusto lingüístico de cada cual).
A mi no me vuelve a pasar… espero xDDDD. Lo dicho, nota mental: no olvidar el var.
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.
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
Ya es oficial, ya es un hecho: las cuatro trabes de Trabe Soluciones ya pueden ver la luz del día. Tras unos meses habitando en un subterráneo, por fin hemos ascendido (concretamente cuatro plantas) hasta ¡¡un lugar desde el que se ve el sol!!!
A todos aquellos que teneis la suerte de tener una ventana en vuestro lugar de trabajo, ¡¡¡Felicidades!!!, menuda diferencia. Seguimos habitando en un espacio de 20 metros cuadrados, pero el nuevo por lo menos tiene ventana.
Y para que conste que no me lo invento, voy a demostrar mis afirmaciones con pruebas. Aqui queda una foto de mi nuevo puesto de trabajo: amplio, con ventana y saludables vistas al campo. Ahora hasta puedo saber qué tiempo hace ahí fuera...¡Que lujo!
La verdad es que cuando empecé a escribir este post la idea era hacer un resumen de cómo hacer que mephisto funcione correctamente en Dreamhost sin morir en el intento o acabar con un blog mono comentario...pero ese tema lo dejaremos para un día que no sea viernes.
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.
