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
NÚ
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
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:
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.
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
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.
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
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.
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. �
�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. �
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-
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,
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
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
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.
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”.
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. �
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
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
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
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
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. �
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
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.
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
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.
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).
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.
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.
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
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
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
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
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
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
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
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
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
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
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
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…
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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.
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.
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.
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.
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
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
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
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
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
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.
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
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.
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
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.
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
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.
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!
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
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
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.
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
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.
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
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
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
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
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
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
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
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
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.
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
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
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
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
\\ 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
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
FormularioSuscripción
Para un servicio más rápido, realice su pedido online en: www.linuxmagazine.com.es
(+ 34) 951 010 516
Sí
Número Inicial
Zona
Modo de Pago
Condiciones
Dirección Facturación
Dirección Envío
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
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
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)
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
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
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.
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