[LinuxFocus-icon]
Hogar  |  Mapa  |  Indice  |  Busqueda

Noticias | Arca | Enlaces | Sobre LF
Este documento está disponible en los siguientes idiomas: English  Castellano  ChineseGB  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  Arabic  

convert to palmConvert to GutenPalm
or to PalmDoc

Georges Tarbouriech
por Georges Tarbouriech
<georges.t(at)linuxfocus.org>

Sobre el autor:

Georges es un viejo usuario de Unix. A el le gustan esos productos que han contribuido a popularizar las soluciones de software libre en el área profesional.



Taducido al español por:
Leo Trujillo Gomez <aleogom(at)prodigy.net.mx>

Contenidos:

 

MySQL y Perl, el matrimonio por conveniencia

MySQL and Perl

Resumen:

MySQL y Perl han estado por todos lados hace ya buen tiempo. Ellos son ampliamente usados aún y cuando la "moda" cambia. Este artículo trata acerca de estos dos productos trabajando juntos como un todo, ya sea en la Internet o en una Red Local. El ejemplo proporcionado concierne a los sistemas Unix, libres o no, aún si puede ser adaptado a otros "sistemas" ampliamente generalizados.
Lo que este artículo es : una pequeña revisión de lo que puede hacer esta pareja, mostrando lo fácil de usar, su rapidez, confiabilidad, seguridad...
Lo que este artículo no es : no es un tutorial de MySQL ni tampoco de Perl; ni una revisión de MySQL o de Perl.
Consecuentemente, nosotros veremos a MySQL trabajando en conjunción con Perl, sin olvidar que "hay más de una forma de hacerlo".



 

¿ Qué podemos decir acerca de esta simpática pareja ?

MySQL es un Sistema de Administración de Base de Datos Relacional (RDBMS-Relational DataBase Management System) disponible en http://www.mysql.com. Esta liberado bajo GNU GPL para ser libre, dependiendo para lo que se le utilice. Revise la politica de la licencia en el sitio web de MySQL. Funciona ya sea como un servidor o un cliente en muchas plataformas. Algunos otros RDBMS existen como software libre y nosotros no haremos comparación alguna dado que la elección de MYSQL para este artículo es arbitraria. Ni compararemos a las grandes armas "comerciales" tales como Informix, Oracle, Sybase... Basta decir que MySQL es probablemente uno de los DBM más ampliamente usados en la Internet. Para este artículo usaremos la versón 3.23.36 (un vez más, de manera arbitraria). Al momento de escribir esto, la actual versión estable es la 3.23.46 y la experimental es la tan largamente esperada version 4.0. Estas pueden ser descargadas como código fuente para ser compiladas o como paquetes.
Para usar MySQL en conjunción con Perl, necesita algunas cosas más : los módulos Perl DBI. Por lo menos, usted puede descargar los módulos DBI, Msql-Mysql-modules, Data-Dumper y Data-ShowTable.
No hablaremos acerca de su instalación dado que esto es obvio y los paquetes le proveen con todo lo que usted necesita saber.
Perl se mantiene como lenguaje práctico de extracción y de informes (Practical Extraction and Report Language). En un principio, la intención fue la manipulación de documentos (parseo, extracción...) pero rápidamente comenzó a ser algo más que eso. Usted también puede hacer todo con Perl desde tareas administrativas hasta scripts cgi para verdaderas aplicaciones y naturalmente, interfaces de bases de datos.
Perl es parte de muchas (si no es que todas) distribuciones Unix tanto si son libres o no. La versión actual es la 5.6.1 y la versión experimental la 5.7.2 al momento que escribo este artículo. Para el artículo usaremos la vieja y aceptable versión 5.005_03. En el caso que usted no tenga instalado Perl en su máquina (¿ Cómo puede ser esto posible ?) puede obtenerlo de http://www.perl.com. Perl le proporciona toneladas de módulos para casi todo. Puede obtenerlos desde la sección CPAN de este sitio web : ¡ una mina de oro !
Por último pero no menos importante, para trabajar con ambas herramientas, sorpresa : ¡ usted necesita un servidor web ! Apache parece la correcta elección dado que es parte de muchas distribuciones Unix, libres o no, como es usual. En caso que no lo tenga (¿ Dónde encontró su distribución ?), está disponible en http://www.apache.org.

 

El ejemplo que usaremos

Usted probablemente ha notado que LinuxFocus es una revista multilingüe. Esto significa que, cuando usted es un editor, necesita administrar el estatus de los artículos nuevos, su traducción. En otras palabras, quién esta haciendo qué, cuando... Hasta el momento, hay cerca de 200 artículos disponibles, en promedio en 5 idiomas. Esto hace alrededor de 1000 artículos (Qué listo soy ¿ no ?) ¡ y seguimos contando ! Estas cosas han sido archivadas, formateadas, resumidas... ¿Cómo cree usted que esta administración es realizada ? Con Perl, naturalmente.
Nuestro editor en jefe, Guido Socher, escribió muchos programas en Perl para hacer nuestro trabajo mucho más fácil. El escribió también tres partes de un tutorial de Perl y una revisión de un libro de Perl. Revise la sección de referencia al final del artículo.
Javi, el editor en Español, escribió un programa para administrar el estatus de las traducciones... en Perl.
Atif, uno de nuestros autores estrellas, viene del Reino de Perl, por eso, su lengua materna es Perl. Eventualmente, el también ha contribuido para MySQL, mejorando una herramienta de administración web. Una vez más, revise la sección de referencia.
Todo esto para decir que si usted busca un paraíso Perl... únase a LinuxFocus.
dado que soy uno de los editores Franceses de LinuxFocus... y que soy algo perezoso, he creado mi propia base de datos usando, adivine que : ¡ MySQL y Perl !

 

Creando la base de datos

Esto asume que MySQL ha sido instalado apropiadamente, que los usuarios han sido creados y han sido protegidos con passwords. La instalación está fuera del alcance de este artículo y la enorme documentación que viene con MySQL le informará de todo.
Inicie el servidor MySQL usando el script mysql.server, puesto que invoca al demonio safe_mysqld usted puede pasar opciones a este demonio.
Conectese al servidor usando

mysql -h host -u user -p

. Si el servidor esta corriendo en su máquina local, usted no necesitará -h host.
Después de introducir el password, estará conectado al servidor (¡ Bueno, usted debería estarlo !). Y ahora, puede crear su base de datos.
En la línea de comandos de mysql, escriba

CREATE DATABASE lf;

Este es nuestro ejemplo (lf viene de LinuxFocus) y obviamente usted dará el nombre que quiera a su base de datos. A continuación, confiera algunos permisos a los usuarios autorizados, esto asume que tiene los derechos para hacerlo (esto es que usted tiene los derechos de administración siendo usuario que está conectado). Si desea que un usuario sea capaz de administrar la base de datos puede darle a él los privilegios para hacerlo usando

GRANT ALL ON lf.* TO nombredeusuario;

Seleccione la base de datos que acaba de crear y escriba

USE lf

. Cree una tabla de acuerdo a sus necesidades. En nuestro ejemplo, hemos creado una tabla llamada trissue :

CREATE TABLE trissue (num INTEGER UNSIGNED, categoria VARCHAR(25), titulo VARCHAR(40), autor VARCHAR(20), en VARCHAR(20), es VARCHAR(20), fr VARCHAR(20),de VARCHAR(20), nl VARCHAR(20), ru VARCHAR(20), tk VARCHAR(20), edicion VARCHAR(20));

. Revisemos, si ha sido creada como esperabamos con :

USE lf
SHOW TABLES;
DESCRIBE trissue;

Eso es todo.
Y ahora, necesitamos algunos datos. Para cargar datos en una tabla vacía, la forma más fácil consiste en usar un archivo de texto con tabuladores como separadores. Cuando su texto esté listo, sólo escriba

LOAD DATA LOCAL INFILE "maindb.txt" INTO TABLE trissue;

Si su archivo de texto es correcto la tabla estará ahora poblada de datos. Puede revisar esto con :

SELECT * FROM trissue;

Esto deberá desplegar una larga lista. Ahora, usted está capacitado para recuperar cualquier tipo de dato usando consultas.
Hasta ahora, todo bien.
Hasta ahora, nosotros solamente hemos usado MySQL y estamos capacitados para hacer cualquier cosa con él. Así que ¿ Qué hay de Perl ?

 

Perl en funcionamiento

Perl nos ayudará a automatizar las consultas, a desplegar los resultados en un navegador web, etc. Una vez más, esto implica que los módulos Perl han sido apropiadamente instalados para usar MySQL en conjunción con Perl.
Ahora escribiremos scripts Perl que serán usados como scripts cgi. Ellos nos permitirán mezclar Perl y HTML para consultar la base de datos y dar formato a la salida.
Usaremos un script simple como ejemplo, que nos permitirá buscar todos los artículos escritos por el mismo autor. Desplegará los números de artículo, la categoría, el título, los nombres de los traductores para los distintos idiomas (solamente para los proyectos completos en funcionamiento), y la edición cuando el artículo ha sido publicado.
Puede usar este script como un modelo para su propio uso, pero sea conciente que este ejemplo no es un programa muy seguro. Puede obtener una versión con más comentarios aquí.

#!/usr/bin/perl -Tw
# Primero, diremos que este es un script Perl "Impuro".
#
# Este es un comentario
# consulta db
#
# Usaremos el módulo Perl DBI
use DBI;

# Como cgi :
use CGI qw(param());

print <<END_of_start;

Content-type: text/html

<html>
<titulo>LFAuthors main db</titulo>

<center><TABLE>
<TR VALIGN=TOP>
<TD><form action="/cgi-bin/lf.cgi" method="get">

# Aquí viene el título del botón parala página de inicio
<input type="submit" value="LFAuth "> </form>
</TD>
</TR>
</TABLE>

Ahora, pedimos al script que consute la base de datos

<center><H2>Buscar por autor</H2></center>

<form action=\"/cgi-bin/lf.cgi\" method=\"get\">Nombre Autor : <input
type=\"text\" size=\"30\" name=\"autor\"><input type=\"submit\"
value=\"Search...\"></form></center>


END_of_start


if (param("autor") ne '') {
$autor = param("autor");

$autsrch.='"';
$autsrch.=$autor;
$autsrch.='"';

# Nos conectamos a la base de datos llamada lf como el usuario doe

$dbh = DBI->connect("DBI:mysql:lf","doe",'');

$sth = $dbh->prepare("
select *
from trissue
where
autor = $autsrch
");

$sth->execute;


Ahora pedimos al script que se prepare y muestre los resultados de la consulta. Nosotros no hemos buscado y desplegado el contenido completo de la base de datos, o preguntado por un nombre y mostrar cada artículo correspondiente a este nombre de autor. si usted tiene miles de registros en su base de datos, ¡ yo no recomiendo desplegar el contenido completo !

print <<END_suite;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Categoria </font></th>
<th width=110 align=CENTER><font color=#000000> Titulo </font></th>
<th width=110 align=CENTER><font color=#000000> Autor </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Edicion </font></th>
</tr>

END_suite

while( ($num,$categoria,$titulo,$autor,$en,$es,$fr,$de,$nl,$ru,$tk,$edicion) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $categoria</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $titulo</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $autor</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $edicion</td>";
print "</tr>";

}
print "</TABLE>";
print "<BR>";
print "<BR>";
print "<br>";


} else {

# DB Connect

$dbh = DBI->connect("DBI:mysql:lf","doe",'');


# Search

$sth = $dbh->prepare("
select *
from trissue
");

$sth->execute;


# Display result


print <<SUITE;

<center>
<TABLE BORDER=>
<tr bgcolor=#A1C4EE>
<th width=60 align=CENTER><font color=#000000> Num </font></th>
<th width=110 align=CENTER><font color=#000000> Categoria </font></th>
<th width=110 align=CENTER><font color=#000000> Titulo </font></th>
<th width=110 align=CENTER><font color=#000000> Autor </font></th>
<th width=110 align=CENTER><font color=#000000> En </font></th>
<th width=110 align=CENTER><font color=#000000> Es </font></th>
<th width=110 align=CENTER><font color=#000000> Fr </font></th>
<th width=110 align=CENTER><font color=#000000> De </font></th>
<th width=110 align=CENTER><font color=#000000> Nl </font></th>
<th width=110 align=CENTER><font color=#000000> Ru </font></th>
<th width=110 align=CENTER><font color=#000000> Tk </font></th>
<th width=110 align=CENTER><font color=#000000> Edicion </font></th>
</tr>

SUITE

while(($num,$categoria,$titulo,$autor,$en,$es,$fr,$de,$nl,$ru,$tk,$edicion) =$sth->fetchrow() ) {
print "<tr>";
print "<td width=60 bgcolor=#FFFFE8 align=center> $num</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $categoria</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $titulo</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $autor</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $en</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $es</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $fr</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $de</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $nl</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $ru</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $tk</td>";
print "<td width=110 bgcolor=#FFFFE8 align=left> $edicion</td>";

print "</tr>";

}
print "</TABLE>";
print "<BR>";

}
print end_html;
$sth->finish;


# Desconexión

$dbh->disconnect;

exit;



Aquí esta la salida de la consulta en un navegador web :

query


¡ Esto es todo !

 

El lado de la seguridad

Obviamente, si usted desea proporcionar un servicio de base de datos en su sitio web, debe asegurar las cosas por completo. Naturalmente, no daremos una forma paso a paso para la seguridad de un sitio web o un servidor de base de datos. Sin embargo, es importante insistir en lo básico.
Para ser concisos, cuando proporcione servicios en la web, la primer cosa que debe asegurar es su servidor web. Esto está lejos del alcance de este artículo. si quiere aprender más de este tema, hay abundante documentación disponible. Un lugar estupendo para comenzar es El Proyecto de Documentación Linux - the Linux Documentation Project.
El siguiente paso concierne al servidor de base de datos. Cuando instala una herramienta como MySQL no olvide leer la parte de seguridad del manual. De nuevo, lo básico concierne a los passwords de usuarios : no deje una cuenta sin password especialmente la cuenta de root para la base de datos (la cual debería de ser distinta a la cuenta de root de la máquina). El otro punto importante está relacionado a los permisos : no conceda todo a todos. Parece obvio... ¡ y esto es porque mucha gente se olvida de ello !
Vamos un poco más allá, ¿porqué no permitir chroot en la base de datos ? Revise el Artículo de Mark "Configurar Chroot en todos los servicios" en esta edición. El habla acerca de una base de datos distinta, pero lo que dice puede aplicarse en MySQL.
Otra medida de seguridad concierne a la circulación de datos. No es una mala idea enviar y recibir los datos a través de un túnel. Puede revisar el artículo A través del Túnel para más información.
Por último, pero no menos importante, la programación segura es una de las claves. Perl es un lenguaje grandioso, pero es muy fácil cometer errores de programación con él. En otro artículo de LinuxFocus se le enseñará a usted como hacerlo, especialmente con Perl. Puede ver algo aquí. Es el último artículo de la serie de Programación Segura y concierne especialmente sobre los script cgi. ¡ Un "deber leerlo" !
Por supuesto, esto asume que usted ya tiene un sistema robusto sin ninguno de los agujeros de seguridad conocidos, con los últimos parches, y muchas de las herramientas de seguridad tales como NIDS (Sistema de detección de Intrusos de Red - Network Intrusion Detection System) como snort (from http://www.snort.org), firewall, escáneres de puertos y seguridad (nmap, nessus), etc.
Si puede proporcionarlo, usted puede también tener un servidor distinto para cada servicio que ofrece : un servidor web, un servidor de base de datos... y sus mirrors para alta disponibilidad. ¡ etcétera ! Nunca finalizará con el tema, dado que la seguridad núnca se cumple a cabalidad. Sólo trata de reducir los riesgos... y ellos son más perversos cada día. Usted está advertido.

 

¿ Qué más ?

Como Hay Más de Una Forma de Hacerlo, usted puede elegir su propia forma. Hay muchos RDBMS y muchos lenguajes para comunicarse con ellos. La idea que hay detrás de escribir este artículo era mostrar cómo MySQL y Perl trabajan bien cuando los usa juntos.
Naturalmente, la elección fue muy subjetiva : yo amo MySQL porque es preferentemente pequeño en tamaño, funciona en muchos Sistemas Operativos, es rápido, confiable... Yo a su vez aprecio mucho el trabajo hecho por el equipo de MySQL, sin olvidar el número de gente que ha contribuido. Y lo que más me gusta es que : esas personas no intentan reinventar la rueda. Mantienen las cosas simples.
Concerniente a Perl, todo a sido dicho acerca de él : ¿ Qué más podría yo agregar ? Creo que usted no puede trabajar sin él, ya sea si trabaja como administrador de Red o como desarrollador, o no importa que. La comunidad Perl es una de las más grandiosas fuentes de conocimiento compartido. Una revista está disponible, llamada the Perl Journal, la cual esta ahora incluida en SysAdmin magazine, cada dos ediciones. Si quiere subcribirse, dirígase a http://www.samag.com.
Dado que estamos hablando de trabajos grandiosos, aquí viene la acostumbrada sección off-topic. Ustedes, lectores de LinuxFocus no han notado probablemente el pequeño número de personas involucradas en la revista. No obstante, ustedes puede leerla en muchos idiomas distintos. ¿Han notado que algunos del equipo de trabajo son casi los de siempre, solamente una o dos personas haciendo todo el trabajo ? Ellos son webmaster, traductores, etc. Revise el equipo Ruso, el equipo Turco : encontrará que muchos de los artículos son traducidos por Kyril o Erdal. Revise los proyectos bajo desarrollo, tales como Portugués o Arabigo : ¡ el mismo resultado ! Quisiera felicitar a todos ellos por el enorme trabajo que están haciendo. Gracias a todos ustedes : la comunidad de software libre les debe mucho.
Perdón por esta disgresión, pero creo que esto debería ser dicho.
Regresando al tema, finalicemos con unas palabras acerca del software libre. La gente en MySQL o Perl merece las gracias. Ellos le proveen a usted de grandiosas herramientas en su mayor parte libres de cargo. Con todo, estas herramientas son frecuentemente tan buenas como los verdaderos productos comerciales (si no es que mejores), ellos son frecuentemente actualizados, con muy buena documentación y las puede usar también en todos los sistemas Unix. ¿ Puede encontrar el equivalente en algún otro lugar ? ¡ me temo que no !
Este artículo probablemente no le enseñará a usted mucho, sin embargo si usted advierte como probar estos productos, no será del todo inútil.
¿ No vivimos una época maravillosa ?

 

Referencias

Perl mongers

Tutorial de Perl de Guido :

Perl I
Perl II
Perl III

Revisión del libro Programación de Perl Profesional :

Programación en Perl

Contribuciones de Atif a MySQL.

Una revisión de MYSQL en LinuxFocus: viejo artículo aunque actualizado :

MySQL

Un viejo tutorial de SQL en LinuxFocus SQL, en dos partes :

SQL Parte I
SQL Parte II  

Formulario de "talkback" para este artículo

Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
 Ir a la página de "talkback" 

Contactar con el equipo de LinuFocus
© Georges Tarbouriech, FDL
LinuxFocus.org

Pinchar aquí para informar de algún problema o enviar comentarios a LinuxFocus
Información sobre la traducción:
en --> -- : Georges Tarbouriech <georges.t(at)linuxfocus.org>
en --> es: Leo Trujillo Gomez <aleogom(at)prodigy.net.mx>

2002-01-04, generated by lfparser version 2.21