Archivo

Archivo para julio, 2007

Chusmeando SQLObject – Parte I

martes, 10 de julio de 2007 Sin comentarios

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

Categories: codear, programación, python Tags:

Esto es groso… Banshee Media Server

domingo, 1 de julio de 2007 Sin comentarios

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

Categories: codear, programación, web Tags:

Sufrís «versionitis»?

domingo, 1 de julio de 2007 2 comentarios

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». 😀

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. 😀

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.

Categories: codear, linux, ubuntu-ar Tags: