lunes, 31 de octubre de 2011

CyanogenMod 7.1 en mi LG Optimus One (P500)

Pude instalar exitosamente CyanogenMod 7.1 (Android 2.3 Gingerbread) en mi LG Optimus One (P500), usando un ROM no oficial (o sea un ROM que no es armado por el proyecto CyanogenMod). Mi celular tenía originalmente Android 2.2 (Froyo). El link con todas las instrucciones, advertencias, consejos, etc. es:

http://forum.xda-developers.com/showthread.php?t=946354

Mi intención con este post es compartir mi experiencia, nada más. Si vas a hacerlo, te recomiendo que sigas las instrucciones del link que puse más arriba.

Yo use la version "beta6.5.8", que era la versión estable del ROM.

Procedimiento que seguí:
  • Primero: investigar en internet los peligros de hacer esto! Lo peor que puede pasar es que el celular deje de funcionar (o sea, ni siquiera se pueda prender)! Además, los programas que vienen de fábrica puestos por LG no van a estar mas (NDrive, juegos, y la posibilidad de sincronizar los datos con la PC usando el soft de LG, etc, etc, etc). A mí esto no me afectaba porque no uso esos programas, y la sincronización la hago con Google.
  • Leer http://forum.xda-developers.com/showthread.php?t=946354 (allí están todas las instrucciones necesarias).
  • Backupear todos los datos importantes, sacar todas las fotos, downloads, etc. 
  • Antes de la instación tuve que rootearlo (no entiendo por qué Google no obliga a que todos los celulares salgan rooteados "de fábrica", o con algún procedimiento documentado para hacerlo). Lo rooteé exitosamente con GingerBreak-v1.20.
  • Luego instalé ClockworkMod ROM Manager (http://www.clockworkmod.com/rommanager): esto permite hacer un backup de la instalación original e instalar ROMs. Este programa de la opción de formatear la tarjeta SD para crear una partición ext2/ext3, swap, etc. Si se hace esto, se perderán los datos almacenados en la tarjeta SD.
  • Luego hice un backup del ROM original (Froyo), por las dudas... Y por las dudas lo bajé a la PC.
  • Luego bajé el ROM para hacer la actualización, en mi caso, la versión estable más reciente era la beta6.5.8. El link actualizado a la última versión estable está en http://forum.xda-developers.com/showthread.php?t=946354
  • Luego de bajar el archivo, hay que pasarlo a la tarjeta SD.
  • En el Android, abrir "Rom Manager", elejir "Intall ROM from SD Card", y elegir el archivo bajado en el punto anterior. Lo que recomiendan es "... Do not forget to wipe data/cache ...", así que yo elegí borrar todo (total no tenía datos importantes en el celular).
  • A esta altura, el celular se reiniciará, instalará la nueva versión y arrancará nuevamente.
  • Luego hace falta instalar un ROM que trae las aplicaciones de Google mínimas necesarias (por ejemplo, Market!). El link para bajar las apicaciones también está en http://forum.xda-developers.com/showthread.php?t=946354
  • Ahora ya podemos abrir Market y bajar las aplicaciones que necesites :-)

    domingo, 23 de octubre de 2011

    Aptitude no funciona con multiarch

    Ubuntu Oneiric activa el soporte para multiarch.
    Multiarchi: Integrate support for cross-architecture installation of binary packages (particularly i386 / amd64, but also other combinations) in dpkg and apt
    Esto produce que aptitude sea bastante inusable debido a varios bugs (831768828807845183) que, al dia de hoy parecen estar sin resolver. Probé desactivar multiarch y al menos aptitude ya me funciona como antes. Para desactivar multiarch, edité el archivo /etc/dpkg/dpkg.cfg.d/multiarch y comenté la única linea que tiene:

    Antes:
    foreign-architecture i386

    Ahora:

    #foreign-architecture i386

    Al menos ya no me causa problemas al instalar nuevos paquetes, y ya no tengo conflictos imposibles de resolver (831768).

    ----------

    Luego de desactivar multiarch, no me funciona Wine, asi que simplemente no usaré aptitude, y estaré obligado a usar apt-get, o synaptic :-(

    Estilos de app. Gtk al usar KDE

    Por alguna cuestion la integración del estilo de las aplicaciones GTK (por lo tanto las app. Gnome) no está funcionando al usar KDE en Ubuntu Oneiric.

    Encontré una alternativa en https://bbs.archlinux.org/viewtopic.php?id=121803. Tampoco funcionó. Pero luego de revisar los estilos con soporte para GTK3, encontré que el estilo "oxygen-gtk" no existe en /usr/share/themes... Asi que probé con "Radiance" (que existe y es para GTK3) y funcionó! :-)

    Luego de hacer unas modificaciones, este es el contenido que dejé en /etc/gtk-3.0/settings.ini.

    [Settings]
    gtk-theme-name = Radiance
    gtk-fallback-icon-theme = gnome
    gtk-application-prefer-dark-theme = false
    gtk-font-name = Sans 9

    Y ahora queda pendiente arreglar las aplicaciones GTK2. Al parecer, las aplicaciones GTK2 buscan un archivo ".gtkrc-2.0" en el home del usuario, pero KDE genera un archivo llamado ".gtkrc-2.0-kde4". Esto puede solucionarse creando un symlink en el home del usuario con el siguiente comando:

    ln -s .gtkrc-2.0-kde4 .gtkrc-2.0

    sábado, 22 de octubre de 2011

    Ubuntu Oneiric + Arduino 0.22 = problemas

    Luego de actualizar Ubuntu ya no me compiló un proyecto de Arduino. Luego de chequear en internet encontré que hay unos bugs relacionados a este problema:

    https://bugs.launchpad.net/ubuntu/+source/binutils-avr/+bug/818188
    https://bugs.launchpad.net/ubuntu/+source/avr-libc/+bug/791335
    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634341
    http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=633659

    Y la forma rápida de solucionarlo fue seguir el consejo del último de los links, editando el archivo hardware/arduino/cores/arduino/wiring.h (dentro del directorio donde tengo instalado Arduino 0.22) y comentando la linea 79:

    Inicialmente está así:

    #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

    y ahora:

    // #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

    No sé cuáles serán los "efectos colaterales" pero funcionó!

    miércoles, 19 de octubre de 2011

    Cómo resetear South

    Podemos resetear South desinstalándolo y volviéndolo a instalar. Atención: esto hará que se pierdan todas las migraciones existentes, y los datos de las BD de las aplicaciones que se quieran resetear. Los pasos a seguir son:

    1) eliminar de la BD las tablas de South: south_migrationhistory.
    2) eliminar de la BD las tablas de las aplicaciones administradas por south.
    3) eliminar el paquete migrations de las aplicaciones que usen South.
    4) ejecutar syncdb.
    5) volver a marcar las aplicaciones que deben ser administradas usando South, ejecutando: "manage.py convert_to_south APP"


    lunes, 26 de septiembre de 2011

    PHP ejecutados al ser accedidos con WebDav

    Seguí las instrucciones para configurar WebDav en Apache2 (Ubuntu Server 10.04.3 LTS), pero las páginas de PHP eran "ejecutadas" al ser bajadas desde el editor HTML. La configuración (obviando la restricción por IP y usuario/password) era:

        Alias /edit /var/www/www.example.com
        <Location /webdav>
            DAV On
            ForceType text/plain
        </Location>
    

    Revisando la configuración de Apache ví que PHP era habilitado usando "SetHandler", así que lo solucioné usando "SetHandler None":

        Alias /edit /var/www/www.example.com
        <Location /webdav>
            DAV On
            ForceType text/plain
            SetHandler None
        </Location>
    


    jueves, 1 de septiembre de 2011

    Desabilitando GDM al inicio

    En Ubuntu 11.04 los servicios los arranca Upstart, así que para deshabilitar GDM no se puede borrar el link de /etc/rc2.d/gdm. La forma de hacerlo es editar /etc/init/gdm.conf y agregar "and runlevel RUNLEVEL=5" a la opción "start on". El diff es:


    --- a/init/gdm.conf
    +++ b/init/gdm.conf
    @@ -7,6 +7,7 @@ description     "GNOME Display Manager"
     author         "William Jon McCann "

     start on (filesystem
    +          and runlevel RUNLEVEL=5
               and started dbus
               and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
                    or stopped udev-fallback-graphics))

    sábado, 20 de agosto de 2011

    Benchmarks de port forwarding con Python+Eventlet

    Les comparto algunos benchmarks que hice para verificar la velocidad del "tcp port forwarder" implementado usando Python+Eventlet: http://blog.eventlet.net/2010/02/28/beautiful-er-eventlet/

    No pude hacer los tests usando 'ab', ya que parece haber algun problema por el cual la aplicación no funciona correctamente.

    Copia de ISO usando scp, puerto 22: OK
    • ubuntu.iso 100%  698MB  63.4MB/s   00:11
    • ubuntu.iso 100%  698MB  69.8MB/s   00:10
    • ubuntu.iso 100%  698MB  69.8MB/s   00:10

    Copia de ISO usando scp, puerto 7000 (eventlet): OK
    • ubuntu.iso 100%  698MB  41.0MB/s   00:17
    • ubuntu.iso 100%  698MB  41.0MB/s   00:17
    • ubuntu.iso 100%  698MB  43.6MB/s   00:16

    Copia de ISO, usando wget, bajada directamente de Apache, puerto 80: OK
    • 731,453,440  524M/s   in 1.3s    
    • 731,453,440  539M/s   in 1.3s    
    • 731,453,440  523M/s   in 1.3s    


    Copia de ISO, usando wget, bajada directamente de Apache, puerto 7080 (eventlet): OK
      • 731,453,440  319M/s   in 2.2s
      • 731,453,440  318M/s   in 2.2s
      • 731,453,440  323M/s   in 2.2s


      Usando ApacheBench, al puerto 80:  OK
      • ab -n 400 -c 5 http://localhost:80/index.html 
        • Finished 400 requests
        • Concurrency Level:      5
        • Time taken for tests:   0.083 seconds
        • Complete requests:      400
        • Failed requests:        0


      Usando ApacheBench, al puerto 7080 (eventlet): ERROR!!!
        • ab -n 400 -c 5 http://localhost:7080/index.html 
          • apr_poll: The timeout specified has expired (70007)
        • ab -n 40 -c 5 http://localhost:7080/index.html 
          • apr_poll: The timeout specified has expired (70007)
        • ab -n 5 -c 1 http://localhost:7080/index.html 
          • apr_poll: The timeout specified has expired (70007)

        ssh en CentOS 6

        Estoy aprendiendo a trabajar con CentOS, luego de instalar un servidor de aplicaciones python en CentOS 5.6, estoy arrancando desde cero con un CentOS 6. El tema es que se me complicó la configuracion de ssh.

        Por alguna cuestión, no podia ingresar como root a mi máquina virtual con CentOS 6, y resultó ser un problema relacionado con SELinux.

        En definitiva, la configuración del servidor SSH, los permisos, todo estaba OK, y lo solucioné ejecutando:

        • /sbin/restorecon -r /root/.ssh
        Para los servidores "reales" nunca permito el login de root, pero para aprender, en una máquina virtual en mi PC, es muy cómodo poder acceder directamente como root :-D

        viernes, 19 de agosto de 2011

        Listar BD y tablas con sus respectivos tamaños

        Para listar las bases de datos con el tamaño ocupado en disco de cada una:

        • SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database ORDER BY pg_database_size(pg_database.datname);

        Para listar las tablas con el tamaño ocupado en disco de cada una, pero solo del schema 'public' (probado en PostgreSql 8.1):

        • SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename)) FROM pg_tables WHERE schemaname = 'public'  ORDER BY pg_total_relation_size(tablename);

        Para que la última consulta funcione en Postgre 8:4, hay que utilizar casting:
        • SELECT tablename, pg_size_pretty(pg_total_relation_size(tablename::TEXT)) FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(tablename::TEXT);
        Esto lo probé en 8.1 y 8.4 (únicas versiones que tengo a mano).

        miércoles, 10 de agosto de 2011

        psycopg2 (2.4.2) + Django (1.3) = problemas!


        Si usas psycopg2 versión 2.4.2 con Django 1.3 surge el siguiente problema:

        $ ./virtualenv27/bin/python src/dynamicware/manage.py test myprojects
        Creating test database for alias 'default'...
        (...)
        psycopg2.ProgrammingError: autocommit cannot be used inside a transaction



        Una solución temporal es instalar la versión anterior de psycopg2:

        $ ./virtualenv27/bin/pip install psycopg2==2.4.1

        La solución definitiva ya existe: https://code.djangoproject.com/ticket/16250

        PIL / pillow + virtualenv

        Instalé PIL usando virtualenv, y así termina la instalción:


            --------------------------------------------------------------------
            PIL 1.1.7 SETUP SUMMARY
            --------------------------------------------------------------------
            version       1.1.7
            platform      linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
                          [GCC 4.5.2]
            --------------------------------------------------------------------
            *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
            *** JPEG support not available
            *** ZLIB (PNG/ZIP) support not available
            *** FREETYPE2 support not available
            --- LITTLECMS support available
            --------------------------------------------------------------------



        PIL se instaló correctamente, pero sin soporte para JPEG y PNG. Este es el funcionamiento "esperado" al instalar PIL con virtualenv.

        La solución: usar pillow (fork PIL, amigable con virtualenv)

        Luego de ejecutar "./virtualenv27/bin/pip install pillow":


            --------------------------------------------------------------------
            Pillow 1.7.4 ( PIL fork based on PIL 1.1.7 ) SETUP SUMMARY
            --------------------------------------------------------------------
            platform  linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
              [GCC 4.5.2]
            --------------------------------------------------------------------
            *** TKINTER support not available (Tcl/Tk 8.5 libraries needed)
            --- JPEG support available
            --- ZLIB (PNG/ZIP) support available
            --- FREETYPE2 support available
            --- LITTLECMS support available
            --------------------------------------------------------------------

        domingo, 17 de julio de 2011

        Storage distribuido con SheepDog

        Instalé SheepDog siguiendo las instrucciones del sitio sobre un Debian Sid, todo funcionó excelente!

        Todo el esquema de pruebas lo armé en mi notebook:
        • Host: acer (Ubuntu Desktop 11.04)
          • Guest: debian-virt-server-01 (Debian Sid / libvirt+KVM)
            • ejecutando SheepDog
          • Guest: debian-virt-server-02 (Debian Sid / libvirt+KVM)
            • ejecutando SheepDog
          • Guest: debian-virt-server-03 (Debian Sid / libvirt+KVM)
            • ejecutando SheepDog
          • Guest: linux-over-sheepdog (Ubuntu 10.04 Server / QEMU)
            • usando "linux-over-sheepdog" como disco (esta imagen es creada usando qemu-img).
        Luego configuré coresync y arranqué sheepdog en debian-virt-server-01debian-virt-server-02 y debian-virt-server-03.

        Ahora, a crear la imagen de disco!

        root@debian-virt-server-01:~# collie cluster format --copies=2

        Este comando sólo se debe ejecutar en 1 nodo.

        root@debian-virt-server-01:~# collie node list
         Idx - Host:Port Number of vnodes
        ------------------------------------------------
        * 0 - 192.168.122.101:7000 64
         1 - 192.168.122.102:7000 64
         2 - 192.168.122.103:7000 64
        El cluster fue "formateado" para que mantenga 2 copias de la información. Los 3 nodos se están viendo, ya que aparecen al ejecutar "collie node list". 

        Creamos imagen para ser usado como disco

        acer| ~$ qemu-img create sheepdog:192.168.122.101:7000:linux-over-sheepdog 4G
        Formatting 'sheepdog:192.168.122.101:7000:linux-over-sheepdog', fmt=raw size=4294967296
        Booteamos QEMU

        acer| ~$ qemu-system-x86_64 -enable-kvm -m 512 -cdrom ubuntu-10.04-server-amd64-LTS.iso sheepdog:192.168.122.101:7000:linux-over-sheepdog

        Y listo! La instalación de Ubuntu Server se inició correctamente sobre un "disco virtual" hosteado usando SheepDog.



        miércoles, 13 de julio de 2011

        Procesamiento de anotaciones en Java

        Hay un bug en la JVM de Sun Oracle que hace fallar el procesamiento de anotaciones. Me pasó que compilando el proyecto funcionaba OK, pero al agregar "-processor ....", aparecía el siguiente problema:


        [javac] /...../ValidationCheck.java:25: incompatible types
        [javac] found   : ......annotations.Type
        [javac] required: ......Type
        [javac] Type type() default Type.WORKER;

        El problema es el Enum "Type". Este Enum existe y está en el classpath, pero javac "no la ve". Está definido de la siguiente manera:

        Type type() default Type.WORKER;

        La solución para zafar de este bug es introducir el paquete en el nombre del Enum, de manera que quede:

        Type type() default my.package.annotations.Type.WORKER;


        Y con eso compila!

        BUGhttp://bugs.sun.com/view_bug.do?bug_id=6512707

        viernes, 1 de julio de 2011

        Cómo usar dispositivos USB desde KVM

        Quiero usar mi pendrive desde un guest KVM (gestionado por libvirt). El dispositivo USB es el marcado con negrita:

        acer| ~$ lsusb
        Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
        Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
        Bus 002 Device 004: ID 0930:6545 Toshiba Corp. Kingston DataTraveler 102 flash drive

        Primera opción: usando vendor id + product id

        Editamos el XML usando "virsh edit", y agregamos lo siguiente en el elemento devices:



        Esta opción asocia un "tipo de dispositivo" (en este caso, el pendrive Kingston) al guest KVM, sin importar en qué puerto se conecte.

        Segunda opcióni: usando bus + device

        Editamos el XML usando "virsh edit", y agregamos lo siguiente en el elemento devices:



        Esta opción asocia un puerto USB al guest, sin importar qué tipo de dispositivo se conecte.

        sábado, 18 de junio de 2011

        AppEngine: cómo evitar subir contenidos de un directorio

        Al trabajar con Google App Engine, podemos crear un directorio en la base del proyecto, y luego configurar app.yaml para que ignore estos archivos. Por ejemlpo, si el directorio se llama local, hay que agregar a las siguientes líneas al archivo app.yaml:

        skip_files:
        - ^(.*/)?app\.yaml
        - ^(.*/)?app\.yml
        - ^(.*/)?index\.yaml
        - ^(.*/)?index\.yml
        - ^(.*/)?#.*#
        - ^(.*/)?.*~
        - ^(.*/)?.*\.py[co]
        - ^(.*/)?.*/RCS/.*
        - ^(.*/)?\..*
        - ^local/.*
        

        Todas las líneas excepto la última, corresponden a la configuración por default de skip_files. La última línea hace que el directorio local en la raiz del proyecto sea ignorado al ejecutar appcfg.py.

        miércoles, 15 de junio de 2011

        Compactar particiones con zerofree

        Para realizar backups de imágenes de discos usadas en QEmu/KVM se puede optimizar usar zerofree. Este programa  escribe 0 (ceros) en los lugares de la imagen que NO está siendo usada por archivos, y que han sido usadas pero actualmente están libres (por ejemplo, en el lugar donde se haya creado un archivo que luego haya sido borrado).

        Zerofree funciona para ext2/ext3/ext4, en particiones que no están montadas, o montadas solo-lectura. Esta utilidad es "inteligente" en el sentido que no hace "crecer" a los archivos sparse. 


        Los pasos a seguir son:

        • cargar nbd

           ~$ sudo modprobe nbd max_part=16

        • asociar imagen de disco disk01.qcow2nbd1 y crear dispositivos asociados a particiones

           ~$ sudo qemu-nbd -c /dev/nbd1 -v disk01.qcow2
           ~$ sudo partprobe /dev/nbd1

        • ejecutar zerofree

           ~$ sudo zerofree -v /dev/nbd1p5

        Listo! El archivo "disk01.qcow2" ocupa teóricamente 11G, pero como es un archivo sparse, en realidad está ocupado en disco sólo 1.9G:


           ~$ ls -lh disk01.qcow2
           -rw-r--r-- 1 root root 11G 2011-06-15 14:51 disk01.qcow2
           ~$ du -h disk01.qcow2 

           1.9G disk01.qcow2

        El .tar ocupa sólo 918M:

           ~$ tar --sparse -cf disk01.qcow2.tar disk01.qcow2
           ~$ ls -lh disk01.qcow2.tar 
           -rw-r--r-- 1 horacio horacio 918M 2011-06-15 15:10 disk01.qcow2.tar

        Y al comprimirlo solo nos queda 305M:

           $ gzip -1 disk01.qcow2.tar 
           $ ls -lh disk01.qcow2.tar.gz 
           -rw-r--r-- 1 horacio horacio 305M 2011-06-15 15:10 disk01.qcow2.tar.gz



           ~$ du -h *
           1.9G disk01.qcow2
           305M disk01.qcow2.tar.gz



        En este caso, un archivo que ocupa inicialmente 1.9G lo llevamos a ocupar 918M (305M comprimido).

        jueves, 9 de junio de 2011

        Cómo compilar cliente spice

        Seguiendo los pasos para instalar Spice (un nuevo protocolo para comunicarse con guests KVM/QEMU/etc.) me surgieron unos errores, no muy complicados de resolver.

        En general, segui las instrucciones de http://spice-space.org/page/Building_Instructions.
        La instalación la hice en /usr/local/slice, asi que reemplace "INST_ROOT" por "/usr/local/slice".


        Para compilar e instalar el cliente, en un momento hay que ejecutar:

        ~$ cd $SRC_ROOT/spice
        ~$ ./autogen.sh --prefix=$INST_ROOT

        Pero este ultimo comando me generó un error:


        ----------------------------------------
        (...)
        checking for PROTOCOL... no
        configure: error: Package requirements (spice-protocol >= 0.6.0) were not met:
        No package 'spice-protocol' found
        Consider adjusting the PKG_CONFIG_PATH environment variable if you
        installed software in a non-standard prefix.
        Alternatively, you may set the environment variables PROTOCOL_CFLAGS
        and PROTOCOL_LIBS to avoid the need to call pkg-config.
        See the pkg-config man page for more details.
        ----------------------------------------

        Esto se solucione usando:

        ~$ export PKG_CONFIG_PATH="/usr/local/spice/share/pkgconfig:/usr/local/spice/lib/pkgconfig"
        ~$ ./autogen.sh --prefix=/usr/local/spice
        ~$ cd client
        ~$ make install

        Y... no funcionó...

        ----------------------------------------
        make[1]: *** No rule to make target `../common/libspice-common.la', needed by `spicec'. Stop.
        make[1]: Leaving directory `/mnt/sin_encriptar/src/spice-client-src/spice/client'
        make: *** [install] Error 2

        ----------------------------------------

        Pero, compilando manualmente lo del directorio "common", luego lo de "cliente" funciona:

        ~$ cd ..
        ~$ cd common
        ~$ make install
        ~$ cd ..
        ~$ cd client
        ~$ make install

        Y ahora sí!

        viernes, 3 de junio de 2011

        Eliminando *.pyc del repositorio Git

        Por un error subí archivos pyc al repositorio Git. Ya que no me hace falta mantener esos archivos en el repositorio, decidí intentar eliminarlos del historial, usando "git filter-branch". Resultó ser bastante fácil!

        $ git filter-branch --tag-name-filter cat \
        --index-filter 'git rm -r --cached --ignore-unmatch *.pyc' HEAD

        Esto no es peligroso para repositorios "personales", pero SI para repositorios compartidos, ya que este comando reescribe todo el historial. También hay que tener cuidado si se están utilizando varios branches, ya que este comando solo trabaja en 1 branch a la vez.

        La documentación del comando puede verse aqui.

        Probando LM335 con PyArduinoProxy

        Subi unos screenshots, mostrando cómo usé la interfaz web de PyArduinoProxy para testear unos LM335.

        https://github.com/hgdeoro/py-arduino-proxy/wiki/Example%3A-Testing-LM335