Archive for February, 2008

Descubriendo la metadata de una tabla (postgreSQL)

Monday, February 25th, 2008

Mientras desarrollaba una idea de un ORM básico para PHP que auto-descubriera la metadata de una tabla (tal y como se hacen en mySQL con “DESCRIBE”), me encuentro con el problema de que en postgreSQL no existe nada parecido a DESCRIBE o a SHOW CREATE de mySQL; por ende, nos toca interrogar a los pg_catalogs para obtener la información de metadatos de la tabla.

En este caso, queriamos obtener una estructura semejante a esta:

column_name => cedula, datatype=>integer, key=>PRI, is_nullable=>NO, max_length=>8, column_default =>

Donde:

datatype: es un tipo de datos interno de postgresql

key: UNI = Unique, el campo es un indice unico, PRI = Primary, el campo es un indice primario, FK = Foreign key, el campo es un indice de una clave foránea.

max_length: Si el campo es integer, muestra la precisión del entero (2,4,8), si es un varchar, la longitud en caracteres (ej. 75)

column_default: muestra el tipo de valor por defecto de la tabla; si la tabla es serial, veremos la llamada al nextval de la secuencia:

ej. nexval(’personas_cliente_id_seq’::regclass)

Lo que nos permite determinar que campo de nuestra tabla es serial (auto-incremental).

Entendiendo los esquemas: 

Para entender; cada tabla del pg_catalog debe ser interrogada con el oid de la tabla, que lo sacamos de pg_class.

Los campos y sus atributos, los sacamos de la tabla pg_attribute.

El tipo de datos lo sacamos de la tabla pg_type

los constraints de la tabla los obtenemos de la tabla pg_constraint

y el valor por defecto, lo sacamos de la tabla pg_attrdef.

La sentencia construida para sacar esa información de una sola vez de todas las tablas es esta:

SELECT a.attname as column_name, t.typname as data_type,
CASE
WHEN cc.contype=’p’ THEN ‘PRI’
WHEN cc.contype=’u’ THEN ‘UNI’
WHEN cc.contype=’f’ THEN ‘FK’
ELSE ” END AS key,
CASE WHEN a.attnotnull=false THEN ‘YES’ ELSE ‘NO’ END AS is_nullable,
CASE WHEN a.attlen=’-1′ THEN (a.atttypmod - 4) ELSE a.attlen END as max_length,
d.adsrc as column_default
FROM pg_catalog.pg_attribute a
LEFT JOIN pg_catalog.pg_type t ON t.oid = a.atttypid
LEFT JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
LEFT JOIN pg_catalog.pg_constraint cc ON cc.conrelid = c.oid AND cc.conkey[1] = a.attnum
LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND a.attnum = d.adnum
WHERE c.relname = ‘<TABLA>’ AND a.attnum > 0 AND t.oid = a.atttypid

donde <TABLA> representa el nombre de la tabla a la que queremos interrogar para obtener sus metadatos.

Espero que les sirva; en la siguiente entrega, descubrir los metadatos de una tabla de mySQL y de una entrada de LDAP.

Mi más sinceras condolencias

Friday, February 22nd, 2008

Desde aquí me uno al duelo que a Alvaro (esposo de Inés Macias) y la gente del Distrito Tecnológico PDVSA Mérida (donde trabajé todo el año pasado) siente por la pérdida de Inés (trabajadora de PDVSA), gran amiga y colega, que viajaba en el fatídico vuelo 518 de Santa Bárbara Airlines que se precipitó a tierra el día de ayer.

Una foto del YV1449 cortesía de la ASN (http://aviation-safety.net/photos/displayphoto.php?id=20080221-0&vnr=1&kind=PC)

Dicho avión volaba desde Mérida con destino a la ciudad de Caracas; pero su rumbo fue cortado por causas desconocidas y cayó sobre el páramo los Conejos (famoso páramo, lo visito casi todos los años) a la altura de la laguna “La perlada” en El Pico El Aguila; Estado Mérida.

Más información del siniestro aquí: http://aviation-safety.net/database/record.php?id=20080221-0

En dicho avión tambien viajaban unos amigos desarrolladores que tenian una empresa de sistemas en Caracas; entre ellos Hugo Farfán, que tuve el placer de conocerlo alguna vez; paz a sus restos.

Para las víctimas y sus familiares no es momento de estar en actitudes conspirativas (como la periodista que se le ocurrió preguntarle a un familiar de una víctima si le parecía raro la gran cantidad de accidentes aéreos ocurridos este mes; en un momento así, saber de mi familia es lo que más me importa, no que se estén cayendo los demás aviones; tengamos un poco de humanidad con las vícimas por favor).

Sin embargo, cabe resaltar que según la ASN (Aviation Safety Network) se eleva a 4 la cantidad de accidentes aéreos reportados en lo que va de mes, solo en aerolíneas comerciales privadas (eso es más que la cantidad de accidentes de todo el año 2007 y 2006 juntos).

De hecho el ATR42 (de fabricación franco-italiana) es un avión creado para cruzar los Alpes (no creo que se pueda culpar al clima de este siniestro); es un avión extremadamente seguro (aunque los que hayan volado en ellos; como yo, los consideren una gelatina con alas) y este se considera el peor siniestro de un ATR42 en la historia de la aeronave; este vuelo, de hecho, se convierte en el que más pérdidas de vidas ha causado (el anterior fue un siniestro en Marruecos, cuando el piloto intencionalmente estrelló su avión contra las montañas Atlas, causando la muerte a las 44 personas a bordo).

Siempre en estos momentos de frustración y pérdida corren muchas hipótesis; una de ellas que me pregunto es ¿como es posible que un avión choque una pared montañosa a 3600mts sobre el nivel del mar; en un punto del vuelo donde debería estar a 18000 pies (unos 5500 mts de altura) y nadie en control de tráfico en Mérida pudiera determinar el status del avión?; como es posible que los medios de comunicación se enteraran del siniestro porque los pobladores llamaron al SAR (Servicio Autónomo de Rescate)?; el control de tráfico de Valera se hicieron “los locos” cuando no recibieron el contacto del YV1449 y se fueron a tomar café?; muchas cosas ocurren y creo que lástima que sea por un accidente aéreo de esta escala; pero que deben ser respondidas.

Recuerdo una anécdota cuando venía en un vuelo Maiquetía - Barquisimeto de Avior Airlines que fue devuelto a Maiquetía por mal tiempo en Barquisimeto y (por lo que el piloto nos dijo) no habia control de tráfico en Barquisimeto.

Solo quisiera que las cosas fuera respondidas y además de esclarecer los hechos se compense a las personas afectadas.

Mis más sinceras condolencias a todos los afectados y a las víctimas, paz a sus restos …

Se necesita mucha maquina para Linux? (II Parte)

Thursday, February 21st, 2008

Como lo prometí; le he instalado el controlador nvidia para X.org y posteriormente he instalado compiz-fusion a mi escritorio gnome; lo he ejecutado en modo renderizado directo (ostia! es una Nvidia FX, para que montar AIGLX?) y he agregado algunas opciones de tunning y de performance que permiten una mejor ejecución tanto del driver nvidia como del compiz-fusion en gnome:

Instalando Nvidia:

Despues de instalar el NVIDIA driver descargable de la página de nvidia; he procedido a editar el /etc/X11/xorg.conf para agregar algunas opciones de “Tunning”:

Section Device:

Section "Device"

Identifier      "nVidia Corporation NV43"

Driver          "nvidia"

Option          "TwinView" "true"

Option          "RandR" "Enable"

Option          "XAANoOffscreenPixmaps" "true"

Option          "AddARGBGLXVisuals"     "true"

Option          "AllowGLXWithComposite" "true"

Option          "RenderAccel" "true"

Option          "BackingStore" "true"

Option          "MetaModes" "1600x1200,1600x1200; 1280x1024,1280x1024"

Option          "SecondMonitorHorizSync" "31-80"

Option          "SecondMonitorVertRefresh" "56-76"

Option          "TwinViewOrientation" "RightOf"

Option          "IgnoreEDID" "1"

Option          "NvAGP" "3"

EndSection

En este caso, hay algunas opciones como “BackingStore” que realmente mejoran el dibujado de las pantallas; además he cargado las 3 extensiones que requiere para funcionar el compiz en modo renderizado directo:

Section “Extensions”
Option “Composite”      “Enable”
Option “RENDER”         “true”
Option “DAMAGE”         “true”
EndSection

Bueno, en fin, he puesto a funcionar (sin mucho trabajo) el compiz-fusion en esta máquina.

Testing Compiz-Fusion (y el resto de cosas):

Ok, vamos a ponernos “Exigentes!”; no solamente tengo Compiz-fusion cargado en mi PC (con la ventaja de tener rendering directo, el dibujado de ventanas lo está haciendo la GPU de mi NVIDIA y no la CPU); sino que además con mi “prueba de stress” tengo cargados:

pantallazo-1.png

2 Consolas (una con vim abierto, de donde saqué las opciones de nvidia)

Amarok levantado (para los que dicen que es el player más pesado) ejecutando otro mp3 de mi disco portable, esta vez “Amy Winehouse - Rehab”; no se puede trabajar sin escuchar música!

Un especial sobre la Iglesia Católica en “The History Channel” en TV Time

Una sesión de Inkscape (editor vectorial, tipo Adobe Illustrator) que estoy haciendo unos graficos para el trabajo

Una sesión de OpenOffice (leo un documento sobre “La problemática del Desarrollo Sustentable”) ayudando a una amiga

Sigo cargando Gimp con mis amadas “Mediaeval Baebes” (por hacer bulto en la RAM)

2 Le sumo 2 ventanas de Firefox (una con este blog, otra con mi cuenta de last.fm y facebook) (puro Ocio)

Y el aMSN (para conectarme con los panas!, una versión en TCL/tk del cliente de MSN Messenger) (más Ocio aun)

Como verán, el CPU ahora si está al máximo (pero claro, sigue en modo ondemand); el consumo (como se esperaba) de RAM ha subido notablemente (aunque no creo que nadie trate con tanto stress una máquina); lo más interesante es mi cantidad de RAMcon  disponible:

total           used           free         shared      buffers     cached
Mem:       2076688    2012564     64124      0              30524      1530720
-/+ buffers/cache:      451320      1625368
Swap:      1052216     0                1052216
Con tantas cosas abiertas; aun me quedan 64 MB de RAM disponibles!, nada de SWAP usado; nada de PageFile.sys!, nada de comprarse pen drives de 4GB y usarlos de SWAP; nada de costosos equipos con RAM DDR3 super-puyada!; esta es una PC que tiene conmigo cerca de 3 años, solo 2GB de RAM (y PC400, nada de DDR2 y esas cosas caras); y fiel como nunca!, trabaja a las mil maravillas (y sin ralentizarse o ponerse “boba” porque hagas cosas extrañas como esta:

pantallazo-2.png

Jojojo!, Viendo TV desde el efecto Cubo de Compiz!, y la máquina como si nada!; quiero ver un cacharrito de estos corriendo Windows Vista+Aero a ver si tiene tal desempeño …

Creo que esta entrega PRUEBA de plano la potencia y las capacidades de Linux para un escritorio adecuado para el usuario común; ¿que yo hago trampa porque hago “tunning” a mi debian o a mi fedora?, perfectamente válida razón!; pero para eso existe Sabayon Linux; una distribución que ya viene “tuneada” de fábrica; dedicada a usuario final (hasta trae compiz-fusion y otros detalles interesantes, como kernel y arranque optimizado y aplicaciones compiladas para ser oṕtimas al 100%) y me imagino que deben existir otras más; solamente hace falta buscar o tener a alguien cerca que pueda hacer estos cambios por tí (como siempre, como usuario final tienes a alguien cerca para instalarte una antiwirus o un antimalware, antivaporware, antidoñaware y todos esos anti que MS Windows necesita tener).

En la tercera entrega; cuando termine de instalar mis herramientas de desarrollo (apache2, mySQL 5, postgreSQL 5, PHP5, mod_perl2, Eclipse PDT y Komodo Editor); me dedicaré a hacer este mismo test; probando que Linux tambien es una buena estación de trabajo para desarrolladores.

Happy Hacking!