MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Mi primer app en android: RsyncDroid

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

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

Instalación

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

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

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

Ahora instalaremos este apk: rsyncdroid.apk

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

Capturas de pantalla

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

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

Script para copia de datos

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

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





Diferencias entre algo sencillo y algo enrevesado

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

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

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

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

Ahora vamos a hacerlo en JAVA:

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

Que como resultado da:

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

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

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