lunes, 31 de diciembre de 2007

Simpatía por el Demonio: BSDs

Hola gente!

Aprovechando ayer que tuve "libre" mi día, me puse a instalar los dos SOs BSDs libres que me interesan (aunque por motivos diferentes): OpenBSD 4.2 y FreeBSD 6.2 (para AMD64), cada uno adentro de una máquina virtual de VMWare.

Por si alguien no los conocía, estos sistemas operativos no solamente son "Unix-Like" (es decir, del tipo Unix) como Linux, sino que son Unix; quiero decir, que los BSD son "hijos" del árbol del Unix original, y conservan muy fuertemente sus raíces y filosofía. Además de eso, son Software Libre, están publicados con una licencia mucho menos restrictiva que la de Linux, y son gratis!



La instalación de ambos es MUY sencilla y sorprendentemente corta; no requiere conocimientos técnicos ni del SO muy profundos, aunque es bueno tener el navegador a mano para ir chusmeando en los manuales de instalación[1],[2] porque alguna duda siempre surge.



Además, aunque suma que no tuve que hacerme problema por particiones, al asignar todo el "disco" al SO, también hubiera sido sencilla igual, una vez que uno conoce que los BSDs manejan una "partición" Linux/Windows como un único "volumen" (en BSD se denominan "slices"), que adentro tienen varias "particiones". De esa manera, uno siempre "ve" desde Linux/Windows una única partición en el disco. Acá se puede ver gráficamente el concepto[3]:

Eso sí, es todo el proceso se realiza modo texto y la de FreeBSD es más bien un "asistente", me hizo recordar al viejo instalador de Debian (que se puede ver por ejemplo cuando uno instala un Ubuntu Alternate CD).

La documentación y soporte es abundante y excelente en FreeBSD: el Handbook multilenguaje (tiene una calidad impresionante) se combina con un extenso soporte comunitario, en varios lenguajes y y formatos, casos de uso, muchos sitios "extras" dedicados a brindar información; si bien esto es "común" en las distribuciones de Linux más grandes, es algo a destacar, ya que uno no está del todo perdido cuando necesita una mano, y es algo que agradezco cada vez que tengo un problema con el pingüino. El sitio oficial es muy cómodo, y nuevamente, multilenguaje.

En OpenBSD no tienen "handbook": consideran a los "man" como documentación oficial, y además tienen un FAQ; más allá de esto, tienen listas de correo en unos cuantos lenguajes.

En cuanto a soporte de hardware, creo que por popularidad (y por tener algunos drivers desarrollados bajo NDA), FreeBSD tiene más soporte que OpenBSD (cuyo pilar fundamental es ser lo más libre posible). Aún así, estimo que ambos soportan menos hardware que Linux, aunque para el uso como servidor (mi objetivo) no debería ser un problema, ya que el déficit está por lo general en chips "baratos" usualmente en las PCs de escritorio.

Al utilizarlos (sólo por consola, no instalé X en ninguno), no necesité las vmware-tools, ya que la interfaz de red es detectada automáticamente como placa intel (interfaz 'em0'). Sin embargo, es bueno destacar que si queremos aprovechar la totalidad de los dispositivos virtuales de vmware, en ambos se pueden instalar, ya que VMWare provee las vmware-tools para FreeBSD y éstas mismas se pueden instalar para OpenBSD (más info acá).

Instalar paquetes es muy sencillo y similar en ambos: los comandos pkg_* te ayudan para instalar los paquetes binarios de los repositorios. FreeBSD trae de "fábrica" el shell 'sh' y el OpenBSD trae el Korn Shell para root ('sh' para el resto), así que para instalar bash (más dependencias) fue tanto como ejecutar "pkg-add -r bash" en FreeBSD y "pkg-add bash" en OpenBSD (previo hacer un "export PKG_PATH=ftp..." para señalar nuestro repositorio).

También existen los ports, que es un mecanismo que descarga, compila e instala paquetes desde código fuente (siempre desde el repositorio del proyecto o alguno de sus mirrors), usualmente más actualizado que los paquetes binarios.

OpenBSD me interesa con el objetivo de ser Firewall, IDS, Proxy, etc., ya que me pareció muy minimalista, liviano, simple y tiene un claro objetivo de ser seguro. Como desventaja, tiene menos popularidad que su hermano FreeBSD, menos documentación y es algo más lento (ya que su objetivo es otro, ser seguro por defecto).

FreeBSD me da la impresión que es más bien un reemplazo de un servidor Linux (pero de servicios clásicos típicos Unix, como ser Mail, FTP, Web), ya que lo utiliza mucha más gente (una búsqueda por foros, enlaces, etc. da más importancia a FreeBSD) , y quizás por esto está bastante más elaborado que OpenBSD: da la impresión de ser menos "minimalista" y un poco más amigable.

Entre las ventajas de ambos con respecto a Linux es que son sistemas operativos completos, no un conjunto de utilidades que posteriormente son empaquetadas en un CD. Esto quiere decir que cada paquete o port que uno instala está revisado e integrado por la comunidad del proyecto.

Otra ventaja interesante que vale la pena destacar es que con ambos se puede utilizar PF (Packet Filter), que es un filtro de paquetes de red super-poderoso y sencillo de utilizar (al menos más sencillo que Netfilter, el que está incluído en Linux). De hecho, en FreeBSD hay 3 módulos para filtrado de paquetes, aunque PF es el más conocido (al menos por mí, je). Los comandos son parecidos (algunos) y la mayoría iguales a los de Linux.

Personalmente me encuentro cómodo con sus consolas, y es cierto, se sienten más "coherentes" o "prolijas" las cosas, la documentación es clara... aparte, hay detalles que están buenos: por ejemplo, al hacerle un escaneo nmap al FreeBSD, automáticamente hizo un 'throttle' de los RST que devolvía al host que escaneaba, aumentando el delay. Y eso sin usar PF. Groso. (aunque nmap se dió cuenta y prolongó el delay, pero bueno, son detalles que valen la pena).

La única duda que tengo es en cuanto a las actualizaciones, es decir, cuando sale una nueva release.. qué hago? (sin volver a instalar, claro está). :-)

Como yapa, me encuentro que dentro de los "artículos" en español, está el de un conocido, la migración de argentina.com a FreeBSD.

Bueno, espero haber dado un pantallazo (con este calorrr) a estos SOs que siempre quise testear, sólo estuve un día y medio dando vueltas con ellos, así que no me "peguen" si le pifié u olvidé algo, comenten y en todo caso con más experiencia armo otro post más adelante.

Espero que pronto les pueda dar utilidad a alguno de los dos en alguna de mis actividades, ya que creo que en la heterogeneidad está la seguridad y el conocimiento, a fin y al cabo.

Feliz 2008 a todos!
Marcelo

Links:
[1]: FreeBSD Handbook:
Inglés: http://www.freebsd.org/doc/en/books/handbook/index.html (actualizado 2007)
Español: http://www.freebsd.org/doc/es/books/handbook/index.html (actualizado 2005)

[2]: OpenBSD FAQ:
http://www.openbsd.org/faq/index.html

[3]: http://www.freebsd.org/doc/en/books/handbook/disk-organization.html [...]

lunes, 24 de diciembre de 2007

Frostwire en Ubuntu AMD64

Hola!

Este post en realidad es casi una "copia" de un mail que envié a la lista de Ubuntu Argentina, para darle una mano a alguien que quería hacer correr el (famoso?) programa de P2P FrostWire en Ubuntu pero en arquitectura AMD64.

El problema se reduce a que por dependencias adjuntas al paquete de 32 bits, hay que correr el programa con una JVM de 32 bits, por lo que puede aplicarse a otros programas con problemas parecidos.

Ok Matías, a ver, repasemos (yo también tengo Ubuntu 7.10 en un AMD64). Bajate el "Tarball Bundle" de acá:

http://www.frostwire.com/?id=downloads

y descomprimilo en, por ejemplo, "/home/matias/frostwire-4.13.4.noarch"

El paquete a instalar es "ia32-sun-java6-bin", que con el comando "dpkg -L ia32-sun-java6-bin" podemos ver qué archivos contiene (y su ubicación). Se puede ver que lo instala en "/usr/lib/jvm/ia32-java-6-sun", y el binario de ejecución está en "/usr/lib/jvm/ia32-java-6-sun/bin".

Ahora, lo siguiente lo haces todo en la misma ventana/pestaña de la terminal (también llamada consola) de Ubuntu.

Lo que vamos a hacer es, teniendo instaladas las 2 versiones de Java (la de 32 bits y la de 64), hacer que frostwire use la de 32, diciendo que el PATH es diferente al que tenés por defecto (el PATH es la variable donde se van a buscar los comandos que ejecutás).

Si abrís una terminal, y ejecutás directamente "java -version", te devuelve la versión de 64 bits:

marcelo@saturno:~/src/frostwire-4.13.4.noarch$ java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-b05, mixed mode)
marcelo@saturno:~/src/frostwire-4.13.4.noarch$

Ahora lo que hay que hacer es modificar la variable PATH, para que cuando uno escriba "java", Linux vaya a buscar la versión de 32 bits:
marcelo@saturno:~/src/frostwire-4.13.4.noarch$ export PATH=/usr/lib/jvm/ia32-java-6-sun/bin:$PATH
marcelo@saturno:~/src/frostwire-4.13.4.noarch$

Ahora ejecutá de nuevo "java -version" (siempre en la misma terminal, ya que es el "ámbito" donde el cambio de PATH tiene efecto):
marcelo@saturno:~/src/frostwire-4.13.4.noarch$ java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
marcelo@saturno:~/src/frostwire-4.13.4.noarch$

Joya, fijate que no dice "64 bits". :-)

Ahora todo lo que tenés que hacer es, en la misma ventana/pestaña de terminal donde hiciste el cambio de PATH, posicionarte en donde descomprimiste el .tar.gz (si ya no lo estabas):
marcelo@saturno:~$ cd home/marcelo/src/frostwire-4.13.4.noarch
marcelo@saturno:~/src/frostwire-4.13.4.noarch$

(yo lo descomprimí en "/home/marcelo/src/frostwire-4.13.4.noarch")

y ejecutá "./runFrostwire.sh". Listo, ya tenés andando frostwire. :-)

Para hacer esto más directo, podés abrir el archivo "runFrostwire.sh" con un editor de textos como el GEdit, y en la línea 11, abajo o arriba del "export HOSTNAME=localhost", podés poner esta línea:
export PATH="/usr/lib/jvm/ia32-java-6-sun/bin:$PATH"

Listo, ya te anda "siempre", sólo te queda hacer el enlace desde el editor de menú de Ubuntu o creando el lanzador de la aplicación en el escritorio.

Bueno, espero que les sirva y que quede en Google por si alguien más tiene el mismo problema...

Saludos!
Marcelo

domingo, 9 de diciembre de 2007

Ubuntu Live-USB Personalizada (Distro USB booteable)

Hola!

Hace algún tiempo escribí esto y ahora lo voy a plasmar acá. Se trata de una guía para armar una distribución Linux ("customizada" o "personalizada", si se quiere) booteable desde un dispositivo USB como por ejemplo un Pen Drive, lo que también se llama Live-USB (por su cercana relación con los Live-CDs).

Mi necesidad era crear un Live-CD bien genérico, con Linux, entorno gráfico (Gnome preferentemente) más una aplicación mía (que arrancara automáticamente) a una PC que no tenía lectora (ni podía tenerla) pero sí tenía USB; con lo que no me importaba si el acceso al dispositivo era de lectura/escritura o de lectura solamente, una vez arrancado Linux. Al final resultó que el acceso era de sólo lectura, pero calculo que googleando un poco o tocando el archivo de configuración del initramfs se puede hacer de lectura/escritura. También puede servir este link, donde no se modifican las opciones "montaje" del dispositivo raíz, pero es una manera alternativa para salir del paso.

De más está decir, que para seguir esta "guía", el lector debe conocer los comandos de Linux y estar utilizándolo al momento de seguir estos pasos.

Basándonos en éstas instrucciones del sitio de Ubuntu para generar un LiveCD booteable personalizado de Ubuntu 7.04 Feisty Fawn, vamos a seguir dichas instrucciones y al final, en vez de generar una ISO para grabar en un CD, vamos a generar un Pen Drive booteable.

Requerimientos

* SO Linux para generar todo, permisos de root
* CD de Instalación de Ubuntu
* squashfs-tools
* qemu (opcional)

Pasos:
1. Crear una "jaula" Chroot e instalar los paquetes necesarios allí

1.a. Instalar el paquete 'debootstrap'.

$ sudo -i (ingresamos nuestra contraseña para convertirnos en root).
# apt-get install debootstrap
1.b. Ejecutar:
# mkdir work
# cd work
# mkdir chroot
# debootstrap --arch i386 feisty chroot http://archive.ubuntu.com/ubuntu
Esto va a crear un directorio de trabajo ('work') con un directorio chroot adentro. Vamos a instalar un pequeño Ubuntu allí.
# cp /etc/resolv.conf chroot/etc/resolv.conf
# cp /etc/apt/sources.list chroot/etc/apt/sources.list

# chroot chroot

# mount /proc
# mount /sys

# apt-get update
# locale-gen es_AR.UTF-8

# apt-get install ubuntu-standard casper
# apt-get install discover1 laptop-detect os-prober

# apt-get install linux-generic
# apt-get clean

# rm -rf /tmp/*
# rm /etc/resolv.conf

# umount /proc
# umount /sys

# exit
Lo que hacemos ahí es:
  • Copiar el archivo para poder resolver peticiones DNS, las URLs de los repositorios de Ubuntu.
  • Entramos al chroot.
  • Luego montamos los dos filesystems 'lógicos' de nuestro Linux para poder instalar paquetes normalmente dentro del chroot.
  • Dichos paquetes a instalar son los básicos para que se inicie el SO y se ejecute la consola (pueden instalarse los paquetes que se quieran, aunque como después es posible volver a entrar y hacer modificaciones, sugiero instalar sólo estos en primera instancia).
  • Por último se eliminan archivos temporales, los paquetes .deb descargados y se trata de 'descontaminar' el chroot de los archivos generados y/o copiados anteriormente. Gran parte de esto se hace para que la jaula chroot sea lo más pequeña posible (aunque posteriormente se comprima).
  • Con el comando 'exit' (o también con la combinación de teclas Ctrl+D), se sale del chroot.
Con todo esto lo que hacemos es construir nuestro sistema personalizado utilizando paquetes de los repositorios de Ubuntu.

2. Crear el directorio 'image' del medio a bootear

2.1. Instalar los paquetes 'squashfs-tools', 'syslinux', 'sbm'. El paquete squashfs-tools nos va a permitir comprimir (y montar si queremos) el filesystem que está reflejado en el chroot. Syslinux nos da las herramientas para poder hacer el pen drive booteable. SBM es una herramienta que es útil tener por si booteo no funciona.

2.2. Dentro del directorio de trabajo ('work'), crear el subdirectorio 'image' y el subdirectorio 'casper', donde va a residir el sistema de archivos que generamos en el chroot pero comprimido con squashfs.
# mkdir image image/casper
2.3. Va a ser necesario un kernel y un initrd construído con los scripts de casper. Obténgalos de su chroot.
# cp chroot/boot/vmlinuz-2.6.20-16-generic image/casper/vmlinuz
# cp chroot/boot/initrd.img-2.6.20-16-generic image/casper/initrd.gz
2.4. También se necesitará el binario de sbm y el kernel de testeo de memoria (opcional). Los archivos los saco de la propia instalación de Ubuntu Feisty con la cual se está usando la PC, cuidado si no se está utilizando la misma distribución/versión...) en todo caso, si estoy usando otra versión de Ubuntu o Debian, podría instalar los paquetes en el chroot y copiarlos de ahí.
# cp /boot/memtest86+.bin image/install/memtest
# cp /boot/sbm.img image/install/
2.5. Cree un archivo syslinux.txt en el directorio 'image' para mostrar al bootear ('image' será la raíz del pen drive). Por ejemplo:
^Xsplash.rle



Para iniciar el sistema, presione ENTER.
^X es el caracter nro. 24 de la tabla ASCII (en la documentación de syslinux figura como <can>). Sirve para indicar que lea el archivo splash.rle (en este caso) y lo muestre modo gráfico en la pantalla. Para más detalles, como por ejemplo, generar una imagen de un formato soportado, ver la documentación de syslinux.

2.6. Cree un archivo syslinux.cfg en el directorio 'image'. Puede leer la documentación de syslinux en /usr/share/doc/syslinux/syslinux.doc para ver las opciones de configuración. Aquí hay un ejemplo:
DEFAULT live
LABEL live
menu label ^Start or install Ubuntu
kernel vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper initrd=initrd.gz vga=normal splash --
LABEL check
menu label ^Check CD for defects
kernel vmlinuz
append boot=casper integrity-check initrd=initrd.gz splash --
LABEL memtest
menu label ^Memory test
kernel memtest
append -
LABEL hd
menu label ^Boot from first hard disk
localboot 0x80
append -
DISPLAY syslinux.txt
TIMEOUT 50
PROMPT 1
2.7. Cree el manifest (siempre posicionado en el directorio 'work').
# chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' > image/casper/filesystem.manifest
# cp image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
# sed -ie '/ubiquity/d' image/casper/filesystem.manifest-desktop
2.8. Comprima el chroot (posicionado en el directorio 'work')
# mksquashfs chroot image/casper/filesystem.squashfs
2.9. Cree un diskdefines (posicionado en el directorio 'work')
# vi image/README.diskdefines
que contenga, por ejemplo:
#define DISKNAME  Ubuntu 7.04 "Feisty Fawn" - Release i386 **Remix**
#define TYPE binary
#define TYPEbinary 1
#define ARCH i386
#define ARCHi386 1
#define DISKNUM 1
#define DISKNUM1 1
#define TOTALNUM 0
#define TOTALNUM0 1
2.10. Calcule la firma md5 de cada archivo y guárdela en la raíz de la imagen.
# (cd image && find . -type f -print0 | xargs -0 md5sum > md5sum.txt)
3. Formatear el Pen Drive y copiar los archivos

(!) Esta operación elimina completamente el contenido del pen drive.

(!) Cuidado al utilizar estas instrucciones como usuario root y equivocarse de archivo en /dev/. Las máquinas más o menos actuales incorporan discos SATA, que el kernel de Linux las identifica como '/dev/sdx', de la misma forma que los pen drives. Si llegara a ejecutar un 'dd if=xxx of=/dev/sda', donde sda es el HD SATA, borrará todo el disco rígido.

Lo que puede hacer para averiguar qué /dev/sdX es su pen drive (donde X puede ser 'a','b','c', etc.), es insertarlo y ejecutar el comando 'dmesg' y ver las últimas líneas que automáticamente imprime algo como lo siguiente cuando se inserta un pen drive:
[186301.602058] usb 5-7: new high speed USB device using ehci_hcd and address 8
[186301.738659] usb 5-7: configuration #1 chosen from 1 choice
[186301.738915] scsi10 : SCSI emulation for USB Mass Storage devices
[186301.739126] usb-storage: device found at 8
[186301.739129] usb-storage: waiting for device to settle before scanning
[186306.735664] usb-storage: device scan complete
[186306.736286] scsi 10:0:0:0: Direct-Access Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 2
[186306.738254] SCSI device sdb: 1994752 512-byte hdwr sectors (1021 MB)
(sigue...)
En este caso, como se puede ver, el dispositio es sdb. Otra opción es, con el pen drive puesto, ir al menú "Sistema -> Preferencias -> Información de Hardware". En dicho programa buscar el pen drive (en mi caso "Data Traveler 2.0"), y en la pestaña avanzado, en la grilla de propiedades aparecerá primero la key "block.device" de tipo "string" y en el valor estará el nombre de /dev/sdX que lo representa:


Una vez que se averiguó el dispositivo que utiliza la PC para hacer referencia al Pen Drive, seguimos los siguientes pasos:

3.1 Borramos totalmente el primer sector (el Master Boot Record) del Pen Drive:
# dd if=/dev/zero of=/dev/sdX bs=512 count=1
(Donde /dev/sdX es el nombre de archivo que el SO usa como referencia al Pen Drive, /dev/sdb en mi caso). Esto se hace por única vez por cada pen drive.

3.2. Ejecuto el gestor de particiones, fdisk, sobre el pen drive. La idea es generar una única partición que ocupe la totalidad del tamaño del pen drive, de tipo FAT 16 y que tenga la marca de booteo.
# fdisk /dev/sdb

Orden (m para obtener ayuda): p

Disco /dev/sdb: 1021 MB, 1021313024 bytes
32 cabezas, 61 sectores/pista, 1021 cilindros
Unidades = cilindros de 1952 * 512 = 999424 bytes

Disposit. Inicio Comienzo Fin Bloques Id Sistema
/dev/sdb1 * 1 1021 996465+ 6 FAT16

Orden (m para obtener ayuda):
Con 'p' veo la estructura actual, y tecleo 'n' (de New Partition) para crear la nueva partición, seguido de un par de enters (uno para definir el inicio y otro el final; por defecto la nueva partición toma todo el espacio disponible). Una vez que volví al prompt del fdisk, tipeo 't' para cambiarle el tipo de partición, en donde elijo '6' (siempre sin comillas), para especificar FAT16. Por último, en el prompt tipeo 'a', para agregarle la marca de booteo. Reviso que me quede como se puede ver más arriba y con 'w' grabo los cambios en el pen drive.

3.3. Formatear el pen drive. Ahora queda darle formato al pen drive, para poder comenzar a grabarle archivos:
# mkfs.vfat -F 16 /dev/sdb1
(En este caso utilicé /dev/sdb1 porque lo que formateo es la partición nro. 1, es la única que definí con el fdisk).

3.4. Monto el pen drive (primero creo un directorio en donde montarlo por las dudas):
# mkdir -p /mnt/usb
# mount /dev/sdb1 /mnt/usb
3.5. Ahora sólo tengo que copiar los archivos en forma recursiva (con sus subdirectorios) de mi directorio 'image'. Por ejemplo, si estoy posicionado en 'work':
# cp -r image/* /mnt/usb
3.6. Desmonto el pen drive:
# umount /mnt/usb
3.7. Aquí viene lo más importante: hacer el pen drive booteable. Para eso ejecutamos el programa 'syslinux':
# syslinux /dev/sdb1
Lo que hace el syslinux es leer el syslinux.cfg y generar un archivo en el directorio raíz del pen drive llamado ldlinux.sys. Al configurar la BIOS para que arranque del pen drive, el syslinux se ejecuta y sigue las directivas definidas en el syslinux.cfg que generamos. Con la versión de syslinux incluída en Ubuntu Feisty (3.11) no es posible leer el archivo de configuración de un subdirectorio; a partir de la versión 3.35 ya está implementado (escanea unos subdirectorios predefinidos buscando el .cfg).

4. Consideraciones Finales

4.1. Si bien no haría falta eliminar completamente el MBR del pen drive (dd if=/dev/zero ...), encontré muchas incompatibilidades con pen drives cuya geometría sea mayor a 1024 cilindros (cabe aclarar que la gran mayoría de los pen drives actuales vienen con el tipo de partición 'e W95 FAT16 (LBA)', y alrededor de 3900 cilindros los de 1GB). La máquina en la que iba a correr el sistema directamente no bootea si el pen drive no tiene menos de 1030 cilindros (encontré pen drives que con 1028 booteaban igual), además de estar formateado en FAT 16. Quizás tenga que ver conque el modo de booteo es "USB-FDD" (siendo FDD: Floppy Disk Drive, y por esto sea el límite de cilindros tan bajo).

La opción de utilizar FAT 16 (tamaño máximo de partición: 2GB) también apunta a tener más compatibilidad con los BIOSes. También encontré incompatibilidades al bootear con otro tipo de máquina mucho más moderna, cuando el pen drive tenía una geometría de 1015 o 1032 cilindros. Para el proyecto en el que hice esto, terminé haciendo imágenes con "dd if=/dev/sdb of=imagen.img" de los pen drives que funcionaban y guardándolos en el HD para luego volver a clonarlos con dd if=imagen.img of=/dev/sdb. Esto particularmente anduvo muy bien.

4.2. Para modificar el filesystem generado, sólo hay que entrar al chroot, y modificarlo a gusto. Por ejemplo, podemos instalar nuevos paquetes que van a estar disponibles en nuestro live-usb (con apt-get), modificar archivos de arranque (/etc/rc.local), es decir, personalizar nuestra distro! :-D Luego, salimos del chroot (comando 'exit'), borramos el archivo image/casper/filesystem.squashfs anterior, y volvemos a generar el filesystem comprimido (ver arriba: "mksquashfs...").

Links Relacionados:

http://es.wikipedia.org/wiki/Chroot
http://www.pendrivelinux.com/2007/05/31/create-your-own-live-linux-cd-or-usb-distribution/
https://help.ubuntu.com/community/LiveCDPersistence
https://help.ubuntu.com/community/LiveCDCustomizationFromScratch
http://el-directorio.org/DebianLive#head-9df2b36e5793bbfb9353ffbf472fb3e38608935e
http://wiki.debian.org/DebianLive/Howto/USB

Espero que les sirva, y cualquier duda/insulto/comentario, pueden consultarme por mail (o comentando este post).

Saludos!
Marcelo

viernes, 23 de noviembre de 2007

Gio en Nautilus

Hola gente!

Bueno, como la mayoría de las cosas en el Mundo Libre, siempre se renuevan y reescriben, los escritorios también. En este caso, Alexander Larsson, desarrollador de Gnome, está trabajando desde hace tiempo en Gio, el nuevo componente de manejo de i/o ("input/output", entrada/salida) para Gnome. Qué características nuevas puede traer? Vean este video, donde se ve la versión de Nautilus utilizando Gio:

El post original es éste, y me encanta ver que por fin las operaciones de copiado, eliminación, etc. de archivos se ven reflejadas en el entorno de trabajo (aka el "desktop") en sí. Usualmente los usuarios se pierden o se confunden haciendo cosas con archivos, y éste IMHO es un muy buen primer paso.

Según el Roadmap de Gnome (el "plan" general de características a ingresar), va a estar listo para Gnome 2.22... :-)

Saludos
Marcelo

jueves, 8 de noviembre de 2007

Adobe Reader 8.1 para Linux

Si, si, ya sé que para leer simplemente un archivo pdf Evince y/o Kpdf funcionan bien... pero... y si me llega algún pdf "raro", que aprovecha las características nuevas del formato? (uso de formularios, anotaciones, encriptación, etc.)[1]

En fin... me enteré hace poquito que Adobe (muy silenciosamente) lanzó su versión 8.1 del "acroread", es decir, del Adobe Reader para Solaris/Sparc y GNU/Linux/i386. Con este programa tenemos máxima compatibilidad al leer y trabajar con estos archivos.

Lo bueno:

  • Anda rapidísimo, vuela comparado con la antigüa versión 7 (siempre sobre Linux); sigue utilizando GTK como toolkit gráfico.
  • Eliminaron el modo MDI, que nunca fue soportado por GTK (o sea, lo habían metido "a la fuerza"), con lo cual la versión 7 era un hack horrible al laburar con varios documentos. Ahora está todo en SDI. :-)
  • Hay más comunicación con el equipo de desarrollo y el usuario: Adobe creó un blog sobre Acroread para Unix/Linux. Bien, al menos ahora hay una sección exclusiva para los que usamos otros SO.
  • El software en general está muy mejorado, bonito, y muy usable (aunque para ser justos, tampoco estamos hablando de una aplicación compleja como un CAD). Diría que podría dejarlo como default para mi sistema.
  • Proveen paquetes binarios para instalarlo muy fácilmente: .rpm, .deb y .tar.gz.
Lo Malo:
  • Todavía está en inglés (y Francés, Alemán, Japonés... pero en Español, todavía no).
  • Usando Compiz en Ubuntu 7.10, los efectos de transición a pantalla completa funcionan pero no del todo bien, y los deshabilité. Tiene algunos defectos gráficos muy pavos y pequeños, se ve que algunas cosas siguen siendo medio 'hack' sobre GTK para obtener máxima compatibilidad (será?).
  • Me gustaría que se pudiera regular la cantidad de líneas que se baja al darle a la ruedita del mouse, se me hace que es poco.
Lo Feo:
  • Sigue siendo código cerrado (por qué, Adobe? Qué ganan?). Eso sí, es gratuito.
  • Por lo tanto, no viene en ninguna distribución Linux por defecto.
  • Además, para hacerlo andar en mi arquitectura AMD64 (los binarios son para 386), tuve que bajar el .tar.gz y ejecutar el script INSTALL que viene adentro (después me avivé que estaba el .deb, pero siempre para i386, con lo cual habrá que hacer un 'dpkg -i --force-architecture acroread_xxxx.deb').
  • Y por último, tuve el problemita de que me pedía la librería libgtkmozembed.so [2] (en forma opcional), para lo cual tuve que bajar el XulRunner de Mozilla para Linux 386 (enlace), descomprimirla en algún lado (yo elegí '/usr/local/xulrunner32/') y decirle al Adobe Reader en sus preferencias que lo busque en esa ruta.
Otra Captura:


Comparando cómo renderiza el mismo documento cada uno (Poppler vs. Adobe), va desde algo mejor a mucho mejor el software de Adobe, tanto en calidad (el hinting de las fuentes es mejor), como en la aparición de algunos "artefactos" muy sutiles (por Poppler). Soy un neófito en cuando a teoría de fuentes, pero poniendo un documento a lado del otro, se nota.

Saludos!
Marcelo

[1] En una búsqueda (muy corta) no encontré algún documento que resumiera lo no implementado con respecto al último estándar por Poppler, la librería que interpreta los PDFs para Evince y Kpdf. Sin embargo, puedo afirmar que no implementa todas las características del estándar Pdf 1.7. Acá hay un resumen de la historia.
[2]: En las FAQ del Blog de Adobe está explicado qué es, para qué sirve y como se busca si no es detectado automáticamente. Aclaro de nuevo, es opcional; el programa funciona sin hacer esto, sólo sale un cartelito más o menos molesto diciendo lo que no encuentra.

domingo, 14 de octubre de 2007

Un buen ejemplo de código PyGTK: Decibel

Decibel Audio Player es un programa liviano, sencillo, no orientado a tener miles de funciones (Amarok, les suena? :-D ), sino sólo a reproducir música de una lista. La verdad que las capturas de pantalla ("everybody loves screenshots!") pintaban prometedoras, y cuando leí que estaba hecho en Python + GTK, bajé el fuente a ver qué onda[1]...

Y la verdad que me está gustando lo que estoy leyendo. La parte de módulos me parece bárbara, da gusto leerla: para hacer un módulo propio (aka 'plugin'), uno hereda de una clase "Modulo" (también hay un ThreadedModule) y se registra a los eventos que quiere recibir, puede emitir eventos a los demás, etc. Las pantallas están hechas con Glade, el código está bien comentado (y bien identado, es Python! :-D ), el tamaño del proyecto y del fuente es manejable (al usar Glade, casi no se ve código de manejo de ventanas), usa semáforos, locks, está bien modularizado y orientado a objetos, etc.

Vista de un .glade abierto (con el vim de fondo):



Es resumen, si estás aprendiendo python (o programación, por qué no), leer el código fuente de este programa puede ser muy entretenido, para aprender cómo hacen las cosas los demás (y cómo se hacen las cosas bien hechas, je). Demás está decir que esto se puede hacer gracias a que es Software Libre, que si no... (es más, me gustaría meter algunas features que no me gustan y mandarlas al desarrollador...).

Espero que le pique el "bichito pythónico" a más de uno.

Saludos
Marcelo
[1]: Mentiira! :-D Como todavía uso Feisty (Decibel ya está en los repos de Gutsy), bajé el .deb de la página y cuando GDebi me dijo que era para la arquitectura i386 (tengo un x86-64), putié y dije "por qué, si es python, viejo! tiene que ser multiplataforma!". Ahí bajé el código.
PD: Guarda: Miren los __init__.py de los subdirectorios, hay está siempre lo que uno busca. :-)

Actualización: Envié un pequeño parche, que implementa el "cerrar ventana y no salir" y el "iniciar minimizado", aunque necesita que el módulo cargue siempre el StatusIcon (no estaba así por defecto). Espero que el desarrollador principal lo acepte. :-)

jueves, 4 de octubre de 2007

Una Revista de Python: Python Magazine

Me hago eco de un sitio sobre python, comentando que salió la primera edición de la PyMag - Python Magazine, (la primera revista exclusivamente sobre Python?) :-)

En su página de "Acerca de Nosotros", comenta que "es una revista mensual exclusivamente dedicada a Python, que tendrá artículos de gran profundidad, evaluaciones de productos, tips, mucho código e ideas con un único objetivo en mente: ayudarlo a mejorar su manejo de Python y aplicarlos en su trabajo diario. PyMag es una revista técnica hecha por programadores para programadores."

La revista en sí se descarga gratuitamente (en formato pdf) de su sitio *actualización: sólo por esta primera edición*, (por si no se dieron cuenta al leer mi traducción, la revista está en idioma inglés, je) y su modelo de ingresos se basará en la publicidad, junto con la suscripción de U$S 7 que costará la versión digital (a partir de la siguiente edición)... esperemos que les dé resultado y crezcan, la revista parece bastante copada.

El índice de este primer número contiene:

  • Extending Python: Cómo utilizar C desde Python
  • Working with IMap and iCalendar
  • Processing Web forms using anonymous functions & WSGI
  • Creating custom PyGTK widgets with Cairo (me muero por leer ya este artículo!)
  • Y más. (juaz! y eso que no tengo nada que ver con la revista ni los editores!)

Bueh, veremos qué tal resulta. Podés dejar tu comentario a ver qué te pareció.

Saludos
Marcelo

sábado, 29 de septiembre de 2007

Escaneos QScan con Nmap

Buenas... leyendo el blog de Buanzo, me interesé por el tipo de ataques "QScan" que menciona en este artículo:

http://blog.buanzo.com.ar/2007/09/informe-de-puertos-proxeados-fibertel.html



Con lo cual, después de una breve consulta en Google, me encontré con este excelente documento:

http://hcsw.org/nmap/QSCAN

Básicamente, los tipos de escaneos QScan se basan en comparar las medias (mediante la distribución T de Student) de los RTTs de una cantidad N (la muestra) de paquetes enviados a distintos puertos de un mismo (o diferentes) hosts. Además, para sacar más el jugo a la técnica, uno puede configurar el intervalo de confianza, la cantidad de muestras y la demora N entre paquete y paquete enviado (que para hacer la prueba estadísticamente más 'fuerte', el parche hace un random que tiene como punto medio al N configurado). El objetivo es saber si el host que recibe los paquetes (el 'target' del escaneo) hace tratamientos diferentes de los paquetes de acuerdo a al puerto destino.

Por ejemplo, si un host tarda ~600 ms. en responder a los paquetes enviados por nmap al puerto 80 y ~250 ms. en responder a los paquetes enviados al puerto 22, y la comparación de las medias por T de Student da como resultado que son diferentes, se puede inferir que los paquetes enviados al puerto 80 son reenviados por el host a otro host (que no lo veo!), a diferencia de los paquetes que van al puerto 22.

Recomiendo muchísimo la lectura del artículo. Me parece un tipo de escaneo bastante útil para hacer detección de infraestructura de DMZs, reglas de firewall, etc. Hasta lo recomiendo porque es un tipo de escaneo muy sencillo e interesante por sus resultados.

Para los que tuvimos el gusto de asistir a sus clases (yo en la UNLu), es imposible no acordarse de Daniel Villa y sus clases de estadística leyendo este artículo! :-)

Lástima que este QScan no está disponible en la versión estándar de NMap (hay que recompilarlo).

Sitio oficial del parche: http://www.hcsw.org/nmap/

Insisto, me alegré mucho personalmente por entender la aplicación de tanto sentido común (y con herramientas que uno conoce) sobre algo que no se me hubiera ocurrido. :-)

Saludos
Marcelo

sábado, 15 de septiembre de 2007

Jornadas en el LugFi 2007

Hola!

Este viernes tuve la oportunidad de ir a las Jornadas 2007 del LugFI, donde me encontré con amigos del UnluX, gente de "la comunidad", y pasé un muy buen rato escuchando y aprendiendo cosas interesantísimas.



Resumen de las charlas a las que fui (espero no hacer sentir mal a nadie, los comentarios van con onda y tienden a mejorar, eh):
  • 14 - 15 hs.: Llegamos tarde a la charla de XUL!!! (ufa). Me gustaría que alguien me pasara las diapositivas al menos (vi que Damián Viano estuvo grabando el audio de las charlas...)

  • 15 - 16 hs.: "Procesamiento de Imágenes con Python", por Efraim Wainerman (un amigo de hace mucho tiempo ya). Muy bien Efra, salvo que hubo gente que no fue porque pensó que era algo más bien avanzado (por el título de la charla); hubiera estado mejor "PIL: Trabajando con Imágenes en Python" o algo así. Otra cosa a mejorar: mostrar más ejemplos de código, la charla estaba en el track avanzado... :-D Por otra parte, estuvo bueno, no conocía PIL y con eso me llevé una idea de cuál es su enfoque y cómo se labura.

  • 16 - 17 hs: "Recolección de Basura para principiantes", por Rosa Wachenchauzer. Sin palabras, realmente excelente charla, muy clara, entendible por cualquiera y muy avanzada a la vez. Estuvo bárbaro escuchar hablar de un tema del cual nunca leí nada formalmente. IMHO, cualquiera que se quiera llamar "programador" debería saber este tipo de cosas. 10 puntos.

  • 17 - 17:30 hs.: "AJAX: Mentiras y Verdades", por Margarita Manterola. Entretenida charla, que reseña la historia de la implementación de una función en diferentes navegadores para intercambiar datos con un servidor web en forma asincrónica (a.k.a. AJAX, je). Margarita ("Marga", Debian Developer) tiene excelentes habilidades para hablar en público, transmitir conocimiento y ser muy amena al mismo tiempo.

  • 17:30 - 18 hs: "The UNIX Way", por Damián Viano. Un hacker de aquellos, mostrando sus trucos con el bash. Me llevé el comando xargs! (no lo conocía). Buenísimo, lástima que el tiempo es tirano y se guardó muchas "pócimas" para otra oportunidad. Me dejó con ganas de que nos cuente más de todo lo que sabe con la consola (y no es un DJ, je).

  • 18 - 19 hs.: "C++/Boost", por Matías Capeletto. Lo admito, no sé nada de C++, y pensaba que era un "C con orientación a objetos". Me equivocaba, C++ es claramente un lenguaje poderosísimo y que en una hora no pude deglutir todo lo que Matías no paraba de explicar. Matías, lo lograste, me picó el bichito de la metaprogramación en tiempo de compilación, templates y demás.... (y armá ese curso de C++ moderno del que hablaste, quizás me prenda!).

  • 19 - 20 hs.: "C++? Python? Java? Ruby? C#? ... D!", por Leandro Lucarella. Un pantallazo de un nuevo lenguaje (D), que Leandro conoce bastante y que públicamente admite que pretende desplazar a C++. Lástima que al ser competidor directo de C++ se metió demasiado en las "diferencias" con C++, y yo al no conocer a fondo el anterior, me quedé sin entender 100% las "bondades" del lenguaje. Sin embargo, me llevo a mi casa las características de este lenguaje y sus posibles aplicaciones... Y de nuevo, la metaprogramación en tiempo de compilación llamó a mi puerta. :-) Muy interesante!

  • 20 - 21 hs.: "Metaprogramación", por Pablo D. Roca. Una recorrida por las diferentes formas de hacer metaprogramación, con ejemplos y mucho código en C#, excelente! Aunque creo que debería haber ido antes de las dos anteriores (a modo introductorio), y debería haber sido hecha en la plataforma Mono sobre Linux (lo hizo sobre Visual Studio sobre Windows XP). No es por ser talibán del software libre, pero es un evento de Software Libre hecho por gente de un Linux Users Group... y no costaba nada el esfuerzo, no? Sin embargo, vale el extenso conocimiento de Pablo y su excelente predisposición para elaborar ejemplos muy claros sobre lo que estaba hablando.

  • 21 - 22 hs.: "OpenSolaris", por Hernán C. Saltiel. Lástima que empezó muy tarde (21:30) porque la anterior terminó unos minutos tarde y porque hubo unos problemitas con la salida de video de la notebook de Hernán. Sólo llegué a recibir el kit de OpenSolaris (gracias!) y escuchar la primera media hora (me tuve que ir...). Estuvo buena, hay que ir integrando a OpenSolaris en el grupo de SOs libres.
Y eso es todo. Quiero las diapositivas de todas! (y/o audio), je. Por otra parte, me llevo a casa para estudiar e investigar todo lo que desconocía de "metaprogramación", algo que todavía me cuesta un poco de pensar, tanto su forma de utilización como su aplicación práctica. Sin embargo, puedo darme cuenta lo útil que puede llegar a ser, y sin lugar a dudas lo interesante que es programar cosas que programen programas, e inventar lenguajes...

En resumen, este tipo de eventos le abren la cabeza a uno y me siento como cuando empecé la facultad y quería aprender TODO sobre software, informática y sistemas... gracias muchachos!

Y bueh, gente del LugFi, los felicito y les pido que repitan estos eventos con altísima calidad técnica y organizativa. Hasta la próxima!



Marcelo
Actualización
: Ya están todas las diapositivas en el sitio del LugFi.

domingo, 9 de septiembre de 2007

Taller de Python en la UNLu

Hola!

Les cuento de que tuve el honor de que la gente del CODES (Centro Organizado de Estudiantes de Sistemas de la Universidad Nacional de Luján) más la del UnluX (del cual soy parte), me invitó a llevar adelante un taller de programación Python para los alumnos de los primeros años de sistemas de dicha Universidad.

Como no tuve tiempo de armar ninguna presentación como para tener de "apunte", le pedí a Facundo Batista el permiso para utilizar las que él armó para las 7JRSL de Córdoba. Creo que sólo le modifiqué la primera página y el fondo, sin embargo, acá están para descargar.

Fue una linda experiencia, me sentí muy bien y los asistentes parecían bastante interesados en Python y sus características (seguro eran las diapositivas, :-P ). Nah, según la info que me pasaron los organizadores (Ezequiel Chan y Tomás Delvechio) los chicos sólo conocían Pascal (no emito opinión alguna sobre el lenguaje, ja!). Lo que sí era evidente era el interés dado que hay muchas diferencias (técnicas y filosóficas) entre el lenguaje que conocían y el que les estaba mostrando. Y estuvo bueno.

También apareció gente del LugFi (Matías Capeletto y Cecilia), hablando un poco de Trac (no me pude quedar! :-( ), con lo cual el encuentro se volvió multi-lug! :-D

Ya van dos sábados y el sábado que viene calculo que cerraremos explicando algo de PyGTK, para que vean que no sólo de la consola vive el hombre. :-)


Saludos!
Marcelo
PD: Prometo fotos la semana que viene.

Administrador SQLite - SQLiteman

Buenas... hace algún tiempo comenzamos a utilizar en desarrollos en estado "inicial" Bases de Datos SQLite... ya sea porque Python tiene mucha facilidad para crear y laburar con este tipo de BD, porque nos parece rápida y de sencilla administración, y porque para hacer pruebas... es bárbara. En fin, con SQLite, creás tu BD en un toque y te ponés a laburar.


El tema es que si bien uno tiene siempre a mano el administrador de línea de comandos ("sqlite3") para hacer querys, ver la descripción de alguna que otra tabla, etc., muchas otras veces (más que nada cuando quiero hacer querys complejos, como joins de varias tablas) siento la falta de algún administrador SQLite pero en formato GUI.... un montón de veces busqué y nunca encontré nada que me gustara.

Necesitaba algo con Soporte Linux + Paquetes Ubuntu (que sea sencillo de instalar), además de ser gratis (preferentemente Open Source, claro). Si tenía que perder tiempo en compilar en algunas de las PCs de desarrollo (mi casa, el trabajo, etc.), era más fácil invertir el tiempo en hacer el deploy de otra BD (PostgreSQL) con el PGAdmin, je.

Por suerte, gracias a GetDeb, me encontré con SQLiteMan (Website). Un caño, simple de instalar, simple de usar, 100% efectivo. Y todos felices. :-)

Screenshot Obligada (Usa el QT 4.3 de mi Feisty con el look and feel "Cleanlooks", que imita el Clearlooks de GTK):



Saludos
Marcelo

martes, 14 de agosto de 2007

Youtube usa Python


En esta página hay un poquito de detalle sobre la arquitectura que utiliza YouTube, que sirve alrededor de 100.000.000 (sí, cien millones) de videos por día.

Adivinen qué? Usa Linux + un Application Server escrito en Python. :-D

Psyco es un "acelerador" de python, digamos que compila "al vuelo" el código que interpreta python y lo convierte a código nativo de la plataforma (como si se hubiera escrito en C, digamos). Si a ellos les da resultados, se podría probar para casos donde se necesite performance.

También me sorprende que usen lighthttpd, que es un webserver "liviano" (traducido: "más liviano que Apache"); en ese caso, quiere decir que está listo para utilizar en producción. :-)

Para más detalles lean la página, está muy interesante.

Saludos
Marcelo

Krita: Mezcla de Colores

Krita es una aplicación para edición fotográfica/bitmaps al estilo Photoshop/Gimp/etc.

El video muestra la implementación de la "mezcla de colores" (yo no entendía qué era hasta que lo ví). Muy bueno, Krita pinta como alternativa a Gimp desde hace rato y ojalá sigan poniéndole pilas los desarrolladores.

Además de eso, calculo que a fines de año (gracias a QT 4.x GPL para todas las plataformas) va a estar disponible para Windows y Mac.







Visto en Barrapunto.

Saludos
Marcelo

sábado, 4 de agosto de 2007

Metaprogramación en Python

Python está bárbaro, es sencillo y todo... siempre leí que era muy fácil hacer metaprogramming con él, pero el problema es que uno haga metaprogramming de una forma fácil en su mente. :-P

Veamos, la función getattr(), disponible en el módulo __builtins__ (o sea, disponible en todo momento), me permite cambiar esto:

def get_transportistas_custodia(id_custodia):
""" Devuelvo todos los transportistas que están relacionados con una custodia """
c = Custodia.objects.get(id=1)
# Necesito el conjunto de transportistas de la custodia
return c.transportistacustodia_set.all()

def get_asegurados_custodia(id_custodia):
""" Devuelvo todos los asegurados que están relacionados con una custodia """
...
(lo malo es que tengo que hacer una función por cada tipo de empresa relacionada con custodia).

Por esto:
def get_empresas_relacionadas_custodia(id_custodia, empresa_relacionada='transportista'):
""" Devuelvo todos los objetos de la empresa relacionada que están
relacionados con una custodia.
empresa_relacionada es un string que contiene el tipo de empresa con la cual
relacionar a custodia.
"""
c = Custodia.objects.get(id_custodia)
# Necesito el conjunto de empresas relacionadas de la custodia
return getattr(c, empresa_relacionada + 'custodia_set').all()
Esto es muy bonito. Lo que no había podido hacer hasta ahora era parametrizar con una variable las llamadas a función. Hablo de cosas como esta:
def has_empresa_relacionada_custodia(id_custodia, empresa_relacionada='transportista',
id_empresa):
""" Devuelve true si la empresa + id de la empresa especificados están
relacionados con el id_custodia """

c = Custodia.objects.get(id_custodia)
# Necesito el conjunto de empresas relacionadas de la custodia
empresas = getattr(c, empresa_relacionada + 'custodia_set')
resultado = eval('empresas.get(' + empresa_relacionada + ',' + id_empresa + ')')
if resultado:
return True
else:
return False
Acá evidentemente no sabía cómo hacer para "poner" en la llamada a una función el nombre del parámetro que tengo en una variable (empresa_relacionada en este caso). Siempre leí que el "eval is evil" (además de muy lento en su ejecución), pero hasta ahora no podía evitar esto.

Jugando hace un rato descubrí que puedo hacer esto!
def has_empresa_relacionada_custodia(id_custodia, empresa_relacionada='transportista',
id_empresa):
""" Devuelve true si la empresa + id de la empresa especificados están relacionados
con el id_custodia """

c = Custodia.objects.get(id_custodia)
# Necesito el conjunto de empresas relacionadas de la custodia
empresas = getattr(c, empresa_relacionada + 'custodia_set')
# En la siguiente línea está la magia
resultado = empresas.get(**{empresa_relacionada : id_empresa})
if resultado:
return True
else:
return False
Groso! Al leer que las funciones con keywords son simples llamadas con
diccionarios, me fijé en esta página:

http://docs.python.org/ref/calls.html

Y ví que se puede llamar a funciones con ** o con * también.

Es un avance importante, ahora puedo parametrizar con valores de variables las llamadas a funciones, y sin usar el eval() (no usen eval, siempre tiene que haber una manera de no usarlo).

Saludos
Marcelo

domingo, 29 de julio de 2007

Un "Yo" dibujado por Matt Groening

Después de haber disfrutado anoche de la película de Los Simpsons (si te gustan, no te la pierdas, es buenísima!), me tomé un ratito (un domingo aburrido...) en entrar a la página de los simpsons... está muy buena (aunque el uso de flash es obligatorio), y aunque no la recorrí toda, pude crear un avatar con la paleta de colores, barbas, cabello, ojos, nariz, etc. de los Simpsons. Y tratando de hacerme a mí mismo, me salió esto:


Me pareció muy original la idea y divertido a la vez. :-)

Saludos!
Marcelo

domingo, 15 de julio de 2007

Muerte al top. Usá htop!

A éste post, sólo le agrego la captura obligada:


Y cómo instalarlo:
sudo apt-get install htop
Htop es un reemplazo más amigable del viejo y querido top de consola, permitiéndote matar y hacer scroll entre los procesos (era hora!).

Saludos
Marcelo

MPX: Multi-Point X Server

Buenas...

Hace unos meses había salido la noticia de la presentación de Microsoft Surface, que aunque no va a estar disponible hasta fines de 2007, sus videos permiten apreciar una nueva manera de interactuar con una computadora, ya que el Touch Screen horizontal posee un sensor Multi-touch. Una combinación de hardware y software donde una o varias personas interactuaban en una "mesa digital", al mismo tiempo... realmente es muy interesante! (más alla de que Microsoft lo sepa vender bien).

Como decía Angel Lopez en su momento, "para la adopción de esta tecnología, es fundamental que exista software que lo aproveche y que su costo sea accesible". Creo que teniendo en cuenta lo segundo, será difícil la implementación de Surface dado el contexto y la situación argentina, conociendo la estrategia de "precios globales" (léase: globales = en dólares accesibles para la gente del primer mundo) de Microsoft (aunque cada tanto estas noticias aisladas contradigan esta política y parezca que ceden ante la realidad del tercer mundo, sólo es la confirmación de que portándose así pierden competitividad frente al software libre/abierto).

Pero bueh, no me quiero desviar del tema. :-D

Pensándolo como implementación alternativa a esta tecnología, me encontré en algún post de algún blog, la página del Multi-Point X Server, que como dice su página es una modificación al X Server tradicional, que permite que varios dispositivos de entrada interactúen con las aplicaciones que todos conocemos ("legacy") más el desarrollo de nuevas aplicaciones, dando soporte para los n dispositivos de entrada y n focos en la misma pantalla.

Ahora, si combinamos el Multi-Pointer X Server, con una tableta Diamond Touch (que soporta el multitouch), obtenemos esto:

Como pueden ver, este bicho corre Ubuntu (o Kubuntu, no se ve). :-P

Pero sí se aprecia el Google Earth, Firefox, el Gimp y hasta un programa (tipo Paint) seguramente programado según la interfaz extendida al XInput (aunque lo importante es que es compatible hacia atrás). Al final del artículo con el video, se aclara que esta versión de XServer es independiente del dispositivo hardware; "usted puede utilizar su DiamondTouch, su tabla FTIR, o - si usted puede comprar una - su tabla MS Surface".

Y la remata con:
"Ah, y por si acaso; usted puede utilizar un mouse estándar y un teclado en la misma CPU al mismo tiempo que utiliza el touchscreen. Después de todo, cualquier cosa es sólo un dispositivo más. Este es el último gran cambio, luego voy a subir los cambios al proyecto MPX".

Luego, en este post, luego de la avalancha de visitas por el video de Youtube, se brindan más detalles.

Hay paquetes para Ubuntu Feisty. Alguien se anima a probarlo con dos (o más) mouses y dos (o más) teclados? :-D

Saludos!
Marcelo

sábado, 14 de julio de 2007

Samsung Syncmaster 206/226 NW en Ubuntu

Tengo chiche nuevo!

Después de algún tiempo de sacrificado laburo, me dí uno de los mayores gustos "informáticos" hasta ahora: comprarme un monitor LCD de 22" wide... más precisamente el Samsung Syncmaster 226 NW. :-D



De más está decir que es fantabuloso cómo se ve cualquier cosa que uno quiera ver. No hay "efecto arrastre" al hacer scroll, excelente contraste, excelente resolución y nitidez... Lo único "malo" técnicamente es que no viene con conexión DVI.

Sobre esto último, leí por ahí que en Argentina el IVA es del 21% para los monitores con DVI, en cambio para los con conexión VGA analógica es el 10,5%; de hecho, acá en Argentina los 206/226 BW (son iguales pero con DVI) no se venden (un garrón).

Llegué a casa, saqué el viejo y querido Samsung 796MB y me dispuse a disfrutar mi Ubuntu Feisty con él. Claro, Ubuntu estaba configurado con la "vieja" resolución (1024x768). Tenía que cambiar a la "nueva" resolución: 1680x1050 (los monitores LCD siempre deben estar a resolución nativa); para eso, abri una consola y ejecuté "dpkg-reconfigure xserver-xorg". Joya, seleccioné las resoluciones que quería (1680x1050 entre ellas), me generó un xorg.conf nuevo (con las resoluciones/configuraciones seleccionadas, haciendo un backup del xorg.conf anterior) y reinicié la PC.

Pero me encontré con un (bug?) problema: Gdm no arrancaba! :-(

El síntoma era: X arrancaba, parece que arrancaba de nuevo, veía el fondo "cuadriculado" en blanco y negro típico de X y el cursor de Gnome en "espera". Listo, no pasaba más de ahí. Era cuestión de hacer Ctrl+Alt+F1 y loguearse en la consola de texto. Hice un "top" y me mostraba el Gdm funcionando, pero comiéndose la CPU al 100%! No quedaba otra más que matarlo. Arrancando con el Live-CD de Ubuntu, el proceso de arranque detectaba los 1680x1050 y pude usar Gnome desde el CD como si nada.

Si volvía al xorg.conf anterior, funcionaba, pero no tenía resolución nativa. Utilizando nvidia-settings claro que podía configurar el monitor a la resolución que quería, pero setearlo a mano cada vez que iniciaba sesión no me parecía una opción. Tenía que googlear, y encontré este link. Sencillito. Fui hasta la parte de "drivers nvidia" (tengo una Nvidia 6600) y ejecuté el nvidia-settings como root, generé con el programa un xorg.conf nuevo desde ahí y restartié gdm. Ahora sí arrancaba bien, y a 1680x1050.



Pero me faltaban los efectos de Beryl (Compiz Fusion está en desarrollo todavía). Claro, el nvidia-settings sí incluye la opción de GLX, pero no incluye el Composite (creo que es necesario todavía)... bah, en realidad me generó un xorg.conf bastante limpito, y tuve que copiar/pegar algunas opciones de configuración que en su momento agregué para Beryl.

Este es el xorg.conf que me quedó, para el que lo quiera bajar.

Conclusión:
Bueh, fue un rato dando vueltas; a Ubuntu (y las distros GNU/Linux en general) les queda un poco de laburo el tema de la configuración de las resoluciones de los monitores (estamos en el 2007 y uno tiene que configurar el xorg.conf a mano...). Esperemos que en Ubuntu 7.10 Gutsy Gibbon, con este proyecto que va a estar incluído, más X.org 7.3, este problema se solucione.

(ahora, a disfrutar!)

Saludos!
Marcelo

miércoles, 11 de julio de 2007

Chusmeando SQLObject - Parte II

Continuando el post de ayer, otra desventaja del sistema de persistencia de Django es que no soporta atributos en relaciones "Muchos a Muchos". Un caso podría ser Usuario <--> Rol, donde un Usuario puede tener varios Roles y a su vez un Rol ser referenciado por varios usuarios; además, necesito almacenar si alguna combinación usuario<->rol está activa o no. El atributo booleano "activo" sería una propiedad por cada Usuario<->Rol en particular, y esto es lo que no soporta Django con su ManyToManyField.

En cambio SQLObject sí los soporta. Ejemplo:

class Usuario(SQLObject):
class sqlmeta:
tabla = 'tabla_usuario'
nombre_usuario = StringCol(alternateID=True, length=20)
roles = SQLRelatedJoin('Rol',
intermediateTable='roles_usuario',
createRelatedTable=False)

class Rol(SQLObject):
nombre = StringCol(alternateID=True, length=20)
usuarios = SQLRelatedJoin('Usuario',
intermediateTable='roles_usuario',
createRelatedTable=False)

class RolesUsuario(SQLObject):
class sqlmeta:
table = 'roles_usuario'
usuario = ForeignKey('Usuario', notNull=True, cascade=True)
rol = ForeignKey('Rol', notNull=True, cascade=True)
activo = BoolCol(notNull=True, default=False)
unique = index.DatabaseIndex(usuario, rol, unique=True)
Como se puede apreciar, al pasarle la propiedad "createRelatedTable=False" al SQLRelatedJoin, el programador puede definir por sí mismo la clase que "une" el Muchos a Muchos y agregarle atributos, como primera medida. Lo segundo es, además de crear los ForeignKey correspondientes, crear el índice de tipo 'unique' sobre los dos atributos FK, usuario y rol. Más info sobre esto acá.

No recuerdo alguna(s) otra limitación(es) tan importante(s) como éstas dos de la librería de acceso a BD de Django, pero SQLObject parece "pulenta" para desarrollos serios.

Conclusión:
TurboGears es "la competencia" de Django; en mi opinión (por lo poco que ví) en la parte de acceso a BD al incluir SQLObject, parece mucho más maduro que Django. Django no es malo, simplemente le falta madurar (más que nada en la definición de modelos). SQLObject se puede usar aparte, de hecho tiene un sitio propio y se puede utilizar de forma independiente.

Por otra parte, la librería de templates de Django es excelente, acá nos gustó mucho y de hecho lo utilizamos separado de Django en algún que otro sistema con excelentes resultados (sí, se puede utilizar aislado). No nos gustó tanto a la vista el de TurboGears, pero será cuestión de probar de forma más "seria" TG y hacer una evaluación más completa.

Saludos
Marcelo

martes, 10 de julio de 2007

Chusmeando SQLObject - Parte I

Aprovechando que el ORM en Python es noticia (ya que Canonical liberó Storm)... comento un par de desventajas del framework para acceder a BDs desde Django y cómo las soluciona SQLObject (específicamente no lo usé, pero estuve leyendo algo...)

Al momento de laburar con Django y la forma en que maneja la BD (definición de los modelos) nos encontramos dos limitaciones graves:

1) No soporte de herencia entre tablas. Es decir, si yo desde mi "mundo real" tengo que representar:

class Transporte():
modelo = ''
largo = ''
ancho = ''
patente = ''

class Auto(Vehiculo):
tiene_baul = ''

class Camion(Vehiculo):
tiene_semi = ''
No puedo representar esto en Django, ya que no soporta herencia. Por lo tanto, se puede "simular" la herencia usando relaciones "uno a uno" o copiando y pegando. Con la primera
opción caímos en varios problemas, así que tuvimos que "copiar y pegar" las propiedades que deberían haber sido heredadas.

En cambio SQLObject sí soporta herencia; y de dos maneras: usando la herencia de python o "componiendo" la herencia.

Este es un ejemplo de composición en un modelo de SQLObject:
class Transporte(SQLObject):
marca = StringCol()
modelo = StringCol()
anio = DateCol()
color = StringCol()
patente = StringCol()

class Auto(SQLObject):
transporte = ForeignKey('Transporte')
tiene_baul = BoolCol()

class Camion(SQLObject):
tiene_semi = BoolCol()
El problema con esta forma de hacerlo es que la clase "Auto" no parece terminar de heredar los atributos de "Transporte", ya que a sus propiedades heredadas hay que accederlas por medio de una propiedad. Pero esto se puede mejorar usando herencia. SQLObject tiene algunas clases que
permiten definir herencia entre clases del modelo.

b) Este es un ejemplo de herencia en SQLObject:

from sqlobject.inheritance import InheritableSQLObject

class Transporte(InheritableSQLObject):
marca = StringCol()
modelo = StringCol()
anio = DateCol()
color = StringCol()
patente = StringCol()

class Car(Vehicle):
tiene_baul = BoolCol()
Acá está el esquema de BD que genera SQLObject ("abajo del capó"):
CREATE TABLE auto (
id INTEGER PRIMARY KEY,
child_name TEXT,
tiene_baul BOOL
);

CREATE TABLE transporte (
id INTEGER PRIMARY KEY,
child_name TEXT,
modelo TEXT,
marca TEXT,
anio TEXT,
color TEXT,
patente TEXT
);
SQLObject agrega de forma "transparente" el atributo "child_name" a ambas tablas. Esta columna contiene el nombre de la tabla "hija". SQLObject utiliza esta columna para localizar y agregar el contenido de las filas correspondientes en las tablas 'auto' y 'transporte' para generar un objeto "Auto" en python de forma coherente.

SQLObject soporta varios niveles anidados de herencia simple. Herencia múltiple no está soportada (no sé si es mejor que no lo soporte).

Mañana posteo la otra "gran" dificultad que le encontramos al manejarnos con BDs en Django.

Marcelo

Créditos 1: Para algunas cosas de este post me basé en el libro de TurboGears. Está muy bueno.
Créditos 2: Imagen extraída del blog de la comunidad (brasilera o portuguesa?) de TurboGears

domingo, 1 de julio de 2007

Esto es groso... Banshee Media Server

Después de entrar en esta página, sobre un servidor web de música, dije "es medio pobre, le falta algo de diseño...pero... funcionará?"

Andá bárbaro!!! Pruébenlo.

Me imagino que no es el primero en existir, pero sinceramente me sorprendió el equipo de Banshee (un reproductor de música desarrollado en Mono). Claro que está en desarrollo, pero parece que pronto reemplazo al Amarok (esperemos, pero si no tiene Crossfading no me cambio nada eh!).

En este post hay más detalles al respecto (el sonido viene por un plugin Flash y es controlado con Javascript).

Salutes
Marcelo

Sufrís "versionitis"?

Una de las cosas que hacen estable y previsible a una distribución como Ubuntu es que una vez que fue lanzada una versión definitiva, las actualizaciones de los programas que contiene sólo se limitan a correcciones de seguridad o errores críticos. Esto está bueno, si uno quiere que todo "sólo funcione" una vez se configuró y la PC se comenzó a usar diariamente; lo mismo pasa si se usa la PC para laburar y necesita que todo ande de forma ordenada y sin sobresaltos.



Sin embargo, muchas veces uno navega por la web y lee cómo los distintos programas se van actualizando y van incluyendo funcionalidades interesantes, necesarias y hasta divertidas. Y ahí está uno para decir "yo quiero eso!"... y tiene que conformarse a esperar 6 meses por "eso". :-D

Por suerte encontré www.getdeb.net, un sitio creado por gente interesada en brindar últimas versiones de paquetes para Ubuntu (para 32 y 64 bits), muy ameno y en castellano. No estaría posteando esto si no hubiera probado ningún paquete, pero me instalé el Pidgin (ex Gaim), el último DeVeDe (programa para hacer DVDs muy sencillo), y sólo fue bajar, doble click y listo. GDebi, el programa gráfico para instalar paquetes .deb "solitarios" se encarga de todo.

El sitio está muy bien organizado (por categorías), y ni tiene paquetes "a lo loco" ni está vacío. Considero que con la cantidad que hay, está "bien", ya que un usuario nuevo no se marea (como puede pasar con el Synaptic). También tiene un feed RSS, para que lo agregue a mi Google Reader y ver todos los días qué novedades hay. Cada paquete tiene una página "propia", donde se puede ver una captura de pantalla del programa, y algún comentario de algún usuario, donde se pueden hacer preguntas o comentar inconvenientes que se tuvo al usar/instalar (no se olviden, algunas versiones son de desarrollo, o en etapa de "pruebas").

Por último, también permite "filtrar" para qué versión de Ubuntu estoy buscando paquetes (Dapper, Edgy y Feisty en sus versiones de 32 y 64 bits). Todo bastante completito, bien presentado y explicado, con el "look and feel" de las páginas web de Ubuntu.

Lo bueno es que esto acerca mucha más gente que no sabe compilar* a probar las versiones de desarrollo de los programas, involucrarse con la comunidad, y proveer feedback a los desarrolladores de software libre.

Como una de las formas de colaborar según la página de colaboración es haciéndose eco de este esfuerzo... acá está, muchachos. :-D

Gracias por el gran esfuerzo que hacen y ojalá sigan así.

* dije compilar porque es, en mi opinión, el principal obstáculo de los usuarios nuevos al querer testear o utilizar software en desarrollo.

Saludos!
Marcelo

Actualización: Instalé también el deb del nspluginwrapper para poder (por fin!) usar el Firefox de 64 bits en vez del de 32 bits (que usaba porque Adobe no lanzó todavía una versión de 64 bits del plugin de Flash)... y funciona 10 puntos, justo como dice la página:

1 -Descargar el .tar.gz desde el sitio de Adobe.
2 - Extraer el archivo libflashplayer.so a /usr/lib/mozilla/plugins/
3 - Abrir la terminal y ejecutar (como usuario, sin 'sudo'):
nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so
Aclaración: El paso 3 debe seguirse para cada usuario del sistema.

lunes, 25 de junio de 2007

Tipeando Caracteres Unicode en Gnome (II)

Tratando de probar el "truquito" que postié hace bastante pero ahora en Ubuntu Feisty, veo que si le doy al Ctrl+Alt+40 no me genera la @....

Buscando, buscando por qué, encontré esto:

http://live.gnome.org/TwoPointFifteen/ReleaseNotes

que dice:
"Use CTRL-SHIFT-u instead of CTRL_SHIFT- to generate unicode keys -- This is a change in behaviour so important to note (OlavVitters)"

O sea, que a partir de Gnome 2.16 no es más Ctrl+Shift+Código_Unicode, sino que es Ctrl+Shift+u+Código_Unicode.

Vuelvo a postear el mismo listadito del post viejo, modificado. :-D

Control+Shift+u+40 = @
Control+Shift+u+E1 = á
Control+Shift+u+E9 = é
Control+Shift+u+ED = í
Control+Shift+u+F3 = ó
Control+Shift+u+FA = ú
Control+Shift+u+B0 = °
Control+Shift+u+BA = º
Control+Shift+u+F1 = ñ
Control+Shift+u+D1 = Ñ
Control+Shift+u+FC = ü
http://www.unicode.org/

Saludos
Marcelo

viernes, 15 de junio de 2007

Cafelug: Primer Charla Técnica Trimestral de 2007

Buenas... Sólo paso a reproducir el aviso de las próximas CTT de Cafelug.... y es muy probable que vaya, las charlas de alta disponibilidad, asterisk y la de videos parecen interesantes (más que nada porque no investigué nada en profundidad al respecto). Ya he ido a una el año pasado y los flacos son muy copados, uno se siente muy a gusto con "gente como uno" asistiendo, debatiendo y aprendiendo cosas.

El Sábado 30 de Junio se va a llevar a cabo la primer CTT (Charla Técnica Trimestral) del año 2007. El evento es de entrada libre y gratuita y se va a desarrollar en el auditorio de la Facultad de Ingeniería de la Universidad de Palermo, ubicada en Mario Bravo 1050.

El cronograma para el dia del evento, es el siguiente:

10.00-11.30 - Alta disponibilidad en Fedora - Nicolas Corrarello
11.30-13.00 - Asterisk - Juan Sacco (runlvl)
13.00-14.00 - Pausa para almuerzo
14.00-15.30 - PyGTK - Javier Derderian
15.30-16.30 - Libera tus videos - Leandro Monk
16.30-18.00 - Usando señales de Unix con Perl - Matias Palomec

Para asistir, es NECESARIO registrarse haciendo click acá.

Sitio de Cafelug: http://www.cafelug.org.ar

Saludos!
Marcelo

jueves, 14 de junio de 2007

Software de Profiling

Buenas... leyendo este post sobre cómo se analizó el comportamiento a bajo nivel en el algoritmo de renderizado del Flash Player , me interesé sobre las herramientas que nombra y utiliza:

  • Code Analyst de AMD (recomendado para hacer Profiling sobre micros AMD).
  • VTune de Intel (ídem para Intel).
En el caso del Code Analyst, está disponible para Linux y Windows (x86 y x86-64), y está disponible su código fuente (dice que es "open source", no encontré bajo qué licencia). Estuve chusmeando las diapositivas estas, la verdad que me sorprendió gratamente que exista este tipo de herramienta (digo, que parece ser de calidad, además de abierta y gratuita).

El soft de Intel no me interesó porque enseguida vi que es cerrado y sale U$S 699 (y además, para qué si la misma gente de Adobe ex-Macromedia usa el de AMD?). La competencia es buena para el consumidor...

Obviamente que existen muchísimas herramientas como éstas, para diversos lenguajes (Netbeans tiene para Java un profiler que es bellísimo), pero considero que si uno está laburando con código en C, buscando el máximo de performance, el CodeAnalyst puede servir. Lo anoto en mis apuntes por si algún día lo necesito.

Sólo mis 2 ctvs.
Marcelo
PD: Imagen extraída de esta URL. Gracias Rob! (La imagen está bajo la licencia CC: Attrib-NoComm-ShareAlike)