miércoles, 27 de junio de 2007

INSERT ... RETURNING y Conociendo el valor insertado en PostgreSQL

Algunas veces nos topamos con la necesidad de recuperar un cierto valor despues de una insercion en postgresql, como puede ser el valor asignado a un id de forma automatica mediante nextval o alguna valor seteado manualmente. A continuación muestro las diferentes formas para lograr esto sin un maximo de esfuerzo:

Supongamos que tenemos creadas la secuencia: clientes_id_seq y la usaremos dentro de una inserción.


INSERT INTO clientes (id, nombre, telefono)
VALUES (nextval('clientes_id_seq'), 'Juan Pérez','3455-6678');


Para conocer el id insertado podemos usar la funcion: currval() de la siguiente forma:


select currval('clientes_id_seq');


Otro metodo alternativo, y sobre todo cuando no manejamos secuencias es emplear INSERT RETURNING cuya sintaxis es la siguiente y que solo esta disponible en las versión 8.2 de PostgreSQL:

INSERT INTO clientes (id, nombre, telefono) values (5,'Juan Pérez','3455-6678') RETURNING id;

Tal vez aqui no se note la importancia del insert returning pero si el insert es dinamico mediante un script en algun lenguaje de programación la utilidad salta a simple vista.

Habilitar o desabilitar Triggers en PostgreSQL

Existen diversas formas para habilitar o desabilitar los triggers en postgresql, sobre todo de version a version.

A continuacion se muestran ejemplos en diferentes versiones.

Para PostgreSQL 8.1 o posterior es muy simple, solo basta con:


ALTER TABLE nombre_tabla ENABLE/DISABLE TRIGGER mi_trigger;


La cosa se complica con versiónes anteriores a la version 8.0 ya que tenemos que modificar los catalogos del sistema, como se muestra a continuacion:

Desabilitarlos

UPDATE pg_catalog.pg_class SET reltriggers = 0 WHERE oid = 'nombre_tabla'::pg_catalog.regclass;

Habilitarlos

UPDATE pg_catalog.pg_class SET reltriggers = (SELECT pg_catalog.count(*) FROM pg_catalog.pg_trigger WHERE pg_class.oid = tgrelid) WHERE oid = 'nombre_tabla'::pg_catalog.regclass;

Y eso es todo por el momento, saludos.

martes, 26 de junio de 2007

Ejemplo de frontend para el comando WHOIS en PHP y Linux con exec()

El uso de la instrucción exec() de PHP es muy poderoso y peligroso ya que mediante dicha funcion es posible accesar al sistema operativo del servidor en donde esta instalado PHP.

El siguiente ejemplo en PHP muestra como hacer una interfaz de usuario sencilla para el cliente WHOIS en sistemas LINUX o UNIX y es una implementación muy sencilla que muestra el uso de la instrucción exec() de PHP que como su contraparte en Lenguaje C o Perl realiza la misma acción.


<html>
<head><title>Whois Frontend</title></head>
<body>
<form name='whois' action="" method="POST">
<table>
<tr>
<td>Dominio a Consultar:</td>
<td><input type="text" name="fqdn" value="google.com" size="30"> <input type="submit"></td>
</tr>
</table>
</form>
<?php
// Con este bucle creamos las variables dinamicamente enviadas mediante POST y asi no es necesario
// escribirlas una o una, aunque en este ejemplo es trivial ya que se usa una sola variable fqdn existiran
// programas en la vida real que manejen cientos de variables simultaneamente.
foreach ($_POST as $clave => $valor)
$$clave= $valor;

$comando= "whois $fqdn";

exec($comando, $res);

echo "<pre>";
foreach($res as $line)
echo $line."<br>";
echo "</pre>";

?>
</body>
</html>

lunes, 25 de junio de 2007

Acentos en PHP, PostgreSQL y Apache 2

Es muy facil toparnos con problemas a la hora del despliegue de información con los caracteres latinos como el acento, las dieresis, las ñ, etc. El problema es debido a la codificación estandar en ambientes Linux que es UNICODE o UTF8 como tambien le llaman. Aunque el manejar UNICODE es una gran ventaja por el almacenamiento multilingüe, aveces parece todo lo contrario ya que la codificación estandar en windows es ISO-8859-1 al menos para America Latina y otros paises que manejan el español como lengua predeterminada.

Aqui la solución es configurar nuestro soporte para ISO-8859-1 en PostgreSQL, Apache y PHP para que nuestras aplicaciones web y bases de datos manejen el mismo charset.

Para habilitar dicho charset en PHP es muy simple, solo basta con editar el archivo php.ini almacenado dentro de /etc en la mayoria de las distribuciones linux y descomentar la linea como se muestra a continuación:

default_charset = "iso-8859-1"

Para habilitar ahora el soporte en Apache basta con editar el archivo httpd.conf o alguno relacionado segun la distribución, en mi caso en ubuntu seria el archivo /etc/apache2/apache2.conf

y descomentar la linea siguiente como se muestra a continuación:

AddDefaultCharset ISO-8859-1

ya por ultimo solo nos faltaria crear nuestra base de datos usando el tipo de codificación latina como se muestra a continuación:

createdb -U postgres --encoding=Latin1 --owner=propietario mibasededatos

Ya con esto tenemos funcionando nuestro servidor web y nuestra aplicación con acceso de datos en ISO-8859-1.

Arrancar EMACS en modo consola dentro de XTERM

Para poder trabajar con emacs desde una consola sin ejecutar automaticamente el xemacs, esto es que se abra el editor emacs en modo terminal como cuando estamos dentro de alguna TTY solo basta con redirigir el modo grafico con el siguiente comando desde el shell:

$ export DISPLAY=

Y listo, emacs ya no se abrira en una ventana por separado, sino dentro de la terminal.

Pasos a seguir para modificar el charset interno (UTF8 a ISO-88591) del cluster de postgresql en ubuntu.

Primero se preguntaran ¿para que cambiarlo?, ¿que gano?, bueno, pues lo mismo pensaba yo, hasta un infortunado dia que necesite usar la funcion upper incorporada dentro de postgresql en un trigger y me di cuenta que la letra acentuada aparecia en minuscula y las demas letras aparecian bien en mayusculas y lo mismo pasaba con las ñ y las dieresis ö, pues bien, lo primero que se me ocurrio es ver si se trataba de un bug o solo era problema mio de configuración. Pues bien mande un correo a la lista de postgresql y el buen Alvaro Herrera me confirmo que en su sistema trabajaba bien la funcion upper y lower, asi que descarte el problema del bug, hice pruebas y me di cuenta que con Unicode si trabajaba bien dicha funcion pero no con ISO-8859-1 entonces otro buen compañero de la lista de nombre Alejandro Gasca me comento que los locale podrian estar mal configurados.

Como muchos sabran ubuntu emplea casi para todo UTF8 y ahi estaba el problema, pues despues de mucho googlear y de investigar me tope con el comando locale -a que muestra los charset instalados en el sistema y me di cuenta que por ningun lado aparecia ISO-8859-1.

Pues segui googleando y me tope que era muy facil agregar dicho charset, solo bastaba con editar el archivo /var/lib/locales/supported.d/es y agregar el siguiente texto en una nueva linea:

es_MX.ISO-8859-1 ISO-8859-1

Guardamos cambios y generamos la nueva lista de charsets con:

locale-gen

y listo, ya tenia la codificación ISO-8859-1 en mi sistema con ubuntu, ahora seguia lo bueno, reconstruir el cluster de postgresql, que como todos sabemos viene preempacado en ubuntu y se instala solito, tal como esta. Pues aqui tienen los pasos y espero que les funciona como a mi.

1.- Respaldamos todas las bases si existen ;)

2.- Paramos el ORDBMS Postgresql con:
/etc/init.d/postgresql-8.2 stop

3.- Nos ubicamos en el directorio de datos del cluster:
cd /var/lib/postgresql/8.2

Un leve vistazo mediante ls -alF en el directorio pgdata nos damos cuenta que es un vinculo simbolico :( y que apunta a la ruta antes citada.

4.- El directorio "main" contiene el cluster de la base de datos con codificación UTF-8, el directorio main lo renombramos para tener un punto de restauración si algo falla.

mv main main.old

5.- Creamos un nuevo directorio main para que el script de inicio de ubuntu ni lo note ;)

mkdir main

y cambiamos al propietario de dicho directorio con:

chown -R postgres.postgres main

6.- Ejecutamos initdb que en ubuntu feisty-fawn esta en: /usr/lib/postgresql/8.2/bin/ y ya con el nuevo charset ISO-8859-1

su postgres -c '/usr/lib/postgresql/8.2/bin/initdb -U postgres --locale=es_MX.ISO88591 --encoding=Latin1 --lc-collate=Latin1 -D /var/lib/postgresql/8.2/main'

7.- Ya por ultimo creamos las ligas simbolicas server.crt, server.key y root.crt necesarias para nuestro guion /etc/init.d/postgresql-8.2 de nuestro ubuntu.

ln -s /etc/postgresql-common/root.crt root.crt
ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key server.key

8.- Y listo, iniciamos nuevamente el servicio de postgresql y somos muy felices porque ya tenemos nuestro postgresql configurado con el charset ISO-8859-1.

/etc/init.d/postgresql-8.2 start

Saludos a todos :)

Importar datos externos a nuestra base de datos PostgreSQL mediante COPY

Algo muy importante en nuestra base de datos, es sin duda eso, los datos, ¿que hariamos sin ellos?, ¿que proposito tendria entonces tener una base de datos?

Muy bien, nuestra base de datos ya esta creada, tenemos un esquema relacional perfecto y tenemos normalizadas las tablas, ahora necesitamos poblar dichas tablas, pero no escribirlas de una en una.

Supongamos que la información la conseguimos en formato digital o es información almacenada en un archivo de hoja de calculo o algo por el estilo.

Aqui necesitamos primero que nada un formato estandar para poder mover la información de un formato propietario (por ejemplo excel, xls) a nuestras tablas de la base de datos, en este caso las tablas creadas previamente en postgresql.

Ese formato estandar se llama "CSV" o valores separados por comas.

Veamos un ejemplo de un archivo en excel que contiene algunos de los codigos postales de la Ciudad de México.

Archivo: CodigosPostalesMexicanos.xls



Pues bien, este archivo de excel lo queremos insertar dentro de nuestra base de datos ahora el problema es como lo hacemos. Lo bueno es que la solución es muy facil, simplemente lo guardamos como archivo de texto separado por comas o CSV y a continuación lo abrimos con un editor de texto y eliminamos todo lo que no tenga que ver con la información que vamos a importar, como por ejemplo encabezados de columna, etc.

Archivo: codigos_postales.csv


"d_codigo","d_asenta","d_tipo_asenta","D_mnpio","d_estado"
"01000","San Angel","Colonia","Alvaro Obregon","Distrito Federal"
"01010","Los Alpes","Colonia","Alvaro Obregon","Distrito Federal"
"01020","Guadalupe Inn","Colonia","Alvaro Obregon","Distrito Federal"
"01028","Secretaria de Contraloria y Desarrollo Administrativo","Gran usuario","Alvaro Obregon","Distrito Federal"
"01029","Infonavit","Gran usuario","Alvaro Obregon","Distrito Federal"
"01030","Axotla","Pueblo","Alvaro Obregon","Distrito Federal"
"01030","Florida","Colonia","Alvaro Obregon","Distrito Federal"
"01040","Campestre","Colonia","Alvaro Obregon","Distrito Federal"
"01048","Las Aguilas","Unidad habitacional","Alvaro Obregon","Distrito Federal"


Si notan la primera linea contiene el encabezado que aparecia en excel, es muy importante eliminar esa o las lineas que no sean necesarias para evitar errores a la hora de importarlas, y quedaria asi:


"01000","San Angel","Colonia","Alvaro Obregon","Distrito Federal"
"01010","Los Alpes","Colonia","Alvaro Obregon","Distrito Federal"
"01020","Guadalupe Inn","Colonia","Alvaro Obregon","Distrito Federal"
"01028","Secretaria de Contraloria y Desarrollo Administrativo","Gran usuario","Alvaro Obregon","Distrito Federal"
"01029","Infonavit","Gran usuario","Alvaro Obregon","Distrito Federal"
"01030","Axotla","Pueblo","Alvaro Obregon","Distrito Federal"
"01030","Florida","Colonia","Alvaro Obregon","Distrito Federal"
"01040","Campestre","Colonia","Alvaro Obregon","Distrito Federal"
"01048","Las Aguilas","Unidad habitacional","Alvaro Obregon","Distrito Federal"


Ya hecho lo anterior lo guardamos y procedemos a crear la tabla en nuestra base de datos postgresql como se muestra a continuación:


\d codigos_postales
Tabla «public.codigos_postales»
Columna | Tipo | Modificadores
-------------------+------------------------+---------------
cp | character(5) |
asentamiento | character varying(255) |
tipo_asentamiento | character varying(120) |
municipio | character varying(120) |
estado | character varying(120) |


La forma de crear el esquema anterior es muy simple ya que utiliza SQL estandar y en postgres quedaria como sigue:


CREATE TABLE codigos_postales (
cp char(5),
asentamiento varchar(120),
tipo_asentamiento varchar(120),
municipio varchar(120),
estado varchar(120)
);


Ya lo unico que nos falta es poblar dicha tabla con el comando COPY y CSV. Pues manos a la obra, y queda asi:

COPY codigos_postales FROM '/tmp/codigos_postales.csv' DELIMITERS ',' CSV;

Recordemos que el comando COPY lo escribimos dentro de psql y que el propietario del archivo codigos_postales debe de poder ser leido por el usuario postgres en cuestion, en unix con un simple chmod 644 /tmp/codigos_postales.csv quedaria para poder ser leido por el postmaster de postgresql. Otra cosa importante a notar es que el unico que tiene permiso para hacer esta importación es el usuario postgres y debe de tener tambien permiso de lectura sobre el directorio en cuestion, en este caso /tmp. En windows la ruta del archivo es sustituida por la ruta correspondiente en Windows, por ejemplo "c:\temp\codigos_postales.csv".

Esta forma de importación es muy importante sobre todo cuando queremos migrar datos entre distintas plataformas o bases de datos que no nos ofrezcan alguna herramienta de migración mediante acceso a datos como ADO, ODBC, etc. O si lo que queremos es importar datos de archivos estadisticos o de excel.

Si ahora lo que queremos es crearle una llave primaria a la tabla codigos postales, lo que podemos hacer es jugar un poco con los datos de la siguiente forma:

ALTER TABLE codigos_postales add column id serial;

Con esto logramos crear una columna nueva de nombre "id" y es de tipo serial que ademas de ser un tipo entero tambien crea una secuencia implicita para poder incrementar el id de cada registro de una forma facil y segura.

ahora necesitamos poblar ese campo id si es que postgresql no le asigno ya un numero, seria de la siguiente forma: UPDATE codigos_postales SET id = nextval('codigos_postales_id_seq');

Ya nadamas nos falta aplicar la restriccion de llave primaria y eso lo logramos con: ALTER TABLE codigos_postales ADD PRIMARY KEY (id);

Y con esto terminamos nuestro ejemplo de importación mediante CSV con el comando COPY.

Crear, alterar o reiniciar una secuencia en PostgreSQL

En postgresql como en oracle para poder generar un numero unico facilmente necesitamos de lo que se conoce como secuencia. Para los usuarios de MySQL esto es algo nuevo ya que en mysql para un campo numero autoincrementable solo basta con poner null, aqui necesitamos algo mas de trabajo pero sin duda tener una secuencia es algo muy poderoso.

Para poder crear una secuencia en postgresql nos valemos del comando create sequence, y como un ejemplo vale mas que mil palabras, pues aqui tenemos el ejemplo completo.


Creando la secuencia serie:

Ya dentro del monitor psql tecleamos:


CREATE SEQUENCE foo start 100;


Si queremos borrarla, basta con hacer DROP SEQUENCE foo; y si lo que queremos es reiniciarla a un valor lo podemos hacer de dos formas.

La primera es mediante la función setval que se emplearia de la siguiente manera: SELECT setval('foo',1500,'t');. Si lo que queremos es reiniciarla para que empieze nuevamente desde el primer valor en este caso podemos borrarla o reiniciarla de la siguiente forma: ALTER SEQUENCE foo restart 1;

Con esto damos un primer vistazo a las secuencias que seran parte fundamental para el manejo de llaves primarias.

domingo, 24 de junio de 2007

Registrar el lenguaje PL/PGSQL

Aveces con el uso cotidiano de postgresql nos surge la necesidad de poder usar funciones, procedimientos almacenados o triggers dentro de nuestra base de datos pero casi siempre al menos en linux el soporte para plpgsql necesita habilitarse.

Pues aqui tienen los pasos para registrar el buen lenguaje PL/PGSQL similar al PLSQL de Oracle.

Como usuario Postgres efectuamos los siguiente en el bash o interprete de comandos:

$ createlang plpgsql template1

Asi ya queda generado en la plantilla principal y aplica a todas nuestras bases de datos. O si lo que quieren es crear el lenguaje en una base de datos que ya tengan es la misma sintaxis, solo que en vez de template1 sera el nombre de la base que usen, por ejemplo:

$ createlang -U postgres plpgsql mibasededatos

Aqui el operador -U le indica al comando que se conecte con la base de datos como usuario postgres.

Saludos...

Cambiar el password de un usuario en postgresql

Para poder asignarle un password a un usuario o incluso cambiarlo en la base de datos PostgreSQL solo necesitamos realizar los siguientes pasos:

1. Nos convertimos en usuario root, en linux por supuesto, aunque en windows tambien funciona no hay como postgresql en linux.

$ su root

2. Ahora nos convertimos en el usuario postgres que es el administrador del gestor relacional.

# su postgres

Ya por ultimo entramos al monitor de psql en la base de datos principal "template1"

$ psql template1

y aqui dentro escribimos:

alter user nombre_usuario with encrypted password 'password';

y listo, asi podemos cambiar nuestras contraseñas las veces que queramos en PostgreSQL.

Entre el cielo y el infierno

Esta es una copia de mi archivo motd de mi sistema y un poco de ascii art :)

Linux geminis 2.6.15-26-686 #1 SMP PREEMPT Thu Aug 3 03:13:28 UTC 2006 i686 GNU/Linux


..............
................
....................
....::.... ....
....::::::::..
....::;;;;ii;;::::
..........::::........::::;;iittttii;;::..
....::::,,,,;;;;;;;;;;;;;;;;iittjjLLLLLLjjtt;;::..
....::::;;iiiittttttttttttttttttttffLLGGDDGGLLjjtt;;::..
..::::iittLLLLGGGGDDDDDDDDGGGGGGGGGGGGDDWWWWEEDDGGfftt;;::..
....,,iittLLDDWWWWWWWW##WWWWWWWWDDDDDDDDWWWWWWWWWWDDGGjjtt,,::..
..::iittGGDDWW##################WWWWWWWWWWWWWWWWWWWWDDGGffii;;::..
..::;;ttffGGWW######################WWWWWWWW########WWWWDDLLjjii::..
..,,iijjLLDDWW######################WWWWWWWWWWWWWWWWWWWWDDGGLLttii::..
..::;;iijjLLGGDDWW##################WWWWWWWWWWWWWWWWWWWWWWDDGGLLjjii;;::..
..::;;iijjLLGGDDDDWWWW##########WWWWWWWWWWWWWWWWWWWWWWWWWWDDGGLLjjttii::::
....::iiiijjLLLLGGDDDDWWWWWWWWWWWWWWWWWWWWDDDDDDDDWWWWWWWWWWDDGGLLffttii,,::..
..::::iittjjffLLGGDDDDWWWWWWWWWWWWDDDDDDDDDDDDDDDDDDWWWWDDDDDDGGLLjjttii;;::....
..::::iittjjLLLLGGDDDDWWWWWWWWWWWWDDDDDDDDDDDDDDDDDDEEDDDDDDDDGGLLjjttii;;::::..
..::,,iittffLLLLGGDDDDWWWWWWWWWWWWWWDDDDDDDDDDDDDDWWWWWWDDDDDDGGLLffttttii;;::..
..::,,iijjLLLLGGGGDDDDWWWWWWWWWWWWWWWWDDDDDDDDDDWWWWWWWWWWEEDDDDGGLLjjttii;;::..
..::,,ttjjLLLLGGGGDDKKWWWWWW##WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWDDGGGGLLjjttii::::..
..::,,ttjjLLLLGGDDDDEEWWWWWW######WWWWWWWWWWWWWWWWWWWW##WWWWWWWWDDGGLLLLttii;;::..
..::;;ttjjLLGGGGDDDDDDWWWWWW########WWWWWWWWWWWWWWWW######WWWWWWDDDDGGLLjjtt;;::..
..::iittjjLLGGGGGGDDDDDDWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWDDDDGGLLffttii;;....
..::iittjjLLGGGGGGGGDDDDDDDDWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWDDDDGGGGGGLLffjjttii::..
..::iittjjLLGGGGGGGGGGGGGGGGGGDDDDDDDDDDDDDDDDDDDDDDDDDDGGGGGGGGGGLLLLLLttttttii,,::
..::;;iittjjffffffffffffffffLLLLLLLLLLLLGGGGLLLLGGGGLLLLLLLLLLffjjjjttttttiittii;;::..
..::,,;;iiii;;;;;;;;;;;;iiiiiiiiiittttttttjjttttttttttttiiiiii;;,,::;;;;iiiiiiii;;::..
..::::,,::::::::::::::::::::::::,,;;;;iiiiiiiiiiii;;;;;;,,::::::::......::::::::::::..
..::::::::::::........ ........::::::::;;;;;;;;,,::::........ ............
..::::::::.......... ......::::::::;;;;,,::......
..::::.... ....::::iiii,,::..
..::::.... ..::,,iiii;;::..
..::.... ..;;;;ttttii::..
..::.... ::iittLLfftt,,..
..::::.. ..::ttLLDDGGjj;;::
..::::::.. ..;;ttGGDDDDLLii::
..::;;::::.... ..,,iiffDDWWDDLLtt;;..
..,,ii;;::::::.. .. ......::::iiiiLLDDWWEEGGttii,,.. ......
..::;;iiii;;;;,,,,..::::::::::::;;iiiiiijjGGDDWWDDGGjjttii;;::::........ ............::,,::..
..::;;iittiiiiii;;;;;;,,;;;;;;iiiiiiiittLLGGDDWWDDGGLLttiiiiii;;::::::::......::::::::;;ii;;::
..::;;iittttttttttttttttjjjjjjjjjjttttffLLDDEEWWGGLLLLjjttttttttttiiiiii;;iiiiiiiiiittttttii,,..
..::;;iiiittttjjffLLLLLLGGLLLLLLffjjjjffffGGDDWWGGffjjttttttttttjjffjjjjttjjttttjjjjffjjttii;;::
..,,iiiittttjjffLLGGGGDDDDDDGGGGLLLLffLLLLGGDDEEGGjjiiiiiittttjjffLLGGGGGGGGGGGGGGGGLLLLjjttii::
::;;ttttjjffLLLLGGDDDDDDDDDDGGLLLLffLLLLGGDDDDGGjjttiiiittttttffLLGGDDDDDDDDGGGGGGLLLLffjjii,,
..::ttjjjjLLLLLLGGDDKKWWDDDDGGLLLLLLLLLLGGDDDDGGjjttttiittttttjjLLGGLLGGDDDDGGGGGGLLLLLLjjtt::
..;;ttjjffLLLLGGDDDDEEDDDDGGLLLLLLLLLLGGGGDDGGLLjjttttttttttttjjLLLLGGGGGGGGGGGGLLLLfftt;;::
::;;ttjjLLLLGGGGDDDDDDGGLLLLLLffLLLLGGGGDDLLLLjjttttttttttttjjffLLLLLLLLLLLLLLLLffttii::..
::;;iijjjjLLGGGGGGGGGGLLLLLLjjLLffLLGGDDffjjttiittttttttttttttjjLLLLLLLLLLLLjjtt;;::..
..::;;iijjLLLLGGGGLLLLLLLLLLjjttttjjLLGGttii;;::ttttttiiiittjjjjjjjjjjjjjjjjttii::..
::::,,iijjffLLLLjjjjjjtttttt::::,,ttjj::.. ::iiiiii;;iiiiiittttttttttttii::..
::::::,,ttjjffffjjttttiiiiii;;::::;;ii,,::::;;;;;;;;;;;;iiiittttttttiiii,,
..::::::;;ttjjjjttttiiii;;;;;;;;;;;;;;::::::::::::,,,,;;iiiitttttt;;::....
..::::::::iijjjjjjttttii;;;;,,::::::::..........::::,,;;iittttttii::......
....::::::iijjLLjjjjttttii;;::::...... ..::,,;;iiiitttttt::::::::..
....::::::iittffjjffjjttiiii,,::.... ..::;;;;iittjjttii::;;,,::..
....::::::;;ttttttffjjttttii;;,,::.... ....::;;iiiittttjjtt::::::::::
....::::::,,iittttjjjjjjtttt;;,,::::......::::;;;;iiiittttttii::,,::::..
..::::::::;;;;iiiitttttttt;;;;;;::::::::::;;;;iiiiiiiittii;;::::::::..
..::::::::::::;;;;iiiiiiii;;;;;;,,::::::,,;;;;iiii;;iiii,,::::::::::..
..::,,::::::::::::;;;;::::::::::::::::::::::::::;;::::::::::::::::::..
..::,,::::::::::::,,::::::::::::::::::::::::::::;;::::::::::::::::::..
..::::::::::::::::::::::::..::::::::::::::::..::::::::::::::::::::..
..::::::::..::::,,::::::::,,,,..::::::::::::::::::::::::::::::::..
..::::::::::::::;;::::;;::,,,,..::::,,::::..::::::::::::::,,,,::..
..::::::::::::::;;::::;;,,,,,,::::::::..:: ....::::::,,,,,,,,::..
....::::::::::::::::::,,::::::::...... ..::::::::::;;;;,,::....
..::::::::::::,,::,,::::::::::....:: ..::::::::;;;;;;;;,,::..
....::::::::::::::;;::::::..::..::::,,::,,::::;;;;;;;;;;,,::..
....::::::::::,,,,;;,,,,,,::::::::::,,::;;,,;;;;;;ii;;;;::::
....::::::,,,,,,;;;;;;;;;;iiiiiiii;;;;;;ii;;iiiiii;;;;::::
....::::,,;;;;;;;;iiiittjjjjLLLLffffjjiiiiiiiiii;;;;::::..
....::,,;;;;;;,,iittttjjjjffLLffjjttiiiiiiiiii;;,,::..
....::,,;;;;iiiiiittttjjjjjjjjjjttiiiiiiiiii;;::::..
::::;;iiiiiiiiiiiittttttttttttiiiiiiii;;,,::..
....::,,;;;;iiii;;;;iiii;;;;iiii;;;;;;,,::::..
..::::,,;;;;;;,,,,;;;;,,,,;;;;,,,,::::....
....::::::::::::::::::::::::::::::....
....::::::::::::::::::::........
..................


Through me the way is to the city dolent;
Through me the way is to eternal dole;
Through me the way among the people lost.

Justice incited my sublime Creator;
Created me divine Omnipotence,
The highest Wisdom and the primal Love.

Before me there were no created things,
Only eterne, and I eternal last.
All hope abandon, ye who enter in!

*
*
***

Per me si va ne la città dolente,
per me si va ne l'etterno dolore,
per me si va tra la perduta gente.

Giustizia mosse il mio alto fattore:
fecemi la divina podestate,
la somma sapienza e 'l primo amore.

Dinanzi a me non fuor cose create
se non etterne, e io etterno duro.
Lasciate ogne speranza, voi ch'intrate".

*
*
***

Por mi se va a la ciudad doliente,
por mi se va al eterno dolor,
por mi se va con la perdida gente.

La Justicia movio a mi supremo Autor;
me hizo la divina potestad,
la suma sabiduría y el amor primero.

Antes de mí no hubo nada creado,
a excepción de los seres eternos, y yo duro eternamente.
Dejad toda esperanza los que entráis.

*
*
***

Ahora me he convertido en la muerte, destructora de mundos.
Soy la Muerte que se lleva todo, la fuente de las cosas que vendran.

Soy el espectro de aquellos que dominan los pueblos, el arte politico de los conquistadores, el silencio de los secretos, el conocimiento de los conocedores.

Soy yo quien recalienta, retiene, o deja ir la lluvia; yo soy la inmortabilidad y la muerte; soy yo quien soy, el ser y el no ser.

D1rkAvenger

|_|0|_|
|_|_|0|
|0|0|0|

We were young full of hopes. Now, we're old full of remorse...

Saludos a todos

Hola a todos, esta es mi primer entrada en el mundo de los blogs, aunque sin duda llevo años escribiendo en listas de discusión sobre linux y bases de datos, pues ahora me doy cuenta que es muy importante el publicar mucha información que tengo guardada aqui y por alla y que sin duda a mas de alguno le servira.

Todos sus comentarios y aportes a esta pagina son bien recibidos y nos vemos pronto por aqui.

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo