SSH con colores por host

Tras buscar y rebuscar en varios sitios, por fin he encontrado una forma hacer que mi terminal cambie de conjunto de colores al conectarme por ssh a un host determinado. Así, ya puedo hacer que cuando me conecte a los servidores de producción se cambie automáticamente a unos colores chillones, para recordarme que no tengo que tener los dedos demasiado largos.

La respuesta era Roxterm, un terminal que admite la configuración sobre la marcha de algunas opciones, cosa que no permite el gnome-term. Lo explican en este blog: http://michael.mior.ca/2011/03/06/coloured-ssh-terminals/

Lo único que me he encontrado es que la opción de ssh LocalCommand no se lleva muy bien con ControlMaster auto. Lástima, con lo rápido que se conectaba con el ControlMaster

El misterio de las cursivas monoespaciadas que no eran monoespaciadas

Desde hace algún tiempo, había notado que RubyMine me hacía cosas raras con las fuentes. El programa usa, de toda la vida, un tipo de letra monoespaciado para los ficheros fuente (.rb, .js, .html, etc), y sin embargo los comentarios o determinadas palabras clave que se mostraban en cursiva, dejaban de estar en monoespaciado, con lo incómodo que es eso a la hora de tener un código bien indentado.

En principio pensé que era la última versión de RubyMine, que tenía algún fallo. Pero después de buscar pude comprobar que no era problema de RubyMine, sino de las aplicaciones Java en general, y de los paquetes de fuentes en particular. Mi fuente por defecto es la DejaVu, que está separada en 2 paquetes (ttf-dejavu-core y ttf-dejavu-extra), siendo el extra el que contiene el tipo de letra monoespaciado. Parece que al actualizar a Natty borré algún paquete de fuentes que me proporcionaba el monoespaciado, o no instalé de nuevo el ttf-dejavu-extra, y de ahí el problema.

Al final se soluciona instalando el paquete que agrupa a esos dos paquetes, el ttf-dejavu:

sudo apt-get install ttf-dejavu

Redireccionar todas las peticiones a un puerto hacia localhost

El proyecto en el trabajo actualmente utiliza subdominios del dominio principal, y limita las capacidades o redirige a otro dominio en función del punto de entrada o del usuario, por lo que cuando desarrollo en local necesito que mi ordenador responda las peticiones a todos esos dominios como si fuera al localhost.

La solución rápida con la que he estado trabajando hasta ahora es modificar el fichero /etc/hosts y añadir tantos nombres a la IP 127.0.0.1 como dominios necesito. Algo como esto:

127.0.0.1 myproject.com www.myproject.com company1.myproject.com

Como digo, es la solución rápida, pero no la más cómoda, ya que para cada dominio nuevo que necesite tengo que modificar el fichero hosts, reiniciar el navegador (supongo que habría que limpiar la cache de DNS en lugar de hacer esto) y volver a probar.

Cansado de tener que hacerlo cada dos por tres (si repito algo más de 3 veces, siempre busco una solución para no tener que hacerlo más), he estado buscando una forma de agilizar el proceso, pero no daba con la solución.

En primer lugar intenté ver si con un proxy local me podía valer, pero no encontré ninguno que me permitiera cambiar la dirección IP destino en función del dominio. Por lo que me fui al tema de servidores de DNS locales, y ahí encontré una solución intermedia con Dnsmasq, mediante el cual podía tener dominios “*.myproject.dev” que se redirigían al servidor local, pero que no acababa de convencerme.

Al fin, Alex me dio la solución: usar iptables. La idea es que todas las URLs que vayan a un puerto determinado, en lugar de ir al destino original, acaben en mi ordenador. Por ejemplo, si escribo http://www.google.com:3000 en la barra de direcciones, en lugar de ir a google, se hará una petición a mi ordenador en el puerto 3000. Mola.

La solución es ejecutar  la siguiente linea:

sudo iptables -t nat -I OUTPUT -p tcp 
      --dport 3000 -j DNAT --to-destination 127.0.0.1

et voila!. Todas las peticiones salientes al puerto 3000 se reencaminarán a mi ordenador.

Si en lugar de redirigir todas las peticiones, sólo quisiéramos redirigir las de un servidor determinado, se le puede indicar mediante la IP. Por ejemplo, con la siguiente línea redirigiría todas las peticiones al puerto 3000 de www.google.es a mi ordenador:

sudo iptables -t nat -I OUTPUT -p tcp -d 216.239.59.104 
      --dport 3000 -j DNAT --to-destination 127.0.0.1

Usando múltiples Rubies con RVM

Lo primero que hice, incluso antes de empezar a trabajar en la empresa, fue instalarme Ruby 1.8.7 en mi Ubuntu, junto con Rails 2.3.5 y algunas gemas como mongrel. Para ello, seguí los howtos que fui encontrando por internet, como este de Hakido. Tras dejarlo todo configurado, al arrancar Eclipse te configura algunas gemas más como linecache, ruby-debug-ide y ruby-debug-base, con lo que ya tenía todo configurado para empezar a trabajar.

Sin embargo, en seguida te das cuenta de que si vas a tener que trabajar en varios proyectos, cada uno iniciado en un momento distinto con distintas versiones de Ruby y/o Rails, entonces cambiar de proyecto se puede hacer algo incómodo. La solución para ello, por supuesto, ya está pensada y es RVM (Ruby Version Manager).

RVM te permite tener distintas versiones de Ruby funcionando al mismo tiempo, con sus gemas particulares, y lo que es mejor, puedes tener todas las combinaciones de ruby/gemas que quieras. De esta forma, podemos tener un Ruby 1.8.6 con Rails 2.3.4, otro 1.8.6-2.3.5, otro 1.8.7-2.3.5 y otro 1.9.2-3.0.0. Simplemente cambias de configuración con un solo comando y a trabajar.

Al final, he desinstalado todo lo que tenía instalado de ruby en el sistema y lo he vuelto a instalar con RVM de la siguiente forma:

En primer lugar, instalamos las dependencias necesarias:

sudo apt-get install git-core curl zlib1g-dev libreadline5-dev

Después instalamos RMV. Como por ahora no hay un paquete .deb para ubuntu, lo bajamos desde Github:

mkdir -p ~/.rvm/src/rvm/
cd ~/.rvm/src
git clone http://github.com/wayneeseguin/rvm.git
cd rvm
./install

Ahora hay que añadir la siguiente línea en los ficheros ~/.bashrc y ~/.bash_profile

if [[ -s ~/.rvm/scripts/rvm ]] ; then source ~/.rvm/scripts/rvm ; fi

Cerramos y volvemos a abrir la shell para que nos pille los cambios, y ya estamos listos para instalar las versiones de ruby que necesitemos. Por ejemplo, si queremos instalar las versiones 1.8.7, 1.9.1 y jruby, haremos lo siguiente:

rvm install 1.8.7,1.9.1,jruby

Lo cual tardará un rato, pues debe descargar y compilar todas las versiones que les hemos dicho. Para seleccionar una versión en concreto:

rvm use 1.8.7

Y para hacer que una versión en concreto esté seleccionada siempre por defecto:

rvm use 1.8.7 --default

Ahora ya podemos instalar las gemas que necesitemos en esta versión de ruby, como rails, mongrel, …

gem install rails mongrel linecache ruby-debug-base ruby-debug-ide

que se instalarán sólo en la versión de ruby que esté actualmente activa.

Eclipse, sin embargo, tiene problemas para pillar el entorno de desarrollo correcto, por lo que tenemos que modificar el script de arranque y poner algo como esto para arrancar eclipse con la versión por defecto de ruby (podemos sustituir default por una versión concreta si queremos):

bash -cl "rvm default; eclipse"