Issuu on Google+

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 ó profair@abresch.de

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 mschilli@perlmeister.com. 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,

(m@perlmeister.com)

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 tux@linux.org 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

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 ads@linux-magazine.com 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, hjehren@linux-magazine.com

Diseño de Portada Pinball, info@pinball-werbeagentur.de

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 subs@linuxmagazine.com.es

Para España Paul C. Brown pbrown@linuxmagazine.com.es pbrown@linuxnewmedia.es Tel.: (+ 34) 951 010 556 Móvil.: (+ 34) 655 036 836 Fax.: (+ 34) 951 010 516 Jillian Kay, jkay@linuxmagazine.com.es Tel.: (+ 34) 952 402 877 Móvil.: (+ 34) 630 624 926 Para Alemania, Austria y Suiza Osmund Schmidt anzeigen@linux-magazine.com 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 info@linuxnewmedia.es 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.


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