Linux - Instituto Tecnológico Superior Zacatecas Norte

Transcripción

Linux - Instituto Tecnológico Superior Zacatecas Norte
SDL
Konversation
LINUX MAGAZINE
Programación de
Juegos bajo Linux
El cliente IRC más fácil
de utilizar
Edición en
Castellano
NÚMERO 01
La nueva versión
de Fedora
en DVD
NÚMERO 1 • P.V.P 4,95 €
Configura, Vigila y Explota
Redes
Herramientas Linux
REDES
DHCP
CUPS/SAMBA
Herramientas de configuración y monitorización
Configuración relajada con DHCP p16
Impresión en red con CUPS y SAMBA p23
Enrutado Linux
Cómo dar acceso a Internet a toda una red
doméstica con una sola conexión p68
Correo Seguro
Servidores y clientes de correo con TLS para
transmisión encriptada de mensajes p60
p13
TLS/SMTP
Fedora Core 3
Fedora Core 3
Te traemos lo
más nuevo de
Red Hat Fedora
para tu PC p96
MediaWiki
p54
Cómo instalar y administrar un wiki con
Wikipedia
Después de las patentes de software
¿qué planean para nosotros el
gobierno europeo? Echa un vistazo al
futuro de la mano de Paul C. Brown
p95
WWW.LINUX- MAGAZINE.COM.ES
00001
Konversation
el motor wiki PHP que se esconde tras la
Esas Patentes
8 413042 594505
Portales Enrutamiento
MediaWiki
Linux va a CeBIT
Muestre 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, especialmente 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 tecnologías de código abierto más novedosas y como
explotarlas de manera efectiva: LinuxPark.
Su empresa también puede beneficiarse enormemente de esta plataforma, ideal para la promoción de sus soluciones de código abierto.
La solución perfecta para su presencia
ferial:
• Comuníquese directamente con una gran
variedad de clientes potenciales
• Anúnciese en un campaña promocional anterior 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 patrocinadores de reconocido prestigio en el sector
• A su disposición: paquetes feriales todo incluido desde 4 m2
Consiga más información en
+49 (0) 26 02 16 01374 ó
[email protected]
Patrocinado por:
Presentado por:
Bienvenidos
EDITORIAL
Bienve^H^H^H^H^H^H
Estimado Lector de Linux Magazine
Iniciamos una
nueva andadura con… ¡No!
¡Tacha eso! No
puedo caer en
el topicazo de
“nueva andadura”, “flamante 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 alemana, Linux Magazin, lleva más de diez
años en el mercado, siendo la revista de
Linux más antigua de Europa y la segunda 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, desarrolladores y administradores a distintos
niveles y lleva años patrocinando grupos, 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 estamos de estreno. Además viene cargadita
de cosas interesantes. Para empezar tenemos 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 exigente. Para el usuario final, tenemos la
sección Linux User, donde se puede
aprender a configurar y utilizar aplicaciones, 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 educación. Y poco más: Noticias del mundo
Linux, noticias empresariales, relación
de inseguridades, relación de eventos
mundiales, relación de proyectos, recursos, 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 preguntaréis. Pues por que la mayoría de
vosotros tenéis acceso a Internet ¿verdad? 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
Nos sentimos orgullosos de nuestros orígenes como publicación,
que se remonta a los primero días
de la revolución Linux. Nuestra
revista hermana, la publicación alemana Linux Magazin, fundada en
1994, fue la primera revista dedicada 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 distribución del conocimiento y
experiencia técnica. No nos limitamos a informar sobre el
movimiento Linux y de Software
Libre, sino que somos parte integral
de él.
estamos locos. Nos debemos a la comunidad. 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 actualizadas al minuto, contenidos extra y una
vía de comunicación entre nuestros lectores -vosotros- y la redacción -nosotrosinmediata y muy fácil de utilizar.
Así que, ya sabéis, aquí estamos,
hemos llegado, bienvenidos a Linux
Magazine y que lo disfrutéis.
Paul C. Brown
Director
www.linuxmagazine.com.es
Número 01
3
LINUX MAGAZINE
Contenido
NOTICIAS
13
Software ................................................................................................6
Negocios ................................................................................................8
Linux .........................................................................................................9
Inseguridades
..................................................................................10
PORTADA
Especial Redes ..................................................................................12
Herramientas de 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.
Herramientas de Red ..................................................................13
Todas las herramientas Linux necesarias para la monitorización de redes.
Redes relajadas con DHCP ......................................................16
DHCP para la autoconfiguración de clientes de red.
Cambio de perfile con SCPM
.................................................21
Mantenimiento dos configuraciones red en una misma
máquina.
CUPS sobre SAMBA ......................................................................23
Proporciona impresión en red para clientes Linux, Windows
y Mac.
16
Redes Relajadas
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
direcciones IP y
otros parámetros
a las máquinas
clientes nos quitará un motón de
dolores de cabeza a la hora de
administrarlas.
DESARROLLO
La librería SDL ..................................................................................28
Aprendemos a utilizar SDL en este taller de programación de
juegos.
Interfaces
............................................................................................33
Con curses podemos desarrollar interfaces de texto rápidos y
eficientes
Cartas a medida .............................................................................38
Perl puede generar cartas y sobres personalizados para
envíos masivos en formato PostScript.
La API Pear
.........................................................................................42
PEAR proporciona una API para la conexión a bases de
datos que evita el código redundante.
Introducción a Python ..............................................................48
Python es un lenguaje todoterreno, útil tanto en scripts web
como en grandes aplicaciones.
2
Número 01
www.linuxmagazine.com.es
28
SDL: Juegos Bajo Linux
SDL significa Simple DirectMedia Layer y es una API
multi-plataforma para programar aplicaciones multimedia, como los juegos. Aporta una base estable sobre la
que los programadores pueden
trabajar, sin preocuparse
de
cómo se encargará el hardware de renderizarlo o incluso qué hardware lo ejecutará.
Contenido
54
LINUX MAGAZINE
SYSADMIN
MediaWiki
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.
La Columna de Charly ................................................................53
Los mejores trucos y consejos del SysAdmin.
Colaboración Online ...................................................................54
Instalamos y configuramos MediaWiki, el motor wiki tras la
popular Wikipedia
Correo Seguro .................................................................................60
Servidores seguros de correo con TLS
La Caja Negra ...................................................................................62
Controla tu sistema con Syslog NG.
LINUX USER
74
Programación XUL
Los desarrolladores de Mozilla crearon el lenguaje XUL para
proporcionar un método sencillo y potente para escribir
interfaces web
de gran atractivo y funcionalidades extraordinarias.
En esta serie
aprendemos
las bases de la
programación
orientada a web con
esta
poderosa
herramienta.
Portales de Enrutamiento
.....................................................68
Con una sola máquina Linux conectada a Internet, podemos
proporcionar acceso al exterior a toda una red.
Desktopia: Panelizer
..................................................................70
Dota un gestor de ventanas minimalista de un panel de control con Panelizer.
Aplicaciones: Konversation
...................................................72
El cliente IRC más sexy para KDE.
Curso de Programación: XUL (I) ..........................................74
Un lenguaje sencillo para programar interfaces web.
Educación: WIMS
..........................................................................79
Generación de exámenes personalizados con WIMS.
96
Tipografía con LaTeX (I) ............................................................84
DVD Linux Magazine: Fedora Core3
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.
Fedora es la distro
heredera de Red
Hat
y
Linux
Magazine te lo trae
en DVD.
Documentos de aspecto profesional con LaTeX.
COMUNIDAD
Proyectos
............................................................................................93
Eventos .................................................................................................94
Contacto ..............................................................................................94
Humor ...................................................................................................95
DVD: Fedora Core3 .......................................................................96
Próximo Número ..........................................................................98
www.linuxmagazine.com.es
Número 01
3
NOTICIAS
Software
Software
■ En el Futuro jugamos a Croquet
”¿Qué pasaría si diseñáramos un sistema
operativo e interfaz de usuario con los
conocimientos que tenemos hoy en día,
hasta dónde podríamos llegar?” La
respuesta posiblemente sea hasta el
campo de croquet más cercano.
OpenCroquet es un proyecto que implementa un nuevo concepto de sistema
operativo, el desarrollo del cual viene
liderado Alan Kay, el hombre que nos
dio el portátil, la programación orientada
a objetos y el interfaz de ventanas tan
popular hoy en día. El proyecto pretende
implementar un sistema operativo e
interfaz totalmente novedoso que unifica
las últimas tecnologías 3D con la
ubicuidad de las redes en un todo que
sólo se puede calificar, ahora sí, como
“ciberespacio”.
En
la
superficie,
OpenCroquet podría parecer similar al
proyecto “Looking Glass” de Sun (http://
wwws.sun.com/
software/looking_
glass/). Sin embargo, va más allá
que aquel al no
limitarse al aspecto visual, permitiendo, entre otras
cosas, que usuarios compartan espacios de otros simplemente cruzando
un “portal” y puedan trabajar conjuntamente en un mismo documento o compartir su tiempo de ocio a través de
avatares igualmente tridimensionales.
De momento, OpenCroquet funciona utilizando como base Squeak, una implementación de Smalltalk (otro invento de
Kay) orientada a la educación y, por
tanto, se puede utilizar en todas las
plataformas que soporten el interfaz del
ratoncito (Linux,
Windows y Mac).
Se preve que futuras versiones de
OpenCroquet funcionarán como verdaderos sistemas
operativos y no requerirán más software
que el que traigan consigo. Las exigencias del hardware básico son muy discretas: OpenCroquet funcionará perfectamente con un Pentium II a 450 Mhz…
siempre y cuando venga equipado con
una potente tarjeta gráfica compatible
con OpenGL. Visita el enlace de más
■
abajo para más información.
http://www.opencroquet.org.
Los linuxeros más recalcitrantes podrán
decir lo que quieran de esta distro, pero
los impulsores detrás del sistema, con
su CEO Michael Robertson a la cabeza,
son un hervidero de ideas. Ésta vez llevan “la experiencia
Google”
hasta
la
enésima potencia. Si
bien Google parece
haberse concentrado
mucho en la plataforma Windows últimamente, con su barra
para MSIE, su escritorio solo-Windows y
demás, los únicos que
podrán disfrutar de
Hot Words, una manera de buscar en
Google, son los usuarios de la Linspire
Internet Suite (LIS).
Hot Words funciona
convirtiendo cada palabra que aparece en la
navegador en un tér-
mino de búsqueda potencial. ¿Lees sobre
paellas valenciana y te gustaría saber
más? Con un clic aparece un menú contextual que te permite buscar en Google
utilizando “paella” como la palabra
clave, o consultar noticias sobre paellas
o incluso comprar paellas en Froogle, el
buscador de productos de consumo de
Google… Bueno, ejem, tal vez no sea un
buen ejemplo, pero ya pilláis la idea. LIS
se basa en el motor de análisis Gecko, el
mismo utilizado por Mozilla y Firefox,
pero, según Robertson, “se han realizado
muchos cambios y mejoras” para poder
ofrecer funcionalidades extra e incluso
integran Hot Words en el cliente de
correo. Otros productos salidas de la factoría Linspire son PhoneGaim que permite realizar llamadas de voz sobre IP de
cliente Gaim a cliente Gaim y
MailMinder, un servicio integrado en el
cliente de correo de LIS que permite que
mensajes recordatorio se envíen en una
fecha determinada. Visita el enalce al pie
■
para más información.
http://info.linspire.com/suite.html
■ Palabras Calientes
No, no se trata de otro servicio 906 (o
sea cual sea el prefijo utilizado para
hablar con señoritas de dudosa moral
hoy en día), sino el último invento de
Linspire, antes conocido como Lindows.
6
Número 01
www.linuxmagazine.com.es
Software
NOTICIAS
■ (Otro) Linux de Bolsillo
Puedes ir por ahí con Linux en un CD,
puedes ir por ahí con Linux en un disquete… Y ahora puedes ir por ahí con
Linux en un pendrive, siempre y cuando
cuentes con más de 128 Megabytes de
espacio. Lo que es más: ni siquiera tendrás que rearrancar. La gente de
MetroPipe (http://www.metropipe.net)
ha colocado en su sitio web una distribución completa que funciona
desde cualquier dispositivo USB con
capacidad de lectura y escritura. La
distribución, llamada “Virtual Private
Machine” se puedes llevar en un pendrive, se puede llevar en un USB
Watch e incluso se puede llevar en un
iPod. ¿Te sientas a un ordenador corriendo Windows? No hay problema.
Enchufa tu dispositivo USB a cualquier
puerto, haz clic en el icono que aparece
y se cargará un entorno completo Linux
listo para ser utilizado. Sin cerrar
Windows, sin rearranques, sin problemas. Si el sistema subyacente, sea
Windows o Linux (para Mac en breve),
tiene conexión a Internet o una red local,
■ PubSub no es para ir de copas
Firefox vuelve a demostrar su implantación en el mercado de los navegadores. Esta vez nos dan PubSub, una
barra lateral que nos permitirá navegar
blogs, grupos de noticias y resúmenes
RSS. La barra se instala en la parte
izquierda del navegador y permite monitorizar en tiempo real cambios de webs
de noticias, grupos de noticias de usenet
y más de tres millones de weblogs. Los
nuevos elementos aparecen en la barra y
podemos expandir la noticia en la ventana principal del navegador simplemente pulsando en el enlace. Nada más
instalar PubSub, podemos acceder al servicio cerrando y rearrancando el navegador y, a continuación, escogiendo de
podrás utilizarla sin tocar un solo fichero
de configuración. Y cuando te vayas,
todos los cookies, ficheros y logs estarán
en tu pendrive, no en el ordenador
cliente, que queda tal como estaba,
limpio de polvo y paja. La distro VPM se
encuntra disponible en el enlace al pie. ■
http://www.metropipe.net/
ProductsPVPM.shtml.
■ El “Access” de OpenOffice
View/Sidebar/PubSub Sidebar. En una
primera instancia, se nos ofrece información genérica (mucha información sobre
la carrera presidencial americana,
mucho Bush, mucho Kerry, etc.), pero
podemos configurar la barra que
muestre la información que nosotros
deseemos abriendo una cuenta en
PubSub.com. Podemos escoger que nos
sirvan información de varias fuentes y, a
través de una formulario, especificamos
las palabras claves que se han de utilizar
para filtrar las noticias y confirmamos
nuestra suscripción pulsando en un
enlace remitido por correo electrónico.
Seguidamente, cambiamos los Options
and Settings en la barra para incluir la
dirección de correo electrónico
que utilizamos para suscribirnos
y la contraseña que PubSub nos
envíe. Con desconectar y volver a
conectar al servicio, aparecerán
las cuentas que hemos habilitado. A los pocos minutos, la barra
empezará a llenarse de noticias a
medida que se producen a lo
largo y ancho del blogsphere,
Usenet y web. Para aquellos que
les va este tipo de cosas, PubSub
también se encuentra disponible
para MSIE. Descarga la barra del
■
enalce de más abajo.
http://www.pubsub.com/
sidebar-firefox.php.
La nueva versión de OpenOffice, número
2.0, integrará una aplicación similar a
MS Access, para aquellos que lo echen
de 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 se
accede a la creación de otros formatos de
documentos en OpenOffice. Los documentos creados con Base, que así se
llama el programa, podrán guardarse en
el lugar elegido por el usuario y utilizarán un formato específico de
OpenOffice. Sin embargo, la integración
existente con otras bases de datos, que
permite acceder a datos guardados bajo
formatos como MSAccess, Oracle, dBase
y MySQL, se seguirá conservando. Los
paquetes generados con Base integrarán
fuentes de datos, formularios, consultas
e informes, en un mismo paquete de
manera similar a como lo hace Access.
Para la fuente de datos, el equipo de
OpenOffice se ha decantado por
HSQLDB, un motor de bases de datos
basado en Java que se integra perfectamente con la implementación gratuita
del lenguaje, Kaffe. HSQLDB destaca por
su pequeño tamaño, rapidez y la posibilidad mantener los datos en memoria
■
durante la ejecución.
http://dba.openoffice.org/miscellaneous/
dba20.html
www.linuxmagazine.com.es
Número 01
7
NOTICIAS
Negocios
Negocios
positivamente de
Linux, y en especial decide omitir
la conclusión, donde
se dice literalmente:
“El estudio de TCO
(Total Cost of Ownership) encontró que Linux ofrece sin
lugar a dudas ahorros en costes,
economía en el escalado y ventajas técnicas, tal y como pueden atestiguar
muchos usuarios satisfechos. Sin embargo, los ahorros en costes no son
automáticos. No se obtienen sin sus
debidas diligencias y no se aplican necesariamente a todos los entornos. En última 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 “independientes” con el fin de influenciar las
■
decisiones de sus clientes.
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 exenciones fiscales, pero según,
Omidyar, “[nos preguntamos] si
eBay es un tan buen ejemplo de
como la gente descubre su poder
individual, entonces, ¿tiene sentido como fundación poder
invertir en algo como eBay?”. De
momento, entre otras organizaciones, se
han asociado con Sourceforge para apoyar y financiar proyectos de software
libre. Más información en http://www.
■
omidyar.net/.
Las acciones del grupo
SCO han caído en picado
en estos últimos meses. El
lunes 25 de octubre, sus acciones cerraron a 3,01 dólares por acción, lo que
supone una caída de un 83% con respecto 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 millones 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.
■ Novell vs. Ballmer
En 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 compañí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 independencia 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 acusan 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
■ eBay: Open Source a Subasta
El fundador de eBay y filántropo Pierre
Omidyar acaba de de tomar una decisión
importante en su carrera como benefactor de la humanidad: a partir
de ahora, su fundación, anteriormente Omidyar Foundation,
cambia de nombre y se convierte 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
8
Número 01
■ Hispafuentes y Ceres
La 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 administración electrónica y permite acceder a
todos los servicios que, como la Agencia
Tributaria entre otros, admiten certificados 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 acostumbrados la administración, a partir de
ahora, y gracias a Hispafuentes, todos
los usuarios de Linux que utilicen navegadores 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 conjunció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 driver se puede bajar de https://
software-libre.org/projects/opensc-ceres/■
■ SCO on the Rocks
www.linuxmagazine.com.es
Noticias
Noticias
■ Creciendo Juntos
■ Lexmark lo intenta… ¡Fallaaaa!
En la eterna partida entre usuarios y consumidores contra corporaciones con
afanes abusivos monopolísticas, el
equipo de los consumidores acaba de
marcar un importante tanto. Ya se sabe
que sólo hace falta que una empresa
aulle “¡Propiedad Intelectual!” para que
un ejército de abogados sin nada mejor
que hacer salga arrastrándose de debajo
de las piedras, presto a defender la compañía, el sistemas capitalista y la civilización moderna tal y como lo concebimos ante la salvaje horda de piratas,
usurpadores de copyright y Pedosperos
varios que andan a la búsqueda de la
destrucción del mundo. En este caso, fue
la compañía fabricante de impresoras
Lexmark y el artículo de consumo origen
de la controversia, un… ¿cartucho de
toner? Pues sí, amiguitos y amiguitas, un
cartucho de toner. En el 2003, el
Lexmark tuvo la genial idea de dotar a
sus cartuchos de un chip que implementaba tecnología DMCA (el que se utiliza habitualmente para evitar la reproducción de medios pirateados e implementado en el sistema Palladium de
Microsoft) para evitar que terceras partes
creasen clones de sus cartuchos. Como
es bien sabido, existe toda una industria
dedicada a producir versiones más
baratas de consumibles de impresora
originales, aportando, de paso, una
NOTICIAS
buena y necesaria dosis de competitividad al sector. Uno de los jugadores
de dicha industria, Static Control
Components, ni corto ni perezoso, le
aplicó la ingeniería inversa al chip y a las
pocas semanas estaba vendiendo su
propia versión, el “Smartek”, a fabricantes de toner para que la incorporasen
a sus cartuchos. Cómo viene siendo
habitual, cuando una empresa no puede
hacer nada en el campo de batalla del
mercado, pues se pleitea y punto.
Lexmark hizo lo propio y arrastró a SCC
a los tribunales. En un principio,
Lexmark pareció ganar el tanto, cuando
un juez, a principios del 2003, falló en
favor del fabricante de impresoras. Pero
al final ha prevalecido el sentido común
y en un nuevo fallo de octubre del 2004,
otro tribunal invalida el primer dictamen, alegando que no es de recibo colocar dispositivos de DMCA en algo que no
sea un producto con copyright. En concreto, el fallo reza: “Debemos dejar bien
claro que en futuro, empresas como
Lexmark no pueden utilizar tecnologías
DMCA en conjunción con leyes sobre
copyright para crear monopolios de
bienes manufacturados para sí mismos”.
■
Ámen.
A estas alturas de siglo ya todo el mundo
está familiarizado con el estudio de
Andago donde se nos cuenta que el uso
del software libre ha aumentado un 39%
en España a lo largo del año pasado.
Esto no debe sorprendernos, máxime
cuando incluso un medio de comunicación mayoritario basan una campaña
en regalar un CD con Linux a sus lectores. HispaFuentes, por su lado, se
suma a la moción con su propio estudio
donde se afirma que para el 2007 el 25%
de los ordenadores a nivel mundial correrán una versión u otra de Linux. El
estudio basa sus conclusiones en la tasa
de crecimiento anual, que sitúa a Linux
como sistema operativo de mayor crecimiento con un índice de expansión del
16,6%. Le siguen en segundo lugar
Windows (por supuesto) con una tasa de
crecimiento del 10,5% y el farolillo rojo
lo componen otros Unices que ven
descender su implantación a un 4,5%
anual. En lo que se refiere a servidores,
la cuota de mercado será del 58,8% para
Windows (55,1% en el año 2002), del
■ OpenBSD 3.6
A primeros de noviembre se
liberó la nueva versión de
OpenBSD, la popular versión de Unix BSD de código
abierto, para su descarga o
pedido en CD. Aparte de
parches y mejoras varias, esta
nueva versión soporta SMB en
plataformas i386 y AMD64, se ha
depurado el servidor y clientes
DHCP y se han implementado nuevos
demonios para vigilar la conexión de
nuevos dispositivos. Asimismo, se ha
ampliado el catálogo de drivers, con
nuevos interfaces para dispositivos inalámbricos,
Ethernet sobre USB,
puentes PCI-ISA y
sensores varios. En el
apartado de mejoras,
se ha mejorado el
rendimiento y seguridad
en NFS. El catálogo de
software incluye portes para
más de 2700 aplicaciones y más de 2800
paquetes precompilados. Para más información, dirigirse a http://www.openbsd.
■
org/es/36.html.
32,7% para Linux (23,1% en 2002) y del
5,7% para Unix (11% en 2002), lo que
indica que la implantación de Linux
afectará bastante más a Unix que al sistema operativo de Microsoft con su
incremento de popularidad. Otra señal
de la gradual e imparable implantación
de Linux en el mercado mundial son las
cifras que se refieren al incremento de
volumen de negocio. El estudio señala
que crecerá de 280 millones de dólares
(cifra registrada en el 2003) a un apabullante 3.000 millones de dólares en el
■
2008.
www.linuxmagazine.com.es
Número 01
9
NOTICIAS
Inseguridades
Inseguridades
■ CUPS
El Common UNIX Printing System
(CUPS) es un sistema de impresión.
Álvaro Martínez Echevarria informó de
un error en la versión del Protocolo de
Impresión de Internet (Internet Pinting
Protocole o IPP) en versiones de CUPS
antertiores a 1.1.21. Un atacante podría
enviar un paquete cuidadosamente
escrito al puerto IPP, lo que podría provocar que CUPS dejara de escuchar en ese
puerto y desencadenar un ataque de
denegación de servicio. Para poder
explotar este error, un atacante tendría
que tener la capacidad de enviar un
paquete UDP al puerto IPP (por defecto,
631). El proyecto de Vulnerabilidades y
Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://
cve.mitre.org) ha asignado el nombre
■
CAN-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
■ getmail
getmail es un sustituto fiable de fetchmail
que soporta Maildir, Mboxrd y envío de
MDAs externos. David Watson descubrió
Políticas de seguridad de la Distribuciones Mayoritarias
Distribuidor
Fuente Seguridad
Debian
Info:http://www.debian.org/security/
Lista:http://www.debian.org/debian-security-announce/
Referencia:DSA-…1)
Gentoo
Mandrake
Red Hat
Slackware
Suse
1) Todos los distribuidores muestran correos de seguridad en el campo Subject.
10
Comentario
Los avisos de seguridad actuales se incluyen en la página de inicio. Los avisos
se proveen como páginas HTML con
enlaces a los parches. Los avisos también
incluyen una referencia a la lista de
correo.
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.
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.
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.
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.
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.
Número 01
www.linuxmagazine.com.es
una vulnerabilidad en getmail cuando se
configura para correr como root y envía
correo a ficheros maildir/mbox de usuarios locales no de confianza. Un usuario
local malicioso podría explotar una condición de carrera, o un ataque symlink similar y dotar a getmial con la capacidad de
crear o sobrescribir ficheros en cualquier
directorio en el sistema. No se debe ejecutar getmail como usuario privilegiado ni,
en la versión 4, utilizar un MDA externo
con privilegios de usuarios y grupos
explícitamente configurados. Todos los
usuarios de getmail deben actualizar a la
■
última versión.
Referencia Debian: DSA-553-1
Referencia Gentoo: GLSA 200409-32/getmail
Referencia Slackware: SSA:2004-278-01
■ Mozilla
Mozilla es un navegador web de código
abierto, un cliente de correo y grupos de
noticias avanzado, cliente IRC y editor de
HTML. Se han descubierto recientemente
varios errores en la suite. Jesse Ruderman
descubrió un error de scripting multidominio en Mozilla. Si a un usuario se le
engaña para que arrastre un enlace de
Javascript hasta otro marco o página, se
dota al atacante de la capacidad de hurtar
o modificar información sensible de ese
sitio. Además, si a un usuario se le
engaña para que arrastre secuencialmente
dos enlaces a otra ventana (no marco), se
le dota al atacante de la capacidad de ejecutar comandos arbitrarios. El proyecto
de Vulnerabilidades y Exposiciones
Comunes (Common Vulnerabilities and
Exposures o CVE - http://cve.mitre.org)
ha asignado el nombre CAN-2004-0905 a
este problema. Gael Delalleau ha descubierto un desbordamiento de entero que
afecta le código que maneja BMP dentro
de Mozilla. Un atacante podría utilizar un
fichero BMP cuidadosamente manipulado
para provocar un cuelgue del programa o
que ejecuta código arbitrario cuando se
visualizase el archivo. El CVE ha asignado
el nombre CAN-2004-0905 a este problema. Georgi Guninski ha descubierto un
desbordamiento de búfer basado en pila
en las rutinas de muestra de vCard. Un
atacante podría crear un vCard cuidadosamente manipulado que podría hacer
que Mozilla se cuelgue o ejecute código
arbitrario cuando se muestra. El mismo
Inseguridades
autor ha descubierto otro desbordamiento
de búfer basado en pila en el módulo de
“Envío de Página”. El proyecto de
Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://cve.mitre.org) ha
asignado el nombre CAN-2004-0902 a
este problema. Wladimir Palant ha descubierto un fallo en la manera en que
Javascript interactúa con el portapapeles.
Un atacante tiene la posibilidad de utilizar
código malicioso de Javascript para robar
datos sensibles que han sido copiados al
portapapeles. El proyecto de Vulnerabilidades y Exposiciones Comunes
(Common Vulnerabilities and Exposures
o CVE - http://cve.mitre.org) ha asignado
el 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 herramientas de the GIMP (GTK+), una librería para la creación de interfaces gráficos
de usuario para el sistema de ventanas X.
Durante las pruebas de un fallo anteriormente corregido en QT (CAN-2004-0691),
se descubrió un error en el procesador de
imágenes BMP de gtk2. Una atacante
podría crear un fichero BMP cuidadosamente manipulado que podría provocar
que una aplicación entrase en un bucle
infinito
y
no respondiese a las entradas del usuario
cuando fuese abierto por la víctima.
El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://
cve.mitre.org) ha asignado el nombre
CAN-2004-0753 a este problema. Durante
una auditoría de seguridad, Chris Evans
descubrió un desbordamiento de pila en
el decodificador de imágenes XPM. Una
atacante podría crear un fichero XPM
cuidadosamente manipulado que podría
hacer que una aplicación enlazada con
gtk2 se cuelgue o posiblemente ejecute
código arbitrario cuando la víctima abra
el fichero. El proyecto de Vulnerabilidades
y Exposiciones Comunes (Common
Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado los
nombres CAN-2004-0782 y CAN-20040783 a este problema. El mismo autor
también descubrió un desbordamiento de
entero en el decodificador de imágenes
ICO. Un atacante podría crear un fichero
ICO cuidadosamente manipulado que
hiciera que una aplicación enlazada con
gtk2 se cuelgue cuando la víctima abriese
■
el 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.org
OpenOffice.org es un conjunto de aplicaciones para la productividad ofimática
que incluye programas de escritorio,
como procesadores de texto, hoja de cálculo, administrador de presentaciones,
editor de fórmulas y un programa de diseño. La empresa Secunia Research informó de un problema derivado de la manipulación de ficheros temporales en
OpenOffice.org. Un usuario local malicioso podría utilizar este fallo para acceder a los contenidos de los documentos
abiertos de otro usuario. El proyecto de
Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and
Exposures o CVE - http://cve.mitre.org)
ha asignado el nombre CAN-2004-0752 a
este problema. Se aconseja a todos los
usuarios de OpenOffice.org que actualicen sus programas con los paquetes de
actualización de OpenOffice.org que contienen un parche retroactivo para corregir
■
este problema.
Referencia Mandrake: MDKSA-2004:103
Referencia Red Hat: RHSA-2004:446-08
■ SpamAssassin
SpamAssassin aporta maneras de reducir
correos electrónicos comerciales no solicitados (SPAM) en las bandejas de correo
entrante. Se ha encontrado un error de
denegación de servicio en versiones inferiores a 2.64. Un atacante malicioso
podría crear un mensaje de tal modo que
provocaría que SpamAssassin dejara de
responder. Este ataque de denegación de
servicio
podría
provocar
que
SpamAssassin deje de remitir y filtrar
correo. El proyecto de Vulnerabilidades y
Exposiciones
Comunes
(Common
Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado el nombre CAN-2004-0796 a este problema. Los
usuario de SpamAssassin deberán actu-
NOTICIAS
alizar sus sistemas para incluir los paquetes nuevos que solucionan este problema.
Los nuevos paquetes contienen un parche
retroactivo que no es vulnerable a este
tipo de ataques de denegación de servi■
cio.
Referencia Red Hat: RHSA-2004:451-05
■ XFree86
XFree86 es una implementación de código abierto del sistema de ventanas X.
Aporta una funcionalidad básica de bajo
nivel para la que están diseñadas los
interfaces gráficos de usuario (GUIs) completos tales como Gnome o KDE. Durante
una auditoría de código fuente, Chris
Evans descubrió varios fallos de desbordamientos de pila y un desbordamiento
de entero en la librería libXpm de X.org
utilizada para decodificar imágenes XPM
(X PixMap). Un atacante que supiera
aprovechar este problema, podría crear
un fichero XPM cuidadosamente manipulado que haría que una aplicación enlazada con la mencionada librería se colgase y
ejecutase código arbitrario si el fichero es
abierto por la víctima. El proyecto de
Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and
Exposures o CVE - http://cve.mitre.org)
ha asignado los nombres CAN-2004-0687
, CAN-2004-0688 y CAN-2004-0692 a
estos problemas de seguridad de XFree86.
Se descubrió un fallo en el X Display
Manager (XDM). XDM abría un socket
TCP chooserFd, aún si el parámetro
DisplarManager.requestPort
estuviera
establecido como 0. El efecto de esta
situación es que permitía el acceso de
usuarios autorizados al ordenador a
través de X, aún si el administrador del
ordenador hubiera configurado XDM para
rechazar conexiones. Aunque XFree86
versión 4.3.0 no era vulnerable a este
problema, Red Hat Enterprise Linux 3
contenía un parche retroactivo que introducía el error. El proyecto de
Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://cve.mitre.org) ha
asignado el nombre CAN-2004-0419 a este
■
problema.
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
www.linuxmagazine.com.es
Número 01
11
PORTADA
Especial Redes
Los Qués y Cómos de la Administración de LANs
La Enredadera
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
E
l correr de aquí para allá con disquetes 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 exiliados 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
12
Número 01
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 Planteamientos
Las 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 recompensa a medio y largo plazo, especialmente si la red tiende a seguir creciendo 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 herramientas estándar
en un principio,
tienen la ven-
www.linuxmagazine.com.es
taja de que se encuentran disponibles en
casi cualquier distribución . Y una vez
que se tiene la red montada y en funcionamiento, 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. ■
COVER STORY
Herramientas de Red .........13
Desde 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 herramientas estándar suministradas con Linux
pueden ayudarnos a ello.
Servidores DHCP................16
La 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 administrativo.
SCPM...................................21
El 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 configuraciones.
CUPS: Impresión en Red ....23
La compartición de una impresora entre
múltiples usuarios puede ayudar a ahorrar
dinero y recursos. Podemos conectar impresoras a un servidor CUPS para dar acceso
incluso a clientes de Microsoft o Apple.
RECURSOS
[1] Guía de Interfaz Humano de Gnome:
http://developer.gnome.org/projects/
gup/hig/
[2]Freedesktop.org http://freedesktop.org/
Herramientas Red
PORTADA
Introducción a Herramientas de Red
Linux en 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
U
n ordenador sin conexión al
mundo exterior parece un paso
atrás. Si bien los distribuciones
de Linux de hoy en día soportan normalmente 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 necesita un ordenador para conectarse a una
red.
Una red puede no responder o una
máquina aislada (por ejemplo un servidor Web) puede no estar accesible. Los
principales distribuidores de Linux
disponen de herramientas que controlar
estas situaciones.
Fundamentos de redes
El componente básico de Internet y de
numerosos sistemas de red local es el
TCP/IP. Es una combinación del Protocolo de Control de Transmisiones y el
Protocolo de Internet, especificando
como se comunican e intercambian
datos los ordenadores en una red.
GLOSARIO
DNS: los servidores DNS contienen bases de
datos que se pueden usar para emparejar
direcciones IP con nombres de Internet (y
viceversa). Buscan en sus bases de datos para
responder consultas enviadas por buscadores
y aplicaciones de Internet desconocidas por
sus usuarios. Un usuario que escribe
www.google.com está realmente formulando una consulta cuya respuesta es la
dirección IP 216.239.39.99. Es con esta dirección con el que el buscador abrirá realmente
la conexión.
Como un navegador
Web no necesita saber si la
información se transmite
mediante componentes inalámbricos o mediante
líneas FDDI, ni las líneas
FDDI necesitan saber si los
bytes que transporta corresponden a ficheros HTML,
Figura 1: Los numerosos datos de obtenidos por “ip addr” incluyen
MP3s o vídeos, los experinformación crítica de la dirección IP actual e “inet” indica la mástos en redes utilizan un
cara de red.
modelo basado en capas
para describir las redes de
ordenadores. Al margen de que cada
el usado, por ejemplo, por los canales de
capa se apoya en la capa subyacente, las
Real Audio.
capas son independientes entre sí.
En la siguiente capa es donde las cosas
La capa aplicación, como su propio
empiezan a ponerse interesantes. Aquí
nombre indica, define como las aplicaes donde los paquetes de información
ciones como buscadores o programas de
(independientemente de su contenido)
correo hablan con servidores Web o de
son puestos en un cable e intentan buscorreo. El medio por el cual ocurre esto
car la mejor ruta a su destino. Cada
depende de cada aplicación. Por ejembloque contiene la dirección de su remiplo, el Protocolo de Trasferencia de
tente y de su receptor. Cuando se sirve
Hipertexto, HTTP, es usado para Webs,
una página, los paquetes de información
mientras que el Protocolo de Transferenpueden utilizar rutas distintas. Tras acepcia de Ficheros, FTP, es usado
tar los paquetes, el receptor debe
habitualmente para la descarga de
asegurarse de que los paquetes se
ficheros.
pueden reorganizar en el orden correcto.
La capa de transporte está por debajo
Al margen del propio Protocolo de Interde la capa de aplicaciones. Esta capa
net, la capa de red contiene otros
establece las conexiones entre ordeprotocolos como el Protocolo de Control
nadores, permitiéndoles el intercambio
de Mensajes de Internet, ICMP, para el
de datos. TCP proporciona un canal de
control de mensajes (por ejemplo, de
garantía (para protocolos de aplicaciones
error), el Protocolo de determinación de
como HTTP, SSH, POP o SMTP), aseguDirecciones, ARP, que confronta direcrando que los bloques de información
ciones IP con direcciones de hardware
que fallen son retransmitidos. El Proto(MAC) y, su homólogo, el Protocolo de
colo Datagram (UDP) es otro protocolo
Inversión de Direcciones Determinadas
importante a este nivel que puede trans(RARP).
mitir bloques de información, pero con
La capa inferior del modelo OSI es la
perdidas de paquetes. Este protocolo es
capa Física. A este nivel estamos intere-
www.linuxmagazine.com.es
Número 01
13
PORTADA
Herramientas Red
Figura 2:“ip route” proporciona información IP más clara.
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 identificados 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 estado
Antes 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 paquetes de datos destinados al exterior
abandonen la red local.
El comando ip proporciona detalles de
la configuración actual. Los sistemas
antiguos puede que solo tengan los
comandos ipconfig y route, que proporcionan la misma información, pero en
un formato distinto. Es posible que si el
sistema no puede localizar estos comandos sea por que estén instalados en
/sbin, que no es una ruta habitual de
búsqueda. Si éste es el caso, simplemente 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í sucesivamente. Esto mostrará nuestra dirección
IP (192.168.1.245 en la Figura 1), la máscara 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 direcció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
Figura 4:“traceroute” muestra la ruta hasta “linux-magazine.com”.
14
Número 01
Figura 3: La máquina receptora, 192.168.1.1, respondió a los 5 pings enviados.
www.linuxmagazine.com.es
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 herramienta de configuración de nuestro
distribución (por ejemplo YaST for Suse)
y comprobar nuestra configuración.
Ping-Pong
ping 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 nuestro 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 nombredehost lanza un ping hacia el receptor
hasta que presionamos [Ctrl-c]. En su
Figura 5:“mtr” combina los resultados de “traceroute” y de “ping”.
Herramientas Red
Figura 7: ¿Cuantos paquetes van y vienen desde qué dirección?
lugar podemos especificar ping -c 10
nombredehost para transmitir solo 10
pings.
Rutas
Si bien ping simplemente nos informa de
la respuesta de nuestro objetivo, traceroute (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 presionamos [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 perdidos; RCVD y SENT informan del número
de paquetes que fueron recibidos y enviados; y las columnas BEST, AVG y
WORST indican cuanto tiempo tardaron
los paquetes.
PORTADA
Figura 8:“iptraf” proporciona estadísticas de red detalladas.
Para mayor precisión…
¿Quién va?
… 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 herramienta nosotros mismo. Necesitamos 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.
Tiene sentido la instalación de herramientas 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. Escribiendo [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 estadí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 alternativa a los conocimientos básicos de
■
redes.
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 enviado 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 buscadores Web usan. Por otro lado,
tcpdump nombrehost nos mostrará el tráfico de red del host destino.
RECURSOS
[1] tcpdump: http://www.tcpdump.org/
www.linuxmagazine.com.es
Número 01
15
PORTADA
DHCP
Un servidor DHCP para una red de área local
Redes sin Estrés
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 direcciones 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
N
o importa si se está trabajando
diario se encuentran con problemas
de nombres, usar diferentes máscaras de
para una empresa, si se está
cuando el número de máquinas conecred o incluso asignar una dirección IP
organizando una party en el
tadas a la red crece de forma continua.
diferente al router para acceder a redes
campus, si se está montando una red en
Cada IP sólo puede ser asignada a una
públicas), implicará reconfigurar de
un complejo turístico o simplemente te
máquina para evitar conflictos en la red.
forma manual cada máquina.
estas montando una red en tu propia
Incluso suponiendo que se mantenga
Los usuarios de ordenadores portátiles
casa, configurar de forma individual
cuidadosamente las asignaciones IP (y
también tienen que saber cómo y dónde
cada máquina de la red implica trabajo
uno sepa donde está la lista), si se quiere
realizar los cambios oportunos para
extra. Desde luego, un administrador de
reestructurar la red (añadir un servidor
conectarse a la red. Para ser honestos:
sistemas puede asignar direc¿Sabes cómo configurar los
ciones IP, máscaras de red,
parámetros de red en un
Listado 1: Un simple, pero completo
puerta de enlace por defecto y
MacOS 7.6? y ¿quieres admitir
dhcpd.conf
el nombre del servidor. Pero
que sabes como configurar la
01 default-lease-time 3600;
intenta hacer esto mismo con
red en Windows 98? El Proto02 max-lease-time 14400;
un grupo de gente con distincolo
de
Configuración
03
tos niveles de conocimiento y
Dinámico
de
Hosts
(DHCP)
04 subnet 192.168.2.0 netmask 255.255.255.0 {
empezarán a surgir los problenos
proporciona
la
respuesta.
05
range 192.168.2.50 192.168.2.69;
mas.
Para usar DHCP se necesita
06
option domain-name-servers 194.25.2.129;
Incluso los administradores
configurar
una máquina como
07
option broadcast-address 192.168.2.255;
de redes más experimentados
servidor
DHCP.
Una vez hecho
08
option routers 192.168.2.1;
y que llevan años adminisesto,
esta
máquina
será la
09 }
trando redes en su trabajo
responsable de establecer los
GLOSARIO
Dirección IP: Cada máquina de red se identifica con una única dirección IP de 32 bits. Para
que sea legible se usa la notación punto decimal, donde cada segmento de la dirección es
un número entre 0 y 255. Además de la direc-
16
Número 01
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-
www.linuxmagazine.com.es
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.
DHCP
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ámetros específicos para nuestra
red de área local, por ejemplo, estableciendo un servidor de fecha/hora o incluso el nombre de un
servidor WINS.
PORTADA
de DHCP ISC, dhcpd como
hace casi todo el mundo.
Si realmente deseas compilar 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 distribuciones encontrarán el paquete
RPM apropiado en el CD o
¿Cómo aplicamos esto en un
Figura 1: A partir de la MAC se puede trazar un mapa de direcciones MAC de
DVD de su distribución. Si no
caso real? Veamos una
fabricantes de tarjeta.
es así, se puede una búsqueda
pequeña red privada. En este
en http://rpmfind.net/ con el
caso “privada” significa que
… y un solo servidor
término debería devolver paquets para
la red usa un rango de direcciones IP priLa máquina que asignará las IPs necesita
nuestra distro o una independiente de
vado. Para evitar confusiones, estas
, como es lógico, un programa servidor
plataforma DHCP.
direcciones funcionan en nuestra red
DHCP. Por desgracia, no existen demasiPara continuar con la instalación, buslocal pero no en Internet.
adas implementaciones gratuitas de este
caremso en nuestras máquinas el
Las redes privadas realmente grandes
tipo de servidor, por tanto, para ilustrar
archivo de configuración dhcpd.conf en
(las denominadas de clase A) tienen raneste artículo, optaremos por el servidor
el directorio /etc/. El archivo está bien
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
Tabla 1: Configuración dhcpd
Entrada
Parámetro
Significado
clase B cuyo rango para redes privada
default-lease-time
Tiempo en segundos
Especifica el periodo válido de los valores asignados. El cliente tiene
van desde la 172.16.0.0 hasta la
que volver a solicitar la dirección IP dentro de este periodo. Si no lo
172.31.255.255. Pero si la red es algo
hace, la dirección puede ser asignada a otra máquina.
más modesta entonces podremos utilizar
max-lease-time
Tiempo en segundos
Especifica el máximo valor del periodo de asignación. Si el cliente
las 65023 direcciones disponibles entre
solicita un tiempo excesivo,este parámetro establece el máximo
192.168.0.0 hasta la 192.168.255.255.
valor.
Para las pequeñas empresas y los
subnet
Dirección de red
Segmento de red al que aplicar la configuración (Véase el Cuadro 1)
usuarios domésticos, las redes de clase C
netmask
Máscara de red
Máscara para este segmento de red (Véase el Cuadro 1)
se ajustan de forma adecuada. Voy a
range
Máxima y mínima
El rango de direcciones IP a asignar por el servidor DHCP.
dirección IP
usar las direcciones que tengo en mi
fixed-address
Dirección IP o nombre de host Una dirección de red para ser asignada de forma permanente.
casa para este ejemplo. Tengo asignada
filename
Nombre de archivo
Imagen de boot para un cliente específico (Véase la sección
la dirección 192.168.2.0 a la red (esto es
“Técnicas avanzadas de DHCP”).
útil si se pretende montar una red con
hardware ethernet
Dirección MAC
Dirección hardware del cliente.
los vecinos).
Muchas máquinas…
GLOSARIO
Servidor de nombres: Un servidor de nombres de dominio proporciona la traducción
de los nombres de hosts simbólicos (por
ejemplo linux-magazine.com) a una direcció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.
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 servidores de fecha/hora, más o menos precisos,
en la Web.
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
WINS: Es el Servidor de Nombres de Internet
de Windows, que relaciona los nombres NetBIOS de las máquinas con sus direcciones IP.
local.
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 produzcan 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ípicamente, este tipo de transmisión produce
sobrecarga en la red y debe ser evitado.
www.linuxmagazine.com.es
Número 01
17
PORTADA
DHCP
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 reflejen 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 centro 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.
Dirección IP, máscara de
red y dirección de red.
aAdemás de la dirección IP, la configuración
de un dispositivo de red consta de la direcció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 comprender 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 representació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 formato 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ácilmente. Los 24 unos son interesantes, la red
es referenciada como /24 (barra 24).
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 establecer 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 proveedor 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 configurable
De 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.
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 decimal es 192.168.2.0
Como la dirección IP cero está reservada
para la propia red y hay otra dirección reservada para broadcast ( típicamente .255), la
red del ejemplo puede albergar hasta 254
máquinas.
18
Número 01
Asignaciones permanentes
Si 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 identificar 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 ejemplo de una máquina Linux cuya
Listado 2: Usando ifconfig para descubrir
la dirección MAC
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
Aplicando la misma técnica, podemos ver
que la dirección IP 192.168.2.3 equivale a:
11000000.10101000.00000010.00000011
El resto de las entradas son usadas por
el servidor dhcpd para su propio uso
interno. Véase la Tabla 1.
Tabla 2: Valores Clientes
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.
www.linuxmagazine.com.es
DHCP
Figura 2: Habilitando el cliente de DCHP en Mandrake.
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 asignació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 direcciones 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 comunicado recientemente con su ordenador.
Pero, ¿Qué dirección MAC
elegimos?
Sin embargo, aún se necesita averiguar
que dirección MAC es la que estamos
PORTADA
Figura 3: MacOS X soporta DHCP.
tratando de buscar. En algunos casos
puede ser útil referirse a una base de
datos especial [2] que relacione las direcciones 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;
}
Listado 3: Usando ping y arp para descubrir
la dirección MAC
01
02
03
04
05
06
07
08
09
10
11
12
renner@lyra:~$ ping -c3 192.168.2.0
PING 192.168.2.0 (192.168.2.0): 56 data bytes
64 bytes from 192.168.2.1: icmp_seq=0 ttl=64 time=0.2 ms
64 bytes from 192.168.2.52: icmp_seq=0 ttl=64 time=3.5 ms (DUP!)
64 bytes from 192.168.2.53: icmp_seq=0 ttl=64 time=4.2 ms (DUP!)
64 bytes from 192.168.2.62: icmp_seq=0 ttl=64 time=4.7 ms (DUP!)
[...]
renner@lyra:~$ /usr/sbin/arp -a
? (192.168.2.1) at 00:03:E3:00:18:F1 [ether] on eth0
? (192.168.2.52) at 00:30:05:55:02:ED [ether] on eth0
? (192.168.2.53) at 00:0C:6E:1F:32:C4 [ether] on eth0
? (192.168.2.62) at 00:30:05:55:03:7F [ether] on eth0
GLOSARIO
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 configuraciones 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 configuración en las máquinas clientes, por ejemplo,
/etc/passwd, /etc/groups o /etc/hosts. Un
archivo llamado /etc/nsswitch.conf especifica
si el servidor NIS debe suministrar informació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 ejecutado. 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,…
www.linuxmagazine.com.es
Número 01
19
PORTADA
DHCP
Listado 4: Asignación de una imagen
de Boot
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 }
Si la máquina tiene múltiples NICs (p.e.:
una máquina con una tarjeta LAN Wireless adicional), se le puede asignar el
mismo nombre de host a ambas direcciones MAC:
host lyraB{
hardware ethernetU
00:80:C7:C1:3D:76;
fixed-address lyra.mtr.mynet;
}
En algunos casos, incluso se puede intercambiar 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 procedimiento 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:
20
Número 01
tftp dgram udpU
wait nobody
/usr/sbin/tcpdU
/usr/sbin/
in.tftpd /boot
Las distribuciones que
usan el sistema moderno xinetd, en vez del
superservidor inetd,
deberían tener en /etc/
xinetd.d/tftp un archivo como el mostrado
en el Listado 5.
Un único servidor DHCP puede mantener múltiples segmentos de redes al
mismo tiempo. Para permitir esto, hay
que crear múltiples subredes en la configuració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 asociado a uno de las NIC del servidor
DHCP
Para que se reconozcan los cambios, dhcpd debe ser reiniciado.
Como los cambios de este tipo sólo
ocurren ocasionalmente, los administradores se pueden tumbar y relajar
cuando se conecte una nueva máquina a
la red.
El Cliente
Las máquinas recién llegadas no necesitan mucha configuración. En vez
de ponerles una IP estática, se le habilita 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 siguiente:
iface eth0 inet dhcp
al fichero /etc/network/interfaces. Otras
distribuciones tienen herramientas de
configuración en formato gráfico. Mandrake 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.
www.linuxmagazine.com.es
Conclusión
No 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ácilmente 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.
Listado 5: El archivo
/etc/xinetd.d/tftp
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 }
INFO
[1] Servidor DHCP: http://www.isc.org/
index.pl?/sw/dhcp/
[2] Base de datos MAC: http://www.coffer.
com/mac_find/
Especial Redes
PORTADA
Modificación de la configuración del sistema con SCPM
Cambio de entorno
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 usuarios de Suse manteniendo perfiles con
distintas configuraciones.
POR FALKO ZURREL
L
inux 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 Perfiles
SCPM guarda una colección completa de
configuraciones (conocidos como perfiles) del sistema para distintos entornos,
permitiendo restaurarlas cuando sean
necesarios. Los perfiles no sólo almacenan los ficheros de configuración,
también almacenan información adicional, tales como si los servicios
específicos están activos o no. Esto hace
posible realizar todos los cambios
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 perfiles. Se puede añadir un nuevo perfil o
modificar la configuración de uno existente. 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.
Grupos
Los administradores pueden usar los
grupos para especificar servicios que
Tabla 1: Comandos SCPM
Activar 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
serán aplicados por el perfil. Por ejemplo,
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 configuració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 configuraciones 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 montador 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
Listado 1 Acceso a la base de datos SCPM y
creación de un recurso nuevo
01
02
03
04
05
06
#scpm db
SCDB Utility (SCPM version 0.9.4)
> load
> create resource /opt/tomcat/conf/server.xml file
> save
> quit
www.linuxmagazine.com.es
Número 01
21
PORTADA
Especial Redes
Figura 1: YaST2 ayuda a configurar SCPM.
ningún daño ya que SCPM no sobrescribe 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 postparada cuando se cargue o descargue un
perfil (ver Figura 3).
Cuando se selecciona un perfil diferente, SCPM primero ejecuta los dos
scripts de parada y avisa en caso de cambios no salvados. Acto seguido lanza los
scripts de pre-arranque, recuperando los
ficheros de configuración del nuevo perfil y los aplica al sistema. SCPM
comprueba si el servicio se está ejecutando y se asegura de que se haya
aplicado el estado indicado. El último
paso del proceso es llamar al script postparada.
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 lanzarlo 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 preconfigurados 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-
22
Número 01
Figura 2: Módulo SCPM de YaST2 - configuración.
gar el perfil que se quiera la próxima vez
que se arranque.
Configuración desde la línea
de comandos
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 nombre.
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 configuración a la vez, se necesita copiar el
directorio /var/lib/scpm/profiles/ en un
■
lugar seguro.
Aunque YaST2 hace el trabajo de configurar SCPM, arrancar continuamente
YaST para cambiar el perfil es un
engorro. La línea de comandos proporciona 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 comandos 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 cambia 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 confirmar antes de salvarlos
en el perfil.
Si se necesita cambiar
los ficheros de configuración que SCPM ignora
debido a la configuración, se puede realizar cambios manualmente en modo inFigura 3: Opciones de configuración para los perfiles.
teractivo con la base de
www.linuxmagazine.com.es
CUPS
PORTADA
Configuración de un servidor de impresión CUPS
EL ABC de la Impresión
Compartir una impresora entre
usuarios múltiples puede ahorrarnos
dinero y recursos. Conectemos nuestras impresoras a un servidor de
sistemas CUPS para dar acceso a
usuarios de Apple e incluso de
Microsoft.
BY TIM SCHÜRMANN
L
os ordenadores desfasados que han
sido reemplazados por nuevos
equipos son ideales como servidores de impresión en red. No sólo se
recicla así equipos considerados obsoletos, 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áxima. En algunas redes domésticas, distintos usuarios enviaran trabajos a impresoras 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.
Primeros pasos
Dos 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 dedicados que no necesitan GUI. Las distros
actuales instalarán CUPS habitualmente
como parte de la configuración original o
proporcionarán herramientas de configuración que podemos utilizar tras terminar 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 sistema de impresión antiguo por CUPS. La
documentación de CUPS nos proporciona 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 llamar 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 simples 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] proporciona detalles al respecto de estos
comandos.
Configuración basada en
Navegadores.
Al contrario que los antiguos sistemas
LPRng, CUPS está perfectamente adaptado a las redes al estar basado en el Protocolo de Impresión de Internet (Internet
www.linuxmagazine.com.es
Número 01
23
PORTADA
CUPS
Figura 1: La anotación “Allow” permite al ordenador con la dirección IP
Figura 2: La página de bienvenida del interfaz web del demonio CUPS.
192.168.0.16 acceder la web remotamente.
Suponemos que la configuración de privilegios de accesos correcta.
Printing Protocol, IPP [3]). IPP es una
extensión del Protocolo de Transporte de
Hiper - Texto (Hyptertext Transport Protocol, HTTP), usado para transferir páginas Web a través de Internet. Un ordenador, 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 procesos adicionales antes de enviar los datos
a la salida de la impresora. En otras palabras, cupsd es el núcleo del sistema
CUPS.
Podemos acceder al demonio a través
de nuestro navegador web escribiendo
http:// localhost:631. Simplemente debemos reemplazar localhost en esta URL
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 permitir el acceso externo debemos editar el
archivo de configuración /etc/cups/
cupsd.conf. Buscaremos secciones que
empiecen por <Location /...> y finalicen por</Location> (ver figura 1).
Las etiquetas de localización contienen detalles respecto a como CUPS
debe controlar el acceso a varias secciones. <Location /> se refiere al menú
principal y <Location /admin> al objeto Administration. Añadiendo Allow
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 ordenador se puede bloquear mientras el trabajo
de impresión se esta procesando. La mayoría
de las impresoras no tienen suficiente memoria 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 llamada 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 modelos 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
From 192.168.0.16 permitimos al ordenador 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ándolos, si tenemos los permisos necesarios. El comando lpstat nos proporciona
algunas funcionalidades. Si nuestra distribución tiene un programa de configuración para establecer impresoras es
preferible usar este programa. Por ejem-
LAS CARTA BOCA ARRIBA
24
Número 01
www.linuxmagazine.com.es
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 impresoras 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 convierte 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.
CUPS
PORTADA
Figura 3: La entrada de la configuración CUPS del centro de control KDE. Pulsaremos el espacio libre para mostrar más opciones útiles como funciones
Figura 4: El acceso “Printers” lista las colas de impresión que CUPS reconoce
para reiniciar el demonio.
incluyendo sus URIs (dispositivos URI).
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 mencionadas 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 versiones más nuevas de KDE tienen componentes para estar tareas. Los encontraremos en el centro de control bajo
Hardware|Printers (ver figura 3).
Usaremos el interfaz Web en los siguientes 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 especificaciones 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 similar al nombre de una página Web: parallel:/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 interfaces disponibles. Volveremos al asunto
de los URI más tarde.
Para crear una nueva cola de impresió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 siguiente 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 pruebas en la ventana del visualizador pulsando Printers|Print Test Page.
Configuración del cliente
El segundo paso es configurar los
equipos que compartirán nuestra impresora (los clientes). Hay numerosas formas de hacerlo, si bien hay un factor
común, el demonio CUPS cupsd, que
necesita estar ejecutándose como una
Figura 5a: Configuración de impresoras remotas en Suse Linux 8.2. Primero le
Figura 5b: … a continuación introducimos el nombre del anfitrión y el
decimos a YaST que queremos acceder a una impresora remota que usa IPP…
recordatorio del URI para completar la configuración.
www.linuxmagazine.com.es
Número 01
25
PORTADA
CUPS
para evitar ejecutar el
CUPS. Cada ajuste ocupa una línea y
demonio CUPS en los
esta compuesta de una palabra clave y
clientes. Esto significa
su valor. Debemos mirar en [2] para
modificar el archivo de
echar un vistazo a los valores. El archivo
configuración
/etc/
contienen explicaciones cortas y ejempcups/client.conf. Buslos.
camos la línea que
Si estamos configurando la retranscomienza con Servermisión necesitamos las líneas que
Name. Puede que tengempiezan por Browse. El valor de Browamos que quitar la
seInterval define el intervalo en segunalmohadilla (#). Escribidos en el que el servidor retransmitirá
mos un espacio y
sus datos de configuración. Por ejemplo,
después el nombre o,
BrowseAddress 192.168.0.255 envía los
Figura 6: Tras habilitar el transporte, solo el equipo con IP 192.168.0.20
mejor, la dirección IP
datos a cualquier equipo en la subred
necesitará un demonio de impresión. Todos los trabajos de impresión
del servidor que proce192.168.0.
serán enviados a esta máquina.
sará los trabajos de
Polling es una alternativa útil a examiimpresión después de la
nar. En este caso el cliente recupera su
palabra ServerName (ver figura 6).
configuración desde el servidor. Desde el
tarea en segundo plano. Algunas
La tercera forma es probablemente la
lado del cliente el archivo cupsd.conf fija
distribuciones sólo ejecutan el demonio
más conveniente. Cada demonio CUPS
el valor de la palabra clave BrowsePoll
automáticamente al iniciar el sistema
retransmite a través de la red su configudel nombre o dirección IP del servidor.
si una impresora ha sido configurada
ración. Los clientes que reciben la señal
Disponemos de múltiples entradas de
en la máquina. YaST en Suse Linux 9
pueden usar inmediatamente sus colas.
BrowsePoll que permiten al cliente bustiene una opción para configurar el serLa ventaja de este procedimiento es una
car múltiples servidores. Si activamos
vidor más tarde. Para hacerlo, selecconfiguración extremadamente sencilla.
BrowseRelay, se indica al ordenador que
cionamos Change|Advanced y luego
Simplemente configuramos una nueva
transmita cualquier información que
CUPS Server. Si tenemos una distro
impresora en la máquina a la que esta
aprenda mediante polling a todos los
cuya programa de configuración no
conectada para permitir que cualquier
equipos de la subred.
nos permite esto debemos escribir
máquina en la red pueda acceder a ella.
un archivo de comandos de inicio
CUPS Reloaded
Por supuesto la retransmisión no es el
de CUPS y añadirlo los niveles de ejecumétodo más seguro. Cualquier ordeción 3 y 5 en nuestro directorio
Necesitamos reiniciar el demonio CUPS
nador que reciba la señal puede acceder
/etc/init.d/.
tras cambiar el archivo cupsd.conf. El
a la impresora. En el peor de los casos
comando para hacer esto depende de
Introducción de la Impresora
esto puede permitir a todo Internet
nuestro distribución. Los usuarios de
imprimir en nuestra impresora. la naveSuse Linux pueden usar /etc/init.d/cups
Necesitamos introducir los detalles de la
gación está activado en los paquetes de
restart. Si usamos la herramienta YaST
impresora en el cliente para permitirle
CUPS antiguos, pero las nuevas verpara cambiar la configuración también
encontrar esa impresora en la red. Para
siones no transmiten por defecto.
se encarga de reiniciar el demonio. El
hacer esto debemos lanzar el interfaz
La herramienta de configuración nos
dialogo KDE Print dispondrá de una lista
Web como hemos descrito con anterioripermite definir las
dad. Seleccionamos el Internet Printing
opciones de la retransProtocol (IPP) como el dispositivo
misión. De nuevo esto
(Device). Después introducimos la URI
significa usar YaST en
de la impresora remota, por ejemplo
Suse Linux. El objeto
ipp://myserver/printers/myprinter. Redel menú que necesitaemplazaremos myserver con el nombre o
mos está localizado en
la dirección IP de nuestro servidor de
Change/Advanced/
impresión y myprinter con el nombre de
CUPS Server Settings
nuestra cola de impresión. El programa
(ver figura 7). Para conde configuración proporcionado con la
figurar un servidor para
mayoría de distribuciones tiene opciones
retransmitir manualsimilares (las figuras 5a y 5b muestran
mente debemos modiSuse Linux). Repetimos este proceso
ficar el archivo de conpara cada cola de impresión externa. Es
figuración /etc/cups/
evidente que este procedimiento es farcupsd.conf. Las líneas
ragoso si tenemos un gran número de
que empiezan con el
Figura 7: Habilitación de examinar en Suse’s YaSt. En nuestro ejemplo,
impresoras. Parece lógico configurar
signo numérico (#)
los detalles de la impresora conectada son retransmitidos a la subred
CUPS de forma que use un servidor
serán ignoradas por
192.168.0.
remoto de impresión para cada trabajo
26
Número 01
www.linuxmagazine.com.es
CUPS
de impresoras desde este momento (ver
figura 8).
Si examinar parece no funcionar debemos comprobar la configuración del
host. Puede que necesitemos añadir
/etc/hosts para que la retransmisión funcione.
Integración de sistemas
Apple y Microsoft
Podemos 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 impresoras como Shared printers en el
diálogo de impresión. Versiones de
MacOS más antiguas necesitan el paquete netatalk. Es un requisito indespensable el añadir una entrada
para cada nueva impresora en el archivo 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 impresora:
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. Seleccionamos el dispositivo raw como el
modelo de impresión. Esto indica a
CUPS que debe enviar los datos
entrantes directamente al puerto de salida. 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 controlador apropiado cuando un cliente Windows intenta imprimir. De la forma que
se usa en los siguientes ejemplos, cupsaddsmb solo puede soportar contro-
Figura 8: Tras completar la configuración, el dialogo de impresión de KDE debe tener un a lista de
las impresoras remotas y sus detalles.
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 necesita 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 configuración smb.conf: printing = cups y
printcap name = cups. Las distribuciones actuales deben tener esta configuración por defecto. Los clientes de Windows necesitan un controlador de impresora capaz de generar Post-Script como
el Apple LaserWriter.
GLOSARIO
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://servername:631/... en lugar de IPP:// servername/...
ladores Adobe [6] PostScript o controladores desde su propia pagina de inicio.
Los controladores Adobe están disponibles solo como archivos EXE.
Primero necesitaremos ejecutar programas 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úsculas.
Ahora debemos modificar la configuració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á nuestras impresoras. Estos llevará nuestros
controladores al servidor Samba. Debemos 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
PORTADA
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 Windows 9x con contraseñas necesitaremos
suministrarlas: smb://user:password@
workgroup/server/sharename.
Opciones para Expertos
Este articulo solo trata de cómo configurar 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 impresoras. 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 problemas. 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.
RECURSOS
[1] Proyecto CUPS: http://www.cups.org
[2] Documentación CUPS: http://localhost:631
[3] IPP: http://www.pwg.org/ipp/
[4] CUPS FAQ: http://www.danka.de/printpro/faq.html
[5] Netatalk: http://netatalk.sourceforge.net
[6] Adobe: http://www.adobe.com
www.linuxmagazine.com.es
Número 01
27
DESARROLLO
SDL
Creación de un juego
Programación con SDL
En este artículo, el primero de una
SDL. Qué es, cómo funciona y, lo que
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.
es mucho más importante, cómo
¡Excavad, Excavad, Malditos!
usarlo para escribir un flamante
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ísticas 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 programadores ¿De acuerdo? ¡Bien!
Comencemos…
serie, Steven Goodwin da un vistazo a
juego, Explorer Dug.
POR STEVEN GOODWIN
Figura 1: La pantalla de bienvenida
S
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 parecidas a sus equivalente en DirectX. A
pesar de ello, no se emula Windows de
ninguna manera. En cambio, cada llamada a la API gráfica de SDL, por
ejemplo, utiliza directamente el controlador 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á soportado el control MTR (Memory Type
Range Register, [2]) aplicaciones aceleradas a pantalla completa (véase el
Cuadro 1: Dispositivos).
La API de audio puede reclutar los servicios de OSS, ESD o aRts para
suministrar música y efectos de sonido.
DL significa Simple DirectMedia
Layer y es una API multiplataforma para programar aplicaciones multimedia, como los juegos.
Aporta una base estable sobre la que los
programadores pueden trabajar, sin preocuparse 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 implementaciones de SDL para Linux (i386,
PPC, y PS2), BSD, Windows, Macintosh
OS 9/X, Solaris, Irix y BeOS.
Acceso versus Emulación
La API SDL está compuesta de cinco
subsistemas distintos: vídeo, audio,
CDROM, entrada de joystick y temporizadores. Cada uno apunta a un área de
desarrollo diferente y puede ser inicializada 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 proporciona soporte para una amplia
selección de formatos de ficheros gráficos, incluyendo, GIF, JPG, PNG y TGA.
El sitio principal de SDL [1] lista 109 librerías
diferentes,
actualmente
en
producción, suministrando un amplio
28
Número 01
www.linuxmagazine.com.es
Gran Bola de Fuego
La 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
Cuadro 1: Drivers
SDL no está limitado a X11 como dispositivo
de salida.También puede usar dga, fbcon ¡y
hasta aalib! Para hacer uso de estas caracterí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_VIDEODRIVER 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
SDL
diferentes: Ejecución, runtime, y desarrollo (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 mismísimo código de SDL. Esto no solo es
útil en el seguimiento de errores, tambié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 adicionales, 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 muro
El paquete SDL viene con un pequeño
conjunto de pruebas que permiten comprobar la integridad de cada subsistema.
Lo encontraremos en el directorio test, y
funcionará nada más terminar la instalación, siempre que haya salido todo
bien. En el caso de que surjan problemas, 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 configuració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 incluidas que gcc buscará. Todas las demás
cabeceras de archivos SDL están incorporadas dentro de ésta para así limitar el
mantenimiento. También necesitamos
enlazar la librería principal de SDL (libSDL) dentro de nuestra aplicación. Al
principio solo usaremos las funcionalidades 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 incluidos, se puede usar el programa sdl-config
para obtener esta información (véase
Cuadro SDLCONFIG).
El Mundo en Nuestras Manos
Nuestra primera incursión en la programación con SDL será la pantalla de
“bienvenida” del juego. Con esto abarcaremos 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) subsistemas y debería ser la primera función
SDL en un programa. Aunque podemos
inicializar subsistemas adicionales más
DESARROLLO
tarde, deberíamos comenzar siempre con
un SDL_Init, porque incluye la inicializació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 subsistema 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 anterior error se perderá.
Cerrar el sistema es tan simple como
llamar a la función SDL_Quit.
void exRelease(void)
{
SDL_Quit();
}
Cuadro 2: SDLCONFIG
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]] [--execprefix[=Dir]] [--version]
[--cflags] [--libs][--staticlibs]
$ sdl-config -libs
-L/usr/local/lib -Wl, rpath, /usr/local/lib -lSDL lpthread
www.linuxmagazine.com.es
Número 01
29
DESARROLLO
SDL
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 manejadores de señales del paracaídas y
terminará cualquier hebra que quede
activa.
La primera vez que vi tu cara
En SDL todos los gráficos se almacenan
en ‘superficies’. Es un termino que se ha
tomado prestado de DirectX y que significa ‘memoria gráfica’. La pantalla es
una superficie. La imagen del fondo es
una superficie. Los personajes son superficies, 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 pantalla. 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 superficie.
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, aunque la superficie que devuelve no es
diferente de cualquier otra.
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 software 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);
30
Número 01
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 absoluto.
Véase el cuadro Funciones de vídeo.
El parámetro final es un juego de indicadores 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 superficie 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 principal), seguimos teniendo que invocar
SDL_HWSURFACE. Puede que nosotros
estemos utilizando X11, pero otro
usuario podría no estar haciéndolo y tenemos que darles el mejor juego que
podamos.
Listing 2: First screen
Listing 1: Initialise
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 }
Cuadro 3: Paracaídas
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 oportunidad para llamar a SDL_Quit y liberar sus
recursos. El paracaídas se instala automáticamente en la inicialización, si no queremos
utilizarlo, debemos empezar la aplicación
con:
01
02
03
04
05
06
07
08
09
10
11
12
13
SDL_Surface *pImg;
if ((pImg = SDL_LoadBMP("welcome.bmp")))
{
/* Hemos cargado con éxito la imagen */
SDL_BlitSurface(pImg, NULL, pScreen, NULL);/* transferir todo */
SDL_UpdateRect(pScreen, 0,0,0,0);
/* toda la pantalla */
SDL_Delay(2*1000);
/* 2 segundos */
/* A continuación liberamos la superficie */
SDL_FreeSurface(pImg);
}
www.linuxmagazine.com.es
SDL
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 conmutar 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 depurador, 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 Terrenales
Además de la pantalla, necesitamos
algunas superficies de nuestra propiedad, dentro de las cuales podremos
dibujar nuestro gráficos. Hay dos formas
principales de crear nuestras propias
superficies. La primera es crear la superficie manualmente con una de las
siguientes funciones:
SDL_Surface *SDL_CreateRGBU
Surface(Uint32 flags, int widthU
Cuadro 4: Funciones de
vídeo
Estas funciones pueden suministrar alguna
idea útil sobre que modos de vídeo son posibles 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 resoluciones de pantalla disponibles.
SDL_VideoModeOK
Determina si un modo especi
fico de vídeo está disponible.
, 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, normalmente hay una gran cantidad de
pixels.
DESARROLLO
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 superficie. 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
Cuadro 5: Carga de profundidad
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 componentes 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 probablemente 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 transferencia de bloque o blit. Si se necesita
comprender el formato interno (tal como
veremos más tarde en esta serie) es agradable saber que SDL suministra la función
SDL_MapRGB para ayudarnos. En verdad,
este problema con el formato de los paquetes 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 funciones 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 producció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 personaje 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 impredecibles 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
typedef
typedef
typedef
typedef
typedef
unsigned char
signed char
unsigned short
signed short
unsigned int
signed int
www.linuxmagazine.com.es
Uint8;
Sint8;
Uint16;
Sint16;
Uint32;
Sint32;
Número 01
31
DESARROLLO
SDL
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 Blit
Podemos transferir bloques (blits) entre
dos superficies cualquiera y eso incluye
desde una superficie a sí misma. También podemos transferir bloques desde
una porción de una superficie, a una porció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 hardware, 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 recordatorio, véase el cuadro Dispositivos.
Hay una sola función para hacer transferencias 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 consume mucho tiempo de proceso no lo
usaremos en nuestro juego, ya que estamos 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 queremos 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
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 visible ó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 hicimos en la pantalla de bienvenida)
entonces pasaremos srcrect como NULL.
Solo usamos las coordenadas x, y de
dstrect refiriéndonos a la esquina superior 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 destino 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á dentro 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 recortada. Esta característica nos permite
mantener un área de la pantalla pura y
sagrada, sin tener en cuenta que componentes 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 imagen 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-
www.linuxmagazine.com.es
cie pantalla que hemos configurado no
es la imagen que se visualiza en la ventana. 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 naturalmente
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 bloques a nuestra pantalla y provocado la
actualización del monitor y así actualizarlo con nuestra propia imagen. De
esta manera, si añadimos un pequeño
retraso, completaremos nuestra primera
pantalla.
Producir un nivel del juego o personajes animados, es simplemente una
cuestión de mas transferencias de bloques, en más lugares, desde más
superficies. No implica nada más que lo
que ya hemos visto. Desafortunadamente, 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!
INFO
[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
Interfaces
DESARROLLO
Un primer paso hacia curses
Interfaces Simples
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
M
ucho más práctico, digo, es
tener una pantalla en blanco y
negro, con buen contraste, un
ordenador sencillito. Sinceramente, los
interfaces amigables con muchos colorines e iconos de diseño están
sobrevalorados. No sólo eso, sino que
pueden inducir a confusión. Si se piensa
racionalmente, muchas aplicaciones (la
mayoría) no necesitan de interfaz gráfico. Perfectamente podrían apañarse
con un interfaz de botones, menús y
ventanas basadas en texto. Amén de
resultar menos exigente con el hardware,
también serían más claros y más sencillos de utilizar. Precisamente para
desarrollar interfaces para aplicaciones
de estas características existe curses, una
librería que facilita enormemente la
creación de ventanas, menús y widgets
en terminales de texto. Por supuesto que
las librerías curses están disponibles para
la mayoría de los Unixes, incluyendo
Linux y suelen incorporarse con casi
todas las distribuciones e incluso existen
versiones para otras plataformas lo que
asegura, hasta cierto punto, la portabilidad del código (véase [1]). En este
primer capítulo destinado a curses
vamos a ver como emplear la librería
imbuida en la infraestructura de una
aplicación desarrollada en C++. Una
advertencia: el C++ no es el entorno
natural de curses y, al menos en un caso,
no conseguiremos unas compilaciones
cien por cien limpias (es decir, sin advertencias), si bien esto es más bien un
problema del compilador g++ que del
código de muestra o de un defecto de
curses, como después veremos.
Aplicándose a la tarea
Tal vez la manera más racional de enfocar el desarrollo de la aplicación (al
menos es la que funciona para mí) es el
de concebirlo desde arriba hacia abajo.
Es decir, piensa en como quieres que se
vea y ya te encargarás del trabajo sucio
después. Normalmente esto implica
empezar con la función main() y
reducirlo a unas pocas llamadas – y
cuando digo unas pocas, quiero decir
unas poquísimas. Si la función main()
puede contener como mucho 10 líneas
de código, es que vamos bien. Después
vamos implementando clases de las más
generales a las más específicas, siendo
estas últimas las que de verdad interactúan con las librerías específicas, curses
en este caso. Así que, yo ¿cómo quería
que se viese? Pues quería que en main()
se inicializase un objeto x de una clase,
llamémosle application, y que esa clase
se ocupase de mostrar la ventana principal de la aplicación, colocara los menús
etc. El resto de main() se ocuparía con
un bucle while que se encargase de
procesar los tecleos y pasarlos a la clase
application y, al final, cuando se pulsase
la tecla que precipitase la salida del
bucle, se llamase al destructor del objeto
y todo se recogiese limpia y ordenadamente. Sencillo. El corazón de dicha
clase se puede apreciar en el Listado 1.
No es muy impresionante ¿verdad? Eso
es por que la mayor parte del “trabajo
sucio” se lleva a cabo en window, que al
ser heredado por application, recibe una
llamada a su constructor cuando se crea
un objeto application. Y es en el constructor de window donde se inicializa
toda la infraestructura de curses,
preparándola para mostrar las ventana.
Se puede apreciar la herencia de window
por parte de application en el fichero de
inclusión application.h, no listado en
este artículo, pero que puede ser descargado desde la web de la revista en [2].
Un poco más adelante volveremos sobre
la clase window. Volviendo al constructor de application, lo primero que se
www.linuxmagazine.com.es
Número 01
33
DESARROLLO
Interfaces
hace es realizar una llamada al macro de
fabricación casera makeString() que
sirve para convertir una cadena con un
número de argumentos opcionales en
una sola cadena tipo string que se utilizará como título (asignado, pues, a la
propiedad de la clase title). Veremos más
sobre este macro en la sección Parámetros Indefinidos más abajo. Lo siguiente
es abrir una ventana con la que podamos
trabajar. Esta ventana será la del fondo,
la madre de todas las subsiguientes ventanas y donde se alojará el menú
principal del programa. La llamada es un
método de la clase window, heredada
por application y que veremos en la siguiente sección. El destructor de la clase
contiene una única instrucción, endwin(), la función de curses utilizado
para recoger la basura y para devolver la
terminal al estado que tenía antes de la
llamada a initscr(). De momento es todo
lo que necesitaremos para salir elegantemente de curses.
Abriendo la Ventanas
En la siguiente capa de nuestra aplicación, estaría la clase que administraría
cada una de las ventanas que se fuesen
creando, incluyendo la principal. Esta
capa viene representada por la clase window, la implementación de la cual se
puede ver en el Listado 2 (o al menos
parte. Se han dejado fuera los métodos
get y set correspondientes a varios atrib-
Listado 1: application.cpp
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
34
Número 01
utos. Ver [2]). Fijémonos que window
cuenta con dos constructores sobrecargados. Uno, el que no tiene parámetros,
sirve de constructor cuando se crea un
objeto application y crea el entorno
curses. Este constructor se llamará una
sola vez por aplicación y monta la ventana stdscr, el “contenedor” de todas las
demás ventanas. En el código se aprecia
como usa los métodos estándar de inicializar la pantalla y librería de curses
utilizando (initscr()) y como se activa el
mapeado del teclado (keypad(), esto
sirve para que las teclas de función, cursores, etc. devuelvan caracteres que el
programa pueda procesar, permitiendo,
por ejemplo, que si el usuario pulsa la
tecla F1, se active el sistema de ayuda,
etc.). A continuación, deshabilitamos la
secuencia de Nueva Línea + Retorno de
Carro cada vez que se produce una salida con la llamada a nonl() y le decimos
a la aplicación que ha de capturar las
pulsaciones en cuanto se produzcan sin
esperar a un carácter de nueva línea con
el procedimiento cbreak(). Esto último
nos permitirá procesar cada tecleo del
usuario como es debido, activando
alguna funcionalidad del programa si
pulsa un tecla de un carácter no imprimible o colocando una letra en la ventana
apropiada si el usuario desea escribir
algo. Por fin, evitamos que se visualicen
inmediatamente las entradas desde el
teclado con la función noecho(). De esta
manera, podremos capturar los tecleos y
procesarlos como nos convenga en el
contexto de la aplicación. Todas estas
funciones pertenecen a la librería de
curses y su uso es bastante estándar en
el arranque de cualquier aplicación que
utilice el paquete. El segundo constructor, window::window( int wide =
COLS,int high = LINES, int posX = 0,int
posY = 0, bool frame = TRUE, string
win_Name = "Untitled"...), sirve para
crear las ventanas con las que podremos
interactuar. Si nos fijamos, el constructor
de la clase application utiliza este constructor para generar el fondo visible de
la aplicación, con un marco (establecido
por el parámetro frame) y de un tamaño
igual a la del terminal donde se
mostrará. El tamaño de la terminal se
establece en líneas (LINES) y columnas
(COLS), siendo estas dos variables generadas por curses a la hora de inicializar
el motor y para la ventana principal de la
www.linuxmagazine.com.es
aplicación vamos a ocupar todo el terminal visible. Por ello, al invocar al
constructor de la ventana de fondo de la
aplicación en el constructor de application, utilizamos el alto y ancho máximo
disponible al arrancar el programa. De
hecho, lo primero que se hace en este
segundo constructor es crear una ventana con la función curses newwin() y
asignar el puntero que devuelve al atributo w_Handle. Este atributo nos será útil
más adelante para referirnos a cada una
de las ventanas cuando contemos con
más de uno. A continuación, procesamos el título de la ventana de manera
similar que hacíamos en el constructor
de application y establecemos al atributo
frame para dibujar (o no) un marco
alrededor de la ventana. Lo siguiente es
asignar la ventana a un panel. Los paneles en curses añaden propiedades a las
ventanas permitiendo que estas se apilen
por capas y se solapen de manera consistente. Para entendernos, sería muy difícil
tener ventanas de diálogos, ventanas
móviles y ventanas apiladas sin que
estas participaran de las funcionalidades
que les atribuyen los paneles. La conversión de una ventana “normal” en un
ventana panel es tan sencilla como se ve
en el listado: basta invocar a la función
curses new_panel() con el handle de la
ventana a convertir. La función devuelve
un handle al panel creado que
guardamos en el atributo p_Handle para
referencias futuras. Luego llamamos al
método de la clase putTitle() (que se ve
un poco más abajo en el listado). Éste
método, como su nombre indica, coloca
el título de la ventana en el ángulo superior izquierdo y, de paso, dibuja el marco
para la ventana. El siguiente método,
showPanels(), también perteneciente a la
clase window, muestra el panel llamando a update_panels() (que actualiza
el aspecto del panel) y doupdate() (que
actualiza la pantalla con la nueva información), ambas funciones pertenecientes a la librería curses. El método
putTitle() a su vez invoca al método
wWrite(), que es el método de la clase
encargado gestionar el paso de cadenas a
las ventanas de curses. Recibe tres o más
parámetros: los dos primeros establecen
la posición x e y de la cadena (tercer
parámetro) que se montará junto con los
parámetros indefinidos que le siguen. La
función mvwprintw(), perteneciente a la
Interfaces
DESARROLLO
Listado 2: window.cpp
01
02
03
04
05
06
07
08
09
10
11
12
#include "window.h"
42
43
44
45
46
47
48
49
50
window::window()
{
w_Handle=initscr();
keypad(stdscr, TRUE);
nonl();
cbreak();
noecho();
}
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);
librería curses, es la encargada de colocar la cadena en la ventana indicada por
el handle que se le pasa. Nótese como, a
pesar de que la mayoría nosotros estamos acostumbrados a referirnos primero
al eje de las x y después al eje de las y,
curses lo hace a la inversa, más bien
porque cuando hablamos de terminales
de texto, es habitual hablar primero de
líneas (componente vertical) y después
de columnas (componente horizontal)
en ese orden. Después de colocar la
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
}
void window::showPanels()
{
update_panels();
doupdate();
}
void window::wWrite(int px, int py, string
my_String...)
{
if (has_Frame)
{
px++;py++;
}
makeString(my_String);
mvwprintw(w_Handle,py,px,my_String.c_str());
wrefresh(w_Handle);
showWindow();
}
void window::showWindow()
{
nodelay(w_Handle,TRUE);
wgetch(w_Handle);
nodelay(w_Handle,FALSE);
showPanels();
}
void window::drawFrame()
{
wborder(w_Handle, ACS_VLINE, ACS_VLINE,
ACS_HLINE, ACS_HLINE, ACS_ULCORNER, ACS_URCORNER,
ACS_LLCORNER, ACS_LRCORNER);
}
int window::wGetch()
{
return(wgetch(w_Handle));
}
// Gets y sets varios aquí
cadena, llamamos wrefresh() que
refresca la ventana que acabamos de
modificar, que no la pantalla. El refresco
de la pantalla para que se puedan ver las
modificaciones se produce en el método
showWindow(), que llamamos a continuación. El método showWindow() es un
parche en la ya larga tradición de los
famosos parches de Paul C. Brown.
Nació cuando me dí cuenta de que curses
no me actualizaba satisfactoriamente las
ventanas si no había una entrada de
datos desde el teclado. Bueno, más bien,
si no se intentaba conseguir una entrada
desde el teclado. Por ello lo único que
hace esta rutina es anular la espera para
una entrada (nodelay()), leer el búfer de
entrada (wgetch() – normalmente dicho
búfer estará vacío, puesto que no espera
a que el usuario teclee nada) y volver a
activar la espera de entrada para, a continuación, actualizar los paneles
llamando a showPanels(). Sin este procedimiento, los paneles no se actualizan
www.linuxmagazine.com.es
Número 01
35
DESARROLLO
Interfaces
hasta una nueva entrada por parte del
que acepta, además de una serie de
que fuera iterando sobre la lista de arguusuario y no se mostrarán de motu proparámetros definidos, un número
mentos hasta que o (a) se leyese hasta el
pio cosa como los títulos o el borde. En
indefinido de otros parámetros. Hay
número de argumentos preestablecido o
cuanto a drawFrame(), su nombre lo
varias maneras de leer los parámetros
(b) se llegase hasta el argumento que
dice todo: dibuja un marco alrededor de
indefinidos a variables. Una sería la de
fuese igual al argumento definido como
la ventana utilizando para ello la rutina
pasar como argumento definido el
el último. Ambos métodos ofenden mi
curses wborder() y los valores prenúmero de argumentos indefinidos. Otra
sentido de la estética de la progradefinidos de curses para la barra vertical
la de incluir como definido un argumación, ya que ¿qué pasa si ni el mismo
(ACS_VLINE), tanto para el borde
mento que fuese igual al último de los
programador sabe cuantos argumentos
izquierdo, como para el derecho; la barra
argumentos indefinidos. En ambos casos
van se indefinidos? Yo opto por el
horizontal (ACS_HLINE) para el borde
crearíamos un bucle (en el primer caso
método (c), que consiste en que todos
superior e inferior ; y los gráficos de las
un bucle for y en el segundo uno while)
los argumentos se vuelcan en una lista
esquinas ACS_ULCORNER
(de tipo va_list) y se van
(esquina
superior
leyendo e integrando en el
Listado 3: va.h
izquierdo),
ACS_
argumento plantilla. Esto no
01 #include <stdlib.h>
URCORNER (esquina susería un problema si no fuera
02
perior derecho), ACS_
porque con curses, el uso de
03 #define makeString(return_String)
\
LLCORNER (esquina infeuna cadena de longitud
04 {
\
rior izquierdo), ACS_
indefinida (tipo char *cadena)
05
char *fmt;
\
LRCORNER (esquina infegenera
un fallo de seg06
if ((fmt=(char*)
rior derecho). Por fin, el
mentación.
En concreto, si
malloc(sizeof(char)*return_String.length()))==NULL)\
método wGetch() se enutilizamos
una
cadena de lon07
printf("ERROR: Memoria insuficiente");\
carga de recoger las
gitud
indefinida
*buf en un
08
else
\
entradas procedentes del
programa
C
o
C++
“normal”
09
{
\
teclado referidas a la ven(es
decir,
que
no
cargue
libr10
strcpy(fmt,return_String.c_str()); \
tana para que puedan ser
ería
“raros”
como
curses)
no
11
va_list args;
\
procesadas.
pasa
nada:
12
char *p;
\
Parámetros
indefinidos
Conviene explicar en un
aparte lo referente a las
funciones con parámetros
indefinidos. Estas funciones permiten que
funcionen, por ejemplo,
el socorrido printf() de C.
Si nos fijamos en como
funciona, si hacemos
printf("Tengo %iU
muñeca vestida deU
%s...",1,"azul");
devolverá
la
cadena
“Tengo 1 muñeca vestida
de azul...” y comprobamos que a printf(), que
no es más que otra función de las librerías
estándar de C, puede
recibir tantos parámetros
como gustemos… siempre y cuando el primero
sea el que indique el formato del mensaje a
mostrar. Eso es por que
printf() es una función
36
Número 01
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int n, size=10;
\
if((p = (char*) malloc(size)) == NULL)\
printf("ERROR: Memoria insuficiente");\
else
\
{
\
while(1)
\
{
\
va_start(args,fmt);
\
n=vsnprintf(p,size,fmt,args); \
va_end(args);
\
if (n < size)
\
{
\
break;
\
}
\
else
\
{
\
size = n+1;
\
if((p = (char *) realloc(p,size)) ==
NULL)\
{
\
printf("ERROR: Memoria Insuficiente");\
break;
\
}
\
}
\
}
\
}
\
return_String=p;
\
free(p);
\
free(fmt);
\
}
\
}
www.linuxmagazine.com.es
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 con
curses, si se utiliza una cadena
de longitud indeterminada y
después se utiliza sprintf() o
vsprinf() con una plantilla y
varios argumentos, el resultado es el dichoso error de
fallo de segmentación, uno de
los errores más irritantes que
tiene la insidiosa costumbre de
aparecer en el momento de la
ejecución, después de una
compilación exitosa. Otra pega
un tanto engorrosa es que
va_start() y va_end() han de
estar en la misma función que
recibe los parámetros indefinidos, por tanto veréis la
Interfaces
misma secuencia de comandos
repetida una y otra vez a lo
largo de las clases que estamos
analizando y no hay manera de
separarlos en una función
aparte. El tercer problema es
que sólo se nos permite operar
con cadenas tipo char *, lo que
teóricamente nos despoja del
privilegio de utilizar cadenas de
tipo string, con la de ventajas y
facilidades que aportan, caray.
Todos y cada uno de estos
inconvenientes se resuelven con
Figura 1: Nuestra primera aplicación, con marco y título.
el macro que se puede ver en el
Listado 3. ¿Cómo funciona? Pues, como
que size, es que se ha truncado la
se puede observar en el listado, lo
cadena. En este caso lo que hemos de
primero que hacemos es asignar espacio
hacer es aumentar el valor de size hasta
a una variable de tipo char* llamado fmt,
n+1 (la longitud total más el crácter
de hecho tanto espacio como caracteres
nulo /0) y reasignar memoria por el
contenga
el
argumento
string
nuevo valor a p. Es lo que se hace a con(return_String). A continuación copitinuación. Una vez que tenemos el
amos el contenido de return_String a
tamaño adecuado, volvemos a asignar la
fmt. a continuación asignamos un poco
cadena a p y podemos salir del bucle y
de espacio (size en bytes) a otra variable
asignar la cadena contenida en p a
char* llamado p. Esta variable contendrá
return_String y proceder a liberar la
la cadena procesada. Seguidamente,
memoria asignada a p y a fmt. Este ingecreamos la cadena final con un límite de
nioso truco viene de la página man de
size bytes. La función vsnprintf() asigna
vsnprintf(), si bien ha sido adaptado
tantos bytes a p como los indicados en
para que por un extremo entre una varisize, por tanto, no es posible excedernos
able tipo string sin los otros parámetros
de la cantidad de memoria asignada a p
para formatear y por el otro salga una
y evitamos posibles fallos de segvariable string con todos los parámetros
mentación. Ahora bien, si toda la cadena
dispuestos limpiamente en su interior.
no cabe en esos size bytes, vsnprintf()
Toda la basura se recoge, la memoria
devuelve el número de bytes que hubiera
reservada para las cadenas se libera,
cabido. Es decir, si n resulta ser mayor
todo queda inmaculadamente limpio tras
su ejecución. Este macro no produce una
compilación limpia. A la hora de compiListado 4: principal.cpp
lar con g++ genera una advertencia
01 #include "application.h"
allá donde se emplee que reza:
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 }
warning: second parameter ofU
`va_start' not lastnamedU
argument
Esta advertencia surge debido a que el
compilador es incapaz de reconocer una
cadena de tipo string como el último
argumento definido antes de la ristra de
argumentos indefinidos. Sin embargo, el
programa acaba compilando y se ejecuta
sin problemas.
Explotación
Por fin hemos llegado al momento de ver
nuestras clases en acción. Si miramos el
Listado 4, vemos que la función main de
DESARROLLO
nuestro programa es harto sencillo. Incluimos el fichero de
inclusión application.h que contiene la definición de la clase
application. A continuación,
declaramos una variable tipo
char para contener las pulsaciones del teclado y un objeto
tipo application. Llegados a este
punto, se visualizará en la terminal la ventana principal de la
aplicación, tal y como se ve en
la Figura 1. Seguidamente,
entramos en un bucle a la espera
de que el usuario pulse la tecla
INICIO o HOME, lo que cierra el bucle,
desencadenando la destrucción del
objeto application y cerrando el programa.
Compilación
Para la compilación con curses, hemos
de enlazar con la librería ncurses. Si
además empleamos paneles para poder
solapar ventanas, hemos de incluir la
librería panels y, por supuesto, hemos de
enlazar las clases que hemos creado.
Para todo ello existe un sencillo Makefile
que se puede descargar junto con el resto
del código fuente de [2].
Conclusión
Si bien parece que es poco lo obtenido
hasta ahora, hemos sentado las bases
para una aplicación mucho más compleja. Podríamos tomar lo desarrollado
como una plantilla para un programa
funcional e ir insertando nuevas funcionalidades con un de mínimo esfuerzo.
El mes que viene seguiremos utilizando
curses para implementar una aplicación
y veremos como crear ventanas modales
de diálogo, como crear botones y otras
funcionalidades que nos demostrarán
que los interfaces de texto siguen
■
estando vivitos y coleando
RECURSOS
[1] Curses en plataformas Windows:
http://www.funet.fi/pub/win-nt/curses/
http://www.crystalcom.com/crs_swin.
htm http://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
www.linuxmagazine.com.es
Número 01
37
DESARROLLO
Perl
Sobres impresos con Perl y PostScript
Cartas Postales Perfectas
No necesitamos ni un paquete Office
ni LaTeX para imprimir los sobres de
un mailing. Los módulos Perl de PostScript, 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
Prajuab Manklang, visipix.com
L
THE AUTHOR
inux puede hacer más o menos
cualquier cosa. Leer imágenes digitales desde cámaras, reproducir
pistas digitales, escribir CDs, incluso
conseguir que un escáner USB funcione
(con algo de ayuda de Xsane). Pero a
título personal tenía que utilizar Windows de vez en cuando para realizar una
tarea en concreto: a la hora de remitir
varias cartas iguales a distintos destinatarios, las direcciones de los cuales se
extraía de una base de datos, tenía que
slirme de mi adorado Linux, rearrancar
el ordenador, no distraerme ni ir a por un
café mientras la máquina arrancaba para
Michael Schilli trabaja como ingeniero
Web en la empresa
AOL/Netscape en
Mountain View, California. Escribió “Perl
Power“for AddisonWesley y puede ser
contactado en la dirección
[email protected]. Su página
web es http://perlmeister.com.
no perderme, el menú de arranque, y
meterme en mi semi-olvidada instalación de Windows, desde el cual, por
supuesto, no tenía acceso ni a la mitad
de las herramientas a las que Linux me
tiene acostumbrado y sin las cuales me
siento totalmente desamparado. Un
montón de trabajo para imprimir unos
sobres. Solía usar un viejo programa de
Windows para esta tarea, pero eso se
acabó. Existe un utilísimo programa bajo
Linux que llamado Ghostscript que
puede convertir nuestra vieja impresora
doméstica en una fabulosas máquina
PostScript.
Si nuestra distribución no se ha ocupado ya de esto, véase [1] para saber
como se hace. Como muestra la figura 1,
la exportación de datos desde la base de
datos Windows no fue un problema al
usar el formato de separadores mediante
comas (CSV). Todo lo que tuve que
hacer a continuación fue generar un
archivo PostScript para cada sobre y
luego enviar esos archivos a la impresora. Y esto es un juego de niños con
módulos CPAN como PostScript::File y
PostScript::TextBlock, como [2] nos dirá.
PostScript es básicamente otro lenguaje
de programación. Los archivos PostScript están hechos de texto ASCII
legible y contienen una lista de comandos necesarios para generar una página
impresa.
Pintando mediante números
No obstante, PostScript usa el llamado
sistema de coordenadas matemáticas y
Figura 1: Los campos en el archivo de dirección separados por comas.
38
Número 01
www.linuxmagazine.com.es
Perl
esto algo muy poco habitual en un
programa de composición. El origen del
sistema coordeandas es la esquina
inferior izquierda de la página. Los
valores positivos del eje x arrancan
desde la izquierda y se extienden hacia
la derecha y los valores positivos de y
van incrementando de valor de abajo
arriba, tal y como nos enseño nuestro
viejo maestro de matemáticas en nuestro
colegio de secundaria. PostScript usa
puntos pica o PostScript, que miden
aproximadamente 1/3 de milímetro.
Como ejemplo de lo que se puede conseguir con PostScript, los siguientes
comandos imprimirán el nombre John
Doe en el recuadro de la dirección de un
sobre:
0 setgray 401.95 156 moveto
/Helvetica-iso findfont
18 scalefont setfont
(John Doe) show
Empezando en la esquina izquierda inferior del sobre, nos iríamos casi 402
puntos hacia la izquierda y 156 hacia
arriba para imprimir las letras que ven
entre los paréntesis en la fuente especificada (Helvetica-iso) y con el tamaño
especificado (18 puntos) y de izquierda a
derecha del papel.
Para empezar a programar con PostScript bajo Perl, CPAN proporciona los
módulos PostScript::File y PostScript::
TextBlock para simplificar el asunto. El
primero sirve para insertar la cabecera
PostScript de la siguiente manera:
cio del campo dirección, si no que
indicamos la posición de la esquina
derecha inferior del bloque de texto. Esto
nos asegura que el bloque siempre
acabará en la misma posición al margen
de las variables que usemos o la larga
que sea la dirección.
En cuanto al programa, el código de
ejemplo que se muestra en el listado 1
define una constante Sender (línea 14).
Ésta lee los datos de un archivo .csv e
imprime un sobre como los mostrados
en las figuras 2 ó 3 para cada dirección
que encuentre.
Importación desde Windows
$ADDR_CSV en la línea 13 especificamos
el nombre del archivo de direcciones que
debe tener la misma estructura que el
mostrado en la figura 2. El comando para
enviar un archivo PostScript a nuestra
impresora se define en la línea 17
($PRINT_CMD). Si deseamos hacer una
prueba sin malgastar papel sustituiremos
"lpr" por "ghostview" para enviar sobres
virtuales para que se visualicen en nuestra pantalla.
El código de la línea 19 abre el archivo
de direcciones y el bloque while que
comienza en la línea 22 se repite con las
entradas que son analizadas usando
expresiones regulares. En lugar de esta
técnica podríamos haber usado el
módulo CPAN Text::CSV_XS, aunque
esto podría haber sido excesivo para las
direcciones de nuestro ejemplo, pues son
extremadamente simples y no tienen
complicaciones como comillas o comas
embebidas.
DESARROLLO
Trabajo Manual vs
Automatizado
La línea 23 interpreta cualquier línea que
comienza con el símbolo # y un espacio
en blanco como comentarios. Esto es
muy útil si solo queremos imprimir algunas entradas. Facilita muchísimo la tarea
poder “comentar” y excluir todas las
entradas que queramos evitar imprimircon el símbolo #. El comando split de la
línea 24 divide líneas donde aparecen
comas separadoras. map elimina las
comillas dobles. Como la sustitución
s/"//g; no devuelve una cadena como
resultado válido, $_; simplemente se
añade.
La línea 27 crea un objeto
PostScript::File que usa la palabra clave
landscape para rotar el formato de la
página. reencode => 'ISOLatin1Encoding' proporciona soporte para todos las
caracteres Latin1. El formato del sobre se
fija en Envelope-DL. Si necesitamos un
formato diferente para utilizar un sobre
de distinto tamaño no tendremos
ninguna dificultad para modificar el
archivo. Un sobre DIN A6 tienen unas
medidas aproximadas de 10.47 centímetros de alto por 14.81 centímetros de
ancho. Para que esto se aplique en nuestro porgrama, utilizaremos el siguiente
bloque de código:
my $ps = new PostScript::File(
landscape => 1,
reencode => 'ISOLatin1Encoding',
width => cm(10.47),
height => cm(14.81),
);
%!PS-Adobe-3.0
lo cual se ocupa de cosas como la orientación de la página, los bordes y el
orden de la página. PostScript::TextBlock
acepta líneas múltiples y escribe desde la
coordenadas indicadas. No obstante
podemos esperar muchas horas de diversión realiyando ajustes en los
parámetros de cada módulo hasta que
consigamos producir el formato deseado
en el lugar adecuado de la página.
Normalmente se utiliza el siguiente
formato: el bloque de texto con la dirección del remitente comienza aproximadamente 20 milímetros por encima de
la esquina inferior derecha en las direcciones x e y. En otras palabras, nosotros
no queremos especificar el punto de ini-
Figura 2: No importa si el remitente tiene un nombre corto…
www.linuxmagazine.com.es
Número 01
39
DESARROLLO
Perl
LISTADO 1: SOBRE
001 #!/usr/bin/perl
040 “Helveticaiso”, 10, 12);
076 text => $text,
002 ############################
041 my ($code) = $b->Write($bw,
077 size => $size,
003 # sobre - Papel de impresión
$bh, cm(2),
078 leading => $leading);
sobres
042 $ps->get_width() - cm(2));
079
004 # Mike Schilli, 2003
043 $ps->add_to_page($code);
080 return(tb_width($text,
([email protected])
044
$font, $size),
005 ############################
045 # Destinatario
081 tb_height($text, $leading),
006 use warnings;
046 my $to = “$first
082 $b);
007 use strict;
$last\n$str\n\n$city\n”;
083 }
008
047 ($bw, $bh, $b) =
084
009 use PostScript::File;
textbox($to,
085 ############################
010 use PostScript::TextBlock;
048 “Helveticaiso”, 18, 20);
086 sub cm {
011 use File::Temp qw(tempfile);
049 ($code) = $b->Write($bw,
087 ############################
012
$bh,
088 return int($_[0]*72/2.54);
013 my $ADDR_CSV =
050 $ps->get_height()- $bw -
089 }
“mailaddr.csv”;
cm(2),
090
014 my $SENDER = q{Steven
051 $bh + cm(2));
091 ############################
Sender,
052 $ps->add_to_page($code);
092 sub tb_width {
015 9 Sender Street,
053
093 ############################
016 San Francisco, CA 94107};
054 # Imprimir a archivo
094 my($text, $font, $size)= @_;
017 my $PRINT_CMD = “lpr”;
temporal
095
018
055 (my $base = $tmp_file) =~s/
096 $font =~ s/-iso//;
019 open FILE, $ADDR_CSV or
\.ps$//;
097
020 die “Cannot open $ADDR_CSV”;
056 $ps->output($base);
098 my $max_width = 0;
021
057
099
022 while(<FILE>) {
058 # Enviar a impresora
100 for(split /\n/, $text) {
023 next if /^\s*#/;
059 system(“$PRINT_CMD
101 s/[äÄöÖüÜß]/A/ig;
024 my @addr = split /,/, $_;
025 @addr = map { s/”//g; $_; }
$tmp_file”) and
060 die “$PRINT_CMD $tmp_file:
@addr;
102 my $w =
103 PostScript::Metrics::
$!”;
stringwidth(
026
061
104 $_, $font, $size);
027 my $ps = PostScript::File-
062 # Borrar
105 $max_width = $w if $w >
>new(
063 unlink “$tmp_file” or
028 landscape => 1,
064 die “Cannot unlink
029 reencode
$tmp_file: $!”;
=>‘ISOLatin1Encoding’,
$max_width;
106 }
107
065 }
108 return $max_width;
030 paper => “Envelope-DL”,
066
109 }
031 );
067 ############################
110
032
068 sub textbox {
111 ############################
033 my ($tmp_fh, $tmp_file) =
069 ############################
112 sub tb_height {
034 tempfile(SUFFIX => “.ps”);
070 my($text, $font, $size,
113 ############################
035
$leading) = @_;
036 my($last, $first, $city,
071
$str) = @addr;
072 my $b = PostScript::
037
114 my($text, $leading) = @_;
115
TextBlock->new();
116 my $lines = 1;
117 $lines++ for $text =~/\n/g;
038 # Remitente
073
118
039 my($bw, $bh, $b) =
074 $b->addText(
119 return $lines*$leading;
075 font => $font,
120 }
textbox($SENDER,
40
Número 01
www.linuxmagazine.com.es
Perl
Figura 3: … o largo, el offset se mantiene inalterado
La línea 36 guarda los campos de dirección en las variables $last, $first, $city y
$str. La línea 39 llama a la función
textbox() (ver una descripción en
detalles de esta función más adelante),
que espera unas líneas que contengan el
nombre de la fuente y su tamaño y el
espaciado interlineal en puntos PostScript. Hemos decidido usar Helvetica-iso
por que está instalada por defecto. El
sufijo -iso también soporta caracteres
acentuados. textbox() nos devuelve 3
valores: un objeto Post- Script::TextBlock
y el ancho y alto de la caja de texto generada en puntos PostScript.
Más adelante, la línea 41 llama el
método Write() usado por el objeto PostScript::TextBlock para crear el código
PostScript. Write() espera 4 parámetros:
ancho y alto del bloque de texto y las
distancias en x e y desde el origen. La
anchura y altura las proporciona la función textbox() llamada con anterioridad.
Pensando en Offsets
El offset en x (la distancia desde el margen izquierdo) es de unos 2 centímetros,
que puede ser expresada utilizando la
función cm(), definida más abajo para
convertir centímetros a puntos PostScript. El offset en y es más complicado
puesto que Write() espera una distancia
desde el margen inferior cuando
nosotros necesitamos 2 centímetros
desde el margen superior. No debemos
preocuparnos puesto que el método
$ps->get_ width() del objeto PostScript::File nos proporciona la altura del
sobre y simplemente debemos restar
cm(2) de esta en la línea 42.
Debemos saber que PostScript::File
mantiene la noción de ancho y alto al
margen de que usemos el modo landscape en el que el papel se rota 90º. En
nuestro caso, get_width() nos muestra la
altura y get_height() la anchura. Write
devuelve una lista en la que el primer
elemento es el código PostScript del
bloque de texto. La línea 43 añade este
código a la página PostScript actual.
Se utiliza el mismo procedimiento para
el destinatario: la línea 46 concatena
nombre y apellidos, la calle y la ciudad.
La función addresseetextbox() usa una
fuente un poco mayor al igual que con el
espacio interlineal. El offset en x desde la
esquina superior izquierda de la caja de
texto hasta el origen del PostScript se
calcula restando a la longitud del sobre
($ps ->get_height()) el ancho de la caja
de texto ($bw) menos 2 centímetros de
borde (cm(2)). El offset en y es la distancia desde el borde superior de la caja de
texto hasta el límite inferior del sobre y
es el resultado de sumar 2 centímetros a
la altura de la caja de texto ($bh +
cm(2)).
DESARROLLO
archivo, pero como no espera el sufijo
.ps, el sufijo se quita primero de la línea
55 y luego el resultado es escrito a $base.
Tras llamar al comando de impresión
en la línea 59, depende de la línea 63 el
que se elimine el archivo temporal obsoleto. textbox() en la línea 68 crea un
Nuevo objeto PostScript::TextBlock y
llama al método addText. Éste espera el
nombre de la fuente y su tamaño, el
valor 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 a
tb_width() y tb_height() (tb significa
bloque de texto), definidas más abajo.
Mientras que tb_height simplemente
necesita multiplicar el espacio interlineal
por el número de líneas, calcular el espacio horizontal usado es más complicado
debido a la variación en la anchura de
los caracteres.
Asistente para Medir Fuentes
Afortunadamente hay un módulo llamada PostScript::Metrics con una función
llamada stringwidth() que usa tablas
incrustadas de fuentes para resolver
estos problemas. La mala noticia es que
el módulo nunca ha oído hablar de Helvetica-iso. Simplemente quitando el
sufijo -iso de la línea 96 resolvemos este
problema, pero impedimos que funcionen caracteres especiales. Esto nos lleva
a otra solución en la línea 101, donde
unos pocos caracteres son simplemente
reemplazados por la letra A. si bien esto
no genera un resultado preciso, sí solucionó el problema de nuestro ejemplo.
Reconozco que he tenido que usar
unos pocos de trucos en esta ocasión,
pero mi excusa es que he tenido que
encontrar la manera de resolver la
incompleta implementación de los
módulos PostScript::*. Es un precio que
estoy dispuesto de pagar, pues me permite elegir la libertad de Linux y evitar
todos esos arranques superfluos de Win■
dows.
Vida corta
INFO
La función tempfile() del modulo
File::Temp crea un archive temporal con
el sufijo PostScript .ps en la línea 34 y
devuelve un handle de archivo que
admite escritura y el nombre del archivo.
El método output() llamado en la línea
56 escribe los datos PostScript a este
[1] Como instalar impresoras en Linux:
http://www.linuxprinting.org
[2] Shawn Wallace,“Perl Graphics Programming”: O’Reilly,2002
[3] Más información sobre PostScript: http://
www.mathematik.uni-ulm.de/help/pstut/
www.linuxmagazine.com.es
Número 01
41
DESARROLLO
Pear
Con forma de Pera
Cobertura Total
Si se escribe código en un lenguaje de alto nivel, como PHP, se asegura su funcionalidad 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
L
a respuesta a esta preguntas está
contenida en las palabras “API
Genérica“. Haciendo uso de una API
genérica, nuestro código puede funcionar 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 últimos 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 Abstracto
PEAR::DB es un módulo de PHP que permite el control de una base de datos sin
necesidad de especificar ningún servidor
de bases de datos en concreto. Esto significa 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, supuestamente los tipos más duros del mundo
del desarrollo software, hacen que sus
Acerca de Pear
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.
42
Número 01
vidas sean más fáciles gracias a las
abstracciones. Cada función, expresión y
sentencia abstrae algún detalle específico del hardware del procesador al
programador por medio del lenguaje C.
Esto se conoce como abstracción de bajo
nivel.
Otro ejemplo de abstracción se produce 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 abstracció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 preocuparnos 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 eficientes.
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");
www.linuxmagazine.com.es
Aunque
la mayorí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 almacenamiento 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 solución a todos estos dilemas, ya la hemos
mencionado, consiste en abstraer la funció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 pretendemos crear la APi nosotros mismos,
esta tarea supone mucho trabajo
Pero, al fin y al cabo, estamos
hablando de código libre, con una comunidad 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 objetivo 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
Pear
de PHP. La versión actual considerada
estable es la 1.6.0. Para aquellos que
quieran comparar alternativas están tambié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 información sobre cadenas de televisión y su
sintonía. Esto podrías servir, por ejemplo, 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 obra
Pondremos 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 sqldump 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 encontramos conq que cada referencia a mysql
tendría que ser rescrita. Con más funciones, 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 nombre del host, el usuario y la contraseña,
por ejemplo, podemos tener un fichero
como dbase.inc:
$dbhost
$dbuser
$dbpass
$dbname
=
=
=
=
'localhost';
'www-data';
'';
'tv';
Pero normalmentes esto suele ser muy
insuficiente. Parte de lo anterior, necesitamos una capa de abstracción, como
PEAR::DB. La mayoría de las instalaciones PHP incluyen la biblioteca
PEAR::DB por defecto, y se puede encontrar 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 testpear.php con el siguiente contenido:
<?php require_once 'DB.php'; ?>
Tabla 1: Opciones de portabilidad
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 numRows de 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
Si lo anterior no
funciona, se puede 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
DESARROLLO
DSN as array
01
02
03
04
05
06
07
08
$dsn = array(
'phptype' => "mysql",
'hostspec' => "localhost",
'database' => "tv",
'username' => "www-data",
'password' => ""
);
$db = DB::connect($dsn);
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 desarrollador 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, debemos 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 conectarse 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
www.linuxmagazine.com.es
Número 01
43
Pear
DESARROLLO
específicos del servidor de base de datos
e incluye el tipo de base de datos (llamado 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 usuarios 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 contraseñ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 almacenará 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. Tambié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-
Tabla 2: Bases de Datos
soportadas
Nombre
Palabra reservada
dBase
dbase
dantes de desarrollo (para controlar la
cantidad de mensajes de depuración producidos). Como estas opciones pueden
variar entre consultas específicas, no las
incluiremos dentro del DSN. Por el contrario crearemos un array detallando las
opciones y lo pasaremos como argumento 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 modificaciones 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 utilizará 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();
Tabla3: Soporte de provides
Cadena
Funcionalidad
prepare
Pre-comprueba la consulta SQL
pconnect
Conexiones persistentes
transactions
ciones
Activa el soporte de transac-
limit
Limita las consultas select
FrontBase
fbsql
InterBase
ibase
Informix
ifx
Tabla 4: Diferencias entre
versiones de SQL
Mini SQL
msql
Base de Dato
Sintaxis SQL
Microsoft SQL Server
mssql
DB2
MySQL
mysql
select * from table fetch first 10
rows only
MySQL >=4.1
mysql4
Informix
select first 10 * from table
Oracle 7/8/9
oci8
Microsoft SQL Server
select top 10 * from table
ODBC
odbc
MySQL
select * from table limit 10
PostgreSQL
pgsql
Oracle 8i
SQLite
sqlite
select * from (select * from
table) where rownum <= 10
Sybase
sybase
PostgreSQL
select * from table limit 10
44
Número 01
www.linuxmagazine.com.es
Entonces, tendremos que adaptar nuestras 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 versiones originales de MySQL pero
siguiendo las convenciones de nombres
de PEAR. Así pues, mysql_query se convierte en query, por poner un ejemplo.
Las funciones básicas aparecen en el Listado 3.
Al grano
Como 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 permite 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 permitir la coexistencia de código antiguo
dentro de PEAR::DB. Dentro del
desarollo con bases de datos, la conevnsió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 establecer en la aplicación. Hay también
definiciones para DB_PORTABILITY_ALL
y DB_PORTABILITY_NONE que permiten
el activar todas las opciones o desactivarlas respectivamente.
Pear
Sigamos adelante
No 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 programático más amigable. Actualmente
PEAR_DB soporta tres formatos de este
tipo. Por defecto se usa un array, indexado desde cero, como se muestra en el
cuadro adjunto. Los parámetros opcionales 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 tenemos 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 camino
Ningún programa está terminado sin un
control de manejo de errores y la documentació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
errores de PEAR_Error. Pero si una funció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 capturados 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 problema.
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 parcialmente generada sea eliminada del flujo
de salida HTML. Como esto es una caracterí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 {
DESARROLLO
12 ob_end_clean();
13 print "Se ha producido un
ERROR (".$err->
getMessage().")");
14 exit;
15 }
Rizando el rizo
PEAR::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 portables), 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 programadores 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 capacidades (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 servidor 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
www.linuxmagazine.com.es
Número 01
45
DESARROLLO
Pear
Listado 3: Convenciones para los
nombres PEAR
Listado 1: La Base de Datos TV
01
02
03
04
05
06
07
08
09
10
11
12
13
14
CREATE DATABASE IF NOT EXISTS tv;
USE tv;
drop table IF EXISTS channels;
CREATE TABLE channels (
station smallint(2) NOT NULL default '0',
channel smallint(2) default NULL,
name varchar(10) default NULL,
PRIMARY KEY (station)
) TYPE=MyISAM;
INSERT INTO channel VALUES (1,55,'TVE1');
INSERT INTO channel VALUES (2,62,'La 2');
INSERT INTO channel VALUES (3,59,'Telecinco');
INSERT INTO channel VALUES (4,65,'Antena 3');
INSERT INTO channel VALUES (5,37,'Canal +');
('transactions'))
print "OK! Están soportadas";
01
02
03
04
05
06
07
08
09
10
11
12
13
function PearVersion()
{
global $dbname, $dbhost, $dbuser, $dbbackend;
$dsn = "$dbbackend://$dbuser@$dbhost/$dbname";
$db =& DB::connect($dsn);
$query = 'SELECT * FROM channels';
$result = $db->query($query);
while ($row = $result->fetchRow()) {
print "$row[0] - $row[2]($row[1])<br>";
}
$result->free();
$db->disconnect();
}
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 llamado 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.
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 caracterí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 simulada.
Se puede estar tentado a usar provides
para crear consultas completamente
diferentes para cada base de datos de
$query = "SELECT name FROMU
forma manual. En la mayoría de los
channels";// sin referenciasU
casos esto es innecesario y desde luego
a límites aquí!
es Una mala IdeaTM. La razón (algunos
$result = limitQueryU
dirían excusa) para este comportamiento
($query, 2, 1);
viene de las extensiones que aparecen en
SQL. El ejemplo típico de este problema
Este comando extrae una línea de resulviene de las consultas select limitadas,
tado de la consulta, empezando por el
que paran de producir
resultados
Listado 2: Acceso a MySQL
después de las
01 function GetStationsList()
primeras, digamos,
02 {
10 filas. La mayoría
03 $db = mysql_connect("localhost","www-data", "");
de las bases de
04 $query = "SELECT * FROM tv.channels";
datos actuales son
05 $result = mysql_query($query);
capaces de tener
06 while ($row =
este comportammysql_fetch_array($result,MYSQL_NUM)) {
iento, pero con
07 print "$row[0] - $row[2]($row[1])<br>";
cadenas de consul08 }
tas SQL diferentes,
09 mysql_free_result($result);
como se muestra
10 mysql_close($db);
en la tabla 4. Codi11 }
ficar cada ejemplo
46
Número 01
www.linuxmagazine.com.es
í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 adecuada para la base de datos en cuestión,
$db->provides("limit") ; devolverá alter,
y la consulta será modificada por el controlador de PEAR::DB antes de ser
pasada al servidor. Por otro lado, provides puede devolver emulate, porque el
driver es capaz de capturar los resultados de las consultas fila a fila. O
devolver false. Se debería siempre preguntar por las características de las bases
de datos usando provides en vez de confiar en nuestra experiencia o en la
memoria. Sin embargo, por comparació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á utilizando de forma precisa. Normalmente
debido a bugs conocidos en la base de
datos misma. Son un hecho de vida.
Pero si no podemos eliminarlos, tendremos 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 referentes a los bugs conocidos en bases de
datos concretas, van más allá del objetivo de este artículo.
Sólo para Ti
Como complemento especial, PEAR::DB
no sólo proporciona abstracciones de
bases de datos. También incluye algunas
Pear
Example Interface Files
01 $tableinfo =
$result->tableInfo());
02 for($col=0; $col <
$result->numCols(); $col++) {
03 print
$tableinfo[$col]['name']." es
un ".$tableinfo[$col]['type'];
04 }
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 mientras 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
Listado 5 : assertExtension
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 6: Preparando una
consulta
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);
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 indicará 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. Simplemente indica si una extensión existe o
no.
Antes de terminar, mencionaremos de
pasada la pareja prepare y execute. prepare 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-
DESARROLLO
ciales, de manera que se pueda ejecutar
múltiples veces con los datos diferentes
contenidos en dichas variables. Ver listado 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 necesitará 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 presupone que la base de datos soporta esta
característica de forma nativa, algo que
no siempre sucede.
Conclusión
Con PEAR::DB en el arsenal, se pueden
atacar la mayoría de las bases de datos,
sin tener que preocuparse de características no soportadas o de funciones no
disponibles. Usando las funciones y el
amplio rango de métodos disponibles,
podemos escribir en PHP buenas aplicaciones para múltiples plataformas sin
preocuparnos de las minucias de la
batalla y así pues, podremos concentrarnos en pensar en las estrategias para
■
ganar la guerra.
INFO
[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
www.linuxmagazine.com.es
Número 01
47
DESARROLLO
Python
Python: Potencia y sencillez multiplataforma
Lenguaje Todoterreno
{
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"
www.daimlerchrysler.com
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
P
ara empezar, debemos saber por
qué 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 aplicaciones que nos muestran un poco las
capacidades de este lenguaje de alto
nivel. Primero, Python es un lenguaje
orientado a objetos, esto no significa
que lo sea exclusivamente, podemos utilizarlo como queramos, aunque es mas
natural utilizar su implementación de la
OOP. Además, es libre y gratuito pudiendo descargar el intérprete y su código
fuente. Nos permite programarlo como
script, lo que posibilita ver el código
fuente de aquellas aplicaciones que así
48
Número 01
estén desarrolladas, o bien podremos
compilarlo obteniendo un Bytecode al
igual que java. Es portable y nos permite
ejecutar
nuestros
programas
en
cualquier sistema operativo y/o arquitectura teniendo previamente el intérprete
instalado en nuestro ordenador. Realizar
un programa bajo este lenguaje, seguramente nos costaría entre la mitad o la
cuarta parte del tiempo que tardaríamos
en desarrollar el mismo programa en C/
C++ o Java esto hace que sea muy
potente. Veamos una breve comparativa
con otros lenguajes:
Hola Mundo en C.
main ()
www.linuxmagazine.com.es
Python dispone de otras características
que lo convierten en el lenguaje favorito
de una comunidad de desarrolladores
cada vez más amplia. Por ejemplo, permite la declaración dinámica de variables, es decir, no tenemos que declarar
las variables y no tenemos que tener en
cuenta su tamaño, ya que son completamente dinámicas. Dispone también de
un gestor de memoria que, de manera
similar al recolector de basuras de java,
se encargará de liberar la memoria de
objetos no utilizados. Sin embargo, y al
igual que Java, no nos permite referirnos
a zonas de memoria a bajo nivel, como
puede hacerse con C.
Además se puede combinar con otros
múltiples lenguajes de programación.
Podemos mezclar en nuestras aplicaciones Python y Java (Jython), por ejemplo. O Python con C/C++, lo cual hace
que resulte mas potente si cabe. Python
también cuenta con una amplia biblioteca de módulos que, al estilo de las bibliotecas en C, permiten un desarrollo
rápido y eficiente.
La sencillez de Python también ayuda
a que los programas escritos en este
lenguaje sean muy sintéticos. Como
podemos ver en la comparativa anterior,
la simplicidad llega a ser asombrosa y
solo hemos escrito un simple ejemplo. Si
este programa ya supone ahorrarte unas
Python
líneas de código, con una sintaxis tan
sencilla y ordenada podemos imaginar
que un programa de 1000 lineas en Java,
en Python podrían ser alrededor de 250.
Muy bien, ¿pero como se usa?
Uso
Para empezar a matar el gusanillo,
podemos ir haciendo algunas pruebas
interesantes. Vayamos al intérprete
Python. Para esto, basta con escribir
‘python’ en cualquier shell en cualquier
versión de Linux que tenga instalado el
intérprete (si no lo tienes instalado,
hazte con la última versión en [1]).
Entonces podemos probar el “Hello
World”:
>>> print 'Hello World'
Hello World
Simple, ¿verdad?, ahora podemos probar
a 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 con
esto, antes de ponernos a programar algo
más complicado, ya que de esta manera
es más sencillo hacerse con la sintaxis
mucho mas rápidamente viendo los
resultados de cada prueba.
Veamos ahora alguna propiedad
interesante de Python. Los ficheros en
Python, no tienen por que llevar extensión ninguna aunque seguramente querremos tenerlos diferenciados del resto de
nuestros ficheros. Para ello se utiliza la
extensión .py o bien .pyw. Imaginemos
que tenemos un ejemplo ejemplo.py, al
permitirnos usarlo como script, podemos
indicarle la ruta del intérprete en el inicio (#!/usr/bin/python en nuestro caso)
y dándole permisos de ejecución (en este
caso, chmod +x ejemplo.py) obtenemos
un programa listo para correr
./ejemplo.py.
Esto es importante porque, mientras la
norma en la mayoría de los lenguajes es
dejar al programador la decisión de la
manera en que deben ser formateados
los archivos fuente, en Python es obligatorio seguir una metodología. En Python
todo se hace de una sola manera, es
parte de su filosofía: Solo Hay Una
Manera
de
Hacer
Las
Cosas.
Comencemos con lo más simple en todo
lenguaje, la asignación a una variable:
cantidad = 166.386
Lo primero que hay que apreciar es que
no se usa el ;. Esto es una característica
de las muchas que hacen a Python diferente. Una instrucción acaba con el
retorno de carro, aunque el ; se puede
utilizar cuando tenemos dos sentencias
están en la misma línea:
DESARROLLO
En lo que se refiere al tema de los
bucles en Python es algo especial. Puede
que estemos acostumbrados a los bucles
tipo C:
for(int a = 1; a < 10; a++)U
printf("%d\n",a);
Sin embargo, en Python, se toma un
enfoque funcional prestado de otros
lenguajes como Lisp o Haskell. Se utiliza
una función especial llamada range que
genera una lista de números:
range(1,10)
generará una ristra de números del 1 al
9. De manera que podemos utilizar una
función range para crear un bucle for en
Python de la siguiente manera:
for i in range(1,10)
cantidad = 166.386; pesetasU
= 3000
Como es un lenguaje dinámico no hay
que declarar el tipo de las variables, pero
una vez han sido definidas, lo que se
hace asignándoles un valor, éstas
guardan su tipo y no lo cambiarán a lo
largo de la ejecución del programa.
Tenemos a nuestra disposición los operadores de siempre (+, -, *, /, etc) y una
vez que sabemos como manejarlos y
como asignar las variables, podemos
realizar algo útil, pero lineal. Para que la
ejecución no sea lineal necesitamos los
bucles y los condicionales.
Este bucle iteraría con i desde 1 a 9,
ambos inclusive. La versión del bucle
while 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 de
ejemplo en esos bucles? Pues porque
ahora viene otra novedad. En Python no
se usan las famosas { y } de C, Java y
otros lenguajes. Se decidió, y no a todo
#! /usr/bin/python
print 'Hello World'<C>
Después de toda la introducción técnica
va siendo hora de que veamos como es
el formato de los programas en Python.
Figura 1: Utilización de Python como una calculadora
www.linuxmagazine.com.es
Número 01
49
DESARROLLO
Python
el mundo le gusta, que se usaría la posición como delimitador. Esto así suena
algo extraño, pero si se ve es mucho más
sencillo:
>>> cantidad = 2
>>> for i in range(1,10):
print cantidad*i
Comencemos mirando a ese :. Los dos
puntos marcan el inicio de un bloque de
código Python. Ese bloque aparecerá en
bucles, funciones o métodos. Si nos
fijamos bien en la sangría de la siguiente
línea, vemos una serie de espacios
(logrados pulsando la tecla TABULADOR) y una sentencia. Esos espacios
son vitales ya que marcan la existencia
de un bloque de código. Además, son
obligatorios.
Este es uno de hechos más controvertidos de Python, pero también mejora
mucho la legibilidad del código. Sólo
existe una manera de escribir Python así
que todo el código Python se parece y es
más fácil de entender. El bloque acaba
cuando desaparecen esos espacios:
>>> for i in range(1,10):
print cantidad*i
cantidad = cantidad + 1
...
>>>
Listado 2: Adición y eliminación de elementos
de una lista
01 >>> b = [ 1 , 2 , 1 ]
15 [2, 57, 1, 3]
02 >>> b.append(3)
16 >>> b.append(1)
03 >>> b.append(4)
17 >>> b
04 >>> b
18 [2, 57, 1, 3, 1]
05 [1 , 2 , 1 , 3 , 4 ]
19 >>> b.count(1)
06 >>> b.remove(1)
20 2
07 >>> b
21 >>> b.index(57)
08 [2, 1, 3, 4]
22 1
09 >>> b.pop()
23 >>> b.sort()
10 4
24 >>> b
11 >>> b
25 [1, 1, 2, 3, 57]
12 [2, 1, 3]
26 >>> b.reverse()
13 >>> b.insert(1,57)
27 >>> b
14 >>> b
28 [57, 3, 2, 1, 1]
los argumentos no se les asignan tipo.
Existen muchas posibilidades en los
argumentos pero los veremos más tarde,
de momento veamos un ejemplo sencillo:
>>> def imprime (texto):
print texto
>>> imprime("Hola mundo")
Hola mundo
>>>
Vuelve a ser sencillo. ¿Y los objetos?
Pues también son bastante simples de
implementar. Podemos ver un ejemplo
Funciones y Objetos
en el Listado 1. Con class declaramos el
nombre de la clase, y los def de su interiTenemos ya las piezas fundamentales
or son los métodos. El método __init__
para entender las funciones y los objees el constructor, donde se asignan los
tos. La declaración de una función en
valores iniciales a las variables. __init__
Python tiene una sintaxis muy simple:
es un método estándar y predefinido, lo
def nombre_funcion (<listaßß arguque quiere decir que tendremos que usar
mentos>): <CUERPO>
ese y no otro para inicializar el objeto.
Fácil ¿no? Al igual que las variables, a
Todos los métodos, aunque
no
acepten valores, poseen un
Listado 1: Una clase sencilla
parámetro self. Éste es otro
01 >>> class Objeto:
punto
controvertido
en
02
def __init__ (self, cantidad):
Python, self es obligatorio,
03
self.cantidad =
pero no se usa al invocar el
cantidad
método. Se puede ver un
04
ejemplo de clase en el Listado
05
def getCantidad(self):
1. ¿Cómo se crea el objeto?
06
return self.cantidad
Fácil:
07
>>> print a.getCantidad()
20
>>> a.setCantidad(12)
>>> print a.getCantidad()
12
No hay que preocuparse por la administración de la memoria del objeto ya que,
cuando a no apunte hacia él, el gestor de
memoria liberará su memoria. Ya tenemos las bases para construir algo
interesante. Por supuesto nos dejamos
infinidad de cosas en el tintero, pero
siempre es mejor comenzar con un
pequeño conjunto de herramientas para
empezar a usarlas.
Estructuras de datos
Una de las razones por las que los pro-
Listado 3: Ejemplo de un
diccionario
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',
08
def setCantidad(self,
>>> a = Objeto(20)
07 'Gato': 'hace miau miau',
Es como llamar a una función. A partir de este momento a es una instancia de
09 >>> dic["Perro"]
cantidad):
09
08 'Pollito': 'hace pio pio'}
self.cantidad =
cantidad
50
Objeto y podemos utilizar sus métodos:
Número 01
www.linuxmagazine.com.es
10 'hace guau guau'
Python
DESARROLLO
gramas scripts de Python resultan tan
potentes es que nos permiten manejar
estructuras de datos muy versátiles de
manera muy sencilla. En Python estas
estructuras son las Listas y los
Diccionarios (también llamados Tablas
Hash).
Las listas nos permiten almacenar una
cantidad ilimitada de elementos del
mismo tipo. Esto es algo inherente a casi
todos los programas, así que Python las
incorpora de fábrica. Las listas de
Python también vienen provistas de
muchas más opciones que sus semejantes en otros lenguajes. Por ejemplo,
vamos a definir una lista que guarde una
serie de palabras:
>>> a = ["Hola", "Adios",U
"Buenas Tardes"]
>>> a
['Hola', 'Adios', 'BuenasU
Tardes']
Python indexa comenzando desde 0, de
manera que ‘Hola’ es el elemento 0,
‘Adios’ el 1 y ‘Buenas Tardes’ el 2, y la
longitud de la lista es 3. Podemos comprobarlo de esta forma:
>>> a[1]
'Adios'
>>> len(a)
3
Podemos añadir elementos a las listas de
varias maneras. Nos contentaremos con
ver las más normales. Añadamos un elemento y eliminemos otro (ver Listado 2).
Las listas también se pueden comportar
como una Pila, con las operaciones
append y pop. Con insert hemos introducido un elemento en la posición
especificada (recuerda que siempre
comenzamos a contar desde 0). La facilidad con la que Python trata las listas nos
permite usarlas para multitud de tareas
lo que simplificará mucho nuestro trabajo.
A pesar de su potencia, las listas no
pueden hacerlo todo y existe otra estructura que rivaliza con ellas en utilidad, los
Diccionarios. Mientras las listas nos permiten referenciar a un elemento usando
un número, los diccionarios nos permiten hacerlo con cualquier otro tipo de
dato. Por ejemplo, con cadenas, bueno
más bien casi siempre con cadenas, de
Figura 2: Definición de una función en Python
ahí que su nombre sea diccionario
(véase el Listado 3). Las listas y los diccionarios se pueden mezclar: diccionarios de listas, listas de diccionarios,
diccionarios de listas de diccionarios,
etc. Ambas estructuras combinadas
poseen una enorme potencia.
Algoritmos + Estructuras de
datos = Programas
Ahora nos toca poner todo esto en práctica. Lo normal es hacer un programa
sencillo. Pero en lugar de eso vamos a
implementar algo que sea creativo. Este
programa es el que se usa en el libro “La
práctica de la programación” de Pike y
Kernighan para ilustrar como un buen
diseño sobrepasa al lenguaje que usemos
para ejecutarlo. En el libro se implementa el diseño en C, C++, Java, Perl y
AWK. Nosotros lo haremos en Python
(ver Listado 4).
El programa acepta un texto como
entrada y genera un texto como salida,
pero este segundo texto no tiene sentido.
Lo que queremos hacer es generar texto
Figura 3: El programa de ejemplo aplicado al prólogo de El Quijote
www.linuxmagazine.com.es
Número 01
51
DESARROLLO
Python
sin sentido pero con estructuras que sí lo
tengan. Puede parecer algo muy complicado, pero no lo es tanto si usamos la
técnica de las cadenas de Markov. La
idea es comenzar con las dos primeras
palabras, ver si esa combinación se
repite en el texto, hacer una lista con las
palabras que siguen a alguna de las ocurrencias de esa combinación, elegir una
palabra al azar de las que las suceda y
reemplazar la primera por la segunda y
la segunda por la palabra escogida. De
esta manera vamos generando un texto
que, aunque carece de sentido, normalmente se corresponde con la estructura
de un texto normal aunque disparatado.
Para hacer las pruebas es recomendable conseguir un texto de gran tamaño,
en textos pequeños no surtirá tanto efecto nuestro programa. En el proyecto
Gütenberg podemos conseguir infinidad
de textos clásicos de enorme tamaño en
ASCII. Pero somos conocedores de que
no todo el mundo entiende el idioma
anglosajón, así que en lugar del proyecto
Gütenberg podemos coger cualquier
texto que queramos modificar, por ejem-
plo alguna noticia de política de un
diario digital o alguna parrafada de
cualquier weblog de moda. En nuestro
caso, hemos escogido parte de la introducción a la obra maestra de la
Literatura española, “El Ingenioso
Hidalgo, Don quijote de la Mancha”.
Este programa es especialmente interesante y didáctico porque nos permitirá
utilizar las estructuras de datos que
Python implementa, en particular en los
diccionarios y las listas, para generar una
tabla donde los índice serán cadenas de
texto.
Veamos como funciona. Lo primero es
ir introduciendo en el diccionario dos
prefijos como índice y las palabras que
les siguen en el texto dentro de una lista
referenciada por ellos. Eso es un diccionario con dos palabras como índice
que 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,
Listado 4: markov.py genera un texto no-tan-aleatorio
01 #!/usr/local/bin/python
23
w1 = w2
02
24
w2 = palabra
03 #Importamos dos módulos
25
04
26 # Fin de archivo
05 import random
27 dict.setdefault((w1, w2), []
06 #utilizado para escoger un
elementos
).append(no_palabra)
28
07 #aleatorio de una lista
29 # GENERAMOS LA SALIDA
08
30 w1 = no_palabra
09 import sys
31 w2 = no_palabra
10 #permite acceder a algunas
32
clases
34 max_palabras = 10000
12
35
13 no_palabra = "\n"
36 for i in xrange(max_palabras):
14 w1 = no_palabra
37
Vamos haciendo esto de manera sucesiva con todos los conjuntos de dos palabras adyacentes y obtendremos un diccionario en el que muchas entradas referenciarán a una lista de más de un elemento, cuantas más haya mejor.
La magia aparece cuando generamos
el texto, puesto que lo que hacemos es
comenzar por imprimir las dos primeras
palabras y cuando existan varias posibilidades para esa combinación (como con
el ejemplo de ‘La’ y ‘gente’), escogeremos
aleatoriamente
entre
ellas.
Imaginemos que escogemos ‘opina’,
entonces escribimos ‘opina’ por la pantalla y buscamos en la entrada de diccionario ['gente','opina'] y así sucesivamente, hasta llegar a no_palabra. Para
entender mejor el funcionamiento del
programa, te recomendamos que copies
el código fuente y le pases unos ejemplos
(por ejemplo con cat texto.txt |
./markov.py) para que veas los resultados. Después podemos intentar realizar
cambios en el programa, por ejemplo, en
lugar de utilizar 2 palabras como índice
del diccionario podemos probar con 1 o
con 3, y también con el tamaño del texto
que se le pase. Con un poco de experimentación es posible conseguir resulta■
dos muy interesantes.
[1] Decargas de Python
http://www.python.org/download/
nueva_palabra =
random.choice(dict[(w1, w2)])
16
38
17 # GENERAMOS EL DICCIONARIO
39
18 dict = {}
if nueva_palabra ==
no_palabra:
19
40
20 for linea in sys.stdin:
41
21
42
for palabra in
linea.split():
sys.exit()
print nueva_palabra;
43
dict.setdefault( (w1,
w2), [] ).append(palabra)
Número 01
RECURSOS
44
w1 = w2
45
w2 = nueva_palabra
www.linuxmagazine.com.es
LOS AUTORES
15 w2 = no_palabra
52
>>> dict['La', 'gente'] =U
['está']
>>> dict['La',U
'gente'].append('opina')
>>> dict['La', 'gente']
['está','opina']
33 # puedes modificarlo
11 #utilizadas por el intérprete
22
crearemos un diccionario de la siguiente
forma:
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á cursando 3º de Ingeniería Técnica en
Informática de Sistemas y 3º de Ingeniería Técnica en Informática de
Gestión, lleva mas de seis años utilizando Linux como escritorio y
herramienta de trabajo.
Charly
ADMINISTRACIÓN
La rutina diaria del administrador de sistemas: PS-Watcher
Monitor de Procesos
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 vigilancia, ayuda a reducir la presión y actúa como un sistema de alerta temprana.
POR CHARLY KÜHNAST
SYSADMIN
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
configure,
make,
make
install,
suponiendo que los módulos de Perl
Sys::Syslog, File::Basename, Getopt::
Long and Config::IniFiles estén instalados. Instálalos de CPAN si te falta
alguno.
El siguiente paso es crear el fichero de
configuración. Para probar la herramienta, 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
que un proceso, el demonio compilador
de C distribuido, Distccd en este ejemplo, utilice más de 5 mbytes de memoria
principal. Mi nuevo fichero de configuració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 electró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 hacerlo, no sería una buena idea mandar
mensajes al teléfono móvil, o al menos
no es una idea que yo considere oportuna. La página principal contiene
numerosas pistas y ejemplos.
■
Recursos
El demonio cuenta el número de procesos 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 incrementar el intervalo por defecto desde
cinco minutos a 15 minutos especificando el comando -sleep 900.
Creciendo Juntos
Veamos un ejemplo de una aplicación
más práctica. Quiero que PS-Watch
anote en un archivo de registro cada vez
[1] PS-Watcher:http://ps-watcher.
sourceforge.net
EL AUTOR
A
fortunado el administrador de sistemas 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 funcionamiento 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 procesos, 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
Charly Kühnast es un
administrador de sistemas bajo entorno
Linux en el centro de
datos de Moers, cerca
del Rin, el famoso río
Alemán. Sus tareas
incluyen asegurar la
seguridad y disponibilidad del cortafuegos y el mantenimiento del DMZ (zona
desmilitarizada).
www.linuxmagazine.com.es
Número 01
53
ADMINISTRACIÓN
Wikipedia
Instalación y mantenimiento de Mediawiki
Edición Colectiva
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
W
iki, la palabra de moda en
todos los medios, significa
rápido en hawaiano y la tecnología wiki basada en web se ha
establecido de manera extraordinariamente rápida. Desde que Ward
Cunningham tuvo la idea en 1995, cuando estaba buscando un método para
recopilar ejemplos de tareas comunes de
programación entre un grupo de desarrolladores, 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
Un viaje al mundo de los wikis
Aunque se desarrollo especialmente para la
Wikipedia, Mediawiki no se limita a las enciclopedias. Además de la Wikipedia, la comunidad Wikipedia lanzo el Wikcionario
(Wiktionary) http://www.wiktionary.org en
diciembre del 2002. Este diccionario proporciona una definición inglesa y la traducción a
un cierto número de lenguajes para cada palabra. 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
54
Número 01
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 software de fuente abierta, Openfacts esta
disponible en http://openfacts.berlios.de/.
www.linuxmagazine.com.es
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 comprensible aligera el trabajo de formateo.
Tecleando un asterisco al comienzo de
una linea creamos un listado; el texto
enmarcado entre signos de igual, se convierten en un encabezado. Actualmente
hay mas de 100 motores wiki [1].
Mediawiki [2] es un ejemplo muy popular. 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-
Wikipedia
ADMINISTRACIÓN
Selección de lenguajes
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.
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 funciona correctamente y que sea fácil de
usar.
Estable o experimental
Mediawiki, como casi todos los proyectos de código abierto, está disponible en
2 sabores. La versión estable está
disponible como descarga desde la página de inicio en [2]. La versión en desarrollo puede funcionar, pero contiene funciones experimentales y puede plantear
problemas de estabilidad. Se puede
descargar con CVS:
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 ejecutar algunos tareas de configuración.
El administrador debe copiar los ejemplos de configuración, LocalSettings.sample y AdminSettings.sample, a Local
Settings.php y AdminSettings.php. El
cuadro 1 muestra las variables Local
Settings.php que deben ser configuradas.
Wikipedia 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 simplemente necesita configurar las variables
$wgInputEncoding y $wgOutputEncoding
a UTF-8. El guión de instalación crea 3
usuarios MySQL diferenciados y con distintas 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 normales 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 bienvenida a los usuarios que se han registrado 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 instalació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
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 software, 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
Figura 2: Un típico articulo Wikipedia muestra que los wikis no tienen por que ser feos. La tabla de contenidos se genera automáticamente a partir de los encabezados.
www.linuxmagazine.com.es
Número 01
55
ADMINISTRACIÓN
Wikipedia
MySQL. Finalmente, ofrecerá crear dos
cuentas de usuario del wiki, un operador
(sysop) y un desarrollador. Esto es
recomendable. Sin esta opción, necesitaremos asignar manualmente los privilegios de acceso en una etapa posterior.
Para configurar el servidor web, añadimos 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 prohibirse.
<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 configuración de las directrices del directorio
php_value register_globals sea 1. Como
alternativa, podemos modificar el archivo php.ini, el cual suele residir en /etc o
en /etc/php4.
Consolidación
El 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 importante 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
Figura 3: El modo de vista diff resalta las diferencias entre dos versiones, mostrando que se ha modificado y borrado. Los operadores (Sysops) pueden apuntar y hacer clic para restablecer las versiones
previas.
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 redirect.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 manual
Si 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 vigilar 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 directorio 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 directorio principal del servidor. Puede ejecu-
Tabla 1: Configuración Básica
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
www.linuxmagazine.com.es
Código de dos letras para el idioma a usar,por ejemplo es para español
Wikipedia
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 vistazo 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 usuario
La 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 mecanismos de defensa. Puede restringir la lectura o edición de contenidos a grupos de
usuarios específicos. Los indicadores
$wgWhitelistEdit y $wgWhitelistRead en
LocalSettings.php le ayudaran a realizarlo 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 modificaciones a operadores (sysops) y desarrolladores. Lo siguiente añadirá un nuevo
usuario llamado editor:
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 operadores (sysops). Para hacer esto, el
usuario necesita privilegios de operador
y burócrata. Un historial de cambios nos
permite supervisar los últimos acontecimientos 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 salvarlas 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, permitiéndoles la reparación de desfiguraciones en cuestión de segundos. Si se
origina una controversia sobre el contenido de una página, el operador puede
temporalmente proteger la página. Los
administradores pueden censurar a los
$wgWhitelistAccountU
=array("editor" =>U
1,"user" => 0U
"sysop" => 1,U
"developer" => 1)
Habiendo creado el tipo de
usuario, el operador puede
proseguir asignando privilegios de lectura o escritura mediante la configuració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 consultas SQL para convertir a
ADMINISTRACIÓN
usuarios polémicos y tenaces bloqueándoles sus direcciones IP. Desafortunadamente, los usuarios no registrados con
conexiones telefónicas temporales (dialup) cambian constantemente sus IPs.
Por esta razón, una IP se bloqueará, de
manera predeterminada, durante solamente 24 horas (opción $wgIPBlock
Expiration). En general, la desfiguración
es una cuestión sobrestimada. Las cuestiones 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 convertir algunas de estas cuestiones a
políticas de uso. El operador del wiki
deberá definir cuidadosamente las
opciones predeterminadas,en la estructura $wgDefaultUserOptionsEn dentro
del archivo Language.php o sus equivalentes 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. editondblclick abrirá la ventana de edición
cuando se hacer doble clic sobre la página. showtoc genera una tabla de contenidos 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 presenta 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 edició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 los
nombres
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.
www.linuxmagazine.com.es
Wikipedia hizo frente
rápidamente a la
Número 01
57
ADMINISTRACIÓN
Wikipedia
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 acertadamente las dos, Mediawiki introduce
los denominados espacios de nombres
(namespaces), los cuales son definiciones en Language.php o su traducción
local. Por omisión, estos son el espacio
de nombres principal, el espacio de nombres 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 espacio de nombres Mediawiki muy especial.
Los artículos fuera del espacio de nombres principal siempre tendrán un prefijo. [[Discussion:Mainpage]] apunta hacia
la página de debate al que pertenece a la
página principal, [[User:Troll]] es la página 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,
este espacio de nombres supone el
valor de la variable $wgSitename en
DefaultSettings.php. La FAQ de la Wikipedia 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 retirados del interfaz de usuario. Una caracterí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ágina llamada Linux/Consejos Kernel. La
página Consejos Kernel tendrá automáticamente 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 texto
El 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ística de la actualización automática.
Observese que en las páginas del espacio
de nombres Mediawiki no están permitidos los caracteres no estándar o espacios
en sus cabeceras. Como cada texto del
Manual Práctico de Mediawiki
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 trabajando 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 comment) 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 versiones anteriores. Para hacerlo, selec-
Figura 6: El historial permite al operador (sysop) supervisar el desarrollo de un articulo de la
Wikipedia.
58
Número 01
www.linuxmagazine.com.es
cionamos una versión haciendo clic en el
enlace de fecha (timestamp), editamos la
página que estamos viendo y la almacenamos. El enlace versión actual (Current revision) también es bastante útil y muestra las
diferencias entre cualquier versión y la actual. 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 avanzadas. Por ejemplo, Mediawiki usa páginas
especiales para mostrar las páginas nueva o
huérfanas, las páginas que no están señaladas por ningún enlace. Funciones adicionales 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.
Wikipedia
ADMINISTRACIÓN
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 montón de espacio en el servidor.
Próximamente: Wikitex
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.
programa se recupera desde la base de
datos, se puede usar esta característica
solamente en combinación con memcached (descrita más adelante).
Manejo de un wiki
Una vez configurado y en marcha,
Mediwiki da pocos quebraderos de
cabey. Ejecutar Mediawiki durante un
largo periodo de tiempo es de hecho considerablemente 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], ejecutaremos el guión maintenance/rebuildall.php en el directorio de instalación.
Como próximo paso, para evitar preguntas 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 modificaciones en LocalSettings.php para evitar
sobreescribirlas durante una actualización. Mediawiki tiene la opción
$wgMiserMode para wikis de gran extensión. Habilitando la opción se desactivan
las consultas que consumen mucho
tiempo tales como una lista de los artículos 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.
Memcached
El demonio deberá ejecutarse en segundo 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 autentificación. Los usuario locales tienen acceso
sin restricciones. Conviene evitar la ejecución de memcached en un sistema con
múltiples usuarios locales. Sin un firewall o el parametro -l, los usuarios externos pueden acceder al servidor y cap-
Aú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 encuentren la mayoría de las características algo
confusas. En el caso de tener alguna pregunta o para resolver dudas, la comunidad Mediawiki, que es tan solícita
como lo son la mayoría de las comunidades 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.
INFO
[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
www.linuxmagazine.com.es
Número 01
59
ADMINISTRACIÓN
SMTP
SMTP vía TLS con Evolution, Kmail y Mutt.
Correo Más Seguro
La 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 programas modernos de correo son capaces de usar los métodos mencionados, tienden a complicar la vida innecesariamente de cualquier usuario que desee aprovechar
los beneficios de la confidencialidad y seguridad.
POR PATRICIA JUNG
L
os mensajes de correo electrónico
son como una postal - cualquier
“cartero” los puede leer. Si bien la
mayoría de los administradores de sistemas escrupulosos evitarán leer el
correo privado de otras personas, al
menos en teoría, los privilegiados poseedores 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 problema: si un país niega a sus ciudadanos
el acceso a métodos seguros de
encriptación - típicamente argumentando 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 encriptados 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,
60
Número 01
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 confidencialidad en sus mensajes de correo.
Sine embargo, cada vez más proveedores 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 protocolo 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 trabajar en ella, o con su correspondencia
encriptada? Como la encriptación normalmente solo se utiliza para prevenir
que datos sensibles crucen la red al descubierto, un sistema de encriptación que
funcione en el servidor y que sea transparente para los usuarios, como SMTP/
TLS es una buena solución.
www.linuxmagazine.com.es
Agentes Secretos
Esta 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 intercambio seguro sin necesidad de
intervención exterior. Para permitir esto,
ambos ordenadores intercambian certificados 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 utilizarán para codificar el tráfico
resultante.
GLOSARIO
https: Si bien puede que sorprenda saberlo,
pero https no es un protocolo independiente.
La comunicación entre buscadores y servidores 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.
SMTP
ADMINISTRACIÓN
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 aceptará los certificados de un
servidor si confía en que la
autoridad que lo certifica ha
hecho el proceso con consistencia. La autoridad autentifica el certificado firmándolo con su propio certificado, que a su vez ha sido
firmado por un proveedor
seguro de mayor rango.
A pesar de todo, para confiar en una autoridad, el
cliente necesitará almacenar
los certificados de las autoridades de confianza superior,
los certificados raíz.
Preferences (Preferencias del
correo).
La versión 1.2 resuelve los
dos problemas, si bien el
asistente o el cuadro de diálogo de Use secure connection
(SSL) (figura 2) se refiere de
nuevo sólo a SSL, sin mencionar TLS, éste último
protocolo
también
esta
soportado. Solo Dios sabe por
que el valor Whenever possible (Cuando sea posible) no
es el valor por defecto.
Cuando intentamos enviar
correo encriptado por primera vez, Evolution nos
mostrará información del cerFigura 1: KMail deja en manos del usuario descubrir si el servidor de correo
tificado del servidor y nos
conoce TLS.
solicitará que lo aceptemos o
que no utilicemos el túnel
la pestaña Sending de la opción Network
SSL/TLS (ver figura 3). Como el proCómo se Hace
o modificamos una cuenta existente,
grama no nos ayuda a tomar esta
Mientras que los servidores de correo (o
necesitamos seleccionar adicionalmente
decisión (por ejemplo, que significa si
Agentes de Transferencia de Correo)
la pestaña Security en el cuadro de dialuna firma es BAD), puede que sea mejor
como Postfix o Sendmail usarán
ogo que aparece (figura 1). Esto al
dejar que el programa tome la decisión él
automáticamente TLS si ambas partes
menos nos proporcionará la opción de
mismo en lugar de preocupar al usuario
son capaces de hacerlo, los desarrolmarcar en Check what the server supports
preguntándoselo.
ladores de clientes de correo actuales [1]
para verificar lo amigable que es la
El programa de la línea de comandos
(los llamados Agentes de Usuarios de
encriptación del anfitrión inteligente
mutt es ejemplar: como siempre usa
Correo) tienden a prestar poca atención
seleccionado en la pestaña General. Si la
servidores de correo local para transmitir
a la facilidad de uso. En lugar de preconrepuesta es positiva (la alternativa, SSL el correo mediante el interfaz
figurar sus programas para usar SMTP/
Capa de conexión segura- es un
/usr/sbin/sendmail, no necesita soportar
TLS cuando sea posible, esperan que los
antecedente de TLS), podemos pulsar
SMTS/TLS. El mensaje cogerá automátiusuarios sean los que conozcan la mateOK para asegurar que Kmail usará comucamente un camino seguro a través de la
ria y que elijan y sepan implementar
nicaciones encriptadas.
red si el Agente Local de Transferencia
estos valores seguros.
La versión 1.0.x de Evolution proporde Correo y el servidor de destino lo
En el caso de KMail sobre KDE3.x, si
ciona una opción segura SSL para el
pueden proporcionar sin ninguna interseleccionamos Settings/Configure… y
anfitrión inteligente. Desafortunadaacción por parte del usuario. Pero no
después añadimos una nueva cuenta de
mente, marcando Use secure connection
podemos evitar proporcionar a nuestro
salida (Outgoing account) con SMTP en
(SSL) (Usar conexión segura) se conservidor de correo local de este potencial
■
vierte en un escollo en muchos casos. La
en nuestro propio ordenador.
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
Figura 3: ¿Confías en este certificado?
be established. The connection was reset
by the communication partner. (La
conexión con nombre.de.los.servidores
RECURSOS
(puerto 165) no se pudo establecer. La
[1] Patricia Jung y Andrea Müller:“Mail and
conexión fue restablecida por el asistente
more”, Linux Magazine International,
número 29, abril del 2003, página 44,
de comunicación). El cliente ni siquiera
http://www.linux-magazine.com/issue/
Figura 2: ¿Por qué no es esta la opción por
intentará la comunicación no encriptada
29/MailUserAgents.pdf
defecto?
hasta que quitemos la marca en Mail
www.linuxmagazine.com.es
Número 01
61
ADMINISTRACIÓN
Syslog
Registro de Sistema de Próxima Generación: Syslog-NG
La Caja Negra
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
los más difundidos es Syslog-NG (Syslog
de próxima generación) que se lanzó
bajo licencia GPL. Muchas distribuciones Linux ya han adoptado SyslogNG. Otras alternativas disponibles son
Reliable Syslog, en su primera implementación, SDSC Secure Syslog [5] y
Syslog Sign. El último todavía está en
fase beta.
Problemas con BSD Syslog
S
yslog permite a los administradores
obtener información de registro en
sus sistemas de manera uniforme
para toda la red. Realizando la tarea de
guardar, analizar y procesar los archivos
de registro fácilmente, pero lo que la
gente espera de los registros del sistema
ha cambiado en los últimos años y el servicio Syslog tradicional simplemente no
lo puede ofrecer. Syslog-NG [1] cubre
este hueco.
Los registros tradicionalmente se usan
para comprobar la salud del sistema.
Muchos administradores ni siquiera se
molestan en mirar los registros a menos
que se encuentren con un problema en el
sistema. Pero hoy, es también una
cuestión de mejorar la fiabilidad, esto es,
usar el sistema como una alerta temprana para impedir que las cosas vayan a
peor. La integridad de los mensajes de
un sistema es también ahora más importante que nunca, ya que permiten a los
administradores
levantar
defensas
basadas en datos reales. Los administradores también buscan habitualmente más flexibilidad en la configuración y en el manejo de las redes.
Han salido varios proyectos que intentan conseguir este objetivo de mejorar el
servicio del Syslog tradicional. Uno de
62
Número 01
El servicio syslog tradicional se presentó
en Septiembre de 1983 en la Universidad
de California (Berkeley). No tenía documentos de diseño y el software estaba
pobremente documentado. Pasados 18
años BSD Syslog se terminó de documentar en el RFC 3164 [7].
Syslog se ha convertido en un estándar
de facto. El servicio es fácil de configurar, usando un fichero de configuración
central llamado syslog.conf. Pero hay
unas cuantas buenas razones para no
estar satisfecho con la funcionalidad de
syslogd:
Falta de métodos de
autenticación
Syslogd no puede distinguir entre distintos hosts. Si el servicio se lanza con la
opción -r, acepta mensajes UDP en el
puerto 514 sin importar cual es su origen. Esto permite a los atacantes invadir
el servidor de registro con paquetes UDP
o transmitir mensajes manipulados.
Aparte de utilizar la funcionalidad de un
firewall simple, no hay forma de proteger
al servidor de registros.
• Mensajes en texto claro
Syslog siempre usa texto claro (texto no
cifrado) para transmitir mensajes a
través de la red. Esto permite fácilmente
www.linuxmagazine.com.es
espiar los mensajes y conseguir el acceso
a la información privilegiada.
• Configuración poco flexible
La configuración de Syslog usa un sistema poco flexible con 20 posibles orígenes y 8 prioridades. Esto puede ser un
obstáculo en grandes redes o para servidores con múltiples servicios.
• Uso inconsistente de orígenes y prioridades
Para la mayoría de las aplicaciones los
administradores no tienen una opción
para administrar mensajes bajo un origen específico. En algunos casos se
puede establecer una opción cuando se
compila la aplicación, pero en tiempo de
ejecución hay realmente pocas opciones
disponibles.
• No registra el origen de la fuente
Cuando un mensaje pasa por distintos
servidores de registro es imposible descubrir la fuente del mismo. Syslog no
almacena el FQDN (Fully Qualified
Domain Name) del host. Cada host que
propaga un mensaje modifica la dirección IP registrada.
• Uso de transferencia de mensajes no
orientado a la conexión (UDP)
Syslogd solo puede usar el protocolo
UDP para transferir los mensajes. Si un
paquete se pierde por problemas en la
red el mensaje nunca llegará al destino.
Syslog-NG
Existen grupos de desarrolladores que
están trabajando para eliminar estos
problemas y desarrollando un sistema de
registros (ver los cuadros “Syslog-Sign” y
“Reliable Syslog”). Actualmente SyslogNG es el mejor de ellos. Este desarrollo
se basa en el servicio Syslog tradicional
al que se le han añadido nuevas carac-
Syslog
PRI
PRI
Header
Header
SHA-1
Message N
SHA-1
Message N+1
Hash
ADMINISTRACIÓN
DSA/DH
Private
Key
DSA/DH
Hash
Other Messages
PRI
Header
SHA-1
Message N+M
PRI
DSA/DH
Hash
Header
H(N)
H(N+1)
...
SHA-1
Hash
H(N+M)
SIG
DSA/DH
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.
terísticas sin sacrificar la compatibilidad
con el RFC 3164. Aunque actualmente
carece de características tales como la
firma digital y encriptación, los desarrolladores están intentando añadir la
encriptación en una versión futura.
Actualmente se necesita stunnel [4] para
manejar la encriptación.
Syslog-NG puede cambiarse de UDP a
Syslog-Sign
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 proteger 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í mismos, 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 utiliza un mensaje normal para distribuir la
clave pública. Aún se está trabajando en una
implementación para FreeBSD [6]
TCP para proporcionar más fiabilidad en
la entrega de mensajes. En este caso, la
herramienta usa el puerto 514 por defecto. Aunque actualmente el puerto 514
está reservado para rlogin. Si quiere que
los dos funcionen al mismo tiempo
habrá que reconfigurar el servidor.
Muchas
distribuciones
incluyen
actualmente Syslog-NG. Si se quiere usar
el sucesor de Syslog en SuSE, hay que
escribir la siguiente línea en /etc/sysconfig/syslog y relanzar el servicio.
SYSLOG_DAEMON='syslog-ng'
El archivo de configuración central,
/etc/syslog-ng/syslog-ng.conf, es ligeramente más complejo que el tradicional
del syslogd. En vez de incluir original y
priority, contiene el llamado logpaths
que está formado por source, filter y destination.
Hay ocho controladores fuente diferentes (véase Tabla 1). El controlador
internal es obligatorio. Syslog-NG usa
esta fuente especial para transmitir mensajes que tienen que ver con el propio
servicio.
Fuentes
Cuidado: Los controladores file y pipe no
deben confundirse con las acciones de
syslogd, file y pipe. Syslog-NG los usa
como fuente desde las cuales el servicio
lee mensajes y no como destino a los que
redirigir los mensajes. El controlador file
se encarga de klogd, por ejemplo leyendo
los mensajes del kernel desde
/proc/kmsg.
Cada uno de estos controladores tiene
una o más opciones, que pueden especificarse entre paréntesis seguido del nombre del controlador, por ejemplo, TCP y
UDP necesitan saber el número de puer-
Reliable Syslog
Reliable-Syslog [8], que está especificado en
el RFC 3195, usa BEEP (Block Extensible
Exchange Protocol) para transferir los mensajes. Este protocolo del nivel de aplicación
está basado en TCP. Está orientado a la
conexión y tiene mecanismos de autenticación y verificación.Y proporciona protecció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 almacenan atributos adicionales como direcciones 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 PkgConfig. Además de los perfiles RAW y
COOKED, también soporta el perfil llamado
Security Profile.
www.linuxmagazine.com.es
Número 01
63
ADMINISTRACIÓN
Syslog
Tabla 1: Controladotes
fuentes
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)
to en el que escuchar y file necesita el
nombre del archivo. Los sistemas Linux
usan el controlador unix-stream localmente; el controlador usa un socket de
dominio Unix orientado a la conexión.
Cada conexión abierta requiere su propio
proceso, un hecho que un atacante
podría explotar para realizar un DoS
(ataque por denegación de servicio).
max-connections puede impedir esto
especificando un número máximo de
conexiones concurrentes al servicio syslog. Está establecido a 10 por defecto. El
manual de referencia [2] contiene una
lista completa de los controladores
fuente.
Filtros y Destinos
Los filtros describen como Syslog-NG
debería manejar los mensajes que recibe
de las diversas fuentes. Éste es uno de
los puntos fuertes del nuevo sistema de
registro. Los administradores pueden
usar filtros para ordenar los mensajes y
pasarlos a los destinos apropiados.
Las funciones de filtro (véase la Tabla
2) pueden conectarse usando operadores
booleanos (and, or, not y paréntesis).
Para aplicar un filtro el resultado de la
operación debe ser true. Algunas funciones de filtros pueden manejar expresiones regulares como opciones.
Los destinos especifican donde y por
qué medios un mensaje debe ser redirigido y procesado. Tal y como en las
fuentes hay disponibles un número de
controladores de destino, cada uno de
los cuales pueden tener distintas
opciones. La Tabla 3 proporciona una
lista de controladores disponibles.
Syslog-NG llama al controlador una
sola vez y lo mantiene ejecutándose
hasta que el servicio recibe la señal
SIGHUP y termina. Esto hace que el controlador sea muy eficiente. Si Syslog-NG
se lanzase por un programa externo por
cada mensaje entrante un atacante
podría lanzar múltiples procesos que
sería similar a un ataque tipo DoS contra
el sistema.
Syslog-NG también tiene un número
de opciones globales. Por ejemplo,
chain_hostname y sep_hostname especifican como Sislog-NG debe manejar los
nombres de host cuando pasa un mensaje a través de múltiples servidores de
registros. Esto permite a los administradores descubrir donde se originó el
mensaje. El manual de referencia [2]
contiene una lista completa de opciones
globales.
Ejemplo de Configuración
Para
ilustrar
la
estructura
de
syslog-ng.conf la siguiente sección muestra un archivo de configuración simple
dividido en secciones. Si está interesado
en hacer un archivo más complejo puede
consultarlo en [3].
Tabla 2: Funciones filtro
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
match
Filtra los mensajes donde el campo
nombre de host contiene la expresión
regular especificada.
Aplica la expresión regular especificada
al mensaje entero.
filter
64
Llama a otra regla de filtro.
Número 01
source local {
internal ();
unix-stream("/dev/log");
file("/proc/kmsg");
};
La fuente especifica aquí está identificada por su nombre local y comprende un
número de fuentes locales. Los controladores fuentes son internal (obligatoriamente) y el controlador unix-stream, los
cuales usan el archivo de dispositivo
/dev/log y el controlador file que lee los
www.linuxmagazine.com.es
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; y
su controlador es tcp. Syslog-NG ahora
escuchará los mensajes en el puerto TCP
3333. Incluso si el ordenador tiene múltiples direcciones IP el servidor sólo
escuchará en 192.168.0.24. La opcion
max-connections está establecida en 10;
el ordenador aceptará un máximo de 10
conexiones concurrentes al Syslog-NG.
No es necesario especificar una única
fuente para los mensajes remotos.
Muchos administradores crean una
fuente individual que maneja todos los
controladores. Dicho esto, fuentes separadas suministraran una estructura más
limpia.
Selección de Mensajes
Ahora a por los filtros. Nuestro primer
ejemplo maneja mensajes cuyo nivel de
registro corresponde a los valores warn,
err, crit:
filter warning {
level(warn, err, crit);
};
Esta regla simple, que aplica los filtros
basados en las prioridades, es bastante
Tabla 3: Controladores
destinos
Destino 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).
Syslog
Message
Message
TCP-Port 601
ADMINISTRACIÓN
Message
UDP-Port 514
Loghost 1
Loghost 2
Loghost 3
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.
común al tradicional syslogd. La mayor
ventaja de la variante Syslog-NG es el
uso de las expresiones regulares. Una
introducción a esta técnica la podemos
encontrar en diversos libros de Perl, así
como en la documentación para el programa Logsurfer [9]. Esta herramienta
automática de análisis de archivos de
registro hace un uso intensivo de las
expresiones regulares y proporciona una
referencia de 50 páginas.
Veamos una expresión regular
extremadamente simple que busca todos
los mensajes que tienen algo que ver con
FTP, que se cumple si la cadena ftp
aparece en cualquier parte del mensaje:
originado por la utilidad authpriv, y
todos los avisos del Kernel. El filtro email
sólo permite pasar los mensajes del sistema de correo.
Los Destinos
Todo lo que necesitamos ahora son unos
cuantos destinos a los que mandar los
mensajes. La siguiente entrada de configuración le dice a Syslog-NG que escriba 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");
};
filter ftp { match("ftp"); };
Y aquí tenemos otra regla de filtro que
sólo permite a los mensajes críticos
pasar y que también es útil para la salida
a TTY10. La salida por consola no
debería ser muy verbosa:
destination console {
file("/dev/tty10");
};
Una ruta de registro describe la ruta
completa desde la fuente, a través del fil-
filter console {U
level(err) andU
not facilityU
(authpriv) orU
level(warn) andU
facility(kern);
};
tro hasta el destino. Es una regla que
engloba el nombre de la fuente, un filtro
y un destino. La primera de las siguientes reglas lee mensajes desde la
fuente local y manda las entradas que
coinciden con la regla de filtro konsole al
destino konsole. La segunda regla almacena los mensajes del sistema de correo
local en /var/log/mail.
01
02
03
04
05
06
07
08
09
10
11
log {
source(local);
filter(console),
destination(email);
};
Si un host necesita reenviar los mensajes
recibidos a través de la red desde una
fuente a otro host de registro,
simplemente hay que configurar un destino apropiado para
Syslog-NG.
destination loghost {
udp(ip(172.16.0.33)
port(514));
};
filter email {U
facility(mail)U;
};
El filtro console usa funciones, valores y expresiones booleanas. Esta
regla trata cualquier mensaje de error que no se ha
log {
source(local);
filter(console);
destination(console);
};
log {
source(remote);
filter(ftp);
destination(loghost);
};
Figura 3: El servidor Syslog de Kiwi Enterprises permite a los administradores
incluir ordenadores con Windows en su configuración de registros.
Lo importante es que el servidor de registro, loghost, esté
www.linuxmagazine.com.es
Número 01
65
ADMINISTRACIÓN
Syslog
escuchando el puerto 514 definido por la
dirección IP 172.16.0.33 en su archivo de
configuración. Este método de conversión de direcciones puede ser extremadamente útil (Véase la figura 2).
Opciones Globales
Para completar el archivo de configuración, ahora hace falta poner las
opciones globales, que se colocan al
principio del archivo. Alguna de las
opciones especifican como Syslog-NG
manejará los nombres de hosts de los
mensajes, cuando redirigir los mensajes
a otro servidor de registro. Habilitando
keep_hostname> se le dice a Syslog-NG
que mantenga los nombres existentes.
Si se deshabilita keep_hostname,
chain_hostname (alias: long_hostname)
decide lo que hacer con el nombre. Sin el
encadenamiento (chain_hostname), el
servidor de registro insertará su propio
nombre, con encadenamiento añadirá su
nombre al nombre ya existente. Esto permite a los administradores trazar la ruta
de los mensajes hasta su origen.
options {
keep_hostname(no);
chain_hostname(yes);
sync(0);
};
La opción sync especifica el número de
líneas que Syslog-NG guardará en la
caché, antes de escribirla en el archivo.
Un número alto aumentará el rendimiento, pero incrementará el riesgo de perder
los mensajes si el sistema cae.
El listado 1 contiene un archivo de
configuración. Éste ilustra como de
avanzado es Syslog-NG con respecto a
los conceptos de flexibilidad y escalabilidad, en comparación con su predecesor.
Casi Perfecto
Las funciones filtros permiten a los
administradores hacer los registros a
medida, para reflejar las infraestructuras
de redes complejas. La configuración es
clara a pesar de su flexibilidad. Incluso
se puede compensar la carencia de utilidades de encriptación y autenticación, si
Listado 1: Configuración Syslog-NG
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); };
66
Número 01
www.linuxmagazine.com.es
se está preparado para realizar un trabajo extra [4]. Si se precisa integrar las utilidades de encriptación, autenticación y
no repudio, se debe ver SDSC Secure
Syslog. Sin embargo, este servidor
requiere más mantenimiento.
Sin duda, Syslog-NG es el más completo, ya que se puede configurar para
soportar su infraestructura con muy
■
poco esfuerzo.
Syslog y Windows
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 sistemas 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 comercial con funcionalidades ampliadas.
La versión gratuita es adecuada para simplemente 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 software 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.
RECURSOS
[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/
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 hacer
para que las demás puedan conectarse concurrentemente? Necesitas un portal o
router 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, a
la vez que exigen pocos recursos. Sin embargo, muchos no disponen de un panel de
control. 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? La
respuesta está en Konversation, el último y más novedoso de los clientes IRC de
KDE. 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 que
permite crear interfaces de manera sencilla y rápida. Aprende desde cero a crear tus
propias aplicaciones multiplataforma con esta serie.
Educación: WIMS
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
¿Necesitas poder generar ejercicios para tus alumnos? Puede que WIMS sea la
respuesta. Este servidor educacional permite crear ejercicios, exámenes y tests;
además administra clases y proporciona un entorno ideal para el autoestudio. Sirve
para cualquier plataforma (Windows, Linux o Mac) y por supuesto que es gratuito y
de código abierto.
Linea de Comandos: Grep
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
El problema ya no es que no exista documentación sobre un tema concreto, sino
como encontrarla entre todas las descargas en nuestros discos duros. Grep es la herramienta 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 programas
de autoedición corriendo en costosos equipos. De hecho, no hace falta ni un procesador de textos. Con un pequeño editor y unos pocos comandos podemos generar
documentos formateados elegantemente, con cuadros, tablas y notaciones
matemáticas utilizando Latex.
LINUX USER
Portal
Configurando una puerta de enlace en Linux
Portal de acceso
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 utilizar 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 interfaz entre nuestra red local e Internet. BY HEIKE JURZIK
L
os routers se utilizan para intercambiar 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 adecuada. Por supuesto, suponemos que
tenemos una conexión a Internet y una
conexión a la red local en el mismo ordenador. Este taller nos muestra la manera
de configurar nuestro ordenador Linux
para que nos ofrezca capacidades de
enrutado.
SuSE Linux
Si tenemos instalado SuSE para permitirnos 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 volvemos a Network Devices o Network/Basic.
6. Ahora debemos comprobar la configuración de Network card para asegurarnos de que el transporte IP esté habilitado. Para hacer esto, pulsamos
68
Número 01
Change… para modificar la configuración de una tarjeta previamente configurada. Entonces, seleccionamos la tarjeta 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 (Cortafuegos). Aquí encontramos la opción
Forward Traffic and do masquerading
(Remitir Tráfico y hacer enmascaramiento), que debimos marcar como activa.
Red Hat Linux
dispositivos y pulsamos Edit en la
barra de herramientas. Alternativamente 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 redirecció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 comandos y pulsamos [Enter] y escribiendo
la contraseña de root.
3. Comprobamos que el modulo NAT
Los 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 iniciamos la herramienta
redhat-config-network (redhat-configuración-red) pulsando en el menú K,
Systems
Settings
(configuración
del
sistema) y finalmente
Network (redes). Tras
introducir la contraseña
debemos
seguir estos pasos:
1. Seleccionamos una
conexion de InterFigura 1: Conversión del ordenador en un router.
net de la lista de
www.linuxmagazine.com.es
Portal
esta cargado:
puerta de enlace por defecto).
4. Salvamos los cambios y salimos del
programa.
/sbin/lsmod | grep iptable_nat
Puerta de Enlace con
Microsoft Windows
Sí esta prueba no nos proporciona
ningún resultado deberemos cargar el
modulo escribiendo:
Para 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:
/sbin/modprobe iptable_nat
4. Ahora introducimos
comando:
el
siguiente
Figura 2: Habilitando la redirección IP en SuSE
/sbin/iptables -t nat -A
POSTROßß
UTING -o ppp0 -j MASQUERADE
5. Salvamos la configuración escribiendo:
/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 reemplazaremos 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 cambiamos sysctl.conf sin escribir “1”
en ip_forward ahora podemos escribir:
Linux.
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 configuration (SuSE Linux 8.1).
3.Ahora pulsamos Change… para cambiar la configuración de la tarjeta existente seleccionándola de la lista y pulsando 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, necesitaremos de Nuevo el programa redhat-confignetwork:
1. Iniciamos la herramienta redhat-config-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
/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 Linux
Ahora debemos configurar los ordenadores 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.
LINUX USER
Figura 3: Configuración de la ruta por defecto en
Red Hat Linux.
Windows 95/98/Me
1. 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 pulsamos 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 configuración.
Windows 2000
1. Abrimos Inicio/Configuración/Panel de
Control/Red y conexiones, pulsamos
con el botón derecho sobre Conexión
Área Local y seleccionamos Propiedades 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 de
Enlace por Defecto:.
4. Finalizamos pulsando Aceptar.
Windows XP
1. Pulsamos sucesivamente en Inicio/
Panel de Control y luego Red y
Conexiones Internet.
2. Abrimos las conexiones de red en
Conexiones de Red.
3. Con el botón derecho accedemos al
menú del icono Conexiones de Área
Local donde seleccionamos Propiedades.
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 de
Enlace por Defecto:.
6. Pulsamos Aceptar para confirmar. ■
www.linuxmagazine.com.es
Número 01
69
LINUX USER
Desktopia
Panelizer
Aplicaciones a Raya
Los gestores de ventanas simples ofrecen una serie de ventajas en comparación con los entornos de escritorio más complejos: 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
I
evitar perdernos en el proceso.
Después de gestionar adecuadamente
las numerosas dependencias, podemos
empezar a compilar Panelizer. DesInstalación compleja.
comprimimos el archivo- 0.5.tar.gz (que
podemos descargarnos desde [1]) con
No existen paquetes precompilados del
tar -xzf panelizer-0.5.tar.gz. A continpanel, por lo que debemos utilizar nueuación cambiamos al nuevo directorio de
stro compilador. Aparte de la librería
Panelizer que hemos creado. Puesto que
GTK versión 1.2.0 o superior (excepto
el programa no dispone de archivo de
gtk-2.x) y libxml, necesitaremos el
configuración, será necesario usar un
paquete de desarrollo del Panelizer y,
editor de texto para añadir nuestras prefpor supuesto, un compilador. Como el
erencias al archivo Config.mak. No
GUI de Panelizer fue desarrollado utiobstante, los útiles valores por defecto
lizando glade, necesitaremos tener insta(como la instalación en /usr/local) hacen
lado este paquete antes de poder compique la personalización no sea imprelar el panel. El gestor del paquete glade
scindible.
suele tender a instalar numerosas librYa podemos lanzar el compilador
erías GNOME adicionales localizadas
escribiendo make, e instalar escribiendo
normalmente en el CD de instalación.
make install. Como alternaAfortunadamente, éstas solo
tiva, también podemos inson esenciales para compilar
stalar Panelizer como un
Figura 1: Primera ejecuPanelizer, por lo que el softROX applet [2] utilizando el
ción de Panelizer.
ware puede ser borrado
comando roxinstall. Si bien
después de la compilación. Es
en la teoría esto es una buena opción,
una buena idea tomar nota de todos las
uno se pregunta porque los usuarios de
librerías añadidas al instalar glade para
70
Número 01
www.linuxmagazine.com.es
www.yukonhostels.com
ndependientemente 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 lateral con reloj y menú. Los paquetes integrados 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 monitor de correo y applets para montar dispositivos 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.
ROX, que ya disponen de un panel, necesitan otro.
Simple, ordenado y
funcional.
Tras completar el proceso de instalación
podemos ejecutar el panel escribiendo
panelizer &. La figura 1 muestra la configuración estándar, si bien no muestra
mucho. Pulsando la flecha de la izquierda 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 significativo, 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 configuración (Figura 2). Lo primero que
debemos decidir es que queremos que
GLOSARIO
Punto de Montaje: directorio donde el archivo del sistema de un volumen esta unido al
árbol local de archivos del sistema.
Desktopia
Mount directory en la pestaña Paths & Commands. Por
defecto, se analiza la carpeta
apps de la instalación
GNOME 1.4 (que puede existir o no) en busca de información. Es posible personalizar 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 categorías, sino mostradas individualmente (ver Figura 3).
La ubicación de nuestra
instalación de GNOME depende de nuestra distribució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 funcionamiento del menú de KDE 3.1.x. A
pesar de que el panel muestra las aplicaciones individualmente si especificamos
como nuestra carpeta de menú /usr/
share/applnk, Panelizer proporciona los
parámetros incorrectos cuanto tratamos
de ejecutar cualquier programa. Para lanzar el panel por defecto cuando introducimos el comando startx, debemos
añadir el comando /usr/local/bin/panelizer & a nuestro fichero .xinitrc antes de
llamar a nuestro gestor de ventanas. ■
RECURSOS
[1] http://www.fcoutant.freesurf.fr/
panelizer.html
[2] Jo Moskalewski:“RISC rocks”,Linux Magazine del 24 de octubre de 2002,página 73
LA AUTORA:
muestre el panel. Pulsando Add abrimos el
diálogo de selección. Esta
sección incluye un conjunto de útiles herramientas, como un monitor de
mensajes de entrada en el
buzón de correo (llamado
Mail Counter en la documentación), un applet
para montar dispositivos
(Mount Applet), un conmutador de silencio para
la tarjeta de sonido, un
menú de inicio para programas y herramientas de
monitorización para la
CPU, memoria y tráfico
de red.
Figura 3: Panelizer mostrando el menú de GNOME 2.
Debemos prestar atención al deskswitch (aplicación de concuando pulsemos el icono del correo en
mutación). Como la mayoría de las apliel panel, es decir, abrir el programa que
caciones de conmutación no funciona
utilicemos.
con todos los gestores de ventanas, pero,
Debemos prestar también atención a la
en lugar de simplemente negarse a funfunción de silencio. La configuración por
cionar con candidatos no adecuados,
defecto ejecuta esd (“Enlightenment
Panelizer se cuelga cuando llamamos al
Sound Daemon”). Si utilizamos otro
applet. Podemos ejecutar Panelizer sin
servidor de sonido, debemos indicarle la
problemas de cuelgues con entornos
nomenclatura correcta para su manipucomo WindowMaker, Enlightenment or
lación. Por ejemplo, para trabajar con
IceWM. No podemos utilizarlo con
aumix la sintaxis correcta es aumix -v0 y
waimea, PWM or Blackbox.
aumix -v75. Este texto debe ser escrito
en los recuadros When pushed on y
El baile de la configuración.
When pushed off respectivamente. Esta
Algunas herramientas del Panelizer funconfiguración apagará el sonido cuando
cionan bastante bien con la configupulsemos el icono del altavoz una vez, lo
ración por defecto, pero otras necesitan
volverá a conectar cuando lo pulsemos
algunos cambios. Pera realizar cambios
de nuevo, subiéndolo al 75 % si pulen un applet, debemos seleccionarlo en
samos el botón una tercera vez. La aplila ventana de configuración y pulsar el
cación de redes necesita saber que interbotón Configure. Por ejemplo, para perfaz debe monitorizar, mostrando la
mitir que el monitor de correo (biff) funvelocidad de conexión cuando esté concione, debemos indicarle donde esta
figurado. Los usuarios de módems y DSL
almacenado nuestro buzón de correo y
pueden usar el dispositivo ppp0 para
especificarle que acción debe realizar
monitorizar su conexión a Internet, siendo eth0 el dispositivo habitual utilizado
para redes locales.
Si deseamos monitorizar ambos tipos
de redes, debemos iniciar dos aplicaciones de red. Panelizer permite la selección de símbolos en la ventana de configuración con el objeto de ayudarnos a
distinguir aplicaciones. Podemos utilizar
los mismos pasos para añadir múltiples
applets escalonados para diversos controladores y particiones de nuestro sisFigura 2: Un práctico editor nos ayuda con las tartema. No debemos olvidar introducir el
eas de configuración.
punto de montaje adecuado para el
LINUX USER
Andrea Müller es una
estudiante de derecho que se entretiene
con Linux siempre
que se cansa de
teorías legales.
Cuando el tiempo se
lo permite, le gusta
estudiar otros sistemas operativos
como QNX, BeOS y NetBSD, e intenta
mejorar sus habilidades con Python. Al
margen de Linux y sus estudios universitarios, los intereses de Andrea se
decantan hacia la literatura, la historia Europea y el ciclismo.
www.linuxmagazine.com.es
Número 01
71
LINUX USER
Schlagwort
Konversation
¡Habla conmigo!
¿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 Konversation, la última herramienta IRC de KDE, por su amigable entorno.
BY STEFANIE TEUFEL
S
i 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 realizado 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 diversos paquetes RPM para los distribuciones 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.
APLICACIONES
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.
72
Número 01
No hay paquetes disponibles para
en la red IRC más importante, IRCNet, y
SuSE 8.1 y algunas otras distribuciones,
después introducir el canal KDE pulsando
pero tras descomprimir el paquete
#kdeusers. Tras abrir la ventana de conkonversation-0.12.tar.gz desde /usr/versación que aparece podemos seleclocal/kde/bin, la configuración estándar,
cionar Settings/Konversation Configure
configure; make; make install funcionará
para volver al diálogo de configuración.
perfectamente. Este procedimiento suPara conectarnos a servidores chat de
pone que los paquetes KDE3 y Qt3-Dev y
otras redes IRC debemos pulsar el acceso
las herramientas estándar de compiNew Server (Nuevo Servidor) en la figura
lación están instaladas.
1 y escribir los detalles del servidor en la
Para arrancar el programa, podemos ir
ventana de la figura 2 (p. ej.: Freenode
al acceso Internet/Konversation en el
[2]). Al mismo tiempo podemos selecmenú K o escribir konversation & en la
cionar un canal para conectar de forma
ventana terminal de nuestra elección. Si
inmediata con el nuevo servidor. Este
el programa lo compilamos nosotros,
pequeño truco nos puede ahorrar mucho
hay que introducir la ruta correcta.
tiempo más adelante. Si deseamos
La ventana principal (figura 1) es el
conectarnos a un servidor específico
centro de comandos donde configucada vez que iniciemos el programa
raremos el programa de acuerdo a nuesdebemos marcar la casilla del servidor
tras necesidades concretas. El punto de
deseado en Server List.
entrada, una caja de diálogo llamada
La anotación Identity (Identidad) en la
Server list (Lista de Servidores) se utiliza
lista de selección a la izquierda de la
para gestionar los
diversos
servidores
IRC.
Desafortunadamente,
aquí es donde tropezamos con uno de los
únicos defectos del programa. A diferencia de
programas similares,
los desarrolladores de
Konversation no proporcionan una lista de
las redes IRC más populares y los datos de
Figura 1: Nuestra ventana al mundo IRC
sus correspondientes
servidores.
Debemos seleccionar
la única opción disponible, pulsar Connect
(Conectar) para contactar el servidor KDE IRC
Figura 2: ¡Nuevos servidores, por favor!
www.linuxmagazine.com.es
Schlagwort
figura 1 también es importante. Mientras que los apodos 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 introducirlo en el campo adecuado
(ver figura 3). Debido a que
hay muchos usuarios, el
apodo elegido puede estar pillado. Konversation proporciona 3 campos adicionales
de apodos donde podemos
introducir alternativas. El programa itera sobre la lista si
nuestra primera opción no
Figura 3: Una identidad adecuada para cada mundo
está disponible.
Konversation tiene la capacidad de
chat cada vez que ocurra algo en el
estar en una red IRC con un apodo detercanal. Esto puede ocurrir por ejemplo
minado y con otro distinto en otra red. El
cuando alguien escriba un mensaje o un
botón Add new identity (Añadir nueva
usuario entre o abandone el canal.
identidad) nos permite ponernos un
Al margen de chatear, el IRC puede utinuevo “disfraz”. Mientras el nombre
lizarse para el intercambio de archivos
estándar New Identity no es muy especíde datos. Las conexiones de clientes
fico, lo podemos cambiar con el botón
directos (DCCs - Direct Client ConRename (Renombrar). En cuanto salvenections) se usan con este fin. Dos
mos nuestro nuevo “apodo” estará
clientes IRC pueden establecer una
disponible en el menú desplegable
conexión directa sin necesidad de pasar
Identity. También estará disponible en
a través del servidor IRC. Podemos utiServer Lists tras realizar los cambios
lizar DCC settings para configurar la
oportunos usando el botón Edit. Esto nos
conexión.
permite personalizar cada servidor con
La opción DCC accept downloads autouna identidad distinta.
matically (DCC aceptar descargas
El comportamiento de nuestro cliente
automáticamente) debe ser utilizada con
IRC puede ser modificado en General setprecaución, puesto que permite a
tings.Si activamos las opciones AutoKonversation descargar cualquier cosa
matically Connect (Conectar Autoofrecida sin hacer ninguna pregunta,
máticamente) y Automatically Enter
pudiendo descargar códigos de progra(Entrar Automáticamente), Konversation
mas nocivos. Si deseamos que el prograintentará conectarse de Nuevo si la
ma incluya el nombre del remitente en
conexión se interrumpe. Una marca en
las descargas, simplemente debemos
blinking tabs (Etiquetas intermitentes) le
activar la casilla Sender in data name
indica a Konversation que debe encender
(Nombre del emisor de datos).
un pequeño indicador en la barra del
Preparados, listos, ¡CHAT!
GLOSARIO
Core: Todos los programas que son oficialmente sacados al mercado son asignados a
los llamados paquetes “Core”. Mientras
“kdelibs”y “kdebase”deben estar instalados,
otros paquetes, organizados por materias
como “kdeadmin”o “kdemultimedia”,
pueden dejarse aparte.
IRC-Network: Podemos acceder a todos los
usuarios de todos los servidores de una red
IRC específica. Pero los usuarios de redes diferentes no pueden conectarse a otras redes.
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 servidor aparecen en la ventana principal. A
la derecha, Konversation lista los usuarios actualmente en el canal.
Nuestros propios mensajes son
escritos en la línea de comandos inferior.
Si mantenemos los valores por defecto
LINUX USER
en General settings/ command char, los comandos de
nuestro sistema empezarán
con una barra invertida /. Si
escribimos /help (Ayuda) nos
mostrará
los
comandos
disponibles. Podemos encontrar una ayuda rápida en
IRChelp [3].
Esta página hace un uso
intensivo del término IRC Op.
Este tiene el siguiente significado: 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 usuarios 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 usuarios, 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 seleccionar los usuarios.
Los usuarios que utilizan mucho tiempo IRC están destinado s a hacer amigos.
Konversation nos ayuda a mantener
estos contactos monitorizando si nuestros amigos están en línea. Podemos
desplegar el menú Windows/Notify list
(Ventana/lista de notificación) e introducir 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. ■
RECURSOS
[1] Konversation: http://konversation.
sourceforge.net/
[2] Freenode: http://www.freenode.net
[3] IRC help: http://www.irchelp.org
www.linuxmagazine.com.es
Número 01
73
LINUX USER
XUL
El Kit de Construcción de Mozilla
Programación XUL
De todas las invenciones de los últimos 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 defectos iniciales de diseño.
POR JONO BACON
A
EL AUTOR
pesar 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 tecnologí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
Jono Bacon is a
writer/journalist, consultant and developer
based in England. Jono
has been actively
involved with Linux
since 1998 and has
worked on a number of
different projects including KDE,
KDE::Enteprise, KDE Usability Study,
Kafka and Linux UK.You can find his
website at http://www.jonobacon.org.
Número 01
otras cosas. Al margen de las políticas de
las guerras de navegadores, la incompetente implementación de estándares y
los intentos de censura por parte de ciertos 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 popularización de la Web, sus limitaciones son
evidentes. La más visible es el hecho de
que la interfaz entera debe ser reinventada cada vez que se desarrolla un sitio
web. Además, la interfaz debe ser recargada 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
www.linuxmagazine.com.es
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 XUL
La 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 discusiones y diseño, los programadores
trabajaron juntos hasta crear el Lenguaje
de Interfaz del Usuario de XML (XUL)
XUL
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 elementos de la interfaz por nosotros. El
archivo XML es una forma simple de
especificar lo que queremos como interfaz y donde.
Figura 1: No es exactamente el código XUL más
claro, pero es un inicio.
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 paquetes de herramientas gráficas normales
como Qt y GTK. Características como
botones, barras de desplazamiento, etiquetas o menús están disponibles en el
paquete XUL. Muchos de estos simplemente no están disponibles en formatos
normales HTML. Cada una de estas funciones se usa dentro de XUL simplemente 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 etiquetas, atributos, contenidos y otros conceptos que también se hallan en HTML (de
hecho las versiones más modernas de
HTML son “dialectos” XML). La tecnologí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
Comencemos
Esta 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 componentes 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ñadiremos 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 función, debe tener algunas líneas al principio 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 versió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 interfaces de usuario de Mozilla. Las siguientes
líneas
contienen
nuestras
primeras etiquetas:
LINUX USER
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 atributo id es esencial para ser capaces de
comunicarnos con etiquetas y actualizarlas con cambios e información.
Esto estará más claro cuando usemos
DOM para actualizar y referenciar realmente etiquetas. La segunda etiqueta,
title (título), contiene una serie de caracteres legibles por humanos que se muestra 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 ignorado. El último atributo es la parte xmlns.
Este valor especifica el namespace (espacio 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 situaciones 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 pantalla. En nuestro ejemplo hemos creado
dos botones con nuestro código:
Listado 1: Xul1.xul
<?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”>
<window
id="firstwindow"
title="First XUL Window"
xmlns="http://www.mozilla.org/U
keymaster/gatekeeper/there.is.U
only.xul">
<button id=“button1”
label=“Primer Botón”/>
<button id=“button2”
label=“Segundo Botón”/>
</window>
www.linuxmagazine.com.es
Número 01
75
LINUX USER
XUL
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 atajos se usan habitualmente en XML. Para
finalizar nuestro archivo incluimos la etiqueta de cierre </window>.
Gestión de la composición
Figura 2: Gestor de diseño horizontal.
<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 (etiqueta) tienen diferentes contenidos. El atributo 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 etiqueta. 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
En nuestro primer ejemplo que el segundo 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 suficientemente 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 componentes GUI como Qt y GTK. El único requisito es que pongamos nuestros componentes dentro de unos controles invisibles que nos coloquen nuestro controles
visibles de una manera determinada. La
mayoría de herramientas contienen formas horizontales y verticales de composición. Esta forma estandarizada de
gestionar las formas se ha transferido a
XUL y consecuentemente tenemos las
etiquetas <hbox> y <vbox>. Veamos
Figura 3: Combinación de gestión del diseño horizontal y vertical.
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 composición es la etiqueta <vbox>. Esta etique-
Componentes tipo HTML
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 componentes HTML más comunes. Aprenderemos
estas etiquetas ejecutando un poco de
código:
Radio"/>
14 <vbox>
15 <radio id="radio1" label=U
16 "Primero"/>
17 <radio id="radio2" label=U
18 "Segundo"/>
19 </vbox>
20 </hbox>
01 <vbox>
21 <hbox>
02 <hbox>
22 <label value="Caja de Texto"/>
03 <label value="Cuadroßß
23 <vbox>
04 de verificación"/>
24 <textbox id="textbox"/>
05 <vbox>
25 </vbox>
06 <checkbox id="check1" label=U
26 </hbox>
07 "Primero"/>
27 <hbox>
08 <checkbox id="check2" label=U
28 <label value="Caja deU
09 "Segundo"/>
29 Texto Multilínea"/>
10 </vbox>
30 <textbox id="multitextbox"U
11 </hbox>
31 multiline="true"/>
12 <hbox>
32 </hbox>
13 <label value="Botones de
33 </vbox>
76
Número 01
www.linuxmagazine.com.es
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.
XUL
Figura 4: Uso de etiquetas y listados.
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 funciona. (H) en lo botones gestionados
horizontalmente y (V) en los verticales:
01
02
03
04
05
06
07
08
09
10
11
12
<hbox>
<button id="button1" label=U
"Primer Botón (H)"/>
<button id="button2" label=U
"Segundo Botón (H)"/>
</hbox>
<vbox>
<button id="button1" label=U
"Primer Botón (V)"/>
<button id="button2" label=U
"Segundo Botón (V)"/>
</vbox>
Las cosas se ponen realmente interesantes cuando intentamos combinar un
tipo de gestor de composiciones dentro
de otro gestor. Miremos el siguiente código por ejemplo:
01
02
03
04
05
06
07
08
09
10
11
12
<hbox>
<button id="button1"·label=U
"Primer Botón (H)"/>
<button id="button2" label=U
"Segundo Botón (H)"/>
<vbox>
<button id="button1" label=U
"Primer Botón (V)"/>
<button id="button2" label=U
"Segundo Botón (V)"/>
</vbox>
</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 nuestros 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 horizontales para acomodar el espacio necesario
para los botones verticales. Esto es
debido a que el gestor vertical fue anidado dentro del gestor horizontal afectando
los componentes horizontales.
Componentes Exóticos
El 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 concepto de la web. En el siguiente ejemplo
vamos a crear dos etiquetas, una con un
componente de edición de texto multilínea y la otra con un cajetín con una
lista desplegable. En este ejemplo, las
etiquetas y los cajetines no son típicamente usados en un entorno web.
Iremos avanzando paso a paso por este
ejemplo y escribiendo el código a medida 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 contendrá un número de solapas que a su
vez puede contener otros componentes.
Entonces abrimos la etiqueta <tabs>
para especificar los nombres de los solapas en nuestra interfaz. Para cada solapa
usaremos la etiqueta <tab> para
especificar que etiqueta debe ser definida. Nuestros solapas serán añadidos
desde la izquierda hacia la derecha en el
orden que los especifiquemos en XUL.
LINUX USER
Figura 5: Un interfaz XUL completa.
En este caso, la pestaña “Editor Textos”
será la pestaña de la izquierda y la pestaña “Lista” la de la derecha. Ahora tenemos que crear los paneles de la pestañas. Lo hacemos creando primero una
etiqueta de paneles de pestañas generales:
<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 componentes:
<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"/>
www.linuxmagazine.com.es
Número 01
77
LINUX USER
XUL
</listbox>
</tabpanel>
Finalmente cerramos el panel de etiquetas y la caja de pestañas general:
</tabpanels>
</tabbox>
Podemos ver el interfaz completa en la
figura 4.
Interfaces completos
Para acabar la primera entrega de programació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 etiquetas para construir los distintos elementos. 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">
Listado 2: Ventana
principal.
01 <?xml version="1.0"?>
02 <?xml-stylesheet
03 href="chrome://global/skin/"
04 type="text/css"?>
05 <window
06 id="complete"
04
05
06
07
08
09
10
<menuitem label="Nuevo"/>
<menuitem label="Abrir"/>
<menuitem label="Guardar"/>
<menuseparator/>
<menuitem label="Salir"/>
</menupopup>
</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 listos para crear el área del interfaz principal. Si miramos la figura5 podemos
observar el resultado de nuestro interfaz
y como está construida. Tenemos un listado 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:
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:
xmlns="http://www.mozilla.org/
only.xul>
78
Número 01
Conclusión
En 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 partiremos 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.
Listado 3: Tab box
01 <tabbox>
02 <tabs>
03 <tab label="Editor Textos"/>
04 <tab label="Lista"/>
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"/>
<splitter/>
keymaster/gatekeeper/there.is.
</hbox>
</window>
05 </tabs>
<hbox>
<listbox flex="1">
<listitem label="Rojo"/>
<listitem label="Azul"/>
<listitem label="Amarillo"/>
<listitem label="Verde"/>
</listbox>
07 title="Ejemplo Completo"
08
(ver listado 3). El código no es diferente
del ejemplo anterior. Finalmente cerramos el gestor horizontal y la ventana:
18 </listbox>
19 </tabpanel>
El siguiente montón de código es nuestra
familiar caja de etiquetas que contienen
etiquetas de edición de texto y listados
www.linuxmagazine.com.es
20 </tabpanels>
21 </tabbox>
Educación
LINUX USER
El servidor interactivo de actividades matemáticas WIMS
La navaja suiza de las
aplicaciones matemáticas
U
no de los problemas principales
que nos planteamos los educadores 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 soluciones que, trataré de demostrarlo, no lo
son nunca a medio plazo: la experiencia
demuestra que la mejor herramienta privativa ata al usuario a la cadena de actualizaciones 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 deficiencias que evidentemente tiene.
Esta sección tiene como objetivo presentar herramientas y aplicaciones libres
de uso educativo. Evidentemente
Figura 1: Página principal de un servidor WIMS
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
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 enfoques y las metodologías para que su utilización tenga sentido pedagógicamente.
Nos centraremos sin embargo en los programas específicamente educativos por
la sencilla razón de que son menos conocidos. 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 ordenació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 plataforma 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
Figura 2: Actividades para el nivel H3
www.linuxmagazine.com.es
Número 01
79
LINUX USER
Educación
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 examinandos 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 examinando se le asigne aleatoriamente un
subconjunto equivalente a los otros subconjuntos. Sólo así se logra la objetividad 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 actividades de conocimiento del medio o de
idiomas. Otra gran ventaja de WIMS,
además de ser libre y de que cualquiera
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 navegador, 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 paquetes binarios para Debian y contribuye
decisivamente a su documentación y
divulgación. Existe una red de servidores
WIMS por todo el mundo, y recopilaciones de ejercicios y actividades de
licencia libre. La velocidad de desarrollo
y de incorporación de módulos y traducciones 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 ordenador. En el próximo número trataremos
la creación de una clase virtual, de
actividades nuevas con Createxo y Modtool y lo que en la terminología de WIMS
se conoce como documentos y cursos.
Conectarse a un servidor
Para probar WIMS no hace falta instalarlo en nuestro ordenador: bastan una
conexión a Internet y un navegador.
Cuadro 2: instalación de WIMS
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 experimentales preparadas por Georges Khaznadar. Examinemos las ventajas e inconvenientes de cada opción.
Podemos descargar de http://wims.unice.fr/
download/wims el código fuente del servidor 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 principales (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-
80
Número 01
cer la ventaja, es que nos enfrentamos al
problema de dar respuesta a la cadena de
dependencias que una aplicación tan imbricada 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 ‘dependencias’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
www.linuxmagazine.com.es
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 general 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 pasado 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.
Educación
Figura 3: Ejercicio de sistemas lineales
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 interfaz 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 preferencias, etc. También podemos ver una línea
de enlaces dedicados a la creación y utilización de clases virtuales. Pero en este
momento nos interesa sobre todo el buscador de actividades. Como las cosas se
LINUX USER
Figura 4: Ejercicio sobre la tabla periódica
comprenden con un ejemplo, aquí va
uno.
Ejemplo de uso matemático
Aunque 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, Maxima, 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 actividades), ‘Lecciones y referencias‘ (el nombre no miente), ‘Calculadores‘ (traducción de ‘Online calculators‘, ‘herramientas 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 reservada‘ y que no son más que ejercicios
simples creados en el formato OEF
(Online Exercise Format, donde el ‘reservada’ es una mala comprensión de ‘classified’) con la herramienta de WIMS cre-
Tabla 1: Niveles educativos en la clasificación de Gang Xiao
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
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 aparecerán todas las actividades clasificadas
por orden de popularidad.
Podríamos buscar por tipos de actividad (es muy llamativo ver los ejercicios interactivos, con animaciones
que lamentablemente no pueden presentarse en el formato papel de esta
revista) o por palabras clave pero vamos
a aprender a buscar por niveles educativos. La tabla 1 nos permitirá comprender la clasificación de Gang Xiao de
los niveles educativos, que no corresponde 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 traducido. 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.
www.linuxmagazine.com.es
Número 01
81
LINUX USER
Educación
Utilización en física y
química
Georges 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ódulos 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
Figura 5: Ejemplo de ejercicio de óptica
objeto memorizar la tabla periódica. Elijo las opciones por
local es la velocidad de acceso y reacción
defecto y la opción ‘Click on table’
del sistema (importante si los cálculos
(teclear en la tabla). Dejo al amable lecque deberán efectuarse no son elementor la duda de si en la escena de la figura
tales); pero el argumento fundamental es
4 hemos pinchado en la casilla errónea a
la posibilidad de utilizar una de las
propósito.
capacidades fundamentales de WIMS: la
Para demostrar que WIMS no es una
creación de clases y la perspectiva que
aplicación de sólo texto, sino que puede
abre de seguimiento de los progresos de
utilizar y que genera al vuelo imágenes y
los alumnos.
gráficas, introducimos a continuación
El cuadro 2 nos detalla cómo realiza la
‘physics’ en el buscador y elegimos ejerinstalación de la aplicación. El servidor
cicios de óptica: ‘OEF Optique’. En la
WIMS funciona en GNU Linux y en Mac
figura 5 podemos ver una respuesta
OS-X. Aunque puede actuar como una
incorrecta y su corrección.
aplicación independiente, lo habitual es
Utilización local: ¿nos
integrarlo en el servidor web apache.
conviene instalar WIMS?
WIMS para profesores de
Cuando hablamos de una utilización
letras
local nos estamos refiriendo a la instaHasta este punto del artículo nos hemos
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 evidentemente sus ventajas e
inconvenientes y el usuario
deberá sopesarlas en función de
sus necesidades y del uso previsto; por un lado la disponibilidad inmediata de los servidores
WIMS ya instalados y la liberación de tiempo y de preocupaciones de instalación, mantenimiento y actualizaciones
debe cotejarse con la oportunidad de instalar y/o crear
(sólo) las actividades que nos
interesen localmente. Otro arguFigura 6: Página de administración en línea de WIMS
mento a favor de una instalación
82
Número 01
www.linuxmagazine.com.es
movido en el campo de lo técnico o lo científico-matemático.
Pero asegurábamos en la presentación que nos encontrábamos ante una aplicación de
múltiples
aprovechamientos;
sólo la inercia y la falta de imaginació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 inmediatamente 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/.wimspassone: pinchar en ‘WIMS online site
maintenance’ e introducir la contraseña
de un solo uso generada por el sistema
(para comprobar que tenemos los permisos 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á suspendido podemos proceder; la terminación del
proceso quedará señalada por el envío
de un correo al administrador (configurable 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 familiarizados; 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 relativos de suma 0, con las soluciones (0,0), (-1,1), (-2,2)…, o
bien dar n ejemplos de expresiones matemáticas que sean
equivalentes a 0); también es
posible crear ejercicios de rellenar recuadros, o de ordenación
de puzzles (en la categoría de
‘Recreativas matemáticas’ tenemos dos ejemplos, ‘Shifting
puzzle’ y ‘Q-Puzzle’, donde el
movimiento de las piezas está
vinculado a fórmulas matemáticas), de relacionar etiquetas e
Educación
Figura 7: Configuración del ejercicio de conjugación
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 guitarra. Podemos encontrar un ejercicio (no
muy imaginativo, es verdad) para la
enseñanza del francés (se llega a él buscando conjugaison o verbes y se llama
‘OEF Conjugaison’) y otros ejercicios ele-
LINUX USER
Figura 8: Ejemplo de ejercicio de idiomas Kuadros.
mentales que pueden utilizarse en otros
niveles traducidos o tienen un valor
comunicativo evidente si se usan sin traducir (estoy pensando en ejercicios
como ‘OEF Clock’).
Como podemos ver en la figura 7 tenemos 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 actividades, es material para el siguiente
número.
Conclusión
En este primer capítulo dedicado al software 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 consideramos adecuado. En el próximo
número aprenderemos a crear clases virtuales y a desarrollar nuestras propias
actividades, y aprenderemos algunos
detalles de uso avanzado.
■
Hasta pronto.
RECURSOS
[1] El sitio web canónico de WIMS es http://
wims.unice.fr. Allí podemos encontrar las
fuentes del programa, módulos, documentació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 versió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 aprender a manejar WIMS es El libro de WIMS,
de Georges Khaznadar. Está traducido al
español: http://libro-wims.software-libre.
org.
GLOSARIO
End User Licence Agreement, Acuerdo de
aceptación de la licencia por el usuario final.
La lectura detallada de cualquiera de ellos es
muy instructiva sobre cómo el software privativo limita los derechos de los usuarios.
El desarrollo del razonamiento y la
demostración en términos matemáticos
puede seguirse en On Public-Question Tests,
de Gang Xiao, mayo de 2004 (http://wims.
unice.fr/paper/pqt.pdf). En sus términos un
public-question test es una prueba cuyas preguntas pueden publicarse previamente a su
realización.
PARI es un sistema muy utilizado de álgebra
computacional creado para optimizar los cál-
culos en teoría de los números (factorizaciones, teoría algebraica de los números, curvas elípticas…) y que incluye funciones para
el cálculo con otras entidades matemáticas
como matrices, polinomios, etc. Su utilización en un ejercicio creado con WIMS es
trivial, veamos un ejemplo recogido de la
FAQ (http://wims.auto.u-psud.fr/wims/faq/
fr/logiciel.html.También se presentan ejemplos de utilización de las otras aplicaciones.):
podría decir que es útil en la simplificación y
normalización de expresiones formales.
\text{f = pari(factor(20! + 1))}
Octave es un lenguaje de alto nivel (compatible con Matlab) creado para el cálculo
numérico.Yet Another Computer Algebra
System (Yacas) es un lenguaje de álgebra
computacional muy flexible y con una sintaxis muy similar a la de Mathematica. El sistema Groups, Algorithms and Programming
(GAP) está especializado en la teoría de los
grupos.
Maxima es un sistema de álgebra computacional muy completo y de código libre, que
permite la manipulación simbólica de polinomios, matrices, funciones racionales… Se
El paquete wims_3.28-6.1 no ha pasado a
Sarge porque una de sus dependencias,
texgd, tiene un error crítico (a release critical
bug en la jerga de Debian).
www.linuxmagazine.com.es
Número 01
83
LINUX USER
grep
Búsqueda de archivos de texto con grep
De Cacería en el
Disco Duro
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
L
as cosas que no seamos capaces de
recordar las debemos guardar en
nuestro ordenador, reza una máxima del usuario informático.
Ésta no es una mala idea, pero, a diferencia de lo que ocurre con la memoria
humana, que normalmente recuperará la
información almacenada de forma
fidedigna (excepto en los exámenes
finales, por supuesto), no siempre es tan
fácil encontrar información en nuestro
disco duro. Podemos perder mucho
tiempo en encontrar un archivo del que
hemos olvidado su nombre o dónde fue
almacenado. Incluso el saber exactamente que archivo contiene la
información que buscamos puede ser de
poca ayuda en caso de archivos de texto
grandes.
El comando del shell grep, que localiza
cadenas de texto en ficheros es útil en
ambos casos. En la situación más simple,
podemos ejecutar grep con la tecla de
búsqueda y el archivo a buscar. grep nos
mostrará todas las líneas en el archivo
especificado que contengan el texto buscado. Imaginemos que deseamos buscar
en el archivo biblia.txt el texto “Jardín
del Edén”. Debemos escribir
grep Edén biblia.txt
84
Número 01
en la línea de comandos y grep nos
mostrará los pasajes apropiados del
archivo. Si la búsqueda contiene espacio
debemos utilizar comillas. Por ejemplo:
grep "Jardín del Edén"
biblia.txt
Debemos prestar atención y esperar
fallos cuando usemos caracteres especiales: *, ? y ! tienen un significado
especial para la línea de comandos.
Otro grupo de caracteres (., *<C>,
^<C>, $ y \) no se interpreta por
grep tal cual. En su lugar, la herramienta supondrá una expresión regular. El lado positivo es que esto nos
permite construir búsquedas muy
potentes y complejas, si bien es posible que prefiramos evitar estos caracteres con grep hasta que nos sintamos a gusto con la herramienta.
Si no sabemos que archivo contiene
el texto que buscamos, podemos ejecutar grep con un comodín. La obra
"Moby Dick" del autor Herman
Melvilla está compuesta de una colección de archivos de texto.
grep blanco moby.*
www.linuxmagazine.com.es
nos mostrará todas la veces que la palabra blanco aparece en la obra maestra
de Melville (ver figura 1). El asterisco
significa “cualquier grupo de letras”. El
interfaz cambiará esta expresión por el
nombre de cualquier archivo en el directorio actual que empiece por los caracteres moby..
Si los archivos en los que deseamos
buscar están distribuidos por diversos
directorios debemos añadir la opción r
para indicarle a grep que busque en una
carpeta completa:
grep -r blanco Melville/obras/
buscará blanco en el directorio obras y
en los subdirecorios que cuelguen de él.
VISIÓN GENERAL DE GREP
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
directorio
realiza una búsqueda recursiva
en un directorio y sus subdirectorios.
grep -i patrón
fichero
ignora la diferencia entre
mayúsculas y minúsculas.
grep -A n
muestra las siguientes n líneas tras
la línea que contiene la búsqueda.
grep
LINUX USER
Ahora presionamos [Esc] ZZ o
[Escape]:wq para almacenar el archivo y salir de vi. Para utilizar nuestro
nuevo alias en el shell, necesitamos
analizar sintácticamente el archivo de
configuración. Para hacerlo debemos
escribir:
. ~/.bashrc
Ahora podemos usar el comando pss
nombreprograma para buscar un programa activo.
Libro de Direcciones
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.
El Trio: ps, grep y kill.
grep no es sólo útil para búsquedas de
texto filosóficos y teológicos, si no que
puede ser combinado con otros comandos del shell. Si la respuesta de un
comando produce mucho texto, grep
puede ser utilizado escribiendo tras la
instrucción el carácter “|” y grep
texto_a_buscar para filtrar el resultado y
mantener solo las partes en las que estamos interesados. Un caso típico es en el
que usaríamos grep para cerrar un programa que se ha bloqueado.
El comando ps ax nos muestra los procesos activos. Podemos usar grep para
aplicar un filtro y encontrar solo el programa que estamos buscando, Mozilla
por 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 que
contienen Mozilla: el buscador y el propio grep. La parte que nos interesa para
cerrar el programa aparece al principio
de cada línea: el ID del proceso. Ahora
podemos escribir kill 2500 para cerrar el
programa deseado.
Debido a que los gurús del shell suelen
ser notablemente perezosos, necesitamos encontrar un método para no tener
que escribir este comando cada vez que
lo requiramos: en otras palabras, necesitamos un alias. Los alias definidos deben
ser guardados en el archivo .bashrc en el
directorio raíz. Este archivo se ejecuta
cada vez que abrimos un shell de
comandos interactivo. Usaremos nuestro
editor de texto favorito para abrir el
fichero, por ejemplo kwrite ~/.bashrc &
o vi ~/.bashrc en el escritorio, dependiendo de nuestras preferencias. Debido a
que vi no es sencillo, veamos algunos
comandos simples. Si escribimos G le
indicamos a vi que debe ir al final del
archivo. Entonces podemos escribir o
para cambiar el editor al modo de introducción de datos. A diferencia de los
comandos a y i, o indica a vi que inicie la
inserción en la línea donde está situado
el cursor.
Ahora podemos introducir nuestro
alias en la última línea de .bashrc. En
lugar de pss podemos usar cualquier otro
nombre fácil de recordar pero evitando
usar el nombre de un comando existente:
alias pss="ps ax |ßß
grep"
grep es tremendamente flexible. Una de
mis aplicaciones favoritas para grep es
un sencillo libro de direcciones.
Todo lo que necesitamos son los
comandos grep, alias y cat y un fichero
de texto donde podamos almacenar los
nombres, números de teléfono y las
direcciones de correo electrónico y de
correo ordinario de nuestros amigos,
conocidos y parientes. Una entrada
puede ser como:
Charly Pingüino
+12345 678
[email protected]
C/del Polo Sur
Villatux, Antártica
Ahora debemos salvar el archive como
direcciones en nuestro directorio raíz y
añadir el siguiente alias a .bashrc:
alias tel="cat ~/direcciones |ßß
grep -i -A 4"
El comando cat nos muestra el contenido
del archivo direcciones. El carácter |
envía este resultado a grep. La opción -i
garantiza que la búsqueda no diferenciará entre mayúsculas y minúsculas.
Finalmente, -A 4 indica a grep que debe
mostrar las 4 líneas siguientes a la
primera coincidencia con la búsqueda.
De nuevo
. ~/.bashrc
analizará sintácticamente de nuevo
nuestro archivo de configuración. En el
futuro, solo necesitaremos escribir tel
nombre en el shell para recuperar
la dirección de la persona que busque■
mos.
www.linuxmagazine.com.es
Número 01
85
LINUX USER
LaTeX
LaTeX bajo Linux
Tipografía Profesional
para Todos
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 manuscrito 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
E
s 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 impresora, podemos obtener resultados con el
mismo aspecto profesional que proporciona 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-
dades que vamos cometiendo. Si no
queréis complicaros la vida, ignorad a
los puristas.
El primer documento LaTeX
Lo 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 especificació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, simplemente pulsaremos Ctrl-C. Si no tenemos Latex instalado, podemos instalarlo 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
Figura 1: Aspecto de un documento básico en Latex. Los márgenes y tipos de
Figura 2: Aspecto de un documento básico en OpenOffice. El resultado es
letra están ya ajustados a una presentación profesional
menos profesional
86
Número 01
www.linuxmagazine.com.es
LaTeX
pobre. Con la distribución teTex se proporciona una ayuda muy básica, en formato 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 comandos. 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 editores 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 personalizació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 tranquilamente 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 formato 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 cuidado, porque si se comete algún error,
probablemente Latex lanzará un men-
saje bastante incomprensible. El texto
anterior podemos guardarlo, por ejemplo, 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 dispositivo”. Un fichero DVI es como un PDF y,
al igual que un PDF, necesita un programa para visualizarlo. Todas las distribuciones de Linux decentes incluyen el
xdvi pero, además, en el menú de gráficos 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
LINUX USER
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 profesional, más parecido a un libro “de verdad”. Naturalmente que en OpenOffice
se puede imitar el aspecto de Latex
eligiendo los tipos de letra adecuados,
márgenes, etc. Pero me parece interesante 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
Listado 1: libro.tex
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
% Clase de documento
\documentclass[a4paper]{report}
% Paquetes adicionales
\usepackage[spanish]{babel}
\usepackage[latin1]{inputenc}
% Fin del preámbulo. Comienza el documento
\begin{document}
% Página de títulos
\title{El maestro de los collares}
\author{J.R. Talco}
\maketitle
% Fin de los títulos. Comienza el texto normal
\chapter{De los jovis}
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}
www.linuxmagazine.com.es
Número 01
87
LINUX USER
LaTeX
Figura 3: Aspecto del documento en OpenOffice. El resultado impreso arras-
Figura 4: Extracto de un documento completo en Latex, que introduce
trará todas las imperfecciones cometidas al teclear, al ser un programa
automáticamente cabeceras de capítulos, página de títulos y demás detalles
WYSIWYG
de formato
pequeño! Baste decir que mi tesis docrafo con tabuladores y otras no, algunas
toral de casi 200 páginas, con cientos de
palabras están separadas con más de un
fórmulas y más de 20 figuras, cabe en un
espacio, algunos párrafos están separadisquete y la escribí en un Pentium 1.
dos con dos saltos de línea, etc. Como se
Intentad hacer eso mismo con
observa en la Figura 3, el resultado no es
OpenOffice, no hablemos ya de MS
muy estético, así que luego habrá que
Word. Por último, la facilidad de manejo:
pagarle a un tipógrafo para que haga la
Latex tiene fama de ser muy difícil de
composición… o podemos usar Latex.
usar, asequible sólo para matemáticos y
Vamos a introducir el texto en la “plantildemás gente de mal vivir. Bueno, ya
la” del apartado anterior, aunque le
hemos visto que no es para tanto. Esto es
añadiremos algunos detalles, quedando
como todo, lo básico e imprescindible es
como el Listado 1.
simple, después podemos ir complicánSólo queda ejecutar latex y ver el
dolo todo lo necesario. Incluso
resultado (ver la Figura 4). Impodríamos usar el documento que
presionante, ¿verdad? Aparte de corregir
hemos hecho como plantilla y escribir en
el espaciado, la tabulación y la justifiel “hueco” entre \begin{document} y
cación, uno puede preguntarse de dónde
\end{document}, sin aprender nada más
ha salido la palabra “Capítulo” o la fecha
de Latex. En realidad, esto de usar planactual en la página de título, o quién ha
tillas hechas por otros es un pecado que,
definido los márgenes. Todos esos
más o menos, cometemos todos los
detalles de formato están a cargo de
usuarios de Latex. Cuando empecé a
Latex, que los resuelve a la perfección,
usar Latex, me aconsejaron que jamás
aunque también es verdad que sin preempezara un documento desde
cero, siempre debía partir de
Tabla 1. Algunas opciones de la
una plantilla hecha por otro. He
instrucción \documentclass
seguido este consejo y no me ha
Opciones
Significado
Opción por defecto
ido del todo mal.
10pt / 11pt / 12 pt Tamaño de letra
10 pt
oneside / twoside Impresión a doble cara
Capítulo I…
article
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
openright /
openany
Empezar capítulos en
en report
onecolumn /
twocolumn
Texto en una o
dos columnas
titlepage /
notitlepage
Salto de página tras
los títulos
report, notitlepage en article
www.linuxmagazine.com.es
guntarnos nuestra opinión. Para aprender a hacer nuestros propios documentos, cada vez más perfeccionados, estudiaremos 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 instrucciones requieren especificar uno o más
parámetros, aunque para algunas basta
escribir su nombre, por ejemplo \maketitle. 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ásicamente 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 document, que debe existir en todo
documento Latex. Naturalmente, sólo puede haber un
entorno document, pero si
twoside en book,oneside en report y
alguien está preparado para
afrontar
la gestión de errores de
openright en book,openany
página impar
Latex, puede probar qué pasa
cuando se incluye más de uno.
onecolumn
Lo que hay dentro del entorno
document es propiamente el
titlepage en book y
contenido de nuestro documento, como su propio nombre
indica, mientras que lo anterior
LaTeX
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, comenzando la línea con el símbolo %, de
forma que estas líneas no afectan en
nada al documento impreso.
ejemplo, cambiamos la clase a book en
nuestro documento, el único cambio
aparente es la introducción de una página 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 mantenemos el libro abierto. Para que esto sirva
El preámbulo del documento para algo, tenemos que imprimir el documento a doble cara. En cambio, si camLa primera instrucción del documento es
biamos a la clase article, se elimina la
la instrucción \documentclass:
página de portada con el título. Además,
\documentclass[a4paper]{report}
se pierde el formato del título del capítulo porque, en realidad, un artículo no
Esto define la “clase” del documento. En
puede tener capítulos, sino “secciones”.
Latex hay predefinidas tres clases de uso
Volveremos a esta cuestión pronto, al
general: book, report y article. Existen
estudiar la estructura del documento.
también las clases letter (para cartas, con
Habiendo seleccionado la clase de
una gestión muy potente de etiquetas
nuestro documento, se pueden configupara hacer envíos masivos de cartas perrar diferentes variantes, dando parámetsonalizadas) y slides (¡se pueden hacer
ros opcionales en la instrucción \docupresentaciones con Latex!) pero tienen
mentclass. Por ejemplo, en nuestro documuchas instrucciones específicas y
mento hemos especificado que el
requieren un estudio especial. No hay
tamaño de papel es A4, con la opción
grandes diferencias entre book, report y
a4paper. Podíamos también haber elegiarticle, más que en cuestiones de formado a5paper (14,8 x 21), letterpaper (la
to. En principio, la clase book está penopción por defecto: 8,5 x 11 pulgadas) o
sada para libros o documentos muy larincluso otros más exóticos, pero es poco
gos, la clase article se orienta a artículos
probable que se necesiten. Incluyo otras
de revistas, más cortos y con la clase
opciones, cuyo significado es autoexreport, que estaría en un punto intermeplicativo, en la Tabla 1. Obsérvese que
dio entre las otras dos, se hacen informes
con estas opciones se puede cambiar el
técnicos. Seguramente, para hacer un
comportamiento por defecto de una
trabajo escolar, la clase más adecuada
clase. Por ejemplo, se puede usar la clase
sea report, de todas formas, lo más
book sin página de títulos (notitlepage),
recomendable es probar con las tres para
o la clase report empezando los capítulos
decidir cuál se adapta más a las caracen página impar (openright). Eso no
terísticas de nuestro trabajo. Si, por
quiere decir que todas las combinaciones
tengan sentido, por ejemplo, es absurdo usar openTabla 2. Algunas instrucciones y
right u openany en la clase
entornos usuales en Latex.
article,
que no tiene capítuInstrucción
Uso
los.
Lo
mejor es probar
\begin{center}
Justificación centrada (se puede cambiar center por
...
flushright -derecha-o flushleft -izquierda-)
hasta dar con el aspecto
\end{center}
deseado.
Especialmente
\begin{enumerate}
Relación numerada (se puede cambiar
recomiendo
la
opción
\item ….
enumerate por itemize -viñetas-) …
twocolumn:
con
una
sola
\item …
palabra,
obtenemos
el
dis\end{enumerate}
eño
en
dos
columnas
típico
\footnote{Nota}
Nota al pie
de periódicos o revistas.
\label{etiqueta}
Marca una posición para referenciarla
Por
cierto, al hacer todas
\ref{etiqueta}
Referencia a una posición marcada
$…$
Fórmulas matemáticas en el texto
estas pruebas, notaréis una
\begin{equation}
Fórmulas matemáticas en una línea aparte,
de las principales ventajas
...
con número de ecuación
de la mayoría de los progra\end{equation}
mas visualizadores de
_{texto}
Texto en subíndice. ¡ Sólo en fórmulas !
ficheros DVI: el propio pro^{texto}
Texto en superíndice. ¡ Sólo en fórmulas !
grama detecta cuándo tiene
LINUX USER
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 adicionales. 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 correspondiente 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 partimos 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:
RECURSOS
[1] Comprehensive Tex Archive Network:
http://www.ctan.org [2]Mirror español de
CTAN: ftp://ftp.rediris.es/sites/ftp.dante.
de/tex-archive/systems/linux [3]Ayuda de
Latex dentro de CTAN: http://www.ctan.
org/tex-archive/info
www.linuxmagazine.com.es
Número 01
89
LaTeX
basta con quitar esta línea (o
ponerle un % al principio) y
ver qué pasa. En los tiempos
de los terminales alfanuméricos, había que teclear combinaciones 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 caracteres en lugar de latin1, como
Figura 5: El símbolo de LaTeX se genera con... LaTeX
ansinew, pero, al menos para
textos en español o inglés, la diferencia
\\ Siete para las señorasU
es inapreciable.
grandotas en castillos deU
La página de títulos
El entorno document empieza con los
títulos, que se definen con las instrucciones \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 formato de la página de títulos está codificado 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ítulo, 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
90
Número 01
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 adicional. 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 cursiva es conveniente utilizar \emph
(“Emphasize”), aunque se puede poner
también \textit (“Itálica”).
El cuerpo del documento
El 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: \section, \subsection y \subsubsection.
www.linuxmagazine.com.es
Naturalmente, Latex controla la
numeración de las secciones a la perfección: si queremos cambiar de
orden dos capítulos basta con cortar
y pegar sus contenidos y, mientras
que en un procesador de textos tendrí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í, posiblemente haya que ejecutar latex dos o tres
veces seguidas para que genere los
ficheros auxiliares que necesita para construir el índice, pero pronto apreciaremos la potencia de LaTeX y como la
curva de aprendizaje necesario para
dominarlo se compensa con las funcionalidades que proprociona.
Llegado este punto, sólo queda utilizar
Latex y probar diferentes cosas. En la
Tabla 2 hemos seleccionado las instrucciones 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 dentro 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órmulas matemáticas, las tablas y las figuras, 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.
EL AUTOR
LINUX USER
Hace ya más de una década que
Miguel Atencia viene administrando
sistemas y redes en distintos organismos. 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.
5
buenas razones
para suscribirse
SI UTILIZAS LINUX, NECESITAS LINUX MAGAZINE
1
2
3
AHORRO
Más del 15% descuento con respecto al precio de portada: Consigue 12 números por el
precio de 10 y 4 DVDs ¡Gratis!
4
RENOVACIÓN AUTOMÁTICA
ENVÍO GARANTIZADO
A 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.
¡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.
GARANTÍA DE DEVOLUCIÓN DE DINERO
APOYO A LA COMUNIDAD
Linux 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.
5
Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripció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.
Pedidos online: www.linuxmagazine.com.es/subs
o utiliza el formulario al dorso
W W W. L I N U X M A G A Z I N E . C O M . E S / S U B S
Formulario
Suscripción
Para un servicio más rápido, realice su
pedido online en:
www.linuxmagazine.com.es
(+ 34) 951 010 516
Sí
Dirección Facturación
Número Inicial
Zona
Modo de Pago
Dirección Envío
Condiciones
Proyectos
COMUNIDAD
Software Libre y sus Creadores
Proyectos en Marcha
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
A
Ronald Raefle, visipix.com
pesar 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 Protocole 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 tendencia de conectar todo tipo de
dispositivo electrónico, desde teléfonos
móviles, PDAs y televisores hasta neveras, a Internet, no hace más que agravar
la situación.
Si continúa la expansión de la conexió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
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 utilizar túneles a través de la parte de la red
IPv4.
IPv6 para la Conexión de
LANs
Sixxs.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 empresas añadir un LAN completo.
Sixxs utiliza un sistema de puntos para
administrar la calidad del servicio. Otorgan 25 créditos por registrarse. Esos 25
créditos sirven para “comprar” un túnel
IPv6 y una sola dirección IP (de hecho,
esto sólo cuesta 15 créditos). A los
usuarios se les otorga 5 créditos por
cada semana que permanece accesible 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 deshabilita. Sixxs utiliza este sofisticado
sistema de créditos para mantener actualizadas 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 privilegios 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 mayorí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 asignació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.
RECURSOS
[1] Sixxs, servicio IPv6 http://www.sixx.net
www.linuxmagazine.com.es
Número 01
93
Eventos
LINUX MAGAZINE
Eventos Seleccionados
LinuxWorld Expo
FOSDEM 2005
LinuxPark CeBIT 2005
Fecha: 14–17 Febrero
Fecha: 26–27 Febrero
Fecha: 10-16 Marzo
Ciudad: Boston, MA, EE.UU.
Ciudad: Bruselas, Bélgica
Ciudad: Hannover, Alemania
Sitio Web:
www.linuxworld
expo.com
Sitio Web:
www.fosdem.org
Sitio Web:
www.cebit.de/
homepage_e
Calendario de Eventos
Evento
Fecha
Ciudad
Sitio Web
21C3 – Chaos Communication Congress
OSDL Enterprise Linux Summit
SAINT 2005
CodeCon 4.0
Southern California Linux Expo
LinuxWorld Conference & Expo
UKUUG LISA/Winter Conference
FOSDEM 2005
Solutions Linux
Linux Park CeBIT 2005
O’Reilly Emerging Technology Conference
Novell BrainShare 2005
YAPC::Taipei 2005
LinuxWorld Conference & Expo, Canada
MySQL Users Conference & Expo 2005
27–29 Diciembre
31 Enero –02 Febrero
31 Enero–04 Febrero
11-13 Febrero
12 Febrero
14-17 Febrero
24-25 Febrero
26-27 Febrero
01-03 Marzo
10-16 Marzo
14-17 Marzo
20-25 Marzo
26-27 Marzo
18-20 Abril
18-21 Abril
Berlín, Alemania
Burlingame, CA, EE.UU.
Trento, Italia
San Francisco, CA, EE.UU.
Los Angeles, CA, EE.UU.
Boston, MA, EE.UU.
Birmingham, R.U.
Bruselas, Bélgica
París, Francia
Hannover, Alemania
San Diego, CA, EE.UU.
Salt Lake City, UT, EE.UU.
Taipei,Taiwan
Toronto, Canadá
Santa Clara, CA, EE.UU.
linux.conf.au
3rd International Linux Audio Conference
18-23 Abril
21-24 Abril
Canberra, Australia
Karlsruhe, Alemania
www.ccc.de
www.osdllinuxsummit.org
www.saint2005.org
www.codecon.org/2005
www.socallinuxexpo.org
www.linuxworldexpo.com
www.ukuug.org/events/winter2005
www.fosdem.org
www.solutionslinux.fr
www.cebit.de/homepage_e
conferences.oreillynet.com/etech
www.novell.com/brainshare
taipei.pm.org
www.linuxworldcanada.com
www.mysql.com/news-and-events/usersconference
conf.linux.org.au/
www.zkm.de:81/lac
Información de Contacto
Director
Paul C. Brown
Coolaboradores
Paul C. Brown, Miguel Atencia, Juan Rafael Fernández, Pedro Orantes, José María Ruíz
Traductores
Paqui Martín Vergara, Paul C. Brown, Jesús Reyes
Delgado, Antonio Rueda.
Para el Resto del Mundo
Brian Osborn
[email protected]
Tel.:
(+49) 6509 910 495
Fax.:
(+49) 6509 910 497
Director Editorial
Paul C. Brown
Maquetación
Judith Erb, Elgin Grabe, Klaus Rehfeld
Director de Producción
Hans-Jörg Ehren,
[email protected]
Diseño de Portada
Pinball, [email protected]
Subscripciones: www.linuxmagazine.com.es/
magazine/subs
Publicidad
www.linuxmagazine.com.es/pub/
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 556
Fax.:
(+34) 951 010 516
[email protected]
Para España
Paul C. Brown
[email protected]
[email protected]
Tel.:
(+ 34) 951 010 556
Móvil.:
(+ 34) 655 036 836
Fax.:
(+ 34) 951 010 516
Jillian Kay,
[email protected]
Tel.:
(+ 34) 952 402 877
Móvil.:
(+ 34) 630 624 926
Para Alemania, Austria y Suiza
Osmund Schmidt
[email protected]
Tel.:
(+49) 6335 9110
Fax.:
(+49) 6335 7779
94
Número 01
Linux Magazine
Linux New Media Spain,
S.L. Avda. Juan López Peñalver, 21
29590 - Campanillas Málaga
ESPAÑA
[email protected]
Tel.:
(+34) 951 010 556
Fax.:
(+34) 951 010 516
www.linuxmagazine.com.es - España
www.linux-magazine.com - Mundo
www.linux-magazine.de - Alemania
www.linuxmagazine.com.es
Si bien se toman todas las medidas posibles para
garantizar la precisión del contenido de los artículos
publicados en Linux Magazine, la editorial no se
hace responsable de imprecisiones aparecidas en la
revista. Asimismo, Linux Magazine no comparte
necesariamente las opiniones vertidas por sus
colaboradores 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 escrupulosamente para confirmar que está libre de virus y
errores.
Copyright y Marcas Registradas © 2004 Linux New
Media Spain, S.L. Linux New Media Spain S.L. prohíbe
la reproducción total o parcial de los contenidos de
Linux 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
Humor
LINUX MAGAZINE
Noticias del no tan Más Allá
Hechos Patentes(P)
E
l parlamento de la Comunidad
Económica Europea ha llevado a
cabo un espectacular salto hacia
delante en lo que se refiere a jurisprudencia relacionada con las patentes: tras
un acuerdo unánime en la votación
sobre la nueva Ley de Patentabilidad de
Actividades (LPA), se amplia el marco
legal de la patentabilidad para englobar
en él, no sólo productos, procesos e
ideas, sino todas y cada una de las actividades humanas.
“Con esta medida” declaró el presidente
Comisión en Pro de la Patentibilidad de
las Actividades Humanas (CPPAH),
Adolfo Fetuccinni “pretendemos impulsar la estancada actividad económica en
nuestra comunidad y ponernos un paso
por delante de otros áreas económicas
competitivas” dijo, en clara alusión a los
Estados Unidos. Además, para que la
aplicación práctica de la ley no se vea
impedida por obstáculos burocráticos, se
crea el modelo de la “patente rápida”,
donde a una corporación solicitante se le
exime de tener que demostrar la
propiedad intelectual sobre la actividad a
patentar: su propiedad sólo será examinada si es contestada por un organismo
oficial u otra empresas, abriendo de paso
nuevas vías de negocio basadas en modelos litigantes y estimulando la contratación de abogados, un sector éste en
clara recesión. Las actividades registradas como patentes rápidas son
gravables a partir del día en que se solicitan.
La LPA, revolucionaria por su atrevimiento, establece que toda actividad
humana es susceptible de ser patentada.
Sin embargo, en aras de asegurar el bien-
Ejemplos de Actividades
Humanas Patentadas
No gravables
Gravables
Sentir Escozor
Rascarse
Comer
Cocinar,Masticar,Deglutir
Defecar
Hacerlo en un inodoro
Limpiarse
Sentirse Estafado
Manifestarlo
estar de la sociedad, las actividades
humanas se dividen en “patentables
básicos no gravables” (PBNGs) y
“patentables elaborados gravables” (o
PEGs). Patente no gravable es aquella
que se considera de “necesidad fisiológica básica” y se adjudican al estado. Para
cada “patente gravable”, el patentente
(individuo, organización o empresa que
pretenda registrar una patente) ha de
solicitar y abonar una licencia de uso de
una de las actividades PBNG. A continuación, según el tipo de actividad que se
desee patentar, tendrá que solicitar una o
varias licencias que elaboran sobre cada
uno de los PEGs cedidas a las entidades
privadas que las solicitaron en su día.
Estas entidades pueden, libremente,
otorgar o denegar licencias sobre sus
patentes, cederlas gratuitamente o por
un canon y, en este último caso, establecer libremente la cuota de la misma
según sus propios criterios. Por ejemplo,
imaginemos que una empresa pretenda
patentar el “andar a pasitos cortos y de
puntillas a lo Chiquito de la Calzada”.
Primero tendría que obtener licencia de
la patente nº EU34362-22-9008176788
genérica para “desplazamiento motor
frontal bípedo”. A continuación tendría
que 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-222851734788, cedida a la misma entidad
que la anterior) y la de “Puntillas”
(patente nº MG0743-22-3260762311,
cedida a “The Motion Group, Spain
S.L.”). Este mecanismo así establecido
impide el abuso del sistema. Aunque los
PBNGs son relativamente asequibles
(entre unos 600 y 800 euros, en según
que países de la unión), los gravámenes
públicos y privados en los que se pueden
incurrir por la acumulación de licencias
de patentes hace impracticable una
“avalancha” de patentes por parte de
individuos privados desaprensivos y con
pocos escrúpulos. De hecho, las únicas
entidades que pueden aspirar a patentar
actividades de una manera consistente
son las grandes corporaciones empresariales (Microsoft, I0BM, Sun) y organismos sin ánimo de lucro (SGAE, RIAA)
que ya han demostrado en el pasado su
responsabilidad civil para con el bien
social de la mayoría de los ciudadanos.
Sin embargo, debido a problemas con
patentes solicitadas, ésta es la última
columna de esta sección, así como el fin
de la mayor parte de la industria de la
comunicación tal y como la conocemos,
ya que, si bien la actividad de pensar se
incluye bajo el epígrafe de “actividad
patentada no gravable”, la actividad de
expresar lo que uno piensa es actividad
patentada gravable… y tú intenta
difundir tus ideas por algún medio, ya
sea impreso©(P), electrónico® o por paloma mensajera™(P), y es que te funden los
■
plomos™, colega™.
GLOSARIO
impatente (adj.) dícese de persona física o
legal que no tiene ningún patente a su nombre. 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”.
www.linuxmagazine.com.es
Número 01
95
DVD
Fedora Core 3
En el DVD de Linux Magazine
Fedora Core 3
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.
E
n 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 sistema. Y desarrollaron mil y un asistentes
para ayudar al usuario a configurar, ajustar 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-
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 Hatbased. 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 empresariales de pago, muchos usuarios se rasgaron las vestiduras mientras se preguntaban 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 1: Podemos elegir el perfil del SO que vayamos a instalar
96
Número 01
www.linuxmagazine.com.es
ba que todos los
medios del sistema operativo gratuito se volcaban en Fedora, una organización comunitaria, dedicada hasta ese
momento a crear paquetes suplementarios 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ón
Como ya mencionamos en la sección
anterior, Fedora cuenta con el instalador
gráfico Anaconda para facilitar la instalación del sistema en el disco duro.
Figura 2: Elección de la franja horaria
Fedora Core 3
Figura 3: Selección de paquetes
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, Anaconda utiliza para este proceso, una herramienta visual que permite establecer
exactamente el qué y el cómo vamos a
distribuir las particiones en nuestro
disco duro. Una vez realizadas las decisiones, pasamos a seleccionar los paquetes (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 configurar el hardware, estableciendo resolución y número de colores de la pantalla, configuración de red y configuració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 pensar que no haya sido así), tendremos el
nuevo sistema en pleno funcionamiento
y podremos disfrutar de todo el potencial
de esta estupenda distribución.
DVD
Figura 4: Instalación de paquetes
Características
Fedora conserva el preciosismo y elegancia de los escritorios heredados de
Red Hat, pero si hay alguna cosa que distingue el nuevo Fedora Core de otras distribuciones, es en el apartado de los asistentes. 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 configurar en nuestro equipo, desde impresoras a escáners en red y dispositivos
inalámbricos. Por supuesto, que los más
expertos siguen pudiendo abrir una terminal 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 oscura denominación, se esconde un proyecto que hará las delicias de todo administrador 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 herramientas Stateless Linux proporcionadas por
Fedora Core, un administrador de sistemas 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
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 instalació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 buscamos 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.
Requisitos del Sistema
Procesador: Ordenador Pentium o equivalente; 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.
www.linuxmagazine.com.es
Número 01
97
PRÓXIMO NÚMERO
Número 2
Enero 2005: Número 2
Próximo Número
Especial Hardware
Linux User
¿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 televisión, reproductores
y grabadores de
DVDs, altavoces
y demás hardware
se
convierte
en un completo centro de entretenimiento. 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 dispositivos que pueden convertir tu PC en
un equipo que no desentone con el sofá
y las cortinas. No sólo eso, sino que descubrirás como explotar tu cámara digital
bajo Linux, que impresora más te conviene y como sacarle el máximo a tu
grabadora de DVDs.
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
Desarrollo
En la sección dedicada a la programación, continuaremos con la segunda
parte de la creación de un juego y veremos como ampliar nuestro interfaz
utilizando la librería curses. Tendremos otra aplicación PHP con el
que jugar y más interesantes
scripts realizados en Perl y
Python.
SysAdmins
Los administradores de sistemas podrán aprender los
diversos métodos para filtrar
contenido web a través de un
proxy, distribuir correo de manera eficiente por medio de un
cluster y detectar intrusiones en el
sistema con Sleuthkit.
comandos para que todos puedan
aprovechar el poder de las instrucciones
del shell.
Noticias
También traeremos las noticias más candentes del mundo Linux, un calendario
de eventos completo, información sobre
los últimos avances en el kernel e inseguridades de las aplicaciones e
información sobre los proyectos más
interesantes que se llevan a cabo en el
campo del Software Libre.
Boletín Linux Magazine
El 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.
A LA VENTA ENERO 2005
98
Número 01
www.linuxmagazine.com.es
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 confianza. Necesita
Red Hat. Disponible en 7 distintas
arquitecturas y certificado 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.
redhat.es | ES 900 800 409
© 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.

Documentos relacionados