Gastón Ramos

"La mayoría de las gaviotas no se molesta en aprender sino las normas de vuelo más elementales: como ir y volver entre playa y comida. Para la mayoría de las gaviotas, no es volar lo que importa, sino comer. Para esta gaviota, sin embargo, no era comer lo que le importaba, sino volar. Más que nada en el mundo, Juan Salvador Gaviota amaba volar".

Tag: rubygems

Panthro, el proxy cache para rubygems.

Hace un tiempo atrás se me ocurrió escribir un proxy cache para las gemas, lo hice un poco para aprender y otro poco a para acelerar un poco el uso del rubygems en un lugar común de trabajo, como por ejemplo una oficina. La idea es que cuando instalamos un gema por primera vez esta se baja desde rubygems y se guarda en el cache en dónde panthro está corriendo, específicamente en ~/.panthro/gems, luego cuando necesitemos instalar la misma gema desde otra máquina en la misma red y que tenga configurado panthro como source de rubygems (veáse el comando `gem source`) esta y todas sus dependecias no necesitan ser descargadas dado que ya están en el cache.

Panthro

Hay algunas cosas que me falta implementar y es expirar es el cache de los archivos latest_specs.4.8.gz, prerelease_specs.4.8.gz y specs.4.8.gz entre otras que están detalladas en el TODO del proyecto.

https://github.com/gramos/panthro

Es bueno aclarar que hasta ahora panthro tiene 63 líneas de código sin contar los tests. Además para poder testear que tan rápido es Panthro y compararlo contra usar directamente rubygems hice una gema muy chiquita que se llama rumb y que podés mirar acá: https://github.com/gramos/rumb esta tiene 57 líneas de código contando el texto del ayuda.

Desinstalando rbenv de ruby

Desde hace algunos días que estoy haciendo unas pruebas con algunas gemas, hoy instalé geminabox y cuando quiero probarlo como dice en el README, obtengo un LoadError: ‘geminabox’ not found, a lo cual pensé not found? pero si lo acabo de instalar…
Después de revisar un poco, ejecuto `gem env` y veo que tengo un quilombo con los GEM_PATH y GEM_HOME dado que tengo instalado rbenv ( https://github.com/sstephenson/rbenv ) para manejar las versiones de ruby y además de rbenv tambien tengo el plugin communal ( https://github.com/tpope/rbenv-communal-gems ) para compartir las gemas entre las versiones compatibles de ruby.
Además tengo instalado el paquete rybgems-integration que también hace cosas con rubygems, o sea un kilombo. Después de hacer varias pruebas y ver que las cosas no funcionan muy bien, decidí desinstalar rbenv por ahora y me encontré con no hay un `rbenv uninstall` Así que esta es la receta para hacerlo:

Borro todo el contenido del directorio rbenv:

rm -rf ~/.rbenv

Elimino todo lo agregado en los archivos del shell:

grep rbenv ~/.bashrc ~/.bash_profile ~/.zshrc /etc/profile /etc/profile.d/*

Luego de esto hago un `gem env` y veo que todavía sigo teniendo los path the rbenv:

Econtré que tenía un GEM_HOME agregado en el archivo de conf de rubygems y me decidí a borrar este archivo:

rm ~/.gemrc

después de esto tengo un máquina en un ambiente de rubgems más o menos “limpio”, más adelante instalaré rbenv de nuevo.

Bless.

Can’t install RMagick 2.13.1. Can’t find MagickWand.h

Estuve tratando de instalar rmagick 2.13.1 en debian wheezy, y al ejecutar el gem install

me tiraba el siguiente error:


Installing rmagick (2.13.1) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /home/gramos/.rbenv/versions/1.9.2-p320/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... yes
checking for /usr/bin/gcc... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.13.1. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/home/gramos/.rbenv/versions/1.9.2-p320/bin/ruby


Gem files will remain installed in /home/gramos/.rbenv/versions/1.9.2-p320/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1 for inspection.
Results logged to /home/gramos/.rbenv/versions/1.9.2-p320/lib/ruby/gems/1.9.1/gems/rmagick-2.13.1/ext/RMagick/gem_make.out

Se soluciona instalando la siguiente biblioteca:


sudo apt-get install libmagick++-dev

ya hora sí….


gem install rmagick -v '2.13.1'
Building native extensions.  This could take a while...
Successfully installed rmagick-2.13.1
1 gem installed
Installing ri documentation for rmagick-2.13.1...
Installing RDoc documentation for rmagick-2.13.1...

Espero que les sea útil!

Gems mirror local

Dado que tengo un enlace a internet que no es lo que uno quisiera tener, cada vez que quiero instalar una gema, me demora varios minutos, lo cual es bastante molesto cuando uno está trabajando, por esto decidí poner mi propio gems mirror local, pasemos a la acción:

primero tenemos que editar el archivo de configuración para nuestro gem mirror:

emacs -nw ~/.gemmirrorrc y ponemos el siguiente contenido:

--- 
- to: /home/gemsmirror/rubygems.mirro 
  from: http://gems.rubyforge.org

noten que yo voy a poner mi mirror en la carpeta /home/gemsmirror/rubygems.mirror pero uds la pueden poner en cualquiera que quieran.

luego de esto ejecutamos el comando

gem mirror

y después un largo pero largo rato (a mí esto me llevó como un mes con interrupciones, son como 16GB de gemas) se baja todas las gemas del mirror remoto. Una vez hecho y terminado esto tenemos que configurar nuestro servidor web para que publique el mirror, yo lo hice con apache, así sería:

emacs -nw /etc/apache2/sites-available/gemsmirror

y ponemos lo siguiente



        ServerName gems.localhost
        ServerAdmin root@gems.localhost
        DocumentRoot /home/gemsmirror/rubygems.mirror/
        
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
        

        
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
       #AuthName "Dev Access"
       # AuthType Basic
       # AuthBasicProvider file
        # AuthUserFile /opt/coolstack/apache2/conf/htpasswd.users
       # Require user gems
# user: gems
# pass: password
                Order allow,deny
                allow from all
        

        ErrorLog /var/log/apache2/error-gemsmirror.log
        LogLevel warn
        #CustomLog /var/log/apache2/access-gemsmirror.log combined
        ServerSignature Off


Lo puse sin autenticación por que yo solamente le doy un uso local pero si quieren publicarlo en internet sería razonable ponerle clave.

Ahora habilitamos el site de mirror

a2ensite gemsmirror

y agregamos el host:

emacs -nw /etc/hosts

ponemos lo siguiente:

....
######################################################################
# Gemsmirror local
127.0.0.1 gems.localhost

.....

Ahora recargamos el apache:

/etc/init.d/apache2 reload

y vamos al navegador y chequeamos que se vean el directorio de nuestro mirror en:

http://gems.localhost/

si todo está bien agregamos nuestro mirror local al gemrc:

 emacs -nw ~/.gemrc
--- 
:sources: 
- http://gems.localhost
#- http://gems.rubyforge.org/
#- http://gems.github.com
#- http://gemcutter.org/
#- http://gems.github.com
:bulk_threshold: 1000
:benchmark: false
:update_sources: true
:backtrace: false
:verbose: true

fijensé que yo comenté todos los demás mirrors, de esta manera sólo busca las gemas en el mirror local y al instalar o buscar cualquier cosa la velocidad es increíble :), ahora solo resta pner un cron para que actualice el mirror diariamente (por la noche) y listo.

Eso es todo, enjoy !