lunes, 27 de agosto de 2012

Querida industria del entretenimiento - Reloaded

Te juro que intenté, hice lo moralmente correcto, y desembolsé en comprarme el producto posta.

Yo soy un enfermo del Señor de los Anillos, y cuando vi el boxset de las 3 pelis, extendidas en bluray, se me
hizo agua la boca. Y eso que ya las vi mil veces, y hasta las versiones extendidas, pero era algo que tenia que tener, aunque sea para atesorarlo, como un item de colección.

Así que aprovechando el viaje de un pariente a USA, me mande a traer, por unos jugosos 80 dolares, el boxset de la edición especial extendida del señor de los anillos en blu ray (si así de largo).

Y fui feliz, desempacandolo, con todo su arte, tener ese ítem tan preciado en mis manos fue la gloria.
Y ver las pelis de vuelta, en todo su glorioso 1080p y sus 4 horas de duración cada una fue increíble, hasta ahí era mas que feliz y no tenia nada de que quejarme. Pero...

Siempre hay un pero, no?

Resulta que además de los 2 blurays por película (si si leíste bien), tiene 3 DVD's de extras (por película!).
Todavía no los había visto a los extras, y como ayer volví a ver La comunidad del anillo, me pareció buen momento para verlos.

Abro el boxset con toda delicadeza, saco la cajita donde están los discos de La comunidad del anillo, la abro y con sumo cuidado, saco el primer DVD de extras, y lo meto en la PS3.
Voy a la parte de video le doy reproducir, me hundo en el sofá, listo para disfrutar, y la pantalla me recibe con un grato:

"the disc cannot be played, the region code is not correct"


Después del momento tano pasman, me puse a buscar un poco, y resulta que los DVD's tienen incorporados un sistema de gestión de derechos de autor (también conocidos como DRM) que lo que hace es permitirle al dueño del contenido definir en que parte del mundo se puede ver el DVD.

Parecería que a Mr Warner, no le gusta que nosotros sudacas inadaptados veamos los extras del señor de los anillos, incluso SI PAGAMOS POR ELLOS.
No me entra en la cabeza, que pusilánime estúpido, cabeza de poronga de los directivos de esa compañía, se les ocurrió que seria una buena idea incluir bloqueo geográfico al DVD original, que el que lo tiene es el que lo pago, y el que se lo bajo lo desbloquea en 20 segundos (de hecho esa protección esta rota hace años).

En serio, parece que lo hiciesen a propósito, una vez que me pongo, y pago para tenerlo original (pagándole lo que es debido a los pobres actores y demás gente que trabajo en la película) viene Warner y me apuñala por la espalda.

Ya esta viejo, sabes que, cagate. En la puta vida te vuelvo a comprar nada, ni a Warner ni a Sony (ver post anterior). 

Después te quejas de la piratería. ¿¡Como no queres que haya piratería, si cuando lo quiero ver legitimamente no me dejas!? Si no me dejas otra que violar los derechos de autor para poder ver lo que pague para ver (porque obviamente, no me voy a quedar sin verlo).
Vos me decis pirata, pues yo te dijo: "Pirata y a toda honra!"

miércoles, 27 de junio de 2012

Historia de un Rooteo ( y todo lo que aprendi en el proceso)

Hace unos dias descubri una forma de rootear las ROMs 2.3.6 del Motorola Milestone 2 que di por llamar preinstalameEsta.
Esto es un recorrido por como lo fui haciendo, de donde saque las ideas, y todo lo que aprendi en el proceso. Pensado como una guia para los que no somos ÜberHackers que quieran ver de rootear su celular

Como cai con la rom 2.3.6:

Cuando lo compre el celular me vino con 2.2 que era una reverenda garcha, y que prontamente lo rootie y le puse Argen2stone y luego cuando salio, CM7.
Durante el verano entre arena y demas se me despegaron un par de "letras" del teclado (es un plastiquito piojoso). Lo lleve al service oficial (que tardaron una banda porque no tenian repuestos) y cuando me lo devolvieron descubro que habian flasheado la 2.3.6. La cual 15 minutos de googleo despues descubro que no se puede rootear (NOOOOOOOO ESTAMOS EN LA B!)

Inicio del recorrido:

Un par de meses de frustracion, y muchas horas browseando en XDA y grupoandroid luego, aparecio este metodo de rooteo para el motorola PRO que rapidamente llego al foro del MM2. No funciono pero el testeo dejo un par de datos interesantes sobre el celular, el firmado de particiones y el sistema de flasheo.
El metodo lo que planteaba era:
1) Hacer un dump de la particion userdata (que en el filesystem del celular se monta en /data)
2) Modificar el default.prop para setearle la property que hace que el adb shell "se loguee" como root (mas data sobre esto mas abajo)
3) Flashearla en el telefono

Este metodo por no funciono en el MM2, paso a explicar porque.
Dentro de las ROM's (tambien llamadas sbf por el formato) oficiales de los celulares, vienen la data que se va a flashear en cada una de las particiones del telefono + el RamLoader que es un programa que se carga en el celular al inicio del flasheo y sabe que particiones tiene que flashear (lease, las que vienen en la ROM).
Sumado a eso hay particiones que estan firmadas, es decir, sobre las cuales solamente se pueden flashear particiones firmadas por el OEM (En este caso motorola).
En el caso del Motorola Pro, la particion userdata (que dentro del sbf se llama CG37) era una de las que el RamLoader flashea, y no estaba firmada, con lo cual se la podia reemplazar durante el proceso de flasheo y flashear lo que quisieramos.
Al tratar de probarlo en el Milestone 2 nos dimos cuenta de que la particion CG37 no esta en el RamLoader de nuestras ROM's (el flasheo hay que hacerlo con el RamLoader que corresponde sino explota todo), con lo cual no se podia flashear, y ese metodo de rooteo quedo descartado.
Pero mientras que lo probaba descubri el sbf_flash que es una herramienta de flasheo para linux/mac (similar al RSD lite para windows). Entre sus funcionalidades tiene 2 muy importantes:
1) Extraer las particiones del sbf
2) Mostrar la tabla de particiones del telefono con cierta data extra (entre ellla, si esta firmada o no)
3) Flashear todo el sbf, o particiones individuales (de las que estan en el SBF y que el RamLoader acepta)
En el caso de la Rom de Personal (y calculo que el resto de las ROM de las otra operadoras seran iguales), las particiones que bienen adentro del sbf son:


CG31
CG32
CG33
CG34
CG35
CG37
CG39
CG42
CG45
CG47
CG61
CG64
CG65
CG66


Y la data que me da de la tabla de particiones sobre ellas es la siguiente (reducida para que no ocupe tanto espacio):


CG_num: 64
CG_name: mbr
signature_start_addr: 0x83003800
signature_end_addr: 0x83003fff

CG_num: 65
CG_name: ebr
signature_start_addr: 0x83013800
signature_end_addr: 0x83013fff

CG_num: 31
CG_name: cdt.bin
signature_start_addr: 0x89073800
signature_end_addr: 0x89073fff

CG_num: 34
CG_name: lbl
signature_start_addr: 0x80d03800
signature_end_addr: 0x80d03fff

CG_num: 42
CG_name: logo.bin
signature_start_addr: 0x86f6f800
signature_end_addr: 0x86f6ffff

CG_num: 61
CG_name: devtree
signature_start_addr: 0x8910f800
signature_end_addr: 0x8910ffff

CG_num: 45
CG_name: bpsw
signature_start_addr: 0x644ff800
signature_end_addr: 0x644fffff

CG_num: 35
CG_name: boot
signature_start_addr: 0x818ff800
signature_end_addr: 0x818fffff

CG_num: 47
CG_name: recovery
signature_start_addr: 0x818ff800
signature_end_addr: 0x818fffff

CG_num: 33
CG_name: cdrom
signature_start_addr: 0x8bdbf800
signature_end_addr: 0x8bdbffff

CG_num: 39
CG_name: system
signature_start_addr: 0x9efbf800
signature_end_addr: 0x9efbffff

CG_num: 32
CG_name: prek
signature_start_addr: 0x8a71f800
signature_end_addr: 0x8a71ffff

CG_num: 66
CG_name: preinstall
signature_start_addr: 0xffffffff
signature_end_addr: 0xffffffff


De ahi se ve claramente ( y sino para eso estan los colores :P) que la unica particion que se flashea en el celular y que no esta firmada es la CG66 tambien conocida como preinstall, cuyo punto de montaje es /preinstall, que solo es escribible por root desde el adb shell, con lo cual modificandola y flasheandola podriamos poner data nuestra donde desde el celu no se puede.
Esa particion, como descubri despues, es donde van las aplicaciones "precargadas".
Lo cual tiene sentido, si sos motorola no queres que las operadoras te rompan las bolas para que les firmes la particion si quieren hacer una promo que te regalan alguna app con el celular, entonces la dejas sin firmar y que desde la operadora le pongan lo que quieran.
Por otro lado deberia haber algun proceso que se fije que hay en esa particion y lo instale en algun momento.
Con esa idea, revisando el logcat del celular (el logueo de todo, o mejor la mayoria de las cosas, que pasan en el celular, que te deja android para debuguear), encontre que estaba corriendo durante el booteo un script, /system/bin/loadpreinstalls.sh y que estaba escribiendo un log en /data/preinstall_md5.

Previo a esto, habia estado leyendo de un par de metodos de rooteo aca, y  revisando el filesystem del celular desde el adb shell a ver si encontraba algo similar a lo que cuentan en ese blog, no encontre nada entrable de una, pero si encontre que, no solo que la mayoria de los archivos del celular tenia los permisos muy estrictos (lo cual esta bien desde el punto de vista de Motorola), sino que habia un par de directorios, entre ellos /data, que para los usuarios que no eran root o system,  tenian permiso solo de ejecucion, lo cual es extraño porque (para los que no estan muy duchos con los permisos de archivos de linux) no te deja listarlos ni escribirlos, pero si acceder a lo que esta adentro.

Con lo cual yo desde el adb podia acceder a lo que este adentro de /data, siempre y cuando conociese el nombre del archivo/carpeta.
Con lo cual encontrar lo del script de preinstall era doblemente bueno, no solo porque ahora sabia quien preinstalaba las aplicaciones, sino porque encontre el nombre de una carpeta adentro de /data.
Entrando a la carpeta via el shell, encontre otra cosa, que a esa carpeta tenia permisos de escritura todo el mundo, lo cual seria favorable luego, y tambien que me estaba dejando un archivo de log cuyo dueño era el root, lo que implicaba que ese script corria como root.

Resumiendo hasta este punto. Encontre una particion sin firmar sobre cuya data el usuario root ejecuta un script que escribe a una carpeta escribible por el todo el mundo. Hasta aca me siguen, buenisimo!

Un par de cuestiones generales antes de seguir.

1) Normalmente los metodos de rooteo buscan escribir en /data/local.prop y setear una propiedad que hace que el adb shell te brinde acceso como root, en el caso de motorola la propiedad y el valor que tiene que tomar es:
ro.sys.atvc_allow_all_adb=1

2) En linux, existe algo que se llama symbolic link (link simbolico en español) que es algo asi como un acceso directo en windows. con la salvedad de que si vos lees/escribis/ejecutas ese archivo, en realidad estas operando sobre el archivo/carpeta al cual apunta.
Hay 2 tipos de symbolic link, el hard link que apunta al inodo (que a groso modo seria el lugar en el disco donde esta almacenado el archivo) donde esta el archivo y soft link que apunta al path.

Volviendo:

Al script ese tenia acceso de lectura asi que me lo baje y me lo puse a leer (esta en http://pastebin.com/NjZjjnY8 si lo quieren ver, pastearlo me rompia todo el identado)

Algo que ya habia visto antes era que estaba escribiendo un log de lo que hacia en /data/preinstall_md5/log.txt con lo cual, si lo borraba y ponia un symbolic link apuntando a local.prop y controlaba de alguna forma lo que logueaba el archivo podria escribir lo que yo quisiese en local.prop.

Mirando el script, vi que levantaba de /preinstall/app (en realidad de /system/preinstall/app, pero /system/preinstall es un symblic link a /preinstall) y /preisntall/md5 la lista de apps que tenia que levantar, por lo tanto, si mi app se llamaba "ro.sys.atvc_allow_all_adb=1" o similar me iba a escribir eso en el local.prop y magia soy root.


Por suerte la particion de preinstall fue facil de modificar, ya que es una particion ext3 y en linux es muy facil de montar (mount CG66.img algun/lado/). Asi que la podia montar, modificar lo que quisiese, desmontarlo, y flasheaerlo con el sbf_flash.
Hice eso, cree 2 archivos, "app/ro.sys.atvc_allow_all_adb=1#" y "md5/ro.sys.atvc_allow_all_adb=1#.md5",  dentro de la particion de preinstall, y la flashee via sbf. El resultado se puede ver aca.
Logre el objetivo de escribir en el local.prop (lo cual es siempre un buen indicio), pero no me tomo el valor de la property (le seteaba 1 mas toda la mugre que ponia el log atras) y para colmo hacia que el celu se me colgase. Con lo cual por ahi no iba a tener suerte.
Postie lo que encontre en XDA y en grupoandroid, esperando que alguien le de bola y se fijase si lo podia seguir. No paso ninguna de las 2 cosas y lo deje medio olvidado en espera de que alguien lo tome y lo siga.


Un par de findes atras, me volvieron a agarrar ganas de mirarlo, y volvi al analisis del script y encontre esta condicion/cacho de codigo:

       newMD5=`cat $PRELOAD_HASH_DIR/$file.md5`
       oldMD5=`cat $DATA_HASH_DIR/$file.md5`
       if [ "$newMD5" != "$oldMD5" ]; then
           isInstalled=`pm path $file`
           # app not installed, but md5 exists = user uninstalled app, do nothing
           if [ -z "$isInstalled" -a -e "$DATA_HASH_DIR/$file.md5" ]; then
               echo "$file: user has uninstalled, dont reinstall. copying $file.md5 to $DATA_HASH_DIR"
               echo "$file: user has uninstalled, dont reinstall. copying $file.md5 to $DATA_HASH_DIR" >> $PRELOAD_LOG_FILE
               cp $PRELOAD_HASH_DIR/$file.md5 $DATA_HASH_DIR

Previamente en el codigo:
PRELOAD_HASH_DIR=/system/preinstall/md5
DATA_HASH_DIR=/data/preinstall_md5
y $file es el nombre del archivo que encontro en /preinstall/app/

Entonces, supongamos que el archivo en /preinstall/app/ se llama pepe:
El script compara los contenidos de /data/preinstall_md5/pepe.md5 y /preinstall/md5/pepe.md5. Si difieren pero /data/preinstall_md5/pepe.md5 existe (el cat devuelve "" si no existe) entonces copio el archivo desde /preinstall/md5/pepe.md5 a /data/preinstall_md5/pepe.md5.

Ahora, que pasa si existe un pepe.md5 en /data/preinstall_md5, pero es un symbolic link /data/local.prop, y el contenido de /preinstall/md5/pepe.md5 es "ro.sys.atvc_allow_all_adb=1"? Deberia pisar local.prop con "ro.sys.atvc_allow_all_adb=1" y ya esta, ganamos!

Bueno no, no se porque, si por alguna limitacion en como corre el script o que, pero no me lo dejo hacer, con lo cual hay que buscar otro metodo.
De todas formas ese metodo se puede usar para pisar cualquier archivo del sistema (siempre y cuando este en una particion montada como rw), lo cual nos puede venir copado.

Lo que estaria bueno en este punto es correr codigo nuestro en lugar de estar trasteando con algun bug en un script. Mirnado este post en vulnfactory.org vi que hacia referencia a que se puede logar eso modificando   proc/sys/kernel/modprobe o /proc/sys/kernel/hotplug y haciendolos apuntar a un script definido por el usuario. En el kernel que usa el MM2 esos archivos fueron reemplazados por /sys/kernel/uevent_helper.

Basicamente cuando se produce un uevent (que ni idea que es ni que lo produce XD), el kernel llama al script al cual apunta ese archivo (como root obviamente), con lo cual si creamos un script en /data/preinstall_md5 (porque a esta altura ya me familiarise con ese escritorio y tengo permisos para hacer lo que quiera ahi, pero tranquilamente podria ser en cualquier otro lado), ponele que lo llamemos test.sh, y pisamos /sys/kernel/uevent_helper, con "/data/preinstall_md5/test.sh", entonces cuando se produsca un uevent se va a ejecutar nuestro script.
Hasta ahi todo bien, pero ... como hacemos que se ejecute un uevent? 
Googleando un poco encontre este articulo que dice que se puede triggerear un uevent escribiendo "change" en /sys/class/mem/null/uevent.
Ya tenemos la idea, entonces:
Creamos un archivo /data/preinstall_md5/test.sh con el siguiente contenido (tuve que llamar al sh y usar los full paths porque sino no funcionaba):
#!/system/bin/sh
/system/bin/sh -c "/system/bin/id > /data/preinstall_md5/lala.txt"
(el comando id te dice como que usuario estas corriendo)

2 symbolics links
primero.md5 -> /sys/kernel/uevent_helper
segundo.md5 -> /sys/class/mem/null/uevent

y modificar la particion preinstall para que tenga
app/primero
app/segundo
md5/primero.md5, contenido: /data/preinstall_md5/test.sh
md5/segundo.md5, contenido: change

El nombre de los archivos influye en el orden, justo se da que primero viene antes alfabeticamente que segundo, con lo cual lo va a procesar antes (que es lo que queremos)
Flasheamos el CG66, reiniciamos y o magia, en /data/preinstall_md5/lala.txt tengo:
uid=0(root) gid=0(root)

Luego el paso siguiente fue cambiar test.sh para que escriba ro.sys.atvc_allow_all_adb=1 al local.prop, lo cual funciono sin problemas y al reboot siguiente el adb me recibio como root. adb remount, me remonto system com rw, y listo el pollo, ya soy dueño de mi celu de vuelta.

Conclusiones:

1) No fue ningun hack magico,  simplemente un problema de permisos, mas un script que no validaba data que podia llegar a estar puesta por el ususario (jamas valida si lo que tiene en /preinstall/app es realmente una app, ni tampoco computa el md5 de esos archivos, simplemente usa los que tiene en /preinstall/md5)
2) Para el rooteo es necesario flashear una particion, con lo cual ninguna aplicacion malintencionada podria acceder como root por este metodo. 
3)No creo que Motorola parchee el bug. Si estuvieron 1 año para hacer el release de gingerbread, olvidate que saquen una version para fixear un rooteo, mas siendo que 2)
3)Antes de arrancar no tenia idea de las particiones del celular, ni habia usado nunca un symbolic link (si laburo mucho sobre linux), ni oido hablar del /sys/kernel/uevent_helper, con lo cual, cualquiera que le hubiese dedicado un par de findes lo podria haber hecho (de hecho todavia tengo un poco de bronca de que nadie aprovecho lo que postee sobre escribir en el local.prop a traves del log.txt).
4)Si tenes un celu que no se puede rootear, dedicale unas horitas a tratar de ver por donde se puede llegar a entrar, la idea de este post es mostrar las que encontre yo, en http://vulnfactory.org/blog/, hay otras otras tantas. Si encontras como rootearlo buenisimo, y sino vas a aprender una banda, como hice yo :)


Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Argentina License.

lunes, 27 de febrero de 2012

Querida industria del entretenimiento

Querida industria del entretenimiento,

¿Sabes quien es que realmente pierde cuando usas esquemas estúpidos de DRM? Vos

Hoy estaba viendo una película que baje, en mi PS3. Y los 10 minutos de iniciada, se corto el audio y un mensaje en pantalla me dice que como no tengo los permisos para verla, me van a cortar el audio de a ratos.

Reacción 1: ¿Que carajo?

Una rápida búsqueda en internet me dice que el sistema "Cinavia" que usa la PS3, escucha el audio de lo que estoy mirando, y si encuentra una "marca de agua" en el sonido, sabe que es un contenido con derechos de autor (detalle: no dije pirateado) y te impide reproducirlo de la forma que corresponde.

Reacción 2: La triste realidad

En ese momento me di cuenta de algo que ya sabia, pero que nunca lo experimente en carne propia. Que si vos no sos el dueño de los dispositivos, las empresas que controlan a esos dispositivos son dueñas tuyas.
¿Que derecho tiene Sony de monitorear lo que yo hago en mi casa con los dispositivos que yo compre? ¿Porque la protección del derecho de autor prevalece sobre mi derecho a la privacidad?

Reacción 3: Quienes pierden.

Querida industria, te comento lo que en realidad es, lo que para vos es "una venta menos perdida".

Venta de la película: Por mas que no me la dejes ver, no la voy a comprar.
Personas que la vieron: Una menos.
Personas que la pueden recomendar: Una menos.
Personas que van a consumir productos afines: Una menos.
Personas que van a pensar 2 veces antes de que hardware comprar: Una mas.
Personas que van a boicotear a la productora que hizo la pelicula: Una mas.

Que habría pasado si me la hubieses dejado ver:

Seguirías si ganar plata por esa venta.
Pero, si esta buena la recomendaría.
Y si en algún momento sacas la 2, o el mismo director saca otra película similar, la iría a ver al cine.
Seguiría comprando consolas por el solo hecho de streemear video. Mi próximo media center va a ser una PC armada con mis manos. Y con linux.

Y no te confundas, no pirateo porque soy tacaño o porque soy un sádico que me gusta ver sufrir a los artistas. De hecho, siempre que puedo voy al cine, a recitales y de las bandas que me gustan compro CD's originales. Y eso es decir mas que de la mayoría de la población.
Pirateo porque no tengo otra alternativa que sea cómoda y tenga un precio razonable, y de buena calidad.
Si quiero ver la película en HD, me tengo que comprar el bluray, que me sale arriba de 100 pesos.
Y yo te entiendo que el disco tiene un costo, que la cajita y que se yo.
Pero yo todo eso no lo quiero, solo quiero el video, la información que esta adentro de ese disco.
Y sumale a eso que me tengo que desplazar hacia un lugar que lo vendan (que no son muchos), gastando mi preciado tiempo en adquirirlo.
Dame la posibilidad de bajarla, legalmente, desde la comodidad de mi casa, y a un precio razonable. Y yo te la compro.

La forma de vender mas, no es haciendo que el bien sea mas difícil de conseguir y mas difícil de disfrutar. Es todo lo contrario. Si te quejas de que perdes plata, quejate con tu departamento de marketing, no con los que solo queremos disfrutar del arte, y no tenemos medios económicos para adquirirlo de formas legales.

Queridos artistas:
Dense cuenta de que este modelo como esta planteado hoy no sirve. Que ya no necesitan a estas empresas que los explotan a la vez que criminalizan a sus consumidores.
Hace 30 años necesitabas un estudio de grabación, una discográfica, una distribuidora y comercios donde vender los medios fisicos.
Hoy todo eso lo tenes en tu PC y en tu conexion a internet.
Los consumidores estamos, lo que falta es la oferta que solo vos nos podes dar.

domingo, 12 de febrero de 2012

El control de internet ,la privacidad, y el futuro.

Cuando se habla de las legislaciones que buscan frenar la pirateria en internet, muchas veces es facil para el que no tiene muchos conocimientos de como funciona internet, ponerse del lado de las discograficas/artistas porque evidentemente estan siendo damnificados.
Dejenme plantear una analogia, que deberia ser entendible para todos.

Imaginense hace 20 años cuando la gente todavia se mandaba cartas (si de papel, el llamado "correo").
Pensar en que tu gobierno, o la policia, o el servicio postal, o cualquiera leyera tus cartas seria una gran violacion a la privacidad.
Digamos que yo y un grupo de amigos, que no tenemos mucha plata para comprar musica, decidimos hacer lo siguiente.
Cuando yo tengo ganas de escuchar un CD que no tengo, le mando una carta a mis amigos preguntandole si lo tienen. En caso de que lo tengan, hacen una copia y me lo envian.
En algun punto esta practica se hace lo suficientemente comun, como para que la industria discografica demande que se controle esta situacion. Y proponen que todas las cartas/paquetes, sean abiertas para comprobar que no tengan CD's adentro.
No solo eso, sino que las cartas tienen que ser leidas para comprobar que no sea una carta pidiendo musica a un amigo.
Eso no es lo peor, sino que, ademas,  las cartas son fotocopiadas y almacenadas, de forma de poder usadas como prueba en caso de que se detecte un delito a posteriori.

Esto le pararia los pelos de la nuca a cualquiera.
Eso es lo que hoy por hoy se esta proponiendo y implementado en muchisimos lugares del mundo.

Hace 20 años, manejar todo ese nivel de informacion era impensado, hoy con el poder de las computadoras actuales, y lo barato del almacenamiento, es totalmente factible (y de hecho se esta haciendo).
Y las computadoras no se van a hacer mas lentas o el almacenamiento mas caro. Y las tecnologias para manejar ese nivel de informacion van a ser cada vez mejores.


Alguien dira: "Bueno, si no hago nada ilegal, no tengo nada que ocultar, al fin y al cabo solamente se esta monitoreando para combatir la pirateria/terrorismo/mafia/etc".

Les invito a pensar lo siguiente: Podemos creer que nuestros gobernantes actuales son los mejores, que respetan nuestros derechos y jamas usarian nuestra informacion privada en nuestra contra. Pero ¿Podemos decir eso de quien sea que gobierne a continuacion? Y en 10 años? Y en 20?

Imaginense si en 15 años tuviesemos un gobierno como el de la ultima dictadura militar. Realmente querria que supieran que yo escribi este blog? Realmente quiesieran uds que sepan que lo leyeron?

Y no es solo en el mundo online. El mismo nivel de monitoreo esta llegando a la "vida real".
En la ciudad de buenos aires tenemos el SUBE que almacena toda nuestra informacion de viajes en subte y colectivo. Quienes somos, donde subimos y que linea tomamos.
Tambien tenemos las camaras de seguridad de la ciudad de buenos aires (para *prevenir el delito*), que de por si no parecen tan mala idea. Pero cuando la combinas con el Sistema de Identificacion Biometrica (SIBIOS) creado por el gobierno nacional, tenes una herramienta para saber quienes estan en un lugar determinado en un determinado momento.
No se si se llegan a armar la imagen en la cabeza. 
En este momento el gobierno puede (o esta en proceso de poder) identificar quienes viajaron hacia a una protesta y quienes estuvieron en la zona.
Esta es informacion que va a quedar almacenada, y no se va a borrar.


Combina eso con la recientemente pasada "Ley antiterrorista", y tenes la receta justa para que un gobierno (actual o futuro) persiga a los que piensen distinto. Y no solo a los que se manifiesten en contra en ese momento, sino a todos los que en algun momento lo hicieron.


Y esto no es algo que este pasando solo aca, es una carrera hasta el fondo en la cual compite todo el mundo, que arranco luego del 9/11, con la "lucha contra el terrorismo".


La privacidad no es algo separado de la libertad. La privacidad es algo necesario para poder actuar libremente. Hay una frase que dice: "Aquel que sacrifique su libertad por un poco de seguridad, acabara perdiendolas ambas".


Estamos en un camino que nos va a llevar a resignar gran parte de nuestra privacidad. Tenemos 2 caminos, o luchar para preservarla, o quedarnos en casa esperando que la frase este equivocada... 

jueves, 28 de abril de 2011

Primeros momento con Ubuntu Natty y Unity

Hace una hora que actualice mi notebook con Ubuntu a 11.04, y hace tiempo que no me sentía tan fuera de lugar atrás de una PC.

La verdad es que unity es una experiencia completamente nueva en lo que es a desktop, no digo ni mejor ni peor (eso lo evaluare luego de un par de días de uso), sino que todo a lo que estaba acostumbrado como usuario de Windows y de Linux (Gnome seria el termino adecuado aca), esta distinto.

Lo primero que cambia radicalmente la experiencia de escritorio es la falta de un taskbar abajo. Unity tiene un laucher sobre la izquierda, que es bastante parecido a la taskbar del Windows 7 en el sentido que tenes las aplicaciones corriendo, y las "pinneadas".



La diferencia que tiene el launcher (por lo menos en cuanto a comportamiento por default) con respecto al taskbar del W7 es que se autoesconde, y no reaparece salvo que acerques el mouse a la esquina superior izquierda de la pantalla.
Obviamente es cuestión de acostumbrarse, pero de estar acostumbrado a ir hacia abajo a buscar las aplicaciones abiertas, a tener que ir arriba a la izquierda, y luego elegir la aplicacion es un cambio importante.

Otra cosa distinta es la integracion de la barra de menus, en el panel superior (al mejor estilo mac) en las aplicaciones que lo soporten.


La verdad que esto esta interesante por el lado de que ahorra un espacio de pantalla que normalmente esta sin usar. El problema es que ese espacio normalmente muerto se lo podia usar para poner gadgets (no se si es el termino exacto), los cuales me esta faltando ahora :(

Sumado a la integracion de la barra de menus al top panel, tambien esta integrado los controles de minimizar, maximizar y cerrar, que como viene siendo desde hace un par de versiones de Ubuntu se encuentran a la izquierda, como en Mac.

El menu de aplicaciones es tambien completamente distinto a lo habitual. A nivel funcionalidad, me da la impresion que esta pensado al estilo el menu de inicio del W7 que lo abris, escribis lo que buscas y lo tenes. Esto funciona tanto para aplicaciones como para archivos.


Como se ve en la imagen (Perdon por la calidad, lo tuve que sacar con el celu, no me dejaba hacer un screenshot) tenes "shortcuts" para lo mas comun (el browser, fotos, mail y musica), las apps por categoria y para buscar solamente archivos. Con un par mas de clicks podes acceder a un simil de los submenus del Gnome clasico, pero no esta tan a mano como antes.

El tamaño y la separacionde los iconos, tanto en el launcher como en el menu de aplicaciones me da a pensar que el objetivo final de Unity van a ser las Tablets, o note(net)books touchscreen.

En cuanto lo haya disectado un poco mas volvere y contare que encontre, y como se compara con el resto de los desktops.

Esta pronto

domingo, 8 de agosto de 2010

Algoritmos genéticos

De ves en cuando un se encuentra con cosas que lo hacen entrar en un viaje de puro aprendizaje.

En este caso, me cruce con un articulo sobre algoritmos genéticos, y se me dio por investigar, y como siempre en Internet hay cosas maravillosas, si uno sabe como buscar.

A continuación viene un resumen de lo que descubrí esta tarde:

A grandes rasgos los algoritmos genéticos constan de 2 partes: mutación y evaluación.
La idea general es: se tiene una población, en la cual los individuos van mutando, y los menos adaptados(los que distan mas de mi objetivo) se van descartando.


En este ejemplo nuestro objetivo va a ser llegar a una cadena de finalizacion por ej. "holamundo", partiendo de cadenas completamente aleatorias, del mismo tamaño (esta ultima restricción para limitar la complejidad).

Si quieren hacer algún paralelismo con la biología, imagínense estas cadenas como el código genético.

En nuestro caso, no estamos buscando que genes son responsables de alguna enfermedad, o como ser inmortales, sino que estamos buscando a partir de un código genético cualquiera llegar a uno que deseemos (nuestro objetivo es un código genético, no lo que este produce).

Esta es nuestra condición de terminación para este ejemplo, y esta muy relacionada con la evaluación que vamos a hacer con nuestros "individuos"

Dijimos antes, que los algoritmos genéticos constan de 2 partes principales. Mutación y Evaluación.

En el caso de las cadenas, la forma más  sencilla de mutar es cambiar un caracter dentro de la cadena, por un caracter cualquiera.

En la evaluación, la idea es que nos diga cuan bueno es ese individuo. En nuestro caso, cuan cerca esta de nuestra cadena de finalización.

Esa distancia la vamos a calcular como la suma de la distancia entre las letras en las mismas posiciones de la cadena.
Este ejemplo esta armado en python. Los que lo conocen, perfecto! y los que no, no se asusten, que es un lenguaje de muy sencillo y de fácil lectura.

A continuación están las funciones (metodos para que no me critiquen los que saben POO) para mutar y evaluar.

Mutacion:
def clone(self):
        result=""
        position=getRandomInt(len(self.string))
        for i in range(lstr):
            if i != position:
                result+=self.string[i]
            else:
                result+=getRandomChar()
        return result


Aclaraciones:
getRandomInt(x) devuelve un numero aleatorio menor o igual que x
getRandomChar() devuelve una letra aleatoria

Esta método tomo la cadena de este individuo (self.string) y devuelve una cadena con un caracter cambiado

Evaluacion:
def fitness(self,string):
        result=0
        for i in range(len(string)):
            result+=abs(ord(string[i])-ord(self.string[i]))
        return result

Para los que no sepan python:
ord(c) devuelve el codigo ascii de c
abs(n) devuelve el valor absoluto de n

Este metodo compara la cadena de este individuo(self.string) con la cadena que le paso como argumento. En nuestro caso va a ser la cadena de finalizacion ("holamundo").
Nuestro objetivo va a ser que esta evaluacion de el menor valor posible.

Estos metodos pertenecen a la class Schromosome (cromosoma de cadenas) que se inicializa de la siguiente manera

def __init__(self,slen,string=''):
        if string!='':
            self.string=string
            return
        self.string=""
        for i in range(slen):
            self.string+=getRandomChar()


Esta clase tiene 2 inicializaciones posibles, si le pasas el parámetro "string", inicializa la cadena de ese individuo con ese parámetro, sino genera una cadena aleatoria de longitud "slen".

Ya tenemos definido a nuestro individuo.

Como esta definido, los individuos van a empesar con una cadena alatoria y los vamos a ir haciendo mutar para lograr que esa cadena se valla acercando a nuestra cadena de finalizacion.

Vamos con el programa principal:

Definimos y inicializamos nuestra población:
    pop=50  
    population=[]
    for i in range(pop):
        population.append(Schromosome(len(endString)))

Definimos nuestra cadena de finalizacion:
    endString='holamundo'

Ordeno a la poblacion de acuerdo a su evaluación:
    population.sort(key=lambda guy: guy.fitness(endString))

Este orden va a ser muy importante porque nos va a permitir definir quienes son los peores individuos dentro de nuestra población para poder descartarlos.

A mutar se a dicho:
Ahora nos queda definir como vamos a hacer mutar a nuestros individuos.
Para este caso la estrategia que elegí fue: agarrar a un individuo cualquiera y mutarlo hasta que sea mejor que si mismo. Con este nuevo individuo ( el original sigue estando en la población como estaba) reemplazo al peor individuo de la
población.

Esta proceso continua hasta que alguno de los individuos llega a la cadena de finalizacion.


iteration=0
while True:
    guy=population[getRandomInt(pop)]
    prev=guy.fitness(endString)
    new=prev
    while prev<=new:
        newguy=Schromosome(0,guy.clone())
        new=newguy.fitness(endString)
    population[pop-1]=newguy
    population.sort(key=lambda guy: guy.fitness(endString))
    print ('iteration:',iteration,'best:',population[0].string)
    iteration+=1
    if newguy.string==endString:
        break




Esta es una primera aproximación a un algoritmo genético. Asi como esta armado tarda entre 300 y 400 iteraciones en terminar.
Faltarían agregar algunas cosas como ser reproducción y selección. Posiblemente quede para un próximo post.

El código completo esta en :
http://pastebin.com/en8MvzZP