Page 1

4

GFonts

LINUX MAGAZINE

Fuentes atractivas en Gnome

KFonts

Administración de fuentes

NÚMERO 08

La última versión de Fedora en DVD

NÚMERO 8 • P.V.P 5,95 €

Wiki y Blog

Herramientas para la web interactiva

Mediawiki

WIKI Y BLOG

TWiki Drupal

Implementación de un Weblog con Drupal p26 Python-Wiki: programamos un wiki simple p67 Mediawiki: el motor tras la Wikipedia p14 Un Wiki para la empresa: TWiki p20

GMailFS Gnome 2.10

GMailFS Utiliza tu cuenta de GMail como sistema de ficheros p36

Cochecitos (II) Apollon

Gnome 2.10

PDFs Extendidos

Echamos un vistazo a las nuevas características de este escritorio p32

3D con VTK

Bash

p53

Programación avanzada desde shell WWW.LINUX- MAGAZINE.ES

Edición en Castellano


¡Hazte con tus ejemplares atrasados! #1 • Número 1: Especial Redes - Servidores de correo TLS

MediaWiki - Konversation - DVD Fedora Core 3 ... • Número 2: Hardware Linux - PCs Silenciosos - Gestor de ventanas Twin - Backups con Konserve ... • Número 3: Seguridad para todos - Configuración iptables con Shorewall - Ruby Rails - Domótica ... • Número 4: Redes Wireless - Scribus - Radio USB Hackeando con Zaurus - DVD Mandrake 10.1 ... #2 • Número 5: Email seguro - Seguridad Wireless - Gimp con Python - Bluetooth - QEMU - QTCanvas - Scribus (II) • Número 6: Multimedia - MLDonkey - OpenOffice Juegos DOS con SCUMMVM y DOSBox - Scribus (III) • Número 7: Sistemas virtuales - Debianiza tu SuSe Coches teledirigidos - SoundJuicer - DVD SuSe 9.2

¡No esperes a que se agoten! #3 #7

#4

#5

#6

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


EDITORIAL

STAR WARS VS. 2001 Estimado Lector de Linux Magazine

M

ientras escribo esto, vivimos en plena explosión de fervor guerrigalaxera. Todo el mundo ha ido a ver, está a punto de ver o verá esta noche la Venganza de los Sith. Que conste que yo recomiendo esta película. Disfrute como un enano viéndola y cuando salga en DVD, puede que me la compre, para mis hijos, y la saga completa en pack deluxe con bol para cereales en forma de R2D2, para mis nietos. Sin embargo no puedo que por menos ponerme a cavilar sobre algunos aspectos de la saga y toda la feria que le rodea y preguntarme que si no estará toda nuestra pleitesía rendida al Imperio del Mal, y no me refiero al montado por Darth Sidious en contubernio con Anakin Skywalker, sino a Microsoft. Por que, vamos a ver, los parecidos son muchos, demasiados para ser coincidencias. La primera es que Lucas tiene mejor departamento de Marketing que otra cosa. Lo mismo ocurre en Microsoft. Ya poniéndonos a analizar los productos de cada cual, en vista de los agujeros en las tramas, el nulo desarrollo de los personajes y los patéticos diálogos (aunque más sobre esto después), es obvio que George Lucas, máximo responsable

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.

de la saga Star Wars, no sabe escribir guiones. Es igualmente obvio que Bill Gates, máximo responsable de la saga Windows, tampoco, por que si no ¿de qué se iban a necesitar tantos asistentes gráficos? Y, siguiendo con la escritura, la mayoría de los diálogos de la saga son obtusos y prescindibles. Igualito, igualito que los de Windows. ¿Y qué decir de los agujeros de seguridad? Que uno ve los últimos exploits descubiertos para Windows y no sabe si esta leyendo un informe del CVE o los planos de la Estrella de la Muerte. Bueno, entonces si Windows es La Guerra de las Galaxias ¿qué es Linux? Hombre, pues yo lo compararía con 2001, Una Odisea en el Espacio, por que, recurriendo al tópico, 2001 resulta ininteligible en una primera visualización al igual que el sistema de ficheros de Linux para un neófito. El efecto de ambas películas/sistemas operativos sobre sus espectadores/usuarios, es igualmente revelador de sus semejanzas. Mientras que el espectador medio sale de cada nueva entrega Star Wars limitándose a comentar a sus compañeros: “Qué chula ¿no?” o “Otra vez nos han timado”, la cantidad de conversación que suscita 2001 es sustancialmente mayor. De ahí Barrapunto. Además, HAL 9000, el ordenador asesino de la nave Discovery, fijo, fijo que corre Unix. AVISO A LOS LECTORES: El presente número de Cómparese la fría, eficienLinux Magazine es el correspondiente a los meses de te y desapasionada manejulio y agosto. No es un número doble, por tanto los ra que tiene HAL de ejesubscriptores seguirán recibiendo los tres o doce cutar sus tareas, incluso ejemplares correspondientes a su subscripción cuando se trata de extercorrespondiente (de prueba o anual), pero no volveminar a los tripulantes, remos hasta septiembre con más apasionantes con, por poner un ejemtemas, más programación, más administración y más plo, el pusilánime e inesaplicaciones para todos nuestros lectores. table C3PO. Para que los lectores tengan algo con el que jugar a lo Recuérdese que HAL se largo de los meses de verano, incluimos un DVD de carga a la tripulación del portada muy interesante: Fedora Core4, recién salido. Discovery por que amena-

WWW.LINUX- MAGAZINE.ES

zan el buen término de la misión que tiene encomendada y ¿desde cuándo un sistema Unix antepone la comodidad o bienestar del usuario a sus tareas programadas? Primero ejecutaremos el cron, después ya atenderemos las necesidades de los usuarios. Pues eso. Además HAL se comunica con sus “amos” a través de una consola. Compárese, otra vez, con el vistoso, mas superfluo interfaz de C3PO. Además, este último se rompe con una facilidad pasmosa, nada que ver con las dificultades para desconectar las facultades mentales superiores de HAL. Recordemos que David Bowman tuvo que poseer las atribuciones de root para hacerle el equivalente de un rm -fR / a HAL. Volviendo a su vena homicida, HAL nunca hubiera sido tan eficiente intentando cargarse a la tripulación del Discovery ante su dilema interno si hubiera corrido Windows. Se hubiera limitado a mostrar un pantallazo azul… y ahí se hubiera quedado.¡Linux

Magazine de Vacaciones!

Paul C. Brown Director

Número 08

3


CONTENIDOS • Linux Magazine nº 8

PORTADA 14 Mediawiki La mejor forma de organizar la colaboración en la Web es mediante un Wiki. Mediawiki establece el estándar para las herramientas de colaboración basadas en Web.

20 TWiki TWiki es líder entre los wikis de fuente abierta para la empresa y una plataforma colaborativa para la construcción de aplicaciones Web.

PRÁCTICO 32 Gnome 2.10 El nuevo escritorio Gnome incorpora una serie de nuevas aplicaciones y applets. Bajo la capota se muestra más estable.

36 Gmail

DESARROLLO 53 Bash Bash puede ser tan simple o tan sofisticado como se desee. Enseñaremos un estupendo guión Bash para inspeccionar nuestro servidor web y aprenderemos un montón de útiles trucos.

¿Por qué desperdiciar los 2Gb de la cuenta de correo? GmailFS nos permite usar Gmail como un sistema de ficheros remoto para almacenar información.

40 Exportando PDFs Explicamos en este artículo como crear los mejores PDFs desde OpenOffice con la macro ExtendedPDF.

62 VTK 3D

45 Cochecitos (II) 26 Drupal Drupal facilita las labores con páginas dinámicas. Profundizaremos en su abanico de funciones y trataremos la instalación y configuración básica.

LINUX MAGAZINE 3 6 7 9 12 95 97 97 98

4

Editorial Productos Inseguridades DVD Linux Magazine Negocios Suscripciones Eventos Información de Contacto Próximo Número

Número 08

Vemos como crear una Interfaz Gráfica de Usuario (GUI) que contenga un área de renderizado y diferentes “widgets” que permitan modificar propiedades de la escena, de los actores, etc.

Ha llegado el momento de finalizar las modificaciones del mando a distancia del coche que emprendimos el mes pasado, y de preparar nuestros scripts que lo controlarán desde el ordenador.

DESARROLLO 49 PDFs en Perl Este mes aprenderemos a ubicar artículos en archivos PDF protegidos y cómo usar una base de datos para acceder a estos artículos más tarde.

67 Python Vemos lo sencillo que puede ser crear una wikiwiki casera con Python y las herramientas adecuadas.

ADMINISTRACIÓN 71 La Columna de Charly

WWW.LINUX- MAGAZINE.ES


ADMINISTRACIÓN 72 MySQL Nuestro servidor Web funciona bien a la hora de servir HTML, pero a la hora de hacer copias de seguridad de una simple base de datos MySQL, nos encontramos solos ante el peligro… ¿O tal vez no?

75 RSync y SSH La herramienta Rsync envía los ficheros críticos a otro ordenador secundario, al que se puede acceder fácilmente.

LINUX USER 84 Apollon Los operadores de la red Kazaa, sólo proporcionan software para sistemas Windows. Pero el proyecto GiFT nos ofrece soporte para Kazaa bajo Linux.

86 Gnomefonts En este artículo explicamos como Fontconfig, X y Gnome trabajan de forma conjunta para conseguir renderizar fuentes de manera vistosa en nuestro escritorio.

C

O

R

E

4

DVD de arranque de fácil instalación

Un amplio abanico de aplicaciones, para oficina, servidores, Internet, etc...

Incluye KDE 3.4, GNOME 2.10, OpenOffice.org 2.0, Xen 2.0

Kernel 2.6.11

SELinux

Más información en la página 9. LINUX USER 80 Ktools Un tipo de letra bien elegido es el añadido perfecto a nuestra experiencia con Linux. KDE nos ofrece varias herramientas que nos ayudan a cocinar una sopa de letras con el mínimo esfuerzo.

88 Educación Examinamos la aplicación de SL en el centro Corazón de María de Palencia, y estudiamos su experiencia con ATNAG.

82 Desktopía El lanzador de programas Apwal facilita la tarea de encontrar una aplicación rápidamente con un simple clic.

93 Línea de Comandos Antes de tostar un CD de datos bajo Linux, necesitaremos una imagen ISO: mkisofs nos ayudará a crearla.

WWW.LINUX- MAGAZINE.ES

Número 08

5


LINUX USER PRODUCTOS

Schlagwort sollte hier stehen

PRODUCTOS EL JUGUETE DEFINITIVO En un caso claro de esquizofrenia corporativa, Nokia sigue apostando por Linux. Simultáneamente al hecho de que la empresa finlandesa apoya abiertamente la nueva directiva sobre patentes de software en Europa y declara que no piensa atacar al kernel de Linux con su portafolios de patentes (lo que es una velada manera de decir que todos los otros proyectos sí son susceptibles de ser atacadas), simultáneamente, digo, saca el Nokia 770. Esta maravilla no es un teléfono y no, no es tampoco un PDA. El 770 es un nuevo concepto en tablet PC de bajo volumen y bajo precio. Midiendo 141 x 79 x 19 mm y con un peso por debajo del cuarto de kilo, por unos 350 dólares se podrá dispone de un tablet PC con

una pantalla táctil de 800x480 y 65.536 colores, memoria DDR de 64 Megabytes, un procesador TI 1710

OMAP (basado en ARM), conectividad WLAN 802.11b/g y Bluetooth, y mucho más

Y a pesar de que las especificaciones del aparato describen el sistema operativo como “Internet Tablet 2005 software edition”, que nadie se lleve a engaño: se trata de una Debian modificada con kernel 2.6.8, y tiene todos los juguetes que hemos llegado esperar de las distribuciones Linux embebidas: navegador Opera, reproductor de medios, cliente de correo electrónico, et cétera, et cétera. El aparato estará a la venta en el último trimestre del 2005, justo a tiempo para Navidades. A pesar de las reprobables políticas de Nokia en el área de las patentes, ¡yo quiero uno! ■ http://www.nokia.com/nokia/ 0,1522,,00.html?orig=/770

LINUX NOTEBOOK Otra empresa que ha tenido problemas de doble identidad en el pasado es HP. Mientras que en todo gran evento Open Source Carli Fiorina dice rendir pleitesía incondicional a Tux, los usuarios de a pie hemos tenido que sufrir lo indecible con recalcitrantes notebooks HP/ Compaq y sus modems, tarjetas de vídeo y salidas de vídeo ni estandarizados, ni documentadas, amén de la cantinela del soporte técnico, tan común en tantas empresas por otro lado, que va como sigue: “Nosotros no damos soporte a Linux” (repetir varias veces). Se lo perdonaremos por que van y ahora sacan el HP Compaq NC4200, un portátil de bajo precio (uno 1.500 dólares) con un “Ubuntu” tuneado de serie. La versión americana del aparato viene

6

Número 08

con una pantalla táctil que se puede rotar 180 grados que lo convierte en un tablet PC. Sin embargo, la versión que se venderá en Europa puede que no venga con esa característica… Pero los estadounidenses no tendrán la

opción de lo de Ubuntu, sólo pudiendo optar por Windows XP. Así que, estamos en paz. Sin embargo, el aparato no viene con Linux preinstalado, sino que se compra virgen. Bueno, viene con un

WWW.LINUX- MAGAZINE.ES

simple DOS (de hecho FreeDOS). Es responsabilidad del comprador pedir a HP un CD con el Ubuntu que funcionara en el NC4200. El CD y los gastos de envío corren a cargo de HP, por tanto no es tan grave. Además, con el rígido código de compromiso que mantiene la empresa de Mark Shuttleworth con el software libre, es seguro que todo el desarrollo que se ha hecho para soportar el hardware del NC4200 acabará en los repositorios de código libre. Atención: En el próximo número de Linux Magazine, no te pierdas un análisis en profundidad del NC4200 a cargo de Mirko Dölle, nuestro hombre del hardware en ■ Alemania. http://www.hp.es http:// www.ubuntulinux.org


INSEGURIDADES

INSEGURIDADES ■ OPENOFFICE.ORG OpenOffice.org es una suite ofimática orientada a la productividad que incluye aplicaciones de escritorio tales como un procesador de textos, hoja de cálculo, administrador de presentaciones, editor de fórmulas y un programa de diseño vectorial. Se ha encontrado un error de desbordamiento de búfer basado en pila en el procesador de ficheros DOC de OpenOffice. Un atacante que conociera este error, podría crear un fichero DOC cuidadosamente manipulado que provocara que OpenOffice ejecutara código arbitrario cuando el fichero se abriese por parte de 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-2005-0941 a este problema.

Se recomienda a todos los usuarios de OpenOffice que se actualicen a la última ■ versión. -Referencia Gentoo: GLSA 200504-13 / OpenOffice -Referencia Mandriva: MDKSA-2005:082 -Referencia Red Hat: RHSA-2005:375-07 -Referencia Suse: SUSE-SA:2005:025

■ ETHEREAL Ethereal es un analizador de protocolos de red de múltiples características. Algunos investigadores han descubierto recientemente numerosas vulnerabilidades en versiones de Ethereal anteriores a la versión 0.10.11. Estas vulnerabilidades incluyen problemas como los siguientes: • Los disectores de ANSI A y DHCP son vulnerables a vulnerabilidades de formato de cadenas.

WWW.LINUX- MAGAZINE.ES

• •

Los disectores de DISTCC, FCELS, SIP, ISIS, CMIP, CMP, CMS, CRMF, ESS, OCSP, PKIX1 Explicit, PKIX Qualified, X, 509, Q.931, MEGACO, NCP, ISUP, TCAP y Presentation son vulnerables a desbordamientos de búfers. Los disectores de KINK, WSP, SMB Mailslot, H.245, MGCP,Q.931, RPC, GSM, y SMB NETLOGON son vulnerables a errores de manejo de punteros. Los disectores LMP, KINK, MGCP, RSVP, SRVLOC, EIGRP, MEGACO, DLSw, NCP y L2TP son vulnerables a problemas de bucles. Los disectores Telnet y DHCP pueden llegar a abortar. Los disectores TZSP, Bittorrent, SMB, MGCP y ISUP pueden provocar un fallo de segmentación.

Número 08

7


INSEGURIDADES

Los disectores GSM MAP, AIM, Fibre Channel, SRVLOC, NDPS, LDAP, y NTLMSSP podrían terminar de manera anormal. Un atacante podría utilizar estas vulnerabilidades para colgar Ethereal y ejecutar código arbitrario con los permisos del usuario que corre Ethereal, que podría ser el usuario root. Esto podría comprometer la seguridad del sistema a conlle■ var el escalado de privilegios. -Referencia Debian: DSA-718-2 ethereal -Referencia Gentoo: GLSA 200505-03 / Ethereal -Referencia Mandriva: MDKSA-2005:083

■ FIREFOX Firefox es un navegador web de código abierto. Vladimir V. Pereplitsa descubrió un error en la manera en que Firefox utiliza funciones anónimas durante el reemplazo de cadenas de expresiones regulares.

Esto posibilita que una página web maliciosa capture un bloque arbitrario de memoria del navegador. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2005-0989 a este problema. Omar Khan descubrió un error en la manera en que Firefox procesa la etiqueta PLUGINSPAGE. Una página web maliciosa puede engañar a un usuario y hacer que pulse el botón de “Instalación manual” para que instale un plugin desconocido. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2005-0752 a este problema. Doron Rosenberg descubrió un error en la manera en que Firefox muestra una ventana emergente. Si un usuario elige abrir una ventana emergente cuya URL es un guión JavaScript malicioso, el guión se ejecutará con privilegios elevados. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el

POLITICAS DE SEGURIDAD DE LAS 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

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 relacionados con Referencia:MDKSA:… 1) la seguridad. Entre otras cosas,incluye 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 soluciona el parche.

1) Todos los distribuidores muestran correos de seguridad en el campo Subject.

8

Número 08

WWW.LINUX- MAGAZINE.ES

nombre CAN-2005-1153 a este problema. Se encontró un error en la manera en que Firefox maneja el rango global javascript para una ventana. Una página web maliciosa podría definir una variable global que se supiera que se utiliza en otro sitio web, permitiendo al código malicioso ejecutarse en el contexto de ese sitio. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN-2004-1154 a este problema. Michael Krax descubrió un error en la manera en que Firefox instala plugins de búsqueda. Si una usuario escoge instalar un plugin de búsqueda desde un sitio malicioso, éste podría sobreescribir silenciosamente un plugin existente. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado los nombres CAN-2005-1156 y CAN-20051157 a este problema. Kohei Yoshino descubrió un error en la manera en que Firefox abre enlaces en el panel lateral. Una página web maliciosa. Podría construir un enlace de tal manera que, cuando un usuario hiciera clic en él, podría ejecutar javascript arbitrario con privilegios elevados. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2005-1158 a este problema. Se encontró un error en la manera en que Firefox valida varios objetos XPInstall relacionados con javascript. Una página web maliciosa podría pasar otros objetos a los objetos XPInstall, lo que resultaría en que el intérprete javascript saltaría a localizaciones arbitrarias en memoria. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2005-1159 a este problema. Se encontró un error en la manera en que el código UI privilegiado maneja nodos DOM. Una página web maliciosa podría instalar código javascript malicioso o robar datos. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN■ 2005-1160 a este problema. -Referencia Gentoo: GLSA 200504-18 / Mozilla; GLSA 200505-11 / mozilla -Referencia Mandriva: MDKSA-2005:088 -Referencia Red Hat: RHSA-2005:323-07 -Referencia Slackware: SSA:2005-111-04; SSA:2005-135-01 -Referencia Suse: SUSE-SA:2005:028


DVD LINUX MAGAZINE

DVD DE LINUX MAGAZINE

E

ste mes en el DVD de Linux Magazine, traemos a todos los lectores la última versión de Fedora Core. La versión 4 del sistema operativo de código abierto avalada por Red Hat, trae una serie de mejoras y añadidos que lo hacen muy interesante para su uso y evaluación.

Instalación y Configuración Fedora Core utiliza la conocida aplicación Anaconda para su instalación.

Anaconda es un instalador gráfico basado en menús que facilita enormemente el proceso de conseguir un sistema operativo en funcionamiento. Dispone de un particionador gráfico e intuitivo y permite escoger varios tipos estandarizados de instalaciones, como “Servidor”, “Escritorio personal” o “Estación de trabajo”. Igualmente permite personalizar la configuración e instalación de paquetes a gusto de cada cual. El sistema escogido por Fedora para instalación local y remota de paquetes individuales, así como para las actualizaciones periódicas, es Yum. Yum es un programa de la línea de comandos similar a apt de Debian, que, a partir de una base de datos pre-configurada, permite instalar, desinstalar y actualizar de manera sencilla y automática paquetes de los repositorios de Red Hat y Fedora. Yum también puede configurarse para que se ejecute cada cierto tiempo (todas las noches, por ejemplo) para actualizar sistemáticamente con parches de seguridad o de corrección de errores programas ya instalados en el sistema. Con Yum podemos mantener nuestro sistema siempre al día de la manera más cómoda y eficiente.

Figura 1: El programa Anaconda facilita mucho la instalación de Fedora Core.

para darles un aspecto y comportamiento consistente. Ya en el área de la ofimática, Fedora Core 4 trae OpenOffice 2.0 de serie, ya con todos los componentes listos para utilizar, incluyendo el nuevo motor de bases de datos integrado con su GUI correspondiente. Otra novedad es la inclusión de Evince, un potente visualizador de documentos que permite leer PDFs, PostScript y DVIs de manera nativa, y otros formatos con el uso de plugins.

Seguridad Fedora es una de la distribuciones pioneras en la implantación de SELinux de manera nativa. SELinux es una mejora al kernel de Linux que implementa un Control de Acceso Obligatorio (Mandatory Access Control o MAC) y Control de Acceso Basado en Roles (RoleBased Access Control o RBAC) en las ver-

Novedades en Fedora Core 4 Sistema base Kernel Linux 2.6.11 GCC 4.0 Virtualización con XEN 2.0 SELinux (80 nuevo demonios) Escritorio: Gnome 2.10 KDE 3.4 Tema Clearlooks Productividad OpenOffice 2.0

Escritorio

Evince

Se puede optar como gestor de ventanas tanto por Gnome 2.10 como KDE 3.4. Ambos vienen con el tema “Clearlooks” (basado en Bluecurve de Red Hat)

MySQL 4.1

WWW.LINUX- MAGAZINE.ES

Desarrollo Eclipse 3.1 PHP 5.0

Número 08

9


DVD LINUX MAGAZINE

siones de Fedora superiores al Core 2. En palabras sencillas, Linux, nativamente, utiliza un método DAC (Discretionary Access Control – control de acceso discrecional) para la seguridad del sistema. Es decir, todos los ficheros y recursos de un usuario, están expuestos a fallos y/o software maliciosos de los procesos iniciados por ese usuario. El modelo MAC de SELinux es diferente: Primero, se puede definir administrativamente políticas de seguridad sobre los procesos y objetos. Segundo: se

Figura 2: El tema Clearlooks le da un aspecto consistente al escritorio.

puede controlar todos los procesos y objetos con SELinux a través del kernel. Y por último, las decisiones de seguridad se basan en toda la información de seguridad relevante disponible y no solamen-

Requisitos del Sistema Fedora Core 4 Linux soporta los componente de PC más comunes. Para una lista de dispositivos soportados, recomendamos visitar http://fedoraproject.org/wiki/ HCL. El hardware mínimo es:

• Escritorio Personal: 2.7 GB. • Estación de Trabajo: 3.0 GB • Personalizado (instalación completa): 6.9 GB

Procesador: * Pentium 1-4, AMDx, Duron, Athlon XP, Athlon MP o Athlon 64.

Sistemas x86_64 de 64 bits:

Recomendado:

• Servidor: 1.5 GB.

• Pentium 200 MHz mínimo para modo texto, Pentium II 400 MHz para modo gráfico.

• Escritorio Personal: 2.7 GB.

RAM: Sistemas x86 de 32 bits: • Mínimo modo texto: 64MB • Mínimo modo gráfico: 192MB • Recomendado modo gráfico: 256MB Sistemas x86_64 de 64 bits: • Mínimo modo texto: 128MB • Mínimo modo gráfico: 256MB • Recomendado modo gráfico: 512MB Disco duro: Sistemas x86 de 32 bits: • A Medida (instalación mínima): 900 MB. • Servidor: 1.5 GB.

10

Número 08

• A Medida (instalación mínima): 900 MB.

• Estación de Trabajo: 3.4 GB • Personalizado (instalación completa): 7.5 GB Se ha de disponer de un lector de DVDs para poder instalar Fedora Core 4 utilizando el DVD de Linux Magazine. Si su sistema dispone de un lector de CDs que no es un lector de DVDs, no podrá instalar el software de este DVD. Si el sistema no arranca del DVD automáticamente cuando el sistema se inicia, acceda al menú de arranque y modifíquelo o introduzca los comandos necesarios para arrancar desde DVD. Vigile los mensajes de inicio cuando acceda al menú de arranque o consulte la documentación de su hardware.

WWW.LINUX- MAGAZINE.ES

te en la autenticación de identidades de usuarios. En suma, el modelo MAC bajo SELinux, permite aportar permisos granulares para todos los sujetos (usuarios, programas y procesos) y objetos (ficheros, dispositivos). En esta nueva versión, se han cubierto 80 nuevos demonios bajo el paraguas de SELinux, incluyendo apachae, bluetooth, cups, ftpd, kerberos, samba, entre otros.

Virtualización Fedora Core 4 viene con el motor de virtualización (en otra palabras, emulador) Xen ya preinstalado. Xen 2.0 (la versión que viene con Fedora Core 4), permite correr de manera segura sistemas operativos múltiples, en sus propias “cajas de arena”. Se ha integrado Xen para que funcione con Fedora Core 4 sin fisuras.

Instálelo Ya Fedora Core 4 es una de las distribuciones más populares del mundo y, como heredera de los sistemas abiertos de Red Hat, uno de los más maduros y que dispone de más paquetes. La integración de SELinux, Xen y YUM, lo convierten además en uno de los más avanzados y más interesantes en ■ el campo de las innovaciones.


LINUX USER NOTICIAS

Schlagwort sollte hier stehen

NOTICIAS LINUX CAMPUS PARTY El museo de las Ciencias Príncipe Felipe de Valencia volverá a albergar este año del 25 al 31 de julio a los participantes de Campus Party, en esta ocasión alrededor de 5.500, que estarán agrupados por primera vez en nueve áreas temáticas repletas de espectaculares contenidos: juegos de acción y estrategia, juegos de deporte, simulación aérea, modding, astronomía, Campusbot (dedicada a la robótica), CampusCrea (reunión de creadores digitales), desarrollo de videojuegos y cómo no, software libre. Entre las conferencias y actividades de la sección libre, podemos destacar “Como ser mantenedor de Debian” por

Ghe Rivero, uno de los mejores exponentes del modelo de desarrollador Debian. Sobre Ubuntu, se abordarán temas como “Rosetta, el sistema de traducción de

Ubuntu” o “Malone, el sistema de solución de fallos de Ubuntu”. Además tendrán lugar otras actividades como “LSTP: Servidor de terminales en Linux”, con Guillermo García; la conferencia “Enemigo a las Puertas: actualidad y futuro del Software Libre”

que impartirá Paul C. Brown (Director de la Revista Linux-Magazine); el “Curso sobre Squeak” que impartirá Diego Deck, conferencias sobre Fluendo y Fluemotion (streaming con Linux) y videoconferencias y presentacio-

nes de proyectos con el MIT. Ya en el ámbito de lo técnico, se extenderán 15.000 metros de fibra óptica, 290.000 de cable y se dispondrá de un potencia de 3.000.000 watios para dar servicio a todos los jugadores, usuarios y desarrolladores que se concentrarán en el evento. http://web5.campus-party.org/

RED HAT Y SUS PATENTES Red Hat ha querido dejar clara su postura con respecto a la patentes de software, tanto en EE.UU. como en Europa. El 3 de junio, en una ponencia dirigida a los asistentes de la Red Hat Summit celebrado en Nueva Orleans, Mark Webbink, Deputy General de Red Hat, dijo: “Las patentes no equivalen a innovación[…]. Lo que observamos hoy en día en la industria del software es el uso de las patentes como una manera de mantener cuota de mercado, aún si esa cuota de mercado se ha obtenido por

12

Número 08

medios anti-competitivos. Hemos de alejarnos de un sistema de patentes de software comprometida por mejoras triviales e incrementales que bloquean la innovación, y buscar un sistema que recompense las innovaciones sustanciales”. A continuación articuló un plan en tres partes ideado por Red Hat que defienda el derecho a innovar en el actual clima de patentados y patenables.

Primero Red Hat crea el “Fedora Foundation”, con el fin de trasladar trabajo de desarrollo de proyectos y propiedad de copyrights a la fundación. A pesar de lo anterior, Red Hat seguirá aportando apoyo de medios al proyecto Fedora. En segundo lugar, Red Hat sigue una campaña para reformar las leyes de petentes en EE.UU. e impedir que se apruebe la directiva sobre

WWW.LINUX- MAGAZINE.ES

“inventos de ordenador” propuesta al parlamento europeo, al menos en su redacción actual. Por último, Red Hat planea crear un “Patents Common”, algo similar a los Creative Commons, pero en forma de depósito de patentes, donde empresas o poseedores de patentes podrán volcar sus patentes para protección del software libre y la libre colaboración. http://www.redhat.com/ en_us/USA/Home/Company/ News http://www.redhat.com/ legal/patent_policy.html


Wiki y Blog • PORTADA

La era de la Web interactiva.

LOS USUARIOS MANDAN E

n sus comienzos, la Web iba en un solo sentido. Alguien detrás del servidor “colocaba el contenido ya preparado” que aparecía ante el usuario como una imagen fija y de solo lectura. Entonces llegaron los formularios HTML y los guiones CGI, las herramientas que incluyeron al cliente en el juego, pero las oportunidades para participar fueron cuidadosamente orquestadas con los únicos y muy elaborados esfuerzos de los desarrolladores mejor pagados de la Web. Los usuarios desearon más y en la siguiente ronda de la reinvención de Internet, emergió una nueva Web. En el tema de portada de este mes, le invitamos a descubrir el mundo del Wiki y del Blog. Las herramientas ofrecidas en esta número traen un nuevo nivel de cooperación y de colaboración a la Web. Y lo mejor de todo, no necesita un doctorado en ciencia informáticas para implementar estas poderosas herramientas. Le mostraremos cómo un usuario habitual de Linux puede instalar y manejar un sitio Web colaborativo usando las aplicaciones que utilizan los expertos. Aprenderá acerca de: • Mediawiki - La herramienta tras de la famosa enciclopedia de colaboración Wikipedia. Mediawiki es una herramienta para organizar comunidades colaborativas basadas en sitios Web. Los usuarios pueden incorporar notas, contribuciones y revisiones a los documentos de la Web. Mediawiki pro-

porciona control de versiones, control de acceso y otras características útiles para una fácil y eficaz cooperación. TWiki - Como Mediawiki, TWiki lidera la implementaciones de Wiki de fuente abierta. Aprenderá a instalar y configurar la plataforma de colaboración Twiki y también daremos una vuelta por el interfaz de usuario de TWiki, poniendo especial atención al reto del uso empresarial del Wiki. Le mostraremos cómo utilizar las mejores características de

TWiki en su propio entorno colaborativo. • Drupal - Una herramienta para construir websites dinámicos. Le mostraremos cómo utilizar Drupal para crear sitios para comunidades, weblogs, y aplicaciones Web a medida. Tanto si es un profesional de la Web, un voluntario de la comunidad, o un usuario habitual de Linux, seguramente encontrará algo que útil en nuestro tema de portada de este mes sobre Wikis y Blog. ■

EN PORTADA Mediawiki . . . . . . . . . . . . . . . . . . . . . . . . .14 Twiki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20 Drupal

. . . . . . . . . . . . . . . . . . . . . . . . . . . .26

WWW.LINUX- MAGAZINE.ES

Número 08

13


PORTADA • Mediawiki

Configuración y adminsitración de Mediawiki 1.4

ESFUERZO COMUNITARIO

La mejor forma de organizar la colaboración en la Web es mediante un Wiki. Mediawiki, el Wiki tras el famoso proyecto Wikipedia, establece el estándar para las herramientas de colaboración basadas en Web. POR ELISABETH BAUER

os fans de Wiki estarán familiarizados con el escenario: Se selecciona un texto en la Web y se busca en vano un botón de edición. Hasta la entrada del principio de Wiki, se consideraba impensable que un visitante pudiera editar un sitio Web. Pero ahora, los proyectos como la enciclopedia gratuita, Wikipedia [1], demuestran claramente la viabilidad de un esfuerzo colaborativo de miles de voluntarios implicados. Muchos negocios y proyectos de código abierto han colocado Wikis para usarse en áreas como la documentación

L

14

Número 08

de software o simplemente para organizar documentos dentro de la intranet de la empresa. Si está interesado en montar un Wiki propio, ahora tiene la oportunidad. Hay disponible unos 50 motores Wiki en diversos lenguajes de programación. Mediawiki [2], el software que usa la Wikipedia, es una herramienta Wiki que ha demostrado su valor desde hace dos años en una situación permanente de producción. Esta prueba de fuego ha permitido a los desarrolladores descubrir rápidamente las vulnerabilidades y eli-

WWW.LINUX-MAGAZINE.ES

minarlas, haciendo de Mediawiki una de las opciones más estables y mejor probadas.

La Instalación Mediawiki necesita de un servidor Web Apache operativo con el módulo de PHP y la base de datos MySQL. Los scripts de gestión de Mediawiki necesitan del intérprete de línea de comandos de PHP, que los usuarios de Debian encontrarán en el paquete, php4-cli. Para generar los thumbnails de las imágenes que va a usar con el Wiki, también sería recomen-


Mediawiki• PORTADA

Figura 1: Ejecute un script PHP en su navegador para instalar Mediawiki. El script le mostrará las configuraciones problemáticas.

dable la instalación de ImageMagick o la librería gráfica de PHP, GD. El servidor Web también ha de soportar la ejecución de código PHP. Hay que descargar la versión actual de Mediawiki desde [2]. En este artículo, vamos a usar Mediawiki 1.4beta5. Probablemente la versión final 1.4 salga cuando esta revista llegue a los quioscos, así que su versión puede que sea ligeramente diferente. Entre en la consola como root y sitúese en el directorio raíz del servidor Web; /opt/lampp/htdocs en XAMPP o /var/www en Debian. Una vez allí, hay que teclear el siguiente comando: tar xzvf /path/to/ U mediawiki-1.4beta5.tar.gz

para descomprimir el software Wiki en el directorio actual. El directorio nuevo que este paso crea, será posteriormente parte de la URL del Wiki, así que deberá asegurarse de darle al directorio el nombre lo más corto que sea posible, por ejemplo wiki: mv mediawiki-1.4beta5 wiki<C>.

Cambie de directorio tecleando cd wiki. Luego teclee: chmod a+w config

para hacer que el directorio de configuración del servidor Web tenga permisos de escritura temporalmente. Después de completar la instalación, no olvide hacer de nuevo el directorio de sólo lectura. Ahora, lance el script de instalación desde el navegador Web: http://localhost/wiki/config/ind ex.php

El script primero comprueba los requerimientos de la instalación. Si observa algún mensaje de error en este punto, en vez del cuadro de diálogo que aparece en la Figura 1, tendrá que regresar y volver a comprobar y corregir la configuración de Apache y PHP. Tendrá que comprobar también si el script ha sido capaz de encontrar el software ImageMagick o la extensión PHP GD para la generación de thumbnails. Introduzca un nombre para su Wiki en Site name:. El Site name aparecerá en varios lugares de su Wiki como el nombre del proyecto y Mediawiki creará un proyecto con ese mismo nombre con este título - pero regresaremos a esta parte más tarde. La dirección de correo es la dirección de contacto para los mensajes de error. Utilice el diálogo de selección de idioma para seleccionar el idioma por defecto de la Wiki. Junto al interfaz del idioma, necesita el conjunto de codificación de caracteres. Configurando us - English Unicode permite a los usuarios añadir entradas a la Wiki en un conjunto de caracteres distintos sin necesidad de tener que tratar con etiquetas HTML. En la red local, la información de licencias de Wiki no es lo importante, pero si se ejecuta una Wiki pública, habría que tenerlo en cuenta. La Licencia de Documentación Libre GNU es una licencia para textos y otros documentos que está basada en GPL. La

Tabla 1: Sintaxis de Wiki ==Nivel 1== ===Nivel 2=== ====Nivel 3==== “cursiva” “‘negrita’” * Entrada # Entrada [[Título de Nueva Página]] [[Título|Other Text]] http://ejemplo.com [[Image:Fichero.jpg]] [[Image:Fichero.jpg|thumb]] {{Nombre}} {{subst:Nombre}} {{:Nombre}} ~~~ ~~~~

Cabecera de primer nivel Cabecera de segundo nivel Cabecera de tercer nivel Cursiva Negrita Líneas en listas no numeradas comienzan con asterisco (*) Listas enumeradas Línea horizontal Enlace interno Enlace interno con un texto alternativo Enlace externo (automáticamente lo convierte en un enlace) Añade una imagen a la página Añade thumbnail Integra dinámicamente el contenido en una página “Template:Name” Reemplaza el contenido de “Template:Name” cuando almacena la página Integra dinámicamente el contenido de la página “Name” Crea una firma para el registro de usuario, esto es un enlace Wiki a una página personal de usuario. Firma con la marca temporal.

WWW.LINUX-MAGAZINE.ES

Número 08

15


PORTADA • Mediawiki

licencia permite copias libres, modificación y utilización comercial. Las licencias Creative Commons proporcionan mayor libertad. Por ejemplo, puede prohibir cualquier uso comercial y escoger una versión aplicable a su sitio. Haga clic en choose para ir al diálogo de selección en el sitio Web de Creative Commons, donde puede colocar junto a la licencia sus requisitos. Mediawiki acepta su elección de licencia y muestra un enlace a la licencia en el pie de cada página. Necesita especificar una cuenta de usuario como Sysop account; el sysop tendrá privilegios extendidos en la Wiki; el nombre de la cuenta es arbitrario. Para acelerar Mediawiki, el instalador permite activar Turck MMCache o Memcached - solo podrá habilitar estas opciones si tiene instalado el software de caché. Debian tiene paquetes para ambos. Turck MMCache es una caché PHP bytecode muy útil si se ejecuta Mediawiki en un solo host. Los servidores de Wikipedia utilizan Memcache, un sistema de caché distribuido originalmente desarrollado por Livejournal, el cual se establece como un servicio. La configuración de la base de datos es el último paso. El script de instalación crea un usuario MySQL y una base de datos. Puede utilizar las opciones por defecto en la mayoría de los casos. Si quiere que Mediawiki comparta la base de datos con otras aplicaciones, introduzca el nombre de la base de datos y a continuación introduzca un prefijo para el nombre de la tabla en Database table prefix, mw_ por ejemplo. Esto evitará conflictos si otra aplicación utiliza tablas con el mismo nombre (por ejemplo user). Teclee su clave de root de MySQL en el último campo, DB root password. Esta no es la misma que su clave de root de Linux, además algunas distribuciones le permiten utilizar una clave en blanco. Ahora haga clic en Install y el script creará la base de datos, los usuarios de MySQL y de Wiki y el fichero de configuración LocalSettings.php en el directorio config. Si todo esto funciona como se planeó, verá un mensaje de éxito con un enlace al Wiki en la última línea. Antes de visitar su nueva Wiki, necesitará dar un pequeño paseo por la consola. En el directorio Mediawiki, hay que mover la nueva configuración local que se ha creado desde el directorio de

16

Número 08

Figura 2: Haga clic en el link en la parte de abajo de la pantalla de instalación final para llegar a la página principal de su nuevo Wiki.

configuración al directorio principal tecleando mv config/LocalSettings.php

Su Wiki ya está lista para usarse. El enlace mostrado en la pantalla le llevará a la página principal (ver Figura 2).

Primeros Pasos en la Wiki Haciendo clic en edit en la barra de herramientas de la parte de arriba aparece una ventana de texto, que los visitantes pueden utilizar para pasar la página con contenido en sintaxis Wiki (ver Tabla 1). Esto es texto simple con unas cuantas etiquetas de formato especial. Tecleando * al principio de una línea se permite la creación de una lista, por ejemplo, se puede poner el texto en dos, tres o cuatro conjuntos de signos iguales para usar diferentes tamaños de títulos: ==Heading==

Una línea vacía permite crear un párrafo nuevo. Pero los enlaces son las funciones más divertidas. Al contrario que los Wikis clásicos como Usemodwiki o TWiki, que se basa en la detección automática de enlaces en formato CamelCase, Mediawiki tan sólo soporta enlaces de textos libres. Mediawiki con-

WWW.LINUX-MAGAZINE.ES

vierte el texto entre corchetes en enlaces internos. Teclee [[Testpage]]

y almacene sus cambios pulsando en Save page. Mediawiki ahora le mostrará Testpage como un enlace en rojo. Pulsando sobre el enlace se abrirá otra ventana de edición, donde pueda editar una página nueva titulada Testpage. Para regresar a la página principal, cree un enlace denominado [[Mainpage]]. Este enlace se mostrará en azul, como la página ya existe. El manual de Mediawiki tiene más información para crear páginas [3]. Como Mediawiki fue desarrollado pensando en su uso para la enciclopedia, se diferencia de los Wikis tradicionales en algunos puntos. Por ejemplo, Mediawiki presenta el concepto de espacio de nombres, prefijos fijos que aparecen delante del título de la página. Hay una página de discusión para cada página de Wiki y un enlace en la barra de herramientas de la parte de arriba que le llevará allí. Cada usuario tiene una página personal (un enlace en sintaxis Wiki [[User:Name]], que le permite a un usuario hacerse una presentación propia o mantener una serie de notas. Si alguien deja un mensaje en una página de discusión de usuarios, Mediawiki informa al usuario la próxima vez que acceda a la


página. El software añade una página descriptiva con el prefijo image para imágenes y los usuarios pueden editar la página como cualquier otra página Wiki. Los usuarios pueden crear y editar páginas en el espacio de nombre Template. {{Title}} permite a los usuarios añadir el contenido de http://localhost/wiki/ index.php/Vorlage:Title a cualquier otra página.

Configuraciones La instalación estándar está bastante bien, pero probablemente preferirá personalizar su Wiki. Por ejemplo, añadiendo un logo propio, un texto de bienvenida y un skin modificado. Puede completar parte de esta configuración directamente en la Wiki, suponiendo que hace log con la cuenta de sysop creada previamente, la otra configuración incluye la edición del fichero de configuración LocalSettings.php creado durante la instalación. Las opciones de configuración están situadas en includes/DefaultSettings.php. Si quiere cambiar cualquiera de ellos, copie el valor a su configuración local y cámbielos allí, ya que DefaultSettings.php ha sido sobrescrito por las actualizaciones. Para añadir su propio logo, introduzca el path al fichero imagen en LocalSettings.php: $wgLogo = U "/path/to/your/logo.png";

Puede modificar cualquier texto del interfaz de usuario directamente en la Wiki. http://localhost/wiki/index. php/Spezial:Allmessages le muestra una lista de las páginas en el espacio de nombre MediaWiki. Cada página se corresponde a un mensaje de software, tal como Login successful. Desde MediaWiki 1.4 (y superiores) se permite a los usuarios modificar la configuración del interfaz en su propio idioma. MediaWiki sólo importa la selección del idioma por defecto desde la fase de instalación en el espacio de nombres de MediaWiki; referencias al directorio de languages para todos los otros ficheros. Pero puede modificar mensajes directamente en la Wiki como MediaWiki:Message/xx; reemplace xx con el código ISO para el idioma requerido. Los mensajes de MediaWiki también le permiten modificar los enlaces en la barra lateral. La URL http:// localhost/wiki/index.php/MediaWiki:Currentevents le permite redireccionar el enlace Current events a una página más apropiada de su Wiki. Puede utilizar las etiquetas MediaWiki:Portal y MediaWiki:Portal-url para asignar un nuevo título y dirección a su portal. Para impedir que cualquier usuario cambie la interfaz arbitrariamente, estas características están restringidas a usuarios con privilegios administrativos. En vez de crear un skin desde cero, puede usar el e s p a c i o d e n o m b re s d e M e d i a W i k i p a ra m o d i ficar la apariencia de la página. En [[MediaWiki:Monobook.css]] y [[MediaWiki:Monobook.js]] puede modificar cualquier elemento del skin estándar del Monobook utilizando


PORTADA • Mediawiki

CSS y Javascript. Las páginas correspondientes a [[User:Name/Monobook.css]] y [[User:Name/Monobook.js]] permiten a los usuarios de Wiki diseñar sus propios skins personalizados.

Imágenes Con la excepción de la característica de subida de ficheros, su instalación Wiki es ahora completamente funcional. La subida de ficheros está deshabilitada por razones de seguridad. Para permitir subir los ficheros, hay que eliminar la etiqueta de comentarios (#) en la línea # $wgDisableUploads = false;. El proceso del servidor Web necesita escribir los permisos para el directorio images: la mejor forma de hacer esto es ejecutar chown para asignar los permisos apropiados a la cuenta de usuario bajo el cual el servidor Web se ejecuta, por ejemplo, wwwdata para Debian. Definitivamente querrá impedir la ejecución de PHP y el mostrado de ficheros HTML en el directorio de subida. Las siguientes líneas en el fichero de configuración de Apache tiene esto en cuenta: <Directory U "/var/www/wiki/images/"> php_admin_flag engine off AddType text/plain U .html .htm .shtml .php </Directory>

Sólo los usuarios autenticados tienen permiso para subir ficheros. Para asegurarse de que esto funciona, utilice el enlace Create account, arriba a la derecha, para crear una cuenta de usuario o autenticarse con la cuenta de usuario creada por la instalación, WikiSysop. La barra de página a la izquierda ahora mostrará un formulario de subida. Mediawiki tan solo soporta unos cuantos tipos de ficheros por defecto. Si quiere ampliar la lista, necesita copiar los valores desde el fichero includes/ DefaultSettings.php a LocalSettings.php y ampliar la lista. Lo siguiente especifica las extensiones de ficheros válidas:

18

Número 08

$wgFileExtensions = U array( 'png', 'gif', U 'jpg', 'jpeg', 'ogg' );

Si está ejecutando su Wiki en una red local, tras un firewall y con usuarios en los que se confía, se puede deshabilitar el chequeo de tipos de ficheros especificando $wgCheckFileExtensions = U false;

Los ficheros subidos se añaden a las páginas de forma similar a las imágenes: [[Image:example]] añadirá una imagen llamada example.png, por ejemplo. Si tiene instalado ImageMagick o la librería PHP GD, puede añadir un thumbnail a la página utilizando la siguiente sintáxis: [[Image:example|thumb|30px|description]]. Haciendo clic en el thumbnail te lleva a una página de descripción de imágenes donde la imagen se describe por completo. La versión 1.4 y posteriores de Mediawiki soportan la <gallery>, que colocan las imágenes en una galería vistosa en la página: <gallery> Image:Landscape|U Description Image:Sunset.png Image:Yet Another U Image.gif </gallery>

Mediawiki registra las imágenes y los ficheros subidos de modo que sean fáciles de localizar en el registro de imágenes (Figura 3). Puede añadir enlaces a otros ficheros, que el explorador no pueda mostrar directamente utilizando [[Media:File.pdf]]. Esto le indica a Mediawiki que cree un enlace para descargar el fichero.

Control de Acceso Los wikis nacieron con dos ideas radicales novedosas: por un lado, que fueran simples de editar y por el otro, que cual-

WWW.LINUX-MAGAZINE.ES

quiera pudiese modificar las páginas de un Wiki - todo esto sin control de registro. Muchos Wikis conocidos, como la Wikipedia, la parodia alemana Kamelopedia [4] o la WikiTravel [5] guía de viajes, aún mantienen estas ideas. Estas Wikis abiertas se mantienen por una comunidad de voluntarios que comprueban las nuevas entradas y los cambios, eliminando rápidamente el spam, vandalismo y las cosas sin sentido. Características como el control de versiones y las listas de seguimiento, que permiten a los usuarios monitorizar los cambios de artículos seleccionados, hacen que Mediawiki sea fácil de mantener en Wikis abiertas. Si prefiere evitar el tener que mantener limpia su propia Wiki, puede convertir a otros usuarios en administradores. En el mundo de la gestión de derechos de Mediawiki, también denominado burocracia, puede hacerse usando la página [[Special:Makesysop]]. La cuenta creada en la instalación establece este flag. Los usuarios con cuentas administrativas pueden borrar páginas, protegerlas contra la edición por usuarios normales el enlace para hacer esto está en la barra de arriba - y bloquear a otros en páginas especiales, [[Special:blockip]]. Las entradas tienen una forma libre; el software aceptará números con los días, horas, semanas o incluso infinito para una prohibición de por vida. Por defecto, Mediawiki sólo permite a los administradores bloquear direcciones IP. Para bloquear el registro de usuarios y los rangos de direcciones IP, necesita añadir las siguientes líneas $wgSysopUserBans = U true; $wgSysopRangeBans =U true;

a LocalSettings.php. Por ahora, el spam no es sólo un inconveniente para los usuarios de correo, incluso ha empezado a surgir en la Blogosfera (el mundo de los blogs) y


Mediawiki• PORTADA

Wikis. Si intenta ejecutar un fueron desarrolladas basadas Wiki abierto, también tendrá en los requerimientos de la que comprobar el spam de enciclopedia Wikipedia, su Wiki, en forma de enlaces incluye características tales insertados, y eliminar el como líneas temporales, jeromaterial ofensivo. glíficos, la habilidad de añaPara impedir los enlaces a dir fórmulas matemáticas en spam, que ha sido diseñado sintaxis LaTeX, extensiones para mejorar el ranking de para notación musical para direcciones en los motores Lilypond y muchas otras de búsqueda, los desarrollacosas más. dores presentan una opción Si no tiene tiempo para $wgNoFollowLinks en mantener los cambios que ha Mediawiki 1.4. Esta opción realizado y los que otros está habilitada para todas las usuarios están realizando en Wikis por defecto. Le indica la Wiki, podría probar el para Mediawiki que automátiche Enotif de Thomas Gries camente asigne el atributo [9]. El parche Enotif añade rel = “nofollow” para URLs opciones de configuración a externas, impidiendo a los Mediawiki, permitiendo noticrawlers que evalúen los Figura 3: Mediawiki muestra imágenes y ficheros en una galería. ficaciones de usuarios basaenlaces de este tipo. Por das en email en el caso de supuesto, esto también afecta a enlaces que cambien sus páginas. puede limitar los accesos de lectura y legítimos: para evitar esto, puede estaLa mayoría de los administradores preescritura y la generación de cuentas en blecer $wgNofollowLinks = false; para ferirán evitar perder el tiempo en tareas Mediawiki. Las siguientes líneas en deshabilitar la opción. de gestión, como la modificación de LocalSettings.php permiten restringir el Otra alternativa es utilizar expresiones enlaces para grandes listas de páginas o acceso de escritura, de lectura y la generegulares para filtrar el spam: Mediawiki modificando textos. El PiBot [10] es un ración de cuentas: rehusará aceptar entradas que coincidan Bot escrito en Python para Mediawiki, $wgWhitelistEdit = true; con el regexp establecido en que soporta la simple creación de bots $wgWhitelistRead = U LocalSettings.php. para tareas especiales .■ $wgSpamRegex = U "/((http:\/\/(www\.|)U (spammer1.com|U spammer2.vu)/";

La utilidad de este método está restringida. Los administradores necesitan actualizar el fichero de configuración después de cada incidente y la lista de URLs bloqueadas puede crecer muy rápidamente. Tiene mucho más sentido permitir la extensión experimental SpamBlacklist [6], que Wikipedia ha estado utilizando desde diciembre. Puede descargar el SpamBlacklist desde el repositorio CVS Sourceforge para Mediawiki. La lista permite a los administradores manejar una lista negra como una página Wiki. Para evitar que los spammers eliminen sus propias direcciones, querrá bloquear la página para restringir la edición a los administradores de Wiki. Todas estas medidas de seguridad están diseñadas para Wikis abiertas. Si no tiene tiempo de comprobar su Wiki regularmente o si quiere restringir su Wiki a un grupo de usuarios cerrado,

array ( "Special:Userlogin", U "Mainpage"); $wgWhitelistAccount = U array ( 'user' => 0, 'sysop' U => 1, 'developer' => 1 );

RECURSOS [1] Wikipedia encyclopedia:http://en. wikipedia.org [2] Mediawiki: http://mediawiki.org

La primera línea en esta sección restringe el acceso de registro a los usuarios; la segunda línea especifica que páginas de usuarios que no se han registrado pueden visitarse. Querrá permitir a los visitantes anónimos ver la página de registro, pero si lo desea también puede añadir más páginas a la lista de páginas Wiki autorizadas para acceso anónimo. El array $wgWhitelist Account permite especificar a los usuarios que tienen permitido la creación de nuevas cuentas. En este ejemplo, los usuarios de Wiki necesitan el estatus de administrador o desarrollador para crear nuevas cuentas. La tercera configuración de seguridad descrita puede ser aplicada por separado.

[3] Mediawiki manual: http://en. wikipedia.org/wiki/ Wikipedia:Manual_of_Style

Extensiones

[9] Enotif: http://meta.wikimedia.org/ Email_notification_(documentation)

Ahora Mediawiki incluye una gran colección de extensiones y utilidades externas [8]. Estas extensiones y utilidades que

WWW.LINUX-MAGAZINE.ES

[4] Parodia de Wikipedia, Kamelopedia (en Alemán): http://kamelopedia.de [5] Guía de viaje wikitravel.org

Wikitravel:

http://

[6] Lista negra de Spam: http://cvs. sourceforge.net/viewcvs.py/wikipedia/ extensions/SpamBlacklist/ y http:// meta.wikimedia.org/Spam_blacklist [7] Hoja de estilos: http://meta.wikimedia. org/Gallery_of_user_styles [8] Extensiones Mediawiki y herramientas: http://meta.wikimedia.org/ Category:AMediawiki_Extensions y http://meta.wikimedia.org/ Category:MediaWiki_tools

[10] Pybot: http://sourceforge.net/ projects/pywikipediabot

Número 08

19


PORTADA • TWiki

El wiki Twiki y la empresa

CONSTRUCTOR DE EQUIPOS Un wiki puede ayudar a los grupos corporativos a cumplir los plazos y facilitar la colaboración. TWiki es líder entre los wikis de fuente abierta para la empresa y una plataforma colaborativa para la construcción de aplicaciones Web. POR PETER THOENY

os wikis se están popularizando. Quizás éste sea el año del wiki, así como el año pasado fue el año del Blog. Un wiki es muy útil para recopilar y organizar información colaborativamente. El wiki más conocido es la de la enciclopedia en línea Wikipedia [1], pero Internet está poblado por muchos sitios wiki públicos, como la Web WikiWiki original [2] de Ward Cunningham. ¿Se puede usar un wiki en una empresa? En un principio, puede parecer que un Wiki es demasiado desestructurado y caótico para el entorno corporativo. Hay también, percibido al menos, una carencia de seguridad y falta de auditoría. Sin embargo, a pesar de los escépticos, otros tantos pioneros han demostrado que un Wiki puede fucionar muy bien detrás del cortafuegos corporativo. Las intranets mantenidas por webmaster están notablemente desactualizadas. Generalmente el contenido está incompleto y encontrarlo a menudo es un desafío. También existen, a veces, inconsistencias entre departamentos. Se necesitan herramientas especiales, conocimiento y el permiso para mantener el contenido. La causa de estos problemas a veces se llama “síndrome del webmaster”: Si un empleado descubre una página con información incorrecta o escasa, probablemente no hará caso del problema por que lleva demasiado tiempo descubrir quién es el webmaster y escribirle un email solicitando una actualización.

L

20

Número 08

La aparición de los Wikis marca una cambio del paradigma desde el contenido mantenido por un webmaster al contenido mantenido por los expertos de ese área de dominio y los usuarios ocasionales. Si usted mueve todo o parte del contenido de la Intranet a un Wiki, los lectores podrán hojear el contenido como si estuvieran en un sitio Web normal y corriente, pero también se autoriza a los lectores a agregar información y arreglar problemas sobre la marcha, sin el largo proceso de solicitar y aprobar el cambio. No hay que instalar software del lado del cliente y los usuarios habituales pueden realizar cambios a través de una interfaz intuitiva con un costo mínimo para la formación y solución de problemas. Los Wikis también tienen la capacidad de perfilar y de simplificar el email. El email es un medio para “remitir y contestar”: Simplemente se están agregando cosas sin cambiar lo que ya está allí. El formato del email es bueno para los debates,

WWW.LINUX-MAGAZINE.ES


TWiki • PORTADA

Figura 1: El entorno interactivo de Twiki con; (1) Webs, (2) Cambios, (3) Búsqueda, (4) Salto, (5) Edición, (6) Enlaces, (7) Plantillas, (8) Formularios TWiki, (9) Adjuntos y (10) Versiones.

pero es difícil encontrar un “consenso boradores de contenido con una moderafinal” en un hilo. El email tampoco está da habilidad para crear sus propias aplihiperenlazado ni estructurado; el contecaciones personalizadas. nido no puede agruparse fácilmente en Los Wikis corporativos tienen algunos asuntos relacionados. El email y los requisitos especiales. Antes de impleadjuntos no tienen control de versiones, mentar un wiki en la Intranet, los admihaciendo difícil la determinación del hisnistradores de la empresa querrán certorial de un documento. Un Wiki puede ciorarse de que la herramienta proporayudar a tratar algunos de los anomalías ciona ayuda al usuario, control de verde la comunicación mediante email. siones, seguridad, facilidad de empleo, y Mejor que enviar un una interfaz para intedocumento detallado grar la herramienta por email, los usuarios con las aplicaciones pueden enviar un solo existentes en la empreemail con un enlace a sa. una versión colaboratiVarios wikis se han va del documento dendistinguido en el tro de un Wiki con conentorno corporativo trol de versiones. (Véase el Cuadro Un wiki es una herraWikis Corporativos). Figura 2: Ejemplo de marcado mienta flexible para dar Este artículo se centra TWiki. soporte a grupos de traen TWiki, un destacabajo. Esto se puede hacer a la manera de do wiki de fuente abierta que frecuenteformato libre del Wiki, con las páginas mente sirve como plataforma colaboratienlazadas que se mantienen de manera va para la construcción de aplicaciones colaborativa. También se puede lograr Web. con un uso estructurado del wiki que ¿Qué es TWiki? tenga formularios, consultas e informes adaptados a las necesidades de los TWiki es un gran proyecto de fuente empleados que son realmente quienes abierta alojado en TWiki.org [3] con utilizarán la herramienta. Vemos un muchos desarrolladores que contribuyen cambio de paradigma hacia programadocon ideas, especificaciones, código y res que crean aplicaciones para los coladocumentación. La misión de TWiki es

WWW.LINUX-MAGAZINE.ES

ser el líder de las plataformas colaborativas basadas en Web que estén enfocadas al mundo de las intranets corporativas; fomentando el flujo de información dentro de la organización; permitiendo a los equipos distribuidos trabajar juntos de manera transparente y productiva y eliminando el contenido de la Intranet obsoleto, conocido como el síndrome del webmaster. Twiki puede servir de: • Bloc de notas compartido para los proyectos; • Una herramienta de colaboración departamental; • Una herramienta de publicación para la Intranet; • Como base de conocimiento; • Una plataforma para la creación de aplicaciones basadas en Web tales como portales de noticias, sistemas de inventario y sistemas de seguimiento de incidencias. TWiki está instalado en muchos sitios Web, normalmente detrás de cortafuegos

Wikis corporativos Los Wikis de fuente abierta de categoría corporativa incluye aplicaciones tales como: • PHPWiki: Una implementación repleta de características con soporte para varias bases de datos (PHP). • Tiki: Un CMS con wiki, foros al estilo de Slashdot, blogs, galerías de imágenes, chat, etc. (PHP). • TWiki: Variante de Wiki muy destacado y plataforma de aplicaciones para la empresa, con muchos plugins (Perl). • XWiki: implementación de wiki con un amplio abanido de características compatible con algunos plugins de Twiki (Java). • ZWiki: Una implementación de wiki que funciona sobre la plataforma de aplicaciones Zope (Python).

Número 08

21


PORTADA • TWiki

permisos correctos de los archivos, permitir la autenticación y configurar una tarea en el cron para enviar notificaciones de cambios.

recibirá un email diario con enlaces a los temas que cambien en esa Web. También hay un alimentador RSS [6] para los que prefieran leer las noticias vía RSS. Los tres métoA Destacar dos permiten a los en TWiki miembros del grupo La mejor manera de mantenerse al día, corporativos. Las aprender sobre Twiki es repasar, arreglar y empresas usan Twiki explorando su interfaz aumentar el contenido porque es muy fácil de de usuario. El entorno Figura 3: Formulario TWiki en el continuamente. usar comparado con alguTwiki contiene webs y modo de edición con una lista de Twiki tiene una pannos sistemas comerciales de groupware temas. Un web es como selección. talla de búsqueda intercomo Lotus Notes. Para hacerse una idea un Wiki dentro de activa que por omisión de cuantas compañías están usando la Twiki. Cada Web es un recipiente para busca entre los temas de la Web actual plataforma Twiki, lea las historias de los temas. Un tema es una página que (Véase (3) en la Figura 1). Para los usuaéxito de Twiki [4] escritas por los autores puede ser manipulada por el usuario. La rios más lanzados, también hay una panrelacionadas con importantes empresas Figura 1 muestra el tema talla de búsqueda avanzada donde los como Disney, Motorola, SAP y Yahoo. GnuSkin-GoButton localizado en la Web usuarios pueden introducir cadenas de de Soporte en Twiki.org. Fíjese que los texto arbitrariamente complejas con Instalación Twiki nombres de la Web y de los temas se expresiones regulares. Twiki también Vaya a Twiki.org [5] y descargue la ultireflejan en la URL; en nuestro ejemplo, tiene variables [7] para crear contenido ma versión de producción de Twiki, desla URL es http://twiki.org/cgi-bin/view/ dinámicamente. Por ejemplo, una búspués descomprímala en un directorio Support/GnuSkinGoButton. Los números queda puede estar insertada dentro de temporal de su servidor. El paquete conen la Figura 1 se refieren a las caracterísun tema con un %SEARCH{...}% variatiene los siguientes directorios: ticas de Twiki sobre las que aprenderá en ble [8]. Esto se usa normalmente en las • bin: Guiones Perl para el direcesta sección. aplicaciones Web donde la cadena de torio preparado para CGI; Las webs Twiki (Véase (1) en la Figura búsqueda es suministrada mediante un • lib: Archivos con las bibliotecas 1) se hallan en la barra de navegación a parámetro URL a través de una variable de Perl; la izquierda de los temas. Cada departa%URLPARAM{"search"}%. • pub: Espacio para los archivos mento o grupo puede tener su propia El cuadro Jump (Véase (4) en la Figura adjuntos, para el directorio preWeb, cada uno con su propio espacio de 1) proporciona una navegación rápida parado para htdoc; nombres. La Web Main (Principal) y la dentro del espacio de TWiki. Si, por • data: Páginas de datos y archiWeb Twiki son especiales. La Web Main ejemplo, desea saltar al tema de la susvos de log; es la Web primaria que contiene todos cripción, teclee el nombre del tema • templates: Plantillas y pieles los grupos y los usuarios registrados. La WebNotify en el cuadro Jump y pulse la para Twiki. Web Twiki contiene toda la documentatecla intro. Si sabe que hay un tema La instalación es un proceso manual. ción de Twiki y los ajustes de configurasobre “metas” pero usted no recuerda el Siga la detallada guía de instalación de ción. nombre exacto, teclee metas para conseTwiki que encontrará en Los miembros del equipo pueden ver guir una lista de todos los temas que tenTwikiDocumentation.html, que está ubilos cambios recientes de una Web gan “metas” en el nombre. Si desea salcada en el directorio raíz del paquete haciendo click en el enlace Changes tar rápidamente a la Web de Marketing Twiki. A un administrador de sistemas (Cambios) (Véase (2) en la Figura 1). teclee Marketing. (incluyendo el punto) experimentado le debe tomar menos de También es posible suscribirse a una para saltar a la Web de Marketing (supouna hora en configurar Apache, fijar los Web desde WebNotify, en cuyo caso niendo que haya una Web con ese nombre). Como en cualquier otro Wiki, el enlace Listado 1: ejemplo de ChartPlugin más importante es el enlace “Edit” de cada página (Véase (5) en la Figura 1). El 01 %TABLE{name="exampleTable2"}% enlace Edit invita a todos a que contribu02 | *Year* | *1998* | *1999* | *2000* | *2001* |*2002* | yan al tema. TWiki tiene un sistema de 03 | Low | 8 | 10 | 13 | 17 | 22 | marcas que es fácil de aprender (Véase 04 | Target | 10 | 12 | 17 | 20 | 25 | la Figura 2). Escribir una página de Wiki 05 | High | 12 | 15 | 19 | 24 | 29 | es como escribir un email; simplemente 06 | Actual | 9 | 14 | 15 | 19 | 27 | hágalo y no se preocupe demasiado del 07 formato (el guión bajo conmuta el texto 08 %CHART{ type="combo" subtype="bar, pline, point, line" name="combo2" a itálica). Actualmente se está trabajantable="exampleTable2" data="R2:C2..R5:C6" xaxis="R1:C2..R1:C6" do en un editor WYSIWYG integrado [9]. legend= "R2:C1..R5:C1" width="225" height="200" }% Durante una sesión de edición, los temas

22

Número 08

WWW.LINUX-MAGAZINE.ES


TWiki • PORTADA

se bloquean. Si alguien intenta editar un tema cuando usted lo está editando, se le advertirá que usted está editando el tema en ese momento. El contenido relacionado con enlaces cruzados es una característica clave para la colaboración eficaz (Véase (6) en la figura 1). Nuestro cerebro funciona con asociaciones; a menudo necesitamos oír o recordar una palabra clave para recuperar la información relacionada. Un Wiki también funciona así. Se anima a la gente a que cree muchos enlaces al contenido relacionado a través de WikiWords. Las WikiWords también se conocen como palabras CamelCase (Mayúsculas Camello), son palabras que comienzan con mayúsculas y que están unidas sine spacios, por ejemplo WebCollaboration o IntranetTools. Para crear un enlace a un tema que sabe que existe, teclee su WikiWord, tal como se muestra en el ejemplo siguiente:

Listado 2: Panel de estado, iteración 2 en texto crudo 01 02 03 04

| | | |

*Start* 07:00am 11:00am 03:00pm

| | | |

*End* | 11:00am 03:00pm 07:00pm

*Primary* | *Backup* | | RichardDonkin | | | PeterThoeny | | | SamHasler | |

PalabraNuncaUsada convertido en un enlace normal. TWiki está orientado a plantillas (Véase (7) en la Figura 1). Cuando se crea un nuevo tema haciendo clic en el enlace del símbolo de interrogación, se verá un poco de texto predeterminado, normalmente una pantalla en blanco con una firma y la fecha en la última línea. Esto está definido en el extenso tema de plantillas del sistema WebTopicEditTemplate situado en la Web de TWiki. Para modificar una plantilla para una Web, hay que crear un tema del mismo nombre en esa Web. Se necesita un formulario basado en Para más info, una aplicación Web vea IntranetTools para crear temas basados en una Cuando guarde el plantilla personalizatema, la WikiWord se da. Esto se puede transformará automáhacer con un formuFigura 4: El gráfico resultante para ticamente en un enlalario HTML insertalos datos del Listado 1. ce: do en un tema de TWiki que tenga una etiqueta de entrada llamada templatetopic proporcioPara más Info, vea IntranetTools nando el nombre del tema de la plantilla [10]. Nótese, que al contrario que en HTML, Agregando entradas basadas en forno necesita especificar un enlace. TWiki mularios al contenido que no lo tiene lo hace automáticamente cuando reco(Véase (8) en la Figura 1), se pueden noce una WikiWord. ¿Qué sucede si se estructurar los temas sin límite, localiteclea una WikiWord pero es una zarlos fácilmente mediante búsquedas e PalabraNuncaUsada? Es decir no existe introducir aplicaciones basadas en flujo un tema con ese nombre. El sistema de trabajo. Cuando los formularios están reconoce la WikiWord y le invita a que habilitados en una Web y se selecciona cree el tema poniendo un enlace con un un tema, aparece un sencillo formulario signo de interrogación detrás de la palaen el modo de edición debajo del área de bra. Para crear ese tema, hay que hacer edición principal del tema. Es decir se click en el enlace, teclear algo de texto y obtiene el contenido libre sin formulasalvarlo. Si se vuelve al tema y se rios y no estructurado de Wiki arriba y el pulsa en refrescar, se verá

WWW.LINUX-MAGAZINE.ES

contenido estructurado con campos de edición, botones de radio, cajas de verificación y listas de selección en la parte de abajo de la pantalla de edición. El contenido del formulario se crea como una tabla cuando se muestra en la página de presentación. Por ejemplo, la aplicación del sistema de seguimiento de soporte en TWiki.org utiliza un Formulario TWiki para flujo de trabajo, como el siguiente: 1. Alguien rellena un formulario en la Web de Soporte, preguntando por un asunto relacionado con la ayuda [11]. 2. La aplicación crea un nuevo tema con el contenido del formulario. El tema también tiene un formulario Twiki con un campo llamado SupportStatus (Estado de la ayuda) con el valor AskedQuestions (Preguntas Realizadas). Esto indica que se trata de una pregunta nueva. 3. En la página de inicio de Soporte se listan todos los temas que están marcados como AskedQuestions. Esto se hace con un %SEARCH{}% insertado. 4. Alguien ve la cuestión planteada y decide trabajar sobre ella. Edita el tema. En el fondo es el formulario Twiki mostrando una lista de selección con AskedQuestions marcado (Véase la Figura 3). Lo cambia a AssignedQuestions (Preguntas asignadas) y añade algún contenido al tema. 5. Ahora, la Web de Soporte lista este tema en la lista Assigned (Asignado). 6. Una vez encontrada la repuesta, vuelve a editar el tema y cambia su estado a AnsweredQuestions (Preguntas Contestadas). 7. Ahora, la Web de Soporte lista este tema en la lista Answered (Respondidas). Para saber más sobre el proceso de creación de aplicaciones basadas en

Número 08

23


PORTADA • TWiki

Listado 3: Panel de estado, iteración 3 en texto crudo 01 %EDITTABLE{ header="on" format="| select, 1, , 07:00am, 07:30am, 08:00am, 08:30am, 09:00am, 09:30am, 10:00am, 10:30am, 11:00am, 11:30am, 12:00pm, 12:30pm, 01:00pm, 01:30pm, 02:00pm, 02:30pm, 03:00pm, 03:30pm, 04:00pm, 04:30pm, 05:00pm, 05:30pm, 06:00pm, 06:30pm, 07:00pm | select, 1, , 07:00am, 07:30am, 08:00am, 08:30am, 09:00am, 09:30am, 10:00am, 10:30am, 11:00am, 11:30am, 12:00pm, 12:30pm, 01:00pm, 01:30pm, 02:00pm, 02:30pm, 03:00pm, 03:30pm, 04:00pm, 04:30pm, 05:00pm, 05:30pm, 06:00pm, 06:30pm, 07:00pm | select, 1, , ArthurClemens, ColasNahaboo, PeterThoeny, RichardDonkin, SamHasler, SvenDowideit | text, 20 | text, 40 |" changerows="off" }% 02 | *Start* | *End* | *Primary* | *Backup* | *Comments* | 03 | 07:00am | 11:00am | Main.RichardDonkin | | | 04 | 11:00am | 03:00pm | Main.PeterThoeny | | | 05 | 03:00pm | 07:00pm | Main.SamHasler | | |

Formularios Twiki, véase la documentación al respecto [12]. Cada tema puede tener uno o más archivos adjuntos de cualquier tipo, adjuntados a través de la pantalla Attach [13] para cargar (o descargar) archivos desde la máquina local (Véase (9) en la Figura 1). Los archivos adjuntos se pueden utilizar para crear potentes aplicaciones personalizadas como solución de groupware, tales como archivos compartidos y sistemas de gestión documental. En nuestro ejemplo de la Web de Soporte, la solución a una pregunta podría ser un archivo de parche adjuntado al tema. Es decir, se puede organizar el contenido de una forma lógica, adjuntando los archivos a los temas. Se acabó preocuparse por que se rompan los enlaces al sitio FTP después de una reestructuración del contenido. Todo el contenido de los temas y los archivos adjuntos están bajo el sistema de control de versiones (Véase (10) en la Figura 1). Siempre se podrá saber quién cambio qué y se puede recuperar el contenido antiguo en cualquier momento. El control de versiones es transparente al usuario. Se realiza automáticamente, no hay que activar ninguna opción. Un rasgo especial de las características del

24

Número 08

control de versiones es que se puede editar y guardar un tema tantas veces como se desee, que no se creará una nueva versión si todo este trabajo se realiza en una ventana de tiempo de una hora. Esto es una característica muy útil cuando se eliminan errores tipográficos y otros tipos de cambios menores. Twiki también ofrece control de accesos [14]. Se puede limitar el acceso a un tema o a una Web completa, a un usuario en particular o a un grupo, en tres áreas: ver, editar y renombrar. El control de acceso permite crear y gestionar un sistema de privilegios muy detallado de una manera fácil y flexible. La esencia de la cultura Wiki es la edición de estilo libre y abierta. Hay que tener cuidado cuando se tienen que tomar decisiones para restringir el acceso de lectura o escritura a una Web o a un tema. Cuanto más restricciones se apliquen, menos Wiki se obtiene. La experiencia indica que un acceso de escritura sin restricciones funciona muy bien porque: • La influencia de los compañeros es suficiente para asegurar que sólo se envía contenido relevante. • La edición compañera (la posibilidad de que alguien reubique

WWW.LINUX-MAGAZINE.ES

todo el contenido en una página) mantiene la atención en el tema. • El contenido se guarda de manera transparente mediante el control de versiones, que suministra una “seguridad débil”. Si es necesario se pueden deshacer las ediciones. Se motiva a los usuarios a que editen y revisen (abreviando los temas largos). Planifique la presentación y el contenido antes de anunciar su TWiki: • Seleccione un área donde Twiki pueda ayudarle sobre todo como analgésico (los usuarios se sienten aliviados), no como vitamina (buenas para la prevención). • Construya la estructura inicial y colonícela con la ayuda de algunos pioneros. • Haga la presentación inicial para un grupo pequeño. Algunos equipos verán cómo funciona y tratarán de aplicarlo a sus necesidades. • Entrene y guíe a los usuarios. Dirija a los nuevos usuarios a WelcomeGuest [15] y realice la presentación ATasteOfTWiki [16].

Plugins para Twiki Los plugins para Twiki incrementan la funcionalidad de Twiki. Los usuarios no necesitan instalar nada: los plugins son instalados por el administrador en el servidor donde se aloja Twiki. Se puede encontrar un repositorio de plugins cada vez mayor en Twiki.org [17]. Existe 160 plugins para su descarga. Los plugins son una manera estupenda para que los administradores y los desarrolladores Web ajusten Twiki a sus necesidades. Algunos de los plugins más populares son: • ActionTrackerPlugin: Realiza un resumen de la actividad de los


TWiki • PORTADA

elementos y lo envía por email. • CalendarPlugin: Crea calendarios mensuales con los eventos. • ChartPlugin: Le permite crear gráficos para visualizar las tablas de Twiki. • DatabasePlugin: Permite el acceso a base de datos relacionales. • EditTablePlugin: Permite editar tablas Twiki utilizando campos de edición, recolectores de datos y menús desplegables. • HeadlinesPlugin: Muestra noticias basadas en alimentadores RSS. • TablePlugin: Controla los atributos de las tablas y facilita la ordenación de las columnas de la tabla. • TWikiDrawPlugin: Le permite usar un Applet Java para crear dibujos editables insertados en los temas. • SlideShowPlugin: Convierte una página Twiki en una presentación basada en Web. SpreadsheetPlugin es un plugin preinstalado con capacidades de hoja de cálculo. Hay disponibles más de 60 fórmulas, tales como $AVERAGE(), $IF(), $REPLACE(), $TIME(), $SET() y $GET(). Una formula puede estar en cualquier parte de un tema, no solamente en una tabla. Por ejemplo %CALC{"$PROPERSPACE(LinuxMagazine)"}% devolverá Linux Magazine. Las aplicaciones Web normalmente utilizan la fórmula $IF() para producir texto condicionalmente. El plugin ChartPlugin crea gráficos PNG o GIF para visualizar las tablas Twiki usando una escala lineal u, opcionalmente, una escala semilogarítmica. El Listado 1 da como resultado la Figura 4.

Sencilla Aplicación Web

nica del panel de estado del centro de llamadas? Todo el mundo podría ver quien está disponible en cada momento y sería muy fácil cambiar el panel de estado. Normalmente una aplicación wiki se va realizando por iteraciones. Comienza fácil y se mejora incrementalmente. En la primera iteración, se crea un tema sólo con los asteriscos: * 07:00am - 11:00am: Ricardo * 11:00am - 03:00pm: Pedro * 03:00pm - 07:00pm: Santiago

El tema satisface los requisitos: todos pueden ver el panel de estado y actualizarlo. Hagámoslo más útil convirtiendo los asteriscos en una tabla y utilizando WikiWord para enlazar con las páginas de los miembros del grupo para una mejor referencia. Además añadimos una columna con las personas de reserva (véase el listado 2). Ahora lo haremos más orientado al usuario. Usaremos EditTablePlugin para que los usuarios puedan seleccionar los horarios y los nombres desde una lista (véase el listado 3). El modo de vista y el modo de edición son el resultado del texto crudo del Listado 3 y se muestra en la Figura 5, respectivamente. El panel de estado del centro de llamadas es una aplicación muy sencilla que hace exactamente lo que el usuario necesita. Se pueden crear aplicaciones más sofisticadas con formularios Twiki, búsquedas insertadas y algo de HTML para aglutinar todas las piezas. Un ejemplo es el directorio de instalaciones de Twiki [18]. Todas las instalaciones se listan en una gran tabla. Se puede aplicar un filtro a la lista, por ejemplo, sólo las instalaciones corporativas que están detrás de un cortafuegos. Se puede pedir prestado las fuentes para sus propias aplicaciones. Sugerencia: Para ver el texto en crudo de un tema de una Twiki, añada ?raw=on a la URL.

Visualice este escenario: El gerente del centro de llamadas de atención al cliente mantiene un registro del horario asignado a los ingenieros en una hoja de calculo. Se coloca un listado de la impresora en la pared para Figura 5: Iteración 3 del panel de estado en el modo de que todos lo vean ¿Se puede edición. construir una versión electró-

WWW.LINUX-MAGAZINE.ES

Conclusión TWiki es una poderosa plataforma para la colaboración y el desarrollo Web. La plataforma Twiki soporta el contenido compartido y libre de formato, al estilo wiki. Planifique la presentación de su wiki cuidadosamente y facilite la formación a los usuarios. Verá un aumento del interés, cuando ■ la gente “le coja el truco”.

RECURSOS [1] Wikipedia: http://es.wikipedia.org/ wiki/Main_Page [2] WikiWikiWeb: http://c2.com/cgi/ wiki?WelcomeVisitors [3] TWiki.org: http://twiki.org/ [4] Historias de éxito con TWiki: http:// TWiki.org/cgi-bin/view/Main/ TWikiSuccessStories [5] Descarga de TWiki: http://twiki.org/ download.html [6] Documentación sobre el alimentador RSS: http://twiki.org/cgi-bin/view/ TWiki/WebRssBase [7] Variables en TWiki: http://twiki.org/ cgi-bin/view/TWiki/TWikiVariables [8] Variable %SEARCH{}% en TWiki: http://twiki.org/cgi-bin/view/TWiki/ TWikiSearch [9] Integración del editor WYSIWYG Kupu: http://twiki.org/cgi-bin/view/ Plugins/KupuEditorAddOn [10] Plantillas en TWiki: http://twiki.org/ cgi-bin/view/TWiki/TWikiTemplates [11] Web de soporte para TWiki.org: http://twiki.org/cgi-bin/view/Support/ WebHome [12] Formularios en TWiki: http://twiki.org/ cgi-bin/view/TWiki/TWikiForms [13] Ficheros adjuntos: http://twiki.org/ cgi-bin/view/TWiki/FileAttachment [14] Control de acceso: http://twiki.org/ cgi-bin/view/TWiki/ TWikiAccessControl [15] Bienvenida invitado: http://twiki.org/ cgi-bin/view/TWiki/WelcomeGuest [16] Presentación de ‘A Taste of Twiki’: http://twiki.org/cgi-bin/view/TWiki/ ATasteOfTWiki [17] Archivo de Plugins para TWiki.org: http://twiki.org/cgi-bin/view/Plugins/ WebHome [18] Listado de instalaciones de TWiki: http://twiki.org/cgi-bin/view/Main/ TWikiInstallation

Número 08

25


PORTADA • Drupal

Drupal, Drupal, el el gestor gestor de de contenido contenido para para portales portales

GOTAS EN LA RED

está bajo licencia GNU General Public License (GPL) y puede por tanto usarse libremente, modificarse y distribuirse. El cuadro titulado “El nacimiento de Drupal” nos ofrece una breve resumen de la historia de Drupal y explica por qué se le dio ese nombre. Drupal no es difícil de instalar, sin embargo, no es tan sencillo como podría esperarse si estamos habituados a otros sistemas CMS. Los usuarios de Debian pueden simplemente teclear apt-get update && apt-get install drupal (y responder a la información de configuración que nos solicite). Si no usamos Debian, tanto lujo no está disponible, y deberemos pasar por el proceso de instalación manual.

El gestor de contenido Drupal, basado en PHP, facilita las labores con páginas dinámicas. Su sistema modular permite ampliaciones sencillas y su apariencia está basada en plantillas. En este artículo, profundizaremos en su abanico de funciones y trataremos la instalación y configuración básica. POR UWE HERMANN

Fácil Configuración

L

os portales son algunos de los sitios más visitados en Internet. Los usuarios se registran y pueden contribuir con artículos o comentarios de una gran variedad de temas. Drupal [1] se diseñó en origen para estas tareas y nos ofrece todo lo que podamos necesitar para poner en marcha un magnífico portal Pero por encima de todo, Drupal es un completo sistema de gestión de contenidos capaz de soportar un amplio abanico de páginas Web, desde simples weblogs a páginas profesionales para empresas. Drupal está escrito en PHP y usa una base de datos para guardar los contenidos. El código fuente completo del sistema

26

Número 08

Los requerimientos son los habituales: un servidor Web (mejor Apache, aunque también serviría IIS si no hay más remedio) y PHP Version 4.1 o posterior. PHP 5 no está completamente soportado en el momento de escribir este artículo, aunque los desarrolladores están trabajando en solventar los problemas de compatibilidad. Necesitaremos fijar la opción session.save_handler user para PHP, y los desarrolladores también recomiendan session.cache_limiter none. Ambas opciones pueden fijarse en el fichero de configuración php.ini. Sin embargo, Dupal nos ofrece el archivo .htaccess con

WWW.LINUX-MAGAZINE.ES


Drupal • PORTADA

esas opciones y una selección de adecuadas opciones por defecto. Drupal necesita además una base de datos. El CMS soporta tanto MySQL Versión 3 (preferiblemente la 3.23.17 o posterior), 4 y PostgreSQL. Para características que necesiten XML, como RSS o la API Blogger, PHP necesitará las extensiones XML, que típicamente forman parte de la configuración por defecto. La característica “Clean URLs” adicionalmente requiere el módulo de Apache mod_rewrite y permisos para usar los archivos .htaccess. Para que funcione, debemos evitar fijar la directiva AllowOverride de Apache como None para el directorio de Drupal. Esta característica renueva las URLs del tipo http://

Resolución de Problemas Muchas problemas de instalación son fáciles de evitar: • Un error común es asignar el valor de localhost a la variable $base_url en el archivo includes/conf.php aunque Drupal no esté ejecutándose localmente sino en un dominio con conexión. En este caso, la línea debería ser algo como $base_url = “http:// www.example.com”. Si nuestra DNS o nombre del servidor no funcionan adecuadamente, podemos especificar aquí una dirección IP. • Otro error común es especificar una ruta incorrecta del servidor. Si Drupal no está instalado en /var/www sino en /var/www/drupal, por ejemplo, la entrada debería ser $base_url = “http://www.example.com/drupal”. • La variable $base_url no debe terminar en una barra /. En otras palabras: tenemos que poner http://www. example.com PERO NUNCA http:// www.example.com/. • Si se nos asigna una cuenta MySQL, una contraseña y una base de datos por parte de nuestro proveedor, debemos obviar el paso GRANT y los pasos de creación de bases de datos. Usaremos los valores asignados por nuestro proveedor en lugar de drupaluser, secret y drupal. En caso de problemas en la instalación, debemos comprobar los archivos en la página Web de Drupal [1], los foros de Drupal [3] y las listas de correo [4]. Los habitan un grupo de amables y competentes desarrolladores que estarán encantados de ayudarnos.

www.example. com?q=node/34 a algo como http:// www.example. com/node/34, para mejorar la comprensibilidad y facilitar la indexación de la página por los bots de los buscadores. Si queremos optimizar nuestra página para dichos bots, puede que queramos habilitar el SFigura 1: Los bloques ofrecen a los usuarios de la página información módulo path, que adicional. Se muestran de izquierda a derecha en todas las páginas (o permite asignar bien en las especificadas por expresiones regulares [5] en la ruta). una URL arbitraria (y comprensible) a cada nodo. Con esto mysql> FLUSH PRIVILEGES; tendremos URLs como http://www. example.com/contacts en vez de http:// Con esto tendremos una base de datos www.example.com/node/123. llamada drupal. La base de datos de usuario, drupaluser, a la que se ha asigConfiguración de Base de nado el password secret, tiene permisos Datos completos para todas las tablas de la Incluso los webmasters inexpertos con base de datos. Podemos presionar poca experiencia en Linux no deberían [Ctrl]+[D] para salir de la sesión shell tener problemas para instalar Drupal vía de MySQL. FTP y PhpMyAdmin. Los pasos siguienEl archivo database/database.pgsql en tes son necesarios para instalar Drupal el directorio de instalación de Drupal en un servidor Web con acceso SSH o en contiene el esquema de definición de una máquina local. Después de descaruna base de datos PostgreSQL. La congar la versión actual (la 4.5.2 en el traparte MySQL es database/ momento de escribir estas líneas) desde database.mysql. Podemos redirigir el http://drupal.org, tecleamos los siguienarchivo a la consola para analizarlo: tes comandos para descomprimir el archivo y mover su contenido al directo$ mysql -u drupaluser -p drupalU rio raíz de documentos del servido Web, < /var/www/database/U /var/www en nuestro ejemplo: database.mysql tar xfvz drupal-4.5.2.tar.gz mv drupal-4.5.2/* U drupal-4.5.2/.htaccess U /var/www

Los siguientes sentencias MySQL, mysqladmin y mysql, configuran una base de datos y una base de datos de usuario: $ mysqladmin -u root -p U create drupal Enter password: $ mysql -u root -p mysql> GRANT ALL PRIVILEGES ON U drupal.* TO U drupaluser@localhost U IDENTIFIED BY 'secret';

WWW.LINUX-MAGAZINE.ES

Si mysql no da error llegados a este punto, podemos suponer que todo ha ido conforme a lo planeado. Para completar la instalación, necesitamos hacer unas modificaciones en los datos de acceso de MySQL y el directorio Drupal en el archivo (increiblemente legible) includes/conf.php. Las variables que necesitamos son $db_url y $base_url. Les asignamos los siguientes valores en nuestro ejemplo: $db_url = "mysql://drupaluser:U secret@localhost/drupal"; $base_url = "http://localhost";

La primera línea permite que Drupal sepa el tipo de base de dato (mysql en

Número 08

27


PORTADA • Drupal

Figura 2: Drupal puede extenderse en tiempo de ejecución con una gran colección de módulos.

nuestro ejemplo), el usuario, la contraseña, el host de la base de datos y el nombre de la base de datos. La segunda línea especifica la ruta visible de Drupal para los visitantes a la página Web. Nuestra nueva instalación Drupal estará ya accesible en http://localhost. La primera cosa que deberíamos hacer es configurar un usuario de Drupal. Este usuario será el administrador y tendrá todos los permisos para la configuración y administración de la página Web, sin importar el nombre que asignemos. Si encontramos problemas en el proceso de instalación, hemos de revisar el cuadro “Solución de Problemas”, donde encontraremos consejos y una exposición de los problemas más habituales y sus soluciones. La terminología de Drupal difiere de la de otros gestores de contenido. La siguiente sección explora las partes más importantes de un sistema Drupal y explica los términos más relevantes. Un nodo es el bloque básico con el que construimos una página Web con Drupal. Un nodo puede ser un artículo, una imagen o una entrada de un foro. Los siguientes tipos de nodo se habilitan por defecto: page para páginas estáticas y story para artículos. Podemos añadir más tipos de nodos instalando y habilitando módulos. Por ejemplo, el módulo forum define un nuevo tipo de nodo llamado forum topic. El módulo blog nos ofrece el nodo tipo personal blog entry. El menú de administración nos da una lista de los tipos de nodo en create content.

Construcción de Bloques Un bloque es una cuadro con contenido arbitrario que aparece a la izquierda o derecha en una página Web. Drupal nos ofrece varios bloques preconfigurados,

28

Número 08

como User Login, Who’s online o Recent Comments. Adicionalmente, cualquier nuevo módulo que se instale puede proporcionar bloques, que habilitará en su caso el administrador (véase la Figura 1). El administrador puede también definir bloques nuevos que contengan o bien HTML, o bien texto, o (para contenido más complejo) código PHP y consultas a bases de datos SQL. El campo Custom de cada bloque especifica si al usuario que haya iniciado una sesión en la página Web se le permite habilitar y/o deshabilitar bloques, modificando así la apariencia de la página Web (contrariamente a la configuración por defecto). El repositorio Custom Blocks Repository de la página Web de Drupal tiene una muy útil colección de bloques. Drupal es modular: el sistema en sí sólo proporciona un sistema de características básicas, que es extensible fácilmente con la ayuda de los módulos (véase Figura 2). Un módulo normalmente se compone de un archivo PHP llamado nombremodulo.module y otros archivos opcionales como imágenes u hojas de estilo. El área de descarga de la página Web de Drupal [6] tiene una enorme selección de módulos que cubren una amplia gama de nuevas características (véase Tablas 1 y 2). La terminología de Drupal necesita cierta explicación. Usa vocabulario y términos para crear lo que la mayoría de la gente llamaría una categoría. Cada vocabulario tiene un nombre (por ejemplo Topic) y, habitualmente, muchos términos que aparecen dentro de ese vocabulario (por ejemplo Política, Deporte o Tecnología). Podemos definir los vocabularios que queramos para una página Web y asignarle nodos a categorías específicas o términos de esos vocabularios. Este sistema es flexible y aplicable a muchos contextos. Por ejemplo, jerarquías dentro de foros o galerías de imágenes se modelan según la terminología de Drupal. Los llamados themes permiten al administrador ofrecer distintas vistas de la página Web (véase Figura 3). Existe un gran número de temas ya preparados disponibles para su descarga desde [6], y no es difícil modificarlos a nuestro gusto. Drupal Theme Garden [7] lista un gran número de temas que podemos probar sin necesidad de instalar nada. Drupal implementa un sistema de administración basado en usuarios, roles

WWW.LINUX-MAGAZINE.ES

El Nacimiento de Drupal Dries Buytaert[2], un informático belga y autor original de Drupal, comenzó a desarrollar un gestor de contenidos (también llamado CMS) para páginas dinámicas en el año 2000. El sistema pretendía dar soporte a una comunidad weblog, la cual Dries quiso llamar Dorp. (“Dorp” significa pueblo en holandés). Al comprobar la disponibilidad del dominio dorp.org, Dries tecleó mal e introdujo “drop.org” en su lugar. Le gustó tanto el nombre que decidió registrar el dominio drop.org y renombrar su CMS como Drupal. (“Drupal” es la pronunciación en inglés de la palabra gota en holandés, “Druppel”). Cinco años más tarde, Drupal ha crecido hasta convertirse en un gestor de contenido maduro y flexible, con cientos de desarrolladores trabajando en sus mejoras y extensiones.

y permisos. Un usuario registrado puede iniciar una sesión en una página Web. El usuario tiene entonces un buen número de opciones, dependiendo de los roles asignados a ese usuario y los permisos asignados por el administrador a esos roles. La sección de administración de usuarios entrará más en detalle un poco más adelante. A los usuarios inscritos se les permite crear contenido (create content) o nodos para la página Web seleccionando un item menú. Dependiendo de los módulos activos, los contenidos pueden ser artículos, anotaciones de blog, imágenes, encuestas y muchas otras cosas. La Figura 4 muestra cómo crear un nodo page. Cada nodo puede tener al menos un título y el contenido o body. Si el módulo path está habilitado, el usuario puede asignar una URL intuitiva al nodo. Existen muchas otras configuraciones para los nodos, por ejemplo si los comentarios están permitidos o no, si el nodo aparece en la página principal y si el nodo debería estar encima del nodo lista (sticky). El cuadro published ofrece al administrador la posibilidad de borrar nodos individuales de la página en cualquier momento. Los nodos se mantienen en la base de datos y pueden volver a habilitarse cuando se desee. Para borrar un nodo, pulsamos en delete en la página edit. La configuración crítica es accesible a través del menú de administración en


Drupal • PORTADA

Figura 3:Los temas permiten al administrador (e incluso a los usuarios normales si así lo deseamos) modificar la apariencia de la página Web.

administer | settings (ver Figura 5). Aquí es donde configuraremos el nombre de la página, un eslogan opcional, la dirección de email del administrador, un pie de página (un aviso de copyright por ejemplo), etc. La página Default front page es la que se muestra en primer lugar cuando se accede a la página Web. Es un nodo por defecto. En otras palabras, una lista de los últimos artículos o nodos (pero sólo aquellos artículos o nodos que han sido promocionados a la página principal, Promoted to front page). No tendremos ningún artículo justo tras instalar Drupal. En su lugar, se nos mostrará un pequeño texto de ayuda para los administradores. El mecanismo de cacheo de Drupal nos proporciona un rendimiento óptimo. Cachea cualquier página diseñada para acceso anónimo (es decir, para la cual el usuario no tenga que inscribirse) a la base de datos, para evitar tener que generar la página varias veces sobre la marcha. En este menú es también donde habilitamos la característica Clean URLs, que se comentó anteriormente. Algunos módulos añaden sus propias configuraciones como subentradas en administer | settings. Por ejemplo, el módulo de estadísticas añade una entrada de menú en administer | settings | statistics. Adentrarnos en los detalles está fuera del alcance de este artículo: se aconseja acudir al manual de Drupal [8] si se necesita más información.

Planificación de Tareas Las tareas repetitivas en Drupal recaen en un demonio cron externo o bien en

Figura 4: Tenemos un gran número de opciones a la hora de crear un nodo (la imagen muestra una nodo para crear una página).

llamadas a http://www.example.com/ cron.php. Esta URL dispara acciones que se repiten regularmente en Drupal, como por ejemplo, el borrado de entradas de log obsoletas o actualizaciones de los índices de búsqueda. Puede accederse a la página usando cualquier cliente Web en línea de comando, wget o lynx por ejemplo. La siguiente línea en /etc/crontab realizaría la tarea: 0 * * * * root U /usr/bin/wget -o /dev/null U -O /dev/null U http://www.example.com/cron.php

Este ejemplo ejecuta cron.php cada hora en punto (nótese que la URL debe ser el dominio de la página Web y no el servidor local o 127.0.0.1, incluso si el demonio cron esta ejecutándose en nuestra máquina local). Si no tenemos un demonio cron, no tenemos que preocuparnos: siempre podremos recurrir al módulo poormanscron [9], al que nos referiremos un poco más adelante.

settings: Los administradores pueden usar esta entrada para especificar quién esta autorizado para crear nuevos usuarios, ya sea registrándose ellos mismos o si tienen que habilitarse las cuentas manualmente. El administrador puede también habilitar a los usuarios a subir imágenes al servidor, que serán mostradas en las entradas de los foros. access rules: Los administradores pueden prohibir ciertos nombres de usuario o direcciones de correo (si son injuriosas u obscenas, por ejemplo), con definir una o múltiples reglas que contengan los comodines “%”(ningún o más caracteres) y “_”(exactamente un carácter). roles: Podremos asignar a los usuarios uno o más roles. Los roles por defec-

Administración de Usuarios Encontraremos una lista de usuarios conectados incritos en administer | users. Los administradores podrán verificar las configuraciones y pulsar en el enlace link para modificarlas. Por ejemplo, si un usuario se porta mal, podemos deshabilitar su cuenta de usuario. Los administradores pueden usar los submenús de administer | users | configure para crear usuarios nuevos y definir reglas genéricas y privilegios para cuentas de usuario:

WWW.LINUX-MAGAZINE.ES

Número 08

29


PORTADA • Drupal

to son anonymous user para usuarios no inscritos (incluyendo las arañas y bots de los buscadores) y authenticated user para usuarios inscritos. El administrador puede definir cualquier número de roles adicionales y asignarles nombres arbitrarios. Por ejemplo, roles como administrador del foro, editor o cliente son bastante típicos. • permissions: Cada rol se enlaza a un conjunto de permisos, que se definen por el administrador. Por ejemplo, post comments permite a los usuarios postear comentarios. Teóricamente, cualquier módulo puede añadir permisos nuevos a esta lista (véase Figura 6). Por ejemplo, el módulo poll añade el permiso create polls que permite al usuario crear encuestas y el permiso vote on polls que permite votar. Estas opciones ofrecen al administrador herramientas extremadamente flexibles para cubrir una amplia gama de escenarios, desde una página del tipo Barrapunto, donde la mayoría de los usuarios sólo pueden añadir comentarios, a una intranet empresarial con diferentes permisos para los trabajadores normales, los jefes de departamento, proveedores, etc.

Instalación Módulos

de

Nuevos

Drupal no es un sistema monolítico sino que se puede expandir en modo de ejecución gracias a los módulos. La instalación por defecto nos ofrece una buena selección de módulos, aunque no todos ellos están habilitados. Adicionalmente, existe una colección de más de 100 módulos disponibles en la página Web de Drupal, todos ellos

30

Número 08

creados por la comunidad de desarrolladores y guardados en repositorios CSV [10], donde continúan desarrollándose. Por supuesto, todos estos módulos están bajo licencia GPL. Instalar módulos es menos cómodo que lo que uno hubiera deseado, al igual que instalar el propio Drupal. Además, los pasos para instalar cada módulo pueden ser diferentes, aunque existe un estándar de facto que empieza a establecerse y muchos módulos lo siguen. Instalaremos los módulos poormanscron y image como ejemplos. El módulo poormanscron es un sustituto de cron. Drupal ejecuta el módulo cada vez que se accede a la página si ha transcurrido un intervalo de tiempo (configurable). Entonces, ejecuta las acciones incluidas en cron.php y resetea el contador a cero. Este módulo es útil si nuestro proveedor Web no nos ofrece acceso cron. Los pasos para instalarlo son fáciles: $ wget http://drupal.orgU /files/projects/ poormanscron-4.5.0.tar.gz $ tar xfvz U

poormanscron-4.5.0.tar.gz poormanscron/ poormanscron/LICENSE.txt poormanscron/README.txt poormanscron/poormanscron.module $ cp poormanscron/U poormanscron.module /var/www/modules

El módulo comprende un sólo archivo, poormanscron.module, que sólo debemos de situar en el directorio modules de la instalación de Drupal, y luego habilitarlo en administer | modules. La configuración para este módulo la encontramos en administer | settings | poormanscron. El módulo image es interesante para la mayoría de páginas Web, ya que soporta la subida de imágenes y su administración. El módulo requiere ImageMagick, GD, o ImLib2. Al menos una de estas herramientas debería estar disponibles en el servidor Web. Después de descargar y descomprimir el paquete tar, el administrador necesita modificar la base de datos analizando el archivo SQL image.sql. A continuación se copian los archivos al directorio modules para la instalación:

Tabla 1: Módulos Nativos de Drupal Módulo aggregator

ping search statistics throttle watchdog atom dba flexinode

print trackback

scheduler htmlarea

Descripción Permite a los administradores leer fuentes RSS de otras páginas Web o weblogs y mostrar esta información en bloques. En caso de cambios en los contenidos de servicios que nos interesen, como technorati.com, weblogs.com o blo.gs. Muy útil para weblogs. Soporta la búsqueda en los nodos por palabras clave. Requiere un cron que actualice el índice. Genera estadísticas de visitas a la página Web. Guarda las direcciones IP, refe rencias, número de visitas, etc. Este módulo desactiva algunos módulos y bloques en escenarios de carga ele vada para mejorar el rendimiento. Requiere el módulo statistics Guarda un log de todos los eventos de la página Web, por ejemplo, login del usuario, quién creó contenido y cuándo, mensajes de error y mucho más. Genera un feed atom (Versión 0.39). Descarga disponible en http://localhost/ atom/feed. Herramienta básica para el mantenimiento de bases de datos en Drupal. En muchas ocasiones nos ahorrará tener que ejecutar PhpMyAdmin o similares. Soporta la definición de formatos de contenido más o menos arbitrario. Por ejemplo, podemos usar esto para definir un nodo de introducción de recetas: nombre, ingredientes, cantidades, trucos durante la preparación, etc., usando simplemente señalar y pulsar. Crea una página Link printer friendly para cada nodo, que proporciona una vista adecuada para su impresión. Obligado para bloggers. Permite a otros bloggers enviarnos los llamados trackbacks a nuestra página Web, y a nosotros enviar los nuestros a otros blogs. Proporciona contenido para lanzar en una fecha u hora específica. Proporciona una sencilla y vistosa edición de texto basada en JavaScript.

WWW.LINUX-MAGAZINE.ES


Drupal • PORTADA

Figura 5: El menú de administración: administer | settings.

$ wget http://drupal.orgU /files/projects/U image-4.5.0.tar.gz $ tar xfvz image-4.5.0.tar.gz [...] $ mysql -u drupaluser -p U drupal < image/image.sql $ mkdir /var/www/modules/image $ cp image/image.module U image/image.inc U /var/www/modules/image

El siguiente paso es habilitar el módulo en administer | modules y acceder a administer | settings | image para configurar el módulo. Por ejemplo, se necesitan directorios para las imágenes y para las miniaturas, y seguramente la ruta al programa convert de ImageMagick, usualmente en /usr/bin/convert. Podemos crear así mismo galerías de imágenes en administer | categories. Para ello, creamos un vocabulario con uno o múltiples términos. Entonces introducimos el vocabulario como Gallery Navigation Vocabulary (de nuevo en administer | settings | image). Por último, en administer | users | configure | permissions, seleccionamos los usuarios o roles a los que se les permitirá subir o administar imágenes. Esto permite a los usuarios con los permisos adecuados crear nuevas imágenes seleccionando create content en el menú de administración.

Perspectivas La próxima versión de Drupal, la 4.6, es inminente y traerá un buen número de cambios interesantes. Incluirá una función de búsqueda ampliamente mejorada, con codificación UTF-8 para

Figura 6: Cada rol se mapea en un juego de reglas.

proporcionar soporte multilenguaje. Varias mejoras en cuanto a la usabilidad de los menús harán la vida más cómoda al administrador. El nuevo módulo contact proporcionará a los usuarios inscritos un formulario para enviar correos electrónicos a otros usuarios. La configuración multi-site permitirá al administrador la posibilidad de operar en varias páginas Web Drupal desde una única instalación. También hay características para mejorar su rendimiento, lo que debería permitir a Drupal ejecutarse con mayor eficiencia y ayudará así a aumentar la capacidad de accesos simultáneos. El número, calidad y progreso de las traducciones continúa incrementándose con rapidez. En la actualidad, existen traducciones a más de 20 idiomas. Asimismo, gracias al compromiso de algunos desarrolladores, también existirán nuevos temas, incluidos los populares temas para blogs como Kubrick, Persian o Manji, que fueron portados del software de blogs Wordpress [11].

Conclusiones Drupal es un gestor de contenido libre, compacto y enormemente flexible, con una gran y activa comunidad de desarrolladores y usuarios. Se puede adaptar con facilidad par dar soporte a un amplia variedad de escenarios de aplicación. Los programadores apreciarán su sólida infraestructura de desarrollo con su bien documentada API [12], que es expansible usando módulos PHP. La estructura modular, el mecanismo de caché y el módulo throttle para aumentar el rendimiento hacen de Drupal un sistema poderoso y altamente escalable. Por

WWW.LINUX-MAGAZINE.ES

ejemplo, drupal.org tiene cerca de 18.000 usuarios registrados y más de 17.000 ■ nodos en estos momentos.

RECURSOS [1] Página Oficial de Drupal: http://www. drupal.org [2] Página del autor de Drupal, Dries Buytaert’s: http://www.buytaert.net [3] Foros de Drupal: http://drupal.org/ forum [4] Lista de correo de Drupal: http:// drupal.org/mailing-lists [5] Expresiones Regulares en la Wikipedia: http://en.wikipedia.org/ wiki/Regular_expression [6] Descargas de Drupal (lanzamientos, módulos, temas, traducciones): http:// drupal.org/project/releases [7] Drupal Theme Garden: webschuur.drupaldevs.org

http://

[8] Manual de Drupal: http://drupal.org/ handbook [9] Módulo Poormanscron: http://drupal. org/project/poormanscron [10] Contribuciones a Drupal: repositorio CVS: http://cvs.drupal.org/viewcvs/ contributions/ [11] Wordpress, software weblog libre: http://wordpress.org [12] Documentación API de Drupal 4.5.x: http://drupaldocs.org/api/4.5 [13] Crazy Hacks: http://www.crazy-hacks. org [14] Unmaintained Free Software, proyectos libres que necesitan mantenedores: http://www. unmaintainedfree-software.org [15] Blog y página Hermann’s: hermann-uwe.de

Web

de Uwe http://www.

Número 08

31


PRÁCTICO • Gnome 2.10

Las novedades de Gnome 2.10

SIGUIENDO LAS HUELLAS El nuevo escritorio Gnome incorpora una serie de nuevas aplicaciones y applets. Bajo la capota se muestra más estable POR CHRISTIAN MEYER

D

esde la versión 2.0, Gnome ha sido tanto criticado como aclamado. Hace dos años y medio nadie hubiera considerado posible que un escritorio gráfico con un ciclo de lanzamiento de seis meses pudiera mantener los niveles de calidad conseguidos por Gnome. Al margen de la integración de nuevas funciones, las librerías básicas continúan siendo compatibles con las versiones anteriores, algo que ha provocado que importantes proveedores en el mundo de las tecnologías de la información como Red Hat, Novell o Sun usen Gnome como base de sus productos. La nueva versión 2.10 de Gnome está disponible para la descarga pública desde el 9 de marzo. En este artículo repasaremos los cambios más importantes introducidos, algunos bajo el capota y otros muchos muy aparentes.

Cambios visuales Cuando lanzamos el escritorio, lo primero que apreciamos es la nueva estruc-

32

Número 08

WWW.LINUX- MAGAZINE.ES

tura del panel de Gnome. En lugar de las dos categorías de las versiones anteriores (Applications y Actions), Gnome 2.10 incorpora las siguientes tres: Applications, Places y System. La categoría Application aúna todos los programas Gnome y el elemento Ejecutar Programa ..., asignado antes a la categoría Actions. Places nos muestra los directorios usados con más frecuencia, como directorios raíz, marcas del navegador de archivos, dispositivos portátiles montados, servidores de red o los últimos documentos abiertos. Tenemos la posibilidad de conectarnos a un servidor y buscar archivos almacenados local o remotamente. Por ultimo, en System encontramos un submenú para configurar el escritorio y elementos para capturar y bloquear la pantalla y para desconectarnos del sistema. El submenú de administración del sistema nos muestra las herramientas de sistema de Gnome (Gnome System Tools), que cubren un amplio rango de tareas de administración del sistema.

Configuración Sencilla El administrador puede usar las herramientas de sistema de Gnome para gestionar de forma sencilla usuarios o ajustar la fecha y hora. Estas herramientas nos ofrecen una serie de opciones adicionales. Por ejemplo, podemos optar por ajustar la fecha y hora de forma automática mediante un servidor NTP. La configuración de redes es un juego de niños. Los usuarios de equipos portátiles seguro que aprecian la facilidad en la creación de perfiles y localizaciones. Con esta utilidad simplemente seleccionamos un perfil en función de si estamos en el trabajo o en casa.


Gnome 2.10 • PRÁCTICO

Figura 1: Las Herramientas de Sistema Gnome son una magnífica interfaz de gestión del sistemas.

Adicionalmente, las herramientas de sistema de Gnome nos permiten configurar módems, dispositivos ISDN o redes inalámbricas. También podemos definir intercambios NFS o distribuciones Samba que permiten acceso a otros usuarios. La figura 1 muestra las herramientas de sistema de Gnome.

CD a formatos más útiles para nuestro reproductor MP3. el programa trabaja de forma bastante autónoma, incluso en lo referente a la asignación de títulos y estilos.

Mejoras

de determinados componentes del sistema ha hecho maravillas por el rendimiento de Nautilus, lo que seguro apreciaremos al ejecutarlo y usarlo. Adicionalmente, Nautilus renombrará de forma inmediata los nuevos directorios, mientras que en versiones anteriores se hacía de forma manual. Pulsando el atajo [Ctrl]+[L] iremos directamente al directorio especificado. También ha mejorado la conectividad de redes, las funciones de grabación de CD integradas o el diálogo Open with..., todo lo cual debe facilitar bastante el uso de los novatos en Linux (ver Figura 3). El gestor de ventanas Metacity ya no desactiva la ventana en la que estamos trabajando. Este irritante problema afectaba la productividad del sistema en versiones anteriores. La librería Gtk+ ofrece a los desarrolladores una ventaja clave que cualquier programa basado en Gtk+ puede aprovechar. El usuario puede, tanto en las vistas tipo árbol, en las de detalle como el los diálogos de navegación, escribir algunas letras de la palabra que está buscando, siendo seleccionada automáticamente la primera coincidencia. Nautilus en si no interfiere con esta función, si bien tiene una similar. Por tanto es muy probable que Gnome 2.12 incorpore esta función. Por último, el diálogo de preferencias del fondo del escritorio (Figura 4) y la función de arrastrar y soltar han mejorado en Mozilla/Firefox. Los desarrolladores también han solucionado una serie de bugs del escritorio.

Nuevos Programas

Nautilus, el gestor de archivos de Gnome, ha sido sometido ha numerosas y prácticas actualizaciones. El reemplazo

Gnome 2.10 cuenta ahora con las populares aplicaciones multimedia Totem y Sound Juicer (Figura 2). Totem es una herramienta multi-funcional basada en la infraestructura Gstreamer [1], si bien también puede usar librerías Xine, lo que en determinadas ocasiones puede ser una mejor opción. Totem reproduce tanto archivos de vídeo como de audio. La configuración del reproductor es sencilla, lo que es de agradecer tanto por los nuevos usuarios como por los algo más experimentados. Entre otras cosas, el usuario puede configurar el sistema de audio (muy interesante en sistemas surround 4.1/5.1) y los efectos visuales ejecutados durante las reproducciones de audio. El extractor de CD “Sound Juicer” nos permite convertir nuestra colección de

Figura 2: Las preferencias del versátil reproductor multimedia Totem son fáciles de ajustar desde el diálogo de configuración.

WWW.LINUX- MAGAZINE.ES

Número 08

33


PRÁCTICO • Gnome 2.10

Figura 3: El Nuevo diálogo “Open with…” ofrece a los novatos una manera más intuitiva de usar lInux.

Navegadores Web y Correo Electrónico El navegador Web Epiphany, basado en el motor Gecko, es ahora totalmente compatible con las actuales versiones de Mozilla y de Firefox, y ha sido optimizado para ser utilizado en modo pantalla completa. Al igual que Firefox, ahora Epiphany nos muestra un icono para indicar si estamos accediendo a una página segura vía https. Podemos añadir extensiones mediante la lista de funciones de Epiphany. En las versiones anteriores, todas las extensiones se cargaban al arrancar el navegador, consumiendo bastante memoria. Ahora podemos utilizar el gestor de extensiones con el fin de integrar y gestionar de forma óptima los módulos. El grupo Evolution combina la gestión de correo electrónico, lista de contactos,

Figura 5: Aparte de la gestión de sintaxis, ahora Gedit resalta las parejas de paréntesis.

34

Número 08

Figura 4: La nueva apariencia del diálogo de preferencias del trasfondo del escritorio.

lista de tareas o calendario entre otras funcionalidades. Puesto que soporta tanto Novell Groupwise como Microsoft Exchange, se integra en ellos sin fisuras. También soporta Scalix [2] y el servidor de calendario para el sistema de Sun Java Enterprise. Actualmente, Novell está invirtiendo bastante en el desarrollo continuo de Evolution. El proyecto Hula [3] en concreto ha causado bastante alboroto. Debemos estar pendientes de los detalles sobre un próximo conector. A los usuarios les debe interesar conocer que el trabajo sin conexión ha mejorado sensiblemente respecto a las versiones anteriores. Podemos adjuntar archivos a eventos, soportando Evolution las extensiones, las cuales se habilitan y deshabilitan en un diálogo de gestión similar al de las extensiones de Epiphany.

Aplicaciones GnomeMeeting está ahora más integrado en el sistema operativo. Comparte el libro de direcciones de Evolution, lo que significa que sólo tenemos que introducir la información de un contacto una vez. Si instalamos Zeroconf [4], GnomeMeeting localizará de forma automática otros usuarios en la red. El editor de texto Gedit, además de la gestión gramatical, localiza y destaca las parejas de paréntesis en el código fuente (Figura 5). Esta es una función que seguro aprecian los desarrolladores acostumbrados a Emacs, Vimu u otros entornos de desarrollo. Los entornos

WWW.LINUX- MAGAZINE.ES

Bash y Tcl están ahora soportados. Al igual que con otros muchos programas, el tiempo que tarda Gedit en ser lanzado ha mejorado sensiblemente. La última versión del gestor de archivos File Roller soporta ahora los del tipo AR (formato comprimido de Debian por defecto), archivos Debian, archivos RAR protegidos con contraseña y archivos 7 ZIP. File Roller está diseñado para reflejar el comportamiento de un click de Nautilus. Si optamos por pulsar dos veces en Nautilus aparecerá File Roller. El diccionario de Gnome dispone ahora de verificador ortográfico. Esto tiene la ventaja de poder encontrar palabras incluso si no estamos seguros de cómo se escriben. Al igual que con los Wikis, los textos están ahora enlazados a otros diccionarios en la Web, permitiendo la impresión de sus contenidos. El visor de protocolos del sistema había sido descuidado en las versiones anteriores, de hecho, algunas personas opinaban que debía ser eliminado de Gnome. Gnome 2.10 dispone de una nueva serie de funcionalidades para esta aplicación. Por ejemplo, ahora podemos monitorizar archivos múltiples, incluyendo archivos comprimidos o no locales (en unidades de red), con el visor. También proporciona una barra de búsqueda más eficiente que permite al usuario copiar datos al portapapeles. La herramienta de formato ha sido remodelada completamente. Mientras que antes solo podía formatear discos flexibles, ahora también puede formatear dispositivos móviles.

Panel y Applets de Gnome Al igual que el elemento de control central, las mejoras en el panel añaden soporte a iconos de contexto y SVG para Applets. El diálogo Ejecutar Programa ... es mucho más rápido, y los applets en paneles transparentes son ahora transparentes de verdad. El applet de control de unidades ya no confunde a los usuarios con complejas configuraciones y argot técnico. Los iconos de unidades situados detrás de la ventana sobre el escritorio ya no son un problema. El applet, que es visible sobre el panel, muestra una serie de unidades conectadas, permitiendo incluso al administrador desconectarlas. El applet del tiempo soporta ahora muchas más localizaciones, ofreciendo al


Gnome 2.10 • PRÁCTICO

Diversión y Juegos Figura 7: El mezclador, que ha sido rehabilitado para ofrecer una apariencia más lograda, ha prescindido de elementos superfluos.

Ahora los usuarios pueden retar a sus vecinos de red local a jugar al Nibbles (usa la misma tecnología que GnomeMeeting). Si bien el juego es muy simple, ahora es mucho más divertido que antes. El juego Same Gnome ha rehabilitado gráficos y cambiado el tamaño de tableros. También permite deshacer movimientos erróneos. Algunos errores que interrumpían el juego han sido eliminados a la vez.

usuario mucha más información del tiempo en la zona seleccionada, incluyendo la hora de salida y puesta del sol (solo disponible para las ciudades principales). El applet de recordatorios nos recuerda a que escritorio o monitor hemos añadido una nota. La lista completa de nuevos applets de Gnome 2.10 incluye: *Un applet para el módem que se inteFuturo gra perfectamente con el gestor del sistema. Uno de los mayores motivos de discu*Una papelera de reciclaje que permite sión actual es respecto a la cantidad de a los usuarios arrastrar y soltar archivos memoria que las aplicaciones basadas en de la forma habitual. Si pulsamos sobre Gtk+ requieren. Los desarrolladores el icono, este se abre y muestra los archiestán trabajando duro en la resolución vos y directorios que contiene. de estos problemas. Podemos ver los *Un visor de la velocidad del reloj de avances en [5]. la CPU, muy útil para ver la velocidad Gnome 2.12, que será lanzado a del reloj en portátiles con AMD mediados de septiembre, también está PowerNow! o tecnología Intel SpeedStep siendo desarrollado. Si bien no estamos (Figura 6). Podemos seleccionar la veloseguros de que esta versión tendrá nuecidad del reloj si el escalado vas funcionalidades, sí automático de está no esta podemos ver dos ejemplos habilitado. para abrir boca. Gnome 2.10 incorpora un Muchos usuarios tienen nuevo mezclador. Como el al principio de su lista de Figura 6: El applet que resto del sistema, el nuevo peticiones un editor de muestra la velocidad del mezclador usa la infraesmenús. Si bien Gnome 2.10 reloj de la CPU nos pertructura de Gstreamer. El hace honor a las especificamite monitorizar y ajusdiálogo de configuración ciones de Freedesktop restar la velocidad de nuesdel mezclador tiene una pecto a los menús [6], este tro equipo. aspecto sencillo, con pestano ofrece una herramienta ñas de reproducción (Playback), captura de menús adecuada. Gnome 2.12 debe(Capture), conmutadores (Switches) y ría resolver esto. opciones (Options) según aparecen en la Además el escritorio 3D está en camifigura 7. Si hemos instalado el soporte no. El programa “Looking Glasss” [7] de ALSA podremos cambiar entre OSS (sisSun demuestra que esto no es solo un tema de sonido heredado) y ALSA (que truco. Una versión 3D de Gnome podría se ha convertido en el estándar tras la estar basada en Luminocity, un híbrido introducción del kernel 2.6). el cambio a de ventanas y gestor de composiciones. ALSA nos ayuda a evitar una marea de Esto lo podemos comprobar con los barras y botones, muy comunes en otros impresionantes vídeos de Luminocity entornos. [8]. En la nueva versión de Gnome han Si algunas funciones de Luminocity desaparecido tres applets, bien por que son estables cuando se lance Gnome han sido reemplazados o porque simple2.12, es muy posible que las veamos

WWW.LINUX- MAGAZINE.ES

incorporados en Metacity, el gestor de ventanas estándar de Gnome. No obstante, hoy en día Luminocity debe ser considerado como un entorno de pruebas no desarrollado para máquinas de producción. Si estamos interesados, en [9] encontraremos como compilar Luminocity

Conclusión La versión 2.0 de Gnome muestra como el escritorio evoluciona en busca del uso intuitivo, de configuraciones simples y entornos productivos. Muchas de la funciones que faltaban en versiones anteriores han sido incorporadas o lo serán en los próximos meses. Gnome 2.12 continuará este camino limando algunas asperezas. La librería Gtk+ 2.8 constituirá un enorme aumento de la velocidad, actualmente un problema en los programas basados en Gtk+. No obstante, aún no se sabe si la próxima versión de Gnome ■ estará basada en esta librería.

RECURSOS [1] GStreamer: http://www.gstreamer.net [2] Scalix: http://www.scalix.com [3] Proyecto Hula: http://hula-project.org [4] Zeroconf: http://zeroconf.sourceforge. net [5] Information sobre uso de memoria en Gtk+: http://live.gnome.org/ MemoryReduction [6] Especificaciones del menú Freedesktop: http://freedesktop.org/ wiki/Standards_2fmenu_2dspec [7] Sun Looking Glass: http://www.sun. com/software/looking_glass/ [8] Luminocity Vídeos: http://www. gnome.org/~seth/blog/xshots [9] Cómo complilar Luminocity: http:// live.gnome.org/Luminocity [10] GUADEC 2005: http://2005.guadec. org

EL AUTOR

mente se han abandonado. Estas son la del reproductor de CD, la del WLAN, cuya funcionalidad es parte del applet de monitorización de la red desde la versión 2.8 de Gnome, y el avisador de correo electrónico, debido a que su creador no tiene tiempo de trabajar en el.

Christian Meyer lleva trabajando en Gnome 5 años, siendo actualmente el director de Gnome Deutschland e.V. (organización sin ánimo de lucro que apoya a Gnome en Alemania), fundada en octubre de 2004. Podemos contactar con Christian por correo electrónico en la dirección chrisime@gnome.org.

Número 07

35


PRÁCTICO • Gmail

GmailFS: Utilización de una Cuenta de Correo como un Sistema de Ficheros

MÁS QUE CORREO ¿Por qué desperdiciar los 2Gb de la cuenta de correo? GmailFS nos permite usar Gmail como un sistema de ficheros remoto para almacenar información. POR FABRIZIO CIACCHI

E

l sistema de correo Web Gmail de Google [1] se anuncia como una nuevo concepto de correo en Internet. Una cuenta de Gmail viene con 2 Gigabytes para almacenar ficheros. Para la empresa, una cuenta de Gmail implica que nunca se tenga que tirar ningún mensaje. Por supuesto, ofrecer 2 GB de almacenamiento para los usuarios de Linux sólo abre la puerta a más innovación. GmailFS, creado por Richard Jones [2], utiliza los 2 GB de espacio de almacenamiento de Gmail como un sistema de ficheros montable basado en red.

¿Qué es GmailFS? GmailFS se muestra al usuario como un sistema de ficheros normal y corriente.

36

Número 08

Según su creador, “GmailFS soporta la mayoría de las operaciones de ficheros, como son lectura, escritura, apertura, cierre, estado, enlace simbólico, enlace, borrado, truncado y renombrado”. Se pueden usar las herramientas de la línea de comandos de Linux de forma normal con GmailFS, tal como cp, mv, rm y grep. Entre bastidores, GmailFS guarda los datos en forma de mensajes de correo sobre el servidor de Gmail. (Ver el cuadro titulado “Cómo Funciona GmailFS” para saber más sobre este insólito proceso de almacenamiento de archivos). GmailFS proporciona un sistema de almacenamiento de red para los usuarios que no quieren complicarse poniendo en práctica su propio servidor de archivos accesible desde Internet. Con

WWW.LINUX- MAGAZINE.ES

el uso de GmailFS, se puede acceder a un sistema de almacenamiento de ficheros centralizado desde cualquier ordenador, independientemente de donde esté localizado sin tener que preocuparse por el servidor, con tan sólo tener acceso a Internet. Por ejemplo, se puede usar el espacio Gmail para subir los archivos del trabajo para más tarde descargarlos en casa, o se puede hacer que un programa particular sea accesible desde cualquier sitio. GmailFS también puede servir como una herramienta fácil y rápida para ficheros de copias de seguridad.

Preparación del Sistema GmailFS está basado en algunos componentes que se ejecutan en segundo


Gmail • PRÁCTICO

# python setup.py build # python setup.py install

Figura 1: /etc/fstab y la salida del comando df.

plano. Antes de utilizar GmailFS, deberemos instalar: • FUSE - Una herramienta diseñada para soportar sistemas de ficheros Linux en el espacio de usuario; • Libgmail - Una librería Python que proporciona acceso a Gmail. GmailFS está escrito en Python, por lo que también necesitará los ficheros binarios y de desarrollo de Python 2.3 (no 2.4). Muchas distribuciones vienen con Python, pero si no se tiene, el cuadro titulado “Instalación de Python” proporciona un rápido resumen de cómo instalar Python. Descargada la versión 1.3 de FUSE desde [7], se extraen los ficheros y se instala FUSE. Nota: para completar esta operación, necesitamos tener compilado el kernel desde el código, así FUSE instalará el módulo apropiado para el kernel instalado. Tecleamos su para entrar como root e introducimos lo siguiente: # tar -zxvf U fuse-1.3.tar.gz # cd fuse-1.3/ # sh ./configure # make # make install

Luego se necesita instalar los vínculos de Python FUSE. Estos vínculos permiten utilizar FUSE con el código de Python. Se pueden obtener los vínculos de Python FUSE desde el sitio Web de FUSE [8] o desde la página Web del autor de GmailFS Richard Jones [9]; después de que se haya descargado el fichero, se teclea su para acceder como root y a continuación se introducen los siguientes comandos: # tar -zxvf fuse-python.tar.gz # cd fuse-python/

La parte más difícil ya está hecha. El siguiente paso es obtener la versión CVS de libgmail [4]; para ello se necesitan los ficheros constant.py y libgmail.py. Para obtener estos ficheros, se pueden descargar desde CVS con un navegador [10]. Después de haber descargado las últimas versiones de estos ficheros, se introducen los comandos necesarios (como root) para mover los ficheros de libgmail a un lugar del sistema donde Python pueda leerlos: # cd libgmailCVS/ # mv libgmail.py constants.py U /usr/local/lib/U python2.3/site-packages/

Instalación GmailFS Ahora ya estamos preparados para instalar GmailFS. Abrimos un navegador, vamos a la página Web de Richard Jones [2] y descargamos la última versión de GmailFS [11]. Tras completar la descarga, descomprimimos el fichero y copiamos algunos ficheros a lo localización correcta. Tecleamos su para proporcionar la clave de root y luego: # # # # #

tar -zxvf gmailfs-0.3.tar.gz cd gmailfs-0.3/ mv gmailfs.py /usr/local/lib mv mount.gmailfs /sbin mv gmailfs.conf /etc

El próximo paso es editar el fichero /etc/gmailfs.conf. Este es el fichero donde se encuentran los parámetros de configuración tales como el nombre de usuario y la contraseña de la cuenta de Gmail y el nombre del sistema de ficheros. El nombre del sistema de ficheros es muy importante ya que GmailFS utilizará este nombre para asociar mensajes en el servidor con el sistema de ficheros. Escoger un nombre difícil de recordar. (En este ejemplo hemos utilizado el que viene por defecto Linux_fs_3). Ya que GmailFS agrupa los mensajes de acuerdo al nombre del sistema de ficheros, actualmente es posible crear varios sistemas de ficheros para una sola cuenta de Gmail. Para montar GmailFS, podemos usar los siguientes comandos:

WWW.LINUX- MAGAZINE.ES

# mkdir GmailMount # mount -t gmailfs U /usr/local/bin/gmailfs.py U GmailMount/ <B>-o username= U [gmailuser];password= U [gmailpass], fsname=[fs_name]<B>

donde [gmailuser] y [gmailpassword] son su nombre de usuario y su palabra de paso de Gmail y [fs_name] es el nombre del sistema de ficheros (Nota: Si los parámetros de su configuración están en el fichero /etc/gmailfs.conf, puede omitir el código en negrita). Para montar automáticamente el sistema de ficheros de Gmail, necesitamos modificar el fichero /etc/fstab. En el ejemplo, añadimos la línea que actúa como el comando de montaje: # nano /etc/fstab - añadir la siguiente línea U al final del fichero/usr/local/bin/gmailfs.py U /path/of/mount/point U

Cómo funciona GmailFS GmailFs es una aplicación Python que depende de una pareja importante de componentes que funcionan en el trasfondo. El primero de estos componentes es FUSE [3], un componente que corre en espacio del kernel para soportar la implementación del sistema de ficheros en el espacio del usuario. El otro ingrediente necesario es libgmail [4], una librería Python que soporta accesos programados a Gmail. GmailFS resulta de la combinación de estos componentes. FUSE le permite a GmailFS operar en el espacio de usuario, lo que simplifica su diseño e implementación y libgmail le proporciona a GmailFS acceso invisible a las cuentas de Gmail para almacenar y extraer datos. El resultado es que el usuario percibe a GmailFS como un sistema de ficheros normal y corriente y Gmail percibe al sistema de ficheros como una colección de mensajes de correo electrónico. Los meta-datos asociados con estos ficheros se almacenan en la línea de asunto del mensaje de correo. GmailFS almacena los datos del fichero actual como un fichero adjunto. Ya que Gmail limita el tamaño de un fichero adjunto, un fichero de gran tamaño puede almacenarse en múltiples ficheros adjuntos.

Número 08

37


PRÁCTICO • Gmail

Figura 2: Gmail fue lanzado el año pasado el 1 de Abril con 1 GB de espacio. El 1 de Abril de este año, el espacio se aumentó a 2 GB y aún seguirá creciendo hasta el “Infinito+1”.

gmailfs rw,user,noauto, U <B>username=[gmailuser], U password=[gmailpass], U fsname=[fs_name]<B> - presione CTRL+O para guardar

Instalación de Python 2.3 Los comandos para instalar los paquetes de Python 2.3 son los siguientes: En Debian: # apt-get python2.3-dev

install

# swaret -install python-2.3.4-i486-1 Gentoo # emerge python Mandrake # urpmi libpython2.3 libpython2.3-devel Fedora and Redhat (con Apt4Rpm [5]) # apt-get install python-devel-2.3.4-13.1 (Los rpms para Redhat rpm y los paquetes Yum también están disponibles.) Si se quiere instalar desde el código fuente, necesitamos descargar el fichero fuente de Python 2.3.5 [6]. Los siguientes comandos suponen que tiene los componentes de desarrollo necesarios para compilar. Entre como root con el comando su y teclee: tar -zxvf Python-2.3.5.tgz cd Python-2.3.5/ ./configure make make install

38

Número 08

(Nota: Si los parámetros de la configuración están en el fichero /etc/gmailfs.conf, se puede omitir el código en negrita).

Afinando Gmail Cuando completemos todos estos pasos y reiniciemos el equipo, veremos que GmailFS está montado en el directorio. La Figura 1 muestra la sintaxis

python2.3

Slackware

# # # # #

y CTRL+X para salir-

Compilación del kerne Para compilar e instalar el kernel desde el código fuente necesitará los Archivos del Kernel de Linux [12] y descargar la última versión estable de las series del kernel 2.6.x [13]. Tras haber descargado el fichero en el formato .tar.gz, haga su para entrar como root e introduzca lo siguiente: # mv linux-2.6.x.tar.gz /usr/src # cd /usr/src # tar -zxvf linux-2.6.x.tar.gz # ln -s linux-2.6.x linux # cd linux/ # make menuconfig # make # make install # make modules_install Si tiene algún problema compilando el kernel, puede seguir el Kernel-BuildHOWTO [14].

WWW.LINUX- MAGAZINE.ES

de /etc/fstab y la salida del comando df. Ahora que tenemos completamente operativo el sistema de ficheros GmailFS, vamos a echarle un vistazo a algunos detalles. En primer lugar, necesitamos crear una etiqueta y un filtro, así los mensajes GmailFS no serán almacenados con la dirección de correo actual. Introducimos la cuenta de Gmail y hacemos clic en Edit Labels en el cuadro verde a la izquierda, escribimos algo como gmailfs en el cuadro de texto y pulsamos Create. Hacemos clic en Inbox y seleccionamos todos los mensajes de correo electrónico con Me que hemos enviado. A continuación hacemos clic en More Actions y seleccionamos Apply Label gmailfs. Este paso es necesario para crear el filtro, necesitamos ver las características comunes de los mensajes de correo que componen el sistema de ficheros. Hacemos clic en Settings luego en Filter y en la parte final de la página seleccionamos Create a new filter. Utilizamos el nombre del sistema de ficheros que hemos puesto antes para crear el filtro. El filtro tiene la sintaxis q=q=__g__[fs_name]__h__. Hacemos clic en “Next Step”. Si todo está correcto, veremos en el sistema de ficheros los correos en un resumen bajo la etiqueta filtro (Figura 2). Ahora chequeamos la opción etiquetada Skip the Inbox (Archive it) y Apply the label - gmailfs. Pulsamos en Update Filter. En teoría, ahora podremos utilizar el sistema de ficheros GmailFS sin ningún problema. Si se desea, se puede usar GmailFS con un entorno gráfico como

Figura 3: Si se configura correctamente el filtro, los mensajes del sistema de ficheros aparecerán en el resumen del cuadro de filtro.


Gmail • PRÁCTICO

Trucos de Gmail

Figura 4: Utilizando el Sistema de Ficheros de Gmail en un entorno gráfico como Gnome, puede que la cuenta se deshabilites por un momento.

GNOME, montándolo a petición como un dispositivo externo USB. Nos hemos encontrado con algunos problemas utilizando GmailFS con un entorno gráfico, ya que, en algunos casos, la alta frecuencia de acceso al sistema de ficheros hace que Gmail piense que está ante un ataque de denegación de servicio.

Para gente muy ocupada, es posible chequear la cuenta de Gmail con un dispositivo móvil [18]. Si se está utilizando el navegador Mozilla Firefox también puede cambiar la hoja de estilo [19] de la página home de Gmail o usar una extensión para chequear el correo nuevo [20] de su cuenta de Gmail sin tener una pestaña abierta para ello. Para los usuarios de Windows, hay un programa llamada Gmail Drive [21] que actúa como GmailFS y un programa denominado Gmail Notifier [22] que se lanza al arrancar y se coloca en la barra de tareas.

un uso innovador de Gmail. El más conocido es Gallina [15], un sistema de blog que utiliza los mensajes de Gmail como para lo mensajes del blog. Existe también Goollery [16] una aplicación de galería de fotos. Estos dos programas están escritos en PHP y utilizan la librería Gmail-lite [17].

EL AUTOR

Ya que GmailFS no soporta criptografía, realmente no puede contar con privacidad. Sólo si las estructuras de seguriConclusión dad de Google son suficientes para salva¿Un Gigabyte para almacenar ficheros en guardar que los intrusos accedan a sus la red gratis accesible desde cualquier ficheros, no hay nada que impida a sitio del planeta? Uno piensa, Google por sí mismo que escanee “Esto es demasiado bueno para sus ficheros para consumidores e ser verdad.” Pero antes de recominformación demográfica. (Esto es pilar su entorno de trabajo para una característica de todos los sisutilizar GmailFS, hay que consitemas de correo basados en Web derar sus limitaciones. no sólo de Gmail.) Primero, como se puede ver, el Una vez que hayamos entendido concepto completo de usar el Figura 5: estas limitaciones, podremos ver correo electrónico para almaceGmailFS que GmailFS puede sernos de gran nar y recuperar archivos es aparece utilidad en algunas situaciones. menos eficiente que el almaceante al Los usuarios de Linux han hecho namiento convencional. No se usuario algo brillante que podría eventualpuede esperar velocidad de funcomo un mente desembocar en una revolucionamiento de GmailFS. Hay sistema de ción conceptual. Piénsese que se que recordar que GmailFS es un ficheros puede usar los mismos ficheros en experimento. No está pensado normal. casa y en el trabajo sin la necesipara usarse en entornos de prodad de utilizar dispositivos de ducción. Richard Jones, el creador de almacenamiento transportables como GmailFS, no recomienda almacenar disquetes, CDs o pendrives. una única copia de archivos importanHasta que los problemas de seguridad tes en el sistema de ficheros de y de rendimiento se resuelvan, yo seguiGmailFS. ré utilizando mi pendrive para trasladar ficheros, pero GmailFS puede ser una buena alternativa para muchos usuarios. Otras cosas que hacer con Si alguien necesita una cuenta de Gmail Gmail estaré encantado de enviarle una invitación. Envíeme un mensaje de correo Algunos otros proyectos también hacen

Fabrizio Ciacchi http://fabrizio. ciacchi.it es un estudiante italiano de Ingeniería Informática en la Universidad de Pisa. También trabaja como consultor y escribe artículos de Linux.

WWW.LINUX- MAGAZINE.ES

electrónico a fabricio@ciacchi.it (tengo ■ 50 invitaciones).

RECURSOS [1] Página Web de Gmail: http://www. gmail.com [2] Página Web de Richard Jones: http:// ltsv-141.richard.jones.name [3] Página Web de FUSE: http://fuse. sourceforge.net [4] Página Web de Libgmail: http:// sourceforge.net/projects/libgmail/ [5] Página Web de Apt4Rpm: http://apt. freshrpms.net [6] Descarga de Python 2.3.5: http://www. python.org/ftp/python/2.3.5/Python-2. 3.5.tgz [7] Lista de ficheros de FUSE: http:// sourceforge.net/project/showfiles. php?group_id=121684 [8] Página Web de CVS de FUSE: http:// cvs.sourceforge.net/viewcvs.py/fuse/ python/ [9] Pythons FUSE bindings: http://richard. jones.name/google-backs/ gmailfilesystem/fuse-python.tar.gz [10] Libgmail CVS: http://cvs.sourceforge. net/viewcvs.py/libgmail/libgmail/ [11] Descarga de GmailFS: http://ltsv-141. richard.jones.name/google-hacks/ gmail-filesystem/gmailfs-0.3.tar.gz [12] Archivos del Kernel de Linux: http:// www.kernel.org [13] Descarga del Linux Kernel 2.6.x: http://www.kernel.org/pub/linux/ kernel/v2.6/ [14] Kernel-Build-HOWTO: http://www. digitalhermit.com/linux/ Kernel-Build-HOWTO.html [15] Página Web de Gallina: http://ion. gluch.org.mx/files/Hacks/gallina [16] Página Web de Goollery: http://www. wirzm.ch/goollery [17] Página Web de Gmail-lite: http:// gmail-lite.sourceforge.net [18] Pocket Gmail: http://gmail.wiggster. com [19] Skins for Gmail: http://persistent.info/ archives/2004/10/05/gmail-skinning [20] Extensión del Notificador de Gmail: https://addons.update.mozilla.org/ extensions/moreinfo.php?id=173 [21] Gmail Drive: http://www.viksoe.dk/ code/gmail.htm [22] Notificador de Gmail: http://www. google.com/downloads

Número 07

39


PRÁCTICO • PDFs extendidos

Creación de PDFs multicaracterísticas con OpenOffice

EXPORTACIÓN DE LUJO El formato PDF tiene multitud de características que facilitan la vida al lector de documentos extensos. Sin embargo la función de exportar a PDF nativa en OpenOffice no permite muchas de estas funcionalidades. Explicaremos en este artículo como crear los mejores PDFs desde OpenOffice con la macro ExtendedPDF. POR ACHIM LEITNER

oy día los archivos PDF no sólo incluyen texto e imágenes. También ofrecen características como enlaces, marcadores y notas que no aparecerán en la versión impresa. Estos extras no están pensados para la impresión, pero ayudan mucho a la persona que vea el documento en una pantalla con Xpdf, Kpdf o Acrobat Reader. Desafortunadamente, la función nativa para exportar PDFs en OpenOffice [1] es muy simple y no incluye algunas de estas características avanzadas. OpenOffice 2.0 si incluirá algunas de estas funcionalidades (véase [2] y cuadro 1), pero mientras tanto, si queremos crear PDFs más amigables con OpenOffice 1.1, podemos hacer uso de una extensión de OpenOffice llamada ExtendedPDF[3]. ExtendedPDF está implementada como una macro. La versión libre de ExtendedPDF está distribuida bajo la licencia GPL. Las versiones comerciales “Professional” y “Universal” cuestan 20 libras (unos 30 euros) cada una y añaden protección contra copia (el PDF se refiere a esto como “Document Security”), soporte para correo electróni-

H

40

Número 08

co por parte del desarrollador y un procedimiento simplificado de instalación. Salvo esto, la versión libre dispone de todo lo necesario para crear atractivos PDFs.

Macro Como ExtendedPDF es una macro, su formato es bastante inusual: un archivo de OpenOffice. El documento describe la instalación e incluye las funciones necesarias al mismo tiempo. Desafortunadamente, la versión libre no tiene una rutina de instalación, lo que provoca que el proceso completo sea un poco chapucero. Pero si seguimos la guía, al final lograremos el objetivo. El requerimiento más crítico de ExtendedPDF no se encuentra en la página Web o en la guía de instalación, sino en la quía de usuario descargable. La macro sólo funciona en OpenOffice 1.1. No obstante, a pesar de que podemos instalarlo en la versión 1.0, no funcionará. En una prueba con OpenOffice 2.0 snapshot (Versión 1.9.71.1), la macro no funcionó como se esperaba. Tenemos un enlace a la guía de usuario en la página principal [3], y la propia

WWW.LINUX- MAGAZINE.ES

guía esta en formato PDF. El capítulo “Installing ExtendedPDF on Linux or Unix” nos ofrece una guía de instalación, si bien está escrita para la versión comercial. La instalación para la versión libre sólo se describe en el documento de OpenOffice.

Pseudo-impresora ExtendedPDF necesita su propia pseudoimpresora para convertir el documento a PostScript. La herramienta spadmin de OpenOffice controla tareas como el administrador de impresión (véase Figura 1). Si no localizamos la herramienta en el menú de inicio y no esta en nuestra ruta, hemos de comprobar el directorio de usuario. Deberíamos ver allí un directorio llamado OpenOffice, normalmente con el número de versión. Abrimos un terminal, nos vamos a este directorio y tecleamos ./spadmin. Si no conseguimos encontrar esta herramienta en nuestro directorio de usuario, podemos probar con /opt/OpenOffice.org/spadmin. En la pestaña de administración de la impresora, pulsamos en New printer…(el botón de abajo a la izquierda). En el


PDFs extendidos • PRÁCTICO

Aún necesitamos realizar algunos ajustes en la configuración de impresora (véase Figura 1). Para ello seleccionamos la impresora EPDF en Installed Printers, y pulsamos en Properties...(arriba a la derecha). En la pestaña Device seleccionaFigura 1: ExtendedPDF requiere una pseudo-impresora propia (EPDF mos Color en el en este caso) para crear archivos PostScript. La macro analiza el desplegable Color. fichero para generar un archivo PDF. El ajuste por defecto es from asistente para añadir una impresora, driver. En la pestaña Font replacement, seleccionamos add a printer, pero no elequitamos la marca a Enable font replacegimos el conversor PDF. ExtendedPDF se ment. Fijamos los márgenes a cero en encargará de ello. Pulsamos Next >> y Other settings. Por último pulsamos en el asistente nos mostrará una larga lista OK para aplicar estas propiedades y en de drivers de impresión. El driver que Close para cerrar la herramienta de adminecesitamos es el Generic Printer (T42 nistración de impresión. enabled). La parte entre paréntesis es Macros importante: el driver Generic Printer norLas macros se guardan en el mismo mal puede generar algunos problemas en archivo que la guía de instalación. La el tipo de letra de los PDFs. El asistente presencia de las macros de ExtendedPDF nos pedirá un comando en el siguiente explica por qué se muestra un aviso al paso: tecleamos cat. abrir la guía de instalación en Debemos asignar un nombre a la OpenOffice. Como necesitamos instalar nueva impresora. Hemos de teclear exaclas macros de ExtendedPDF antes de tamente el mismo nombre más tarde en poder ejecutarlas, seleccionamos Do not la configuración de ExtendedPDF, por lo que es aconsejable elegir algo fácil como run. Tenemos que fijar algunas preferenEPDF. Pulsamos en Finish para cerrar el cias en los cuadros de diálogo modales asistente. durante la instalación. Como no hay manera de desplazarse por el documento cuando uno de estos cuadros de diálogo está abierto, no podemos saber lo que implica el siguiente paso. Para evitarnos esto, será mejor exportar el documento a PDF usando la función existente en OpenOffice y abrir Figura 2: Uso de las características de administración de las macros el PDF para verlo. de OpenOffice para añadir la librería de ExtendedPDF. El valor correcPara instalar to para Application/Document es soffice. Esto nos permite usar las ExtendedPDF, macros en otros documentos.

WWW.LINUX- MAGAZINE.ES

seleccionamos Tools | Macros | Macro... en el menú de OpenOffice. Esto hace aparecer la ventana de macrs. Pulsamos en Organizer... y pulsamos nuevamente en la pestaña Libraries en el cuadro de diálogo que aparece. Seleccionamos soffice para Application/Document, pues necesitaremos estas macros en todos los tipos de documento más tarde (véase Figura 2). Pulsamos en Append... y seleccionamos el documento de instalación en el explorador de archivos. Este es el archivo que acabamos de abrir. Después de hacer esto, aparece una nueva ventana, mostrándonos una lista de librerías que podemos añadir. Seleccionamos extended PDF (no Standard) y pulsamos OK para confirmar. Por último cerramos tanto el administrador de macros como la ventana Macro.

Nuevo Botón ExtendedPDF ya esta instalado, pero más o menos inaccesible. Tenemos una manera fácil de arreglarlo: simplemente añadir un botón a la barra de herramientas. Para ello, pulsamos con el botón derecho la barra de herramientas y seleccionamos Configure..., y luego el botón Customize para abrir la ventana mostrada en la Figura 3. La lista de la izquierda Available buttons tiene una entrada llamada OpenOffice.org BASIC Macros. Debemos prestar atención para no confundirla con la entrada extendedPDF Open Edition BASIC Macros. Esta última sólo existe cuando el documento de instalación está abierto, y se refiere a las macros incrustadas en el documento, no a la versión instalada. Necesitamos añadir la versión instalada de las macros de ExtendedPDF a la barra de herramientas de OpenOffice. Pulsamos en el símbolo más, luego en extendedPDF, de nuevo extendedPDF, y seleccionamos extendedPdf al llegar aquí, para extender la lista de macros OpenOffice Basic (los desarrolladores podrían haber elegido nombres más imaginativos). Para empezar a exportar un archivo de inmediato al pulsar el nuevo botón, seleccionamos extendedPdfNoUi en vez de extendedPdf.

Con Sólo Pulsar un Botón La barra de botones de ExtendedPDF es la Function bar (arriba a la derecha en la Figura 3). Pulsamos en el botón Icons

Número 08

41


PRÁCTICO • PDFs extendidos

para asignar un icono a la función, que pasa a mostrarse en la barra de herramientas (véase Figura 4). No debemos confundirnos con el campo Function de la Figura 4. Si añadimos un acrónimo como EPDF en lugar de extendedPdf, el botón seguirá llamando a la función correcta. Una entrada en el menú File puede ser una buena idea. Para añadirla, seleccionamos Tools | Configure y pulsamos en la pestaña Menu (véase Figura 5).Buscamos la entrada Export as ~PDF bajo Menu enrties (arriba) y navegamos por Functions situado bajo Category (abajo a la izquierda) hasta encontrar Open-Office.org Basic Macros | ExtendedPDF | ExtendedPDF. Una vez estemos allí, seleccionamos la entrada extendendPdf debajo de Function (abajo a la derecha) y pulsamos en New. Desafortunadamente, no podemos cambiar el nombre de la entrada del menú. Por lo que tendremos que apañarnos con extendedPdf.

Configuración La ventana de configuración aparece cada vez que ejecutamos la macro ExtendedPDF. La ventana de configuración tiene cinco pestañas, aparte de OpenOffice Basic, donde los desarrolladores usan cinco botones en la parte superior de la ventana para simular la apariencia normal. Cuando pulsamos en alguno de estos botones, aparecen los ajustes correspondientes y el botón que hemos pulsado se deshabilita (en gris). Esto provoca más de una confusión. Sin embargo, como la pestaña PDF Security está siempre deshabilitada en la versión Open, el usuario ve dos botones deshabilitados (en gris) y no tiene manera de saber cuál es el responsable de la apertura de la pestaña. Tendría más sentido que el botón seleccionado se mostrase como presionado con un efecto de relieve. Importante: en Configuration (véase Figura 6) tenemos que teclear en Printer Name el nombre de la impresora que creamos anteriormente en spadmin, exactamente con las mismas letras. Un cuadro de selección hubiese sido una buena idea, pero al menos sólo tenemos que teclearlo una vez. La configuración Path to GhostScript debería funcionar, suponiendo que tenemos instalado Ghostscript, que es el caso típico.

42

Número 08

Figura 3: La barra de botones tiene una nueva entrada para ExtendedPDF. La lista desplegable con las macros de ExtendedPDF está a la izquierda, mientras que la barra de funciones está a la derecha.

Sólo necesitaremos la opción Path to PDF viewer si queremos abrir automáticamente el fichero a exportar. Esta opción está disponible en el cuadro de verificación View PDF when extendedPDF has finished dentro de la pestaña PDF Settings (véase Figura 7). Lo más interesante en PDF Settings es el campo Copy notes into the PDF file. Debemos marcar este campo si queremos que ExtendedPDF convierta también las notas de nuestro documento de OpenOffice a PDF.

Riesgos de Seguridad

mado /home/fjl/xy.sxw. El atacante podría crear un enlace simbólico llamado /tmp/xy.ps, que apuntase a /home/fjl/.profile, por ejemplo. Si intentamos exportar el archivo xy.sxw a PDF, ExtendedPDF nos avisa de que el archivo temporal /tmp/xy.ps ya existe. Supongamos que decidimos sobrescribir el archivo (esta opción está disponible en la ventana que aparece). Debido al enlace simbólico, el archivo PostScript sobrescribe el .profile. Podemos mitigar en parte este peligro de manera sencilla. Creamos un subdirectorio llamado tmp en nuestro propio directorio de usuario y nos aseguramos que tenemos los permisos de escritura en el escritorio sólo para nosotros:

Prestemos atención a Temporary Folders en la pestaña File Settings. Tiene por defecto el directorio /tmp, lo cual no parece buena idea por razones de seguridad. ExtendedPDF guarda la versión cd ~ PostScript del documento aquí con el mkdir tmp nombre original y la extensión .ps. En chmod 700 tmp función de la configuración umask que tengamos, el archivo pudiera leerse por Sólo queda especificar este directorio todos los usuarios del sistema. A mucha como nuestro Temporary folder en la gente no le convence tanta laxitud, y para ser honestos, es innecesaria. Para empeorar las cosas, la macro sigue enlaces simbólicos, lo que permitiría a un posible atacante sobrescribir nuestros archivos. Imaginemos que Figura 4: El cuadro de diálogo de personalización de botones nos estamos trabajando permite asignar un botón a la macro. con un archivo lla-

WWW.LINUX- MAGAZINE.ES


PDFs extendidos • PRÁCTICO

Los marcadores suelen reflejar los encabezamientos de cada sección de un texto. ExtendedPDF usa los estilos de párrafo de OpenOffice para reconocer los marcadores. La pestaña PDF Bookmarks en el cuadro de diálogo nos permite especificar qué estilos y qué nivel de indexación se pasará a los marcadores. Los dos campos superiores Figura 5: Este cuadro de diálogo de OpenOffice permite modifiseleccionan el número car la estructura de menús. Los usuarios podrán lanzar la macro de capas de la jerarExtendedPDF desde el menú File en lo sucesivo. quía, y cuántos de ellas se muestran al configuración de ExtendedPDF. Como abrir el documento. La macro lista los estilos que contiene nadie más puede juguetear con este el documento y que no se han convertidirectorio, estaremos a salvo de miradas do a marcadores, en Document styles. La indiscretas y sabotajes. macro asigna automáticamente los estiMarcadores los conocidos de manera correcta. Las Los marcadores nos permiten acceder entradas en la lista de la derecha se conrápidamente a partes interesantes de un vierten en marcadores. Esta lista sólo documento PDF. Acrobat Reader nos muestra las entradas de un determinado muestra siempre los marcadores en la nivel. La opción Level nos permite selecparte izquierda de la ventana. Xpdf tiene cionar este nivel. Debemos asignar desde también esta característica, así como las el nivel 1 hasta el 10 a cada nivel especíversiones más recientes de Kpdf. Xpdf fico de la jerarquía. Por ejemplo, sitúa los marcadores en una zona de la Heading 1 debería asignarse al nivel 1. ventana que está oculta al ejecutar el ExtendedPDF asigna los estilos de programa. Para verlos, tenemos que párrafo recogidos por el nivel Auto al expandir el pequeño cuadro en la esquinivel jerárquico en cual se ha colocado la na inferior izquierda de la ventana. última marca. Esto es muy útil en figuras o tablas.

Facilidad de Uso

Figura 6: Hemos de asegurarnos de teclear correctamente el nombre de la impresora en la configuración básica de ExtendedPDF.

Este método parece más difícil de lo que realmente es. Supongamos que el nivel 5 (el nivel superior) de un supuesto texto esta dividido en sub-capítulos 5.1, 5.1 y 5.3 (segundo nivel), y el 5.1 adicionalmente tiene como subcapas la 5.1.1 y 5.1.2. Los encabezamientos del capítulo se mapean en una capa especial. Pueden aparecer figuras en cualquier nivel, sin embargo es conveniente seleccionar Auto aquí para indicarle a ExtendedPDF que mapee los pies de foto en el nivel adecuado.

WWW.LINUX- MAGAZINE.ES

Existe algo de confusión debida al hecho de que la configuración del PDF tiene otra opción relacionada con marcadores: Translate bookmarks into named destinations (véase Figura 7). Esta opción se refiere a los marcadores de OpenOffice creados seleccionando Insert | Bookmark. Estos marcadores aparecen en el OpenOffice Navigator (pulsando la tecla [F5]) y haciendo que el usuario pueda localizar partes importantes de un documento. Si habilitamos esta opción de traducción, ExtendedPDF convertirá los marcadores con el mismo nombre. Esto permite a una página Web apuntar a una parte específica de un documento PDF. La sintaxis HTML es la misma que para un enlace a página Web: <a href=”…/ xy.pdf#target”> desafortunadamente, esta característica no funcionó en nuestro laboratorio.

Notas y Cruzadas.

Referencias

Los usuarios de OpenOffice pueden añadir comentarios en forma de notas a párrafos del texto. Para añadir una nota en la posición del cursor, sólo tenemos que seleccionar Insert | Note.... OpenOffice mostrará un pequeño cuadro amarillo. Si queremos exportar nuestras notas al fichero PDF, primero debemos marcar Copy notes into the PDF file en PDF Settings dentro de la configuración de ExtendedPDF (véase Figura 7). Acrobat Reader muestra un diseño de la hoja realmente estilizado. En ambos programas podemos hacer doble clic en el símbolo de nota para que aparezca una ventana con el contenido de la nota. Los hiperenlaces a páginas web (que se insertan con Insert | Hyperlink en OpenOffice), también funcionarán en los PDF convertidos. ExtendedPDF exporta automáticamente referencias cruzadas dentro de un documento como enlaces locales. Para permitir que los lectores reconozcan estos enlaces de un vistazo en un PDF, la macro dibuja un marco (en azul por defecto) alrededor de cada enlace. Podemos especificar si queremos conservar el marco o cambiar el color, dentro de PDF Settings. El documento es más atractivo sin marcos, pero más fácil de usar con ellos. Es más difícil crear referencias cruzadas dentro de documentos que enla-

Número 07

43


PRÁCTICO • PDFs extendidos

Insert reference bajo Type, elegimos el nombre que acabamos de asignar de la lista Selection, elegimos un formato en Format (por ejemplo Reference text) y finalmente pulsamos Insert.

Lista de Temas con Enlaces Es incluso más complicado añadir enlaces dentro del documento a listas de temas. Por defecto, OpenOffice crea una lista de temas sin ningún problema (Insert | Indexes and Tables | Indexes and Tables…) e incluso añade acertadamenFigura 7: Desde este cuadro de verificación denominado te los números de página. Sin “View PDF when extended PDF has finished” podemos embargo, esto no es una refeestablecer que ExtendedPDF abra los nuevos archivos rencia cruzada en el sentido de que se generen. hiperenlace. Desafortunadamente, ces a páginas Web. La interfaz de ExtendedPDF se basa en las referencias OpenOffice es menos intuitiva en este cruzadas para poder añadirlas al archivo apartado. Para añadir una referencia PDF. Para hacerlo posible, necesitamos cruzada necesitamos en primer lugar en primer lugar modificar las entradas en señalar un objetivo y asignarle un la lista. Podemos hacer esto en el nombre. Para ello seleccionamos Insert momento de crearla o más tarde: move| Cross-reference, seleccionamos Set mos el cursor hasta la lista de temas, pulreference que esta bajo Type, añadimos samos el botón derecho del ratón y selecun nombre en Name y pulsamos cionamos Edit Index/Table. Insert. Pulsamos la pestaña Entries. Bajo Introducimos el enlace a la referencia Structure and Formatting podemos ver el que acabamos de establecer en la misma orden de los campos para cada nivel de ventana. Para ello, movemos el cursor a jerarquía. Las sugerencias que aparecen la posición deseada, seleccionamos cuando posicionamos el ratón sobre los

Exportar PDF en OpenOffice 2. Las especificaciones para la exportación a PDF en OpenOffice 2.0 [2] presenta mejoras que permiten al usuario elaborar elegantes documentos en PDF. Estas mejoras incluyen: • Exportación de gráficos mejorada, en particular en lo referente a la compresión y a la resolución. • Hiperenlaces para referencias cruzadas locales y URLs. • Notas en el archivo PDF. • Archivos PDF etiquetados. Esta variante mantiene la estructura lógica del documento, pero se incrementa considerablemente el tamaño. • Formularios PDF. El usuario podrá rellenar formularios directamente en Acrobat Reader e imprimir el resultado.

44

Número 08

En versiones posteriores habrá soporte para PDFs encriptados, es decir, con protección de copia (“PDF Security”). En el momento de escribir este artículo, el equipo de desarrollo de OpenOffice está intentando completar la versión 2.0 para mayo de 2005. La mayoría de las nuevas características están ya listas, como la exportación mejorada de PDF. Nuestra prueba con la Snapshot Build 1.9.m71 (lanzada el 01/24/2005) muestra que ExtendedPDF será redundante cuando la nueva versión se publique. ExtendedPDF tiene más opciones de configuración. Por ejemplo, podemos especificar que formato de párrafo usar como marcadores. Por otro lado, la macro es un poco más lenta que la exportación de PDF nativa.

WWW.LINUX- MAGAZINE.ES

cuadros nos indican su significado. E# es el número de capítulo, E la entrada (es decir, el texto de cabecera), T una marca de tabulación y # el número de la página.

Bloques de Construcción Para usar el nombre de un elemento de la estructura como hiperenlace, tenemos que mover el cursor hasta la caja blanca entre E# y E, y pulsamos en Hyperlink. Un cuadro LS aparece en la posición seleccionada. LS es la abreviatura de Link Start (comienzo del enlace). Queremos que el final del enlace a continuación de la E, por lo que movemos el cursor hasta el espacio en blanco entre la E y la T y pulsamos de nuevo en Hyperlink. Esto muestra un cuadro LE (Link End). Para eliminar cualquier cuadro que hayamos posicionado incorrectamente, sólo debemos pulsar sobre este y presionar la tecla [Del]. Si queremos aplicar estos cambios a las demás capas, pulsamos el botón All. Podemos añadir una etiqueta arbitraria al cuadro en blanco. De esta manera, el texto queda insertado en la lista de temas.

Conclusión ExtendedPDF ofrece muchas opciones. Por ejemplo, podemos especificar si Acrobat debe mostrar los marcadores al abrir un documento, o simplemente mostrar la página. Sin embargo, los parámetros de calidad son probablemente las configuraciones más importantes. A mayor resolución de las imágenes y menor compresión, mejor se verán nuestros documentos y mayor espacio ocuparán. Si sólo queremos mandar un PDF a la impresora, no necesitamos las características especiales que proporciona ExtendedPDF. Pero para publicaciones que se lanzan en formato PDF, necesitaremos sin duda características como ■ marcadores e hiperenlaces.

RECURSOS [1] OpenOffice: http://www.openoffice. org [2] Exportar PDF en OpenOffice 2.0: http://specs.openoffice.org/appwide/ pdf_export/PDFExport.sxw [3] ExtendedPDF por JDI software:http:// www.jdisoftware.co.uk/pages/ epdf-home.php


Control Remoto • PRÁCTICO

Control de un Coche Teledirigido desde Linux (II)

MONTANDO A HERBIE

Ha llegado el momento de finalizar las modificaciones del mando a distancia del coche que emprendimos el mes pasado, y de preparar nuestros scripts que lo controlarán desde el ordenador. POR ALBERTO PLANAS Y VÍCTOR TIENDA

R

ecordemos cómo terminamos el mes pasado. Extraíamos el circuito del mando a distancia encargado del controlar remotamente el coche, así como el compartimento para la pila de 9V. Además diseñamos y construimos un cable paralelo para transmitir la información enviada desde las ocho líneas de datos (pines del 2 al 9). Explicamos el funcionamiento de un transistor en modo corte / saturación y planteamos el problema de manera general. Estamos, por tanto, en la parte más emocionante del proyecto: vamos a ensamblar el resto de los componentes.

El Optoacoplador Ya comentamos de pasada en el número anterior los peligros que conlleva para nuestro puerto paralelo el conectarlo a un circuito alimentado de manera externa. Podríamos dañar los componentes de nuestro ordenador si por una mala soldadura o algún error en el diseño, entrara algún voltaje por alguno de los pines de sólo salida. Estamos experimentando y por tanto es previsible que cometamos errores en el proceso: necesitamos proteger nuestro ordenador. Lo ideal sería separar o desacoplar los dos circuitos: el del puerto paralelo y el circuito de radio-

control con el controlador que estamos diseñando. Pues bien, esto lo vamos a lograr con los optoacopladores. Un optoacoplador no es más que un transistor controlado por la base mediante un diodo fotoemisor. Es decir, nosotros controlaremos la corriente que pasa por cada lado del diodo (ánodo y cátodo) y éste, como respuesta a dicha corriente, emitirá fotones que serán recogidos por el fotorreceptor acoplado a la base de transistor. Este fotorreceptor transformará la energía luminosa otra vez en energía eléctrica, que se usará para alimentar la base del transistor. Dependiendo de con cuanta intensidad y voltaje alimentemos el fotodiodo, así emitirá más o menos luminosidad, y por ende tendremos más o menos potencial y corriente en el transistor. De esta manera tan sencilla hemos desacoplado los dos circuitos, no hay ningún cable que una la parte posterior al transistor con nuestro ordenador. El opto viene en forma de integrado con 6 pines. La norma es marcar el pin número 1 con un punto en la superficie, y a partir de ahí tendremos localizados el resto de los pines. La finalidad de cada uno de ellos podemos consultarla en el datasheet del fabricante[1]. En la

WWW.LINUX- MAGAZINE.ES

Figura 1 podemos ver un esquema del interior del optoacoplador que hemos seleccionado para este proyecto, el 4N25, y la disposición de sus pines. La finalidad de cada uno de ellos es: • Pin 1: Ánodo del diodo • Pin 2: Cátodo del diodo • Pin 3: No se usa, sin conexión • Pin 4: Emisor del transistor • Pin 5: Colector del transistor • Pin 6: Base del transistor Nosotros usaremos solo los pines 1, 2, 4 y 5. Con el 1 y el 2 controlaremos el diodo. Hay que tener cuidado en este punto, el diodo sólo deja pasar la corriente en dirección ánodo -> cátodo. La diferencia de potencial entre estos dos debe ser, por tanto, positiva. Si cambiamos el potencial y hacemos que circule corriente en la dirección cátodo -> ánodo correremos el riesgo de quemar el diodo. De la parte del transistor solo usaremos los pines del colector (5) y del emisor (4), ya que la base es controlada automáticamente por el diodo fotoreceptor que comentamos antes. El esquema de conexionado que seguiremos será similar al expuesto en el artículo anterior. Sería abusar de la paciencia del lector que repitamos la explicación del funcionamiento del transistor, pero hay que recordar que solo nos intere-

Número 08

45


PRÁCTICO • Control Remoto

Figura 1: La correspondencia de pines puede encontrarse en el texto.

sa el comportamiento del mismo en modo corte / saturación. Es en este modo cuando el potencial V1 que pintamos en la figura 6 del artículo referido pasa a valer 0 V ó 9 V a nuestro antojo. A partir de todo lo expuesto mostraremos el diagrama global que deberemos construir. Un esquema lo podemos encontrar en la Figura 2. En él vemos que los pines 2 y 3 del puerto paralelo están conectados a los pines 1 y 2 del optoacoplador, que corresponden, respectivamente, al ánodo y al cátodo del diodo. Por otro lado el extremo del transistor tiene una conexión en el colector a una resistencia que a su vez está conectada en el polo positivo de la pila (extremo Vcc) y por otro lado a parte positiva del interruptor del mando a distancia. El emisor del transistor queda colocado en tierra, es decir, a la parte negativa del mismo interruptor. Si nosotros emitimos un 1 (3.3V) por el pin 2 del puerto paralelo y simultáneamente emitimos un 0 (0V) por el pin 3, estaremos encendiendo el diodo del optoacoplador con la suficiente intensidad como para poder

46

Número 08

Figura 3: Nuestro cochecito, comprado en una tienda de todo a 60 céntimos, con la placa creada y el cable para el puerto paralelo.

saturar el transistor. Éste, al saturarse soldador padawan es a tomar una postura pondrá 0V (aproximadamente) en el cómoda que impida que tropecemos en el borne positivo del interruptor que estadichoso cable del soldador. También es mos controlando, y simulará su pulsaaconsejable que nos agenciemos un trozo ción. En cambio, si ponemos a 0 los de esponja húmeda para ir limpiando el pines 2 y 3 del puerto paralelo, el diodo estaño del soldador cada vez que procedejará de emitir cualquier tipo de luz lo damos a una nueva soldadura. Un truco que provocará que el transistor pase eficaz es calentar el cable antes de aplicar directamente a corte, dejando Vcc (9V) estaño. Colorearemos la punta del soldaen la parte positiva del dor sobre el cobre del interruptor. cable y esperaremos a Este esquema debeque este tome temperaremos seguirlo por tura, luego derretirecada uno de los intemos una gotita de estarruptores, como teneño sobre el cable y con mos cuatro direcciones un giro de muñecas (adelante, atrás, dereextenderemos rápidacha e izquierda) necemente este estaño (cuisitaremos repetir este dado aquí con los circuito cuatro veces. Figura 2: Diagrama global de ojos). Si hacemos esto De esta manera los conexiones del circuito. en ambas partes de la pines 2 y 3 controlarán soldadura lograremos un interruptor, el 4 y 5 otro … así hasta unos resultados más limpios y eficientes. completar los cuatro indicados. Otra de las cosas que aprendí es que es mejor tener cuatro manos que solo dos. Si ¡A Soldar! alguien nos puede ayudar a sujetar los Esto es un arte. Con un pincel eléctrico extremos que queremos unir, nos resultavamos repartiendo trozos de estaño por rá mucho más sencilla la tarea de soldaraquí y por allí. El problema es que soy un los. Existen altas probabilidades de que artista incomprendido y mis obras se niesin querer unamos dos patillas con estagan a permanecer funcionales durante ño. En estos casos hay que proceder sin mucho tiempo. Es aquí donde hay que compasión, tendremos que quitar el estallamar a un amigo experto en la mateño sobrante con el soldador. Una suerte es ria para que te eche una mano. Él nos que los componentes escogidos (las resisenseñará que bajo esta expresión tencias y los optos) son duros y no se artística hay también unas reglas lógiromperán fácilmente al aplicarle excesivo cas, trucos que harán que la soldadura calor a las patillas (cosa que pasa cuando se acerque al ámbito de la ciencia y de lo nos entretenemos demasiado al intentar predecible. Lo primero que aprendí como fijar la soldadura).

WWW.LINUX- MAGAZINE.ES


PRÁCTICO • Control Remoto

Scripts Por fin tenemos nuestro circuito montado. Vamos a testearlo. Para esto hay que hacer un programa que use la librería parapin presentada en el artículo anterior y el programa mostrado en el Listado 1. Este programa puede controlar cuatro pines del puerto paralelo de manera simultanea

(con cuatro es suficiente, ya que son a lo sumo dos los interruptores que desearemos controlar a la vez). Compilaremos el programa de la siguiente manera: gcc send_lpt.c -o send_lptU -lparapin

El programa generado tiene cinco parámetros. Con los cuatro primeros indicaremos que pines activamos y cuales desactivamos y con el último el tiempo en el que permanecerán activado dichos pines. Si hemos conectado en el orden adelante, atrás, derecha e izquierda los interruptores del mando a distancia, entonces el comando ./send_lpt 2 3 0 0 2000 encenderá el pin 2 y apagará el pin 3 durante dos segundos (el tiempo se expresa en milisegundos). Esto hará que

Listado 1:send_lpt.c 01 /* 02 * Uso: send_lpt pin_a pin_b pin_c pin_d tiempo 03 * 04 * Envía un pulso alto (aprox. 3.3V) a pin_a y a pin_c, y uno bajo (0V) a 05 * los pines pin_b pin_c, espera 't' milisegundos y baja la entrada a y c. 06 */ 07 #include <stdio.h> 08 #include <stdlib.h> 09 #include <unistd.h> 10 11 #include "parapin.h" 12 13 int main(int argc, char *argv[]) 14 { 15 int pin0, pin1, pin2, pin3, t; 16 17 if (argc < 6) { 18 printf("Uso: %s pin_a pin_b pin_c pin_d tiempo\n", argv[0]); 19 exit(-1); 20 } 21 22 if (pin_init_user(LPT1) < 0) { 23 printf("Error al inicializar el puerto paralelo (LPT1).\n"); 24 exit(-1);

48

Número 08

25 26 27 28 29 30 31

}

pin0 = atoi(argv[1]); pin1 = atoi(argv[2]); pin2 = atoi(argv[3]); pin3 = atoi(argv[4]); /* Pasamos los milisegundos a microsegundos */ 32 t = atoi(argv[5]) * 1000; 33 34 /* Encendemos pin0 y pin2 y apagamos pin1 y pin 3*/ 35 pin_output_mode(LP_DATA_PINS | LP_SWITCHABLE_PINS); 36 37 /* Metemos 0 V primero para evitar dañar el diodo */ 38 if (pin1 > 0) clear_pin(pin1); 39 if (pin3 > 0) clear_pin(pin3); 40 if (pin0 > 0) set_pin(pin0); 41 if (pin2 > 0) set_pin(pin2); 42 43 usleep(t); 44 45 /* Ponemos los pines 0 y 2 a 0 V otra vez */ 46 if (pin0 > 0) clear_pin(pin0); 47 if (pin2 > 0) clear_pin(pin2); 48 49 return 0; 50 }

WWW.LINUX- MAGAZINE.ES

el coche se desplace hacia adelante durante estos dos segundos (menos el tiempo en el que el coche tarda en responder a la orden). Si con los dos primeros parámetros controlamos un interruptor y con los otros dos el otro interruptor, la tabla de comandos quedaría de la siguiente manera: • 2 3 0 0 Adelante • 4 5 0 0 Atrás • 6 7 0 0 Giro a la derecha • 8 9 0 0 Giro a la izquierda • 2 3 6 7 Adelante con giro a la derecha • 2 3 8 9 Adelante con giro a la izquierda • 4 5 6 7 Atrás con giro a la derecha • 4 5 8 9 Atrás con giro a la izquierda Podemos ir creando ficheros scripts que se encarguen de realizar cada una de las tareas de movimiento, por ejemplo, si mi coche se mueve a una velocidad tal que tarde un segundo y medio en completar una circunferencia, el script que hace que el coche gire hacia la derecha sería: #!/bin/sh send_lpt 2 3 6 7 1500

Sólo nos queda ir programando el resto de las tareas. Un proyecto interesante sería crear un lenguaje similar al LOGO para hacer que el coche dibuje con su trayectoria las figuras que deseemos. ■ Pero eso es otra historia.

RECURSOS [1] Datasheet del 4N25 http://www. alldatasheet.co.kr/datasheet-pdf/view/ QT/4N25.html

EL AUTOR

Hay una solución mucho más cómoda que soldar, pero es también más cara. En las tiendas de electrónica se pueden conseguir una placas de pruebas. Son placas de plástico perforado sobre una malla de cobre. Esta malla transmite la corriente a los puntos de su misma fila o columna, con lo que nuestro trabajo se reduce a pinchar los componentes en el orden adecuado para simular el circuito que deseemos construir. Muy recomendable.

Alberto Planas es desarrollador de aplicaciones bajo entornos libres desde hace varios años. Aficionado a la tecnología desde siempre, alterna sus horas de sueño con las horas dedicadas al estudios de las Redes Bayesianas, programación con las QT, perfeccionamiento de C++, desarrollo en Java y mil cosas más.


Perl • DESARROLLO

Archivo y acceso a PDFs

EL BIBLIOTECARIO Este mes aprenderemos a ubicar artículos en archivos PDF protegidos y cómo usar una base de datos para acceder a estos artículos más tarde. POR MICHAEL SCHILLI

N

o importa si se trata de un entretenido artículo del periódico local o de un excelente análisis político del New Yorker: pueden ser una buena lectura para un día lluvioso, y puede que queramos archivarlos de alguna manera para poder recuperarlos fácilmente. Desafortunadamente, estas joyas del periodismo puede que no estén disponibles online, dado que muchos periódicos aún no tienen sus ediciones en la Web. Mala cosa: el papel termina ocupando un montón de sitio en nuestro despacho, y ¿realmente queremos llenar estanterías y estanterías de carpetones?

Escanear y Comprimir Una alternativa es digitalizar los artículos de nuestro interés con un escáner y guardarlos en discos como archivos PDF. Para poder llevar la cuenta de los archivos adecuadamente en una colección que crece continuamente, presentamos este mes magsafe, un script en Perl con el que administrar una base de datos de archivos escaneados (el listado completo de este script se puede bajar de [1]). Dos o tres páginas se escanean rápidamente con la excelente interfaz gráfica xsane, del proyecto Sane [2], que es compatible con casi cualquier escáner a través de su back-end. Tanto los escáneres Epson como los HP All-in-One Officejet funcionaron a la perfección bajo Linux en nuestro laboratorio.

Después de escanear, guardamos cada página como un fichero PNG. Una resolución de 200dpi será suficiente para mantener el texto legible. Usaremos el programa convert en un truco sacado de [3] para unificar todas las páginas en un único documento PDF: convert -density 200 U -quality 95 \ -resize "1600x1600>" U *.png archivo.pdf

Este comando recopila los archivos *.png del directorio actual, limitando el ancho y alto a 1600 píxeles. Las imágenes de menor tamaño quedarán intactas debido al signo > utilizado. convert unifica las páginas en un PDF a una resolución de 200dpi. Los archivos PNG se comprimen a JPG dentro del PDF conservando una calidad del 95% respecto del original.

Dentro del Archivo Después de escanear las once páginas del excelente artículo “La tortura del Outsourcing” del New Yorker, escrito por Jane Mayer, y haberlo pasado a archivo.pdf, realizamos la siguiente llamada al script magsafe para registrarlo: magsafe -m "New Yorker" -a U "Jane Mayer" -t "La tortura del Outsourcing" -i 2005/02/14 -p 106 -d U archivo.pdf

WWW.LINUX- MAGAZINE.ES

Esto crea un registro con el nombre de la publicación (“New Yorker”), el título del documento (“La tortura del Outsourcing”), el número (“2005/02/ 14”) y la página (106). La información se guarda en una base de datos, que admite consultas SQL. Hemos empleado el motor de bases de datos SQLite. Si comprobamos la información referida a su instalación comprobaremos que sólo necesitamos unos pocos módulos CPAN y el script se encargará de todo lo demás. El script no copia el documento PDF, archivo.pdf, a la base de datos, sino a un directorio donde se guardan todos los archivos bajo una secuencia numérica (000001, 000002,…). Si añadimos nuestro artículo del New Yorker a la inmaculada base de datos, se creará un nuevo documento denominado “000001”, que contiene el PDF. Nuestro segundo documento será un artículo de un periódico local que relata una reyerta en un pub Londinense: magsafe -m U "Southwest London Inquirer" -t "Pintas voladoras" -i 2005/02 -p 4 -d U archivo.pdf

Como se puede comprobar, no es obligatorio incluir el nombre del autor. De hecho, los autores de muchos artículos en prensa son anónimos.

Número 08

49


DESARROLLO • Perl

Si ejecutamos magsafe sin especificar ningún parámetro, el script nos requerirá más información de la siguiente forma: $ magsafe [1] New [2] New Yorker [3] Southwest London Inquirer Magazine [1]>

Como hemos introducido previamente dos artículos, magsafe tomó nota de los nombres de las publicaciones y ahora las muestra por pantalla en un menú. Para añadir una nueva publicación, sólo tenemos que presionar 1 y teclear el nombre: Magazine [1]> 1 Enter Magazine Name []> The Sun Document []> ...

magsafe copia el documento PDF especificado por la opción -d (o introducido interactivamente como acabamos de ver) a un directorio codificado, le asigna un número correlativo a cada documento (000001, 000002,…) y referencia la ruta hasta este archivo en la base de datos.

Una Aguja en un Pajar Usar una base de datos tiene la ventaja de poder buscar los datos de la manera que más se ajuste a lo que necesitemos. Para nuestra base de datos de periódicos, que hemos guardado en un archivo denominado doc_escaneados.dat, es muy fácil hacerlo desde la línea de comandos con sqlite3 y unas mínimas nociones del viejo SQL: $ sqlite3 doc_escaneados.dat sqlite> SELECT * from doc where title like '%Pintas%' 2|Pintas voladoras U ||2|4|2005/02 CTRL-D $

Podríamos objetar que el proceso es algo incómodo. magsafe nos ofrece un leguaje simplificado de consultas como respuesta. Si usamos el parámetro -s, tendremos que especificar la cadena de búsqueda con el siguiente formato: "campo:patrón campo: U patrón ..."

50

Número 08

La siguiente línea busca los artículos con la palabra Pintas en el título: $ magsafe -s title:Pintas "Pintas voladoras", U Unknown, Southwest London U Inquirer, 2005/02, 4, /DATA/DOCS/000002

Internamente, magsafe genera una consulta SQL, después de añadir la cadena de búsqueda entre caracteres de tanto por ciento. Supongamos que estamos buscando artículos publicados en 2005, es decir, con un valor de “2005” en el campo issue. En este caso, introduciríamos: magsafe -s issue:2005 Figura 1: Escaneo de un artículo con xsane.

Podríamos restringir adicionalmente la consulta a artículos del “Southwest London Inquirer”: magsafe -s "issue:2005 U mag:Southwest"

Base de Datos Abstracta Hemos visto la abstracción de base de datos Class::DBI que usa magsafe en otras ocasiones en la sección de Perl. En esta ocasión, vamos a hacer las cosas incluso más fáciles. El módulo Class::DBI::Loader simplifica las definiciones de clase para Class::DBI, pues analiza el diseño de la base de datos y genera clases de abstracción y sus relaciones por referencia. El listado magsafe muestra cómo se implementa. El módulo Getopt::Std analiza las opciones de línea de comandos que acepta magsafe. La línea 29 busca a, -m, -t, etc. Los dos puntos en el formato de la cadena establecen que un parámetro debe seguir a cada opción marcada de esta forma. getopts guarda los valores en un hash, %o, el cual se procesa más tarde. La línea 33 comprueba si existe el directorio del documento (puede estar vacío), y se puede escribir en él. Si no es así, se tendrá que crear el directorio antes de iniciar el programa. La función db_init() de la línea 36 se asegura de que los usuarios no tienen que preocuparse de los detalles de la base de datos. Si la base de datos no existe, db_init() usa unas pocas líneas SQL, que empiezan en la línea 147, para

WWW.LINUX- MAGAZINE.ES

crear una nueva base de datos con dos tablas. La Figura 2 muestra el esquema. La tabla doc contiene una línea para cada documento que guardemos. La línea incluye el título y autor del artículo, el número, la página y el nombre de la publicación de la cual se sacó el artículo. La mayoría de la gente no lee demasiadas publicaciones, pero lo hacen regularmente. El diseño de la base de datos sería pobre si guardáramos el nombre completo de la publicación en cada línea. En vez de esto, la tabla doc tiene un campo mag con una identificación numérica que apunta a la línea en la tabla mag, que tiene el identificador asociado al nombre completo de la publicación. La tabla de definiciones que sigue a línea 147 en magsafe es un homenaje al estándar SQL, incluyendo la línea: mag INT REFERENCES mag,

en la tabla doc, que tiene una pinta algo inusual. Esta es una manera de indicar que la columna mag apunta a la tabla mag, y también de establecer la relación entre el identificador de la publicación y el título. Las primeras dos columnas en ambas tablas son identificaciones numéricas, que se etiquetan como claves primarias. El constructor de clases Class::DBI::Loader llamado en la línea 40 necesita que le asignen indentificadores únicos a los objetos que constituyen las líneas de la tabla. A las filas nuevas se les asigna automáticamente nuevos identificadores incrementando el último que se usó.


Perl • DESARROLLO

La siguiente línea: namespace => "Scanned::DB"

en la llamada al constructor del cargador de base de datos se asegura de que las clases de abstracción de tablas son visibles en Perl en el espacio de nombres de Scanned::DB. Después de la llamada Class::DBI::Loader->new(), el método find_class() va a buscar los objetos que representan las tablas, como se ve en las líneas 50 y 52, proporcionando la tabla de nombres como argumentos. $docdb, objeto de Scanned::DB::Doc type, apunta a la tabla de documentos doc, mientras que $magdb (Scanned::DB::Mag) apunta a la tabla de publicaciones, mag. Para permitir que los objetos cumplan con las consultas estándar Class::DBI y también condiciones WHERE más complicadas, el parámetro additional_classes en la línea 43 realiza una petición al paquete Class::DBI::Abstract-Search. El parámetro relationships en la línea 46 le indica a Class::DBI::Loader que analice las relaciones entre las tablas doc

y mag y las enlace. Gracias a la condición REFERENCES de SQL, entiende que la columna mag de la tabla doc es simplemente una clave externa, que se usa para hacer un JOIN con la tabla mag.

Desde la Comandos

Línea

de

En la línea 56 el script comienza a procesar los parámetros de la línea de comandos. Si no se pone la -s, el usuario no busca una entrada de la base de datos, sino que introducirá una nueva línea. Las líneas de la 59 a la 67 aceptan valores de varias opciones de la línea de comandos. Si una o más opciones no se fijan, la función ask() (proporcionada por el módulo Sysadm::Install) muestra al usuario los valores que faltan. El campo del autor es opcional y no se pregunta por el. Seleccionar una publicación es un poco mas complejo y usa la función mag_pick definida en la línea 169 y siguientes. El método retrieve_all() del objeto tabla de base de datos $magsdb lee todas las filas existentes en la tabla mag. Los objetos de datos devueltos pro-

Figura 2: Esquema de la base de datos SQLite.

porcionan métodos para acceder a los campos individuales en los registros: por ejemplo, $obj-> name() devuelve el nombre de la publicación, que se guarda en la columna name de la tabla mag. Si $picked no está activado, es decir, si la opción en la línea de comandos correspondiente a la publicación está vacía, la línea


DESARROLLO • Perl

179 usa la función pick() (también de Sysadm::Install) para ofrecer al usuario elegir de un menú de los nombres de las revistas. Si el usuario elige la primera entrada, New, la línea 181 invalida la selección y la línea 186 permite al usuario introducir el nombre de una nueva publicación, que será mostrada en la lista la próxima vez. El método find_or_create() crea entonces una nueva entrada en la tabla mag, o bien encuentra una revista existente. De esta manera, la variable $mag en la línea 57 representa una revista nueva o existente. Como Class::DBI::Loader hizo el trabajo previamente y analizó las relaciones entre las tablas doc y mag, gracias a las banderas relationships, ahora la línea 69 puede, sin más, llamar a $mag->add_to_docs() para añadir un artículo a la tabla doc y permitir a su columna mag que apunte a la publicación de la tabla mag. El método add_to_docs() del objeto revista no está definido explícitamente en magsafe. Se genera automáticamente en la capa de abstracción de base de datos DBI::Class. Para copiar el documento PDF al directorio de documentos, magsafe llama a la función cp desde Sysadm::Install en la línea 83. La función docpath() definida en la línea 129 devuelve la futura ruta completa del archivo. Para ello, simplemente convierte la identificación a un entero de seis dígitos rellena con ceros y anexa el documento al directorio.

Más Fácil que SQL En caso de petición de búsqueda, la línea 89 itera sobre los pares column:pattern, que proceden de la opción -s y separados por espacios en blanco. La línea 92 separa entonces el nombre de la columna de la palabra clave de búsqueda. Si el nombre de la columna es mag, la línea 96 busca primero una revista coincidente adosándole caracteres de porcentaje y llamando a search_like() en la tabla mag. Esto puede no devolver ninguna revista, una o muchas en @mags. El método id() encuentra los identificadores de las revistas coincidentes, dejando a la línea 99 que guarde una tupla tal que: "mag" => [$id1, $id2, ...]

en el hash %search. $id1, $id2, etc… son los identificadores numéricos para las

52

Número 08

revistas resultantes de la petición de búsqueda, y la entrada de hash asignada a la clave “mag” apunta a un array que contiene esos identificadores como elementos. Por otro lado, si un usuario busca por otra columna diferente de mag, se habilita la rama else en la línea 103 y la clave de búsqueda se coloca entre signos de porcentaje y se asigna al nombre de columna clave en el hash %search. El contenido del hash %search es exactamente lo que espera el método search_where(). Se llama en la línea 108 y devuelve líneas que cumplen todas las condiciones especificadas por el hash. Si el parámetro de comparación cmp está puesto en “like” en las opciones adicionales del hash, search_where() no busca coincidencias literales, sino por patrones con comodines dados como %, cumpliendo con el estándar SQL. El comando print de la línea 113 se llama para cada objeto que se ha encontrado, activado por la subsecuente cláusula for @objs.

Caracteres no Estándar SQLite3 espera que todas las cadenas estén en UTF-8. En caso de que estemos guardando los títulos con caracteres acentuados, con ISO 8859-1, no funcionará. Algunas distribuciones más nuevas de Linux tienen sus terminales en UTF-8, mientras que las más antiguas usan ISO 8859-1 con más frecuencia. Debemos comprobar la variable de entorno LANG. Si está fijada a en_US.UTF-8, por ejemplo, nuestras terminales usan UTF-8. Si la variable $UTF8_TERM de la línea 20 está fijada a un valor permitido, el script interpretará toda la entrada como UTF-8 y no acometerá una conversión. Si $UTF8_TERM es 0, magsafe dará por supuesto que los datos de entrada están en ISO 8859-1 y convertirá todo a UTF-8 antes de situarlos en la base de datos. Si se necesita la conversión, magsafe recurrirá al módulo CPAN Iconv. La línea 23 crea un objeto Text::Iconv para convertir de ISO-8859-1 a UTF-8. Adicionalmente llama a raise_error() con el valor 1, para forzar una excepción en caso de error. El método convert() convierte cualquier cadena que le pasemos de una codificación a la otra. El módulo Encode, para aquellos que tengan Perl 5.8.x o posterior, es otra alternativa.

WWW.LINUX- MAGAZINE.ES

Instalación El script necesita los módulos DBI, Class::DBI, Class::DBI::SQLite, Class::DBI::Abstract-Search y DBD::SQLite para la abstracción, todos ellos disponibles desde CPAN. Adicionalmente, necesitaremos Text::Iconv y Sysadm::Install. Si preferimos usar el cliente desde la línea de comandos sqlite3 para investigar la base de datos SQL manualmente, tendremos que descargar el tarball desde [4], compilarlo e instalarlo desde allí. Las versiones 1 y 2 de Sqlite no funcionarán, dado que DBD::SQLite se basa en sqlite 3.x que no es compatible con las bases de datos generadas usando otras versiones de SQlite. Tenga cuidado: si estamos usando bases de datos SQLite para otras aplicaciones con versiones anteriores del módulo DBD::SQLite y queremos seguir usándolos, necesitaremos hacer una conversión al nuevo formato SQLite antes de hacer la actualización: sqlite OLD.DB .dump | U sqlite3 NEW.DB

Una vez que hayamos instalado la última versión del módulo DBD::SQLite, no podremos leer bases de datos creadas con versiones anteriores. La variable $DOC_DIR define el directorio de documentos en la línea 27 del script magsafe. Adicionalmente, la variable $DB_NAME en la línea 16 establece el nombre del archivo de base de datos SQLite. Este directorio debe existir antes de iniciar el programa y se debe poder escribir a él. Ahora, los entusiastas de los medios escritos pueden escanear artículos interesantes de las revistas que leen y dejar éstas en el contenedor de reciclaje. Imáginese todo lo que se puede hacer ■ con el espacio que dejaremos libre.

RECURSOS [1] Descarga de magsafe.pl: https://www. linux-magazine.es/Magazine/ Downloads/08 [2] http://www.sane-project.org [3] PDF Hacks, por Sid Steward, O’Reilly 2004 [4] Página Web de SQLite, http://www. sqlite.org


Bash • DESARROLLO

Construcción de un guión en Bash para administrar una web

TODO BAJO CONTROL

Para algunos, es sólo la línea de comandos, pero para otros es un lenguaje de programación hecho y derecho. Bash puede ser tan simple o tan sofisticado como se desee. Enseñaremos un estupendo guión Bash para inspeccionar nuestro servidor web y de camino aprenderemos un montón de útiles trucos. POR PEER HEINLEIN

U

na shell es solamente la interfaz entre un usuario y el núcleo del sistema operativo. La shell realiza tareas sencillas y su nombre (concha en inglés) deriva de que rodea al núcleo, al igual que una concha marina protege a su inquilino. Pero no hace tanto que las shells comenzaron a espabilar y ahora la mayoría de las shells tienen poderosas características que las colocan de igual a igual con lenguajes de programación hechos y derechos. Bash, la Bourne Again Shell (‘Otra vez la shell Bourne’), es por ahora la más popular de las shells Unix y ha sobrepa-

sado fácilmente a su predecesora la shell Bourne y sus derivadas como la C shell, la TC shell o la Korn shell. Los guiones no se pueden compilar y esto puede afectar a su velocidad de ejecución. Por otra parte, la experiencia de los admins se puede, en poco tiempo, transformar en un guión. Los guiones shell se leen fácilmente y si los programadores usan las opciones que proporciona, un guión es realmente capaz de resolver problemas complicados. Básicamente un guión shell es una serie de órdenes que un usuario puede teclear en el prompt de la línea de órde-

WWW.LINUX- MAGAZINE.ES

nes. En otras palabras, cualquier orden que se puede introducir manualmente puede ser ‘guionizada’ con unas cuantas líneas en un guión shell. Con un esfuerzo mínimo, los admins pueden escribir guiones para automatizar tareas repetitivas, utilizando cron para ejecutar el guión o ejecutarlo automáticamente cuan-

Número 08

53


DESARROLLO • Bash

do se ingresa en el sistema. Estos guiones pueden gestionar las copias de seguridad, realizar análisis estadísticos o incluso verificar la disponibilidad de medios. El truco en la programación shell consiste en unir pequeños bloques de construcción de la manera más eficiente posible. Como se enseñará en este artículo, se puede construir un guión Bash muy sofisticado y útil a partir de pequeños bloques de código dedicados a tareas especificas.

Administración de un Servidor Web Supongamos que regularmente realizamos una serie de comprobaciones sobre el servidor web y deseamos automatizar las tareas usando una guión Bash. Es posible que se le ocurra un guión como el de servercheck, disponible desde [1]. Como se puede ver, el guión consiste en diversos bloques de código dedicados a diversas tareas relacionadas con la administración de un servidor web. En las siguientes secciones aprenderemos sobre las distintas etapas en la comprobación de servidores. El guión del Listado 1 comienza con la definición del intérprete. Si se elimina esta definición, la shell predeterminada del usuario que lanzó el guión intentará ejecutar las órdenes del mismo. Las distros de hoy en día utilizan normalmente /bin/bash, como shell predeterminada, pero una definición explícita en este punto no hará daño a nadie y puede ayudar a evitar potenciales errores. También hay que remarcar algo, en el comienzo del guión, que aún no hemos comentado: un archivo de configuración. Para los

guiones cortos no merece la pena crear un archivo de configuración para el guión. Sin embargo, si los parámetros son más complejos, puede que sea útil crear un fichero especial bajo /etc, entonces el guión principal puede analizar. /etc/servercheck.conf. Observe que el punto y la ruta están separados por un carácter de espacio. Esto podría incluso permitir el soporte de “includes” tal como lo hacen otros lenguajes de programación, proporcionando un cierto grado de modularidad para los programas más complejos. Un archivo referenciado de esta manera sería introducido en la ruta y ejecutado.

La cabecera Antes de comenzar a registrar información sobre el estado del servidor, es una buena idea imprimir una cabecera que indique el nombre de la máquina y la fecha de comprobación. Esta cabecera de información se genera utilizando las siguientes líneas: DATUM=`date +'%d %e'` echo Subject: Server-StatusU `date +"%b %e"` $HOSTNAME

Esta primera línea utiliza la técnica de sustitución de la orden, ejecutando el conjunto de la expresión dentro de las comillas e insertando la salida en el lugar de la orden (una especie de corta y pega). Hay tres tipos diferentes de comillas, pero la shell solo acepta una de ellas como el carácter de sustitución de la orden. La que se necesita es la conocida como backtick ` , que es como la tilde del acento grave y

que no hay que confundir con ‘ la comilla simple. La orden usa date para obtener la fecha actual. La página de manual de date es un poco confusa a veces y es necesario tener algo de experiencia programando en Bash para poder entenderla correctamente. El área Synopsis de man date muestra una llamada de date +FORMAT y más tarde la página de manual continúa explicando los valores que se aceptan para FORMAT. Es fácil pasar por alto el detalle de que se necesita el paráme-

Sencillez Cuando se está intentando alcanzar un resultado específico con la programación shell, la ausencia de opciones o funciones no es precisamente el problema. Dicha esto, a menudo es difícil identificar un método sencillos. Muchos administradores están acostumbrados a ejecutar manualmente tareas en la shell, pero rechazan escribir exactamente los mismos pasos y en lugar de eso pasan por toda clase de contorsiones para encontrar una solución. Es fácil comprobar el número de cuentas de usuarios con el Id de usuario 0 en /etc/paswwd con solo abrir /etc/passwd, buscar los ceros y contar ¿Pero qué si se desea escribir eso? De hecho, no hay necesidad de cambiar nada: nada más que grep :0:/etc/passwd para filtrar cualquier cuenta de usuario o de grupo que tenga ID 0 en el archivo y usar wc -l para contarlos. Una tarea simple,pero incluso admins experimentados pueden terminar con complicadas excentricidades en su código. Para evitar esto, tiene sentido dividir en pasos pequeños cualquier tarea administrativa que se quiera automatizar con un guión. Así es más fácil identificar las herramientas correctas para la tarea. No comience arrancando su editor preferido para teclear el guión. En vez de eso pruebe todos las órdenes una por una en una ventana del terminal y compruebe la salida. Si estos pasos manuales conducen a la solución que necesita, tiene un módulo de guión que merece la pena que “guarde para la posteridad” en un archivo. Por supuesto que no está limitado a las órdenes incluidas de Bash. Todo lo contrario: la verdadera fuerza de la shell es la asombrosa variedad de populares herramientas de dominio público.

54

Número 08

WWW.LINUX- MAGAZINE.ES


Bash • DESARROLLO

tro +, ya que solo se está sustituyendo FORMAT. En otras palabras, se necesita la siguiente sintaxis para sustituir una fecha: date +%Y%M%D. El segundo problema es el espacio vacío en el formato de salida de la fecha como en 25 AGO, como se ve a menudo en los archivos de registro. date +%d %e causará un error, al igual que date +%d +%e. Es necesario encerrar el bloque de formato entre comillas simples o comillas dobles. Esto indica que el carácter de espacio no indica el punto donde comienza el siguiente parámetro de date: date +"%d %e" o date +'%d %e'; pero desde luego que aquí no se puede usar el backtick, ya que está reservado para la sustitución de la orden.

¿Funciona el Servidor? La primera comprobación que realiza el guión es determinar si el servidor web está funcionando. El código que realiza esta comprobación es el siguiente: 01 # Comprobar si el servidor web está funcionando 02 # Adaptado para Apache2, utiliza "/etc/init.d/apache" 03 # y además "/usr/sbin/httpd -T".

04 if [ $CHECK_WEB = "yes" ] ; 05 then 06 if /etc/init.d/apache2 st tus &> /dev/null && wget --deleteafter http://www.domain.local/ chec file.txt &>/dev/null ; then 07 # El servidor Web está fu cionando! Intente recargar, verifique la sintaxis antes de hacerlo 08 if /usr/sbin/httpd2 -t &>/dev/null; then 09 /etc/init.d/apache2 reload &>/dev/null && echo " Servidor Web funcionando y recarga de la configuración ok." 10 else 11 echo "### AVISO: La reca ga fallo debido a un error de configuración! " 12 fi 13 else 14 # El servidor Web no fun


DESARROLLO • Bash

ciona. Intenta arrancarlo. 15 if /usr/sbin/httpd2 &>/dev/null && /etc/init.d/ap che2 start &>/dev/null ;then 16 echo "### AVISO:el serv dor Web está caído, reinicio correcto." 17 else 18 echo "### AVISO:el serv dor Web está caído, El reinicio

FALLO! " 19 fi 20 fi 21 fi

La segunda condición if es un ejemplo del elegante estilo de programación que facilita la shell. El guión de arranque/ parada /etc/init.d/apache tiene una opción para comprobar que el demonio

está corriendo. En vez de interpretar la salida de texto de esta orden, usaremos el valor devuelto por el programa. El código de error o errorlevel será 0 para un programa que está completamente bien. Esto es equivalente al VERDADERO de la lógica binaria de la shell, donde cualquier error devolverá un código con un valor distinto de cero y por tanto sería el equivalente de FALSO.

Estructuras de control Bash tiene las típicas órdenes y estructuras de control de cualquier otro lenguaje de programación. Estas no juegan un importante papel en un contexto interactivo. Las condiciones if o Select Case no tiene mucho sentido para un usuario que está sentado al teclado y puede comprobar sus opciones antes de tomar una decisión. La siguiente condición if: if bla1 ; then cmd1 elif bla2 ; then cmd2 else cmd3 fi muestra, más o menos, el formato clásico tal como se usa en la mayoría de los lenguajes de programación de alto nivel. Nótese el punto y coma antes del then y la posibilidad de combinar else if en el más elegante elif. La expresión de prueba bla1 devolverá TRUE o FALSE. Pero puede reflejar el valor asignado a una variable ( if $check; then...) o devolver el valor de un programa que se haya llamado (if mkdir /tmp/test ;then.) Un programa que termina limpiamente devuelve el valor TRUE. En caso contrario, devolverá el valor FALSE en caso de error. La mayoría de los lenguajes de programación también tienen una condición select. En Bash select tiene la siguiente sintaxis: 01 case "$VAR" in 02 TEST1) 03 cmd1 04 ;; 05 TEST2 06 cmd2 07 ;; 08 *) 09 cmd3 10 ; 11 esac

56

Número 08

Nótese los dobles puntos y comas al final de cada bloque case. *) es una expresión especial que se corresponde con cualquier expresión que ya se ha encontrado. Las estructuras select a menudo se utilizan para recabar parámetros o en algunos casos para producir ayuda para los parámetros. Para este bucle for A in n1 n2 n3 n4 ... nn ; do cmd $A done itera sobre el elemento desde n1 hasta nn. $A acepta el valor actual del elemento línea a línea. La lista también puede ser una variable conteniendo múltiples valores separados por espacios: LIST="Harry Sally U Martin Yvonne" for A in $LIST ; do echo "Hola $A" done Hay que resaltar que Bash solamente puede manejar un limitado número de parámetros. Esto significa que rm fallará en un directorio con muchos miles de archivos. En contraste con esto for A in *; do rm $A; done funcionará perfectamente expandiendo el * como un comodín del archivo. while condition ; do cmd done El bucle iterará mientras condition devuelva el valor TRUE. Así que necesitamos una orden test. El siguiente ejemplo cuenta de 0 a 1000. i=0 while test $i -le 1000 ; do echo $1 i = $ [ $i + 1 ] done o si usamos el test abreviado: i=0

WWW.LINUX- MAGAZINE.ES

while [ $i -le 1000 ] ; do echo $1 i = $ [ $i + 1 ] done Mientras que un bucle while continuará mientras se cumpla la condición, un bucle until se parará tan pronto como la condición se cumpla: until condition ; do cmd done En teoría se pueden escribir todos estos ejemplos sintácticos en una sola línea, utilizando un punto y coma (;) para separarlos: if bla1 ;then cmd1 ;cmd2 ;else cmd3 ;fi. O usando un bucle for: for A in $LISTE ;do echo "Hola $A" ;done. Los recién llegados estarán felices de saber que Bash tiene una opción de depuración. El depurador es una gran ayuda si se está intentando encontrar errores lógicos o tipográficos (véase el cuadro Depuración Bash). El archivo de guión no necesita un nombre especial, sin embargo se debería mantener la convención de añadir la extensión .sh. De todas formas hay que añadir los permisos de archivo para que el guión sea ejecutable, esto es, hay que configurar el bit x para los usuarios que necesiten ejecutar el guión. A pesar de que se pueden escribir programas complicados con guiones shell; incluso una interfaz gráfica si fuera necesario, lo normal es utilizar Bash para apaños rápidos (que tienden a ser permanentes). Así pues los guiones shell son una herramienta incomparable para cualquier administrador, especialmente para los admins que no tiene tiempo o predilección por aprender lenguajes de guiones de más alto nivel, como Perl o Python, solamente para obtener los mismos resultados con, más o menos, la misma cantidad de código.


DESARROLLO • Bash

Como la condición if solamente comprueba el estado verdadero/falso, aquí se puede sustituir la orden: if /etc/init.d/apache status ; then.... Dos líneas más abajo se utiliza exactamente el misma método. El httpd, también conocido como Apache tiene la opción -T para comprobar la configuración; de nuevo el valor devuelto puede ser verdadero (si la configuración está bien) o falso (si ocurre un error de sintaxis) Esta prueba es particularmente útil para evitar matar un servidor web en funcionamiento que está intentado recargar, tras añadir inadvertidamente un error fatal a la configuración del servidor web. Para comprobar el estado de Apache, este guión no se apoya por completo en el /etc/init.d/apache status. En vez de eso utiliza wget, para comprobar que la descarga de un fichero termina correctamente; hay que admitir que esto es solo una manera de demostrar el uso de una herramienta. De nuevo wget devuelve un código verdadero/falso, el cual nos lleva a la expresión if true AND true ; then.... Si algunas de estas verificaciones no es correcta, el guión se bifurca en else.

Listado 3: Busqueda basada en expresiones regulares 01 if $CHECK_HDMINFREE ; then 02 GETPERCENTAGE='s/.* \([0-9]\{1,3\}\)%.*/\1/' 03 KBISFREE=`df | grep /$ | sed -e "$GETPERCENTAGE"` 04 INODEISFREE=`df -i | grep /$ | sed -e "$GETPERCENTAGE"` 05 if [ $KBISFREE -ge $HDMINFREE -o $INODEISFREE -ge $HDMINFREE ] ; then 06 echo "### AVISO: $KDISFREE% / 07 INODEISFREE% de la partición raíz ocupada! " 08 else 09 echo " Espacio en disco ocupado." 10 fi 11 fi

58

Número 08

Aquí se ha redireccionado el texto de salida de las órdenes a /dev/null. La idea que hay tras este guión es ofrecer un informe de estado. La salida de los propios programas sería un estorbo para conseguirlo.

Comprobación de Usuarios Root Ocultos Ya que hemos comprobado que el servidor web está en marcha, convendría comprobar si actualmente hay algún usuario root oculto registrado en el sistema. El código del Listado 1, que es un extracto del servercheck, busca usuarios root ocultos en /etc/passwd. Tal como se puede ver, el código del Listado 1 utiliza una orden grep para buscar en el contenido del archivo /etc/passwd para ver si algún usuario con la categoría de root está utilizando el sistema actualmente. Los resultados correctos de estas búsquedas se acumulan en ACCOUNTS y, si ACCOUNTS muestra que hay una o más de una entrada indicando que un usuario root está en el sistema, el guión muestra un aviso. En el caso contrario el guión afirmará que no ha encontrado usuarios root.

Verificación de Espacio en Disco La siguiente comprobación es para ver si el servidor tiene suficiente espacio libre. Este bloque de código del servercheck, comienza con la línea: # Check for HDMINFREE

utiliza la variable HDMINFREE, que se ha definido previamente en el guión: # Minimum space for "/"U in percent HDMINFREE="90"

WWW.LINUX- MAGAZINE.ES

HDMINFREE define el umbral mínimo de espacio libre que activará un aviso. Colocar este valor en una variable permite cambiar el ajuste más fácilmente que si el valor estuviera codificado dentro de la lógica del guión Bash. ¿Como se puede descubrir el nivel actual de uso del disco? Hay dos herramientas para este trabajo: du proporciona el uso del disco y no es muy útil para los propósitos de nuestro guión. También tenemos df que muestra el espacio libre en una o varias particiones, pero de una manera excesivamente prolija. La mejor aproximación hacer lo que haría cualquier humano: lanzar df,

Listado 2: Evaluación de Parámetros 01 while [ "$#" -gt 0 ] ; do 02 case $1 in 03 --web) 04 CHECK_WEB=yes 05 shift 06 ;; 07 --accounts) 08 CHECK_ACCOUNTS=yes 09 shift 10 ;; 11 --hdminfree) 12 CHECK_HDMINFREE=yes 13 shift 14 ;; 15 --status) 16 CHECK_STATUS=yes 17 shift 18 ;; 19 --logins) 20 CHECK_LOGINS=yes 21 shift 22 ;; 23 --all) 24 CHECK_WEB=yes 25 CHECK_ACCOUNTS=yes 26 CHECK_HDMINFREE=yes 27 CHECK_LOGINS=yes 28 CHECK_STATUS=yes 29 shift 30 ;; 31 *) 32 echo "Uso: $0 [--web] [--accounts] [--hdminfree] [--logins] [--status] [--all]" 33 exit 34 ;; 35 esac 36 done


Bash • DESARROLLO

Listado 1 01 # comprueba /etc/passwd para usuarios de root ocultos 02 if [ $CHECK_ACCOUNTS = "yes" ] ; then 03 cat /etc/passwd | grep ":0:" | grep -v ^root: > $TEMPFILE 04 ACCOUNTS=`cat $TEMPFILE | wc -l` 05 if [ $ACCOUNTS -ge 1 ] ; then 06 echo "### AVISO: Descubiertas $ACCOUNTS cuentas adicionales con privilegios de root!" 07 cat $TEMPFILE 08 else 09 echo " No hay cuentas de root adicionales." 10 fi 11 fi

localizar las líneas de la partición raíz y leer el número que hay delante del símbolo del porcentaje. En vez de comprobar la partición denominada (hda3), es mucho más fácil buscar un carácter barra / al final de una línea. Esto hace que sea más fácil aplicar el guión con otras configuraciones de disco. En otras palabras, enviamos la salida de df a grep para que busque /$, donde $ es el símbolo de final de línea (EOL o End Of Line, que dicen en algunas islas). Una alternativa podía haber sido utilizar df /, pero df daría una salida con cabeceras de columnas y eso habría significado tener que usar tail -n1 para filtrar la línea. Dicho de otro modo, no se hubiera adelantado mucho más. cut -b 52-54 and cut -b s47-49 retira quirúrjicamente el símbolo de porcentaje, que se puede almacenar en una variable para compararla más tarde en una condición if. Aquí hay que tener cuidado con los patinazos: si se corta 53-54, el guión tomara los dos ceros del 100 y eso significa que el guión dará resultados

inexactos cuando se necesita la mayor exactitud posible, que es cuando el disco esta a rebosar. La condición if en los corchetes son la abreviatura de la orden test. Si se expande esto, se obtiene test $HDISFREE -ge $HDMINFREE ; then; estas notaciones son equivalentes. test puede funcionar con variables o con fichero para comprobar la condición de verdadero/falso. En este caso -ge significa “mayor que o igual”. En otras palabras, se está verificando si el espacio usado en el disco por el sistema es igual o mayor que el valor de umbral. Una vez más esto es simplemente el código de retorno verdadero/falso de los programas. Si la declaración es verdad, como en test 5 -ge 3, test devuelve verdadero. Si la declaración es falsa, como en test 3 -ge 5, test devuelve falso. Aquí la condición if no tiene realmente nada que hacer con los números, simplemente busca un valor verdadero o falso entre if y ; then.

Verificación de Logins root Fallidos En el siguiente bloque del servercheck, el guión busca los intentos repetidos de hacer login como root con la contraseña incorrecta. Este código sigue un patrón familiar. Se puede realizar un grep para una combinación de palabras que filtre errores de contraseña en los intentos de login desde fuera de la máquina y las basadas en SSH. Por supuesto que habría sido posible agregar una llamada a | wc -l para contar los intentos inválidos, pero el método basado en archivos permite que se agreguen las tentativas sospechosas de login al informe. Después de todo, la idea detrás de este guión es dar al administrador toda la información que él o ella necesite en un informe consolidado. Los errores tipográficos al introducir la contraseña pueden suceder y suceden cada día. No queremos que el guión este avisando al admin por un fallo de login que ha sido causado porque un usuario ha teclea-

WWW.LINUX- MAGAZINE.ES

do mal la contraseña. En este caso, los intentos fallidos de login comienzan a ser sospechosos cuando ocurre una inundación de logins fallidos dentro de un período corto de tiempo. Este tipo de actuación indica que se está realizando un ataque por fuerza bruta en el servidor. Si el servidor está sufriendo un ataque de este tipo, el admin debe saberlo inmediatamente. 15 intentos fallidos de login es un umbral apropiado. Un ataque por fuerza bruta puede implicar miles de intentos fallidos de login en un periodo de días. No sirve de mucho encontrar un puñado de entradas de logins erróneos en el archivo de registro durante la investigación de una intrusión.

Información de Estado El bloque final de código del Listado 1, es el que comienza con la línea: # Generate status:

ofreciendo más información útil al admin. El directorio /proc demuestra ser especialmente útil. Los innumerables archivos virtuales bajo /proc tienen una ingente cantidad de información del sistema que puede ser analizada y procesada usando cat, grep, cut, head y tail, sin que haya que acceder al interior del sistema operativo y sin usar un lenguaje de programación de alto nivel. /proc/loadavg se presta por si mismo a todo tipo de hacks haciendo grep sobre la información de carga de la CPU y el uso de la memoria desde la salida de top.

Tareas cron Automatizadas Tras ejecutar el guión manualmente para comprobar que funciona satisfactoriamente, se puede añadir una entrada a crontab para que el guión se ejecute automáticamente con los privilegios de root. El programa de correo creará automáticamente una línea de Asunto:... para el mensaje de email generado por el guión: 57 23 * * * U /usr/local/binU /servercheck | sendmail U admin@bla.local

Desde luego que se podía haber creado una sección para que el mismo guión

Número 08

59


DESARROLLO • Bash

Tutoriales y Comos Tutoriales de Bash: • http://www.linuxfibel.de/bash.htm * http://www.tldp.org/HOWTO/ * Bash-Prog-Intro-HOWTO.html http://www.tldp.org/HOWTO/ Bash-Prompt-HOWTO/index.html * http://www.tldp.org/LDP/abs/html/ Tutoriales especiales sobre guiones shell: • http://www.linuxfibel.de/bashprog. htm * http://www.freeos.com/guides/ lsst/ch03sec03.html * http://quong. best.vwh.net/shellin20/ #LtohTOCentry-11 Buenas páginas de entusiastas del Bash y recopilaciones de guiones: • http://www.shelldorado.de

crease el mensaje de correo, pero no deseamos perder la capacidad de ejecutar manualmente el guión en una ventana del terminal como rápida comprobación manual del sistema.

Mejoras Un guión es más flexible si soporta parámetros en la línea de órdenes. Si se necesita deshabilitar un módulo del guión (el del disco duro o la comprobación de root), será necesario lanzar un editor y modificar las variables CHECK_. Hay una manera más elegante de hacer esto. Los primeros nueve parámetros de la línea de órdenes están almacenadas en unas variables especiales llamadas $1, $2, $3 ... $9. $0 guarda la orden en si misma y $# proporcionan el número de parámetros. La orden shift puede ser muy útil aquí: si se borra el primer parámetro y se

mueven todos los demás una posición a la “izquierda”. En otras palabras, que el que ahora es $2 se convierte en $1. Se puede usar un bucle while para configurar las variables CHECK_ en función de los parámetros (Véase el Listado 2, “Evaluación de Parámetros.”). Para parametrizar el guión, todo lo que hay que hacer es insertar este trozo de código en lugar de la declaración de variables desde las líneas 15 hasta la 20 del servercheck.

Buenas Maneras Los guiones más educados lo recogen todo cuando terminan, eliminando los archivos temporales. En circunstancias normales rm $TEMPFILE al final del guión se puede ocupar de esto, pero si el guión se interrumpe, no alcanzará este paso. Como el archivo temporal es verdaderamente pequeño, probablemente los admins podrían vivir con la pérdida del espacio de disco, pero el archivo temporal puede contener información sensible que no debería dejarse abandonada a disposición de cualquiera en el directorio /tmp. trap es una función especial que puede escuchar señales especificas y realizar una tarea predefinida. En este ejemplo, solamente se necesita verificar las tres señales más importantes SIGKILL (kill -9 PID), SIGTERM kill -15 PID) y SIGINT, que sucede cuando un usuario pulsa Ctrl-C (alias la señal 2). Si se necesita más información sobre señales, se puede probar con man 7 signal. Si se genera una de estas señales, será necesario borrar el archivo temporal, si es que existe, y parar el guión:

trap "test -e $TMPILE && rmU $TMPFILE ; exit" 2 9 15

Algunas de las secciones del guión de ejemplo podrían ser más compactas y cortas; pero esto reduciría su legibilidad, especialmente a los usuarios más inexpertos. Por ejemplo, se pueden

Variables: la Diferencia está en la $ Podríamos asegurar que la mayoría de los lectores conocen el uso interactivo de la shell. Pero las instrucciones que casi nunca se utilizan en modo interactivo (variables, bucles y estructuras de control) son muy diferentes cuando se utilizan combinadas. Las variables deben estar en mayúsculas en beneficio de la legibilidad. No es necesario poner tipos (enteros, cadenas y cosas así). Para asignar un valor a una variable se omite el signo del dólar: USUARIO="Tux" Pero si se desea que Bash reemplace una variable por su valor actual, es necesario utilizar el signo del dólar de prefijo: echo "Hola $USUARIO" Las variables solo son visibles dentro de la shell actual. Si se lanza una sub-shell, las variables que se están usando no son visibles, a menos que se hayan exportado explícitamente para crear variables globales: USUARIO="Tux" export USUARIO Estos pasos se pueden combinar: export USUARIO=Tux Se pueden usar las matemáticas básicas con las variables. Es necesario colocar la operación matemática dentro de corchetes $[...] hay que asegurarse de que se inserta un carácter de espacio para separar la variable de los corchetes: NEW = $[ $OLD + OLD * 2 ] Puede suceder que la variable sea una cadena de texto. Por ejemplo la siguiente llamada echo "Hola Usuario-$USUARIO" En nuestro ejemplo mostraría Hola Usuario-Tux. Las variables que comienzan con las mismas letras, como $USUARIO y $USU pueden provocar alguna confusión. Es más sensato poner los nombres de variables entre corchetes para evitar esto: echo "Hola Usuario-@{Usuario}".

60

Número 08

WWW.LINUX- MAGAZINE.ES


Bash • DESARROLLO

una clara mejora. Aún así, el guión no es recomendable para vigilar granjas de servidores o en escenarios en que haya que aplicar mayores niveles de seguridad. El guión hace su trabajo sin alborotos. Por eso es un útil ejemplo de escritura de guiones dentro del contexto de la rutina diaria de los administradores, nada más, y nada menos.

establecer las variables en true en lugar de yes al comienzo del guión, CHECK_WEB, CHECK_ACCOUNTS y así sucesivamente, para acortar las condiciones if:

Bash puede expandir las variables y lanzar el programa true, que está en /bin/true y devuelve un true binario. Su contrario es /bin/false. También se pueden reducir las llamadas a grep: cat /etc/passwd | grep ":0:" ... (línea 55) se puede sustituir por grep ":0:" /etc/passwd, eliminando todos los cat del tirón. Además, podemos utilizar AWK o expresiones regulares para remodelar la comprobación del espacio en disco y obtener un código más elegante, pero hay que tener en cuenta,que las

Depuración Bash Es poco conocido el hecho de que Bash tiene funciones de depurado. Se puede utilizar set al comienzo del guión para establecer el modo Xtrace, por ejemplo: • set -x le indica a la shell que muestre el formato expandido de cada línea antes de ejecutar las órdenes de la misma. En otras palabras, la shell primero inserta los nombres de archivo para cualquier comodín y también reemplaza las variables por sus valores actuales. • set -v habilita el modo de salida detallada para cualquier orden ejecutada por el guión. • set -n realiza una comprobación de la sintaxis,pero sin ejecutar el guión (modo no-exec). Un echo $VARIABLE bien colocado o simplemente echo xyz en la parte del bucle o del guión que sea necesario, es también una herramienta muy valiosa para la resolución de problemas. Indicará exactamente que está haciendo un programa y en muchos casos los puntos de ruptura indicaran como ha iterado un bucle especifico.

expresiones regulares no son precisamente divertidas. Y habríamos necesitado buscar el carácter del porcentaje para extraer los valores que le preceden, como se muestra en el Listado 3. Las expresiones regulares podrían haber sido preferibles a los escapes de grep en la línea 79. Si lo desea, tiene la libertad de definir patrones de expresiones regulares para comparar las líneas del archivo de registro. Por otra parte, nuestro guión de ejemplo solamente intenta probar que con unas etapas simples se puede alcanzar nuestra meta por más de un intrincado camino. Puede que circunstancias concretas necesiten de otras verificaciones, pero considerando el hecho de que miles de servidores alquilados en centros de datos, no son comprobados en absoluto y solamente sobreviven por pura casualidad, el guión del ejemplo es

Combinaciones Curiosas Es posible iterar sobre todos los ficheros de un directorio con un bucle for y transformar los ficheros con otras herramientas. En este caso, utilizando el paquete ImageMagic, convertimos todos los jpgs y pngs de un directorio en TIFFs de alta resolución en el espacio de color CMYK, aptos para ser impresos. 01 02 03 04 05 06 07 08 09

Herramientas para Bash Aparte de las órdenes que incluye la shell, también se pueden usar unos cuantos programas con Bash. AWK es un potente lenguaje de programación patrón-acción muy útil para editar datos en una tabla. cut corta líneas sueltas a partir de una posición en el texto. head muestra, por omisión, las diez primeras líneas de una archivo y su complementario tail muestra las 10 ultimas. join combina las líneas en dos archivos con un campo índice común. split divide un archivo en varios archivos individuales. nl enumera las líneas de un archivo. Esto es útil si se necesita crear un listado numerado de registros. La ubicua herramienta cat muestra los archivos por la salida estándar de datos o redirecciona la salida estándar hacia los archivos. tac es como cat solo que presenta los archivos del reves, comenzando por la ultima línea. tee redirecciona la entrada a un archivo y sort ordena los archivo. ■ Y la lista continúa…

RECURSOS [1] Listado completo de servercheck: http://www.linux-magazine.es/ Magazine/Downloads/08

for i in $(ls -1 *) do rename \ _ * done

for i in *.jpg *.tif *.png do tiffImage="$i.tif" convert -density 300x300 +compress -colorspace CMYK $i $tiffImage 10 echo "$tiffImage" 11 done

WWW.LINUX- MAGAZINE.ES

EL AUTOR

CHECK_WEB=true if $CHECK_WEB ; then cmd fi

Peer Heinlein ha sido proveedor de servicios de Internet desde 1992. Además de su libro sobre Postfix ha publicado otros dos libros sobre “LPIC-1” y “SNORT” Intrusion Detection System with Open Source Press. La empresa de Peers www.heinleinsupport.de enseña y prepara administradores además de proporcionar servicios de consultoría y soporte para toda Europa.

Número 08

61


DESARROLLO • Infografía - VTK

Visualización Gráfica 3D con VTK (Visualization Toolkit) (2ª parte)

INTERFAZ GRÁFICA 3D

Vemos como crear una Interfaz Gráfica de Usuario (GUI) que contenga un área de renderizado y diferentes “widgets” que permitan modificar,propiedades de la escena, de los actores, etc. POR ANA M. FERREIRO Y JOSÉ A. GARCÍA

E

n el número 6 de Linux Magazine, vimos como crear una escena de renderizado en la que incluimos diferentes “actores”, a los que modificamos sus propiedades. Sin embargo, lo mejor es tener un Interfaz Gráfico (GUI) que permita a cualquier usuario, sin necesidad de entender el código, modificar cualquier propiedad de los actores, del área de renderizado, etc. Hoy por hoy, existen diferentes “toolkits” de ventanas que se pueden importar desde Python, y que además constan de un “widget” específico para contener un área de renderizado de VTK. Entre las diferentes herramientas gráficas, cabe destacar Tkinter, WxPython, PythonQT y Motif; siendo TKinter la opción por la que nos hemos decidido, puesto que por defecto se incluye en cualquier instalación de Python. En lo que sigue veremos los pasos necesarios para incluir una escena de VTK dentro de una GUI generada con TkInter, para terminar incluyendo dos botones, uno que nos permita modificar alguna propiedad del objeto que haya-

62

Número 08

mos colocado en nuestra escena y otro que capture el contenido de la escena para guardarla en una imagen .tiff. En el Listado 5, tenéis escrito el código completo. Lo mejor es que cada vez que tengáis dudas lo miréis, así os va a ser más fácil seguir cada uno de los pasos que se os proponen.

Interpretación de una GUI En el número 6 de la revista vimos que al crear una escena VTK se abre una ventana de renderizado, que permite la interacción con el ratón. Sin embargo, dicha escena ocupa la totalidad de la ventana. Al combinar VTK con TkInter podremos colocar la escena de VTK en un panel concreto de la GUI, según nos interese. Para que resulte sencillo diferenciar los métodos propios de la GUI de los métodos relacionados con el renderizado de la escena, vamos a organizar el trabajo siguiendo una estructura de clases. Si lo pensáis bien, una GUI que contenga un área de renderizado (Figura

WWW.LINUX- MAGAZINE.ES

1), se puede comparar con un televisor. El televisor con los botones y la pantalla, lo podéis imaginar como la interfaz de usuario que contiene el área de renderizado; mientras que lo que vemos, según el canal que se sintonice, va a ser la escena de VTK. Todo esto nos lleva a organizar, de un modo natural, nuestro programa en dos clases (Figura 2): 1) class MyGUI: clase que controla la estructura de la GUI, es decir, los botones, los paneles, los menús, los eventos asociados a los “widgets”, etc. 2) class RenderWindow: clase que controla el área de visualización, la escena, los actores, las propiedades de los objetos, la cámara, el renderizado, los eventos asociados al área de renderizado, etc. NOTA: Para mejor seguir este artículo, conviene tener a manos el código completo del programa, que se puede descargar desde [6].

Creación GUI TKInter Lo primero de todo es importar Tkinter y VTK,


Infografía - VTK • DESARROLLO

Creamos la clase RenderWindow que se va a encargar de todo lo relacionado con la visualización, es decir, con el renderizado, el control de la cámara y las luces, el tipo de interacción del usuario con la escena, etc.

import vtk import Tkinter

La interfaz la vamos a organizar en dos “frames”: fr_renwin donde se colocará la ventana de renderizado y fr_gui que contendrá los diferentes botones. Inicializamos Tkinter, creando una ventana padre root, root=Tkinter.Tk(), en la que colocaremos los frames fr_renwin y fr_gui. Es necesario que nuestra ventana permanezca abierta hasta que el usuario decida cerrarla, lo que se logra mediante root.mainloop(). Según la organización que hemos propuesto, tenemos la clase MyGUI, que se ocupa de los “widgets” de la interfaz, class MyGUI:

En el constructor de la clase es necesario indicarle quien va a ser el contenedor

Listado 1: Constructor clase MyGUI 01 def __init__(self,parent): 02 self.parent=parent 03 parent.title("Mi GUI") 04 fr_renwin = Tkinter.Frame(parent,bg="gray" ) 05 fr_bot= Tkinter.Frame(parent) 06 fr_renwin.pack(side="top", anchor="n", 07 expand=1, fill="both") 08 fr_bot.pack(side="bottom", anchor="s", 09 expand="t", fill="x") 10 lsup = Tkinter.Label( fr_renwin, 11 text="Frame de la escena",fg="red") 12 lsup.pack(side="top", expand="t") 13 14 l1 = Tkinter.Label(fr_bot, text="Frame de botones") 15 l1.pack(side="top", expand="t", fill="x") 16 parent.update()

class RenderWindow:

Figura 1: Estructura de una GUI con una ventana de renderizado.

padre, root, en el que colocamos los frames fr_renwin y fr_bot, en la parte superior y en la parte inferior, respectivamente. Esta organización se corresponde con el código del Listado 1. Para instanciar la clase MyGUI, debemos hacerlo indicando que root va a ser la ventana padre que contenga los diferentes widgets que vamos a ir creando. Esto se indica escribiendo las siguientes líneas de código. root = Tkinter.Tk() app=MyGUI(root) root.minsize(350, 300) root.mainloop()

Guardad este código en un fichero llamado, miguivtk.py, por ejemplo. Si lo ejecutáis (python miguivtk.py), se os abre una ventana con los dos frames (ver Figura 3).

Widget vktRenderWindow

El constructor de esta clase se va a encargar de instanciar vtkTkRenderWidget, crear el área de renderizado y sus propiedades. Recordad que vtkTkRenderWidget es un tipo de widget de Tk, por tanto, es necesario decirle cual va a ser su “widget” padre, pasándolo como argumento cada vez que instanciemos nuestra clase RenderWindow. En el Listado 2 tenéis el código correspondiente a dicho constructor. Instanciamos la clase vtkTkRenderWidget para crear un widget de Tk (que hemos llamado self.vtktkwidget), indicando que su “padre” es parent. Mediante self.ren = vtkpython.vtkRenderer() se crea un área de renderizado de VTK, que añadimos a la ventana de renderizado que tiene asociada el widget self.vtktkwidget. A dicha ventana se accede mediante el método GetRenderWindow. Mediante el método TwoSidedLightingOn colocamos dos luces encendidas en nuestra escena. El método GetActiveCamera() permite obtener la cámara que por defecto viene incluida en la escena. Si ejecutamos de nuevo el código… ¡nada ha cambiado! La razón es obvia: Desde la GUI no hemos instanciado nuestra clase RenderWindow. En el constructor

La clase vtkTkRenderWidget es un widget de Tk, que permite renderizar en su interior. Mediante el método GetRenderWindow se devuelve una ventana de renderizado, vtkRenderWindow, a la que se le puede asociar un área de renderizado vtkRenderer. Este “widget” puede reaccionar a los eventos (de ratón, de teclado) como cualquier otro “widget” de Tk. Para poder utilizar este “widget” necesitamos en primer lugar importarlo, import vtkRenderWidget

WWW.LINUX- MAGAZINE.ES

Número 08

63


DESARROLLO • Infografía - VTK

(__init__) de la clase MyGUI, debemos instanciar la clase RenderWindow. Basta añadir en dicho constructor las sigientes líneas de código self.renwin=U RenderWindow(fr_renwin)

Fijaos que como argumento pasamos fr_renwin, esto es porque el widget que contiene el área de renderizado lo situamos dentro de dicho frame. Ahora la ejecución ha cambiado. Tenemos un área de color azul, que es el área de renderizado de la escena

Listado 3: Métodos clase RenderWindow para crear una esfera. 01 def create_esfera(self): 02 esfera = vtk.vtkSphereSource() 03 esferaMapper = vtk.vtkPolyDataMapper() 04 esfera.SetPhiResolution(10) 05 esfera.SetThetaResolution(20) 06 esfera.SetCenter(0.3,0.0,0.0) 07 esferaMapper.SetInput(esfera.G etOutput()) 08 esferaActor = vtk.vtkActor() 09 esferaActor.SetMapper(esferaMa pper) 10 esferaActor.GetProperty().SetC olor(0.7,0.0,0.25) 11 esferaActor.GetProperty().SetO pacity(1) 12 esferaActor.GetProperty().SetL ineWidth(1) 13 return esferaActor 14 15 16 def add_esfera(self): 17 self.esfera_actor=self.create_esfera() 18 self.add_actor(self.esfera_actor) 19 self.render_window()

64

Número 08

(ver Figura 4). Seguro que os preguntaréis, ¿cómo sé yo que es un área de renderizado y no un simple frame de color azul? Por el momento no hemos creado ningún actor para que se aprecie la diferencia, sin embargo, si cerramos la ventana obtenemos el siguiente warning: “A TkRenderWidget is being destroyed before its associated vtkRenderWindow is destroyed…”. Dicho mensaje, que antes no teníamos, nos avisa de que debemos destruir la ventana de renderizado antes que el widget que la contiene, porque en ciertas ocasiones podrían quedar procesos corriendo sin que lo apreciemos. Antes de nada, debemos decirle a nuestra GUI qué hacer cuando se activa el protocolo WM_DELETE_WINDOW (define lo que ocurre cuando el usuario explícitamente cierra la ventana mediante el botón cerrar). En el constructor de la clase MyGUI debemos escribir,

Figura 2: Clases del programa.

self.renwin.Render() def resetcamera(self,evt=None): self.ren.ResetCamera() self.renwin.Render()

parent.protocol(U "WM_DELETE_WINDOW", self.quit)

El método que estamos llamamos al cerrar la ventana es self.quit,

Figura 3: Ventana de Tkinter con dos frames.

def quit(self): self.parent.quit()

Volvamos a ejecutar el código. Fijáos que ya no aparece ninguna advertencia al cerrar la ventana. De este modo destruimos los distintos objetos instanciados en el orden correcto.

Actores a Escena En este punto ya tenemos todo lo necesario para incluir actores en la escena. En la clase RenderWindow tenemos que crear los siguientes métodos: (1) add_actor: añade un actor a la escena; (2) render_window: se ocupa del renderizado de la escena; (3) resetcamera: se ocupa de “resetear” la cámara y renderizar la escena, permitiendo ver la totalidad de la escena. Basta escribir las siguientes líneas de código, def add_actor(self,nameactor): self.ren.AddActor(nameactor) def render_window(self):

WWW.LINUX- MAGAZINE.ES

En la escena vamos a situar una esfera; para ello, dentro de la clase RenderWindow incluimos, las funciones create_esfera y add_esfera del Listado 3. El método create_esfera construye una esfera según los métodos propor-

Listado 2:Constructor clase RenderWindow. 01 def __init__(self, parent): 02 self.vtktkwidget = vtkRenderWidget.vtkTkRenderWid get (parent) 03 self.vtktkwidget.pack (expand='true',fill='both') 04 self.ren = vtk.vtkRenderer () 05 self.ren.TwoSidedLightingOn () 06 self.renwin = self.vtktkwidget.GetRenderWind ow () 07 self.renwin.AddRenderer (self.ren) 08 self.camera = self.ren.GetActiveCamera() 09 self.ren.SetBackground(0.1, 0.1, 0.9)


Infografía - VTK • DESARROLLO

cionados por VTK (en el número 6 explicamos el modo de crear un actor y acceder a sus propiedades), devolviendo el actor esferaActor. El método add_esfera incluye todos los comandos necesarios para colocar la esfera dentro de nuestra escena. Llamemos a la función add_esfera, dentro del constructor de la clase RenderWindow, self.add_esfera()

Si habéis seguido todos los pasos, deberíais estar viendo dentro de la escena

Listado 4: Deslizable y Botones GUI s01

.

02 . 03 . 04 self.transp_valor = Tkinter.IntVar() 05 self.transp_valor.set(100) 06 s_transp = Tkinter.Scale(fr_bot,from_=0,t o=100, 07 orient="horizontal", 08 variable=self.transp_valor, 09 label="Transparencia") 10 s_transp.pack(side="top", fill="x", expand="false") 11 s_transp.bind("<Button-1>",lam bda e:self.ModifyTransp(e)) 12 s_transp.bind("<B1-Motion>",la mbda e:self.ModifyTransp(e)) 13 14 bsave= Tkinter.Button(fr_bot, text="Guardar Imagen", 15 command=self.guardar_imagen) 16 bsave .pack(side="top", expand="t") 17 bquit = Tkinter.Button(fr_bot, text="Salir", 18 command=self.quit) 19 bquit .pack(side="top", expand="t") 20 . 21 . 22 .

una esfera, igual que la los actores, la escena, de la Figura 5. Seguro que etc. alguien se está preguntanDentro de nuestra vendo: “¿Por qué no veo la tana vamos a incluir, en esfera en su totalidad?” el frame fr_bot, los Recordad que el mes siguientes widgets: un anterior, explicamos que deslizable (Tkinter.Scale) cuando situamos un actor para controlar la transpaen la escena, no se modirencia de la esfera; un fica la posición de la botón que nos permita cámara. Por tanto, si queFigura 4: GUI con un área guardar la escena en una remos ver la escena en su de renderizado. imagen en formato .tiff y totalidad basta “resetear” un botón para cerrar la la camara. Como somos aplicación. Escribamos en previsores, ya habíamos el constructor (__init__) creado el método resetcade la clase MyGUI, las mera para dicha finalilíneas de código del dad. Basta escribir Listado 4. self.resetcamara(), justo El deslizable s_transp después de self.add_esfellama al método ra(). Ahora ya vemos la self.ModifyTransp cuando esfera centrada en la escese pulsa el botón izquierna (Figura 6). do del ratón (evento Figura 5: GUI con una esceRecordaréis que dentro <Button-1>) o se desplana que contiene una esfera de la ventana de renderiza el ratón con dicho como actor. zado se puede interactuar botón presionado (evento con el ratón. Probad a <B1-Motion>). Al clicketrasladar la esfera, hacer zoom, etc. ¿No ar con el ratón sobre el botón bsave, se os resulta más sencillo mover la esfera llama al método self.guardar_imagen; que en los ejemplos que vimos en el mientras que si se pulsa bquit se ejecta número 6? Si lo comparáis, os daréis self.quit. El método self.quit ya lo tenecuenta de que el actor se traslada y rota mos, así basta escribir el código corresde un modo diferente. La razón de esto pondiente para los otros dos métodos. es que se pueden modificar el modo de Antes de detallar cada método por sepainteractuar con el ratón dentro de una rado, debemos comprobar que la estrucventana de renderizado de VTK. En este tura de nuestra GUI es correcta. Para no caso concreto, la clase tener problemas a la hora de probar el vtkTkRenderWidget ya crea una ventana programa, por el momento escribid, de renderizado donde el tipo de interacción con el ratón ya viene modificado, para que podamos controlar mejor los diferentes actores.

Control de Escena Hasta ahora lo que hemos implementado nos permite abrir una ventana de TkInter que contiene un área de renderizado, cuya escena ya contiene una actor. Pero la finalidad de crear una interfaz gráfica, es que mediante widgets podamos controlar, en la medida de lo posible,

WWW.LINUX- MAGAZINE.ES

Número 08

65


DESARROLLO • Infografía - VTK

def guardar_imagen(self,U evt=None): pass

Ahora la GUI tendría que tener la estructura de la Figura 7, donde el único botón que funciona es el de “Salir”. Para implementar el método guardar_imagen de la clase MyGUI va a ser necesario acceder, desde la clase MyGUI, a la ventana de renderizado (renwin) de la clase RenderWindow. Para ello,dentro de RenderWindow escribimos el siguiente método, def get_renwin(self): return self.renwin

El Listado 5 contiene el código que nos permite guardar la escena en una imagen, de formato .tiff. La clase vtkWindowToImageFilter es un filtro que convierte RenderWindows o ImageWindows al formato de una imagen; produciendo una imagen de la escena de renderizado. La salida de este filtro se pasa como argumento a la clase vtkTIFFWriter, que se ocupa de escribir la imagen en formato TIFF. Mediante writer.SetFileName("myscene.tif") indicamos el nombre del fichero en el que vamos a guardar la imagen.

Listado 5: Método Guardar Imagen de Tipo .tiff 01 def guardar_imagen(self,evt=None): 02 w2imgfil = vtk.vtkWindowToImageFilter() 03 writertiff = vtk.vtkTIFFWriter() 04 w2imgfil .SetInput(self.renwin.get_renwin()) 05 w2imgfil .Update() 06 writertiff.SetInput(w2imgfil .GetOutput()) 07 writertiff.SetFileName("myscene.tif") 08 self.renwin.render_window() 09 writertiff.Write()

66

Número 08

Tened en cuenta, que Mediante self.transp_ para generar la imagen, valor.get() se obtiene el es necesario tener perminuevo valor del Slice sos de escritura en el s_transp cada vez que se directorio donde se vaya modifica ante un evento a guardar; en caso condel ratón. Fijáos que los trario nos saldría un valores del deslizable varíerror en la ejecución avian entre 0 y 100, sin sando de que no es posiembargo, el método que ble generar dicha imamodifica la transparencia gen. Figura 6: Recolocación de sólo admite valores entre 0 Probad de nuevo el la cámara. y 1, por eso dividimos programa y pulsad el valor_transp por 100. botón “Guardar Imagen”. Después se llama al métoEn principio parece que do modify_opacity_esfera no hemos hecho nada, de la clase RenderWindow. pero en el mismo directoSi habéis seguido todos rio de trabajo tenéis un los pasos, comprobaréis fichero llamado “myscecomo se modifica la transne.tif”, donde se almaceparencia de la esfera a na exactamente la última medida que varían los escena que hemos rendevalores del deslizable. rizado. Ahora que ya sabéis todo Recordad que nos falta lo necesario para crear una Figura 7: GUI con deslizable implementar el código GUI con una ventana de y botones. para modificar la transparenderizado de VTK, podéis rencia de nuestra esfehacer todas las pruebas que ra. En la clase RenderWindow incluise os ocurran, como por ejemplo: modifimos el método car propiedades de la escena, controlar modify_opacity_esfera(self,valor), donde mediante widgets diferentes actores, etc. ■ valor varía entre 0 y 1, porque es el argumento que vamos a utilizar para fijar la RECURSOS opacidad. Escribamos las siguientes líne[1] Kitware. VTK: http://www.kitware.org as de código, [2] Python: http://www.python.org

def modify_opacity_esferaU (self, valor):

[3] Enthought. Scientific python: http:// www.scipy.org [4] Rediris España:ftp://ftp.rediris.es/

self.esfera_actor.GetProperty() U .SetOpacity(valor) self.render_window()

Queremos que cada vez que deslizamos el widget s_transp, varíe la transparencia de nuestro actor. Para ello, dentro de la clase MyGUI escribimos el siguiente código correspondiente al método ModifyTransp, def ModifyTransp(self,evtU =None): valor_transp=U self.transp_valor.get() valor_transp=U valor_transp/100.0 self.renwin.U modify_opacity_esferaU (valor_transp)

WWW.LINUX- MAGAZINE.ES

[5] MayaVi: http://mayavi.sourceforge.net [6] Descarga de los Listados completos correspondientes a este artículo: http://www.linux-magazine.es/ Magazine/Downloads/08

LOS AUTORES

def ModifyTransp(self,U evt=None): pass

Ana M. Ferreirro Ferreiro es matemática, pero su verdadera pasión es la informática. Así que parte de su tiempo lo dedica al desarrollo en Python de interfaces gráficas multiplataforma, y al desarrollo de software de visualización científica 3D. José A. García Rodríguez también es matemático, y actualmente está finalizando su tesis en la Universidad de Málaga. Desde hace unos años se dedica al desarrollo de código paralelo y optimización de códigos en C++.


Python • DESARROLLO

Los wikis están de moda y son unas de las mejores demostraciones de la web, ¡y ni siquiera son complicados de programar!

WIKI WIKI… ¿PYTHON? Ward Cunningham fue el pionero en el mundo de los WikiWikis. Su WikiWiki es el más antiguo del mundo: Cunningham \& Cunningham, Inc.. Lo puedes encontrar en http://c2.com. Ya que estamos, consulta el wiki más famoso de la actualidad y podrás obtener datos suyos: http://en.wikipedia.org/wiki/ Ward\_Cunningham. POR JOSÉ PEDRO ORANTES Y JOSÉ MARÍA RUÍZ

A

hora entremos en c2.com y echémosle un vistazo… ¿ya lo has visto? Entonces te habrás percatado de lo simple que es. Fue creado pensando en la simplicidad de formas, para que fuese una herramienta más que un escaparate. El objetivo es que las personas que los visitasen fueran dejando pequeños trozos de información, de manera que el sistema creciese solo. c2.com también es muy simple en cuanto a programación y en este número replicaremos gran parte del mismo con un programa en Python que no llega a las ¡¡200 líneas!! De nuevo Python nos demuestra su potencia.

Nuestro propio WikiWiki Vamos a crear nuestro propio WikiWiki en Python. No es una tarea tan complicada como pudiera parecer. La receta para nuestro WikiWiki es: 01 Mucho CGI 02 Un poco de ExpresionesU Regulares 03 Algo de Manipulación deU ficheros 04 Un Servidor Web al antojo delU

lector que permita CGI U (casi todos lo hacen)

Con estos ingredientes vamos a programar un wiki hecho y derecho, que podremos ampliar a nuestro antojo. NOTA: Para poder seguir el resto del artículo, convendría tener a mano el listado completo del programa wiki.py, que se puede descargar de [5].

Cómo funciona un WikiWiki Este es el primera paso en el ataque de cualquier programa: saber exactamente lo que queremos. Vamos a seguir las reglas de c2.com. El wiki se compondrá de páginas enlazadas entre sí. Los enlaces estarán representados por palabras clave que tienen una forma especial: estarán formadas por 2 o más palabras juntas (sin espacios o separadores) cada una de las cuales comenzará en mayúscula. Esto puede parecer confuso, así que vamos a ver algunos ejemplo. Comencemos con los erróneos, las siguientes NO son palabras clave: Hola Una Cosa

WWW.LINUX- MAGAZINE.ES

Otra-Cosa softwareLibre 3cerditos

Ninguna de ellas corresponde con nuestro patrón. Ahora vamos a ver unas cuantas que sí lo hacen: HolaMundo UnDosTres LinuxMagazine FreeBsd WikiWiki (ya os podeis imaginarU porqué se llaman WikiWiki y noU Wiki, no serviría como palabraU clave ;) )

Ahora que hemos visto las palabras clave vamos a ver como se utilizan. La verdad es que no tiene mucho que explicar, simplemente las pones, es decir: Esto es un texto de un WikiWiki para LinuxMagazine. En este ejemplo tanto WikiWiki como LinuxMagazine se convertirían automáticamente en palabras clave. Las páginas de wiki serán editables, de manera que cualquiera podrá pulsar el botón “Editar” y cambiar, borrar o

Número 08

67


DESARROLLO • Python

Figura 1: El padre de todos los wikis de Ward Cunningham.

Figura 2: Nuestro formulario de edición del Python Wiki.

añadir texto a la página. Dentro de este proceso puede introducir palabras clave que no estén presentes en el WikiWiki. De esta manera se crean nuevas páginas. El texto que editaremos estará en formato HTML, de esta manera podremos introducir formateo, como por ejemplo listas o negritas. Una vez editada la páginas podremos guardarla, y a partir de entonces estará disponible la versión modificada. En teoría no debería ser posible eliminar páginas, el objetivo del WikiWiki es acumular información. Como la única manera de crear nuevas páginas es añadir palabras clave a páginas ya existentes nos aseguramos de que cualquier página sea accesible desde otra. No tendremos páginas sueltas.

¿no? POST es distinto, el navegador y el servidor se pasan información usando el protocolo HTTP, de manera que no veremos pasar las variables A efectos de nuestro programa, no nos importa usar GET o POST, lo que nos interesa es el concepto de CGI. Nuestro programa recogerá variables y generará las páginas dependiendo de ellas Para ello usaremos el módulo cgi de Python:

CGI El “Common Gateway Interface” es un protocolo que permite a un servidor web enviar información y recibirla desde un programa exterior. Básicamente el servidor web delega la generación de las páginas en programas externos que obtienen sus parámetros de éste. Estos parámetros pueden ser enviados de dos maneras o métodos distintos: “GET” y “POST”. Es la manera que tiene el navegador de intercambiar información con el servidor web remoto. “GET” simplemente pasa los parámetros a través de la “URL” que el navegador pasa al servidor. Lo podemos ver cuando visitamos muchas páginas, la url tiene un formato parecido a http://www.algunaweb. org/algo.algo? variable1=valor1\&variable2=valor Lo que está ocurriendo es que el navegador le está pasando 2 variables al servidor ( “variable1” y “variable2”). La URL usa el símbolo ? para separar la ruta de las variables y el símbolo \& para separar variables entre sí. No es muy complicado

68

Número 08

import cgi

Éste módulo nos permite recoger las variables que nos pasa el servidor web. Para ello tenemos que usar la función cgi.FieldStorage(). Esta función nos devuelve un diccionario de objetos del tipo FieldStorage. Cada uno de ellos contiene la información de una de las variables. De toda esa información solo nos interesará el valor de la misma, que es accesible haciendo lo siguiente: variables = cgi.U FieldStorage() valor = variables["nombre"].U value

Así podremos obtener el valor de la variable. Al ser un diccionario lo que devuelve, podremos preguntar si está presenta alguna variable en particular usando el método has\_key(): variables.has\_key("nombre")

Formularios HTML Parte vital del WikiWiki es el poder editar el contenido de las páginas. Para ello HTML dispone de los formularios, que nos permiten recoger información y enviarla al servidor web. Los formularioss HTML se componen de muchos controles como por ejemplo botones, campos de texto, etiquetas o casilleros. Se diseñaron para ser lo más

WWW.LINUX- MAGAZINE.ES

parecidos posible a auténticos formularios burocráticos. Nuestra necesidad se cubre con un formulario que incorpore un “área de texto” y un botón para guardar el texto editado. Vamos a ver lo básico. Un formulario HTML está encerrado entre dos etiquetas <form> y </form>. La primera de ellas lleva una serie de datos que definen el comportamiento del formulario. Nosotros queremos poder controlar el método de envío (POST o GET) y el programa que recibirá los datos (wiki.py). <form method="POST"U action="wiki.py"> ... </form>

Dentro del formulario se definen los controles que mostrará. Cada uno de ellos, a su vez, define una serie de parámetros. El primero de ellos será un textarea. ... <textarea cols="55" rows="10"U name="texto"></textarea> ...

cols indica el número de columnas (de un carácter de ancho) y rows el número de filas. El parámetro name define el nombre con el que el contenido del textarea será enviado al servidor web, hemos escogido el poco original nombre de texto. El segundo tipo de control que necesitaremos es input: ... <input type="submit" value=U "Editar"> </input> <input type="hidden" name=U "editar" value="algo"> </input> ...

Aquí vemos los dos tipos que necesitamos. El parámetro type se usa para especificar el tipo, pues existen varios diferentes. En nuestro caso tenemos: submit, que genera un botón cuyo título se recoge del parámetro value. Este botón, al ser pulsado, envía los datos la servidor. Y hidden, que se usa para pasar al servidor datos no relacionados con controles. En nuestro caso pasamos la variable editar=algo.


Python • DESARROLLO

El resultado final se puede ver en la Figura 3.

Diseño de la Aplicación El WikiWiki funcionará de la siguiente manera. Cuando se acceda por primera vez, al no estar presente ninguna variable, generaremos una página web de presentación. Esta primera página tendrá un botón que nos permitirá editarla. Para ello incluiremos un botón dentro de un formulario html, que enviará una variable editar con la cadena WikiWiki como valor. Nuestro programa se arrancará de nuevo, pero en esta ocasión verá la variable editar y en lugar de generar una página, buscará en el directorio en que esté la existencia de un fichero WikiWiki.txt. Si está presente cargará su contenido en un textarea que nos permitirá editarlo. Vendrá acompañado por un botón guardar que al ser pulsado enviará dos variables: guardar con el nombre de la página (WikiWiki en este caso) y texto con el texto que hemos editado. Cuando wiki.py detecte ambas variables procederá a guardar el contenido de texto en un fichero con el nombre que contenga la variable guardar concatenado con .txt. El texto, antes de ser guardado, se analiza en busca de palabras clave. En el caso de que aparezcan se realizará la siguiente transformación en el caso de que exista la página (o sea, el fichero WikiWiki.txt)… ....WikiWiki... en ...U <a href="wiki.py=?pagina=U WikiWiki"> WikiWiki</a>...

… o se realizará la transformación… ...WikiWiki... en ...U WikiWiki <a href="wiki.py=U ?pagina=WikiWiki">?</a>...

… en el caso de que no exista, para indicar con el ? que esa página hay que cre-

Figura 3: ¡Bien! Nuestra página ha sido guardada.

arla. Para ello solo tenemos que pinchar sobre las ?, rellenar el textarea y pulsar en guardar (al igual que antes). Luego podemos tendremos que controlar 4 estados: • Que no vengan variables, generamos la web de bienvenida • Que venga la variable pagina, y cargaremos la página correspondiente • Que venga la variable “editar”, y cargaremos en modo de edición la página indicada • Que vengan las variables “guardar” y “texto”, y procederemos a guardar el texto que nos envían

Análisis del Texto Para localizar las palabras clave emplearemos “Expresiones Regulares”. Ya se vieron en un número anterior. Lo importante ahora es localizar la expresión regular que encaja con una palabra clave. Ya vimos que están compuestas por 2 o más palabras, cada una de las cuales con la primera letra en mayúscula. Para indicar que queremos una palabra con la primera letra en mayúscula y al menos 2 letras usamos la expresión regular: [A-Z][a-z]+. Si queremos indicar que son dos palabras usaremos [A-Z][a-z]+[A-Z][a-z]+. Pueden ser más, así que metemos la segunda parte en unos () y le adosamos un + para indicar que por lo menos hay una. Ya tenemos nuestra expresión regular: [A-Z][a-z]+[A-Z][a-z]+[A-Za-z]* Ahora que ya podemos localizar las palabras clave, vamos a sustituirlas en el texto por hiperenlaces a sus respectivas páginas. Para ello compilaremos la expresión regular y sacaremos una lista de ellas. Para hacerlo usamos el método findall(), que nos devolverá una lista con todas las cadenas que se ajusten al patrón. Pero tendremos un problema: algunas de las cadenas estarán duplicadas. ¿Cómo limpiamos una lista de Python de componentes duplicados? Se puede hacer de muchas maneras, (alguien en Internet lo ha hecho así: reduce(lambda l, x: x not in l

WWW.LINUX- MAGAZINE.ES

and l.append(x) or l, a, []) siendo a la cadena, pero explicar esta simple línea nos llevaría un artículo entero). Lo que podemos hacer es emplear un poco de matemáticas. Python nos permite generar un conjunto desde una lista. Un conjunto puede contener diversos elementos, pero no importa su cantidad solo si están presentes. Veámoslo de una manera sencilla. Supongamos que tenemos la lista: [1,1,1,3,4,5,5,6] y que generamos un conjunto usando la función set([1,1,1,3,4,5,5,6]). El resultado será el conjunto {1,3,4,5,6}. Python nos permite iterar sobre un conjunto, extrayendo un elemento distinto cada vez. Esto nos permite realizar el siguiente truco: 01 02 03 04 05 06 07 08 09 10 11

> > > l i s t a = [1,1,1,3,4,5,5,6] >>> conj = set(lista) >>> for elemento in conj: ... print "Elemento: ", elemento ... Elemento: 1 Elemento: 3 Elemento: 4 Elemento: 5 Elemento: 6 >>>

Así que convertiremos nuestra lista de palabras en un conjunto y lo recorreremos de esta manera. Como ya tenemos las palabras solo tenemos que reemplazarlas

Número 08

69


DESARROLLO • Python

WikiWiki">WikiWiki</a>...">...U <a href="wiki.pl\$pagina=U WikiWiki">WikiWiki</a>...</a>..."

Un desastre vamos, así que usaremos el conjunto. Con esto hemos visto la función parseaEnlaces() de nuestro WikiWiki, una función vital y muy útil.

...WikiWiki... -> ...U <a href="wiki.pl\$pagina=U WikiWiki">WikiWiki</a>...

Pero al encontrar otra vez la palabra clave WikiWiki en la lista sustituiríamos los WikiWiki recien insertados por el hipervínculo de nuevo: ...<a href="wiki.pl\$pagina=U WikiWiki">WikiWiki</a>... -> ...<a href="wiki.pl\$pagina=...U <a href="wiki.pl\$pagina=U

Generación de HTML Bueno, ahora nos encargaremos de generar el HTML. Gracias a CGI la tarea consiste en realidad en imprimir el código HTML usando print. El HTML devuelto por CGI tiene una peculiaridad, debe ser enviado con una etiqueta que indica el tipo de información que contiene. Además, esta etiqueta tiene que ir separada por dos retornos de carro (dos intros) del resto de la página. La etiqueta en cuestión es: print "Content-Type:ßs text/html" print print

Esos print sin parámetros imprimen los retornos de carro. Para facilitar el diseño del código hemos dividido la generación de la página en 3 funciones: def def def def

cabecera(titulo) cuerpo(titulo, texto)U editarCuerpo(titulo,texto) pie()

Toda página tendrá una cabecera, que imprime la parte no visible, como las etiquetas <title>, y un pie, que cerrará la página HTML ( </body> </html> ). En medio estará el cuerpo, que puede ser generado por cuerpo o por editarCuerpo. Esta segunda función lo que presenta es un formulario para editar el contenido de una página. El texto de cuerpo() se genera normalmente usando una variable contenido de tipo string. Dependiendo de las circunstancias contendrá una información u otra. Las funciones: def pagina(titulo, texto) def editaPagina(titulo, texto)

Figura 4: La creación de una página con el formulario vacío.

70

Número 08

Se encargan de generar las páginas usando las 3 funciones anteriores. Esto simplifica mucho el código y nos permite generar páginas de manera sencilla.

WWW.LINUX- MAGAZINE.ES

Figura 5: La página de bienvenida de nuestro wiki.

Cada vez que tenemos que interactuar con el sistema de ficheros usamos: def cargaPagina(titulo) def guardaPagina(titulo,texto)

cargaPagina() devuelve el contenido de la página que se pasa como parámetro.

Últimos Detalles Hemos de tener en cuenta que el programa wiki.py debe tener permisos de escritura en el directorio donde se encuentre, puesto que ahí será donde deposite los ficheros. También tenemos que darle permiso de ejecución (bastará con chmod +x wiki.py) Ya sólo nos queda copiar wiki.py al directorio adecuado en introducir en el navegador la URL (varía según nuestra configuración): http://localhost/cgi-bin/ wiki.py Aparecerá una página como la mostra■ da en la Figura 4

RECURSOS [1] http://c2.com [2] http://en.wikipedia.org/wiki/ Ward\_Cunningham [3] http://www.python.org [4] http://cgi.resourceindex.com/ [5] Descarga del Listado: http://www. linux-magazine.es/Magazine/ Downloads/08

LOS AUTORES

por sus hipervínculos correspondientes. Pero, como la presentación variará dependiendo de si la página ya existe o no, tendremos que comprobar con un IF esa condición. Entonces reemplazaremos en el contenido de la página la palabra clave por el hipervínculo correcto. Usaremos la función replace() de string. replace() acepta 2 parámetros, el primero es la cadena a ser sustituida y la segunda la cadena con la que vamos a sustituir. Una sola ejecución de replace() realizará todas las sustituciones de una vez. Esa es la razón por la que hemos realizado el truco del conjunto: si se repitiese alguna cadena en la lista de palabras claves nos ocurriría lo siguiente. Con la primera realizaríamos el cambio:

José Pedro Orantes Casado cursa 3º de Ingeniería Técnica en Informática de Sistemas y desde hace varios años utiliza linux como herramienta de trabajo y como sistema de escritorio. Jose María Ruíz está realizando el Proyecto Fín de Carrera de Ingeniería Técnica en Informática de Sistemas y lleva mas de 7 años usando y desarrollando Software Libre, y desde hace 2 en FreeBSD


La Columna de Charly • ADMINISTRACIÓN

El día a día del Administrador de Sistemas: Correo y Queuegraph

AYUDA CON EL CORREO Gusanos, mail bombing y usuarios que envían ficheros Powerpoint de varios Megas a través de la red proporcionan a los administradores de Postfix muchas razones para echarle un vistazo a la carga de su servidor de vez en cuando. POR CHARLY KÜHNAST

M

ailgraph hasta ahora me ha proporcionado información útil durante bastante tiempo. Es hora de prestarle atención a esta herramienta de visualización para los ficheros de registro de Postfix y presentar el proyecto Queuegraph relacionado. Mailgraph [1] es un servicio de pequeño tamaño que continuamente lee de los ficheros de registros de Postfix y reúne los datos en una base de datos round

se puede obtener desde el archivo CPAN. El corazón de Mailgraph es un script de Perl denominado mailgraph.pl, el servicio al que hice referencia anteriormente. Se puede arrancar el servicio manualmente, pero tiene más sentido añadir el script init proporcionado por la distribución para ejecutar el servicio cuando arranque la máquina. Utilizo el siguiente comando para arrancar Mailgraph: mailgraph --daemon --logfile U /var/log/postfix U --ignore-localhost

Figura 1: Podemos ver estadísticas de entrada y salida de mensajes en el navegador.

robin (RRD). El interfaz de usuario es un script CGI que genera un gráfico basado en los datos de la RRD. El programa requiere la ruta del intérprete de Perl, RRDTool [2] para la base de datos y el módulo Perl File::Tail, que

SYSADMIN Gestor de Backups de MySQL….…. 72 ¿Porqué escribir su propio script cuando puede utilizar esta herramienta de backup disponible para MySQL?

El parámetro -ignore-localhost impide que el tráfico de correo procedente de o dirigido hacia 127.0.0.1 sea capturado, ya que este tráfico normalmente tiene que ver con conexiones a los filtros de spam o antivirus que se estén ejecutando en la misma máquina. He utilizado mailgraph.cgi para mostrar los resultados. Se necesitaría modificar los path en las RRDs (una para el tráfico de correo y otra para virus e información de spam) en el script. Mailgraph también necesita un directorio temporal en el que el servidor web pueda escribir. En mi equipo, lo configuré con: my $rrd = U '/var/log/mailgraph.rrd'; my $rrd_virus = '/var/log/ U

Eso es todo. Tras permitirle a Mailgraph obtener datos por un momento, se puede llamar a http://web-URL-del-servidor/ cgi-bi/mailgraph.cgi para ver los resultados (ver Figura 1).

Reptando Queuegraph, una herramienta que tiene un aspecto muy parecido a Mailgraph, muestra las estadísticas de la cola de correo [3]. A diferencia de Mailgraph, Queuegraph no crea automáticamente la RRD cuando se lanza por primera vez. Necesitamos ejecutar un script denominado createrrd.sh para hacer esto. No hemos de olvidar modificar el path para la RRD en el script, si no faltará el path a /etc/postfix. Queuegraph no es un servicio, sino que se ejecuta por el cron una vez por minuto: * * * * * /usr/local U /bin/count.sh &

En count.sh, simplemente necesitamos modificar el path al RRD, a menos que aceptemos el que viene por defecto. Podemos colocar los dos scripts CGI en el directorio de CGI en nuestro servidor ■ web junto con mailgraph.cgi.

RECURSOS [1] Mailgraph: http://people.ee.ethz.ch/ ~dws/software/mailgraph/

El Taller del Administrador: Rsync…75 Rsync envía ficheros a otro equipo y SSH los mantiene fuera del alcance de los fisgones.

mailgraph_virus.rrd'; my $tmp_dir = '/tmp/mailgraph';

[2] RRDTool: http://people.ee.ethz.ch/ ~oetiker/webtools/rrdtool/ Figura 2: Queuegraph utiliza una solución similar a Mailgraph.

WWW.LINUX-MAGAZINE.ES

[3] Queuegraph: http://www.stahl.bau. tu-bs.de/~hildeb/postfix/queuegraph/

Número 08

71


ADMINISTRACIÓN • SQL

Copias de seguridad con MySQL Backups Manager

SALVAVIDAS DE DATOS Nuestro servidor Web funciona bien a la hora de servir HTML, pero a la hora de hacer copias de seguridad de una simple base de datos MySQL, nos encontramos solos ante el peligro… ¿O tal vez no? POR JAMES MOHR

I

ncluso si sólo se trata de una pequeña página Web no comercial, la información que almacenamos en la base de datos MySQL puede ser muy importante para nosotros. Si la base de datos se modifica con frecuencia una copia de seguridad fiable es aún más importante. Desafortunadamente, las herramientas que los servidores Web nos ofrecen para hacer backups de nuestros datos con frecuencia engorrosas como poco. Recientemente realicé un buen número de cambios en la base de datos de mi sistema de pruebas y me quedé realmente preocupado de qué pasaría si hubiese perdido dicha base de datos. Hago copias de seguridad de mi equipo regularmente, simplemente copiando los ficheros MySQL. Esta opción funciona, pero recuperarse de una caída así tiene sus problemas. Por ello, empecé a buscar otras soluciones. Después de considerar muchas alternativas para copias de seguridad de bases de datos SQL me centré en el MySQL Backups Manager de Indexsoft [1]. Podemos ejecutar MySQL Backups Manager en un servidor Web usando cualquier navegador, o bien mediante un script de línea de comandos. Sería muy acertado llamar al MySQL Backups Manager un front-end del programa mysqldump, pero esta herramienta hace definitivamente muchas más cosas. Por

72

Número 08

ejemplo, la información de conexión de bases de datos se guarda dentro del archivo primario de configuración, y sólo tenemos que referenciar esa base de datos para que se haga un backup de ella. Es más, MySQL Backups Manager incluye un buen número de características adicionales que simplifican la tarea de administrar las copias de seguridad de múltiples equipos. MySQL Backups Manager se distribuye bajo licencia comercial, pero con un coste de alrededor de 15$, es una excelente inversión. MySQL Backups Manager está escrito en Perl usando herramientas MySQL estándar y puede ejecutarse en cualquier sistema que soporte Perl y MySQL. Aunque el servidor Apache no es estrictamente necesario, lo necesitaremos si queremos sacar partido de la interfaz Web de MySQL Backups Manager.

Instalación y Configuración Básica El paquete de MySQL Backups Manager viene en un pequeño archivo comprimido. Al descomprimirlo, encontraremos el script backupsmanager.cgi y el directorio modules que contiene los módulos Perl para FTP y correo. Aunque las instrucciones dicen que copiemos el script CGI en el lugar desde el que lo vamos a ejecutar (normalmente el directorio cgi-bin de nuestro servidor Web), esto

WWW.LINUX-MAGAZINE.ES

no funcionará salvo que el directorio modules esté incluido en las rutas de perl. La manera más fácil es simplemente copiar todo en nuestro directorio cgi-bin. El primer paso para configurar el paquete es ejecutar el script CGI con un navegador Web. Por ejemplo: http://linux.local/cgi-bin/backupsmanager.cgi. Este paso crea el fichero de configuración (backupsmanager.pm) y muestra esta configuración en un área de texto en formato HTML estándar. Todos los valores por defecto para las diversas opciones tanto en la interfaz Web como en línea de comandos están definidas en este archivo. Por defecto, sólo una base de datos está definida. La base de datos tiene un aspecto como el siguiente: $mySQLDBName[0] = 'mydb0'; $mySQLHost[0] = 'localhost'; $mySQLUser[0] = 'root'; $mySQLPassword[0] = ''; $mySQLDBEmail[0] = '';

Hemos de asegurarnos de que los permisos están configurados correctamente para el archivo de configuración para prevenir accesos indeseados. Hay variables adicionales, como las variables que definen el directorio por defecto para los ficheros de volcado y opciones para los diversos programas


SQL • ADMINISTRACIÓN

auxiliares. En general, la función de cada uno es fácil de identificar. Una vez hemos terminado la configuración del programa, podemos crear copias de seguridad desde la interfaz Web simplemente con:

Backups Manager tiene constancia. Significa que se volcará todas las bases de datos dados de un servidor y un usuario. Por lo tanto, si estamos intentando hacer volcados desde varios servidores, debemos tener varios bloques “todo-bases de datos”. Asimismo, esto sólo funciona siendo usuario root, por lo que probablemente no podremos usarlo en el equipo servidor Web.

backupsmanager.cgi --db=#

donde # es el número de la base de datos tal y como se definió en el archivo de configuración. La localización se define con la variable $DBDumpsDir y, por defecto, está en el directorio dumps por debajo del directorio donde reside backupsmanager.cgi. No podemos cambiar este directorio, pero podemos usar la opción --filename= para especificar un archivo distinto al de por defecto, que es el de estructura YYYY-MM-DD.sql.

Transferir los Volcados Incluso aunque podamos ejecutar un cron en el servidor Web para iniciar start MySQL Backups Manager, guardar los ficheros localmente puede no ser siempre la mejor opción. Si queremos conservar distintas copias de seguridad, pero tenemos un espacio limitado en el servidor, probablemente necesitemos una manera de llevar estos ficheros a otra máquina. Como se señaló anteriormente, podemos enviar los archivos de volcado por email. Incluso aunque no podamos enviar emails a otra máquina deberíamos ser capaces de enviar los correos de manera local (esto es, a la dirección de nuestro “webmaster”). Nótese que configurar la dirección de email sólo como webmaster probablemente no funcionará. En vez de esto, deberemos especificar un nombre de servidor (es decir, webmaster@localhost), incluso si estamos enviando los archivos de volcado de un usuario al servidor local. MySQL Backups Manager usa el módulo SendMail.pm para enviar el correo. Si esto no funciona, podemos fijar la variable $SMTP a una orden para enviar el email. Por ejemplo: $SMTP = U '|/usr/sbin/sendmail -t';

Enviar el archivo de volcado por email puede hacerse tanto desde la interfaz Web como desde línea de comandos, usando la opción -mail. Nótese que, si la variable $mySQLDBEmail[] esta fijada

Otras Opciones

Figura 1: El interfaz Web de MySQL Backups Manager.

en nuestro fichero de configuración, entonces este valor se usará siempre, incluso si especificamos la dirección en la línea de comandos o la fijamos en $Default-Email dentro del archivo de configuración. Adicionalmente a enviar el archivo de volcado por email, podemos también usar FTP para transferirlo. MySQL Backups Manager utiliza la información de conexión por defecto de backupsmanager.pm para transferir el archivo. No podemos especificar diferentes servidores FTP para las bases de datos individualmente, como en el caso de las direcciones de correo electrónico. Sin embargo, como podemos imaginar, existen opciones de línea de comandos para especificar la información de la conexión FTP. De esta manera podemos transferir los volcados de las bases de datos al servidor que queramos.

Volcar Todo

Tener un front-end para el comando mysqldump significa que podemos usar básicamente cualquier opción que nos ofrezca. Esto es lo que hace la variable $DumpDBOptions, que por defecto tiene dos opciones: --quote-names y --adddrop-table. Aquí podemos añadir la opción que queramos. Por ejemplo, si queremos crear un volcado que no use inserciones extendidas, podemos añadir --extended inserts=FALSE. El problema que nos encontramos es que $DumpDBOptions aplica en todas las bases de datos. Por lo que, o tenemos inserciones extendidas o no. Podemos salvar esta limitación si consideramos que realmente el comando mysqldump esta compuesto por simple concatenación de las diferentes variables. Entonces, podemos hacer algo como lo siguiente: $mySQLPassword[0] = 'PASSWORD U --extended-insert=FALSE';

Cuando el comando mysqldump se genere, simplemente tendremos la opción -extended-insert a continuación de la contraseña y el comando mysqldump no percibirá ninguna diferencia. En teoría podemos añadirla como una opción a la variable

También se incluye en el archivo de configuración por defecto una plantilla para volcar todas las bases de datos. Funciona básicamente de la misma manera que para las bases de datos individuales, salvo que se especifique el nombre de la base de datos así: $mySQLDBName[1] = U '--all-databases';

Nótese que esto no significa volcar todas las bases de datos de las cuales MySQL

WWW.LINUX-MAGAZINE.ES

Número 08

73


ADMINISTRACIÓN • SQL

$mySQLDBName[0]. Sin embargo, esto acaba creando un directorio de volcado parecido a: $DBDumpsDir/localhost U -----extended-insert= U FALSE linkbat

en vez de $DBDumpsDir/localhost U ---linkbat

simplemente debido a que el nombre del directorio se crea como $mySQLHost[]— $mySQLDBName[]. También debemos tener en cuenta que la posibilidad de definir opciones distintas para diferentes bases de datos es algo que esta planeado para una futura versión. Si automatizamos el proceso de volcado de bases de datos, hay un par de variables más que debemos tener en cuenta. La primera es $ArchiverCommand, que define el archivo o el comando de compresión y las opciones a usar. Por defecto se usa gzip con un nivel de compresión 9. Por defecto, el archivo de volcado no se comprime. Sin embargo, podemos habilitarlo desde la línea de comandos usando la opción --pack. La siguiente es la variable $OldBackups, que le comunica a MySQL Backups Manager que elimine los archivos de volcado cuando lleguen a un determinado número de días de antigüedad. Podemos usar la opción --old en la línea de comandos para especificar el número de días. Nótese que no existe un mecanismo que borre los archivos viejos independientemente del volcado, sino que los archivos se borran como parte de un proceso de volcado.

El Interfaz Web Hasta ahora, sólo se ha mencionado realmente la línea de comandos. Pero la razón principal por la que se buscó una solución como la de MySQL Backups Manager fue porque necesitábamos automatizar el proceso de copia de seguridad de nuestros datos. Para iniciar el interfaz Web, usamos la misma URL que se mencionó anteriormente en configuración. Como resultado veremos la página Web que se ilustra en la Figura 1. La primera sección nos permite seleccionar la base de datos adecuada (tal y

74

Número 08

como se se lista en en el archivo backupsmanager.pm). En la segunda sección están las opciones de backup. Por defecto, los archivos de volcado se guardan en subdirectorios del directorio definido por $DBDumpsDir (un subdirectorio por cada base de datos). Sin embargo, seleccionando la opción backup and download it to my computer, MySQL Backups Manager crea un archivo y lo envía a nuestro navegador, el cual nos muestra la ventana de “guardar como” habitual.

Archivos de Volcado La siguiente sección (Backups list of database) nos muestra los archivos de volcado listados en los respectivos directorios de volcado. Dichos archivos acaban aquí, sean creados desde línea de comandos o bien desde el interfaz Web. En ambos casos el dueño del archivo es el usuario que esté ejecutando mysqldump. Nótese que si los archivos son creados desde el interfaz Web, el propietario es el usuario bajo el cual se esté ejecutando el servidor Web. Si se ejecuta desde línea de comandos, el propietario del archivo será el usuario habitual. Si usamos ambos mecanismos para crear los archivos de volcado, puede que tengamos problemas con los permisos. Llegados a este punto, podemos realizar diferentes operaciones sobre los archivos. Por ejemplo, podemos cargar los datos en nuestra base de datos desde un archivo. Debemos ser cuidadosos ya que MySQL Backups Manager simplemente usa el comando mysql con el archivo especificado. Como por defecto se usa --add-drop-table, las tablas se descartan y se vuelven a crear antes de que se hagan las inserciones. Si no usamos la referida opción --add-drop-table, nos encontraremos un error a la hora de crear la tabla y las inserciones se añadirán a los registros de la tabla. Podemos asimismo enviar los archivos existentes por email a las direcciones por defecto, así como subir los archivos de volcado a nuestro servidor FTP. La sección Upload backup for database nos permite subir un archivo desde la máquina local al servidor Web. Por ejemplo, si nuestro servidor de alojamiento Web no nos hace copias de seguridad y algo le pasa a nuestra base de datos. Otro caso podría ser cuando queramos realizar cambios en la estructura

WWW.LINUX-MAGAZINE.ES

de la base de datos. Descargaríamos la base de datos entera a nuestra máquina local, haríamos los cambios y crearíamos un nuevo archivo de volcado que se cargaría entonces en el servidor. Así podemos restaurar esta copia con los datos más recientes y los cambios en la base de datos. Nos encontramos con un problema si el archivo de volcado está comprimido, dado que mysql no lo soporta. Por lo tanto, tendremos que descomprimirlo previamente. Como se puede apreciar, delante de cada archivo de volcado hay un botón etiquetado con GZ. Significa que el archivo está comprimido. Al desmarcar el botón, descomprimimos el archivo. Si lo volvemos a marcar, el archivo vuelve a comprimirse. Por defecto, no podemos subir archivos de una base de datos a otra. Si tenemos un sistema de pruebas y queremos sincronizar los datos del sistema real, podemos usar bien el comando mysql directamente, o mover los archivos manualmente de un directorio al otro (ojo con duplicar los nombres de archivo).

Bajo Coste Total Aunque el MySQL Backups Manager de Indexsoft es un producto comercial (una licencia cuesta 15$), hemos concluido que es una inversión que merece la pena. Podríamos haber creado un script por nuestra cuenta, pero si consideramos cuánto tiempo nos llevaría escribir el código, realmente no merece la pena. El tiempo es dinero, y la solución MySQL Backups Manager nos ahorra varias veces su precio. En pocos minutos podemos configurar copias de seguridad automáticas para nuestros datos MySQL. No necesitamos pasarnos horas o días programando las características necesarias. MySQL Backups Manager nos ofrece una solu.■ ción lista para funcionar

RECURSOS [1] Página Web de Indexsoft: www. indexsoft.com [2] El comando mysqldump: dev.mysql. com/doc/mysql/en/mysqldump.html [3] Alojamiento Web profesional que usa MySQL Backups Manager: www. imagelinkusa.net


BackUps • ADMINISTRACIÓN

Copias de seguridad con Rsync y SSH

PUERTOS SEGUROS

A menudo es ineficiente el uso de cintas de backup cuando se necesita salvar algunos ficheros o restaurar una copia de seguridad. La herramienta Rsync envía los ficheros críticos a otro ordenador secundario, al que se puede acceder fácilmente. POR MARC ANDRÉ SELIG

U

na copia de seguridad completa en un medio independiente es una parte vital de cualquier estrategia de backups. Sin embargo, la tarea de restaurar copias de seguridad desde una cinta, CDs o DVDs es a menudo una tarea que requiere bastante tiempo. A veces incluso compensa hacer backups online. Existen algunas soluciones disponibles para realizar backups online, como Rsnapshot. Este mes en el taller del administrador veremos una solución basada en un script que hace uso de Rsync y SSH.

Cooperación La herramienta Rsync, combinada con SSH, se encarga del transporte de las copias de seguridad por la red. Esta herramienta soluciona dos problemas a

los administradores. Primero, ahorran ancho de banda, ya que Rsync comprime los datos si se le pide que lo haga. Segundo, SSH se asegura de que los sniffers que puedan haber en la red no se hagan con los datos de las copias. Una ventaja adicional de Rsync es que transfiere tan solo los cambios por la red y los fusiona con la última copia completa que se tenga en la máquina destino, proporcionando la simplicidad de los backups completos con la eficiencia de los backups incrementales. Para averiguar qué datos han cambiado desde el último backup, Rsync compara una combinación de los tamaños de los ficheros y sus fechas o un checksum MD4 de cada fichero. Una de las características especiales de Rsync es un meca-

WWW.LINUX-MAGAZINE.ES

nismo sofisticado que, cuando se enfrenta a un fichero enorme, no copia el fichero completo, sino tan solo las partes que hayan cambiado. Rsync no maneja el transporte de los datos por la re, sino que son los usuarios los que han de establecer un túnel arbitrario. La solución tradicional para realizarlo era hacer uso de la shell remota, rsh, pero ahora SSH está mejor capacitado para realizar esta tarea, ya que encripta los datos que se transmiten. La Figura 1 muestra como funciona un backup con Rsync y SSH. Para proporcionarle a Rsync la máxima protección en entornos hostiles, habrá que configurar el servicio SSH con la máxima seguridad. Si se comete un error aquí, se puede exponer al sistema a

Número 08

75


ADMINISTRACIÓN • BackUps

accesos no autorizados. Como sucesor legítimo de la shell remota, SSH se usa principalmente para la administración remota. Invocando ssh usuario@maquina se proporcionará una shell de la máquina remota.

Las Claves Preferidas Sin instrucciones específicas, SSH por defecto comprobará la clave del usuario para la autenticación. Además de esto, el servidor donde el usuario se está conectando también puede autenticarse. SSH usa algoritmos criptográficos para realizar estas tareas. Suponiendo que las entidades implicadas en la transacción se hayan autenticado correctamente, los datos serán encriptados y enviados por la red. Los administradores, normalmente, no desean lanzar los scripts de backup manualmente ya que tienen que introducir sus claves SSH. Normalmente cron se encarga de lanzar los trabajos de backup. Aquí es donde surge un gran problema con las peticiones de las claves. Para evitarlo, los administradores pueden optar por un modo de autenticación que utilice un par de claves asimétricas para la autenticación en vez de las típicas contraseñas. El par de claves, que corresponden a una clave pública y a otra privada, identifican de forma unívoca a un usuario. El comando ssh-keygen -t dsa genera un par de claves asimétricas DSA. La clave privada, que el programa almacena en ~/.ssh/id_dsa por defecto, permanece en la máquina local. Los usuarios tienen que copiar la clave pública, ~/.ssh/id_dsa.pub, a todas las máquinas desde las que tenga que conectarse. Para ello, se copia el contenido de la clave pública en la máquina destino como ~/.ssh/authorized_keys. Este fichero puede contener múltiples claves,

Figura 1: Rsync crea copias de seguridad y utiliza SSH para enviarlos a una segunda máquina. SSH utiliza una simple tubería para aceptar los datos. En el otro extremo, el demonio SSH pasa la copia de seguridad al proceso Rsync. Rsync no transfiere ficheros que no hayan sido modificados, esto ahorra ancho de banda.

para escenarios en los que los usuarios puedan tener múltiples pares de claves. A partir de ahora, la autenticación se manejará por la solución más segura basada en claves asimétricas. El usuario root, normalmente, no tiene permiso para conectarse remotamente. El servicio SSH ignorará el fichero llamado /root/.ssh/authorized_keys. Si los administradores desean una conexión remota SSH para el root, tendrán que establecer la variable PermitRootLogin a yes en el fichero /etc/ssh/sshd_config.

Conexión Automática El programa ssh-keygen solicita al usuario una frase de paso cuando genera el par de claves. La frase de paso se utiliza para encriptar la clave privada. Esto impide a un atacante que haya conseguido colarse en el directorio home de un usuario que use la clave privada para conectarse a otras máquinas. Desde luego, no se puede suministrar la frase de paso al script automáticamente. Por esta razón, ssh-keygen permite que no se tenga que poner la frase de paso, aunque esto deja a la clave privada

Tabla 1: Opciones de Rsync -a -v -c -C -u -H -n -e ssh --delete --modify-window=N -z

76

Número 08

Archivo: recursivo con enlaces y todos los permisos Indicador de progreso Compara los checksums del fichero Ignora los ficheros no-críticos Update: no sobrescribe ficheros nuevos Sincroniza los enlaces duros en el destino No hace nada, simula lo que podría pasar Utiliza SSh para la conexión Elimina ficheros borrados localmente desde el destino Tolerancia para los timestamp que Rsync debe mantener como equivalente Zip: Comprime los ficheros antes de transferirlos

WWW.LINUX-MAGAZINE.ES

expuesta en el disco duro local. Una solución más segura sería utilizar un agente SSH. El agente desencripta la clave privada después de introducir la frase de paso y almacena la clave en la RAM. Si se tiene acceso al agente sshagent que se ejecuta en el sistema, se podrá hacer uso de la clave privada. Pero los atacantes tendrán que leer la memoria principal para comprometer la frase de paso. Si se quiere usar el agente con cron y otros scripts, se puede llamar a ssh-agent una sola vez en el proceso de arranque, o después de arrancar, y encauzar los resultados en un fichero. Entonces, el fichero contendrá las dos variables de entorno que SSH necesita para acceder al agente. Los administradores normalmente desean añadir el fichero a sus entornos usando el comando . ; esto se sigue de ssh-add y la frase de paso. Así pues el agente tiene almacenado en memoria la clave privada de forma segura: $ ssh-agent >~mas/tmp/agent.sh $ . ~mas/tmp/agent.sh Agent pid 21681 $ ssh-add Enter passphrase for U /Users/mas/.ssh/id_dsa: $

Los programas que requieren acceder al agente tan sólo necesitan el fichero.

Haciendo Túnel con Rsync Además de un simple login en una máquina remota, SSH proporciona un importante servicio para las copias de seguridad del sistema. Transfiere cualquier dato que


BackUps • ADMINISTRACIÓN

reciba por la tubería a través de una conexión encriptada al servicio SSH remoto. Esto permite copiar un directorio a otro ordenador con un sólo comando: cd directorio && tar cf- . | ssh usuario@ordenador tar xf-. El fichero creado por el tar es enviado a SSH y SSH lo reenvía al servicio remoto SSH, el cual llama a tar para desempaquetar el archivo. Rsync hace uso de esta solución. El parámetro -e ssh le dice a Rsync que pase cualquier fichero a SSH. Como alternativa, podría establecer la variable de entorno RSYNC_RSH: $ RSYNC_RSH=ssh $ export RSYNC_RSH

Para evitar tener que establecer la variable manualmente, simplemente se puede añadir las dos líneas como se muestra arriba al .bashrc en el directorio home del usuario. Para tareas de cron, los administradores necesitan establecer la variable en el crontab apropiado. -a, para el modo fichero, es otra opción importante Rsync. Esta opción le dice a Rsync que transfiera todo el directorio especifi-

cado, incluyendo subdirectorios, ficheros, enlaces simbólicos, permisos y fechas, propietarios, grupos y ficheros de dispositivos. -v es otra opción útil, que muestra cada fichero que ha sido transferido correctamente, como -H que realiza un chequeo y transfiere los enlaces duros. También se podría querer especificar la opción --delete que elimina cualquier fichero borrado localmente desde el medio de almacenamiento remoto, esto proporciona una copia exacta del directorio sin ficheros antiguos. La Tabla 1 tiene algunas opciones más.

Ejemplo El Listado 1 muestra un ejemplo trivial que copia el directorio /Users a /export/backup en la máquina backuphost. La línea cuatro de este programa lee el fichero generado previamente para el acceso del agente SSH. Esto no es necesario si el administrador opta por una clave sin protección. A continuación el script llama a Rsync. El usuario backupuser se identifica en el

Listado 1:Backup Inseguro 01 #!/bin/sh 02 03 . ~mas/tmp/agent.sh 04 /usr/bin/rsync -rlptH --delete /Users/backupuser@backuphost:/ export/backup

sistema y accede al directorio especificado. En vez de usar la opción -a, ahora las opciones -rlpt se usan para copiar un directorio recursivamente con todos sus enlaces, permisos y tiempos. Para guardar los permisos de propietarios y de grupos en la copia de seguridad, el script necesitaría identificarse en el host de backup como root. Adicionalmente, -H y --delete le dice a Rsync que sincronice los enlaces duros y elimine los datos borrados del ordenador remoto. El script necesita privilegios de root para realizar un backup automatizado completamente de todos los directorios home. La siguiente entrada en el fichero /etc/crontab llama al script cada noche a las 02:03 a.m.:


ADMINISTRACIÓN • BackUps

3 2 * * * root U /usr/local/bin/Ursync-backup.sh

Script de Seguridad En el Listado 1, el usuario mas ha creado un fichero agent.sh y lo ha almacenado en su directorio home. El root regularmente lee y ejecuta este fichero. Cualquier usuario con acceso a la cuenta mas (incluyendo a mas) ¡puede ejecutar comandos con privilegios de root! El Listado 2 elimina esta vulnerabilidad. El fichero agent.sh se mueve desde el directorio home del usuario al directorio home del root, que está (afortunadamente) protegido contra accesos de escritura. El Listado 2 también verifica el usuario y los permisos de agent.sh. Como se decía, debería ser preferible para el programa de backup el no necesitar los privilegios de root. Desafortunadamente, esto es imposible a

Propietarios y Backups El sistema de backups de nuestro ejemplo crea una imagen completa del directorio de la copia de seguridad en la máquina destino. Se puede restaurar estos directorios al vuelo, sin tener que cambiar cintas o esperar pacientemente a que se complete el trabajo. Por razones de seguridad, el sistema almacenará los datos con los privilegios equivalente a nobody en los dispositivos destino. Esto se hace imposible para ficheros de backup propietarios y con permisos de grupo. Si se está haciendo backup de directorios home, hay una forma de hacer esto, como el nombre de usuario y grupo de los ficheros en un directorio es normalmente parte del nombre de directorio: chown -R mas:users mas restaura el propietario para que el directorio home pertenezca a mas. Pero solo funcionará en equipos con cuentas idénticas. El siguiente script restaura los permisos para todos los directorios home en la carpeta de backup de referencia a los nombres de los directorios: #!/bin/sh cd /backup for i in *; do chown -R $i:users $i done<C> Como alternativa, se podría permitir a la cuenta de root ejecutar las copias de seguridad con todas las estrategias de seguridad que implica.

78

Número 08

menos que simplemente se quiera hacer una copia de seguridad de un sólo directorio home, en tal caso el programa puede ejecutarse con los privilegios propietarios. Los clientes no son los únicos ordenadores con una posible vulnerabilidad. El equipo que contiene la copia de seguridad también necesita protección. El script del Listado 1 y 2 evitan el uso de la cuenta de root en la máquina remota y se registran como usuarios sin privilegios. Lo único que esta cuenta necesita hacer es almacenar los backups. Aunque la clave SSH esté protegida adecuadamente por una frase de paso y el agente

Listado 2: El mejor Backup 01 #!/bin/sh 02 03 AGENT=/root/agent.sh 04 05 # $AGENT debe pertenecer a root y no debe tener permiso de escritura. 06 # En otro caso: ¡ cancele ! 07 [ -O $AGENT -a ! -w $AGENT ] || exit 255 08 09 # Si todo está correcto, accede y permite conexiones 10 # al agente SSH 11 12 . $AGENT 13 14 /usr/bin/rsync -rlHpt --delete 15 /Users/ backupuser@backuphost: 16 /export/backup

WWW.LINUX-MAGAZINE.ES

SSH, aún es un punto débil que un atacante podría explotar para comprometer el servidor de backup. Y si el programa de backup se conectara como root, el atacante podría tener control completo sobre el servidor.

Una Sola Cuenta de Backup Protege los Datos Sería interesante proporcionarle tan sólo los permisos mínimos a la cuenta de backup, justo los necesarios para poder realizar el trabajo. La cuenta necesita permisos de escritura en todos los directorios donde tenga que almacenar las copias. Como se suele decir, la cuenta debe tener los permisos necesarios para almacenar las copias. En el ejemplo, se le permite copiar el conjunto completo de directorios home. Dependiendo de quien sean los datos almacenados en estos directorios, podría ser lo único que un atacante necesitara para irrumpir en algunas de las máquinas de backup. Dicho de otro modo, la cuenta y la máquina remota pueden quedar comprometidas por los datos almacenados en ellos, y al mismo tiempo, la máquina puede facilitar un ataque a ellas. Tiene que haber una relación especial de confianza entre las máquinas desde las que se hacen las copias de seguridad con la máquina donde se albergan dichas copias y los administradores no deben subestimar el significado de esta confianza. SSH permite restringir que programas pueden ejecutar los usuarios específicos. Y esta clase de autorización ayudará a mitigar el daño que un atacan te pueda ocasionar en las máquinas. ■


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.

KTools

..............................

80

Un tipo de letra bien elegido es el añadido perfecto a nuestra experiencia con Linux. KDE nos ofrece varias herramientas que nos ayudan a cocinar una sopa de letras con el mínimo esfuerzo.

DeskTOPia . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 El lanzador de programas Apwal facilita la tarea de encontrar una aplicación rápidamente con un simple clic.

Apollon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Los operadores de la red Kazaa, sólo proporcionan software para sistemas Windows. Pero el proyecto GiFT nos ofrece soporte para Kazaa bajo Linux.

Gnomefonts . . . . . . . . . . . . . . . . . . . . . . . . . . 86 En este artículo explicamos como Fontconfig, X y Gnome trabajan de forma conjunta para conseguir renderizar fuentes de manera vistosa en nuestro escritorio.

Educación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Examinamos la aplicación de SL en el centro Corazón de María de Palencia, y estudiamos su experiencia con ATNAG.

Línea de Comandos . . . . . . . . . . . . . . . . . . . . 93 Antes de tostar un CD de datos bajo Linux, necesitaremos una imagen ISO: mkisofs nos ayudará a crearla.

WWW.LINUX- MAGAZINE.COM

ISSUE 52 MARCH 2005

79


LINUX USER • Ktools

Instalar tipos de letra en KDE

SOPA DE LETRAS

Un tipo de letra bien elegido es el añadido perfecto a nuestra experiencia con Linux. KDE nos ofrece varias herramientas que nos ayudan a cocinar una sopa de letras realmente sabrosa con el mínimo esfuerzo. POR MARCEL HILZINGER

A

trás quedaron los días en los que necesitábamos un master en informática para instalar tipos de letra en Linux. De hecho, instalar tipos de letra se convirtió en un juego de niños a partir de la versión 3 de KDE. Para instalar tipos de letra en KDE, simplemente arrancamos una pantalla de Konqueror presionando [Alt]+[F2] y tecleando konqueror, luego tecleamos la URL fonts:/ en la línea de dirección. Copiamos los tipos de letra desde cualquier directorio a nuestro directorio Personal para que queden a disposición de los programas (véase Figura 1). No es necesario reiniciar la interfaz gráfica de

usuario o KDE. Como alternativa, podemos pulsar con el botón derecho del ratón y usar el menú contextual para no tener que abrir una segunda ventana de Konqueror. La manera más fácil es usar tipos de letra True-type que constan sólo de un archivo. Para tipos de letra Type1 necesitamos instalar tanto el Postscript Font Binary (identificable por su extensión *.pfb) como el archivo con la información métrica (identificable por la extensión *.afm) Algunos tipos de letra Type1 tienen un archivo en formato Postscript Font Metric en vez del archivo Adobe Font Metric, pero no está soportado por

KDE. La manera de solventarlo es usar la herramienta pf2afm para convertir el archivo PFM a AFM, antes de la instalación con Konqueror. Como alternativa, puede que prefiramos usar el programa Fontforge[1]. Para obtener una vista previa de un tipo de letra, podemos o bien posar el ratón sobre el archivo de la fuente durante unos segundos, o bien seleccionar Font Preview. Ninguna de las herramientas KDE tiene una función de impresión. Para aprender cómo podemos imprimir una página de prueba con varios tipos de letra, sin necesidad de estar cambiando de fuentes en

Glosario Type1: Una tecnología de fuentes inventada por Adobe para proporcionar tipos de letra PostScript de alta calidad. Aunque las especificaciones de Type1 son abiertas, ni Apple ni IBM ni Microsoft han sido capaces de crear fuentes Type1 de alta calidad debido a que cierta parte de la tecnología, que

80

Número 08

influye mucho en el renderizado de fuentes con resoluciones por debajo de 300dpi, es propietaria. Adobe no publicó la información necesaria para elaborar fuentes Type1 de alta calidad hasta 1990. Truetype: Una tecnología inventada por Apple para mostrar fuentes escala-

WWW.LINUX- MAGAZINE.ES

bles en pantalla idénticas a como se imprimirán en papel. Debido a la transferencia de tecnología entre Apple y Microsoft, Truetype se incluyó en Windows en 1989. Hoy día, las fuentes tanto Truetype como Type1 pueden usarse para visualizarlas o para impresión.


Ktools• LINUX USER

Figura 1: Instalación de fuentes Konqueror usando arrastrar y soltar.

con

OpenOffice o Kword, véase el cuadro “Crear un catálogo de fuentes”.

Mantenimiento de Fuentes La mayoría de las distribuciones tienen una selección de unos 30 tipos de letra por defecto. Si por casualidad tenemos una partición de Windows en nuestro equipo, podemos añadir las fuentes de C:\WINDOWS\FONTS\ a nuestra colección. Si somos unos cazadores de fuentes, probablemente tengamos una gran colección de tipos de letra y probablemente encontremos dificultades en llevar la cuenta de tal compendio. El paquete free-ttf-fonts de Suse Linux nos ofrece más de 300 fuentes. Y también encontraremos grandes colecciones gratuitas listas para descargar desde Internet, véase la página de Fontfreak [2] por ejemplo. Debemos advertir el tipo de licencia al descargar tipos de letra, ya que muchas fuentes sólo son libres en el caso de uso particular. Para evitarnos dolores de cabeza al administrar grandes colecciones de fuen-

Cuadro 1: Crear un En el momento de escribir esto KDE no proporciona a los usuarios la posibilidad de imprimir tipos de letra individuales, no digamos ya un catálogo de fuentes. Sin embargo, las nuevas versiones del programa de maquetado Scribus incluyen un script que nos permite crear dicho catálogo. Para ello, seleccionamos Script | Scripts for Scribus | FontSample dentro de Scribus. En la nueva ventana, seleccionamos las fuentes que queremos imprimir bajo Available Fonts y pulsamos el botón con el signo “mayor que”. Si queremos imprimir todas las fuentes, pulsamos el botón con dos signos “mayor que”. Adicionalmente al formato de página A4, numeración de página (“want page numbers”) y lista de

tes, KDE ofrece una herramienta de gestión, situada en el KDE Control Center en System administration | Font Installer. Al iniciar la herramienta, esta muestra en principio todas las fuentes del directorio ~/.fonts. El lado izquierdo de la ventana muestra el nombre de la fuente, nombre del archivo y tamaño. A la derecha, encontramos una previsualización del tipo de letra, que podemos ampliar o reducir pulsando sobre el Figura 2: Administración de fuentes en el KDE Control icono de lupa. Si preferimos Center. ver una frase de muestra en varios tamaños en lugar del que se cionar la fuente y pulsar el botón con la muestre el alfabeto, debemos pulsar en marca verde. Lo que hace en realidad el el icono de cascada situado a la derecha. instalador de fuentes es poner un punto Si necesitamos caracteres especiales o al comienzo del nombre de archivo. acentuadas de otros idiomas, debemos Linux interpreta una fuente deshabilitacambiar la frase de ejemplo para que se da como un fichero oculto, aunque las muestren (véase Figura 2). Esto permite fuentes continúen allí. ver de un vistazo si la fuente seleccionaPor supuesto, también podemos instada soporta realmente los caracteres necelar las fuentes desde el módulo instalasarios. dor del KDE Control Center. Para ello, También tiene sentido deshabilitar los pulsamos en Add… y seleccionamos los tipos de letra que usemos raramente. tipos de letra que queramos añadir. El Con ello, la ocultamos de cara a los proinstalador de fuentes de KDE soporta los gramas, lo que mejora el tamaño de principales formatos de tipos de letra, memoria que necesita y simplifica como Truetype, Opentype y Type1. encontrar las fuentes que busquemos. Para instalar, habilitar o deshabilitar Para deshabilitar una fuente, la selecciofuentes de manera global en nuestra namos y pulsamos en el icono con el máquina, tendremos que pulsar el botón aspa roja. Así le indicamos al instalador situado abajo a la izquierda en la ventana de fuentes de KDE que la etiquete como para cambiar a Administrator Mode. Así (Disabled) y la ensombrezca. Para volver indicamos al KDE que permita el acceso a a habilitarla sólo tendremos que selec/usr/share/fonts (en Mandrake, Debian y Fedora) o /usr/X11R6/lib/X11/fonts (para ■ Suse Linux). catálogo de fuentes contenidos (TOC), puede que queramos también habilitar la opción Extra offset for binding option. Así indicamos al script que queremos dejar un espacio extra para poder encuadernar las páginas adecuadamente. Y si nuestra impresora lo permite, podemos asimismo seleccionar Double side printing para imprimir por ambos lados del papel. Pulsamos OK para que el script genere el catálogo. Dependiendo del número de fuentes que hayamos seleccionado y la potencia de nuestro equipo, este proceso puede llevar unos minutos. Podemos imprimir a continuación el catálogo completo o usar la función de exportar PDF para crear un PDF de alta calidad con los tipos de letra embebidos.

WWW.LINUX- MAGAZINE.ES

Ktools En esta columna presentamos herramientas, mes a mes, que han demostrado ser especialmente útiles a la hora de trabajar bajo KDE, resolver algún problema que de otra manera es ignorada, o simplemente pertenecen a ese tipo de cosas en la vida que una vez descubiertas no podemos vivir sin ellas.

RECURSOS [1] Fontforge: sourceforge.net/

http://fontforge.

[2] Fontfreak: http://www.fontfreak.com

Número 08

81


LINUX USER • Desktopia: Apwal

Aplicaciones a la Carta con el Lanzador de Programas Apwal

ACCESO INMEDIATO

La ejecución de un programa haciendo clic con el ratón puede tener algunos inconvenientes. Los usuarios se pierden dentro de los menús anidados y los iconos del escritorio pueden ocultarse detrás de las ventanas. El lanzador de programas Apwal facilita esta tarea con un simple clic. POR ANDREA MÜLLER

L

os escritorios modernos y los gestores de ventanas normalmente proporcionan todas las opciones necesarias para ejecutar nuestros programas favoritos con tan solo un clic de ratón. Esto ahorra tiempo, ya que el hacer clic tan sólo consume un par de segundos, a diferencia de la introducción de comandos desde la línea de comandos. Pero esto no es aún lo suficientemente rápido para Pascal Eberhard. El mover las ventanas activas para buscar los iconos no era lo que él entendía como eficiencia. Así que todo esto llevó a Pascal a desarrollar Apwal [1], un lanzador de programas basados en iconos que, cuando se invoca, despliega una selección de iconos predefinidos bajo el cursor del ratón. El nombre del programa es un acrónimo de avanzado y potente lanzador de aplicaciones.

iconos-a-la-carta. Si se tiene otra distribución, entonces hay que compilar el código fuente. Apwal es moderado en el uso de los recursos y tan sólo requiere la biblioteca gtk2 y los paquetes de desarrollo. Se necesita al menos la versión gtk2-2.4 o posterior. El código fuente no incluye el script configure ya que con escribir make es suficiente para compilar Apwal. Luego, entrando como root, se teclea make install para instalar el ejecutable en /usr/local/bin.

Frugal

Cuando se ejecuta Apwal por primera vez, tecleando apwal en una ventana de consola, el programa muestra un simple

La página web del proyecto incluye paquetes Debian para las aplicaciones de

82

Número 08

Selección

WWW.LINUX- MAGAZINE.ES

icono de terminal. Si se hace clic sobre el icono, se ejecutará xterm. Para reunir una colección de iconos, hay que ejecutar Apwal con el parámetro --edit. Esto abre el cuadro de diálogo de configuración, que simplemente contiene un icono de terminal y una cruz roja en la primera solapa, Editor. La cruz roja representa la posición del cursor del ratón y proporciona una idea de cómo los iconos se dispondrán alrededor de él. Para crear otro lanzador de programas, tan sólo hay que hacer doble clic en una zona vacía en el área del Editor. Entonces Apwal pasará automáticamente a la solapa Icon Selection (Figura 1) y


Desktopia: Apwal • LINUX USER

clic sobre él para seleccionarlo y pulsando Supr.

Colección de Iconos

Figura 1: La solapa Icon Selection permite seleccionar los iconos que Apwal mostrará.

mostrará una selección de iconos de 48x48 píxeles que haya encontrado en la ruta de iconos preconfigurada. Con un doble clic se selecciona un icono y Apwal regresa a la solapa Editor. El programa habrá colocado el icono seleccionado en la ventana Editor, pero el icono está deshabilitado. Para habilitarlo, hay que rellenar el cuadro de texto Command Line con el nombre del programa, como por ejemplo konqueror, para lanzar el administrador de archivos de KDE. Apwal valida la entrada para asegurarse de que existe una aplicación con este nombre accesible desde la ruta del sistema. Si se equivoca o si el programa no está instalado, Apwal pone el nombre en rojo para indicar que se ha producido un error (Figura 2). El campo Execute Path es bastante útil para lanzar programas de terminal. Permite especificar el directorio en el que Apwal debe ejecutar el comando introducido en el campo Command Line. Si se especifica /home/username/pictures para el icono de la ventana de la terminal, se ejecutará automáticamente en el directorio /home/username/pictures en vez de ejecutarse en el directorio home del usuario. Con la técnica de Arrastrar y soltar se puede modificar la posición del icono posteriormente, se pueden arrastrar los iconos a las posiciones que se deseen dentro de la ventana Editor. Si no se dispone del espacio suficiente, se puede hacer clic sobre los iconos de las flechas de arriba, abajo, izquierda o derecha para desplazarse. En el caso de no necesitar un icono específico, se puede borrar simplemente haciendo

Si se dispone de Suse Linux, la selección de iconos en la solapa Icon Selection no es particularmente inspiradora, ya que los iconos del escritorio KDE no están disponibles. Se pueden añadir en la solapa Icon Selection Pref (Figura 3). Pulsando en Add se crea una entrada nueva. Ahora se hace doble clic en la columna Pixmap Path en la vista lista y se teclea la ruta donde se encuentran los iconos KDE. En Suse Linux, los iconos están ubicados en la carpeta /opt/kde3/share/icons. Cuando se haya finalizado hay que marcar la caja de la columna Rec para indicarle a Apwal que añada los nuevos iconos a su colección. Se pueden seguir estos mismos pasos para añadir nuevos directorios con iconos, tales como, /opt/gnomo/share/icons. Aquí es donde Suse Linux almacena los iconos de las aplicaciones Gnome.

Arranque Rápido Una vez que se hayan asignado nuestros iconos favoritos a los programas, se pueden comprobar los resultados tecleando appwal. Para un arranque rápido se puede asignar un atajo de teclado al programa Apwal. Los usuarios con KDE primero han de crear una entrada de menú para Apwal y luego asignar el atajo de teclado en el panel de control de KDE Regional & Accessibility | Keyboard Shortcuts | Application shortcuts.

Figura 2: Si se comete un error en la entrada o el programa no se encuentra instalado, Apwal colorea de rojo la entrada para indicar que si se pulsa el icono no funcionará.

Si se dispone del gestor de ventanas Fluxbox, se puede añadir el atajo de teclado en el fichero ~/.fluxbox/keys de este modo: Mod1 x

:ExecCommand apwal

Este atajo permite ejecutar el selector de iconos cuando se pulse la combinación de teclas [Alt]+[X]. La pulsación de las teclas del atajo le indica a Apwal que muestre el lanzador de aplicaciones junto al cursor del ratón durante tres segundos. Se puede hacer clic sobre alguno de estos iconos para ejecutar la aplicación asociada a él. Si se necesita más de tres segundos para encontrar el icono adecuado, no hay que preocuparse. El editor de Apwal permite establecer un intervalo nuevo en Apwal Preference | Launcher Timeout (en segundos). Los gestores de ventanas Enlightenment y Sawfish permiten ejecutar Apwal haciendo clic. El FAQ en [2] indica como se realiza. Como contrapunto, hay que pulsar sobre el fondo del escritorio para ejecutar Apwal. El gestor de ventanas no entiende las pulsaciones de ratón en las ventanas de las aplicaciones, aunque los atajos de teclado funcionan independientemente de donde nos ■ encontremos.

RECURSOS Figura 3: Apwal solamente muestra los iconos cuyos directorios se encuentren en la lista que aparece en la solapa Icon Selection

Prefs

WWW.LINUX- MAGAZINE.ES

[1] ]Apwal: http://apwal.free.fr [2] Apwal FAQ: http://apwal.free.fr/faq. html

Número 08

83


LINUX USER • Apollon

Compartir archivos con Apollon y Gift

INTERCAMBIO OLÍMPICO Los operadores de las popular red de intercambio de archivos en Internet Kazaa, sólo proporcionan software para sistemas Windows. Pero el proyecto GiFT nos ofrece soporte para Kazaa bajo Linux. POR CARSTEN SCHNOBER

K

azaa [1], la popular red de intercambio de archivos en Internet, tiene la mayor base de usuarios y ofrece a sus usuarios la más amplia gama de servicios. Hasta ahora, Kazaa le debe su popularidad a los usuarios de Windows, probablemente debido a la abundancia de copias ilegales de programas extremadamente caros. Cosa que es de poca utilidad a la mayoría de usuarios Linux. Además de esto, Kazaa hace difícil que se sume la comunidad Linux a esta red, ya que el software que proporciona Kazaa se restringe a los sistemas operativos de Microsoft. El proyecto GiFT [2] tiene ya un plugin para Linux que permite el acceso a Kazaa para usuarios que quieran unirse a esta red de intercambio mundial. Este plugin implementa el protocolo Fasttrack usado por Kazaa y además tiene soporte para la red de intercambio Gnutella [3]. Al mismo tiempo, OpenFasttrack proporciona una alternativa a Kazaa. Hay otro plugin para la red Ares [4], y la página de GiFT también menciona plugins para Napster [5], Soulseek [6] y Edonkey [7] que están incompletos o bien ya no funcionan en la versión actual. El cuadro 1 describe cómo añadir plugins. GiFT no es un cliente sino un demonio que se ejecuta en segundo plano. Cuando se inicia, abre una conexión a las redes P2P, proporcionando una puerta de enlace para los programas locales. El programa de KDE Apollon (Apolo) [8] usa el demonio GiFT y ofrece una interfaz gráfica de usuario a los usuarios para que accedan fácilmente a

84

Número 08

WWW.LINUX- MAGAZINE.ES

las plataformas de intercambio de archivos.

Instalación El programa Arkollon instala la interfaz gráfica Apollon así como el GiFT, incluyendo los plugins para Fasttrack, Gnutella y OpenFasttrack. Como Arkollon contiene y compila el código fuente, necesitamos el entorno de desarrollo de KDE. En la tabla 1 se proporciona una lista de paquetes requeridos. El nombre de los paquetes puede variar en las distribuciones basadas en RPM. Arkollon nos pide en primer lugar la contraseña de root y luego descomprime, compila e instala los programas seleccionados (Figura 1). Si estamos con Ubuntu sin contraseña de root, podemos evitar esto tecleando sudo antes de lanzar el instalador y proporcionando nuestra contraseña. Después de completar la instalación, podemos simplemente teclear apollon. La interfaz gráfica automáticamente iniciará el demonio GiFT. La pri-

Tabla 1: Paquetes necesarios RPM Debian zlib-devel zlib1g-dev libtool libltdl3-dev db-devel libdb4.2-dev libmagic-devel libmagic-dev libvorbis-devel libvorbis-dev imagemagick-devellibmagick-dev qt3-devel libqt3-mt-dev qt3-devel-tools qt3-dev-tools kdelibs3-devel kdelibs4-dev


Apollon • LINUX USER

mos eliminar los archivos instalados. Al iniciar Apollon, el programa primeramente nos conduce a la ventana Info mostrada en la Figura 2, que muestra nuestro estado en cada red P2P. Después de establecer la conexión, podemos cambiar a la ventana Search (véase Figura 3) para Figura 1: Arkollon instala Apollon automátibuscar por palabras clave en las camente. redes activas. Al hacer esto se mostrará en el área por debajo Figura 2: Varios millones de usuarios comparten archimera vez que ejecutemos el programa, se de la línea de búsqueda una vos por todo el mundo. nos pedirá un apodo para usarlo en las enorme lista con los resultados. redes P2P, así como que especifiquemos La lista nos proporciona el nomlas carpetas que queremos compartir con bre de archivo y demás informaotros usuarios de estas redes. ción, como tamaño, duración o Si algún día decidimos desinstalar el nombre del artista asociado a Apollon y GiFT, Arkollon se encarga de la canción. La columna ello. Tecleando arkollon -uninstall lograAvailability nos indica cuánta gente está compartiendo este archivo, lo cual es importante, Cuadro 1: Añadir plugins ya que cuanta más fuentes tenGiFT gamos, la descarga será más La instalación de plugins siempre sigue rápida. el mismo patrón. Tras descomprimir el Figura 3: Prácticamente cualquier búsqueda nos devolAl hacer doble clic en un código fuente, compilamos la aplicación verá un gran número de coincidencias. archivo se inicia la descarga. La con ./configure && make && make insventana Transfer nos muestra tall. Necesitaremos los paquetes de desuna visión general de las descargas en arrollo indicados en la Tabla 1 para ello. ¡Al fin intercambio de marcha. Esto sitúa la librería del nuevo prograarchivos! Podemos reproducir canciones de ma en el directorio /usr/local/lib/giFT/. En Apollon, abrimos el cuedro de diálonuestra colección directamente desde El proyecto GiFT al fin permite a los usuago Settings | Configure Apollon... y nos Apollon. Para ello, nos vamos al cuadro rios de Linux el acceso a la red Kazaa, y vamos a la pestaña Advanced. Shared Folders y abrimos el directorio Apollon añade un intuitivo interfaz para Pulsamos en Add... para abrir un explocon la canción que queremos oír. Kazaa y otras plataformas de intercambio rador de archivos. Navegamos hasta Hacemos doble clic en una entrada para de archivos. Pero antes de entusiasmarnos /usr/local/lib/giFT/ y seleccionamos el reproducirla, el Player nos proporciona demasiado con el número de coincidennuevo plugin. los controles. cias en una búsqueda típica, debemos considerar las consecuencias legales antes de dar brincos (véase el Cuadro 2). Si desCuadro 2: ¿Legal o ilegal? cargamos y subimos contenido sin prestar atención a la letra pequeña, seguramente El intercambio archivos en Internet le debe su asombrosa popularidad a la facilidad con nos demos de bruces con la ley en algún la que los usuarios pueden intercambiar copias de música y software comercial. El inter■ momento. cambio de archivos experimentó un boom en los años 90, con la plataforma Napster, que más tarde pasó a ser comercial. El algoritmo MP3 desarrollado poco antes de este boom fue el primero en proporcionar un formato de compresión que permitía el intercambio de archivos de sonido a través de Internet. Desde entonces, el ultimísimo álbum sacado a la venta se puede encontrar poco después en las redes, proporcionando el acceso a descargas gratuitas, pero cuya legalidad muchos ponen en entredicha. Por supuesto, esto también se aplica para la mayoría del software comercial. La industria discográfica en particular vio el peligro que le suponía el acceso prácticamente ilimitado a copias gratuitas. Pero los aspectos legales están más o menos claros, a pesar de las campañas publicitarias que sugieren lo contrario. El intercambio de archivos es básicamente legal, pero si lo usamos para descargar o propagar música o software sin licencia para ello, estamos contraviniendo las leyes de copyright en muchos países. Se ha dado ya el caso de individuos que ofrecían copias desde sus ordenadores, han sido condenados a pagar multas de varios miles de dólares tanto en Estados Unidos como en Europa. Sin embargo, en España, y de momento, sigue siendo legal si no se hace con ánimo de lucro.

WWW.LINUX- MAGAZINE.ES

RECURSOS [1] Kazaa: http://www.kazaa.com/ [2] GiFT: http://gift.sourceforge.net/ [3] Gnutella: http://www.gnutella.com/ [4] Ares: http://www.aresgalaxy.org/ [5] Napster: http://www.napster.com/ [6] Soulseek: http://www.slsknet.org/ [7] E-Donkey: http://www.edonkey2000. com/ [8] Apollon: http://apollon.sourceforge. net/

Número 08

85


LINUX USER • Gnome Fonts

La gestión de Fuentes con Gnome

MEJORES TIEMPOS PARA FUENTES

La visualización de texto en Linux aún está condicionada a problemas del pasado, si bien estos se están solucionando. En este artículo explicamos como Fontconfig, X y Gnome trabajan de forma conjunta en aras de una solución futura. POR OLIVER FROMMEL

A

pesar del increíble progreso de Linux durante los últimos años, aún son muchos los usuarios molestos con las poco agraciadas fuentes del escritorio. Los motivos no siempre están claros, puesto que son muchos los componentes combinados con el fin de crear algo que el usuario percibe como letras en la pantalla del ordenador. Diversos programas realizan distintas tareas en escenarios diferentes. Por ejemplo, el componente de software que se encarga de mostrar el texto de una consola de texto es completamente distinto del usado por el sistema X. Incluso X gestiona las fuentes de distintas maneras. Hay aplicaciones que pueden gestionar fuentes por sí mismas, desde el análisis del fichero de texto hasta el propio renderizado de los caracteres. Otros programas usan las heredadas (y fiables) librerías X, si bien las nuevas aplicacio-

86

Número 08

nes suelen usar librerías Gnome. Esto explica por qué hay programas ejecutándose simultáneamente en Linux que muestran sus fuentes de forma completamente distinta. El hecho de que la compatibilidad de fuentes está en continuo desarrollo con el objetivo de la internacionalización solo complica aún más en asunto.

El Legado X El sistema de ventanas X se ocupa de la gestión y renderizado de fuentes en el escritorio, elaborando tanto KDE como Gnome sobre esta base. Tanto el XFree86 actual y su alternativa, X.org, soportan la mayoría de formatos comunes debido a que usan el sistema de configuración de fuentes del proyecto Freedesktop [1]. Fontconfig analiza los archivos de fuentes, facilitando al sistema X los caracteres renderizados si es necesario. Para renderizar las omnipresentes fuentes

WWW.LINUX- MAGAZINE.ES

TrueTypes utiliza Freetype [2]. En la actualidad, la librería Xft-Font simplemente transmite estos datos, mientras que antes de la introducción de Fontconfig se ocupaba de la renderización de fuentes. Principalmente, Gnome usa estos componentes para la gestión de fuentes en aplicaciones. También suministra la librería Pango, cuya tarea principal es la gestión de la distribución de bloques de texto en conjuntos de caracteres Unicode. La aparición de Fontconfig resuelve muchos problemas relacionados con las fuentes en Linux. Las aplicaciones que usan esta librería se benefician de poder utilizar cualquier fuente instalada en el sistema. Por ejemplo, la versión actual de Gimp puede por fin utilizar las fuentes TrueTypes directamente tras instalar Fontconfig. Mozilla también renderiza mejor las fuentes después de que sus


Gnome Fonts• LINUX USER

Figura 1: El diálogo de preferencias de fuentes de Gnome configura las fuentes estándar.

desarrolladores hayan empezado a confiar en Fontconfig.

Figura 3: El visualizador de fuentes de Gnome muestra un ejemplo definible por el usuario de las fuentes de Gnome seleccionadas.

Figura 2: Fuentes Gnome con anti-aliasing.

Configuración de Fontconfig El uso de las librerías mencionadas facilitan mucho la gestión de fuentes a los programas de Gnome que usan métodos estandarizados para acceder a cualquier fuente instalada en el sistema. Fontconfig ofrece muchas ventajas tanto a los usuarios como a los administradores. El archivo de configuración está en /etc/fonts. El archivo fonts.conf, con formato XML, define las rutas a los archivos de fuentes y sus alias más comunes, como Sans, usado para una serie de fuentes. Normalmente, las fuentes se encuentran en los directorios /usr/share/fonts y /usr/X11R6/lib/X11/fonts. El listado 1 muestra la parte del archivo de configuración que gestiona estas circunstancias. La última parte añade el directorio .fonts al directorio raíz de cada usuario. Guardando aquí archivos de fuentes, facilitaremos que estén disponibles para cualquier aplicación que use Fontconfig. Para eliminar la necesidad de listar las fuentes en cada aplicación, Fontconfig guarda información de las fuentes en archivos cacheados. Las siguientes líneas de código instalan una nueva fuente TrueType llamada

Listado 1: /etc/fonts/ fonts.conf 01 <dir>/usr/share/fonts</dir> 02 <dir>/usr/X11R6/lib/X11/ fonts/Type1</dir> 03 <dir>/usr/local/share/ fonts</dir> 04 <dir>~/.fonts</dir>

ACID.TTF en el directorio de fuentes privadas: cd cp ACID.TTF .fonts cd .fonts fc-cache

La ejecución del comando fc-cache en el directorio de fuentes actualiza el archivo caché del directorio actual si se está ejecutando X. Ahora podemos usar la fuente Acid-Bath en cualquier aplicación Gnome.

Configuración de Fuentes El escritorio Gnome tiene un programa para configurar fuentes estándar. Por ejemplo, los usuarios de Ubuntu encontrarán esta herramienta en Computer | Desktop Settings | Font. Aquí es donde almacenamos las aplicaciones para las fuentes, el escritorio, las cabeceras de las ventanas y las ventanas terminal. La ventana tiene una función para ajustar la calidad con la que se visualizan las fuentes, por ejemplo Best Form. El botón Details nos lleva a otra ventana con controles granulares como antialiasing. La figura 2 nos muestra la diferencia.

Ojeando Ejemplos de Fuentes Gnome no dispone de un programa para listar las fuentes, por lo que usaremos Nautilus escribiendo fonts en File | Open location. Esto no obstante sólo muestra las fuentes del sistema, sin ocuparse del directorio ~/.fonts. Además, el programa no nos muestra un ejemplo de la fuente cuando la pulsamos dos veces.

WWW.LINUX- MAGAZINE.ES

Dentro de la ventana de Nautilus podemos pulsar con el botón de la derecha sobre una fuente para especificar la aplicación para las fuentes en Gnome (Application font). El visualizador de fuentes de Gnome [4] nos muestra vistas previas de las fuentes instaladas, analizándolas y mostrando un ejemplo. Necesitamos tener instaladas las librerías de desarrollo de Gnome, incluyendo Pango y Freetype entre otras. Primero deberemos configurar el código fuente usando el comando ./configure, compilando luego el programa con el comando make. Si no deseamos instalar el visualizador de fuentes de Gnome lo podremos ejecutar desde el directorio /src/gfontsampler. Alternativamente podemos escribir make install para instalar el programa en los directorios del sistema. El visualizador nos ofrece una vistazo rápido de las fuentes instaladas.

En la Variedad está el Gusto La actual arquitectura de fuentes ofrece a Gnome un potente sistema de fuentes de calidad en distintos formatos comunes y en todos las lenguas. Usando este sistema, las aplicaciones tendrán un aspecto uniforme, pero sería esperar mucho que todos los autores de software libre reescriban el código fuente de sus aplicaciones sólo por motivos estéticos. ■

RECURSOS [1] Fontconfig: http://www.fontconfig.org [2] Freetype: http://www.freetype.org [3] Pango: http://www.pango.org [4] Visualizador de fuentes de Gnome: http://linuxadvocate.org/projects/ gfontsampler

Número 08

87


LINUX USER • Educación

ATNAG como como plataforma plataforma educativa educativa ATNAG

JUEGOS REUNIDOS

Después de varios artículos generales sobre las posibilidades de adaptación del sistema operativo a necesidades diversas volvemos a la práctica de nuestras aulas con el examen de cómo se utiliza en un centro concreto, el Centro de Educación Infantil Corazón de María de Palencia, una aplicación concreta, ATNAG. POR MARÍA DOLORES ALMANSA TEJADA Y JUAN RAFAEL FERNÁNDEZ GARCÍA

A

TNAG es un conjunto formado por tres elementos: una colección de 23 módulos para el diseño de juegos educativos destinados a niños de Educación Infantil y primeros cursos de Primaria, herramientas para la creación y modificación de recursos para explotar estos módulos de juegos y un sistema (el cuaderno escolar) de presentación de actividades y seguimiento del trabajo de alumnos y clases. Pero esta vez no vamos a examinar la aplicación en abstracto, sino cómo se utiliza en un centro determinado con unas circunstancias muy determinadas.

Una Solución Valiente Cuando en el curso 2002-2003 el Centro de Infantil Corazón de María toma la decisión de montar un aula de informática, varios son los problemas a los que tiene que enfrentarse: la escasez de presupuesto, la exigencia moral de reutilizar

88

Número 08

todo el hardware disponible y la obligatan hacia el Software Libre como única toriedad de que todo el software utilizasolución legal. Se contacta con do fuera legal. Hispalinux, y especialmente con La primera fase tuvo que Antonio Quesada, profesor ver con el hardware: se de un Instituto de Enseñanza comenzó por pedir a empreSecundaria y miembro del sas e instituciones ordenadogrupo de trabajo sobre termires viejos y descatalogados. nales de Hispalinux y del Los equipos recibidos se Gulic (Grupo de Usuarios de desmontaban para limpiarFigura 1: Reciclado de Linux Canarias). Antonio los (Figura 1), se reparaban ordenadores viejos. aconseja configurar un aula y se añadía hardware multicomo terminales gráficas[1] media (tarjetas de sonido, y colabora en remoto en su altavoces, tarjetas de red…). instalación (Figura 2). Un segundo problema era Actualmente el colegio el del sistema operativo y el está montado y usando precio de sus licencias: conPXES. Como podemos ver en tando ya con 12 equipos y el cuadro 1, PXES es un sispreviendo que el número Figura 2: Una clase tema que permite reutilizar podía ascender se pidió precon terminales Linux. equipos antiguos, convirtiénsupuesto de software privatidolos en terminales gráficas vo, que resultó desorbitado. Varios y dotarlos de la potencia aparente de los padres de alumnos y alumnas les orienPCs nuevos. Entre las muchas ventajas

WWW.LINUX- MAGAZINE.ES


Educación • LINUX USER

das: se crearon grupos de trabajo que desarrollaran actividades y programaciones educativas que permitieran a los profesores incorporarse al cambio con confianza y sin traumas. ¿Qué aportan las soluciones informáticas encontradas? En primer lugar se ha podido configurar en el Centro una red de bajo costo. Las redes thin client libeFigura 3: Imágenes libres disponibles en ran a un centro educativo de ese ciclo ATNAG. asfixiante y consumista de que cada dos años hay que invertir en hardware que ofrece este sistema están que los ternuevo para adaptarlo a las actualizaciominales no necesitan dispositivos de nes del sistema operativo. Pero se ha almacenamiento físicos (discos duros, dado un paso más: la herramienta de cdrom…), ni procesadores de última autor ATNAG, con licencia GPL, permite generación. Las ventajas en lo que resal profesorado seguir siendo el garante pecta a administración y mantenimiento del proceso educativo, ya que puede de un solo PC (el servidor) son evidendiseñar las actividades para cada alumtes. no o alumna concretos y llevar el control Pero el eje de la decisión tomada no de las mismas. Cualquier software que está en la superioridad del software de se utilice en el aula ha de dar al profesored o el ahorro económico. El aspecto rado la suficiente libertad y autonomía decisivo es de principios. La integración para establecer y acomodar los de las TIC en el ámbito escolar conlleva objetivos y contenidos un proceso complejo donde se deben pedagógicos según las ensamblar inicialmente varios factores: características del grupodisponer de hardware, de software educlase. Siempre que la cativo adecuado pedagógicamente y formaestra o maestro pueda mación del profesorado. Es un hecho hacer fácil y libremente que el porcentaje de profesorado que utisus propias actividades liza las TIC o el ordenador como parte de para los alumnos y alumsu metodología de trabajo es realmente nas que tiene en el aula, el bastante bajo. En el Corazón de María se planteamiento de este softllegó a la conclusión de que para que el ware será mucho más aceptaprofesorado asuma y aplique una deterdo. Un programa informático por minada metodología, tenía que percibir muy atractivo que sea, si no se que el cambio iba a repercutir positivapuede acomodar a las característimente en la formación y educación de cas de cada grupo de alumnos en sus alumnos. Para ello no se pensó úniparticular, no es suficiente motivo camente en buscar aplicaciones adecuade entusiasmo para estimular al profesorado a tomarlo como herramienta que apoye y complemente su trabajo. Por lo demás el software libre, unido al acceso de la información y comunicación que aporta Internet, insta al mundo educativo a un cambio metodológico no sólo en el aula, sino mucho más allá, impulsándolo a un trabajo colaborativo. De ahí el Proyecto Educativo Figura 4: Herramientas para la construcción de aplicaciones. GNU/Linux COR-EDUX,

WWW.LINUX- MAGAZINE.ES

para establecer enlaces de cooperación entre desarrolladores, diseñadores, pedagogos y profesores. La Escuela ha de seguir trabajando por formar y educar en valores y no en una esclavitud tecnológica, de ahí que este tipo de apuestas donde se valoran los sistemas de reciclaje (reutilización de equipos obsoletos) es una toma de conciencia de su impacto medio ambiental por un lado, y por otro se aboga por la libertad en una sociedad donde queremos que prime el conocimiento compartido.

¿Una Solución Correcta? Pero hasta este punto sólo se había resuelto una parte del problema. ¿La solución elegida sería viable en Educación? Y para el fin que se buscaba: ¿crear un aula para infantil

utilizando aplicaciones lúdico-educativas? Tres nuevas soluciones son necesarias: el imprescindible sonido, software lúdico e imágenes libres. • El sonido en local se pudo solucionar pasando de LTSP a PXES y utilizando esd. • Para realizar las actividades, se necesitaban imágenes que se pudieran usar con una licencia libre. No tanto fotos, quizás más fáciles de encontrar, como dibujos, más atractivos para los niños. Se vuelve a acudir a la comunidad, y se establece contacto con diseñadores de soft-

Número 08

89


LINUX USER • Educación

ware libre. Aparecen voluntarios (http://www.linuxgraphic. org/forums/viewtopic. php?t=152 y http://jm.trivial. free.fr/infographie/cor-edux/). Igualmente se solicita el uso de imágenes para software educativo a algunas webs que permiten su descarga. Fruto de esta colaboración es un entorno variado y agradable (Figura 3). En cuanto al software educativo, se empieza a buscar programas ya desarrollados para GNU Linux y aplicables a la etapa educativa. Se instaló y

analizó Gcompris, Childsplay y ATNAG y se contacta con los desarrolladores para sugerirles algunas mejoras. Con el desarrollador de ATNAG se contactó para pedir orientación sobre los archivos para traducirlos al español ya que el programa estaba en francés. Ante las nuevas mejoras que se le proponen al desarrollador decide visitar el Corazón de María en enero de 2004 y estar un periodo de tiempo trabajando las propuestas. En abril de 2004 vuelve de nuevo al Centro para ultimar algunas mejoras más y se lanza el proyecto publicándolo en http://www.cor-edux.org.

Figura 5: Arranque en un sistema de servidor y terminales.

¿Por qué ATNAG? Hemos visto que en el Centro se evaluaron las distintas aplicaciones que a pri-

Cuadro 1: LTSP, PXES, terminales listos y terminales tontos ¿Cómo funciona el sistema de terminales?[2] Mediante un sistema en el que hay un servidor y clientes llamados tontos o delgados (la expresión se refiere a la ausencia de potencia de los clientes, que pueden ser máquinas con escasa memoria e incluso sin disco duro). El trabajo duro lo hará el servidor. Sus requerimientos dependerán del número de terminales que atenderán, siendo importante no sólo el procesador sino también la memoria RAM instalada en el servidor, teniendo en cuenta que la cantidad de RAM necesaria en el servidor si elegimos el protocolo XDMCP por cliente es de unos 50-80 Mb a las que hay que sumar 250 Mb de base. P.ej. una sala con 10 terminales tontos y usando aplicaciones que consuman mucha RAM podria llegar a necesitar 250 + (10*80) = 1050 MB de RAM… aunque si usásemos aplicaciones más ligeras podríamos tener un funcionamiento aceptable con 250 + (10*50) = 750 MB de RAM. ¿Cómo arrancan los ordenadores por red? El proceso aparece esquematizado en la imagen 5 (descargada de http:// terminales.hispalinux.es/show_image. php?id=130, desconocemos los derechos de copia de la misma). El cliente al arrancar envía una señal por la red que le identifica con la MAC de la tarjeta. Esta señal es reconocida por el servidor, que le asigna una identificación de red (por dhcp) y a continuación le envía (por tftp) primero una pequeña imagen de arranque (Network Bootstrap Program, NBP) y después el sistema operativo para que lo cargue en memoria RAM, quedando el cliente configurado y con el login gráfico ejecutado en el servidor. A partir de ese momento, el cliente podrá utilizarse para enviar señales de teclado, ratón y

90

Número 08

recibir en pantalla el resultado de las ordenes enviadas. Para arrancar desde un dispositivo de red hay varias modalidades: la más antigua es netboot, muy utilizada es etherboot y la más moderna, PXE. Como se informa en http://wiki.ltsp.org/ twiki/bin/view/Ltsp/PXE PXE (Preboot eXecution Environment, no confundir con el proyecto PXES) es el resultado de un acuerdo de mediados de los años noventa entre Compaq, Dell, HP, Intel y Microsoft para especificar las características de construcción de los Net PC. La guía creada describe un método para el arranque del sistema operativo desde un servidor de red. Varios fabricantes, entre los que destaca Intel, incluyen una ROM de arranque que cumple la especificación PXE en sus tarjetas de red, y la mayor parte de las placas madre con tarjetas de red integradas incluyen PXE en la BIOS. Pero, ¿cómo arrancan los ordenadores? Si nuestro cliente ligero es antiguo y no es capaz de arrancar directamente por tarjeta de red (con soporte PXE, o EPROM) u otro dispositivo de almacenamiento (disco duro, compact-flash, llavero usb, etc) deberemos hacerlo mediante un disquete de arranque, el Disquete Universal de Arranque disponible en http://sourceforge.net/project/showfiles. php?group_id=80408&release_id=23487 7 y que reconoce la mayoría de las tarjetas de red. En la práctica existen varios proyectos de servidores de terminales. Destacaremos tres de ellos por varias razones: LTSP (http://ltsp.org/) LTSP es un proyecto inicial de Jim McQuillan en un estado

WWW.LINUX- MAGAZINE.ES

bastante maduro en la actualidad. LTSP está disponible como un conjunto de paquetes que se puede instalar en cualquier sistema Linux, y también se incluye en distribuciones especiales completas, como K12Ltsp y SkoleLinux. Los clientes montan su sistema de archivos, incluida el área de intercambio de memoria, a través de la red mediante NFS, esto los hace dependientes de Linux, pero exige menos requerimientos en los clientes. Lessdisks (http://lessdisks.net/) es un proyecto basado en una distribución Debian estándar con los mínimos cambios posibles y no requiere parchear el núcleo. Monta también el sistema de archivos raíz por NFS. PXES (http://pxes.sourceforge.net), pronunciado pixis, es un desarrollo del argentino Diego Torres Milano. Es independiente del sistema operativo del servidor, y dispone de imágenes listas para ser usadas y que reconocen automáticamente el hardware de los clientes. Incluye un interfaz gráfico o druida para personalizar las imágenes. Para acabar en lo concreto diremos que en el Corazón de María se empezó usando LTSP y ahora se usa PXES, y se dan los tres tipos de arranque: primeramente se usó un disquete universal que reconocía la tarjeta de red (la forma más económica y fácil), a medida que se disponía de más presupuesto para el aula de informática se ha podido comprar y grabar la EPROM de la tarjeta de red, sustituyendo los disquetes, y actualmente para las aulas de infantil se han adquirido las tarjetas con arranque PXE ya que su coste es asumible y son fáciles de encontrar en el mercado.


Educación • LINUX USER

Figura 6: Instalación en modo experto.

mera vista serían candidatas a cubrir las necesidades de herramientas de creación, utilización y seguimiento de las actividades. Son muy interesantes sus conclusiones. Se descartó Gcompris a pesar de considerarlo muy bueno. «Gcompris, tal y como está, es un programa demasiado global que abarca un abanico de edades muy amplio y dispar. La calidad del programa se pierde. Está bien como entretenimiento en casa tal y como está (pero se corre el riesgo que unos hijos lo encuentren excesivo y otros se aburran una vez aprendido el juego), pero su aplicación a la escuela requiere adaptaciones. Para los niños y niñas de 3 años apenas hay actividades y enseguida cambian de nivel. Para esta etapa evolutiva es necesario repetir mucho y reforzar los mecanismos. Y lo mismo podríamos decir para 4 y 5 años. También el vocabulario o texto empleado habría que amoldarlo más al entorno del niño y a los Centros de Interés o unidades didácticas que damos en la escuela». Es decir, tenía carencias importantes en la tarea de individualizar o personalizar la enseñanza. Sobre Squeak la evaluación es diferente: «Es para otra mentalidad de profesorado más constructivista. Es muy bueno el planteamiento y el enfoque que tiene,

Figura 8: Cuaderno escolar.

pero no para la mayoría del profesorado. Hay que partir de la base que el 95 % del profesorado -empezando desde infantil- no está concienciado a cambiar su metodología de una forma tan radical». ¿Y ATNAG? Ya hemos indicado el argumento fundamental de que resultara elegida: permite al profesorado seguir siendo el garante del proceso educativo, ya que puede diseñar las actividades para cada alumno o alumna concretos y llevar control de las mismas. No conviene olvidar un segundo hecho: desde el centro se había contactado con los autores de las herramientas evaluadas sugiriendo mejoras y adaptaciones. De todos estos contactos destacó la respuesta de Gérard Sellès, colaborando estrechamente y entendiendo que en todo este proceso quien tiene la palabra es el profesor/a como pedagogo/a. La respuesta pedagógica correcta la tienen los profesores.

Historia de ATNAG Quizás a los profesores les interese saber cómo ha nacido un programa como ATNAG, creado sin afán de lucro. Su origen está en un cúmulo de circunstancias: la empresa donde trabajaba Sellès como ingeniero informático (usuario de Unix desde 1983) hace regulación de empleo y éste recibe con 55 años la jubilación anticipada. Tras esto y para ocupar su tiempo libre decide diseñar juegos educativos para que su esposa Annie, profesora de Educación Infantil, pueda usarlos en su clase con sus alumnos/as. Inicialmente eran programas pequeños y cerrados (memoria). Será Annie quien pedirá a Gérard que lo que desarrolle para usarlo en su escuela le permita cambiar temas, niveles, etc… Así surge la filosofía de ATNAG de ser un programa

WWW.LINUX- MAGAZINE.ES

informático ludo-educativo que ayude tanto al alumno como al profesor. Rápidamente aparecerá la idea de estructurar en dos partes el proyecto: por un lado los juegos con los scripts de calibración (los scripts de la página Juegos —memory.sh, clic.sh, etc., que sirven para preparar los juegos con los botones Vista Previa y Guardar) y por otro las herramientas para generar recursos. Ambos aspectos se unirán en la presentación en un Cuaderno Escolar. Y todo eso con la licencia GPL, totalmente libre para descargar, distribuir, modificar… Pero, ¿de dónde viene el nombre? ATNAG es un acróstico. Son las iniciales de los tres hijos de Gérard Sellès, de su mujer y de él: Antoine, Thomas, Nicolas, Annie, Gérard… ¿El futuro de ATNAG? Como en la mayor parte de los desarrollos de software libre, depende de nosotros. El autor trabaja en contacto directo con los profesores en los Centros donde se utiliza. Dos noticias podemos comunicar: en muy poco tiempo se espera la aparición de una nueva versión, con módulos nuevos como el de Bits de Inteligencia. Se está trabajando en el empaquetado y desempaquetado de bloques de actividades para colgarlas y descargarlas de la web. Y el presidente de OFSET Hilaire Fernandes asegura que en la próxima

Número 08

91


LINUX USER • Educación

edición de Freeduc-Primaire se incluirá la aplicación. Por lo que respecta a los desarrolladores, queremos por otro lado transmitir una petición de Gérard Sellès: ha solicitado en varias ocasiones que se movilice la posibilidad de crear un Grupo de Trabajo de Desarrolladores a los que les transmitiría la filosofía de ATNAG y la ayudarían en su mantenimiento en colaboración siempre con el grupo de Profesores.

Instalación Lo realmente revolucionario en ATNAG es su planteamiento: las actividades diseñadas en él pueden ser adaptadas a cada niño y niña concretos y además permite tener un seguimiento de los resultados en la ejecución de todos aquellos juegos que puedan ser evaluados. Su desarrollador concibe ATNAG desde la estructura de un Cuaderno Escolar con Hojas Sueltas, desde el cual el/la profesor/a diseña las actividades que un/a alumno/a -o toda una clase-, necesitan hacer para la adquisición o afianzamiento de un determinado concepto. ¿Dónde podemos encontrar la aplicación? En Sourceforge: [3], de donde podemos descargar los distintos tar.gz que la componen. La versión estable más reciente en el momento de escribir este artículo, del 22 de octubre de 2004, está disponible en francés, por supuesto, y localizada al inglés y al castellano (por María Dolores Almansa). Se está procediendo a la traducción a las lenguas catalana, gallega, vasca, y portugués del Brasil (para seguir la marcha de la traducción basta consultar las páginas del GRUPO TRABAJO TRADUCTOR@S: Proyecto Ed. Infantil “PEQUETUX”, [4]).

92

Número 08

Y en el próximo número… Terminaremos esta breve presentación de ATNAG mostrando varios juegos, y cómo se crean y organiza su explotación en el cuaderno de clase. Vamos a anali-

WWW.LINUX- MAGAZINE.ES

zar en detalle el módulo del juego de Relaciones ya que sus implicaciones y posibilidades son muy ricas: incluye lectura, diferentes criterios o conceptos de clasificación, valores matemáticos (suma,resta…). Veremos también cómo están trabajando en grupos de trabajo para el desarrollo de actividades y se planea utilizarlo en las programaciones del ■ Corazón de María.

RECURSOS [1] En un primer momento el sistema elegido por Antonio Quesada fue el Linux Terminal Server Project (LTSP). Problemas con el sonido, imprescindible en Infantil, y la facilidad como se puede construir una imagen en PXES explican el paso de utilizar un proyecto al otro. [2] En la explicación de los proyectos de terminales Linux usamos profusamente la información disponible en http://terminales.hispalinux.es/ tiki-index.php. [3] Descarga de ATNAG: http:// sourceforge.net/projects/atnag/ [4] GRUPO TRABAJO TRADUCTOR@S: Proyecto Ed. Infantil “PEQUETUX”: http://www.cor-edux.org/moodle/ course/view.php?id=5 [5] Documentación y creación de actividades para ATNAG: http:// software-libre.org/projects/cor-edux/ [6] Más documentación y actividades para ATNAG: http://www.cor-edux. org/moodle/course/category. php?id=2

LOS AUTORES

Figura 7: Demostración de ATNAG.

María Dolores contribuye a la documentación y creación de actividades para ATNAG, primeramente en [5] y actualmente en [6]. Ahí podemos encontrar documentación, actividades e incluso videos explicativos de cómo se utiliza. Procederemos a descargar todos los ficheros compr¡midos tar.gz y el ejecutable install, copiarlos a un subdirectorio visitable por todos los usuarios (por ejemplo /usr/local/atnag o /opt/) y como root ejecutar install. Al ser un conjunto de ejecutables escritos en c es probable que no se requiera la instalación de ninguna biblioteca extra, salvo quizás libpng3. Las primeras ventanas del proceso de instalación nos preguntarán el idioma en que queremos realizarla y el modo de instalación que queremos seguir (automático, experto o a nuevos usuarios. Aconsejamos el modo experto (Figura 6) porque nos permitirá instalar también los recursos en español). Seleccionamos todos los paquetes y aceptamos crear iconos para KDE o Gnome (y rechazamos la oferta de configurar AbulEdu, distribución francesa que podemos analizar en otro artículo y que en este caso hace fallar la continuidad de la instalación). Finalmente llegamos a la creación de usuarios. ATNAG distingue entre profesores y alumnos, con distintos permisos para unos y otros. Deberemos indicarle qué usuarios del sistema recaen en cada uno de estos dos grupos. Los profesores tendrán autorización para crear y utilizar Cuadernos de actividades, y los alumnos pertenecerán al grupo «clase» y realizarán las actividades (esta asignación de usuarios a los grupos puede repetirse y modificarse reiniciando la instalación y seleccionando el modo «A nuevos usuarios»). El proceso termina con el ofrecimiento de ver una demostración de las actividades instaladas (Figura 7): hemos tenido éxito. Uno de los iconos creados pone a nuestra disposición el cuaderno de ejemplo de la figura 8.

María Dolores Almansa Tejada es profesora de educación infantil en el Centro de Ed. Infantil Corazón de María de Palencia, coordinadora del Proyecto Educativo GNU/Linux Cor-Edux y asesora pedagógica de la Herramienta de Autor ATNAG. Juan Rafael Fernández García es profesor de educación secundaria y tiene una larga experiencia en la traducción y documentación del software libre. Ha sido coordinador de uno de los Centros que participan en la experiencia andaluza de integrar las TIC en la educación y actualmente trabaja como asesor de formación del profesorado.


Línea de Comandos • LINUX USER

mkisofs, mount, md5sum

HERRAMIENTAS DE ESCRITURA Antes de tostar un CD de datos bajo Linux, necesitaremos una imagen ISO: mkisofs nos ayudará a crearla. Y a la hora de guardar los discos, puede que queramos comprobar la imagen antes de quemarla con md5sum. POR HEIKE JURZIK

L

os CDs y las particiones de disco usan diferentes sistemas de archivos. Mientras que Linux puede usar Ext3 o ReiserFS para las particiones, los CDs usan el sistema de archivos ISO9660. No tiene mucho sentido quemar una partición bloque a bloque en un CD. En vez de eso, tendremos que ejecutar la herramienta mkisofs para crear previamente un sistema de archivos ISO9660 donde guardar los archivos requeridos. Una vez hecho esto, podemos quemar la “imagen ISO” en un disco usando la herramienta cdrecord. Este mes, en “Línea de Comandos” indagaremos en las herramientas que nos permiten quemar y verificar imágenes de CDs.

Creación de Imágenes Linux ofrece diversas soluciones para crear imágenes ISO. Desde la línea de comandos tenemos la herramienta mkisofs (“make ISO 9660 filesystem”) así como dd (véase el cuadro “Crear imágenes ISO con dd”). mkisofs espera que le especifiquemos un archivo de salida (parámetro -o) y los archivos fuente desde donde crear la imagen: mkisofs [parameter] -o file.iso U /directory/with/data

Como parámetro opcional, podemos especificar -r (Rock Ridge) y -J (extensio-

nes Joliet) para asegurarnos de que el CD podrá ser leído desde otros sistemas operativos. Si especificamos -R en vez de -r, la herramienta seguirá usando Rock Ridge, pero se mantendrán la propiedad y permisos del archivo. Esta configuración nos ayudará si estamos haciendo un backup de nuestros propios archivos: $ mkisofs -J -R -o backup.iso U /home/linux-magazine 8.56% done, estimate finish U Wed Feb 23 13:53:32 2005 17.10% done, estimate finish U Wed Feb 23 13:53:32 2005 [...]

El indicador de progreso nos dice cuánto le queda a mkisofs para terminar el trabajo. Si preferimos no mirar el indicador, deberíamos especificar -quiet para que mkisofs quede en silencio. La opción -V (“Volume ID”) nos permite especificar una etiqueta para el CD: mkisofs -V "LinuxMag Backup U 02/2005" -J -R -o backup.iso U /home/linux-mag

Exclusiones Para excluir específicamente archivos en una copia de seguridad podemos incluir la opción -m, que soporta comodines. Podemos encadenar múltiples parámetros -m, como en la siguiente sentencia:

WWW.LINUX- MAGAZINE.ES

mkisofs -J -R -m '*.jpg' -m U '*.png' -o backup.iso U linux-mag/commandline/2005

que excluye los archivos con extensiones .jpg o .png de la imagen ISO. Una advertencia: si estamos creando una imagen de archivos del directorio actual, no podemos usar el comodín * para referirnos a todos los ficheros. El siguiente comando mkisofs -J -R -m '*.jpg' -o U backup.iso *

incluirá realmente todos los archivos JPEG en el directorio. Podríamos usar el punto “.” como atajo para el directorio actual en su lugar. mkisofs funcionará de la manera esperada en este caso y no colocará los archivos de gráficos en la imagen. Lo mismo es aplicable para la opción no-bak, que está diseñada para excluir archivos con extensiones típicas de programas de copias de seguridad como ~, # o .bak. No usa el asterisco: en su lugar usa una ruta para excluir cualquier archivo que no queramos poner en la imagen. -x <ruta> nos permite excluir un directorio entero. Las rutas para los directorios pueden ser absolutas (como /usr/local) o relativas (como ../../usr/local). De nuevo, es posible hacer selecciones múltiples:

Número 08

93


LINUX USER • Línea de Comandos

md5sum con la opción -c en su lugar. Para ello, cargamos tanto la imagen ISO como el archivo de checksum en nuestra máquina y ejecutamos lo siguiente:

mkisofs -J -R -x U /usr/local -x U ../../usr/games -o U backup.iso /

Verificación

$ md5sum -c MD5SUM

Existen varias opciones para la verifiFC3-i386-DVD.iso: Ok cación de imágenes ISO. En primer lugar, tal vez nos gustaría montar la El resultado muestra que la imagen imagen de nuestro sistema de archide Fedora Core 3 de nuestro ejemplo vos, sólo para estar seguros. está completa e inmaculada: los El comando mount no sólo monta checksums coinciden. Si el checksum dispositivos como discos duros o Figura 1: Verificar los checksum MD5 nos ayuda a falla, md5sum nos indicaría algo CDs en el sistema de archivos de asegurarnos de que las imágenes descargadas están como: Linux. También monta imágenes inmaculadas. ISO, usando la opción -o loop. Como FC3-i386-DVD.iso: Error administrador, podemos usar el ISO (véase Figura 1). Los archivos de Buena combinación siguiente comando para montar una texto denominados generalmente imagen MD5SUM o xyz.iso.md5, guardan los Los programas desde la línea de comanhash de los archivos del servidor. Como dos a menudo nos ofrecen la ventaja de mount -o loop file.iso /mnt/tmp/ el checksum varía con sólo un bit que se usar varias herramientas en combinamodifique, es extremadamente difícil ción. Por ejemplo, una combinación Por supuesto, el directorio /mnt/tmp/ generar dos archivos que tengan el inteligente consistente en una llamada a tiene que existir (como es habitual). mismo checksum. En otras palabras, es mkisofs junto con el comando cdrecord Sino, mount nos lo indicará: extremadamente improbable que un nos permite quemar CDs “al vuelo”. archivo genere el mismo checksum si ha Esto elimina la necesidad de tener espamount: mountpoint /mnt/tmp/ U sido manipulado o se dañó durante la cio en el disco duro para la imagen ISO. does not exist transmisión. Sólo tenemos que indicar la opción -o Podemos ejecutar la herramienta de archivosalida en mkisofs y simplemente Si mount nos indica que el sistema de línea de comandos md5sum para verificonducir la salida con una tubería hasta ficheros es desconocido, puede que car la huella MD5. Si sólo queremos cdrecord. El único problema con este necesitemos el parámetro -t iso9660. El obtener el valor del hash, debemos teclemétodo es que necesitamos un búfer los directorio /mnt/tmp debería contener la ar md5sum archivo y se mostrará el suficientemente grande como para eviimagen ISO completa, exactamente checksum por pantalla: tar un desbordamiento de búfer, lo que como aparecería en el CD. Para desmonimplicaría la perdida del disco. Aunque tar la imagen, de nuevo como usuario $ md5sum FC3-i386-DVD.iso Linux está bien preparado para la multiroot, tecleamos la siguiente sentencia ca49964739f84848ca78fc036 U tarea, puede que deseemos añadir un con umount: 62272fb FC3-i386-DVD.iso búfer de 6Mbytes al comando cdrecord, para no pillarnos los dedos: umount /mnt/tmp Si estamos quemando imágenes ISO con K3b, podemos ahorrarnos el engorro de mkisofs -V "LinuxMag Backup U Validado obtener el checksum manualmente en 02/2005" -J -R /home/linux-mag U Si descargamos un archivo ISO de una línea de comandos. Después de ele| cdrecord -v fs=6m speed=4 U Internet, puede que queramos verificar gir si quemamos una imagen de CD o de dev=0,0,0 el checksum MD5 del archivo. Linux DVD en el menú Tools, K3b calculará el nos proporciona la herramienta checksum automáticamente. El indicaNo debemos olvidar el signo menos al md5sum, que crea un hash de 128 bits dor de progreso nos va mostrando la final de esta línea. Esto indica a cdrecord del archivo. Un checksum nos permite situación. Al terminar de quemar el CD o que no lea del fichero, sino de la entrada asegurarnos que la transmisión de la DVD, K3b nos muestra un cuadro de diáestándar. De esta manera tendremos información ha sido correcta. Tanto el logo que nos permite validar la suma nuestros datos en el disco en menos que emisor como el receptor calculan el MD5. canta un gallo. ■ checksum, y si el archivo se ha transmiPor supuesto, podemos abrir los architido sin errores, entonces ambos resultavos de checksum en un editor de texto, o RECURSOS dos han de ser idénticos. MD5 es un bien usar cat para mostrarlos por pantaalgoritmo de checksum desarrollado en lla y así poder comparar los dígitos indi[1] RFC 1321 “The MD5 Message-Digest 1991 por Ron Rivest [1]. vidualmente. Pero hacerlo así consume Algorithm”: http://www.ietf.org/rfc/ La mayoría de los servidores propormucho tiempo y es propenso a errores, rfc1321.txt cionan checksums MD5 de las imágenes por lo que puede que prefiramos ejecutar

94

Número 08

WWW.LINUX- MAGAZINE.ES


Más del 30% de descuento respecto al precio de portada: Consigue 12 números por 54’90 Euros y todos los DVDs ¡Gratis!

A diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios para que renueves tu subscripción. Ésta se renovará automáticamente cada año. Recibirás una confirmación aproximadamente 30 días antes del final de tu periodo de subscripción, pero no se requiere que hagas nada para seguir suscrito.

¡No te pierdas Linux Magazine nunca más! La subscripción te asegura que recibas los conocimientos Linux de más alta calidad en tu domicilio cada mes.

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.

Linux Magazine es algo más que una revista de Linux. Patrocinamos grupos, congresos, proyectos y eventos relacionados con el Software Libre. Suscribiéndote a Linux Magazine garantizas que podamos seguir apoyando al Software Libre allá donde haga falta.


EVENTOS

CAMPUS PARTY

Linux World San Francisco

aKademy 2005

Fecha: 25-31 Julio

Fecha: 9-11 Agosto

Fecha: 27 Agosto - 4 Septiembre

Ciudad: Valencia

Ciudad: San Francisco, CA, EE.UU.

Ciudad: Málaga, España

Sitio Web: http://www.campusparty.org

Sitio Web: www.linuxworldexpo.com

Sitio Web: http://conference2005.kde.org

Calendario de Eventos Evento Fecha I Congreso de Tecnologías del Software Libre 7-8 Julio Debconf 5 10-17 Julio 2005 Linux Symposium 20-23 Julio Campus Party 2005 25-31 Julio What the Hack 28-31 Julio OSCON 2005 1-5 Agosto Usenix Security Symposium 1-5 Agosto Wikimania 2005 4-8 Agosto LinuxWorld Conference & Expo S.F. 9-11 Agosto FAVE 2005 20 Agosto LinuxWorld Conference & Expo Beijing 24-26 Agosto LinuxWorld Conference & Expo Moscow 7-9 Septiembre aKademy 2005 27 Agosto - 4 Septiembre New Security Paradigms Workshop 2005 20-23 Septiembre LinuxWorld Conference & Expo UK 5-6 Octubre LinuxWorld Conference & Expo NL 13-14 Octubre LinuxWorld Conference & Expo Frankfurt 15-17 Noviembre linux.conf.au 2006 23-28 Enero LinuxWorld Conference & Expo Australia 28-30 Marzo 06

Ciudad A Coruña Helsinki, Finlandia Ottawa, Canadá Valencia, España Liempde, Holanda Portland, OR, EEUU Baltimore, MD, EEUU Frankfurt, Alemania San Francisco, CA, EE.UU Bristol, Reino Unido Beijing, China Moscú, Rusia Málaga Lake Arrowhead,CA,EEUU Londres, Reino Unido Utrecht, Holanda Frankfurt, Alemania Dunedin, Nueva Zelanda Sydney, Australia

Sitio Web http://congreso.gpul.org www.debconf.org/debconf5 www.linuxsymposium.org http://www.campus-party.org www.whatthehack.org www.conferences.oreillynet.com/os2005 www.usenix.org http://wikimania.wikimedia.org/wiki www.linuxworldexpo.com www.fave.org.uk www.linuxworldchina.com www.linuxworldexpo.ru http://conference2005.kde.org www..nspw.org/current www.linuxworldexpo.co.uk www.linuxworldexpo.nl www.linuxworldexpo.de http://lca2006.linux.org.au www.linuxworldexpo.com.au

Información de Contacto Director Paul C. Brown Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas. Traductores Paqui Martín Vergara, Paul C. Brown, Jesús Reyes Delgado, Antonio Rueda, Víctor Tienda. Maquetación Sergio Hardasmal Diseño de Portada Pinball (info@pinball-werbeagentur.de) Diseño de Publicidad Feedback (www.f-back.com) Publicidad www.linux-magazine.es/pub/ Para España Paul C. Brown pbrown@linux-magazine.es pbrown@linuxnewmedia.es Tel.: (+ 34) 951 010 556 Móvil.: (+ 34) 655 036 836 Fax.: (+ 34) 951 010 516 Sergio Hardasmal anuncios@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516

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 Director de Producción Sergio Hardasmal anuncios@linux-magazine.es Subscripciones: www.linux-magazine.es/ magazine/subs Precios Subscripción (12 números + 1 DVD cada 3 números) España: 49,50 € Europa: 59,90 € Resto del Mundo - Euros: 79,90 € Resto del Mundo - Dólares U.S.A.: 94,90 € Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516 subs@linux-magazine.es 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.LINUX- MAGAZINE.ES

www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania 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 Depósito Legal: MA-116-2005 ISSN edición impresa: 1576-4079 ISSN edición online: 1699-2237

Número 08

97


PRÓXIMO NÚMERO

Octubre 2005: Número 9

PRÓXIMO NÚMERO DVD: DEBIAN SARGE

SEGURIDAD Ya de vuelta de las vacaciones, con renovadas energías, no hay nada como revisar ese tema siempre pendiente en el trabajo, en la escuela o en el hogar: La seguridad. En el número 9 de Linux Magazine, descubriremos como defendernos de ataques, intrusiones y demás fechorías, estudiando precisamente las técnicas de quienes las utilizan. Empezaremos viendo como un cracker puede secuestrar una conexión inalámbrica y como se puede utilizar una herramienta llamada Hotspotter para detectar vulnerabilidades. También discutiremos vulnerabilidades del popular cliente de correo Thunderbird y veremos como mantener intrusos fuera de la red con ARP Spoofing. Concluiremos nuestra sección de portada con un estudio de la criptografía bajo Linux.

Aprovechando que por fin ha salido la nueva versión de Debian, incluimos como DVD de portada con nuestro número 9 Sarge, lo ultimísimo de la comunidad del espiral.

INKSCAPE El programa de diseño vectorial Inkscape posee muchas opciones poderosas que sólo encontrarías en un aplicaciones comerciales de gama alta (y precio elevado). Acompáñanos en un breve tutorial que te enseñara a empezar a desenvolverte con este potente programa de diseño.

PODCATCHING ¿Ya se te ha contagiado la fiebre iPod? Pues no necesitas un iPod para apuntarte a la última moda: PodCatching. Te enseñamos como capturar y reproducir podcasts desde Linux.Y, siguiendo con las prestaciones multimedia, vemos como crear un SlimServer para retransmitir música por toda la casa (o lugar de trabajo) a través de una red LAN.

AVISO A LOS LECTORES El presente número de Linux Magazine es el correspondiente a los meses de julio y agosto. No es un número doble, por tanto los subscriptores seguirán recibiendo los tres o doce ejemplares correspondientes a su subscripción correspondiente (de prueba o anual), pero no volveremos hasta septiembre con más apasionantes temas, más programación, más administración y más aplicaciones para todos nuestros lectores.

A LA VENTA: SEPT. 2005 98

Número 08

WWW.LINUX- MAGAZINE.ES


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

Puesto a la venta en julio 2005. Tema de Portada: Wikis y Blogs. DVD: Fedora Core 4.

Advertisement