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.