Datos personales

miércoles, 8 de diciembre de 2010

Ekiga, sipdroid y PBXes

PBXes es un sistema de centralita (PBX) virtual que nos permite, entre otras cosas, acceder a funcionalidades avanzadas desde nuestro cliente SIP.

En este artículo exploramos la utilización de PBXes como puente para hacer y recibir llamadas VoIP desde un teléfono Android. También veremos como conectar con usuarios que disponen de cuenta en Ekiga.

Escenario

  • Operador: Vodafone España
  • Teléfono: HTC Magic (Android 1.6)
  • Ekiga 2.0.12 sobre Debian Lenny

Crear y configurar cuenta en PBXes

En primer lugar, crearemos un usuario en http://www.pbxes.com.

A los efectos del ejemplo, nuestro usuario se llamará manolo y, al terminar el proceso de alta, recibiremos el identificador SIP manolo@pbxes.org.

Configurar una extensión

El siguiente paso consiste en crear un número de extensión dentro de nuestra cuenta. Esta extensión se asociará posteriormente con el teléfono móvil y también se usará como destino para las llamadas entrantes.

Escogemos "Internos->Añadir Interno" y seleccionamos "SIP". Sólo es necesario asignar un número de extensión, un texto identificativo de nuestra elección y una contraseña para acceder a la extensión.

Estos datos los usaremos después para configurar el cliente sipdroid en nuestro teléfono. A los efectos de nuestro ejemplo, el número interno será 100.

Configurar enlaces con el exterior

El siguiente paso es configurar un enlace "trunk" para poder hacer y recibir llamadas.

En nuestro caso vamos a configurar una conexión con ekiga.net, para lo cual escogeremos "Troncales -> Agregar troncal" y "Agregar troncal SIP; una vez ahí configuraremos de esta forma con nuestro usuario en Ekiga.net:


Establecer ruta para llamadas entrantes

Para poder recibir llamadas será necesario establecer una ruta DID. Se permite hacer enrutamiento en base a distintos parámetros: troncal por el que entra la llamada, identificador del usuario remoto, etc.

Por simplicidad, vamos a enrutar todas las llamadas entrantes  incondicionalmente a una extensión interna (la que luego asociaremos al teléfono).

Escogemos "Rutas DID -> Add Incoming Route" y configuramos de esta forma:


Instalar y configurar sipdroid

La instalación de sipdroid se lleva a cabo directamente desde Market.

Una vez instalada, configuraremos una cuenta SIP indicando los siguientes datos:
  • Authorization username: El identificador de usuario la extensión interna que queremos asociar al teléfono. Este identificador está compuesto por nuestro nombre de usuario en pbxes.com y el número de extensión (en nuestro caso, manolo-100).
  • Contraseña: La que hayamos asociado al identificador de la extensión.
  • Protocolos: WLAN y/o 3G

Probando la configuración

Desde nuestro cliente Ekiga, simplemente llamaremos empleando el identificador SIP que tenemos en PBXes (manolo@pbxes.org). La llamada se tiene que enrutar al número interno que configuramos en los pasos anteriores y, por lo tanto, será recibida en el terminal Android.

En el caso de sipdroid, no se puede llamar a identificadores SIP directamente desde el teclado telefónico de Android. Tendremos que agregar a un contacto una nueva dirección de chat. En nuestro caso, manolo@ekiga.net.

Una vez hecho esto, abriremos el contacto en cuestión y escogeremos "Chatear". Si todo funciona correctamente, la llamada entrará en Ekiga.

Conectar Ekiga a PBXes

Adicionalmente, podemos crear una segunda extensión y conectar Ekiga directamente a PBXes:


Con dos extensiones podemos jugar con las opciones de enrutamiento de llamadas entrantes para que, por ejemplo, las llamadas en horario laboral entren por Ekiga y el resto por el móvil.

Referencias

sábado, 27 de noviembre de 2010

Automatización de escritorio en Debian Lenny

Introducción


Para los que se pasan el día escribiendo "novelas" en el ordenador y echan de menos que su cliente de correo (por ejemplo) no disponga de un sistema de macros, resultará interesante la utilidad Autokey.

Autokey permite definir macros que se expanden de forma automática en cualquier aplicación de nuestro escritorio. Estas macros pueden consistir incluso en scripts Python.

NOTAS:
  • Los usuarios de Windows y Mac pueden usar Autohotkey o TextExpander, respectivamente.
  • Los autores de Autokey perecen recomendar IronAHK como un auténtico sustitudo de Autohotkey, pero al estar basado en .NET me parece demasiado pesado para lo que yo necesito.

Instalación en Debian Lenny

Dado que no existe paquete para Lenny, recompilaremos el paquete disponible para Squeeze.

Bajamos el paquete fuente desde http://packages.debian.org/source/squeeze/autokey, lo extraemos y entramos al subdirectorio generado durante este proceso:

$ dpkg-source -x autokey_0.71.0-1.dsc
$ cd autokey-0.71.0/

Editamos el fichero debian/control para sustituir las dependencias python > 2.6 por dependencias python > 2.5.

También se podría aprovechar para declarar la dependencia con los paquetes python-simplejson (sin el cual, la aplicación se instala, pero no se ejecuta) y python-xlib (necesario para instalar).

Compilamos el paquete y lo instalamos:

$ sudo aptitude install build-essential cdbs wmctrl python-simplejson python-xlib
$ cd autokey-0.71.0/
$ dpkg-buildpackage
$ cd ..
$ sudo dpkg -i autokey-common_0.71.0-1_all.deb
$ sudo dpkg -i autokey-gtk_0.71.0-1_all.deb

Una vez terminado el proceso, aparecerá la entrada correspondiente en el menú "Accesorios". Este es un pantallazo de la ventana principal de la aplicación:


La forma de configurarla es bastante intuitiva, por lo que no me voy a extender más. Los detalles están en el Wiki.

Referencias

viernes, 19 de noviembre de 2010

bash: autocompletado para clusterSSH

En esta entrada vimos como activar en bash el completado automático para el comando tsclient.

En el caso de la utilidad cssh, se trata de hacer lo mismo, pero usando este script:

_bash_completion_cssh()
{
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"

        local clusters=$(grep clusters ~/.csshrc |  cut -d' ' -f '3-')
        COMPREPLY=($(compgen -W "${clusters}" -- ${cur}))
        return 0
}
complete -F _bash_completion_cssh cssh

Referencias

jueves, 4 de noviembre de 2010

bash: Autocompletado para tsclient

Utilizo habitualmente la utilidad tsclient para administrar sistemas windows y su interfaz no es demasiado cómoda a la hora de escoger alguna de las conexiones que ya tengo guardadas en el directorio ~/.tsclient

El siguiente script bash activará el autocompletado para el comando tsclient, de forma que, la primera pulsación del tabulador mostrará directamente la opción -x y la segunda listará las conexiones que tenemos disponibles dentro de ~/.tsclient.

_bash_completion_tsclient()
{
 local cur prev opts
 COMPREPLY=()
 cur="${COMP_WORDS[COMP_CWORD]}"
 prev="${COMP_WORDS[COMP_CWORD-1]}"

 opts="-x"

 case "${prev}" in
  -*)
    local conexiones=$(ls ~/.tsclient/*.rdp)
    COMPREPLY=($(compgen -W "${conexiones}" -- ${cur}))
    return 0;
    ;;
  *)
  ;;
 esac

 COMPREPLY=($(compgen -W "${opts}" -- ${cur}))  
 return 0
}
complete -F _bash_completion_tsclient tsclient

Para que los cambios sean permanentes, crearemos el fichero /etc/bash_completion.d/tsclient y reinicaremos nuestro shell.

Para probarlo inmediatamente en la sesión activa basta con ejecutar:

$. /etc/bash_completion.d/tsclient

En caso de problemas, lo primero que hay que comprobar es que el siguiente código está habilitado en ~/.bashrc o en /etc/bash.bashrc:

# enable bash completion in interactive shells
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Para ver la lista de reglas que tenemos habilitadas en nuestra sesión ejecutaremos el comando complete -p

Referencias

martes, 2 de noviembre de 2010

Paquete Debian del día: Apertium-tolk y Apertium-dbus

apertium-tolk

apertium-tolk es una interfaz gráfica para el traductor Apertium que va traduciendo según escribimos.

Lo instalamos junto con un par de paquetes de idioma (Gallego-Castellano, Inglés-Castellano), de lo contrario no podremos hacer gran cosa:

$ aptitude install apertium-tolk apertium-es-gl apertium-en-es

En esta captura de pantalla ser puede observar la apariencia de esta utilidad:

Desgraciadamente, apertium-tolk tiene problemas con los caracteres no ASCII debido a la codificación por defecto que se usa en Python 2.5 (ver bug 473561)

Más información:


apertium-dbus

El paquete apertium-dbus ofrece un servicio D-Bus a través del cual podemos acceder a los servicios de traducción de Apertium.

Instalamos el paquete correspondiente junto con la utilidad qdbus, la cual, junto con dbus-monitor, nos servirá para inspeccionar las interfaces que ofrece apertium:

$ aptitude install apertium-dbus libqt4-dbus

$ qdbus | grep -i apert
org.apertium.info
org.apertium.mode

$ qdbus  org.apertium.mode 
/
/en_es
/es_en
/es_gl
/gl_es

Espiamos las peticiones que lanza apertium-tolk:

$ dbus-monitor "interface=org.apertium.Mode"

...

method call sender=:1.36 -> dest=:1.31 path=/es_gl; interface=org.apertium.Mode; member=translate
array [
dict entry(
string "mark_unknown"
string "false"
)
]
string "hola, mundo"

Con la información anterior, ya estamos listos para lanzar una petición de traducción desde la línea de comandos.

En el siguiente ejemplo, se solicita una traducción del español al gallego, indicando que se marquen con un asterisco las palabras desconocidas:

$ dbus-send --print-reply --dest=org.apertium.mode /es_gl org.apertium.Mode.translate dict:string:string:"mark_unknown","true" string:"hola, mundo"

method return sender=:1.31 -> dest=:1.147 reply_serial=2
string "ola, mundo"

En el wiki de apertium hay ejemplos similares para diversos lenguajes de programación.

Más información

sábado, 30 de octubre de 2010

Notificar estado RAID en escritorio Debian GNU/Linux

A pesar de que hay posibilidad de disponer de un applet que muestre el estado de nuestro RAID software (raid-notify, por ejemplo), hay soluciones para aquellos que aún no disponemos del paquete apropiado en nuestra distribución o que, simplemente, preferimos algo más simple y directo.

Aprovechando lo visto en esta entrada vamos a crear un script que pueda ser llamado desde la utilidad mdadm para notificar incidencias en nuestros arrays.

Creamos el fichero /home/usuario/bin/desktop-notify.sh:
#!/bin/sh
#
# REQUISITO: aptitude install libnotify-bin
#
export XAUTHORITY=/home/usuario/.Xauthority 
export DISPLAY=:0.0 
NIVEL=critical
ICONO=gtk-stop
TIMEOUT=0
ASUNTO=Aviso

for arg in "$@"
do
MENSAJE="$MENSAJE ${arg}"
done

sudo -u usuario /usr/bin/notify-send -u $NIVEL -i $ICONO -t $TIMEOUT "$ASUNTO" "$MENSAJE"
Sólo nos queda configurar mdadm para que invoque nuestro script en caso de incidencias:
$ chmod +x /home/usuario/bin/desktop-notify.sh
$ sudo echo "PROGRAM /home/usuario/bin/desktop-notify.sh" >> /etc/mdadm/mdadm.conf
$ /etc/init.d/mdadm reload
Para comprobar que todo funciona correctamente, ejecutaremos un test sobre alguno de los dispositivos definidos (ajustar /dev/md2 según el caso):
$ mdadm --monitor /dev/md2 -t
Deberemos observar algo así:

jueves, 28 de octubre de 2010

Notificaciones en pantalla desde tareas del sistema

En ocasiones es conveniente disponer de la posibilidad de mostrar avisos en el escritorio del usuario.

Mostraremos dos ejemplos que usan el comando notify-send (paquete libnotify-bin) para mostrar cada minuto un aviso en el escritorio de un usuario.

Método 1


En primer lugar, ejecutamos el comando xhost LOCAL: desde la sesión del usuario que va a recibir los avisos:

$ xhost LOCAL:
non-network local connections being added to access control list

Editamos /etc/crontab:

# m h dom mon dow user  command
*/1 *   *   *   * root  DISPLAY=:0.0 /usr/bin/notify-send "aviso" "hola mundo"


Método 2


En este caso no es necesario que el usuario intervenga. Para ello empleamos el fichero .Xauthority de quien tenga abierta la sesión gráfica.

Editamos el fichero /etc/crontab

# m h dom mon dow user  command
*/1 *   *   *   * root   XAUTHORITY=/home/usuario/.Xauthority DISPLAY=:0.0 /usr/bin/notify-send "aviso" "hola mundo"

domingo, 24 de octubre de 2010

Citas para la posteridad - Anónimo

"El tema de fondo es que la tecnología ha incumplido la Promesa. La Promesa era que los ordenadores iban a hacer por nosotros los trabajos repetitivos y rutinarios, mientras que nosotros nos dedicaríamos a pasear por la playa, a pintar cuadros y a hacer el amor.

En lugar de eso, actualizamos perfiles y competimos en ingenio en 140 caracteres.

Nos han timado, pero no ha sido Telefónica.
"

-- Anónimo. Leído en los comentarios en una noticia de un periódico digital.

(No es una cita propiamente, pero me parece muy buena y no tengo un sitio mejor donde ponerla)

domingo, 17 de octubre de 2010

Citas para la posteridad - Winston Churchill

"El vicio inherente al capitalismo es el desigual reparto de bienes. La virtud inherente al socialismo es el equitativo reparto de miseria"

--Winston Churchill

miércoles, 13 de octubre de 2010

TeamViewer sobre Debian Lenny

Actualización 4/11/2010: Ya hay disponible versión nativa para Linux (http://goo.gl/8wmEs), aunque examinando el contenido del paquete, se observa que se usa Wine y que carece de algunas opciones con respecto a la versión para Windows.

La aplicación de asistencia remota TeamViewer funciona bastante bien sobre la versión de Wine suministrada con Debian Lenny. Sólo tenemos que asegurarnos de tener instalado el paquete winbind (no es necesario que el demonio se esté ejecutando).

Copiamos la versión completa del instalador (no la versión de "Quick Support") en
~/.wine/drive_c/Archivos\ de\ programa/TeamViewer

y lo ejecutamos:

$ wine ~/.wine/drive_c/Archivos\ de\ programa/TeamViewer/TeamViewer_Setup.exe

Es cómodo instalar un acceso directo en el menu de inicio de Wine:

$ wineshelllink --menu --path ~/.wine/drive_c/Archivos\ de\ programa/TeamViewerTeamViewer_Setup.exe --link TeamViewer

El único problema que he notado hasta ahora es que no se pinta correctamente la barra de menú que flota sobre el escritorio remoto, aunque, si accionamos alguno de los botones, el texto aparece correctamente.

El informe de compatibilidad en WineHQ se encuentra aquí.

lunes, 11 de octubre de 2010

Configuración proxy selectivo para APT

Si disponemos de un repositorio local de paquetes para nuestros sistemas Debian, pero también necesitamos descargar paquetes de repositorios externos a nuestra red, puede ser que nos interese configurar un proxy de forma selectiva en función del destino.

Para ello, creamos el fichero /etc/apt/apt.conf.d/10proxy con el siguiente contenido:
Acquire::http::proxy::ftp.misitio.es "DIRECT";
Acquire::http::proxy "http://proxy.isp.es:8080";

En este ejemplo, las descargas a ftp.misitio.es son directas y el resto se hace a través de proxy.isp.es.

Por último, hay que recordar que la variable de entorno http_proxy tiene precedencia sobre los ajustes en apt.conf. Para asegurarnos que no interfiere, ejecutaremos:

$ unset http_proxy

domingo, 10 de octubre de 2010

Citas para la posteridad - Barón Ashler

"Esta vez no fallaremos, doctor Infierno"

-- Barón Ashler

Emular ratón con el teclado en X-Window

En el entorno de ventanas X-Window es posible emular el ratón a través del teclado numérico.

Para ello existe un atajo (shift+num-lock) que activa (o desactiva) un modo  en el cual:
  • Las teclas con flecha desplazan el cursor.
  • Las teclas + y - se encargan de los botones izquierdo y derecho.

Caso del teclado Logitech MX5000

Dado que este teclado (cuya compra *no* recomiendo) carece de tecla de bloqueo numérico no podemos emplear el atajo estándar, tendremos que buscar un rodeo.
Para activar, por ejemplo, el atajo en la tecla "Pausa/Inter":
    xmodmap -e "keycode 110 = Pointer_EnableKeys"
Para devolver el comportamiento original:
    xmodmap -e "keycode 110 = Pause Break"

Referencias

martes, 5 de octubre de 2010

Subasta para mitómanos

El 6 de Noviembre se subastan objetos empleados en el rodaje de películas como Regreso al Futuro, Tron, G.I. Joe, Twilight, Transformers 2.

Muchos objetos tendrán precios prohibitivos , pero quizás se pueda llegar a comprar un ejemplar del Hill Valley Telegraph.

Más información en http://www.profilesinhistory.com

lunes, 4 de octubre de 2010

¿Qué fue de Wendy James?

Buscando vídeos de Primitives en Youtube, me vino a la vista el grupo Transvision Vamp y me pregunté que habría sido de su cantante Wendy James.



Pues bien, Wendy James sigue en el mundillo de la música. Como no, tiene su propia página en MySpace y Facebook.

domingo, 3 de octubre de 2010

Citas para la posteridad - Ken Olson

"There is no reason anyone would want a computer in their home"

-- Ken Olson, presidente de Digital Equipment Corp. (DEC), atacando a los ordenadores personales, 1977

sábado, 2 de octubre de 2010

Crear MP3 a partir de video en YouTube

Prerequisitos

  • Sistema Operativo: Debian Lenny
  • Repositorio debian-multimedia (para mplayer):

    Añadimos a  /etc/apt/sources.list lo siguiente:

    deb http://oktan.ls.fi.upm.es/debian-multimedia/ lenny main

Instrucciones

  1. Instalamos la utilidades necesarias
    sudo aptitude install mplayer lame faad
  2. Reproducimos el vídeo normalmente empleando el navegador web. Ojo: Es necesario emplear la versión flash del reproductor de Youtube. Si usas el reproductor HTML5, no se generará el fichero temporal que necesitamos en el paso siguiente.
  3. Sin cerrar el navegador, volcamos la pista de sonido empleando mplayer:

    mplayer -dumpaudio /tmp/FlashXXL1mnKP -dumpfile /tmp/audio
  4. Identificar el formato de audio, usando el comando file o reproduciendo con mplayer el fichero flash temporal:

    $ mplayer /tmp/FlashXXL1mnKP
    ...
    Opening audio decoder: [faad] AAC (MPEG2/4 Advanced Audio Coding)
    FAAD: compressed input bitrate missing, assuming 128kbit/s!
    AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
    Selected audio codec: [faad] afm: faad (FAAD AAC (MPEG-2/MPEG-4 Audio) decoder)
    ...

  5. Convertirlo, en caso necesario, a mp3. En este ejemplo se convierte una banda sonora en formato AAC:
    faad -f2 -w /tmp/audio | lame -r - /tmp/audio.mp3

Alternativas

Como alternativa al paso 2, podemos usar la utilidad Youtube Downloader (no disponible para Lenny como paquete).

Referencias

Una de naves espaciales

Hace tiempo, oí hablar del sitio Starship Dimensions, donde uno puede apreciar las dimensiones relativas de diferentes naves espaciales procedentes de películas, series de TV y videojuegos.

Ahora, vía alt1040 y microsiervos, encuentro una imagen que compara el tamaño de naves de Star Wars y Star Trek, así como algunos enlaces interesantes relacionados con el tema:

viernes, 1 de octubre de 2010

miércoles, 29 de septiembre de 2010

Xmarks cierra el servicio

Parece que toca de nuevo cambiar de sistema de sincronización entre navegadores :-(

Las nuevas opciones que van surgiendo sobre Firefox y Chrome acaban con Xmarks.

La verdad es que es una lástima, ya que las alternativas que quedan son específicas para cada navegador:

(Vía http://blog.xmarks.com/?p=1886)

martes, 28 de septiembre de 2010

El Hotel Ryugyong

Vía Alt1040 supe de la existencia del Hotel Ryugyong, un desbarre típico de los regímenes comunistas.

Por curiosidad, lo busqué en Google Maps. La imagen que se obtiene parece sacada del juego Sim City:

domingo, 26 de septiembre de 2010

Dropbox: Crear paquete para Debian Lenny

Actualización (29/10/2011): Debian ya es una distribución oficialmente soportada.


El paquete actual de Dropbox para Ubuntu no instala en Debian Lenny debido a problemas de dependencias con libnautilus-extension1:

dpkg: problemas de dependencias impiden la configuración de nautilus-dropbox:
libnautilus-extension1 (>= 1:2.22.2); sin embargo:
La versión de `libnautilus-extension1' en el sistema es 2.20.0-7.


Vamos a generar un paquete Debian a partir del código fuente disponible en la sección de descargas de Dropbox.

Cumplimentamos los requisitos previos:

$ sudo aptitude install libnautilus-extension-dev \
python-docutils checkinstall


Descomprimimos el código fuente y configuramos el paquete

$ tar -jxf nautilus-dropbox-0.6.3.tar.bz2
$ cd nautilus-dropbox-0.6.3
$ ./configure


Como root, lanzamos la utilidad checkinstall:

$ checkinstall --maintainer "Nombre Apellido \<nombre.apellido@ejemplo.es\>"


En el asistente que se iniciará, indicamos la descripción del paquete (Ejemplo: "Cliente Dropbox 0.6.3 para Debian Lenny"); una vez hecho esto, se nos presentará el menú principal, donde podremos ajustar el resto de parámetros de configuración. Es recomendable fijar las dependencias apropiadas (sección "Requires") con estos valores:

libatk1.0-0 (>= 1.20.0), libc6 (>= 2.4), libcairo2 (>= 1.6.0), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.12.0), libnautilus-extension1 (>= 2.20.0), libpango1.0-0 (>= 1.20.1), python (>= 2.5), python-gtk2 (>= 2.12)


Seguimos adelante. Si todo va bien, obtendremos algo como esto:

Done. The new package has been installed and saved to
/tmp/nautilus-dropbox-0.6.3/nautilus-dropbox_0.6.3-1_i386.deb
You can remove it from your system anytime using:
dpkg -r nautilus-dropbox


Ahora ya podemos instalar el paquete

dpkg -i /tmp/nautilus-dropbox-0.6.3/nautilus-dropbox_0.6.3-1_i386.deb

e ir al Menú GNOME->Internet->Dropbox y lanzar el cliente. La primera vez que lo ejecutemos descargará el demonio y se sincronizarán los cambios desde el servidor.

Es necesario reiniciar Nautilus para que se activen dentro de la carpeta "Dropbox" las indicaciones visuales sobre el estado de sincronización y para tener disponible el menú contextual que permite, entre otras cosas, compartir ficheros y carpetas con otros usuarios.

Por último, si queremos liberar el espacio consumido por libnautilus-extension-dev y sus dependencias:
sudo aptitude purge libnautilus-extension-dev

NOTA: Si queremos actualizar el demonio, no basta con instalar un paquete .deb actualizado. Será necesario cerrar Dropbox, eliminar la carpeta ~/.dropbox-dist e iniciarlo de nuevo.

sábado, 25 de septiembre de 2010

Android: Depurando sobre HTC Magic en Debian Lenny

Siguiendo las instrucciones que se indican en el sitio para desarrolladores de Android me resultó imposible poder depurar programas sobre un dispositivo físico (en mi caso, un HTC Magic de Vodafone con Android 1.6).

Aunque las instrucciones son para Ubuntu, en teoría deberían poder aplicarse en Debian Lenny sin mayor problema, pero finalmente el comando adb devices siempre acaba mostrando lo mismo:


* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
???????????? no permissions


Evidentemente, se trataba de un problema con los permisos, porque, ejecutando el demonio con permisos de root, se obtiene lo siguiente:


# /opt/android-sdk/tools/adb root
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
adbd cannot run as root in production builds

$ /opt/android-sdk/tools/adb devices
List of devices attached
HT962KF05736 device


Solución


Matamos el demonio adb:

/opt/android-sdk/tools/adb kill-server

Creamos la regla /etc/udev/rules.d/51-android.rules con este contenido:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4",
ATTRS{idProduct}=="0c02", GROUP="adm", SYMLINK+="android%n"


El demonio udev debe recargar automáticamente el contenido de la regla.

Volvemos a probar, deberíamos obtener esto siempre que nuestro usuario pertenezca al grupo adm:

$ /opt/android-sdk/tools/adb devices
List of devices attached
HT962KF05736 device


Más información en:

jueves, 23 de septiembre de 2010

De VMware Workstation 7 a Virtualbox OSE

Resumen


Intentando importar en Virtualbox OSE una máquina virtual VMware Workstation 7 me he encontrado con una serie de problemas en la definición del hardware virtual.

Escenario


Sistema origen:
  • Host: Debian 5.0.6 (Lenny) / VMware Workstation 7.1.1  build-282343
  • VM: Windows XP SP3 (virtualHW.version = "7")
Sistema destino:
  • Host: Ubuntu 10.04 / VirtualBox OSE 3.1.6 r59338

Pasos


De forma esquemática, se trata de hacer lo siguiente:
  1. Desinstalar VMware tools (tampoco hay problema por suprimirlas una vez tienes la VM corriendo en Virtualbox).
  2. Exportar la VM empleando la herramienta ovftool (http://www.vmware.com/support/developer/ovf/)
  3. Ajustar el hardware virtual (detalles más abajo)
  4. Importar la VM en Virtualbox
  5. Instalar las "guest additions" de Virtualbox.

Conversión a OVF

Ejecutamos:

/usr/lib/vmware/ovftool/ovftool /camino/a/VM/WinXP-SP3Pro.vmx /tmp/WinXP-SP3Pro.ovf


Problemas encontrados

"Unkown resource type"


El primer error aparece en este pantallazo:


Parece ser que no le gustaba la tarjeta de sonido. La he eliminado del hardware virtual editando el fichero .ovf para suprimir esta sección:


<Item ovf:required="false">
<rasd:AddressOnParent>3</rasd:AddressOnParent>
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
<rasd:Description>Sound Card</rasd:Description>
<rasd:ElementName>sound</rasd:ElementName>
<rasd:InstanceID>11</rasd:InstanceID>
<rasd:ResourceSubType>
vmware.soundcard.ensoniq1371
</rasd:ResourceSubType>
<rasd:ResourceType>1</rasd:ResourceType>
</Item>


Múltiples controladoras de disco


Por alguna razón, la máquina exportada incluía varias controladoras de disco IDE y parece ser que Virtualbox no soporta este tipo de configuración hardware.

Para solucionarlo hay que eliminar una de ellas, asegurándose de que no quede ningún dispositivo IDE huérfano.

En mi caso, he eliminado la controladora con el número de instancia 5:


<Item>
<rasd:Address>1</rasd:Address>
<rasd:Description>IDE Controller</rasd:Description>
<rasd:ElementName>ideController1</rasd:ElementName>
<rasd:InstanceID>5</rasd:InstanceID>
<rasd:ResourceType>5</rasd:ResourceType>
</Item>


Por lo tanto, será necesario cambiar el "Parent" de los dispositivos de la instancia 5. En mi caso, sólo había un CDROM:


<Item>
...
<rasd:ElementName>cdrom1</rasd:ElementName>
<rasd:InstanceID>9</rasd:InstanceID>
-<rasd:Parent>5</rasd:Parent>
+<rasd:Parent>6</rasd:Parent>
<rasd:ResourceType>15</rasd:ResourceType>
...
</Item>


Ajustes en el "manifest" de la VM


Existe un fichero con la extensión .mf que almacena las sumas SHA-1 del fichero .ovf y del fichero que contiene el disco virtual.

Al haber modificado el fichero .ovf es necesario recalcular la suma y corregirla en el fichero .mf. Esto no presenta mayor problema ya que en cualquier distribución GNU encontrarás un paquete con la utilidad apropiada.