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

7 August, 2008 | Comentarios (0)

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.

  1. export GEMDIR=`gem env gemdir`
  2. gemdoc() {
  3. open $GEMDIR/doc/`ls -FG $GEMDIR/doc | grep $1 | sort | tail -1`/rdoc/index.html
  4. }
  5. _gemdocomplete() {
  6. compctl -/ -W $GEMDIR/doc gemdoc
  7. return 0
  8. }
  9. _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.

Archivado en... Programación, Ruby, Truquitos, Vida virtual URI

Autotest con advertencias en Growl

7 May, 2008 | Comentarios (1)

He buscado en la red un método para “enganchar” la utilidad de testeo Autotest en Ruby y el sistema de mensajes de sistema Growl en Mac OS X y la verdad es que no me fue muy bien.
Una vez modificado el archivo .autotest en mi $home ya funciona a la perfección. Relato a continuación como obtener esta maravilla.
Basta instalar Growl en Mac OS tal que así:
wget http://growl.info/files/Growl-1.1.2.dmg
open Growl-1.1.2.dmg
cd /Volumes/Growl\ 1.1.2/Extras/growlnotify
less install.sh
sudo ./install.sh
cd
hdiutil detach /Volumes/Growl\ 1.1.2

y luego descargarte un par de imágenes para hacer los mensajes un poco más bonitos
cd ~
wget http://blog.internautdesign.com/files/rails_fail.png
wget http://blog.internautdesign.com/files/rails_ok.png
mkdir -p Pictures/Rails_Growl/
mv rails_fail.png Pictures/Rails_Growl/rails_fail.png
mv rails_ok.png Pictures/Rails_Growl/rails_ok.png

luego se edita el fichero .autotest que he modificado un poquillo

  1. require ‘autotest/redgreen’
  2. require ‘autotest/html_report’
  3. require ‘autotest/menu’
  4. module Autotest::Growl
  5.  
  6.   def self.growl msg, options={}
  7.     salida = "growlnotify -n autotest –image \"#{options[:img]}\"  -p #{options[:pri]} -d #{rand(100)} -m \"#{msg}\" \"Tests\" #{options[:sticky]}"
  8.     system salida
  9.   end
  10.  
  11.   Autotest.add_hook :ran_command do |at|
  12.     results = [at.results].flatten.join("\n")
  13.     output = results.slice(/(\d+)\s+assertions?,\s*(\d+)\s+failures?,\s*(\d+)\s+errors?/)
  14.     failures = $~[3].to_i + $~[2].to_i
  15.     options = (failures > 0)? {:img=>"/Users/#{ENV["USER"]}/Pictures/Rails/fail.png", :pri => 0, :sticky => "" } : {:img => "/Users/#{ENV["USER"]}/Pictures/Rails/ok.png", :pri => 0,:sticky => "" }
  16.     output = output.gsub(/assertions/, "aserciones").gsub(/failures/, "fallos").gsub(/errors/, "errores")
  17.     if output
  18.       growl "#{output}", options
  19.     end
  20.   end
  21. end
  22.  

y listo ya podemos correr test en apps ruby y que se nos notifique en growl

Autotest con Growl

Archivado en... Programación, Software, Truquitos, Vida virtual URI

Ruby y Google PageRank

13 April, 2008 | Comentarios (1)

GooglePageRank Gem at RubyForge

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.

Archivado en... Programación, Ruby, Software URI

Búsqueda en Rails con Sphinx

11 February, 2008 | Comentarios (0)

Cuando lo que quieres es maximizar el rendimiento de tu aplicación en consultas y búsquedas en una base de datos con muchos 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

Archivado en... Programación, Ruby, Vida virtual, Web URI





: