Pro Git : Libro sobre Git

Hace unos día me enteré vía Twitter (faaaa, que moderno que estoy!) de la aparición del libro “Pro Git : professional version control“. Lo bueno es que uno puede clonarse su propia working copy del libro o de los ejemplos :).

Según veo en la tabla de contenidos abarca la mayoría de los temas, aunque como no lo leí todo no se que tan profundo va en cada parte.

Un tema que si no vi, al menos por ahora, es un apartado a cosas como git-svn, que suele ser un dolor de cabeza diario y cuando hay un problema, hay que excavar un buen rato en un buscador para solucionarlo.

El libro se distribuye bajo “Creative Commons Attribution-Non Commercial-Share Alike 3.0” y si queremos apoyar la iniciativa podemos comprar la copia en árbol muerto.

Anuncios

Sitemaps vía crawling

Hoy me pidieron agregar un Sitemap para uno de los trabajos que hicimos para el gobierno y me encontré con que los plugins que uso para esta tarea no me cerraban de forma cómoda. El problema es que este sitio tiene, además del contenido dinámico, muchas páginas estáticas que no puedo referenciar desde un modelo, por lo que debía forzarlas y era bastante molesto.

Buscando encontré una solución práctica para este caso (donde hay pocas páginas, menos de 1k) que usa un crawler para recorrer todo el sitio y obtener las URLs a agregar al sitemap. El script que presentan me sirvió, aunque tuve que hacerle algunos cambios menores.

El primer problema que tenía era que me agregaba páginas que no deben ir en un sitemap (ni ser indexadas) como las de login, recuperar clave, form de registración, etc. Por lo que tuve que modificar ligeramente el código para no seguir los enlaces que estuvieran marcados con rel="nofollow" y para eso modifiqué en el método extract_and_call_urls la última línea como sigue :

links.each{ |link|
   extract_and_call_urls(link.href) unless
      !can_follow?(link) || ignore_url?(link.href) || 
      @visited_pages.include?(link.href) 
}

Y definiendo el nuevo método :

 def can_follow?(link)
   return false if link.nil? ||
   (link.attributes["rel"] && link.attributes["rel"].include?("nofollow"))
   
   true
 end

Entonces, cuando el crawler encuentra un enlace que el developer marcó que no debe seguirse en una indexación (esto es principalmente para los crawlers de los search engines) se ignora y no se agrega al sitemap.

El otro cambio menor fue que tenía algunas URLs con el path completo y por default siempre me agregaba al inicio el domain name, por lo que me quedaban URLs inválidas, por lo que hice la siguiente modificación :

# Antes
xml.loc(@starting_url + url)

# Después
xml.loc(url.include?(@starting_url) ? url : (@starting_url + url))

Una vez probado el script hice una tarea rake para poder correrla fácil desde un cronjob :

# lib/tasks/sitemap.rake
require 'lib/crawler'

desc "Generate the sitemap file"
task :sitemap => :environment do
  start_url = ENV["URL"] || "http://localhost:3000"
  Crawler.new(start_url, (ENV["CREDS"] if ENV["CREDS"]), ENV["QUIET"] || false, ENV["SITEMAP"] || false, ENV["DEBUG"] || false)
end

Y listo, lo último fue hacer un deploy y configurar un cron.dayli para que cree el sitemap actualizado :

rake sitemap URL=http://www.haciendoelcolon.buenosaires.gob.ar SITEMAP=true

Así una vez por día se actualiza el sitemap y se hace un ping a google para que sepa que debe pasar a reindexar el contenido.

Esto tiene varias desventajas (pero aún así para este sitio sirve a su propópito) :

  • No se puede priorizar cada tipo de contenido fácilmente
  • La fecha de última modificación es inexacta
  • Carga el webserver para generar el sitemap

Código completo : crawler.rb

Cómo aprovechar una crisis para hacer publicidad

Simpático mail titulado “Gripe A: Microsoft facilita tecnologías” me llegó hoy de lo que supongo es algún vendor local de productos de MS (cliente(at)mailmicrosoft.com). No hay mucho que decir, me hizo gracia y acá parte del mail :

ms_crisis

El resto del mail es una enumeración de las cosas online que podés usar gratuitamente, por ahora, para poder trabajar con otra gente sin contagiarte de Gripe A N1H1 :).

¡Qué haríamos sin empresas como Microsoft! (¡sarcasm detected!)

Take A Photo – Demo

Hace unos meses publiqué un plugin para tomar fotos instantáneas desde una página web, usando Flash y un plugin para Ruby on Rails.

Hoy me puse un rato a jugar y armé un demo donde se pueden tomar fotos (ojo que todo es público :D) : TAP.

Las fotos se borran una vez por día y acepta un máximo de 50 fotos por día (para evitar que me llenen el disco). Tengo algunos TODOs que iré viendo de resolver en los tiempos libres (como cambiar el tamaño de la foto, recortar, aplicar efectos, etc).

Necesita Flash 9 o superior y una web cam para que tenga sentido :). Todavía sigo peleando con el Flash player de Linux y la camarita, sorry :S.

Les recomiendo verlo en Firefox, no me gasté en ver si en IE el CSS no se rompe y no creo que lo haga nunca.

Migración de Zimbra

Este fin de semana me puse como objetivo migrar el mail server de la empresa que ya estaba haciendo agua. Corría sobre un server con un disco que daba errores de lectura, no había RAID y la última semana hubo un 90% de uso de CPU en I/O :).

Arranqué el sábado al medio día y fue un día perdido. Tuve la loca idea de respetar la arquitectura del nodo para crear la VM y montar Zimbra en 64bits. Resulta que migrar el mail server a un nuevo servidor requiere de mucho matching entre el origen y el destino, por lo que fue prácticamente imposible hacerlo. Recapacité por la noche y el domingo fui por un aproach más conservador :).

Lo primero a tener en cuenta para migrar este productor (que es all-in-one-fucking-package) es aceptar que hay que usar una de las distros soportadas, y no tratar de hacer magia (al menos para no sufrir y que salga andando).

El proceso básico está en este post y no parece complicado, pero hay varios obstáculos que pasar. Lo primero, es que hay que hacer una instalación dummy de zimbra con la misma versión que teníamos antes. Mi problema era que tenía una versión muy vieja de Zimbra y solo había paquetes para Debian y Ubuntu 6.06, pero yo quería al menos Ubuntu 8.04.

El truco que usé fue editar /etc/debian_version y ponerle lo que espera y pasó sin problemas (calculo que por mero azar :D).

Una vez eso el resto fue copiar con rsync de un server a otro (25Gb tardan MUCHO, pero MUCHO!) y ejecutar el installer de la nueva versión, que tardó también como 6 hs en actualizar las tablas de MySQL. Esto último creo que fue causa de que el logger en el server viejo no estaba limpiando después de procesar, por lo que había muchos logs y eso hizo que demore tanto.

La migración fue perfecta, sin errores, pero teniendo problemas con el LDAP. Confieso que  odio ldap e iba a decir “hasta acá llegué, lo dejo” pero apareció rápidamente en el wiki la solución : regenerar los certificados. Anduvo en el primer intento.

Cosas a tener muy en cuenta por si les toca :

  • El nuevo server debe tener el mismo Domain Name y MX record a puntados (la ip puede cambiar, pero el DNS debe estar actualizado)
  • Bloquear el puerto 25 mientras se migra, asi en el nuevo server no empiezan a entrar mails hasta que no estemos seguros de que anda
  • Hacer backup antes de borrar algo 🙂
  • Usar solo las distros/versiones soportadas, ahorra miles de dolores de cabeza
  • Planificar con tiempo la copia de archivos, puede tardar más de lo que uno cree 🙂

Un tiempo después

No, no voy a comerntar sobre el aburrido programa de “Solita” :D, solo que hoy estuve arreglando unos bugs de Oregano y me di cuenta que habían pasado ya unos 18 meses desde el último commit que hice!

En fin, mucho tiempo, pero ya tengo un lindo TODO de cosas a ir haciendo, con muy baja prioridad por la Tesis, pero que quizás para mi cumple esté para hacer otro release, esperemos no colgarme de nuevo.

Mientras tanto se arreglaron dos bugs molestos :

  • Se arregló el export a PNG con fondo transparente
  • Se implementó finalmente la opción de exportar en escala de grises

oregano_grayscale

Nueva Casa (x2)

Si están leyendo esto significa que los DNS ya se actualizaron world-wide (o al menos el que usen :D) ya que después de casi 3 años finalmente le liberé a Sebas la máquina que me tenía rackeada en mi viejo trabajo :).

En estos día seguramente me ponga a migrar a WordPress 2.7 con la esperanza que no se rompa nada, pero quedan avisados (sobre todo los planets, espero que no floodee por algun bug en las feeds como pasó otra veces).

La otra noticia es que ya conseguí casa en el sur y a fin de mes me voy a firmar el contrato de alquiler. Un pasito más hacia mi emigración de Capital.