Agile Programming

Ruby

Written on August 7th, 2008

Acceso rápido a la documentación de tus gemas de Ruby

Durante una de mis sesiones de lectura de blogs me encontré que en el de Sergio Gil, programador en The Cocktail, había escrito como tener acceso directo a las gemas mediante un script de Bash que además autocompleta.

La verdad es que es muy cómodo, y no tienes que recurrir a el conocido `gem server`, el cual tiene que levantar un servidor webrick para acceder a toda la documentación. Con este hack no se consumen recursos adicionales y exprimir todavía más nuestro equipo para otras tareas.

El único problema que tiene el post de Sergio es que es dedicado a bash, y hace algún tiempo que proceso amor por zsh, por lo que he hecho la modificación para que rule en la misma.

Simplemente copiad el siguiente código en vuestro ~/.zshrc y ya teneis el comnado gemdoc con autocompletado.

export GEMDIR=`gem env gemdir`
gemdoc() {
open $GEMDIR/doc/`ls -FG $GEMDIR/doc | grep $1 | sort | tail -1`/rdoc/index.html
}
_gemdocomplete() {
compctl -/ -W $GEMDIR/doc gemdoc
return 0
}
_gemdocomplete

Por lo tanto solo habría que escribir en terminal
gemdoc
y se autocompletan los nombres de las gemas con sus respectivas versiones, si no proporcionas la version se cogerá la última versión.
captura firefox gems Acceso rápido a la documentación de tus gemas de Ruby

Written on April 13th, 2008

Ruby y Google PageRank

GooglePageRank Ruby y Google PageRank

Ya lo dicen los abueletes, “la necesidad agudiza el ingenio”. Recientemente estoy trabajando en un proyecto personal del que ya hablaré largo y tendido, en el cual me vi en la necesidad de utilizar un sistema de valoración de dominios segun su importancia y “famoseo” en la red. Cuando se me encendio la lucecita y pensé en la mítica frase de Eric S. Raymond en “La catedral y el bazar“, con lo que me puse a buscar como poder obtener el PageRank de Google y por fin liberar algo de código a la Comunidad Ruby.

Luego de preguntar en la lista Rails, me puse a escribir una gema de Ruby para que así todos los programadores inteligentes que usan Ruby la pudieran utilizar tanto en sus programas standlano como en los distintos frameworks Web.

De esto nació Google PageRank, mi primera gema Ruby. El proceso de como se hace una gema lo dejo para posts posteriores. Lo importante es que ya está aquí la gema.

La web oficial de la misma la he colgado en rubyforge.org, en ella teneis información de como usar la gema y como colaborar conmigo: http://googlepagerank.rubyforge.org/

También he colgado la documentación RDoc de la gema: http://googlepagerank.rubyforge.org/rdoc/ Si teneis algún problema o crítica, o simplemente echar vistazo pasaros por el trac del proyecto: http://rubyforge.org/projects/googlepagerank

Espero os haya gustado mi regalito de abril.

Written on February 11th, 2008

Búsqueda en Rails con Sphinx

Cuando lo que quieres es maximizar el rendimiento de tu aplicación en consultas y búsquedas en una base de datos con millones registros normalmente utilizar el indexador y buscador de MySql no es la mejor opción.

Desde hace poco se mueve por la red Sphinx, pero la verdad es que está pegando muy fuerte, digamos que es el nginx del mundo de la búsqueda (rápido y ruso) según Evan Weaver.
Sphinx se divide de 2 componentes:

  • Indexador: es la parte que procesa toda la información recogida por un crawler y genera uno o varios índices.
  • Buscador: componente que consulta el índice y recupera la información resultante

Instalación

Para instalarlo en GNU/Linux o en cualquier sabor de *nix necesitamos compilar desde las fuentes par eso hacemos:

$ wget http://www.sphinxsearch.com/downloads/sphinx-0.9.7.tar.gz
$ tar xvzf sphinx-0.9.7.tar.gz
$ cd sphinx-0.9.7
$ ./configure --with-mysql-includes=/opt/local/include/mysql5/mysql/
--with-mysql-libs=/opt/local/lib/mysql5/mysql/
$ make
$ sudo make install

Lógicamente los parámetros –with-mysql-includes y –with-mysql-libs tendrás que poner los tuyos propios. En el primer caso serán los ficheros cabecera que nos conectan con mysql y en el segundo será la ruta a las librerías de mysql.
En este tutorial estoy configurando para MySql pero también se puede hacer para PostgreSQL.

Ligándolo con Rails

Inicialmente voy a utilizar el plugin UltraSphinx de Evan que está genial para emprezar con un sphinx.conf auto-generado. Despues indexamos el contenido entero de lo que nos interese.

El ruido que está haciendo en la red es porque es tremendamente rápido, por ejemplo para una base de datos con una tabla con 1.5 millones de registros el chaval lo hace en solo unos pocos minutos. La rapidez de búsqueda es tambien muuy rápida. Desforturnadamente he tenido problemas con mi aplicación Rails con el plugin UltraSphinx instalado – algunos errores muy extraños sucedieron.

Habiendo probado varios plugins para Sphinx me decanté por probar acts_as_sphinx. Despues de algunas modificaciones en el fichero sphinx.conf (y volver a reindexar) la búsqueda estaba trabajando y mucho más importante, también sobre mi aplicación Rails. Una opción alternativa es Sphincter pero tiene una documentación limitada.

Indexando y flipando

Ahora sobre nuestra aplicación Rails corremos:

$ rake sphinx:index
$ rake sphinx:start

Indexando en mi MacBook…

$ time rake sphinx:index
using config file 'sphinx.conf'...
indexing index 'items'...
collected 1455733 docs, 1255.2 MB
sorted 182.4 Mhits, 100.0% done
total 1455733 docs, 1255246639 bytes
total 438.695 sec, 2861316.50 bytes/sec, 3318.32 docs/sec
real    7m25.307s
user    4m28.963s
sys     0m17.578s

Y ahora sobre rails

Vasmos a probar con el plugin acts_as_sphinx via consola (ruby script/console) el término ‘Rails’, ordenando por fecha de publicación.

>> search = Item.find_with_sphinx 'Rails',
           :sphinx => {
                       :sort_mode => [:attr_desc, 'pub_date'], :page => 1
            },
            :order => 'items.pub_date DESC'; 0
=> 0
>> search.total
=> 1000
>> search.total_found
=> 73717
>> search.time
=> "0.000"

Esto es, un índice de 943Mb de almenos 1.5 millones de elementos. Nótese que los resultados de la búsqueda se limitaron a 1000 en el fichero de configuración sphinx.conf.

En el controlador de Rails, la búsqueda se hace a través de:
@items = Item.find_with_sphinx(params[:query],
:sphinx => {:sort_mode => [:attr_desc, 'pub_date'], :limit => 50, :page => (params[:page] || 1)},
:order => 'items.pub_date DESC')

Actualizando el índice de Sphinx

Como para cada casi toda taréa en Rails, existe una tarea de _rake_ para actualizar el índice de Sphinx que puede ser llamado mediante una entrada en cron, frente a las actualizaciones en ‘vivo’.
El comando rotate nos permite reindexar el índice mientras el demonio de Sphinx está corriendo, forzando el reinicio una vez se haya completado

$ rake sphinx:rotate

Written on January 20th, 2008

Presumiendo con Ruby

Es bien conocido que Ruby es uno de los lenguajes que más cercanos y que más satisfacción dan al programador. ¿Pero que pensarías si te enseñara esto?

ejemplo codigo ruby1 Presumiendo con Ruby

Y es muy difícil de implementar? Sigue leyendo!

ejemplo implementacion codigo ruby11 Presumiendo con Ruby

Mola un cacho, eh?

Solo tienes que recordar correr el programa con el flag KCODE -Ku, esto es, ruby -Ku nombre_programa,rb  :)