<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://mariodebian.com/styles/rss.css" type="text/css"?>
<rss version="0.91">

 <channel>
  <title>MarioDebian, mi devlog</title>
  <link>http://mariodebian.com/blog/1</link>
  <description> Bitácora de un desarrollador newbie. 
</description>
    <item>
   <title>Drivers de TDT (DVB) AverTV TwinStar 07ca:0825 en formato DKMS</title>
   <description> 
Como veo que los art&iacute;culos en los que he publicado los parches para el driver de este dispositivo TDT est&aacute;n teniendo seguimiento en este blog y harto de compilar a mano un mont&oacute;n de cosas en cada actualizaci&oacute;n del kernel ayer dediqu&eacute; un ratillo a preparar un paquete m&aacute;s autom&aacute;tico usando DKMS.
 
 
 DKMS &nbsp;es un sistema que compila m&oacute;dulos del kernel en varios eventos (actualizaci&oacute;n del kernel, nuevo kernel, actualizaci&oacute;n de drivers, etc...) sin intervenci&oacute;n del usuario.
 
 
Muchos paquetes de Debian y Ubuntu lo usan (drivers de NVIDIA/ATI, VirtualBox, etc...) &iquest;Porqu&eacute; no tenerlo para el driver AF9035?
 
 
He dado de alta un&nbsp; PPA en Launchpad , &nbsp;que contiene&nbsp; el paquete fuente y el .deb generado &nbsp;listo para instalar en   cualquier distribuci&oacute;n  .
 
 
El paquete s&oacute;lo depende de dkms por lo que deber&iacute;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&oacute;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&oacute;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&oacute;digo fuente de dvb-usb-af9035, cabeceras y fuentes de la rama v4l e incluye el firmware&nbsp; /lib/firmware/dvb-usb-af9035-01.fw &nbsp;necesario.&nbsp;
 </description>
   <link>http://mariodebian.com/post/1/698</link>
      <pubDate>Thu, 28 Jul 2011 14:28:11 +0200</pubDate>   
  </item>
    <item>
   <title>Nuevo modelo Multiseat 8840</title>
   <description> 
Hace unas semanas hemos comprado directamente el fabricante (Asia) un nuevo modelo de ZeroClient o tambi&eacute;n conocido como MultiPoint/MultiSeat: MWS8840
 
 
Afortunadamente el chipset es el mismo que el anterior MWS300 y funciona correctamente. Es m&aacute;s, con gran sorpresa veo que los v&iacute;deos de Youtube funcionan a pantalla completa  .
 
 
El dispositivo tiene una entrada USB (que se conecta al servidor de terminales)&nbsp; una entrada de alimentaci&oacute;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&oacute;n). Adem&aacute;s este modelo trae una peana para colgarlo en la parte trasera de un monitor TFT o ponerlo en vertical.
 
 
Aqu&iacute; podeis ver unas cuantas fotos. El tama&ntilde;o de la caja es de aproximadamente 10cm x 10cm 
 
 
   
&nbsp;&nbsp;
   
&nbsp;&nbsp;
   
&nbsp;&nbsp;
   
 
 
En breve lanzaremos desde  Thinetic  una completa y econ&oacute;mica soluci&oacute;n comercial con estos aparatos tan prometedores, y todo ello con   Software Libre  . 
 </description>
   <link>http://mariodebian.com/post/1/697</link>
      <pubDate>Thu, 24 Mar 2011 23:42:56 +0100</pubDate>   
  </item>
    <item>
   <title>Drivers de TDT (DVB) AverTV TwinStar 07ca:0825 para kernel 2.6.37</title>
   <description> 
Esta es la continuaci&oacute;n de otro&nbsp; art&iacute;culo de hace m&aacute;s o menos un a&ntilde;o , en estos d&iacute;as en Debian unstable ha entrado una nueva versi&oacute;n del kernel (2.6.37) y las anteriores fuentes ya no compilan.
 
 
Las nuevas instrucciones quedan as&iacute; (el nuevo parche disponible&nbsp; aqu&iacute; ):
 
 
1.- Descargar nueva rama v4l:
 
 
hg clone http://mercurial.intuxication.org/hg/s2-liplianin/
cd s2-liplianin
zcat&nbsp;s2-liplianin-af9035-af9033.diff.gz | patch -p1
 
 
2.- A&ntilde;adir al v4l/.config estas l&iacute;neas:
 
 
###############################
CONFIG_DVB_AF9033=m
CONFIG_DVB_USB_AF9035=m
CONFIG_MEDIA_TUNER_TUA9001=m
##############################
 
 
&nbsp;
 
 
3.- Compilar
 
 
make
 
 
&nbsp;
 
 
4.- Instalar en un temporal
 
 
make install DESTDIR=`pwd`/tmp
 
 
5.- Copiar al directorio de m&oacute;dulos del kernel
 
 
sudo cp -ra tmp/lib/modules/$(uname -r)/kernel/drivers/media/ \
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/lib/modules/$(uname -r)/updates/v4l
sudo depmod -a
 
 
6.- Reiniciar y disfrutar (del hardware porque de la tele &uacute;ltimamente no mucho)
 
 
&nbsp;
 
 
 UPDATE . Para el kernel 2.6.38 nuevo parche:&nbsp; aqu&iacute; &nbsp;
 </description>
   <link>http://mariodebian.com/post/1/696</link>
      <pubDate>Sat, 19 Feb 2011 16:18:26 +0100</pubDate>   
  </item>
    <item>
   <title>Gestión de dispositivos extraíbles en MultiSeat</title>
   <description> Hac&iacute;a tiempo que programar me aburre (seg&uacute;n que cosas claro) pero el fin de semana pasado me lo he vuelto a pasar como un ni&ntilde;o escribiendo c&oacute;digo.  &nbsp;     Problema:     &nbsp;  En la Consejer&iacute;a de Educaci&oacute;n de la Comunidad de Madrid han empezado a usar un nuevo invento llamado Multiseat ( Microsoft lo llama Multipoint ) que consiste en unos peque&ntilde;os aparatos que de una forma l&oacute;gica vienen a ser un HUB USB que contiene una tarjeta de v&iacute;deo, una tarjeta de sonido, y 4 puertos USB, si conectamos varios (pongamos seis) en un equipo autom&aacute;ticamente multiplicamos los puestos disponibles en ese equipo (por USB conectamos un teclado y un rat&oacute;n a cada Multiseat) (puedes&nbsp; ver alg&uacute;n detalle m&aacute;s en la web de Thinetic Systems )  &nbsp;  El c&oacute;mo hicimos andar todo este montaje es otra historia que alg&uacute;n d&iacute;a contar&eacute;, pero lo que hoy nos centra es un peque&ntilde;o problema, y es la gesti&oacute;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&iacute;sicamente al servidor (con un HUB USB por el medio) y ten&iacute;amos que inventar una manera de que s&oacute;lo pudiera verlo/usarlo el usuario sentado directamente en ese puesto.  Ya os adelanto que en Microsoft a&uacute;n no lo han conseguido (que yo sepa) .  &nbsp;     Soluci&oacute;n:     &nbsp;  En los sistemas basados en Linux durante los &uacute;ltimos a&ntilde;os se han venido usando distintas soluciones para el automontaje de discos extraibles (usbmount, HAL, DeviceKit), ahora estamos en la era de&nbsp; 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&iacute; las aplicaciones que quieran gestionar un dispositivo s&oacute;lo tienen que escuchar esos eventos.  &nbsp;  UDisks permite inhibir el montaje (sigue reconociendo lo que enchufamos pero advierte en dbus que est&aacute; inhibido y no realiza ninguna acci&oacute;n) por lo que no se montan los dispositivos autom&aacute;ticamente, a este inhibidor se le puede pasar un comando que cuando termine deje de inhibir... un ejemplo de uso pr&aacute;ctico es el asistente de instalaci&oacute;n gr&aacute;fico que usa Ubuntu (ubiquity) y que inhibe el montaje de dispositivos (por razones obvias) durante la modificaci&oacute;n de particiones y la instalaci&oacute;n.  &nbsp;  Nuestra primera aplicaci&oacute;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&iacute; programarlo en python y lo bautic&eacute; como&nbsp; multiseat-udisks.py &nbsp;se ejecuta cuando (al arranque) encuentra los puestos MultiSeat (subcarpetas en /dev/usbseat)  &nbsp;  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&eacute; multiseat-udisks.py para que crease un lanzador *.desktop especial con la l&iacute;nea m&aacute;gica &laquo;  X-multiseat-desktop=x  &raquo; siendo x el puesto donde esta montado (subcarpeta de /dev/usbseat ).  &nbsp;  Para desmontar tenemos dos problemas, primero el usuario no es root y como el dispositivo no est&aacute; 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 &amp;&amp; umount) lo primero que se me ocurri&oacute; es hacer una extensi&oacute;n para Nautilus (gestor de archivos de GNOME) para que cuando se haga click derecho sobre un archivo *.desktop busque la l&iacute;nea m&aacute;gica y, si existe, a&ntilde;ada una entrada a ese men&uacute; derecho del tipo &laquo;  Desmontar dispositivo extra&iacute;ble multiseat  &raquo;, cuando se pulse sobre esa opci&oacute;n se llama al proceso de desmontar. Esta extensi&oacute;n (tambi&eacute;n escrita en Python) la bautic&eacute; como&nbsp; nautilus-umount-multiseat.py &nbsp;   &nbsp;  Para el problema de los privilegios tuve que programar la tercera ficha de este puzle, una peque&ntilde;a aplicaci&oacute;n en C (instalada con bit SUID) y que eleva privilegios a root para llamar al comando de desmontaje&nbsp; 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&aacute;s teniendo en cuenta que los usuarios que usan MultiSeat pueden estar en un LDAP.  &nbsp;  Cuando la extensi&oacute;n de Nautilus detecta que el icono es de un dispositivo conectado a un Multiseat, llama a esta aplicaci&oacute;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&eacute;rico del usuario que quiere desmontarlo). El script multiseat-udisks hace una serie de comprobaciones para que los par&aacute;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.  &nbsp;  El sistema lo hemos probado en varias instalaciones y funciona a la perfecci&oacute;n, m&aacute;s tarde convert&iacute; el c&oacute;digo en paquete *.deb y a instalar en los centros...  &nbsp;  El motivo por el que me he vuelto a divertir programando es que nadie hab&iacute;a hecho algo del estilo y la documentaci&oacute;n que pod&iacute;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.  &nbsp;  Siento el tost&oacute;n t&eacute;cnico pero a algunos nos gusta contar nuestras frikadas&nbsp;   </description>
   <link>http://mariodebian.com/post/1/695</link>
      <pubDate>Thu, 03 Feb 2011 13:56:31 +0100</pubDate>   
  </item>
    <item>
   <title>Flasheando Nexus One con CyanogenMod 6.1.0-rc1</title>
   <description> Seguir los pasos escrupulosamente, no me responsabilizo de posibles da&ntilde;os en tu tel&eacute;fono. Este proceso es para tel&eacute;fonos nuevos, si has flasheado alguna ROM antes quiz&aacute;s te sobre alg&uacute;n paso.  &nbsp;  	 Descargar herramientas necesarias	 		  Fastboot . 		  Android SDK &nbsp;(necesitamos el adb) 		  ROM y Google APPS &nbsp;(ACTUALMENTE update-cm-6.1.0-RC1-N1-signed.zip y gapps-hdpi-20101025-signed.zip) 		  Radio en versi&oacute;n zip&nbsp;FRF50-radio-4_06_00_12_7.zip  		  Recovery 1.8.0.1 recovery-RA-nexus-v1.8.0.1-aw.img &nbsp; 	 	 	 Descomprimimos el zip del fastboot y el SDK (copiar el binario adb de la carpeta tools) y arrancamos el tel&eacute;fono en modo fastboot (power+trackball) 	 Desde consola ejecutamos 	 	 	sudo ./fastboot devices	 	 	(deber&aacute; salir un n&uacute;mero de serie HTXXXXXXXX y luego la palabra fastboot) 	 Desbloqueamos el terminal (con esto se pierde la garant&iacute;a) 	 	 	sudo ./fastboot oem unlock	 	 	En el tel&eacute;fono aparece (muy bien explicado lo que estamos haciendo) pulsar Vol Up y despu&eacute;s Power para desbloquear. 	 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	 	 	 Dejamos que reinicie y volvemos a entrar a fastboot para pasar al BOOTLOADER-&gt;RECOVERY (Vol Down y Power) (Recovery se ver&aacute; en verde) 	Ahora deber&iacute;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&eacute;fono) 	sudo ./adb push&nbsp;FRF50-radio-4_06_00_12_7.zip /sdcard/ 	sudo ./adb shell ls /sdcard/*zip (tenemos que ver el archivo que acabamos de copiar)	 	 	 Desde el tel&eacute;fono con el trackball bajamos hasta la opci&oacute;n &quot;Flash zip from sdcard&quot;, 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. 	 Copiamos la ROM de Cyanogen y las Google APPS. 	 	 		sudo ./adb devices (deber&iacute;amos ver el tel&eacute;fono) 	sudo ./adb push&nbsp;update-cm-6.1.0-RC1-N1-signed.zip /sdcard/ 	sudo ./adb push&nbsp;gapps-hdpi-20101025-signed.zip /sdcard/ 	sudo ./adb shell ls /sdcard/*zip (deben verse estos 2 archivos) 	 	 	 Desde el tel&eacute;fono vamos al men&uacute; &quot;Flash zip from sdcard&quot; e instalamos PRIMERO el zip&nbsp;update-cm-6.1.0-RC1-N1-signed.zip, cuando termine y sin reiniciar el otro&nbsp;gapps-hdpi-20101025-signed.zip. 	 Antes de reiniciar hacemos wipe (volver a datos de f&aacute;brica) desde el&nbsp;men&uacute;&nbsp;del tel&eacute;fono, Wipe -&gt; Wipe data/factory reset, wipe cache, wipe dalvik-cache y reiniciamos. El primer arranque es un poco m&aacute;s largo de lo normal, podemos ver como se van configurando por primera vez las aplicaciones con este comando: 	 	 	sudo ./adb logcat	 	   &nbsp; </description>
   <link>http://mariodebian.com/post/1/694</link>
      <pubDate>Mon, 08 Nov 2010 14:31:37 +0100</pubDate>   
  </item>
    <item>
   <title>Sigo vivo...</title>
   <description> ... s&iacute;, es cierto, no me he muerto aunque las fechas de los art&iacute;culos del blog as&iacute; lo hagan sospechar.  Con&nbsp; twitter &nbsp;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&eacute; noticias en breve y apenas tengo tiempo para plantearme escribir.&nbsp;  De lo m&aacute;s anecd&oacute;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&nbsp;interes&aacute;ndose&nbsp;en mi trayectoria, colaboraciones y proyectos de software libre entre los que ando involucrado, para que luego digan que las empresas no buscan &laquo;figuras&raquo; por&nbsp;Internet.&nbsp;  Mi primera reacci&oacute;n fue de incredulidad (el correo lo le&iacute;a desde mi tel&eacute;fono m&oacute;vil y apenas pod&iacute;a investigar si era aut&eacute;ntico) por lo que me espero al d&iacute;a siguiente y ya con el port&aacute;til miro las cabeceras del correo (desconfiado que es uno, y m&aacute;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&iacute;timo que puedo averiguar.  Contesto de manera educada y con mi cutre nivel de ingl&eacute;s explicando que me interesa (nunca hay que decir que no a la primera) y que me indique m&aacute;s informaci&oacute;n como tipo de trabajo, ciudad, etc...  En los siguientes intercambios de correos me pide un &laquo;Resume&raquo; lo que viene a ser un curr&iacute;culum en formato&nbsp;anglosaj&oacute;n, lo preparo en Google Docs y se lo env&iacute;o, no se si soy bastante&nbsp;inocente&nbsp;en este tipo de documentos as&iacute; que en lugar de engordarlo, incluso lo puse a dieta, ya que hay varias cosas que no interesan seg&uacute;n el sitio donde entregas el CV.  Un d&iacute;a me indican que quiere conversar un rato conmigo pero sin dejar muy claro el c&oacute;mo, al final resulto en una conversaci&oacute;n por tel&eacute;fono desde EEUU (prefijo +1) de unos 40 minutos en ingl&eacute;s, entre el mal sonido del altavoz del m&oacute;vil y mi mal&nbsp;nivel&nbsp;de ingl&eacute;s intente defenderme como pude, creo que en alg&uacute;n momento de la conversaci&oacute;n me explic&oacute; que &eacute;sta era privada y que no deb&iacute;a dar demasiados detalles en p&uacute;blico, as&iacute; que resumiendo mucho, fueron unas cuestiones sobre que tipo de trabajo, o en que lenguajes de programaci&oacute;n me sent&iacute;a m&aacute;s c&oacute;modo y me cont&oacute; un poco de c&oacute;mo funciona Google por dentro, grupos de trabajo y posibles ciudades a las que pod&iacute;a ir (me ofrecieron Londres, Dubl&iacute;n o Zurich)  Despu&eacute;s de colgar tuve que tomarme una tila porque me temblaban hasta las rodillas.&nbsp;   En la conversaci&oacute;n me dijeron que pasar&iacute;an mis datos a un equipo de contrataci&oacute;n y que tendr&iacute;a noticias.   Lo triste (o no, seg&uacute;n se vea) es que el siguiente correo fue el t&iacute;pico de eres muy bueno pero de momento no tenemos ning&uacute;n puesto que se acomode a tus habilidades.  Hasta aqu&iacute; la historia, mi forma de verlo es que me siento orgulloso (much&iacute;smimo) de que una empresa del nivel y tama&ntilde;o de Google se haya fijado en m&iacute; y  me quedo con esto , tambi&eacute;n estoy muy contento de haber sido sincero durante las preguntas y haber contestado con el coraz&oacute;n (me recordaba a la raz&oacute;n por la que deje la Universidad) si no se algo, digo que no lo se, y si con algo no estoy c&oacute;modo (ej: programando en Java) tambi&eacute;n lo digo abiertamente.&nbsp;  Mi&nbsp; situaci&oacute;n laboral actual es envidiable , se que podr&iacute;a estar ganando mucha m&aacute;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&iacute;a serias dudas de decir &laquo;s&iacute;&raquo; y hacer las maletas si hubiera pasado todas las pruebas.  En fin, que me quedo donde estoy, seguimos trabajando en&nbsp; TCOS ,&nbsp; MaX&nbsp;(nueva web) &nbsp;y otro montonazo de proyectos dentro de  **mi** empresa .&nbsp; </description>
   <link>http://mariodebian.com/post/1/693</link>
      <pubDate>Thu, 07 Oct 2010 16:21:56 +0200</pubDate>   
  </item>
    <item>
   <title>TCOS en Ubuntu Lucid 10.04, the perfect setup</title>
   <description> Ya tenemos un&nbsp; art&iacute;culo para instalar y configurar TCOS en Ubuntu 9.04 Jaunty , ahora voy a dar unos peque&ntilde;os trucos para instalarlo en Lucid.  &nbsp;  	 Instalar Ubuntu 10.04 Lucid (quiz&aacute;s sirva para otras *buntu), yo lo he probado con Ubuntu y GNOME. 	 A&ntilde;adir el siguiente repositorio: 	 	  deb&nbsp; http://tcosproject.org &nbsp;lucid main   	 El repositorio est&aacute; firmado con mi clave GPG por lo que cuando actualicemos nos dar&aacute; un error, para a&ntilde;adir la clave se puede instalar el paquete   tcos-keyring&nbsp;   	    Luego instalamos el paquete  tcos  .     	     Actualizar el paquete GDM, en el repositorio de TCOs est&aacute; disponible la versi&oacute;n&nbsp;     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 	-&nbsp; Parche para la inicializaci&oacute;n del buffer XdmcpFill()  	-&nbsp; Parche para el TimedLogin remoto  	- Otras peque&ntilde;as mejoras 	 	  	  Lanzar el configurador de servidor desde el men&uacute; Administraci&oacute;n o ejecutar:   sudo tcos-configurator 	 	    	 	    	  En la primera pesta&ntilde;a configurar el interfaz de red que atender&aacute; a los terminales ligeros y el rango DHCP.  	  En la segunda pesta&ntilde;a a&ntilde;adir usuarios (si se quiere que funcione el autologin usar el mismo prefijo que los nombres de equipo) 	 	    	 	  	  En la tercera pesta&ntilde;a activar la entrada remota de GDM y opcionalmente el timeout y autologin 	 	    	 	  	  En la cuarta pesta&ntilde;a lanzar Tcosconfig  	   Seleccionar la plantilla   tcos.conf.all   y dar siguiente hasta la parte de construcci&oacute;n de la imagen, pulsar el bot&oacute;n contruir y cuando termine guardar. 	 	    	 	   	   A continuaci&oacute;n unos peque&ntilde;os trucos para evitar problemas     &nbsp;  Desactivar Multicast DNS, se edita /etc/nsswitch.conf y se cambia la l&iacute;nea:  &nbsp;  	 	hosts: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;files mdns4_minimal [NOTFOUND=return] dns mdns4	   &nbsp;  por  &nbsp;  	 	hosts: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;files dns	   (esto desactiva los servicios AVAHI que no son imprescindibles y que aumentan mucho los timeouts de login de GDM o incluso SSH)  &nbsp;  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&iacute;a haberlo hecho ya).  Comprobar que la primera l&iacute;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	   &nbsp;  Podemos activar el debug en GDM (clave [debug]Enable=True ) y ver el syslog mientras los equipos intentan cargar por red.  &nbsp;  Si hemos seguido todos los pasos con total exactitud tendremos un servidor TCOS funcionando en menos de media hora (contando la&nbsp;instalaci&oacute;n&nbsp;de Ubuntu) </description>
   <link>http://mariodebian.com/post/1/692</link>
      <pubDate>Thu, 22 Jul 2010 17:37:46 +0200</pubDate>   
  </item>
    <item>
   <title>Compilando drivers de TDT (DVB) AverTV TwinStar 07ca:0825</title>
   <description> 
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&ntilde;al que llega a mi habitaci&oacute;n me hac&iacute;a perder varios canales.
 
 
En este HOWTO intentar&eacute; de manera sencilla explicar como compilar una nueva versi&oacute;n de V4L previamente parcheada para el nuevo hardware.
 
 
 1.- Reconocimiento
 
 
 
Lo primero es abrir el receptor (si lo piensas devolver no deber&iacute;as hacerlo) para identificar los chips, en el m&iacute;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&eacute;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 &uacute;nico, que puedes descargar de aqu&iacute;:  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&aacute;n o copiar&aacute;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:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/modules/2.6.32-2-686/updates/v4l/dvb/dvb-usb/dvb-usb-af9035.ko  
	 license:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPL  
	 description:&nbsp;&nbsp;&nbsp; Afatech AF9035 driver  
	 author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Antti Palosaari &lt;crope@iki.fi&gt;  
	  alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v07CAp0825d*dc*dsc*dp*ic*isc*ip*&nbsp; &lt;======= here is it!!!   
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v0CCDp0093d*dc*dsc*dp*ic*isc*ip*  
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v15A4p9035d*dc*dsc*dp*ic*isc*ip*  
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v15A4p1003d*dc*dsc*dp*ic*isc*ip*  
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v15A4p1002d*dc*dsc*dp*ic*isc*ip*  
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v15A4p1001d*dc*dsc*dp*ic*isc*ip*  
	 alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usb:v15A4p1000d*dc*dsc*dp*ic*isc*ip*  
	 depends:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dvb-usb,usbcore  
	 vermagic:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.6.32-2-686 SMP mod_unload modversions 686   
	 parm:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug:set debugging level (int)  
	 parm:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapter_nr:DVB adapter numbers (array of short)  
 
 
&nbsp;
 
 
 7.- Conectamos 
 
 
Ejecutamos en un terminal: sudo tail -f /var7log/syslog, deber&iacute;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&aacute;n nuevos dispositivos:
 
 
	 
	tree /dev/dvb/ 
	/dev/dvb/ 
	├── adapter0 
	│&nbsp;&nbsp; ├── demux0 
	│&nbsp;&nbsp; ├── dvr0 
	│&nbsp;&nbsp; ├── frontend0 
	│&nbsp;&nbsp; └── net0 
	└── adapter1 
	&nbsp;&nbsp;&nbsp; ├── demux0 
	&nbsp;&nbsp;&nbsp; ├── dvr0 
	&nbsp;&nbsp;&nbsp; ├── frontend0 
	&nbsp;&nbsp;&nbsp; └── 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&iacute;amos cargados m&oacute;dulos dvb_* , tenemos que mirar los que estan cargados ( lsmod ) y quitarlos ( rrmod ), si sigue sin ir podemos probar a reiniciar.
 
 
&nbsp;
 </description>
   <link>http://mariodebian.com/post/1/691</link>
      <pubDate>Sat, 27 Feb 2010 16:38:23 +0100</pubDate>   
  </item>
    <item>
   <title>Mi primer app en android: RsyncDroid</title>
   <description> 
Presento mi nueva aplicaci&oacute;n (mejor no mirar el c&oacute;digo) para android: RsyncDroid.
 
 
Es como si fuese un HolaMundo pero un poco m&aacute;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&oacute;n mientras se ejecuta... me ha gustado.
 
 
 Instalaci&oacute;n 
 
 
Lo primero es conseguir el binario de rsync, he preparado este script (necesita ser root del tel&eacute;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 &gt; rsync 
 
./adb push rsync /sdcard/rsyncdroid/rsync 
./adb shell mount -o remount,rw /dev/block/mtdblock0 /system 
./adb shell &quot;cat /sdcard/rsyncdroid/rsync &gt; /system/bin/rsync&quot; 
./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) 
&nbsp;&nbsp; &nbsp;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&oacute;n usa una base en la que se comparte el contenido de la memoria SD. Es recomendable a&ntilde;adir algo como &quot; hosts allow = xx.xx.xx.xx &quot;, para permitir el acceso s&oacute;lo desde la IP que queramos ( man rsyncd.conf ).
 
 
La primera vez que lo ejecutemos nos pedir&aacute; 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 \ 
&nbsp;&nbsp;&nbsp; htcmagic::sdcard/ --delete /home/mario/htcmagic/backup/  
 
 
Yo me he hecho un script un poco m&aacute;s complejo para (por la madrugada) hacer ping al tel&eacute;fono y si est&aacute; en la wifi de mi red hacer la copia incremental (creando enlaces duros) y borrando las copias de seguirdad que tengan m&aacute;s de 30 d&iacute;as.
 </description>
   <link>http://mariodebian.com/post/1/690</link>
      <pubDate>Sat, 09 Jan 2010 17:25:06 +0100</pubDate>   
  </item>
    <item>
   <title>Diferencias entre algo sencillo y algo enrevesado</title>
   <description> 
Hoy me he puesto a intentar hacer una cutre aplicaci&oacute;n para Android (que est&aacute; tan de moda) y de paso a programar mis primeras l&iacute;neas en JAVA. &iquest;Qu&eacute;n invent&oacute; ese lenguaje del diablo? Se merece las 7 plagas seguidas de una lapidaci&oacute;n p&uacute;blica, y voy a ello con un ejemplo muy simple.
 
 
Vamos a intentar partir una cadena de texto por espacios,  en Python :
 
 
&gt;&gt;&gt; a=&quot;esto   es una cadena   de texto&quot;
&gt;&gt;&gt; a.split()
['esto', 'es', 'una', 'cadena', 'de', 'texto']
 
 
N&oacute;tese que entre alguna de las palabras hay m&aacute;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=&quot;esto   es una cadena   de texto&quot;;
aArray=a.split(&quot; &quot;);
for (i=0; i&lt;aArray.length; i++) {
System.out.println(&quot;index=&quot; + i + &quot; aArray=&quot; + 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&aacute;s c&oacute;digo para no hacerlo bien es como volver al esamblador. He intentado hacer  aArray=a.trim().split(&quot; &quot;)  pero ni con esas...seguro que hay una forma rebuscada de hacerlo, en python no hay que pensar tanto. Adem&aacute;s es bastante m&aacute;s lento que python y eso que se ejecuta compilado en bytecode:
 
 
$ time python -c &quot;a='esto   es una cadena   de texto'; print a.split()&quot; &gt;/dev/null
real	0m0.026s
user	0m0.020s
sys	0m0.004s
 
 
$ time java test &gt; /dev/null
real	0m0.135s
user	0m0.064s
sys	0m0.016s
 </description>
   <link>http://mariodebian.com/post/1/689</link>
      <pubDate>Fri, 08 Jan 2010 00:49:02 +0100</pubDate>   
  </item>
   </channel>
</rss>


