Raging Bits

Easy systems, raging bits

Migrar De Gmail a Gmail

| Comments

Intento migrar mi cuenta de gmail, de una antigua a otra más seria, llevándome todos los contactos, feeds, filtros, calendarios, chats y, por supuesto, los correos. Los correos deben mantener:

  • Leidos
  • Preferidos
  • fechas
  • Origen y destino (no ser un reenvio)
  • Etiquetas (múltiples)

Migrar correo

Probé 4 opciones, gyb, imapsync, gmail-backup y thunderbird, decantándome finalmente por gyb. Todas ellas sincronizan el correo mediante IMAP entre las dos cuentas de google, por el procedimiendo de descargar primero el correo de la cuenta antigua al disco duro, y enviarlo posteriormente a la nueva.

Activar imap

Debe irse a las opciones de ambas cuentas, a Forwarding and POP/IMAP y activar IMAP en ambas cuentas.

activate-imap

Con Got-your-back

Es el más rápido con diferencia, hace backup y restaura todo (etiquetas multiples, marca de importante, leidos…) y solo envía cada correo una vez. Emplea autenticación mediante token como app Google. Al ejecutarlo escribirá una url a la que tendrás que acceder y logearte con la cuenta de gmail para permitirle acceso.

  1. Descargar el script
  2. Realizar el backup de la cuenta antigua:

     python gyb.py --email antigua@gmail.com --backup --compress
    

    Creará el directorio GYB-Gmail-Backup-antigua@gmail.com con el correo guardado.

  3. Restaurar el correo en la nueva

     python gyb.py --email nueva@gmail.com --restore 
         --compress --folder GYB-Gmail-Backup-antigua@gmail.com
    

El proceso de restore lleva mucho más tiempo. Es la mejor forma con diferencia para hacer backup a una cuenta gmail. De hecho me estoy pensando en mantener un backup offline de mi cuenta metiendo la orden de backup en el cron.


Con gmail-backup

gmail-backup se ve que esté mantenido desde el 2009, y solo está disponible en formato binario, no tiene licencia libre y está compilado con una versión antigua de python. Aún así, es bastante más rápido que imapsync y es más sencillo de usar.

Instalar gmail-backup

  1. Descargar el binario de su página oficial y descomprimir.
  2. Descargar e instalar python2.5 si no se encuentra en el sistema (intenta ejecutar python2.5 en consola).

     code-block::bash
     tar -xvzf Python-2.5.6.tgz
     cd Python-2.5.6
     ./configure
     make
     sudo make altinstall
    

¡Ojo!: Usad altinstall y no simplemente install, o sobreescribirá la versión actual por defecto de Python en el sistema.

backup & restore

Primero haremos un backup completo de nuestra cuenta antigua para a continuación restaurarla en la cuenta nueva. Haciendo de esto, tendremos de paso una copia de seguridad de todo nuestro correo. Eso sí, tardará, aunque menos que imapsync.

code-block::bash
./gmail-backup.sh backup ~/gbackup antigua@gmail.com p4sw0rd \
&& ./gmail-backup.sh restore ~/gbackup nueva@gmail.com p4sw0rd

Con imapsync

imapsync es una herramienta escrita en Perl, que sincroniza dos servidores IMAP. Se le indica la cuenta de origen y de destino, y manda todos los correos de orige a destino, sincronizándolos.

Instalar imapsync

sudo apt-get install imapsync

Sincronizar

Para ello se llama a imapsync dos veces. Una para sincronizar los labels (folders) y otra para enviar el correo.

imapsync\
    –user1 antigua@gmail.com\
    –user2 nueva@domain.com\
    -passfile1 ./antigua-pass\
    -passfile2 ./nueva-pass\
    –host1 imap.gmail.com\
    –host2 imap.gmail.com\
    -authmech1 LOGIN -authmech2 LOGIN\
    -port1 993 -port2 993\
    -split1 100 -split2 100\
    -ssl1 -ssl2\
    –syncinternaldates\
    –justfolders\


imapsync \
    –user1 antigua@gmail.com\
    –user2 nueva@domain.com\
    -passfile1 ./antigua-pass\
    -passfile2 ./nueva-pass\
    –host1 imap.gmail.com\
    –host2 imap.gmail.com\
    -authmech1 LOGIN -authmech2 LOGIN\
    -port1 993 -port2 993\
    -split1 500 -split2 100\
    -ssl1 -ssl2\
    --fastio1 --fastio2
    -syncinternaldates\
    -allowsizemismatch\
    --nofoldersizes\
    --skipsize\
    --fast\
    --useheader 'Message-Id' \
    --useheader 'X-Gmail-Received'
    --exclude "(Trash|Spam|Publicidad)"
    --timeout 100

Explicación de las opciones:

  • passfile: es un fichero de texto plano que contiene solo la clave, para no ponerla directamente en la consola.
  • syncinternaldates: Evita que se cargue la fecha de los emails.
  • justfolders: Crea solo los directorios/labels.
  • allowsizemismatch: Se quejaba de error por diferente tamaño en los correos bajados, esto hace que los ignore.
  • exclude: Carpetas/Labels a excluir de la sincronización.
  • useheader: El imap de gmail omite esas cabeceras, forzarlas.
  • split: Tamaño de petición a cada servidor. Al de subida pedimos menos.
  • fastio fast: Realiza las operaciones más rápido
  • nofoldersizes skipsize: No calcula estadísticas ni tamaños, que es lento.
  • timeout: Abortar tras x segundos de inactividad.

Aviso que tarda muchísimo, ya que debe descargar todo el correo y volverlo a enviar, incluyendo attachments, para cada etiqueta, lo que hace que envie L veces cada correo, donde L es el número de etiquetas que tiene. No se duplica ya que gmail los detecta como el mismo y simplemente les añade la etiqueta correspondiente en lugar de copiarlo de nuevo.

Cuando el proceso se para, es conveniente volverlo a ejecutar añadiendo el parámetro: --maxage int donde int indica la fecha del el último correo que enviamos, y así descarta evaluar los más antiguos.

Para reiniciar la conexión cuando se pilla usé un bucle infinito y la opción --timeout 100, para no tener que estar cuidando yo del proceso.

code-block::bash
while [ 1 -eq 1 ] 
 do
    imapsync\
    -host1 imap.gmail.com -port1 993 -user1 antigua@gmail.com -passfile1\
    ./antiguapass -ssl1 -host2 imap.gmail.com -port2 993 -user2\
    nueva@gmail.com -passfile2 ./nuevapass -ssl2 -syncinternaldates -split1\
     500 -split2 500 --fastio1 --fastio2 -authmech1 LOGIN -authmech2 LOGIN\
     -useheader 'Message-Id' -useheader 'X-Gmail-Received'\
    --exclude "(Junk|Spam|Trash|Publicidad|All Mail|dspace-list|wp-admin|spam)"\
     --allowsizemismatch --nofoldersizes --skipsize --fast --timeout 100

    sleep 5
  done

Migrar Contactos

En la página de gmail, en la cuenta antigua, vamos a Contactos, en Más Opciones seleccionamos Exportar y lo descargamos en formato Google CSV.

export-import-contacts

En la cuenta nueva, realizamos el proceso inverso, Más opciones–>Importar y seleccionamos el CSV.

Migrar feeds Google Reader

Los feeds suscritos en Google Reader pueden exportarse también en un fichero. Dentro del Reader, logeado con la cuenta antigua, vamos a Opciones de Reader–>Importar/Exportar y descarga el fichero tipo OPML.

export-reader

Una vez conseguido ese fichero, vamos al reader de la cuenta nueva, también a Opciones de Reader–>Importar/Exportar y subimos el fichero OPML que antes descargamos.

Migrar calendarios

Los calendarios realmente no están dentro de tu cuenta, sino que pueden ser compartidos por varias personas con privilegios similares a los del usuario que los creó, de forma que lo único que hay que hacer realmente es compartirlo con la cuenta de correo nueva con privilegios de administrador.

share-calendar

Migrar filtros

Debe activarse la importación/exportación de filtros en el labs para ambas cuentas:

export-filter

Después de activarla solo tenemos que exportar en la página de la cuenta antigua e importar en la de la nueva.

import-filter

Intentos fallidos

Lo intenté antes con thunderbird, como hacen aquí, sincronizando ambos correos y arrastrando los directorios de una a otra cuenta, y lo hace bien, pero no mantiene más de una etiqueta/carpeta por correo. Y luego con gmail-backup, que no me conservó las etiquetas (y aparte es propietario, te dan solo el binario y necesita Python 2.5, un peñazo).

Migrar De Gmail a Gmail

| Comments

  • Diferentes estilos de C++ no se suponia que se usasen por separado
  • Huir de las funciones antiguas que piden especificar tamaños y punteros y solo funcionan con datos básicos.
  • Mal estilo de programación es el 1 problema del código C++
  • Que se quiere? Simplificar el uso
  • Utilizar medidas del SI. Que es un double? Que es un objeto? El satélite que se perdió por cambio de unidades entre SI e Imperial.
  • Se hace hace mucho tiempo con plantillas, pero la notación es horrible y la gente no la usa.
    • Se pueden definir los propios LITERALES: operator “”

Generar Ecuaciones LaTeX

| Comments

latex-logo

Mientras reconstruia este blog en pelican a partir de una exportación del blog antiguo en Wordpress, tuve que resolver como volver a generar las ecuaciones en LaTeX que había insertado en esos posts.

Wordpress me generaba esas ecuaciones como imágenes de forma automática, simplemente poniendo el código entre llaves [latex], de esta manera:

code-block::latex
[latex size="4"]
    \frac { \sum{(nota \cdot creditos)} }
          { \sum{creditos} } 
[/latex]

Generando una imagen como resultado:

Para poder hacer lo mismo (preferiblemente en consola) y poder insertar ecuaciones en LaTeX en los posts como imágenes, escribí este pequeño script:

code-block::bash
#!/bin/bash

TMPNAME=tmpfile
TMP=/tmp/$TMPNAME

echo "\documentclass[14pt,english]{article}" > $TMP
echo "\usepackage[utf8]{inputenc}" >> $TMP
echo "\thispagestyle{empty}" >> $TMP
echo "\begin{document}" >> $TMP
echo "$ ${1} $" >> $TMP
echo "\end{document}" >> $TMP

pdflatex $TMP
pdfcrop $TMPNAME.pdf $TMPNAME.pdf
pdf2svg $TMPNAME.pdf $2
rm -f $TMPNAME.pdf $TMP

El cual genera un documento LaTeX al vuelo, sin ningún tipo de estilo, lo compila en pdf usando pdflatex y elimina todos los márgenes usando pdfcrop, convirtiendo lo que queda (solo la ecuación) a svg con pdf2svg, que es la imagen que finalmente coloco.

Generate LaTeX Equations

| Comments

latex-logo

While rebuilding this blog with pelican from a xml export of the previous Wordpress version, I had to face how to regenerate the LaTeX equations inserted within some posts.

Wordpress used to take care of the equation generation through the use of a plugin, taking as input the code between [latex] labels like this:

code-block::latex
[latex size="4"]
    \frac { \sum{(nota \cdot creditos)} }
          { \sum{creditos} } 
[/latex]

Generating an image with the LaTeX result and placing it whithin the post:

In order to replicate the same (command-line way) so LaTeX equations could be inserted in my posts as images, I came up with the following script:

code-block::bash
#!/bin/bash

TMPNAME=tmpfile
TMP=/tmp/$TMPNAME

echo "\documentclass[14pt,english]{article}" > $TMP
echo "\usepackage[utf8]{inputenc}" >> $TMP
echo "\thispagestyle{empty}" >> $TMP
echo "\begin{document}" >> $TMP
echo "$ ${1} $" >> $TMP
echo "\end{document}" >> $TMP

pdflatex $TMP
pdfcrop $TMPNAME.pdf $TMPNAME.pdf
pdf2svg $TMPNAME.pdf $2
rm -f $TMPNAME.pdf $TMP

Which generates a LaTeX document on the fly with no styles at all, compiles it to pdf using pdflatex, eliminates all margins using pdfcrop and converts it to the final svg image with pdf2svg.

The result can be inserted in the post as an svg image. I’m still wondering if this could be a desirable extension for the markdown reader of pelican

Renombrar Etiqueta Usb Linux

| Comments

En este caso es una tarjeta SD en FAT32 que no tiene label y al montarla Ubuntu la llama 9016-4EF8, lo cual no me dice mucho y me gustaría cambiarlo. La herramienta para cambiar labels de FAT32 se llama mlabel y viene en el paquete mtools.

  1. Averiguamos que dispositivo es, para llamarlo por su nombre después.

     $ df /media/9016-4EF8
     Filesystem           1K-blocks      Used Available Use% Mounted on
     /dev/sdb1             31263744        32  31263712   1% /media/9016-4EF8
    

    Se llama /dev/sdb1.

  2. La desmontamos para trabajar con el a gusto, que estaba en /media/9016-4EF8.

     $ sudo umount /media/9016-4EF8
    
  3. Para usar mlabel necesitamos que el dispositivo tenga un nombre, asi que copiamos la config por defecto de mtools y le añadimos nuestro dispositivo. Lo llamaremos i.

      $ cp /etc/mtools.conf ~/.mtoolsrc
      $ echo 'drive i: file="/dev/sdb1"' >> ~/.mtoolsrc
    
  4. Renombramos la partición con mlabel.

     $ sudo mlabel i:mi_tarjeta
    

Nota: si mlabel os escupe algo parecido a esto:

code-block::text
Total number of sectors (62543872) not a multiple of sectors per track (63)!
Add mtools_skip_check=1 to your .mtoolsrc file to skip this test

Sed obedientes y simplemente añadid mtools_skip_check=1 al fichero.

$ echo 'mtools_skip_check=1' >> ~/.mtoolsrc

Y listo, al conectar el dispositivo se monta solo con el nombre bueno:

code-block::console
$ ls /media/
MI_TARJETA

Generar CSS Con Pygmentize

| Comments

Para el coloreado de código de este blog empleo la herramienta pygmentize, la cual es capaz de generar un fichero css con el estilo con el que quiero que salga el texto de los programas.

Para generar un estilo usar:

code-block::bash
pygmentize -f html -S borland -a .codehilite > pygment.css

Donde borland es el estilo y .codehilite es la clase a emplear para localizar el código en la página posteriormente. Otras cosas que pueden hacerse con la línea de comandos.

Exportacion De M3u en Python Y Bash

| Comments

Title: Exportación de m3u en Python y Bash Date: 2011-06-05 06:20 Category: Dev Tags: python, script, m3u, mp3, music, playlist, Nexus One

![image][]

Tengo un reproductor MP3 muy sencillo que empleo para correr. No tiene ná, la música se carga en una carpeta interna llamada ‘MUSIC’ y eso es todo lo que hay que hacer.
El problema es que a Banshee no le da la gana de manejarlo, lo que me obliga a copiar los archivos a mano. Con la pereza que me da, últimamente siempre tengo la misma música.
Lo mismo me pasa con mi Nexus One. Cuando a todo le falla la batería, tiro de él para amenizar camino andado, pero siempre tengo lo mismo.

Aburrido, decidí hacer algo que tomase una lista de reproducción de Banshee y pusiese esos archivos de música en un directorio. Esto me permitiría las siguientes cosas:

Hacer listas de reproducción en Banshee y exportarlas a un directorio concreto sin buscar archivos a mano. Elegir canciones sin el reproductor conectado, enchufarlo y sincronizar con un boton.

Hacer listas con esas canciones y tenerlas en un directorio me viene perfecto también para pasarle música a colegas. Usaría para esto enlaces duros en lugar de copias y así podría tener muchos directorios preparados para que se los llevasen, o en Dropbox, sin ocupar espacio.

En este punto, me surge la eterna duda que me asaltaba cuando trabajaba metiendo mano en servidores. ¿Script en Bash o en Perl/Python? Los scripts en Bash son muy cortos y directos, me encantan para soluciones rápidas. Pero luego, luego, empiezan a crecer y crecer, mantenerlos es una pesadilla, y acababa reescribiéndolos en Python.

Ante la duda de si elegir uno u otro, decidí… implementar ambos y compararlos.

Al lío:

Banshee exporta a m3u, pls y xspf. Por ahora solo he soportado m3u que era el más sencillo, pero lo he hecho todo pensando en poder ampliarlo fácilmente.
Un m3u tiene la siguiente pinta:

#EXTM3U

#EXTINF:153,Go Back To The Zoo - Beam me up

../../home/arl/Music/Ofcourse/Benny Blisto/Go Back To The Zoo/03-go_back_to_the_zoo-beam_me_up.mp3

#EXTINF:224,Joy Division - No Love Lost

../../home/arl/Music/Ofcourse/Substance/Substance/11 No Love Lost.mp3

#EXTINF:211,Pony Bravo - Noche de Setas

../../home/arl/Music/Ofcourse/Pony Bravo/Un Gramo de Fe/02 Noche de Setas - PonyBravo.mp3

Comentario con el título, y ruta relativa al fichero de música, en base a donde se guardó la lista de reproducción.

El script recibe la lista de reproducción y el directorio donde quiero que se copie toda la música. Como a veces es mucha y por USB va muy lento, no copia de nuevo la que ya está allí.

Tiene un par de opciones extra, —delete para que borre los ficheros que no estén en la playlist, sincronizando el directorio. —force que hace que sobreescriba las canciones que ya están en lugar de saltarlas y —link que en lugar de copiar hace enlaces duros, útil para no ocupar espacio extra y muy veloz.

Soy consciente de que mi script Python copia burdamente el comportamiento de herramientas unix estándar ya existentes, y como se verá, el script en Bash me lleva mucho menos que las 180 líneas de Python, de hecho son 64, la mitad. Sin embargo el programa en Python es más fácilmente mantenible y ampliable con nuevas funcionalidades que se me vayan ocurriendo; Como he hecho con otros scripts a lo largo de los años.

Podéis comparar ambas versiones, Bash y Python. Es bastante descorazonador que en Bash sea casi todo código de control de errores y argumentos, el trabajo real se hace en 2 líneas

Versión en Bash

Versión en Python

En Python podría haberlo parseado la lista m3u con un bucle readline y listo, sin embargo pretendo ampliarlo luego al resto de formatos, así que creé una clase implementando la interfaz iterable de contenedores de Python. La lectura secuencial permite no tener que cargar todo en memoria si no quieres y el poder leer la playlist así:

playlist = M3u(path_playlist)
for title,path in playlist:
    print "%s at %s" % (title, path)

Una clase que implemente la interfaz iterable debe implementar el método __iter__() y next().

class Iterable:

   def __init__(self):
       self.list = []
       self.index = 0

   def __iter__(self):
       return self

   def next(self):
    if index >= len(list):
        raise StopIteration
    else:
        return objeto[index]
        index += 1 

Rootear E Instalar Cyanogenmod en Htc Nexus One

| Comments

Title: Rootear e instalar CyanogenMod en HTC Nexus One Date: 2011-05-27 19:54 Category: Dev Tags: Android, Rom, Nexus One, HTC, Cyanogenmod, Vodafone, Rootear

![Rootear e instalar CyanogenMod en un HTC Nexus One][]

Desde hace casi un año disfruto de un Nexus One con el que me va genial. Sin embargo, hasta ahora no había trasteado demasiado con él, y aprovechando las vacaciones he decidido rootearlo y cambiarle la ROM emigrando hacia un lugar un poco mejor. La ROM original que traía de Google + Vodafone me daba un par de pequeños fallos en la pantalla táctil, y con el cambio va bastante fino. De paso le di un limpiado al teléfono que estaba llenito de basura.

La instalación no es difícil pero se puede hacer larga y la mayoría de información distribuida por los foros es inconexa, antigua o incluso incorrecta. Cada teléfono es un mundo y tiene sus propiedades especiales. Este tutorial está lleno de apartados opcionales aplicables solo si falla algún paso. Huelga decir que esos pequeños arreglos esconden varias horas de frustración, cabezazos contra la pared, foros y mucho, mucho Google.

El rooteo del teléfono eliminará tu derecho a la garantía de fabricante. La cosa es que si tienes algún problema de hardware con el teléfono y lo tienes que enviar a reparar, con restaurar la rom original no debería haber problemas.

El proceso es el siguiente:

  1. Rootear Unlock bootloader Rootear

  2. Instalar Cyanogen Instalar Recovery Backup Nandroid Reseteo a valores de fábrica (Wipe) Instalar CyanogenMod

Mi terminal al momento de comenzar el proceso era un Nexus One con Build Number FRG83D corriendo Android 2.2.1 Froyo. Podéis consultar esta información en Settings-\>About Phone

Durante todo el tutorial se da por supuesto que se tiene el teléfono conectado al PC vía USB y con el modo Debug activado. El modo debug se activa en Settings-\>Applications-\>Development-\>Debug Mode y permite comunicarte con el teléfono por USB.

Haz un backup de la información que tengas. Deja la SD lo más limpia que puedas, necesitarás al menos 550Mb.

Cada vez que descargues algo, comprueba el MD5. Puedes llorar mucho después si instalas algo corrupto.

    $ md5sum archivo.zip

imageRooteo

Para rootear hay varias opciones que prometen root en 1 click, pero una de ellas tenia problemas serios y la otra (SuperOneClik), se me quedaba colgada en el proceso. La usada finalmente ha sido Superboot, y ha funcionado muy bien.

Lo que hace es cargar una imagen de arranque distinta que cambia la configuración por defecto del teléfono, permitiéndonos acceso root. Para ello primero debemos desbloquear el bootloader:

![image][1]

1. Desbloquear Bootloader [Referencia Original]

Este paso es necesario si tu terminal es retail, esto es, ha sido modificado por Vodafone, Movistar, Organge…

Emplearemos una herramienta llamada fastboot para desbloquear el bootloader.

Los datos que no estén en la SD serán borrados. El proceso realizará un ‘wipe’ de los datos del teléfono. Aplicaciones instaladas, SMS, iconos etc… Haz un backup antes.

Descarga fastboot mirror1 mirror2 y descomprímelo. Apaga el teléfono y enciéndelo manteniendo pulsada la bolita/trackball para entrar en modo bootloader Ejecuta fastboot:

$ ./fastboot-linux oem unlock

Si falla: y se queda parado en ‘Waiting Device’ inténtalo otra vez y asegúrate de que el teléfono está en modo bootloader y encendido.

![image][2]

2. Rooteo [Referencia Original]

Superboot es una imagen de arranque con una configuración que te permitirá tener privilegios de root.
Hay una versión para cada Build Number disponible de Android. El mio era FRG83D, pero el tuyo puede ser diferente, compruébalo.
Ve a la tabla de mirrors de descarga, bájate la versión que te corresponda y extráela. Pon el teléfono en modo bootloader de nuevo. Encendiéndolo mientras pulsas la bolita/trackball. Da permisos al script de instalación y ejecútalo:

   chmod +x install-superboot-linux.sh
   ./install-superboot-linux.sh

Listo, ya deberíamos tener el teléfono rooteado. Reinícialo, y deberías tener una aplicación nueva con un logotipo pirata. Esta aplicación hará las veces de ‘sudo’, se encargará de avisarte y pedirte confirmación cuando alguna aplicación pida privilegios de superusuario.

imageInstalar Cyanogen

Una vez con el terminal rooteado, los pasos son:

  1. Instalar Recovery
  2. Backup Nandroid
  3. Resetear el teléfono a los valores de fábrica.
  4. Instalar CyanogenMod

Todos los pasos se harán empleando la aplicación ROM Manager, que dispone de una versión gratuita que se encuentra en el Market de Android.
Justo tras terminar la instalación, encontré un tutorial extremadamente claro aunque en inglés que incluye screenshots que yo no pude hacer por carecer de cámara.

1. imageInstalar Recovery [Referencia Original]

Antes de instalar un recovery debes asegurarte de que no hay ya uno de fábrica. Para ello vas a necesitar conectarte con el SDK de Android a tu teléfono y mirar si existen los archivos /system/etc/install-recovery.sh y /system/recovery-from-boot.p y si están, renombrarlos o borrarlos. No te preocupes, podemos utilizar la infraestructura de fastboot que hemos usado antes para conectar con el teléfono.

En el directorio de fastboot hay un ejecutable llamado adb-linux. Podemos usarlo para conectar con el teléfono, estando este en encendido y con el modo debug activado. Lo que debemos hacer es entrar, remontar el sistema como escritura y cambiarle el nombre a los ficheros. Para remontar el sistema de ficheros necesitaremos permisos de superusuario, que tendremos que autorizar en la pantalla del teléfono. Me tiré 10 minutos hasta que me di cuenta de que tenía que habilitar el comando su que ponía en la consola, ya que tenía el teléfono debajo de unos papeles…

fastboot$ sudo ./adb-linux start-server

* daemon started successfully *

fastboot$ sudo ./adb-linux devices

List of devices attached 

0123456789ABCDEF    device

fastboot$ sudo ./adb-linux shell

$ su   # [ Autorizamos en el teléfono ]

$$ mount

rootfs on / type rootfs (ro,relatime)

tmpfs on /dev type tmpfs (rw,relatime,mode=755)

devpts on /dev/pts type devpts (rw,relatime,mode=600)

...

/dev/block/mtdblock3 on /system type yaffs2 (ro,relatime)  # Este es

...

$$ mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system  # Montamos lectura escritura

$$ mv /system/etc/install-recovery.sh  /system/etc/install-recovery-bk.sh 

$$ mv system/recovery-from-boot.p system/recovery-from-boot-bk.p

$$ mount -o ro,remount -t yaffs2 /dev/block/mtdblock3 /system  # Dejamos de nuevo en solo lectura

$$ exit

$ sync

$ exit

Abre el ROM Manager. Dale a Flash ClockworkMod Recovery y espera. Dale a Flash Alternate Recovery e instalará el recovery en el bootloader.

Si falla: Asegúrate de que tienes suficiente espacio en la SD. Te puede ayudar deshacerte del directorio LOST.DIR

Si sigue fallando: Prueba con otra recovery como es Amon_RA. En ese caso descarga su imagen y la puedes instalar con flashloader, el que usamos antes, en bootloader mode también:

    fastboot flash recovery recovery-RA-passion-v2.2.1.img

2. imageBackup Nandroid [Referencia Original]

Asegúrate de que tienes espacio suficiente en la SD (+500mb) Reinicia el teléfono en modo bootloader Selecciona el modo fastboot con las teclas + y – del volumen y el botón de encendido. Al entrar allí, selecciona backup nandroid, marca lo que necesites y haz el backup. Si falla: Lo más probable es que no tengas espacio suficiente en la SD. Pero asegúrate. Con el teléfono aún en fastboot, debes conectarte al terminal y mirar el log de errores.

Puedes emplear el mismo método de conexión que antes con fastboot para entrar en el teléfono y comprobarlo:

    fastboot$ sudo ./adb-linux shell

    $ cat cache/recovery/log

    $ exit

3. imageReseteo a valores de fábrica (Wipe)[Referencia Original]

Asegúrate de que tienes el backup hecho, porque esto te limpiará todo, menos las aplicaciones instaladas que se descargarán de nuevo cuando vuelvas a entrar. Reinicia el teléfono en modo bootloader Selecciona el modo fastboot Al entrar allí, selecciona wipe fabric reset y acto seguido, otra vez, wipe fabric reset

4.image Instalar CyanogenMod[Referencia Original]

Arranca el teléfono, y ve a ROM Manager, allí tienes dos opciones, 1. pulsar en Download List of Roms elegir CyanogenMod y seguir la instalación o bien 2. bajarte directamente la imagen e instalarla manualmente. Como solo disponía de 3G y la imagen pesa lo suyo, decidí bajármela.

Ve a la wiki de CyanogenMod y descárgate la última imagen disponible. En mi caso fue CyanogenMod 7. Bájate también las aplicaciones de Google, que vienen empaquetadas aparte por motivos legales. Comprueba los md5 de ambas imágenes. Es importante, no quieres tener problemas.

    md5sum gaps-gb-2011307-signed.zip update-cm-7.0.3-N1-signed.zip

Copia ambos .zip al directorio raíz de la tarjeta SD del teléfono. Arranca en modo bootloader y entra en fastboot Elige la opción de Flash/Install .zip from sdcard Selecciona el .zip con CyanogenMod y se instalará. Cuando termine, selecciona el .zip con GoogleApps y lo instalará también.

Listo, cuando termines y reinicies el teléfono, deberías ver el splash nuevo, en tono azul, de CyanogenMod.

Si se queda pillado en el arranque: No te preocupes, probablemente se te ha pasado hacer el Reseteo a valores de fábrica. Vuelve a modo bootloader y hazlo.

Si no funciona en absoluto: Vuelve a modo bootloader y restaura el backup Nandroid.

Una vez con la nueva ROM, tendrás que volver a configurar de nuevo todas las cosas e instalar de nuevo las aplicaciones. El Market Android recuerda las que tenías instaladas de antes, de manera que eso no será problema.

Mi experiencia con la nueva ROM es excelente. Va con mucho más rápido y es personalizable hasta el absurdo, de manera que puedo usar el teléfono como realmente quiero y pienso que es mejor. Normalmente es al revés, uno se adapta a los teléfonos que se compra, con mayor o menor fortuna.

imageReferencias:

Probablemente os convenga consultar los enlaces que empleé para instalarlo, ya porque no haya explicado un paso suficientemente o porque tengáis algún problema que yo no he mencionado. La información es abundante pero MUY dispersa y en ocasiones demasiado antigua.

Calcular La Nota Media Ponderada Universidades Españolas.

| Comments

![image][]

Los alumnos de la universidad de Cádiz (y andaluces en general) podemos consultar este dato en la sección de información académica de la plataforma para prácticas de empresa Ícaro o acudiendo al Vicerrectorado de Alumnos donde pueden calculárnosla y extendernos un certificado de nota.

Sin embargo, aunque lo podamos consultar o nos lo puedan hacer, nunca está de mas comprender como funciona el sistema, y aparte, calcular otras medias que siendo reales nos convengan más, ya que el sistema por bloques que se emplea es manifiestamente injusto y no refleja la nota real del alumno. Según el el cálculo actual, un alumno con 6,9 es dos veces peor que un alumno con un 7 en lugar de haber entre ellos una diferencia de una décima.

Este esquema supongo que ha sido heredado de cuando en las facultades no era obligatorio asignar una nota numérica sino tan solo APROBADO, NOTABLE, SOBRESALIENTE y MATRÍCULA DE HONOR y en mi opinión ya está más que superado; en todas las facultades se utiliza un sistema numérico que permite saber con exactitud la nota del alumno. Y aunque no se pudiese porque siguiesen existiendo facultades ‘chapadas a la antigua’, no es conveniente tener un estadístico que ‘destruye’ información como este, que no es representativo de la nota del alumno y expresa fatal el valor del mismo. Tiene ‘truco’.

Entre estos cálculos para la nota media y algunos profesores/aplicaciones informáticas en la universidad que truncaban notas como 6,7 a 6, no me parece raro que los españoles tengamos una nota media tan ridículamente baja en el currículum, la cual nos dificulta y mucho la búsqueda de empleo en el extranjero, donde las universidades si que inflan las finales que da gusto. Cuando te juegas plazas, becas, puestos de trabajo y tu vida en general, estas pequeñas idioteces y tristes clasificaciones saltan a un primer plano y adquieren tanta importancia que me sorprende que se use este método desde mi punto de vista tan malo. Tener egresados con notas bajas no debería ser un signo de prestigio. Pero bueno que me enredo.

La nota media del expediente académico universitario es un número del 1 al 4, siendo 1 aprobado y 4 matrícula de honor.
La relación es la siguiente, solo se tienen en cuenta las asignaturas aprobadas:

Nota 1-10 Nota 1-4 Nombre
1 [5-7) Aprobado
2 [7-9) Notable
3 [9-10] Sobresaliente
4 10 Matrícula de Honor

La manera de calcularla es aplicar la siguiente fórmula, tomando la nota de cada asignatura, pasándola a la escala anterior y multiplicándola por sus créditos:

Como comenté antes, este es un estadístico terrible para resumir el expediente académico de un alumno, debido a los ‘saltos’ que tiene en el 7, el 9 y el 10. Una medida, con mucho, más representativa, sería calcular la media aritmética ponderada con los créditos y aplicar una ‘regla de tres’ para pasarlo al intervalo 1-4.

Esto es precisamente lo que también hice, calcular esta y otras medias para ver que estadístico representaba mejor mi expediente académico. Con mejor no solo quiero decir que saliese más favorecido, sino más adecuadamente en vista a los valores de mis notas (que tienden al 6).

Para calcular la nota a partir de una cantidad numérica 1-10 y obtener un porcentaje, empleé esta fórmula. Nótese que nota_min y nota_max son la nota mínima para aprobar y la máxima que es posible obtener en la Universidad correspondiente.

O la media aritmética normal, sin ponderar con los créditos:

En la Universidad de Cádiz tenemos disponibles nuestro expediente completo a traves del XXI Portal de donde nos podemos bajar un xls con las notas de las asignaturas aprobadas.

![Screenshot de calc con el csv de las notas][] “Las notas copiadas, pegadas y con las líneas sin nota y cabeceras eliminadas.”

Lo que hago es seleccionar solo las asignaturas, eliminar las que no tienen nota (normalmente créditos de libre provinentes de prácticas de empresa, seminarios o conferencias) y pegarlo sin cabecera en un csv plano con caracter separador la coma , y delimitador de texto la doble comilla .

Tras hacer esto lo que tenemos es un notas.csv con la siguiente estructura:

code-block::csv
"1711014 ","ESTRUCTURA Y TECNOLOGÍA DE COMPUTADORES","9","TRONCAL","2006-07","JUNIO","APROBADO","6,6"

"1711013 ","FUNDAMENTOS DE SISTEMAS DIGITALES","6","TRONCAL","2006-07","FEBRERO","SOBRESALIENTE","9,6"

"1711022 ","INFORMÁTICA GENERAL","6","OBLIGATORIA","2006-07","FEBRERO","APROBADO","6,5"

Los campos que nos interesan son el tercero (créditos) y el octavo y último (nota). Empleando python y su procesador de csv (baterías incluidas!) podemos fácilmente parsear el fichero y obtener nuestras notas.
Para ello creé un script que calcula todo esto, siguiendo una plantilla para una beca del CSIC (Centro Superior de Investigaciones Científicas) a la hora de realizar los cálculos. La nota final coincide con la que obtengo en Ícaro, de manera que supongo que es correcta.

El script lo llamo con ./media.py notas.csv e imprime tanto los resultados como los cálculos intermedios. Tened en cuenta que la formula del porcentaje emplea los valores de nota mínima para aprobar y nota máxima a recibir, que en Cádiz son 5 y 10 pero que de centro a centro pueden variar.

Para terminar, agradecería muchísimo cualquier tipo de corrección o aviso de errores. Lo más probable es que haya metido la pata en algún momento, que ignore algo relacionado con el cálculo de notas o sobre la organización Universitaria, de manera que si ves algo que no cuadre, por favor, deja un comentario :)

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import csv

def error(text):
    print "Error:" + text
    sys.exit()

def nota_14(nota):
    """
    Recibe una nota del 5 al 10
    Devuelve la nota del 1-4 según la siguiente tabla del CSIC:
        [5-7)   -> 1
        [7-9)   -> 2
        [9-10)  -> 3
        10      -> 4

    Devuelve None si la nota no está en el intervalo [5-10]
    """
    if nota < 5: return None
    elif nota < 7: return 1.0
    elif nota < 9: return 2.0
    elif nota < 10: return 3.0
    elif nota == 10: return 4.0

def nota_percent(nota):
    """
    Recibe una nota del 0 al 10
    Devuelve la nota en porcentaje según la fórmula del CSIC
    """
    nota_min = 5.0   # nota minima para aprobar en Cádiz
    nota_max = 10.0  # nota máxima en Cádiz

    return 50.0 + ((50.0 * (nota - nota_min)) / (nota_max - nota_min))

def media(csvfile):
    """
    Toma un csv con las notas y devuelve la media de todas las asignaturas.
    Asume que la nota de las asignaturas está en el último campo de cada línea.
    """

    try:
        reader = csv.reader(open(csvfile, 'rb'), delimiter=",", quotechar='"')
    except:
        error("No se puede abrir el fichero %s" % csvfile)

    # cabecera de la tabla
    print "Nota, Expediente, Percent, 1-4, Creditos, creditos x 1-4"

    # totales
    creditos_total = 0.0
    nota_total = 0.0
    ponderada_14_total = 0.0
    ponderada_100_total = 0.0
    nasignaturas = 0.0
    n = 0

    for row in reader:

        n += 1

        if len(row) < 8 :
            print "La linea: %s no tiene el número de campos necesarios."   
                 % str(row)
            next

        # El signo decimal es . no , como en españa
        row = [f.replace(',', '.') for f in row]

        # Obtener los campos
        curso = row[4]
        try: 
            creditos = float(row[2]) 
        except ValueError: 
            print "En la línea linea %d el campo 2 (creditos) %s no es un número"   
                    % (n,row[2])
            next

        try:
            nota = float(row[7])
        except ValueError:
            print "En la línea linea %d el campo 7 (notas) %s no es un número"   
                    % (n,row[2])
            next

        # Convertir entre escalas
        percent = nota_percent(nota)
        nota14 = nota_14(nota)
        ponderada_100 = creditos * percent
        ponderada_14 = creditos * nota14

        # Actualizar totales
        creditos_total += creditos
        nota_total += nota
        ponderada_14_total += ponderada_14
        ponderada_100_total += ponderada_100
        nasignaturas += 1

        # curso,  nota, percent, 14, creditos, creditos x 14
        print "%s   %d      %d       %d      %d      %d"   
                % (curso, nota, percent, nota14, creditos, ponderada_14)

    # calcular
    media_ponderada_14 = ponderada_14_total / creditos_total
    media_ponderada_100 = ponderada_100_total / creditos_total
    media_ponderada_100_14 = media_ponderada_100 * (4.0 / 100.0)
    media_normal = nota_total / nasignaturas

    #imprimir totales y resultado
    print "     Total Créditos: %d   Total creditos x 14: %d"   
            % (creditos_total, ponderada_14_total)
    print "     Media ponderada 1-4:         %.2f" % media_ponderada_14
    print "     Media ponderada 100:         %.2f" % media_ponderada_100
    print "     Media ponderada 100 en 1-4:  %.2f" % media_ponderada_100_14
    print "     Media sin ponderar:          %.2f" % media_normal


def main():
    if len(sys.argv) < 1:
        error("Numero incorrecto de argumentos. \n\n Use: media.py file.csv")

    media(sys.argv[1])

main()