lunes, 10 de marzo de 2014

Depurar Rails usando Vim

Llevo ya algún tiempo intentando depurar en Vim las aplicaciones Rails en las que trabajo. Esto debería de ser sencillo utilizando la gema debugger-xml y el plugin para vim vim-ruby-debugger, pero me encontrado una serie de problemas más debidos a los distintos entornos de desarrollo que a temas técnicos.

En ASPgems utilizamos en los proyector Rails bundler, así todos los desarrolladores y en todos los entornos utilizamos las mismas versiones de las distintas gemas.
Por otro lado, hay bastante libertad en los IDEs a utilizar entre los distintos miembros de los equipos, por lo que cada uno utiliza el que más le gusta, así unos RubyMine, otros Vim,  SublimeText, etc ... Y es aquí donde aparecen los problemas, a RubyMine historícamente no le ha gustado mucho las gemas para depuración que no utiliza él. Parece ser que en la versión 6 de RubyMine estos problemas se han solucionado si utilizas debugger-xml versión 0.3.3, para versiones anteriores de RubyMine( y creo que sólo a partir de la 4.3) hay que utilizar algún truquillo como comentan en stackoverlow.

De todas formas voy a pasar a detallar como instalar todo lo necesario para depurar aplicaciones Rails con Vim:

  1. Instalar en Vim el plugin vim-ruby-debugger.
    Yo uso Vundle para gestionar los plugins en Vim por lo que sólo hay que añadir esta línea a .vimrc.

    Bundle 'astashov/vim-ruby-debugger'
    y posteriormente ejecutar
    :BundleInstall
    Con esto ya tenemos instalado el plugin en vim.

  2. Añadir al Gemfile la gema de depuración, aquí es donde hay que tener en cuenta que no se cargue cuando se use RubyMine. Para ello añadimos la siguiente línea.
    gem 'debugger-xml', {group: [:test, :development]}.merge(ENV['RM_INFO'] ? {require: false} : {})
    posteriormente ejecutar en la linea de comandos 
    # bundle install
Ahora ya tenemos todo lo necesario para poder depurar aplicaciones Rails con Vim.


Para arrancar el depurador dentro de Vim utilizamos
:Rdebugger
si por otro lado queremos depurar por ejemplo una tarea rake pues ejecutamos
:Rdebugger 'rake nombre_de_la_tarea'

Los comandos más comunes son estos:

 <leader>b - Añade/elimina un punto de ruptura.
 <leader>d - Borra todos los puntos de ruptura.
 <leader>v - Abre/Cierra la ventana de variables.
 <leader>n - Paso a paso sin entrar en la función.
 <leader>s - Paso a paso entrando en la función.
 <leader>c - continuar ejecucion.

miércoles, 31 de marzo de 2010

Configurar las teclas < y > en el Eeepc

He instalado la ultima version de Leeenux en mi Eeepc.
A pesar de que tengo este bug con el disco ssd en el arranque, parece ser que el workaround funciona.

Así que, ya sólo me falta configurar las teclas de < y > porque no hay tecla en mi configuración del teclado en español.

Para ello hay que usar xmodmap, es bastante sencillo. Se crea el fichero .Xmodmap en el home del usuario con el siguiente contenido.


keycode 52 = z Z z Z less guillemotleft
keycode 53 = x X x X greater guillemotright


Con esto las tendremos en las teclas z y x.




sábado, 6 de marzo de 2010

Como controlar el PC desde Twitter en Linux

Llevaba dándole vueltas hace tiempo al tema de controlar mínimamente el servidor de casa desde dentro. Primero pensé en una serie de correitos a través de GMail, pero después pensé en hacerlo
utilizando Twitter. Todos esto me surgió por varios motivos: el router hay veces que se queda colgado y no me entero, pero lo curioso es que si que tiene acceso al exterior, últimamente me
salta el automático de casa con demasiada frecuencia y claro si estoy fuera pues se me estropea lo que hay en la nevera y mi acuario también sufre bastante.

Me puse a buscar a ver si existía algún programa que me lo permitiera, más que nada para no reinventar la rueda (aunque esto suela ser divertido), y claro encontré esto . El problema es que funciona sólo en Windows (hay que ser gañan en los tiempos que vivimos), y no encontré nada parecido que funcionase en mi Ubuntu.

Encontré este API para python, así que manos a la obra, además python no puede ser muy dificil.

Antes de nada es muy importante que la cuenta de Twitter que se use no sea pública porque si no todo el mundo va a poder controlar el PC. Yo de momento los comandos que le he añadido son un ping, uno para obtener la IP (pública y privada), varios para gestionar el router.

Añadir un comando es tan fácil como definir una función que se llama comando_command, y dentro de esta función llamar al comando que queramos.

Luego se añade este script al cron para que lo ejecute cada X minutos y ya esta, controlando el PC desde fuera de casita con comando del tip 'rc ping', 'rc ip', etc...

Ahora sólo hay que mandar un mensaje privado a la cuenta que vamos a usar de la forma 'rc comando' y a esperar el resultado.

Aquí dejo el script:

import twitter
import os
import socket
import urllib2
import fcntl
import struct
import cStringIO
import tokenize
import string



global api

usuario='usuario_twitter'
passwd='password_twitter'
tmp_file='/tmp/twmylin.tmp'

old_id=0

def set_old_id(id):
f = open(tmp_file, 'w')
f.write(str(id))

def get_old_id():
try:
f = open(tmp_file, 'r')
id = int(f.readline())
except Exception:
id = 0
return id



def get_interface_ip(ifname):

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

return socket.inet_ntoa(fcntl.ioctl(

s.fileno(),

0x8915, # SIOCGIFADDR

struct.pack('256s', ifname[:15])

)[20:24])

def get_lan_ip():

ip = socket.gethostbyname(socket.gethostname())

if ip.startswith("127.") and os.name != "nt":

interfaces = ["eth0","eth1","eth2","wlan0","wlan1","wifi0","ath0","ath1","ppp0"]

for ifname in interfaces:

try:

ip = get_interface_ip(ifname)

break;

except IOError:

pass

return ip
def send_twitter(m):
msg='#twmylin '+ m
status = api.PostUpdate( msg)

def ping_command(tokens):
send_twitter('Estoy vivo')

def ip_command(tokens):
pub_ip='not found'
try:
pub_ip = urllib2.urlopen("http://whatismyip.com/automation/n09230945.asp").read()
except Exception:
pass

send_twitter('int:' + get_lan_ip() + ', pub:' + pub_ip)


def top_command(tokens):
s = 'top: error'
try:
f = os.popen("top -b -n1")
for i in range(0, 5):
send_twitter (f.readline())
except Exception:
send_twitter(s)


def router_check_command(tokens):
s = 'router_check: error'
try:
f = os.popen("/data/bin/router_check.sh")
f = os.popen("tail -n2 /data/bin/router_stat.txt")
s=''
for i in range(0, 2):
s+= f.readline()
except Exception:
pass

send_twitter(s)

def router_sincro_command(tokens):
s = 'router_connect: error'
try:
s = "try router_sincro"
send_twitter(s)
f = os.popen("/data/bin/router_sincro.sh")
except Exception:
pass

def router_reboot_command(tokens):
s = 'router_reboot: error'
try:
s = "try router_reboot"
send_twitter(s)
f = os.popen("/data/bin/router_reboot.sh")
except Exception:
pass

# Main
api = twitter.Api(username=usuario, password=passwd)

old_id=get_old_id()

status=api.GetDirectMessages()


for s in status:
if s.id > old_id:
old_id=s.id
set_old_id(old_id)
tokens = list(tokenize.generate_tokens(cStringIO.StringIO(s.text).readline))
if tokens[0][0] ==1 and tokens[0][1] == 'rc':
globals()[tokens[1][1]+'_command'](tokens)


lunes, 25 de enero de 2010

Como reproducir videos HD con XBMC y Atom 330

Para reproducir videos en 720p y 1080p, con XBMC a primera vista pues no funciona muy bien.
Ya se que la tarjeta gráfica no es muy potente, pero mirando el uso que se hace de la CPU parece que no esta usando los 2 núcleos que tiene el Atom 330.
Buscando un poco veo que ffmpeg no es multithread, ahí parece que va a estar el problema y buscando un poco más veo que mplayer se puede compilar con ffmpeg-mt que es la versión experimental multithread de ffmpeg.
Asi que manos a la obra, instalamos mplayer-mt de este repositorio:

https://launchpad.net/~rvm/+ppa-packages

Una vez que está instalado hay que configurar XBMC para que los videos en HD los reproduzca con la versión de multithread de mplayer que acabamos de instalar.


Para ello buscando en el wiki de XBMC encontramos este link que nos dice como se hace.
Resumiendo hay que editar el contenido del fichero ~/.xbmc/userdata/playercorefactory.xml con este contenido:


<playercorefactory>
<players>
<player name="MPlayer" type="ExternalPlayer" audio="true" video="true">
<filename>/usr/bin/mplayer</filename>
<args>-fs -lavdopts threads=4 -lavdopts lowres=1:fast:skiploopfilter=all "{0}"</args>
<hidexbmc>false</hidexbmc>
<hideconsole>true</hideconsole>
<hidecursor>true</hidecursor>
<forceontop>true</forceontop>
</player>
</players>
<rules action="prepend">
<rule filename=".*720.*|.*1080.*" player="MPlayer"/>
</rules>
</playercorefactory>


Con esto cuando el nombre del fichero que queramos reproducir tenga 720 o 1080, se usará MPlayer en lugar del reproductor por defecto de XBMC.

Editado: Con el codec CoreAVC de windows se ven mucho mejor. Aqui se muestra como instalarlo en ubuntu

miércoles, 20 de mayo de 2009

Montando imagen hecha con partimage

Después de instalar ubuntu jaunty en el eee y ver que todo funciona correctamente, hay que recuperar los datos que tenia antes del backup que hice.

El tema es que el backup lo hice clonando el disco SSD entero utilizando Clonezilla. He estado investigando que Clonezilla utiliza partimage para hacer el backup. Asi que he encontrado este link, en el que explican como montar la imagen y asi poder copiar los ficheros.

La única dificultad que he encontrado es que partimage parte los ficheros. Por lo que antes he tenido que hacer los siguiente:


amoyse@airune:~$ cat sda1.aa sda1.ab sda1.ac sda1.ad > sda1.img


Ahora es este fichero el que utilizare pare restaurar los datos como indica el link anterior, aquí esta el resumen de los pasos a seguir:


amoyse@airune:~$ dd if=/dev/zero of=myharddisk.img bs=1000 count=0 seek=$[1000*1000*SIZE]
amoyse@airune:~$ losetup /dev/loop0 myharddisk.img
amoyse@airune:~$ partimage restore /dev/loop0 sda1.img
amoyse@airune:~$ losetup -d /dev/loop0
amoyse@airune:~$ mount myharddisk.img /path/to/dir -o loop

jueves, 14 de mayo de 2009

Instalando ubuntu 9.04 en EeePC 701 8G

Me he decidido a cambiar el Debian Lenny + LXDE que tenía instalado en el EeePC por ubuntu 9.04.
La verdad es, que la instalación ha sido muy sencilla desde un Pendrive USB. Sólo he tenido que seguir las instrucciones de la propia página de Ubuntu y todo ha funcionado a la primera, la wifi, la webcam, el sonido, etc...

Ahora que ya lo tengo instalado, hay que retocar un par de cosillas para que todo vaya incluso algo mejor:
Lo primero ver este post.
  • Mover las ventanas con Alt + Ratón
Hay que poner esta linea en el terminal, como nos cuentan en este hilo de eeeuser:

amoyse@airune:~$ gconftool-2 --type bool --set /apps/compiz/plugins/move/allscreens/options/constrain_y 0
  • Instalar un kernel optimizado para mi modelo 701.
Sólo hay que seguir las instrucciones de esta página http://www.array.org/ubuntu/index.html.

  • Ficheros temporales en RAM
Para este punto he seguido las indicaciones de este post, resumiendo,
. hay que añadir en el /etc/fstab estas lineas:

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0

. Parar el servicio sysklogd, borrar los ficheros tempores y montar los nuevos directorios:

amoyse@airune:~$ sudo /etc/init.d/sysklogd stop
amoyse@airune:~$ sudo rm -rf /tmp/*
amoyse@airune:~$ sudo rm -rf /var/log/*
amoyse@airune:~$ sudo rm -rf /var/tmp/*
amoyse@airune:~$ sudo mount -a
amoyse@airune:~$ sudo /etc/init.d/sysklogd start

  • Optimizar Firefox. Para ello hay que seguir los consejos de este página.
. Utilizar un tema compacto classic compat
. Hacer más pequeña la letra.
. Instalar el complemento Fission.
. Instalar el complemento Fullscreener.
. Instalar el complemento para un menú más pequeño, como Personal Menu.
. Instalar el complemento para delicious.
. Mover la cache a ramdisk. Para ello modificar las siguientes propiedades desde about:config
browser.cache.offline.enable poner a false
browser.cache.disk.parent_directory a un directorio que sea ramdisk (como /var/tmp).
  • Eeepc utilities. Se instala como indica este hilo. O si prefieres estas otras.

jueves, 9 de abril de 2009

DNIe en Ubuntu Intrepid con lector C3PO LTC31

Me he comprado el lector de DNIe C3PO LTC31 y me he puesto manos a la obra para utilizarlo con Ubuntu Intrepid. Para ello he seguido las instrucciones de este post . Pero me he encontrado con un par de problemas que parece que ya he solucionado.

De los paquetes a instalar el openct no se lleva bien con el opencs, por lo que no hay que instalarlo. Por lo tanto los paquetes a instalar serian:


amoyse@minia:~$ sudo apt-get install libccid libpcsclite1 pcscd libopensc2 pinentry-gtk2 opensc mozilla-opensc pcsc-tools libnss3-tools libnspr4-0d libnss3-1d


Después hay que instalar el paquete correspondiente que nos podemos descargar de la web oficial de DNI electrónico. Al instalar este último paquete se nos configura el navegado firefox y se instala el certificado raíz.

Editado:

Para que funcione en Firefox, hay que hacer los siguientes pasos:

1. Registrar el dispositivo, para ello ejecutar esta URL desde Firefox:

file:////usr/share/opensc-dnie/instal_dnie/instala_modulo.htm

Si este paso falla, asegurarse que esta la tarjeta con el DNI conectada al PC y
el servicio pcscd arrancado. Para arrancarlo:

amoyse@minia: ~$ sudo /etc/init.d/pcscd start

2. Registrar el certificado raíz, para ello ejecutar esta URL desde Firefox:

file:////usr/share/opensc-dnie/instal_dnie/ac_raiz_dnie.crt

y marcar los 3 check que aparecen en la pantalla.