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.

miércoles, 11 de marzo de 2009

Datos externos EPG en VDR

Buscando en la web he encontrado un plugin para el proyecto VDR que permite cargar datos desde la web de sincroguiatv así como de otros formatos.

Además este plugin funciona en el TDT de Siemens m740av si le ponemos el firmware VDR que podemos obtener aquí.

De todos es sabido la mala calidad de la EPG que emiten por antena las cadenas españolas, por lo que este plugin es muy útil.

Se me olvidaba, hay que tener el TDT conectado a Internet.

viernes, 6 de marzo de 2009

Grabar radio online con vlc

En los últimos días me ha surgido la necesidad de grabar la radio por internet para luego reproducirla posteriormente. Básicamente porque rojadirecta.com parece que esta un poco saturada para los partidos online sin programas P2P.
Tendre que usar sopcast y sincronizar el audio.

Así que me he puesto manos a la obra y tirando de manual es muy fácil grabar la radio online utilizando vlc. El formato en la que voy a grabarlo es en ogg y la linea de comando es esta:


amoyse#cvlc url_emisora radio --sout "#transcode{acodec=vorb,ab=64,channels=2}:duplicate{dst=std{access=file,mux=ogg,dst=fichero_salida.ogg}}"

los parametros son url_emisora y fichero_salida.ogg

miércoles, 21 de enero de 2009

Cambiando el ventilador a la placa D945GCLF2

La placa D945GCLF2 con su Atom Dual Core funciona muy bien, lo tengo todo el dia encendida con un cliente torrent (torrentflux-b4rt + apache + mysql + php) y XBMC como Media Center.

Sólo tiene un pero, el ventilador que hay encima de chipset hace mucho ruido, es un modelo T&T 4010H12S. Lo he cambiado por un Scythe Mini-Kaze de 40mm x 10mm.

Es supersilencioso, ya no se oye nada. Es el cambio perfecto.

sábado, 3 de enero de 2009

Instalar XBMC en intrepid

Como media center de momento voy a utilizar XMBC.

Para instalarlo en intrepid, creamos el fichero /etc/apt/source.list.d/xbmc.list con el siguiente contenido.

deb http://ppa.launchpad.net/team-xbmc-intrepid/ubuntu intrepid main
deb-src http://ppa.launchpad.net/team-xbmc-intrepid/ubuntu intrepid main

deb http://ppa.launchpad.net/xbmc-addons/ubuntu intrepid main
deb-src http://ppa.launchpad.net/xbmc-addons/ubuntu intrepid main


E instalamos los paquetes necesarios:

amoyse@minia:~$ sudo apt-get update
amoyse@minia:~$ sudo apt-get install xbmc


si queremos mas temas

amoyse@minia:~$ sudo apt-get install xbmc-skin*

si queremos mas plugins

amoyse@minia:~$ sudo apt-get install xbmc-plugins*

si queremos mas scripts

amoyse@minia:~$ sudo apt-get install xbmc-scripts*

Instalando torrentflux-b4rt en ubuntu intrepid

Voy a instalar el cliente de bittorrent torrentflux-b4rt. He elegido este cliente por el acceso web y por que puedes bajar tambien programas por http (usa wget).

Lo primero es instalar apache, mysql, php, vlc y uudeview:

amoyse@minia:~$ sudo apt-get install mysql-server apache2 php5 php5-cli libapache2-mod-php5 php5-mysql unrar uudeview vlc

A continuación bajamos el paquete de la web de torrentflux-b4rt y lo descomprimimos en /opt

amoyse@minia:~$ cd /opt

amoyse@minia:~$ tar xjf torrentflux-b4rt_1.0-beta2.tar.bz2

Hacemos un link desde el docroot de apache y le cambiamos el usuario:

amoyse@minia:~$ sudo ln -s /opt/torrentflux-b4rt_1.0-beta2/html/ /var/www/tf
amoyse@minia:~$ sudo chown -R www-data:www-data /var/www/tf

El siguiente paso es configurarlo, para ello se abre firefox y se conecta a:

http://localhost/tf/setup.php

Y siguiendo los pasos por pantalla se configura de manera muy sencilla.


Lo siguiente a realizar es configurar para que el demonio fluxd se arranca al iniciar el ordenador, con ello sabremos que siempre tenemos los torrents en ejecucion.

Para ello copiamos este script en el fichero /etc/init.d/fluxd, cambiamos el path dentro del script donde se encuentra nuestra instalación y lo instalamos para el arranque con este comando:

amoyse@minia:~$ sudo update-rc.d fluxd defaults 99


En otro post pondre los scripts necesarios para mover los torrents completados a otro directorio.

miércoles, 31 de diciembre de 2008

Compartir directorios con NFS

Ahora que ya tengo funcionando el pequeñín, el siguiente paso es compartir el directorio de datos con el resto de equipos de la red. Para ello voy a utilizar NFS.

Para hacerlo rápidillo de googleado un poco y he encontrado esta entrada.

  1. En el servidor instalamos los siguientes paquetes:

    amoyse@mini-a:~$ sudo apt-get install nfs-common nfs-kernel-server

  2. Añadimos en el fichero /etc/exports los directorios que queremos exportar, a los que se podrá acceder desde los clientes.

    amoyse@mini-a:~$ sudo vi /etc/exports

    /data 192.168.1.0/24(rw,async)


  3. En el cliente instalamos los siguientes paquetes:

    root@ubuntu:~#apt-get install nfs-common portmap

  4. Añadir el directorio a montar en el cliente /etc/fstab

    root@ubuntu:~$ sudo vi /etc/fstab

    192.168.1.50:/data /mnt/minia nfs rsize=8192,wsize=8192,timeo=14,intr,auto,user


Y ya tenemos compartidos nuestro directorio por NFS

domingo, 21 de diciembre de 2008

Instalando Ubuntu Intrepid

Ahora que ya tengo montado el PC hay que instalar un S.O.
He elegido Ubuntu Intrepid, porque la idea es tener Linux, y tampoco quiero complicar demasiado su mantenimiento.

La instalación la he hecho con un CD externo, porque el equipo no lleva Lector. También se puede hacer desde red sin mayor complicación.

Después de la instalación todo ha funcionado perfectamente, salvo el control de escalado de la CPU que todavía no lo he conseguido.

El siguiente paso es instalar un media center para usarlo de reproductor.

sábado, 20 de diciembre de 2008

Montando mini-itx con placa Intel D945GCLF2 Atom Dual Core

Los Componentes

Queria montar un ordenador que cumpliera los siguientes requisitos:
  • Tenerlo encendido las 24 horas (bajo consumo).
  • Cliente bittorrent.
  • HTPC para utilizar en el salón como reproductor multimedia.
  • Silencioso.
  • Pequeño, para poder tenerlo detrás de la televisión.
  • Económico, tampoco vamos a tirar la casa por la ventana.

Al ser pequeño me he decantado por una placa mini-itx, revisando las placas que hay en el mercado, la mejor opción calidad/precio que he encontrado ha sido una con microprocesador Intel Atom. Por la diferencia de precio, ya merecia la pena una con Atom Dual Core (330).
Otro problema era encontrar una caja valida para esta placa, parece ser que Intel ya ha recortado el tamaño del disipador que traian las placas con Atom y ya caben en cajas más estandar.

Al final lo que he montado ha sido esto:
  • Placa Mini-ITX Intel D945GCLF2
  • Caja Mini-ITX Morex T3310B
  • Memoria RAM DDR2 667 2Gb Kingston Value CL5
  • Disco SATA 2.5" 320Gb Momentus
Todo por 250 € (IVA incluido) y comprado a principios de Diciembre 2008 (puede que ya este hasta más barato).

Montando el equipo

El montaje ha sido muy sencillo (sólo hay 4 componentes), en 20 minutos está todo, ahora solo falta encenderlo y ver que todo funciona correctamente. Aquí dejo unas fotos del proceso:

La Caja Morex:








La placa Intel, el disco duro y la memoria:







Montandolo todo junto:










Así queda al final todo dentro de la caja: