MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Drivers de TDT (DVB) AverTV TwinStar 07ca:0825 en formato DKMS

Como veo que los artículos en los que he publicado los parches para el driver de este dispositivo TDT están teniendo seguimiento en este blog y harto de compilar a mano un montón de cosas en cada actualización del kernel ayer dediqué un ratillo a preparar un paquete más automático usando DKMS.

DKMS es un sistema que compila módulos del kernel en varios eventos (actualización del kernel, nuevo kernel, actualización de drivers, etc...) sin intervención del usuario.

Muchos paquetes de Debian y Ubuntu lo usan (drivers de NVIDIA/ATI, VirtualBox, etc...) ¿Porqué no tenerlo para el driver AF9035?

He dado de alta un PPA en Launchpad,  que contiene el paquete fuente y el .deb generado listo para instalar en cualquier distribución.

El paquete sólo depende de dkms por lo que debería funcionar en i386/amd64 y desde versiones cuyo kernel sea 2.6.26 o superior (en el 3.0.0 de Debian Unstable funciona sin problemas)

El paquete compila 6 módulos: af9033, dvb-core, dvb-usb-af9035, dvb-usb, mxl5007t, tua9001 que se instalan en /lib/modules/`uname -r`/updates/dkms por lo que tienen preferencia sobre los módulos instalados. Puede que rompa otros drivers de TDT pero normalmente no se suelen tener varios modelos funcionando a la vez.

El paquete se ha generado partiendo del código fuente de dvb-usb-af9035, cabeceras y fuentes de la rama v4l e incluye el firmware /lib/firmware/dvb-usb-af9035-01.fw necesario. 





Nuevo modelo Multiseat 8840

Hace unas semanas hemos comprado directamente el fabricante (Asia) un nuevo modelo de ZeroClient o también conocido como MultiPoint/MultiSeat: MWS8840

Afortunadamente el chipset es el mismo que el anterior MWS300 y funciona correctamente. Es más, con gran sorpresa veo que los vídeos de Youtube funcionan a pantalla completa Tongue out.

El dispositivo tiene una entrada USB (que se conecta al servidor de terminales)  una entrada de alimentación (5V - 3A), entrada de micro, salida de audio y 4 puertos frontales USB 2.0 (en dos de ellos se conecta el teclado y el ratón). Además este modelo trae una peana para colgarlo en la parte trasera de un monitor TFT o ponerlo en vertical.

Aquí podeis ver unas cuantas fotos. El tamaño de la caja es de aproximadamente 10cm x 10cm

        

En breve lanzaremos desde Thinetic una completa y económica solución comercial con estos aparatos tan prometedores, y todo ello con Software Libre.





Drivers de TDT (DVB) AverTV TwinStar 07ca:0825 para kernel 2.6.37

Esta es la continuación de otro artículo de hace más o menos un año, en estos días en Debian unstable ha entrado una nueva versión del kernel (2.6.37) y las anteriores fuentes ya no compilan.

Las nuevas instrucciones quedan así (el nuevo parche disponible aquí):

1.- Descargar nueva rama v4l:

hg clone http://mercurial.intuxication.org/hg/s2-liplianin/
cd s2-liplianin
zcat s2-liplianin-af9035-af9033.diff.gz | patch -p1

2.- Añadir al v4l/.config estas líneas:

###############################
CONFIG_DVB_AF9033=m
CONFIG_DVB_USB_AF9035=m
CONFIG_MEDIA_TUNER_TUA9001=m
##############################
 
3.- Compilar
make
 
4.- Instalar en un temporal
make install DESTDIR=`pwd`/tmp
5.- Copiar al directorio de módulos del kernel
sudo cp -ra tmp/lib/modules/$(uname -r)/kernel/drivers/media/ \
            /lib/modules/$(uname -r)/updates/v4l
sudo depmod -a

6.- Reiniciar y disfrutar (del hardware porque de la tele últimamente no mucho)

 

UPDATE. Para el kernel 2.6.38 nuevo parche: aquí 





Gestión de dispositivos extraíbles en MultiSeat
Hacía tiempo que programar me aburre (según que cosas claro) pero el fin de semana pasado me lo he vuelto a pasar como un niño escribiendo código.
 
Problema:
 
En la Consejería de Educación de la Comunidad de Madrid han empezado a usar un nuevo invento llamado Multiseat (Microsoft lo llama Multipoint) que consiste en unos pequeños aparatos que de una forma lógica vienen a ser un HUB USB que contiene una tarjeta de vídeo, una tarjeta de sonido, y 4 puertos USB, si conectamos varios (pongamos seis) en un equipo automáticamente multiplicamos los puestos disponibles en ese equipo (por USB conectamos un teclado y un ratón a cada Multiseat) (puedes ver algún detalle más en la web de Thinetic Systems)
 
El cómo hicimos andar todo este montaje es otra historia que algún día contaré, pero lo que hoy nos centra es un pequeño problema, y es la gestión de los dispositivos de almacenamiento que se conectan a los puertos USB del Multiseat, para que todos lo entendamos, cuando conectamos una memoria USB se conecta físicamente al servidor (con un HUB USB por el medio) y teníamos que inventar una manera de que sólo pudiera verlo/usarlo el usuario sentado directamente en ese puesto. Ya os adelanto que en Microsoft aún no lo han conseguido (que yo sepa).
 
Solución:
 
En los sistemas basados en Linux durante los últimos años se han venido usando distintas soluciones para el automontaje de discos extraibles (usbmount, HAL, DeviceKit), ahora estamos en la era de UDisk. Es un software que se conecta al gestor de dispositivos del kernel (udev) mediante unas reglas (/lib/udev/rules.d/80-udisks.rules) y crea un bus de sistema (en dbus) donde expone todo lo que encuentra, así las aplicaciones que quieran gestionar un dispositivo sólo tienen que escuchar esos eventos.
 
UDisks permite inhibir el montaje (sigue reconociendo lo que enchufamos pero advierte en dbus que está inhibido y no realiza ninguna acción) por lo que no se montan los dispositivos automáticamente, a este inhibidor se le puede pasar un comando que cuando termine deje de inhibir... un ejemplo de uso práctico es el asistente de instalación gráfico que usa Ubuntu (ubiquity) y que inhibe el montaje de dispositivos (por razones obvias) durante la modificación de particiones y la instalación.
 
Nuestra primera aplicación a desarrollar es un demonio que se conecte al bus del sistema, escuche los dispositivos que se conectan y desconectan, leemos sus propiedades y a partir de ellas adivinamos (por el DEVPATH) en que puesto Multiseat se ha conectado para entonces montarlo con privilegios exclusivos para ese usuario y crearle un icono en el escritorio para que pueda desmontarlo. Este demonio decidí programarlo en python y lo bauticé como multiseat-udisks.py se ejecuta cuando (al arranque) encuentra los puestos MultiSeat (subcarpetas en /dev/usbseat)
 
Ya tenemos solucionado que los dispositivos de almacenamiento se automonten en su sitio y con sus permisos, ahora viene cuando el usuario quiere extraerlo, GNOME crea un icono en el escritorio con nuestro pendrive, realmente no es un archivo y con el inhibidor por el medio no lo va a crear por lo que modifiqué multiseat-udisks.py para que crease un lanzador *.desktop especial con la línea mágica «X-multiseat-desktop=x» siendo x el puesto donde esta montado (subcarpeta de /dev/usbseat ).
 
Para desmontar tenemos dos problemas, primero el usuario no es root y como el dispositivo no está en fstab no le va a dejar desmontarlo, y segundo ese icono del escritorio nos permite abrir el contenido del dispositivo de memoria pero no extraerlo de manera segura (sync && umount) lo primero que se me ocurrió es hacer una extensión para Nautilus (gestor de archivos de GNOME) para que cuando se haga click derecho sobre un archivo *.desktop busque la línea mágica y, si existe, añada una entrada a ese menú derecho del tipo «Desmontar dispositivo extraíble multiseat», cuando se pulse sobre esa opción se llama al proceso de desmontar. Esta extensión (también escrita en Python) la bauticé como nautilus-umount-multiseat.py 
 
Para el problema de los privilegios tuve que programar la tercera ficha de este puzle, una pequeña aplicación en C (instalada con bit SUID) y que eleva privilegios a root para llamar al comando de desmontaje umount.multiseat.c. Muchas aplicaciones de montar y desmontar (instaladas en /sbin) van con el BIT SUID por lo que me parece una manera bastante estandar de hacerlo y más teniendo en cuenta que los usuarios que usan MultiSeat pueden estar en un LDAP.
 
Cuando la extensión de Nautilus detecta que el icono es de un dispositivo conectado a un Multiseat, llama a esta aplicación que eleva los privilegios a root (mediante setuid(0) ) y llama a multiseat-udisks.py con 2 argumentos, el primero es el dispositivo montado (ejemplo: /dev/sdc1 ) y el segundo que se genera dentro del programa C es el UID (identificador numérico del usuario que quiere desmontarlo). El script multiseat-udisks hace una serie de comprobaciones para que los parámetros sean correctos y que el usuario pueda desmontar ese dispositivo (que el punto de montaje le pertenezca) lo desmonta y limpia tanto la carpeta donde se ha montado como el icono del escritorio.
 
El sistema lo hemos probado en varias instalaciones y funciona a la perfección, más tarde convertí el código en paquete *.deb y a instalar en los centros...
 
El motivo por el que me he vuelto a divertir programando es que nadie había hecho algo del estilo y la documentación que podía buscar por internet solo se centraba en el uso de cada herramienta o API por separado por lo que el desarrollo ha sido desde cero hasta algo terminado y funcionando.
 
Siento el tostón técnico pero a algunos nos gusta contar nuestras frikadas Tongue out




Flasheando Nexus One con CyanogenMod 6.1.0-rc1

Seguir los pasos escrupulosamente, no me responsabilizo de posibles daños en tu teléfono. Este proceso es para teléfonos nuevos, si has flasheado alguna ROM antes quizás te sobre algún paso.

 

  1. Descargar herramientas necesarias
    1. Fastboot.
    2. Android SDK (necesitamos el adb)
    3. ROM y Google APPS (ACTUALMENTE update-cm-6.1.0-RC1-N1-signed.zip y gapps-hdpi-20101025-signed.zip)
    4. Radio en versión zip FRF50-radio-4_06_00_12_7.zip
    5. Recovery 1.8.0.1 recovery-RA-nexus-v1.8.0.1-aw.img 
  2. Descomprimimos el zip del fastboot y el SDK (copiar el binario adb de la carpeta tools) y arrancamos el teléfono en modo fastboot (power+trackball)
  3. Desde consola ejecutamos

    	sudo ./fastboot devices	

    (deberá salir un número de serie HTXXXXXXXX y luego la palabra fastboot)
  4. Desbloqueamos el terminal (con esto se pierde la garantía)

    	sudo ./fastboot oem unlock	

    En el teléfono aparece (muy bien explicado lo que estamos haciendo) pulsar Vol Up y después Power para desbloquear.
  5. Ahora volvemos a arrancar en modo fastboot (Power + Trackball) para instalar el recovery

    	sudo ./fastboot flash recovery recovery-RA-nexus-v1.8.0.1-aw.img	
  6. Dejamos que reinicie y volvemos a entrar a fastboot para pasar al BOOTLOADER->RECOVERY (Vol Down y Power) (Recovery se verá en verde)
    Ahora deberíamos ver algo parecido a GRUB con varios menus, tenemos que copiar en la SDCARD la nueva radio

    		sudo ./adb devices (se tiene que ver nuestro teléfono)
    sudo ./adb push FRF50-radio-4_06_00_12_7.zip /sdcard/
    sudo ./adb shell ls /sdcard/*zip (tenemos que ver el archivo que acabamos de copiar)
  7. Desde el teléfono con el trackball bajamos hasta la opción "Flash zip from sdcard", buscamos el zip del radio y pulsamos el trackball para actualizar el radio, cuando termine reiniciamos y volvemos al recovery siguiendo los mismos pasos del punto 6.
  8. Copiamos la ROM de Cyanogen y las Google APPS.

    		sudo ./adb devices (deberíamos ver el teléfono)
    sudo ./adb push update-cm-6.1.0-RC1-N1-signed.zip /sdcard/
    sudo ./adb push gapps-hdpi-20101025-signed.zip /sdcard/
    sudo ./adb shell ls /sdcard/*zip (deben verse estos 2 archivos)
  9. Desde el teléfono vamos al menú "Flash zip from sdcard" e instalamos PRIMERO el zip update-cm-6.1.0-RC1-N1-signed.zip, cuando termine y sin reiniciar el otro gapps-hdpi-20101025-signed.zip.
  10. Antes de reiniciar hacemos wipe (volver a datos de fábrica) desde el menú del teléfono, Wipe -> Wipe data/factory reset, wipe cache, wipe dalvik-cache y reiniciamos. El primer arranque es un poco más largo de lo normal, podemos ver como se van configurando por primera vez las aplicaciones con este comando:

    	sudo ./adb logcat	

 





Sigo vivo...

... sí, es cierto, no me he muerto aunque las fechas de los artículos del blog así lo hagan sospechar.

Con twitter me sirve en el 90% de los casos para contar lo que tengo que contar (que tampoco es tanto). Puedes leerme en el widget de la derecha de este blog.

Desde febrero llevo involucrado en varios proyectos, uno de ellos bastante grande y complejo del que publicaré noticias en breve y apenas tengo tiempo para plantearme escribir. 

De lo más anecdótico (por llamarlo de alguna manera) fue mi primera entrevista de trabajo.

A mediados/finales de Agosto me llega un correo de una persona del equipo de reclutamiento de Google interesándose en mi trayectoria, colaboraciones y proyectos de software libre entre los que ando involucrado, para que luego digan que las empresas no buscan «figuras» por Internet. 

Mi primera reacción fue de incredulidad (el correo lo leía desde mi teléfono móvil y apenas podía investigar si era auténtico) por lo que me espero al día siguiente y ya con el portátil miro las cabeceras del correo (desconfiado que es uno, y más de una vez me han salvado de meter la pata), el correo sale de los servidores de Mountain View ( *corp.google.com ) y parece todo lo legítimo que puedo averiguar.

Contesto de manera educada y con mi cutre nivel de inglés explicando que me interesa (nunca hay que decir que no a la primera) y que me indique más información como tipo de trabajo, ciudad, etc...

En los siguientes intercambios de correos me pide un «Resume» lo que viene a ser un currículum en formato anglosajón, lo preparo en Google Docs y se lo envío, no se si soy bastante inocente en este tipo de documentos así que en lugar de engordarlo, incluso lo puse a dieta, ya que hay varias cosas que no interesan según el sitio donde entregas el CV.

Un día me indican que quiere conversar un rato conmigo pero sin dejar muy claro el cómo, al final resulto en una conversación por teléfono desde EEUU (prefijo +1) de unos 40 minutos en inglés, entre el mal sonido del altavoz del móvil y mi mal nivel de inglés intente defenderme como pude, creo que en algún momento de la conversación me explicó que ésta era privada y que no debía dar demasiados detalles en público, así que resumiendo mucho, fueron unas cuestiones sobre que tipo de trabajo, o en que lenguajes de programación me sentía más cómodo y me contó un poco de cómo funciona Google por dentro, grupos de trabajo y posibles ciudades a las que podía ir (me ofrecieron Londres, Dublín o Zurich)

Después de colgar tuve que tomarme una tila porque me temblaban hasta las rodillas. Embarassed

En la conversación me dijeron que pasarían mis datos a un equipo de contratación y que tendría noticias.

Lo triste (o no, según se vea) es que el siguiente correo fue el típico de eres muy bueno pero de momento no tenemos ningún puesto que se acomode a tus habilidades.

Hasta aquí la historia, mi forma de verlo es que me siento orgulloso (muchísmimo) de que una empresa del nivel y tamaño de Google se haya fijado en mí y me quedo con esto, también estoy muy contento de haber sido sincero durante las preguntas y haber contestado con el corazón (me recordaba a la razón por la que deje la Universidad) si no se algo, digo que no lo se, y si con algo no estoy cómodo (ej: programando en Java) también lo digo abiertamente. 

Mi situación laboral actual es envidiable, se que podría estar ganando mucha más pasta en cualquier otro sitio, pero el dinero no lo es todo, hacer lo que te gusta, a las horas que te gusta y sin jefes es algo impagable, y es por ello que tenía serias dudas de decir «sí» y hacer las maletas si hubiera pasado todas las pruebas.

En fin, que me quedo donde estoy, seguimos trabajando en TCOSMaX (nueva web) y otro montonazo de proyectos dentro de **mi** empresa





TCOS en Ubuntu Lucid 10.04, the perfect setup

Ya tenemos un artículo para instalar y configurar TCOS en Ubuntu 9.04 Jaunty, ahora voy a dar unos pequeños trucos para instalarlo en Lucid.

 

  1. Instalar Ubuntu 10.04 Lucid (quizás sirva para otras *buntu), yo lo he probado con Ubuntu y GNOME.
  2. Añadir el siguiente repositorio:

    deb http://tcosproject.org lucid main
  3. El repositorio está firmado con mi clave GPG por lo que cuando actualicemos nos dará un error, para añadir la clave se puede instalar el paquete tcos-keyring 
  4. Luego instalamos el paquete tcos.
  5. Actualizar el paquete GDM, en el repositorio de TCOs está disponible la versión 2.30.2.is.2.30.2-0ubuntu1.lucid.tcos2 que tiene unas ligeras mejoras con respecto al que trae Ubuntu:

    - Desactivado IPV6 - desgraciadamente las nuevas versiones del gdm lo traen activado por defecto y XDMCP no funciona
    Parche para la inicialización del buffer XdmcpFill()
    Parche para el TimedLogin remoto
    - Otras pequeñas mejoras

  6. Lanzar el configurador de servidor desde el menú Administración o ejecutar: sudo tcos-configurator



  7. En la primera pestaña configurar el interfaz de red que atenderá a los terminales ligeros y el rango DHCP.
  8. En la segunda pestaña añadir usuarios (si se quiere que funcione el autologin usar el mismo prefijo que los nombres de equipo)



  9. En la tercera pestaña activar la entrada remota de GDM y opcionalmente el timeout y autologin



  10. En la cuarta pestaña lanzar Tcosconfig
  11. Seleccionar la plantilla tcos.conf.all y dar siguiente hasta la parte de construcción de la imagen, pulsar el botón contruir y cuando termine guardar.



  12. A continuación unos pequeños trucos para evitar problemas
 
Desactivar Multicast DNS, se edita /etc/nsswitch.conf y se cambia la línea:
 
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
 
por
 
hosts:          files dns

(esto desactiva los servicios AVAHI que no son imprescindibles y que aumentan mucho los timeouts de login de GDM o incluso SSH)

 

Verificar el correcto funcionamiento de los DNS, lo recomendable es desinstalar network-manager y configurar una IP fija en /etc/network/interfaces (de hecho el configurador del servidor de TCOS debería haberlo hecho ya).

Comprobar que la primera línea de /etc/resolv.conf es la IP interna de nuestro servidor

Comprobar que en /etc/resolv.conf.real tenemos los DNS de nuestro proveedor de internet o en su defecto unos que funcionen.

Comprobaremos que el archivo /etc/gdm/custom.conf tiene este aspecto:

[xdmcp]

Enable=true

MaxPending=60

MaxWaitIndirect=80

MaxWait=75

PingIntervalSeconds=35

MaxPendingIndirect=30

MaxSessions=40

DisplaysPerHost=4

[daemon]

TimedLogin=/usr/sbin/tcos-gdm-autologin --local=usuario-que-usara-el-servidor|

TimedLoginEnable=true

TimedLoginDelay=1

[security]

AllowRemoteAutoLogin=true

 
Podemos activar el debug en GDM (clave [debug]Enable=True ) y ver el syslog mientras los equipos intentan cargar por red.
 
Si hemos seguido todos los pasos con total exactitud tendremos un servidor TCOS funcionando en menos de media hora (contando la instalación de Ubuntu)




Compilando drivers de TDT (DVB) AverTV TwinStar 07ca:0825

Me he hecho con un nuevo receptor de TDT USB, el anterior (15a4:9016 Afatech Technologies, Inc. AF9015 DVB-T USB2.0 stick) me estaba dando muchos problemas y la poca señal que llega a mi habitación me hacía perder varios canales.

En este HOWTO intentaré de manera sencilla explicar como compilar una nueva versión de V4L previamente parcheada para el nuevo hardware.

1.- Reconocimiento

Lo primero es abrir el receptor (si lo piensas devolver no deberías hacerlo) para identificar los chips, en el mío se puede ver que tiene 2 chips (receptor doble) del tipo AF9035B y AF9033.

Buscando por varios sitios encuentro este hilo: http://patchwork.kernel.org/patch/61950/ que explicaque hay que aplicar dos parches al kernel y compilar, en lugar de compilar el kernel he usado la rama Mercurial del proyecto V4L.

2.- Descargamos V4L

hg clone http://linuxtv.org/hg/v4l-dvb

En el enlace que he puesto antes explica que hay que aplicar 2 parches,el primero del método B de este wiki, y el segundo elque adjunta en ese hilo. Yo he aplicado los dos (corregido los rechazos) y preparado un nuevo parche único, que puedes descargar de aquí: af9035.v4l.hg.diff

3.- Parchear

En el directorio v4l-dvb ejecutamos lo siguiente:

cat /ruta/al/parche/af9035.v4l.hg.diff | patch -p1

4.- Compilar

Teniendo nuestras cabeceras del kernel instaladas (apt-get install linux-headers-`uname -r`) ejecutamos make.

5.- Instalar

No es recomendable instalarlo encima ya que si algo no va bien tendremos que reinstalar nuestro kernel, vamos a instalarlo en el directorio update del kernel para que si queremos en un futuro podamos borrarlo y no estropear nuestro kernel. Es muy importante compilar e instalar como usuario (no como ROOT) ya que no se ejecutarán o copiarán cosas que no queramos.

make install DESTDIR=`pwd`/tmp
sudo mkdir -p /lib/modules/`uname -r`/updates
sudo cp -ra tmp/lib/modules/`uname -r`/kernel/drivers/media/ /lib/modules/`uname -r`/updates/v4l
sudo depmod -a 

(va a dar errores de copia de firmware... no problem !!!)

5.- Instalar el firmware

Descargamos este archivo: dvb-usb-af9035-01.fw y lo copiamos en /lib/firmware/

6.- Pruebas antes de conectar

$ sudo modinfo dvb-usb-af9035

filename:       /lib/modules/2.6.32-2-686/updates/v4l/dvb/dvb-usb/dvb-usb-af9035.ko
license:        GPL
description:    Afatech AF9035 driver
author:         Antti Palosaari <crope@iki.fi>
alias:          usb:v07CAp0825d*dc*dsc*dp*ic*isc*ip*  <======= here is it!!!
alias:          usb:v0CCDp0093d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p9035d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1003d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1002d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1001d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1000d*dc*dsc*dp*ic*isc*ip*
depends:        dvb-usb,usbcore
vermagic:       2.6.32-2-686 SMP mod_unload modversions 686
parm:           debug:set debugging level (int)
parm:           adapter_nr:DVB adapter numbers (array of short)

 

7.- Conectamos

Ejecutamos en un terminal: sudo tail -f /var7log/syslog, debería salir algo como esto:

usb 1-3: new high speed USB device using ehci_hcd and address 6
usb 1-3: New USB device found, idVendor=07ca, idProduct=0825
usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-3: Product: A825
usb 1-3: Manufacturer: AVerMedia TECHNOLOGIES, Inc.
usb 1-3: SerialNumber: 0000000000000
usb 1-3: configuration #1 chosen from 1 choice
dvb-usb: found a 'Avermedia TwinStar' in cold state, will try to load a firmware
usb 1-3: firmware: requesting dvb-usb-af9035-01.fw
dvb-usb: downloading firmware from file 'dvb-usb-af9035-01.fw'
dvb-usb: found a 'Avermedia TwinStar' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
DVB: registering new adapter (Avermedia TwinStar)
af9033: firmware version: LINK:11.15.10.0 OFDM:5.48.10.0
DVB: registering adapter 0 frontend 0 (Afatech AF9033 DVB-T)...
mxl5007t 4-00c0: creating new instance
mxl5007t_get_chip_id: unknown rev (3f)
mxl5007t_get_chip_id: MxL5007T detected @ 4-00c0
dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
DVB: registering new adapter (Avermedia TwinStar)
af9033: firmware version: LINK:11.15.10.0 OFDM:5.48.10.0
DVB: registering adapter 1 frontend 0 (Afatech AF9033 DVB-T)...
mxl5007t 4-00c1: creating new instance
mxl5007t_get_chip_id: unknown rev (3f)
mxl5007t_get_chip_id: MxL5007T detected @ 4-00c1
dvb-usb: Avermedia TwinStar successfully initialized and connected.
usbcore: registered new interface driver dvb_usb_af9035

En /dev/dvb se crearán nuevos dispositivos:

tree /dev/dvb/
/dev/dvb/
├── adapter0
│   ├── demux0
│   ├── dvr0
│   ├── frontend0
│   └── net0
└── adapter1
    ├── demux0
    ├── dvr0
    ├── frontend0
    └── net0

Si algo no funciona, como por ejemplo nos sale esto por el syslog:

usb 1-3: new high speed USB device using ehci_hcd and address 5
usb 1-3: New USB device found, idVendor=07ca, idProduct=0825
usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-3: Product: A825
usb 1-3: Manufacturer: AVerMedia TECHNOLOGIES, Inc.
usb 1-3: SerialNumber: 0000000000000
usb 1-3: configuration #1 chosen from 1 choice
dvb_usb_af9035: disagrees about version of symbol dvb_usb_device_init
dvb_usb_af9035: Unknown symbol dvb_usb_device_init

... es porque teníamos cargados módulos dvb_* , tenemos que mirar los que estan cargados (lsmod) y quitarlos (rrmod), si sigue sin ir podemos probar a reiniciar.

 





Mi primer app en android: RsyncDroid

Presento mi nueva aplicación (mejor no mirar el código) para android: RsyncDroid.

Es como si fuese un HolaMundo pero un poco más complejo, pero me ha servido para aprender un poco Java y sobre todo para ver su entorno de desarrollo basado en Eclipse. El debugger (ddms) es la leche y se puede estudiar muy bien lo que va haciendo nuestra aplicación mientras se ejecuta... me ha gustado.

Instalación

Lo primero es conseguir el binario de rsync, he preparado este script (necesita ser root del teléfono)

wget http://adqmisc.googlecode.com/svn/trunk/androidutils/rsync/rsync-3.0.6-arm-softfloat-linux-gnueabi.gz
zcat rsync-3.0.6-arm-softfloat-linux-gnueabi.gz > rsync

./adb push rsync /sdcard/rsyncdroid/rsync
./adb shell mount -o remount,rw /dev/block/mtdblock0 /system
./adb shell "cat /sdcard/rsyncdroid/rsync > /system/bin/rsync"
./adb shell chmod 755 /system/bin/rsync
./adb shell mount -o remount,ro /dev/block/mtdblock0 /system

Ahora instalaremos este apk: rsyncdroid.apk

./adb install -r ~/Desktop/rsyncdroid.apk
401 KB/s (18269 bytes in 0.044s)
    pkg: /data/local/tmp/rsyncdroid.apk
Success

Capturas de pantalla

El programa es muy sencillo, lo que hace es arrancar, parar y ver el estado del proceso rsync, si no existe la configuración usa una base en la que se comparte el contenido de la memoria SD. Es recomendable añadir algo como "hosts allow = xx.xx.xx.xx", para permitir el acceso sólo desde la IP que queramos (man rsyncd.conf).

La primera vez que lo ejecutemos nos pedirá el permiso de root (rsync se ejecuta en un puerto privilegiado).

Script para copia de datos

rsync -Pavz --no-g --no-p --no-numeric-ids \
    htcmagic::sdcard/ --delete /home/mario/htcmagic/backup/

Yo me he hecho un script un poco más complejo para (por la madrugada) hacer ping al teléfono y si está en la wifi de mi red hacer la copia incremental (creando enlaces duros) y borrando las copias de seguirdad que tengan más de 30 días.





Diferencias entre algo sencillo y algo enrevesado

Hoy me he puesto a intentar hacer una cutre aplicación para Android (que está tan de moda) y de paso a programar mis primeras líneas en JAVA. ¿Quén inventó ese lenguaje del diablo? Se merece las 7 plagas seguidas de una lapidación pública, y voy a ello con un ejemplo muy simple.

Vamos a intentar partir una cadena de texto por espacios, en Python:

>>> a="esto   es una cadena   de texto"
>>> a.split()
['esto', 'es', 'una', 'cadena', 'de', 'texto']

Nótese que entre alguna de las palabras hay más de un espacio.

Ahora vamos a hacerlo en JAVA:

public class test {
public static void main(String args[]) {
String a;
String [] aArray;
int i;
a="esto   es una cadena   de texto";
aArray=a.split(" ");
for (i=0; i<aArray.length; i++) {
System.out.println("index=" + i + " aArray=" + aArray[i]);
}
}
}

Que como resultado da:

index=0 aArray=esto
index=1 aArray=
index=2 aArray=
index=3 aArray=es
index=4 aArray=una
index=5 aArray=cadena
index=6 aArray=
index=7 aArray=
index=8 aArray=de
index=9 aArray=texto

No quiero ir de listillo, pero necesitar 6 veces más código para no hacerlo bien es como volver al esamblador. He intentado hacer aArray=a.trim().split(" ") pero ni con esas...seguro que hay una forma rebuscada de hacerlo, en python no hay que pensar tanto. Además es bastante más lento que python y eso que se ejecuta compilado en bytecode:

$ time python -c "a='esto   es una cadena   de texto'; print a.split()" >/dev/null
real	0m0.026s
user	0m0.020s
sys	0m0.004s
$ time java test > /dev/null
real	0m0.135s
user	0m0.064s
sys	0m0.016s




1 2 3 ... 33 34 35  Siguiente»