Linux Magazine - Edición en Castellano, Nº 01

100
Redes Herramientas Linux DHCP CUPS/SAMBA TLS/SMTP Fedora Core 3 MediaWiki Portales Enrutamiento Konversation Configura, Vigila y Explota REDES Herramientas de configuración y monitorización p13 Configuración relajada con DHCP p16 Impresión en red con CUPS y SAMBA p23 Fedora Core 3 Te traemos lo más nuevo de Red Hat Fedora para tu PC p96 Enrutado Linux Cómo dar acceso a Internet a toda una red doméstica con una sola conexión p68 Correo Seguro Servidores y clientes de correo con TLS para transmisión encriptada de mensajes p60 NÚMERO 1 P.V.P 4,95 SDL Programación de Juegos bajo Linux La nueva versión de Fedora en DVD Konversation El cliente IRC más fácil de utilizar MediaWiki p54 Cómo instalar y administrar un wiki con el motor wiki PHP que se esconde tras la Wikipedia WWW.LINUX - MAGAZINE.COM.ES LINUX MAGAZINE NÚMERO 01 8 413042 594505 00001 Esas Patentes Después de las patentes de software ¿qué planean para nosotros el gobierno europeo? Echa un vistazo al futuro de la mano de Paul C. Brown p95 Edición en Castellano

description

Puesto a la venta diciembre de 2004 Tema de Portada: Redes DVD: Fedora 3

Transcript of Linux Magazine - Edición en Castellano, Nº 01

Page 1: Linux Magazine - Edición en Castellano, Nº 01

Re

de

sH

erra

mie

nta

s Linu

x D

HC

P C

UP

S/S

AM

BA

TLS

/SM

TP

Fed

ora

Co

re 3 M

ed

iaW

iki P

orta

les E

nru

tam

ien

to K

on

versa

tion

Configura, Vigila y Explota

REDESHerramientas de configuración y monitorización p13

Configuración relajada con DHCP p16

Impresión en red con CUPS y SAMBA p23

Fedora Core 3Te traemos lo

más nuevo de

Red Hat Fedora

para tu PC p96

Enrutado LinuxCómo dar acceso a Internet a toda una red

doméstica con una sola conexión p68

Correo SeguroServidores y clientes de correo con TLS para

transmisión encriptada de mensajes p60

NÚMERO 1 • P.V.P 4,95 €

SDLProgramación de Juegos bajo Linux

La nueva versiónde Fedora en DVD

KonversationEl cliente IRC más fácilde utilizar

MediaWiki p54

Cómo instalar y administrar un wiki con

el motor wiki PHP que se esconde tras la

Wikipedia

W W W . L I N U X - M A G A Z I N E . C O M . E S

LIN

UX

MA

GA

ZIN

E

ME

RO

01

8413042594505

00001

Esas PatentesDespués de las patentes de software

¿qué planean para nosotros el

gobierno europeo? Echa un vistazo al

futuro de la mano de Paul C. Brown

p95

Edición enCastellano

Page 2: Linux Magazine - Edición en Castellano, Nº 01

Linux va a CeBITMuestre sus productos y servicios en la sección

especial dedicada a Linux en CeBIT 2005:

Por cuarto año consecutivo, un gran número de

compañías y proyectos de código abierto van a

presentar sus soluciones de software, productos

y servicios en LinuxPark.

En CeBIT 2005, LinuxPark será de nuevo el punto

de visita obligatoria para lo directivos TI, espe-

cialmente aquellos provenientes de las PYMEs y

de la administración pública. Sólo hay un sitio en

CeBIT con toda la información sobre las tecnolo-

gías de código abierto más novedosas y como

explotarlas de manera efectiva: LinuxPark.

Su empresa también puede beneficiarse enor-

memente de esta plataforma, ideal para la pro-

moción de sus soluciones de código abierto.

La solución perfecta para su presenciaferial:

• Comuníquese directamente con una gran

variedad de clientes potenciales

• Anúnciese en un campaña promocional ante-

rior a la feria de gran envergadura

• Realice su propia presentación en el

LinuxForum

• Aprenda de ponentes de primera categoría

• Consolide sus relaciones con la comunidad

Linux internacional

• Benefíciese del contacto con socios y patroci-

nadores de reconocido prestigio en el sector

• A su disposición: paquetes feriales todo inclui-

do desde 4 m2

Consiga más información en +49 (0) 26 02 16 01374 ó[email protected]

Patrocinado por: Presentado por:

Page 3: Linux Magazine - Edición en Castellano, Nº 01

EDITORIALBienvenidos

3www.linuxmagazine.com.es Número 01

Iniciamos una

nueva andadu-

ra con… ¡No!

¡Tacha eso! No

puedo caer en

el topicazo de

“nueva anda-

dura”, “flaman-

te revista” y

“recién estrenada publicación”. Todo es

cierto - al menos en castellano, pero hete

que Linux Magazine, o más bien, su

publicación hermana y homónima alem-

ana, Linux Magazin, lleva más de diez

años en el mercado, siendo la revista de

Linux más antigua de Europa y la segun-

da del mundo. Linux New Media publica

revistas de Linux en media docena larga

de países, incluyendo sitios tan dispares

como Polonia, Brasil y Estados Unidos.

Cuenta con un completo catálogo de

revistas dirigidas a usuarios, desarrol-

ladores y administradores a distintos

niveles y lleva años patrocinando gru-

pos, eventos y proyectos en el ámbito del

Software Libre. Así que, en vez de

“andaduras”, “flamancias” y “estrenos”,

sería más apropiado hablar de “¡ya era

hora!” o, incluso, “¿a qué narices

estabais esperando?”.

Pero ya estamos aquí. Y, sí, Linux

Magazine es nueva, es flamante y esta-

mos de estreno. Además viene cargadita

de cosas interesantes. Para empezar ten-

emos la sección especial de Portada,

donde analizamos y nos explayamos

sobre la creación y configuración de

redes y servidores. Los programadores

pueden seguir nuestros artículos sobre

C/C++ y las tres Ps (Perl, Python y

PHP), además de otros temas que capten

nuestra atención, en la sección de

Desarrollo. Si administras un sistema, te

interesará la sección SysAdmin con los

mejores trucos y los artículos en más

profundidad para el profesional más exi-

gente. Para el usuario final, tenemos la

sección Linux User, donde se puede

aprender a configurar y utilizar aplica-

ciones, se bucea en las procelosas aguas

de la línea de comandos (con manguitos,

aro y vigilante socorrista, no os creáis),

iniciamos al lector en la programación

(¡no perderse el curso de XUL desde

cero!) y vemos la aplicación de Linux y

el Software Libre en el campo de la edu-

cación. Y poco más: Noticias del mundo

Linux, noticias empresariales, relación

de inseguridades, relación de eventos

mundiales, relación de proyectos, recur-

sos, enlaces… y un DVD. Sí señores y

señoras, regalamos con este número un

DVD que contiene la última versión de la

distribución Fedora: la Core 3. Para que

nadie se lleve a engaño, expliquemos lo

del DVD: incluiremos un DVD cada 3

meses. El precio habitual de Linux

Magazine es de 4,95 ?, pero los meses

que salgamos con DVD, Linux Magazine

valdrá 5,95 ?. “¿Y por qué no salís todos

los meses con DVD y acabamos?” os pre-

guntaréis. Pues por que la mayoría de

vosotros tenéis acceso a Internet ¿ver-

dad? Y muchos incluso banda ancha o

alguna manera de acceder a ella (trabajo,

universidad, el vecino del quinto…).

Seguramente la mayor parte de vuestro

software lo consigáis de ahí. Por tanto

¿para qué vamos a inflar el precio de la

revista con un DVD cada mes de dudosa

utilidad? Preferimos mantener bajo el

precio la mayor parte del tiempo y sólo

incluir un DVD cuando exista algo que

realmente valga la pena grabar en él.

Claro que siempre podéis conseguir

los DVDs gratis… ¿qué cómo? Pues

suscribiéndote. Es fácil: 12 números de

Linux Magazine con todos los DVDs por

49,50 ?. Si no te convence, ponnos a

prueba. Por poco más de lo que vale

un ejemplar, por 5 ? para ser exactos,

conseguirás tres números de Linux

Magazine y el correspondiente DVD.

¡Cinco mortadelos! No es que sea para

pensárselo mucho. Otra cosa a seguir es

nuestra web, www.linuxmagazine.es,

donde publicaremos paulatinamente

TODOS LOS CONTENIDOS de números

atrasados de Linux Magazine para su

libre descarga en formato PDF. No, no

Bienve^H^H^H^H^H^H

Nos sentimos orgullosos de nue-

stros orígenes como publicación,

que se remonta a los primero días

de la revolución Linux. Nuestra

revista hermana, la publicación ale-

mana Linux Magazin, fundada en

1994, fue la primera revista dedi-

cada a Linux en Europa. Desde

aquellas tempranas fechas hasta

hoy, nuestra red y experiencia han

crecido y se han expandido a la par

que la comunidad Linux a lo ancho y

largo del mundo. Como lector de

Linux Magazine, te unes a una red

de información dedicada a la dis-

tribución del conocimiento y

experiencia técnica. No nos limita-

mos a informar sobre el

movimiento Linux y de Software

Libre, sino que somos parte integral

de él.

Estimado Lector de Linux Magazine

Paul C. Brown

Director

estamos locos. Nos debemos a la comu-

nidad. Sin la comunidad ni existiría

Linux, ni Linux Magazine, ni lectores de

revistas de Linux, ni nada de nada. Por

tanto, de donde se coge hay que

devolver y agradecidos de poder hacerlo.

Además, a mayor difusión de cultura

Linux, mayor número de usuarios de

Linux. A mayor número de usuarios de

Linux, más lectores. ¡Ja! Es una

ecuación infalible. Nuestra web también

ofrece foros, ofertas, noticias actual-

izadas al minuto, contenidos extra y una

vía de comunicación entre nuestros lec-

tores -vosotros- y la redacción -nosotros-

inmediata y muy fácil de utilizar.

Así que, ya sabéis, aquí estamos,

hemos llegado, bienvenidos a Linux

Magazine y que lo disfrutéis.

Page 4: Linux Magazine - Edición en Castellano, Nº 01

2 Número 01 www.linuxmagazine.com.es

NOTICIAS

Software ................................................................................................6

Negocios ................................................................................................8

Linux .........................................................................................................9

Inseguridades ..................................................................................10

PORTADA

Especial Redes ..................................................................................12

Herramientas de Red ..................................................................13Todas las herramientas Linux necesarias para la monitor-

ización de redes.

Redes relajadas con DHCP ......................................................16DHCP para la autoconfiguración de clientes de red.

Cambio de perfile con SCPM .................................................21Mantenimiento dos configuraciones red en una misma

máquina.

CUPS sobre SAMBA ......................................................................23Proporciona impresión en red para clientes Linux, Windows

y Mac.

DESARROLLO

La librería SDL ..................................................................................28Aprendemos a utilizar SDL en este taller de programación de

juegos.

Interfaces ............................................................................................33Con curses podemos desarrollar interfaces de texto rápidos y

eficientes

Cartas a medida .............................................................................38Perl puede generar cartas y sobres personalizados para

envíos masivos en formato PostScript.

La API Pear .........................................................................................42PEAR proporciona una API para la conexión a bases de

datos que evita el código redundante.

Introducción a Python ..............................................................48Python es un lenguaje todoterreno, útil tanto en scripts web

como en grandes aplicaciones.

28 SDL: Juegos Bajo LinuxSDL significa Simple DirectMedia Layer y es una API

multi-plataforma para programar aplicaciones multi-

media, como los juegos. Aporta una base estable sobre la

que los progra-

madores pueden

trabajar, sin pre-

ocuparse de

cómo se encar-

gará el hard-

ware de ren-

derizarlo o in-

cluso qué hard-

ware lo ejecu-

tará.

16 Redes RelajadasAñadir máquinas a una red implica un trabajo extra de

configuración. Una solución centralizada que use un

servidor DHCP

para asignar las

direcciones IP y

otros parámetros

a las máquinas

clientes nos qui-

tará un motón de

dolores de cabe-

za a la hora de

administrarlas.

13 Herramientas de RedLas máquinas conectadas a la red ofrecen enormes benefi-

cios, pero añaden responsabilidades. Desde el momento en

que conectamos

nuestra máquina a

la red debemos no

solo conocer todo

acerca de nuestra

máquina, si no tam-

bién sobre la forma

en que ésta se

comunica con el

mundo exterior. Las

herramientas están-

dar de Linux nos

pueden ayudar.

ContenidoLINUX MAGAZINE

Page 5: Linux Magazine - Edición en Castellano, Nº 01

3www.linuxmagazine.com.es Número 01

SYSADMIN

La Columna de Charly ................................................................53Los mejores trucos y consejos del SysAdmin.

Colaboración Online ...................................................................54Instalamos y configuramos MediaWiki, el motor wiki tras la

popular Wikipedia

Correo Seguro .................................................................................60Servidores seguros de correo con TLS

La Caja Negra ...................................................................................62Controla tu sistema con Syslog NG.

LINUX USER

Portales de Enrutamiento .....................................................68Con una sola máquina Linux conectada a Internet, podemos

proporcionar acceso al exterior a toda una red.

Desktopia: Panelizer ..................................................................70Dota un gestor de ventanas minimalista de un panel de con-

trol con Panelizer.

Aplicaciones: Konversation ...................................................72El cliente IRC más sexy para KDE.

Curso de Programación: XUL (I) ..........................................74Un lenguaje sencillo para programar interfaces web.

Educación: WIMS ..........................................................................79Generación de exámenes personalizados con WIMS.

Tipografía con LaTeX (I) ............................................................84Documentos de aspecto profesional con LaTeX.

COMUNIDAD

Proyectos ............................................................................................93

Eventos .................................................................................................94

Contacto ..............................................................................................94

Humor ...................................................................................................95

DVD: Fedora Core3 .......................................................................96

Próximo Número ..........................................................................98

74 Programación XULLos desarrolladores de Mozilla crearon el lenguaje XUL para

proporcionar un método sen-

cillo y potente para escribir

interfaces web

de gran atrac-

tivo y funcio-

nalidades ex-

traordinarias.

En esta serie

aprendemos

las bases de la

programación

orientada a web con

esta poderosa her-

ramienta.

54 MediaWikiLa enciclopedia libre Wikipedia usa el motor Mediawiki para

recopilar un enorme base de datos de conocimiento. Si desea

estrenar su pro-

pio wiki, este

software basado

en PHP es una

buena elección

que facilita una

funcionalidad

abundante y

llena de poten-

cia.

LINUX MAGAZINEContenido

96 DVD Linux Magazine: Fedora Core3Durante años, Red Hat fue con diferencia la distri-

bución Linux más popular, sólo siendo ensombrecida por

Debian. Pero mientras éste último era el preferido de la

comunidad hacker y favorito de los que escogían el camino

de “hágaselo-usted-mismo”, Red Hat era el favorito de los

usuarios buscando productividad inmediata, de la empresa y

de aquellos que

querían entrar más

suavemente en el

mundo Linux.

Fedora es la distro

heredera de Red

Hat y Linux

Magazine te lo trae

en DVD.

Page 6: Linux Magazine - Edición en Castellano, Nº 01

NOTICIAS Software

Software

6 Número 01 www.linuxmagazine.com.es

”¿Qué pasaría si diseñáramos un sistemaoperativo e interfaz de usuario con losconocimientos que tenemos hoy en día,hasta dónde podríamos llegar?” Larespuesta posiblemente sea hasta elcampo de croquet más cercano.OpenCroquet es un proyecto que imple-menta un nuevo concepto de sistemaoperativo, el desarrollo del cual vieneliderado Alan Kay, el hombre que nosdio el portátil, la programación orientadaa objetos y el interfaz de ventanas tanpopular hoy en día. El proyecto pretendeimplementar un sistema operativo einterfaz totalmente novedoso que unificalas últimas tecnologías 3D con laubicuidad de las redes en un todo quesólo se puede calificar, ahora sí, como“ciberespacio”. En la superficie,OpenCroquet podría parecer similar alproyecto “Looking Glass” de Sun (http://

wwws.sun.com/

software/looking_

glass/). Sin embar-go, va más alláque aquel al nolimitarse al aspec-to visual, permi-tiendo, entre otrascosas, que usuar-ios compartan es-pacios de otros simplemente cruzandoun “portal” y puedan trabajar conjunta-mente en un mismo documento o com-partir su tiempo de ocio a través deavatares igualmente tridimensionales.De momento, OpenCroquet funciona uti-lizando como base Squeak, una imple-mentación de Smalltalk (otro invento deKay) orientada a la educación y, portanto, se puede utilizar en todas lasplataformas que soporten el interfaz del

ratoncito (Linux,Windows y Mac).Se preve que fu-turas versiones deOpenCroquet fun-

cionarán como verdaderos sistemasoperativos y no requerirán más softwareque el que traigan consigo. Las exigen-cias del hardware básico son muy discre-tas: OpenCroquet funcionará perfecta-mente con un Pentium II a 450 Mhz…siempre y cuando venga equipado conuna potente tarjeta gráfica compatiblecon OpenGL. Visita el enlace de másabajo para más información. �

http://www.opencroquet.org.

�En el Futuro jugamos a Croquet

�Palabras CalientesNo, no se trata de otro servicio 906 (osea cual sea el prefijo utilizado parahablar con señoritas de dudosa moralhoy en día), sino el último invento deLinspire, antes conocido como Lindows.

Los linuxeros más recalcitrantes podrándecir lo que quieran de esta distro, perolos impulsores detrás del sistema, con su CEO Michael Robertson a la cabeza,son un hervidero de ideas. Ésta vez lle-

van “la experienciaGoogle” hasta laenésima potencia. Sibien Google parecehaberse concentradomucho en la platafor-ma Windows última-mente, con su barrapara MSIE, su escrito-rio solo-Windows ydemás, los únicos quepodrán disfrutar deHot Words, una man-era de buscar enGoogle, son los usuar-ios de la LinspireInternet Suite (LIS).Hot Words funcionaconvirtiendo cada pal-abra que aparece en lanavegador en un tér-

mino de búsqueda potencial. ¿Lees sobrepaellas valenciana y te gustaría sabermás? Con un clic aparece un menú con-textual que te permite buscar en Googleutilizando “paella” como la palabraclave, o consultar noticias sobre paellaso incluso comprar paellas en Froogle, elbuscador de productos de consumo deGoogle… Bueno, ejem, tal vez no sea unbuen ejemplo, pero ya pilláis la idea. LISse basa en el motor de análisis Gecko, elmismo utilizado por Mozilla y Firefox,pero, según Robertson, “se han realizadomuchos cambios y mejoras” para poderofrecer funcionalidades extra e inclusointegran Hot Words en el cliente decorreo. Otros productos salidas de la fac-toría Linspire son PhoneGaim que per-mite realizar llamadas de voz sobre IP decliente Gaim a cliente Gaim yMailMinder, un servicio integrado en elcliente de correo de LIS que permite quemensajes recordatorio se envíen en unafecha determinada. Visita el enalce al piepara más información. �

http://info.linspire.com/suite.html

Page 7: Linux Magazine - Edición en Castellano, Nº 01

Software NOTICIAS

� (Otro) Linux de BolsilloPuedes ir por ahí con Linux en un CD,puedes ir por ahí con Linux en un dis-quete… Y ahora puedes ir por ahí conLinux en un pendrive, siempre y cuandocuentes con más de 128 Megabytes deespacio. Lo que es más: ni siquiera ten-drás que rearrancar. La gente de

MetroPipe (http://www.metropipe.net)ha colocado en su sitio web una dis-tribución completa que funcionadesde cualquier dispositivo USB concapacidad de lectura y escritura. Ladistribución, llamada “Virtual PrivateMachine” se puedes llevar en un pen-drive, se puede llevar en un USBWatch e incluso se puede llevar en uniPod. ¿Te sientas a un ordenador cor-riendo Windows? No hay problema.Enchufa tu dispositivo USB a cualquierpuerto, haz clic en el icono que aparecey se cargará un entorno completo Linuxlisto para ser utilizado. Sin cerrarWindows, sin rearranques, sin proble-mas. Si el sistema subyacente, seaWindows o Linux (para Mac en breve),tiene conexión a Internet o una red local,

7www.linuxmagazine.com.es Número 01

Firefox vuelve a demostrar su im-plantación en el mercado de los naveg-adores. Esta vez nos dan PubSub, unabarra lateral que nos permitirá navegarblogs, grupos de noticias y resúmenesRSS. La barra se instala en la parteizquierda del navegador y permite moni-torizar en tiempo real cambios de websde noticias, grupos de noticias de usenety más de tres millones de weblogs. Losnuevos elementos aparecen en la barra ypodemos expandir la noticia en la ven-tana principal del navegador simple-mente pulsando en el enlace. Nada másinstalar PubSub, podemos acceder al ser-vicio cerrando y rearrancando el naveg-ador y, a continuación, escogiendo de

�PubSub no es para ir de copasView/Sidebar/PubSub Sidebar. En unaprimera instancia, se nos ofrece informa-ción genérica (mucha información sobrela carrera presidencial americana,mucho Bush, mucho Kerry, etc.), peropodemos configurar la barra quemuestre la información que nosotrosdeseemos abriendo una cuenta enPubSub.com. Podemos escoger que nossirvan información de varias fuentes y, através de una formulario, especificamoslas palabras claves que se han de utilizarpara filtrar las noticias y confirmamosnuestra suscripción pulsando en unenlace remitido por correo electrónico.Seguidamente, cambiamos los Options

and Settings en la barra para incluir ladirección de correo electrónicoque utilizamos para suscribirnosy la contraseña que PubSub nosenvíe. Con desconectar y volver aconectar al servicio, apareceránlas cuentas que hemos habilita-do. A los pocos minutos, la barraempezará a llenarse de noticias amedida que se producen a lolargo y ancho del blogsphere,Usenet y web. Para aquellos queles va este tipo de cosas, PubSubtambién se encuentra disponiblepara MSIE. Descarga la barra delenalce de más abajo. �

http://www.pubsub.com/

sidebar-firefox.php.

�El “Access” de OpenOfficeLa nueva versión de OpenOffice, número2.0, integrará una aplicación similar aMS Access, para aquellos que lo echende menos. La nueva aplicación será más“visible” que la implementación actual(accesible a través de Tools/Data

Sources) ya que se colgará del menúFiles/New, el mismo sitio de donde seaccede a la creación de otros formatos dedocumentos en OpenOffice. Los docu-mentos creados con Base, que así sellama el programa, podrán guardarse enel lugar elegido por el usuario y uti-lizarán un formato específico deOpenOffice. Sin embargo, la integraciónexistente con otras bases de datos, quepermite acceder a datos guardados bajoformatos como MSAccess, Oracle, dBasey MySQL, se seguirá conservando. Lospaquetes generados con Base integraránfuentes de datos, formularios, consultase informes, en un mismo paquete demanera similar a como lo hace Access.Para la fuente de datos, el equipo deOpenOffice se ha decantado porHSQLDB, un motor de bases de datosbasado en Java que se integra perfecta-mente con la implementación gratuitadel lenguaje, Kaffe. HSQLDB destaca porsu pequeño tamaño, rapidez y la posibil-idad mantener los datos en memoriadurante la ejecución. �

http://dba.openoffice.org/miscellaneous/

dba20.html

podrás utilizarla sin tocar un solo ficherode configuración. Y cuando te vayas,todos los cookies, ficheros y logs estaránen tu pendrive, no en el ordenadorcliente, que queda tal como estaba,limpio de polvo y paja. La distro VPM seencuntra disponible en el enlace al pie. �

http://www.metropipe.net/

ProductsPVPM.shtml.

Page 8: Linux Magazine - Edición en Castellano, Nº 01

Negocios

8 Número 01 www.linuxmagazine.com.es

NOTICIAS Negocios

�Novell vs. BallmerEn un documento hecho público a

los medios el 28 de octubre pasado,

el vipresidente de Novell, John

Hogan y el senior business analyst,

Barret Coakley desmontan una a una las

aseveraciones difundidas por Steve

Ballmer, CEO de Microsoft en un email

enviado a clientes y socios de la com-

pañía el 27 de octubre en el que Ballmer

aseguraba que Windows es más barato,

más rápido y más seguro que Linux.

Entre otras cosas, se cuestiona la inde-

pendencia de los análisis y la

metodología utilizada. Según revela el

documento de Novell, se utilizaron en

las pruebas formatos propietarios de MS

que Linux tenía que emular con SAMBA,

ingenieros de Redmond realizaron

ajustes en el sistema operativo de prueba

de MS para optimizar los resultados de

Windows y, sin embargo, no se realizó

ninguna optimización en el sistema

Linux. Asimismo. Hogan y Coakley acu-

san a Ballmer de ser demasiado selectivo

con algunos de los datos publicados en

un estudio de The Yankee Group titulado

“Linux, UNIX and Windows TCO

Comparison” aparecido en abril de este

mism año. Ballmer no cita ninguno de

los muchos apartados donde se habla

positivamente de

Linux, y en espe-

cial decide omitir

la conclusión, donde

se dice literalmente:

“El estudio de TCO

(Total Cost of Owner-

ship) encontró que Linux ofrece sin

lugar a dudas ahorros en costes,

economía en el escalado y ventajas téc-

nicas, tal y como pueden atestiguar

muchos usuarios satisfechos. Sin embar-

go, los ahorros en costes no son

automáticos. No se obtienen sin sus

debidas diligencias y no se aplican nece-

sariamente a todos los entornos. En últi-

ma instancia, el TCO y ROI (Return On

Investment) puede ser más bajo, igual o

más alto que los de UNIX o Windows

dependiendo de las circunstancias de

explotación corporativa individuales”.

Otros aspectos tratados son los de la

seguridad, falta de personal cualificado y

falta de soporte, todos y cada uno de

ellos desmantelados por los ejecutivos

de Novell. Concluyen que Ballmer a

descontextualizado y manipulado la

información ofrecida por estudios “inde-

pendientes” con el fin de influenciar las

decisiones de sus clientes. �

�Hispafuentes y CeresLa empresa de software libre española

Hispafuentes y la Fábrica Nacional de

Moneda y Timbre-Real Casa de la

Moneda han desarrollado conjuntamente

drivers para tarjeta criptográfica “Ceres”.

Esta tarjeta abre las puertas a la adminis-

tración electrónica y permite acceder a

todos los servicios que, como la Agencia

Tributaria entre otros, admiten certifica-

dos digitales emitidos por la FNMT que

garantizan la autenticación, integridad,

confidencialidad y no repudio en las

comunicaciones en redes abiertas. Hasta

hoy, esta tarjeta sólo era soportada por

plataformas Windows de Microsoft,

pero, cosa a la que nos tiene acostum-

brados la administración, a partir de

ahora, y gracias a Hispafuentes, todos

los usuarios de Linux que utilicen naveg-

adores basados en Mozilla (Mozilla,

Firefox, Netscape, Galeon, etc.), podrán

beneficiarse de las ventajas de realizar

gestiones autentificadas a través de

Internet. La solución se basa en Opensc,

una librería para trabajar con tarjetas

inteligentes. La versión desarrollada por

Hispafuente y la FNMT-RCM en conjun-

ción con HispaLinux, aporta soporte

para tarjetas del tipo PKCS#11, PKCS#15

y manejo de claves y certificados con las

tarjetas Ceres de FNMT-RCM, lo que, a

efectos prácticos, abre las puertas de la

Administración Electrónica de par en par

para los usuarios de GNU/Linux. El dri-

ver se puede bajar de https://

software-libre.org/projects/opensc-ceres/�

El fundador de eBay y filántropo Pierre

Omidyar acaba de de tomar una decisión

importante en su carrera como benefac-

tor de la humanidad: a partir

de ahora, su fundación, anteri-

ormente Omidyar Foundation,

cambia de nombre y se con-

vierte Omidyar Network. El

cambio es importante -y caro-,

ya que con el cambio, el

empresario deja de invertir

exclusivamente en organizaciones sin

ánimo de lucro y abre las puertas a la

ayuda a empresas con fines comerciales.

Desde junio, la nueva organización a

invertido en varias áreas, incluyendo

microfinanzas, código abierto, propiedad

intelectual, votación y software social,

todo con el ánimo de mejorar a los más

desfavorecidos en el mundo. De entrada,

esto va a suponer a renunciar de

millones de dólares en exen-

ciones fiscales, pero según,

Omidyar, “[nos preguntamos] si

eBay es un tan buen ejemplo de

como la gente descubre su poder

individual, entonces, ¿tiene sen-

tido como fundación poder

invertir en algo como eBay?”. De

momento, entre otras organizaciones, se

han asociado con Sourceforge para apo-

yar y financiar proyectos de software

libre. Más información en http://www.

omidyar.net/. �

�eBay: Open Source a Subasta �SCO on the RocksLas acciones del grupo

SCO han caído en picado

en estos últimos meses. El

lunes 25 de octubre, sus acciones cer-

raron a 3,01 dólares por acción, lo que

supone una caída de un 83% con respec-

to a enero de éste mismo año, cuando

sus valores cotizaban a 18,19 dólares. La

empresa de Darl McBride ha visto como

el volumen de negocio para su sistema

operativo Unix ha descendido de 7,3 mil-

lones de dólares a poco más de 670 mil

dólares en un año. Los observadores

financieros achacan esta mala racha a la

erosión de la imagen de SCO debido a lo

que parece ya una batalla legal perdida

contra IBM. �

Page 9: Linux Magazine - Edición en Castellano, Nº 01

�OpenBSD 3.6A primeros de noviembre seliberó la nueva versión deOpenBSD, la popular ver-sión de Unix BSD de códigoabierto, para su descarga opedido en CD. Aparte deparches y mejoras varias, estanueva versión soporta SMB enplataformas i386 y AMD64, se hadepurado el servidor y clientesDHCP y se han implementado nuevosdemonios para vigilar la conexión denuevos dispositivos. Asimismo, se haampliado el catálogo de drivers, con

9www.linuxmagazine.com.es Número 01

Noticias NOTICIAS

Noticias

En la eterna partida entre usuarios y con-sumidores contra corporaciones conafanes abusivos monopolísticas, elequipo de los consumidores acaba demarcar un importante tanto. Ya se sabeque sólo hace falta que una empresaaulle “¡Propiedad Intelectual!” para queun ejército de abogados sin nada mejorque hacer salga arrastrándose de debajode las piedras, presto a defender la com-pañía, el sistemas capitalista y la civi-lización moderna tal y como lo concebi-mos ante la salvaje horda de piratas,usurpadores de copyright y Pedosperosvarios que andan a la búsqueda de ladestrucción del mundo. En este caso, fuela compañía fabricante de impresorasLexmark y el artículo de consumo origende la controversia, un… ¿cartucho detoner? Pues sí, amiguitos y amiguitas, uncartucho de toner. En el 2003, elLexmark tuvo la genial idea de dotar asus cartuchos de un chip que imple-mentaba tecnología DMCA (el que se uti-liza habitualmente para evitar la repro-ducción de medios pirateados e imple-mentado en el sistema Palladium deMicrosoft) para evitar que terceras partescreasen clones de sus cartuchos. Comoes bien sabido, existe toda una industriadedicada a producir versiones másbaratas de consumibles de impresoraoriginales, aportando, de paso, una

buena y necesaria dosis de compe-titividad al sector. Uno de los jugadoresde dicha industria, Static ControlComponents, ni corto ni perezoso, leaplicó la ingeniería inversa al chip y a laspocas semanas estaba vendiendo supropia versión, el “Smartek”, a fabri-cantes de toner para que la incorporasena sus cartuchos. Cómo viene siendohabitual, cuando una empresa no puedehacer nada en el campo de batalla delmercado, pues se pleitea y punto.Lexmark hizo lo propio y arrastró a SCCa los tribunales. En un principio,Lexmark pareció ganar el tanto, cuandoun juez, a principios del 2003, falló enfavor del fabricante de impresoras. Peroal final ha prevalecido el sentido comúny en un nuevo fallo de octubre del 2004,otro tribunal invalida el primer dicta-men, alegando que no es de recibo colo-car dispositivos de DMCA en algo que nosea un producto con copyright. En con-creto, el fallo reza: “Debemos dejar bienclaro que en futuro, empresas comoLexmark no pueden utilizar tecnologíasDMCA en conjunción con leyes sobrecopyright para crear monopolios debienes manufacturados para sí mismos”.Ámen. �

�Lexmark lo intenta… ¡Fallaaaa!

�Creciendo JuntosA estas alturas de siglo ya todo el mundoestá familiarizado con el estudio deAndago donde se nos cuenta que el usodel software libre ha aumentado un 39%en España a lo largo del año pasado.Esto no debe sorprendernos, máximecuando incluso un medio de comuni-cación mayoritario basan una campañaen regalar un CD con Linux a sus lec-tores. HispaFuentes, por su lado, sesuma a la moción con su propio estudiodonde se afirma que para el 2007 el 25%de los ordenadores a nivel mundial cor-rerán una versión u otra de Linux. Elestudio basa sus conclusiones en la tasade crecimiento anual, que sitúa a Linuxcomo sistema operativo de mayor crec-imiento con un índice de expansión del

16,6%. Le siguen en segundo lugarWindows (por supuesto) con una tasa decrecimiento del 10,5% y el farolillo rojolo componen otros Unices que vendescender su implantación a un 4,5%anual. En lo que se refiere a servidores,la cuota de mercado será del 58,8% paraWindows (55,1% en el año 2002), del

32,7% para Linux (23,1% en 2002) y del5,7% para Unix (11% en 2002), lo queindica que la implantación de Linuxafectará bastante más a Unix que al sis-tema operativo de Microsoft con suincremento de popularidad. Otra señalde la gradual e imparable implantaciónde Linux en el mercado mundial son lascifras que se refieren al incremento devolumen de negocio. El estudio señalaque crecerá de 280 millones de dólares(cifra registrada en el 2003) a un apabul-lante 3.000 millones de dólares en el2008. �

nuevos interfaces para dis-positivos inalámbricos,

Ethernet sobre USB,puentes PCI-ISA ysensores varios. En elapartado de mejoras,

se ha mejorado elrendimiento y seguridad

en NFS. El catálogo desoftware incluye portes para

más de 2700 aplicaciones y más de 2800paquetes precompilados. Para más infor-mación, dirigirse a http://www.openbsd.

org/es/36.html. �

Page 10: Linux Magazine - Edición en Castellano, Nº 01

631). El proyecto de Vulnerabilidades yExposiciones Comunes (Common Vulne-rabilities and Exposures o CVE - http://cve.mitre.org) ha asignado el nombreCAN-2004-0558 a este problema. �

Referencia Debian: DSA-545-1

Referencia Gentoo: GLSA 200410-06/cups

Referencia Mandrake: MDKSA-2004:097

Referencia Red Hat: RHSA-2004:449-17

Referencia Slackware: SSA:2004-266-01

Referencia Suse: SUSE-SA:2004:031

�getmailgetmail es un sustituto fiable de fetchmailque soporta Maildir, Mboxrd y envío deMDAs externos. David Watson descubrió

una vulnerabilidad en getmail cuando seconfigura para correr como root y envíacorreo a ficheros maildir/mbox de usuar-ios locales no de confianza. Un usuariolocal malicioso podría explotar una condi-ción de carrera, o un ataque symlink simi-lar y dotar a getmial con la capacidad decrear o sobrescribir ficheros en cualquierdirectorio en el sistema. No se debe ejecu-tar getmail como usuario privilegiado ni,en la versión 4, utilizar un MDA externocon privilegios de usuarios y gruposexplícitamente configurados. Todos losusuarios de getmail deben actualizar a laúltima versión. �

Referencia Debian: DSA-553-1

Referencia Gentoo: GLSA 200409-32/get-

mail

Referencia Slackware: SSA:2004-278-01

�MozillaMozilla es un navegador web de códigoabierto, un cliente de correo y grupos denoticias avanzado, cliente IRC y editor deHTML. Se han descubierto recientementevarios errores en la suite. Jesse Rudermandescubrió un error de scripting multido-minio en Mozilla. Si a un usuario se leengaña para que arrastre un enlace deJavascript hasta otro marco o página, sedota al atacante de la capacidad de hurtaro modificar información sensible de esesitio. Además, si a un usuario se leengaña para que arrastre secuencialmentedos enlaces a otra ventana (no marco), sele dota al atacante de la capacidad de eje-cutar comandos arbitrarios. El proyectode Vulnerabilidades y ExposicionesComunes (Common Vulnerabilities andExposures o CVE - http://cve.mitre.org)ha asignado el nombre CAN-2004-0905 aeste problema. Gael Delalleau ha descu-bierto un desbordamiento de entero queafecta le código que maneja BMP dentrode Mozilla. Un atacante podría utilizar unfichero BMP cuidadosamente manipuladopara provocar un cuelgue del programa oque ejecuta código arbitrario cuando sevisualizase el archivo. El CVE ha asignadoel nombre CAN-2004-0905 a este proble-ma. Georgi Guninski ha descubierto undesbordamiento de búfer basado en pilaen las rutinas de muestra de vCard. Unatacante podría crear un vCard cuida-dosamente manipulado que podría hacerque Mozilla se cuelgue o ejecute códigoarbitrario cuando se muestra. El mismo

Inseguridades

10 Número 01 www.linuxmagazine.com.es

NOTICIAS Inseguridades

Distribuidor Fuente Seguridad ComentarioDebian Info:http://www.debian.org/security/ Los avisos de seguridad actuales se in-

Lista:http://www.debian.org/debian-security-announce/ cluyen en la página de inicio. Los avisos

Referencia: DSA-…1) se proveen como páginas HTML con

enlaces a los parches. Los avisos también

incluyen una referencia a la lista de

correo.

Gentoo Info:http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para

Foro:http://forums.gentoo.org/ la lista Gentoo en el sitio web de

Lista:http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la

Referencia: GLSA:… 1) página principal. Los avisos se presentan

en HTML con códigos para fusionar las

versiones corregidas.

Mandrake Info:http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web

Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionadas con

Referencia: MDKSA:… 1) la seguridad. Entre otras cosas,incluye

de avisos seguridad y referencias a las

listas de correo. Los avisos son páginas

HTML, pero no contienen enlaces a los

parches.

Red Hat Info:http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad

Lista:http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A

Referencia: RHSA-… 1) continuación los problemas para cada

versión de Red Hat se agrupan. Los avisos

de seguridad se proveen como una

página HTML con enlaces a los parches.

Slackware Info:http://www.slackware.com/security La página de inicio contiene enlaces al

Lista:http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo.

Referencia: [slackware-security]… 1) No existe información adicional sobre

seguridad en Slackware.

Suse Info:http://www.suse.de/en/private/support/ Ya no existe un enlace a la página de

security/index.html seguridad tras un remodelado en el sitio

Parches:http://www.suse.de/en/private/ web de SuSE. Existe información en la

download/updates Lista: suse-security-announce lista de correos y los avisos. Los parches de

Referencia: SUSE-SA… 1) seguridad para versiones individuales de

SuSE Linux se muestran de color rojo en el

sitio de actualizaciones generales.

Contiene una corta descripción de la

vulnerabilidad que el parche soluciona.1) Todos los distribuidores muestran correos de seguridad en el campo Subject.

Políticas de seguridad de la Distribuciones Mayoritarias

�CUPSEl Common UNIX Printing System(CUPS) es un sistema de impresión.Álvaro Martínez Echevarria informó deun error en la versión del Protocolo deImpresión de Internet (Internet PintingProtocole o IPP) en versiones de CUPSantertiores a 1.1.21. Un atacante podríaenviar un paquete cuidadosamenteescrito al puerto IPP, lo que podría provo-car que CUPS dejara de escuchar en esepuerto y desencadenar un ataque dedenegación de servicio. Para poderexplotar este error, un atacante tendríaque tener la capacidad de enviar unpaquete UDP al puerto IPP (por defecto,

Page 11: Linux Magazine - Edición en Castellano, Nº 01

autor ha descubierto otro desbordamientode búfer basado en pila en el módulo de“Envío de Página”. El proyecto deVulnerabilidades y Exposiciones Comu-nes (Common Vulnerabilities and Ex-posures o CVE - http://cve.mitre.org) haasignado el nombre CAN-2004-0902 aeste problema. Wladimir Palant ha descu-bierto un fallo en la manera en queJavascript interactúa con el portapapeles.Un atacante tiene la posibilidad de utilizarcódigo malicioso de Javascript para robardatos sensibles que han sido copiados alportapapeles. El proyecto de Vulnera-bilidades y Exposiciones Comunes(Common Vulnerabilities and Exposureso CVE - http://cve.mitre.org) ha asignadoel nombre CAN-2004-0908 a este proble-ma. �

Referencia Red Hat: RHSA-2004:486-18

Referencia Slackware: SSA:2004-266-03

Referencia Suse: SUSE-SA:2004:036

�gtk+El paquete gtk2 contiene el kit de her-ramientas de the GIMP (GTK+), una libr-ería para la creación de interfaces gráficosde usuario para el sistema de ventanas X.Durante las pruebas de un fallo anterior-mente corregido en QT (CAN-2004-0691),se descubrió un error en el procesador deimágenes BMP de gtk2. Una atacantepodría crear un fichero BMP cuidadosa-mente manipulado que podría provocarque una aplicación entrase en un bucleinfinito y no respondiese a las entradas del usuariocuando fuese abierto por la víctima. El proyecto de Vulnerabilidades y Ex-posiciones Comunes (Common Vulnera-bilities and Exposures o CVE - http://cve.mitre.org) ha asignado el nombreCAN-2004-0753 a este problema. Duranteuna auditoría de seguridad, Chris Evansdescubrió un desbordamiento de pila enel decodificador de imágenes XPM. Unaatacante podría crear un fichero XPMcuidadosamente manipulado que podríahacer que una aplicación enlazada congtk2 se cuelgue o posiblemente ejecutecódigo arbitrario cuando la víctima abrael fichero. El proyecto de Vulnerabilidadesy Exposiciones Comunes (CommonVulnerabilities and Exposures o CVE -http://cve.mitre.org) ha asignado losnombres CAN-2004-0782 y CAN-2004-0783 a este problema. El mismo autor

también descubrió un desbordamiento deentero en el decodificador de imágenesICO. Un atacante podría crear un ficheroICO cuidadosamente manipulado quehiciera que una aplicación enlazada congtk2 se cuelgue cuando la víctima abrieseel fichero (CAN-2004-0788). �

Referencia Debian: DSA-549-1

Referencia Red Hat: RHSA-2004:466-12

Referencia Slackware: SSA:2004-266-02

Referencia Suse: SUSE-SA:2004:033

�OpenOffice.orgOpenOffice.org es un conjunto de aplica-ciones para la productividad ofimáticaque incluye programas de escritorio,como procesadores de texto, hoja de cál-culo, administrador de presentaciones,editor de fórmulas y un programa de dis-eño. La empresa Secunia Research infor-mó de un problema derivado de la manip-ulación de ficheros temporales enOpenOffice.org. Un usuario local mali-cioso podría utilizar este fallo para acced-er a los contenidos de los documentosabiertos de otro usuario. El proyecto deVulnerabilidades y Exposiciones Comu-nes (Common Vulnerabilities andExposures o CVE - http://cve.mitre.org)ha asignado el nombre CAN-2004-0752 aeste problema. Se aconseja a todos losusuarios de OpenOffice.org que actuali-cen sus programas con los paquetes deactualización de OpenOffice.org que con-tienen un parche retroactivo para corregireste problema. �

Referencia Mandrake: MDKSA-2004:103

Referencia Red Hat: RHSA-2004:446-08

�SpamAssassinSpamAssassin aporta maneras de reducircorreos electrónicos comerciales no solici-tados (SPAM) en las bandejas de correoentrante. Se ha encontrado un error dedenegación de servicio en versiones infe-riores a 2.64. Un atacante maliciosopodría crear un mensaje de tal modo queprovocaría que SpamAssassin dejara deresponder. Este ataque de denegación deservicio podría provocar queSpamAssassin deje de remitir y filtrarcorreo. El proyecto de Vulnerabilidades yExposiciones Comunes (CommonVulnerabilities and Exposures o CVE -http://cve.mitre.org) ha asignado el nom-bre CAN-2004-0796 a este problema. Losusuario de SpamAssassin deberán actu-

alizar sus sistemas para incluir los paque-tes nuevos que solucionan este problema.Los nuevos paquetes contienen un parcheretroactivo que no es vulnerable a estetipo de ataques de denegación de servi-cio. �

Referencia Red Hat: RHSA-2004:451-05

�XFree86XFree86 es una implementación de códi-go abierto del sistema de ventanas X.Aporta una funcionalidad básica de bajonivel para la que están diseñadas losinterfaces gráficos de usuario (GUIs) com-pletos tales como Gnome o KDE. Duranteuna auditoría de código fuente, ChrisEvans descubrió varios fallos de desbor-damientos de pila y un desbordamientode entero en la librería libXpm de X.orgutilizada para decodificar imágenes XPM(X PixMap). Un atacante que supieraaprovechar este problema, podría crearun fichero XPM cuidadosamente manipu-lado que haría que una aplicación enlaza-da con la mencionada librería se colgase yejecutase código arbitrario si el fichero esabierto por la víctima. El proyecto deVulnerabilidades y Exposiciones Comu-nes (Common Vulnerabilities andExposures o CVE - http://cve.mitre.org)ha asignado los nombres CAN-2004-0687, CAN-2004-0688 y CAN-2004-0692 aestos problemas de seguridad de XFree86.Se descubrió un fallo en el X DisplayManager (XDM). XDM abría un socketTCP chooserFd, aún si el parámetroDisplarManager.requestPort estuvieraestablecido como 0. El efecto de estasituación es que permitía el acceso deusuarios autorizados al ordenador através de X, aún si el administrador delordenador hubiera configurado XDM pararechazar conexiones. Aunque XFree86versión 4.3.0 no era vulnerable a esteproblema, Red Hat Enterprise Linux 3contenía un parche retroactivo que intro-ducía el error. El proyecto deVulnerabilidades y Exposiciones Comu-nes (Common Vulnerabilities and Expo-sures o CVE - http://cve.mitre.org) haasignado el nombre CAN-2004-0419 a esteproblema. �

Referencia Debian: DSA-561-1

Referencia Gentoo: GLSA 200409-34/X

Referencia Mandrake: MDKSA-2004:099

Referencia Red Hat: RHSA-2004:478-13

Referencia Suse: SUSE-SA:2004:034

11www.linuxmagazine.com.es Número 01

Inseguridades NOTICIAS

Page 12: Linux Magazine - Edición en Castellano, Nº 01

12 Número 01 www.linuxmagazine.com.es

Especial RedesPORTADA

izan en las empresas se hacen por vía

electrónica. Si bien la mayor parte de las

oficinas están cableadas, los LANs

inalámbricos hacen su agosto en los

despachos y redes domésticas. Y una vez

organizado el aspecto físico de la red, es

hora de ponerse serios con el software.

Cada máquina en la red necesita una

dirección única, ha de conocer en que

red reside y debe saber a que máquina se

ha de dirigir en el caso de que necesite

enviar datos más allá de los límites de la

red local, al gran mundo mundial de por

ahí fuera.

Cuestión de PlanteamientosLas opciones son o meticulosamente

configurar todas y cada una de las

máquinas o montar un servidor especial

que se encargue del trabajo sucio. El

esfuerzo extra inicial que supone la

segunda solución, suele tener su recom-

pensa a medio y largo plazo, es-

pecialmente si la red tiende a seguir cre-

ciendo y se hacen necesarios cambios

en la configuración. Añádase a la

mezcla un par de portátiles que se

conectan aquí y allá y uno llega a

apreciar una distro moderna que

suministra herramientas que

facilitan la configuración de

cambios de topología, como

SCPM de SuSE. Las nuevas

configuraciones tienden a

tener problemas en sus

infancias. En tal caso, las

herramientas estándar

de Linux pueden ser

de una gran ayuda.

Aunque es habitual

sentirse incómodos

con las herrami-

entas estándar

en un principio,

tienen la ven-

taja de que se encuentran disponibles en

casi cualquier distribución . Y una vez

que se tiene la red montada y en fun-

cionamiento, se pueden empezar a

asignar tareas a máquinas individuales

para el beneficio de toda la red, como,

por ejemplo, estableciendo una máquina

como servidor DHCP o de impresión. �

El correr de aquí para allá con dis-

quetes era una cosa común hace

escasamente pocos años. Puede

que el lector recuerde haber utilizado

floppys para difundir hojas de cálculo,

transportar el último capítulo de la tesis

desde el centro de cálculo de la facultad

hasta el ordenador en el departamento o

para compartir los últimos cotilleos entre

amigos y compañeros. En la actualidad,

los libros de cocina están siendo exilia-

dos de su recinto tradicional, siendo

sustituidos por portátiles; el equipo de

música es un sencillo cliente que recoge

MP3s del servidor alojado en el trastero

y no hace falta ni mencionar

que la mayor parte de las

comunicaciones

que se real

El ordenador sin conexión es una especie en vías de extinción. Es casi imposible hoy en día concebir una máquina que no

tenga conexión a Internet o a una red local. Estos últimos, con o sin acceso a Internet, agilizan el trabajo en las empresas

y ofrecen oportunidades sin límites para el ocio. POR PATRICIA JUNG

Los Qués y Cómos de la Administración de LANs

La Enredadera

Herramientas de Red .........13Desde el momento que conectamos una

máquina a una red, no sólo se exige saber

como funciona aisladamente, sino como se

comunica con el mundo exterior. Las her-

ramientas estándar suministradas con Linux

pueden ayudarnos a ello.

Servidores DHCP................16La adición de nuevas máquinas a una red

significa más trabajo de configuración. Una

solución centralizada que utilice un servidor

DHCP que se encargue de la asignación de

direcciones IP y otros valores a los clientes,

cura eficazmente el dolor de cabeza admin-

istrativo.

SCPM...................................21El cambio del entorno operacional de una

sola máquina entraña mucho trabajo de

configuración. SCPM le facilita la vida a los

usuarios de SuSE al mantener una base de

datos de perfiles con distintas configura-

ciones.

CUPS: Impresión en Red ....23La compartición de una impresora entre

múltiples usuarios puede ayudar a ahorrar

dinero y recursos. Podemos conectar impre-

soras a un servidor CUPS para dar acceso

incluso a clientes de Microsoft o Apple.

COVER STORY

[1] Guía de Interfaz Humano de Gnome:

http://developer.gnome.org/projects/

gup/hig/

[2]Freedesktop.org http://freedesktop.org/

RECURSOS

Page 13: Linux Magazine - Edición en Castellano, Nº 01

13www.linuxmagazine.com.es Número 01

PORTADAHerramientas Red

Como un navegador

Web no necesita saber si la

información se transmite

mediante componentes in-

alámbricos o mediante

líneas FDDI, ni las líneas

FDDI necesitan saber si los

bytes que transporta corre-

sponden a ficheros HTML,

MP3s o vídeos, los exper-

tos en redes utilizan un

modelo basado en capas

para describir las redes de

ordenadores. Al margen de que cada

capa se apoya en la capa subyacente, las

capas son independientes entre sí.

La capa aplicación, como su propio

nombre indica, define como las aplica-

ciones como buscadores o programas de

correo hablan con servidores Web o de

correo. El medio por el cual ocurre esto

depende de cada aplicación. Por ejem-

plo, el Protocolo de Trasferencia de

Hipertexto, HTTP, es usado para Webs,

mientras que el Protocolo de Transferen-

cia de Ficheros, FTP, es usado

habitualmente para la descarga de

ficheros.

La capa de transporte está por debajo

de la capa de aplicaciones. Esta capa

establece las conexiones entre orde-

nadores, permitiéndoles el intercambio

de datos. TCP proporciona un canal de

garantía (para protocolos de aplicaciones

como HTTP, SSH, POP o SMTP), asegu-

rando que los bloques de información

que fallen son retransmitidos. El Proto-

colo Datagram (UDP) es otro protocolo

importante a este nivel que puede trans-

mitir bloques de información, pero con

perdidas de paquetes. Este protocolo es

el usado, por ejemplo, por los canales de

Real Audio.

En la siguiente capa es donde las cosas

empiezan a ponerse interesantes. Aquí

es donde los paquetes de información

(independientemente de su contenido)

son puestos en un cable e intentan bus-

car la mejor ruta a su destino. Cada

bloque contiene la dirección de su remi-

tente y de su receptor. Cuando se sirve

una página, los paquetes de información

pueden utilizar rutas distintas. Tras acep-

tar los paquetes, el receptor debe

asegurarse de que los paquetes se

pueden reorganizar en el orden correcto.

Al margen del propio Protocolo de Inter-

net, la capa de red contiene otros

protocolos como el Protocolo de Control

de Mensajes de Internet, ICMP, para el

control de mensajes (por ejemplo, de

error), el Protocolo de determinación de

Direcciones, ARP, que confronta direc-

ciones IP con direcciones de hardware

(MAC) y, su homólogo, el Protocolo de

Inversión de Direcciones Determinadas

(RARP).

La capa inferior del modelo OSI es la

capa Física. A este nivel estamos intere-

Un ordenador sin conexión al

mundo exterior parece un paso

atrás. Si bien los distribuciones

de Linux de hoy en día soportan normal-

mente la instalación de componentes de

red, los administradores han de asumir

su parte de responsabilidad y, en algunos

casos, su formación puede no haber

cubierto técnicas de redes. En estos

casos lo lógico es obtener el mayor

conocimiento posible sobre lo que nece-

sita un ordenador para conectarse a una

red.

Una red puede no responder o una

máquina aislada (por ejemplo un servi-

dor Web) puede no estar accesible. Los

principales distribuidores de Linux

disponen de herramientas que controlar

estas situaciones.

Fundamentos de redesEl componente básico de Internet y de

numerosos sistemas de red local es el

TCP/IP. Es una combinación del Proto-

colo de Control de Transmisiones y el

Protocolo de Internet, especificando

como se comunican e intercambian

datos los ordenadores en una red.

Las máquinas conectadas a la red ofrecen enormes beneficios, pero añaden

responsabilidades. Desde el momento en que conectamos nuestra máquina

a la red debemos no solo conocer todo acerca de nuestra máquina, si no

también sobre la forma en que ésta se comunica con el mundo exterior.

Las herramientas estándar de Linux nos pueden ayudar. POR NICO LUMMA

Introducción a Herramientas de Red

Linux en Red

DNS: los servidores DNS contienen bases dedatos que se pueden usar para emparejardirecciones IP con nombres de Internet (yviceversa). Buscan en sus bases de datos pararesponder consultas enviadas por buscadoresy aplicaciones de Internet desconocidas porsus usuarios. Un usuario que escribewww.google.com está realmente formu-lando una consulta cuya respuesta es ladirección IP 216.239.39.99. Es con esta direc-ción con el que el buscador abrirá realmentela conexión.

GLOSARIO

Figura 1: Los numerosos datos de obtenidos por “ip addr” incluyen

información crítica de la dirección IP actual e “inet” indica la más-

cara de red.

Page 14: Linux Magazine - Edición en Castellano, Nº 01

14 Número 01 www.linuxmagazine.com.es

Herramientas RedPORTADA

antiguos puede que solo tengan los

comandos ipconfig y route, que propor-

cionan la misma información, pero en

un formato distinto. Es posible que si el

sistema no puede localizar estos coman-

dos sea por que estén instalados en

/sbin, que no es una ruta habitual de

búsqueda. Si éste es el caso, simple-

mente debemos añadir la ruta completa

(por ejemplo, /sbin/ip).

La opción addr indica al comando ip

que debe mostrar los detalles de nuestro

adaptador de red. Si queremos indicar el

número de adaptador debemos incluir la

línea eth0 para la primera tarjeta de red,

eth1 para la segunda y así sucesiva-

mente. Esto mostrará nuestra dirección

IP (192.168.1.245 en la Figura 1), la más-

cara de red (/24), la dirección de

difusión (192.168.1.255) y el nombre del

interfaz de la red, eth0. Los datos

obtenidos con el comando ip route son

más sencillos de leer (ver Figura 2). La

primera línea muestra la red (la direc-

ción de la red en nuestro ejemplo es

192.168.1.1), la máscara de la red /24, el

interfaz de la red y finalmente el origen

de los datos (src significa origen), o sea,

la dirección IP (192.168.1.245). La

segunda línea muestra la puerta de

enlace por defecto 192.168.1.1. Si aquí

no aparece información crítica como la

dirección IP o la puerta de enlace puede

explicar que nuestro ordenador no se

comporte en la red como debiese. Si éste

es el caso, debemos ejecutar la her-

ramienta de configuración de nuestro

distribución (por ejemplo YaST for Suse)

y comprobar nuestra configuración.

Ping-Pongping es una herramienta de análisis de

redes muy simple y tremendamente

práctica. Transmite un paquete de datos

ICMP desde nuestro ordenador a un

objetivo, mostrando el tiempo que la

respuesta tarda en llegar devuelta a nue-

stro ordenador (suponiendo que el

receptor responda). La parte final nos

muestra el número de paquetes ping

transmitidos (cinco en la Figura 3),

cuantas respuestas obtuvimos (cinco de

nuevo) y cuanto tardo el proceso (4002

milisegundos). Si algún paquete se

pierde es mostrado en la sección packet

loss. Si el receptor no se puede alcanzar

no ocurre nada durante un rato, puesto

que ping espera respuestas. ping nom-

bredehost lanza un ping hacia el receptor

hasta que presionamos [Ctrl-c]. En su

sados en la transmisión de bits y la

estandarización de de la negociación de

protocolos con interfaces eléctricas,

mecánicas y de señalización. Esto

incluye los estándares RS-232 y X.21.

Los componentes de red son identifi-

cados mediante su dirección IP. TCP

puede retransmitir paquetes asegurando

que el receptor dispone del conjunto

completo de paquetes. El protocolo de

aplicaciones en el nivel superior

depende de este servicio. Sin un

conocimiento básico de estas capas,

muchas de las herramientas de red no

tendrían mucho sentido.

Comprobación del estadoAntes de comenzar a analizar el tráfico

de red es importante comprobar que

nuestro ordenador esté utilizando la red

adecuadamente.

Dicho de forma sencilla, cada máquina

necesita una dirección IP única para ser

capaz de comunicarse con otras

máquinas en la red. La dirección de la

puerta de enlace permite que los paque-

tes de datos destinados al exterior

abandonen la red local.

El comando ip proporciona detalles de

la configuración actual. Los sistemas

Figura 2:“ip route” proporciona información IP más clara. Figura 3: La máquina receptora, 192.168.1.1, respondió a los 5 pings enviados.

Figura 4:“traceroute” muestra la ruta hasta “linux-magazine.com”. Figura 5:“mtr” combina los resultados de “traceroute” y de “ping”.

Page 15: Linux Magazine - Edición en Castellano, Nº 01

15www.linuxmagazine.com.es Número 01

PORTADAHerramientas Red

lugar podemos especificar ping -c 10

nombredehost para transmitir solo 10

pings.

RutasSi bien ping simplemente nos informa de

la respuesta de nuestro objetivo, tracer-

oute (normalmente: /urs/sbintraceroute)

nos indica la ruta que los paquetes de

datos han seguida hasta la máquina de

destino (ver Figura 4). Los asteriscos

(***) indican un error en la ruta o que

un cortafuegos no ha permitido el paso a

este tipo de paquetes IP. Por cierto,

podemos especificar la opción -n con el

fin de no mostrar el nombre de equipo.

mtr hostdestino (normalmente: /urs/

sbin/mtr) nos proporciona una imagen

clara (ver Figura 5) de por dónde pasan

nuestros paquetes mientras no presion-

amos [q]. La herramienta descubre que

ocurre con los paquetes de datos en cada

cambio en la ruta. Por tanto, mtr puede

ser considerado como una combinación

de ping y traceroute.

mtr -c 10 -reportU

<I>hostdestino<I>

Indica a mtr que deje de transmitir tras 10

pings y luego informe de sus hallazgos.

La columna HOST indica exactamente

donde esta el paquete de datos; LOSS

indica el porcentaje de paquetes perdi-

dos; RCVD y SENT informan del número

de paquetes que fueron recibidos y envi-

ados; y las columnas BEST, AVG y

WORST indican cuanto tiempo tardaron

los paquetes.[1] tcpdump: http://www.tcpdump.org/

RECURSOS

Figura 7: ¿Cuantos paquetes van y vienen desde qué dirección? Figura 8:“iptraf” proporciona estadísticas de red detalladas.

Para mayor precisión…… prueba tcpdump, la herramienta de

análisis de redes más versátil que existe.

La mayoría de los distribuciones nos

proporcionarán un paquete listo para

usar. Si no es el caso, podemos descargar

uno desde [1] (sin olvidar el archivo

libpcap requerido) y compilar la her-

ramienta nosotros mismo. Necesita-

mos privilegios de administrador para

utilizar esta herramienta puesto que

habilita el modo promiscuo de nuestra

tarjeta de red permitiéndole leer

cualquier bloque de datos que aparezca

en nuestra red local. Esto puede permitir

a un usuario leer las contraseñas de otras

personas.

tcpdump nos va a mostrar cualquier

paquete de datos que nuestra tarjeta de

red vea.

11:56:27.833598 192.168.1.245

.ssh > 192.168.1.20.39258: P

1392512:1392720(208) ack 1201

win 9120 <nop,nop,timestamp

2599771999 1711932971> (DF)

[tos 0x10]

Podemos ver que 192.168.1.245 ha envi-

ado un paquete de datos ssh a la

máquina 192.168.1.20. Escribe…

tcpdump -i eth0 port 80

… y nos mostrará los datos del puerto

80, que es el que la mayoría de los bus-

cadores Web usan. Por otro lado,

tcpdump nombrehost nos mostrará el trá-

fico de red del host destino.

¿Quién va?Tiene sentido la instalación de her-

ramientas especializadas que nos eviten

perdernos. iptraf es un ejemplo. Nos dice

exactamente que está ocurriendo con

nuestra tarjeta de red, que protocolos

está utilizando actualmente y con que

máquinas se está comunicando. Es-

cribiendo [q] [Intro] se cierra esta

herramienta.

El menú principal (Figura 6) contiene

un monitor de tráfico IP (ver Figura 7)

que nos muestra el tráfico de entrada y

salida, permitiendo encontrar los puntos

donde las transiciones ocurren.

Por otro lado, el interfaz de esta-

dísticas detallado (ver Figura 8) no

nos muestra que máquinas están

intercambiando datos, pero analiza

los flujos de tráfico por protocolos.

Esto nos proporciona información

muy valiosa sobre el rendimiento e

indica cuellos de botella. Por ejemplo,

si hay más salidas que entradas,

podemos suponer que alguien está

descargando algo desde nuestra má-

quina.

Por supuesto que podríamos decir

mucho más acerca de iptraf y las otras

herramientas mencionadas en este

artículo. Pero si deseas enriquecer tus

conocimientos en esta área no hay alter-

nativa a los conocimientos básicos de

redes. �

Page 16: Linux Magazine - Edición en Castellano, Nº 01

16 Número 01 www.linuxmagazine.com.es

diario se encuentran con problemas

cuando el número de máquinas conec-

tadas a la red crece de forma continua.

Cada IP sólo puede ser asignada a una

máquina para evitar conflictos en la red.

Incluso suponiendo que se mantenga

cuidadosamente las asignaciones IP (y

uno sepa donde está la lista), si se quiere

reestructurar la red (añadir un servidor

de nombres, usar diferentes máscaras de

red o incluso asignar una dirección IP

diferente al router para acceder a redes

públicas), implicará reconfigurar de

forma manual cada máquina.

Los usuarios de ordenadores portátiles

también tienen que saber cómo y dónde

realizar los cambios oportunos para

conectarse a la red. Para ser honestos:

¿Sabes cómo configurar los

parámetros de red en un

MacOS 7.6? y ¿quieres admitir

que sabes como configurar la

red en Windows 98? El Proto-

colo de Configuración

Dinámico de Hosts (DHCP)

nos proporciona la respuesta.

Para usar DHCP se necesita

configurar una máquina como

servidor DHCP. Una vez hecho

esto, esta máquina será la

responsable de establecer los

No importa si se está trabajando

para una empresa, si se está

organizando una party en el

campus, si se está montando una red en

un complejo turístico o simplemente te

estas montando una red en tu propia

casa, configurar de forma individual

cada máquina de la red implica trabajo

extra. Desde luego, un administrador de

sistemas puede asignar direc-

ciones IP, máscaras de red,

puerta de enlace por defecto y

el nombre del servidor. Pero

intenta hacer esto mismo con

un grupo de gente con distin-

tos niveles de conocimiento y

empezarán a surgir los proble-

mas.

Incluso los administradores

de redes más experimentados

y que llevan años adminis-

trando redes en su trabajo

Añadir máquinas a una red implica

un trabajo extra de configuración.

Una solución centralizada que use un

servidor DHCP para asignar las direc-

ciones IP y otros parámetros a las

máquinas clientes nos quitará un

motón de dolores de cabeza a la hora

de administrarlas.

POR MICHAEL RENNER

Un servidor DHCP para una red de área local

Redes sin Estrés

Dirección IP: Cada máquina de red se identi-

fica con una única dirección IP de 32 bits. Para

que sea legible se usa la notación punto dec-

imal, donde cada segmento de la dirección es

un número entre 0 y 255. Además de la direc-

ción IP oficial que asegura un acceso global,

hay un rango de direcciones que se han

reservado para su uso en redes privadas.

Máscara de red: La máscara de red se usa

para definir los límites de segmento las sub-

redes dentro de una red más amplia . Las

máquinas usan máscaras de bits para

averiguar a qué subred pertenece a partir de

la dirección IP. En el cuadro 1 se muestra un

ejemplo.

GLOSARIO

01 default-lease-time 3600;

02 max-lease-time 14400;

03

04 subnet 192.168.2.0 netmask 255.255.255.0 {

05 range 192.168.2.50 192.168.2.69;

06 option domain-name-servers 194.25.2.129;

07 option broadcast-address 192.168.2.255;

08 option routers 192.168.2.1;

09 }

Listado 1: Un simple, pero completodhcpd.conf

DHCPPORTADA

Page 17: Linux Magazine - Edición en Castellano, Nº 01

17www.linuxmagazine.com.es Número 01

parámetros de configuración

de la red de las demás

máquinas que tengamos

conectadas dentro de nuestra

red. Además de los pará-

metros tradicionales, se

puede hacer que el servidor

de DHCP establezca parámet-

ros específicos para nuestra

red de área local, por ejem-

plo, estableciendo un ser-

vidor de fecha/hora o in-

cluso el nombre de un

servidor WINS.

Muchas máquinas…¿Cómo aplicamos esto en un

caso real? Veamos una

pequeña red privada. En este

caso “privada” significa que

la red usa un rango de direcciones IP pri-

vado. Para evitar confusiones, estas

direcciones funcionan en nuestra red

local pero no en Internet.

Las redes privadas realmente grandes

(las denominadas de clase A) tienen ran-

gos de IP asignados que van desde la

10.0.0.0 hasta la 10.255.255.255. Para

redes de tamaño medio se usan las de

clase B cuyo rango para redes privada

van desde la 172.16.0.0 hasta la

172.31.255.255. Pero si la red es algo

más modesta entonces podremos utilizar

las 65023 direcciones disponibles entre

192.168.0.0 hasta la 192.168.255.255.

Para las pequeñas empresas y los

usuarios domésticos, las redes de clase C

se ajustan de forma adecuada. Voy a

usar las direcciones que tengo en mi

casa para este ejemplo. Tengo asignada

la dirección 192.168.2.0 a la red (esto es

útil si se pretende montar una red con

los vecinos).

de DHCP ISC, dhcpd como

hace casi todo el mundo.

Si realmente deseas compi-

lar el código tu mismo, el

código fuente está disponible

en [1]. La mayoría de la gente

se conforma con instalar el

paquete de la distribución.

Los usuarios de Debian

pueden teclear algo como lo

siguiente:

apt-get install dhcp

Los usuarios de otras distribu-

ciones encontrarán el paquete

RPM apropiado en el CD o

DVD de su distribución. Si no

es así, se puede una búsqueda

en http://rpmfind.net/ con el

término debería devolver paquets para

nuestra distro o una independiente de

plataforma DHCP.

Para continuar con la instalación, bus-

caremso en nuestras máquinas el

archivo de configuración dhcpd.conf en

el directorio /etc/. El archivo está bien

Servidor de nombres: Un servidor de nom-

bres de dominio proporciona la traducción

de los nombres de hosts simbólicos (por

ejemplo linux-magazine.com) a una direc-

ción ip (por ejemplo 62.245.157.219) y

viceversa. DNS es un sistema de base de

datos jerárquico distribuido que no requiere

que cada servidor de nombres conozca cada

nombre de host, sino que permite a una

máquina consultar a otras máquinas.

Puerta de enlace por defecto: Es un router en

una red local al que se le envían los paquetes

cuyo destino no tiene una dirección de red

local.

Servidor de Fecha/Hora: Proporciona la

fecha y hora correctas en una red. El tiempo

oficial en el Reino Unido es medido desde la

línea del meridiano de Greenwich. En

España, se pueden utilizar los servidores

hora.oxixares.com y slug.ctv.es. Además de

estas fuentes, hay un gran número de servi-

dores de fecha/hora, más o menos precisos,

en la Web.

WINS: Es el Servidor de Nombres de Internet

de Windows, que relaciona los nombres Net-

BIOS de las máquinas con sus direcciones IP.

Un servidor WINS es un servidor de nombres

de propósito especial. Si se tiene un gran

número de máquinas Windows en la red, el

servidor WINS puede impedir que se produz-

can broadcasts no previstos. El proyecto

Samba proporciona soporte para WINS.

Broadcast: El broadcast se usa para alcanzar

múltiples hosts sin necesidad de saber nada

de ellos. Una broadcast ahorra ancho de

banda en el caso de necesitar comunicar con

un gran número de máquinas, pero típica-

mente, este tipo de transmisión produce

sobrecarga en la red y debe ser evitado.

GLOSARIO

Entrada Parámetro Significado

default-lease-time Tiempo en segundos Especifica el periodo válido de los valores asignados. El cliente tiene

que volver a solicitar la dirección IP dentro de este periodo. Si no lo

hace, la dirección puede ser asignada a otra máquina.

max-lease-time Tiempo en segundos Especifica el máximo valor del periodo de asignación. Si el cliente

solicita un tiempo excesivo, este parámetro establece el máximo

valor.

subnet Dirección de red Segmento de red al que aplicar la configuración (Véase el Cuadro 1)

netmask Máscara de red Máscara para este segmento de red (Véase el Cuadro 1)

range Máxima y mínima El rango de direcciones IP a asignar por el servidor DHCP.

dirección IP

fixed-address Dirección IP o nombre de host Una dirección de red para ser asignada de forma permanente.

filename Nombre de archivo Imagen de boot para un cliente específico (Véase la sección

“Técnicas avanzadas de DHCP”).

hardware ethernet Dirección MAC Dirección hardware del cliente.

Tabla 1: Configuración dhcpd

Figura 1: A partir de la MAC se puede trazar un mapa de direcciones MAC de

fabricantes de tarjeta.

PORTADADHCP

… y un solo servidorLa máquina que asignará las IPs necesita

, como es lógico, un programa servidor

DHCP. Por desgracia, no existen demasi-

adas implementaciones gratuitas de este

tipo de servidor, por tanto, para ilustrar

este artículo, optaremos por el servidor

Page 18: Linux Magazine - Edición en Castellano, Nº 01

18 Número 01 www.linuxmagazine.com.es

Queremos que el servidor dhcpd asigne

IPs en el rango 192.168.2.50 hasta

192.168.2.60. También vamos a hacer uso

de un domain-name-server para estable-

cer un servidor de nombres y routers para

especificar la puerta de enlace. Si no se

tiene un servidor de nombres en la red,

usaremos el proporcionado por el provee-

dor de Internet (ISP).

Fijémonos en las llaves que encierran

la definición del segmento de red. Cada

entrada en el archivo de configuración

debe terminar con un punto y coma.

Libremente configurableDe forma genérica, podemos decir, que

existen dos clases de entradas en el

archivo de configuración: las que

empiezan por la palabra clave option y el

resto. Las opciones (ver Tabla 2) son

pasadas a las máquinas clientes desde el

servidor DHCP. Si las máquinas clientes

pueden o no utilizar esta información,

dependerá del sistema operativo que se

tenga instalado. Los administradores

podrían querer definir scripts donde esta

información sea procesada.

El resto de las entradas son usadas por

el servidor dhcpd para su propio uso

interno. Véase la Tabla 1.

Asignaciones permanentesSi se desea usar DHCP en la red,

suele haber siempre unas cuantas

máquinas que necesitan una IP estática.

Después de todo, no tiene sentido tener

que adivinar la dirección del router o del

servidor multimedia para poder acceder

a él.

El archivo /etc/dhcpd.conf se usa para

las asignaciones de las máquinas

clientes. dhcpd evalúa la dirección MAC,

que es única, para ser capaz de identi-

ficar y asignar las direcciones correctas a

cada máquina que la solicite.

La dirección MAC está impresa en los

adaptadores de red PCMCIA y en los

conectores USB Wireless. Si no se es

capaz de leer la etiqueta del NIC, se

puede consultar la dirección MAC con

ifconfig para los sistemas operativos

basados en UNIX o ipconfig para los de

Microsoft. El listado 2 muestra un ejem-

plo de una máquina Linux cuya

documentado, así que, siguiendo las

instrucciones proporcionadas por el

mismo programa, deberíamos ser

capaces de modificar los valores de los

próximos ejemplos de manera que refle-

jen nuestro propio entorno. Conviene

tomarse un rato para pensar en el

número de máquinas que necesitamos

mantener al mismo tiempo en la red. Si

estamos organizando una party, un cen-

tro de asistencia técnica al cliente, o

similar, será un número bastante grande.

Para una red doméstica típica tendremos

menos de diez máquinas.

El ejemplo en el Listado 1 es para un

red considerada pequeña, ya que supone

que no más de 20 máquinas van a estar

conectadas a la red al mismo tiempo.

Entrada (sin option) Parametro Significado

routers IP o nombre de host Router o puerta de enlace para acceder a Internet.

domain-name-servers IP o nombre de host Servidor de Nombre de Dominio.

host-name Nombre de host Nombre del host cliente.

ntp-servers IP o nombre de host Servidor de tiempo para sincronizar el tiempo.

netbios-node-type 1,2,4,or 8 (recomendado) Resolución de nombres de Windows. 1 significa broadcast, 2 unicast,

4 modo mixto (primero broadcast, luego intenta unicast) y 8 modo

híbrido, primero unicast antes de intentar broadcast.

netbios-name-servers Nombre de host Servidor WINS para la resolución de nombres de Internet

de Windows.

domain-name Nombre de dominio Nombre del dominio de la red.

nis-domain Nombre de dominio Nombre del dominio NIS.

nis-servers IP o nombre de host Servidor NIS.

subnet-mask Máscara de red Máscara de red del segmento de la red.

Tabla 2: Valores Clientes

01 renner@lyra:~$ /sbin/ifconfig eth0

02 eth0 Link encap:Ethernet HWaddr 00:02:2D:34:90:85

03 inet addr:10.32.130.79 Bcast:10.32.135.255

Mask:255.255.248.0

04 UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500

Metric:1

05 RX packets:15695 errors:0 dropped:0 overruns:0 frame:0

06 TX packets:10988 errors:204 dropped:0 overruns:0 carrier:0

07 collisions:0 txqueuelen:100

08 RX bytes:5201433 (4.9 MiB) TX bytes:1559490 (1.4 MiB)

09 Interrupt:10 Base address:0x100

Listado 2: Usando ifconfig para descubrirla dirección MAC

aAdemás de la dirección IP, la configuración

de un dispositivo de red consta de la direc-

ción de broadcast y de la máscara de red. La

máscara de red se usa para subdividir la red

en subredes más pequeñas. Para compren-

der la relación entre la dirección IP y la

máscara de red, se necesita inspeccionar los

bits a bajo nivel. Para ello, se toman cada

uno de los números decimales que aparecen

entre los puntos y se escriben en su repre-

sentación binaria equivalente:

255=1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+

1*2^1+1*2^0

Así pues, la máscara 255.255.255.0 en for-

mato punto decimal se convierte en la

máscara de red en binario:

11111111.11111111.11111111.00000000

Desde luego, esto no representa mucha

complejidad matemática, ya que se pueden

pasar los números de una base a otra fácil-

mente. Los 24 unos son interesantes, la red

es referenciada como /24 (barra 24).

Aplicando la misma técnica, podemos ver

que la dirección IP 192.168.2.3 equivale a:

11000000.10101000.00000010.00000011

La dirección de red es el resultado de aplicar

la operación AND a nivel de bits entre la

dirección IP y la máscara de red. Esta

operación deja un 1 si la IP y la máscara son 1:

11000000.10101000.00000010.00000000

La dirección de red en formato punto deci-

mal es 192.168.2.0

Como la dirección IP cero está reservada

para la propia red y hay otra dirección reser-

vada para broadcast ( típicamente .255), la

red del ejemplo puede albergar hasta 254

máquinas.

Dirección IP, máscara dered y dirección de red.

DHCPPORTADA

Page 19: Linux Magazine - Edición en Castellano, Nº 01

19www.linuxmagazine.com.es Número 01

tratando de buscar. En algunos casos

puede ser útil referirse a una base de

datos especial [2] que relacione las direc-

ciones MAC asignadas a cada fabricante

de tarjetas de red (ver Figura 1), cosa

que acelera la identificación.

Después de descubrir la dirección

hardware, se puede añadir la dirección

IP estática que la relacione en el archivo

de configuración dhcpd:

host lyraA{

hardware ethernetU

00:02:2D:34:90:85;

fixed-address lyra.mtr.mynet;

}

dirección MAC o de “hardware” es

00:02:2D:34:90:85.

Suponiendo que el servidor DHCP ha

asignado a esa máquina una dirección IP

arbitraria; dhcpd mantiene un registro de

direcciones asignadas y periodos de asi-

gnación en /var/lib/dhcp/dhcpd.leases.

Otra opción sería hacer un ping a

todos los hosts de la red para provocar

una respuesta de los mismos. Una vez

realizado, con el comando arp -a se

puede averiguar los hosts y sus direc-

ciones MAC (Ver listado 3). Primero hay

que hacer ping, ya que la tabla arp está

formada por todas las direcciones MAC

de todos los hosts conocidos dentro de la

red, incluyendo sólo las direcciones de

aquellas máquinas que se han comuni-

cado recientemente con su ordenador.

Pero, ¿Qué dirección MACelegimos?Sin embargo, aún se necesita averiguar

que dirección MAC es la que estamos

Unicast: Cada cliente recibe una copia de un

fichero de un servidor. Las conexiones punto

a punto de este tipo son fáciles de configurar,

pero producen una gran carga en el servidor

si hay un gran número de clientes en la red.

NIS: Es el Servicio de Información de la Red,

que proporciona la distribución de las config-

uraciones en la misma. Un servidor NIS

central suministra información sobre los

nombres de usuarios, las contraseñas, los

directorios home, las asignaciones a grupos y

los nombres de hosts. El servidor NIS com-

pleta las entradas en los ficheros de configu-

ración en las máquinas clientes, por ejemplo,

/etc/passwd,/etc/groupso /etc/hosts. Un

archivo llamado /etc/nsswitch.conf especifica

si el servidor NIS debe suministrar informa-

ción para los archivos de configuración y, si es

así, que clase de información. Un servidor

DHCP proporciona detalles del servidor NIS

de la red local.

Dirección MAC: O Control de Acceso al

Medio, o de manera más simple, la dirección

Ethernet, es un número hexadecimal de seis

bytes. La dirección MAC está grabada dentro

de cada dispositivo Ethernet y permite que el

dispositivo pueda ser identificado de forma

unívoca.

Imagen Boot: Es un kernel de Linux o Unix

que puede ser descargado de la red y ejecu-

tado. Se usa en sitios donde las máquinas no

tienen discos y que montan el directorio raíz

del sistema (/) a través de la red. Las imá-

genes de boot en la red permiten instalar

grandes números de ordenadores sin la

necesidad de usar CDs, floppies,…

GLOSARIO

01 renner@lyra:~$ ping -c3 192.168.2.0

02 PING 192.168.2.0 (192.168.2.0): 56 data bytes

03 64 bytes from 192.168.2.1: icmp_seq=0 ttl=64 time=0.2 ms

04 64 bytes from 192.168.2.52: icmp_seq=0 ttl=64 time=3.5 ms (DUP!)

05 64 bytes from 192.168.2.53: icmp_seq=0 ttl=64 time=4.2 ms (DUP!)

06 64 bytes from 192.168.2.62: icmp_seq=0 ttl=64 time=4.7 ms (DUP!)

07 [...]

08 renner@lyra:~$ /usr/sbin/arp -a

09 ? (192.168.2.1) at 00:03:E3:00:18:F1 [ether] on eth0

10 ? (192.168.2.52) at 00:30:05:55:02:ED [ether] on eth0

11 ? (192.168.2.53) at 00:0C:6E:1F:32:C4 [ether] on eth0

12 ? (192.168.2.62) at 00:30:05:55:03:7F [ether] on eth0

Listado 3: Usando ping y arp para descubrir la dirección MAC

Figura 3: MacOS X soporta DHCP.Figura 2: Habilitando el cliente de DCHP en Mandrake.

PORTADADHCP

Page 20: Linux Magazine - Edición en Castellano, Nº 01

20 Número 01 www.linuxmagazine.com.es

Si la máquina tiene múltiples NICs (p.e.:

una máquina con una tarjeta LAN Wire-

less adicional), se le puede asignar el

mismo nombre de host a ambas direc-

ciones MAC:

host lyraB{

hardware ethernetU

00:80:C7:C1:3D:76;

fixed-address lyra.mtr.mynet;

}

En algunos casos, incluso se puede inter-

cambiar las NIC mientras la máquina

está funcionando sin interrumpir una

conexión existente. En vez de un nombre

de host, que requiere para funcionar la

capacidad de resolver nombres, se puede

asignar una dirección IP.

Técnicas avanzadas de DHCP¡DHCP es capaz de mucho más! DHCP

puede comunicarle a un cliente sin disco

duro que se baje el sistema operativo de

la red a partir de una imagen boot. Esto

se logra usando TFTP (Protocolo de

Transferencia de Ficheros Trivial), un

subconjunto de FTP, para transferir la

información por la red. El listado 4

muestra un ejemplo donde a una

estación de trabajo Indy SGI se le asigna

su kernel Linux vía DHCP. Este proced-

imiento de boot no sólo se usa en

grandes clusters, para la resolución de

cálculos matemáticos complejos, por

ejemplo, sino también en universidades

e institutos.

Esto sólo funciona si el servidor tftpd

está activado en /etc/inetd.conf. Para

permitir al servidor encontrar la imagen

de boot adecuada (indy_r4k_tftpboot.

img, en nuestro ejemplo), se necesita

pasar el directorio con los archivos (tal

como /boot) al servidor:

tftp dgram udpU

wait nobody

/usr/sbin/tcpdU

/usr/sbin/

in.tftpd /boot

Las distribuciones que

usan el sistema mod-

erno xinetd, en vez del

superservidor inetd,

deberían tener en /etc/

xinetd.d/tftp un archi-

vo como el mostrado

en el Listado 5.

Un único servidor DHCP puede man-

tener múltiples segmentos de redes al

mismo tiempo. Para permitir esto, hay

que crear múltiples subredes en la con-

figuración. Las opciones encerradas

entre llaves, tales como los detalles del

nombre del servidor o el dominio NIS,

deben ser únicos. En la práctica, cada

segmento de la red está típicamente aso-

ciado a uno de las NIC del servidor

DHCP

Para que se reconozcan los cam-

bios, dhcpd debe ser reiniciado.

Como los cambios de este tipo sólo

ocurren ocasionalmente, los admin-

istradores se pueden tumbar y relajar

cuando se conecte una nueva máquina a

la red.

El ClienteLas máquinas recién llegadas no nece-

sitan mucha configuración. En vez

de ponerles una IP estática, se le habi-

lita DHCP. Dependiendo del sistema

operativo (y posiblemente también de

la distribución), esta tarea se puede

hacer de varias maneras. Si tenemos

Debian, se añade una línea como la si-

guiente:

iface eth0 inet dhcp

al fichero /etc/network/interfaces. Otras

distribuciones tienen herramientas de

configuración en formato gráfico. Man-

drake usa el asistente que se muestra en

la figura 2.

Los usuarios de Windows tienen que

acceder al icono Red del Panel de

Control. Los que usen el clásico MacOS

necesitan acceder al Panel de Control /

TCP/IP en el menú Apple. MacOS X (ver

Figura 3) activa DHCP en Preferencias

del Sistema / Internet y Redes.

01 host indy {

02 filename "indy_r4k_tftpboot.img";

03 hardware ethernet 08:00:69:08:58:40;

04 fixed-address 192.168.2.12;

05 server-name "cassiopeia.mtr.mynet";

06 option host-name "indy";

07 option domain-name "mtr.mynet";

08 option domain-name-servers 192.168.2.53;

09 option routers 192.168.2.1;

10 }

Listado 4: Asignación de una imagen de Boot

[1] Servidor DHCP:http://www.isc.org/

index.pl?/sw/dhcp/

[2] Base de datos MAC:http://www.coffer.

com/mac_find/

INFO

01 # default: off

02

03 service tftp

04 {

05 disable = no

06 socket_type = dgram

07 protocol = udp

08 wait = yes

09 user = root

10 server =

/usr/sbin/in.tftpd

11 server_args = -s /boot

12 }

Listado 5: El archivo/etc/xinetd.d/tftp

DHCPPORTADA

ConclusiónNo hay una gran selección de programas

clientes de DHCP en Linux. Uno de ellos

es pump, que es muy popular dentro de

las mini-distribuciones debido al poco

tamaño que ocupa. Las alternativas, que

ocupan más espacio, son dhcp-client y

dhcpcd. Sin embargo, apesar de „pesar“

más, tienen más funcionalidades, como

la habilidad de ejecutar scripts después

de completar la configuración.

Existe un problema de compatibilidad

entre los paquetes antiguos de dhcp y el

kernel 2.6. Esta combinación funcionará,

pero el script /sbin/dhclient comprobará

la versión del kernel para dhcp-client. Sin

embargo, como no reconoce el kernel

2.6, en este punto se parará. Como

DHCP sólo necesita distinguir entre el

kernel 2.0 o posterior, se puede fácil-

mente modificar el script para que

reconozca la versión 2.6 como un kernel

válido:

2.[123456].*)

exec /sbin/dhclient-2.2.xU

-q "$@"

;;

La solución es bien sencilla. Editamos el

script y tan sólo se necesita añadir un 6

en el lugar adecuado y enseguida

debería estar todo arreglado y funcio-

nando sin ningún problema. �

Page 21: Linux Magazine - Edición en Castellano, Nº 01

21www.linuxmagazine.com.es Número 01

PORTADAEspecial Redes

requeridos para adaptarlos a diferentes

entornos con un solo comando. Como

alternativa, sólo se tiene que seleccionar

un perfil al arrancar.

El módulo gestor de perfiles YaST (con

interfaz gráfica), que está localizado en

el grupo System, ayuda a configurar

SCPM (ver Figura 1), pero también se

puede usar el gestor de perfiles yast2

para lanzar la herramienta directamente.

Los perfiles existentes se muestran en

la ventana principal del gestor de per-

files. Se puede añadir un nuevo perfil o

modificar la configuración de uno exis-

tente. El botón de Options permite

cambiar o crear grupos (ver Figura 2).

La configuración actual se usa como

una plantilla cuando se crea un nuevo

perfil. SCPM crea un directorio con el

nuevo perfil en /var/lib/scpm/profiles/ y

copia los ficheros de configuración para

los grupos indicados en este directorio.

GruposLos administradores pueden usar los

grupos para especificar servicios que

serán aplicados por el perfil. Por ejem-

plo, SCPM sólo guardará la

configuración de la impresora si

pertenece al grupo impresora. Si no se

marca este recurso, la impresora no se

verá afectada por un cambio en el perfil,

sino simplemente mantendrá la configu-

ración actual.

Cuando se instala SCPM se crean unos

cuantos grupos de recursos predefinidos.

Estos grupos cubren la mayoría de las

configuraciones e incluyen configura-

ciones básicas de red (network), el

servicio NTP para la sincronización de

fecha y hora a través de Internet (ntpd),

el cortafuegos (SuSEFirewall2), el monta-

dor automático autofs, que montará los

discos de forma automática. Si esta

selección no es del gusto del usuario, se

pueden definir nuevos grupos.

Desafortunadamente, la pantalla de

información en la ventana principal del

módulo YaST no es de fiar. Insiste en que

el gestor de perfiles está deshabilitado,

independientemente de su estado actual.

Si se activa el perfil no debe causar

Linux está invadiendo el mundo de

los portátiles. Los equipos portátiles

son especialmente propensos a los

cambios de entorno. Normalmente se

conecta el portátil con un cable a la red o

se usa una WLAN de vez en cuando.

Otras veces el portátil no se conecta a

nada. Aunque en la oficina se conecte el

portátil a una pantalla externa, en casa

probablemente se use la propia pantalla

del portátil. Suse Linux viene con SCPM,

el gestor de perfiles del sistema, para

ayudar al equipo a adaptarse a estos

cambios.

Ajuste de los PerfilesSCPM guarda una colección completa de

configuraciones (conocidos como per-

files) del sistema para distintos entornos,

permitiendo restaurarlas cuando sean

necesarios. Los perfiles no sólo almace-

nan los ficheros de configuración,

también almacenan información adi-

cional, tales como si los servicios

específicos están activos o no. Esto hace

posible realizar todos los cambios

La modificación de la configuración

del sistema operativo de una sola

máquina implica bastante trabajo.

SCPM hace esto más fácil a los usuar-

ios de Suse manteniendo perfiles con

distintas configuraciones.

POR FALKO ZURREL

Modificación de la configuración del sistema con SCPM

Cambio de entorno

01 #scpm db

02 SCDB Utility (SCPM version 0.9.4)

03 > load

04 > create resource /opt/tomcat/conf/server.xml file

05 > save

06 > quit

Listado 1 Acceso a la base de datos SCPM ycreación de un recurso nuevoActivar SCPM scpm enable

Crear un nuevo perfil scpm add nombre_perfil

Cambiar a otro perfil scpm switch nombre_perfil

Guardar los cambios en el perfil activo scpm save

Copiar un perfil scpm copy perfil_fuente perfil_destino

Mostrar el perfil activo scpm active

Mostrar los perfiles disponibles scpm list

Recargar la configuración del perfil actual scpm reload

Tabla 1: Comandos SCPM

Page 22: Linux Magazine - Edición en Castellano, Nº 01

22 Número 01 www.linuxmagazine.com.es

Especial RedesPORTADA

ningún daño ya que SCPM no sobre-

scribe ninguna base de datos existente ni

ningún perfil. A no ser que se le indique

explícitamente con una sobrescritura en

la línea de comandos.

No hay más o menos límite para

expandir las capacidades del gestor de

perfiles, se le puede indicar al SCPM que

lance scripts con un pre-arranque y un

post-arranque o una pre-parada y post-

parada cuando se cargue o descargue un

perfil (ver Figura 3).

Cuando se selecciona un perfil difer-

ente, SCPM primero ejecuta los dos

scripts de parada y avisa en caso de cam-

bios no salvados. Acto seguido lanza los

scripts de pre-arranque, recuperando los

ficheros de configuración del nuevo per-

fil y los aplica al sistema. SCPM

comprueba si el servicio se está ejecu-

tando y se asegura de que se haya

aplicado el estado indicado. El último

paso del proceso es llamar al script post-

parada.

Si se especifica un perfil cuando se

arranque la máquina, se puede poner el

parámetro PROFILE= profile_name en el

menú de inicio que llama Suse para lan-

zarlo con la configuración requerida. El

script /etc/init.d/boot.scpm se asegura de

que esto funcione.

Si se cambia regularmente el perfil al

arrancar, se añadirán unas cuantas

entradas con parámetros del kernel pre-

configurados a la configuración del

cargador (YaST2: System / Bootloader

Configuration). Para hacer esto, se añade

una nueva sección con la configuración

por defecto del kernel y simplemente se

cambia el parámetro PROFILE para car-

gar el perfil que se quiera la próxima vez

que se arranque.

Configuración desde la líneade comandosAunque YaST2 hace el trabajo de config-

urar SCPM, arrancar continuamente

YaST para cambiar el perfil es un

engorro. La línea de comandos propor-

ciona otra alternativa. Se debe estar

seguro de tener privilegios de root - ya

que, se va a modificar la configuración

del sistema - y usar unos cuantos coman-

dos para acelerar esta tarea. La Tabla 1

proporciona una lista de los comandos

más comunes. Por ejemplo, scpm switch

ISDN activa el perfil llamado ISDN.

Los cambios sólo pueden aplicarse al

perfil actual, no importa si se usa YaST2

o la línea de comandos, el efecto es el

mismo. Para hacerlo así, primero se cam-

bia la configuración tal y como se hace

habitualmente. Cuando se tenga todo

funcionando al gusto

de uno, simplemente

se llama a scpm save

para salvar los cambios.

SCPM mostrará los

cambios uno a uno y

preguntará para confir-

mar antes de salvarlos

en el perfil.

Si se necesita cambiar

los ficheros de configu-

ración que SCPM ignora

debido a la configu-

ración, se puede real-

izar cambios manual-

mente en modo in-

teractivo con la base de

datos (ver Listado 1). El comando load

es muy importante aquí, ya que carga la

base de datos actual para editarla. Si se

produce un fallo en la carga de la base de

datos actual y se guarda la configuración

actual, la base de datos en uso será

sobrescrita con un fichero que contiene

sólo estos cambios.

Aunque se sobrescriba la base de

datos por error, SCPM guarda las tres

últimas versiones de la base de datos en

el directorio /var/lib/scpm/scdb. La base

de datos actual se denomina scbd.db, las

copias de seguridad tienen unos cuantos

caracteres aleatorios añadidos al nom-

bre.

Para realizar una copia de seguridad

del perfil creado sólo se necesita el

fichero de la base de datos, scdb.db. Para

almacenar todos los ficheros de configu-

ración a la vez, se necesita copiar el

directorio /var/lib/scpm/profiles/ en un

lugar seguro. �

Figura 1: YaST2 ayuda a configurar SCPM. Figura 2: Módulo SCPM de YaST2 - configuración.

Figura 3: Opciones de configuración para los perfiles.

Page 23: Linux Magazine - Edición en Castellano, Nº 01

Los ordenadores desfasados que han

sido reemplazados por nuevos

equipos son ideales como servi-

dores de impresión en red. No sólo se

recicla así equipos considerados obsole-

tos, sino que un servidor de impresión

no solo permite a múltiples usuarios

compartir una impresora, si no que

además un ordenador dedicado a la

impresión descarga parte del trabajo de

nuestro equipo, permitiéndole procesar

sus propias tareas a la velocidad máxi-

ma. En algunas redes domésticas, distin-

tos usuarios enviaran trabajos a impreso-

ras diferentes. Mientras el padre puede

mandar una carta a la impresora láser los

niños pueden estar mandando las fotos

de su última fiesta de cumpleaños o

imásgenes descargadas de Internet a la

impresora de inyección. Esto no es muy

diferente del escenario que vemos en

algunas empresas donde los Sistemas

Comunes Unix de Impresión (Common

Unix Printing System ó CUPS) permiten

el acceso a cualquier impresora de la red

a clientes de Linux, Microsoft y Apple.

documentación de CUPS nos propor-

ciona más información al respecto. Ver

[2].

No es necesario modificar nuestras

aplicaciones para usar CUPS. Nuestros

programas interactuaran con CUPS de

forma natural (es el caso de aplicaciones

KDE) o usaran lo que se ha dado en lla-

mar comandos de impresión del sistema

V o Berkley. Estas son las herramientas

de la línea de comandos lp y lpr. CUPS

proporciona versiones compatibles de

estos programas. Estos comandos sim-

ples son útiles si necesitamos enviar un

archivo a un servidor remoto usando

sólo la línea de comandos. El manual de

usuario del software CUPS [2] propor-

ciona detalles al respecto de estos

comandos.

Configuración basada enNavegadores.Al contrario que los antiguos sistemas

LPRng, CUPS está perfectamente adapta-

do a las redes al estar basado en el Proto-

colo de Impresión de Internet (Internet

23www.linuxmagazine.com.es Número 01

PORTADACUPS

Compartir una impresora entre

usuarios múltiples puede ahorrarnos

dinero y recursos. Conectemos nues-

tras impresoras a un servidor de

sistemas CUPS para dar acceso a

usuarios de Apple e incluso de

Microsoft.

BY TIM SCHÜRMANN

Configuración de un servidor de impresión CUPS

EL ABC de la Impresión

Primeros pasosDos pasos son necesarios para ejecutar

CUPS en un red. Primero necesitamos

configurar los ordenadores a los que las

impresoras están conectadas. Estas

máquinas pueden ser equipos de

sobremesa normales o servidores dedica-

dos que no necesitan GUI. Las distros

actuales instalarán CUPS habitualmente

como parte de la configuración original o

proporcionarán herramientas de configu-

ración que podemos utilizar tras termi-

nar la configuración general. Este último

tipo normalmente configura CUPS para

que se ejecute al iniciar el sistema. Si

nuestro sistema no dispone de CUPS o

queremos actualizar la versión podemos

descargarnos el código fuente desde la

web de CUPS [1].

Antes de CUPS, las distribuciones

solían trabajar con sistemas menos

potentes como BSD o LPRng. Ambos son

difíciles de integrar en un entorno de

red. Si tenemos una distribución antigua

deberíamos considerar reemplazar el sis-

tema de impresión antiguo por CUPS. La

Page 24: Linux Magazine - Edición en Castellano, Nº 01

con el nombre del anfitrión de nuestro

ordenador CUPS. localhost se reserva

para la máquina local. CUPS no permite

el acceso externo a la configuración por

defecto, por lo que debemos lanzar el

navegador localmente en el sistema que

estemos configurando. Si deseamos per-

mitir el acceso externo debemos editar el

archivo de configuración /etc/cups/

cupsd.conf. Buscaremos secciones que

empiecen por <Location /...> y finali-

cen por</Location> (ver figura 1).

Las etiquetas de localización con-

tienen detalles respecto a como CUPS

debe controlar el acceso a varias sec-

ciones. <Location /> se refiere al menú

principal y <Location /admin> al obje-

to Administration. Añadiendo Allow

From 192.168.0.16 permitimos al orde-

nador con dirección ip 192.168.0.16

acceder al interfaz. Por motivos de

seguridad no se recomienda permitir el

acceso con contraseñas en blanco. La

FAQ de CUPS [4] proporciona una visión

general sobre los privilegios de acceso.

El interfaz Web permite a los usuarios

configurar y gestionar CUPS (ver Figura

2). También podemos ver los trabajos de

la cola de impresión y administrarlos,

cancelándolos, parándolos y rearrancán-

dolos, si tenemos los permisos necesa-

rios. El comando lpstat nos proporciona

algunas funcionalidades. Si nuestra dis-

tribución tiene un programa de configu-

ración para establecer impresoras es

preferible usar este programa. Por ejem-

Printing Protocol, IPP [3]). IPP es una

extensión del Protocolo de Transporte de

Hiper - Texto (Hyptertext Transport Pro-

tocol, HTTP), usado para transferir pági-

nas Web a través de Internet. Un orde-

nador, conocido como cliente en el

lenguaje CUPS, envía datos de impresión

al servidor CUPS. El demonio cupsd, que

se está ejecutando en segundo plano,

acepta los datos y realiza algunos proce-

sos adicionales antes de enviar los datos

a la salida de la impresora. En otras pal-

abras, cupsd es el núcleo del sistema

CUPS.

Podemos acceder al demonio a través

de nuestro navegador web escribiendo

http:// localhost:631. Simplemente debe-

mos reemplazar localhost en esta URL

24 Número 01 www.linuxmagazine.com.es

CUPSPORTADA

Imprimir parece una tarea simple cuando

pensamos en ello. Un usuario selecciona Print

en el menú y el programa envía los datos a la

impresora, la cual crea una pila de papel con

los resultados. Sin embargo, imprimir no es

tan trivial como suena.

El primer problema es el hecho de que el orde-

nador se puede bloquear mientras el trabajo

de impresión se esta procesando. La mayoría

de las impresoras no tienen suficiente memo-

ria para cargar un documento completo. Para

evitar este problema, el sistema de impresión

usa un programa diferente, llamado “spooler”,

que proporciona espacio de una forma lla-

mada cola de impresión. El spooler monitoriza

la impresora y pasa al siguiente trabajo en el

momento en que la impresora está lista. En

un sistema CUPS, cupsd, el demonio CUPS

(también conocido como planificador) se

ocupa de esto. El demonio normalmente se

ejecuta al iniciar la máquina y permanece en

segundo plano esperando nuevos trabajos.

Otro problema es el inmenso número de mod-

elos de impresoras. Cada impresora usa

secuencias de control diferentes, es decir,

hablan distintos lenguajes. Una aplicación

que desee imprimir un documento debe

formatearlo de modo que la impresora lo

entienda. Desafortunadamente, para

hacer esto el programa debería hablar el

mismo lenguaje que todas las impresoras

existentes. Como esto no es realista, los filtros

sirven de traductores entre el spooler y las

impresoras. Estas herramientas traducen los

datos de entrada al lenguaje de la impresora

antes de que el trabajo sea impreso. En otras

palabras, las aplicaciones producen datos en

formato estándar y envían el resultado al

spooler. Lunix usa el formato PostScript.

Adobe [6] desarrolló PostScript como un

lenguaje especial de programación para

gráficos. Las impresoras compatibles con

PostScript pueden interpretar estos datos

directamente y no necesitan un filtro

específico.

Los programadores de Código Abierto

(Open Surce) inventaron GhosScript, un

programa que permite a las aplicaciones

reproducir el formato PostScript en impre-

soras no compatibles con él. GhostScript

usa un controlador de impresión para

convertir documentos PostScript al lenguaje

objetivo para la impresora. Cuando se

enfrenta con una impresora que no es capaz

de interpretar PostScript, el spooler CUPS

simplemente llama a GhostScript, que con-

vierte los datos según necesidad.

Back-ends son el ultimo eslabón de la

cadena. Un back-end representa un puerto

como un puerto USB o paralelo. La definición

de back-end nos permite añadir nuevos

tipos de interfaces que actualmente no

existen.

LAS CARTA BOCA ARRIBA

Figura 2: La página de bienvenida del interfaz web del demonio CUPS.

Suponemos que la configuración de privilegios de accesos correcta.

Figura 1: La anotación “Allow” permite al ordenador con la dirección IP

192.168.0.16 acceder la web remotamente.

Page 25: Linux Magazine - Edición en Castellano, Nº 01

plo, Suse Linux tiene la herramienta

YaST. Existe una alternativa basada en la

línea de comandos, lpadmin, que tiene

pocas opciones adicionales a las men-

cionadas hasta ahora [2]. Si no nos gusta

ninguna de estas opciones podemos

optar por uno de los muchos programas

de configuración de terceros. Las ver-

siones más nuevas de KDE tienen com-

ponentes para estar tareas. Los encon-

traremos en el centro de control bajo

Hardware|Printers (ver figura 3).

Usaremos el interfaz Web en los sigu-

ientes ejemplos. El acceso Printers en el

interfaz nos da acceso a la lista de la cola

de impresión (figura 4).

Cada cola tiene un nombre y especifi-

caciones individuales. Podemos asignar

múltiples colas a una impresora o inter-

faz. Al interfaz al que los documentos de

una cola de impresión serán enviados se

define por el Identificador de Recursos

Uniformes (Uniform Resource Identifier,

URI). La notación tiene un aspecto simi-

lar al nombre de una página Web: paral-

lel:/dev/lp0 por ejemplo para el primero

puerto paralelo, o usb:/dev/usb/lp0 para

el primer puerto USB. El comando lpinfo

-v nos proporciona una lista de los inter-

faces disponibles. Volveremos al asunto

de los URI más tarde.

Para crear una nueva cola de impre-

sión seleccionaremos Administration en

nuestro visor web y pulsaremos Add

Printer. Entonces introduciremos su

nombre en el apartado name. El número

máximo de caracteres es de 127. La sigu-

iente pantalla nos indica que debemos

seleccionar el interfaz al que nuestra

impresora está conectada, el modelo de

la impresora y, finalmente, el filtro

GhostScript apropiado.

Los siguientes pasos suponen que

CUPS ha sido configurado correctamente

en cualquier ordenador (servidor) al que

ha sido conectado la impresora.

Podemos imprimir una página de prue-

bas en la ventana del visualizador pul-

sando Printers|Print Test Page.

Configuración del clienteEl segundo paso es configurar los

equipos que compartirán nuestra impre-

sora (los clientes). Hay numerosas for-

mas de hacerlo, si bien hay un factor

común, el demonio CUPS cupsd, que

necesita estar ejecutándose como una

25www.linuxmagazine.com.es Número 01

PORTADACUPS

Figura 5a: Configuración de impresoras remotas en Suse Linux 8.2. Primero le

decimos a YaST que queremos acceder a una impresora remota que usa IPP…

Figura 5b: … a continuación introducimos el nombre del anfitrión y el

recordatorio del URI para completar la configuración.

Figura 3: La entrada de la configuración CUPS del centro de control KDE. Pul-

saremos el espacio libre para mostrar más opciones útiles como funciones

para reiniciar el demonio.

Figura 4: El acceso “Printers” lista las colas de impresión que CUPS reconoce

incluyendo sus URIs (dispositivos URI).

Page 26: Linux Magazine - Edición en Castellano, Nº 01

para evitar ejecutar el

demonio CUPS en los

clientes. Esto significa

modificar el archivo de

configuración /etc/

cups/client.conf. Bus-

camos la línea que

comienza con Server-

Name. Puede que teng-

amos que quitar la

almohadilla (#). Escribi-

mos un espacio y

después el nombre o,

mejor, la dirección IP

del servidor que proce-

sará los trabajos de

impresión después de la

palabra ServerName (ver figura 6).

La tercera forma es probablemente la

más conveniente. Cada demonio CUPS

retransmite a través de la red su configu-

ración. Los clientes que reciben la señal

pueden usar inmediatamente sus colas.

La ventaja de este procedimiento es una

configuración extremadamente sencilla.

Simplemente configuramos una nueva

impresora en la máquina a la que esta

conectada para permitir que cualquier

máquina en la red pueda acceder a ella.

Por supuesto la retransmisión no es el

método más seguro. Cualquier orde-

nador que reciba la señal puede acceder

a la impresora. En el peor de los casos

esto puede permitir a todo Internet

imprimir en nuestra impresora. la nave-

gación está activado en los paquetes de

CUPS antiguos, pero las nuevas ver-

siones no transmiten por defecto.

La herramienta de configuración nos

permite definir las

opciones de la retrans-

misión. De nuevo esto

significa usar YaST en

Suse Linux. El objeto

del menú que necesita-

mos está localizado en

Change/Advanced/

CUPS Server Settings

(ver figura 7). Para con-

figurar un servidor para

retransmitir manual-

mente debemos modi-

ficar el archivo de con-

figuración /etc/cups/

cupsd.conf. Las líneas

que empiezan con el

signo numérico (#)

serán ignoradas por

CUPS. Cada ajuste ocupa una línea y

esta compuesta de una palabra clave y

su valor. Debemos mirar en [2] para

echar un vistazo a los valores. El archivo

contienen explicaciones cortas y ejemp-

los.

Si estamos configurando la retrans-

misión necesitamos las líneas que

empiezan por Browse. El valor de Brow-

seInterval define el intervalo en segun-

dos en el que el servidor retransmitirá

sus datos de configuración. Por ejemplo,

BrowseAddress 192.168.0.255 envía los

datos a cualquier equipo en la subred

192.168.0.

Polling es una alternativa útil a exami-

nar. En este caso el cliente recupera su

configuración desde el servidor. Desde el

lado del cliente el archivo cupsd.conf fija

el valor de la palabra clave BrowsePoll

del nombre o dirección IP del servidor.

Disponemos de múltiples entradas de

BrowsePoll que permiten al cliente bus-

car múltiples servidores. Si activamos

BrowseRelay, se indica al ordenador que

transmita cualquier información que

aprenda mediante polling a todos los

equipos de la subred.

CUPS ReloadedNecesitamos reiniciar el demonio CUPS

tras cambiar el archivo cupsd.conf. El

comando para hacer esto depende de

nuestro distribución. Los usuarios de

Suse Linux pueden usar /etc/init.d/cups

restart. Si usamos la herramienta YaST

para cambiar la configuración también

se encarga de reiniciar el demonio. El

dialogo KDE Print dispondrá de una lista

tarea en segundo plano. Algunas

distribuciones sólo ejecutan el demonio

automáticamente al iniciar el sistema

si una impresora ha sido configurada

en la máquina. YaST en Suse Linux 9

tiene una opción para configurar el ser-

vidor más tarde. Para hacerlo, selec-

cionamos Change|Advanced y luego

CUPS Server. Si tenemos una distro

cuya programa de configuración no

nos permite esto debemos escribir

un archivo de comandos de inicio

de CUPS y añadirlo los niveles de ejecu-

ción 3 y 5 en nuestro directorio

/etc/init.d/.

Introducción de la ImpresoraNecesitamos introducir los detalles de la

impresora en el cliente para permitirle

encontrar esa impresora en la red. Para

hacer esto debemos lanzar el interfaz

Web como hemos descrito con anteriori-

dad. Seleccionamos el Internet Printing

Protocol (IPP) como el dispositivo

(Device). Después introducimos la URI

de la impresora remota, por ejemplo

ipp://myserver/printers/myprinter. Re-

emplazaremos myserver con el nombre o

la dirección IP de nuestro servidor de

impresión y myprinter con el nombre de

nuestra cola de impresión. El programa

de configuración proporcionado con la

mayoría de distribuciones tiene opciones

similares (las figuras 5a y 5b muestran

Suse Linux). Repetimos este proceso

para cada cola de impresión externa. Es

evidente que este procedimiento es far-

ragoso si tenemos un gran número de

impresoras. Parece lógico configurar

CUPS de forma que use un servidor

remoto de impresión para cada trabajo

26 Número 01 www.linuxmagazine.com.es

CUPSPORTADA

Figura 6: Tras habilitar el transporte, solo el equipo con IP 192.168.0.20

necesitará un demonio de impresión. Todos los trabajos de impresión

serán enviados a esta máquina.

Figura 7: Habilitación de examinar en Suse’s YaSt. En nuestro ejemplo,

los detalles de la impresora conectada son retransmitidos a la subred

192.168.0.

Page 27: Linux Magazine - Edición en Castellano, Nº 01

de impresoras desde este momento (ver

figura 8).

Si examinar parece no funcionar debe-

mos comprobar la configuración del

host. Puede que necesitemos añadir

/etc/hosts para que la retransmisión fun-

cione.

Integración de sistemasApple y MicrosoftPodemos integrar cualquier sistema

operativo que soporte IPP. Esto incluye

la versión 10.2 o superior de MacOS X.c

Si tenemos MasIS el prcedimiento que

debemos seguir es comprobar Printer

Sharing de la configuración del sistema

en Services. Esto nos mostrará las im-

presoras como Shared printers en el

diálogo de impresión. Versiones de

MacOS más antiguas necesitan el pa-

quete netatalk. Es un requisito in-

despensable el añadir una entrada

para cada nueva impresora en el archi-

vo de configuración papd.conf. En

[5] disponemos de más detalles. Lo

más importante es asegurarnos de

que tenemos el archivo PPD correcto

desde /etc/cups/ppd para cada impre-

sora:

Description:MyPrinter@MyServer:\

:pr=|/usr/bin/lp -d MyPrinter:\

:op=deamon:\

:pd=/etc/cups/ppd/MyPrinter.ppd:

Windows 2000/XP también dispone de

soporte IPP. Cualquier otra versión nece-

sita la versión 2.0.6 o superior de Samba.

Debemos añadir las siguientes 2 líneas a

la sección [Global] del archivo de config-

uración smb.conf: printing = cups y

printcap name = cups. Las distribu-

ciones actuales deben tener esta configu-

ración por defecto. Los clientes de Win-

dows necesitan un controlador de impre-

sora capaz de generar Post-Script como

el Apple LaserWriter.

En el caso de preferir el controlador de

impresión original se hace necesario

configurar una nueva cola de impresión

en nuestro servidor CUPS. Selec-

cionamos el dispositivo raw como el

modelo de impresión. Esto indica a

CUPS que debe enviar los datos

entrantes directamente al puerto de sali-

da. Debemos saber que los ordenadores

sin los controladores originales no serán

capaces de generar resultados útiles en

nuestra impresora.

Los servidores Samba 2.2 o superior

automáticamente exportan el contro-

lador apropiado cuando un cliente Win-

dows intenta imprimir. De la forma que

se usa en los siguientes ejemplos, cup-

saddsmb solo puede soportar contro-

ladores Adobe [6] PostScript o contro-

ladores desde su propia pagina de inicio.

Los controladores Adobe están dis-

ponibles solo como archivos EXE.

Primero necesitaremos ejecutar progra-

mas como Winzip para extraerlos a una

máquina Windows. Debemos guardar

los controladores en el directorio /usr/

share/cups/drivers. Los nombre de los

archivos deben ser escritos en mayús-

culas.

Ahora debemos modificar la configu-

ración Samba para permitir al servidor

de archivos exportar controladores de

impresión. La documentación de Samba

proporciona información al respecto.

cupsaddsmb -U root -a exportará nues-

tras impresoras. Estos llevará nuestros

controladores al servidor Samba. Debe-

mos saber que cupsaddsmb utiliza la

cuenta de root para copiar los archivos

con el programa smbclient. Debemos

asegurarnos, por tanto, de que Samba

permite el acceso a esta cuenta.

Samba dispone de un nuevo back-end

CUPS llamados smbspool que permite a

equipos Linux acceder sin ningún tipo de

problema a impresoras compartidas por

equipos que corren Windows de

Microsoft. Nuestra distribución debe

configurar el back-end correctamente. Si

no es así, haremos “su” para acceder a

root e introduciremos el siguiente

comando ln -s 'which smbspool' /usr/

lib/cups/backend/smb. Esto nos permite

configurar la impresora como cualquier

otra en el servidor CUPS. En lugar de

una dirección del tipo ipp://... usaremos

una entrada como smb://workgroup/

server/sharename. Si la impresora está

conectada a un equipo con NT o Win-

dows 9x con contraseñas necesitaremos

suministrarlas: smb://user:password@

workgroup/server/sharename.

Opciones para ExpertosEste articulo solo trata de cómo configu-

rar CUPS en una red. El siguiente paso

será su configuración para funciones de

acceso y seguridad. Por ejemplo CUPS

nos permite asignar cuotas y contraseñas

de impresión. Esto puede que no sea útil

en la red de nuestra casa a no ser que

tengamos una cara impresora láser a

color. Los administradores deben revisar

con detenimiento la documentación.

La opción del menú Classes también

nos proporciona opciones útiles. Un

“class” es un grupo o categoría de impre-

soras. Cuando un trabajo de impresión

es enviado, CUPS imprime el trabajo en

la primera impresora libre del grupo. De

nuevo, un interfaz Web proporciona un

simple método de configurar grupos

usando Classes.

La documentación proporcionada por

nuestro distribuidor puede que contenga

información útil en la búsqueda de prob-

lemas. Si no es el caso encontraremos

información detallada respecto a CUPS

en [2]. Los archivos de protocolo dentro

de /var/log/cups también pueden con-

tener indicaciones útiles. �

27www.linuxmagazine.com.es Número 01

PORTADACUPS

[1] Proyecto CUPS: http://www.cups.org

[2] Documentación CUPS: http://local-

host:631

[3] IPP: http://www.pwg.org/ipp/

[4] CUPS FAQ: http://www.danka.de/print-

pro/faq.html

[5] Netatalk: http://netatalk.sourceforge.net

[6] Adobe: http://www.adobe.com

RECURSOS

IPP El Protocolo de Impresión de Internet fue

creado por el Grupo de Trabajo de Impresión.

Si bien esta basado en HTTP 1.1, utiliza el

puerto 631 en lugar del 80. De hecho, los 2

protocolos están tan relacionados que las

implementaciones IPP pueden ser accedidas

de forma nativta a través de HTTP. La URI de

la impresora será en este caso HTTP://server-

name:631/... en lugar de IPP:// servername/...

GLOSARIO

Figura 8: Tras completar la configuración, el dial-

ogo de impresión de KDE debe tener un a lista de

las impresoras remotas y sus detalles.

Page 28: Linux Magazine - Edición en Castellano, Nº 01

rango de conjuntos de características

desde primitivas gráficas básicas, hasta

redes y soporte para tipografías True

Type (TTF). La mayoría de estas librerías

han sido enviadas por usuarios finales y

no forman parte del paquete principal de

SDL. Esto no es un problema en sí

mismo, pero si el propósito principal es

usar SDL para trabajar desarrollando

para varias plataformas, el desarrollador

habrá de asegurarse de que las librerías

que pretende utilizar se encuentran

disponibles para las plataformas con las

que vaya a trabajar, ya que no todas

están completamente soportadas.

La herencia de Windows en SDL es

muy evidente dentro de la API, tanto es

así que mucha de la terminología (y

muchas de las funciones) son muy pare-

cidas a sus equivalente en DirectX. A

pesar de ello, no se emula Windows de

ninguna manera. En cambio, cada lla-

mada a la API gráfica de SDL, por

ejemplo, utiliza directamente el contro-

lador desde el sistema operativo

anfitrión, bastante distinto a lo que sería

un sistema emulado.

En Windows, esto implicaría el uso de

DirectX. Bajo Linux, se utiliza una de las

librerías del dispositivo de gráficos,

como X11 o DGA. También está sopor-

tado el control MTR (Memory Type

Range Register, [2]) aplicaciones aceler-

adas a pantalla completa (véase el

Cuadro 1: Dispositivos).

La API de audio puede reclutar los ser-

vicios de OSS, ESD o aRts para

suministrar música y efectos de sonido.

Gracias al hecho de que se utiliza el

acceso directo (en vez de la emulación) a

los dispositivos del sistema, se puede

lograr un gran nivel de rendimiento en

todas las plataformas.

¡Excavad, Excavad, Malditos!Hay cientos de juegos SDL disponibles

en Internet y muchos de ellos están

disponibles con todo su código fuente.

Contribuiremos a esta colección con un

pequeño juego de plataformas llamado

Explorer Dug. Lo programaremos en C

(ya que probablemente sea la forma en

que se entenderá mejor), aunque se

puede escribir aplicaciones SDL en

muchos otros lenguajes, como PHP,

Ruby, Perl, Java y LISP. Principalmente

nos concentraremos en las característi-

cas de SDL y cómo usarlas para producir

un juego. También destacaremos las

áreas del desarrollo del juego que

requiere más trabajo de nosotros los pro-

gramadores ¿De acuerdo? ¡Bien!

Comencemos…

Gran Bola de FuegoLa primera tarea es descargar e instalar

SDL. La versión actual estable es la

1.2.7, y está disponible desde [3] como

un archivo tar comprimido con gzip.

Además de distribuirse el código fuente,

están disponibles dos versiones binarias

SDL significa Simple DirectMedia

Layer y es una API multi-

plataforma para programar apli-

caciones multimedia, como los juegos.

Aporta una base estable sobre la que los

programadores pueden trabajar, sin pre-

ocuparse de cómo se encargará el

hardware de renderizarlo o incluso qué

hardware lo ejecutará.

SDL está disponible bajo la licencia

LGPL (Licencia Pública General Menor),

y como tal no requiere que el código

fuente de la aplicación que se base en

ella sea publicado.

Actualmente existen buenas imple-

mentaciones de SDL para Linux (i386,

PPC, y PS2), BSD, Windows, Macintosh

OS 9/X, Solaris, Irix y BeOS.

Acceso versus EmulaciónLa API SDL está compuesta de cinco

subsistemas distintos: vídeo, audio,

CDROM, entrada de joystick y tempo-

rizadores. Cada uno apunta a un área de

desarrollo diferente y puede ser inicial-

izada y usada independientemente de

los demás. Además, SDL fomenta el uso

de librerías que puedan suministrar

nuevas funcionalidades a la API básica.

Las dos librerías más comunes son

SDL_mixer (que proporciona un mejor

manejo de audio) y SDL_Image, que pro-

porciona soporte para una amplia

selección de formatos de ficheros gráfi-

cos, incluyendo, GIF, JPG, PNG y TGA.

El sitio principal de SDL [1] lista 109 libr-

erías diferentes, actualmente en

producción, suministrando un amplio

En este artículo, el primero de una

serie, Steven Goodwin da un vistazo a

SDL. Qué es, cómo funciona y, lo que

es mucho más importante, cómo

usarlo para escribir un flamante

juego, Explorer Dug.

POR STEVEN GOODWIN

Creación de un juego

Programación con SDL

28 Número 01 www.linuxmagazine.com.es

Figura 1: La pantalla de bienvenida

SDL no está limitado a X11 como dispositivo

de salida.También puede usar dga, fbcon ¡y

hasta aalib! Para hacer uso de estas carac-

terísticas, debemos asegurarnos de que el

dispositivo apropiado se compila dentro de

SDL (lo cual requerirá otro ./configure, make,

make install del paquete). Entonces podrá

usar la variable de entorno SDL_VIDEO-

DRIVER para indicar que dispositivo quiere

usar. Por ejemplo:

export SDL_VIDEODRIVER=aalib

./explore

Puede encontrar una lista de los dispositivos

suministrados con SDL tecleando:

./configure -help | grep U

enable-video

Cuadro 1: Drivers

SDLDESARROLLO

Page 29: Linux Magazine - Edición en Castellano, Nº 01

diferentes: Ejecución, runtime, y desar-

rollo (development). Naturalmente, la

última proporciona mejores facilidades

de depuración, lo cual es más útil para

nosotros, como desarrolladores. De todas

formas recomiendo trabajar con las

fuentes ya que esto nos permite un

mejor ajuste y el uso completo de un

depurador para introducirnos en el mis-

mísimo código de SDL. Esto no solo es

útil en el seguimiento de errores, tam-

bién puede ser muy iluminador.

El archivo tar.gz se desempaqueta de

la manera habitual:

tar xfz SDL-1.2.7.tar.gz

Y se instala con el proceso igualmente

familiar:

./configure

make

make install

Por defecto, esto colocará las librerías

necesarias y los archivos incluidos en

/usr/local/lib y /usr/local/include/SDL

respectivamente, aunque esto puede

cambiarse en el proceso de inicio con:

./configure -prefix=/poner/sdl/U

algunsitio/encualquierotraparte

Además de suministrar dispositivos adi-

cionales, debería tener pocos motivos

para repetir el proceso ./configure ya que

SDL es fácil de configurar y muy estable,

e invariablemente funciona a la primera.

El paquete SDL también contiene un

extenso juego de páginas de manual

(sección 3) detallando los parámetros e

indicadores de cada función.

Arriba con ese muroEl paquete SDL viene con un pequeño

conjunto de pruebas que permiten com-

probar la integridad de cada subsistema.

Lo encontraremos en el directorio test, y

funcionará nada más terminar la insta-

lación, siempre que haya salido todo

bien. En el caso de que surjan proble-

mas, buscaremos los mensajes de error

que cada prueba envía a la linea de

comandos, ya que pueden indicar si son

problemas con el hardware o la configu-

ración. Si la maquina es capaz de

ejecutar un escritorio, debería estar a la

altura de cualquier tarea con SDL

Todos los programas SDL pueden

comenzar con una de estas lineas:

#include "SDL.h"

o:

#include "SDL/SDL.h"

La primera es preferible por motivos de

portabilidad en varias plataformas,

aunque esto requerirá que se añada el

directorio SDL a la lista de rutas inclu-

idas que gcc buscará. Todas las demás

cabeceras de archivos SDL están incor-

poradas dentro de ésta para así limitar el

mantenimiento. También necesitamos

enlazar la librería principal de SDL (lib-

SDL) dentro de nuestra aplicación. Al

principio solo usaremos las funcionali-

dades de está librería. Según pase el

tiempo y nuestros requisitos crezcan,

añadiremos otras librerías. Hasta

entonces, los dos requisitos de más

arriba pueden satisfacerse en la linea

comandos con:

gcc -I/usr/include/SDL -lSDL U

test/testsprite.c

Si cambia las rutas de librerías e inclui-

dos, se puede usar el programa sdl-config

para obtener esta información (véase

Cuadro SDLCONFIG).

El Mundo en Nuestras ManosNuestra primera incursión en la progra-

mación con SDL será la pantalla de

“bienvenida” del juego. Con esto abar-

caremos un número de conceptos

fundamentales, tal como superficies,

blitting (de blit: Block Image Transfer) y

actualización de pantalla.

Cada estructura y función SDL

comienza con el prefijo SDL_. Además

envolveremos estas funciones dentro de

las nuestras (todas precedidas con ‘ex’)

para encapsular mas funcionalidad y

suministrar un lugar común donde

reunir el código del juego y el de SDL.

Esto ayudará en la depuración.

La primera etapa es inicializar SDL.

Hay dos funciones para hacer esto,

SDL_Init y SDL_InitSubSystem. SDL_Init

puede inicializar uno (o más) subsis-

temas y debería ser la primera función

SDL en un programa. Aunque podemos

inicializar subsistemas adicionales más

tarde, deberíamos comenzar siempre con

un SDL_Init, porque incluye la inicial-

ización de otros componentes que

SDL_InitSubsystem no tiene. Muestras de

estos componentes podrían ser: Las

hebras son inicializadas, el ultimo

código de error es borrado y el paracaí-

das es (opcionalmente) desplegado

(véase Cuadro Paracaídas).

SDL_Init(SDL_INIT_VIDEO | U

SDL_INIT_AUDIO);

Es exactamente igual a:

SDL_Init(SDL_INIT_VIDEO);

SDL_InitSubSystem

(SDL_INIT_AUDIO);

Por ahora, solo necesitamos el subsis-

tema de vídeo, por tanto lo

inicializaremos y comprobaremos si hay

errores. SDL adopta el estándar de usar

valores negativos para indicar un código

de error. El valor de este número indica

el error concreto.

SDL también suministra la función

SDL_GetError que devuelve el nombre

textual del ultimo error. Pero debe ser

llamado inmediatamente, porque si la

subsiguiente función SDL falla, el ante-

rior error se perderá.

Cerrar el sistema es tan simple como

llamar a la función SDL_Quit.

void exRelease(void)

{

SDL_Quit();

}

29www.linuxmagazine.com.es Número 01

sdl-config es un pequeño programa que

viene empaquetado con SDL y su función es

básicamente informar o prefijar, el lugar de

la instalación de SDL.También se puede usar

para dar los indicadores correctos tanto al

compilador como al enlazador.

$ sdl-config

Usage: sdl-config [--

prefix[=DIR]] [--exec-

prefix[=Dir]] [--version]

[--cflags] [--libs][--static-

libs]

$ sdl-config -libs

-L/usr/local/lib -Wl, -

rpath, /usr/local/lib -lSDL -

lpthread

Cuadro 2: SDLCONFIG

DESARROLLOSDL

Page 30: Linux Magazine - Edición en Castellano, Nº 01

SDL_Surface *pScreen;

pScreen = SDL_SetVideoModeU

(640, 480, 16, SDL_HWSURFACE);

Aquí tenemos una configuración de

superficie de vídeo a 640x480. El 16

indica la profundidad de bit, el cual

refleja el número total de colores

disponibles. En este caso, 65.536 (2^16),

lo cual nos da un buen equilibrio entre

calidad visual y velocidad. Las opciones

habituales son 8, 16 y 24 aunque SDL

puede soportar 12 y 15 (véase el cuadro

Carga de Profundidad).

Normalmente, en el desarrollo de soft-

ware el programador está limitado por el

hardware con el que trabaja y obligado a

doblegarse a sus exigencias sin rechistar.

Los juegos, afortunadamente, son un

mundo aparte. Hemos elegido el tamaño

de pantalla y la profundidad de bit para

hacer alarde de nuestros gráficos en el

mejor entorno posible. Si no utilizamos

suficientes colores, por ejemplo, gráficos

esenciales como la llave o la puerta de

salida pueden ser difíciles (o imposibles)

de ver. Esto es injusto para el jugador y

por eso es admisible salir del juego si

esta resolución no se puede conseguir.

Por otra parte, si se está usando SDL

para aplicaciones que no son juegos, o

no importa la degradación de la imagen,

se puede usar cualquier modo de vídeo

que el usuario pueda tener ajustado en

su escritorio poniendo la profundidad de

bit a cero:

pScreen = SDL_SetVideoModeU

(640, 480, 0, SDL_HWSURFACE);

printf("The bit depth is set toU

%d\n", pScreen>format>U

BitsPerPixel);

Véase el cuadro Funciones de vídeo.

El parámetro final es un juego de indi-

cadores a nivel de bit. Estos especifican

atributos para la superficie y la ventana

en la que es mostrado. El indicador

SDL_HWSURFACE requiere que la super-

ficie de la pantalla, si es posible, deba ser

creada en memoria de vídeo. Si nos

encontramos que el dispositivo no

soporta superficies de hardware (como

en el caso de X11), o que la memoria

hardware está llena, la superficie puede

ser creada, pero software.

Si es apropiado crear una superficie

hardware para un búfer en particular

(como por ejemplo para la pantalla prin-

cipal), seguimos teniendo que invocar

SDL_HWSURFACE. Puede que nosotros

estemos utilizando X11, pero otro

usuario podría no estar haciéndolo y ten-

emos que darles el mejor juego que

podamos.

De igual modo que se puede inicializar

un subsistema individualmente, también

puede cerrarlo de una manera similar:

SDL_QuitSubSystemU

( SDL_INIT_VIDEO );

La función final siempre debe ser

SDL_Quit, ya que esto retirará lo mane-

jadores de señales del paracaídas y

terminará cualquier hebra que quede

activa.

La primera vez que vi tu caraEn SDL todos los gráficos se almacenan

en ‘superficies’. Es un termino que se ha

tomado prestado de DirectX y que sig-

nifica ‘memoria gráfica’. La pantalla es

una superficie. La imagen del fondo es

una superficie. Los personajes son super-

ficies, etcétera. Las superficies pueden

ser creadas y destruidas varias veces a lo

largo de la vida del juego. Sin embargo,

sólo puede haber una superficie de pan-

talla. Es esta superficie de pantalla la que

aparece en el monitor y, por tanto,

cualquier cosa que quiera que sea visible

debe ser dibujada encima de esta super-

ficie.

Las superficies pueden ser de un

tamaño arbitrario y son retenidas en dos

lugares: memoria de vídeo o memoria de

sistema. La memoria de vídeo es más

rápida y es conocida como “superficie de

hardware”. La memoria de sistema (o

memoria software) es parte de la RAM

normal y marcada internamente por SDL

como ‘datos gráficos retenidos’.

La pantalla se inicializa con el

comando especial SetVideoMode, aun-

que la superficie que devuelve no es

diferente de cualquier otra.

30 Número 01 www.linuxmagazine.com.es

El paracaídas es una manera de capturar

señales (tales como fallos de segmentación,

errores de bus, cauces rotos y excepciones de

punto flotante) lo cual da a SDL una oportu-

nidad para llamar a SDL_Quit y liberar sus

recursos. El paracaídas se instala automáti-

camente en la inicialización, si no queremos

utilizarlo, debemos empezar la aplicación

con:

SDL_Init ( SDL_INIT_VIDEO |

SDL_INIT_NOPARACHUTE);

La aplicación debe suministrar sus propios

manejadores de señales si es necesario, si

bien conviene recordar que, en aras de la

portabilidad, no todas las plataformas

soportan todas las señales y algunas

plataformas no soportan señales en abso-

luto.

Cuadro 3: Paracaídas

01 BOOL exInitSDL(void)

02 {

03 if (SDL_Init(SDL_INIT_VIDEO)

< 0)

04 {

05 fprintf(stderr, "No se

pudo inicializar video SDL:

%s\n", SDL_GetError());

06 return FALSE;

07 }

08

09 return TRUE;

10 }

Listing 1: Initialise01 SDL_Surface *pImg;

02

03 if ((pImg = SDL_LoadBMP("welcome.bmp")))

04 {

05 /* Hemos cargado con éxito la imagen */

06

07 SDL_BlitSurface(pImg, NULL, pScreen, NULL);/* transferir todo */

08 SDL_UpdateRect(pScreen, 0,0,0,0); /* toda la pantalla */

09 SDL_Delay(2*1000); /* 2 segundos */

10

11 /* A continuación liberamos la superficie */

12 SDL_FreeSurface(pImg);

13 }

Listing 2: First screen

SDLDESARROLLO

Page 31: Linux Magazine - Edición en Castellano, Nº 01

Además está el parámetro final que

permite redimensionar la ventana

(SDL_RESIZABLE), quitarle el marco

(SDL_NOFRAME) o soportar renderizado

OpenGL (SDL_OPENGL). A menudo,

el primer impulso con un juego es

hacerlo a pantalla completa (SDL_

FULLSCREEN).

Pero nos quedaremos con una versión

en ventana ya que es más fácil trabajar

con ella. Además, es posible hacer que la

máquina se vuelva inutilizable si se está

ejecutando el juego a pantalla completa,

desde donde no es siempre posible con-

mutar a otro escritorio virtual y matar el

programa. Esto también ocurre si se

tropieza con un punto de ruptura en el

depurador o se nos olvida aportar algún

mecanismo para abandonar el juego.

Recordemos que, al igual que un depu-

rador, el paracaídas de SDL captura varias

señales (como Ctrl+C) y, por tanto, éstas

no están siempre disponibles.

Cada superficie que se crea (y eso

incluye a la pantalla) debe ser liberada

con la función SDL_FreeSurface, una vez

que ha dejado de usarse:

SDL_FreeSurface(pScreen);

Mis Posesiones TerrenalesAdemás de la pantalla, necesitamos

algunas superficies de nuestra pro-

piedad, dentro de las cuales podremos

dibujar nuestro gráficos. Hay dos formas

principales de crear nuestras propias

superficies. La primera es crear la super-

ficie manualmente con una de las

siguientes funciones:

SDL_Surface *SDL_CreateRGBU

Surface(Uint32 flags, int widthU

, int height, int depth, Uint32U

Rmask, Uint32 Gmask, Uint32 U

Bmask, Uint32 Amask);

SDL_Surface *SDL_CreateRGBU

SurfaceFrom(void *pixels, int U

width, int height, int depth, U

int pitch, Uint32 Rmask, Uint32U

Gmask, Uint32 Bmask, Uint32 U

Amask);

Esto se utiliza raramente por que tiene

que escribir cada pixel de la imagen

(en el formato correcto) directamente

dentro de la superficie. Además, normal-

mente hay una gran cantidad de

pixels.

Una forma mucho más fácil es dibujar

las imágenes con GIMP y salvarlas como

un BMP. Entonces se puede cargar la

imagen, correctamente formateada y

copiarla dentro de una flamante superfi-

cie. SDL permite esta generosa

funcionalidad con una simple función

llamada:

SDL_Surface *SDL_LoadBMPU

(const char *file);

SDL solo provee soporte a archivos BMP

dentro de la librería estándar. Aunque

SDL_image suministra soporte para

muchos otros formatos, nuestro juego se

limitará a BMPs y hará uso de varias

31www.linuxmagazine.com.es Número 01

Estas funciones pueden suministrar alguna

idea útil sobre que modos de vídeo son posi-

bles con SDL. Las páginas de manual tienen

prototipos completos y una explicación de

estas funciones.

SDL_GetVideoinfo Recupera información acerca

del hardware de vídeo.

SDL_VideoDriverName Da el nombre del dispositivo de

vídeo.

SDL_ListModes Enumera todas las resolucio-

nes de pantalla disponibles.

SDL_VideoModeOK Determina si un modo especi

fico de vídeo está disponible.

Cuadro 4: Funciones devídeo

DESARROLLOSDL

Cuando la profundidad de bit es distinta de

8, los datos del pixel se almacenan en un

“formato empaquetado”. Esto se llama así

porque el color se representa con tres

números, uno para cada uno de los compo-

nentes rojo, verde y azul que se empaquetan

juntos (en un simple Uint o Uint32) para

mostrar el color. Con una profundidad de 24

bits (a veces llamado Color verdadero), cada

uno de los componentes RGB ocupa 8 bits.

Esta es la resolución más alta que probable-

mente necesitemos, pero normalmente es

excesiva para la mayoría de los juegos.

Desafortunadamente las cosas se vuelven

más complicadas con el más común de los

formatos empaquetados. Me refiero al color

de 16 bits. En este caso los componentes RGB

usan 5, 6, y 5 bits para cada color o ¡5, 5 y 6 o

6, 5 y 5! El formato exacto de la superficie

puede variar dependiendo de donde esté

almacenado y que tarjeta gráfica se esté

usando. La orden también puede variar si se

está usando un PowerPC, por ejemplo,

debido a la cuestión de la orientación de los

datos (endian). Sin embargo, esto no es algo

de lo que debamos preocuparnos, ya que

desde SDL se convierten los formatos

automáticamente durante una transferen-

cia de bloque o blit. Si se necesita

comprender el formato interno (tal como

veremos más tarde en esta serie) es agrad-

able saber que SDL suministra la función

SDL_MapRGB para ayudarnos. En verdad,

este problema con el formato de los paque-

tes también se manifiesta con el modo de

color de 24 bits, pero es menos pronunciado.

Las reglas cambian cuando se especifica una

profundidad de bit de 8. En vez de separar los

8 bits dentro del componente RGB, cada

valor (desde 0 a 255) referencia a una tabla

separada que indica el color actual. Esta

tabla se llama la paleta (la cual usa 24 bits

completos para almacenar la información de

color) y puede ser configurada con las fun-

ciones SDL_SetColors y SDL_SetPalette.

Aunque hoy en día ha decaído en lo que se

refiere a la programación de juegos, gracias a

este formato, se puede mantener la produc-

ción de gráficos de alta calidad en hardware

muy limitado.También se pueden producir

muchos efectos interesantes (y muy rápidos)

cambiando los colores en la paleta sin hacer

cambios en cada pixel sobre la pantalla. El

mayor problema con las superficies de 8 bits

paletizadas es que solo se dispone de 256

colores específicos para toda la imagen. Si el

fondo usa un juego de 256 colores y el per-

sonaje principal usa otro diferente, entonces

SDL cambiará automáticamente algunos de

los colores. Si bien esto no es algo demasiado

malo, los resultados pueden ser impredeci-

bles y por lo tanto hará que el trabajo

artístico sea un poco menos impresionante.

La otra cara de la moneda, sin embargo, es

que mover datos de 8 bits es el doble de

rápido que mover datos de 16 bits y, por

tanto, es a menudo un truco empleado para

dispositivos de mano (PDAs, móviles, etc.).

Para asegurar la compatibilidad en varias

plataformas, los tipos estándar de C como

short e int, no se usan. En su lugar, SDL define

los suyos propios, que son usados por toda la

API. Estos tipos pueden cambiarse sobre

nuevas plataformas para asegurar que un

Uint16, por ejemplo, es siempre de 16 bits.

typedef unsigned char Uint8;

typedef signed char Sint8;

typedef unsigned short Uint16;

typedef signed short Sint16;

typedef unsigned int Uint32;

typedef signed int Sint32;

Cuadro 5: Carga de profundidad

Page 32: Linux Magazine - Edición en Castellano, Nº 01

cualquiera de las dos superficies, fuente

o destino. Esto es muy útil, ya que

podemos dibujar gráficos en posiciones

tales como (-4, -2) o (600, 450), lo cual

permite dividir suavemente nuestros grá-

ficos por el borde de la pantalla. SDL

resuelve como representar la porción vis-

ible óptimamente.

SDL_Rect srcrect = U

{600, 450, 64, 64};

Solo transferiremos bloques desde 600,

450 a 639, 479 aunque la extensión sea

663, 513. Si se quiere transferir en

bloque la superficie entera (como hici-

mos en la pantalla de bienvenida)

entonces pasaremos srcrect como NULL.

Solo usamos las coordenadas x, y de

dstrect refiriéndonos a la esquina supe-

rior izquierda del área de destino,

porque no somos capaces de estirar y

transferir bloques. Pasando NULL como

valor dstrc le diremos a SDL que

comience la transferencia de bloque

desde (0,0). Si la extensión del bloque

transferido excede la superficie de des-

tino la imagen se recortará normalmente.

Esta área recortada puede ser limitada

artificialmente con:

void SDL_SetClipRect(U

SDL_Surface *surface, U

SDL_Rect *rect);

Y cualquier futura transferencia de

bloque a esa superficie solo ocurrirá den-

tro del área especificada en el

rectángulo. Como dije más arriba,

pasando NULL como puntero SDL_Rect,

le estamos diciendo a SDL que use el

área completa de la superficie, lo que

efectivamente eliminara el área recor-

tada. Esta característica nos permite

mantener un área de la pantalla pura y

sagrada, sin tener en cuenta que compo-

nentes del juego intenten transferir

bloques allí, protegiendo información tal

cómo la puntuación, o el número de

vidas.

¡Bienvenidos!Así que ahora podemos cargar una ima-

gen en una superficie y transferir un

bloque de esa superficie a otra superficie

(tal como la pantalla). A fin de ver como

queda nuestro trabajo, debemos dar a

conocer una revelación más. La superfi-

cie pantalla que hemos configurado no

es la imagen que se visualiza en la ven-

tana. Esa imagen se controla por el

dispositivo (tal como X11), no por SDL.

A fin de ver la imagen, debemos decirle

a SDL que actualice el dispositivo con el

gráfico de nuestra superficie. Para hacer

esto usaremos la función SDL_

UpdateRect.

void SDL_UpdateRect(U

SDL_Surface *screen, Sint32 x, U

Sint32 y, Sint32 w, Sint32 h);

Sólo un pequeña porción rectangular de

la pantalla es actualizada (lo cual es nat-

uralmente más rápido que si

actualizamos toda la superficie). Como

alternativa, podemos elegir pasar ceros a

cada uno de los parámetros y actualizar

todo el área de golpe. Por ejemplo:

SDL_UpdateRectU

(pScreen, 0, 0, 0, 0);

Ahora hemos transferido algunos blo-

ques a nuestra pantalla y provocado la

actualización del monitor y así actu-

alizarlo con nuestra propia imagen. De

esta manera, si añadimos un pequeño

retraso, completaremos nuestra primera

pantalla.

Producir un nivel del juego o person-

ajes animados, es simplemente una

cuestión de mas transferencias de blo-

ques, en más lugares, desde más

superficies. No implica nada más que lo

que ya hemos visto. Desafortunada-

mente, hay buenas y malas manera de

hacer esto. El próximo mes le daremos

un vistazo a las buenas maneras,

mostraremos como las superficies

pueden ser usadas para crear la pantalla

del juego ¡y daremos vida a algunos de

los malos! �

superficies cargadas de esta manera.

Cada superficie retendrá un juego de grá-

ficos específico: Uno para el telón de

fondo, otro para el jugador, otro para el

enemigo, etcétera.

La imagen final del juego, por tanto, se

construirá a partir de muchas copias de

superficies a superficie (recordemos que

la pantalla es solo una superficie),

aunque gobernadas por la lógica del

juego. Este proceso de copiado se llama

blitting y es la abreviatura de BLock

Image Transfer.

El Baile del BlitPodemos transferir bloques (blits) entre

dos superficies cualquiera y eso incluye

desde una superficie a sí misma. Tam-

bién podemos transferir bloques desde

una porción de una superficie, a una por-

ción diferente de otra superficie. La

única limitación es que el tamaño de

ambas porciones (la fuente y el destino)

deben ser del mismo tamaño. La

operación de transferencia de bloques se

puede (si ambas superficies están en

memoria de vídeo) ejecutar por hard-

ware, lo cual es increíblemente rápido.

No todos los dispositivos gráficos, no

obstante, soportan la aceleración por

hardware, así que para un breve recorda-

torio, véase el cuadro Dispositivos.

Hay una sola función para hacer trans-

ferencias de bloques. Es única así que es

sencillo de recordar:

int SDL_BlitSurface(U

SDL_Surface *src, U

SDL_Rect *srcrect, U

SDL_Surface *dst, U

SDL_Rect *dstrect);

Desde esta función no se dispone de la

capacidad de estirar o rotar la superficie;

para esto deberemos recurrir a

cualquiera de las librerías SDL_gfx [4] o

SGE [5]. Como el estirar bitmaps con-

sume mucho tiempo de proceso no lo

usaremos en nuestro juego, ya que esta-

mos aspirando a la máxima velocidad.

Por tanto generaremos nuestros gráficos

al tamaño exacto que necesitemos.

SDL_Rect es una estructura simple

para indicar el tamaño del área que quer-

emos transferir, tomando como x, y, la

anchura y la altura. SDL cortará

automáticamente nuestras coordenadas

internamente si excedemos los límites de

32 Número 01 www.linuxmagazine.com.es

SDLDESARROLLO

[1] SDL: http://www.libsdl.org

[2] Memory Type Range Register: http://

www.linuxvideo.org/user/mtrr.txt

[3] Descargas de SDL: http://www.libsdl.org/

download-1.2.php

[4] Librería SDL_gfx: http://www.ferzkopp.

net/~aschiffler/Software/SDL_gfx-2.0/

[5] Librería SGE: http://www.etek.chalmers.

se/~e8cal1/sge/index.html

INFO

Page 33: Linux Magazine - Edición en Castellano, Nº 01

33www.linuxmagazine.com.es Número 01

un bucle while que se encargase deprocesar los tecleos y pasarlos a la claseapplication y, al final, cuando se pulsasela tecla que precipitase la salida delbucle, se llamase al destructor del objetoy todo se recogiese limpia y ordenada-mente. Sencillo. El corazón de dichaclase se puede apreciar en el Listado 1.No es muy impresionante ¿verdad? Esoes por que la mayor parte del “trabajosucio” se lleva a cabo en window, que alser heredado por application, recibe unallamada a su constructor cuando se creaun objeto application. Y es en el con-structor de window donde se inicializatoda la infraestructura de curses,preparándola para mostrar las ventana.Se puede apreciar la herencia de window

por parte de application en el fichero deinclusión application.h, no listado eneste artículo, pero que puede ser descar-gado desde la web de la revista en [2].Un poco más adelante volveremos sobrela clase window. Volviendo al construc-tor de application, lo primero que se

Mucho más práctico, digo, estener una pantalla en blanco ynegro, con buen contraste, un

ordenador sencillito. Sinceramente, losinterfaces amigables con muchos col-orines e iconos de diseño estánsobrevalorados. No sólo eso, sino quepueden inducir a confusión. Si se piensaracionalmente, muchas aplicaciones (lamayoría) no necesitan de interfaz grá-fico. Perfectamente podrían apañarsecon un interfaz de botones, menús yventanas basadas en texto. Amén deresultar menos exigente con el hardware,también serían más claros y más sencil-los de utilizar. Precisamente paradesarrollar interfaces para aplicacionesde estas características existe curses, unalibrería que facilita enormemente lacreación de ventanas, menús y widgetsen terminales de texto. Por supuesto quelas librerías curses están disponibles parala mayoría de los Unixes, incluyendoLinux y suelen incorporarse con casitodas las distribuciones e incluso existenversiones para otras plataformas lo queasegura, hasta cierto punto, la portabili-dad del código (véase [1]). En esteprimer capítulo destinado a curses

vamos a ver como emplear la libreríaimbuida en la infraestructura de unaaplicación desarrollada en C++. Unaadvertencia: el C++ no es el entornonatural de curses y, al menos en un caso,no conseguiremos unas compilacionescien por cien limpias (es decir, sin adver-tencias), si bien esto es más bien unproblema del compilador g++ que delcódigo de muestra o de un defecto decurses, como después veremos.

Tal vez uno de los principales motivos para utilizar un interfaz de texto sea uno que dicta el sentido común de la

economía. Más o menos nuestra máxima podría rezar así:“¿Para qué más?”. Efectivamente: ¿para qué? ¿Qué necesidad

tiene un almacén de piezas de recambio de automóviles de un Pentium VII a un millón de gigaherzios con pantallas de

plasma de tropocientos pixels y mogollomiles de colores? Tal vez sería más realista escoger máquinas más básicas,

incluso de las consideradas obsoletas, e invertir lo que se ahorre en hardware (y software, como después veremos) en

otro sitio. POR PAUL C. BROWN

Un primer paso hacia curses

Interfaces Simples

DESARROLLOInterfaces

Aplicándose a la tareaTal vez la manera más racional de enfo-car el desarrollo de la aplicación (almenos es la que funciona para mí) es elde concebirlo desde arriba hacia abajo.Es decir, piensa en como quieres que sevea y ya te encargarás del trabajo suciodespués. Normalmente esto implicaempezar con la función main() yreducirlo a unas pocas llamadas – ycuando digo unas pocas, quiero decirunas poquísimas. Si la función main()

puede contener como mucho 10 líneasde código, es que vamos bien. Despuésvamos implementando clases de las másgenerales a las más específicas, siendoestas últimas las que de verdad interac-túan con las librerías específicas, cursesen este caso. Así que, yo ¿cómo queríaque se viese? Pues quería que en main()

se inicializase un objeto x de una clase,llamémosle application, y que esa clasese ocupase de mostrar la ventana princi-pal de la aplicación, colocara los menúsetc. El resto de main() se ocuparía con

Page 34: Linux Magazine - Edición en Castellano, Nº 01

34 Número 01 www.linuxmagazine.com.es

hace es realizar una llamada al macro defabricación casera makeString() quesirve para convertir una cadena con unnúmero de argumentos opcionales enuna sola cadena tipo string que se uti-lizará como título (asignado, pues, a lapropiedad de la clase title). Veremos mássobre este macro en la sección Parámet-ros Indefinidos más abajo. Lo siguientees abrir una ventana con la que podamostrabajar. Esta ventana será la del fondo,la madre de todas las subsiguientes ven-tanas y donde se alojará el menúprincipal del programa. La llamada es unmétodo de la clase window, heredadapor application y que veremos en la sigu-iente sección. El destructor de la clasecontiene una única instrucción, end-

win(), la función de curses utilizadopara recoger la basura y para devolver laterminal al estado que tenía antes de lallamada a initscr(). De momento es todolo que necesitaremos para salir elegante-mente de curses.

Abriendo la VentanasEn la siguiente capa de nuestra apli-cación, estaría la clase que administraríacada una de las ventanas que se fuesencreando, incluyendo la principal. Estacapa viene representada por la clase win-

dow, la implementación de la cual sepuede ver en el Listado 2 (o al menosparte. Se han dejado fuera los métodosget y set correspondientes a varios atrib-

utos. Ver [2]). Fijémonos que windowcuenta con dos constructores sobrecar-gados. Uno, el que no tiene parámetros,sirve de constructor cuando se crea unobjeto application y crea el entornocurses. Este constructor se llamará unasola vez por aplicación y monta la ven-tana stdscr, el “contenedor” de todas lasdemás ventanas. En el código se apreciacomo usa los métodos estándar de ini-cializar la pantalla y librería de cursesutilizando (initscr()) y como se activa elmapeado del teclado (keypad(), estosirve para que las teclas de función, cur-sores, etc. devuelvan caracteres que elprograma pueda procesar, permitiendo,por ejemplo, que si el usuario pulsa latecla F1, se active el sistema de ayuda,etc.). A continuación, deshabilitamos lasecuencia de Nueva Línea + Retorno deCarro cada vez que se produce una sal-ida con la llamada a nonl() y le decimosa la aplicación que ha de capturar laspulsaciones en cuanto se produzcan sinesperar a un carácter de nueva línea conel procedimiento cbreak(). Esto últimonos permitirá procesar cada tecleo delusuario como es debido, activandoalguna funcionalidad del programa sipulsa un tecla de un carácter no imprim-ible o colocando una letra en la ventanaapropiada si el usuario desea escribiralgo. Por fin, evitamos que se visualiceninmediatamente las entradas desde elteclado con la función noecho(). De estamanera, podremos capturar los tecleos yprocesarlos como nos convenga en elcontexto de la aplicación. Todas estasfunciones pertenecen a la librería decurses y su uso es bastante estándar enel arranque de cualquier aplicación queutilice el paquete. El segundo construc-tor, window::window( int wide =

COLS,int high = LINES, int posX = 0,int

posY = 0, bool frame = TRUE, string

win_Name = "Untitled"...), sirve paracrear las ventanas con las que podremosinteractuar. Si nos fijamos, el constructorde la clase application utiliza este con-structor para generar el fondo visible dela aplicación, con un marco (establecidopor el parámetro frame) y de un tamañoigual a la del terminal donde semostrará. El tamaño de la terminal seestablece en líneas (LINES) y columnas(COLS), siendo estas dos variables gen-eradas por curses a la hora de inicializarel motor y para la ventana principal de la

aplicación vamos a ocupar todo el termi-nal visible. Por ello, al invocar alconstructor de la ventana de fondo de laaplicación en el constructor de applica-

tion, utilizamos el alto y ancho máximodisponible al arrancar el programa. Dehecho, lo primero que se hace en estesegundo constructor es crear una ven-tana con la función curses newwin() yasignar el puntero que devuelve al atrib-uto w_Handle. Este atributo nos será útilmás adelante para referirnos a cada unade las ventanas cuando contemos conmás de uno. A continuación, proce-samos el título de la ventana de manerasimilar que hacíamos en el constructorde application y establecemos al atributoframe para dibujar (o no) un marcoalrededor de la ventana. Lo siguiente esasignar la ventana a un panel. Los pane-les en curses añaden propiedades a lasventanas permitiendo que estas se apilenpor capas y se solapen de manera consis-tente. Para entendernos, sería muy difíciltener ventanas de diálogos, ventanasmóviles y ventanas apiladas sin queestas participaran de las funcionalidadesque les atribuyen los paneles. La conver-sión de una ventana “normal” en unventana panel es tan sencilla como se veen el listado: basta invocar a la funcióncurses new_panel() con el handle de laventana a convertir. La función devuelveun handle al panel creado queguardamos en el atributo p_Handle parareferencias futuras. Luego llamamos almétodo de la clase putTitle() (que se veun poco más abajo en el listado). Éstemétodo, como su nombre indica, colocael título de la ventana en el ángulo supe-rior izquierdo y, de paso, dibuja el marcopara la ventana. El siguiente método,showPanels(), también perteneciente a laclase window, muestra el panel lla-mando a update_panels() (que actualizael aspecto del panel) y doupdate() (queactualiza la pantalla con la nueva infor-mación), ambas funciones perten-ecientes a la librería curses. El métodoputTitle() a su vez invoca al métodowWrite(), que es el método de la claseencargado gestionar el paso de cadenas alas ventanas de curses. Recibe tres o másparámetros: los dos primeros establecenla posición x e y de la cadena (tercerparámetro) que se montará junto con losparámetros indefinidos que le siguen. Lafunción mvwprintw(), perteneciente a la

01 #include "application.h"

02

03 application::application(bool

frame=TRUE,string

app_Name="Untitled"...)

04 {

05 makeString(app_Name);

06 title=app_Name;

07

08 window

app_window(COLS,LINES,0,0,TRU

UE,title);

09 }

10

11 application::~application()

12 {

13 endwin();

14 }

15

16 // ... Y 'gets' varios

Listado 1: application.cpp

InterfacesDESARROLLO

Page 35: Linux Magazine - Edición en Castellano, Nº 01

35www.linuxmagazine.com.es Número 01

cadena, llamamos wrefresh() querefresca la ventana que acabamos demodificar, que no la pantalla. El refrescode la pantalla para que se puedan ver lasmodificaciones se produce en el métodoshowWindow(), que llamamos a contin-uación. El método showWindow() es unparche en la ya larga tradición de losfamosos parches de Paul C. Brown.Nació cuando me dí cuenta de que curses

no me actualizaba satisfactoriamente lasventanas si no había una entrada de

datos desde el teclado. Bueno, más bien,si no se intentaba conseguir una entradadesde el teclado. Por ello lo único quehace esta rutina es anular la espera parauna entrada (nodelay()), leer el búfer deentrada (wgetch() – normalmente dichobúfer estará vacío, puesto que no esperaa que el usuario teclee nada) y volver aactivar la espera de entrada para, a con-tinuación, actualizar los panelesllamando a showPanels(). Sin este pro-cedimiento, los paneles no se actualizan

librería curses, es la encargada de colo-car la cadena en la ventana indicada porel handle que se le pasa. Nótese como, apesar de que la mayoría nosotros esta-mos acostumbrados a referirnos primeroal eje de las x y después al eje de las y,curses lo hace a la inversa, más bienporque cuando hablamos de terminalesde texto, es habitual hablar primero delíneas (componente vertical) y despuésde columnas (componente horizontal)en ese orden. Después de colocar la

01 #include "window.h"

02

03 window::window()

04 {

05 w_Handle=initscr();

06 keypad(stdscr, TRUE);

07 nonl();

08 cbreak();

09 noecho();

10 }

11

12 window::window(int wide=COLS,int high=LINES,int

posX=0,int posY=0,bool frame=TRUE,string

win_Name="Untitled"...)

13 {

14 w_Handle=newwin(high,wide,posY,posX);

15

16 makeString(win_Name);

17 title=win_Name;

18 has_Frame=frame;

19

20 p_Handle=new_panel(w_Handle);

21

22 putTitle();

23 showPanels();

24 }

25

26

27 void window::closeWindow()

28 {

29 delwin(w_Handle);

30 refresh();

31 }

32

33 void window::putTitle()

34 {

35 int px=1,py=0;

36 if(has_Frame)

37 {

38 drawFrame();

39 px=0;py=-1;

40 }

41 wWrite(px,py,title);

42 }

43

44 void window::showPanels()

45 {

46 update_panels();

47 doupdate();

48 }

49

50 void window::wWrite(int px, int py, string

my_String...)

51 {

52 if (has_Frame)

53 {

54 px++;py++;

55 }

56 makeString(my_String);

57 mvwprintw(w_Handle,py,px,my_String.c_str());

58 wrefresh(w_Handle);

59 showWindow();

60 }

61

62 void window::showWindow()

63 {

64 nodelay(w_Handle,TRUE);

65 wgetch(w_Handle);

66 nodelay(w_Handle,FALSE);

67 showPanels();

68 }

69

70 void window::drawFrame()

71 {

72 wborder(w_Handle, ACS_VLINE, ACS_VLINE,

ACS_HLINE, ACS_HLINE, ACS_ULCORNER, ACS_URCORNER,

ACS_LLCORNER, ACS_LRCORNER);

73

74 }

75

76 int window::wGetch()

77 {

78 return(wgetch(w_Handle));

79 }

80

81 // Gets y sets varios aquí

Listado 2: window.cpp

DESARROLLOInterfaces

Page 36: Linux Magazine - Edición en Castellano, Nº 01

36 Número 01 www.linuxmagazine.com.es

hasta una nueva entrada por parte delusuario y no se mostrarán de motu pro-pio cosa como los títulos o el borde. Encuanto a drawFrame(), su nombre lodice todo: dibuja un marco alrededor dela ventana utilizando para ello la rutinacurses wborder() y los valores pre-definidos de curses para la barra vertical(ACS_VLINE), tanto para el bordeizquierdo, como para el derecho; la barrahorizontal (ACS_HLINE) para el bordesuperior e inferior ; y los gráficos de lasesquinas ACS_ULCORNER

(esquina superiorizquierdo), ACS_

URCORNER (esquina su-perior derecho), ACS_

LLCORNER (esquina infe-rior izquierdo), ACS_

LRCORNER (esquina infe-rior derecho). Por fin, elmétodo wGetch() se en-carga de recoger lasentradas procedentes delteclado referidas a la ven-tana para que puedan serprocesadas.

ParámetrosindefinidosConviene explicar en unaparte lo referente a lasfunciones con parámetrosindefinidos. Estas fun-ciones permiten quefuncionen, por ejemplo,el socorrido printf() de C.Si nos fijamos en comofunciona, si hacemos

printf("Tengo %iU

muñeca vestida deU

%s...",1,"azul");

devolverá la cadena“Tengo 1 muñeca vestidade azul...” y compro-bamos que a printf(), queno es más que otra fun-ción de las libreríasestándar de C, puederecibir tantos parámetroscomo gustemos… siem-pre y cuando el primerosea el que indique el for-mato del mensaje amostrar. Eso es por queprintf() es una función

que acepta, además de una serie deparámetros definidos, un númeroindefinido de otros parámetros. Hayvarias maneras de leer los parámetrosindefinidos a variables. Una sería la depasar como argumento definido elnúmero de argumentos indefinidos. Otrala de incluir como definido un argu-mento que fuese igual al último de losargumentos indefinidos. En ambos casoscrearíamos un bucle (en el primer casoun bucle for y en el segundo uno while)

que fuera iterando sobre la lista de argu-mentos hasta que o (a) se leyese hasta elnúmero de argumentos preestablecido o(b) se llegase hasta el argumento quefuese igual al argumento definido comoel último. Ambos métodos ofenden misentido de la estética de la progra-mación, ya que ¿qué pasa si ni el mismoprogramador sabe cuantos argumentosvan se indefinidos? Yo opto por elmétodo (c), que consiste en que todoslos argumentos se vuelcan en una lista

(de tipo va_list) y se vanleyendo e integrando en elargumento plantilla. Esto nosería un problema si no fueraporque con curses, el uso deuna cadena de longitudindefinida (tipo char *cadena)genera un fallo de seg-mentación. En concreto, siutilizamos una cadena de lon-gitud indefinida *buf en unprograma C o C++ “normal”(es decir, que no cargue libr-ería “raros” como curses) nopasa nada:

function ejemplo2U

(char *plant, ...)

{

char *buf;

va_list args;

va_start(args, plant);

vsprintf(buf,plant,args);

va_end(args);

return(buf);

}

El código anterior funcionarásin ningún problema. Pero concurses, si se utiliza una cadenade longitud indeterminada ydespués se utiliza sprintf() ovsprinf() con una plantilla yvarios argumentos, el resul-tado es el dichoso error defallo de segmentación, uno delos errores más irritantes quetiene la insidiosa costumbre deaparecer en el momento de laejecución, después de unacompilación exitosa. Otra pegaun tanto engorrosa es queva_start() y va_end() han deestar en la misma función querecibe los parámetros in-definidos, por tanto veréis la

InterfacesDESARROLLO

01 #include <stdlib.h>

02

03 #define makeString(return_String) \

04 { \

05 char *fmt; \

06 if ((fmt=(char*)

malloc(sizeof(char)*return_String.length()))==NULL)\

07 printf("ERROR: Memoria insuficiente");\

08 else \

09 { \

10 strcpy(fmt,return_String.c_str()); \

11 va_list args; \

12 char *p; \

13 int n, size=10; \

14 if((p = (char*) malloc(size)) == NULL)\

15 printf("ERROR: Memoria insuficiente");\

16 else \

17 { \

18 while(1) \

19 { \

20 va_start(args,fmt); \

21 n=vsnprintf(p,size,fmt,args); \

22 va_end(args); \

23 if (n < size) \

24 { \

25 break; \

26 } \

27 else \

28 { \

29 size = n+1; \

30 if((p = (char *) realloc(p,size)) ==

NULL)\

31 { \

32 printf("ERROR: Memoria Insuficiente");\

33 break; \

34 } \

35 } \

36 } \

37 } \

38 return_String=p; \

39 free(p); \

40 free(fmt); \

41 } \

42 }

Listado 3: va.h

Page 37: Linux Magazine - Edición en Castellano, Nº 01

que size, es que se ha truncado lacadena. En este caso lo que hemos dehacer es aumentar el valor de size hastan+1 (la longitud total más el crácternulo /0) y reasignar memoria por elnuevo valor a p. Es lo que se hace a con-tinuación. Una vez que tenemos eltamaño adecuado, volvemos a asignar lacadena a p y podemos salir del bucle yasignar la cadena contenida en p areturn_String y proceder a liberar lamemoria asignada a p y a fmt. Este inge-nioso truco viene de la página man devsnprintf(), si bien ha sido adaptadopara que por un extremo entre una vari-able tipo string sin los otros parámetrospara formatear y por el otro salga unavariable string con todos los parámetrosdispuestos limpiamente en su interior.Toda la basura se recoge, la memoriareservada para las cadenas se libera,todo queda inmaculadamente limpio trassu ejecución. Este macro no produce unacompilación limpia. A la hora de compi-lar con g++ genera una advertenciaallá donde se emplee que reza:

warning: second parameter ofU

`va_start' not lastnamedU

argument

Esta advertencia surge debido a que elcompilador es incapaz de reconocer unacadena de tipo string como el últimoargumento definido antes de la ristra deargumentos indefinidos. Sin embargo, elprograma acaba compilando y se ejecutasin problemas.

ExplotaciónPor fin hemos llegado al momento de vernuestras clases en acción. Si miramos elListado 4, vemos que la función main de

nuestro programa es harto sen-cillo. Incluimos el fichero deinclusión application.h que con-tiene la definición de la claseapplication. A continuación,declaramos una variable tipochar para contener las pulsa-ciones del teclado y un objetotipo application. Llegados a estepunto, se visualizará en la ter-minal la ventana principal de laaplicación, tal y como se ve enla Figura 1. Seguidamente,entramos en un bucle a la esperade que el usuario pulse la tecla

INICIO o HOME, lo que cierra el bucle,desencadenando la destrucción delobjeto application y cerrando el pro-grama.

CompilaciónPara la compilación con curses, hemosde enlazar con la librería ncurses. Siademás empleamos paneles para podersolapar ventanas, hemos de incluir lalibrería panels y, por supuesto, hemos deenlazar las clases que hemos creado.Para todo ello existe un sencillo Makefileque se puede descargar junto con el restodel código fuente de [2].

ConclusiónSi bien parece que es poco lo obtenidohasta ahora, hemos sentado las basespara una aplicación mucho más com-pleja. Podríamos tomar lo desarrolladocomo una plantilla para un programafuncional e ir insertando nuevas fun-cionalidades con un de mínimo esfuerzo.El mes que viene seguiremos utilizandocurses para implementar una aplicacióny veremos como crear ventanas modalesde diálogo, como crear botones y otrasfuncionalidades que nos demostraránque los interfaces de texto siguenestando vivitos y coleando �

misma secuencia de comandosrepetida una y otra vez a lolargo de las clases que estamosanalizando y no hay manera desepararlos en una funciónaparte. El tercer problema esque sólo se nos permite operarcon cadenas tipo char *, lo queteóricamente nos despoja delprivilegio de utilizar cadenas detipo string, con la de ventajas yfacilidades que aportan, caray.Todos y cada uno de estosinconvenientes se resuelven conel macro que se puede ver en elListado 3. ¿Cómo funciona? Pues, comose puede observar en el listado, loprimero que hacemos es asignar espacioa una variable de tipo char* llamado fmt,de hecho tanto espacio como caracterescontenga el argumento string

(return_String). A continuación copi-amos el contenido de return_String afmt. a continuación asignamos un pocode espacio (size en bytes) a otra variablechar* llamado p. Esta variable contendrála cadena procesada. Seguidamente,creamos la cadena final con un límite desize bytes. La función vsnprintf() asignatantos bytes a p como los indicados ensize, por tanto, no es posible excedernosde la cantidad de memoria asignada a py evitamos posibles fallos de seg-mentación. Ahora bien, si toda la cadenano cabe en esos size bytes, vsnprintf()

devuelve el número de bytes que hubieracabido. Es decir, si n resulta ser mayor

[1] Curses en plataformas Windows:

http://www.funet.fi/pub/win-nt/curses/

http://www.crystalcom.com/crs_swin.

htmhttp://www.eunet.bg/simtel.net/

msdos/screen.html

[2] Las fuentes completas, con ficheros de

inclusión, para el programa descrito en

este artículo http://www.linuxnewmedia.

es/magazine/numero1/descargas/curses

RECURSOS

Figura 1: Nuestra primera aplicación, con marco y título.

37www.linuxmagazine.com.es Número 01

DESARROLLOInterfaces

01 #include "application.h"

02

03 int main()

04 {

05 int ch;

06 application my_App(TRUE,"Mi

Aplicación número %i",1);

07

08

while((ch=my_App.wGetch())!=KE

Y_HOME)

09 {

10

11 }

12

13 my_App.~application();

14 exit(0);

15 }

Listado 4: principal.cpp

Page 38: Linux Magazine - Edición en Castellano, Nº 01

no perderme, el menú de arranque, ymeterme en mi semi-olvidada insta-lación de Windows, desde el cual, porsupuesto, no tenía acceso ni a la mitadde las herramientas a las que Linux metiene acostumbrado y sin las cuales mesiento totalmente desamparado. Unmontón de trabajo para imprimir unossobres. Solía usar un viejo programa deWindows para esta tarea, pero eso seacabó. Existe un utilísimo programa bajoLinux que llamado Ghostscript quepuede convertir nuestra vieja impresoradoméstica en una fabulosas máquinaPostScript.

Si nuestra distribución no se ha ocu-pado ya de esto, véase [1] para sabercomo se hace. Como muestra la figura 1,la exportación de datos desde la base de

datos Windows no fue un problema alusar el formato de separadores mediantecomas (CSV). Todo lo que tuve quehacer a continuación fue generar unarchivo PostScript para cada sobre yluego enviar esos archivos a la impre-sora. Y esto es un juego de niños conmódulos CPAN como PostScript::File yPostScript::TextBlock, como [2] nos dirá.PostScript es básicamente otro lenguajede programación. Los archivos Post-Script están hechos de texto ASCIIlegible y contienen una lista de coman-dos necesarios para generar una páginaimpresa.

Pintando mediante númerosNo obstante, PostScript usa el llamadosistema de coordenadas matemáticas y

Linux puede hacer más o menoscualquier cosa. Leer imágenes digi-tales desde cámaras, reproducir

pistas digitales, escribir CDs, inclusoconseguir que un escáner USB funcione(con algo de ayuda de Xsane). Pero atítulo personal tenía que utilizar Win-dows de vez en cuando para realizar unatarea en concreto: a la hora de remitirvarias cartas iguales a distintos desti-natarios, las direcciones de los cuales seextraía de una base de datos, tenía queslirme de mi adorado Linux, rearrancarel ordenador, no distraerme ni ir a por uncafé mientras la máquina arrancaba para

No necesitamos ni un paquete Office

ni LaTeX para imprimir los sobres de

un mailing. Los módulos Perl de Post-

Script, una base de datos y el listado

de este artículo forman una solución

perfecta para crear sobres para

envíos masivos de correo.

POR MICHAEL SCHILLI

Sobres impresos con Perl y PostScript

Cartas Postales Perfectas

38 Número 01 www.linuxmagazine.com.es

PerlDESARROLLO

Pra

jua

b M

an

kla

ng

,visip

ix.co

m

Figura 1: Los campos en el archivo de dirección separados por comas.

Michael Schilli tra-baja como ingenieroWeb en la empresaAOL/Netscape enMountain View, Cali-fornia. Escribió “PerlPower“for Addison-Wesley y puede sercontactado en la direcció[email protected]. Su páginaweb es http://perlmeister.com.

TH

E A

UT

HO

R

Page 39: Linux Magazine - Edición en Castellano, Nº 01

esto algo muy poco habitual en unprograma de composición. El origen delsistema coordeandas es la esquinainferior izquierda de la página. Losvalores positivos del eje x arrancandesde la izquierda y se extienden haciala derecha y los valores positivos de yvan incrementando de valor de abajoarriba, tal y como nos enseño nuestroviejo maestro de matemáticas en nuestrocolegio de secundaria. PostScript usapuntos pica o PostScript, que midenaproximadamente 1/3 de milímetro.Como ejemplo de lo que se puede con-seguir con PostScript, los siguientescomandos imprimirán el nombre John

Doe en el recuadro de la dirección de unsobre:

0 setgray 401.95 156 moveto

/Helvetica-iso findfont

18 scalefont setfont

(John Doe) show

Empezando en la esquina izquierda infe-rior del sobre, nos iríamos casi 402puntos hacia la izquierda y 156 haciaarriba para imprimir las letras que venentre los paréntesis en la fuente especifi-cada (Helvetica-iso) y con el tamañoespecificado (18 puntos) y de izquierda aderecha del papel.

Para empezar a programar con Post-Script bajo Perl, CPAN proporciona losmódulos PostScript::File y PostScript::

TextBlock para simplificar el asunto. Elprimero sirve para insertar la cabeceraPostScript de la siguiente manera:

%!PS-Adobe-3.0

lo cual se ocupa de cosas como la ori-entación de la página, los bordes y elorden de la página. PostScript::TextBlock

acepta líneas múltiples y escribe desde lacoordenadas indicadas. No obstantepodemos esperar muchas horas de diver-sión realiyando ajustes en losparámetros de cada módulo hasta queconsigamos producir el formato deseadoen el lugar adecuado de la página.

Normalmente se utiliza el siguienteformato: el bloque de texto con la direc-ción del remitente comienza aproxi-madamente 20 milímetros por encima dela esquina inferior derecha en las direc-ciones x e y. En otras palabras, nosotrosno queremos especificar el punto de ini-

cio del campo dirección, si no queindicamos la posición de la esquinaderecha inferior del bloque de texto. Estonos asegura que el bloque siempreacabará en la misma posición al margende las variables que usemos o la largaque sea la dirección.

En cuanto al programa, el código deejemplo que se muestra en el listado 1define una constante Sender (línea 14).Ésta lee los datos de un archivo .csv eimprime un sobre como los mostradosen las figuras 2 ó 3 para cada direcciónque encuentre.

Importación desde Windows$ADDR_CSV en la línea 13 especificamosel nombre del archivo de direcciones quedebe tener la misma estructura que elmostrado en la figura 2. El comando paraenviar un archivo PostScript a nuestraimpresora se define en la línea 17($PRINT_CMD). Si deseamos hacer unaprueba sin malgastar papel sustituiremos"lpr" por "ghostview" para enviar sobresvirtuales para que se visualicen en nues-tra pantalla.

El código de la línea 19 abre el archivode direcciones y el bloque while quecomienza en la línea 22 se repite con lasentradas que son analizadas usandoexpresiones regulares. En lugar de estatécnica podríamos haber usado elmódulo CPAN Text::CSV_XS, aunqueesto podría haber sido excesivo para lasdirecciones de nuestro ejemplo, pues sonextremadamente simples y no tienencomplicaciones como comillas o comasembebidas.

Trabajo Manual vs AutomatizadoLa línea 23 interpreta cualquier línea quecomienza con el símbolo # y un espacioen blanco como comentarios. Esto esmuy útil si solo queremos imprimir algu-nas entradas. Facilita muchísimo la tareapoder “comentar” y excluir todas lasentradas que queramos evitar imprimir-con el símbolo #. El comando split de lalínea 24 divide líneas donde aparecencomas separadoras. map elimina lascomillas dobles. Como la sustitucións/"//g; no devuelve una cadena comoresultado válido, $_; simplemente seañade.

La línea 27 crea un objetoPostScript::File que usa la palabra clavelandscape para rotar el formato de lapágina. reencode => 'ISOLatin1Encod-

ing' proporciona soporte para todos lascaracteres Latin1. El formato del sobre sefija en Envelope-DL. Si necesitamos unformato diferente para utilizar un sobrede distinto tamaño no tendremosninguna dificultad para modificar elarchivo. Un sobre DIN A6 tienen unasmedidas aproximadas de 10.47 centímet-ros de alto por 14.81 centímetros deancho. Para que esto se aplique en nue-stro porgrama, utilizaremos el siguientebloque de código:

my $ps = new PostScript::File(

landscape => 1,

reencode => 'ISOLatin1Encoding',

width => cm(10.47),

height => cm(14.81),

);

39www.linuxmagazine.com.es Número 01

DESARROLLOPerl

Figura 2: No importa si el remitente tiene un nombre corto…

Page 40: Linux Magazine - Edición en Castellano, Nº 01

40 Número 01 www.linuxmagazine.com.es

PerlDESARROLLO

001 #!/usr/bin/perl

002 ############################

003 # sobre - Papel de impresión

sobres

004 # Mike Schilli, 2003

([email protected])

005 ############################

006 use warnings;

007 use strict;

008

009 use PostScript::File;

010 use PostScript::TextBlock;

011 use File::Temp qw(tempfile);

012

013 my $ADDR_CSV =

“mailaddr.csv”;

014 my $SENDER = q{Steven

Sender,

015 9 Sender Street,

016 San Francisco, CA 94107};

017 my $PRINT_CMD = “lpr”;

018

019 open FILE, $ADDR_CSV or

020 die “Cannot open $ADDR_CSV”;

021

022 while(<FILE>) {

023 next if /^\s*#/;

024 my @addr = split /,/, $_;

025 @addr = map { s/”//g; $_; }

@addr;

026

027 my $ps = PostScript::File-

>new(

028 landscape => 1,

029 reencode

=>‘ISOLatin1Encoding’,

030 paper => “Envelope-DL”,

031 );

032

033 my ($tmp_fh, $tmp_file) =

034 tempfile(SUFFIX => “.ps”);

035

036 my($last, $first, $city,

$str) = @addr;

037

038 # Remitente

039 my($bw, $bh, $b) =

textbox($SENDER,

040 “Helveticaiso”, 10, 12);

041 my ($code) = $b->Write($bw,

$bh, cm(2),

042 $ps->get_width() - cm(2));

043 $ps->add_to_page($code);

044

045 # Destinatario

046 my $to = “$first

$last\n$str\n\n$city\n”;

047 ($bw, $bh, $b) =

textbox($to,

048 “Helveticaiso”, 18, 20);

049 ($code) = $b->Write($bw,

$bh,

050 $ps->get_height()- $bw -

cm(2),

051 $bh + cm(2));

052 $ps->add_to_page($code);

053

054 # Imprimir a archivo

temporal

055 (my $base = $tmp_file) =~s/

\.ps$//;

056 $ps->output($base);

057

058 # Enviar a impresora

059 system(“$PRINT_CMD

$tmp_file”) and

060 die “$PRINT_CMD $tmp_file:

$!”;

061

062 # Borrar

063 unlink “$tmp_file” or

064 die “Cannot unlink

$tmp_file: $!”;

065 }

066

067 ############################

068 sub textbox {

069 ############################

070 my($text, $font, $size,

$leading) = @_;

071

072 my $b = PostScript::

TextBlock->new();

073

074 $b->addText(

075 font => $font,

076 text => $text,

077 size => $size,

078 leading => $leading);

079

080 return(tb_width($text,

$font, $size),

081 tb_height($text, $leading),

082 $b);

083 }

084

085 ############################

086 sub cm {

087 ############################

088 return int($_[0]*72/2.54);

089 }

090

091 ############################

092 sub tb_width {

093 ############################

094 my($text, $font, $size)= @_;

095

096 $font =~ s/-iso//;

097

098 my $max_width = 0;

099

100 for(split /\n/, $text) {

101 s/[äÄöÖüÜß]/A/ig;

102 my $w =

103 PostScript::Metrics::

stringwidth(

104 $_, $font, $size);

105 $max_width = $w if $w >

$max_width;

106 }

107

108 return $max_width;

109 }

110

111 ############################

112 sub tb_height {

113 ############################

114 my($text, $leading) = @_;

115

116 my $lines = 1;

117 $lines++ for $text =~/\n/g;

118

119 return $lines*$leading;

120 }

LISTADO 1: SOBRE

Page 41: Linux Magazine - Edición en Castellano, Nº 01

La línea 36 guarda los campos de direc-ción en las variables $last, $first, $city y$str. La línea 39 llama a la funcióntextbox() (ver una descripción endetalles de esta función más adelante),que espera unas líneas que contengan elnombre de la fuente y su tamaño y elespaciado interlineal en puntos Post-Script. Hemos decidido usar Helvetica-iso

por que está instalada por defecto. Elsufijo -iso también soporta caracteresacentuados. textbox() nos devuelve 3valores: un objeto Post- Script::TextBlock

y el ancho y alto de la caja de texto gen-erada en puntos PostScript.

Más adelante, la línea 41 llama elmétodo Write() usado por el objeto Post-

Script::TextBlock para crear el códigoPostScript. Write() espera 4 parámetros:ancho y alto del bloque de texto y lasdistancias en x e y desde el origen. Laanchura y altura las proporciona la fun-ción textbox() llamada con anterioridad.

Pensando en OffsetsEl offset en x (la distancia desde el mar-gen izquierdo) es de unos 2 centímetros,que puede ser expresada utilizando lafunción cm(), definida más abajo paraconvertir centímetros a puntos Post-Script. El offset en y es más complicadopuesto que Write() espera una distanciadesde el margen inferior cuandonosotros necesitamos 2 centímetrosdesde el margen superior. No debemospreocuparnos puesto que el método$ps->get_ width() del objeto Post-

Script::File nos proporciona la altura del

sobre y simplemente debemos restarcm(2) de esta en la línea 42.

Debemos saber que PostScript::File

mantiene la noción de ancho y alto almargen de que usemos el modo land-

scape en el que el papel se rota 90º. Ennuestro caso, get_width() nos muestra laaltura y get_height() la anchura. Write

devuelve una lista en la que el primerelemento es el código PostScript delbloque de texto. La línea 43 añade estecódigo a la página PostScript actual.

Se utiliza el mismo procedimiento parael destinatario: la línea 46 concatenanombre y apellidos, la calle y la ciudad.La función addresseetextbox() usa unafuente un poco mayor al igual que con elespacio interlineal. El offset en x desde laesquina superior izquierda de la caja detexto hasta el origen del PostScript secalcula restando a la longitud del sobre($ps ->get_height()) el ancho de la cajade texto ($bw) menos 2 centímetros deborde (cm(2)). El offset en y es la distan-cia desde el borde superior de la caja detexto hasta el límite inferior del sobre yes el resultado de sumar 2 centímetros ala altura de la caja de texto ($bh +

cm(2)).

Vida cortaLa función tempfile() del moduloFile::Temp crea un archive temporal conel sufijo PostScript .ps en la línea 34 ydevuelve un handle de archivo queadmite escritura y el nombre del archivo.El método output() llamado en la línea56 escribe los datos PostScript a este

archivo, pero como no espera el sufijo.ps, el sufijo se quita primero de la línea55 y luego el resultado es escrito a $base.

Tras llamar al comando de impresiónen la línea 59, depende de la línea 63 elque se elimine el archivo temporal obso-leto. textbox() en la línea 68 crea unNuevo objeto PostScript::TextBlock yllama al método addText. Éste espera elnombre de la fuente y su tamaño, elvalor del espaciado interlineal ($leading)

y el texto que se debe fijar.Para determinar el tamaño de la caja

de texto que se generará, se llama atb_width() y tb_height() (tb significabloque de texto), definidas más abajo.Mientras que tb_height simplementenecesita multiplicar el espacio interlinealpor el número de líneas, calcular el espa-cio horizontal usado es más complicadodebido a la variación en la anchura delos caracteres.

Asistente para Medir FuentesAfortunadamente hay un módulo lla-mada PostScript::Metrics con una funciónllamada stringwidth() que usa tablasincrustadas de fuentes para resolverestos problemas. La mala noticia es queel módulo nunca ha oído hablar de Hel-

vetica-iso. Simplemente quitando elsufijo -iso de la línea 96 resolvemos esteproblema, pero impedimos que funcio-nen caracteres especiales. Esto nos llevaa otra solución en la línea 101, dondeunos pocos caracteres son simplementereemplazados por la letra A. si bien estono genera un resultado preciso, sí solu-cionó el problema de nuestro ejemplo.

Reconozco que he tenido que usarunos pocos de trucos en esta ocasión,pero mi excusa es que he tenido queencontrar la manera de resolver laincompleta implementación de losmódulos PostScript::*. Es un precio queestoy dispuesto de pagar, pues me per-mite elegir la libertad de Linux y evitartodos esos arranques superfluos de Win-dows. �

41www.linuxmagazine.com.es Número 01

DESARROLLOPerl

[1] Como instalar impresoras en Linux:

http://www.linuxprinting.org

[2] Shawn Wallace,“Perl Graphics Program-

ming”: O’Reilly,2002

[3] Más información sobre PostScript: http://

www.mathematik.uni-ulm.de/help/pstut/

INFO

Figura 3: … o largo, el offset se mantiene inalterado

Page 42: Linux Magazine - Edición en Castellano, Nº 01

vidas sean más fáciles gracias a las

abstracciones. Cada función, expresión y

sentencia abstrae algún detalle especí-

fico del hardware del procesador al

programador por medio del lenguaje C.

Esto se conoce como abstracción de bajo

nivel.

Otro ejemplo de abstracción se pro-

duce cada vey que interactuamos con

una base de datos a través de cualquier

motor SQL. La programación de bases de

datos por medio de SQL es una abstrac-

ción de alto nivel. La base de datos (ya

sea MySQL, PostgreSQL u Oracle) puede

funcionar de cualquier forma, ajustarse a

cualquier algoritmo y hacer uso de

cualquier archivo. Pero usando un

lenguaje genérico (SQL) con el que

comunicarnos, no necesitamos preocu-

parnos más por los aspectos específicos.

Al contrario, podemos dedicar nuestro

tiempo a tareas más importantes, como

crear consultas select e inner joins efi-

cientes.

Esta abstracción no se extiende a la

forma en que programamos las bases de

datos, ya que cada una de ellas tiene su

propia API. Esto se ve en PHP, donde se

puede empezar un diálogo con una base

de datos MySQL llamada fredbloggs

usando,

$db =

mysql_connect("localhost",U

"myuser", "mypass");

mysql_select_db("fredbloggs");

mientras que PostgreSQL necesita,

$db =

pg_connect("host=localhostU

dbname=fredbloggs user=myuserU

password=mypass");

Aunque

la may-

oría de estos

parámetros son

opcionales, la migración de código entre

bases de datos es aún más ardua. Toda

conexión, consulta y manejo de errores

debe ser reescrito para ajustarse a la

nueva base de datos cada vez que se

desee utiliyar un sistema de almace-

namiento y su correspondiente motor

diferentes. Esto no sólo supone una

modficiación en lo que se refiere al

nombre de la función sino que también

cambia la estructura y el formato de los

argumentos. Otro problema es que los

códigos de error devueltos por el motor

varían de sistema sitema, lo que hace

que sean difíciles de interpretar. La solu-

ción a todos estos dilemas, ya la hemos

mencionado, consiste en abstraer la fun-

ción database_connect de la base de

datos específica y usar una llamada a

una API genérica. Esto debe hacerse para

cada función específica de la base de

datos. Desafortunadamente, si pre-

tendemos crear la APi nosotros mismos,

esta tarea supone mucho trabajo

Pero, al fin y al cabo, estamos

hablando de código libre, con una comu-

nidad de desarrolladores muy activa, y

las buenas noticias son que alguien ya lo

ha hecho por nosotros. Hay un par de

APIs de bases de datos para PHP. El obje-

tivo de este artículo es PEAR::DB, uno de

los muchos módulos PEAR (ver cuadro

Acerca de PEAR) disponible en [1]. Está

bajo desarrollo constante e incluye a

algunos miembros del equipo del núcleo

La respuesta a esta preguntas está

contenida en las palabras “API

Genérica“. Haciendo uso de una API

genérica, nuestro código puede fun-

cionar con diferentes servidores de bases

de datos sin necesidad de tener que

modificar los archivos de código fuente.

Los desarrolladores de PHP son muy

conscientes de esta ventaja y, en los últi-

mos años se han dirigido esfuerzos a

solventar la carencia de la que adolecía

PHP en este área. Este mes, en nuestra

sección dedicada a PHP, Steven Goodwin

presenta PEAR:DB.

Arte AbstractoPEAR::DB es un módulo de PHP que per-

mite el control de una base de datos sin

necesidad de especificar ningún servidor

de bases de datos en concreto. Esto sig-

nifica que el mismo código se puede

utilizar para acceder a MySQL y Oracle,

por poner un ejemplo. Así pues, ¿cómo

funciona? Gracias a la abstracción, que

permite hacer una generalización de un

sistema, o de una API, de modo que los

detalles queden ocultos. La mayoría de

nosotros usamos abstracciones (a

menudo sin darnos cuenta de ello).

Incluso los programadores de C, supues-

tamente los tipos más duros del mundo

del desarrollo software, hacen que sus

Si se escribe código en un lenguaje de alto nivel, como PHP, se asegura su fun-

cionalidad en cualquier plataforma. Entonces, ¿Por qué limitarlo a usar un

único servidor de bases de datos? ¿Qué pasa con las plataformas que no

soportan MySQL? POR STEVEN GOODWIN

Con forma de Pera

Cobertura Total

42 Número 01 www.linuxmagazine.com.es

PEAR son las siglas de PHP Extension and

Application Repository (aunque algunos

prefieren sustituir Application por Add-on) y

es una biblioteca de funciones de código

PHP, similar a CPAN de Perl. Además del

módulo para el manejo de bases de datos

(DB), también hay código para el manejo de

HTML, autenticación y criptografía.

Acerca de Pear

PearDESARROLLO

Page 43: Linux Magazine - Edición en Castellano, Nº 01

de PHP. La versión actual considerada

estable es la 1.6.0. Para aquellos que

quieran comparar alternativas están tam-

bién ADOdb [2], Metabase [3] y PHPlib

[4].

La adopción de MySQL ha sido, a la

vey que una bendición, una maldición

para los desarrolladores de PHP. En el

lado positivo podemos dqecir que se

integra bien con la instalación por

defecto, significando que cualquiera

puede desarrollar buenos sitios webs con

bases de datos con el mínimo esfuerzo.

Desafortunadamente, esto lleva a creer a

muchos desarrolladores que no hay otros

sistemas de bases de datos. O que no

están bien soportadas. Nada más lejos de

la realidad, como puede verse en la tabla

2, Bases de datos soportadas. Para mayor

información se puede consultar el

archivo docs/STATUS.

En este artículo utilizaremos

PEAR::DB con MySQL para adminsitrar

una base de datos que contenga informa-

ción sobre cadenas de televisión y su

sintonía. Esto podrías servir, por ejem-

plo, para controlar programáticamente

una tarjeta de televisión, permitiendo

que se sintonizase cada canal a través de

una aplicación.

Manos a la obraPondremos las entradas (emisoras,

canales y nombres) en una base de

datos. De modo que pueda ser usado

como parte de una aplicación para el

control de una cadena de TV más

grande, ver Listado 1.

Para empezar, hay que tomar este sql-

dump e introducirlo en la base de datos

de la forma habitual, permitiendo el

acceso al usuario apropiado (www-data,

por ejemplo). Esta base de datos puede

ser accedida por MySQL con el Listado 2.

En esta sección de código (de la que se

ha extraído el manejo de errores en aras

de la claridad) nos encontramos con no

menos de 5 referencias separadas a

MySQL. En vez de referenciar la tabla

con tv.channels, algunos programadores

prefieren especificar una base de datos

por defecto usando:

mysql_select_db("tv");

Esta función es equivalente al comando

use en el prompt de MySQL, pero añade

otra llamada específica a MySQL.

En el momento de cambiar a un nuevo

servidor de base de datos, nos encon-

tramos conq que cada referencia a mysql

tendría que ser rescrita. Con más fun-

ciones, manipulando más bases de

datos, la cantidad de código redundante

crece de manera exponencial hasta el

punto de ser inmanejable. Normalmente

la única concesión a la hora de mantener

el código al migrar a otro host consiste

en un archivo independiente con el nom-

bre del host, el usuario y la contraseña,

por ejemplo, podemos tener un fichero

como dbase.inc:

$dbhost = 'localhost';

$dbuser = 'www-data';

$dbpass = '';

$dbname = 'tv';

Pero normalmentes esto suele ser muy

insuficiente. Parte de lo anterior, necesi-

tamos una capa de abstracción, como

PEAR::DB. La mayoría de las instala-

ciones PHP incluyen la biblioteca

PEAR::DB por defecto, y se puede encon-

trar los módulos que lo componen en

/usr/share/pear. Para confirmar que está

instalado en el sistema y que se halla en

la ruta de acceso a ficherso de inclusión

de PHP, podemos crear una fichero test-

pear.php con el siguiente contenido:

<?php require_once 'DB.php'; ?>

Si lo anterior no

funciona, se pue-

de instalar o bien

usando el PEAR

Packet Manager

(tecleando pear

install DB), o

manualmente con

un tarball. Para

más detalles de la

instalación de

PEAR el manual on-line en [6] contiene

toda la información necesaria para llevar

a cabo la instalación y configuración del

paquete. Otra opción consiste en copiar

los archivos en el directorio home

(~/pear/) y modificar el path de PHP.

Esta alternativa será necesaria cuando el

usuario no tenga los permisos de root en

la máquina, como es el caso de muchos

servicios de hosting. Por ejemplo:

<?php ini_set('include_path',U

'~/pear/lib'.PATH_SEPARATOR.iniU

_get('include_path'));?>

Ahora se dispondrá de acceso a nuevas

funciones de bases de datos, todas ellas

de acuerdo con las convenciones de

nombrado de PEAR. ¿Dónde empezar? El

lugar obvio es por las funciones básicas,

connect y close. Habiéndole echado un

vistazo previo a las versiones de MySQL

y PostgreSQL, para empeyar a utilizar

PEAR::DB se requiere que el desarrol-

lador adopte un ligero cambio de

perspectiva.

Por ejemplo, para bases de datos que

precisan más (o menos) parámetros que

las dos mencionadas, una función

simple que sustituya los parámetros

no funcionará. En vez de esto, debe-

mos especificar un Nombre de Fuente

de Datos o DSN. Esto incluye todos los

posibles argumentos dentro de una

cadena única con formato. El formato

completo es:

phptype(dbsyntax)://username:U

password@protocol+hostspec/U

databasename

El DSN tiene el aspecto de una URL.

Describe donde conectarse, como conec-

tarse y que base de datos y opciones

utilizar una vez establecida la conexión.

Estas líneas recogen dos partes. La

primera parte describe los parámetros

43www.linuxmagazine.com.es Número 01

Opción Descripción

DB_PORTABILITY_LOWERCASE Convierte los nombres de campos y tablas a minúscu

las (en los fetch y get)

DB_PORTABILITY_RTRIM Elimina los espacios en blanco de la derecha

DB_PORTABILITY_DELETE_COUNT Informa siempre del número de filas borradas

DB_PORTABILITY_NUMROWS Una copia del numRowsde Oracle

DB_PORTABILITY_ERRORS Convierte los números de error entre distintas bases

de datos

DB_PORTABILITY_NULL_TO_EMPTY Convierte los nulls en cadenas vacías(en los fetch y

get) porque Oracle no los diferencia

Tabla 1: Opciones de portabilidad

01 $dsn = array(

02 'phptype' => "mysql",

03 'hostspec' => "localhost",

04 'database' => "tv",

05 'username' => "www-data",

06 'password' => ""

07 );

08 $db = DB::connect($dsn);

DSN as array

DESARROLLOPear

Page 44: Linux Magazine - Edición en Castellano, Nº 01

dantes de desarrollo (para controlar la

cantidad de mensajes de depuración pro-

ducidos). Como estas opciones pueden

variar entre consultas específicas, no las

incluiremos dentro del DSN. Por el con-

trario crearemos un array detallando las

opciones y lo pasaremos como argu-

mento a la función DB::connect de forma

separada.

// Recordar que estas variablesU

han de ser declaradas de formaU

global

$dsn = "$dbbackend://$dbuserU

@$dbhost/$dbname";

$options = array('debug' => 2);

$db =& DB::connect($dsn,U

$options);

Tenemos la posibilidad de realizar modi-

ficaciones en estos parámetros en

cualquier momento con la utilización de

la siguiente función:

$db->setOption('debug', 0);

En el caso de que la conexión no falle

por algún motivo (echaremos un vistazo

a las posibilidades del manejo de errores

más adelante), tendremos un objeto de

base de datos llamado $db que se uti-

lizará en todas las llamadas a esta base

de datos en concreto. Por ejemplo, para

cerrar la conexión después de su uso,

haremos:

$db->disconnect();

Entonces, tendremos que adaptar nues-

tras funciones existentes para usar el

nuevo objeto y sus funciones miembros

asociadas. Esto no es difícil, ya que

tienen nombres muy parecidas a las ver-

siones originales de MySQL pero

siguiendo las convenciones de nombres

de PEAR. Así pues, mysql_query se con-

vierte en query, por poner un ejemplo.

Las funciones básicas aparecen en el Lis-

tado 3.

Al granoComo todas las peticiones a la base de

datos pasan por el controlador

PEAR::DB, el código tiene que tener la

habilidad de cambiar y modificarse en

las peticiones. Esto se hace en aras de

una mayor portabilidad. Y podemos

darle más o menos opciones haciendo

uso del método setOption que ya hemos

visto con anterioridad. Este método per-

mite establecer un número diferente de

opciones conforme a las necesidades que

precisemos.

Estas opciones normalmente están

para facilitar la portabilidad a costa del

rendimiento, y dependen de una manera

muy específica de cada aplicación. Otro

uso al que se pueden aplicar es para per-

mitir la coexistencia de código antiguo

dentro de PEAR::DB. Dentro del

desarollo con bases de datos, la conevn-

sión dicat que la mayoría de los nombres

de tablas aparecen en minúsculas. Si una

aplicación está intentando obtener filas

usando una mezcla de mayúsculas y

minúsculas, por ejemplo, entonces estos

nombres se convertirán de forma

automática a minúsculas.

$db->setOption('portability',U

DB_PORTABILITY_LOWERCASE);

Esto elimina las sorpresas que pueden

surgir cuando un trozo de código

desconocido se ejecuta y da un error de

ejecución. Otras opciones pueden verse

en la Tabla 1.

Los valores por defecto para estas

opciones tienen como objetivo mejorar

el rendimiento, pero está a la elección de

uno determinar cuales se deben estable-

cer en la aplicación. Hay también

definiciones para DB_PORTABILITY_ALL

y DB_PORTABILITY_NONE que permiten

el activar todas las opciones o desacti-

varlas respectivamente.

específicos del servidor de base de datos

e incluye el tipo de base de datos (lla-

mado phptype, ej. mysql) y cualquier

opción específica dada por dbsyntax.

Una lista de phptypes se muestra en la

Tabla 2. El ejemplo citado de dbsyntax es

el nombre de un driver específico

cuando se usa una conexión ODBC (ej.

access, db2, mssql). Esto no es difícil de

determinar, pero afecta más a los usuar-

ios de Windows que a nosotros, por ello

no tenemos que profundizar más en este

tema.

La segunda parte del DSN contiene

todo aquello que es dependiente de la

base de datos, como el nombre del host,

el puerto, el nombre del usuario y la con-

traseña. Como en la típica función

mysql_connect, no todos los parámetros

son obligatorios y pueden ser omitidos si

no son necesarios. Por ejemplo:

mysql://www-data@localhost/tv

Naturalmente, nuestro código final alma-

cenará todos estos parámetros en un

archivo genérico dbase.inc, como se

mostró antes. El DSN no tiene por qué

ser especificado por una cadena. Tam-

bién puede ser definido por un array

(como se muestra en el cuadro DSN

como Array), haciendo ligeramente más

rápida la inicialización ya que no se ha

de analizar la cadena.

El DSN nos permite especificar las

opciones de inicialización usando un

método inspirado en una URL

?opcion1=valor1&opcion2=valor2.

Hay varias opciones disponibles,

incluyendo tanto características prácticas

de conexión (uso de SSL) como ayu-

44 Número 01 www.linuxmagazine.com.es

Nombre Palabra reservada

dBase dbase

FrontBase fbsql

InterBase ibase

Informix ifx

Mini SQL msql

Microsoft SQL Server mssql

MySQL mysql

MySQL >=4.1 mysql4

Oracle 7/8/9 oci8

ODBC odbc

PostgreSQL pgsql

SQLite sqlite

Sybase sybase

Tabla 2: Bases de Datossoportadas

Cadena Funcionalidad

prepare Pre-comprueba la consulta SQL

pconnect Conexiones persistentes

transactions Activa el soporte de transac-

ciones

limit Limita las consultas select

Tabla3: Soporte de provides

Base de Dato Sintaxis SQL

DB2 select * from table fetch first 10

rows only

Informix select first 10 * from table

Microsoft SQL Server select top 10 * from table

MySQL select * from table limit 10

Oracle 8i select * from (select * from

table) where rownum <= 10

PostgreSQL select * from table limit 10

Tabla 4: Diferencias entreversiones de SQL

PearDESARROLLO

Page 45: Linux Magazine - Edición en Castellano, Nº 01

errores de PEAR_Error. Pero si una fun-

ción de PEAR::DB produce un fallo, la

mayoría devolverá una instancia de la

clase error, desde connect hasta getRow.

Esta clase no solo controla los errores de

PEAR, sino que también proporciona

información extra al depurador, lo cual

es útil a la hora de detectar problemas.

$db=& DB::connect (&dsn); U

//DB::Error es los mismo queU

PEAR::isError

if (DB::isError($db))

{

print $db->getMessage();

print $db->getDebugInfo();

}

Los errores también pueden ser captura-

dos usando el manejo de errores

estándar de PEAR. Esto se hace con unas

funciones definidas por el usuario que

serán llamadas cada vez que un modulo

de PEAR (como DB) genere un error.

Esta función puede usarse para generar

una página HTML estándar para el

usuario, al mismo tiempo que también

puede alertar al administrador del prob-

lema.

El manejo de errores tradicionalmente

está combinado con las características de

escritura en el buffer de salida de PHP,

permitiendo a cualquier página parcial-

mente generada sea eliminada del flujo

de salida HTML. Como esto es una car-

acterística de PEAR, no de PHP, los

errores tradicionales (como la división

por cero) no serán capturados por este

método.

01 // Preparación del handler

02 PEAR::setErrorHandling U

(PEAR_ERROR_CALLBACK,U

'error_function');

03 //Activamos el buffer deU

salida

04 ob_start();

05 // Realizamos alguna tarea

06 PearVersion();

07 // Volcamos el buffer aU

la salida (si todo ha ido U

bien)

08 ob_end_flush();

09 // Preparamos nuestro U

handler

10 function U

error_function($err)

11 {

12 ob_end_clean();

13 print "Se ha producido un

ERROR (".$err->

getMessage().")");

14 exit;

15 }

Rizando el rizoPEAR::DB realmente es tan fácil como

parece. La complejidad viene del SQL.

PEAR::DB sólo sirve para protegerte en

cierta medida de esto. SQL existe desde

hace muchos años. Debido a las guerras

comerciales entre distintos vendedores,

han surgido distintas variantes de SQL

que son incompatibles entre sí.

Aunque ANSI ha intentado

estandarizar algunas partes del lenguaje

(las versiones básicas de select, insert y

update, las cuales son bastante porta-

bles), existen aún muchas diferencias.

Escribir SQL estándar es una tarea árdua

en sí misma y hay que saber y adoptar

varias reglas. La mayoría de los progra-

madores expertos en bases de datos las

conocen de forma instintiva, el resto de

los mortales tienen que aprenderlas de

tutoriales tales como [7].

En algunos casos, podríamos desear

usar diferentes consultas dependiendo

de como reaccione la base de datos. Esto

requiere trabajo extra ya sea de nosotros

o de PEAR::DB. Desafortunadamente,

una vez que hemos sacado la base de

datos de la ecuación, no tenemos forma

alguna de saber si es capaz de hacer lo

que pretendemos. PEAR::DB tiene

conocimiento de este problema y utiliza

un método llamado provides.

provides indica las características

propias del servidor de base de datos

que se esté usando, nos permite cambiar

entre dos consultas ‘afinadas a mano’

para ayudarnos a mejorar el rendimiento

en casos especiales. Usamos las capaci-

dades (otra abstracción) en vez de

funciones específicas de la base de datos

porque las cosas cambian. Por ejemplo,

una versión posterior de la base de datos

podría soportar nuevas características o

podría aparecer un nuevo tipo de servi-

dor en el mercado. El método PEAR::DB

provides suministra un medio para usar

la consulta más óptima en la base de

datos sin la necesidad de entender nada

acerca de las nuevas bases de datos.

if ($db->providesU

45www.linuxmagazine.com.es Número 01

DESARROLLOPear

Sigamos adelanteNo toda la funcionalidad está dirigida a

que el acceso a la base de datos sea más

fácil. fetchRow, por ejemplo, hace mas

fácil obtener datos en un formato pro-

gramático más amigable. Actualmente

PEAR_DB soporta tres formatos de este

tipo. Por defecto se usa un array, index-

ado desde cero, como se muestra en el

cuadro adjunto. Los parámetros opcio-

nales de DB_FECTHMODE_ORDERED

han sido omitidos en el ejemplo anterior.

Esto es útil para manejar bases de datos

genéricas o para mostrar tablas sin la

necesidad de saber el nombre de sus

campos.

En la mayoría de las situaciones, sin

embargo, los índices numéricos no son

lo suficientemente descriptivos y ten-

emos que solicitar que los datos nos

sean devueltos en un array asociativo.

De esta forma los resultados aparecen en

el código de una forma más legible a

costa de sacrificar generalidad.

while($row = $result->fetchRowU

(DB_FETCHMODE_ASSOC)) {

print $row['station']."

- U

".$row['name']." (".$rowU

['channel'].")<br>"; }

Por último, fetchRow proporciona un

medio para usar las características de la

orientación a objetos de PHP para

devolver un objeto por cada fila de la

tabla de resultados. Cada columna está

etiquetada como un atributo. De nuevo,

esto hace que el código sea más fácil de

leer, pero hace que la aplicación sea

menos genérica.

while($row = $result->fetchRowU

(DB_FETCHMODE_OBJECT)) {

print $row->station." - U

".$row->name." (".$row->U

channel.")<br>"; }

Allanando el caminoNingún programa está terminado sin un

control de manejo de errores y la docu-

mentación correspondiente. Ninguno de

los dos son atractivos desde el punto de

vista del programador pero son muy

necesarios. Las opciones de manejo de

errores de PEAR::DB han sido unificadas

(como los códigos de error) y hacen uso

de las capacidades básicas de manejo de

Page 46: Linux Magazine - Edición en Castellano, Nº 01

explícitamente provocaría un montón de

trabajo extra.

También, como no podemos probar

cada base de datos (incluidas las nuevas,

incluso las no escritas aún) nuestro

código se volvería no-portable de forma

muy rápida. Este problema es fácil de

resolver, sin embargo, empleando el

mismo principio de abstracción.

PEAR::DB proporciona un método lla-

mado limitQuery que oculta la sintaxis

precisa al usuario final y adapta de

forma adecuada la consulta al servidor.

Esto obviamente tiene más sentido que

escribir consultas separadas para cada

una de las bases de datos por nosotros

mismos.

$query = "SELECT name FROMU

channels";// sin referenciasU

a límites aquí!

$result = limitQueryU

($query, 2, 1);

Este comando extrae una línea de resul-

tado de la consulta, empezando por el

índice 2. Como empezamos a contar

desde 0, esto significa la tercera entrada.

Si la consulta SQL select puede ser

modificada para crear una cadena ade-

cuada para la base de datos en cuestión,

$db->provides("limit") ; devolverá alter,

y la consulta será modificada por el con-

trolador de PEAR::DB antes de ser

pasada al servidor. Por otro lado, pro-

vides puede devolver emulate, porque el

driver es capaz de capturar los resulta-

dos de las consultas fila a fila. O

devolver false. Se debería siempre pre-

guntar por las características de las bases

de datos usando provides en vez de con-

fiar en nuestra experiencia o en la

memoria. Sin embargo, por compara-

ción, el conjunto de controladores

actuales proporcionan la funcionalidad

que muestra en la Tabla 5.

En algunos casos raros, es necesario

saber la base de datos que se está uti-

lizando de forma precisa. Normalmente

debido a bugs conocidos en la base de

datos misma. Son un hecho de vida.

Pero si no podemos eliminarlos, ten-

dremos que saber donde están para al

menos poder evitarlos.

print $db->phptype;

Utiliza los mismos identificadores que se

muestran en la tabla 2. Los detalles refer-

entes a los bugs conocidos en bases de

datos concretas, van más allá del obje-

tivo de este artículo.

Sólo para TiComo complemento especial, PEAR::DB

no sólo proporciona abstracciones de

bases de datos. También incluye algunas

('transactions'))

print "OK! Están soportadas";

El abanico de características para las que

podemos usar provides se muestran en la

Tabla 3.

En cada caso es posible que la base de

datos no soporte de forma nativa la car-

acterística. La palabra clave aquí es

“nativa”, porque hay que diferenciar

entre el servidor de la base de datos y el

driver PEAR::DB. Por ejemplo, si la base

de datos no soporta comandos

prepare/execute, el driver soportará la

apariencia del comando de forma simu-

lada.

Se puede estar tentado a usar provides

para crear consultas completamente

diferentes para cada base de datos de

forma manual. En la mayoría de los

casos esto es innecesario y desde luego

es Una mala IdeaTM. La razón (algunos

dirían excusa) para este comportamiento

viene de las extensiones que aparecen en

SQL. El ejemplo típico de este problema

viene de las consultas select limitadas,

que paran de pro-

ducir resultados

después de las

primeras, digamos,

10 filas. La mayoría

de las bases de

datos actuales son

capaces de tener

este comportam-

iento, pero con

cadenas de consul-

tas SQL diferentes,

como se muestra

en la tabla 4. Codi-

ficar cada ejemplo

46 Número 01 www.linuxmagazine.com.es

01 CREATE DATABASE IF NOT EXISTS tv;

02 USE tv;

03 drop table IF EXISTS channels;

04 CREATE TABLE channels (

05 station smallint(2) NOT NULL default '0',

06 channel smallint(2) default NULL,

07 name varchar(10) default NULL,

08 PRIMARY KEY (station)

09 ) TYPE=MyISAM;

10 INSERT INTO channel VALUES (1,55,'TVE1');

11 INSERT INTO channel VALUES (2,62,'La 2');

12 INSERT INTO channel VALUES (3,59,'Telecinco');

13 INSERT INTO channel VALUES (4,65,'Antena 3');

14 INSERT INTO channel VALUES (5,37,'Canal +');

Listado 1: La Base de Datos TV

01 function GetStationsList()

02 {

03 $db = mysql_connect("localhost","www-data", "");

04 $query = "SELECT * FROM tv.channels";

05 $result = mysql_query($query);

06 while ($row =

mysql_fetch_array($result,MYSQL_NUM)) {

07 print "$row[0] - $row[2]($row[1])<br>";

08 }

09 mysql_free_result($result);

10 mysql_close($db);

11 }

Listado 2: Acceso a MySQL

01 function PearVersion()

02 {

03 global $dbname, $dbhost, $dbuser, $dbbackend;

04 $dsn = "$dbbackend://$dbuser@$dbhost/$dbname";

05 $db =& DB::connect($dsn);

06 $query = 'SELECT * FROM channels';

07 $result = $db->query($query);

08 while ($row = $result->fetchRow()) {

09 print "$row[0] - $row[2]($row[1])<br>";

10 }

11 $result->free();

12 $db->disconnect();

13 }

Listado 3: Convenciones para los nombres PEAR

PearDESARROLLO

Page 47: Linux Magazine - Edición en Castellano, Nº 01

ayudas para el manejo de datos, como

son numRows y numCols.

print "La consulta selectU

produjo ".$result->numRows()U

. " filas";

print "La consulta selectU

produjo ".result->numCols()U

. " columnas";

Los resultados de estas consultas son

bastante autoexplicativas, y pueden ser

deducidas de la propia consulta select.

Cuando la consulta es generada

automáticamente, podemos evitar tener

que contar las columnas manualmente.

Podríamos usar estos valores para iterar

sobre los resultados.

Hay también un método llamado table-

Info que proporciona información sobre

cada columna del resultado, como es su

nombre y tipo. Esto no es sólo útil mien-

tras estamos depurando el programa,

sino incluso para crear aplicaciones de

bases de datos generalizadas. Podemos

colorear cada columna según su tipo, o

resaltar algún campo clave. Para ver

como funciona esto, ver listado 4.

Además del nombre y del tipo, se

puede consultar la longitud de cada

columna, flags (que indiquen si son

claves primarias) y el nombre de la

tabla, usando la sintaxis apropiada.

Aunque la mayoría de las API soportan

las consultas select, hay aún algunos

problemillas a solventar con otros tipos

de consultas como los insert. Un método

interesante es affectedRows. Este

método, como podrá se adivinar,

devuelve el número de filas que han sido

afectadas por una consulta insert, delete

o update. Hay también soporte para

generar IDs únicos usando funciones de

secuencia, nextID, que es útil para

generar claves únicas, algo no soportado

de forma nativa en MySQL. Por ejemplo:

// Obtención de un nuevo ID.

$id = $db->nextID('sequence'); U

// La secuencia será creada deU

no existir

Otra característica útil es el método de

clase (declarado static) assertExtension.

Este método, siendo de clase, no

requiere de una instancia de la clase

base de datos para ser invocado e indi-

cará que características están incluidas

en la instalación actual. En su forma

más útil, se puede determinar que bases

de datos están instaladas en el sistema y

seleccionar la más adecuada para usarla

en la aplicación. Ver Listado 5.

A pesar de su nombre, esto no es una

aserción tal y como se suele entender

tradicionalmente en programación, ya

que no imprime ningún error y no tiene

que cumplirse ninguna condición. Sim-

plemente indica si una extensión existe o

no.

Antes de terminar, mencionaremos de

pasada la pareja prepare y execute. pre-

pare prepara (valga la redundancia) una

consulta para una ejecución repetida

precompilándola en tokens. La consulta

estará preparada para admitir distinta

información en unas variables espe-

ciales, de manera que se pueda ejecutar

múltiples veces con los datos diferentes

contenidos en dichas variables. Ver lis-

tado 6.

El método executeMultiple se evalúa a

la consulta SQL,

INSERT INTO channels (station,U

name, channel) VALUES (6,

"Video",U

0);

INSERT INTO channels (station,U

name, channel) VALUES (7,U

"PS2", 39);

executeMultiple se parará al primer error

que ocurra. Para evitar esto, se necesi-

tará ejecutar cada consulta cada vez con

el método execute. Por ejemplo,

foreach ($data as $row) {

$db->execute($generic, $row);

}

Conivene siempre recordar que el array

de datos empieza a indexarse desde cero.

En la mayoría de los casos se podrá ver

una mejora en la velocidad cuando

varias entradas se introduzcan en la base

de datos de una vez. Este beneficio pre-

supone que la base de datos soporta esta

característica de forma nativa, algo que

no siempre sucede.

ConclusiónCon PEAR::DB en el arsenal, se pueden

atacar la mayoría de las bases de datos,

sin tener que preocuparse de característi-

cas no soportadas o de funciones no

disponibles. Usando las funciones y el

amplio rango de métodos disponibles,

podemos escribir en PHP buenas aplica-

ciones para múltiples plataformas sin

preocuparnos de las minucias de la

batalla y así pues, podremos concen-

trarnos en pensar en las estrategias para

ganar la guerra. �

47www.linuxmagazine.com.es Número 01

01 $tableinfo =

$result->tableInfo());

02 for($col=0; $col <

$result->numCols(); $col++) {

03 print

$tableinfo[$col]['name']." es

un ".$tableinfo[$col]['type'];

04 }

Example Interface Files

01

if(DB::assertExtension("oci8")

)

02 print "Usamos Oracle si

tenemos que...";

03 if

(DB::assertExtension("mysql"))

04 print "Usamos MySQL porque lo

entendemos mejor...";

Listado 5 : assertExtension

01 $generic =

$db->prepare("INSERT INTO

channels (station, name,

channel) VALUES (?, ?, ?)");

02 $data = array (

03 array(6, "Video", 0),

04 array(7, "PS2", 39)

05 );

06 $res =

$db->executeMultiple($generic,

$data);

Listado 6: Preparando unaconsulta

[1] PEAR:http://www.pear.php.net [2]

ADOdb:http://php.weblogs.com/adodb

[3] Metabase:http://freshmeat.net/

projects/metabase/ [4] PHPlib:http://

phplib.sourceforge.net/ [6] Manula de

PEAR:http://www.pear.php.net/manual/

en/installation.cli.php [7] Como Escribir

Código SQL Portable:http://php.weblogs.

com/portable_sql

INFO

DESARROLLOPear

Page 48: Linux Magazine - Edición en Castellano, Nº 01

estén desarrolladas, o bien podremoscompilarlo obteniendo un Bytecode aligual que java. Es portable y nos permiteejecutar nuestros programas encualquier sistema operativo y/o arquitec-tura teniendo previamente el intérpreteinstalado en nuestro ordenador. Realizarun programa bajo este lenguaje, segura-mente nos costaría entre la mitad o lacuarta parte del tiempo que tardaríamosen desarrollar el mismo programa en C/C++ o Java esto hace que sea muypotente. Veamos una breve comparativacon otros lenguajes:

Hola Mundo en C.

main ()

{

printf("Hola Mundo");

}

Hola Mundo en Java

public static voidU

main(String args[])

{

System.out.println("HolaU

Mundo");

}

Hola Mundo en Python

print "Hola Mundo"

Python dispone de otras característicasque lo convierten en el lenguaje favoritode una comunidad de desarrolladorescada vez más amplia. Por ejemplo, per-mite la declaración dinámica de vari-

ables, es decir, no tenemos que declararlas variables y no tenemos que tener encuenta su tamaño, ya que son completa-mente dinámicas. Dispone también deun gestor de memoria que, de manerasimilar al recolector de basuras de java,se encargará de liberar la memoria deobjetos no utilizados. Sin embargo, y aligual que Java, no nos permite referirnosa zonas de memoria a bajo nivel, comopuede hacerse con C.

Además se puede combinar con otrosmúltiples lenguajes de programación.Podemos mezclar en nuestras aplica-ciones Python y Java (Jython), por ejem-plo. O Python con C/C++, lo cual haceque resulte mas potente si cabe. Pythontambién cuenta con una amplia bibliote-ca de módulos que, al estilo de las bib-liotecas en C, permiten un desarrollorápido y eficiente.

La sencillez de Python también ayudaa que los programas escritos en estelenguaje sean muy sintéticos. Comopodemos ver en la comparativa anterior,la simplicidad llega a ser asombrosa ysolo hemos escrito un simple ejemplo. Sieste programa ya supone ahorrarte unas

Para empezar, debemos saber porqué Python es interesante, por quées tan famoso y cada vez es más

utilizado. Mirando un poco por Internet,se pueden encontrar multitud de aplica-ciones que nos muestran un poco lascapacidades de este lenguaje de altonivel. Primero, Python es un lenguajeorientado a objetos, esto no significaque lo sea exclusivamente, podemos uti-lizarlo como queramos, aunque es masnatural utilizar su implementación de laOOP. Además, es libre y gratuito pudi-endo descargar el intérprete y su códigofuente. Nos permite programarlo comoscript, lo que posibilita ver el códigofuente de aquellas aplicaciones que así

Python es un lenguaje potente, seguro, flexible… pero sobre todo sencillo y

rápido de aprender, que nos permite crear todo lo que necesitamos en nuestras

aplicaciones, de forma rápida y eficaz.

POR JOSÉ MARÍA RUÍZ Y JOSÉ PEDRO ORANTES

Python: Potencia y sencillez multiplataforma

Lenguaje Todoterreno

48 Número 01 www.linuxmagazine.com.es

PythonDESARROLLO

ww

w.daim

lerchrysler.com

Page 49: Linux Magazine - Edición en Castellano, Nº 01

líneas de código, con una sintaxis tansencilla y ordenada podemos imaginarque un programa de 1000 lineas en Java,en Python podrían ser alrededor de 250.Muy bien, ¿pero como se usa?

UsoPara empezar a matar el gusanillo,podemos ir haciendo algunas pruebasinteresantes. Vayamos al intérpretePython. Para esto, basta con escribir‘python’ en cualquier shell en cualquierversión de Linux que tenga instalado elintérprete (si no lo tienes instalado,hazte con la última versión en [1]).Entonces podemos probar el “HelloWorld”:

>>> print 'Hello World'

Hello World

Simple, ¿verdad?, ahora podemos probara utilizar algunas variables:

>>> suma = 15 + 16

>>>

>>> print 'el resultado de laU

suma es: ', suma

el resultado de la suma es: 31

Es recomendable trastear un poco conesto, antes de ponernos a programar algomás complicado, ya que de esta maneraes más sencillo hacerse con la sintaxismucho mas rápidamente viendo losresultados de cada prueba.

Veamos ahora alguna propiedadinteresante de Python. Los ficheros enPython, no tienen por que llevar exten-sión ninguna aunque seguramente quer-remos tenerlos diferenciados del resto denuestros ficheros. Para ello se utiliza laextensión .py o bien .pyw. Imaginemosque tenemos un ejemplo ejemplo.py, alpermitirnos usarlo como script, podemosindicarle la ruta del intérprete en el ini-cio (#!/usr/bin/python en nuestro caso)y dándole permisos de ejecución (en estecaso, chmod +x ejemplo.py) obtenemosun programa listo para correr./ejemplo.py.

#! /usr/bin/python

print 'Hello World'<C>

Después de toda la introducción técnicava siendo hora de que veamos como esel formato de los programas en Python.

Esto es importante porque, mientras lanorma en la mayoría de los lenguajes esdejar al programador la decisión de lamanera en que deben ser formateadoslos archivos fuente, en Python es obliga-torio seguir una metodología. En Pythontodo se hace de una sola manera, esparte de su filosofía: Solo Hay Una

Manera de Hacer Las Cosas.Comencemos con lo más simple en todolenguaje, la asignación a una variable:

cantidad = 166.386

Lo primero que hay que apreciar es queno se usa el ;. Esto es una característicade las muchas que hacen a Python difer-ente. Una instrucción acaba con elretorno de carro, aunque el ; se puedeutilizar cuando tenemos dos sentenciasestán en la misma línea:

cantidad = 166.386; pesetasU

= 3000

Como es un lenguaje dinámico no hayque declarar el tipo de las variables, perouna vez han sido definidas, lo que sehace asignándoles un valor, éstasguardan su tipo y no lo cambiarán a lolargo de la ejecución del programa.Tenemos a nuestra disposición los oper-adores de siempre (+, -, *, /, etc) y unavez que sabemos como manejarlos ycomo asignar las variables, podemosrealizar algo útil, pero lineal. Para que laejecución no sea lineal necesitamos losbucles y los condicionales.

En lo que se refiere al tema de losbucles en Python es algo especial. Puedeque estemos acostumbrados a los buclestipo C:

for(int a = 1; a < 10; a++)U

printf("%d\n",a);

Sin embargo, en Python, se toma unenfoque funcional prestado de otroslenguajes como Lisp o Haskell. Se utilizauna función especial llamada range quegenera una lista de números:

range(1,10)

generará una ristra de números del 1 al9. De manera que podemos utilizar unafunción range para crear un bucle for enPython de la siguiente manera:

for i in range(1,10)

Este bucle iteraría con i desde 1 a 9,ambos inclusive. La versión del buclewhile en Python es más normal…

while(<I><condición><I>)

al igual que if…

if (<I><condición><I>)

¿Por qué no hay puestos cuerpos deejemplo en esos bucles? Pues porqueahora viene otra novedad. En Python nose usan las famosas { y } de C, Java yotros lenguajes. Se decidió, y no a todo

Figura 1: Utilización de Python como una calculadora

49www.linuxmagazine.com.es Número 01

DESARROLLOPython

Page 50: Linux Magazine - Edición en Castellano, Nº 01

los argumentos no se les asignan tipo.Existen muchas posibilidades en losargumentos pero los veremos más tarde,de momento veamos un ejemplo sencil-lo:

>>> def imprime (texto):

print texto

>>> imprime("Hola mundo")

Hola mundo

>>>

Vuelve a ser sencillo. ¿Y los objetos?Pues también son bastante simples deimplementar. Podemos ver un ejemploen el Listado 1. Con class declaramos elnombre de la clase, y los def de su interi-or son los métodos. El método __init__

es el constructor, donde se asignan losvalores iniciales a las variables. __init__

es un método estándar y predefinido, loque quiere decir que tendremos que usarese y no otro para inicializar el objeto.

Todos los métodos, aunqueno acepten valores, poseen unparámetro self. Éste es otropunto controvertido enPython, self es obligatorio,pero no se usa al invocar elmétodo. Se puede ver unejemplo de clase en el Listado1. ¿Cómo se crea el objeto?Fácil:

>>> a = Objeto(20)

Es como llamar a una fun-ción. A partir de este momen-to a es una instancia de

Objeto y podemos utilizar sus métodos:

>>> print a.getCantidad()

20

>>> a.setCantidad(12)

>>> print a.getCantidad()

12

No hay que preocuparse por la adminis-tración de la memoria del objeto ya que,cuando a no apunte hacia él, el gestor de

memoria liberará su memoria. Ya ten-emos las bases para construir algointeresante. Por supuesto nos dejamosinfinidad de cosas en el tintero, perosiempre es mejor comenzar con unpequeño conjunto de herramientas paraempezar a usarlas.

Estructuras de datosUna de las razones por las que los pro-

el mundo le gusta, que se usaría la posi-ción como delimitador. Esto así suenaalgo extraño, pero si se ve es mucho mássencillo:

>>> cantidad = 2

>>> for i in range(1,10):

print cantidad*i

Comencemos mirando a ese :. Los dospuntos marcan el inicio de un bloque decódigo Python. Ese bloque aparecerá enbucles, funciones o métodos. Si nosfijamos bien en la sangría de la siguientelínea, vemos una serie de espacios(logrados pulsando la tecla TABU-LADOR) y una sentencia. Esos espaciosson vitales ya que marcan la existenciade un bloque de código. Además, sonobligatorios.

Este es uno de hechos más controver-tidos de Python, pero también mejoramucho la legibilidad del código. Sóloexiste una manera de escribir Python asíque todo el código Python se parece y esmás fácil de entender. El bloque acabacuando desaparecen esos espacios:

>>> for i in range(1,10):

print cantidad*i

cantidad = cantidad + 1

...

>>>

Funciones y ObjetosTenemos ya las piezas fundamentalespara entender las funciones y los obje-tos. La declaración de una función enPython tiene una sintaxis muy simple:

def nombre_funcion (<listaßß argu-

mentos>): <CUERPO>

Fácil ¿no? Al igual que las variables, a

50 Número 01 www.linuxmagazine.com.es

01 >>> class Objeto:

02 def __init__ (self, cantidad):

03 self.cantidad =

cantidad

04

05 def getCantidad(self):

06 return self.cantidad

07

08 def setCantidad(self,

cantidad):

09 self.cantidad =

cantidad

Listado 1: Una clase sencilla

01 >>> b = [ 1 , 2 , 1 ]

02 >>> b.append(3)

03 >>> b.append(4)

04 >>> b

05 [1 , 2 , 1 , 3 , 4 ]

06 >>> b.remove(1)

07 >>> b

08 [2, 1, 3, 4]

09 >>> b.pop()

10 4

11 >>> b

12 [2, 1, 3]

13 >>> b.insert(1,57)

14 >>> b

15 [2, 57, 1, 3]

16 >>> b.append(1)

17 >>> b

18 [2, 57, 1, 3, 1]

19 >>> b.count(1)

20 2

21 >>> b.index(57)

22 1

23 >>> b.sort()

24 >>> b

25 [1, 1, 2, 3, 57]

26 >>> b.reverse()

27 >>> b

28 [57, 3, 2, 1, 1]

Listado 2: Adición y eliminación de elementos de una lista

01 >>> dic = {}

02 >>> dic["Perro"] = "hace guau

guau"

03 >>> dic["Gato"] = "hace miau

miau"

04 >>> dic["Pollito"] = "hace pio

pio"

05 >>> dic

06 {'Perro': 'hace guau guau',

07 'Gato': 'hace miau miau',

08 'Pollito': 'hace pio pio'}

09 >>> dic["Perro"]

10 'hace guau guau'

Listado 3: Ejemplo de undiccionario

PythonDESARROLLO

Page 51: Linux Magazine - Edición en Castellano, Nº 01

gramas scripts de Python resultan tanpotentes es que nos permiten manejarestructuras de datos muy versátiles demanera muy sencilla. En Python estasestructuras son las Listas y losDiccionarios (también llamados TablasHash).

Las listas nos permiten almacenar unacantidad ilimitada de elementos delmismo tipo. Esto es algo inherente a casitodos los programas, así que Python lasincorpora de fábrica. Las listas dePython también vienen provistas demuchas más opciones que sus seme-jantes en otros lenguajes. Por ejemplo,vamos a definir una lista que guarde unaserie de palabras:

>>> a = ["Hola", "Adios",U

"Buenas Tardes"]

>>> a

['Hola', 'Adios', 'BuenasU

Tardes']

Python indexa comenzando desde 0, demanera que ‘Hola’ es el elemento 0,‘Adios’ el 1 y ‘Buenas Tardes’ el 2, y lalongitud de la lista es 3. Podemos com-probarlo de esta forma:

>>> a[1]

'Adios'

>>> len(a)

3

Podemos añadir elementos a las listas devarias maneras. Nos contentaremos conver las más normales. Añadamos un ele-mento y eliminemos otro (ver Listado 2).Las listas también se pueden comportarcomo una Pila, con las operacionesappend y pop. Con insert hemos intro-ducido un elemento en la posiciónespecificada (recuerda que siemprecomenzamos a contar desde 0). La facili-dad con la que Python trata las listas nospermite usarlas para multitud de tareaslo que simplificará mucho nuestro traba-jo.

A pesar de su potencia, las listas nopueden hacerlo todo y existe otra estruc-tura que rivaliza con ellas en utilidad, losDiccionarios. Mientras las listas nos per-miten referenciar a un elemento usandoun número, los diccionarios nos per-miten hacerlo con cualquier otro tipo dedato. Por ejemplo, con cadenas, buenomás bien casi siempre con cadenas, de

ahí que su nombre sea diccionario(véase el Listado 3). Las listas y los dic-cionarios se pueden mezclar: diccio-narios de listas, listas de diccionarios,diccionarios de listas de diccionarios,etc. Ambas estructuras combinadasposeen una enorme potencia.

Algoritmos + Estructuras dedatos = ProgramasAhora nos toca poner todo esto en prác-tica. Lo normal es hacer un programasencillo. Pero en lugar de eso vamos a

implementar algo que sea creativo. Esteprograma es el que se usa en el libro “Lapráctica de la programación” de Pike yKernighan para ilustrar como un buendiseño sobrepasa al lenguaje que usemospara ejecutarlo. En el libro se implemen-ta el diseño en C, C++, Java, Perl yAWK. Nosotros lo haremos en Python(ver Listado 4).

El programa acepta un texto comoentrada y genera un texto como salida,pero este segundo texto no tiene sentido.Lo que queremos hacer es generar texto

51www.linuxmagazine.com.es Número 01

Figura 2: Definición de una función en Python

DESARROLLOPython

Figura 3: El programa de ejemplo aplicado al prólogo de El Quijote

Page 52: Linux Magazine - Edición en Castellano, Nº 01

plo alguna noticia de política de undiario digital o alguna parrafada decualquier weblog de moda. En nuestrocaso, hemos escogido parte de la intro-ducción a la obra maestra de laLiteratura española, “El IngeniosoHidalgo, Don quijote de la Mancha”.

Este programa es especialmente intere-sante y didáctico porque nos permitiráutilizar las estructuras de datos quePython implementa, en particular en losdiccionarios y las listas, para generar unatabla donde los índice serán cadenas detexto.

Veamos como funciona. Lo primero esir introduciendo en el diccionario dosprefijos como índice y las palabras queles siguen en el texto dentro de una listareferenciada por ellos. Eso es un dic-cionario con dos palabras como índiceque contiene una lista:

DICCIONARIO[ palabra 1,U

palabra 2] -> LISTA[palabra,...]

O sea, si tenemos las palabras “La gente

está … La gente opina” en nuestro texto,

crearemos un diccionario de la siguienteforma:

>>> dict['La', 'gente'] =U

['está']

>>> dict['La',U

'gente'].append('opina')

>>> dict['La', 'gente']

['está','opina']

Vamos haciendo esto de manera sucesi-va con todos los conjuntos de dos pal-abras adyacentes y obtendremos un dic-cionario en el que muchas entradas ref-erenciarán a una lista de más de un ele-mento, cuantas más haya mejor.

La magia aparece cuando generamosel texto, puesto que lo que hacemos escomenzar por imprimir las dos primeraspalabras y cuando existan varias posibil-idades para esa combinación (como conel ejemplo de ‘La’ y ‘gente’), escogere-mos aleatoriamente entre ellas.Imaginemos que escogemos ‘opina’,entonces escribimos ‘opina’ por la pan-talla y buscamos en la entrada de dic-cionario ['gente','opina'] y así sucesiva-mente, hasta llegar a no_palabra. Paraentender mejor el funcionamiento delprograma, te recomendamos que copiesel código fuente y le pases unos ejemplos(por ejemplo con cat texto.txt |

./markov.py) para que veas los resulta-dos. Después podemos intentar realizarcambios en el programa, por ejemplo, enlugar de utilizar 2 palabras como índicedel diccionario podemos probar con 1 ocon 3, y también con el tamaño del textoque se le pase. Con un poco de experi-mentación es posible conseguir resulta-dos muy interesantes. �

sin sentido pero con estructuras que sí lotengan. Puede parecer algo muy compli-cado, pero no lo es tanto si usamos latécnica de las cadenas de Markov. Laidea es comenzar con las dos primeraspalabras, ver si esa combinación serepite en el texto, hacer una lista con laspalabras que siguen a alguna de las ocur-rencias de esa combinación, elegir unapalabra al azar de las que las suceda yreemplazar la primera por la segunda yla segunda por la palabra escogida. Deesta manera vamos generando un textoque, aunque carece de sentido, normal-mente se corresponde con la estructurade un texto normal aunque disparatado.

Para hacer las pruebas es recomend-able conseguir un texto de gran tamaño,en textos pequeños no surtirá tanto efec-to nuestro programa. En el proyectoGütenberg podemos conseguir infinidadde textos clásicos de enorme tamaño enASCII. Pero somos conocedores de queno todo el mundo entiende el idiomaanglosajón, así que en lugar del proyectoGütenberg podemos coger cualquiertexto que queramos modificar, por ejem-

52 Número 01 www.linuxmagazine.com.es

01 #!/usr/local/bin/python

02

03 #Importamos dos módulos

04

05 import random

06 #utilizado para escoger un

elementos

07 #aleatorio de una lista

08

09 import sys

10 #permite acceder a algunas

clases

11 #utilizadas por el intérprete

12

13 no_palabra = "\n"

14 w1 = no_palabra

15 w2 = no_palabra

16

17 # GENERAMOS EL DICCIONARIO

18 dict = {}

19

20 for linea in sys.stdin:

21 for palabra in

linea.split():

22 dict.setdefault( (w1,

w2), [] ).append(palabra)

23 w1 = w2

24 w2 = palabra

25

26 # Fin de archivo

27 dict.setdefault((w1, w2), []

).append(no_palabra)

28

29 # GENERAMOS LA SALIDA

30 w1 = no_palabra

31 w2 = no_palabra

32

33 # puedes modificarlo

34 max_palabras = 10000

35

36 for i in xrange(max_palabras):

37 nueva_palabra =

random.choice(dict[(w1, w2)])

38

39 if nueva_palabra ==

no_palabra:

40 sys.exit()

41

42 print nueva_palabra;

43

44 w1 = w2

45 w2 = nueva_palabra

Listado 4: markov.py genera un texto no-tan-aleatorio

[1] Decargas de Python

http://www.python.org/download/

RECURSOS

José María Ruíz está realizando el

Proyecto Fín de Carrera de Ingeniería

Técnica en informática de Sistemas y

lleva 7 años usando y desarrollando

software libre, y desde hace dos en

FreeBSD. José Pedro Orantes está cur-

sando 3º de Ingeniería Técnica en

Informática de Sistemas y 3º de Inge-

niería Técnica en Informática de

Gestión, lleva mas de seis años uti-

lizando Linux como escritorio y

herramienta de trabajo.

LO

S A

UT

OR

ES

PythonDESARROLLO

Page 53: Linux Magazine - Edición en Castellano, Nº 01

ADMINISTRACIÓNCharly

53www.linuxmagazine.com.es Número 01

Afortunado el administrador de sis-

temas que reconoce un problema

desde su inicio antes de que las

líneas de atención al cliente estén en

serios problemas.

Esto es cierto en asuntos clave como

los requerimientos de memoria de fun-

cionamiento de procesos de mi servidor.

Se me ocurren numerosas cosas que

hacer mejor que estar pendiente de cada

proceso todo el día, a pesar de que el

nombre de la aplicación parezca sugerir

lo contrario.

La solución es PS-Watcher [1], una

herramienta que analiza la tabla de pro-

cesos, filtrándola mediante la aplicación

de expresiones regulares almacenadas en

el fichero de configuración. Este fichero

también especifica como PS-Watcher

debe reaccionar ante la ocurrencia o no

de determinadas expresiones. Puedo

indicarle a PS-Watcher que termine un

proceso que utiliza demasiada RAM,

monitorizando a la vez los procesos hijos

generados por otro.

El programa, escrito en lenguaje Perl

viene como tarball de 114 kbytes que se

instala mediante el proceso estándar de

que un proceso, el demonio compilador

de C distribuido, Distccd en este ejem-

plo, utilice más de 5 mbytes de memoria

principal. Mi nuevo fichero de configu-

ración pswatch.conf será como sigue:

[(/usr/sbin/)distccd?]

trigger = $vsz > 5000

# Output size in Kbytes

action = echo "El procesoßß

$command está ocupando $vszßß

KB de memoria"

Podemos especificar cualquier otro

comando en lugar de echo. Por ejemplo,

puede desear mandar un correo elec-

trónico al administrador.

Como PS-Watcher repite la alerta cada

pocos minutos, en función del parámetro

-**sleep N, a pesar de que puede ha-

cerlo, no sería una buena idea mandar

mensajes al teléfono móvil, o al menos

no es una idea que yo considere opor-

tuna. La página principal contiene

numerosas pistas y ejemplos. �

[1] PS-Watcher:http://ps-watcher.

sourceforge.net

Recursos

WikiMedia .....................................54

Vemos como se comparte conociemientos

con el motor wiki de la Wikipedia

TLS sobre SMTP...........................60

La solución inteligente para la encriptación

de correo

Syslog ...............................................62

La herramienta fuente de información del

adminitrador de sistemas

SYSADMIN

configure, make, make install,

suponiendo que los módulos de Perl

Sys::Syslog, File::Basename, Getopt::

Long and Config::IniFiles estén instala-

dos. Instálalos de CPAN si te falta

alguno.

El siguiente paso es crear el fichero de

configuración. Para probar la her-

ramienta, quiero que monitorice los

procesos mingetty y que anote en un

archivo de registro si ocurren más de tres

procesos. Mi fichero de configuración,

/etc/pswatch.conf, para esta tarea tiene el

siguiente aspecto:

[(/sbin/)?mingetty?]

trigger = $count > 3

action = echo "$countßß

$command procesos en ejecución"

A continuación ejecutamos PS-Watcher

como un demonio en Segundo plano:

ps-watcher --config /etc/ßß

pswatch.conf --log /var/log/ßß

pswatch.logs

El demonio cuenta el número de proce-

sos mingetty activos cada cinco minutos.

Si estos comienzan a dispararse, aparece

un mensaje del estilo de “4 procesos

mingetty en ejecución” en /var/log/

pswatch. Si es necesario, se puede incre-

mentar el intervalo por defecto desde

cinco minutos a 15 minutos especifi-

cando el comando -sleep 900.

Creciendo JuntosVeamos un ejemplo de una aplicación

más práctica. Quiero que PS-Watch

anote en un archivo de registro cada vez

Simplemente no es factible estar pendiente de cada uno de los procesos. Esto

es un problema si un proceso tiene una pérdida de memoria gradual. Es decir, a

menos que tengamos PS-Watcher. PS-Watcher automatiza las tareas de vigi-

lancia, ayuda a reducir la presión y actúa como un sistema de alerta temprana.

POR CHARLY KÜHNAST

Charly Kühnast es unadministrador de sis-temas bajo entornoLinux en el centro dedatos de Moers, cercadel Rin, el famoso ríoAlemán. Sus tareasincluyen asegurar laseguridad y disponibilidad del cortafue-gos y el mantenimiento del DMZ (zonadesmilitarizada).

EL

AU

TO

R

La rutina diaria del administrador de sistemas: PS-Watcher

Monitor de Procesos

Page 54: Linux Magazine - Edición en Castellano, Nº 01

recopilar ejemplos de tareas comunes de

programación entre un grupo de desar-

rolladores, los wikis se han establecido

como una manera de colaborar en red

casi universal. La idea de Cunningham

era sencilla: desarrollar un motor qur

permitiese modificar cada página wiki,

un HTML generado dinámicamente, en

el navegador. Los corchetes era todo lo

que se necesitaba para realizar un enlace

con una cadena de texto dentro. Si la

página ya existía, el enlace se crea; si no,

se facilita el acceso al usuario a una caja

de edición donde podía crear una nueva

página con el encabezamiento adecuado

(ver figura 1). Una sintaxis fácil y com-

prensible aligera el trabajo de formateo.

Tecleando un asterisco al comienzo de

una linea creamos un listado; el texto

enmarcado entre signos de igual, se con-

vierten en un encabezado. Actualmente

hay mas de 100 motores wiki [1].

Mediawiki [2] es un ejemplo muy popu-

lar. Suministra la tecnología subyacente

para la enciclopedia Copyleft, Wikipedia,

el modelo a imitar para la mayoría de

otros wikis (vea el cuadro “Un viaje al

mundo de los wikis”). En su primer año,

Wikipedia uso usemod wiki [3], que esta

escrito en Perl. Pero la tarea demostró

ser un desafío excesivo para usemod,

que amenazo con colapsarse bajo la

carga de miles de artículos y visitantes.

Esto llevo a los wikipedistas a desarrollar

el motor Mediawiki en PHP, apoyado por

una base de datos MySQL. La habili-

Wiki, la palabra de moda en

todos los medios, significa

rápido en hawaiano y la tec-

nología wiki basada en web se ha

establecido de manera extraordinaria-

mente rápida. Desde que Ward

Cunningham tuvo la idea en 1995, cuan-

do estaba buscando un método para

54 Número 01 www.linuxmagazine.com.es

WikipediaADMINISTRACIÓN

La enciclopedia libre Wikipedia usa el

motor Mediawiki para recopilar un

enorme base de datos de

conocimiento. Si desea estrenar su

propio wiki, este software basado en

PHP es una buena elección que

facilita una funcionalidad abundante

y llena de potencia.

POR ERIK MÖLLER

Instalación y mantenimiento de Mediawiki

Edición Colectiva

Aunque se desarrollo especialmente para la

Wikipedia, Mediawiki no se limita a las enci-

clopedias. Además de la Wikipedia, la comu-

nidad Wikipedia lanzo el Wikcionario

(Wiktionary) http://www.wiktionary.org en

diciembre del 2002. Este diccionario propor-

ciona una definición inglesa y la traducción a

un cierto número de lenguajes para cada pal-

abra. El modelo wiki es ideal para este tipo de

tareas ya que permite a usuarios de todo el

mundo proporcionar las traducciones.

Citas y libros de texto

Wikiquote http://www.wikiquote.org es una

colección por categorías de frases celebres

(citas),Wikisource http://www.wikisource.org

añade material de investigación original

para complementar la Wikipedia. El material

pertenece tanto al dominio publico, como

obras publicadas bajo licencias libres. El

proyecto Wikibooks en http://www.

wikibooks.org no está relacionado con la

Wikipedia en en lo que a contenidos se

refiere, pero proporciona material de

enseñanza libre para asuntos diversos. El

proyecto puede convertirse en un archivo

central para planes de lecciones para la

enseñanza universitaria.

Enciclopedia de Propaganda

Una lista de los Mediawikis esta disponible

en Wikipedia [10]. Algunos notorios ejemplos

de la enciclopedia de propaganda son,

Disinfopedia http://www.disinfopedia.org. El

coautor de Mediawiki Evan Prodromou tiene

en marcha una guia de viajes llamada

Wikitravel en http://www.wikitravel.org, y el

autor de la base de conocimiento sobre soft-

ware de fuente abierta, Openfacts esta

disponible en http://openfacts.berlios.de/.

Un viaje al mundo de los wikis

Page 55: Linux Magazine - Edición en Castellano, Nº 01

dades de PHP son útiles si se necesita

configurar y modificar un wiki. Pero

aunque no se sepa PHP, Mediawiki nos

permitirá configurar un wiki que fun-

ciona correctamente y que sea fácil de

usar.

Estable o experimentalMediawiki, como casi todos los proyec-

tos de código abierto, está disponible en

2 sabores. La versión estable está

disponible como descarga desde la pági-

na de inicio en [2]. La versión en desar-

rollo puede funcionar, pero contiene fun-

ciones experimentales y puede plantear

problemas de estabilidad. Se puede

descargar con CVS:

cvs -d:pserver:anonymous@cvs.ßß

sourceforge.net:/cvsroot/ßß

wikipedia login

cvs -z3 -d:pserver:anonymous@ßß

cvs.sourceforge.net:/cvsroot/ßß

wikipedia co phase3

El directorio “phase3” contiene el soft-

ware, que se puede actualizar en

cualquier momento tecleando cvs

update. Mediawiki necesita Apache

1.3.27, MySQL 4.0.13 y PHP 4.3.2,

incluyendo el interprete de ordenes. El

programa es compatible con PHP 5. Si

desea que el software reduzca las imá-

genes automáticamente, puede optar por

el toolkit Imagemagick, o añadir la

biblioteca gd desde la versión actual

de PHP. Imagemagick permite muchos

mas formatos de archivo que gd.

El script install.php en el directorio raíz

del programa comenzará la instalación.

Pero antes de instalar, necesitara ejecu-

tar algunos tareas de configuración.

El administrador debe copiar los ejemp-

los de configuración, LocalSettings.sam-

ple y AdminSettings.sample, a Local

Settings.php y AdminSettings.php. El

cuadro 1 muestra las variables Local

Settings.php que deben ser configu-

radas.

Selección de lenguajesWikipedia permite mas de 50 lenguajes.

Es uno de los wikis mas ampliamente

traducidos. Esto nos permitirá crear un

wiki en árabe, chino, japones, hebreo,

hindú, ruso o vietnamita, incluyendo el

soporte de Unicode. Para usar estos

lenguajes el operador del wiki simple-

mente necesita configurar las variables

$wgInputEncoding y $wgOutputEncoding

a UTF-8. El guión de instalación crea 3

usuarios MySQL diferenciados y con dis-

tintas funciones. A cada uno de estos

usuarios se les asigna privilegios de base

de datos. Mediawiki utiliza la cuenta de

usuario $wgDB para las operaciones nor-

males de base de datos, mientras que el

usuario SQL $wgDBsqluser solamente

tiene privilegio de lectura. Esta cuenta

se usa para una página especial que

permite a los operadores del sistema

(sysops) realizar consultas SQL, para,

por ejemplo, localizar y dar la bien-

venida a los usuarios que se han regis-

trado recientemente. El operador del

wiki también puede añadir la cuenta

de usuario de administrador MySQL

$wgDBadminuser y poner contraseña al

archivo AdminSettings.php. Esta cuenta

tiene privilegio de escritura y es usada

por los guiones para tareas de insta-

lación y mantenimiento. Para instalar el

wiki, hay asegurarse de ser root y teclear

php install.php. Algunas distribuciones

llaman al interprete de ordenes php4

antes que php. Entre otras cosas, el

guión nos pedirá la contraseña del

administrador (root) de MySQL y creará

la base de datos, las tablas y los usuarios

55www.linuxmagazine.com.es Número 01

ADMINISTRACIÓNWikipedia

Figura 1: La ventana de edición de Mediawiki tiene una barra de herramientas Javascript para ayudar a

los principiantes con las tareas de formateo. Los corchetes dobles indican un enlace a otra página.

Figura 2: Un típico articulo Wikipedia muestra que los wikis no tienen por que ser feos. La tabla de con-

tenidos se genera automáticamente a partir de los encabezados.

Page 56: Linux Magazine - Edición en Castellano, Nº 01

los enlaces a ./LocalSettings.php en los

archivos phtml con el enlace a

LocalSettings.php y añadimos la nueva

ruta al include_path en el archivo

php.ini. Hay que notar que en la actual

versión inestable, que para cuando esto

salga al quisocos, será la estable, los

archivos .phtml están desaprobados. Si

tarbajamos con la última versión y este

es el caos, copiaremos index.php y redi-

rect.php al nuevo directorio del servidor

web y copiaremos el resto de ficheros

.php a un directorio seguro desde el que

se puedan añadir.

Instalación manualSi no se tiene acceso de administrador

(root) al servidor, o si falla el guión de

instalación, podemos instalar Mediawiki

manualmente. El primer paso es crear

una base de datos. Si utilizamos una

base de datos que ya existe,debemos vig-

ilar que el nombre de la tabla no entre en

conflicto con tablas ya existentes, ya que

Mediawiki no utiliza un prefijo y se

podrían sobreescribir base de datos que

ya tuviéramos. Importaremos las tablas

desde tables.sql e indexes.sql en el direc-

torio de mantenimiento:

mysql -u root -p databasenameßß

< filename,sql

Necesitaremos un conjunto mínimo de

configuraciones en LocalSettings.php;

omita el usuario SQL e ignore

AdminSettings.php. Por supuesto que

debe disponer de un usuario principal de

la base de datos. Copie cualquier archivo

.php y .phtml de los directorios includes,

languages, stylesheets e images al direc-

torio principal del servidor. Puede ejecu-

MySQL. Finalmente, ofrecerá crear dos

cuentas de usuario del wiki, un operador

(sysop) y un desarrollador. Esto es

recomendable. Sin esta opción, nece-

sitaremos asignar manualmente los priv-

ilegios de acceso en una etapa posterior.

Para configurar el servidor web, añadi-

mos phtml como extensión PHP a

httpd.conf:

AddType

application/x-httpd-phpßß

.php .phtml

En el directorio upload creado por la

instalación (donde Mediawiki almacena

los archivos cargados) la ejecución de

PHP o la representación HTML debe pro-

hibirse.

<Directory

"/path/to/ßßuploaddirectory">

AllowOverride None

AddType text/plain .htmlßß

.htm .shtml

php_admin_flag engine off

</Directory>

Necesitamos habilitar algunas variables

globales para el directorio de guiones.

Debemos asegurarnos de que la configu-

ración de las directrices del directorio

php_value register_globals sea 1. Como

alternativa, podemos modificar el archi-

vo php.ini, el cual suele residir en /etc o

en /etc/php4.

ConsolidaciónEl guión de instalación copia todos los

archivos PHP al directorio del servidor

web. Y esto es una de las cosas que más

hay que vigilar, ya que cuantos mas

guiones con acceso externo tengamos. ,

mayor sera el riesgo de que un atacante

pueda conseguir acceso a las funciones

internas. Esto es particularmente im-

portante para register_globals, como

parámetros de URL que le autorizan a

configurar variables de guiones internos.

Solo son realmente importantes los

archivos que puedan estar almacenados

en el directorio del servidor Web, esto es,

cualquier cosa terminado con .phtml,

imágenes y hojas de estilo. Lo mejor es

mover cualquier archivo terminado en

.php a un directorio distinto de document

root después de la instalación. Después

de mover los archivos, reemplazaremos

56 Número 01 www.linuxmagazine.com.es

WikipediaADMINISTRACIÓN

Variable Entorno local.

$IP Ruta local en el servidor donde esta copiando el wiki, por ejemplo >c>/var/www/wiki

$wgServer Elemento de dirección del servidor antes de la primera barra,por ejemplo http://www.

mywiki.com

$wgScriptPath Subdirectorio con los archivos PHP, por ejemplo wiki; dejaremos esto en blanco (“”””) si

los archivos están en el directorio principal

$wgEmergencyContact Dirección de email del administrador que se mostrará en caso de problemas

$wgDBserver Nombre de la base de datos MySQL

$wgDBuser y $wgDBpassword Usuarioa MySQL para el acceso normal a la base de datos

$wgDBsqluser y $wgDBsqlpassword Usuario MySQL para consultas SQL vía interfaz Web; solo tiene acceso de lectura

$wgLanguageCode Código de dos letras para el idioma a usar, por ejemplo es para español

Tabla 1: Configuración Básica

Figura 3: El modo de vista diff resalta las diferencias entre dos versiones, mostrando que se ha modifi-

cado y borrado. Los operadores (Sysops) pueden apuntar y hacer clic para restablecer las versiones

previas.

Page 57: Linux Magazine - Edición en Castellano, Nº 01

tar en su navegador el archivo

wiki.phtml con la ruta elegida en el paso

anterior para acceder a la página del

recién instalado Mediawiki. De un vista-

zo al entorno y pruebe las características

del software (mire el cuadro Mediawiki

101). Si el servido web no reconoce

phtml, renombre el archivo index.php.

En ese caso también necesitara editar las

variables $wgScript y $wgRedirectScript.

Hay un ejemplo en DefaultSettings.php.

Privilegios de usuarioLa mayoría de los wikis permiten a los

usuarios anónimos editar sus páginas.

Esto plantea la cuestión acerca de como

el operador del wiki maneja el contenido

indeseable o incluso la desfiguración.

Mediawiki tiene unos cuantos mecanis-

mos de defensa. Puede restringir la lec-

tura o edición de contenidos a grupos de

usuarios específicos. Los indicadores

$wgWhitelistEdit y $wgWhitelistRead en

LocalSettings.php le ayudaran a realizar-

lo de esa manera. La estructura (array)

$wgWhitelistAccount define los grupos

que tienen accesos de lectura o escritura:

$wgWhitelistAccount=array(U"

user" => 0, "sysop" => 1, U

"developer" => 1)

Estos ajustes restringen las modifica-

ciones a operadores (sysops) y desarrol-

ladores. Lo siguiente añadirá un nuevo

usuario llamado editor:

$wgWhitelistAccountU

=array("editor" =>U

1,"user" => 0U

"sysop" => 1,U

"developer" => 1)

Habiendo creado el tipo de

usuario, el operador puede

proseguir asignando privi-

legios de lectura o escritu-

ra mediante la configu-

ración del valor en el

campo de la base de datos

user_rights del usuario a

editor. En el momento de

escribir esto, Mediawiki

no posee una herramienta

genérica de gestión de

privilegios, esto significa

que hay que formular con-

sultas SQL para convertir a

un usuario en sysop, developer o editor,

por ejemplo:

USE Databasename;

UPDATE SET user_rights='sysop' U

WHERE user_name='nombreusuario';

La versión de desarrollo ahora tiene un

tipo de usuario bureaucrat. Los

burócratas usan una página especial

para designar otros usuarios como oper-

adores (sysops). Para hacer esto, el

usuario necesita privilegios de operador

y burócrata. Un historial de cambios nos

permite supervisar los últimos acontec-

imientos en nuestro wiki. Mediawiki

facilita una funcionalidad diff que resalta

las diferencias entre dos revisiones (ver

la Figura 3). El historial de cambios

graba las modificaciones en una página

para volver directamente a la versión

original. El historial de versiones nos

permite recargar versiones previas y sal-

varlas de nuevo, si fuese necesario. Por

ultimo, los usuarios tienen la función

User contributions que les permite ver

todo el contenido creado por un usuario

especifico. Los operadores pueden

deshacer entradas desde esta lista, per-

mitiéndoles la reparación de desfigura-

ciones en cuestión de segundos. Si se

origina una controversia sobre el con-

tenido de una página, el operador puede

temporalmente proteger la página. Los

administradores pueden censurar a los

usuarios polémicos y tenaces bloqueán-

doles sus direcciones IP. Desafortuna-

damente, los usuarios no registrados con

conexiones telefónicas temporales (dial-

up) cambian constantemente sus IPs.

Por esta razón, una IP se bloqueará, de

manera predeterminada, durante sola-

mente 24 horas (opción $wgIPBlock

Expiration). En general, la desfiguración

es una cuestión sobrestimada. Las cues-

tiones sociales son más espinosas ¿Que

tipo de páginas y que tipo de conducta

permitirá el wiki? Definitivamente los

operadores tienen la necesidad de con-

vertir algunas de estas cuestiones a

políticas de uso. El operador del wiki

deberá definir cuidadosamente las

opciones predeterminadas,en la estruc-

tura $wgDefaultUserOptionsEn dentro

del archivo Language.php o sus equiva-

lentes locales. Opciones tales como

quickbar (0 = sin barra de navegación ,

1 = barra de navegación a la izquierda,

2 = a la derecha) son importantes. edi-

tondblclick abrirá la ventana de edición

cuando se hacer doble clic sobre la pági-

na. showtoc genera una tabla de con-

tenidos por cada página que tenga mas

de tres encabezados y showtoolbar

habilita la caja de herramientas de

Javascript en la ventana de edición (mire

la Figura 1). La opción editsection pre-

senta un enlace Edit junto a cada

encabezamiento. Esto permite la edición

directa de una sección especifica y es

particularmente

cómodo para páginas

largas, reduciendo la

necesidad de navegar

por la ventana de edi-

ción. Por el contrario

los enlaces de este

tipo pueden estropear

su diseño. Si se

habilita la opción

editsectiononrightclick,

hacer clic con el

botón derecho sobre

un encabezado tendrá

el mismo efecto. Esto

provocó alguna vez el

fallo de Konqueror en

nuestro laboratorio.

Espacio para losnombresWikipedia hizo frente

rápidamente a la

57www.linuxmagazine.com.es Número 01

ADMINISTRACIÓNWikipedia

Figura 4: Viendo los cambios recientes en el wiki con la piel CologneBlue. El enlace Recent

Changes dirige directamente al modo de vista diff de la página actual.

Page 58: Linux Magazine - Edición en Castellano, Nº 01

este espacio de nombres supone el

valor de la variable $wgSitename en

DefaultSettings.php. La FAQ de la Wiki-

pedia esta almacenada en [[Wikipedia:

FAQ]]. Esto resuelve el conflicto referido

anteriormente, pero hace las cosas difí-

ciles para los sitios pequeños. Si, por

ejemplo, se borran los espacios de

nombres 4 y 5 de la estructura

$wgNamespaceNamesDe en el archivo

LanguageDe.php, también serán retira-

dos del interfaz de usuario. Una carac-

terística que Mediawiki mantiene

después de la migración desde usemod

es la subpágina. Por ejemplo, un articulo

llamado Linux puede tener una subpági-

na llamada Linux/Consejos Kernel. La

página Consejos Kernel tendrá automáti-

camente un enlace de vuelta a Linux.

Las subpáginas pueden ser habilitadas

individualmente para un espacio de

nombres mediante la configuración de la

variable $wgNamepacesWithSubpages.

El espacio de nombres Mediawiki se

habilita a través de $wgUseDatabase

Messages, que autoriza a los usuarios

para editar todos los elementos de texto

del software dentro del wiki, ayudando

de ese modo a las traducciones. Los

nombres de las variables de texto se

almacenan en Language.php.

Atajos para bloques de textoEl contenido de cualquier página creada

en este espacio de nombres puede ser

incrustado en cualquier punto dentro del

wiki. Por ejemplo, para proporcionar un

texto de bienvenida predeterminado,

creamos una página llamada MediaWiki:

greeting. {{msg:greeting}} desplegará el

contenido de la página en otras páginas.

Cualquier cambio en la página

Mediawiki es inmediatamente aplicado a

cualquier otra página que utilice

{{msg}} para su acceso. La orden

{{subst:greeting}} añade el texto en la

localización actual pero sin la caracterís-

tica de la actualización automática.

Observese que en las páginas del espacio

de nombres Mediawiki no están permiti-

dos los caracteres no estándar o espacios

en sus cabeceras. Como cada texto del

cuestión de separar información sobre el

wiki, políticas o discusiones sobre los

artículos de la enciclopedia. Por ejemplo,

hay un articulo sobre las FAQs y una FAQ

oficial de Wikipedia. Para separar acer-

tadamente las dos, Mediawiki introduce

los denominados espacios de nombres

(namespaces), los cuales son defini-

ciones en Language.php o su traducción

local. Por omisión, estos son el espacio

de nombres principal, el espacio de nom-

bres de debates múltiples, un espacio de

nombre para imágenes, un espacio de

nombres para páginas de usuario, un

espacio de nombres especial y un espa-

cio de nombres Mediawiki muy especial.

Los artículos fuera del espacio de nom-

bres principal siempre tendrán un prefi-

jo. [[Discussion:Mainpage]] apunta hacia

la página de debate al que pertenece a la

página principal, [[User:Troll]] es la pági-

na personal perteneciente al usuario

Troll. Si no se ha propuesto poner en

funcionamiento un wiki gigantesco,

podemos ahorrarnos al problema del

meta espacio de nombres. Por omisión,

58 Número 01 www.linuxmagazine.com.es

WikipediaADMINISTRACIÓN

El elemento principal de navegación en

Mediwiki es el recuadro a la izquierda de la

pantalla (ver la Figura 1). Recent changes es

uno de los enlaces mas importantes para los

visitantes habituales del wiki. Despliega las

páginas donde están actualmente trabajan-

do los colaboradores del wiki (ver la Figura 4).

Los usuarios registrados pueden hacer clic en

el enlace Watch this page para añadirla a su

lista. La lista muestra los cambios habidos en

esas páginas durante la ultima semana. Esto

permite a los colaboradores supervisar las

páginas donde han incluido contenido. Move

page permite renombrar una página. Aun

así, el titulo anterior sigue siendo válido; los

usuarios que sigan enlaces a la página serán

llevados al nuevo enlace. El enlace Discussion

apunta al debate de la página actual. Por

ejemplo una página llamada Linux tendrá un

debate llamado Discussion:Linux. Un enlace

llamado enviar un comentario (Post a com-

ment) esta disponible en la barra lateral de

este tipo de página. Se puede pulsar en el

enlace para abrir una ventana de edición

vacía y añadir un comentario. Después de

hacer clic en Save Page, el comentario sera

añadido al final de la página.

Una página y su Historial

Para añadir un nueva página, simplemente

creamos un enlace en una página existente,

por ejemplo [[Mi nueva página]], y entonces

pulsamos en el enlace rojo. El enlace página

de historial (Page history) nos conduce a una

página con las versiones anteriores de la

página actual (ver la Figura 4). Esta vista

puede también usarse para reincorporar ver-

siones anteriores. Para hacerlo, selec-

cionamos una versión haciendo clic en el

enlace de fecha (timestamp), editamos la

página que estamos viendo y la almacen-

amos. El enlace versión actual (Current revi-

sion) también es bastante útil y muestra las

diferencias entre cualquier versión y la actu-

al. Upload nos permite cargar cualquier

fichero en la bitácora y puede ser insertado

usando la sintaxis [[Image:file.jpg]] o

[[Media:file.zip]]. Mediawiki muestra enlaces

de imágenes al vuelo. Los enlaces a los

medios apuntan al archivo.

Relaciones Conocidas

Una razón para migrar a una solución de

base de datos centralizada era que los

wikipedistas demandaban búsquedas avan-

zadas. Por ejemplo, Mediawiki usa páginas

especiales para mostrar las páginas nueva o

huérfanas, las páginas que no están señal-

adas por ningún enlace. Funciones adi-

cionales de listado de artículos por orden

alfabético o por longitud. La página especial

Most wanted articles muestra una visión

general de las palabras clave mas usadas que

no se corresponden con una página. El enlace

What links here enlaza a una vista de los

enlaces a esa página. Related Changes nos

permite ver los cambios en los artículos

enlazados desde la página y de esa manera

supervisar temas concretos. El manual oficial

de Mediawiki [4] ofrece mas detalles.

Manual Práctico de Mediawiki

Figura 6: El historial permite al operador (sysop) supervisar el desarrollo de un articulo de laWikipedia.

Page 59: Linux Magazine - Edición en Castellano, Nº 01

programa se recupera desde la base de

datos, se puede usar esta característica

solamente en combinación con mem-

cached (descrita más adelante).

Manejo de un wikiUna vez configurado y en marcha,

Mediwiki da pocos quebraderos de

cabey. Ejecutar Mediawiki durante un

largo periodo de tiempo es de hecho con-

siderablemente menos estresante que

lograr instalarlo adecuadamente. En un

mundo perfecto, el operador del wiki

solamente necesitará asignar privilegios

de operador (sysop) y desarrollador. Para

hacer una copia de seguridad de la base

de datos se aconseja mysqldump o

phpMyAdmin. Cuando importamos

grandes conjuntos de datos tales como

artículos de la Wikipedia en [5], eje-

cutaremos el guión maintenance/rebuil-

dall.php en el directorio de instalación.

Como próximo paso, para evitar pregun-

tas del tipo Que enlazo aquí y otras

dudas por el estilo. Mediawiki tiene

un número de opciones de puesta a

punto, hay ejemplos en DefaultSettings.

php. Asegurese que copia las modifica-

ciones en LocalSettings.php para evitar

sobreescribirlas durante una actual-

ización. Mediawiki tiene la opción

$wgMiserMode para wikis de gran exten-

sión. Habilitando la opción se desactivan

las consultas que consumen mucho

tiempo tales como una lista de los artícu-

los mas largos. Sin duda alguna es lógico

habilitar la opción de cache de página,

$wgUseFileCache. Esto servirá páginas

HTML estáticas a los usuarios anónimos

y de este modo facilitará un considerable

aumento del rendimiento. Si uno está

dispuesto a dedicar algo de tiempo y

esfuerzo en la puesta a punto de su wiki,

puede intentar memcached [6] y zlib.

Memcached reduce los accesos a la base

de datos mediante el almacenamiento

temporal de los datos de usuario y la

información vinculada. Zlib comprime

las revisiones de páginas antiguas. Esta

opción supone que se ha compilado PHP

con las opciones --enable-sockets y --with

-zlib. Podemos escribir <?phpinfo()?>

en una página PHP de prueba para

averiguarlo.

MemcachedEl demonio deberá ejecutarse en segun-

do plano con las opciones -d -l 127.0.0.1

-p 11000 -m 64 habilitadas. Esto asigna

64 MBytes de RAM como memoria cache

para aplicaciones locales. Memcached

no facilita características de autentifi-

cación. Los usuario locales tienen acceso

sin restricciones. Conviene evitar la eje-

cución de memcached en un sistema con

múltiples usuarios locales. Sin un fire-

wall o el parametro -l, los usuarios exter-

nos pueden acceder al servidor y cap-

turar las contraseñas. Ahora podemos

habilitar las opciones $wgCompress

Revisions, $wgUseMemCached, $wg

SessionsInMemcached y $wgLinkCache

Memcached. $wgCompressRevisions usa

gzip para comprimir viejas revisiones de

página, y de ese modo se ahorra un mon-

tón de espacio en el servidor.

Próximamente: WikitexAún no está en la versión oficial, pero

véase [7] para un primer vistazo a la

interfaz Wikitex escrita por Peter

Danenberg. Esta permitirá a Mediawiki

hacer uso de numerosos motores en el

futuro. Por ejemplo GNU Lilypond [8], el

cual traduce una simple sintaxis en una

elegante hoja pautada de música, varios

macros Latex que generan formulaciones

matemáticas y químicas o tableros de

ajedrez que ilustran el discurrir de una

partida (ver la Figura 5). Al principio

puede que los nuevos usuarios encuen-

tren la mayoría de las características algo

confusas. En el caso de tener alguna pre-

gunta o para resolver dudas, la comu-

nidad Mediawiki, que es tan solícita

como lo son la mayoría de las comu-

nidades de desarrollo de pryectos de

software libre, estará encantada de echar

una mano, por tanto, se recomienda

aprovechar los canales de las que se

dispone. Conviene apuntarse a la lista de

correo mediawiki-l [9] y también visitar

el canal de IRC #mediawiki en irc.freen-

ode.net. �

59www.linuxmagazine.com.es Número 01

ADMINISTRACIÓNWikipedia

[1] Lista maestra de motores wiki: http://c2.

com/cgi/wiki?WikiEngines

[2] Mediawiki: http://www.mediawiki.org

[3] Wiki Usemod: http://www.usemod.com

[4] Manual Mediawiki:http://meta.

wikipedia.org/wiki/

MediaWiki_User%27s_Guide

[5] Volcado SQL de la Wikipedia: http://

download.wikimedia.org

[6] Memcached:http://www.danga.com/

memcached

[7] Prueba de Wikitex: http://wikisophia.org

[8] Lilypond: http://lilypond.org/web

[9] Lista de correo del proyecto: http://mail.

wikipedia.org/mailman/listinfo/

mediawiki-l

[10]Proyectos que usan Mediawiki: http://

meta.wikimedia.org/wiki/

Sites_using_MediaWiki

INFO

Figura 5: El interfaz Wikitex permite a Mediawiki mostrar partituras de música, formulación químicas y

matemáticas o incluso juegos de ajedrez. Haciendo clic sobre las notas se generara automáticamente

un archivo midi.

Page 60: Linux Magazine - Edición en Castellano, Nº 01

GLOSARIO

60 Número 01 www.linuxmagazine.com.es

el uso de sólidos métodos de

encriptación se convierte en una prueba

de definitiva en contra de todos esos

“criminales” que demandan confiden-

cialidad en sus mensajes de correo.

Sine embargo, cada vez más provee-

dores de correo están intercambiando el

corre por medio túneles TSL (Transport

Layer Security - Seguridad de la Capa de

Transporte) encriptados en lugar de al

descubierto, previniendo por tanto

ataques de búsqueda. Hay otras razones

para seguir la tendencia de alejarse de

los mensajes transmitidos en texto libre,

usando SSH en lugar del venerable pro-

tocolo telnet o el protocolo https para

páginas web que piden datos personales.

La introducción de una política que

impone el uso de correo encriptado en

una empresa con distintas sedes puede

provocar ciertos inconvenientes: ¿Qué

ocurre si una tercera persona necesita

acceder al correo posteriormente? ¿Qué

ocurre con las claves utilizadas por una

persona de la empresa que deja de traba-

jar en ella, o con su correspondencia

encriptada? Como la encriptación nor-

malmente solo se utiliza para prevenir

que datos sensibles crucen la red al des-

cubierto, un sistema de encriptación que

funcione en el servidor y que sea trans-

parente para los usuarios, como SMTP/

TLS es una buena solución.

Los mensajes de correo electrónico

son como una postal - cualquier

“cartero” los puede leer. Si bien la

mayoría de los administradores de sis-

temas escrupulosos evitarán leer el

correo privado de otras personas, al

menos en teoría, los privilegiados posee-

dores de la contraseña root, autorizados

o no (pienso en los hackers), de una

máquina usada para remitir o almacenar

correo tendrán acceso a los mensajes.

Los servicios secretos de todo el mundo

aclaman exultantes a los padres (y

madres) fundadores de Internet, que

fueron tan confiados que concibieron la

transmisión de todo tipo de datos a

través de la red de forma transparente.

Encriptar, por ejemplo con GnuPG y

PGP, es el equivalente electrónico de un

sobre en el mundo real. Sin embargo, los

métodos anteriores plantean un prob-

lema: si un país niega a sus ciudadanos

el acceso a métodos seguros de

encriptación - típicamente argumen-

tando que es en ayuda de la lucha contra

el crimen - el protocolo de transporte de

correo, SMTP (Protocolo de Transporte

de Correo Simple), se convertirá en un

delator. El contenido de mensajes encrip-

tados con PGP o GnuPG descubiertos en

la red no pueden ser leídos, pero

podemos observar cuales han sido

encriptados y cuales no. De esta forma,

SMTPADMINISTRACIÓN

https: Si bien puede que sorprenda saberlo,

pero https no es un protocolo independiente.

La comunicación entre buscadores y servi-

dores en sitios Web que usan URLs https sigue

estando basada en el “Hypertext Transfer

Protocol”HTTP (Protocolo de Trasferencia de

Hiper Texto), pero encapsulado en un túnel

TLS.

Agentes SecretosEsta solución ofrece adicionalmente la

ventaja de ser libre de mantenimiento

tras la configuración inicial del servidor.

Si tanto el cliente y el servidor de correo

“hablan” TLS, ellos negociarán un inter-

cambio seguro sin necesidad de

intervención exterior. Para permitir esto,

ambos ordenadores intercambian certifi-

cados durante el saludo inicial

facilitando la identificación mutua. Es

como si cada ordenador le muestra su

pasaporte al otro. Por motivos prácticos,

solo será necesario que se autentifique el

receptor principal en el entorno del

correo, no habiendo diferencia entre si el

receptor es otro servidor de correo o el

programa de correo del usuario. Como el

cliente ya puede confiar en el servidor,

las dos máquinas acuerdan un algoritmo

y una llave secreta de encriptación se uti-

lizarán para codificar el tráfico

resultante.

SMTP vía TLS con Evolution, Kmail y Mutt.

Correo Más SeguroLa transmisión segura de correo electrónico mediante la

Seguridad de la Capa de Transporte (TSL) no puede

reemplazar la encriptación individual de mensajes de

correo. Desafortunadamente, a pesar de que los progra-

mas modernos de correo son capaces de usar los méto-

dos mencionados, tienden a complicar la vida innece-

sariamente de cualquier usuario que desee aprovechar

los beneficios de la confidencialidad y seguridad.

POR PATRICIA JUNG

Page 61: Linux Magazine - Edición en Castellano, Nº 01

61www.linuxmagazine.com.es Número 01

La gente tiende a confiar

en las contraseñas porque se

fían de la autoridad que las

otorga. De forma similar, el

cliente de correo solo acep-

tará los certificados de un

servidor si confía en que la

autoridad que lo certifica ha

hecho el proceso con consis-

tencia. La autoridad auten-

tifica el certificado firmán-

dolo con su propio certi-

ficado, que a su vez ha sido

firmado por un proveedor

seguro de mayor rango.

A pesar de todo, para con-

fiar en una autoridad, el

cliente necesitará almacenar

los certificados de las autori-

dades de confianza superior,

los certificados raíz.

Cómo se HaceMientras que los servidores de correo (o

Agentes de Transferencia de Correo)

como Postfix o Sendmail usarán

automáticamente TLS si ambas partes

son capaces de hacerlo, los desarrol-

ladores de clientes de correo actuales [1]

(los llamados Agentes de Usuarios de

Correo) tienden a prestar poca atención

a la facilidad de uso. En lugar de precon-

figurar sus programas para usar SMTP/

TLS cuando sea posible, esperan que los

usuarios sean los que conozcan la mate-

ria y que elijan y sepan implementar

estos valores seguros.

En el caso de KMail sobre KDE3.x, si

seleccionamos Settings/Configure… y

después añadimos una nueva cuenta de

salida (Outgoing account) con SMTP en

la pestaña Sending de la opción Network

o modificamos una cuenta existente,

necesitamos seleccionar adicionalmente

la pestaña Security en el cuadro de dial-

ogo que aparece (figura 1). Esto al

menos nos proporcionará la opción de

marcar en Check what the server supports

para verificar lo amigable que es la

encriptación del anfitrión inteligente

seleccionado en la pestaña General. Si la

repuesta es positiva (la alternativa, SSL -

Capa de conexión segura- es un

antecedente de TLS), podemos pulsar

OK para asegurar que Kmail usará comu-

nicaciones encriptadas.

La versión 1.0.x de Evolution propor-

ciona una opción segura SSL para el

anfitrión inteligente. Desafortunada-

mente, marcando Use secure connection

(SSL) (Usar conexión segura) se con-

vierte en un escollo en muchos casos. La

mayoría de los servidores no soportan el

método obsoleto de SMTP vía SSL; por

otro lado, Evolution 1.0.x no habla TLS.

Si intentamos transmitir correo con esta

configuración, el programa de correo no

cooperará y emitirá un mensaje muy

explicito como Connection to

name.of.mailservers (Port 465) could not

be established. The connection was reset

by the communication partner. (La

conexión con nombre.de.los.servidores

(puerto 165) no se pudo establecer. La

conexión fue restablecida por el asistente

de comunicación). El cliente ni siquiera

intentará la comunicación no encriptada

hasta que quitemos la marca en Mail

Preferences (Preferencias del

correo).

La versión 1.2 resuelve los

dos problemas, si bien el

asistente o el cuadro de diál-

ogo de Use secure connection

(SSL) (figura 2) se refiere de

nuevo sólo a SSL, sin men-

cionar TLS, éste último

protocolo también esta

soportado. Solo Dios sabe por

que el valor Whenever possi-

ble (Cuando sea posible) no

es el valor por defecto.

Cuando intentamos enviar

correo encriptado por pri-

mera vez, Evolution nos

mostrará información del cer-

tificado del servidor y nos

solicitará que lo aceptemos o

que no utilicemos el túnel

SSL/TLS (ver figura 3). Como el pro-

grama no nos ayuda a tomar esta

decisión (por ejemplo, que significa si

una firma es BAD), puede que sea mejor

dejar que el programa tome la decisión él

mismo en lugar de preocupar al usuario

preguntándoselo.

El programa de la línea de comandos

mutt es ejemplar: como siempre usa

servidores de correo local para transmitir

el correo mediante el interfaz

/usr/sbin/sendmail, no necesita soportar

SMTS/TLS. El mensaje cogerá automáti-

camente un camino seguro a través de la

red si el Agente Local de Transferencia

de Correo y el servidor de destino lo

pueden proporcionar sin ninguna inter-

acción por parte del usuario. Pero no

podemos evitar proporcionar a nuestro

servidor de correo local de este potencial

en nuestro propio ordenador. �

Figura 1: KMail deja en manos del usuario descubrir si el servidor de correo

conoce TLS.

Figura 2: ¿Por qué no es esta la opción por

defecto?

Figura 3: ¿Confías en este certificado?

[1] Patricia Jung y Andrea Müller:“Mail and

more”, Linux Magazine International,

número 29, abril del 2003, página 44,

http://www.linux-magazine.com/issue/

29/MailUserAgents.pdf

RECURSOS

ADMINISTRACIÓNSMTP

Page 62: Linux Magazine - Edición en Castellano, Nº 01

62 Número 01 www.linuxmagazine.com.es

Syslog permite a los administradoresobtener información de registro ensus sistemas de manera uniforme

para toda la red. Realizando la tarea deguardar, analizar y procesar los archivosde registro fácilmente, pero lo que lagente espera de los registros del sistemaha cambiado en los últimos años y el ser-vicio Syslog tradicional simplemente nolo puede ofrecer. Syslog-NG [1] cubreeste hueco.

Los registros tradicionalmente se usanpara comprobar la salud del sistema.Muchos administradores ni siquiera semolestan en mirar los registros a menosque se encuentren con un problema en elsistema. Pero hoy, es también unacuestión de mejorar la fiabilidad, esto es,usar el sistema como una alerta tem-prana para impedir que las cosas vayan apeor. La integridad de los mensajes deun sistema es también ahora más impor-tante que nunca, ya que permiten a losadministradores levantar defensasbasadas en datos reales. Los admin-istradores también buscan habitual-mente más flexibilidad en la configu-ración y en el manejo de las redes.

Han salido varios proyectos que inten-tan conseguir este objetivo de mejorar elservicio del Syslog tradicional. Uno de

espiar los mensajes y conseguir el accesoa la información privilegiada.• Configuración poco flexible

La configuración de Syslog usa un sis-tema poco flexible con 20 posibles orí-genes y 8 prioridades. Esto puede ser unobstáculo en grandes redes o para servi-dores con múltiples servicios.• Uso inconsistente de orígenes y pri-

oridades

Para la mayoría de las aplicaciones losadministradores no tienen una opciónpara administrar mensajes bajo un ori-gen específico. En algunos casos sepuede establecer una opción cuando secompila la aplicación, pero en tiempo deejecución hay realmente pocas opcionesdisponibles.• No registra el origen de la fuente

Cuando un mensaje pasa por distintosservidores de registro es imposible des-cubrir la fuente del mismo. Syslog noalmacena el FQDN (Fully QualifiedDomain Name) del host. Cada host quepropaga un mensaje modifica la direc-ción IP registrada.• Uso de transferencia de mensajes no

orientado a la conexión (UDP)

Syslogd solo puede usar el protocoloUDP para transferir los mensajes. Si unpaquete se pierde por problemas en lared el mensaje nunca llegará al destino.

Syslog-NGExisten grupos de desarrolladores queestán trabajando para eliminar estosproblemas y desarrollando un sistema deregistros (ver los cuadros “Syslog-Sign” y“Reliable Syslog”). Actualmente Syslog-NG es el mejor de ellos. Este desarrollose basa en el servicio Syslog tradicionalal que se le han añadido nuevas carac-

Registro de Sistema de Próxima Generación: Syslog-NG

La Caja Negra

los más difundidos es Syslog-NG (Syslogde próxima generación) que se lanzóbajo licencia GPL. Muchas distribu-ciones Linux ya han adoptado Syslog-NG. Otras alternativas disponibles sonReliable Syslog, en su primera imple-mentación, SDSC Secure Syslog [5] ySyslog Sign. El último todavía está enfase beta.

Problemas con BSD SyslogEl servicio syslog tradicional se presentóen Septiembre de 1983 en la Universidadde California (Berkeley). No tenía docu-mentos de diseño y el software estabapobremente documentado. Pasados 18años BSD Syslog se terminó de docu-mentar en el RFC 3164 [7].

Syslog se ha convertido en un estándarde facto. El servicio es fácil de configu-rar, usando un fichero de configuracióncentral llamado syslog.conf. Pero hayunas cuantas buenas razones para noestar satisfecho con la funcionalidad desyslogd:

Falta de métodos deautenticaciónSyslogd no puede distinguir entre distin-tos hosts. Si el servicio se lanza con laopción -r, acepta mensajes UDP en elpuerto 514 sin importar cual es su ori-gen. Esto permite a los atacantes invadirel servidor de registro con paquetes UDPo transmitir mensajes manipulados.Aparte de utilizar la funcionalidad de unfirewall simple, no hay forma de protegeral servidor de registros.• Mensajes en texto claro

Syslog siempre usa texto claro (texto nocifrado) para transmitir mensajes através de la red. Esto permite fácilmente

SyslogADMINISTRACIÓN

El registro de los eventos del sistema es un reto para cualquier administrador. Y

la debilidad del servicio Syslog tradicional se hace particularmente patente en

grandes redes. Syslog-NG es un sustituto que realmente vale la pena. POR

CHRISTIAN SCHMITZ

Page 63: Linux Magazine - Edición en Castellano, Nº 01

63www.linuxmagazine.com.es Número 01

terísticas sin sacrificar la compatibilidadcon el RFC 3164. Aunque actualmentecarece de características tales como lafirma digital y encriptación, los desarrol-ladores están intentando añadir laencriptación en una versión futura.Actualmente se necesita stunnel [4] paramanejar la encriptación.

Syslog-NG puede cambiarse de UDP a

TCP para proporcionar más fiabilidad enla entrega de mensajes. En este caso, laherramienta usa el puerto 514 por defec-to. Aunque actualmente el puerto 514está reservado para rlogin. Si quiere quelos dos funcionen al mismo tiempohabrá que reconfigurar el servidor.

Muchas distribuciones incluyenactualmente Syslog-NG. Si se quiere usarel sucesor de Syslog en SuSE, hay queescribir la siguiente línea en /etc/syscon-

fig/syslog y relanzar el servicio.

SYSLOG_DAEMON='syslog-ng'

El archivo de configuración central,/etc/syslog-ng/syslog-ng.conf, es ligera-mente más complejo que el tradicionaldel syslogd. En vez de incluir original ypriority, contiene el llamado logpaths

que está formado por source, filter y des-

tination.Hay ocho controladores fuente difer-

entes (véase Tabla 1). El controladorinternal es obligatorio. Syslog-NG usaesta fuente especial para transmitir men-sajes que tienen que ver con el propioservicio.

FuentesCuidado: Los controladores file y pipe nodeben confundirse con las acciones desyslogd, file y pipe. Syslog-NG los usacomo fuente desde las cuales el serviciolee mensajes y no como destino a los que

redirigir los mensajes. El controlador filese encarga de klogd, por ejemplo leyendolos mensajes del kernel desde/proc/kmsg.

Cada uno de estos controladores tieneuna o más opciones, que pueden especi-ficarse entre paréntesis seguido del nom-bre del controlador, por ejemplo, TCP yUDP necesitan saber el número de puer-

Figura 1: Syslog-Sign aplica una función hash a cada mensaje que se envía. Después transfiere un paquete con todos los valores hash de un grupo de mensajes,

notificándolo al administrador de la transmisión además de las firmas de los mensajes.

HeaderPRI

Other Messages

H(N) H(N+1) ... H(N+M)

HeaderPRISHA-1

Message N Hash

HeaderPRISHA-1

Message N+1

HeaderPRISHA-1

Message N+M Hash

SIG

HashSHA-1

DSA/DH

DSA/DH

DSA/DH

DSA/DH

Hash

Key

Private

Syslog-Sign es una extensión del RFC 3164

[7] que mantiene la compatibilidad hacia

atrás con el BSD Syslog. Como sugiere su

nombre, este nuevo desarrollo usa la firma

digital para proteger los mensajes de ser

manipulados por un atacante. En el

arranque, cada host crea un par de claves

asimétricas que son usadas para firmar cada

grupo de mensajes. Luego el host transmite

el grupo de mensajes al servidor de registro

en un único mensaje (véase la figura 1). Este

método es particularmente útil para prote-

ger los mensajes almacenados. Como

mantiene la compatibilidad con el RFC 3164,

Syslog-Sign usa UDP para transmitir los

mensajes. Los mensajes se pueden perder

por la red y al no estar encriptados en sí mis-

mos, un atacante espiando la red podría

acceder a información privilegiada.

La verificación de la clave aun no está clara.

Un atacante podría ser capaz de distribuir

claves manipuladas ya que Syslog-Sign uti-

liza un mensaje normal para distribuir la

clave pública. Aún se está trabajando en una

implementación para FreeBSD [6]

Syslog-SignReliable-Syslog [8], que está especificado en

el RFC 3195, usa BEEP (Block Extensible

Exchange Protocol) para transferir los men-

sajes. Este protocolo del nivel de aplicación

está basado en TCP. Está orientado a la

conexión y tiene mecanismos de autenti-

cación y verificación.Y proporciona protec-

ción contra ataques.

Usa dos tipos de formato de mensajes: El

modo RAW que es compatible con el estilo

del servidor syslog RFC 3164.Y el modo

COOKED que usa un formato de mensaje

XML. Los mensajes COOKED además alma-

cenan atributos adicionales como direc-

ciones IP, FQDNs y tipos de dispositivos. La

longitud del mensaje puede ser arbitraria.

SDSC (San Diego Supercomputer Center)

usa una implementación de Reliable-Syslog

con la licencia BSD-licensed Secure Syslog

[5]. Está versión es compatible con el BSD

Syslog. Requiere de las bibliotecas

Roadrunner BEEP, OpenSSL, Glib2 y Pkg-

Config. Además de los perfiles RAW y

COOKED, también soporta el perfil llamado

Security Profile.

Reliable Syslog

ADMINISTRACIÓNSyslog

Page 64: Linux Magazine - Edición en Castellano, Nº 01

Las funciones de filtro (véase la Tabla2) pueden conectarse usando operadoresbooleanos (and, or, not y paréntesis).Para aplicar un filtro el resultado de laoperación debe ser true. Algunas fun-ciones de filtros pueden manejar expre-siones regulares como opciones.

Los destinos especifican donde y porqué medios un mensaje debe ser redirigi-do y procesado. Tal y como en lasfuentes hay disponibles un número decontroladores de destino, cada uno delos cuales pueden tener distintasopciones. La Tabla 3 proporciona unalista de controladores disponibles.

Syslog-NG llama al controlador unasola vez y lo mantiene ejecutándosehasta que el servicio recibe la señalSIGHUP y termina. Esto hace que el con-trolador sea muy eficiente. Si Syslog-NGse lanzase por un programa externo porcada mensaje entrante un atacantepodría lanzar múltiples procesos quesería similar a un ataque tipo DoS contrael sistema.

Syslog-NG también tiene un númerode opciones globales. Por ejemplo,chain_hostname y sep_hostname especif-ican como Sislog-NG debe manejar losnombres de host cuando pasa un men-saje a través de múltiples servidores deregistros. Esto permite a los admin-istradores descubrir donde se originó elmensaje. El manual de referencia [2]contiene una lista completa de opcionesglobales.

Ejemplo de ConfiguraciónPara ilustrar la estructura desyslog-ng.conf la siguiente sección mues-tra un archivo de configuración simpledividido en secciones. Si está interesadoen hacer un archivo más complejo puedeconsultarlo en [3].

source local {

internal ();

unix-stream("/dev/log");

file("/proc/kmsg");

};

La fuente especifica aquí está identifica-da por su nombre local y comprende unnúmero de fuentes locales. Los contro-ladores fuentes son internal (obligatoria-mente) y el controlador unix-stream, loscuales usan el archivo de dispositivo/dev/log y el controlador file que lee los

mensajes del kernel desde /proc/kmsg.La próxima seccion crea una fuente de

red:

source remote {

tcp(

ip(192.168.0.24) port(3333)U

max-connections(10)

);

};

Esta fuente se referencia como remote; ysu controlador es tcp. Syslog-NG ahoraescuchará los mensajes en el puerto TCP3333. Incluso si el ordenador tiene múlti-ples direcciones IP el servidor sóloescuchará en 192.168.0.24. La opcionmax-connections está establecida en 10;el ordenador aceptará un máximo de 10conexiones concurrentes al Syslog-NG.No es necesario especificar una únicafuente para los mensajes remotos.Muchos administradores crean unafuente individual que maneja todos loscontroladores. Dicho esto, fuentes sepa-radas suministraran una estructura máslimpia.

Selección de MensajesAhora a por los filtros. Nuestro primerejemplo maneja mensajes cuyo nivel deregistro corresponde a los valores warn,err, crit:

filter warning {

level(warn, err, crit);

};

Esta regla simple, que aplica los filtrosbasados en las prioridades, es bastante

to en el que escuchar y file necesita elnombre del archivo. Los sistemas Linuxusan el controlador unix-stream local-mente; el controlador usa un socket dedominio Unix orientado a la conexión.Cada conexión abierta requiere su propioproceso, un hecho que un atacantepodría explotar para realizar un DoS(ataque por denegación de servicio).

max-connections puede impedir estoespecificando un número máximo deconexiones concurrentes al servicio sys-log. Está establecido a 10 por defecto. Elmanual de referencia [2] contiene unalista completa de los controladoresfuente.

Filtros y DestinosLos filtros describen como Syslog-NGdebería manejar los mensajes que recibede las diversas fuentes. Éste es uno delos puntos fuertes del nuevo sistema deregistro. Los administradores puedenusar filtros para ordenar los mensajes ypasarlos a los destinos apropiados.

64 Número 01 www.linuxmagazine.com.es

SyslogADMINISTRACIÓN

Fuente Descripción

internal Controlador para el propio

servidor de mensajes. Obligatorio.

unix-stream Abre un socket Unix específico en

modo SOCK_STREAM y se queda a

la escucha de mensajes.

unix-dgram Abre un socket Unix en modo

SOCK_DGRAM y recibe mensajes a

través de él.

file Abre el fichero especificado.

pipe, fifo Abre el pipe especificado y lee mensajes.

udp Escucha mensajes en un puerto UDP.

tcp Escucha mensajes en un puerto TCP.

sun-stream Abre el dispositivo de flujo especificado

(sólo Solaris)

Tabla 1: Controladotesfuentes

Filtro Descripción

facility Se refiere a los mensajes que origina la

utilidad especificada.

level, priority Se refiere a los mensajes con la

prioridad especificada.

program Filtra los mensajes donde el campo

nombre del programa contienen la

expresión regular especificada

host Filtra los mensajes donde el campo

nombre de host contiene la expresión

regular especificada.

match Aplica la expresión regular especificada

al mensaje entero.

filter Llama a otra regla de filtro.

Tabla 2: Funciones filtroDestino Descripción

file Escribe el mensaje al archivo especificado.

pipe, fifo Pasa el mensaje al pipe especificado.

unix-stream Reenvía el mensaje al socket Unix

SOCK_STREAM.

unix-dgram Reenvía el mensaje al socket Unix

SOCK_DGRAM.

udp Envía el mensaje al puerto UDP

especificado.

tcp Envía el mensaje al puerto TCP

especificado.

usertty Envía el mensaje a la consola especificada

por el usuario, si el usuario está conectado.

program Lanza el programa especificado y envía

un mensaje a la entrada estándar de

programa (Stdin).

Tabla 3: Controladoresdestinos

Page 65: Linux Magazine - Edición en Castellano, Nº 01

común al tradicional syslogd. La mayorventaja de la variante Syslog-NG es eluso de las expresiones regulares. Unaintroducción a esta técnica la podemosencontrar en diversos libros de Perl, asícomo en la documentación para el pro-grama Logsurfer [9]. Esta herramientaautomática de análisis de archivos deregistro hace un uso intensivo de lasexpresiones regulares y proporciona unareferencia de 50 páginas.

Veamos una expresión regularextremadamente simple que busca todoslos mensajes que tienen algo que ver conFTP, que se cumple si la cadena ftp

aparece en cualquier parte del mensaje:

filter ftp { match("ftp"); };

Y aquí tenemos otra regla de filtro quesólo permite a los mensajes críticospasar y que también es útil para la salidaa TTY10. La salida por consola nodebería ser muy verbosa:

filter console {U

level(err) andU

not facilityU

(authpriv) orU

level(warn) andU

facility(kern);

};

filter email {U

facility(mail)U;

};

El filtro console usa fun-ciones, valores y expre-siones booleanas. Estaregla trata cualquier men-saje de error que no se ha

originado por la utilidad authpriv, ytodos los avisos del Kernel. El filtro email

sólo permite pasar los mensajes del sis-tema de correo.

Los DestinosTodo lo que necesitamos ahora son unoscuantos destinos a los que mandar losmensajes. La siguiente entrada de con-figuración le dice a Syslog-NG que escri-ba los mensajes al archivo de registro/var/log/mail (nombre de destino: email)o a la consola /dev/tty10.

destination email {

file("/var/log/mail");

};

destination console {

file("/dev/tty10");

};

Una ruta de registro describe la rutacompleta desde la fuente, a través del fil-

tro hasta el destino. Es una regla queengloba el nombre de la fuente, un filtroy un destino. La primera de las sigu-ientes reglas lee mensajes desde lafuente local y manda las entradas quecoinciden con la regla de filtro konsole aldestino konsole. La segunda regla alma-cena los mensajes del sistema de correolocal en /var/log/mail.

01 log {

02 source(local);

03 filter(console);

04 destination(console);

05 };

06

07 log {

08 source(local);

09 filter(console),

10 destination(email);

11 };

Si un host necesita reenviar los mensajesrecibidos a través de la red desde una

fuente a otro host de registro,simplemente hay que configu-rar un destino apropiado paraSyslog-NG.

destination loghost {

udp(ip(172.16.0.33)

port(514));

};

log {

source(remote);

filter(ftp);

destination(loghost);

};

Lo importante es que el servi-dor de registro, loghost, esté

65www.linuxmagazine.com.es Número 01

ADMINISTRACIÓNSyslog

Figura 2: Dependiendo de la configuración, Syslog-NG utiliza TCP o UDP para reenviar mensajes a través de la red. Esto permite modificar Syslog-NG para su

uso en entornos segmentados con múltiples cortafuegos.

Message MessageMessage

TCP-Port 601 UDP-Port 514

Loghost 1 Loghost 2 Loghost 3

Figura 3: El servidor Syslog de Kiwi Enterprises permite a los administradores

incluir ordenadores con Windows en su configuración de registros.

Page 66: Linux Magazine - Edición en Castellano, Nº 01

options {

keep_hostname(no);

chain_hostname(yes);

sync(0);

};

La opción sync especifica el número delíneas que Syslog-NG guardará en lacaché, antes de escribirla en el archivo.Un número alto aumentará el rendimien-to, pero incrementará el riesgo de perderlos mensajes si el sistema cae.

El listado 1 contiene un archivo deconfiguración. Éste ilustra como deavanzado es Syslog-NG con respecto alos conceptos de flexibilidad y escalabili-dad, en comparación con su predecesor.

Casi PerfectoLas funciones filtros permiten a losadministradores hacer los registros amedida, para reflejar las infraestructurasde redes complejas. La configuración esclara a pesar de su flexibilidad. Inclusose puede compensar la carencia de utili-dades de encriptación y autenticación, si

se está preparado para realizar un traba-jo extra [4]. Si se precisa integrar las util-idades de encriptación, autenticación yno repudio, se debe ver SDSC Secure

Syslog. Sin embargo, este servidorrequiere más mantenimiento.

Sin duda, Syslog-NG es el más comple-to, ya que se puede configurar parasoportar su infraestructura con muypoco esfuerzo. �

escuchando el puerto 514 definido por ladirección IP 172.16.0.33 en su archivo deconfiguración. Este método de conver-sión de direcciones puede ser extremada-mente útil (Véase la figura 2).

Opciones GlobalesPara completar el archivo de configu-ración, ahora hace falta poner lasopciones globales, que se colocan alprincipio del archivo. Alguna de lasopciones especifican como Syslog-NGmanejará los nombres de hosts de losmensajes, cuando redirigir los mensajesa otro servidor de registro. Habilitandokeep_hostname> se le dice a Syslog-NGque mantenga los nombres existentes.

Si se deshabilita keep_hostname,chain_hostname (alias: long_hostname)decide lo que hacer con el nombre. Sin elencadenamiento (chain_hostname), elservidor de registro insertará su propionombre, con encadenamiento añadirá sunombre al nombre ya existente. Esto per-mite a los administradores trazar la rutade los mensajes hasta su origen.

66 Número 01 www.linuxmagazine.com.es

SyslogADMINISTRACIÓN

[1] Pagina de inicio de Syslog-NG:http://

www.balabit.com/products/syslog_ng/

[2] Manual de Syslog-NG: http://www.

balabit.com/products/syslog_ng/

reference/book1.html

[3] Configuración de ejemplo:http://www.

campin.net/syslog-ng.conf

[4] Syslog-NG encryption howto: http://

venus.ece.ndsu.nodak.edu/~jezerr/linux/

secure-remote-ogging.html

[5] Secure Syslog por SDSC:http://security.

sdsc.edu/software/sdsc-syslog/

[6] Syslog-sec: http://sf.net/projects/

syslog-sec/

[7] RFC 3164,“The BSD Syslog Protocol”:

http://www.ietf.org/rfc/rfc3164.txt

[8] RFC 3195,“Reliable Delivery for Syslog”:

http://www.ietf.org/rfc/rfc3195.txt

[9] Logsurfer: http://www.cert.dfn.de/eng/

logsurf/

RECURSOS

Muchas redes tienen PCs Linux y Windows.

Bajo circunstancias ideales, una solución

centralizada de registro debería admitir

ambos sistemas. Sin embargo, se requiere

software extra para permitir que los sis-

temas Windows envíen y reciban mensajes

syslog.

El servidor de Syslog de la empresa Kiwi

http://www.kiwisyslog.com es un ejemplo

de programa que proporciona este servicio.

Soporta Windows 9x, NT, 2000 y XP. Además

de la versión gratuita, hay una versión com-

ercial con funcionalidades ampliadas.

La versión gratuita es adecuada para simple-

mente añadir máquinas Windows a los

entornos syslog de Linux. Se configura por

medio de una interfaz gráfica y se puede

lanzar tanto como un servidor de registro

como un cliente. Como Syslog-NG, el soft-

ware de Kiwi puede usar TCP o UDP para

enviar los mensajes. Además tiene algunas

bonitas, aunque superfluas, florituras como

gráficos de barras de colores y otros gráficos

estadísticos.

Syslog y Windows

01 # Opciones Globales

02 options { keep_hostname(no); chain_hostnames(yes); sync(0); };

03

04 # Fuentes

05 source local { internal(); unix-stream("/dev/log");

file("/proc/kmsg"); };

06 source remote { tcp(ip 192.168.0.24) port(3333)

max-connections(10);};

07

08 # Filtros

09 filter warning { level(warn, err, crit); };

10 filter email { facility(mail); };

11 filter ftp { match("ftp"); };

12 filter console {

13 level(err) and not facility(authpriv)

14 or level(warn) and facility(kern);

15 };

16

17 # Manda mensajes críticos a TTY10

18 destination console { file("/dev/tty10"); };

19 log { source(local); filter(console); destination(console); };

20

21 # Escribe mensajes de correo a un archivo

22 destination email { file ("/var/log/mail"); };

23 log { source(local); filter(email); destination(email); };

24

25 # Redirige los mensajes a otra red

26 destination loghost { udp(ip(172.16.0.33) port(514)); };

27 log { source(remote); filter(ftp); destination(loghost); };

Listado 1: Configuración Syslog-NG

Page 67: Linux Magazine - Edición en Castellano, Nº 01

Bienvenidos a Linux UserÉsta es la sección dedicada a la presentación de software interesante y útil que nos ayuda

en nuestro quehacer diario con el escritorio Linux. Aquí aprenderemos a utilizar

software estándar de una manera más eficiente, adquiriremos valiosos

conocimientos y descubriremos apasionantes nuevas aplicaciones.

Herramientas: Portal de Acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68

Tienes una red, pero sólo una de las máquinas tiene acceso a Internet. ¿Cómo hacerpara que las demás puedan conectarse concurrentemente? Necesitas un portal orouter y con Linux es fácil crear uno. Aprende cómo se hace en este artículo.

Desktopia: Panelizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70

Muchos de los gestores de ventanas más sencillos son rápidos, muy configurables, ala vez que exigen pocos recursos. Sin embargo, muchos no disponen de un panel decontrol. Panelizer soluciona este problema sin ralentizar tu máquina.

Aplicaciones: Konversation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72¿Cómo mantenerse en contacto con la gente sin apartarte de tu escritorio? Larespuesta está en Konversation, el último y más novedoso de los clientes IRC deKDE. Ideal para chateadores que disfrutarán de su amigable interfaz.

Programación Básica: XUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74

Mozilla, aparte de estupendo navegador, es toda una plataforma de desarrollo quepermite crear interfaces de manera sencilla y rápida. Aprende desde cero a crear tuspropias aplicaciones multiplataforma con esta serie.

Educación: WIMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

¿Necesitas poder generar ejercicios para tus alumnos? Puede que WIMS sea larespuesta. Este servidor educacional permite crear ejercicios, exámenes y tests;además administra clases y proporciona un entorno ideal para el autoestudio. Sirvepara cualquier plataforma (Windows, Linux o Mac) y por supuesto que es gratuito yde código abierto.

Linea de Comandos: Grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84

El problema ya no es que no exista documentación sobre un tema concreto, sinocomo encontrarla entre todas las descargas en nuestros discos duros. Grep es la her-ramienta de búsqueda todoterreno de los entornos Linux: pequeño, rápido y muy,muy eficiente.

Iniciación a Latex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86

Para conseguir efectos tipográficos profesionales, no hace falta costosos programasde autoedición corriendo en costosos equipos. De hecho, no hace falta ni un proce-sador de textos. Con un pequeño editor y unos pocos comandos podemos generardocumentos formateados elegantemente, con cuadros, tablas y notacionesmatemáticas utilizando Latex.

Page 68: Linux Magazine - Edición en Castellano, Nº 01

68 Número 01 www.linuxmagazine.com.es

PortalLINUX USER

Change… para modificar la configu-

ración de una tarjeta previamente config-

urada. Entonces, seleccionamos la tarje-

ta de red de nuestra red de la lista que

aparece y pulsamos Edit.7. Pulsamos en Routing - y verificamos

que la casilla Enable IP Forwarding está

marcada (ver figura 2).

En las pruebas que realizamos en la

redacción, esto no fue suficiente para

acabar la configuración. Debimos iniciar

la sección Security and Users de nuestro

YaST2 y el módulo Firewall (Cor-

tafuegos). Aquí encontramos la opción

Forward Traffic and do masquerading(Remitir Tráfico y hacer enmascaramien-

to), que debimos marcar como activa.

Red Hat LinuxLos pasos de configuración en Red Hat

Linux son algo más complejos. Debido a

que la herramienta GUI no nos permite

habilitar la redirección IP, necesitamos

acceder a la línea de

comandos para este

paso. Primero inici-

amos la herramienta

redhat-config-net-work (redhat-config-

uración-red) pulsan-

do en el menú K,

Systems Settings(configuración del

sistema) y finalmente

Network (redes). Tras

introducir la con-

traseña debemos

seguir estos pasos:

1.Seleccionamos una

conexion de Inter-

net de la lista de

dispositivos y pulsamos Edit en la

barra de herramientas. Alternativa-

mente podemos elegir New para crear

una conexión nueva.

2. Nos aseguramos de que la opción

Make this connection the default route(Establecer esta conexión por defecto)

en la sección Advanced está marcada

(ver figura 3).

3.Salvamos los cambios y salimos del

programa.

Necesitamos hacer una visita rápida a la

línea de comandos para activar la redi-

rección IP. La configuración para Red

Hat Linux 9 y 8.0 es:

1.Abrimos una consola: la forma más

rápida de hacerlo es pulsando [Alt-F2]

y escribiendo konsole.2.Asumimos privilegios de superusuario

escribiendo su, en la línea de coman-

dos y pulsamos [Enter] y escribiendo

la contraseña de root.

3.Comprobamos que el modulo NAT

Los routers se utilizan para intercam-

biar datos entre redes. En el caso de

una pequeña red, el sistema Linux

que se ejecuta en nuestro ordenador

puede realizar esta tarea de forma ade-

cuada. Por supuesto, suponemos que

tenemos una conexión a Internet y una

conexión a la red local en el mismo orde-

nador. Este taller nos muestra la manera

de configurar nuestro ordenador Linux

para que nos ofrezca capacidades de

enrutado.

SuSE LinuxSi tenemos instalado SuSE para permi-

tirnos acceso a Internet, los siguientes

pasos adicionales serán necesarios para

configurar el ordenador como una puerta

de enlace estándar:

1. Arrancamos YaST2 e introducimos

nuestra contraseña.

2. Pulsamos sobre Network Devices(dispositivos de red) en la versión SuSE

Linux 8.2 o Network/Basic (red/básico)

en SuSE Linux 8.1. Ahora debemos

seleccionar un dispositivo adecuado:

módem, RDSI, ADSL o tarjeta de red.

3. Pulsamos Configure… (configurar)

para añadir una conexión de Internet, o

Change (cambiar) para reconfigurar una

existente.

4. Debemos asegurarnos de marcar la

casilla Default Route en IP_Details dentro

del diálogo de configuración (ver figura

1).

5. Salvamos la configuración y volve-

mos a Network Devices o Network/Basic.6. Ahora debemos comprobar la con-

figuración de Network card para asegu-

rarnos de que el transporte IP esté habili-

tado. Para hacer esto, pulsamos

Si tenemos nuestra propia red con uno o dos ordenadores y buscamos una

forma de tener acceso concurrente a Internet desde la red, la solución es uti-

lizar un router, también denominado puerta de enlace. En este artículo vemos

a explicar como configurar nuestro PC Linux como puerta de enlace, un inter-

faz entre nuestra red local e Internet. BY HEIKE JURZIK

Figura 1: Conversión del ordenador en un router.

Configurando una puerta de enlace en Linux

Portal de acceso

Page 69: Linux Magazine - Edición en Castellano, Nº 01

69www.linuxmagazine.com.es Número 01

LINUX USERPortal

esta cargado:

/sbin/lsmod | grep iptable_nat

Sí esta prueba no nos proporciona

ningún resultado deberemos cargar el

modulo escribiendo:

/sbin/modprobe iptable_nat

4.Ahora introducimos el siguiente

comando:

/sbin/iptables -t nat -A

POSTROßß

UTING -o ppp0 -j MASQUERADE

5.Salvamos la configuración escribien-

do:

/sbin/service iptables save

6.Ahora usamos el siguiente comando

para activar la redirección IP:

echo "1" > /proc/sys/net/ipv4/ßß

ip_forward

Para asegurarnos de que la redirección

IP se mantiene habilitada después

de reiniciar el sistema podemos usar

nuestro editor favorito para modificar

/etc/sysctl.conf, donde reemplazare-

mos el “0” que aparece en net.ipv4.ip_forward = 0 y lo sustituiremos por

un “1”.

7.Esta configuración es aplicada cuando

reiniciamos el equipo. Si sólo cam-

biamos sysctl.conf sin escribir “1”

en ip_forward ahora podemos escribir:

/sbin/sysctl -p

para realizar el cambio en el sistema

mientras se ejecuta.

8.Cerramos la consola presionando

[Ctrl-d] 2 veces.

Configuración Cliente LinuxAhora debemos configurar los orde-

nadores Linux de nuestra red local para

que utilicen la puerta de enlace de

Internet. Para hacer esto en SuSE Linux

procederemos de la siguiente manera:

1. Iniciamos YaST2 e introducimos la

contraseña root.

2.Pulsamos en Network Devices (SuSE

Linux 8.2) o Network/Basic (SuSE

Linux 8.1) y luego Network card (SuSE

Linux 8.2) o Network card configura-tion (SuSE Linux 8.1).

3.Ahora pulsamos Change… para cam-

biar la configuración de la tarjeta exis-

tente seleccionándola de la lista y pul-

sando Edit.

4. En Detailed settings, pulsamos

Routing e introducimos la dirección

local IP de nuestro router en la casilla

Default Gateway.

En el caso de Red Hat Linux, necesitare-

mos de Nuevo el programa redhat-config-network:

1. Iniciamos la herramienta redhat-con-

fig-network con la secuencia desde la

opción de K Menú, System Settings/

Network, e introducimos la contraseña

de root.

2.Seleccionamos la tarjeta de red de la

lista de dispositivos y pulsamos el

botón Edit.

3.En General escribimos la dirección

local IP del router en al campo Default

Gateway Address (Dirección de la

puerta de enlace por defecto).

4.Salvamos los cambios y salimos del

programa.

Puerta de Enlace conMicrosoft WindowsPara permitir que un cliente de Windows

acceda a Internet mediante un router

Linux debemos seguir los siguientes

pasos en función de la versión de

Windows:

Windows 95/98/Me1.Abrimos Inicio/Configuración/Panel de

Control y hacemos doble clic sobre el

icono Red.

2.En la lista de componentes de red

localizamos la entrada TCP/IP y pul-

samos Propiedades.3.Ahora abrimos la pestaña Puerta de

Enlace y escribimos la dirección local

IP de nuestro router Linux en la caja

Nueva Puerta de Enlace. Pulsamos

Añadir y salvamos la nueva configu-

ración.

Windows 20001.Abrimos Inicio/Configuración/Panel de

Control/Red y conexiones, pulsamos

con el botón derecho sobre ConexiónÁrea Local y seleccionamos Pro-piedades en el menú.

2.Seleccionamos Protocolo Internet(TCP/IP) y pulsamos Propiedades.

3.En Utilizar la siguiente dirección IP:escribimos la dirección de nuestro

router de Linux en el cuadro Puerta deEnlace por Defecto:.

4.Finalizamos pulsando Aceptar.

Windows XP1.Pulsamos sucesivamente en Inicio/

Panel de Control y luego Red yConexiones Internet.

2.Abrimos las conexiones de red en

Conexiones de Red.

3.Con el botón derecho accedemos al

menú del icono Conexiones de ÁreaLocal donde seleccionamos Propie-dades.

4.En la pestaña General seleccionamos

Protocolo Internet (TCP/IP) y pulsamos

sobre Propiedades.5.En Utilizar la siguiente dirección IP:

escribimos la dirección de nuestro

router de Linux en el cuadro Puerta deEnlace por Defecto:.

6.Pulsamos Aceptar para confirmar. �

Figura 2: Habilitando la redirección IP en SuSE

Linux.

Figura 3: Configuración de la ruta por defecto en

Red Hat Linux.

Page 70: Linux Magazine - Edición en Castellano, Nº 01

70 Número 01 www.linuxmagazine.com.es

DesktopiaLINUX USER

evitar perdernos en el proceso.

Después de gestionar adecuadamente

las numerosas dependencias, podemos

empezar a compilar Panelizer. Des-

comprimimos el archivo- 0.5.tar.gz (que

podemos descargarnos desde [1]) con

tar -xzf panelizer-0.5.tar.gz. A contin-

uación cambiamos al nuevo directorio de

Panelizer que hemos creado. Puesto que

el programa no dispone de archivo de

configuración, será necesario usar un

editor de texto para añadir nuestras pref-

erencias al archivo Config.mak. No

obstante, los útiles valores por defecto

(como la instalación en /usr/local) hacen

que la personalización no sea impre-

scindible.

Ya podemos lanzar el compilador

escribiendo make, e instalar escribiendo

make install. Como alterna-

tiva, también podemos in-

stalar Panelizer como un

ROX applet [2] utilizando el

comando roxinstall. Si bien

en la teoría esto es una buena opción,

uno se pregunta porque los usuarios de

ROX, que ya disponen de un panel, nece-

sitan otro.

Simple, ordenado yfuncional.Tras completar el proceso de instalación

podemos ejecutar el panel escribiendo

panelizer &. La figura 1 muestra la con-

figuración estándar, si bien no muestra

mucho. Pulsando la flecha de la izquier-

da minimizamos el panel, dejando solo

un botón a la vista. Pulsando la aspa

negra cerraremos el panel. Si bien esto

nos permite un ahorro de espacio signi-

ficativo, es muy posible que necesitemos

algo más de funcionalidad que un botón

con calendario y reloj. El icono del editor

de texto no guía hacia el editor de la con-

figuración (Figura 2). Lo primero que

debemos decidir es que queremos que

Independientemente de lo contento

que uno esté con sus actuales

gestores de ventanas, la mayoría de

los usuarios Linux echarán de menos

una pequeña característica, un panel lat-

eral con reloj y menú. Los paquetes inte-

grados de entornos de escritorio como

GNOME y KDE proporcionan un panel

por defecto, pero los individualistas en la

comunidad Linux deben encontrar

primero el panel adecuado.

Panelizer [1], un programa de Fabien

Couyant, puede significar el final de la

búsqueda. Se ejecuta en la mayoría de

gestores de ventanas y proporciona una

serie de agradables extras como un mon-

itor de correo y applets para montar dis-

positivos o monitorizar tráfico de redes

al margen de las funciones básicas.

Increíblemente, la aplicación ocupa tan

64kbytes, ocupando solo 236 kbytes si se

activan todos los applets disponibles.

Instalación compleja.No existen paquetes precompilados del

panel, por lo que debemos utilizar nue-

stro compilador. Aparte de la librería

GTK versión 1.2.0 o superior (excepto

gtk-2.x) y libxml, necesitaremos el

paquete de desarrollo del Panelizer y,

por supuesto, un compilador. Como el

GUI de Panelizer fue desarrollado uti-

lizando glade, necesitaremos tener insta-

lado este paquete antes de poder compi-

lar el panel. El gestor del paquete glade

suele tender a instalar numerosas libr-

erías GNOME adicionales localizadas

normalmente en el CD de instalación.

Afortunadamente, éstas solo

son esenciales para compilar

Panelizer, por lo que el soft-

ware puede ser borrado

después de la compilación. Es

una buena idea tomar nota de todos las

librerías añadidas al instalar glade para

Los gestores de ventanas simples ofrecen una serie de ventajas en comparación con los entornos de escritorio más com-

plejos: exigen pocos recursos, son rápidos y sumamente configurables. Desafortunadamente, la mayoría carecen de un

panel para añadir funcionalidades adicionales al entorno. POR ANDREA MÜLLER

Panelizer

Aplicaciones a Raya

Punto de Montaje: directorio donde el archi-

vo del sistema de un volumen esta unido al

árbol local de archivos del sistema.

GLOSARIOFigura 1: Primera ejecu-

ción de Panelizer.

ww

w.yu

konh

ostels.com

Page 71: Linux Magazine - Edición en Castellano, Nº 01

71www.linuxmagazine.com.es Número 01

LINUX USERDesktopia

muestre el panel. Pul-

sando Add abrimos el

diálogo de selección. Esta

sección incluye un con-

junto de útiles herramien-

tas, como un monitor de

mensajes de entrada en el

buzón de correo (llamado

Mail Counter en la docu-

mentación), un applet

para montar dispositivos

(Mount Applet), un con-

mutador de silencio para

la tarjeta de sonido, un

menú de inicio para pro-

gramas y herramientas de

monitorización para la

CPU, memoria y tráfico

de red.

Debemos prestar aten-

ción al deskswitch (aplicación de con-

mutación). Como la mayoría de las apli-

caciones de conmutación no funciona

con todos los gestores de ventanas, pero,

en lugar de simplemente negarse a fun-

cionar con candidatos no adecuados,

Panelizer se cuelga cuando llamamos al

applet. Podemos ejecutar Panelizer sin

problemas de cuelgues con entornos

como WindowMaker, Enlightenment or

IceWM. No podemos utilizarlo con

waimea, PWM or Blackbox.

El baile de la configuración.Algunas herramientas del Panelizer fun-

cionan bastante bien con la configu-

ración por defecto, pero otras necesitan

algunos cambios. Pera realizar cambios

en un applet, debemos seleccionarlo en

la ventana de configuración y pulsar el

botón Configure. Por ejemplo, para per-

mitir que el monitor de correo (biff) fun-

cione, debemos indicarle donde esta

almacenado nuestro buzón de correo y

especificarle que acción debe realizar

cuando pulsemos el icono del correo en

el panel, es decir, abrir el programa que

utilicemos.

Debemos prestar también atención a la

función de silencio. La configuración por

defecto ejecuta esd (“Enlightenment

Sound Daemon”). Si utilizamos otro

servidor de sonido, debemos indicarle la

nomenclatura correcta para su manipu-

lación. Por ejemplo, para trabajar con

aumix la sintaxis correcta es aumix -v0 y

aumix -v75. Este texto debe ser escrito

en los recuadros When pushed on y

When pushed off respectivamente. Esta

configuración apagará el sonido cuando

pulsemos el icono del altavoz una vez, lo

volverá a conectar cuando lo pulsemos

de nuevo, subiéndolo al 75 % si pul-

samos el botón una tercera vez. La apli-

cación de redes necesita saber que inter-

faz debe monitorizar, mostrando la

velocidad de conexión cuando esté con-

figurado. Los usuarios de módems y DSL

pueden usar el dispositivo ppp0 para

monitorizar su conexión a Internet, sien-

do eth0 el dispositivo habitual utilizado

para redes locales.

Si deseamos monitorizar ambos tipos

de redes, debemos iniciar dos aplica-

ciones de red. Panelizer permite la selec-

ción de símbolos en la ventana de con-

figuración con el objeto de ayudarnos a

distinguir aplicaciones. Podemos utilizar

los mismos pasos para añadir múltiples

applets escalonados para diversos con-

troladores y particiones de nuestro sis-

tema. No debemos olvidar introducir el

punto de montaje adecuado para el

Mount directory en la pes-

taña Paths & Commands. Por

defecto, se analiza la carpeta

apps de la instalación

GNOME 1.4 (que puede exis-

tir o no) en busca de infor-

mación. Es posible person-

alizar la ruta para permitir a

Panelizer tener acceso a los

archivos .desktop de una

instalación GNOME 2.2, si

bien las aplicaciones no

están agrupadas en cate-

gorías, sino mostradas indi-

vidualmente (ver Figura 3).

La ubicación de nuestra

instalación de GNOME de-

pende de nuestra distribu-

ción. Los usuarios de Red

Hat deben introducir /usr/

share/applications para ubicar el menú

GNOME 2.

Desafortunadamente, Panelizer es

totalmente incapaz de emular el fun-

cionamiento del menú de KDE 3.1.x. A

pesar de que el panel muestra las aplica-

ciones individualmente si especificamos

como nuestra carpeta de menú /usr/

share/applnk, Panelizer proporciona los

parámetros incorrectos cuanto tratamos

de ejecutar cualquier programa. Para lan-

zar el panel por defecto cuando intro-

ducimos el comando startx, debemos

añadir el comando /usr/local/bin/panel-

izer & a nuestro fichero .xinitrc antes de

llamar a nuestro gestor de ventanas. �

[1] http://www.fcoutant.freesurf.fr/

panelizer.html

[2] Jo Moskalewski:“RISC rocks”,Linux Maga-

zine del 24 de octubre de 2002,página 73

RECURSOS

Andrea Müller es unaestudiante de dere-cho que se entretienecon Linux siempreque se cansa deteorías legales.Cuando el tiempo selo permite, le gustaestudiar otros sistemas operativoscomo QNX, BeOS y NetBSD, e intentamejorar sus habilidades con Python. Almargen de Linux y sus estudios univer-sitarios, los intereses de Andrea sedecantan hacia la literatura, la histo-ria Europea y el ciclismo.

LA

AU

TO

RA

:

Figura 3: Panelizer mostrando el menú de GNOME 2.

Figura 2: Un práctico editor nos ayuda con las tar-

eas de configuración.

Page 72: Linux Magazine - Edición en Castellano, Nº 01

72 Número 01 www.linuxmagazine.com.es

SchlagwortLINUX USER

No hay paquetes disponibles para

SuSE 8.1 y algunas otras distribuciones,

pero tras descomprimir el paquete

konversation-0.12.tar.gz desde /usr/-

local/kde/bin, la configuración estándar,

configure; make; make install funcionará

perfectamente. Este procedimiento su-

pone que los paquetes KDE3 y Qt3-Dev y

las herramientas estándar de compi-

lación están instaladas.

Para arrancar el programa, podemos ir

al acceso Internet/Konversation en el

menú K o escribir konversation & en la

ventana terminal de nuestra elección. Si

el programa lo compilamos nosotros,

hay que introducir la ruta correcta.

La ventana principal (figura 1) es el

centro de comandos donde configu-

raremos el programa de acuerdo a nues-

tras necesidades concretas. El punto de

entrada, una caja de diálogo llamada

Server list (Lista de Servidores) se utiliza

para gestionar los

diversos servidores

IRC.

Desafortunadamente,

aquí es donde trope-

zamos con uno de los

únicos defectos del pro-

grama. A diferencia de

programas similares,

los desarrolladores de

Konversation no pro-

porcionan una lista de

las redes IRC más pop-

ulares y los datos de

sus correspondientes

servidores.

Debemos seleccionar

la única opción dis-

ponible, pulsar Connect

(Conectar) para contac-

tar el servidor KDE IRC

en la red IRC más importante, IRCNet, y

después introducir el canal KDE pulsando

#kdeusers. Tras abrir la ventana de con-

versación que aparece podemos selec-

cionar Settings/Konversation Configure

para volver al diálogo de configuración.

Para conectarnos a servidores chat de

otras redes IRC debemos pulsar el acceso

New Server (Nuevo Servidor) en la figura

1 y escribir los detalles del servidor en la

ventana de la figura 2 (p. ej.: Freenode

[2]). Al mismo tiempo podemos selec-

cionar un canal para conectar de forma

inmediata con el nuevo servidor. Este

pequeño truco nos puede ahorrar mucho

tiempo más adelante. Si deseamos

conectarnos a un servidor específico

cada vez que iniciemos el programa

debemos marcar la casilla del servidor

deseado en Server List.

La anotación Identity (Identidad) en la

lista de selección a la izquierda de la

Si pagas mucho en tú factura de

teléfono y casi no aprovechas tú

tarifa plana, en lugar de usar el

teléfono conversa con tus amigos lejanos

mediante el teclado. El servicio IRC,

abreviatura de "Internet Relay Chat"

(Conversación Transmitida por Internet)

es ideal para esto.

Para casi cualquier tema existe una

sala de conversación apropiada o canal

IRC disponible. Y si no está disponibles

puedes crear uno adecuado al tema que

te interese discutir. Para hacerlo, todo lo

que necesitamos es un cliente IRC y

conexión a cualquiera de los muchos

servidores IRC disponibles en Internet. Si

bien hay muchos clientes de IRC

disponibles, vamos a tratar sobre

Konversation [1], un programa KDE real-

izado con este propósito que destaca

sobre el resto por su facilidad de uso.

"Extra Gear" (http://extragear.kde.

org/) es una colección de programas

sueltos de KDE que por distintas razones

no están incluidas en el paquete Core

KDE. Puede ser descargado desde http://

konversation.sourceforge.net/. Al igual

que el código fuente, también hay diver-

sos paquetes RPM para los distribu-

ciones más conocidas, desde Debian

hasta SuSE de las que puedes elegir.

Programas como rpm, kpackage o dpkg y

apt pueden facilitarnos el proceso de

instalación.

¿Por qué deambular por ahí en busca de compañía cuando hay una sala de chat

en tu misma casa? A los amantes de la tertulia virtual les va a encantar Konver-

sation, la última herramienta IRC de KDE, por su amigable entorno.

BY STEFANIE TEUFEL

En esta columna presentamos herramientas

mensualmente que han demostrado ser

especialmente útiles para trabajar bajo KDE,

resuelven problemas que de otra forma

serían ignorados o simplemente son de las

cosas más bonitas de la vida, que, una vez

descubiertas, no queremos dejar pasar.

APLICACIONES Figura 1: Nuestra ventana al mundo IRC

Figura 2: ¡Nuevos servidores, por favor!

Konversation

¡Habla conmigo!

Page 73: Linux Magazine - Edición en Castellano, Nº 01

73www.linuxmagazine.com.es Número 01

LINUX USERSchlagwort

figura 1 también es impor-

tante. Mientras que los apo-

dos no son bien recibidos en

los grupos de noticias, aquí

son recomendados e, incluso,

se anima a su uso.Por tanto

debemos escoger un Nick

(Apodo) apropiado e intro-

ducirlo en el campo adecuado

(ver figura 3). Debido a que

hay muchos usuarios, el

apodo elegido puede estar pil-

lado. Konversation propor-

ciona 3 campos adicionales

de apodos donde podemos

introducir alternativas. El pro-

grama itera sobre la lista si

nuestra primera opción no

está disponible.

Konversation tiene la capacidad de

estar en una red IRC con un apodo deter-

minado y con otro distinto en otra red. El

botón Add new identity (Añadir nueva

identidad) nos permite ponernos un

nuevo “disfraz”. Mientras el nombre

estándar New Identity no es muy especí-

fico, lo podemos cambiar con el botón

Rename (Renombrar). En cuanto salve-

mos nuestro nuevo “apodo” estará

disponible en el menú desplegable

Identity. También estará disponible en

Server Lists tras realizar los cambios

oportunos usando el botón Edit. Esto nos

permite personalizar cada servidor con

una identidad distinta.

El comportamiento de nuestro cliente

IRC puede ser modificado en General set-

tings.Si activamos las opciones Auto-

matically Connect (Conectar Auto-

máticamente) y Automatically Enter

(Entrar Automáticamente), Konversation

intentará conectarse de Nuevo si la

conexión se interrumpe. Una marca en

blinking tabs (Etiquetas intermitentes) le

indica a Konversation que debe encender

un pequeño indicador en la barra del

chat cada vez que ocurra algo en el

canal. Esto puede ocurrir por ejemplo

cuando alguien escriba un mensaje o un

usuario entre o abandone el canal.

Al margen de chatear, el IRC puede uti-

lizarse para el intercambio de archivos

de datos. Las conexiones de clientes

directos (DCCs - Direct Client Con-

nections) se usan con este fin. Dos

clientes IRC pueden establecer una

conexión directa sin necesidad de pasar

a través del servidor IRC. Podemos uti-

lizar DCC settings para configurar la

conexión.

La opción DCC accept downloads auto-

matically (DCC aceptar descargas

automáticamente) debe ser utilizada con

precaución, puesto que permite a

Konversation descargar cualquier cosa

ofrecida sin hacer ninguna pregunta,

pudiendo descargar códigos de progra-

mas nocivos. Si deseamos que el progra-

ma incluya el nombre del remitente en

las descargas, simplemente debemos

activar la casilla Sender in data name

(Nombre del emisor de datos).

Preparados, listos, ¡CHAT!Una vez en el canal elegido, no hay nada

que nos impida tener conversaciones

excitantes. La ventana del canal está

dividida en 3 áreas (ver figura 4).Los

mensajes de nuestro compañero o servi-

dor aparecen en la ventana principal. A

la derecha, Konversation lista los usuar-

ios actualmente en el canal.

Nuestros propios mensajes son

escritos en la línea de comandos inferior.

Si mantenemos los valores por defecto

en General settings/ com-

mand char, los comandos de

nuestro sistema empezarán

con una barra invertida /. Si

escribimos /help (Ayuda) nos

mostrará los comandos

disponibles. Podemos encon-

trar una ayuda rápida en

IRChelp [3].

Esta página hace un uso

intensivo del término IRC Op.

Este tiene el siguiente signifi-

cado: a un usuario que entre

en un canal recién creado se

le asignan más privilegios

que a otro usuario que entre

más tarde. Como Operador

del canal podemos expulsar

(kick) del canal a otros usuar-

ios por mal comportamiento o por

motivos personales.

Los comandos más importantes de los

Ops se encuentran debajo de la lista de

usuarios de la derecha. Podemos pulsar

kick para expulsar usuarios y Ban

(Prohibición) para proscribir usuarios

del canal. Un Op también nos permite

asignar privilegios de Op a otros usuar-

ios, mientras DeOp se los revocará. Si

deseamos aplicar un comando a más de

un usuario debemos usar [Ctrl] y el

botón izquierdo del ratón para selec-

cionar los usuarios.

Los usuarios que utilizan mucho tiem-

po IRC están destinado s a hacer amigos.

Konversation nos ayuda a mantener

estos contactos monitorizando si nue-

stros amigos están en línea. Podemos

desplegar el menú Windows/Notify list

(Ventana/lista de notificación) e intro-

ducir los apodos adecuados usando el

botón New (nuevo). Konversation nos

notificará cuando estos usuarios estén o

entren en un canal.

De la misma forma que podemos estar

muy contentos con unos usuarios, hay

otros que pueden ser un problema. Pero

por suerte, el programa nos resuelve este

problema con una lista de usuarios que

deseamos ignorar Windows/Ignore list. �

[1] Konversation: http://konversation.

sourceforge.net/

[2] Freenode: http://www.freenode.net

[3] IRC help: http://www.irchelp.org

RECURSOS

Core: Todos los programas que son oficial-mente sacados al mercado son asignados alos llamados paquetes “Core”. Mientras“kdelibs”y “kdebase”deben estar instalados,otros paquetes, organizados por materiascomo “kdeadmin”o “kdemultimedia”,pueden dejarse aparte.IRC-Network: Podemos acceder a todos losusuarios de todos los servidores de una redIRC específica. Pero los usuarios de redes difer-entes no pueden conectarse a otras redes.

GLOSARIO

Figura 3: Una identidad adecuada para cada mundo

Page 74: Linux Magazine - Edición en Castellano, Nº 01

otras cosas. Al margen de las políticas de

las guerras de navegadores, la incompe-

tente implementación de estándares y

los intentos de censura por parte de cier-

tos políticos americanos, la Web ha

demostrado ser un medio atrayente al

que el acceso se supone. Hay veces que

puedo oír por ahí la frase “¿Cómo que no

tienes Internet?” (enunciada en tono de

asombro). Al margen de la popular-

ización de la Web, sus limitaciones son

evidentes. La más visible es el hecho de

que la interfaz entera debe ser reinventa-

da cada vez que se desarrolla un sitio

web. Además, la interfaz debe ser recar-

gada cada vez que se realiza un cambio

en la página por muy pequeño que sea.

Esto es ineficiente no solo por el hecho

de que HTML redundante necesita ser

enviado y recibido una y otra vez entre

el servidor y el navegador, si no porque

crea un entorno donde los cambios más

dinámicos de la página son los más difí-

ciles de realizar, dándole a la Web una

clara sensación de “pesada”.

Introducción a XULLa dependencia de HTML y su esperada

funcionalidad de búsqueda es realmente

una piedra de toque del problema que

acabamos de describir. A pesar de que

tecnologías como el HTML Dinámico

(DHTML) y el Modelo de Objetos de

Documentos (DOM) han aparecido para

atacar el problema, éstas necesitan un

poco de mimo para hacerlas funcionar

conjuntamente. Los desarrolladores del

popular buscador Mozilla tuvieron una

idea diferente. Con grandes dosis de dis-

cusiones y diseño, los programadores

trabajaron juntos hasta crear el Lenguaje

de Interfaz del Usuario de XML (XUL)

Apesar de que joyas como el

Sinclair C5, la moto tipo Chopper,

el refresco Tab Clear o Microsoft

FoxPro se hayan quedado en el camino,

hay algunos productos y tecnologías que

se han mantenido. Una de esas tec-

nologías es la Web. Hay pocas dudas al

respecto de que la Web ha causado un

gran impacto en la forma en que nos

comunicamos, compramos o hacemos

74 Número 01 www.linuxmagazine.com.es

XULLINUX USER

De todas las invenciones de los últi-

mos 50 años, solo unos pocos

productos realmente innovadores

han llegado a un punto en el cual

todos los usamos habitualmente

todos los días de nuestra vida. A pesar

de ello no tenemos por qué

quedarnos estancados en sus defec-

tos iniciales de diseño.

POR JONO BACON

El Kit de Construcción de Mozilla

Programación XUL

Jono Bacon is awriter/journalist, con-sultant and developerbased in England. Jonohas been activelyinvolved with Linuxsince 1998 and hasworked on a number ofdifferent projects including KDE,KDE::Enteprise, KDE Usability Study,Kafka and Linux UK.You can find hiswebsite at http://www.jonobacon.org.

EL A

UT

OR

Page 75: Linux Magazine - Edición en Castellano, Nº 01

resolviendo el problema parcialmente.

Pronunciado “zool” e inspirado por los

Cazafantasmas (Ghostbusters), el

lenguaje XUL en esencia busca recrear

las características de la interfaz de

usuario típicamente asociadas a paque-

tes de herramientas gráficas normales

como Qt y GTK. Características como

botones, barras de desplazamiento, eti-

quetas o menús están disponibles en el

paquete XUL. Muchos de estos simple-

mente no están disponibles en formatos

normales HTML. Cada una de estas fun-

ciones se usa dentro de XUL simple-

mente escribiendo (no es de extrañar)

archivos XML. Para los que sienten un

agudo dolor de cabeza cuando leen las

letras XML les voy a dar un breve repaso

de lo que es. XML es un conjunto de

reglas y convenciones que nos permiten

crear lenguajes que parecen similares al

HTML. Estos lenguajes incluyen etique-

tas, atributos, contenidos y otros concep-

tos que también se hallan en HTML (de

hecho las versiones más modernas de

HTML son “dialectos” XML). La tec-

nología XML nos permite crear nuestras

propias etiquetas y lenguaje que pueden

ser usados para nuestros propios fines.

Por ejemplo, si quisiésemos almacenar

una dirección en XML crearíamos:

<contacto>

<nombre>Pepe</nombre>

<apellidos>López</apellidos>

<direccion>13, Rue del Percebe,U

33333 Villaalgo</direccion>

<telefono>020 344 5443U

</telefono>

</contacto>

Aquí usamos etiquetas específicas para

marcar datos diferentes de información

específica, pudiendo entonces escribir

software que lea esas etiquetas y las use

en el contexto que deseemos. XUL sigue

el mismo concepto, pero las etiquetas

son usadas para crear elementos de

interfaz específicos. La magia no

comienza, no obstante, hasta que

Mozilla lee las etiquetas y crea los ele-

mentos de la interfaz por nosotros. El

archivo XML es una forma simple de

especificar lo que queremos como inter-

faz y donde.

ComencemosEsta es la primera parte de una serie,

donde voy a mostrar como modelar una

interfaz basada en XUL. Esta interfaz

abarcará algunos de los diferentes com-

ponentes XUL disponibles, y si bien no

veremos como realizar tareas hasta el

próximo capítulo, si sentaremos las

bases de cómo crear nuestra interfaz

visual. Para comenzar crearemos un

archivo XUL simple que contenga 2

botones. Para hacer esto, crearemos un

archivo llamado xul1.xul al que le añadi-

remos el siguiente código (ver Listado

1). Tras añadir el código, usaremos

Archivo | Abrir Archivo para localizarlo y

abrirlo en Mozilla. Deberíamos ver algo

similar a la figura 1. Cualquier archivo

XML, independientemente de su fun-

ción, debe tener algunas líneas al princi-

pio que indican la versión de XML y una

hoja de estilo si es oportuno. En nuestro

ejemplo tenemos las siguientes 2 líneas:

<?xml version="1.0"?>

<?xml-stylesheet href="chrome:U

//global/skin/" type="text/css"?>

Como podemos observar, tenemos una

línea de versión que indica que la ver-

sión XML es la 1.0. La segunda línea

indica que nuestra hoja de estilo está en

la ruta chrome. La ruta chrome contiene

algunas utilidades internas de Mozilla

que gestionan habitualmente las inter-

faces de usuario de Mozilla. Las sigu-

ientes líneas contienen nuestras

primeras etiquetas:

<window

id="firstwindow"

title="First XUL Window"

xmlns="http://www.mozilla.org/U

keymaster/gatekeeper/there.is.U

only.xul">

Si bien tenemos 4 líneas de código, esto

es realmente una única etiqueta que he

subdividido en una serie de líneas para

hacerla más fácil de leer. De hecho, no

importa donde hagamos separaciones de

línea, siempre y cuando no rompamos

etiiquetas.

Cada página XUL que creemos necesita

una etiqueta <window> que pueda ser

usadas para contener los componentes

que forman nuestra interfaz. Dentro de

esta etiqueta hemos usado 3 atributos. El

primero (id) es una referencia única que

apunta a esta etiqueta en XML. El atribu-

to id es esencial para ser capaces de

comunicarnos con etiquetas y actu-

alizarlas con cambios e información.

Esto estará más claro cuando usemos

DOM para actualizar y referenciar real-

mente etiquetas. La segunda etiqueta,

title (título), contiene una serie de carac-

teres legibles por humanos que se mues-

tra en la barra de título cuando lanzamos

el archivo XUL en la ventana oportuna.

Si cargamos el archivo en el navegador

como hemos hecho, este texto es ignora-

do. El último atributo es la parte xmlns.

Este valor especifica el namespace (espa-

cio de nombres) en el que la etiqueta

<window> y todas las etiquetas dentro

de ella están basadas. Un namespace es

como un grupo especial que podemos

especificar para determinar de donde

viene una etiqueta. Esto ayuda en situa-

ciones en las que tengamos una etiqueta

<window> de otro lenguaje XML y una

etiqueta <window> del lenguaje XUL:

namespace las diferencia. Ahora estamos

listos para poner algo en nuestra pan-

talla. En nuestro ejemplo hemos creado

dos botones con nuestro código:

75www.linuxmagazine.com.es Número 01

LINUX USERXUL

<?xml version=“1.0”?>

<?xml-stylesheet href=“chrome://

global/skin/” type=“text/css”?>

<window id=“firstwindow”

title=“Primera Ventana XUL”

xmlns=“http://www.mozilla.org/

keymaster/gatekeeper/

there.is.only.xul”>

<button id=“button1”

label=“Primer Botón”/>

<button id=“button2”

label=“Segundo Botón”/>

</window>

Listado 1: Xul1.xul

Figura 1: No es exactamente el código XUL más

claro, pero es un inicio.

Page 76: Linux Magazine - Edición en Castellano, Nº 01

correcto. En el caso de nuestras etiquetas

<button>, se ha de incluir una etiqueta

de cierre </button> para mantener las

reglas de XML. La barra invertida al final

de nuestra etiqueta <button> es un

atajo para incluir la etiqueta

</button>. Verán que este tipo de ata-

jos se usan habitualmente en XML. Para

finalizar nuestro archivo incluimos la eti-

queta de cierre </window>.

Gestión de la composiciónEn nuestro primer ejemplo que el segun-

do Botón está debajo del primero. Este es

el comportamiento predeterminado de

los componentes cuya distribución no

está especificada. Si bien esto es válido

para páginas sencillas, este método de

posicionar componentes no es suficien-

temente flexible. Aquí es cuando se

necesita usar un gestor de distribución.

La gestión de la distribución es algo

común en la mayoría de los compo-

nentes GUI como Qt y GTK. El único req-

uisito es que pongamos nuestros compo-

nentes dentro de unos controles invisi-

bles que nos coloquen nuestro controles

visibles de una manera determinada. La

mayoría de herramientas contienen for-

mas horizontales y verticales de com-

posición. Esta forma estandarizada de

gestionar las formas se ha transferido a

XUL y consecuentemente tenemos las

etiquetas <hbox> y <vbox>. Veamos

a continuación un ejemplo de gestión

que nos permite disponer nuestros

botones:

<hbox>

<button id="button1" label=U

"Primer Botón"/>

<button id="button2" label=U

"Segundo Botón"/>

</hbox>

La forma en que funciona la etiqueta

<hbox> es colocando horizontalmente

los componentes entre las etiquetas

<hbox> y </hbox> más cercanas. Los

resultados de este código los podemos

ver en la figura 2.

El otro tipo de gestión de la composi-

ción es la etiqueta <vbox>. Esta etique-

<button id="button1" label=ßß

"Primer Botón"/>

<button id="button2" label=ßß

"Segundo Botón"/>

Las líneas del código son muy similares,

pues solo los atributos id y label (etique-

ta) tienen diferentes contenidos. El atrib-

uto id se comporta de la misma manera

que el equivalente <window> que

usaremos para referenciar la etiqueta

más tarde. El atributo etiqueta contiene

el texto que realmente aparece en el

Botón. Alguno se preguntará que está

haciendo la barra invertida (/) en la eti-

queta. Al contrario de lo que ocurre en

algunas formas de HTML, donde

podemos dejar sueltas etiquetas por ahí,

XML es muy estricto sobre el marcaje

76 Número 01 www.linuxmagazine.com.es

XULLINUX USER

Figura 2: Gestor de diseño horizontal. Figura 3: Combinación de gestión del diseño hori-

zontal y vertical.

Hasta ahora, en nuestra exploración de

XUL solo hemos hecho uso de gestores

de composición y botones de pulsación.

Hay otros muchos componentes que

podemos usar, mirando primero los compo-

nentes HTML más comunes. Aprenderemos

estas etiquetas ejecutando un poco de

código:

01 <vbox>

02 <hbox>

03 <label value="Cuadroßß

04 de verificación"/>

05 <vbox>

06 <checkbox id="check1" label=U

07 "Primero"/>

08 <checkbox id="check2" label=U

09 "Segundo"/>

10 </vbox>

11 </hbox>

12 <hbox>

13 <label value="Botones de

Radio"/>

14 <vbox>

15 <radio id="radio1" label=U

16 "Primero"/>

17 <radio id="radio2" label=U

18 "Segundo"/>

19 </vbox>

20 </hbox>

21 <hbox>

22 <label value="Caja de Texto"/>

23 <vbox>

24 <textbox id="textbox"/>

25 </vbox>

26 </hbox>

27 <hbox>

28 <label value="Caja deU

29 Texto Multilínea"/>

30 <textbox id="multitextbox"U

31 multiline="true"/>

32 </hbox>

33 </vbox>

Con este código estamos componiendo una

serie de descripciones de componentes y su

correspondiente componentes. Estamos

usando la etiqueta <label> para indicar texto

en nuestra interfaz XUL. Usamos el atributo

<of> de esta etiqueta para contener el texto

que queremos mostrar en la etiqueta.

Nuestro primer tipo de componentes en

una cuadro de verificación. La creamos con

la etiqueta <checkbox> y usamos la etiqueta

atributo para indicar el texto al lado de la

caja. El segundo componente que usamos

es el botón radio, usando la etiqueta <radio>

de la misma manera que para crear el

componente anterior. Ahora creamos una

caja de edición de una sola línea. No hay

etiqueta asociada a esta caja por lo que

simplemente fijamos el atributo id dentro

de la etiqueta <textbox>. Finalmente

creamos una caja de texto multilínea. Con

este fin simplemente fijamos la variable

multiline = "true" (verdadero) a una caja de

texto normal.

Componentes tipo HTML

Page 77: Linux Magazine - Edición en Castellano, Nº 01

ta se comporta de la misma forma que la

etiqueta <hbox> pero muestra sus

componentes hijos (los componentes

entre las etiquetas <vbox> y

</vbox>) verticalmente. Si ponemos

un bloque similar debajo de nuestro

bloque <hbox> podemos ver como fun-

ciona. (H) en lo botones gestionados

horizontalmente y (V) en los verticales:

01 <hbox>

02 <button id="button1" label=U

03 "Primer Botón (H)"/>

04 <button id="button2" label=U

05 "Segundo Botón (H)"/>

06 </hbox>

07 <vbox>

08 <button id="button1" label=U

09 "Primer Botón (V)"/>

10 <button id="button2" label=U

11 "Segundo Botón (V)"/>

12 </vbox>

Las cosas se ponen realmente intere-

santes cuando intentamos combinar un

tipo de gestor de composiciones dentro

de otro gestor. Miremos el siguiente códi-

go por ejemplo:

01 <hbox>

02 <button id="button1"·label=U

03 "Primer Botón (H)"/>

04 <button id="button2" label=U

05 "Segundo Botón (H)"/>

06 <vbox>

07 <button id="button1" label=U

08 "Primer Botón (V)"/>

09 <button id="button2" label=U

10 "Segundo Botón (V)"/>

11 </vbox>

12 </hbox>

Aquí hemos puesto el gestor vertical

dentro de los botones gestionados hori-

zontalmente. Prestemos atención a como

hemos dispuesto el bloque vertical de

botones tras los componentes del bloque

horizontal. Debido a la posición de nue-

stros componentes deberíamos ver algo

parecido a lo que muestra la figura 3.

Una cosa a la que tenemos que estar

atentos cuando posicionemos nuestros

componentes es cómo el gestor maneja

el espacio. En nuestro último ejemplo se

ajustó el ancho de los botones horizon-

tales para acomodar el espacio necesario

para los botones verticales. Esto es

debido a que el gestor vertical fue anida-

do dentro del gestor horizontal afectando

los componentes horizontales.

Componentes ExóticosEl verdadero poder de XUL reside en la

forma en que puede eclipsar a HTML en

la forma de conseguir información del

usuario. Esta capacidad reside en la

forma en que podemos usar aplicaciones

de control GUI normales dentro del con-

cepto de la web. En el siguiente ejemplo

vamos a crear dos etiquetas, una con un

componente de edición de texto multi-

línea y la otra con un cajetín con una

lista desplegable. En este ejemplo, las

etiquetas y los cajetines no son típica-

mente usados en un entorno web.

Iremos avanzando paso a paso por este

ejemplo y escribiendo el código a medi-

da que progresamos.

Primero creamos un archivo nuevo

con la versión de XML, página de estilo y

etiquetas <window>, para luego añadir

las siguientes líneas:

<tabbox>

<tabs>

<tab label="Editor Textos"/>

<tab label="Lista"/>

</tabs>

Aquí hemos empezado creando un

nuevo componente que contiene solapas

(<tabbox>). Una caja de solapas con-

tendrá un número de solapas que a su

vez puede contener otros componentes.

Entonces abrimos la etiqueta <tabs>

para especificar los nombres de los sola-

pas en nuestra interfaz. Para cada solapa

usaremos la etiqueta <tab> para

especificar que etiqueta debe ser defini-

da. Nuestros solapas serán añadidos

desde la izquierda hacia la derecha en el

orden que los especifiquemos en XUL.

En este caso, la pestaña “Editor Textos”

será la pestaña de la izquierda y la pes-

taña “Lista” la de la derecha. Ahora ten-

emos que crear los paneles de la pes-

tañas. Lo hacemos creando primero una

etiqueta de paneles de pestañas gen-

erales:

<tabpanels>

Ahora creamos cada panel por turnos.

Primero creamos el panel de la caja de

texto. Para ello utilizamos la etiqueta

<tabpanel> para crear cada panel y

luego la rellenamos con otros compo-

nentes:

<tabpanel id="text">

<label value=ßß

"Escribe un poco de texto:"/>

<textbox id="textbox"U

multiline="true" flex="1"/>

</tabpanel>

El lector avispado se habrá dado cuenta

del atributo flex que se ha colado en el

código. Cuando este tiene un valor de 1

el componente se ajustará para ocupar

todo el espacio disponible. Para nuestro

segundo panel crearemos nuestra lista de

texto dentro del mismo panel. Usaremos

la etiqueta <listbox> para crear la caja

principal y luego usaremos la etiqueta

<listitem> para añadir cada cosa a la

caja.

<tabpanel id="listbox">

<label value="¿ColorU

Favorito?"/>

<listbox flex="1">

<listitem label="Rojo"/>

<listitem label="Azul"/>

<listitem label="Amarillo"/>

<listitem label="Verde"/>

77www.linuxmagazine.com.es Número 01

LINUX USERXUL

Figura 4: Uso de etiquetas y listados. Figura 5: Un interfaz XUL completa.

Page 78: Linux Magazine - Edición en Castellano, Nº 01

04 <menuitem label="Nuevo"/>

05 <menuitem label="Abrir"/>

06 <menuitem label="Guardar"/>

07 <menuseparator/>

08 <menuitem label="Salir"/>

09 </menupopup>

10 </menu>

Para crea el menú, primero usamos la

etiqueta <menu> para crear las

entradas del mismo y luego usamos

<menupopup> para crear el área

desplegable. Finalmente añadimos una

serie de elementos con etiquetas

<menuitem>. Ahora usamos el mismo

concepto para crear el menú Editar:

<menu id="editmenu" U

label="Editar">

<menupopup id="editpopup">

<menuitem label="Deshacer"/>

<menuitem label="Rehacer"/>

</menupopup>

</menu>

</menubar>

Con nuestros menús creados estamos lis-

tos para crear el área del interfaz princi-

pal. Si miramos la figura5 podemos

observar el resultado de nuestro interfaz

y como está construida. Tenemos un lis-

tado a la izquierda de la pantalla y las

pestañas a la derecha. Para gestionar

esta disposición primero necesitamos

abrir una etiqueta <hbox> y luego

crear el listado:

<hbox>

<listbox flex="1">

<listitem label="Rojo"/>

<listitem label="Azul"/>

<listitem label="Amarillo"/>

<listitem label="Verde"/>

</listbox>

Lo siguiente que vamos ha hacer es usar

un componente especial llamado splitter

para añadir una barra reajustable que

permita al usuario ajustar el componente

a la izquierda y a la derecha del divisor.

Usamos la etiqueta <splitter/> para

crear este componente:

<splitter/>

El siguiente montón de código es nuestra

familiar caja de etiquetas que contienen

etiquetas de edición de texto y listados

(ver listado 3). El código no es diferente

del ejemplo anterior. Finalmente cer-

ramos el gestor horizontal y la ventana:

</hbox>

</window>

ConclusiónEn la primera parte de nuestra serie

hemos cubierto bastante terreno. No

solo nos hemos lanzado pataleando y

gritando al mundo de los programas

XML y XUL, si no que además hemos

podido estudiar las etiquetas estilo

HTML, las etiquetas especiales, los

gestores de diseño, cajas de etiquetas,

menús y muchas cosas más. Con el

conocimiento que hemos desarrollado

hasta ahora tenemos la posibilidad de

crear interfaces XUL más o menos

grandes. Desde luego que hay muchos

más componentes que cubriremos en

otros números. El mes que viene partire-

mos del conocimiento de este numero y

lo haremos funcional. Usaremos las

capacidades de JavaScript de Mozilla y

las uniremos con XUL para conseguir

que nuestras interfaces interactúen con

el usuario. �

</listbox>

</tabpanel>

Finalmente cerramos el panel de etique-

tas y la caja de pestañas general:

</tabpanels>

</tabbox>

Podemos ver el interfaz completa en la

figura 4.

Interfaces completosPara acabar la primera entrega de progra-

mación XUL miraremos un interfaz XUL

de ejemplo completo. Este interfaz

incluirá parte del código que ya hemos

repasado al igual que algunos menús y

divisores reajustables. Iremos paso a

paso por todas las líneas del código para

asegurar que entendemos todo lo que

hemos tratado. Primero comenzaremos

con la definición de etiquetas en XML y

la creación de una ventana principal (ver

listado 2). Los primeros componentes

que añadiremos son algunos menús. Su

creación sigue el mismo principio que

hemos estado usando con anterioridad

creando etiquetas dentro de otras etique-

tas para construir los distintos elemen-

tos. Primero creamos una barra de menú

(la barra en la que el menú se asienta)

con una etiqueta <menubar>.

<menubar id="menubar">

Luego añadiremos un menú completo.

En este caso, el menú Archivo:

01 <menu id="filemenu" U

02 label="Archivo">

03 <menupopup id="file-popup">

78 Número 01 www.linuxmagazine.com.es

XULLINUX USER

01 <?xml version="1.0"?>

02 <?xml-stylesheet

03 href="chrome://global/skin/"

04 type="text/css"?>

05 <window

06 id="complete"

07 title="Ejemplo Completo"

08

xmlns="http://www.mozilla.org/

keymaster/gatekeeper/there.is.

only.xul>

Listado 2: Ventanaprincipal.

01 <tabbox>

02 <tabs>

03 <tab label="Editor Textos"/>

04 <tab label="Lista"/>

05 </tabs>

06 <tabpanels>

07 <tabpanel id="text">

08 <label value="Escribe algo de

texto:"/>

09 <textbox id="textbox"

multiline="true" flex="1"/>

10 </tabpanel>

11 <tabpanel id=listbox>

12 <label value="¿Color

Favorito?"/>

13 <listbox flex="1">

14 <listitem label="Rojo"/>

15 <listitem label="Azul"/>

16 <listitem label="Amarillo"/>

17 <listitem label="Verde"/>

18 </listbox>

19 </tabpanel>

20 </tabpanels>

21 </tabbox>

Listado 3: Tab box

Page 79: Linux Magazine - Edición en Castellano, Nº 01

Uno de los problemas principales

que nos planteamos los edu-

cadores cuando nos vemos ante

la disponibilidad de ordenadores en un

aula es que, aunque adivinamos que las

posibilidades que se nos ofrecen son

enormes, se nos hace manifiesta nuestra

ignorancia sobre herramientas y recursos

que nos permitan una explotación

pedagógica eficaz y creativa. Y esto

ocurre tanto si se trabaja con software

privativo como si es software libre; pero

en este caso además no contamos con el

colchón psicológico de lo conocido y las

inercias nos hacen aferrarnos a solu-

ciones que, trataré de demostrarlo, no lo

son nunca a medio plazo: la experiencia

demuestra que la mejor herramienta pri-

vativa ata al usuario a la cadena de actu-

alizaciones de versiones de la aplicación

y impide su participación en desarrollos

que se reciben de forma pasiva. A veces

se nos olvida que únicamente el software

libre es nuestro y que podemos colaborar

en la corrección de los errores y deficien-

cias que evidentemente tiene.

Esta sección tiene como objetivo pre-

sentar herramientas y aplicaciones libres

de uso educativo. Evidentemente

cualquier aplicación, un editor de textos

o un programa para dibujar, puede ser

una aplicación educativa, quizás la más

útil; la clave está en encontrar los enfo-

ques y las metodologías para que su uti-

lización tenga sentido pedagógicamente.

Nos centraremos sin embargo en los pro-

gramas específicamente educativos por

la sencilla razón de que son menos cono-

cidos. Por supuesto que consideramos

esencial escuchar las sugerencias,

comentarios y críticas de los lectores.

Pretendemos que sea una sección clara y

útil; al plantearnos el criterio de orde-

nación (podíamos haber seguido una

clasificación por materias, o por niveles

educativos) hemos pensado que

debíamos regirnos por la urgencia. En

este sentido hemos pensado que

debíamos comenzar por hablar de WIMS

porque es una herramienta que responde

a una demanda presente en los Centros

educativos.

¿Qué es WIMS?Aunque tenga nombre de herramienta

para matemáticos, o la documentación lo

presente como un servidor de ejercicios

interactivos, WIMS es la navaja suiza de

las aplicaciones educativas: una platafor-

ma que permite crear clases virtuales,

cumple también la función de compartir

y almacenar cientos de ejercicios y es

incluso un entorno de generación de

exámenes, evaluación y seguimiento del

progreso del alumno y de una clase. En

Estrenamos esta sección (un saludo a los lectores) presentando una aplicación

de nombre un poco intimidatorio, el Web Interactive Mathematical Server,

WIMS. Pero que nadie se asuste, nuestro objetivo en estas páginas es

demostrar lo fácil que es de utilizar y lo sumamente útil que puede llegar a ser

en un aula. POR JUAN RAFAEL FERNÁNDEZ

El servidor interactivo de actividades matemáticas WIMS

La navaja suiza de lasaplicaciones matemáticas

79www.linuxmagazine.com.es Número 01

LINUX USEREducación

Figura 1: Página principal de un servidor WIMS Figura 2: Actividades para el nivel H3

Page 80: Linux Magazine - Edición en Castellano, Nº 01

puede utilizarlo o contribuir, es que

respeta los estándares definidos por los

creadores de la web (el consorcio W3C)

y por tanto funciona con cualquier nave-

gador, en cualquier sistema operativo.

WIMS lo creó y lo desarrolla Gang

Xiao, un profesor de matemáticas chino

que enseña en la Universidad de Niza,

Francia; tiene licencia libre (GPL).

Georges Khaznadar ha preparado paque-

tes binarios para Debian y contribuye

decisivamente a su documentación y

divulgación. Existe una red de servidores

WIMS por todo el mundo, y recopila-

ciones de ejercicios y actividades de

licencia libre. La velocidad de desarrollo

y de incorporación de módulos y traduc-

ciones es muy rápida: mientras escribo

este artículo se ha pasado de la versión

3.42 a la 3.44, y probablemente cuando

esté en los quioscos la versión sea otra.

En el cuadro 1 se pueden leer noticias

sobre la traducción de las actividades.

Las posibilidades de utilización de

WIMS escapan al espacio disponible en

esta sección. En este primer artículo

vamos a realizar un repaso general de

sus capacidades y de las actividades

disponibles, con algunos ejemplos de

uso; expondremos primero cómo puede

utilizarse en remoto y detallaremos

después cómo se instala en un orde-

nador. En el próximo número trataremos

la creación de una clase virtual, de

actividades nuevas con Createxo y Mod-

tool y lo que en la terminología de WIMS

se conoce como documentos y cursos.

Conectarse a un servidorPara probar WIMS no hace falta instalar-

lo en nuestro ordenador: bastan una

conexión a Internet y un navegador.

este sentido puede revolucionar la

dinámica de los controles de un Centro

educativo; como explica Gang Xiao, no

es necesario que a todos los examinan-

dos se les haga las mismas preguntas

ocultas hasta ese momento, simultánea y

sincronizadamente, vigilando que no se

copien. Porque WIMS permite generar

un conjunto enorme y redundante de

preguntas, de manera que a cada exami-

nando se le asigne aleatoriamente un

subconjunto equivalente a los otros sub-

conjuntos. Sólo así se logra la objetivi-

dad en la selección de preguntas que se

le hace a cada alumno[2].

Y las actividades no tienen que ser de

matemáticas o química, comprobaremos

que con WIMS podemos crear activi-

dades de conocimiento del medio o de

idiomas. Otra gran ventaja de WIMS,

además de ser libre y de que cualquiera

80 Número 01 www.linuxmagazine.com.es

EducaciónLINUX USER

Hay tres maneras de instalar WIMS: instalar

el paquete tar.gz preparado por Xiao, los

paquetes incorporados a Sid (la versión

inestable de Debian) o las versiones experi-

mentales preparadas por Georges Khaz-

nadar. Examinemos las ventajas e inconve-

nientes de cada opción.

Podemos descargar de http://wims.unice.fr/

download/wims el código fuente del servi-

dor y las aplicaciones. Las líneas siguientes

ejecutadas desde una terminal bastarán:

wget

http://wims.unice.fr/download/U

wims/wims-3.44.tgz

wget

http://wims.unice.fr/download/U

wims/wims-modules-en-3.44.tgzU

wget

http://wims.unice.fr/download/U

wims/wims-modules-fr-3.44.tgzU

wget

http://wims.unice.fr/download/U

wims/wims-modules-en-3.44.tgz

Tenemos instrucciones sobre cómo compilar

e instalar la aplicación en http://wims.unice.

fr/download/wims/README.También se nos

ofrece la opción de descargar la versión 3.42

compilada junto con sus dependencias prin-

cipales (aviso: son 65 megas)

wget http://wims.unice.fr/U

download/wims/wims-chroot-i386-U

3.42.tgz

La ventaja de utilizar las fuentes es que

estaremos ante la versión actualizada por el

autor; el inconveniente, que anula a mi pare-

cer la ventaja, es que nos enfrentamos al

problema de dar respuesta a la cadena de

dependencias que una aplicación tan imbri-

cada como esta presenta; deberemos ser

nosotros los que instalemos las aplicaciones

a las que llama, en la versión apropiada.Y

debemos decidir un poco a ciegas qué

paquetes caen bajo los conceptos de

‘recomendados’,‘sugeridos’o son ‘dependen-

cias’cuya ausencia harán que el programa

simplemente no funcione. Para resolver este

problema las distribuciones han creado sus

sistemas de gestión de paquetes. Utilicé-

moslos.

Para arquitecturas i386 hay paquetes rpm

disponibles en http://wims.unice.fr/

download/rpms/.

La versión para Sid se instalaría así

(suponemos que está actualizada la base de

datos de aplicaciones):

apt-get install wims

wims-modules-esU

wims-modules-en wims-modules-fr U

gap yacas octave povray

latex2html

A estas alturas y hasta que se remedie es

altamente aconsejable instalar los paquetes

de módulos franceses e ingleses, salvo que

resulten irremediablemente ininteligibles, o

bien sepamos italiano, chino u holandés o

queramos aprenderlos por este drástico

método. He añadido a la línea paquetes que

figuran como sugeridos o recomendados

pero que son altamente aconsejables para

aprovechar la potencia de WIMS.

El problema de la versión para Sid es que nos

encontramos (como tantas veces, en Debian

suele prevalecer el principio de estabilidad

frente al de actualidad hasta en su versión

inestable) ante un paquete en parte roto[4] y

anticuado: entre las versiones 4.36 y la 4.40

Xiao emprendió una reestructuración gener-

al de las actividades y suprimió gran número

de módulos[5]; la consulta del registro de

cambios confirma que es muy aconsejable la

actualización.

Los que deseen profundizar en el uso de

nuestra aplicación deberán añadir la línea

deb ftp://developer.ofset.org

sarge main

a su fichero sources.list. Si se había instalado

la versión 3.28 conviene que se la elimine

(tras guardar las aportaciones locales)

porque el árbol de dependencias ha variado

y se dan incompatibilidades entre las dos

versiones. Ahora el ya ritual apt-get update

nos permite ejecutar

apt-get install wims-serverU

wims-physics wims-modules-enU

wims-modules-fr wims-older-esU

wims-older-en wims-older-frU

gap yacas octave povray

latex2html

Fijémonos en que el paquete wims ha pasa-

do a ser un paquete virtual y roto en estos

momentos (no puede instalarse y ha sido

sustituido por wims-server). Recordaremos

también la reestructuración de módulos que

había realizado Gang Xiao y que ha llevado a

Khaznadar a recuperar las viejas actividades

en paquetes aparte.

Cuadro 2: instalación de WIMS

Page 81: Linux Magazine - Edición en Castellano, Nº 01

Podríamos utilizar alguno de los espejos

españoles, pero vamos a conectarnos

con el servidor principal para estar

seguros de contar con la versión más

actualizada, y seleccionaremos la inter-

faz en español pinchando en la bandera

española.

Tecleamos http://wims.unice.fr/wims/

fr_home.html en nuestro navegador y

obtenemos una página similar a la de la

figura 1, salvo que en francés. Aparecerá

al pie de página la versión (3.45a es la

versión actual, al 5 de noviembre) y la

fecha de compilación. Tras seleccionar el

español como idioma (podemos elegir

además inglés, francés, chino o

holandés) lo primero que nos llamará la

atención probablemente es la mezcla de

lenguas. Porque, y es una peculiaridad

de la aplicación, nos aparecen todas las

versiones de cada módulo, en todas sus

traducciones.

Pero vamos a explorar la interfaz. Nos

fijaremos primeramente en el menú de

opciones situado sobre las banderas,

donde vemos que podemos acceder a

páginas de ayuda, configurar preferen-

cias, etc. También podemos ver una línea

de enlaces dedicados a la creación y uti-

lización de clases virtuales. Pero en este

momento nos interesa sobre todo el bus-

cador de actividades. Como las cosas se

comprenden con un ejemplo, aquí va

uno.

Ejemplo de uso matemáticoAunque decíamos que no hace falta ser

matemático para sacarle partido a

WIMS, está hecho por un matemático y

se nota. WIMS incluye una interfaz a

aplicaciones matemáticas (PARI, Maxi-

ma, Octave, Yacas, GAP[3]) que permite

utilizarlas directamente. Y la mayor

parte de los ejercicios y actividades los

han creados profesores universitarios de

matemáticas. Afortunadamente ni son

todos ni tienen porqué serlo.

Comenzaremos por aprender a usar el

buscador. Lo primero que nos llamará la

atención son las categorías en que están

clasificadas las actividades: ‘Actividades

wims‘ (módulos completos de activi-

dades), ‘Lecciones y referencias‘ (el nom-

bre no miente), ‘Calculadores‘ (traduc-

ción de ‘Online calculators‘, ‘herramien-

tas de cálculo en línea’ en las palabras de

los franceses), ‘Ejercicios interactivos‘,

‘Recreativas matemáticas‘ y lo que recibe

la extraña traducción de ‘Ejercicios reser-

vada‘ y que no son más que ejercicios

simples creados en el formato OEF

(Online Exercise Format, donde el ‘reser-

vada’ es una mala comprensión de ‘clas-

sified’) con la herramienta de WIMS cre-

atexo. Advierto que en la interfaz inglesa

aparecen además ‘Quick popup tools’ y

‘Sheets of exercises’. Seleccionamos

cualquiera de las categorías y dejando el

cuadro de texto en blanco nos apare-

cerán todas las actividades clasificadas

por orden de popularidad.

Podríamos buscar por tipos de acti-

vidad (es muy llamativo ver los ejer-

cicios interactivos, con animaciones

que lamentablemente no pueden pre-

sentarse en el formato papel de esta

revista) o por palabras clave pero vamos

a aprender a buscar por niveles edu-

cativos. La tabla 1 nos permitirá com-

prender la clasificación de Gang Xiao de

los niveles educativos, que no corre-

sponde exactamente con los niveles

españoles.

Vamos a buscar actividades para

bachiller, digamos nivel H3. Pondremos

en el buscador la cadena ‘levelH3’. La

salida de la figura 2 nos muestra que el

sistema encuentra cincuenta actividades;

elegimos para examinarla una actividad

en español, ‘Sistemas lineales 2x2’, y se

nos presenta una página que nos permite

configurar la actividad. Pinchamos en ‘Ir

al trabajo’ y el motor de generación nos

proporciona aleatoriamente un ejercicio;

incluso podemos cambiarlo por otro

equivalente. El que ha aparecido, figura

3, en esta ocasión está parcialmente tra-

ducido. Una cuestión es importante en

este momento: la solución del ejercicio

se hará con papel y lápiz, que no van a

ser sustituidos por la tecnología; ésta se

utiliza para almacenar y seleccionar al

azar actividades de carácter equivalente.

Y para crearlas.

81www.linuxmagazine.com.es Número 01

LINUX USEREducación

E1 … E6, N cursos de Educación Primaria + Primer ciclo de Secundaria

H1 … H6, N cursos del Segundo Ciclo de Secundaria + Bachiller (la sigla corresponde a High School)

U1 … U4, N cursos de Universidad (Undergraduate)

G, Graduate: Licenciado, con o sin el grado de licenciatura

R, Research, nivel de investigador

Tabla 1: Niveles educativos en la clasificación de Gang Xiao

Figura 3: Ejercicio de sistemas lineales Figura 4: Ejercicio sobre la tabla periódica

Page 82: Linux Magazine - Edición en Castellano, Nº 01

local es la velocidad de acceso y reacción

del sistema (importante si los cálculos

que deberán efectuarse no son elemen-

tales); pero el argumento fundamental es

la posibilidad de utilizar una de las

capacidades fundamentales de WIMS: la

creación de clases y la perspectiva que

abre de seguimiento de los progresos de

los alumnos.

El cuadro 2 nos detalla cómo realiza la

instalación de la aplicación. El servidor

WIMS funciona en GNU Linux y en Mac

OS-X. Aunque puede actuar como una

aplicación independiente, lo habitual es

integrarlo en el servidor web apache.

WIMS para profesores deletras

Hasta este punto del artículo nos hemos

movido en el campo de lo técni-

co o lo científico-matemático.

Pero asegurábamos en la pre-

sentación que nos encon-

trábamos ante una aplicación de

múltiples aprovechamientos;

sólo la inercia y la falta de imagi-

nación pueden explicar que no

busquemos nuevas formas de

explotar sus posibilidades.

Como la imaginación se nos

supone, como el valor al recluta,

y hay que cumplir las promesas,

mostraremos ejemplos que

pueden adaptarse inmediata-

mente a la enseñanza primaria o

al aprendizaje de idiomas.

Hablábamos de que había que

comenzar por crear los índices:

fácil, con la condición (lógica, si

estamos instalando software) de

que hay que tener permisos de root para

leer /usr/lib/wims/tmp/log/.wimspas-

sone: pinchar en ‘WIMS online site

maintenance’ e introducir la contraseña

de un solo uso generada por el sistema

(para comprobar que tenemos los per-

misos necesarios) en el recuadro. Nos

aparecerá la imagen 6. Interesa la opción

‘Rebuild resource index’; tras un aviso

lógico de que durante la (re)creación de

los índices el servicio quedará suspendi-

do podemos proceder; la terminación del

proceso quedará señalada por el envío

de un correo al administrador (config-

urable en la página de administración).

Es el momento de hacer una pequeña

comparación con las herramientas de

autor con las que estamos más familiar-

izados; hemos visto que WIMS permite

la creación de tests de respuesta

única o múltiple (o infinitas;

Khaznadar pone los siguientes

ejemplos: hallar dos enteros rela-

tivos de suma 0, con las solu-

ciones (0,0), (-1,1), (-2,2)…, o

bien dar n ejemplos de expre-

siones matemáticas que sean

equivalentes a 0); también es

posible crear ejercicios de rel-

lenar recuadros, o de ordenación

de puzzles (en la categoría de

‘Recreativas matemáticas’ ten-

emos dos ejemplos, ‘Shifting

puzzle’ y ‘Q-Puzzle’, donde el

movimiento de las piezas está

vinculado a fórmulas matemáti-

cas), de relacionar etiquetas e

Utilización en física yquímicaGeorges Khaznadar es profesor

de física y química. ¿Por qué no

vemos qué utilidad puede

encontrar en WIMS un profesor

de química?

Para ello vamos a buscar la

cadena ‘química’ en el buscador.

Desgraciadamente no devuelve

ningún resultado; después busco

‘chimie’ y aparecen tres módu-

los en francés; tecleo ‘chemistry’

y el número de hallazgos sube a

seis. Examinemos (lo siento, por

ahora en inglés) ‘OEF periodic

table’: averiguamos que se trata

de un módulo de 32 ejercicios

configurables que tiene por

objeto memorizar la tabla per-

iódica. Elijo las opciones por

defecto y la opción ‘Click on table’

(teclear en la tabla). Dejo al amable lec-

tor la duda de si en la escena de la figura

4 hemos pinchado en la casilla errónea a

propósito.

Para demostrar que WIMS no es una

aplicación de sólo texto, sino que puede

utilizar y que genera al vuelo imágenes y

gráficas, introducimos a continuación

‘physics’ en el buscador y elegimos ejer-

cicios de óptica: ‘OEF Optique’. En la

figura 5 podemos ver una respuesta

incorrecta y su corrección.

Utilización local: ¿nosconviene instalar WIMS?Cuando hablamos de una utilización

local nos estamos refiriendo a la insta-

lación de WIMS en una máquina de una

red local que hará de servidor

para toda la red. La utilización

local frente a la remota tiene evi-

dentemente sus ventajas e

inconvenientes y el usuario

deberá sopesarlas en función de

sus necesidades y del uso pre-

visto; por un lado la disponibili-

dad inmediata de los servidores

WIMS ya instalados y la lib-

eración de tiempo y de preocu-

paciones de instalación, man-

tenimiento y actualizaciones

debe cotejarse con la oportu-

nidad de instalar y/o crear

(sólo) las actividades que nos

interesen localmente. Otro argu-

mento a favor de una instalación

82 Número 01 www.linuxmagazine.com.es

EducaciónLINUX USER

Figura 5: Ejemplo de ejercicio de óptica

Figura 6: Página de administración en línea de WIMS

Page 83: Linux Magazine - Edición en Castellano, Nº 01

imágenes mediante el uso del ratón

(‘Arithmetic Tables’ o ‘EOF Flags’, donde

hay que asignar a un país su bandera); o,

mediante el uso de java y javascript,

cualquier tipo de ejercicio interactivo

(ver ‘Elliptic billard’ o ‘Moving Comet

Shoot’). La limitación de espacio nos

impide recoger los ejemplos citados,

pero animamos al lector a que visite

cualquier servidor y los evalúe; insisto

especialmente en que ejercicios como

‘EOF Flags’ o una variación de él son

perfectamente utilizables en primaria y

primeros años de secundaria.

Un último ejemplo nos está permitido.

Ahora la ausencia de traducciones va a

ser una ventaja: un idioma se aprende en

ese idioma, del mismo modo que a tocar

la guitarra se aprende tocando la guitar-

ra. Podemos encontrar un ejercicio (no

muy imaginativo, es verdad) para la

enseñanza del francés (se llega a él bus-

cando conjugaison o verbes y se llama

‘OEF Conjugaison’) y otros ejercicios ele-

mentales que pueden utilizarse en otros

niveles traducidos o tienen un valor

comunicativo evidente si se usan sin tra-

ducir (estoy pensando en ejercicios

como ‘OEF Clock’).

Como podemos ver en la figura 7 ten-

emos gran flexibilidad a la hora de elegir

verbos y tiempos que conjugar; la figura

8 nos muestra un ejemplo de uso. Cómo

podemos adaptar este ejercicio, cómo

podemos crear nuestra propias activi-

dades, es material para el siguiente

número.

ConclusiónEn este primer capítulo dedicado al soft-

ware educativo, hemos hecho un repaso

general de las capacidades de WIMS y

comprobado que puede utilizarse en

multitud de circunstancias; también

hemos aprendido a instalarlo si lo con-

sideramos adecuado. En el próximo

número aprenderemos a crear clases vir-

tuales y a desarrollar nuestras propias

actividades, y aprenderemos algunos

detalles de uso avanzado.

Hasta pronto. �

83www.linuxmagazine.com.es Número 01

LINUX USEREducación

Figura 7: Configuración del ejercicio de conjugación Figura 8: Ejemplo de ejercicio de idiomas Kuadros.

End User Licence Agreement, Acuerdo deaceptación de la licencia por el usuario final.La lectura detallada de cualquiera de ellos esmuy instructiva sobre cómo el software priv-ativo limita los derechos de los usuarios.

El desarrollo del razonamiento y lademostración en términos matemáticospuede seguirse en On Public-Question Tests,de Gang Xiao, mayo de 2004 (http://wims.

unice.fr/paper/pqt.pdf). En sus términos unpublic-question test es una prueba cuyas pre-guntas pueden publicarse previamente a surealización.

PARI es un sistema muy utilizado de álgebracomputacional creado para optimizar los cál-

culos en teoría de los números (factoriza-ciones, teoría algebraica de los números, cur-vas elípticas…) y que incluye funciones parael cálculo con otras entidades matemáticascomo matrices, polinomios, etc. Su uti-lización en un ejercicio creado con WIMS estrivial, veamos un ejemplo recogido de laFAQ (http://wims.auto.u-psud.fr/wims/faq/

fr/logiciel.html.También se presentan ejem-plos de utilización de las otras aplicaciones.):

\text{f = pari(factor(20! + 1))}

Maxima es un sistema de álgebra computa-cional muy completo y de código libre, quepermite la manipulación simbólica de poli-nomios, matrices, funciones racionales… Se

podría decir que es útil en la simplificación ynormalización de expresiones formales.

Octave es un lenguaje de alto nivel (compat-ible con Matlab) creado para el cálculonumérico.Yet Another Computer AlgebraSystem (Yacas) es un lenguaje de álgebracomputacional muy flexible y con una sin-taxis muy similar a la de Mathematica. El sis-tema Groups, Algorithms and Programming(GAP) está especializado en la teoría de losgrupos.

El paquete wims_3.28-6.1 no ha pasado aSarge porque una de sus dependencias,texgd, tiene un error crítico (a release critical

bug en la jerga de Debian).

GLOSARIO

[1] El sitio web canónico de WIMS es http://

wims.unice.fr. Allí podemos encontrar las

fuentes del programa, módulos, docu-

mentación…

[2] Existen live-CDs (CDs vivos, de esos que

funcionan directamente desde el CD sin

tener que instalar los programas en el

disco duro) con WIMS, por ejemplo

KNOWIMS (http://wims.unice.fr/

knowims/).

[3] En el repositorio experimental de la

Guadalinex 2004 disponemos de la ver-

sión 3.28, pero podemos descargar los

paquetes .deb de prueba de la versión

3.40, de developer.ofset.org.

[4] El documento más completo para apren-

der a manejar WIMS es El libro de WIMS,

de Georges Khaznadar. Está traducido al

español: http://libro-wims.software-libre.

org.

RECURSOS

Page 84: Linux Magazine - Edición en Castellano, Nº 01

84 Número 01 www.linuxmagazine.com.es

grepLINUX USER

en la línea de comandos y grep nosmostrará los pasajes apropiados delarchivo. Si la búsqueda contiene espaciodebemos utilizar comillas. Por ejemplo:

grep "Jardín del Edén"

biblia.txt

Debemos prestar atención y esperarfallos cuando usemos caracteres espe-ciales: *, ? y ! tienen un significadoespecial para la línea de comandos.Otro grupo de caracteres (., *<C>,

^<C>, $ y \) no se interpreta porgrep tal cual. En su lugar, la her-ramienta supondrá una expresión reg-ular. El lado positivo es que esto nospermite construir búsquedas muypotentes y complejas, si bien es posi-ble que prefiramos evitar estos carac-teres con grep hasta que nos sinta-mos a gusto con la herramienta.

Si no sabemos que archivo contieneel texto que buscamos, podemos eje-cutar grep con un comodín. La obra"Moby Dick" de l autor HermanMelvilla está compuesta de una colec-ción de archivos de texto.

grep blanco moby.*

nos mostrará todas la veces que la pal-abra blanco aparece en la obra maestrade Melville (ver figura 1). El asteriscosignifica “cualquier grupo de letras”. Elinterfaz cambiará esta expresión por elnombre de cualquier archivo en el direc-torio actual que empiece por los carac-teres moby..

Si los archivos en los que deseamosbuscar están distribuidos por diversosdirectorios debemos añadir la opción rpara indicarle a grep que busque en unacarpeta completa:

grep -r blanco Melville/obras/

buscará blanco en el directorio obras yen los subdirecorios que cuelguen de él.

Las cosas que no seamos capaces de

recordar las debemos guardar en

nuestro ordenador, reza una máx-ima del usuario informático.Ésta no es una mala idea, pero, a diferen-cia de lo que ocurre con la memoriahumana, que normalmente recuperará lainformación almacenada de formafidedigna (excepto en los exámenesfinales, por supuesto), no siempre es tanfácil encontrar información en nuestrodisco duro. Podemos perder muchotiempo en encontrar un archivo del quehemos olvidado su nombre o dónde fuealmacenado. Incluso el saber exacta-mente que archivo contiene lainformación que buscamos puede ser depoca ayuda en caso de archivos de textograndes.

El comando del shell grep, que localizacadenas de texto en ficheros es útil enambos casos. En la situación más simple,podemos ejecutar grep con la tecla debúsqueda y el archivo a buscar. grep nosmostrará todas las líneas en el archivoespecificado que contengan el texto bus-cado. Imaginemos que deseamos buscaren el archivo biblia.txt el texto “Jardíndel Edén”. Debemos escribir

grep Edén biblia.txt

Los eruditos de la Edad Media hubiesen vendido sus almas a

cambio de la ingente cantidad de literatura que abunda

actualmente en Internet. En la actualidad, los documentos

desordenan nuestros discos duros debido a las descargas

indiscriminadas. ¿Cómo encontramos exactamente un

pasaje de un texto en nuestra base de datos digital? El

comando del shell grep nos puede ayudar a encontrar esa cita

escurridiza. POR ELISABETH BAUER

Búsqueda de archivos de texto con grep

De Cacería en el Disco Duro

Comando Acción

grep patrón fichero búsca en un archivo un patrón

grep patrón *.htm busca en todos los archivos en

un directorio que acaban con el

sufijo .htm

grep -r patrón realiza una búsqueda recursiva

directorio en un directorio y sus subdirectorios.

grep -i patrón ignora la diferencia entre

fichero mayúsculas y minúsculas.

grep -A n muestra las siguientes n líneas tras

la línea que contiene la búsqueda.

VISIÓN GENERAL DE GREP

Page 85: Linux Magazine - Edición en Castellano, Nº 01

85www.linuxmagazine.com.es Número 01

LINUX USERgrep

El Trio: ps, grep y kill.grep no es sólo útil para búsquedas detexto filosóficos y teológicos, si no quepuede ser combinado con otros coman-dos del shell. Si la respuesta de uncomando produce mucho texto, grep

puede ser utilizado escribiendo tras lainstrucción el carácter “|” y grep

texto_a_buscar para filtrar el resultado ymantener solo las partes en las que esta-mos interesados. Un caso típico es en elque usaríamos grep para cerrar un pro-grama que se ha bloqueado.

El comando ps ax nos muestra los pro-cesos activos. Podemos usar grep paraaplicar un filtro y encontrar solo el pro-grama que estamos buscando, Mozillapor ejemplo:

> ps ax | grep mozilla

2500 ? S 1:40 /usr/lib/ßß

mozilla-1.3/mozilla-bin

5645 pts/4 S 0:00 grep mozilla

grep nos muestra dos coincidencias quecontienen Mozilla: el buscador y el pro-pio grep. La parte que nos interesa paracerrar el programa aparece al principiode cada línea: el ID del proceso. Ahorapodemos escribir kill 2500 para cerrar elprograma deseado.

Debido a que los gurús del shell suelenser notablemente perezosos, necesita-mos encontrar un método para no tenerque escribir este comando cada vez quelo requiramos: en otras palabras, necesi-tamos un alias. Los alias definidos debenser guardados en el archivo .bashrc en eldirectorio raíz. Este archivo se ejecutacada vez que abrimos un shell decomandos interactivo. Usaremos nuestroeditor de texto favorito para abrir elfichero, por ejemplo kwrite ~/.bashrc &

o vi ~/.bashrc en el escritorio, dependi-endo de nuestras preferencias. Debido aque vi no es sencillo, veamos algunoscomandos simples. Si escribimos G leindicamos a vi que debe ir al final delarchivo. Entonces podemos escribir o

para cambiar el editor al modo de intro-ducción de datos. A diferencia de loscomandos a y i, o indica a vi que inicie lainserción en la línea donde está situadoel cursor.

Ahora podemos introducir nuestroalias en la última línea de .bashrc. Enlugar de pss podemos usar cualquier otronombre fácil de recordar pero evitandousar el nombre de un comando exis-tente:

alias pss="ps ax |ßß

grep"

Ahora presionamos [Esc] ZZ o[Escape]:wq para almacenar el archi-vo y salir de vi. Para utilizar nuestronuevo alias en el shell, necesitamosanalizar sintácticamente el archivo deconfiguración. Para hacerlo debemosescribir:

. ~/.bashrc

Ahora podemos usar el comando pss

nombreprograma para buscar un progra-ma activo.

Libro de Direccionesgrep es tremendamente flexible. Una demis aplicaciones favoritas para grep esun sencillo libro de direcciones.

Todo lo que necesitamos son loscomandos grep, alias y cat y un ficherode texto donde podamos almacenar losnombres, números de teléfono y lasdirecciones de correo electrónico y decorreo ordinario de nuestros amigos,conocidos y parientes. Una entradapuede ser como:

Charly Pingüino

+12345 678

[email protected]

C/del Polo Sur

Villatux, Antártica

Ahora debemos salvar el archive comodirecciones en nuestro directorio raíz yañadir el siguiente alias a .bashrc:

alias tel="cat ~/direcciones |ßß

grep -i -A 4"

El comando cat nos muestra el contenidodel archivo direcciones. El carácter |

envía este resultado a grep. La opción -igarantiza que la búsqueda no diferencia-rá entre mayúsculas y minúsculas.Finalmente, -A 4 indica a grep que debemostrar las 4 líneas siguientes a laprimera coincidencia con la búsqueda.

De nuevo

. ~/.bashrc

analizará sintácticamente de nuevonuestro archivo de configuración. En elfuturo, solo necesitaremos escribir tel

nombre en el shell para recuperar la dirección de la persona que busque-mos. �

Figura 1: El libro “Moby Dick” de Melville está subdividido en una serie de archivos de texto. El comodín

“moby.*” indica a grep que busque en todos los archivos del directorio.

Page 86: Linux Magazine - Edición en Castellano, Nº 01

dades que vamos cometiendo. Si no

queréis complicaros la vida, ignorad a

los puristas.

El primer documento LaTeXLo primero es tener LaTeX instalado para

hacer todas las pruebas que vamos

sugiriendo y las que se os ocurran.

LaTeX y Linux se llevan bien, de hecho,

LaTeX nació en el mundo Unix, la especi-

ficación es pública y la mayoría de las

distribuciones son de código abierto. Por

lo tanto, es muy posible que LaTeX ya

esté en el sistema. Para estar seguros

hagamos una prueba. En la línea de

comandos escribimos:

$ latex

This is TeX, Version ...

**

Si al ejecutar el programa latex sale algo

parecido a lo de arriba, ya podemos

pasar directamente a probarlo. Para salir

del prompt con los dos asteriscos, sim-

plemente pulsaremos Ctrl-C. Si no ten-

emos Latex instalado, podemos instalar-

lo desde el CD de nuestra distro favorita

mediante un programa de gestión de

software, ya sea rpm, Kpackage o

cualquier otro. Como último recurso, se

puede descargar de la Comprehensive

Tex Archive Network [1] o del mirror

español en [2]. Aquí encontraremos la

distribución teTex, que es la más

portable de las distintas que existen.

También podemos encontrar en CTAN

[3] alguna documentación sobre Latex,

la mayoría en formato… Latex. Esto es

uno de los principales problemas de

Latex: en general, la ayuda es bastante

Es difícil entender hoy en día el

impacto que suponía para un autor

ver su obra impresa. LaTeX es el

moderno sustituto del maestro tipógrafo.

Con un ordenador personal y una impre-

sora, podemos obtener resultados con el

mismo aspecto profesional que propor-

ciona una imprenta, tanto si escribimos

un libro de 700 páginas como si hacemos

un trabajo escolar que incluye gráficos y

fórmulas matemáticas. En lo que sigue,

daremos algunas razones por las que

resulta preferible utilizar LaTeX en lugar

de un programa de autoedición o un

procesador de textos. Nuestro objetivo es

que todos seamos capaces de obtener

resultados brillantes con LaTeX lo antes

posible (veréis que no es tan difícil) y

posiblemente algún purista de LaTeX se

moleste en señalar todos las irregulari-

Actualmente, todo el mundo tiene ordenadores personales e incluso el usuario más principiante sabe lo que es un

procesador de textos. Pero todo aquél que escribiera un libro en el periodo, digamos, de 1455 a 1985, elaboraba un manu-

scrito que luego mandaba “a imprenta”. La imprenta era un lugar misterioso de donde, por arte de magia, aparecía un

ejemplar impreso donde antes sólo había un montón de cuartillas emborronadas. POR MIGUEL ATENCIA

LaTeX bajo Linux

Tipografía Profesionalpara Todos

86 Número 01 www.linuxmagazine.com.es

LaTeXLINUX USER

Figura 1: Aspecto de un documento básico en Latex. Los márgenes y tipos de

letra están ya ajustados a una presentación profesional

Figura 2: Aspecto de un documento básico en OpenOffice. El resultado es

menos profesional

Page 87: Linux Magazine - Edición en Castellano, Nº 01

pobre. Con la distribución teTex se pro-

porciona una ayuda muy básica, en for-

mato info, que puede verse ejecutando

info latex. Existen excelentes libros sobre

Latex en cualquier librería especializada

pero no es imprescindible comprarse un

libro para obtener resultados brillantes

en Latex.

LaTeX no tiene interfaz de usuario, ya

que no es un programa interactivo, sino

que se ejecuta desde la línea de coman-

dos. Esto será muy fácil de entender para

el que haya programado en algún

lenguaje (no en un entorno visual):

LaTeX es como un compilador. Por tanto,

prepararemos el documento LaTeX en

nuestro editor preferido. Algunos edi-

tores tienen facilidades que ayudan a la

escritura de documentos LaTeX. Por

ejemplo, si se usa el entorno gráfico

KDE, Kate reconoce los comandos LaTeX

(aunque no todos) y los representa con

distintos colores. De esta forma,

podemos detectar errores de sintaxis

antes de “compilar”. También se

recomienda vim, con la ventaja de que

funciona incluso sin entorno gráfico.

Muchos intrépidos utilizan emacs o

Xemacs, por las posibilidades de person-

alización que tienen. Si alguien tiene la

desgracia de verse obligado a utilizar

Windows, la mejor combinación es el

editor WinEdit (de pago, aunque muy

barato) con la distribución MiKTeX. Si

estamos acostumbrados a un procesador

de textos, tal como el de OpenOffice,

podemos seguir usándolo tranquila-

mente y disfrutar de las facilidades

habituales (el corrector ortográfico, el

sistema de autocompletado, etc.). Eso sí,

hay que guardar el documento como

texto plano y se perderá cualquier forma-

to que se introduzca.

Ya estamos preparados para el primer

documento Latex, que será el embrión

de nuestra gran obra, el best-seller con

que nos haremos famosos. Escribamos

en el editor el siguiente texto:

\documentclass[a4paper]{book}

\begin{document}

Hola, mundo

\end{document}

Al que sea totalmente inexperto en

Latex, le recomiendo copiarlo con cuida-

do, porque si se comete algún error,

probablemente Latex lanzará un men-

saje bastante incomprensible. El texto

anterior podemos guardarlo, por ejemp-

lo, con el nombre hola.tex y ejecutamos

desde la línea de comandos:

$ latex hola

Supongamos que todo ha ido bien e

ignoramos la ristra de mensajes que

salen. Con esto hemos completado con

éxito nuestro primer documento Latex.

Ahora bien, ¿qué hemos sacado en claro?

Si hubiéramos compilado un programa,

habríamos obtenido un ejecutable. Al

ejecutar Latex correctamente, obtenemos

un fichero DVI, que significa algo así

como “fichero independiente del disposi-

tivo”. Un fichero DVI es como un PDF y,

al igual que un PDF, necesita un progra-

ma para visualizarlo. Todas las distribu-

ciones de Linux decentes incluyen el

xdvi pero, además, en el menú de gráfi-

cos del entorno KDE (o ejecutando kdvi)

disponemos del KDVI, que resulta

mucho más cómodo. En cualquier caso,

visualizamos nuestro fichero hola.dvi y

observamos el resultado. A la vista de

este ejemplo, alguien podría preguntar si

no habríamos hecho lo mismo con un

procesador de textos, como OpenOffice.

La respuesta es sí, pero con algunos

inconvenientes. Para empezar, podemos

comparar el aspecto de nuestro fichero

DVI (Figura 1) con la previsualización de

OpenOffice (Figura 2). Esto es subjetivo,

pero a mí me parece que el aspecto del

documento DVI es mucho más profe-

sional, más parecido a un libro “de ver-

dad”. Naturalmente que en OpenOffice

se puede imitar el aspecto de Latex

eligiendo los tipos de letra adecuados,

márgenes, etc. Pero me parece intere-

sante comparar los documentos que se

obtienen con un mínimo de esfuerzo.

También resulta ventajoso Latex al usar

documentos en texto plano:

$ ls -al hola.*

... 5238 sep 19 12:42 hola.sxw

... 74 sep 19 12:33 hola.tex

¡El documento Latex es 70 veces más

87www.linuxmagazine.com.es Número 01

LINUX USERLaTeX

01 % Clase de documento

02 \documentclass[a4paper]{report}

03 % Paquetes adicionales

04 \usepackage[spanish]{babel}

05 \usepackage[latin1]{inputenc}

06 % Fin del preámbulo. Comienza el documento

07 \begin{document}

08 % Página de títulos

09 \title{El maestro de los collares}

10 \author{J.R. Talco}

11 \maketitle

12 % Fin de los títulos. Comienza el texto normal

13 \chapter{De los jovis}

14

15 Este libro trata principalmente de los jovis, y el lector

descubrirá en

16 sus páginas mucho del carácter y algo de la historia de este pueblo...

17

18

19 No obstante, muchos querrán saber desde un principio algo más de

este pueblo

20 notable y quizás a algunos no les haya dado la gana comprarse el libro

21 anterior...

22

23 Los jovis son un pueblo complicado pero muy joven, cada

vez más

24 numeroso. Amaban la guerra, el follón y la caza...

25

26 % Fin del documento

27 \end{document}

Listado 1: libro.tex

Page 88: Linux Magazine - Edición en Castellano, Nº 01

rafo con tabuladores y otras no, algunas

palabras están separadas con más de un

espacio, algunos párrafos están separa-

dos con dos saltos de línea, etc. Como se

observa en la Figura 3, el resultado no es

muy estético, así que luego habrá que

pagarle a un tipógrafo para que haga la

composición… o podemos usar Latex.

Vamos a introducir el texto en la “plantil-

la” del apartado anterior, aunque le

añadiremos algunos detalles, quedando

como el Listado 1.

Sólo queda ejecutar latex y ver el

resultado (ver la Figura 4). Im-

presionante, ¿verdad? Aparte de corregir

el espaciado, la tabulación y la justifi-

cación, uno puede preguntarse de dónde

ha salido la palabra “Capítulo” o la fecha

actual en la página de título, o quién ha

definido los márgenes. Todos esos

detalles de formato están a cargo de

Latex, que los resuelve a la perfección,

aunque también es verdad que sin pre-

guntarnos nuestra opinión. Para apren-

der a hacer nuestros propios documen-

tos, cada vez más perfeccionados, estu-

diaremos en detalle nuestro “programa”

Latex.

En primer lugar, la sintaxis de Latex es

bastante simple: todas las instrucciones

empiezan con un backslash (la barra

hacia atrás \), seguidas del nombre de la

instrucción. La mayoría de las instruc-

ciones requieren especificar uno o más

parámetros, aunque para algunas basta

escribir su nombre, por ejemplo \maketi-

tle. Los parámetros opcionales, que se

pueden omitir, van entre corchetes tras el

nombre de la instrucción, mientras que

los parámetros que son obligatorios en

una instrucción se escriben entre llaves,

al final de la instrucción. Hay básica-

mente dos clases de instrucciones: los

mandatos simples y los entornos. Estos

últimos son los que se definen con una

pareja de instrucciones \begin ... \end.

En el documento anterior, sólo

hay un entorno: el entorno doc-

ument, que debe existir en todo

documento Latex. Natural-

mente, sólo puede haber un

entorno document, pero si

alguien está preparado para

afrontar la gestión de errores de

Latex, puede probar qué pasa

cuando se incluye más de uno.

Lo que hay dentro del entorno

document es propiamente el

contenido de nuestro documen-

to, como su propio nombre

indica, mientras que lo anterior

pequeño! Baste decir que mi tesis doc-

toral de casi 200 páginas, con cientos de

fórmulas y más de 20 figuras, cabe en un

disquete y la escribí en un Pentium 1.

Intentad hacer eso mismo con

OpenOffice, no hablemos ya de MS

Word. Por último, la facilidad de manejo:

Latex tiene fama de ser muy difícil de

usar, asequible sólo para matemáticos y

demás gente de mal vivir. Bueno, ya

hemos visto que no es para tanto. Esto es

como todo, lo básico e imprescindible es

simple, después podemos ir complicán-

dolo todo lo necesario. Incluso

podríamos usar el documento que

hemos hecho como plantilla y escribir en

el “hueco” entre \begin{document} y

\end{document}, sin aprender nada más

de Latex. En realidad, esto de usar plan-

tillas hechas por otros es un pecado que,

más o menos, cometemos todos los

usuarios de Latex. Cuando empecé a

usar Latex, me aconsejaron que jamás

empezara un documento desde

cero, siempre debía partir de

una plantilla hecha por otro. He

seguido este consejo y no me ha

ido del todo mal.

Capítulo I…Ha llegado el momento de

empezar nuestro libro/trabajo/

artículo/carta o lo que a cada

uno le dicte la inspiración.

Como estamos bajo el influjo de

las musas, no es el momento de

fijarnos en detalles de formato:

unas veces empezamos el pár-

88 Número 01 www.linuxmagazine.com.es

LaTeXLINUX USER

Figura 3: Aspecto del documento en OpenOffice. El resultado impreso arras-

trará todas las imperfecciones cometidas al teclear, al ser un programa

WYSIWYG

Figura 4: Extracto de un documento completo en Latex, que introduce

automáticamente cabeceras de capítulos, página de títulos y demás detalles

de formato

Opciones Significado Opción por defecto

10pt / 11pt / 12 pt Tamaño de letra 10 pt

oneside / twoside Impresión a doble cara twoside en book, oneside en report y

article

openright / Empezar capítulos en openright en book, openany

openany página impar

en report

onecolumn / Texto en una o onecolumn

twocolumn dos columnas

titlepage / Salto de página tras titlepage en book y

notitlepage los títulos

report, notitlepage en article

Tabla 1. Algunas opciones de lainstrucción \documentclass

Page 89: Linux Magazine - Edición en Castellano, Nº 01

a \begin{document} es el preámbulo,

donde se definen algunas características

generales del documento. Como ya se

habrá adivinado, se pueden introducir

comentarios en cualquier punto, comen-

zando la línea con el símbolo %, de

forma que estas líneas no afectan en

nada al documento impreso.

El preámbulo del documentoLa primera instrucción del documento es

la instrucción \documentclass:

\documentclass[a4paper]{report}

Esto define la “clase” del documento. En

Latex hay predefinidas tres clases de uso

general: book, report y article. Existen

también las clases letter (para cartas, con

una gestión muy potente de etiquetas

para hacer envíos masivos de cartas per-

sonalizadas) y slides (¡se pueden hacer

presentaciones con Latex!) pero tienen

muchas instrucciones específicas y

requieren un estudio especial. No hay

grandes diferencias entre book, report y

article, más que en cuestiones de forma-

to. En principio, la clase book está pen-

sada para libros o documentos muy lar-

gos, la clase article se orienta a artículos

de revistas, más cortos y con la clase

report, que estaría en un punto interme-

dio entre las otras dos, se hacen informes

técnicos. Seguramente, para hacer un

trabajo escolar, la clase más adecuada

sea report, de todas formas, lo más

recomendable es probar con las tres para

decidir cuál se adapta más a las carac-

terísticas de nuestro trabajo. Si, por

ejemplo, cambiamos la clase a book en

nuestro documento, el único cambio

aparente es la introducción de una pági-

na en blanco después del título. ¿Por qué

aparece esta página? Porque, en un libro,

todos los capítulos empiezan en una

página impar, es decir, en la página de la

derecha, tal como la vemos si manten-

emos el libro abierto. Para que esto sirva

para algo, tenemos que imprimir el doc-

umento a doble cara. En cambio, si cam-

biamos a la clase article, se elimina la

página de portada con el título. Además,

se pierde el formato del título del capítu-

lo porque, en realidad, un artículo no

puede tener capítulos, sino “secciones”.

Volveremos a esta cuestión pronto, al

estudiar la estructura del documento.

Habiendo seleccionado la clase de

nuestro documento, se pueden configu-

rar diferentes variantes, dando parámet-

ros opcionales en la instrucción \docu-

mentclass. Por ejemplo, en nuestro docu-

mento hemos especificado que el

tamaño de papel es A4, con la opción

a4paper. Podíamos también haber elegi-

do a5paper (14,8 x 21), letterpaper (la

opción por defecto: 8,5 x 11 pulgadas) o

incluso otros más exóticos, pero es poco

probable que se necesiten. Incluyo otras

opciones, cuyo significado es autoex-

plicativo, en la Tabla 1. Obsérvese que

con estas opciones se puede cambiar el

comportamiento por defecto de una

clase. Por ejemplo, se puede usar la clase

book sin página de títulos (notitlepage),

o la clase report empezando los capítulos

en página impar (openright). Eso no

quiere decir que todas las combinaciones

tengan sentido, por ejemp-

lo, es absurdo usar open-

right u openany en la clase

article, que no tiene capítu-

los. Lo mejor es probar

hasta dar con el aspecto

deseado. Especialmente

recomiendo la opción

twocolumn: con una sola

palabra, obtenemos el dis-

eño en dos columnas típico

de periódicos o revistas.

Por cierto, al hacer todas

estas pruebas, notaréis una

de las principales ventajas

de la mayoría de los progra-

mas visualizadores de

ficheros DVI: el propio pro-

grama detecta cuándo tiene

que recargar el documento DVI porque

se ha recompilado el fuente Latex.

Las otras dos líneas del preámbulo de

nuestro documento son instrucciones

\usepackage, que cargan paquetes adi-

cionales. La posibilidad de extensión de

Latex con paquetes externos es lo que le

da una enorme potencia a Latex. Para

cualquier cosa que queramos hacer,

seguro que alguien ha hecho ya el corre-

spondiente paquete y sólo tendremos

que encontrarlo. Incluso podemos

encontrar clases enteras para propósitos

específicos, distintas de book, report y

article. Además, hay algunos paquetes

tan útiles que se han convertido en parte

de la distribución estándar de Latex.

Veamos cuáles son los dos paquetes que

hemos incluido en nuestro documento,

empezando por babel. Es gracias a la

línea…

\usepackage[spanish]{babel}

…como Latex ha sabido escribir

“Capítulo”. Para aprender idiomas, basta

cambiar spanish por german o serbian y

observar la fecha y el título del capítulo.

Los códigos de las lenguas oficiales de

España, además de spanish, son basque,

catalan y galician. ¿Adivináis cuál es el

idioma por defecto si no se carga babel?

Por cierto, al hacer cambios de idioma y

recompilar, puede que se nos produzca

un error. Se debe a que Latex guardó

algunas características del documento en

un fichero auxiliar, que ahora ya no

resulta coherente con el documento.

Para evitar el error y garantizar que par-

timos de cero en cada compilación, basta

con borrar este fichero que, en nuestro

caso, se llamaría libro.aux.

El otro paquete que hemos cargado en

el preámbulo es inputenc, al escribir la

línea:

\usepackage[latin1]{inputenc}

La utilidad de este paquete es tanta, que

casi no se puede explicar con palabras:

89www.linuxmagazine.com.es Número 01

LINUX USERLaTeX

Instrucción Uso

\begin{center} Justificación centrada (se puede cambiar center por

... flushright -derecha-o flushleft -izquierda-)

\end{center}

\begin{enumerate} Relación numerada (se puede cambiar

\item …. enumerate por itemize -viñetas-) …

\item …

\end{enumerate}

\footnote{Nota} Nota al pie

\label{etiqueta} Marca una posición para referenciarla

\ref{etiqueta} Referencia a una posición marcada

$ … $ Fórmulas matemáticas en el texto

\begin{equation} Fórmulas matemáticas en una línea aparte,

... con número de ecuación

\end{equation}

_{texto} Texto en subíndice. ¡ Sólo en fórmulas !

^{texto} Texto en superíndice. ¡ Sólo en fórmulas !

Tabla 2. Algunas instrucciones yentornos usuales en Latex.

[1] Comprehensive Tex Archive Network:http://www.ctan.org [2]Mirror español deCTAN: ftp://ftp.rediris.es/sites/ftp.dante.de/tex-archive/systems/linux [3]Ayuda deLatex dentro de CTAN: http://www.ctan.org/tex-archive/info

RECURSOS

Page 90: Linux Magazine - Edición en Castellano, Nº 01

\\ Siete para las señorasU

grandotas en castillos deU

mármol}}

\author{J.R. Talco \\

Traducción: Un servidor}

\date{2004 \\

\textsc{Málaga}}

\maketitle

La instrucción \\ incluye una línea en

blanco y, si le sigue una longitud entre

corchetes, añade un espacio vertical adi-

cional. En general, es preferible evitar

este tipo de cosas en el texto, porque

Latex ya pone el espaciado adecuado,

pero el título es un caso particular. La

instrucción \textsc escribe un texto en un

tipo de letra especial (“Small Capitals”),

como \textsf (“Sans serif”), \textsl

(“Slanted”) o \texttt (“Typewriter”). El

texto en negrita se incluye con \textbf

(“Boldface”), mientras que, para la cursi-

va es conveniente utilizar \emph

(“Emphasize”), aunque se puede poner

también \textit (“Itálica”).

El cuerpo del documentoEl documento propiamente dicho es lo

más fácil, ya que todo el formato está ya

definido, por lo que sólo hay que escribir

el texto. Si se quiere, se pueden cambiar

los tipos de letra con las instrucciones

que comentamos en el párrafo anterior.

Entre dos párrafos hay que dejar una

línea en blanco. Para comenzar un

nuevo capítulo, basta dar una nueva

instrucción \chapter y, además dentro de

cada capítulo, es posible ir definiendo

estructuras cada vez más pequeñas: \sec-

tion, \subsection y \subsubsection.

Naturalmente, Latex controla la

numeración de las secciones a la per-

fección: si queremos cambiar de

orden dos capítulos basta con cortar

y pegar sus contenidos y, mientras

que en un procesador de textos ten-

dríamos que revisar la numeración,

con LaTeX, los capítulos se numeran

automáticamente. Basta con escribir

varias páginas para darnos cuenta de

todo lo que hace automáticamente

este maravilloso, por ejemplo, las

cabeceras de página incluyen el

número de página y el título del capí-

tulo actual y se distinguen la página

derecha de la izquierda, de forma

que el libro quede perfecto al

encuadernar. Y, cuando llevemos

escritas 500 páginas, se nos ocurre que

queremos un índice al principio: no hay

problema, basta un \tableofcontents

después del \maketitle. Eso sí, posible-

mente haya que ejecutar latex dos o tres

veces seguidas para que genere los

ficheros auxiliares que necesita para con-

struir el índice, pero pronto apreciare-

mos la potencia de LaTeX y como la

curva de aprendizaje necesario para

dominarlo se compensa con las fun-

cionalidades que proprociona.

Llegado este punto, sólo queda utilizar

Latex y probar diferentes cosas. En la

Tabla 2 hemos seleccionado las instruc-

ciones de Latex que se corresponden con

la barra de herramientas estándar de un

procesador de textos. ¡Probad a meter

unos entornos enumerate o itemize den-

tro de otros! Desde luego, esto es tan

sólo una primera aproximación a Latex,

centrada en lo que se puede hacer con el

mínimo esfuerzo. Para explicar las fór-

mulas matemáticas, las tablas y las fig-

uras, o cómo modificar el formato de

página, se requiere más espacio y, de

hecho, es un tema que abordaremos el

mes que viene, aquí, en nuestro curso de

LaTeX. �

90 Número 01 www.linuxmagazine.com.es

LaTeXLINUX USER

basta con quitar esta línea (o

ponerle un % al principio) y

ver qué pasa. En los tiempos

de los terminales alfanuméri-

cos, había que teclear com-

binaciones como {\'e} para

escribir una letra ‘e’ con

acento. Afortunadamente,

esto es prehistoria tecnoló-

gica y teniendo el teclado

bien configurado podemos

escribir normalmente gracias

al paquete inputenc que,

por cierto, significa INPUT

ENCoding. Se pueden usar

otras codificaciones de carac-

teres en lugar de latin1, como

ansinew, pero, al menos para

textos en español o inglés, la diferencia

es inapreciable.

La página de títulosEl entorno document empieza con los

títulos, que se definen con las instruc-

ciones \title, \author y, opcionalmente,

\date. Cada uno de estos comandos toma

como argumento un texto, que Latex

imprimirá con el tipo y tamaño de letra

adecuados. Este texto puede ser vacío.

Por ejemplo, al imprimir la versión final

de un libro no es habitual poner la fecha,

así que escribiríamos \date{}. Una vez

definidos estos campos, la instrucción

\maketitle los muestra. Lo que debemos

entender de este proceso es que el for-

mato de la página de títulos está codifi-

cado al definir la instrucción \maketitle

en la clase y este formato no se puede

modificar, al menos no fácilmente. Por

ejemplo, si queremos incluir un subtítu-

lo, a lo mejor se nos ocurre que bastaría

con insertar insertar una línea de texto

entre \title y \author. Pero si pasamos el

texto por procesador latex, descubrimos

que esto no va a funcionar, porque Latex

imprimirá primero el texto que está fuera

de las instrucciones y luego \maketitle

formateará la página de títulos como

siempre. En cambio, tenemos bastante

libertad al definir los textos de título,

autor y fecha, por ejemplo, tras el

begin{document} podemos escribir:

\title{El maestro de losU

collares

\\[0.5 cm] {\small TresU

collares para los príncipesU

feos sobre la tierra

Hace ya más de una década que

Miguel Atencia viene administrando

sistemas y redes en distintos organis-

mos. Posteriormente, estudió

matemáticas y consagró su vida a la

enseñanza y a la ciencia. No

obstante, sigue en contacto con el

mundo de la informática, pues no ha

podido aún librarse de desatascar

impresoras y formatear ordenadores.

EL A

UT

OR

Figura 5: El símbolo de LaTeX se genera con... LaTeX

Page 91: Linux Magazine - Edición en Castellano, Nº 01

AHORROMás del 15% descuento con respecto al precio de portada: Consigue 12 números por el

precio de 10 y 4 DVDs ¡Gratis!

ENVÍO GARANTIZADO¡No te pierdas Linux Magazine nunca más! La subscripción a Linux Magazine te asegura

que recibas los conocimientos Linux de más alta calidad en tu domicilio cada mes.

APOYO A LA COMUNIDADLinux Magazine es algo más que una revista de Linux. Linux Magazine patrocina grupos,

congresos, proyectos y eventos relacionados con el Software Libre. Suscribiéndote a Linux

Magazine garantizas que podamos seguir apoyando el Software Libre allá donde haga

falta.

RENOVACIÓN AUTOMÁTICAA diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios

para que renueves tu subscripción. Con Linux Magazine, tu subscripción se renovará cada

año. Recibirás una confirmación aproximadamente 60 días antes del final de tu periodo

de subscripción, pero no se requiere que hagas nada al respecto para seguir suscrito.

GARANTÍA DE DEVOLUCIÓN DE DINEROSi por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu sub-

scripción en cualquier momento. Te abonaremos el precio de todos los números que no

hayas recibido. Sin preguntas, sin fechas de cancelación, sin problemas.

SI UTILIZAS LINUX, NECESITAS LINUX MAGAZINE

WWW.L INUXMAGAZ INE .COM.ES/SUBS

o utiliza el formulario al dorso

1

2

35

4

Pedidos online: www.linuxmagazine.com.es/subs

buenas razonespara suscribirse5

Page 92: Linux Magazine - Edición en Castellano, Nº 01

FormularioSuscripción

Para un servicio más rápido, realice su pedido online en: www.linuxmagazine.com.es

(+ 34) 951 010 516

Número Inicial

Zona

Modo de Pago

Condiciones

Dirección Facturación

Dirección Envío

Page 93: Linux Magazine - Edición en Castellano, Nº 01

93www.linuxmagazine.com.es Número 01

COMUNIDADProyectos

existen pocos proveedores de servicios

de Internet que anuncian soporte para

IPv6. Por tanto, IPv6 permanece en el

reino de los usuarios y programadores

técnicamente competentes. Algunas de

las columnas vertebrales de Internet sólo

son accesibles a través de IPv6, pero,

debido a que la mayor parte de la red de

redes sigue utilizando IPv4, los usuarios

que utilicen este protocolo han de uti-

lizar túneles a través de la parte de la red

IPv4.

IPv6 para la Conexión deLANsSixxs.net [1] es un intermediario para el

“tunelado” que da a los usuarios acceso

gratuito al Internet IPv6. Sixxs ofrece un

túnel IPv6 con una única dirección IPv6.

Sixxs también ofrece subredes completas

IPv6, lo que permite a usuarios y empre-

sas añadir un LAN completo.

Sixxs utiliza un sistema de puntos para

administrar la calidad del servicio. Otor-

gan 25 créditos por registrarse. Esos 25

créditos sirven para “comprar” un túnel

IPv6 y una sola dirección IP (de hecho,

Apesar de que aún existen

bastantes direcciones IP

para los Estados Unidos,

las voces de alarma ya llevan

tiempo sonando en otras partes

del mundo, especialmente en

Japón. Los pesimista auguran que

las direcciones IPv4 (Internet Pro-

tocole Versión 4, la versión

actual), con sus cuatro billones

de direcciones, se quedará sin

espacio en un futuro no muy

lejano.

En entornos de todos los

tamaños, desde minúsculas redes

domésticas hasta enormes redes

empresariales, los usuarios han

migrado a Network Address

Translation (Traducción de Direcciones

de Red o NAT) para evitar el coste que

supone la adquisición de direcciones IP

que puede que no se lleguen a utilizar…

y todo ello a pesar de que NAT puede

plantear serios problemas para según

que aplicaciones. El hecho de que la

mayoría de las direcciones IP se asignan

dinámicamente también ha dado lugar a

atajos como los DNS dinámicos. La ten-

dencia de conectar todo tipo de

dispositivo electrónico, desde teléfonos

móviles, PDAs y televisores hasta nev-

eras, a Internet, no hace más que agravar

la situación.

Si continúa la expansión de la conex-

ión de dispositivos capacitados para IP,

podemos esperar agotar el espacio de

direcciones reservado para IPv4 bastante

rápidamente. El Internet Engineering

Task Force desarrolló la versión 6 del

protocolo de Internet para subsanar el

problema hace más de diez años. Cuenta

con suficientes direcciones como para

dotar de IP hasta la última tostadora,

pero Internet es lenta en reaccionar. IPv6

no ha tenido la repercusión esperada y

El software libre incluyes un abanico tan amplio de aplicaciones que puede ser difícil encontrar la herramienta perfecta.

En esta sección, escogemos lo mejor de la cosecha. Este mes miramosel suministrador de servicios IPv6 Sixxs, un ISP que

ofrece conexión al Internet IPv6 gratis para así promocionar el protocolo. POR MARTIN LOSCHWITZ

Software Libre y sus Creadores

Proyectos en Marcha

esto sólo cuesta 15 créditos). A los

usuarios se les otorga 5 créditos por

cada semana que permanece accesi-

ble su punto final IPv6. Después de

una semana se dispone de suficientes

créditos para solicitar una subred

completa, que también cuesta 15

créditos. Después de otra semana, se

puede añadir un servidor de nombres

para registros de búsquedas inversas

en la subred.

Pero también existen los créditos

negativos. Se deducen 5 créditos si el

punto final IPv6 no se encuentra

accesible durante un día. Tras una

semana de inactividad, el punto final

y toda la subred adjunta se desha-

bilita. Sixxs utiliza este sofisticado

sistema de créditos para mantener actu-

alizadas la base de datos de usuarios y

los túneles registrados. Si se descubre a

algún usuario abusando del túnel de

Sixxs, ese usuario pierde todos sus privi-

legios de acceso.

La conexión de un ordenador a la red

IPv6 exige algo de preparación. Uno de

los requisitos es un sistema operativo

que hable IPv6. Aparte de Linux, la may-

oría de los sistemas operativos

modernos, incluyendo Windows 2000 y

XP, pueden utilizar este nuevo protocolo.

Se puede consultar un HOWTO de como

se configura en una máquina un túnel

IPv6 en [8].

Para soportar a toda una red IPv6, lo

normal es utilizar radvd. Se necesita un

ordenador en la red que manipule la asi-

gnación de direcciones y la información

de enrutado. Los clientes recogen una

dirección de esta máquina y los demo-

nios de enrutado definen las rutas. �

[1] Sixxs, servicio IPv6 http://www.sixx.net

RECURSOS

Ro

na

ld R

ae

fle,v

isipix

.com

Page 94: Linux Magazine - Edición en Castellano, Nº 01

EventosLINUX MAGAZINE

94 Número 01 www.linuxmagazine.com.es

Calendario de Eventos

Evento Fecha Ciudad Sitio Web

21C3 – Chaos Communication Congress 27–29 Diciembre Berlín, Alemania www.ccc.de

OSDL Enterprise Linux Summit 31 Enero –02 Febrero Burlingame, CA, EE.UU. www.osdllinuxsummit.org

SAINT 2005 31 Enero–04 Febrero Trento, Italia www.saint2005.org

CodeCon 4.0 11-13 Febrero San Francisco, CA, EE.UU. www.codecon.org/2005

Southern California Linux Expo 12 Febrero Los Angeles, CA, EE.UU. www.socallinuxexpo.org

LinuxWorld Conference & Expo 14-17 Febrero Boston, MA, EE.UU. www.linuxworldexpo.com

UKUUG LISA/Winter Conference 24-25 Febrero Birmingham, R.U. www.ukuug.org/events/winter2005

FOSDEM 2005 26-27 Febrero Bruselas, Bélgica www.fosdem.org

Solutions Linux 01-03 Marzo París, Francia www.solutionslinux.fr

Linux Park CeBIT 2005 10-16 Marzo Hannover, Alemania www.cebit.de/homepage_e

O’Reilly Emerging Technology Conference 14-17 Marzo San Diego, CA, EE.UU. conferences.oreillynet.com/etech

Novell BrainShare 2005 20-25 Marzo Salt Lake City, UT, EE.UU. www.novell.com/brainshare

YAPC::Taipei 2005 26-27 Marzo Taipei,Taiwan taipei.pm.org

LinuxWorld Conference & Expo, Canada 18-20 Abril Toronto, Canadá www.linuxworldcanada.com

MySQL Users Conference & Expo 2005 18-21 Abril Santa Clara, CA, EE.UU. www.mysql.com/news-and-events/users-conference

linux.conf.au 18-23 Abril Canberra, Australia conf.linux.org.au/

3rd International Linux Audio Conference 21-24 Abril Karlsruhe, Alemania www.zkm.de:81/lac

LinuxPark CeBIT 2005Fecha: 10-16 Marzo

Ciudad: Hannover, Alemania

Sitio Web:www.cebit.de/

homepage_e

LinuxWorld ExpoFecha: 14–17 Febrero

Ciudad: Boston, MA, EE.UU.

Sitio Web:www.linuxworld

expo.com

FOSDEM 2005Fecha: 26–27 Febrero

Ciudad: Bruselas, Bélgica

Sitio Web:www.fosdem.org

Eventos Seleccionados

Información de Contacto

DirectorPaul C. Brown

CoolaboradoresPaul C. Brown, Miguel Atencia, Juan Rafael Fernán-dez, Pedro Orantes, José María Ruíz

TraductoresPaqui Martín Vergara, Paul C. Brown, Jesús ReyesDelgado, Antonio Rueda.

MaquetaciónJudith Erb, Elgin Grabe, Klaus Rehfeld

Diseño de PortadaPinball, [email protected]

Publicidadwww.linuxmagazine.com.es/pub/

Para EspañaPaul C. [email protected]@linuxnewmedia.esTel.: (+ 34) 951 010 556Móvil.: (+ 34) 655 036 836Fax.: (+ 34) 951 010 516

Jillian Kay, [email protected].: (+ 34) 952 402 877 Móvil.: (+ 34) 630 624 926

Para Alemania, Austria y SuizaOsmund [email protected].: (+49) 6335 9110 Fax.: (+49) 6335 7779

Para el Resto del MundoBrian Osborn [email protected] Tel.: (+49) 6509 910 495Fax.: (+49) 6509 910 497

Director EditorialPaul C. Brown

Director de ProducciónHans-Jörg Ehren, [email protected]

Subscripciones: www.linuxmagazine.com.es/magazine/subs

Precios Subscripción (12 números + 1 DVD cada 3 números)

España: 49,50 €Resto del Mundo: 74,46 €Tel.: (+34) 951 010 556Fax.: (+34) 951 010 516 [email protected]

Linux MagazineLinux New Media Spain, S.L. Avda. Juan López Peñalver, 2129590 - Campanillas Málaga ESPAÑA [email protected].: (+34) 951 010 556Fax.: (+34) 951 010 516www.linuxmagazine.com.es - Españawww.linux-magazine.com - Mundowww.linux-magazine.de - Alemania

Si bien se toman todas las medidas posibles paragarantizar la precisión del contenido de los artículospublicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en larevista. Asimismo, Linux Magazine no compartenecesariamente las opiniones vertidas por suscolaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupu-losamente para confirmar que está libre de virus yerrores.

Copyright y Marcas Registradas © 2004 Linux NewMedia Spain, S.L. Linux New Media Spain S.L. prohíbela reproducción total o parcial de los contenidos deLinux Magazine sin su permiso previo y por escrito.Linux es una Marca Registrada de Linus Torvalds.

Impreso en Alemania

Impresión: Dierichs Druck + Media GmBH

Distribución: SGEL

Page 95: Linux Magazine - Edición en Castellano, Nº 01

El parlamento de la ComunidadEconómica Europea ha llevado acabo un espectacular salto hacia

delante en lo que se refiere a jurispru-dencia relacionada con las patentes: trasun acuerdo unánime en la votaciónsobre la nueva Ley de Patentabilidad deActividades (LPA), se amplia el marcolegal de la patentabilidad para englobaren él, no sólo productos, procesos eideas, sino todas y cada una de las activi-dades humanas.“Con esta medida” declaró el presidenteComisión en Pro de la Patentibilidad delas Actividades Humanas (CPPAH),Adolfo Fetuccinni “pretendemos impul-sar la estancada actividad económica ennuestra comunidad y ponernos un pasopor delante de otros áreas económicascompetitivas” dijo, en clara alusión a losEstados Unidos. Además, para que laaplicación práctica de la ley no se veaimpedida por obstáculos burocráticos, secrea el modelo de la “patente rápida”,donde a una corporación solicitante se leexime de tener que demostrar lapropiedad intelectual sobre la actividad apatentar: su propiedad sólo será exami-nada si es contestada por un organismooficial u otra empresas, abriendo de pasonuevas vías de negocio basadas en mod-elos litigantes y estimulando la contrat-ación de abogados, un sector éste enclara recesión. Las actividades re-gistradas como patentes rápidas songravables a partir del día en que se solici-tan.La LPA, revolucionaria por su atre-vimiento, establece que toda actividadhumana es susceptible de ser patentada.Sin embargo, en aras de asegurar el bien-

estar de la sociedad, las actividadeshumanas se dividen en “patentablesbásicos no gravables” (PBNGs) y“patentables elaborados gravables” (oPEGs). Patente no gravable es aquellaque se considera de “necesidad fisiológi-ca básica” y se adjudican al estado. Paracada “patente gravable”, el patentente(individuo, organización o empresa quepretenda registrar una patente) ha desolicitar y abonar una licencia de uso deuna de las actividades PBNG. A contin-uación, según el tipo de actividad que sedesee patentar, tendrá que solicitar una ovarias licencias que elaboran sobre cadauno de los PEGs cedidas a las entidadesprivadas que las solicitaron en su día.Estas entidades pueden, libremente,otorgar o denegar licencias sobre suspatentes, cederlas gratuitamente o porun canon y, en este último caso, estable-cer libremente la cuota de la mismasegún sus propios criterios. Por ejemplo,imaginemos que una empresa pretendapatentar el “andar a pasitos cortos y depuntillas a lo Chiquito de la Calzada”.Primero tendría que obtener licencia dela patente nº EU34362-22-9008176788genérica para “desplazamiento motorfrontal bípedo”. A continuación tendríaque solicitar la licencia de la actividad de“Andar” propiamente dicha (patente nºAC0997-22-8989943812, cedida a“Andares y Caminares, C.B.”), la de“Pasos Cortos” (patente nº AC0997-22-2851734788, cedida a la misma entidadque la anterior) y la de “Puntillas”(patente nº MG0743-22-3260762311,cedida a “The Motion Group, SpainS.L.”). Este mecanismo así establecidoimpide el abuso del sistema. Aunque losPBNGs son relativamente asequibles(entre unos 600 y 800 euros, en segúnque países de la unión), los gravámenespúblicos y privados en los que se puedenincurrir por la acumulación de licenciasde patentes hace impracticable una“avalancha” de patentes por parte deindividuos privados desaprensivos y conpocos escrúpulos. De hecho, las únicasentidades que pueden aspirar a patentar

actividades de una manera consistenteson las grandes corporaciones empresar-iales (Microsoft, I0BM, Sun) y organis-mos sin ánimo de lucro (SGAE, RIAA)que ya han demostrado en el pasado suresponsabilidad civil para con el biensocial de la mayoría de los ciudadanos.Sin embargo, debido a problemas conpatentes solicitadas, ésta es la últimacolumna de esta sección, así como el finde la mayor parte de la industria de lacomunicación tal y como la conocemos,ya que, si bien la actividad de pensar seincluye bajo el epígrafe de “actividadpatentada no gravable”, la actividad deexpresar lo que uno piensa es actividadpatentada gravable… y tú intentadifundir tus ideas por algún medio, yasea impreso©(P), electrónico® o por palo-ma mensajera™(P), y es que te funden losplomos™, colega™. �

95www.linuxmagazine.com.es Número 01

LINUX MAGAZINEHumor

No gravables Gravables

Sentir Escozor Rascarse

Comer Cocinar, Masticar, Deglutir

Defecar Hacerlo en un inodoro

Limpiarse

Sentirse Estafado Manifestarlo

Ejemplos de ActividadesHumanas Patentadas

impatente (adj.) dícese de persona física o

legal que no tiene ningún patente a su nom-

bre. Ejemplo de uso:“Ya sé que no es cosa de

risa, pero ahí donde lo ves, es impatente™(P)”.

patentado (sust.) persona física o legal que

acumula gran cantidad de patentes a su

nombre. Ejemplo de uso:“Está forrado. Es

todo un patentado®”.

prepatente (adj.) dícese de aquel/la que se

opone al estado de patentabilidad total y

añora tiempos anteriores. Ejemplo de uso:

“Cuando te comportas de una manera tan

prepatente™®© no hay Dios(P)™ que te

aguante”.

GLOSARIO

Noticias del no tan Más Allá

Hechos Patentes(P)

Page 96: Linux Magazine - Edición en Castellano, Nº 01

96 Número 01 www.linuxmagazine.com.es

En este sentido, Red Hat siempre

trato con mimo a sus usuarios:

inventó el sistema de paquetes

rpm, el cual facilitaba enormemente la

instalación de software y que ha sido

adoptada por una amplia variedad de

distribuciones, desde Mandrake hasta

SuSE. Desde hace ya algunas versiones,

se ha adoptado el sistema de instalación

Anaconda, que reduce sensiblemente el

estrés que suponía hasta entonces la

instalación de Linux en una nueva

máquina, y que la gente de Debian están

pensando en incorporar a su propio sis-

tema. Y desarrollaron mil y un asistentes

para ayudar al usuario a configurar, ajus-

tar y poner en funcionamiento todas las

características del sistema.

Tanta fue su influencia en los primeros

años de Linux que, a partir de la prolif-

ba que todos los

medios del sistema operativo gratu-

ito se volcaban en Fedora, una organi-

zación comunitaria, dedicada hasta ese

momento a crear paquetes suplementar-

ios a los ofrecidos oficialmente por Red

Hat.

A pesar de los llantos de los más

agoreros, Fedora prosperó. Hoy en día

siempre ocupa algún puesto entre los

cinco primeros del ranking de las distros

más populares. Es un sistema operativo

maduro, estable y llena de recursos.

Cuenta, no sólo con el apoyo de Red Hat,

sino con el apoyo de una comunidad

amplia y experta, lo que garantiza su

supervivencia mucho más que lo que

pueda hacer una compañía privada.

Y Linux Magazine te lo trae en DVD.

InstalaciónComo ya mencionamos en la sección

anterior, Fedora cuenta con el instalador

gráfico Anaconda para facilitar la insta-

lación del sistema en el disco duro.

eración de distribuciones que vivimos

hoy en día, y durante mucho tiempo, se

dividieron las nuevas distros que iban

apareciendo en Debian-based y Red Hat-

based. De entre estos últimos podemos

distinguir distros tan populares como:

Mandrake, SuSE y, hoy en día, Fedora.

De hecho, Fedora es la distribución

heredera más directa de Red Hat.

Cuando Red Hat anunció en el 2003 que

no iba a seguir produciendo su versión

gratuita de su sistema operativo, sino

que iba a concentrar sus esfuerzos en la

comercialización de soluciones empre-

sariales de pago, muchos usuarios se ras-

garon las vestiduras mientras se pregunt-

aban que iban a hacer ahora. Tal fue la

consternación, que pocos prestaron su

debida atención a la segunda parte del

comunicado de prensa donde se explica-

Figura 2: Elección de la franja horariaFigura 1: Podemos elegir el perfil del SO que vayamos a instalar

Durante años, Red Hat fue con diferencia la distribución Linux

más popular, sólo siendo ensombrecida por Debian. Pero mientras

éste último era el preferido de la comunidad hacker y favorito de los

que escogían el camino de “hágaselo-usted-mismo”, Red Hat era el

favorito de los usuarios buscando productividad inmediata, de la

empresa y de aquellos que querían entrar más suavemente en el

mundo Linux.

En el DVD de Linux Magazine

Fedora Core 3

DVD Fedora Core 3

Page 97: Linux Magazine - Edición en Castellano, Nº 01

Una vez elegidos detalles como el

idioma, tipo de instalación (“Personal”,

“Estación de Trabajo”, “Servidor” o “A

Medida” - ver Figura 1), tipo de teclado,

zona horaria y locales (ver Figura 2) y

ratón, pasamos a particionar el disco

duro (de ser necesario). Como en

cualquier distribución moderna, Ana-

conda utiliza para este proceso, una her-

ramienta visual que permite establecer

exactamente el qué y el cómo vamos a

distribuir las particiones en nuestro

disco duro. Una vez realizadas las deci-

siones, pasamos a seleccionar los paque-

tes (si no deseamos que Fedora instale

los escogidos por defecto - ver Figura 3)

y Anaconda empieza a copiarlos al disco

duro (ver Figura 4).

Una vez acabada la instalación de

paquetes, es el momento de dotar al

usuario root de una contraseña y de

crear usuarios de privilegios más bajos

para el trabajo del día a día en la

máquina. A continuación podemos con-

figurar el hardware, estableciendo res-

olución y número de colores de la pan-

talla, configuración de red y configu-

ración de impresoras.

A continuación establecemos como

deseamos arrancar el sistema (LILO ha

sido eliminado, sólo queda GRUB, lo que

simplifica las cosas para los usuarios

noveles. Y si grabamos el gestor de

arranque el MBR, disquete, o donde sea)

y el sistema rearranca. Si todo ha ido

bien (y no hay ningún motivo para pen-

sar que no haya sido así), tendremos el

nuevo sistema en pleno funcionamiento

y podremos disfrutar de todo el potencial

de esta estupenda distribución.

Stateless Linux no será de utilidad para

grupos de usuarios donde cada uno tiene

unas necesidades muy específicas y

diferenciadas de las de los demás o

donde se tenga instalado hardware muy

divergente, pero nos podemos imaginar

el ahorro de coste, de tiempo y recursos

humanos que supone el uso de Stateless

Linux en entornos como un centro de

soporte telefónico con centenares de

puestos, donde todas y cada uno de las

máquinas ha de ser exactamente igual y

tener la misma configuración que la del

vecino. Algo que hará a los golosos del

software relamerse de anticipación:

Fedora Core 3 no sólo soporta la insta-

lación nativa de paquetes rpm, sino que

viene preparado para enlazar con

depósitos de software empaquetados en

formato apt y YUM. Esto significa que, si

no encontramos la aplicación que bus-

camos en el formato nativo de Fedora

(improbable), siempre podemos echar

mano al vasto número de paquetes apt

disponibles para Debian y todos sus

clones. �

97www.linuxmagazine.com.es Número 01

Procesador: Ordenador Pentium o equiva-

lente; 200 MHz o mayor para sistema en

modo texto; 400 Mhz Pentium II o mayor

para sistema en modo gráfico.

Memoria: 64 MB mínimo para sistema en

modo texto; 192 MB mínimo para sistema

en modo gráfico.

Hard Disk: 620 MB para instalación mínima

a medida; 1.1 GB para instalación servidor; 2.3

GB para sistema de escritorio personal; 6.9

GB instalación a medida completa.

Requisitos del Sistema

Figura 3: Selección de paquetes Figura 4: Instalación de paquetes

Fedora Core 3 DVD

CaracterísticasFedora conserva el preciosismo y ele-

gancia de los escritorios heredados de

Red Hat, pero si hay alguna cosa que dis-

tingue el nuevo Fedora Core de otras dis-

tribuciones, es en el apartado de los asis-

tentes. Fiel a la tradición de Red Hat de

acercar Linux al usuario, Fedora Core 3

implementa asistentes para (casi) todas

las funcionalidades que queramos con-

figurar en nuestro equipo, desde impre-

soras a escáners en red y dispositivos

inalámbricos. Por supuesto, que los más

expertos siguen pudiendo abrir una ter-

minal y correr vi o Emacs para acceder a

los archivos de configuración si así lo

desean. Esto sigue siendo Linux después

de todo. Otra de las características más

interesantes del nuevo Fedora es el que

se refiere al apartado denominado

Stateless Linux. Bajo esta bastante oscu-

ra denominación, se esconde un proyec-

to que hará las delicias de todo admin-

istrador de sistemas que tenga varias

máquinas a su cargo y quiera mantener

una instalación sincronizada e idéntica

en cada una de ellas. Con las herramien-

tas Stateless Linux proporcionadas por

Fedora Core, un administrador de sis-

temas puede realizar una instalación en

una máquina “maestra” y repetir esa

misma instalación en tantas máquinas

quiera con un mínimo esfuerzo. No sólo

eso, sino que las máquinas esclavo

nunca tendrán que ser actualizadas o

reconfiguradas individualmente. En vez

de eso, se actualiza el “maestro” y todos

los cambios realizados en esta máquina

se aplican automáticamente a las

máquinas “esclavo”. Se entiende que

Page 98: Linux Magazine - Edición en Castellano, Nº 01

98 Número 01 www.linuxmagazine.com.es

A LA VENTA ENERO 2005

Linux User Seguiremos con nuestro cursos de XUL y

presentaremos nuevas aplicaciones y

herramientas que nos harán la vida más

fácil. Continuaremos nuestra serie sobre

LaTeX, ahondando en su utilidad para

representar ecuaciones e imágenes.

Seguiremos conociendo la línea de

comandos para que todos puedan

aprovechar el poder de las instrucciones

del shell.

Noticias También traeremos las noticias más can-

dentes del mundo Linux, un calendario

de eventos completo, información sobre

los últimos avances en el kernel e inse-

guridades de las aplicaciones e

información sobre los proyectos más

interesantes que se llevan a cabo en el

campo del Software Libre.

¿Un ordenador silencioso en la sala de

estar? ¿Es posible? Si pensamos que un

ordenador ya es mucho más que un

ordenador, no sólo ha de ser posible con

la tecnología moderna, sino que es

deseable. Acoplándole tarjetas de tele-

visión, reproductores

y grabadores de

DVDs, altavoces

y demás hard-

ware se

convierte

en un completo centro de entreten-

imiento. Sin embargo, el ruido de los

ventiladores y discos duros y lo poco

estético de sus carcasas pueden ser un

impedimento para colocarlo en el salón

de nuestra casa. Pero Linux Magazine te

da la solución: un amplio reportaje

donde se hace un repaso a todos los dis-

positivos que pueden convertir tu PC en

un equipo que no desentone con el sofá

y las cortinas. No sólo eso, sino que des-

cubrirás como explotar tu cámara digital

bajo Linux, que impresora más te con-

viene y como sacarle el máximo a tu

grabadora de DVDs.

DesarrolloEn la sección dedicada a la progra-

mación, continuaremos con la segunda

parte de la creación de un juego y vere-

mos como ampliar nuestro interfaz

utilizando la librería curses. Ten-

dremos otra aplicación PHP con el

que jugar y más interesantes

scripts realizados en Perl y

Python.

SysAdminsLos administradores de sis-

temas podrán aprender los

diversos métodos para filtrar

contenido web a través de un

proxy, distribuir correo de man-

era eficiente por medio de un

cluster y detectar intrusiones en el

sistema con Sleuthkit.

Enero 2005: Número 2

Próximo NúmeroEspecial Hardware

Número 2PRÓXIMO NÚMERO

Boletín Linux MagazineEl Boletín de Linux Magazine te da la oportunidad de ver lo que se avecina en el

siguiente número de Linux Magazine e incluye enlaces a artículos que aparecen

en nuestro sitio web antes de que la versión impresa llegue a los quioscos.

Suscríbete en www.linuxmagazine.com.es/boletin.

Page 99: Linux Magazine - Edición en Castellano, Nº 01
Page 100: Linux Magazine - Edición en Castellano, Nº 01

Quiere Linux.

Desea que el funcionamiento

de sus aplicaciones y la

administración de sus sistemas

se realice a través de un soporte

profesional de confi anza. Necesita

Red Hat. Disponible en 7 distintas

arquitecturas y certifi cado por

Oracle, Bea, IBM y Sap, entre

otros, le permitirá gestionar sus

sistemas a través del canal Red Hat

Network.

THE PLATFORM OF CHOICE.

© 2004 Red Hat, Inc. All rights reserved. “Red Hat,” the Red Hat “Shadowman” logo, and the products listed are trademarks or registered trademarks of Red Hat,

Inc. in the US and other countries. Linux is a registered trademark of Linus Torvalds.

redhat.es | ES 900 800 409