Desktopia LINUX MAGAZINE
Vídeos de escritorio con Xvidcap
Superkaramba Edición en
Temas impactantes para KDE
Castellano
NÚMERO 04
NÚMERO 4 • P.V.P 5,95 €
Wireless
Redes inalámbricas perfectas
ABCedario 802.11
WIRELESS
Sticks USB inalámbricos
El ABCedario 802.11 explicado p10 Configura un USB Stick inalámbrico Seguridad wireless p17
p13
Seguridad Wireless
Scribus Maquetación profesional bajo Linux p48
Scribus
Panorama
Panorama
Impresionantes fotos de 360 grados p53
YUM WarWalking
YUM
p57
Superkaramba
Actualizaciones automáticas de instalaciones Fedora
WWW.LINUX- MAGAZINE.ES
Warwalking Hackeamos redes con un Zaurus p22
STRATO
Hosting
The European Web Host
r o y a m a l o r ”Quie “ b e W i m a r a calidad p ofesiorio avanzado como pr Tanto si eres un usua iento jam alo e los paquetes de nal, comprobarás qu s má es en cada vez funcion web de STRATO incluy ete qu ora, por ejemplo, el pa potentes. Contrata ah ación ta de una excelente rel AdvancedWeb y disfru ! do por tiempo limita calidad-precio. ¡Sólo
STRATO Hosting SOFTWARE INCLUIDO
(por ejemplo Advanc
edWeb)
¡OFERTA!
2 dominios web, 2.000 MB de espacio l ua ns me co fi 50 GB trá correo ab 0 buzones de 20 Soluciones backup obs PHP, Perl, MySQL, Cron-J Soporte gratuito Incluye el software de 09 seguridad Steganos 20
3 meses
5.09 válido hasta el 31.0Web ed nc va Ad STRATO
0
€
luego 9,99 € al mes
0 800 700 70 0 8 0 0 : o it tu ra g o n Teléfo pedido en Infórmate y realiza tu
s /e m o c . o t a r t s . w w w
* Periodo de contrato 12 meses. El software tiene un único coste de 9,90 € de gastos de envío. Precios sin IVA.
*
Escritorios
EDITORIAL
Demostrativos Estimado Lector de Linux Magazine
“
Es que ya no me dedico a eso”. “Eso” es la enseñanza de inglés y últimamente ésta es una de las oraciones que me encuentro repitiendo más a menudo cuando me encuentro a gente por la calle que no he visto en tiempo. Yo me dediqué a eso durante casi veinte años y, aunque fue divertido mientras duró, me encontraba en los últimos años más y más insatisfecho con otras cosas y me encontraba más y más a menudo evangelizando a mis alumnos sobre los beneficios (técnicos, personales, morales, sociales, económicos y políticos) del software libre que enseñándoles inglés. ¿Qué si lo hecho de menos? Pues sí, por que yo a ustedes, ¿qué les voy a contar? Si están leyendo esto, es por que ya están convencidos de los beneficios de Linux. ¡Si es que han salido y se han comprado Linux Magazine! Lo mío ahora es como predicar a los convertidos… ¡Ah, se refieren a lo de enseñar inglés! Bueno, eso también, puesto que no hay nada como un grupo de adolescentes con acné y las hormonas como locas diciéndote: “But Windows is also free” y tu rebatiéndoles con “Pirated, you mean. And I mean free as in freedom, not as in beer” para ejercitar el gran polemizador/el pequeño Stallman que todos llevamos dentro. “Y esto… ¿no pasará?” Esa es mi mujer, expresando consternación sobre mi futuro laboral y esto es Linux. Hombre, a la larga, sí pasará, pero dale unos cincuenta años, una era geológica en el mundo de la TI. Pero, claro, ella no está pensando en eso, sino en que, como existen algunos webs que ella querría visitar que no cargan bien en Konqueror, si no será ésta un moda pasajero de cuatro tarumbas peludos. Esa fase, creo yo, ya ha pasado. Linux ha rebasado la cima de la aceptación y ya rueda cuesta abajo,
a pesar de que sigue habiendo mucha gente mirando de reojo. Si bien queda mucho por hacer. ¿Qué le falta a GNU/Linux? ¿Estabilidad? Eso ya no es un problema. ¿Un escritorio con aplicaciones? ¡Menuda tontería! Desde hace años que en casa no tengo nada que no sea GNU/Linux y hago de todo lo que se puede hacer con un ordenador y, después, unas cuantas cosas más. Teniendo, pues, un sistema estable, seguro y bien surtido, ¿podemos exigirle más? Pues sí: modestia. No es exactamente lo que le exigirías a un puñado de código, pero si me parece que hace falta dentro de la comunidad. Todos los días leo en foros y wikis sobre los efectos nocivos de flamewars instigados por miembros de la comunidad cuyos egos son más grandes que su capacidad de programar… Y algunos de ellos tienen una gran capacidad de programación. Pero las posiciones extremas que toman algunos, alienando a sus compañeros (vistos como “competidores”), si bien les sirve para inflar perfiles y adquirir notoriedad en el ámbito del software libre, son, a la larga, contraproducentes, tanto para el desarrollo pacífico y armonioso, desde un punto de vista técnico como para la imagen que se da puertas hacia fuera. Véanse los últimos casos de dimisiones en Debian, en el seno del comité de desarrollo del Kernel y, uno poco más atrás en el tiempo, de la junta directiva de Hispalinux. No digo yo que las críticas no sean buenas. De hecho, el movimiento del software libre surge precisamente de la desconformidad y, por tanto, de una posición crítica. Pero la prepotencia con la que a veces se presentan esas críticas para lo único que sirve es para sembrar la discordia y fomentar la división entre usuarios cuyo fin último es el mismo: desarrollar, utilizar y fomentar el uso del mejor sistema operativo posible. Pero no sólo se prodiga la prepotencia entre y para los miembros de la comunidad, sino que lo derrochamos con los
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.
que no tienen nada que ver y que poco les interesa. Como ejemplo, el último demostrativo de este mes… “Es que de eso para Windows no hay”. Eso es alguna aplicación para la cual sólo hay implementación para Linux, a lo sumo para BSD. Esto me encuentro diciéndolo cada vez más a menudo últimamente, siendo, hace algunos años, justo al revés. Motivo de orgullo es descubrir que cosas tan esenciales para mi trabajo día a día, como Scribus, K3B o los humildes split y cat, sólo existen y funcionan bajo entornos Unix. El problema es el tonillo con el que me encuentro diciéndolo. Por mucho que me reprima siempre sale con un tonillo de autosuficiente satisfacción que pone a mi interlocutor en mi contra tachándome de odioso tecnocretino. Lo dicho: humildad, Paul, humildad.
www.linux-magazine.es
Paul C. Brown Director
Número 04
3
LINUX MAGAZINE
Contenido
NOTICIAS
10
Inseguridades ....................................................................................6 Linux .........................................................................................................8 PORTADA
El ABC del 802.11
El estándar IEEE 802.11 es el centro de la revolución inalámbrica. El alfabeto inalámbrico comienza con 802.11a y se extiende hasta 802.11n. Linux Magazine nos ayuda con la ortografía inalámbrica.
Especial Wireless .............................................................................9 ABC del 802.11
..................................................................................10
Los múltiples estándares para disposistivos inalámbricos pueden causar una gran confusión. Veamos qué es qué.
Radio USB
............................................................................................13
Analizamos los distintos dispositivos USB para conexión a una WLAN.
Secretos Wireless ............................................................................17 Proteger una red inalámbrica es difícil. Enseñamos como implementar un túnel VPN seguro.
Wireless Hacking ...........................................................................22 Nos vamos de paseo con un Zaurus para demostrar lo fácil que es acceder a redes inalámbricas desprotegidas.
DESARROLLO
La librería SDL (IV) ........................................................................27
13
Radio USB
Los chismes electrónicos son cada vez más pequeños y los adaptadores WLAN no son una excepción. En las tiendas ya están disponibles varios adaptadores WLAN en formato stick USB. Este artículo tratará sobre que características buscar en estos adaptadores y como conseguir que funcionen.
Aprendemos como programar detección de colisiones entre nuestro héroe y los otros elementos del juego.
Ruby Spider
.......................................................................................32
Desarrollamos una araña web en Ruby.
Perl: RSS ................................................................................................35 Descargamos toda la información que te interesa con esta herramienta Perl.
PHPNuke
............................................................................................. 39
Crear un módulo para PHPNuke es sencillo si se sabe como hacerlo.
Python/Jython ................................................................................43 La sencillez de Python con las librearías de Java... ¿Qué más se puede pedir?
KNOW HOW
Maquetación con Scribus (I)
...............................................48
Scribus es el primer .....programa de autoedición visual bajo Linux. Veremos como utilizarlo con un caso práctico
4
Número 04
www.linux-magazine.es
17
Secretos Wireless
Las redes inalámbricas son prácticas pero al mismo tiempo peligrosas. La encriptación WEP es improbable que pueda detener a un atacante. Pero la solución está disponible de forma adicional en las medidas de seguridad tales como un túnel OpenVPN cifrado.
Contenido
20
De paseo con mi Zaurus
Las PDAs actuales tienen ya la potencia de cálculo de los PC de hace cinco años y la versatilidad de los Sistemas Operativos actuales. Una PDA con Linux es como tener un pingüino gigante en tu bolsillo.
LINUX MAGAZINE
Panorama ............................................................................................53 Creamos fabulosas imágenes de 360 grados a partir de una serie de fotos digitales.
Yum ..........................................................................................................57 SYSADMIN
La Columna de Charly
...............................................................59 Los mejores trucos y consejos del SysAdmin.
Encontrando cosas con find
.................................................60
Con discos duros cada vez más grandes, conviene saber como encontrar cosas en ellas. Para eso tenemos find.
Kontact e IMAP
48
Scribus
En este primer artículo de una serie de tres, el ex-director artístico de un periódico, Jason Walsh, echa un vistazo a la autoedición en Linux. Jason creará un periódico usando Scribus junto con otras aplicaciones Linux y lo probará en una editorial real.
..............................................................................62
Pensamientos Competitivos ................................................64 LINUX USER
SuperKaramba ................................................................................67 SuperKaramba aporta temas y guiones a nuestro escritorio para que lo tengamos como los chorros de oro.
DeskTOPia: xvidcap ....................................................................69 Hacemos vídeos para tutoriales de nuestro escritorio.
Configuración: GFTP
...................................................................72
El cliente FTP, GFTP nos permite transferir ficheros de manera cómoda y eficiente.
Curso de Programación: XUL (IV) .......................................75 Educación: Idiomas y Alfabetos
53
Vistas de 360 grados
Podemos crear una imagen agradable alineando múltiples paisajes para conformar un panorama. Pero la alineación puede ser complicada, especialmente si las fotografías individuales no coinciden. Herramientas como Hugin, Enblend y Autopano-SIFT pueden ayudarnos a crear panorámicas perfectas sin marcas.
........................................80
Comandos: diff.................................................................................85 Tipografía con LaTeX (IV) .........................................................87 COMUNIDAD
Proyectos
............................................................................................93
Eventos .................................................................................................95 Contacto ..............................................................................................95 DVD .........................................................................................................96 Próximo Número ..........................................................................98
www.linux-magazine.es
Número 04
5
NOTICIAS
Inseguridades
Inseguridades ■ PHP PHP es un lenguaje de guiones embebido en HTML que habitualmente se utiliza en conjunción con el servidor web Apache. Existen fallos encontrados en el código de deserialización de PHP que podrían conllevar al revelado de información, subflujo de matriz de referencia a índice negativa o sin doble. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado el nombre CAN-2004-1019 a este problema. También se ha encontrado un fallo en la extensión exif de PHP que podría desembocar en un desbordamiento de pila. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN-2004-1065 a este problema. Asimismo, se descubrió un error de revelado de información en el proceso de análisis variables “GPC” en PHP (cadenas de consultas o cookies y datos de formularios POST). Si algún script en particular utilizara los valores de las variables GPC, se podrían revelar porciones del espacio de memoria del proceso httpd hijo al cliente. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2004-0958 a este problema. Se reveló un error en el análisis de formularios “datos de formulario/multiparte” utilizado por guiones PHP que permiten subir ficheros a la web. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN-2004-0959 a este problema. Se encontraron fallos en las funciones PHP shmop_write, pack y unpack. Estas funciones no suelen recibir información aportada por el usuario, por tanto requerirían un guión PHP malicioso para su explotación. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2004-1018 a este problema. Existen varios problemas relacionados con el uso de la llamada al sistema
6
Número 04
“select” de PHP, que podría desencadenarse si se utiliza en una configuración con Apache. El script del shell “phpsize”, incluido con PHP, puede utilizarse para construir módulos de extensiones de terceras partes. Se encontró un problema de construcción en el script “phpsize“en ciertas plataformas de 64 bits que impedía su correcta operación. El módulo de extensión “pcntl” se encuentra ahora habilitado en el intérprete de la línea de comandos de PHP (/ usr/bin/php). Este módulo permite controlar características tales como “fork” y ■ “kill” desde guiones PHP. -Referencia Gentoo: GLSA 200412-14 / PHP -Referencia Red Hat: RHSA:2004:687-05
■ Samba Samba aporta servicios de compartición de ficheros e impresión a clientes SMB/CIFS. Greg MacManus, de los laboratorios iDEFENSE, ha descubierto un error de desbordamiento de entero en versiones de Samba anteriores a 3.0.10. Un usuario autentificado remotamente podría explotar este error, lo que podría llevar a la ejecución de código arbitrario en el servidor Samba. El proyecto de Vulnerabilidades y Exposiciones Comunes (cve.mitre.org) ha asignado el nombre CAN-2004-1154 a este problema. Los usuarios de Samba deberán insta■ lar actualizaciones cuanto antes. -Referencia Gentoo: GLSA 200412-13 / Samba -Referencia Mandrake: MDKSA-2004:158 -Referencia Red Hat: RHSA:2004:670-10 -Referencia Suse: SUSE-SA:2004:045
■ ZIP El programa Zip es una utilidad de archivado que puede crear archivos compatibles con ZIP. Se ha descubierto un error de desbordamiento de búfer en zip cuando maneja nombres de archivos largos. Un atacante podría crear un nombre de accesos espe-
www.linux-magazine.es
cialmente configurado que podría provocar el cuelgue de zip o que ejecutara instrucciones arbitrarias. El proyecto de Vulnerabilidades y Exposiciones Comunes (http://cve.mitre.org) ha asignado el nombre CAN-2004-1010 a este ■ problema. -Referencia Debian: DSA-624-1 -Referencia Red Hat: RHSA:2004:634-08.
■ nfs-utils El paquete nfs-utils suministra un demonio para el servidor NFS del kernel y herramientas relacionadas, lo que aporta un nivel más alto de rendimiento que el servidor NFS tradicional de Linux utilizado por la mayoría de los usuarios. Este paquete también incluye el programa showmount. Este programa consulta al demonio de montaje en un host remoto para recoger información sobre el servidor NFS. SGI informa que el demonio statd no manejaba correctamente la señal SIGPIPE. Un par incorrectamente configurado o malicioso podría provocar el cuelgue de statd, lo que conllevaría un denegación de servicio. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN2004-1014 a este problema. Arjan van de Ven descubrió un desbordamiento de búfer en rquotad. En arquitecturas de 64 bits, una conversión inadecuada de enteros puede causar este desbordamiento. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado el nombre CAN■ 2004-0946 a este problema. -Referencia Gentoo: GLSA 200412-08 / nfs-utils -Referencia Red Hat: RHSA:2004:583-09
■ Kernel El kernel Linux se encarga de llevar a cabo las funciones básicas del sistema operativo. Este aviso incluye parches para varios problemas de seguridad: Petr Vandrovec descubrió un fallo en el código de emulación de 32 bits que afecta al kernel 2.4 de Linux en la arquitectura AMD64. Un atacante local podría utilizar este fallo para escalar privilegios. El proyecto de Vulnerabilidades y Exposiciones Comunes (http://
Inseguridades
cve.mitre.org) ha asignado el nombre CAN-2004-1144 a este problema. ISEC Security Research descubrió múltiples vulnerabilidades en la funcionalidad IGMP, que se retro-portó en los kernels Red Hat Enterprise Linux 3. Estos fallos podrían permitir a un usuario local provocar una denegación de servicio (cuelgue) o, potencialmente, servir para escalar privilegios en el sistema. En el caso de utilizarse aplicaciones multicast en el sistema, estos fallos también podrían permitir a un usuario remoto provocar un ataque de denegación de servicio. El proyecto de Vulnerabilidades y Exposiciones Comunes (http:// cve.mitre.org) ha asignado el nombre CAN-2004-1137 a este problema. ISEC Security Research y Georgi Guninski descubrieron independientemente un fallo en la función scm_send en la capa de mensajes auxiliares. Un usuario local podría crear un mensaje auxiliar cuidadosamente manipulado que provocaría una denegación de servicio (cuelgue del sistema). El proyecto de Vulnerabilidades y Exposiciones Comunes (http://cve.mitre.org) ha asignado el nombre CAN-2004-1016 a este problema. Se ha descubierto una fuga de información de punto flotante en el código de intercambio de contexto de la arquitectura ia64. Un usuario local podría utilizar este fallo para leer los valores de registro de otros procesos, estableciendo el bit MFH. El proyecto de Vulnerabilidades y Exposiciones Comunes (http:// cve.mitre.org) ha asignado el nombre CAN-2004-0565 a este problema. Kirill Korotaev encontró un fallo en el binario load_elf_binary que afecta los kernels anteriores a 2.4.26. Un usuario local podría utilizar este fallo para crear un binario cuidadosamente manipulado de tal manera que provocase una denegación de servicio (cuelgue del sistema). El proyecto de Vulnerabilidades y Exposiciones Comunes (http:// cve.mitre.org) ha asignado el nombre ■ CAN-2004-1234 a este problema. -Referencia Red Hat: RHSA 2004:689-06 -Referencia Suse: SUSE-SA:2004:044
■ Acrobat Acrobat Reader de Adobe es una aplicación de escritorio que permite la vi-
sualización, distribución e impresión de documentos en el formato de portable document format (PDF). iDEFENSE ha informado que Adobe Acrobat Reader 5.0 aporta un potencial desbordamiento de búfer cuando decodifica documentos codificados con uuencode. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado el nombre CAN-2004-0631 a este problema. Se aconseja a todos los usuarios de Acrobat Reader que se actualicen a las ■ nuevas versiones. -Referencia Red Hat: RHSA:2004:432-08
■ PNG Se han descubierto varias vulnerabilidades en la librería PNG, utilizada por aplicaciones que soportan el formato de imágenes PNG.
NOTICIAS
Es posible provocar un desbordamiento a través de características relacionadas con el comportamiento de la librería PNG en aplicaciones de procesamiento de aplicaciones (VU#388984, VU#3817368, CAN-2004-0597). Un atacante podría utilizar un tipo especial de imagen PNG para provocar el cuelgue de una aplicación debido a una desreferencia a puntero nulo en la función png_handle_iCPP() (y otras VU#236656, CAN-2004-0598). Se han descubierto algunos desbordamientos de enteros en las funciones png_handle_sPLT(), png_read_png() y otras. Estos errores pueden provocar cuelgues en aplicaciones ( VU#160448, VU#477512, VU#286464, CAN-2004■ 0599). -Referencia SuSE: SUSE-SA:2004:023 -Referencia Slackware: SSA:2004-222-01
Políticas de seguridad de la Distribuciones Mayoritarias Distribuidor
Fuente Seguridad
Debian
Info:http://www.debian.org/security/ Lista:http://www.debian.org/debian-security-announce/ Referencia:DSA-…1)
Gentoo
Mandrake
Red Hat
Slackware
Suse
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.
www.linux-magazine.es
Número 04
7
NOTICIAS
Noticias Linux
Noticias Linux ■ Scribus El programa de autoedición favorito de la redacción de Linux Magazine acaba de llegar a versión 1.2.1. Junto con importantes mejoras en la estabilidad y múltiples correcciones de bugs, la versión 1.2.1 de Scribus incluye dos importantes novedades. Una es técnica - ahora Scribus importa las características de textos (y otros documentos) de OpenOffice. Es decir, si un documento escrito en OpenOffice se guarda en formato sxw, la negrita, cursiva, subrayado, fuentes, colores y otras cualidades de las fuentes se importarán de manera transparente a Scribus. No sólo eso, sino que Scribus puede importar directamente imágenes creadas con la utilidad de dibujo de
Openoffice y, desde dentro de Scribus, se pueden editar cuadros, formas y textos sin ningún tipo de complicación. La segunda mejora es comercial: A partir de esta versión, Scribus ofrece soporte comercial para “editoriales, imprentas y otras instituciones interesadas con la implementación y el continuo soporte a sus necesidades”, según el sitio web de Scribus. Lo que significa que cualquier empresa que haya sido reticente a la adopción de Scribus por aquello de que ha sido creado por un grupo de jipis melenudos que no sabrían lo que significa soporte aunque les mordiese en el trasero, ya se lo pueden pensar de nuevo. Scribus ofrece su soporte a empresas para Norte América y Europa a través de Atlantic Tech Solutions y Bit Consulting, así como a través de su propio equipo de ■ desarrollo. http://www.scribus.org.uk/index.php
■ LinEspa 0.30 Se acaba de liberar la versión de LinEspa 0.30. LinEspa es una distribución de pequeño tamaño orientado al escritorio que viene en formato live CD, también instalable en el disco duro a partir de una opción del menú de configuración.
Julián Coccia, uno de los líderes del proyecto, nos cuenta que los principales objetivos de LinEspa es la facilidad de uso, la ligereza de recursos y la precisión y cuidado en las traducciones al castellano. Para lo primero, LinEspa cuenta con un sencillo instalador de cuatro sencillos pasos y obvia todo lo
8
Número 04
que no es estrictamente imprescindible para un uso de escritorio. Para lo segundo, LinEspa no habilita servicios innecesarios y utiliza como escritorio por defecto Xfce, un gestor de ventanas muy ligero y rápido, con el cual es posible conseguir un entorno de trabajo muy vistoso sin consumir muchos recursos, lo cual hace que esta distro sea perfecta para ser ejecutada en máquinas antiguas. LinEspa 0.30 cuenta con un kernel 2.6.8, Firefox como navegador por defecto y Thunderbird como cliente de correo. A pesar de la elección por defecto de Xfce, se pueden instalar las últimas versiones de KDE y Gnome utilizando apt, o el “front-end” gráfico, synaptic. A pesar de estar en una fase temprana de desarrollo, LinEspa es un esfuerzo con mérito, y sus desarrolladores se han fijado unos objetivos definidos y realistas que hacen de la distribución una alternativa atractiva para los recién llega■ dos a Linux. http://www.linespa.org
www.linux-magazine.es
■ LMI y LPI Linux Magazine International, la revista hermana en inglés de Linux Magazine Edición en Castellano acaba de ser nombrada Patrocinador de Platino del Linux Professional Institute, el principal programa de certificaciones para la comunidad Linux a nivel mundial. En una nota de prensa hecha pública el 25 de enero, Evan Leibovitch, presidente del Linux Professional Institute, declaró: “Este incremento en las responsabilidades de patrocinio de Linux Magazine aumenta el reconocimiento de la posición de LPI dentro de la comunidad Linux y del código abierto. Demuestra el valor de la asociación y el importante rol que todos tenemos que asumir para promocionar los estándares para avanzar en la causa del código abierto. Damos la bienvenida al paso tomado por Linux Magazine de patrocinio de oro a patrocinio de platino”. “Un incremento en el patrocinio de LPI era una evolución natural” declara Brian Osborn, director corporativo de ventas y marketing de Linux New Media. “Hemos apoyado a la dirección y dedicación de LPI hacia un certificación neutral de marcas para los profesionales de Linux y su persistente dedicación a la promoción de Linux y la comunidad del código abierto”. El señor Osborn también es miembro del consejo de LPI. El programa de certificaciones de LPI se concede a nivel mundial en siete idiomas y se han celebrado más de 70.000 exámenes para las certificaciones del Nivel Uno y Dos globalmente desde la creación del programa en ■ 1999. http://www.lpi.org/ http://www.linux-magazine.com/
Introducción
Redes Inalámbricas bajo Linux
Sin Cables C
asi todo sobre la industria informática asombraría a nuestros abuelos, pero una red sin cables les parecería especialmente futurista. La tarea de configurar una red inalámbrica en Linux se ha vuelto más fácil con el transcurso de los años. Muchas distribuciones incluyen instrumentos especiales para configurar redes inalámbricas. Pero la interconexión de estas redes siempre ha causado dolores de cabeza. Las necesidades especiales de una red inalámbrica requieren una atención especial por parte del usuario. Uno de los problemas con la configuración de una red inalámbrica es el enorme número de diferentes estándares, algunos de ellos obsoletos o incompatibles con sistemas actuales y otros más modernos que apenas han sido puestos en práctica. En nuestro tema de portada de este mes, examinaremos los estándares de la familia IEEE 802.11, desde la venerada 802.11b hasta las variantes más recientes tales como 802.11g y 802.11n. Mostraremos qué estándares proporcionan mayor funcionalidad y cuáles ofrecen mayor compatibilidad. Y describiremos como el nuevo estándar 802.11i soluciona algunas de las cuestiones de privacidad asociadas a los sistemas inalámbricos más recientes. La tecnología WLAN siempre está renovándose, con nuevos productos y nuevas tecnologías apareciendo casi a diario. Una innovación reciente que está llegando a
PORTADA
Cuando se usa una red inalámbrica hay que tener cuidado. Consiga el hardware apropiado y asegúrese de que su red es tan segura como piensa. POR JOE CASAD Y PAUL C. BROWN
ser increíblemente popular es el conector USB para una WLAN, un dispositivo compacto inalámbrico que se conecta directamente en el puerto USB del ordenador. En nuestro artículo “USB Radio: Probando Adaptadores WLAN USB”, examinamos algunos de los dispositivos USB para WLAN más populares. Indicaremos cómo instalarlos en Linux y mostraremos los pasos a seguir para configurar un adaptador USB para WLAN. Seguramente, uno de los grandes problemas a los que se enfrentan las redes inalámbricas es el tema de la seguridad. Las redes inalámbricas colocan todos los datos en el aire, donde cualquiera puede leerlos, a no ser que se protejan. Lamentablemente, el Protocolo de Equivalencia Inalámbrica (WEP), un estándar reciente de seguridad para redes inalámbricas, no es tan bueno con la protección, dando lugar a herramientas como AirSnort, que puede romper la clave de una red protegida con WEP. Si realmente se quiere seguridad real para su red inalámbrica, necesitará algo más potente. Una opción es una Red Privada Virtual
(VPN). Una VPN crea un túnel seguro para comunicación cifrada dentro de una red común. En el artículo “Secretos de las Redes Inalámbricas: Asegure la Interconexión de una WLAN con un Túnel Cifrado OpenVPN” mostraremos como usar la herramienta de Código Abierto OpenVPN para la seguridad y la comunicación cifrada en una red inalámbrica. A continuación, nos pasamos al bando contrario y demostramos como con un aparato que cabe en el bolsillo de una chaqueta, podemos empezar a descubrir redes inalámbricas poco o nada seguras: nos vamos de warwalking con un Sharp Zaurus. Si tiene una red inalámbrica o si está pensando en pasarse a una red “sin cables”, esperamos que el tema de portada de este mes: “Conexión sin Cables a una red” le dé muchas ideas de productos y tecnologías que le gustaría explorar. ■
EN PORTADA Estándares Inalámbricos .......10 Si adquiere productos inalámbricos, será mejor que aprenda el alfabeto 802.11.
Adaptadores USB para WLAN.....13 Un adaptador USB para WLAN es la forma más fácil de configurar el ordenador para redes inalámbricas.
OpenVPN .........................................17 OpenVPN crea una red privada virtual para una comunicación segura sin cables.
De Paseo con un Zaurus .........22 Descubrimos todas las redes inseguras del vecindario dando una vuelta con un Sharp Zaurus equipado con software a medida.
www.linux-magazine..es
Número 04
9
PORTADA
Estándares Wireless
Una guía de los estándares inalámbricos
El alfabeto 802.11
El estándar IEEE 802.11 es el centro de la revolución inalámbrica. El alfabeto inalámbrico comienza con 802.11a y se extiende hasta 802.11n. Linux Magazine nos ayuda con la ortografía inalámbrica. POR JÖRG LUTHER
L
as redes están de moda y los cables no. Pero no solo los propietarios de equipos portátiles con capacidades WLAN prefieren no usar cables. Muchos hogares necesitan conectar más de un ordenador a la red, y aparatos electrónicos como equipos de música o vídeos cada vez disponen de más conectividad LAN. La conectividad inalámbrica es preferible al menos que queramos tirar cables por toda nuestra casa. Esta tendencia se refleja en el tremendo incremento en ventas que han sufrido las ventas de equipos de red inalámbricos. El negocio está en auge para los fabricantes de chips y componentes WLAN. Solo en Europa se espera que el beneficio alcance la mágica cifra del billón de dólares en 2007. Esta tendencia también es buena para los consumidores, debido a que el incremento de cantidades significa una rápida caída en los precios de equipos WLAN.
10
Número 04
En lugar de un único y por tanto fiable estándar (IEEE 802.11b), hay una completa sopa de alfabetos distintos entre los que elegir. 802.11a, b, g y h compiten por ser los preferidos de los usuarios de tecnologías básicas y 802.11n que aparecerá pronto. 11c, d, e, f e i le añaden un poco de salsa al asunto. Los usuarios potenciales están normalmente confusos por la variedad de opciones: ¿11 ó 54 Mbps? ¿2.4 ó 5 GHz? ¿WEP, WPA o 802.11i? Este artículo nos ayuda a encontrar nuestro camino entre el alfabeto WLAN.
Repaso a la tecnología Las redes inalámbricas se reparten entre dos clases principales subdivididas por la banda de frecuencia. Las primeras tecnologías usaban la banda de 2.4 GHz mientras que las más modernas usan la de 5 GHz (más ancha). La primera incluye los estándares del Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) 802.11b (11
www.linux-magazine.es
Mbps) y es compatible con su sucesor (802.11g a 54 Mbps). Esta primera opción es la más común actualmente. Por otro lado, tanto 802.11a como 802.11h, que operan en la banda de 5 GHZ, consiguen un rendimiento nominal de 54 Mbps. 802.11h, referida en Estados Unidos como “de compatibilidad en Europa”, es la variante Europea del estándar Americano. Sus dos características más importantes son la selección dinámica y la potencia de transmisión variable, obligatorias para el mercado Europeo según el Instituto Europeo de Estándares de Comunicación (ETSI) con el fin de asegurar que los sistemas tengan una capacidad de transmisión razonable. IEEE 802.11c, especifica métodos para la conmutación inalámbrica, o lo que es lo mismo, métodos para conectar diferentes tipos de redes mediante redes inalámbricas. El 802.11d normalmente se le conoce como el “Método Mundial” y se
Estándares Wireless
PORTADA
refiere a las diferencias regionales en tecnologías como a cuantos y cuales son los canales disponibles para usarse en las distintas regiones del mundo. Como usuario sólo necesitamos especificar el país en el que queremos usar la tarjeta WLAN y el controlador se ocupa del resto. El protocolo IEEE 802.11e define la calidad del servicio y las extensiones para el flujo de medios para 802.11a/h y g. El objetivo es ajustar las redes de 54 Mbps para aplicaciones multimedia y de voz sobre IP, o lo que es lo mismo, telefonía a través de redes IP e Internet. La red debe soportar valores de transmisión de datos garantizados para servicios individuales o retrasos de propagación mínimos para que sean útiles con multimedia o voz. El protocolo 802.11f describe como se tratan los estándares de las comunicaciones de clientes de móviles fuera de zona entre puntos de acceso (“Roaming”) con IAPP, el Protocolo de Puntos de Acceso manejando de los detalles.
de negociación a finales del verano de 2004. El alcance y duración de la fase de estandarización de 802.11i indica lo alerta en materia de seguriFigura 1: Airsnort es capaz de romper encriptaciones WEP tras rebuscar dad que están los en el suficiente número de paquetes. fabricantes y organizaciones. Las razones diseñado para evitar los puntos débiles para esta cautela es el casi total fallo reemplazando las llaves estáticas con alrededor de la primera técnica de llaves modificadas dinámicamente e encriptación de WLANs conocidas como implementando comprobaciones de inteel estándar Equivalente de Privacidad gridad ampliamente incrementadas. Por Inalámbrica (WEP). WEP está basado en razones de compatibilidad descendente RC4 con llaves estáticas y un Vector de TKIP aún usa el débil flujo de codifiInicialización (IV) modificado para cada cación RC4. WPA2 es el término que paquete transmitido. WEP demostró faWi-Fi Alliance usa para referirse a la llos mayores en la implementación de IV implementación de todos que permitieron a los piratas los componentes obligatoobtener el suficiente número rios del estándar 802.11i. de paquetes de información necesarios para reconstruir Asuntos de las llaves. De hecho, hay compatibilidad herramientas de análisis que Figura 2: El logo certifise ocupan de esta tarea Suponiendo que no vamos cado por la alianza Wi-Fi Estándares de Seguridad automáticamente [2]. a montar una WLAN comen los paquetes de pro802.11i fue elegido para resolver los proAntes de la introducción pletamente nueva es muy ductos indican su blemas de seguridad que comprometieron de 802.11i, los fabricantes probable que tengamos conformidad con los en su momento las redes inalámbricas. de WLAN intentaron comque ofrecer compatibilidad estándares y compatibiliIntegra todo lo que el mundo de la seguripensar los fallos internos de con los dispositivos dad con productos de dad ofrece. Las características más WEP usando una solución 802.11b existentes. 802.11g otros fabricantes. importantes de 802.11i incluyen la autenticonocida como Acceso Prodispone de una serie de cación IEEE 802.1x con Protocolo de tegido Wi-Fi (WPA), desarrollado al aspectos al respecto: los dispositivos Autenticación Extendido (EAP), RADIUS, amparo de la Alianza Wi-Fi [3]. Las car11b y g usan la misma banda de freKerberos y encriptación basada en el algoacterísticas más importantes de WPA son cuencias, la misma técnica de ritmo de Rijndael AES. La complejidad de la Anulación de Llaves Débiles (“WEPmodulación y el mismo rango, por lo 802.11i hizo extremadamente complicada plus”), Habilitación de la Autentificación que las operaciones mezcladas no son su finalización. El estándar fue finalmente EAP y el Protocolo Temporal de Inteproblemáticas. No obstante la compatilanzado por la IEEE tras un difícil proceso gración de Llaves (TKIP). TKIP está bilidad afecta a las prestaciones: si un único elemento 11b se asocia a una red 11g el rendimiento del sistema inmeTabla 1: IEEE 802.11 de un Vistazo diatamente baja de 54 a 11 Mbps. Las operaciones mezcladas de elemenGrupo de Trabajo Enfoque tos 802.11b y g, pero incluso mezclas de 802.11a 54 Mbps WLAN en la banda 5 GHz elementos g antiguos con nuevos pueden 802.11b 11 Mbps WLAN en la banda 2.4 GHz 802.11c Cruce sin cables causar problemas. El estándar de seguri802.11d “Modo Mundial”. Adaptación a los requerimientos regionales. dad WLAN 802.11i no fue introducido 802.11e QoS y extensiones que fluyen a través de 802.11a/g/h hasta el verano de 2004. Las redes 802.11f Transito para 802.11a/g/h (Protocolo de Punto de Acceso Interno IAPP) inalámbricas más antiguas normalmente 802.11g 54 Mbps WLAN en la banda 2.4 GHz solo soportan el método WEP mucho 802.11h 802.11a con DFS y TPC,“11a Europa” más débil y necesitan medidas adi802.11i Autenticación y encriptado (AES,802.1x) cionales para incrementar la seguridad 802.11j 802.11a con canales adicionales por encima de 4.9 GHz,“11a Japón” de la red usando métodos VPN. Algunos 802.11k Intercambio de información de capacidad entre clientes y puntos de acceso fabricantes de dispositivos que soportan 802.11l no se usa debido al peligro de confusión tipográfica un subconjunto 802.11i WPA ofrecen 802.11m “Mantenimiento”,publicación de actualizaciones estándar actualizaciones de firmware a 802.11i/ 802.11n Nueva generación de WLAN de redes de al menos 100 Mbps WPA2.
www.linux-magazine.es
Número 04
11
PORTADA
Estándares Wireless
Figura 3: Algunos fabricantes ya han empezado a ofrecer sistemas “Pre-N” basados en el principio MIMO. El router Belkin que se muestra, ofrece un valor de transferencia superior a 300 Mbps en la banda 2.4 GHz.
Los denominados productos DualBand/Triple-Mode (Banda Doble/Modo Triple) nos pueden ayudar a evitar problemas de compatibilidad desde el principio. Estos sistemas soportan operaciones en los anchos de banda 2.4 y 5 GHz y las tres tecnologías básicas: 11a, 11b, y 11g. Desde el punto de vista de la tecnología de radio, no hay obstáculos de interpolarización con cualquier otro componente WLAN. Lo malo es que estos dispositivos son mucho más caros. La alianza Wi-Fi ha introducido la etiqueta “Certificado Wi-Fi” para garantizar interoperaciones sin problemas entre los sistemas LAN de distintos fabricantes. Se requiere a los productos que demuestren su conformidad con los estándares actuales pasando unas extensas pruebas para demostrar su interoperatibilidad con dispositivos de otros fabricantes antes de que se les de el sello de aprobación. La alianza Wi-Fi asigna el logo del certificado a sistemas 2.4 GHz con velocidades de 11 y 54 Mbps y a sistemas de 54 Mbps 5 GHz para WPA, WPA2 yWMM. WMM significa Wi-Fi Multimedia e indica conformidad con 802.11e. Chipsets específicos y tecnologías de transmisión no estandarizadas con tasas de datos más altas fallaron estrepitosamente en su apuesta de compatibilidad.
12
Número 04
Específicamente, son “802.11b+” con una velocidad de 22 Mbps, modos 108 Mbps para IEEE 802.11 (“Turbo Mode”) y 802.11g (“Super G”, “Extreme G”). La mayoría de los valores de transferencia prometidos por estos sistemas solo se obtienen utilizando equipo del mismo fabricante y la misma gama.
WLAN 2006: 802.11n La próxima generación de WLAN espera ofrecer valores de transmisión de datos más altos, con el comité IEEE 802.11 trabajando en un borrador del estándar con fabricantes de chips WLAN . Agere ya ha producido un chip para demostrar como funciona la tecnología. El prototipo usa métodos simples para acelerar la tecnología 802.11 existente hasta velocidades de 162 Mbps. El sistema usa tres antenas de transmisión/ recepción para incrementar el valor de transferencia usando Multiplexado Ortogonal de División de Frecuencia (OFDM), definido por 11a para proporcionar separaciones limpias entre los distintos portadores de la misma banda de frecuencias. Este truco, llamado MIMO (Entrada Múltiple / Salida Múltiple), permite que el rendimiento se incremente en función del número de antenas usadas según indica Agere. El nuevo estándar 802.11n, cuyo lanza-
www.linux-magazine.es
miento esta programado para 2006, debería conseguir valores de transferencia de al menos 100 Mbps usando la tecnología MIMO. Esto es lo único que podemos decir con seguridad respecto al sucesor de las actuales redes inalámbricas. Dos empresas está compitiendo en el área del protocolo del futuro, el estándar 802.11n. Los partidarios TGn Sync [4] (la abreviación significa Grupo de Tarea y Sincronización) incluye Agere y otros socios principales como Atheros, Intel, Sony o Philips. El grupo intenta usar canales de 40 MHz en la banda de 5 GHz, y, según Agere, esto les pondrá en una posición que les permitirá soportar un valor de transmisión de red de hasta 500 Mbps. La tendencia WWiSE (“Espectro de Eficacia Mundial”) [5] apoya un protocolos más conservador con canales de 20 MHz en la banda 2.4 GHz. Sus miembros más conocidos son Broadcom, Conexant, Texas Instruments, Airgo y STMicroelectronics la tendencia WwiSE promete compatibilidad de sistemas anteriores con b/g y ofrece un uso más conservador de los recursos de las frecuencias, si bien no soporta valores de transmisión extremadamente rápidos.
Conclusión El agotado y conocido estándar 802.11b aún no ha llegado al final de su vida útil a pesar de la competencia de sus sucesores de 54 Mbps. La versatilidad y los bajos precios hacen de 802.11b una tecnología ideal para principiantes. Si nuestros requerimientos de ancho de banda son moderados y podemos pasar sin soporte multimedia, 802.11b es aún una buena opción. 802.11g es el sucesor específico para el mercado de la pequeña oficina y tiene la ventaja de ser compatible hacia abajo. Como contraste, los WLANs 802.11a/h son las mejores para grandes redes con ■ grandes números de usuarios.
RECURSOS [1] Bluetooth: http://www.bluetooth.com/ [2] WEPCrack: http://wepcrack.sourceforge. net/,AirSnort:http://airsnort.shmoo.com/ [3] Alianza Wi-Fi: http://www.wi-fi.net/ [4] Propuesta TGn Sync: http://tgnsync.org/ [5] Alicanza WWiSE: http://www.wwise.org/
Adaptadores USB WLAN
PORTADA
Probando adaptadores WLAN USB
Radio USB Los chismes electrónicos son cada vez más pequeños y los adaptadores WLAN no son una excepción. En las tiendas ya están disponibles varios adaptadores WLAN en formato stick USB. Este artículo tratará sobre que características buscar en estos adaptadores y como conseguir que funcionen. POR MARCEL HILZINGER
Y
a ha llegado la primavera y más de uno quisiera poder trabajar sentadito en el jardín o la terraza de casa, disfrutando del sol mañanero y del portátil nuevo que llegó por navidad. Aunque los adaptadores Wireless LAN no sólo se han diseñado para el trabajo al aire libre; pueden ser muy útiles dentro de casa, en el trabajo, en el aeropuerto y en muchos otros sitios donde exista un punto de acceso publico. Un adaptador WLAN en formato stick USB no es más grande que un pendrive de memoria flash y se puede guardar perfectamente en un bolsillo o un bolso mientras no se necesite. Hay algunas detalles que se han de vigilar antes de comprar un adaptador WLAN en formato stick USB. De hecho, Linux no funciona con muchos de los nuevos modelos de 54 Mbits y algunos de los modelos más antiguos, pueden dar algún que otro dolor de cabeza.
Tirando a por lo Seguro Como el boom WLAN no cesa, los fabricantes y proveedores de adaptadores
WLAN en formato stick USB parecen que han aumentado de repente. Dicho esto, los únicos adaptadores que funcionan con Linux, nada más salir de la caja son los adaptadores USB de 11Mbits que usan el chipset Prism2. Los modelos Netgear MA111 y DLink DWL-122 de nuestra prueba (Véase la Tabla 1) son solo dos ejemplos. Se puede encontrar una lista de dispositivos más amplia, aunque no muy actualizada, en [1]. La versión 9.0 o posterior de Suse Linux ofrece un sencillo procedimiento para hacer funcionar estos dos adaptadores. Después de conectar el adaptador, simplemente hay que lanzar el modulo de configuración de la tarjeta de red de YaST, elegir Other (not detected) y pulsar sobre Configure... seleccionando Wireless en el menú desplegable Device type y entonces pulsar sobre el botón de la derecha Select from List. Ahora seleccionar la entrada en el botón de la lista Wireless device using kernel module
prism2_usb.o y pulsar en OK para confirmar (Véase la Figura 1). Después se pulsa en Wireless settings para configurar el ESSID y el modo de trabajo. Para usar un punto de acceso público (en el aeropuerto, por ejemplo) o el enrutador DSL WLAN de casa, se mantiene la opción predeterminada que es managed. Ahora hace falta introducir el ESSID y pulsar en OK. Esto cerrará la ventana actual y se volverá a la ventana Manual network card configuration. Si ocurriera la extraña casualidad de que el punto de acceso también realiza la función de servidor DHCP, solamente resta pulsar sobre Next y a continuación en Finish para comenzar a navegar. Si no se posee un servidor DHCP, habrá que configurar una dirección IP fija. Se recomienda verificar la documentación del punto de acceso o del encaminador WLAN para más información. Sobre
Tabla 1: Candidatos a las pruebas USB WLAN Nombre MA111 DWL-122 DWL-G122 WL-U356 WG111 C54RU SMC2862W-G
Fabricante Netgear D-Link D-Link Planet Netgear Conceptronic SMC Networks
Chip Prism2 Prism2 Ralink ZyDAS ZD1211 Prism Freesbe Intersil/Prism Prism Freesbe
Modulo prism2_usb prism2_usb rt2570 zd1211 ? ? prism54u
Velocidad 11 Mbits/s 11 Mbits/s 54 Mbits/s 54 Mbits/s 54 Mbits/s 54 Mbits/s 54 Mbits/s
Drivers de Linux √ √ √ √ √
Punto de acceso √ √ √ -
www.linux-magazine.es
Ad-Hoc √ √ -
Precio aprox. EUR30 EUR25 EUR55 EUR40 EUR55 EUR30 EUR50
Número 04
13
PORTADA
Adaptadores USB WLAN
DHCP se puede consultar el artículo Redes sin Estrés en el número 1 de Linux Magazine, página 16. Si solo se necesita conectar directamente dos máquinas,en vez de Managed hay que seleccionar el modo Ad-Hoc. En este caso también habrá que seleccionar el canal de comunicaciones. El proyecto Linux-wlan-ng por omisión utiliza el canal 6; así que ésta es una selección segura. En el cuadro de dialogo donde se introdujo el ESSID, se pulsa Expert settings para seleccionar el canal desde la lista. Después se pulsa OK y Next para ir a la ventana donde se configuró la direc-
ción IP. Se selecciona Static Adress settup y se introduce la dirección IP. Por ejemplo, puede se puede usar 192.168.1.1 en una máquina y 192.168.1.2 en la otra ¿a qué son IPs imaginativas? Una última pulsación en Next permitirá tener el adaptador listo para funcionar. Como alguna distribución espera que se configure el adaptador manualmente, en el Cuadro 1 se encuentra información sobre como hacerlo.
Deshaciendo entuertos Si al conectarlo, el adaptador falla, primero se debe teclear
Cuadro 1: Configurando el adaptador Prism2_usb Para configurar un adaptador USB WLAN con el chipset Prism2, se necesita linux-wlan-ng [2] y las wireless-tools [3]. Aunque la mayoría de las distribuciones usan dos paquetes para almacenar estas herramientas, en Suse Linux linux-wlan-ng es parte de wireless-tools y por tanto no es necesario que se instale aparte, si se usa esta distribución. Además Suse Linux utiliza un método diferente para a la configuración de adaptadores USB con Prism2, por tanto se recomienda a los usuarios de Suse Linux que sigan el método basado en YaST. Para compilar las wireless-tools, primero hay que desempaquetar el archivo tar.gz, después hay que entrar en el subdirectorio creado por esta operación y teclear make. Normalmente se utilizará la orden su para tener privilegios de root y se teclea make install para colocar las herramientas en /usr/local. Si se desea utilizar una ruta diferente (por ejemplo /usr) se necesitará editar el archivo makefile. La instalación de linux-wlan-ng sigue un patrón similar. En este caso make config lanza un dialogo de configuración donde se puede seleccionar los controladores de dispositivo que se necesiten. Para los sticks USB hay que decir que no a las tres primeras preguntas y teclear [y] seguido de [enter] a la pregunta Build Prism2.5 USB (_usb) driver? (y/n). Para el resto de preguntas se puede pulsar [enter]. Suponiendo que las fuentes del núcleo están instaladas y correctamente configuradas, make lanzará el proceso de compilación y make install, trabajando como root, instalará el programa. Tras completarse este proceso, hay que añadir la siguiente línea alias wlan0 prism2_usb al final de archivo /etcmodprobe.conf o de /etc/modules.conf (si se trata de un núcleo
14
Número 04
de la serie 2.4) y entonces se teclea modprobe prism2_usb para cargar el modulo del núcleo. Ahora iwconfig debería mostrar una entrada wlan0 para la tarjeta (Véase el Cuadro 2). Para habilitar el adaptador, aun se necesita editar dos archivos más bajo /etc/wlan/. Para permitir que 2 tarjetas WLAN funcionen en modo ad-hoc y se vean la una a la otra, se necesita una dirección IP para cada tarjeta y una sola ID de red o ESSID. Para configurar esto hay que rellenar la entrada SSID_wlan0 que se haya aproximadamente en la línea 80 del archivo /etc/wlan/wlan.conf como, por ejemplo: SSID_wlan0="wireless" El siguiente paso consiste en renombrar el archivo /etc/wlan/wlancfg-DEFAULT por la ESSID elegida (en el ejemplo sería wlangcfg-wireless) y cambiar la línea 31 de IS_ADHOC=n a IS_ADHOC=y para usar el modo ad-hoc. Ahora se puede lanzar el servicio WLAN tecleando /etc/init.d/wlan start. Si todo va bien, debe ser posible asignar una dirección IP al adaptador usando ifconfig wlan0 192.168.1.1 netmask 255.255.255.0 y después hacer ping hacia la otra máquina: ping 192.168.1.2 Para poder usar un punto de acceso hay que elegir el modo managed en vez del Ad-hoc. En otras palabras hay que volver a dejar la entrada como estaba IS_ADHOC=n. Como en modo managed es el punto de acceso quien asigna el canal, hace falta habilitar el muestreo de canales. Para hacer esto hay que establecer la variable WLAN_SCAN de /etc/wlan/wlan.conf así: WLAN_SCAN=y y si se conoce los canales que utiliza el punto de acceso se pueden eliminar los canales innecesarios de ChannelList para aumentar la velocidad del muestreo.
www.linux-magazine.es
iwconfig
para comprobar que el sistema ha detectado el adaptador WLAN. En el Cuadro 2 se muestra el tipo de salida que se espera. Si la orden no muestra un dispositivo wireless, hay que teclear /sbin/lsmod/ | grep prism
para comprobar si el modulo prism2_usb está cargado. Si no es así se puede intentar con modprobe prism2_usb
para cargar el modulo manualmente. También pueden ser útiles Los mensajes del núcleo cuando se conecta el stick USB. Para leer estos mensajes, trabajando como root, se teclea tail -f /var/log/messages
en una ventana de terminal, esto permitirá visualizar los mensajes en dicha ventana mientras se conecta o se desconecta el stick. En los sistemas en los que la conexión en caliente (hotplug) está soportada (tales como Fedora, Mandrake y Suse) el módulo se cargará automáticamente cuando se conecte el stick WLAN. También se debe verificar el cortafuegos, ya que, por ejemplo, SuseLinux 9.2 o posterior lo lanza automáticamente cuando se habilita un dispositivo de red. Es necesario ajustar la configuración del cortafuegos de acuerdo al nuevo dispositivo o deshabilitarlo temporalmente para estar seguros de que no es la causa del problema.
Por el filo de la navaja En el momento en que se hicieron las pruebas de laboratorio para este artículo el único dispositivo USB de 54 Mbits que funcionaba en Linux era el D-Link DWLG122, a pesar de que el controlador de dispositivo no se había publicado por aquel entonces. En Linux Magazine Lab se utilizó una versión beta, junto a un núcleo 2.6.7, ya que, desafortunadamente, D-Link no ha intentado siquiera publicar un controlador de dispositivo compatible con la serie 2.4 del núcleo. Es probable que en el momento en que este artículo esté en los quioscos haya
Adaptadores USB WLAN
posee un servidor DHCP. Según D-Link el controlador de dispositivo oficial para el núcleo 2.6 estará disponible para descargas en el servidor de FTP en breve. Esperamos que el problema con el modo ad-hoc se haya resuelto para entonces.
Experimentos
Figura 1: Configuración de un adaptador USB WLAN con chipset Prism2 en Suse Linux 9.1.
más dispositivos USB de 54 Mbits que estén funcionando en Linux y existan versiones más elaboradas y estables de los controladores de dispositivo para 54 Mbits. De no ser así lo primero que se ha de hacer es compilar el controlador tecleando: make -C /ruta/a/las/U fuentes/del/kernelU SUBDIRS=$PWD modules
después (trabajando como root) se teclea insmod rt2570.ko
para cargar el modulo. Por ultimo se habilita el dispositivo WLAN tecleando: ifconfig rausb0 up
Se puede asignar una dirección IP estática o usar un cliente DHCP, si se
Los desarrolladores y hackers del núcleo quizás quieran comprobar el adaptador WL-U356 de Planet y el SMC2862W-G de SMC Networks. Hay un controlador de dispositivo para Linux en la página web de Planet para su adaptador y el controlador de dispositivo se puede compilar sobre núcleos de las series 2.4 y 2.6. Después de haber compilado el controlador, mediante make, otra vez como root, hay que cargar manualmente zd1211 y habilitar la interfaz ifconfig eth1 up
Despues de esto, iwconfig debe listar el dispositivo. En los laboratorio de Linux Magazine solo se llegó a obtener esto; cualquier intento de conseguir que el stick hablará con el punto de acceso u otras máquinas fue condenado al error. El problema es que iwconfig no permitió que se configurará cualquier otro parámetro, incluyendo el ESSID. Linux Magazine ha contactado con el desarrollador del controlador de dispositivo, aunque en el momento de escribir esto, no ha habido resultados. El controlador de dispositivo de SMC es otra tarea pendiente que puede
Cuadro 2a: ejemplos de iwconfig sin cifrado en modo ad-hoc 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
suse92:/home/marcel # iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11-DS ESSID:"wireless" Nickname:"suse92" Mode:Ad-Hoc Frequency:2.442 GHz Cell: 02:0F:DA:B5:C1:3E Bit Rate:2 Mb/s Tx-Power:2346 dBm Retry min limit:8 RTS thr:off Fragment thr:off Encryption key:off Link Quality=0/92 Signal level=-100 dBm Noise level=-100 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 sit0 no wireless extensions.
PORTADA
retomar algún valiente. El controlador de dispositivo para Prism Frisbee basado en el dispositivo WLAN está bajo desarrollo y disponible junto con el firmware en [5]. Después de desempaquetar las fuentes hay que seguir los mismos pasos que para el adaptador DWL-G122 que son, como root make -C /ruta/a/las/U fuentes/del/kernel U SUBDIRS=$PWD modules
Después se carga el modulo tecleando insmod prism54u.ko
Ocurre lo mismo que con el stick de Planet. El adaptador será detectado cuando se carga el modulo, pero, si ocurre lo mismo que paso en nuestro laboratorio, no se puede hablar con el.
Cerrando brechas Puede tener sentido configurar un conexión WLAN sin cifrado para hacer pruebas, pero en un entorno de producción es obligatorio una clave WEP para configurar una conexión cifrada. Para el adaptador Prism 2 USB se necesita editar el archivo /etc/wlan/wlancfg-ESSID. Hay que usar la variable AuthType para especificar si linux-wlang-ng usará una clave compartida. Sin embargo, al ser este modo más propenso a los ataques, quizás se prefiera optar por el modo Open. La versión 0.2.1-pre22 de las herramientas causaron algunos desarreglos en nuestras pruebas. A pesar de la modificación de la variable, iwconfig insistía en mostrar como modo Security mode:restricted. Sin embargo las pruebas con claves compartidas y en modo abierto demostraron que el stick USB sencillamente ignoraba la variable. Ahora se cambia la sección #==wep== como se muestra en el Cuadro 3. Las dos primeras variables permiten especificar si el cliente usara cifrado basado en hardware (false) o basado en el controlador de dispositivo linux-wlan-ng. Supuestamente el cifrado por software es más rápido, así que se deja esta variable en true. La entrada dot11PrivacyInvoked=true habilita el cifrado. En la siguiente línea se especifica la clave de cifrado. El programa almace-
www.linux-magazine.es
Número 04
15
PORTADA
Adaptadores USB WLAN
Cuadro 2b: ejemplos de iwconfig con cifrado en modo managed 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
client:/home/otto # iwconfig lo no wireless extensions. eth0 no wireless extensions. wlan0 IEEE 802.11-b ESSID:"wireless" Nickname:"wireless" Mode:Managed Frequency:2.462 GHz Access Point: :09:5B:2D:B8:98 Bit Rate:11 Mb/s Tx-Power:2346 dBm Retry min limit:8 RTS thr:off Fragment thr:off Encryption key:3BFA-1658-F26F-65BB-1015-0222-49 Security mode:open Link Quality=92/92 Signal level=-40 dBm Noise level=-95 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 sit0 no wireless extensions.
nará hasta 4 descripciones de claves para asociarlas a otras tantas redes inalámbricas. Para evitar que el host acepte datos sin cifrar, establezca la variable dot11ExcludeUnencrypted a true, aunque esto solo funcionará en el modo de clave compartida. La segunda sección indica el mecanismo que usará linux-wlan-ng para cifrar la clave. Con make install se instalará predeterminadamente la herramienta nwepgen. En el subdirectorio add-ons,
debajo del directorio del código fuente de linux-wlan-ng, también están las herramientas lwepgen y keygen que pueden compilarse y luego copiar a /sbin/ o a /usr/local/sbin. Ambas herramientas pueden generar claves WEP, sin embargo, no son compatibles con todos los dispositivos. Si se desea utilizar una de estas herramientas, será necesario introducir una contraseña debajo de PRIV_GENSTR; la contraseña se usa como semilla para
Cuadro 3: Configuración de cifrado WEP 01 #=======WEP=========================================== 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
16
# [Dis/En]able WEP. Settings only matter if PrivacyInvoked is true lnxreq_hostWEPEncrypt=true # true|false lnxreq_hostWEPDecrypt=true # true|false dot11PrivacyInvoked=true # true|false dot11WEPDefaultKeyID=0 # 0|1|2|3 dot11ExcludeUnencrypted=true # true|false, in AP this means WEP is required. # If PRIV_GENSTR is not empty, use PRIV_GENTSTR to generate # keys (just a convenience) # add-ons/ in the tarball contains other key generators. PRIV_GENERATOR=/sbin/nwepgen # nwepgen, Nessus compatible PRIV_KEY128=true # keylength to generate PRIV_GENSTR="" # or set them explicitly. Set genstr or keys, not both. dot11WEPDefaultKey0=3B:FA:16:58:F2:6F:65:BB:10:15:02:22:49 dot11WEPDefaultKey1= # xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx dot11WEPDefaultKey2= # e.g. 01:20:03:40:05 or dot11WEPDefaultKey3= # 01:02:03:04:05:06:07:08:09:0a:0b:0c:0d
Número 04
www.linux-magazine.es
generar la clave. De todos modos, lo usual es crear una contraseña en el punto de acceso y simplemente introducir la clave debajo de dot11WEPDefaultKey0. Hay que notar que se necesita entrar la clave como se muestra en el ejemplo, no en grupos de cuatro dígitos separados con signos menos o dos puntos. La entrada PRIV_KEY128 permite optar entre 128 bits , más seguro, o la antigua variante de 64 bits. Como algunos dispositivos antiguos no dan soporte a las claves de 128 bits, la opción de 64 bits es la predeterminada, sin embargo, todos los adaptadores WLAN de nuestra pruebas funcionaron con cifrado de 128 bits. Una vez más, Suse Linux descarga al usuario de algunas de estas tareas de configuración. Simplemente se necesita introducir el tipo de clave (Passphrase, ASCII, o Hexadecimal) y teclear la clave cifrada en la caja de texto debajo de los botones radiales. Las herramientas mencionadas anteriormente serán de ayuda si se desea usar una clave hexadecimal; se debe tener en cuenta que en Suse Linux, estas herramientas son parte del paquete wireless-tools
Logout Aunque los fabricantes ofertan un amplio rango de sticks WLAN de 54 Mbits, los usuarios de Linux necesitarán aguardar un tiempo y seguir trabajando con dispositivos de 11 Mbits basados en el chipset Prism2. Esta tipo de rendimiento es adecuado para navegar por Internet. No se debe perder la esperanza; el D-Link DWLG-122 es un adaptador USB de 54 Mbits que funciona en Linux y el controlador de dispositivo ■ está bastante avanzado.
INFO [1] Adaptadores WLAN: http://www. linux-wlan.org/docs/wlan_adapters.html. gz [2] Proyecto Linux-wlan-ng: http://www. linux-wlan.org/ [3] Wireless-tools: http://www.hpl.hp.com/ personal/Jean_Tourrilhes/Linux/Tools. html [4] Controlador de dispositivo de Planet: http://www.planet.com.tw/download. php [5] Controlador de dispositivo Prism54 USB: http://jbnote.free.fr/prism54usb/
Red Privada Virtual
PORTADA
Redes WLAN seguras con un túnel OpenVPN encriptado
Secretitos en Reunión… Las redes inalámbricas son prácticas pero al mismo tiempo peligrosas. La encriptación WEP es improbable que pueda detener a un atacante. La solución viene de la mano de medidas de seguridad adicionales, tales como un túnel OpenVPN encriptado. POR ACHIM LEITNER
L
a tecnología WLAN es insegura. La mayoría de la gente no está al tanto de momento. La tecnología de encriptación integrada es fácil de romper o incluso deshabilitar en el peor de los casos posibles. Mientras que un cracker malintencionado tendría que acceder físicamente a su apartamento para robar datos de una red cableada, ahora con una red inalámbrica cualquier extraño podría ir por la calle armado con un portátil y un adaptador WLAN para acceder fácilmente a su red inalámbrica (de hecho, en este mismo número vemos como se hace utilizando un simple Zaurus). Antenas especiales y amplificadores de señal aumentan de forma considerable el rango de acción de la red en varios cientos de metros. A pesar del riesgo, las redes inalámbricas están ya aquí y se van a quedar. La posibilidad de navegar por Internet con un portátil desde la terraza o desde el jardín, o copiar los ficheros del PC de sobremesa al portátil, mejoran la experiencia del usuario. Y esto es algo bueno, suponiendo que se tomen algunas medidas básicas de seguridad para eliminar el riesgo.
detenidamente como el ordenador se conecta a la red y la clase de tráfico de red que va soportar el adaptador inalámbrico. La protección integrada en la WLAN podría ser suficiente para algunos usuarios y otros incluso deshabilitarán deliberadamente cualquier clase de seguridad. Pero si se necesita más, las soluciones VPN como OpenVPN [1] son
una buena elección: simples de usar, pero seguras y modernas. OpenVPN encripta y autentifica los intercambios entre dos máquinas, ya sean Linux o Windows. Fuera de la red particular, Internet está llena de los mismos peligros que las WLAN. Los atacantes pueden acceder o manipular los datos o incluso introducir contenidos dañinos. Hay que
Cuadro 1: Un ordenador Aislado El escenario más simple de todos es aquel formado por un sólo ordenador que usa un punto de acceso para conectarse a Internet (Véase la Figura 1). Además de los riesgos que afectan a las redes cableadas, tenemos que considerar el secuestro de la conexión, la denegación de servicios, el acceso no autorizado desde portátiles desde la calle o de nuestros vecinos. Aquellos que estén paranoicos con ser atacados por crackers, verán que las redes inalámbricas es un sector potencialmente fácil de atacar. Pero un ataque aleatorio puede venir tanto desde la
Web como desde unos metros a la redonda entre el portátil y el punto de acceso inalámbrico. También es conveniete estar bastante paranoico por cualquier tipo de dato. La única forma de cerciorarse de que los datos no han sido manipulados es usar criptografía e impedir los accesos no autorizados. En otras palabras, usar SSL/TSL para obtener el contenido de la Web y habilitar la protección SSL en el cliente de correo. SSL encripta y autentifica los datos en la transmisión.
Póntelo, Pónselo Antes de decidir que clase de protección es mejor para un entorno, hay que mirar
Figura 1: Conexión a Internet con un router WLAN.
www.linux-magazine.es
Para añadir una capa más de protección hay que usar PGP o S/MIME. Ambos encriptan los mensajes de correo, en vez de proteger el tráfico. Y usar SSH para las conexiones remotas seguras.
Número 04
17
PORTADA
Red Privada Virtual
distinguir entre dos casos: PCs aislados o portátiles que usen la red inalámbrica y un router WLAN para el acceso (Véase el Cuadro 1) y redes particulares protegidas donde una WLAN se ha instalado para ampliar su uso, o incluso reemplazar parte de la red cableada (Véase el Cuadro 2).
Gorrones y Alborotadores Las redes WLAN presentan un nuevo tipo de riesgo: toda clase de desconocidos pueden aprovecharse del punto de acceso de la WLAN para obtener acceso gratuito a Internet. La extensión del daño que esto puede causar depende de la clase de tarifa de Internet que se tenga contratada. Si se tiene tarifa plana, puede ser que no le importe que su vecino se le cuele por la WLAN y compartan la Web. Pero si se tiene una tarifa basada en el tráfico de datos, el compartir el acceso puede afectar de forma negativa su cartera. La forma de evitar que esto suceda es habilitando el filtrado basado en MAC del router WLAN y, adicionalmente, el uso de la encriptación WEP. Ninguna de estas medidas proporciona una protección perfecta, pero al menos levanta una barrera extra contra los crackers y se asegura de que nadie pueda acceder de forma accidental a la WLAN o negar que se está compartiendo el acceso de forma deliberada. Hay que cerciorarse de que la encriptación WEP y el filtrado MAC estén activados en todo momento; el no tenerlos es una
Figura 2: La Red Privada Virtual (VPN) funciona a través de un túnel, en los extremos es donde están las direcciones IPs reales del portátil y del PC.
invitación para los crackers, gorrones y espías. Más protección implica mayor trabajo, pero al menos WEP ya tiene sucesor designado. En el pasado mes de junio del 2004, IEEE presentó un estándar más seguro llamado 802.11i, también conocido como WPA-2. Desafortunadamente, esta tecnología está limitada a los nuevos adaptadores y es difícil hacer las cosas bien. El nuevo estándar especifica un número de técnicas, pero no todas ellas son seguras. Se recomendan AES-CCMP para la encriptación y 802.1x para autentificación y gestión de claves.
Protección VPN Linux soporta un sistema de seguridad para WLAN con operaciones anti-intrusos sin la necesidad de una tarjeta nueva. Si su tarjeta no le proporciona la clase de protección que necesita, la solución está en añadir software de
Cuadro 2: Redes Particulares Una red para una pequeña empresa o para una casa con un grupo de ordenadores conectados es algo más complicado de proteger que un simple PC aislado, comentado en el Cuadro 1. Las redes de esta clase usan un cortafuego para proteger la conexión de Internet y los usuarios se sienten seguros detrás de él. Los cortafuegos a menudo impiden cualquier clase de conexión desde Internet. Pero este tipo de ambiente puede provocar que los usuarios se descuiden. Los daños potenciales incluyen los servicios de NFS o Samba que permiten acceso compartido anónimo de los directorios privados, los servicios de impresión que envían datos sin encriptar y las conexiones basadas en Telnet y Rlogin. Se supone que cada ordenador confía en la red y en los equipos conectados
18
Número 04
en ella. La confianza es peligrosa en las LAN tradicionales, así que mucho más en las redes WLAN. El atacante está detrás del cortafuegos y puede lanzar ataques desde dentro. En una red cableada tradicional, un espía o saboteador tendría que tener acceso físico a las instalaciones para poder lanzar el ataque. Con las WLAN, el atacante tan sólo tiene que estar en las proximidades. Ya no hacen falta ni los cables ni puntos de acceso. La única manera de protegerse en las redes inalámbricas contra los atacantes es usando la criptografía. El primer intento por estandarizar la criptografía para las redes LAN inalámbricas ha fallado miserablemente: WEP es fácil de romper y no ha sido un buen trabajo. Sin embargo, VPN permite añadir una capa más de protección.
www.linux-magazine.es
seguridad. El protocolo VPN (Virtual Private Network) encripta y autentifica datos en la capa IP. Un terminal VPN acepta sus datos, los encripta, los firma y los transmite por el enlace de radio. El receptor desempaqueta los paquetes entrantes. Una VPN usará los recursos de una WLAN tradicional pero parecerá como una red nueva (una red virtual) desde el punto de vista del cliente. La Figura 2 explica el principio: El portátil y el PC de sobremesa tienen una conexión WLAN. Ambos son accesibles a través de sus direcciones IP reales sobre la red inalámbrica. La VPN le da al portátil y al PC de sobremesa direcciones IP adicionales. Los datos enviados a las direcciones virtuales se encapsulan por la VPN y se envian a la IP real de destino. El destino desempaqueta los datos y los trata como si hubiesen llegado por la dirección virtual, así se crea un túnel entre el portátil y el PC de sobremesa. Las reglas del cortafuegos se aseguran de que ambas máquinas sólo aceptan datos provenientes del túnel. Esto significa que los paquetes insertados directamente dentro de la WLAN por algún cracker malintencionado serán inofensivos.
OpenVPN El principio en el que se basa VPN es usado por diversos protocolos, productos y proyectos. OpenVPN [1] es una método probado y verificado, siendo estable y simple, funciona sin manipular ni el kernel ni la pila IP. Como este programa se basa en el popular protocolo criptográfico TLS y la implementación es clara, OpenVPN se
Red Privada Virtual
ha ganado la reputación de ser extremadamente seguro. A ambos lados del túnel, OpenVPN recoge los paquetes destinados al otro lado, y usando una clave local encripta los paquetes antes de enviarlos. En el punto de recepción tan solo se aceptarán datos que hayan sido encriptados usando la clave válida. Cualquier otro paquete se ignorará. Con esta solución los datos se transportan en contenedores seguros a través de ambientes hostiles. El siguiente ejemplo supone que wlan0 es la conexión de red inalámbrica. El PC de sobremesa tiene además una NIC cableada, eth0. Las otras máquinas de la red y de Internet son accesibles vía conexión Ethernet (Véase la Figura 2).
Empezando Si aún no lo ha hecho, instale el paquete OpenVPN antes de continuar (Véase el Cuadro 3). OpenVPN no modifica el kernel. En vez de ello, para ser capaz de reenviar los paquetes, usa el driver TUN/TAP [4]. La mayoría de las distribuciones instalan el módulo del kernel por defecto, así que lo único que hay que hacer es cargar el módulo. Como root, tecléese lo siguiente para hacerlo: modprobe tun
Linux normalmente no usa ficheros de dispositivo para los interfaces de red; es decir, no hay /dev/eth0. Esto podría parecer inconsistente, pero es innecesario ya que la interfaz socket maneja la comunicación. El interfaz TUN se aprovecha de esto y rompe las reglas creando un fichero de dispositivo, que permite a un servicio de usuario tomar
los paquetes IP, reempaquetarlos y reenviarlos. El servicio escribe el paquete en /dev/tun0 o en /dev/tun (Véase el Cuadro 3), y llegan al kernel por el interfaz tun0. Cada paquete que el kernel envía a tun0 llega al servicio por /dev/tun0 o en /dev/tun (Véase la Figura 2). El interfaz funciona como cualquier otro interfaz de red; se le puede asignar una dirección IP, usarse para encaminamiento y aplicársele las reglas del cortafuegos. La única diferencia está en que no usa la tarjeta Ethernet para poner los datos en el cable, sino que usa el dispositivo para enviarle los datos a un proceso.
Claves OpenVPN necesita las claves para proporcionar la seguridad. En el caso más simple, ambos usuarios confiarían en una clave secreta compartida. El siguiente comando crea una clave y la almacena en un fichero llamado secret.key: openvpn --genkeyU --secret secret.key
Sólo las dos máquinas deberían conocer las claves y sólo el root debería tener acceso de lectura a ellas. Si alguien conoce la clave, podría irrumpir fácilmente en el túnel. Es muy importante asegurarse de que las claves no sean pirateadas por el cable cuando se copien entre las dos máquinas. Alguien podría estar escuchando en la línea. Lo mejor sería usar un disquete; ¡sin olvidarse de formatear el disquete una vez que se haya terminado la copia! Si se tiene OpenSSH, PGP, GnuPG o una he-
PORTADA
rramienta similar, se podría usar alguno de estos programas para transferir el fichero de forma segura.
Cavando el Túnel Lo siguiente que hay que hacer es crear el túnel. Para ello, OpenVPN necesita la dirección IP (estática) de la máquina destino, el nombre del dispositivo del túnel (por defecto tun0), las dos direcciones virtuales de VPN y el fichero de la clave. En el portátil, el comando a introducir sería como: openvpn --dev tun0 --remoteU [Real_DesktopIP] --ifconfigU [Virtual_LaptopIP]U [Virtual_DesktopIP]U --secret secret.key
Hay que ser root para ejecutar este comando y todos los siguientes. En el PC de sobremesa, el comando con la IP modificada sería: openvpn --dev tun0 --remoteU [Real_LaptopIP] --ifconfigU [Virtual_DesktopIP]U [Virtual_LaptopIP]U --secret secret.key
Las direcciones virtuales del túnel son más o menos arbitrarias; pero tienen que ser direcciones privadas. Las direcciones virtuales deberían ser de un bloque diferente de las reales para facilitar el enrutamiento y hacerlas fácilmente distinguibles de las direcciones reales de la red.
Asignación de Direcciones Supongamos que la tarjeta WLAN en el portátil tiene la dirección IP real
Glosario S/MIME: Secure/Multipurpose Internet Mail Extensions es otra forma de encriptar y firmar digitalmente los mensajes de correo, una alternativa a PGP.
es un método probado en el que se puede confiar para las transmisiones encriptadas. Transport Layer Security es un desarrollo sobre SSL.
PGP: Pretty Good Privacy se usa para encriptar y firmar los mensajes de correo. OpenPGP es una implementación estándar y GnuPG es una alternativa más actual.
WEP: Wired Equivalent Privacy fue el primer intento de los desarrolladores de WLAN de estandarizar un protocolo cripto-seguro para darle al tráfico inalámbrico la misma clase de protección que el tráfico cableado. Pronto se comprobó que el protocolo tenía fallos y era además inseguro.
VPN: Virtual Private Network. Usa una red existente para emular una red diferente dentro de un entorno de red. El software VPN encripta el tráfico de datos antes de enviarlos.
Private address: Las direcciones IPs públicas son únicas. Esta es la única forma de asegurarse de que los paquetes puedan encontrar el camino al destino. Las direcciones IP privadas sólo son válidas en una red local y no son enrutadas dentro de la Internet pública. Esto permite que varias redes puedan usar las mismas direcciones privadas.
SSL/TLS: Secure Sockets Layer es un protocolo criptográfico desarrollado por Netscape. SSL
SSH: El Secure Shell permite a los usuarios de Linux conectarse de forma segura desde un ordenador remoto. Las sesiones completas, incluido el intercambio de claves, se encripta con SSH.
www.linux-magazine.es
Número 04
19
PORTADA
Red Privada Virtual
172.16.0.1 y el PC de sobremesa 172.16.0.2. La VPN necesita direcciones de un espacio privado de direcciones, tales como 10.0.0.1 para la dirección virtual del portátil y 10.0.0.2 para el PC de sobremesa. En este caso, el comando en el portátil sería: openvpn --dev tun0 --remoteU 172.16.0.2 --ifconfig 10.0.0.1U 10.0.0.2 --secret secret.key
y en el PC de sobremesa: openvpn --dev tun0 --remoteU 172.16.0.1 --ifconfig 10.0.0.2U 10.0.0.1 --secret secret.key
Se puede usar el comando ping para comprobar que el túnel está funcionando. En el portátil, ping 10.0.0.2 debería funcionar e indicar que la dirección virtual del PC de sobremesa es alcanzable. Si todo funciona tal y como se ha planeado, se querrá ejecutar el servidor de OpenVPN en segundo plano; el servidor enviará mensajes de salida a syslog. Para conseguirlo se usa la opción --daemon. Nótese que se necesita indicar la ruta absoluta al fichero con la clave secreta.
El Camino Seguro El túnel ya está listo y los paquetes llegan al otro lado. Pero tanto el portátil como el PC de sobremesa necesitan conocer qué paquetes tienen que enviar por el túnel. En otras palabras, necesitan saber la dirección IP virtual del otro lado del túnel. El comando de OpenVPN establece la ruta para reflejar esta dirección. Todas las otras direcciones serán enrutadas como se hacía anteriormente, sin el túnel. La ruta desde el PC de sobremesa al portátil funcionará bien, si se usa la nueva dirección IP virtual para comunicarse con el portátil. De hecho, las antiguas direcciones reales asignadas a las tarjetas WLAN en el portátil y en el PC de sobremesa sólo sirven para un propósito: son los extremos del túnel. No se usarán con las conexiones normales salvo para esta tarea. El camino de regreso desde el portátil hasta el PC de sobremesa (y desde allí hasta los demás PC de la red cableada e
20
Número 04
Internet) necesita editarse de forma manual. La ruta por defecto tiene que ser reconfigurada. El siguiente comando le indica la portátil que envíe todos los paquetes por el túnel: route del default route add default gwU 10.0.0.2
Los paquetes que se direccionan a la dirección IP real de la WLAN del PC de sobremesa (172.16.0.2) no se ven afectados por esta configuración. Y está bien porque el túnel usa esta dirección. Ahora, el PC de sobremesa necesita saber que debe reenviar los paquetes que ha desempaquetado si fuera necesario. El siguiente comando se encarga de ello: echo "1" > /proc/sys/U net/ipv4/ip_forward
Combatiendo el Fuego Casi hemos terminado a ambos lados del túnel. El portátil y el PC de sobremesa ya usan felizmente el túnel, los datos están protegidos y nadie puede hacerse con ellos. Pero aún es posible infiltrar paquetes dañinos y permitir a un atacante compartir la conexión a Internet.
Incluso si se está pagando una tarifa plana para acceder a Internet, no se querrá compartir el ancho de banda. Todos los servicios de red que el PC de sobremesa y el portátil comparten (Web, SSH, FTP,…) pueden ser atacados por la WLAN. Y si se tiene una red, también existe otra fuente de peligro: cualquier paquete infiltrado a través de la WLAN se salta el cortafuegos, que típicamente está instalado entre Internet y la red local, donde la WLAN está conectada. La solución está en proporcionar alguna clase de protección de cortafuegos para la WLAN. La distribución de OpenVPN [1] tiene un script de ejemplo de cortafuegos. Pero se necesitan reglas adicionales para el túnel de la WLAN. La Figura 3 muestra cómo se aplican estas reglas.
¡Fuera! OpenVPN usa UDP para enviar los paquetes encriptados al puerto 5000 al otro lado del túnel. Como usa la interfaz de WLAN wlan0 para ello, hay que admitir los paquetes UDP que van al puerto 5000 del interfaz. La siguiente sintaxis maneja esto para los paquetes entrantes: iptables -A INPUT -i wlan0U -p udp --dport 5000 -j ACCEPT iptables -A INPUT -i wlan0U -j DROP
Cuadro 3: Instalación OpenVPN es muy fácil de instalar. El paquete de código fuente para la versión estable 1.6.0 está disponible en la página web del proyecto [1]. Los siguientes comandos descomprimen el paquete, compilan el software y lo instala con los privilegios de root: tar -xvzf openvpn-1.6.0.tar.gz cd openvpn-1.6.0 ./configure --disable-lzo make su make install Necesita ejecutar configure con el parámetro --disable-lzo para deshabilitar la compresión. Como los datos no pueden comprimirse después de encriptarse, esta librería está recomendada sobre todo para las conexiones lentas. La librería está disponible en [2]. Lo que se necesita aquí es la librería OpenSSL y los ficheros de desarrollo, que están localizados en dos paquetes separados en Suse: openssl y openssl-devel. Otras dis-
www.linux-magazine.es
tribuciones también contienen el paquete SSL o puede mirarse la página web del proyecto OpenSSL [3] para obtener más detalles y productos relacionados. El kernel actual tiene el dispositivo túnel por defecto; el paquete disponible en [4] es para las versiones más antiguas del kernel. Si compilas tu propio kernel, el módulo TUN está localizado en la sección “Network device support”bajo “Universal TUN/TAP device driver support” de make xconfig. Desde luego que se puede compilar e instalar el módulo sin sustituir el kernel al completo. Después de configurar el kernel, tecléese: make modules make modules_install El siguiente paso es crear el fichero de dispositivo /dev/net/tun. Si /dev/net/ no existe, teclee primero mkdir /dev/net/ y luego cree el dispositivo: mknod /dev/net/tun c 10 200
Red Privada Virtual
PORTADA
comando permite la recepción y envío de paquetes: iptables -A INPUT -i tun0 -jU ACCEPT iptables -A OUTPUT -o tun0 -jU ACCEPT
Esto es todo lo que necesitamos para el portátil; que no está conectado a otras redes ni necesita reenviar paquetes. Figura 3:Las reglas de los cortafuegos impiden a los intrusos entrar en la WLAN. Sólo al túnel OpenVPN se le permite enviar paquetes a través de la WLAN.
La última línea se asegura de que la máquina no aceptare ningún otro paquete entrante. La primera regla de entrada podría incluso ser más estricta y especificar -s RealIP para restringir la dirección IP fuente, donde los paquetes se permiten que sean originados. Esta tendría que ser la dirección IP real del otro extremo del túnel, es decir, -s 172.16.0.2 en el portátil. También es necesario restricciones para el envío y reenvío de paquetes: iptables -A OUTPUT -o wlan0U -p udp --dport 5000 -j ACCEPT
iptables -A OUTPUT -o wlan0U -j DROP iptables -A FORWARD -i wlan0U -j DROP
Los extremos del túnel sólo reenvían los paquetes que son originados por un compañero conocido y sólo si este compañero conocido usa la clave (secreta) correcta. Esto significa que podemos confiar, aceptar y procesar los paquetes que vienen desde el dispositivo tun. Naturalmente, aún falta permitir a las máquinas el envío de paquetes por el túnel. El siguiente
Cuadro 4: Variedad de Funciones en OpenVPN Además del sencillo ejemplo mostrado de una conexión VPN, OpenVPN también permite conectar sitios completos. Simplemente cambiando la configuración de enrutamiento se consigue esto. En el modo puente, OpenVPN puede incluso conectar dos secciones de LAN de forma transparente, permitiéndoles usar el mismo espacio de direcciones. La solución de la clave secreta descrita en este artículo no funciona bien si la red tiene múltiples nodos. Pero esto es una de las mejores características de TLS. Está diseñada para usarse con certificados X.509. La versión 2.0 (actualmente en fase beta) hace que el trabajo sea mucho más sencillo para los administradores: no hace falta crear una configuración de servidor para cada cliente VPN; tan sólo se necesita un certificado X.509 válido. Además, el nuevo servidor debería realizar la mayor parte del trabajo duro. En modo UDP, OpenVPN no distingue entre clientes y servidores pero ejecuta aplicaciones peer-to-peer. Estableciendo la opción --float se permite que el túnel pueda transportar flujos sin interrupciones incluso si las direcciones IP reales de un extremo cambian,
por ejemplo, debido a un reseteo forzoso diario. Las conexiones TCP se mantendrían, lo que es útil si se necesita transferir grandes ficheros mediante FTP. Si lo que se necesita es enviar grandes ficheros a través del túnel, podría especificarse la opción --shaper [ancho de banda]. La opción restringe la velocidad de entrada al túnel a un número específico de bytes por segundo. Para restringir el ancho de banda en ambas direcciones se necesita especificar la misma opción a ambos lados. OpenVPN puede abrir múltiples túneles entre dos compañeros al mismo tiempo y asignar diferentes anchos de banda a cada túnel: esto puede ser útil para tareas administrativas. La configuración del router especifica qué datos se envía por cada túnel. La versión 1.5 de OpenVPN y posteriores también soportan TCP. Si está detrás de un cortafuegos que sólo acepta TCP no habrá otra alternativa posible. La desventaja de esto, si hay problemas en la red, es que la combinación de VPN sobre TCP haría que las cosas empeorasen. A pesar de todo, se debería configurar OpenVPN para que usase la solución tradicional basada en UDP.
Reenvío El PC de sobremesa necesita reglas de reenvío y necesita usar enmascaramiento para permitir que el portátil llegue al otro lado del mundo: iptables -A FORWARD -i tun0 -jU ACCEPT iptables -t nat -A POSTROUTINGU -o eth0 -j MASQUERADE
La regla de enmascaramiento le indica al PC de sobremesa que inserte su propia dirección IP pública en vez de la dirección privada de la VPN. La dirección privada no puede ser enrutada en Internet, pero con esta configuración, el PC de sobremesa enrutará cualquier paquete que el portátil envíe a través del túnel a su propio interfaz LAN y a Internet. Si el PC de sobremesa tiene una conexión DSL o módem simplemente hay que sustituir ppp0 por eth0.
Limitaciones de Seguridad Una red es tan segura como lo puedan ser los ordenadores conectados a ella. Una persona no autorizada podría acceder al portátil OpenVPN, leer la clave y usarla para romper la seguridad de la red virtual. Las redes inalámbricas necesitan una mejor protección ante los ladrones. Si se atiene a las reglas básicas descritas en este artículo, encontrará que OpenVPN es un producto de VPN seguro ■ y al mismo tiempo de uso sencillo.
RECURSOS [1] OpenVPN: http://openvpn.sourceforge.net [2] Proyecto OpenSSL: http://www.openssl. org/ [3] Librería LZO: http://www.oberhumer. com/opensource/lzo/ [4] Driver TUN/TAP: http://vtun.sourceforge. net/tun/
www.linux-magazine.es
Número 04
21
PORTADA
Wireless Sniffing
WarWalking con una PDA con Linux
De paseo con mi Zaurus
Las PDAs actuales tienen ya la potencia de cálculo de los PC de hace cinco años y la versatilidad de los Sistemas Operativos actuales. Una PDA con Linux es como tener un pingüino gigante en tu bolsillo. POR ALBERTO PLANAS
S
i es que, reconozcámoslo, el sueño de todo Geek es tener todo un sistema Linux con sus herramientas preferidas (Emacs, VI, LATEX, nmap, GCC, Apache, MySQL, …) integradas directamente en el sistema nervioso central (o eso, o que alguna chica le pregunte por el bulto del pingüino en el pantalón). Ahora bien, nos tendremos que conformar con llevar en nuestra PDA todo este arsenal, que siempre será mejor que llevar colgado del cuello un DVD con la KNOPPIX.
22
Número 04
En la redacción hemos logrado un par de Zaurus bien apañadas. Corresponden a los modelos SL-5500 y SL-C860. El primero ha podido adquirirse en Europa hasta hace un año, el segundo sólo se ha vendido oficialmente en Japón. Si piensas comprar una Zaurus recomendamos echar una vistazo a la SL-6000 y a la SLC3000, últimos modelos de la rama Europea y Japonesa respectivamente. En particular la SL-C3000 dispone de un disco duro de 4.4GB modelo Toshiba que permite, sin paliativos, la instalación de
www.linux-magazine.es
una Debian completa. Para el presente artículo vamos a experimentar con el modelo SL-5500. Es una PDA al gusto Europeo: disposición vertical de la pantalla y pequeño tamaño. Puede encontrarse una comparativa de las características de ambos dispositivos en la Tabla 1. Por su versatilidad y potencia, este tipo de PDAs son ideales para realizar auditorías de redes Wireless. Vamos a incorporar conectividad inalámbrica a la Zaurus por medio de una tarjeta Com-
Wireless Sniffing
compilar programas para la PDA, es precisamente esta capacidad y la de estar basada en Linux, lo que hace de la Zaurus una magnífica herramienta para Hackers (en el sentido correcto de la palabra).
Plataforma de desarrollo En Internet podemos encontrar varias Toolchains para nuestra Zaurus, yo he probado varias y aconsejo usar la desarrollada por Francois Leiber que puede descargarse en [1]. Solo presenta dos problemas, su host es lentísimo y al estar basado en la magnífica Toolchain de OpenZaurus, las cabeceras del kernel son algo diferentes a las que hay en la distribución de Sharp. Por esas razones hemos preparado un paquete donde se han corregido algunas de esas deficiencias, que puede descargarse desde [2]. Instalar el programa solo es descomprimir el paquete y ejecutar como root un pequeño script: mkdir zaurus cd zaurus tar -xjvf ../toolchain.tbz2 cd devel ./postinstall
Figura 1: Configuración para tarjetas CF-WCF11 con chipset Prism2.
pactFlash WCF11. Si bien el modelo es un poco antiguo y de no excesivamente bajo consumo, con esta CF podremos conectar a cualquier red 802.11b existente. Ahora podemos hacer uso de la vasta cantidad de herramientas de auditoría para redes wireless y no wireless que hay para Linux. Muchas de las más importantes utilidades están ya empaquetadas para ser directamente instaladas, pero para hacer más interesante el artículo compilaremos nosotros mismos nuestra selección de aplicaciones. No hay que asustarse de
El script postinstall solo crea enlaces simbólicos al directorio “devel”, sin tocar nada del resto del sistema. Con un simple ls -la /opt y ls -la /usr/local veremos los enlaces recién creados. Dentro del directorio “devel” hemos colocado otro script que debe ser ejecutado desde la consola donde se van a realizar las compilaciones. Este programa exporta algunas variables de entorno, lo que nos obliga a que lo ejecutemos de la
Tabla 2: Opciones más importantes de Kismet Tecla
Función
cursores
Seleccionamos una red de la lista
z
Zoom del área de informacion de redes localizadas
c
Muestra los clientes de la red seleccionada
L
Concentramos el escaneo a la red seleccionada
x
Sale de la ventana activa
i
Muestra una ventana con información detallada de la red
s
Ordena las redes encontradas. Usad un orden diferente al auto-fit para poder usar las teclas del cursor a la hora de seleccionar redes
a
Estadística general
r
Estadística de los paquetes encontrados
d
Muestra las cadenas ASCII imprimibles encontradas
Q
Sale de la aplicación
PORTADA
siguiente forma (notar el punto del principio) . ./dev-arm-qpe.sh
Antes de nada vamos a probar nuestra reluciente plataforma compilando un programa que ejecutaremos en nuestra PDA. Echaremos mano del famoso “Hola Mundo” en su versión Zaurus. Para eso teclearemos el siguiente micro-programa. #include <stdio.h> int main() { printf("Hola Zaurus!\n"); }
Compilaremos con el comando arm-linux-gcc hola.c -o hola y procederemos a la transferencia del código generado a la PDA. La conexión con la PDA se realiza mediante TCP/IP sobre el cable USB. El procedimiento habitual consiste en conectar la Zaurus a nuestro equipo usando el cable suministrado, y luego desde el ordenador ejecutar este script que se encargará de crear el interfaz de red “usb0” y de asignarle una IP. /sbin/modprobe usbnet /sbin/ifconfig usb0U 192.168.129.1 netmaskU 255.255.255.255 up /sbin/route add -hostU 192.168.129.201 usb0
Desde la Zaurus abriremos el terminal y ejecutaremos su -c "/etc/rc.d/init.d/samba start" para lanzar el servidor Samba, que nos permitirá transferir archivos entre los dos equipos. Montaremos la unidad Samba desde el Linux de nuestro escritorio con el comando mount -t smbfs //192.168.129.201/home ./samba. Ya solo queda copiar el binario y ejecutarlo con ./hola.
Compilación del último Kismet Llegados a este punto podemos compilar cualquier aplicación Linux mínimamente portable a nuestra Zaurus. Deseamos analizar redes WiFi y para eso nada mejor que trastear con Kismet, un detector de redes wireless con opciones básicas de sniffer y detección de intru-
www.linux-magazine.es
Número 04
23
PORTADA
Wireless Sniffing
Kismet tiene varios frontends disponibles. Por defecto incorpora uno en modo texto, usando las famosas ncurses. Tenemos disponible otro interfaz en modo gráfico SL-5500 SL-C860 basado en QT/E especialFormato Vertical Concha mente diseñado para PDAs. Pantalla 3.5’‘ 320x240 3.5’‘ 640x480 Podemos descargarlo desde Procesador SA1100 206MHz PXA255 400MHz http://sourceforge.net/ RAM 64 MB 64 MB projects/kismet-qte/. La comFLASH 16 MB 128 MB pilación e instalación de esta Ranuras 1 SD / 1 CF 1 SD / 1 CF aplicación es un poco más ofuscada, hay que parchearla y modisos. La ROM que trae por defecto la PDA ficar a mano el Makefile. Así que para de Sharp tiene drivers para dispositivos ahorrar tiempo hemos incluido un WiFi un poco obsoletos, eso hace que no paquete que puede descargarse desde [2] podamos echar mano de la librería pcap con todas las aplicaciones mencionadas para la captura de paquetes. No la neceen este artículo ya compiladas. Como sitamos realmente, pero para hacer Kismet va a ejecutarse en la Zaurus, trabajos de auditoría serios es necesario deberemos modificar el fichero actualizar estos drivers o, preferible“kismet.conf” según el Listado 1. En lo mente, usar otra ROM como por ejemplo esencial indicaremos el tipo de tarjeta la OpenZaurus. wireless que tenemos y que use los Descargaremos la última versión de canales reservados para Europa. Kismet (actualmente Kismet-2005-01-R1) ¡Perfecto! queda copiar el directorio desde su página oficial en http://www. “~/zaurus/install” a la PDA. Como kismetwireless.net. En el proceso de recomendación copiaría este directorio compilación indicaremos que la aplien una tarjeta SD, para luego crear un cación se encontrará en “/home/zaurus/ enlace simbólico desde el directorio wireless”. Esto nos permitirá instalar $HOME de la Zaurus. Kismet en la PDA sin tocar nada del sistema, haciendo más segura su ejecución y posterior desinstalación. ln -s /mnt/card/wirelessU
Tabla 1: Especificaciones
Figura 2: Algunas de las redes encontradas. Aquí se muestran dos sin encriptación WEP.
export PATH=/home/zaurus/U wireless/bin:$PATH export LD_LIBRARY_PATH=/home/U zaurus/wireless/lib export TERM=sun
/home/zaurus/wireless ./configure \ --build=i686-linux --host=arm-linux \ --disable-pcap \ --enable-zaurus \ --disable-suid-root \ --prefix=/home/zaurusU /wireless make make install prefix=~/zaurusU /install
¿Nos damos una vuelta? Ha llegado la hora de poner en marcha nuestro flamante Kismet especialmente compilado por nosotros. Respiremos hondo y disfrutemos de este momento previo a la culminación de nuestro trabajo. Bien, una vez oxigenados tomemos la PDA y desde la línea de comando ejecutemos este pequeño script para actualizar algunas de las variables de entorno.
Listado 1: /home/zaurus/wireless/kismet.conf 01 02 03 04 05 06 07 08 09 10
24
... suiduser=zaurus ... # Si tenemos una Prism2 necesitamos usar el driver wlanng_legacy source=wlanng_legacy,eth0,wcf11 ... # Usaremos los canales Europeos defaultchannels=IEEE80211b:1,7,13,2,8,3,14,9,4,10,5,11,6,12 # defaultchannels=IEEE80211b:1,6,11,2,7,3,8,4,9,5,10 ...
Número 04
www.linux-magazine.es
Para un primer escaneo ejecutaremos el front-end gráfico. Nos proporcionará un interfaz mucho más simple donde ver los datos esenciales de las redes wireless localizadas por Kismet. Ejecutaremos, por tanto, el programa kismet_qt, donde una vez configurado (ver Figura 1) empezaremos a detectar redes WiFi cercanas. La información que nos muestra es la básica, a saber: • El SSID de la red • Velocidad de la transmisión • Codificación WEP (o ausencia de ella) • Dirección MAC del Punto de Acceso • Relación Señal / Ruido • Número y tipo de paquetes encontrados • Paquetes con vectores IV débiles • Número de máquinas clientes asociadas
Wireless Sniffing
En este primer paseo hemos detectado 17 redes, todas juntitas y con mucha información que ofrecer. Como vemos en la Figura 2 hemos tenido algo de suerte, puesto que ocho de estas redes transmiten sin encriptación WEP. Aunque parezca mentira aún muchos usuarios de redes WiFi desconocen la existencia de mecanismos de seguridad básicos como el control de acceso por MAC, encriptación WEP / WPA u ocultación (cloaked) de redes. Aunque reconozco que sí es alarmante que en escasos cinco minutos (según mis logs desde las 13:46:55 hasta las 13:51:02) de WarWalking dentro de un área de alta tecnológica hayamos encontrado una tasa de un 47% de redes desprotegidas. Desde luego sería interesante ampliar el área de
análisis para ver si esta proporción es representativa, pero para eso deberíamos pasar de un simple WarWalking a un WarDriving (usar el coche para ir recorriendo superficies más extensas). Un experimento divertido que podemos realizar con el mínimo esfuerzo es ver las cadenas de texto que se transmiten dentro de esas redes sin protección. Kismet puede hacer de sniffer seleccionando para nosotros el conjunto de cadenas ASCII transmitidas en las tramas TCP/IP que pueden ser leídas sin dificultad. En la Figura 3 vemos algunas de estas cadenas. Posiblemente correspondan a algún paquete UDP de una conexión Samba. De hecho hay un par de tramas que indican accesos a impresoras en red mediante el protocolo
PORTADA
Figura 3: Texto en claro transmitido por algunas de estas redes sin protección.
Listado 2: Kismet-Jan-21-2005-5.xml 01 ... 02 <wireless-network number="11" type="infrastructure" wep="false" cloaked="false" first-time="Fri Jan 21 13:51:02 2005" last-time="Fri Jan 21 13:58:15 2005"> 03 <SSID>XXXXXXX</SSID> 04 <BSSID>00:20:ED:1F:EF:XX</BSSI D> 05 <channel>11</channel> 06 <maxrate>11.0</maxrate> 07 <maxseenrate>0</maxseenrate> 08 <carrier>IEEE 802.11b</carrier> 09 <packets> 10 <LLC>590</LLC> 11 <data>8</data> 12 <crypt>0</crypt> 13 <weak>0</weak> 14 <dupeiv>0</dupeiv> 15 <total>598</total> 16 </packets> 17 <datasize>1350</datasize> 18 <gps-info unit="english"> 19 ... 20 </gps-info> 21 <ip-address type="tcp"> 22 <ip-range>10.1.1.150</ip-range > 23 </ip-address> 24 <wireless-client
number="1" type="fromds" wep="false" first-time="Fri Jan 21 13:51:05 2005" last-time="Fri Jan 21 13:57:33 2005"> 25 <client-mac>00:20:ED:1F:EF:XX< /client-mac> 26 <client-packets> 27 <client-data>8</client-data> 28 <client-crypt>0</client-crypt> 29 <client-weak>0</client-weak> 30 </client-packets> 31 <client-gps-info unit="english"> 32 ... 33 </client-gps-info> 34 <client-datasize>1350</clientdatasize> 35 <client-maxrate>0.0</client-ma xrate> 36 <client-maxseenrate>0</clientmaxseenrate> 37 <client-ip-address type="tcp">10.1.1.150</clientip-address> 38 </wireless-client> 39 </wireless-network> 40 ...
Figura 4: Listado de las primeras redes encontradas en nuestro paseo.
IPP. Francamente interesante ese “Archer NAS 3.0.10”. Haciendo un esfuerzo por reprimir nuestra alma de voyeur, continuaremos con el análisis de redes wireless con este programa de auditoría. Kismet va generando logs donde almacena todo lo encontrado desde el inicio de la sesión. Genera cuatro tipo de archivos, en uno de ellos almacena los paquetes capturados para poder ser analizados offline, un fichero network donde lista las redes encontradas usando un formato de texto propietario. Existe un formato CSV y uno XML donde se muestra toda la información esencial de las redes,
www.linux-magazine.es
Número 04
25
Wireless Sniffing
talla de ayuda con las opciones del programa. Un resumen de estas opciones podemos encontrarlas en el Tabla 2. El nivel de detalle de esta aplicación es mayor que el del front-end basado en QT/E. Ahora podremos analizar las transferencias de los clientes, y no solo la de los puntos de accesos de las redes existentes. Por desgracia el uso del teclado dificulta el empleo ágil del programa. En la Figura 4 vemos el aspecto de Kismet en modo texto, y en la Figura 5 una ventana con información detallada de la red seleccionada.
Expandiendo horizontes Un viaje interesante éste que nos ha proporcionado Zaurus. Esta máquina ha causado que un grupo de buenos programadores, fanáticos de la tecnología y de las PDAs, hayan desarrollando una versión alternativa de la ROM de Sharp, mejorando cada uno de los aspectos posibles. Empezando porque usa el compilador GCC3.2.3 que genera binarios más Figura 5: Información adicional sobre la red wireless optimizados para procesadores de “gigabyte”. la familia ARM (StrongArm y PXA255) y mejora la velocidad clientes y protocolos encontrados del cálculo matemático en un factor que durante el rastreo (ver Listado 2). Hay ronda entre el 400% y el 500%, hasta un programa escrito en Perl que transuna necesaria actualización de los driforma el fichero XML a HTML, un vers del control táctil de pantalla, formato más apropiado para su visualiwireless, baterías, memoria … Actuazación (Kismet Log Viewer en [3]). Si lización del kernel (ya mismo dispusiéramos de un adaptador GPS, dispondremos de un kernel 2.6 para la Kismet iría almacenando en los logs la Zaurus) y restantes aplicaciones, como longitud y la latitud de las redes enconla disponibilidad de GPE con XFree y tradas, es una opción muy útil para Matchbox. Por desgracia la versión paseos prolongados y para la geneactual de esta ROM (OpenZaurus 3.5.2 ración de mapas sensibles donde en el momento de escribir este artículo) mostrar las diversas localizaciones de es poco adecuada para el uso rutinario nuestros hallazgos. de la PDA, pero se aproxima el momento Este front-end nos ha sido realmente de tener una mejora realmente imporútil, pero no muestra toda la información tante que alargará la vida útil de estas que proporciona esta nueva versión de máquinas. Kismet. Para extraer el resto de su potenOpenZaurus (ver [4]) se ha confeccia necesitaremos ejecutar su versión cionado a partir de una configuración ncurses, un poco más difícil de utilizar. determinada del proyecto BitBake (ver Para trastear con este nuevo interfaz, lan[5]). Este proyecto es una emulación de zaremos el cliente con el comando kismet. las metadistribuciones al estilo Gentoo Una opción muy útil que usaremos con aplicadas al ámbito de los dispositivos frecuencia la conseguiremos por medio de empotrables. Desde BitBake podemos la tecla “h”, que nos mostrará una pangenerar distribuciones Linux para las
26
Número 04
www.linux-magazine.es
Zaurus, para las IPAQs, para algunos TabletPCs basados en procesadores ARM, PPC… Cualquier desarrollador con ganas de desarrollar para este tipo de dispositivos debería dedicarle un tiempo a su estudio, puesto que ahorra gran cantidad de esfuerzo en la compilación cruzada (cross compiling) automática.
Seguridad relativa Como hemos visto, establecer una comunicación inalámbrica sin las mínimas consideraciones de seguridad es un suicidio. Cualquiera con unos mínimos conocimientos puede sentarse tranquilamente mientras analiza todo el tráfico que se produce por la red. En nuestro experimento con la Zaurus hemos tenido la decencia de observar poco tiempo dicho tráfico, pero con algo más de paciencia y malicia yo me pregunto ¿Cuánto tiempo tardaría en ver una trama con cadenas como “USER isabel\nPASS 1B55w#4\n”? La recopilación de contraseñas y usuarios ha pasado a ser una actividad pasiva. Configurar el punto de acceso wireless para que realice control de MACs y establezca comunicaciones encriptadas mediante protocolo WEP / WPA es lo mínimo que podemos hacer, pero por desgracia como veremos en el siguiente artículo, es un mínimo que con el conocimiento actual y nuestra mini-máquina quedará ■ reducido a la nada.
RECURSOS [1] Toolchain de Francois Leiber: http://www. nautilus6.org/operation/download/ cross_install-2.95.tar.bz2 [2] Paquetes de este artículo: http://www. linux-magazine.es/ Magazine/Downloads/04 [2] Kismet Logviewer http://www.mindflip. org/klv/ [3] Open Zaurus: http://www.openzaurus.org [4] Proyecto Bitbake: http://www. openembedded.org
EL AUTOR
PORTADA
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.
SDL
DESARROLLO
Más que SDL
La fabrica de éxitos SDL suministra los componentes gráficos para construir un juego. Desafortunadamente, en la programación de juegos hay algo más que un motor gráfico. Este mes Steven Goodwin analizará algunas de las cosas que SDL no hace y demostrará como se pueden hacer. POR STEVEN GOODWIN
S
DL es un API (Aplication Program juego de plataformas Manic Miner, pero Interface) multimedia. La mayoría los principios básicos son los mismos. Se de sus funcionalidades se pueden supone que el jugador comienza el nivel llevar a cabo dentro del subsistema de en un lugar seguro (libre de colisiones) y gráficos, pero también tiene se requiere que permanezca bibliotecas para sonido, en una posición segura al final palanca de juegos y hebras. Sin de cada cuadro. embargo no soporta la detecSi no se puede encontrar ción de colisiones. Esto no es Figura 1:El jugador y una nueva posición segura, una sorpresa ya que caería su cuadro de limites. entonces hay que volver a la fuera de su alcance. En el posición original (suponiendo campo de las 3D, OpenGL tampoco suque esta posición aun sea segura), o ministra una infraestructura para la matar al jugador. Esto es una decisión de detección de colisiones. Y escribir un diseño del juego, no es una decisión técjuego sin detección de colisiones es nica. Como los juegos son cada vez más como comer curry sin cerveza ¡A la complejos, con más y más objetos postre es insatisfactorio! móviles, este problema ha llegado a ser más difícil. Cuando los juegos con autenOjala que llueva café tica 3D llegaron a estar disponibles, esta complejidad aumentó en varias órdenes Las colisiones son como el clima: No se de magnitud. Incluso hoy, los juegos trata de una sola cosa. El código de colicomerciales tienen que hacer trampas sión para comprobar que el jugador no se da bruces con una pared es diferente con sus sistemas de colisión para hacerdel código del jugador dándose de los jugables en un PC , o una consola, bruces con un enemigo. Y eso es diferazonablemente modernos porque las rente de la colisión del jugador cogiendo matemáticas implicadas son muy comuna llave. Se cubrirán varios métodos de plejas. detección de la colisión, cómo funcioCinco a uno nan, porqué ese método particular es pertinente, y donde ayudará a implePara el sistema de colisión en movimiento mentarlo SDL. se comprobará un pixel cada vez, busMoverse desde la posición A a la posicando colisiones y reseteando a la ultima ción B no es tan simple como pudiera posición segura conocida si esto no es pensarse. Y desde luego que no es tan posible. Éste es el método que toman la simple como cuando salió el primer mayoría de los juegos de este tipo.
Aunque se comprobará un pixel cada vez, se moverán varios pixels en el transcurso de un solo cuadro. Esto permitirá cambiar la velocidad de caminando a arrastrándose y moverse por el nivel de una forma mucho más realista. Verificar varias posiciones en un cuadro puede parecer un derroche, pero es más fiable que verificar solamente que el punto final es valido (Véase Consideraciones del proyectil) y más flexible que escribir código especifico para escu-
Consideraciones del proyectil El problema en mover objetos varios pixeles en un cuadro se llama consideraciones del proyectil. Imagine una bala moviéndose muy rápidamente hacia la izquierda. Ahora imagine al jugador moviéndose muy rápidamente hacia la derecha. En el mundo real, la bala golpearía al jugador. En el juego, si solamente se considera la validez de la posición final ¡No se puede! La bala podría terminar totalmente a la izquierda del jugador después de un solo cuadro, y no habría ocurrido ninguna colisión. Para evitar esto, se debe escribir un código especial que comprueba toda la trayectoria de la bala. Como a la mayoría de nosotros nos interesa más escribir juegos que ecuaciones matemáticas, se utilizara la fuerza bruta para comprobar cada punto a lo largo de la trayectoria.
www.linux-magazine.es
Número 04
27
DESARROLLO
SDL
driñar la ruta buscando obstáculos. La un cuadro de límites de tamaño fijo a lo función que hace esto se llama plyChecklargo del juego. Collisions. La función para verificar las colisiones Para determinar si cualquier posición funciona de la siguiente manera: en particular es segura, Comienza procesando el debemos comparar la cuadro de limites del posición del jugador jugador actual y contra cada bloque exisentonces solicita detalles tente para ver si se de casi todos los objetos solapan. Para simplificar dentro del rectángulo este problema, no se (estamos usurpando la considerará los datos de Figura 2:El cuadro de limites no estructura SDL_Rect, la imagen del jugador, es refleja siempre los gráficos. aunque SDL en sí mismo decir su contorno exacto. no tiene soporte para Miraremos solamente el cuadro que lo colisión). Dije casi porque el primer rodea, conocida como bounding box argumento para exGetRectCollision se uti(cuadro de limites). Si esta cuadro choca liza como parámetro ‘ignorado’. Esto es con el cuadro contenedor de cualquier porque si se comprueba todo en el bloque, no puede moverse a esta posimundo contra el cuadro de limites del ción. jugador siempre habrá como mínimo un Esta no es un compromiso tan infreobjeto en en colisión: ¡El jugador! Como cuente, puesto que cualquier problema esto es inútil, se ignora explícitamente. en el código de colisión es tan molesto La ListOfCollisions ofrecerá más inforpara el jugador que juega, como para el mación acerca del estado de las programador que lo programa. El colisiones: Cuantas colisiones ha habido, jugador podría meterse en un hueco, que objetos han sido afectados (bloques, podría ejecutarse una animación donde enemigos, y así) e incluso la posición x, el personaje se rasca la nariz y después y donde ha ocurrido la colisión. Esta se encuentra que un pixel en particular ultima información permitirá, por ejemestá en colisión con el mundo y ya no plo, determinar si una flecha golpea en puede escapar. Así que especificamos al la cabeza o en la pierna. Entonces se artista que el gráfico del jugador debe puedes usar esto para modificar el transpermanecer dentro de un área fija, y no curso del juego. Teniendo una rutina de se tomará en consideración nada exterior colisión de propósito general tal como del cuadro durante la detección de la coesta, se puede enfocar el esfuerzo en lisión. Por la misma razón, mantenemos otras áreas. Por el momento sólo esta-
Listado 1: ¿Choca o no? 01 02 03 04
SDL_Rect PlayersBoundingBox; EX_COLLISION_LIST ListOfCollisions; plyGetPlayerRect(pPlyObj, &PlayersBoundingBox); exGetRectCollision(pPlyObj, &PlayersBoundingBox, &ListOfCollisions);
Listado 2: Desde exCheckCollision en collision.c 01 02 03 04 05 06 07 08
tx = pCollisionRc->x / TheGame.iTileWidth; ty = pCollisionRc->y / TheGame.iTileHeight; TestTileCollision(pCollisionRc, tx, ty, pCollisionList); if (pCollisionRc->x%TheGame.iTileWidth) TestTileCollision(pCollisionRc, tx+1, ty, pCollisionList); if (pCollisionRc->y%TheGame.iTileHeight) TestTileCollision(pCollisionRc, tx, ty+1, pCollisionList); if ((pCollisionRc->x%TheGame.iTileWidth) && (pCollision Rc->y%TheGame.iTileHeight)) 09 TestTileCollision(pCollisionRc, tx+1, ty+1, pCollisionList);
28
Número 04
www.linux-magazine.es
Figura 3:Comprobación de proximidad.
mos interesados en si la nueva posición es segura, o no. Dentro de la función exGetRectCollosion se puede optimizar el código “comprobar cada bloque en el mundo” para comprobar solamente los bloques con los que se pueden colisionar (una mejora en la velocidad que beneficiara a todo el juego; otra razón para usar un código de colisión de propósito general). La función exGetRectCollosion funciona de la misma forma que la función ‘repair’ que se vio el mes pasado. En esta etapa tampoco se hará caso de las colisiones enemigas, puesto que para esto se realizará un tipo de comprobación diferente y sería un desperdicio realizar esta prueba dos veces. Si, por ejemplo, el personaje está saltando y colisiona con algo, no puede quedarse parado en medio del aire, hay que pensar en dejarlo caer. O si el personaje está saltando arriba y a la izquierda y choca ¿se debería intentar saltar recto hacia arriba, ignorando el movimiento hacia la izquierda o comenzar a caer? Todas estas son decisiones sobre el transcurso del juego y se implementa de forma muy simple utilizando la misma función exGetRectCollision para cada una de las posibles nuevas posiciones. La función plyUpdJumping muestra que decisiones he realizado para el componente de saltos. La misma función exGetRectCollision se puede usar para otra parte del movimiento de colisión: la detección de un choque con el suelo. Se debe averiguar si el jugador está sobre algo solido, o no. Para esto se puede usar la misma función, pero con un rectángulo de colisión distinto. Principalmente, una
SDL
pequeña cuadro justo debajo de los pies, que es la anchura del jugador. Si hay una colisión, hay que alegrarse, ya que el jugador se encuentra seguro sobre algo. Si no fuese así, habrá que cambiar al estado de caída y procesar la colisión de la manera normal como descenso del jugador. La detección de suelo resalta una limitación con el método de colisión por medio de el cuadro de limites, pues un pixel pudo chocar con una superficie, pero no lo hacen los gráficos, según se muestra en la Figura 2.
A la medianoche Es mucho más fácil detectar qué objetos quiere coger el jugador. Aunque nuestra rutina de uso general de la colisión funcionaría no es siempre el mejor método, ya que es innecesario realizar detección de colisión. La recogida se acciona por proximidad, tan pronto como el jugador está dentro, por ejemplo, de la mitad del ancho de un bloque (o 16 pixeles) se puede recoger el objeto. El método matemático para comprobar la distancia es el que usaba Pitágoras: “El cuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos”. Esto dejará que se realice una comprobación circular, buscando cualquier
Listado 3: Matemáticas de los días del colegio 01 dx = pObj1->x - pObj2->x; 02 dy = pObj1->y - pObj2->y; 03 iDistance = sqrt( dx*dx + dy*dy 04 ); 05 if (iDistance < iProximity) 06 { /* ... coger está en el rango 07 ... */ }
Listado 4: Pitágoras hecho fácil. 01 02 03 04 05
dx = pObj1->x - pObj2->x; dy = pObj1->y - pObj2->y; if (iDistanceSquared < iProximity*iProximity) { /* ... coger está en el rango 06 ... */ }
DESARROLLO
Listado 5: Matriz de la superficie de colisión 01 if (SDL_LockSurface(pCurrentSurface) < 0) 02 { 03 fprintf(stderr, "No puede bloquear la superficie: %s\n", SDL_GetError()); 04 return NULL; 05 } 06 pCollisionData = (Uint8 *)malloc(pCurrentSurface->w * pCurrentSurface07 >h); 08 /* pCurrSurface->pixels ahora apunta a datos de pixel validos para leer/escribir */ 09 SDL_UnlockSurface(pCurrentSurface);
Listado 6: Consultar la paleta 01 02 03 04 05 06 07
if (iBytesPerPixel == 1) { pixel = *(Uint8 *)pSurfacePtr; r = pCurrentSurface->format->palette->colors[pixel].r; g = pCurrentSurface->format->palette->colors[pixel].g; b = pCurrentSurface->format->palette->colors[pixel].b; }
objeto dentro de un radio específico desde la posición actual del jugador. Debido a que la raíz cuadrada es lenta y solo funciona en punto flotante y con números de doble precisión, habrá que ahorrar tiempo… evitándola. No se tiene verdadero interés en conocer la respuesta a la ecuación, sólo su resultado. ¿Está dentro del radio de proximidad? Se puede elevar al cuadrado cada lado de la ecuación obteniendo el mismo resultado.
Odisea espacial En un principio, también se puede utilizar el cuadro de limites de colisión cuando se choca con el enemigo. Sin embargo, puesto que se puede tener una amplia gama de enemigos diferentes (y solo se dispone del tamaño de un bloque para almacenarlos) puede que sea un poco injusto si se representan con unos gráficos tan pequeños que podrían matar al jugador a una distancia de 30 pixeles. De manera parecida, también es injusto si la animación provoca que el enemigo se encoja a la mitad de su tamaño original, pero todavía se considera la colisión del enemigo como cuando estaba a tamaño completo. Por lo tanto se va a necesitar una forma de
colisión que este basada en pixeles y eso va a necesitar que se investigue a fondo en SDL para determinar que pixeles son transparentes. Lamentablemente, no es tan simple como pudiera parecer.
Dulce perfección La colisión basada en pixels en realidad es realmente fácil en teoría: Comprobar cada pixel de la imagen y si alguno de ellos es opaco (es decir, no es transparente) se ha encontrado una colisión. SDL, a pesar de toda su potencia, no proporciona una sencilla función GetPixel. De hecho, no proporciona ninguna función GetPixel. Así que habrá que escribir una. El primer paso en el proceso es bloquear la superficie. El bloqueo es un método donde la imagen de la superficie (ya esté en memoria de vídeo o de sistema) se copia a un nuevo búfer en la memoria del sistema. Entonces se pueden leer, escribir o cambiar los pixeles en este búfer, todo lo que se necesite y cuando se desbloquee la superficie, estos nuevos datos se copian nuevamente dentro de la superficie original. Mientras la superficie esté bloqueada, no se podrán hacer operaciones de transferencia de bloques (blit) desde o hacía ella. Es el copiado de estos datos a y
www.linux-magazine.es
Número 04
29
SDL
DESARROLLO
desde la memoria lo que convierte el bloqueo de la superficie en una operación muy costosa, por tanto los pixeles no se deben escribir uno a uno. Si se está trabajando con algún algoritmo especial de mapa de bits (como fractales, por ejemplo) entonces se procesan un gran número de pixeles y se escriben todos juntos en la superficie bloqueada. Para la colisión (que es una circunstancia excepcional) se bloqueará la superficie una vez al comienzo del juego, se copiarán los datos necesarios dentro de lo que se llamará la superficie de colisión y después se desbloqueará la superficie inmediatamente. La superficie de colisión será una simple matriz, donde un elemento en la matriz tendrá una equivalencia directa con un pixel en la imagen. Un valor de de cero en la matriz significará “sin colisión”, mientras que un uno significará “colisión”. Para simplificar, cada elemento en la matriz sera un byte, aunque en el futuro se puede ahorrar memoria reduciendo esto a un solo bit. Los datos de pixel (en pCurrentSurface->pixels) se almacenan en el mismo formato que en la superficie. Como ya se ha visto (en las partes 1 y 2 de esta serie), cada superficie debe crearse con un bit de profundidad diferente, así que se necesita comprender como leer diferentes formatos de pixel. Aquí hay dos maneras. Antes de nada, hay que saber cuál es el formato del pixel: iBytesPerPixel = U pCurrentSurface->U format->BytesPerPixel; pSurfacePtr = (Uint8 U
Listado 7: Normalizando 01 02 03 04 05 06 07
Uint32 pixel; SDL_PixelFormat *fmt = pCurrentSurface->format; pixel = *(Uint32 *)pSurfacePtr; /* Leyendo de una superficie de 4-bytes-per-pixel */ r = ((pixel & fmt->Rmask) >> fmt->Rshift) << fmt->Rloss; g = ((pixel & fmt->Gmask) >> fmt->Gshift) << fmt->Gloss; b = ((pixel & fmt->Bmask) >> fmt->Bshift) << fmt->Bloss;
Listado 8: Leyendo bytes 01 02 03 04 05 06
if (iBytesPerPixel == 2) pixel = *(Uint16 *)pSurfacePtr; if (iBytesPerPixel == 3) pixel = (*(Uint32 *)pSurfacePtr)&0xffffff; if (iBytesPerPixel == 4) pixel = *(Uint32 *)pSurfacePtr;
*)pCurrentSurface->U pixels;
Con un bit por pixel, se está usando una superficie paletizada y se tiene que consultar la paleta para conseguir los componentes rojo, verde y azul. Esos componentes están fácilmente disponibles en la superficie, como se muestra en el Listado 6. Con los formatos de pixel empaquetado (2, 3 o 4 bytes por pixel) se tiene que realizar un poco de aritmética a nivel de bit para aislar los componentes individuales del RGB, y se normalizan de modo que cada uno esté dentro de la gama 0 a 255. El Listado 7 muestra este código. La rutina de conversión del listado 7 es idéntica para todos los formatos empa-
Listado 9: Comparando color. 01 02 03 04 05 06 07 08 09 10 11 12 13
30
if (iBytesPerPixel == 2) pixel = *(Uint16 *)pSurfacePtr; if (iBytesPerPixel == 3) pixel = (*(Uint32 *)pSurfacePtr)&0xffffff; if (iBytesPerPixel == 4) pixel = *(Uint32 *)pSurfacePtr; if (SDL_MapRGB(pCurr->format, r, g, b) == pCurrentSurface->format->colorkey) *pCollisionData = 0; /* este pixel es transparente */ else *pCollisionData = 1; /* este pixel no lo es! */ pCollisionData++;
Número 04
www.linux-magazine.es
quetados. La superficie tiene su propia combinación de máscaras, de cambios y de parámetros de pérdida para alcanzar esta unidad. El único código adicional (mostrado en el Listado 8) es necesario para leer el correcto número de bytes desde el puntero de la superficie. Habiendo recogido los datos RGB, ahora se puede usar la función SDL_MapRGB para crear una superficie compatible en color y compararla con la clave de color, escribiendo el resultado en la matriz de colisión. Después de leer un pixel, se debe mover sobre el siguiente. Aunque esto puede parecer como un bucle fácil, es aquí que la segunda manera toma la delantera. Es decir de la tonalidad, o intervalo, de la superficie.
Cantando canciones disparatadas Cuando se crea una superficie, no es siempre del tamaño que se solicita. Las superficies en memoria de vídeo,por ejemplo, suelen ser una potencia de 2 (128, 256, 512) y por tanto la pantalla de 640x480 podría potencialmente ser de 1024x512 pixeles. Puesto que el tamaño real está bajo el control de la tarjeta gráfica hay muy poco que se pueda hacer sobre esto. Al usar las funciones de transferencia de bloque estándares, SDL estimará automáticamente esto. Pero puesto que se he puenteado SDL, se debe estar enterado de qué está sucediendo bajo el
SDL
capó, puesto que cada línea puede tener un suplemento de 384 pixeles. El valor pCurrentSurface->pitch mantiene el tamaño (en bytes) de cada línea de la superficie. Por lo tanto se debe aumentar el indicador de pixel como corresponde. Véase el Listado 10. Nuestros datos de colisión (porque son nuestros, almacenados en nuestra memoria) no tienen el problema de tonalidad, y por tanto cada octeto se puede almacenar secuencialmente. Como referencia, la función se llama exCUBuildCollisionSurface y se encuentra dentro de collision.c
Contonéalo (pero solo un poco) Ahora hay que escribir la función exCCBoundingBox2Pixel, para determinar si hay pixeles letales enemigos dentro del cuadro de limites del jugador. Otra vez, la oferta de SDL no da soporte para esto, así que toca leer por completo todos los pixeles manualmente. Sin embargo, hay dos atajos que se pueden tomar. El primero es que se puede comprobar primero el cuadro de limites de cada objeto, antes de hacer otra cosa. Si éstos no se interceptan, entonces la prueba de colisión de pixel
magistral es una pérdida de tiempo, y se puede salir pronto de la función. La segunda optimización es comprobar solamente el área de pixeles donde ambas cuadros de limites se solapan, es decir, el conjunto unión. SDL no proporciona ninguna función para procesar esta unión, pero se puede hacer bastante fácilmente considerando cada caso por separado: ¿El enemigo está encima o debajo del jugador? ¿El enemigo está a la izquierda o a la derecha del jugador? Habiendo encontrado el área para comprobar de (x1,y1) a (x2,y2). Ahora se debe encontrar el primer pixel en nuestros datos de colisión que pertenezca a la posición (x1,y1) (Listado 11) y después iterar a través de cada pixel uno por uno . El haber estipulado una anchura constante de 640 para los gráficos también tiene aquí una prima adicional. Puesto que nuestros datos de la colisión se relacionan directamente con los gráficos de la superficie, cada línea de datos de la colisión es siempre de 640 pixeles, lo que hace fácil moverse a partir de una línea a la siguiente. El bucle de detección de colisión (Véase el Listado 12) es muy parecido al
Listado 10: Incrementando el puntero de pixel. 01 02 03 04 05 06 07 08 09 10 11 12
pSurfacePtr = (Uint8 *)pCurrentSurface->pixels; for(y=0; y<pCurrentSurface->h; y++) { for(x=0; x<pCurrentSurface->w; x++) { /* ... lee los datos del pixel como arriba .. */ pSurfacePtr += iBytesPerPixel; } /* Move onto the next line */ pSurfacePtr -= pCurrentSurface->w * iBytesPerPixel; /* rebobinando al principio de la línea */ pSurfacePtr += pCurrentSurface->pitch; /* la tonalidad ya está en bytes */
Listado 11: Encontrando x1 e y1 01 pColData = pCollisionData; 02 pColData += (iRegion%TheGame.iNumTileWidth) * TheGame.iTileWidth; 03 pColData += (iRegion/TheGame.iNumTileWidth) * TheGame.iTileHeight * 640; 04 pColData += x1; 05 pColData += y1 * 640;
DESARROLLO
Figura 4:Un conjunto unión.
código para crear una superficie de colisión, mientras que el procesado de x1, y1 pide el código prestado del código exDrawTile; ambos deben ser fáciles de seguir. Véase el archivo collision.c. Una solución alternativa es crear una superficie de 8 bits con SDL_CreateRGBSurface y escribir en ella los datos de colisión, quizás con una transferencia de bloque (blit), o una combinación de bloqueo-desbloqueo. Entonces, para ahorrar tiempo de procesador, se puede bloquear la superficie para toda la duración del juego (porque no se transferirá nada hacia o desde él). Siempre hay más de una solución a un problema. A modo de ejercicio intente [1] y vaya a ■ la carpeta sources/sdl.
Listado 12: Bucle de detección de colisión el puntero de pixel. 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
for(y=y1;y<y2;y++) { for(x=x1;x<x2;x++) { if (*pColData) { /* Colisión encontrada!! Almacénela!!! */ return TRUE; } pColData++; } pColData -= (x2-x1); pColData += 640; }
RECURSOS [1] http://www.bluedust.com/pub/
www.linux-magazine.es
Número 04
31
DESARROLLO
Ruby
Construyendo una Araña Web con Ruby
Araña en la Red Ruby es un lenguaje muy elegante y armonioso (sus partes funcionan de forma conjunta de manera efectiva). Ruby también reduce significativamente los agobios del desarrollador. Mostraremos como usar Ruby para construir una aplicación de arañaWeb rápida y sencilla. POR DAVID BERUBE www.spidertim.com
R
uby es un lenguaje de guiones desarrollado por Yukihiro Matsumoto y distribuido bajo GPL. El lenguaje Ruby dispone de un excelente juego instrucciones para la manipulación de cadenas de caracteres y librerías de redes, haciéndolo una gran elección para escribir arañas Web. Para los que no os resulten familiares, indicaros que las arañas Web son programas diseñados para atravesar automáticamente la Web. Los motores de búsqueda usan las arañas Web para añadir paginas Web a sus catálogos. Compañías como Netcraft usan arañas Web para obtener estadísticas de servidores Web. Podemos usar arañas Web para encontrar información automáticamente de casi cualquier sitio Web. En este artículo veremos como usar Ruby para recuperar información de LiveJournal, el popular proveedor de bitácoras Web. Podemos aplicar éstas técnicas a virtualmente cualquier lugar Web que proporcione información pública.
Obtención de datos Web Los programadores disponen de varias maneras de recuperar información desde una página Web. Algunos lugares ofrecen información en formatos fáciles de
32
Número 04
procesar, como XML. Un buen ejemplo de esto es lo que se denomina RSS, en formato XML. RSS son las siglas de Really Simple Syndication (Sindicación Realmente Simple), y es una manera de que los sitios Web de noticias proporcionen titulares al minuto a otros sitios y a programas diseñados para mostrar la información. Un gran número de sitios proporcionan sus titulares en formato RSS (la BBC proporciona todas sus secciones en RSS). Muchos programas gestionan titulares en RSS. Por ejemplo, Mozilla Firefox nos permite crear carpetas de “marcadores en vivo” que automáticamente se llenan con titulares RSS. Otro método para recuperar información es el llamado “rascar pantallas” (descargar páginas HTML de la misma forma que lo haría un buscador Web para luego desechar las secciones en las que no estamos interesados). LiveJournal proporciona cierta información (por ejemplo una lista de mensajes de usuarios) en formato RSS XML y exige a los usuarios que usen ese formato siempre que sea posible. Otra información sólo puede ser rescatada “rascando la pantalla”, por ejemplo, la lista de amigos de un usuario.
www.linux-magazine.es
Debido a que las bitácoras LiveJournal contienen gran cantidad de información, se podrían minar en busca de una gran variedad de diferentes tipos de datos. En este ejemplo vamos a escribir un programa que compila comentarios de un usuario único de LiveJournal, o lo que es lo mismo, el programa descargará cada comentario que el usuario ha hecho en cualquiera de los blogs de sus amigos y muestra los comentarios. Por supuesto no encontrará mensajes dejados en bitácoras que no están en la lista de los amigos del usuario ni tampoco encontrará mensajes privados. Las arañas de red solo pueden encontrar información accesible públicamente, por lo que esta aplicación solo encontrará información que el usuario objetivo ha decidido hacer público. Por supuesto esto puede representar mucha información en algunos casos. Es fácil extender esta técnica a casi cualquier tipo de información pública disponible en la Web.
Plan de la Araña El programa usará el nombre de un usuario de LiveJournal y descargará su lista de amigos. Entonces el programa recuperará una lista de publicaciones
Ruby
para el usuario y para todos sus amigos y descargará todas estas. Entonces analizará gramaticalmente los archivos HTML e imprimirá los comentarios hechos por nuestro usuario objeto en STDOUT, separando cada comentario por tres guiones alineados.
Las herramientas que tenemos ¿De qué herramientas disponemos? La primera es la librería Ruby net/http que viene con la distribución Ruby. La librería Ruby net/http nos permite acceder al protocolo HTTP a través de un interfaz orientado a objetos. Para descargar páginas Web primero debemos hacer una conexión con el servidor llamando el método Net::HTTP.new, que recoge la
Listado 1: parse_user.rb 01 require 'net/http' 02 h = Net::HTTP.new('www.livejournal .com', 80) 03 friend_arr = [] 04 person = ARGV[0] 05 resp, data =h.get("http://www.livejournal .com/userinfo.bml?user=#{perso n}",nil) 06 print "Lista amistades de #{person}\n" 07 data.split("\n").each do|line| 08 line.split(",").each do |token| 09 if token =~/userinfo.bml\?user=([^'&]*) \'/friend_arr.push $1 10 print "#$1\n" 11 end 12 end 13 end 14 print "\n" 15 friend_arr.each do |friend| 16 print "Analizando bitácora de #{friend} en busca de comentarios de #{person}...\n"; 17 f =File.new("#{person}_#{friend} .txt","w") 18 f.puts `ruby parse_journal.rb #{friend}#{person}` 19 f.close 20 end
dirección del servidor y un número de puerto y devuelve un objeto Net::HTTP. Llegados a este punto, llamamos al método get en el objeto para recuperar una página. El método get nos devuelve una matriz: el primer elemento de la matriz es un objeto HTTPResponse y el segundo es una cadena que contiene el cuerpo del resultado. En otras palabras, los contenidos de la página solicitada. El objeto HTTPResponsecontiene las cabeceras y el cuerpo del resultado. Ambos métodos se incluyen por motivos de compatibilidad y por simplicidad, puesto que habitualmente solo estamos interesados en los datos de una respuesta y no en el estado del código HTTP. Otras potentes herramientas que podemos usar son los métodos split y each. El método split coge una cadena y la divide en una matriz delimitada o por una expresión regular o por una cadena: es similar a la función split en Perl o PHP. Observaremos no obstante que puede ser encadenado con otros métodos como ocurre en nuestro ejemplo. El método each recoge la matriz y pasa cada elemento a un bloque de código. A propósito, la sintaxis del bloque es genérica y podemos usar esta sintaxis en nuestras propias funciones. El bloque de código tiene la palabra clave do al principio y end al final y los parámetros están rodeados por símbolos de tubería. El método each es muy similar al método foreach de otros lenguajes, si bien no es una estructura del lenguajes como en la mayoría, sino un método con el cual podemos construir fácilmente nuestro propio iterador.
Arrastrándonos por LiveJournal Tenemos dos scripts involucrados en el análisis gramatical de un portal de noticias. El primero, parse_user.rb (ver el Listado 1), recoge un argumento de la línea de comandos (el usuario que deseamos monitorizar). Entonces descarga la lista de personas que el usuario ha marcado como amigos, en teoría con los que es más probable que comente sus blogs. Si lo deseamos, podemos buscar los amigos de esos amigos y los amigos de los amigos de sus amigos y así sucesivamente. Esto llama repetidamente el segundo código, parse_journal.rb (ver Listado 2), una vez por cada amigo.
DESARROLLO
El segundo código recoge dos argumentos: Qué blog analizar gramaticalmente y qué comentarios de usuario estamos buscando. El segundo código también puede ser llamado por si mismo si solo deseamos buscar el cuaderno de bitácora de un usuario concreto para comentarlo con otros usuarios. El primer script recupera una lista de amigos descargando la página de “información de usuarios” del LiveJournal “de ese usuario”. La página de información del usuario es una página Web que contiene el perfil del usuario y, muy importante para nosotros, un enlace a la página de información del usuario de cada una de sus amigos. El script busca esos enlaces, coge los nombres de usuario de cada uno de los amigos y añade el amigo a la matriz. Cuando acaba con esto, llama al segundo script para cada uno de esos amigos, indicando al segundo script que recupere cada comentario hecho por el usuario objetivo en el blog de su amigo. También recoge el resultado del segundo código y lo escribe en un archivo para facilitar el acceso. El segundo script, primero descarga el alimentador de noticias RSS para el usuario. Como conveniencia, este contiene, entre otras cosas, un enlace a cada uno de las publicaciones del usuario. Éste recupera todos estos enlaces y los coloca en una matriz. Es entonces cuando, interaccionando con la matriz, recoge cada página e interacciona con cada línea de cada página. El procesamiento de líneas se separa en dos partes. Primero, el script espera hasta que encuentra una publicación realizada por el usuario adecuado, señalándolo con un enlace para usar su página de información. A partir de este momento, la siguiente línea que parezca un mensaje, se supone que es un comentario de ese usuario. La línea se detecta, luego el comentario y el enlace se extraen. El comentario se transforma para que sea más amigable. La secuencia <br/> se transforma en caracteres de nueva línea y se despoja el texto de las etiquetas HTML y otra información no importante. Después se imprime el comentario y el script comienza a buscar otros comentarios realizados por el usuario objetivo.
www.linux-magazine.es
Número 04
33
Ruby
Como podemos imaginar, todo este proceso es extremadamente sensible al formato exacto de la página e ilustra uno de los problemas básicos de este proceso. Debido a que el formato de los datos puede ser, y de hecho es, cambiante, ocasionalmente tenemos que actualizar nuestra araña para que siga funcionando. En este caso, cambios al formato de LiveJournal pueden requerir cambios a la araña para que pueda procesar un blog adecuadamente. No obstante debemos saber que la araña es generalmente fácil de modificar cuando se producen cambios.
Cuando las cosas van mal Pueden ocurrir errores en una serie de lugares mientras se desarrolla y usa una araña. No obstante, es habitual que los errores ocurran en dos lugares: uno es el código de la red, y el otro es el código de rascar la pantalla. El código de la red puede tener problemas debido a que Internet es inherentemente poco fiable. Las páginas se mueven, las máquinas se caen, hay demandas a las que se les
acaba el tiempo u otros problemas. Con el objeto de atajar estos problemas, es importante la ayuda de la información que nos ofrece el objeto HTTPResponse con la función Net:HTTP.get. Debido a que nuestro ejemplo sólo recupera un número limitado de grupos de URLs, errores como páginas movidas son menos probables. Si aún así ocurrieran, es muy probable que señalarían a un cambio en la jerarquía de LiveJournal y requerirían una reescritura. No obstante, para otras muchas arañas, esto no es cierto y sería correcto hacer planes de contingencias. Por ejemplo, ¿qué debería hacer nuestra araña si el servidor retorna un error del tipo HTTPRequestTime-Out?. Puede que queramos intentar la descarga de nuevo. Como alternativa puede que queramos ignorar el error y ejecutar cualquier otra acción. El código de rascar la pantalla causa problemas frecuentemente tanto durante el desarrollo como después del desarrollo. Durante el desarrollo es recomendable descargar una copia de la página que intentamos analizar gramati-
Listado 2: parse_journal.rb 01 require 'net/http' 02 h = Net::HTTP.new('www.livejournal .com', 80) 03 url_array = [] 04 person = ARGV[0] 05 watch_for = ARGV[1] 06 resp, data =h.get("http://www.livejournal .com/users/#{person}/data/rss" ,nil) 07 data.split("\n").each do|line| 08 if line =~/<comments>http:\/\/www.live journal.com([^<]*)<\/comments> / 09 url_array.push $1 10 end 11 end 12 url_array.each { |url| 13 response, data = h.get(url,nil) 14 logging = false 15 data.split("\n").each do |line| 16 if line =~ /<a [^>]*href='http:\/\/www.livejour nal.com\/users\/([^"]*)\/'><b>/
34
Número 04
17 18 19 20 21 22 23 24
if $1 ==watch_for print "\n---\n" logging= true else logging = false end end if line =~ /<a href='(http:\/\/www.livejourna l.com\/users\/[^\/]*\/[^']*thr ead[^']*)'>.*<\/td><\/tr><tr>< td>(.*)<p style='margin:/ and logging 25 url = $1 26 comment = $2 27 comment.gsub!('<br />',"\n") 28 comment.gsub!(/<\/*[^>]*>/,'') 29 comment.gsub!('(Reply to this) (Parent)','') 30 print"#{url}\n#{comment}" 31 logging=false 32 end 33 end 34 }
www.linux-magazine.es
calmente y trabajar sobre ésta de forma local en nuestra máquina. Esto incrementa la velocidad de desarrollo y nos permite centrarnos en recuperar las piezas apropiadas del código en las que estamos interesados. También es recomendable usar el análisis gramatical menos restrictivo posible, incluyendo la menor información posible en nuestras expresiones regulares y aún estar seguros de obtener la información que buscamos. De esta forma nuestro código se romperá en muchas menos ocasiones debido a cambios en el sitio objetivo.
Conclusión Las arañas son poderosas y Ruby es un gran lenguaje para escribirlas. Ni que decir tiene, que “un gran poder entraña una gran responsabilidad”, y han de utilizarse con cautela. Historias de arañas que se han comportado de forma incorrecta sobrecargando servidores Web con demandas son comunes. Deberíamos asegurarnos de que nuestra araña no causa problemas a los administradores. En algunos casos, los administradores publican instrucciones respecto a como deben utilizar los servicios automáticos su sitio. Si es así deberíamos preocuparnos de seguirlas. Nos proveen con un servicio gratuito y no es obligatorio ■ que lo sigan haciendo.
RECURSOS [1] Documentación Ruby http://www. ruby-doc.org/ [2] Programming Ruby (Programando Ruby).un libro electrónico gratuito de Ruby http://www.rubycentral.com/book/ [3] Un tutorial bien documentado de arañas Web http://www.searchlores.org/ phpregexspider.htm
EL AUTOR
DESARROLLO
David Berube es un desarrollador de software, escritor y orador autónomo. Típicamente desarrolla usando una mezcla de tecnologías de cliente de Microsoft y servidor de código libre, como Ruby. Su artículo,“Databases and Dynamic Ruby Classes”(Bases de datos y clases dinámicas Ruby) apareció en Dr. Dobb Journal de diciembre de 2004. Podemos leer más sobre este artículo en http://berubeconsulting.com/.
Perl
DESARROLLO
Un guión Perl que recoge automáticamente titulares de noticias.
Reportero a domicilio En vez de visitar periódicamente sitios de noticias para estar al día de los últimos reportajes, mucha gente prefiere dejar este trabajo a un agregador de noticias. El agregador avisará cuando aparezcan noticias. Si un sitio web no tiene un alimentador RSS, un nuevo modulo Perl simplificará la tarea de programar un alimentador RSS para uso personal. POR MICHAEL SCHILLI
E
l gran volumen de información en Internet implica que nadie puede leerlo todo. Visitar un par de docenas de sitios web al día para conseguir las últimas noticias es tal perdida de tiempo que se necesitaría aparcar el trabajo para conseguirlo. Esto animó a muchos sitios de noticias a introducir los alimentadores de RSS con los titulares y los enlaces a los artículos en un formato legible por la máquina. RSS es la abreviatura de RDF Site Summary (Sumario RDF del Sitio) donde RDF significa Resource Description Framework (Esquema de descripción de recursos). Los archivos RSS utilizan XML, un formato que los llamados agregadores de noticias pueden analizar fácilmente. Los artícu-
los que aún no han leído los usuarios se presentan como titulares seleccionables. Este proceso de sindicación, es decir, recopilar y presentar mensajes que están disponibles en otra localización, ayuda a manejar la avalancha de información y ahorra un montón de tiempo. Sitios populares como Slashdot ofrecen ahora alimentadores RSS, con agregadores como Amphetadesk ([2] y Figura 1) que recogen a noticias a intervalos regulares si se ha suscrito al servicio, es decir, si se pulsó el botón de Suscribir.
Construyase uno Lamentablemente, no todos los sitios de noticias disponen de alimentadores RSS. ¿Realmente piensan que los usua-
rios se detendrán todos los días para rebuscar entre la información que proporcionan? El módulo RssMaker que veremos en este artículo ofrece una función que puede ayudar a generar un archivo RSS a partir de una página de portada con titulares y URL’s con aproximadamente 10 líneas de código Perl. Si después se configura una tarea cron para generar el archivo RSS una vez al día, se podrá pasar el archivo al agregador de noticias, con el que se obtiene como resultado una aproximación a la amplia cobertura de noticias que se anunciaba para el siglo XXI. Toda lo que hay que hacer es una llamada a la función make dentro del módulo Perl RssMaker, mostrado en el
www.linux-magazine.es
Número 04
35
DESARROLLO
Perl
Figura 1:El alimentador de noticias books.perl.org en Amphetadesk.
Listado 1, RssMaker.pm, que espera una URL que apunte a una página web de noticias. La función coge la Web, analiza su código HTML y después extrae los enlaces insertados y muestra el texto. Por cada instancia que encuentre, llama a un filtro de la función definible por el usuario, le pasa el enlace y su descripción textual y deja que decida. Si la función de filtro devuelve el valor true, significa que el enlace es un titular y se añade al resumen RSS. Para terminar, make() envía la salida XML al archivo indicado por el parámetro output.
Dos formatos de fecha Para convertir la marca temporal (time stamp) HTTP del documento web al formato ISO-8601 que necesita RSS, la función str2time del modulo HTTP::Date, primero repasa la cadena de fecha (por ejemplo Tue, 26 Oct 2004 05:10:08 GMT) y devuelve el la hora y fecha en segundos Unix. La función from_epoch() del modulo DateTime toma ese valor y genera un nuevo objeto DateTime, que se pasa al formato ISO8601 entre dobles comillas (2004-10-26T05:10:08).
Codificando XML espera texto codificado en UTF-8. UTF-8 es compatible con el código
36
Número 04
Figura 2:El validador RSS en feeds.archive.org.
ASCII normal, mientras se evite la mitad superior de los 256 caracteres de la tabla. Esto significa que los caracteres especiales utilizados en algunos idiomas europeos pueden ser problemáticos. La ñ del español, sin ir más lejos. No será compatible con UTF-8 cualquier carácter de la mitad superior que se use con ISO-8859-1. RssMaker evita este problema permitiendo a los desarrolladores indicar que codificación se debe usar en el documento RSS resultante. Si el sitio web en cuestión tiene codificación HTML del tipo &uuml para el carácter ü, HTML::TreeBuilder convierte el texto extraído del enlace a ISO-8859-1. El código ASCII de este carácter es 252. Sin embargo, se puede causar un problema si en el archivo RSS se ha especificado <?xml version=1.0U encoding=utf-8?>
Y las ü están codificadas como ASCII 252. Los desarrolladores pueden especificar encoding => iso-8859-1 para conseguir que la función escriba el siguiente documento XML: <?xml version=1.0 encoding=iso-8859-1?>
www.linux-magazine.es
Y 252 codificado como ü será correctamente interpretado por el agregador de noticias.
Alimentación RSS Pondremos a RssMaker a prueba, creando un alimentador RSS de la gran página web http://books.perl.org/. Este sitio destaca y examina los libros sobre Perl y sería muy útil saber cuando se han agregado nuevos títulos. Como esto ocurre de tarde en tarde, seria estupendo tener un sistema de alerta. bpo2rss enseña como llevar a cabo esta tarea rápidamente. La función make del modulo RssMaker hace el trabajo pesado. El parámetro url especifica la URL para la página web de books.perl.org que contiene los enlaces a los libros analizados recientemente. output especifica el nombre de archivo RSS resultante. title es el titulo del alimentador que más tarde se mostrará en el agregador de noticias. RssMaker llama a la anónima subrutina filter una vez por cada enlace. Cada vez que hace eso RssMaker pasa dos parámetros: La URL para el enlace y el texto correspondiente. La subrutina utiliza esta información para comprobar si el enlace es un titular que se debe añadir al alimentador. Si el filtro devuelve un 1, el enlace será añadido al alimentador; si el filtro devuelve un 0, el enlace no se añade. En el caso del sitio de books.perl.org, bpo2rss
Perl
simplemente comprueba si la URL corresponde con el patrón /books/n donde n es un valor numérico. Esa parece ser la convención de books.perl.org para enlazar las reseñas de los libros. Eso es todo lo que hace falta para terminar el alimentador RSS. Es incluso posible modificar el enlace extraído o su descripción textual antes de
que se agregue al archivo del alimentador RSS, usando un truco simple: Si le pasa un parámetro a una subrutina en Perl, este le da permisos de escritura y de lectura. Fijar $_[0] a un valor diferente en la función modificará el parámetro pasado por el programa principal. Cuando make llama a filter($url, $text) y filter modifica $_[0] ó $_[1], entonces $url o $text habrá
DESARROLLO
cambiado en el bpo2rss, dando por resultado entradas modificadas en el archivo saliente del alimentador RSS.
Agregadores Servicios como Bloglines (http://www. bloglines.com/) ejecutan aplicaciones web que permite a los usuarios registrados suscribirse a los alimentadores y
Listado 1:RssMaker.pm 001
002 003 004 005 006
007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041
############################# ## # RssMaker -- Genera un alimentador # RSS de una página web # Mike Schilli, 2004 # (m@perlmeister.com) ############################# ###### package RssMaker; use warnings; use strict; use LWP::UserAgent; use HTTP::Request::Common; use XML::RSS; use HTML::Entities qw(decode_entities); use URI::URL; use HTTP::Date; use DateTime; use HTML::TreeBuilder; use Log::Log4perl qw(:easy); ############################# sub make { ############################# my (%o) = @_; $o{url} || LOGDIE "url ausente"; $o{title} || LOGDIE "titulo ausente"; $o{output} ||= "out.rdf"; $o{filter} ||= sub { 1 }; $o{encoding} ||= 'utf-8'; my $ua = LWP::UserAgent->new(); INFO "Sacando $o{url}"; my $resp = $ua->request( GET $o{url} ); LOGDIE "Error sacando ", "$o{url}" if $resp->is_error(); my $http_time =
042 043 044 045 046
$resp->header( 'last-modified'); $http_time ||= time2str( time() ); INFO "Ultima modificación: ",
047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084
$http_time; my $mtime = str2time($http_time); my $isotime = DateTime->from_epoch( epoch => $mtime); DEBUG "Ultima modificación:", $isotime; my $rss = XML::RSS->new( encoding => $o{encoding} ); $rss->channel( title => $o{title}, link => $o{url}, dc => { date => $isotime . "Z" }, ); foreach(exlinks( $resp->content(), $o{url})) { my ($lurl, $text) = @$_; $text = decode_entities($text); if ($o{filter}->( $lurl, $text)) { INFO "Adding rss ", "entry: $text $lurl"; $rss->add_item( title => $text, link => $lurl); } } INFO "Guardando la salida en ",
085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
"$o{output}"; $rss->save( $o{output} ) or LOGDIE "Cannot write", " to", " $o{output}"; } ############################# sub exlinks { ############################# my ($html, $base_url) = @_; my @links = (); my $tree = HTML::TreeBuilder->new(); $tree->parse($html) or return (); for(@{$tree->extract_links( 'a')}) { my ($link, $element, $attr, $tag) = @$_; next unless $attr eq "href"; my $uri = URI->new_abs( $link, $base_url ); next unless length $element ->as_trimmed_text(); push @links, [ URI->new_abs( $link, $base_url ), $element ->as_trimmed_text() ]; } return @links; } 1;
www.linux-magazine.es
Número 04
37
Perl
Figura 3:Un alimentador de noticias en Bloglines.
observar sobre la marcha las actualizaciones de los mismos. Como herramienta local aconsejo Amphetadesk [2], un guión Perl que ejecuta un servidor HTTP en la máquina local y muestra un resumen de titulares en el navegador (Véase la Figura 1). Se puede validar el archivo en línea, si se desea comprobar que el archivo RSS cumple las estrictas reglas del estándar con: http://feeds.archive.org/U validator/
Donde hay un servicio gratuito y en tiempo real, que ofrece un sello de
aprobación si el alimentador pasa la prueba correctamente (Véase la Figura 2). En RssMaker.pm utiliza Log4perl en modo easy para la depuración, LWP::UserAgent para extraer las URLs y XML:RSS para crear el archivo RSS. Las secuencias de escape HTML tales como &uuml; las decodifica decode_entities de HTML::Entities. La función exlinks en RssMaker.pm facilita la extracción de enlaces utilizando HTML::TreeBuilder. as_trimmed_text() busca el texto en la etiquetas de enlace <A> del código HTML.
Tiempo atómico Parece que en el futuro próximo, el estándar RSS será reemplazado por un nuevo estándar llamado Atom. Los comités habituales están ahora trabajando en este asunto. Si los clientes Atom listados en [6] alcanzan una masa critica, probablemente CPAN tenga un modulo AtomMaker con una funcionalidad similar a RssMaker. Entonces este modulo usará el modulo XML::Atom que ya está disponible en CPAN. Por el
Listado 2:bpo2rss 01 #!/usr/bin/perl 02 ############################# 03 # bpo2rss -- books.perl.org 04 # generador de alimentador RSS 05 # Mike Schilli, 2004 06 # (m@perlmeister.com) 07 ############################# 08 use warnings; 09 use strict; 10 11 use RssMaker; 12 use Log::Log4perl qw(:easy); 13 14 Log::Log4perl->easy_init( 15 $INFO); 16
38
Número 04
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
www.linux-magazine.es
my $url = 'http://books.perl.org/'; RssMaker::make( url => $url, title => "books.perl.org", filter => sub { my ( $link, $text ) = @_; return 1 if $link =~ m#/book/\d+#; return 0; }, output => "bpo.rss", );
momento muchos clientes populares no dan soporte al formato Atom y algunos de los clientes listados son demasiado inestables. En [3] se ofrece una introducción a Atom y hay un tutorial asequible en [4].
Instalación Todos los módulos que necesita RssMaker.pm están disponibles desde CPAN. Se debe configurar cualquier guión nivelador tal como bpo2rss para que se ejecute en su sistema una vez al día como una tarea cron. Los archivos RSS obtenidos sólo se deben publicar en la Intranet local, puesto que los archivos RSS publicados en Internet se podrían interpretar como enlazamiento profundo y pueden originar problemas legales. Durante la fase de eliminación de errores, es conveniente establecer la configuración Log4perl del guión a $DEBUG. La ventaja de fijar Log4perl a $DEBUG es que $DEBUG permitirá que se supervisen actividades tales como sacar, extracción de enlaces y la generación del alimentador RSS en la pantalla. En un ambiente de producción, se puede utilizar el ajuste $ERROR en su lugar para quitar cualquier salida indeseada y parar el bombardeo de mensajes de email ■ desde la tarea cron.
RECURSOS [1] Listados de este artículo: http://www. linux-magazine.com/Magazine/ Downloads/51/Perl/ [2] Amphetadesk: http://www.disobey.com/ amphetadesk/ [3] Michael Fitzgerald, XML Hacks, OReilly [4] Reuven Lerner, Aggregating with Atom, Linux-Journal 11/2004, p.18 y siguientes. [5] Ben Hammersley, Content Syndication with RSS, OReilly 2003. [6] Listado de aplicaciones que dan soporte al formato Atom: http://atomenabled. org/everyone/atomenabled/
EL AUTOR
DESARROLLO
Michael Schilli trabaja como desarrollador de software en Yahoo!, Sunnyvale, California. Es el autor de “Perl Power” de la editorial Addison-Wesley y se le puede contactar en mschilli@perlmeister.com. Su página está en http://perlmeister. com.
Php
DESARROLLO
Creación de un Módulo PHPNuke
Cocina Nuklear Con PHPNuke se puede crear una obra maestra o un desastre total. Todo depende de las herramientas que se usen y de la destreza que se tenga con ellas. Incluso con el método y la herramienta más sencilla, PHPNuke permite crear fácilmente sitios webs dinámicos que pueden acceder tanto a datos en formato texto como a bases de datos empresariales. POR JAMES MOHR
I
ncluso antes de finalizar la configuración de su sitio web, se habrá dado cuenta de la necesidad de desarrollar sus propios módulos PHP. Hay varias formas sencillas de crear los módulos sin tener que escribir mucho código PHP. Sin embargo, si se desea obtener módulos con un poco más de funcionalidad y complejidad, habrá que programar algo más.
Reuniendo los Ingredientes Adecuados Si se sabe Perl, pasarse a PHP es bastante fácil (esto también es aplicable a los programadores de C y lenguajes similares). En vez de convertir este artículo en un tutorial de PHP, se supondrá que se tiene ya unas nociones básicas de Perl, C o algún lenguaje similar ya que el código que vamos a comentar es muy simple. Además supondremos que se tiene también unas nociones básicas de SQL. No vamos a construir ninguna consulta compleja, pero se debe conocer al menos la sintaxis básica o cómo se construyen las consultas. Algo que aún no hemos comentado es cómo vamos a editar el código. Aunque se puede usar cualquier editor que guarde el fichero en formato ASCII (como vi), seguramente se preferirá uno mejor y existen una gran variedad de herramientas que le proporcionarán la ayuda necesaria en la tarea de programación. Para todos mis desarrollos web, ya sea HTML, Perl o PHP, uso Quanta Plus (http://quanta.sourceforge.net/). De hecho, Quanta Plus está diseñado para desarrollar en multitud de lenguajes de programación diferentes. Además Quanta es bastante configurable. Entre otras cosas, Quanta Plus
Figura 1: El entorno de desarrollo Web Quanta Plus.
permite crear las llamadas acciones. Estas pueden ser cualquier cosa, desde etiquetas especiales y bloques de texto, a salida de programas que se insertan directamente dentro del código. Incluso se pueden añadir diversas barras de herramientas al sistema, que pueden incluir tanto acciones existentes como acciones propias. Las barras de herramientas pueden exportarse e importarse, permitiendo que cualquier persona que trabaje en el mismo proyecto pueda tener las mismas herramientas.
Inicio Antes de empezar a escribir un módulo, debería establecer los criterios. Como los principios básicos a aplicar, tal y como
se hace en cualquier lenguaje de programación o proyecto, como usar variables auto-explicativas y comentar el código (algo que desafortunadamente no tiene el código de PHPNuke). A menos que se especifique explícitamente otro fichero, modules.php automáticamente cargará el fichero index.php. Un fichero a medida podría ser útil en la mayoría de los casos (como en los módulos muy complejos), pero por ahora, nos conformaremos con el que viene predeterminado. Otros ficheros, como las imágenes, se incluyen usando el fichero modules.php. Así pues, las rutas tienen que ser definidas relativas a la localización de modules.php en vez de la de los módu-
www.linux-magazine.es
Número 04
39
DESARROLLO
Php
los. Normalmente, modules.php reside en el directorio raíz del servidor, así que se podrá usar una ruta absoluta (por ejemplo, /image). Incluso si se colocan las imágenes en el directorio del módulo, se puede seguir usando una ruta absoluta (por ejemplo, /modules/nombredelmodulo/images).
Acceso Bases de Datos SQL Una ventaja de PHPNuke es su capa de abstracción de datos, que permite acceder a los datos de cualquier motor SQL sin la necesidad de escribir código específico para esa base de datos. Esta característica permite usar el mismo código independientemente de la base de datos que se esté usando. Las tablas dentro de la base de datos de Nuke siempre tienen un prefijo que se define en el fichero config.php. El prefijo por defecto es nuke, pero he llegado a usar otros prefijos. De hecho, se tienen que usar distintos prefijos si se tienen múltiples instancias de Nuke en una única máquina. La tabla por defecto que contiene todos los datos de los usuarios es nuke_users. Un punto de conexión es donde se colocan datos que no pertenecen a la base de datos estándar de PHPNuke. Algunas personas le dirán que las incluya en la misma base de datos como la base de datos por defecto de PHPNuke. Esto en algunos casos permite que la administración sea algo menos compleja. Otro grupo de personas (entre las que yo me incluyo) dice que los datos propios deben estar separados de los de PHPNuke y por ello se ha de crear una base de datos separada. Tengo unas 60 tablas e incluirlas con las 90 o más que
Funciones PHP Aquí aparecen algunas funciones PHP que se deberían mirar cuando se esté desarrollando un filtro para la entrada que se ha de mandar a la base de datos: • addslashes • stripslashes • htmlentities • htmlspecialchars • striphtml Para más detalles consúltese: http://www. php.net/manual/en/.
40
Número 04
tiene Nuke sería muy lioso. Dividiendo los datos de esta forma, se evitan problemas potenciales si se necesita actualizar PHPNuke o mover los datos a otra base de datos (por ejemplo, de MySQL a Oracle). La desventaja es que hay que realizar personalmente la conexión a la base de datos. Si los datos están almacenados en las tablas de Nuke, entonces, la conexión ya está realizada desde los ficheros de PHPNuke. Si se tienen unas pocas tablas podría valer la pena ya que habría que programar menos. Si se hace esto, mi recomendación es que se use un prefijo diferente del que se usa por defecto. Recuerde que, cuando se instala PHPNuke se define el prefijo para las tablas de PHPNuke. Por defecto es “nuke”. Así que, yo definiría mis tablas que no son de Nuke con el prefijo “jimmo”. Mi tabla de recetas sería entonces jimmo_recipes. Para evitar convertir este artículo en uno de administración de bases de datos, abordaremos el caso más sencillo donde todos los datos están en una misma tabla. Imaginemos una tabla de recetas con campos como “nombre”, “ingredientes”, etc. Sorprendentemente, podemos acceder a una base de datos con tan sólo unas simples líneas. Por ejemplo, si queremos extraer el nombre de nuestra primera receta, podríamos poner algo como esto: $sql_a = "SELECT name U FROM jimmo_recipes U WHERE recipe_id='1' "; $result_a = $db-> U sql_query($sql_a); $row_a = $db-> U sql_fetchrow($result_a); print "Nombre Receta: U ".$row_a[name]."\n";
En la primera línea de nuestro ejemplo, se define la consulta que vamos realizar. Esta se utiliza en la segunda línea para realizar la consulta. Los resultados de la consulta realmente no son devueltos. Si no que se devuelve un puntero. En la siguiente línea, usamos el puntero para extraer una fila (con todos los campos especificados), que es devuelta como un array $row_a. En la última línea, se imprime el contenido de un único elemento del array.
www.linux-magazine.es
En este caso, el campo nombre. Nótese cómo usamos directamente el nombre del campo como índice del array y no algo como $row_a[0]. Si cambiamos la consulta original a algo como SELECT name, ingredients,..., entonces también podríamos usar algo como $row_a[ingredients]. Para poder acceder a todas las filas, se hace la siguiente modificación: while ( $row_a = $db-> U sql_fetchrow($result_a) ) { print "Nombre Receta: U ".$row_a[name]."\n"; }
Como en otros lenguajes, la sentencia while repite el bloque especificado mientras la condición sea verdad. En este caso, la condición que estamos comprobando es si somos capaces o no de extraer una nueva fila de la base de datos. Cada vez que se ejecuta el bucle se imprime el nombre de la receta.
Creación de una Aplicación Con unos cuantos cambios, se puede transformar la lista de nombres en hiperenlaces, que dirigirán al usuario a los detalles de la respectiva receta. Hay varias formas de hacer esto. Creo que la más simple de ellas es incluir toda la funcionalidad dentro de un mismo fichero (por ejemplo, index.php), como es el caso en la mayoría de los módulos por defecto (al menos los más sencillos). Para hacerlo englobamos el código que hemos escrito dentro de una función. Como las funciones de otros lenguajes de programación, una función en PHP es simplemente un bloque de código separado que puede ser invocado desde otros lugares, se le pueden pasar valores y devolverlos. Así que podemos tener una función que cree una lista de recetas con algo como: function list() { ... cuerpo de función ... }
También hará falta una segunda función para mostrar los detalles de las recetas. Para saber que receta tenemos que mostrar habrá que pasarle el identificador de la misma (nombre de la receta) a la función. Como podría ser:
Php
function show_recipe($recid) { ... cuerpo de función ... }
Ahora, dentro de la función show_recipe, se puede usar simplemente la variable $recid donde se necesite, así como incluirla dentro de la consulta SQL. Los detalles de esta función aparecerán en breve. Cuando se pasan variables como ésta, me gusta usar identificadores únicos IDs en vez de texto. Es bastante fácil añadirlas automáticamente a la base de datos y recuperarlas después.
Añadiendo la Sentencia Switch A continuación, tenemos que usar la sentencia switch. Como su nombre indica, se utiliza para conmutar el comportamiento del programa. En este caso, se conmuta según el valor de una variable de la cadena de consulta (aparece en la URL) que indica qué operación debe realizarse. Haciéndolo podríamos tener algo parecido a esto: switch ($op) { case "show": show_recipe($recid); break; default: list(); break; }
Dentro del bloque switch, la sentencia case dirige el flujo según el valor de la variable dada (en este caso $op). Si la variable $op es igual a “show”, entonces la variable $recid se pasa a la función show_recipe. Para posteriormente usarse dentro de la función show_recipe. Al final se puede ver un bloque etiquetado con default. Este bloque se usa si el valor de $op no coincide con ningún otro (incluso si estuviera vacío, que es a menudo el caso por defecto). Al final de cada bloque, se tiene la sentencia break que le indica al programa que se salga del bloque switch. Si se desea, se puede añadir cualquier número de sentencias case que puedan llamar a varias funciones. Además se le pueden pasar valores a las funciones, como ocurre en la mayoría de los lenguajes.
Dentro del cuerpo de la función show_recipe, el código que insertamos es muy similar al que ha aparecido en el primer ejemplo anterior. Tan sólo la consulta SQL es diferente: $sql_a = "SELECT U name,ingredients,instructions U FROM recipes U where recipe_id =".$recid;
Aquí, se obtienen los valores de name, ingredients e instructions de la única fila de la tabla recipes que coincide con recipe_id. Luego se carga dicha fila en un array, como se explicó antes y se muestra.
Mostrar los Campos Para mostrar los campos se hace, básicamente, como se ha visto anteriormente. Sin embargo, ahora queremos darle un poco de formato. Como la salida va a ser interpretada por un navegador de Internet, se puede añadir código HTML en el texto que el programa PHP genera y formatearlo tal y como se desee. El código podría ser como el siguiente: print "<H1>".$row_a[name].U "</H1>\n" print "<H2>Ingredientes</H2>\n" print $row_a[ingredients]."\n"; print "<H2>instrucciones</H2>\n" print $row_a[instructions]."\n";
En este punto se necesita volver un momento atrás. Anteriormente se creó una lista de nombres de recetas, pero no teníamos forma de crear los enlaces para acceder a ellas. Para hacerlo, simplemente hay que cambiar un poco la sentencia print, que quedaría de la siguiente forma: print "<a href=/modules.php?U name=Recipes&U op=show&U recid=".$row_a[recipe_id].">". U $row_a[name]."</A><BR>\n";
Como se puede ver, se llama a modules.php como normalmente se haría y se le pasaría el nombre del módulo (“Recipes” en este caso). Si paramos aquí, no se establecería otra variable; la sentencia switch entraría en el caso por defecto y se mostraría la lista.
DESARROLLO
En este caso, sin embargo, estamos estableciendo op a “show”, así el programa entrará en la función show_recipe. Nótese que recipe_id está extrayéndose de la base de datos, junto con el nombre de la receta y estos valores simplemente se insertan en el lugar adecuado. Se podría formatear mucho más tanto la lista como la salida. Podríamos crear también una consulta que ordenase las recetas por los nombres de las mismas. Sin embargo, esto entra en más detalle de lo que podemos permitirnos aquí. Esta sencilla forma de acceder a una base de datos SQL no está limitada a la lectura de datos. Ahora se podría dar un paso más e implementar un formulario que insertara datos, por poner un ejemplo. Una de las cosas maravillosas de PHP es que no hay que procesar los datos insertados por los formularios. PHP lo hace por nosotros. Como con las variables en la cadena de consulta que se vio anteriormente (por ejemplo, recipe_id) las variables de formularios están inmediatamente disponibles en la página que se llama por la acción del formulario. Esto se puede combinar para crear una consulta SQL (usando el comando INSERT, desde luego), que se pasaría a la función $db->sql_query tal y como se hizo anteriormente con SELECT. Se puede ir más allá y usar el comando UPDATE para realizar cambios en las filas existentes de la base de datos.
Acceso Seguro a Bases de Datos En este punto debemos hacer un alto y hablar sobre la seguridad cuando se trabaje con bases de datos. Se podría pensar que si los únicos datos con los que se trabajan son las recetas, entonces no hay que preocuparse mucho de la seguridad. Pero con un sistema inseguro, alguien podría hacer cambios o borrar los datos. Pongámonos en un caso aún peor, si sus propios datos están en la misma base de datos que las tablas de PHPNuke, un usuario que tenga acceso a sus datos, tendría fácil acceso a los datos de PHPNuke. Tenga en cuanta que una vez que la conexión esté establecida, el usuario no necesitará ninguna autorización extra para cambiar los datos de las tablas de
www.linux-magazine.es
Número 04
41
DESARROLLO
Php
PHPNuke una vez que tenga acceso a sus tablas. Incluso si separa sus datos de las tablas de PHPNuke, los mismos principios son aplicables. No querrá que la gente tenga acceso a sus datos. Hay diversas cosas que puede hacer para incrementar la seguridad. La mayoría de las bases de datos tienen la posibilidad de restringir el acceso, tanto a la base de datos como a las tablas. Se puede crear un usuario (en la base de datos) que sólo tenga acceso a sus datos, pero no a las tablas de PHPNuke. Sin embargo, esto puede volverse complicado y confuso muy pronto. Creo que esto es una razón más para dividir los datos en diferentes bases de datos, a pesar del esfuerzo que pueda representar en la programación debido a cada acceso. Cuando los datos se reparten entre diferentes bases de datos, tan sólo tiene que preocuparse de sus propios datos. Se realiza la conexión a su propia base de datos y se deja que PHPNuke maneje las tablas de PHPNuke y los datos. Esto hace que sea improbable que vaya a dar acceso de forma inadvertida a las tablas de PHPNuke. Sin embargo, y esto es en mayúsculas, la conexión a las tablas de PHPNuke están aun abiertas cuando sus ficheros se carguen. Así que debe de asegurarse de que accede a sus tablas y no a las de PHPNuke.
SQL Injection Otra cosa de la que hay que hablar es algo llamado “SQL injection”. Esto es un truco usado por los crackers para conseguir que una consulta SQL haga algo más de lo que iba a hacer originalmente. Por ejemplo, si tiene un módulo que muestra el nombre de una receta introducida por el usuario, se tendría una consulta que devolviera todos los campos y podría ser como sigue: select * from recipes where U recipename = '$userinput';
Si el usuario es lo bastante listo, él o ella puede crear un “recipename” que es en realidad una consulta SQL adicional y que es entonces ejecutada en el mismo contexto.
42
Número 04
De este modo, nunca se debería confiar en los datos pasados por la cadena de consulta de la URL. Esto es especialmente cierto si los valores en la consulta provienen de la lectura de un formulario que son introducidos por los usuarios, como en este ejemplo. Incluso si el usuario no conoce cómo se crea la consulta, es aún posible introducir valores para cambiarla. La manera más fácil es comprobar la variable $userinput en busca de cadenas que no pertenezcan a la consulta, como las comillas e incluso la palabra “union”. Incluso se podría ir más lejos y escribir una función que realizara una comprobación a fondo. Esta podría incluir diferentes funciones PHP que convirtieran el texto de entrada en valores “seguros” antes de insertarlos en la base de datos. Mirar el cuadro adjunto para más detalles. Para más información sobre “SQL injection” y temas de seguridad con PHPNuke se pueden consultar en las referencias [2] y [3]. En nuestro ejemplo, alguien podría teóricamente pasar el identificador de la receta directamente en la cadena de consulta de la URL (por ejemplo, &$recid=42) y manipular el valor de tal forma que se cree una consulta SQL nueva. En este caso, sería bastante simple comprobar si el valor asignado a la variable es un número. Si no lo fuera, el programa simplemente no realizaría la consulta (y podría generar un mensaje de error).
Hogar, Dulce Hogar La capacidad de acceder a las páginas webs en el idioma nativo del usuario es siempre un valor añadido a la hora de continuar visitando una página web particular. La gran mayoría de las páginas webs están en inglés, lo que hace que muchos usuarios estén en desventaja. La mayoría de los usuarios de ordenadores que no tienen el inglés como lengua nativa, tienen al menos conocimientos de inglés técnico y pueden moverse con relativa facilidad por Internet. Sin embargo, en general, los sitios webs están en inglés o en el idioma nativo del webmaster. Con la excepción de los grandes centros comerciales, los sitios webs multilingües son una rareza.
www.linux-magazine.es
PHPNuke viene con capacidades multilingües incluidas que pueden ser configurados desde el panel de administración y proporcionar servicios en unos 30 idiomas. En el directorio de PHPNuke, así como en el de la mayoría de los módulos, se encuentra un directorio llamado language que contiene un número de ficheros con el formato language.php. Estos ficheros contienen la traducción para la mayoría del texto que se muestra en cada página y son de la forma define("_CONSTANT","Traducción");. Por ejemplo, para definir lo que se muestra para la constante _YES, se podría tener: define("_YES","Sí"); -Español define("_YES","Ja"); -Alemán define("_YES","Kyllä"); -Finlandés
Para incluir esta funcionalidad en nuestro módulo, hay que añadir el directorio language en el módulo junto con los ficheros de los idiomas que se deseen incluir. Lo mejor es crear un fichero para su idioma por defecto (como se define en el panel de administración) y copiarlo. Esto asegura que todos los términos que se usen estarán definidos. Si se deja un término particular, se produce un error al cargarse la página para ese idioma, lo que va en contra de la funcionalidad del sitio web. ■
RECURSOS [1] Véase el sistema PHPNuke en acción con varios módulos y bloques hechos por mi: http://www.linux-tutorial.info [2] NukeCops FAQ para SQL Injection: http:// www.nukecops.com/article74.html [3] Artículo sobre SQL Injection del HOWTO de PHPNuke: http://www.karakas-online. de/EN-Book/sql-injection-with-php-nuke. html [4] El sitio PHPNuke: www.phpnuke.org [5] Gran foro de PHPNuke y otros recursos: www.nukecops.com [6] Como indica su nombre, contiene parches para varias versiones:www.nukefixes.com [7] Diversos recursos para PHPNuke: www. nukeresources.com [8] Temas de seguridad y parches: www. nukesecurity.com
Python
DESARROLLO
¿No has encontrado tu lector RSS? Hazte uno tu mismo con Jython.
Cuando los Mundos Chocan Este mes, os descubrimos Jython. La forma mas sencilla de desarrollar vuestras aplicaciones Java como si las programáramos con Python. POR PEDRO ORANTES Y JOSÉ MARÍA RUÍZ
M
uchos os preguntareis que es Jython. Bien, empecemos desde el principio. Un grupo de programadores, Jim Hugunim (su creador) y Guido van Rossum (personalidad dentro del mundo de Python) entre otros, decidieron que la simpleza y la limpieza del código de Python haría perfecto programar en Java, así que se pusieron manos a la obra, y crearon Jython. Jython es la implementación de Python en la plataforma Java, combinando la potencia de los paquetes de Java, como JavaBeans, con la facilidad y rapidez de desarrollo de aplicaciones de Python. Recordad que desarrollar una aplicación es por lo menos dos veces más corto en Python que en Java. Jython posee las mismas características de Python y además posee la característica de poder trabajar con las librerías de Java, de forma que, por ejemplo, podemos disponer del bonito swing de Java o utilizar JavaBeans e incluso programar applets. En la Web de Jython en [1] aparecen algunos ejemplos de applets desarrollados en Jython. Esto hace de él un lenguaje muy potente ya que nos ahorramos tiempo, líneas de código y resulta menos engorroso de leer que Java. Incluso podemos compilar el código para no tener la necesidad de instalar Jython antes de ejecutar nuestra aplicación en cualquier ordenador ya que es capaz de generar Bytecode Java (aunque sí necesitamos tener Java, obviamente). Aunque
ciertamente no todo es positivo. Las aplicaciones desarrolladas con Jython suelen ser bastante más lentas que las desarrolladas con Java y de esto se quejan muchos programadores, pero aún así, la potencia y rapidez de los ordenadores de hoy hace que apenas se note la diferencia. Muchos os preguntareis si hace falta saber Java para programar Jython. En principio, no. Sí es conveniente tener
idea de su funcionamiento y disponer de la API de Java, disponible en la web de Sun [2], para saber que queremos hacer y como lo queremos hacer, pero la sintaxis y la forma de programar es muy diferente. Programar en Java sin la API de Sun resulta, en la mayor parte de los casos, imposible. En cambio, para programar en Jython sí es necesario saber programar en Python, así pues, damos
Listado 1: Tres botones 01 import javax.swing as swing 02 import java.awt as awt 03 04 cuadroTexto = swing.JTextField(10) 05 06 def __init__(): 07 win = swing.JFrame("Ejemplo con botones") 08 acciones = ['uno', 'dos', 'tres'] 09 10 pnlBotones = swing.JPanel(awt.FlowLayout()) 11 12 pnlBotones.add(cuadroTexto) 13 for cadaBoton in acciones: 14 pnlBotones.add(swing.JButton(cad aBoton,actionPerformed=accion))
15 16 win.contentPane.add(pnlBotones ) 17 win.size=(300,300) 18 win.pack() 19 win.show() 20 21 def accion(event): 22 accionBoton = event.getActionCommand() 23 if accionBoton == "uno": 24 cuadroTexto.setText("UNO") 25 elif accionBoton == "dos": 26 cuadroTexto.setText("DOS") 27 else: 28 cuadroTexto.setText("TRES") 29 root = __init__()
www.linux-magazine.es
Número 04
43
DESARROLLO
Python
Listado 2: JyRSS.py 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022
#!/usr/bin/jython
034
import import import import import
035
javax.swing as swing java.lang as lang java.awt as awt java.util as util os
class Lector:
036 037 038
def exit(self, event): lang.System.exit(0)
039 self.pnlBoton.add(lblNombre) 040
def __init__(self): self.vectorrss = util.Vector() self.vectorurl = util.Vector() self.listaRSS() self.listaNoticias() self.pnlBotones() self.menu() if os.path.exists('listarss.txt' ):
self.pnlBoton.add(self.txtNom bre) 041 self.pnlBoton.add(lblUrl) 042 self.pnlBoton.add(self.txtUrl ) 043 044
self.leeFicheroRss() self.win = swing.JFrame("JyRss", size=(300, 300),windowClosing=self.exit)
025 self.win.setJMenuBar(self.men u) 026 self.win.contentPane.add(self .pnlBoton,awt.BorderLayout.NO RTH) 027 self.win.contentPane.add(self .jscplista, awt.BorderLayout.WEST) 028 self.win.contentPane.add(self .jscpNoticias, awt.BorderLayout.CENTER) 029 self.win.setSize(600, 400) 030 self.win.show() 031 032 def pnlBotones(self): 033 self.pnlBoton = swing.JPanel(awt.FlowLayout() )
44
Número 04
for cadaBoton in acciones:
045 self.pnlBoton.add(swing.JButt on(cadaBoton, actionPerformed=self.accionMe nu))
023 024
acciones = ["Añadir","Borrar","Leer"] self.txtUrl = swing.JTextField(10) lblNombre = swing.JLabel("Nombre") self.txtNombre = swing.JTextField(10) lblUrl = swing.JLabel("Url")
046 047 048
def menu(self): opciones = ["Guardar"] 049 self.menu = swing.JMenuBar() 050 archivo = swing.JMenu("Archivo") 051 for eachOpcion in opciones: 052 archivo.add(swing.JMenuItem(e achOpcion, actionPerformed=self.accionMe nu)) 053 self.menu.add(archivo) 054 055 def listaRSS(self): 056 self.lstLista = swing.JList() 057 self.jscplista = swing.JScrollPane(self.lstLis ta) 058 self.jscplista.setSize(100,10 0)
www.linux-magazine.es
059 060 061
def listaNoticias(self): self.lstNoticias = swing.JEditorPane() 062 self.jscpNoticias = swing.JScrollPane(self.lstNot icias) 063 064 def leeFicheroRss(self): 065 f = open('listarss.txt','r') 066 fu = open('listaurl.txt', 'r') 067 linea = f.readline() 068 lurl = fu.readline() 069 while linea: 070 self.vectorrss.add(linea) 071 self.vectorurl.add(lurl) 072 linea = f.readline() 073 lurl = fu.readline() 074 f.close() 075 fu.close() 076 self.lstLista.setListData(sel f.vectorrss) 077 078 def leeFicheroNoticias(self): 079 fg = open('news.txt','r') 080 texto = fg.read() 081 fg.close() 082 self.lstNoticias.setText(text o) 083 084 def guardarFichero(self): 085 fg = open('listarss.txt','w') 086 furl = open('listaurl.txt','w') 087 j = self.vectorrss.size() 088 i = 0 089 while i<=j-1: 090 texto = self.vectorrss.get(i) 091 fg.write(texto +'\n') 092 texto = self.vectorurl.get(i)
Python
Figura 1: Nuestra utilidad busca-palabras en marcha.
por sabido todo lo que hayáis aprendido en los artículos anteriores de esta revista. En este artículo aprenderemos a usar elementos básicos de Java en Jython, trabajaremos con swing, y usaremos algunos objetos de Java como son los vectores, entre otras cosas. Para el ejem-
plo de este artículo nos valdremos de una aplicación externa ligeramente modificada (el código original lo encontrareis en la web de xml.com en [3]) desarrollada en Python, para que podáis echarle un ojo al código si os apetece, desde la cual parsearemos el xml de un documento RSS para leer las últimas noticias de los blogs que mas frecuentemente visitemos. Más adelante explicaremos esto detalladamente.
Instalación de Jython. Para trabajar con Jython, necesitamos tener Java instalado en nuestro ordenador. Podemos usar el Java Runtime Edition (j2re), o el Java Developers Kit(j2sdk), en su version 1.4.2 como mínimo, descargables desde [2].
Listado 2: JyRSS.py (continuación) 093
furl.write(texto +'\n')
094 095 096 097 098
self.txtNombre.setText("") 112
i = i+1 fg.close() furl.close()
def accionMenu(self, event): 099 self.accion = event.getActionCommand() 100 if self.accion == 'Añadir': 101 if self.txtNombre.getText() == "": 102 self.vectorrss.add("SIN NOMBRE\n") 103 else: 104 self.vectorrss.add(self.txtNo mbre.getText()) 105 if self.txtUrl.getText() == "": 106 self.vectorurl.add("SIN URL\n") 107 else: 108 self.vectorurl.add(self.txtUr l.getText()) 109 110 self.lstLista.setListData(sel f.vectorrss) 111
elif self.accion == 'Leer':
115
Además necesitamos instalar el intérprete de Jython disponible en [1], en su última versión estable (la jython-2.1) y, por último, para ejecutar nuestra aplicación, deberemos tener instalado el intérprete de Python (versión 2.3). Una vez hemos descargado el intérprete de Jython, debemos proceder a la instalación del mismo. Ejecutamos java jython-21 y nos saldrá el instalador (Figura 1), que nos pedirá confirmar una serie de opciones y un directorio y ya tendremos Jython instalado en nuestro ordenador. Adicionalmente podemos enlazar los ejecutables de Jython a nuestro directorio de binarios del sistema (ln -s jython-2.1/jython /usr/bin/jython y ln -s jython-2.1/jythonc /usr/bin/jythonc en nuestro caso) para no tener que ejecutar los binarios desde el directorio donde lo tengamos instalado. Esto último es recomendable, además de que resulta mucho más cómodo.
Primeros pasos
self.txtUrl.setText("") 113 114
DESARROLLO
item = self.lstLista.getSelectedInde x() 116 url = self.vectorurl.get(item) 117 os.system('python lrss.py '+ url) 118 self.leeFicheroNoticias() 119 120 elif self.accion == 'Borrar': 121 itemborrar = self.lstLista.getSelectedInde x() 122 self.vectorrss.remove(itembor rar) 123 self.vectorurl.remove(itembor rar) 124 self.lstLista.setListData(sel f.vectorrss) 125 126 elif self.accion == 'Guardar': 127 self.guardarFichero() 128 root = Lector()
Bueno, ya está todo preparado en nuestro sistema. Es hora de ver como funciona Jython. Para empezar, podéis trastear un poco con el intérprete como lo habéis hecho con el de Python, y así podréis ver que el funcionamiento es idéntico. $ jython Jython 2.1 on java1.4.2_05U (JIT: null) Type "copyright", "credits" orU "license" for more information. >>> print 'Hola Mundo' Hola Mundo >>>
Bien, vamos a empezar a ver algunos ejemplitos en java. Para empezar, ¿qué tal el típico Hola mundo con swing? Este ejemplo mostrará una ventana llamada Hola Mundo, con un cuadro de texto. Para cerrarla tendréis que cerrar el intérprete con Control + C ya que en el ejemplo, no implementamos la salida de la aplicación. 01 $ jython 02 Jython 2.1 on java1.4.2_05 (JIT: null) 03 Type "copyright", "credits" or "license" for more information.
www.linux-magazine.es
Número 04
45
DESARROLLO
Python
04 >>> import javax.swing as swing 05 >>> win = swing.JFrame("Hola mundo") 06 >>> texto = swing.JLabel("Hola mundo") 07 >>> win.contentPane.add(texto) 08 >>> win.pack() 09 >>> win.show() 10 >>>
Como podéis ver resulta muy sencillo a la vez de que swing resulta muy agra-
dable para la vista. Java incluye también un sistema para cambiar la apariencia del interfaz por si no os gusta la que arranca por defecto.
Programación Al igual que en Python, para nuestras aplicaciones, lo mas cómodo es hacer que el intérprete ejecute un fichero (o varios) de código. Jython no tiene ningún tipo de extensión establecida para los ficheros, y lo más normal es usar la misma que Python .py para tener nuestros ficheros de código bien diferenciados de los demás.
Listado 3: lrss.py 01 from xml.dom import minidom 02 import urllib 03 04 DEFAULT_NAMESPACES = \ 05 (None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0 06 'http://purl.org/rss/1.0/', # RSS 1.0 07 'http://my.netscape.com/rdf/si mple/0.9/' # RSS 0.90 08 ) 09 DUBLIN_CORE = ('http://purl.org/dc/elements/ 1.1/',) 10 11 def load(rssURL): 12 return minidom.parse(urllib.urlopen(r ssURL)) 13 14 def getElementsByTagName(node, tagName, possibleNamespaces=DEFAULT_NAM ESPACES): 15 for namespace in possibleNamespaces: 16 children = node.getElementsByTagNameNS(na mespace, tagName) 17 if len(children): return children 18 return [] 19 20 def first(node, tagName, possibleNamespaces=DEFAULT_NAM ESPACES): 21 children = getElementsByTagName(node, tagName, possibleNamespaces)
46
Número 04
22
return len(children) and children[0] or None
23 24 def textOf(node): 25 return node and "".join([child.data for child in node.childNodes]) or "" 26 27 if __name__ == '__main__': 28 import sys 29 rssDocument = load(sys.argv[1]) 30 fn = open('news.txt','w') 31 Noticia="" 32 for item in getElementsByTagName(rssDocume nt, 'item'): 33 Noticia = 'Title: __' + textOf(first(item, 'title'))+ "__\n" 34 Noticia = Noticia + 'Link: \n '+ textOf(first(item, 'link'))+ "\n" 35 Noticia = Noticia + 'Description: \n\n ' + textOf(first(item, 'description'))+ "\n" 36 Noticia = Noticia + '\nDate: ' + textOf(first(item, 'date', DUBLIN_CORE))+ "\n" 37 Noticia = Noticia + '\nAuthor: '+ textOf(first(item, 'creator', DUBLIN_CORE))+ "\n" 38 Noticia = Noticia + "--------------------------------------\n" 39 fn.write(Noticia) 40 fn.close()
www.linux-magazine.es
Para usar las librerías de Java, lo primero que tenemos que hacer es importarlas al estilo de siempre de Python. Como hemos visto en el ejemplo de antes, para importar las librerías de swing, basta con importar lo que necesitemos. Imaginad que necesitamos la clase Vector, que esta dentro del paquete de utilidades, bien podemos hacer import java.util as util o bien directamente import java.util.vector as vector, y ya tendremos acceso a esa clase. Para utilizarla bastaría con llamar a su constructor (os recuerdo que tengáis siempre a mano la documentación del API de Java) con él, crearemos una ocurrencia vector (en este caso), pepe = util.vector() y una vez creada, podemos acceder a cualquiera de sus métodos directamente en la ocurrencia que acabamos de crear, ‘pepe.add(“Hola”)‘ que, para los que no estén muy familiarizados con Java, añade un objeto de tipo String (cadena de caracteres) al vector. Cada ocurrencia de Java tiene el mismo funcionamiento en Jython. Es importante que tengáis esto en cuenta. Ahora vamos a mezclar un poco de cada (Figura 2). Para ello voy a crear tres botones, a cada uno lo llamaremos de una forma distinta y les añadiremos un listener (para coger los eventos que produce cada botón) de forma que al pulsar en cada uno, se escriba su nombre en un cuadro de texto. Veamos como se hace esto en el Listado 1. Es sencillo ¿verdad?, si os dais cuenta, para crear los botones he usado código propio de Python usando una lista con los nombres de los botones y creándolos con un bucle for, dentro del cual llamo al constructor de JButton, pasándole unos argumentos, y añadiéndolos en el panel mediante el método .add() que implementa JPanel. Bueno, espero que os haya gustado el ejemplo porque ahora viene nuestra aplicación en serio.
Lector de Noticias RSS -JyRSSPuede que algunos de vosotros os preguntéis que es RSS. RSS no es más que un fichero .xml con una serie de etiquetas. éstas siguen un estándar definido por xml.com para transmitir pequeñas noticias, por ejemplo, a través de Internet, de forma que no haga falta abrir un navegador para leerlas, sólo bastaría con usar una aplicación que
Python
Figura 2: Ejemplo con botones Swing.
Figura 3: Buscador desde la línea de comandos.
direcciones. El vector de nombres se lo pasaremos a la ocurrencia JList para que añada todos los nombres de los sitios en pantalla. Usaremos el paquete java.lang para implementar la función de salir de la ventana al pulsar la x de nuestra aplicación (no se implementa por defecto). De Python, haremos uso del paquete os, desde el que nos valdremos de os.path.exists() para comprobar si existe el fichero de nombres al arrancar la aplicación y de os.system() que ejecutara el script Python que leerá las noticias. Éste guardará las noticias en un fichero, que luego leerá nuestra aplicación. No os preocupéis si veis que tarda un poco, eso es por dos motivos, tiene que descargar el fichero de Internet, y además tiene que parsearlo y las librerías que utiliza (minidom) son bastante lentas. Usaremos también las utilidades de escritura y lectura de ficheros (open(), write(), read(), etc…) para manejarnos con ellos. Podemos ver el resultado en la Figura 3. Como veis, programar java con Jython no resulta para nada difícil, al contrario, resulta muy cómodo, y desde luego mucho mas sencillo que Java. En el Listado 3 encontrareis el código Python de la pequeña aplicación externa. Pongo los nombres de las clases y paquetes de Java que se van a usar, para que os vayan sonando cuando vayáis leyendo el código. Así podréis buscar más rápido en la API de Java y no tendréis problemas para encontrarlas. Vuelvo a hacer hincapié en que es necesario que lo tengáis.
servirá para practicar con el código que os dejamos. Por ejemplo, hacer que el cuadro JEditorPane os cambie la apariencia del texto (negrita, cursiva, etc…), que cada vez que pulséis sobre un nombre en la JList lea la noticia directamente (deberéis trabajar con el listener de JList), añadir la opción de guardar las noticias del sitio que mas os gusten, etc…
Entornos de programación Jython. Mucha gente prefiere trabajar con IDE’s (interfaz para el desarrollo de aplicaciones) a la hora de programar. Actualmente no he encontrado aún ninguno que sea exclusivamente para desarrollar en Jython. Lo que sí existe, son plugins que instalamos en otros IDE’s y que nos permiten trabajar con este lenguaje. Podemos encontrar diferentes plugins para dos de los IDE’s más populares, uno para Netbeans (ver [4]) que os podéis bajar desde la aplicación de actualización que lleva implementada. Y luego tenéis otro para Eclipse (ver [5]), llamado Red Robin que podéis encontrar en [6]. Tanto en la web de Netbeans, como en la web de Red Robin, se explica como debemos insta■ larlos.
RECURSOS [1] Página de Jython: http://www.jython.org [2] Descarga de Java: http://java.sun.com [3] Código original del programa: http:// www.xml.com/lpt/a/2002/12/18/ dive-into-xml.html [4] Plugins de Netbean: http://www. netbeans.org [5] IDE Eclipse: http://www.eclipse.org [6] Plugin Jython para Eclipse: http://home. tiscali.be/redrobin/jython/
José Pedro Orantes está cursando 3º
Mejoras para JyRSS
de Ingeniería Técnica en Informática
Es obvio que a este código le faltan muchas cosas además de que debe tener varios bugs como por ejemplo que al pulsar el botón Leer cuando no hay ninguna url y/o ningún nombre, Java lanza una excepción. Os animamos a que lo depuréis. Os sugerimos que le hagáis algunas mejoras, ya que de esta manera os
LOS AUTORES
descargue y prepare la noticia para que la podamos leer, como hace nuestra aplicación JyRSS. Para empezar, necesitamos el código que hemos mencionado al principio del artículo. Este código será el encargado de descargar y parsear el fichero RSS con las noticias, de forma que guardará en un fichero, el contenido ya parseado del documento RSS para que nuestra aplicación pueda cargar su contenido dentro de un cuadro de texto. Tiene algunas limitaciones y es que no soporta todas las codificaciones de texto, por lo que os recomiendo que cuando lo probéis, uséis direcciones extranjeras, a ser posible en inglés, como Slashdot.com (http://www. slashdot.com/index.rss) ya que con algunos blogs en castellano, como barrapunto.com, no funciona correctamente debido a una serie de caracteres contenidos en el documento. JyRSS constará de varias partes. Un JFrame (ver Listado 1) donde irán embebidos el Panel de botones y los cuadros de texto. Uno de los cuadros de texto es un JList donde mostraremos los nombres de los sitios que contienen las noticias y el otro un JEditorPane donde se mostraran las noticias. Además ambos hacen uso de JScrollPane para que puedan hacer scroll en caso de que haya texto que ocupe toda la pantalla. También hacemos uso del JMenu y de JMenuBar para crear el pequeño menú archivo, donde está la opción de guardar, que guardará en dos ficheros (uno con los nombres de los sitios y otro las urls de cada sitio) todos los sitios web que le hayamos añadido. Este menú no es nada necesario, pero queríamos incluirlo para que vierais lo fácil que es crearlo. El panel de botones tendrá tres JButtons, uno para añadir una nueva url a la lista, uno para borrar una url de la lista y otro que lanzará el pequeño parser de RSS (lrss.py) y nos mostrará las noticias de cada sitio que aparecerán en el JEditorPane. También se hace uso de la clase Vector. Usaremos dos vectores, uno para guardar los nombres y otro para las
DESARROLLO
de Sistemas y desde hace tiempo utiliza linux como herramienta de trabajo. José María está realizando el Proyecto Fín de Carrera de Ingeniería Técnica en informática de Sistemas y lleva 7 años usando y desarrollando software libre, y desde hace dos en FreeBSD.
www.linux-magazine.es
Número 04
47
KNOW HOW
Scribus
Maquetación en Linux con Scribus
Un Periódico en Linux En este primer artículo de una serie de tres, el ex-director artístico de un periódico, Jason Walsh, echa un vistazo a la autoedición en Linux. Jason creará un periódico usando Scribus junto con otras aplicaciones Linux y lo probará en una editorial real. POR JASON WALSH
L
a clave del incremento de la penetración industrial de Linux no ha sido en el uso generalizado de ordenadores, sino que ha sido gracias la invasión sistemática en distintos nichos, notablemente en los servidores web, cálculo científico y desarrollo de aplicaciones. Es indiscutible que ha sido un rotundo éxito. En la actualidad a Linux le pertenecen varias áreas claves de la informática. Una de las áreas en las que Linux no ha hecho grandes avances es en el mundo de la autoedición, una industria que pertenece casi exclusivamente a Apple Macintosh. Después de años de dirigir a los usuarios potenciales a sistemas complejos y poco extendidos como LaTeX, Linux por fin tiene una
Salida Antes de la etapa RIP, habrá que exportar nuestras páginas a ficheros PDF. Los PDF de Adobe se han convertido en los formatos estándar para el intercambio de documentos impresos; si su PDF se crea de forma adecuada, se podrán imprimir en un amplio rango de dispositivos de salida, incluyendo impresoras de chorro de tinta, prensas digitales y prensas offset de cuatro colores.
48
Número 04
excelente herramienta WYSIWYG de escritorio para la autoedición. En esta serie produciremos cuatro hojas de periódico de prueba bajo Linux que serán evaluadas por David Hunter del departamento de preimpresión del Belfast News Letter, la más antigua publicación diaria continuada en lengua inglesa del mundo. Podríamos decir que esta mini-edición equivaldría al “Hello World” de la autoedición de escritorio de Linux.
Historia de la Edición Anteriormente a la aparición de sistemas de escritorio WYSIWYG para la edición, la producción de periódicos y revistas era un complicado y arcano proceso que implicaba equipos especializados como máquinas de linotipia, cámaras de procesos e impresoras de bromuro. El interfaz de usuario gráfico del Apple Macintosh y su primera aplicación estrella, Pagemaker, lo cambió todo para siempre. Después de siglos, la maquetación era accesible para cualquiera, al menos a cualquiera que pudiera permitirse un Mac y una copia de Pagemaker. El dominio de Pagemaker ha declinado hasta el punto de ser casi un producto usado en las empresas exclusivamente
www.linux-magazine.es
para crear boletines de noticias. La aplicación más importante en el mundo de la edición profesional es Quark XPress. A finales de los noventa, un serio rival retó a Quark llegado desde Adobe: InDesign. InDesign ofrecía la mayoría de las características de Quark XPress, además de otras muchas que no tenía Quark, todo con el interfaz de usuario de Adobe, que los diseñadores ya conocían gracias a Photoshop e Illustrator. Ni Quark ni InDesign se encuentran disponibles para Linux, ni tampoco parece que sea probable que lo vayan a estar en breve.
Presentamos Scribus Sin embargo aún no está todo perdido. Siguiendo la tradición del “código abierto”, cuando una aplicación no está disponible, un grupo de programadores se reúnen para producir una alternativa gratuita. Esa alternativa es Scribus (véase la Figura 1). La instalación de Scribus es razonablemente sencilla, desafortunadamente no hay paquetes binarios universalmente compatibles, pero compilarlo es bastante fácil: ./configure make make install
Scribus
Figura 1: Scribus ejecutándose en Suse 9.1. Por fin, una aplicación de maquetación con calidad profesional llega a Linux.
Luego se configura. Alternativamente, están disponibles para los sistemas Red Hat paquetes RPMs, y también están soportados Gentoo y Debian.
Creación de Páginas Para nuestro proyecto vamos a trabajar con unos requerimientos específicos predefinidos. El resultado final será un cierto número de páginas para un periódico. El primer paso es definir la forma y el tamaño de la página, junto con algunos otros parámetros comunes: márgenes y columnas. La Figura 2 muestra el cuadro de diálogo de las propiedades de maquetación de Quark XPress 6 en el Mac OS X (Layout > Layout Properties). Si se está pasando a Scribus desde Quark, el primer paso es copiar estos datos básicos e introducirlos en Scribus. Si se está creando una nueva maqueta, hay que definir las propiedades equivalentes. ¿Por qué no se importa la plantilla original de Quark a Scribus? Porque lamentablemente Scribus no puede importar ficheros de otras aplicaciones de maquetación. Tal y como dicen los desarrolladores, “los formatos de ficheros DTP son internamente muy complejos, probablemente los más com-
plejos en un PC. Crear los filtros para importar/exportar es una tarea mucho más compleja que la de importar los formatos de ficheros de una hoja de cálculo o de un procesador de textos”. Esto es un impedimento, pero es un problema común. Adobe InDesign puede abrir ficheros de Quark 4 pero no de Quark 5 o 6. Quark no puede abrir ningún fichero de InDesign, ni siquiera Quark versión 6 puede “guardar como” versión 4. Siguiendo un grado de cordura con respecto a la apertura de archivos que parece que ni Quark ni Indesign muestran, Scribus usa el estándar XML para su formato de fichero nativo. Esto significa que será posible abrir los ficheros de Scribus en otras aplicaciones de maquetación en el futuro. “Tabloid” (el formato de página que vamos a usar para el periódico) en EE.UU. se refiere a un tamaño específico de página de 279.4mm x 431.8mm. En Europa, es un término más o menos genérico que se refiere a una página de periódico de un tamaño aproximado a un A3, la mitad del tamaño de la hoja completa, a todo lo ancho, que compone el periódico. El cuadro de diálogo New Document en Scribus es donde la página básica se
KNOW HOW
crea inicialmente (véase la Figura 3). La página que vamos a crear servirá de plantilla para las siguientes (y de hecho, para todas las demás, aunque ligeramente modificadas). Nuestras plantillas van a ser muy básicas, simplemente se definen el tamaño y la forma de la página y si van a tener márgenes. Nuestro proyecto será de 297mm x 386mm; bastante parecido al tamaño de hoja del periódico inglés Independent y algo diferente de la mayoría de los “tabloids”. Así pues pondremos en el ancho 297mm y en el alto 386mm. La impresión al filo de la página es bastante común en las revistas, pero es bastante raro en los periódicos ya que las prensas no son capaces de realizarlas. Incluso cuando son capaces, nunca se usan en la página delantera. Hay que definir un área imprimible y lo hacemos estableciendo los márgenes en el cuadro de diálogo New Document. Estas propiedades son definidas por el periódico y difieren de unos a otros. En nuestro caso, los márgenes los estableceremos en: Top, 29mm; Bottom, 16mm; Inside, 8mm; Outside 23mm. Los márgenes se han establecido de forma desigual para crear una zona rectangular de 265mm x 340mm: ésta es el área mínimamente imprimible en la posición correcta. En algunas páginas los elementos pueden salirse de este rectángulo inicial; en otras palabras, podrían no imprimirse. Esto es un asunto de paginación e imposición que es, de nuevo, impuesto por el periódico y no por el diseñador, así que no vamos a discutirlo en detalles aquí. Dentro de este rectángulo central, definiremos más tarde nuestra maquetación principal basada en cinco columnas de texto. Scribus maneja las columnas de manera diferente a como lo hacen otras aplicaciones DTP (se verá más adelante) pero el diseño es eficiente y muy manejable. El cuadro de diálogo “New Document” tiene otras opciones: marcos de texto automáticos rellenan el área imprimible con un marco de texto en cada página nueva, útiles para la creación de grandes documentos como diseños de libros, pero sin relevancia aquí. El resto de las opciones son relativas a la impresión. Hay que asegurarse de que
www.linux-magazine.es
Número 04
49
KNOW HOW
Scribus
tria. Por extraño que parezca, hay cientos de publicaciones que no cuentan con un departamento de TI; con sistemas basados en Mac, simplemente no necesitan tener dentro de la empresa un departamento de TI. La principal objeción a Scribus parece estar en su uso: la maquetación basada en marcos; es decir, todos los objetos están contenido dentro de un marco y pueden ser manipulaFigura 2: El menú de las propiedades de la página en Quark dos de dos formas: como un XPress muestran los parámetros por defecto del East Belfast objeto o como un contenido. Observer. Esta forma de trabajo es común tanto en Quark como en InDesign y de hecho es una forma muy se marca la opción “Facing Pages” que eficiente de separar diseño de contenido. hace que la maquetación corresponda a Más aún, es esencial para Scribus el ofreuna disposición de dos páginas de cer un entorno cómodo para impresores ancho. profesionales, ya sean diseñadores, periCuando las páginas se imprimen, se odistas o subeditores, si lo que se prehacen en pares. La de delante y la de tende es introducirse de forma seria en el atrás lo hacen juntas y se doblan por la mundo de la edición. mitad y cubren a las siguientes y así con Una vez que uno se acostumbra a ello, todas. Un periódico completo se forma a esta forma de trabajar es bastante propartir de varios ficheros con distintos ductiva: para situar el texto en la página, números de páginas, en vez de hacerse primero se debe crear un marco de texto, con un solo fichero que contenga el peluego se inserta o se teclea el texto denriódico entero. Esto permite que difetro del marco. Para colocar una imagen rentes páginas puedan ser creadas en en la página, se crea un marco de imamomentos diferentes (y por personas gen y luego se importa la fotografía o el diferentes) e impide que los ficheros de gráfico dentro de este marco. De esta Scribus lleguen a ser tan grandes que no forma, los marcos y los contenidos que se puedan manejar. albergan pueden ser manipulados indeMaquetación Basada en pendientemente.
Marcos
Algunos de los críticos de programas de código abierto se han quejado del interfaz de Scribus, criticando que no es muy apropiado para los usuarios domésticos. Esta es una crítica bastante extraña, ya que este software está enfocado a usuarios profesionales. Tanto Quark XPress como Adobe InDesign no son nada intuitivos para los usuarios amateurs, pero la publicación es un mundo complejo… esto no es un procesador de textos. Uno de los grandes problemas a los que se enfrenta Scribus es al hecho de que no dispone de una versión binaria estable universalmente compatible. Esperar que los diseñadores y periodistas compilen software desde los fuentes es ridículo y es un serio impedimento para que Scribus sea adoptado por la indus-
50
Número 04
Gestión del Color
unidos un efecto global sobre el resultado final. Una de las áreas que es más difícil de conseguir es la reproducción del color y aunque todos los elementos nombrados anteriormente tendrán un impacto, es importante asegurarse que antes de enviarse los ficheros a la imprenta que sean de tan alta calidad como sea posible. El color es un tema sorprendentemente complejo. La gestión interna del color fue una de las mayores ventajas jugadas por los Macintosh como plataforma de impresión… y una de las mayores desventajas de Linux. Hasta ahora. La gestión del color es una tecnología que se usa para calibrar el color de los dispositivos de entrada, los monitores y los dispositivos de salida. La clave principal es el “espacio de trabajo”. Esto es una referencia de color que no está ligada a ningún dispositivo específico, comúnmente “sRGB”, un perfil básico de adición del color adecuado para los monitores. El problema que representa es que los dispositivos de salida, ya sean el monitor o la impresora, deben hacer una transformación desde sRGB a su espacio nativo de color y la calidad de esta transformación será determinada por la calidad del driver del dispositivo. Un método mejor es el uso de un sistema de gestión de color compatible con el “International Color Consortium”. El ICC define un estándar abierto para los módulos de coincidencia de color, preferiblemente definidos a nivel del SO y perfiles de colores tanto para los dispositivos como para el espacio de trabajo. La tecnología de gestión del color puede ser implementada por el sistema
La impresión es más un arte que una ciencia y es perfectamente posible saberlo todo sobre ella y aún así enfrentarse a un desastre en el periódico. Hay demasiadas variables para ser sinceros, y muchas de ellas no pueden ser controladas desde el escritorio. El tipo y grado del papel a usar, la calidad y la viscosidad de la tinta, el tipo y los años de la Figura 3: El cuadro de diálogo New Document de Scribus. En este diálogo imprenta y la habilise define la forma básica de la página. Hemos usado aquí los parámetros dad de los impreusado por EBO tomados de Quark XPress.Hugin. sores tendrán todos
www.linux-magazine.es
Scribus
Figura 4: El título del East Belfast Observer.
operativo, en la API, o directamente por la aplicación. Desde hace años, Mac OS ha incluido un software de la propia Apple para la gestión del color, ColorSync. Actualmente Linux cuenta con una solución compatible denominada LittleCMS. Los usuarios domésticos puede ser que no necesiten instalar LittleCMS, pero para los usuarios profesionales es obligatorio. LittleCMS incluye perfiles de color estándar ICC y una vez instalado LittleCMS, los ficheros PDF producidos por Scribus serán impresos tal y como aparecen en pantalla. Sin él, habrá que estar adivinando como quedará un color dado al imprimirse. Es importante entender que LittleCMS no es una aplicación propiamente dicha, sino más bien, es una biblioteca de programación que puede utilizarse en el desarrollo de aplicaciones y Scribus es una de las aplicaciones que la usan. Si se instala antes de instalar Scribus, Scribus automáticamente la usará. Desafortunadamente, en Linux, el único programa de retoque fotográfico que soporta gestión del color es Corel Photopaint. Esperemos que las bondades de LittleCMS sean aprovechadas por los desarrolladores de GIMP antes de que se les escape el tren. El aspecto más importante a la hora de usar un sistema de gestión de color es recordar activarlo. Cuando llegue el momento de exportar nuestros PDFs finales, volveremos sobre esto en detalle, pero por ahora se puede echar un vistazo en File>Export>Save Page as PDF. En el cuadro de diálogo que aparece, hay que seleccionar la solapa color. Si se tiene LittleCMS instalado, se verá un menú desplegable bajo PDF/X-3. Este menú contiene los perfiles de impresión. Consúltese la impresora y selecciónese el más relevante. En nuestro caso de prueba, el perfil correcto va a ser Euroscale Uncoated v2.
KNOW HOW
forma correcta, los elementos con color como fotografías y gráficos, deben estar en el espacio de color CMYK. Las imágenes en las pantallas de los ordenadores suelen estar en formato RGB, Rojo, Verde y Azul. Estos son los colores primarios aditivos usados para formar colores secundarios y terciarios con luz. Pero con tintas, es necesario usar los colores primarios substractivos, Rojo, Amarillo y Azul. En impresión, son sustituidos por Magenta, Amarillo y Cián, que ofrecen una gama más amplia de colores imprimibles. El orden en que los colores son impresos es, primero el Cián, luego el Magenta y por último el Amarillo: CMY. La “K” viene de “Key” (clave), que es el color de registro, Negro. Sin la plancha final de negro, en el resultado final los elementos en negro como el texto, se verían como marrón oscuro, púrpura o verde. Si se imprime un fichero RGB en una impresora de chorros de tinta, algunos colores parecerán estar “fuera de la gama”, esto es, fuera del rango de colores imprimibles. Una inconveniencia, pero no un desastre. Si se está imprimiendo en una prensa CMYK, es de vital importancia hacer coincidir los colores RGB vistos en la pantalla con la gama de colores CMYK que se van a imprimir. Más aún, si se envían los ficheros RGB al RIP, no serán reconocidos como imágenes en color y se imprimirán como un
Porque Euroscale es un intento para proporcionar un perfil genérico para Europa. Opciones para América del Norte y Japón están también disponibles, Web/SWOP y Japan Color respectivamente, así que si usted vive en América o Japón, el escoger el perfil adecuado le proporcionará los mejores resultados. Uncoated se refiere al tipo de papel; muchas revistas se imprimen en papeles caros con brillo, pero no los periódicos. Para saber que gestor del color es esencial, es necesario comprender los principios básicos de la impresión offset, ya que difiere de forma significativa de la impresión por chorros de tinta. La impresión offset, litografía, es el proceso con el que se imprimen los pe riódicos. Los ficheros se pasan por un RIP o Raster Image Processor, que lo convierte en una imagen PostScript. Cada página se convierte en una imagen simple, que posteriormente se imprime en una película y se transfiere a una plancha de aluminio. Esta plancha se fija a un tambor que rueda a través de una cubeta de agua. El agua se adhiere a las partes negativas de la imagen. Posteriormente, la plancha pasa por una cubeta de tinta, que se adhiere a las áreas positivas; el siguiente paso, es hacer rodar un tambor de goma sobre la plancha para escurrir el agua y recoger la tinta. Este tambor se hace rodar sobre el papel para transferir la tinta. El color se imprime separándolo en cuatro planchas distintas, una para cada color usado en el proceso de impreFigura 5: Después de exportar el título del programa de dibujo sión. Este proceso se denomi– en nuestro caso Inkscape – se abre con GIMP y se cambia a na separación del color. Para imagen de 1 bit seleccionando Image>Mode>Indexed y escoque este proceso funcione de giendo una paleta de 1 bit con “No Color Dithering”.
www.linux-magazine.es
Número 04
51
KNOW HOW
Scribus
film único. El resultado final será una especie de imagen en escala de grises. Usar colores CMYK significa que no se acabará accidentalmente con una página monocromo; el uso de un gestor de colores significa que los colores que se ven en las pruebas serán los mismos que los del resultado final.
tos por pulgada (véase la Figura 5). 600dpi es una resolución increíblemente alta, especialmente teniendo en cuenta que la prensa que vamos a usar imprime a unos 180dpi, entonces ¿por qué molestarnos con esta resolución tan alta? Los ficheros que usan un espacio de color de 1 bit son en blanco y negro: no son de escala de grises, sino literalmente Elementos de la página en blanco y negro. Hablando de forma Las páginas consisten en tres elementos genérica, TIFFs de 1 bit se usan para básicos: textos, gráficos y espacios en delineación. La ventaja de usar un espablanco. La proporción de cada uno de cio de color de 1 bit es que el color de las ellos dependerá de lo que se esté dilíneas (o en nuestro caso de los caracseñando; la publicidad difiere de forma teres) pueden ser cambiados dentro de la significativa del contenido editorial y las aplicación de maquetación, así que un páginas de la editorial diferirán de publisimple fichero fuente puede usarse para cación a publicación e múltiples variaciones de la incluso dentro de la misma misma imagen. El lado publicación. negativo de las imágenes Con algunas excepciones de 1 bit es que se notables, como el francés degradan a baja resoluLibération y el inglés ción. Incluso a 300dpi una Guardian, el diseño de un imagen de 1 bit empezará periódico no es nada imaa mostrar bordes rugosos. ginativo. No es que los pePara importar el título, riódicos estén mal diseñaseleccionamos Insert dos, simplemente es que el Picture, el tercer icono de criterio es diferente del de la barra de herramientas y otras áreas del diseño grádibujamos un marco que fico. ocupe el área entera Los dos aspectos claves imprimible entre los dos en el diseño de un periódimárgenes. co son: la facilidad de lecA continuación, selectura y la facilidad de cionamos File> Import Figura 6: El cuadro de diálogo maquetación. La primera >Get Picture. Después de de Propiedades de Scribus, es importante porque un seleccionar el fichero donde se ajusta casi periódico debe ser digerido apropiado, seleccionamos cualquier aspecto de un rápidamente por un lector Tools>Properties para lleobjeto. genérico, no por un espegar al cuadro de diálogos cialista. Siendo consisde Propiedades de Scribus tentes y ajustándonos a ciertas reglas (véase la Figura 6) y seleccionamos básicas harán que la tarea de lectura sea Image. Se selecciona la opción Scale to bastante fácil. El otro aspecto es imporFrame Size y nos aseguramos de que el tante porque, a diferencia de las revistas, botón proportional esté marcado. El títuque tienen una tirada mensual, los pelo debería ahora tener el ancho de la riódicos suelen ser diarios y suele haber página frontal del periódico, excluyendo una presión significativamente alta sobre los márgenes. el equipo de maquetación. Encima del título hay tres cajas, que Para nuestro periódico de prueba, el resaltan el contenido dentro del periódico. primer elemento va a ser el título (véase Estas cajas son marcos vacíos de imágenes la Figura 4). En este caso, las fuentes que han sido coloreados usando el cuadro usadas han sido Gill Sans Light Italic y de diálogo Tools>Properties>Colors. Gill Sans Bold Condensed. Directamente debajo del título están la Para nuestro periódico el título es un fecha y el número del periódico, además fichero TIFF de alta resolución que se creó del precio. Ambos han sido creados con en Inkscape, se exportó y se convirtió a un elementos de textos en Scribus de la forma TIFF de 1 bit a una resolución de 600 punhabitual. Es también posible crear el título
52
Número 04
www.linux-magazine.es
como un marco de texto dentro de Scribus, pero como es un elemento inalterable, es mejor usar un fichero gráfico, ya que se podría colar una errata con el tiempo. El siguiente elemento a incluir es el texto. En términos de entrada de texto, es ineficiente introducirlo directamente en Scribus. Incluso si se tiene un monitor bastante grande, se perderá bastante tiempo haciendo zoom para leer las partes de las páginas. En vez de ello, se debería preparar todo el texto a introducir en un fichero con un procesador de textos como el Writer de OpenOffice, corregirlo, comprobando las ortografía e importarlo posteriormente a Scribus. En este punto se debería salvar el texto como texto plano antes de importarlo a Scribus. A partir de la versión 1.2.1, Scribus ya puede importar texto directamente de ficheros OpenOffice (.sxw). La ventaja de esto es que se respetan las características estéticas del original, pudiendo importarse negritas, cursivas, subrayados y, si Scribus apunta a los mismo directorios de fuentes que OpenOffice, el tipo de letra. El próximo mes discutiremos en detalle la forma de trabajar con el texto, pero por ahora concentrémonos en conseguir incluir algún texto dentro de la maqueta. Conseguir meter el texto es tarea fácil: seleccionamos el botón Insert Text Frame de la barra de herramientas de Scribus y dibujamos un marco en la página, donde se quiera que el texto aparezca. A continuación, seleccionamos File> Import> Get Text. El texto del fichero seleccionado fluirá dentro del marco seleccionado. Para editar el texto, seleccionamos Edit Contents of Frame de la barra de herramientas y usamos el cursor con forma de I para marcar el texto de la forma que se desee como en cualquier procesador de textos. Alternativamente, se puede usar el Story Editor (también en la barra de herramientas) para editar el texto.
Conclusión Este artículo nos ha presentado Scribus, una aplicación de maquetación con calidad profesional de código abierto para Linux. En el próximo número, aprenderemos a manipular el texto y los gráficos ■ en el entorno de Scribus.
Panoramas
KNOW HOW
Panorámicas perfectas con Hugin, Enblend y Autopano-SIFT
Vistas de 360 grados
Podemos crear una imagen agradable alineando múltiples paisajes para conformar un panorama. Pero la alineación puede ser complicada, especialmente si las fotografías individuales no coinciden. Herramientas como Hugin, Enblend y Autopano-SIFT pueden ayudarnos a crear panorámicas perfectas sin marcas. POR OLIVER FROMMEL
S
i tenemos más fotos de las que podemos ajustar en una imagen puede que queramos intentar el viejo truco de combinar múltiples fotografías digitales en una agradable vista panorámica. Será muy difícil combinar estas fotografías en una imagen sin cortes usando Gimp. Este artículo trata algunas de las herramientas alternativas que podemos usar para ajustar y alinear las imágenes automáticamente. Estas herramientas crearan panorámicas sin cortes partiendo de fotografías separadas.
Es fácil tomar una serie de fotografías para formar una panorámica, pero aquí es donde comienza el problema. Es difícil conseguir cortes suaves e invisibles. Normalmente, las fotografías están tan deformadas que es imposible corregirlas manualmente. Las lentes son parcialmente culpables. Éstas distorsionan normalmente las imágenes, convirtiendo líneas rectas en curvas que hacen la composición de fotografías difícil. La otra razón es la distorsión causada por la propia realización de una serie de fotografías. Si permanecemos quietos y
Cuadro 1: PanoTools Durante mucho tiempo, el paquete PanoTools fue el único software gratuito para crear imágenes panorámicas. Las condiciones de la licencia de PanoTools siempre han sido complejas. La librería y PTOptimizer se distribuye bajo la GPL, mientras que se aplican varias licencias a algunos de los programas.
Debido a que el autor del programa, Helmut Dersch, ya no tiene el programa en su página Web, otras personas ofrecen paquetes antiguos. De hecho hay incluso algunos versiones comerciales, si bien puede que no sean del todo legales. Se ha fundado un proyecto Sourceforge para mantener las partes gratuitas de PanoTools [1].
giramos la cámara de izquierda a derecha, los objetos de la derecha de la imagen aparecerán muy grandes, mientras que los de la izquierda serán más pequeños. Hay software gratuito que nos puede ayudar a corregir este tipo de distorsión, alinear imágenes individuales y finalmente montarlas para crear una panorámica.
Ecualización y Alineado de Fotografías El programa de gráficos Hugin [2] muestra las imágenes permitiendo al usuario seleccionar puntos neurálgicos para ecualizar y alinear las imágenes. El programa es fácil de instalar pero requiere algunas librerías que algunas distribuciones no incluyen. En el recuadro “Instalación” hay más detalles al respecto de la instalación. Tras escribir hugin para lanzar el programa aparece la ventana mostrada en la figura 2. Pulsamos Add individual
www.linux-magazine.es
Número 04
53
KNOW HOW
Panoramas
Figura 1: Carga de las imágenes individuales en la ventana principal de
Figura 2: La pestaña Camera and Lens.
Hugin.
images… para seleccionar imágenes individuales. En el diálogo que aparece podemos mantener pulsado [Ctrl] y pulsar para seleccionar múltiples imágenes. Hugin muestra una lista de imágenes en el panel de la izquierda añadiendo algunos detalles como la anchura y altura o los valores de rotación (Yaw, Pitch, Roll), si bien estos cuentan con el valor cero por defecto. Hugin usa la primera fotografía como punto de referencia para alinear las otras imágenes. El botón “Anchor this image …” permite seleccionar otra imagen como punto de referencia. La segunda pestaña, Camera and Lens, se usa para corregir las distorsión
óptica causada por la cámara y las lentes. Si nuestras imágenes incluyen información EXIF, Hugin puede automáticamente extraer los datos requeridos. Si no conocemos el ángulo de la vista de nuestras lentes debemos consultar la Tabla 1 (extraída de la documentación de PanoTools). El conmutador Inherit permite que el resto de las imágenes adquieran los ajustes de la imagen actual. Si deshabilitamos estos ajustes el programa puede gestionar imágenes con diferentes valores de distorsión. Tras descubrir los mejores valores para nuestra cámara (mediante el método de prueba y error)
podemos almacenar estos valores en Lens Management y cargarlos para nuestros próximos proyectos panorámicos.
Puntos de control manual Hugin necesita unos detalles definitivos de las imágenes para ser capaz de alinearlas correctamente. La pestaña Control Points se encarga de esto. La pestaña nos muestra las dos imágenes permitiéndonos pulsar sobre los puntos de control para crear asignaciones. Primero debemos ajustar Hugin para que muestre dos imágenes adyacentes ajustando el número en la pestaña sobre la imagen de la derecha un número más
Cuadro 2: Instalación Hugin necesita la librería WxWidgets (antiguamente WxWindows) y la extensión WxWidgets-XRC. La mayoría de las distribuciones incluyen las otras librerías requeridas, como Libtiff, LibPNG y LibJPG. Al margen del paquete matemático FFTW, Hugin también necesita la librería Boost Library si pretendemos construir Hugin nosotros mismos. Desafortunadamente, la versión y nombre dependen de la distribución. Por ejemplo, la librería Boost de desarrollo para Fedora simplemente se llama libboost-devel; los usuarios de Debian necesitan tres paquetes llamados libboost-graph-dev, libboostdev y libboost-python-dev. Los archivos requeridos para Fedora están localizados en el subdirectorio del DVD. El siguiente comando instala las librerías: rpm -iv panorama-tools-2.7a-1.U i386.rpm wxGTK-* fftw2-*
54
Número 04
Las herramientas Panorama incluyen libpano12,lo que no impide que el paquete gestor se queje de que el paquete falta porque las dependencias del paquete son erróneas. El camino que resuelve el problema implica especificar una opción del programa RPM para deshabilitar la comprobación de dependencia:
2-4.1.fc2.dag.i386.rpm Debian no dispone de los paquetes adicionales wxGTK que incluyen el nombre “xrc” en el paquete; en su lugar debemos buscar libwxgtk2.4-contrib-dev. Podemos usar los siguientes comandos para instalar las librerías requeridas, LibPano y Hugin:
rpm -iv --nodeps hugin-0.4-cvsU 20041021.bp.fc2.i386.rpm Si bien Suse tiene una versión de WxWindows por defecto, Hugin no puede usar la versión por defecto. Por tanto deberemos eliminar el paquete existente y usar los paquetes de Fedora en su lugar. No os preocupéis, funcionó bien en Suse 9.1 en nuestro laboratorio:
apt-get install libwxgtk2.4-devU libwxgtk2.4-contrib-dev fftw2 dpkg -i libpano12_20040917-1_i386.U deb dpkg -i hugin_0.4pre20040917-1_iU 386.deb Si esto funciona o no depende del software y las librerías que hayamos instalado con anterioridad. Si aun nos falta algún paquete puede que queramos intentar buscarlo en Google por su nombre y formato. Los cuadros de Autopano y Enblend nos ofrecen más detalles sobre los requisitos
rpm -iv panorama-tools-2.U 7a-1.i386.rpm wxGTK-xrc-2.4.U 2-4.1.fc2.dag.i386.rpm fftw-2.1.U 3-1102.i586.rpm hugin-200409U 21-1.bp.fc1.i386.rpm wxGTK-2.4.U
www.linux-magazine.es
Panoramas
KNOW HOW
Figura 3: Hugin muestra dos imágenes adyacentes, permitiendo al usuario
Figura 4: La pestaña Optimizer soporta el control granular de los valoras de
seleccionar los detalles de la imagen que se usarán como puntos de control.
optimización ajustados automáticamente por Hugin.
alto que el de la pestaña sobre la imagen de la derecha (figura 3). En otras palabras, si cuando empecemos las dos imágenes tienen un cero cuando empecemos debemos ajustar la pestaña de la derecha a uno. Entonces podemos usar las teclas de las flechas para mover las imágenes y Hugin nos mostrará imágenes consecutivas a la izquierda y a la derecha. También debemos echar un vistazo a auto fine-tune (ajuste fino automático) y auto-estimate (estimación automática), que le indica a Hugin que nos debe ayudar a asignar los puntos de control. La función auto add (añadir automáticamente) indica al programa que añada cada par de trazas en los puntos especificados, lo que también podemos hacer manualmente pulsando el botón Add. Si tenemos los puntos suficientes, podemos arrancar el proceso de machaqueo de números pulsando Optimizer (figura 4). Comprobamos la opción Positions (pairwise optim., starting from Anchor) para el Optimizer y luego pulsamos Optimize now!. Las tres cajas de texto debajo muestran el número de la imagen y el valor que
Hugin necesita para corregir la imagen individual a continuación de los paréntesis cuadrados con o sin marca. Si una imagen no esta marcada significa que Hugin no la modificará como ocurre con la imagen de referencia (Anchor). Si seleccionamos Custom parameters below para el Optimizer podemos ajustar manualmente los valores para cada imagen (esto es un ajuste para expertos). La barra Preview en la parte superior nos muestra una imagen previa con los valores calculados. Puede que queramos seleccionar Auto en la ventana de vista previa para indicar al programa que nos muestre los últimos resultados.
Montando imágenes La última pestaña, Stitcher (Coser), es el corazón del programa y el principal desafío al mismo tiempo: las cosas no siempre funcionan de la forma que se esperan. Coser es el proceso de poner múltiples imágenes juntas para crear una imagen panorámica. Este proceso normalmente implica primero alinear las imágenes y corregir la distorsión antes de proceder al cosido. Hugin soporta los llamados motores de
Tabla 1: Lentes y campos de visión Distancia focal
Campo de visión Panorama
28mm
65
Campo de visión Retrato 46
35mm
54
38
50mm
40
27
costura: los motores de costura son módulos de software que realmente ajustan las imágenes panorámicas. El “costurero” Nona suministrado con el programa funciona muy bien, si bien la calidad no es extremadamente bueno. Una cicatriz aparece en la mayoría de los casos. Antes de que comencemos a coser debemos asegurarnos de que seleccionamos Calculate Field of View para recalcular el área de visión. Sólo el autor del programa conoce porque Hugin no hace esto automáticamente. También necesitamos modificar el tamaño de la imagen seleccionando Calculate Optimal Size. Si usamos el motor de costura Noma suministrado con el programa el formato de imagen preseleccionado es JPG, por lo que solo deberemos pulsar Stitch now! . Transcurrido un poco de tiempo (o puede que bastante, dependiendo del tamaño y número de imágenes) dispondremos de la imagen final en nuestro disco duro con el nombre que hemos seleccionado. La alternativa es usar el programa externo Enblend, no soportado directamente por Hugin, lo que implica un paso más. Primero usamos Hugin para crear una serie de imágenes TIFF que estén correctamente alineadas pero no cosidas. Entonces seleccionamos la opción into a layered TIFF file for Stitch the images (ver figura 6). El programa entonces selecciona automáticamente Multiple TIFF como el
www.linux-magazine.es
Número 04
55
KNOW HOW
Panoramas
mente los puntos de control. AutopanoSIFT incluso busca emparejamientos que son invisibles al ojo humano. Para lanzar la herramienta ejecutamos el código no olvidando el nombre del archivo (usando el parámetro -o), analizado gramaticalmente luego por Hugin al igual que las imágenes individuales.
Caja 3: Mono para Autopano Autopano-SIFT está escrito en el lenguaje de programación C# y necesita las librerías del proyecto Mono [3]. Para usar el software no necesitamos el entorno completo de Mono. Sí necesitamos el interprete, el cual ejecuta el programa, y unas pocas librerías. Los paquetes de Suse son mono-core-1.0.2-1.ximian.9.1.i586.rpm, libicu26-2.6.2-1.ximian.9.0.i586.rpm, gtksharp-1.0.2-1.ximian.9.2.i586.rpm, libgtkhtml3.1_7-3.1.13.0.200405120525-0.s nap.ximian.9.1.i586.rpm. Los usuarios de Fedora no necesitan el paquete libgtkhtml. Los usuarios de Debian deberían añadir el deposito Apt a /etc/apt/sources.list e instalar los paquetes mono, libgtk-cil y libglib-cil a través de la línea de comandos. La página Web de Mono en Debian [4] nos ofrece más detalles. Los archivos ejecutables escritos en Mono son lanzados escribiendo mono programa.exe. El módulo basado en el kernel Binfmt-Misc puede ejecutar el código Mono directamente. La mayoría de las distribuciones incluyen el módulo por defecto. Si nuestro montador automático no carga los sistemas de archivos requeridos para usar esta función debemos intentar el siguiente comando: mount -t binfmt_misc none /proc/U sys/fs/binfmt_misc Por último debemos indicarle al kernel como reconocer los archivos Mono y lanzar mono . echo ':CLR:M::MZ::/usr/bin/mono:'U > /proc/sys/fs/binfmt_misc/register Suponiendo que nuestros archivos exe son ejecutables (chmod +x) ahora los podemos arrancar. Aún necesitamos desempaquetar Autopano-SIFT [5]. Para hacer esto podemos o arrancarlo directamente con /path/to/autopano-sift-2.0/bin/autopano.ex e o usar el programa Mono mono/path/to/autopano-sift-2.0/bin/autop ano.exe. Si todo esto funciona, Autopano debe producir un corto texto de ayuda. Si bin está en nuestra variable ejecutable PATH (ruta) no necesitamos introducir la ruta completa. Está es también la mejor forma de comprobar la versión basada en GUI autopanog.exe. Para permitir que el código autopano-complete.sh funcione debemos ajustar la variable PATH como hemos descrito con anterioridad. De lo contrario el código mostrará un error indicando que no lo encontró.
56
Número 04
autopano-complete.sh -o outputU left center right.jpg Figura 6: El módulo de costura de Hugin soporta varios formatos..
formato de salida. Pulsamos en Stitch Now!, y Hugin nos solicitará un nombre de archivo adjuntando un número de cuatro dígitos a los nombres de archivo de cada imagen. Entonces podemos lanzar una ventana terminal para coser las imágenes TIFF usando Enblend; usaremos -o para especificar el nombre del archivo: enblend -o panorama.tifU pic0000.tif pic0001.tifU pic0002.tif
Los resultados son impresionantes. Enblend cose las imágenes sin feas cicatrices.
Automatizando puntos de control Si todo esto implica demasiadas pulsaciones para nuestro gusto podemos usar otro programa que ajusta automática-
Cuadro 4: Enblend El paquete Enblend [6] no necesita nada especial en la línea de librerías aparte de LibTIFF y LibJPG. En Fedora y Suse podemos instalar Enblend escribiendo rpm -iv enblend-2.0-1.bp.fc2.U i386.rpm. Desafortunadamente, los binarios no están disponibles para cada distribución y puede que necesitemos construir Enblend nosotros mismos. La siguiente línea se ocupa de la instalación en Debian: apt-get install libjpeg62-devU libtiff4-dev libpng3-dev fftw-U dev libboost-graph-dev libU boost-dev libboost-python-dev Ahora podemos proceder a compilar Enblend.
www.linux-magazine.es
como alternativa puede que prefiramos usar autopanog.exe, basado en GUI, el cual hace exactamente lo mismo pero nos ahorra escribir el nombre de los archivos. Cuando cargamos el archivo PTO resultante con Hugin deberemos ajustar degrees of view en la pestaña Camera and Lens. Los pasos Optimizer y Stitcher son como se han descrito anteriormente.
¿Qué es lo siguiente? Estas pistas nos deberían ayudar a comenzar a crear nuestras imágenes panorámicas propias. El hecho de que ni siquiera hemos visto una mínima parte del ingente número de opciones y menús disponibles muestra el potencial de herramientas como Hugin. Una lista de correo amistosa nos ayudará a descubrir los últimos avances en el software panorámico, con usuarios muy felices de asistir a los desarrolladores. Es lógico pensar que los pequeños errores serán eliminados del programa en breve. Y si deseamos ayudar después de leer este artículo, ¿por qué no ha■ cerlo?
RECURSOS [1] Nueva página Web para las huérfanas Panotools: http://panotools.sourceforge. net/ [2] Hugin: http://hugin.sourceforge.net/ [3] Descargas Mono: http://www. mono-project.com/downloads/ [4] Mono en Debian: http://pkg-mono.alioth. debian.org/ [5] Autopano-SIFT: http://user.cs.tu-berlin.de/ ~nowozin/autopano-sift/ [6] Enblend: http://enblend.sourceforge.net/ [7] Paquetes para varias herramientas de panorámicas: http://bugbear.blackfish. org.uk/~bruno/ panorama-tools/
Yum
KNOW HOW
Al día con Yum
Hasta que Llegó su Hora Ni siquiera Linux está totalmente libre de errores y esto hace que lo más importante sea mantener el sistema actualizado con paquetes parcheados. Fedora utiliza la herramienta Yum para este trabajo. Y lo que es más, Yum puede actualizar sistemas Red Hat antiguos. POR ROMAN JORDAN
E
l programa Yum (Yellowdog Updater Modified) maneja la gestión de las actualizaciones de los sistemas Fedora. Yum detecta y resuelve las dependencias de programas más limpiamente que RPM. La Figura 1 muestra un ejemplo de una actualización de Yum con el paquete x11-org. Yum fue desarrollado por un grupo de usuarios de Linux en la Universidad Duke, [1]. La distribución Linux Fedora incluye este programa y los RPMs para distribuciones más antiguas están disponibles en [2]. Yum incluye algunas de las siguientes características: • Soporte para múltiples repositorios; • Ficheros de configuración simples con ASCII; • Chequeo de dependencias de paquetes;
Listado 1: Extracto de yum.conf 01 [base] 02 name=Fedora Core $releasever $basearch - Base 03 baseurl=http://mirrors.kernel. org/fedora/core/$releasever/$b asearch/os/ 04 05 [updates-released] 06 name=Fedora Core $releasever $basearch - Released Updates 07 baseurl=http://mirrors.kernel. org/fedora/core/updates/$relea sever/$basearch/os/
• Compatibilidad con RPM. Yum, que está desarrollado bajo GPL, se incluye con Fedora Core (FC) 1, 2 y 3.
Tiene sentido escoger un servidor mirror cerca de donde estamos para mejorar la velocidad de descarga.
Configuración del Servidor
Usos Prácticos
Yum necesita una fuente de datos en la red local o en Internet, aunque puede utilizar el equipo local. Por defecto, el fichero de configuración, /etc/ yum.conf, accede al servidor US. Los lectores internacionales pueden comprobar la lista en [3] para consultar un servidor local. Necesitará especificar el servidor indicado en la etiqueta baseurl. Yum soporta tanto servidores HTTP como FTP, aunque HTTP funciona mejor si se tiene un cortafuegos. Vamos a echarle un vistazo a cómo configurar Yum para usarlo con la página web de la Univerdidad de Stanford (http://mirrors.kernel.org/fedora/core/). Las entradas que se necesitan se muestran en el Listado 1, las cuales tienen una entrada para los paquetes básicos y una para las actualizaciones. Yum sustituye las variables, que se pueden identificar por los signos de dólar, con los valores apropiados en tiempo de ejecución.
Como se ha mencionado anteriormente, Yum se utiliza principalmente para la actualización de software. Para averiguar si los desarrolladores han realizado nuevas actualizaciones para Yum, ejecútese yum check-update como se muestra en la Figura 2. Dependiendo de la velocidad de su conexión a Internet, puede llevar varios minutos descargar los ficheros de cabeceras requeridos, que Yum va almacenado localmente. Las cabeceras contienen detalles de los paquetes pero no los paquetes en sí. yum list le proporciona una lista de los paquetes disponibles. Y yum update comienza a actualizar los programas. Como se muestra en el ejemplo x11org, Yum le deja especificar los paquetes individuales que quiere actualizar. Cuanto más tiempo se tarde entre actualización y actualización, mayor será el número de bytes que tendrá que descargar. Por ello, será conveniente configurar un servicio en segundo plano para que se encargue de las actualizaciones durante la noche. De hecho, Fedora ya tiene un servicio de actualización que hace esto. Para lanzar el servicio, tecléese:
Figura 1: Yum resolviendo dependencias del paquete x11-org.
www.linux-magazine.es
service yum start
Número 04
57
KNOW HOW
Yum
(anaconda es el programa de instalación de Red Hat y de Fedora) para actualizar el sistema. Una mejora completa del sistema siempre es una odisea, por ello asegúrese de que se dispone de una copia de seguridad. Deje que la actuaFigura 2: yum check-update muestra las actualizaciones disponibles. lización se complete para evitar que se quede el sistema medio actualizado y no Si quiere comenzar los servicios cuando arranque la distribución. se arranque la máquina, en vez de lo anterior usése el siguiente comando:
¡Cuidado con el Kernel!
chkconfig yum on
Puede utilizar la herramienta del GUI (interfaz gráfico) para lanzar los servicios en la sesión actual o configurar el servicio para lanzarlo cuando reinicie. Yum soporta el uso de comodines en los nombres de los paquetes. Por ejemplo, yum upgrade X11*
actualizará cualquier paquete que comience con X11. Por supuesto que Yum se ocupa de las dependencias.
Distro-Actualización Yum Yum puede incluso actualizar distribuciones completas, probablemente use Red Hat o Fedora. Podríamos actualizar Red Hat 9.0 al actual Fedora Core 3, por ejemplo. Un inconveniente es que la actualización de una distribución necesita mucho espacio en el disco duro y no funcionará si su sistema utiliza LVM (Logical Volumen Management). Los usuarios de LVM deberán acudir a los CDs de instalación y ejecutar la herramienta anaconda
El kernel es el centro de cualquier sistema, así que preste especial atención a lo que ocurre. Primero, deberá comprobar que versión del kernel tiene instalado: rpm -q kernel kernel-smp
Es buena idea ejecutar RPM o Yum para actualizar el kernel primero. Elimine cualquier versión del kernel que no necesite. Según los autores de Yum, no sólo ahorra espacio en disco, también puede evitarle un montón de problemas. El comando uname -a le dice la versión del kernel actual. Esto también es aplicable a los recursos del kernel. Los siguientes comandos eliminan un kernel y el código que le acompaña: rpm -e kernel-2.4.22-1.2115.nptl rpm -e kernel-source-U 2.4.22-1.2188.nptl
Puede darse el caso de que tenga que eliminar cualquier otro paquete que no forme parte de la distribución original pero que fue instalado más tarde. Si Yum
no encuentra una actualización para un paquete instalado, muestra un mensaje de error y se sale. Su mejor opción en este caso es eliminar el paquete y relanzar Yum. Siga repitiendo estos pasos de eliminar y reinstalar de nuevo el proceso hasta que Yum le avise. Para una descripción del software instalado, seleccione System settings | Add/Remove Application. Por supuesto, puede que necesite añadir Yum a su distribución original. Los ficheros de antiguas versiones Red Hat están disponibles en [1]. Debería evitar corregir a mano el fichero yum.conf; en vez de ello descargue el fedora-release2.4.i386.rpm y ejecute rpm -U para instalarlo. Esto asegura que Yum estableca las variables en yum.conf correctamente.
Conclusión Yum es extremadamente útil para la gestión de grupos de ordenadores en red. Teniendo un servidor de paquetes Yum en la red se facilita realmente el mantenimiento de todas las máquinas Linux. Las páginas de ayuda de Yum (man yum) proporcionan más detalles sobre el uso de Yum y el proyecto Yum facilita una lista de ■ correo para temas complejos.
RECURSOS [1] Página web del proyecto Yum: http:// linux.duke.edu/projects/yum [2] Descargas de Yum: http://linux.duke.edu/ projects/yum/download.ptml [3] Servidores mirror de Fedora: http://www. fedora.redhat.com/download/mirrors. html [4] Como mejorar el sistema con Yum: http:// linux.duke.edu/%7Eskvidal/misc/ fc1-fc2-yum-hints.txt [5] Multimedia repository: http://rpm.livna. org [6] FAQ no oficial de Fedora: http://www. fedorafaq.org/
Tabla 1: Yum – Opciones Útiles yum info up2date yum remove xemacs yum list yum search nmap gui
Muestra una corta descripción e información sobre el programa up2date. La salida de este comando se muestra en la Figura 3.
yum clean all yum update yum
Elimina toda la información del directorio cache de yum.
58
Número 04
Elimina el paquete del programa xemacs y unas cuantas herramientas que lo acompañan. Muestra información sobre los paquetes disponibles. Busca los paquetes dsiponibles para la cadena especificada (nmap y gui en este caso). Esto permite buscar los paquetes sólo si no conoce exactamente sus nombres. Actualiza el paquete Yum, si hay alguna actualización disponible.
www.linux-magazine.es
Charly
La rutina diaria del administrador de sistemas: OpenNTPD
Tiempo Libre
Kontact e IMAP ...........................62
suficiente, pero los ordenadores necesitan medidas de tiempo más precisas. Por suerte, existen relojes atómicos que pueden recibir señales de tiempo por radio y sin estar en Internet. POR CHARLY KÜHNAST Un servidor de tiempo actúa como un sistema de referencia y los otros sistemas de la red utilizan NTP para sincronizarse con este servidor. NTP es un viejo conocido para nosotros. (Solía llamarse XNTP.) [1] Pero me gustaría presentaros al servidor de tiempo OpenNTPD [2]. El servidor llega por cortesía del proyecto OpenBSD, pero también está disponible para Linux. El archivo tar con la última versión 3.6 es de sólo 113 Kbytes. Tras descomprimir el archivo como sigue:
Cómo configurar el Kontact para almacenar datos de la libreta de direcciones, calendario, etc. en un servidor IMAP.
Bloqueos ........................................64 Los bloqueos impiden conflictos cuando dos procesos intentan acceder al mismo recurso simultáneamente. Aprendemos a implementarlos en este artículo.
el primer servidor no responde, lo intentará con el segundo. Por supuesto, no sería de mucha utilidad si el servidor tomara la señal sólo y exclusivamente para él mismo, por el contrario, lo que pretendemos es que proporcione la señal como referencia a otros servidores de nuestra red. Esto es lo que indica la tercera línea. El servidor en la dirección IP 10.0.0.42 proporciona la señal de tiempo a otras máquinas de la red. Con esto se concluye la fase de configuración. Ya es hora de lanzar OpenNTPD:
tar xvzpf openntpd-3.6p1.tar.gz /usr/local/sbin/ntpd -s
se sigue con los pasos de siempre: ./configure make make install
para compilar el programa. El servidor debería estar localizado en /usr/local/sbin. Antes de nada, hay que decirle a OpenNTPD qué fuente va a proporcionar la señal de tiempo de referencia. Yo selecciono el servidor de tiempo de “Physikalisch-Technischen Bundesanstalt” en Braunschweig (PTB), en Alemania. El reloj atómico de PTB suministra una señal de tiempo basada en NTP.
Tres líneas para dos servidores
OpenNTPD inmediatamente compara su propio sistema de tiempo con la señal de tiempo suministrada por el servidor de referencia. Si el reloj local no está en hora, el servicio lo pondrá… gradual y cuidadosamente. OpenNTPD tan sólo establece la hora en un solo paso si el reloj del sistema está dentro de un rango de 180 segundos con respecto al tiempo de referencia; este es el valor que se establece con el parámetro -s cuando se ■ lanzó el programa.
INFO [1] NTP: http://www.ntp.org [2] OpenNTPD:http://openntpd.com/
OpenNTPd normalmente lee un fichero de configuración llamado /etc/ntpd.conf. Este fichero es bastante sencillo en nuestro caso:
EL AUTOR
S
SYSADMIN Búsquedas con find .................60 En un archivo de centenares de Gigabytes ¿cómo encontrar un fichero perdido?
Durante las vacaciones con tan solo echarle un vistazo a la posición del sol es
oy un tipo práctico y me encanta la puntualidad. Por supuesto, espero que mis servidores sean exactos a la hora de medir el tiempo. Medio minuto puede ser la diferencia entre un administrador feliz y un caos en la red. Por ejemplo, imaginemos que alguien me envía un mensaje de correo electrónico. Lo primero que ocurre es que los filtros de spam obtienen y comprueban el mensaje, para posteriormente pasárselo al servidor de antivirus. Si el servidor de AV da por válido el mensaje, el siguiente paso a seguir es distribuir el correo, el cual localiza el servidor de correo correcto y lo reenvía a su localización, donde finalmente el servidor de correo deposita el mensaje en mi bandeja de entrada. En otras palabras, los mensajes de correo electrónico en mi red pasan por no menos de cuatro servidores. Si hay un problema, compruebo los ficheros de registros para ver donde ha ocurrido el error. Y aquí es donde es imperativo que tengamos una lectura exacta del tiempo. El “timestamp” (marca temporal) permite a los administradores seguir el progreso de un mensaje a través de varios sistemas… suponiendo que los relojes de estos sistemas sean precisos. Esto es exactamente lo que hace el Network Time Protocol (NTP).
ADMINISTRACIÓN
server ptbtime1.ptb.de server ptbtime2.ptb.de listen on 10.0.0.42
Las dos primeras líneas identifican donde OpenNTPd tomará su señal de tiempo. Si
Charly Kühnast es Gerente de Sistemas Unix en el centro de datos de Moers, Alemania cerca del conocido Rhin. Entre sus labores se incluye la seguridad del cortafuegos, la disponibilidad y cuidado del DMZ (zona desmilitarizada).
www.linux-magazine.es
Número 04
59
ADMINISTRACIÓN
Find
Consejos de Experto: Find y Locate
Oficina de Objetos Perdidos Los ordenadores actuales con sus múltiples discos duros con Gigabytes y Gigabytes de espacio, almacenan miles de ficheros. Un fichero perdido puede causar gran cantidad de trabajo y también puede plantear un riesgo de seguridad. Afortunadamente, Linux tiene algunas herramientas versátiles para encontrar estos “ficheros perdidos”. POR ANDRÉ SELIG
S
i estás buscando ficheros en Linux, la línea de comandos es la mejor opción para unos resultados rápidos y fiables. Las GUIs como KDE (Figura 1) carecen de funcionalidad, flexibilidad y velocidad comparable. El comando más importante para la búsqueda de ficheros es find. Sin especificar ninguna etiqueta, la herramienta sólo buscará todos los ficheros bajo el directorio actual. Si quiere buscar en cualquier otro directorio, simplemente hay que especificar el nombre del directorio como primer argumento. Por ejemplo, find /home mostrará una lista de todos los ficheros y directorios bajo /home. Pero find realmente es útil cuando comienza a utilizarse con opciones. El argumento -name permite a los usuarios decirle los ficheros a buscar que coincidan con el patrón dado. Por ejemplo, find ~ -name "*firefox*" busca todos los ficheros en el directorio home del usuario que incluyan la cadena firefox en sus nombres. Tiene sentido encerrar los argumentos entre comillas dobles, o al menos, entre
60
Número 04
comillas simples. Esto impide que la shell expanda los parámetros como *firefox*.
Opciones, Pruebas y Acciones find reconoce tres tipos de argumentos: opciones, pruebas y acciones. Las “opciones” influyen en el comportamiento de find por sí mismo, por ejemplo, restringiendo el número de niveles de subdirectorios a buscar o restringiendo la búsqueda a una sola partición. Las “pruebas” permiten al usuario restringir la búsqueda a ficheros específicos, por ejemplo, ficheros que tienen menos de una semana, find -mtime -8; o ficheros que tienen más de una semana, find -mtime +7. Las acciones influyen en la forma que se muestran los resultados. La siguiente acción -exec command pasaría los nombres de los ficheros que encuentre al programa command. Las acciones también soportan operadores lógicos, permitiendo a los administradores especificar un comportamiento de salidas complejo. Esto quiere decir, que los administradores prefieren utilizar las pruebas más que
www.linux-magazine.es
usar otro tipo de argumentos. Las pruebas podrían restringir los comandos a un tipo específico, tal como -type f (para buscar sólo ficheros), -type d (para buscar sólo directorios) o -type l (para buscar sólo enlaces). Los administradores responsables buscan ficheros que pertenecen a usuarios o grupos inexistentes en el proceso de limpieza. El siguiente comando se ocupará de realizar esa tarea: find / -nouser -o -nogroup. La opción -o es el
Listado 1: Script generado por find 01 mkdir -p /export/backup//home/mas 02 cp -p /home/mas/.emacs /export/backup//home/mas/.emac s.copy 03 04 mkdir -p /export/backup//home/mas 05 cp -p /home/mas/.fetchmailrc /export/ backup//home/mas/.fetchmailrc. copy
Find
públicos (como /tmp o el directorio /home) no es muy buena idea. Hay un retardo entre el hallazgo de los archivos que coinciden con el parámetro de búsqueda y la ejecución de la orden indicada y un atacante ladino podrían explotar este hueco. En el pasado ha habido numerosos ataques en instalaciones Unix que Figura 1: El programa de KDE, KFind da un excelente interfaz utilizaban el comando find para la búsqueda de ficheros, pero no puede competir con la para limpiar el directorio flexibilidad de find /tmp. El parámetro -exec es seguido por un comando operador lógico OR, que enlaza las dos que se incluye entre corchetes {}. El expresiones, -nouser y -nogroup. Otro programa sustituye los corchetes por el truco que es muy útil para los adminombre del fichero que encuentre en la nistradores es la búsqueda de ficheros búsqueda. Un punto y coma finaliza el por el UID o GID usando find / -perm comando. Necesitamos escapar el +6000 -ls. El -ls añade a este comando punto y coma con una barra para que ejecute ls -lisd para cada fichero. impedir que la shell lo interprete. El siguiente comando es una variante del Ejecución de Comandos comando DOS ren , que renombra ficheros con la extensión *.txt a la -exec permite usar nombres de ficheros extensión *.txt.bak: como argumentos y hasta crear pequeños guiones. Pero hay que tener $ find . -name '*.txt'U cuidado con los peligros: usando esta -exec mv {} {}.bak \; funcionalidad como root en directorios
Ficheros de Otros Usuarios Locate utiliza una base de datos centralizada, lo que puede llevar a una cuestión de seguridad en algunos entornos. Si un usuario quiere ocultar un fichero, que normalmente se hace asignándole permisos al directorio (chmod go -rwx). Esto hace que los ficheros no sean visibles por los comandos como find y ls, excepto para los propietarios y por supuesto, para el root. Sin embargo, si el fichero está almacenado en la base de datos, porque updatedb se ejecutó con privilegios de root (mediante crontab o por el root), llegarán a ser visibles para todo el mundo. Aunque los otros usuarios sólo conseguirán ver el nombre del fichero. Los sistemas multiusuarios pueden utilizar los parámetros --localuser y --netuser cuando realicen la llamada a updatedb. La herramienta espera un nombre de usuario como argumento. El nombre de usuario debería ser nobody, por ejemplo, en un sistema en el que los usuarios tengan privilegios limitados. Esto significa que la base de datos de locate sólo contendrá un mínimo de ficheros visibles.
Si los requisitos de lo que queremos h a c e r s o n m a s c o m p l e j o s, s e r í a preferible usar la salida de find en un script de la shell. El comando -printf puede ayudarnos. El siguiente comando crea un fichero como el mostrado en el Listado 1: $ find /home/mas -type fU -name '*.txt' -printf "mkdirU -p /export/backup/%h\ncpU -p %p /export/backup/%h/U %f.copy\n\n"
Locate Además de las características mencionadas aquí, find tiene un amplio rango de opciones que no podemos incluir. Sin embargo, el programa tiene un gran inconveniente: es lento. find analiza los directorios de búsqueda uno por uno y también puede tener que analizar los inodos de los archivos para realizar las pruebas que se le especifican. Si sólo necesita buscar una subsección del directorio home con unos cuantos cientos de ficheros, no
ADMINISTRACIÓN
notará el retardo. Pero si se está buscando un fichero que está oculto en cualquier parte del sistema, find necesitará buscar entre los miles y miles de ínodos. Naturalmente, esto puede llevar algún tiempo. Locate resuelve este problema mediante la creación de un índice de los ficheros recopilados en el equipo y almacenando sus nombres en una base de datos centralizada. La herramienta no necesita leer los ínodos para realizar la búsqueda; en vez de ello buscará en la base de datos. Está búsqueda normalmente devolverá los resultados en una fracción de segundo, eliminando la necesidad de esperar unos minutos y también evita cualquier posible efecto en el funcionamiento para usuarios y servicios. Locate tiene unas cuantas limitaciones, así que en muchos casos, se sigue utilizando find. En vez de la compleja sintaxis de find en la línea de comandos, locate sólo soporta búsquedas básicas de componentes de nombres de ficheros (de hecho, esto es todo lo que se almacena en la base de datos). La herramienta locate tiene comodines, como la interrogación para un solo carácter y el asterisco para unos cuantos caracteres. Estos comodines también pueden representar al carácter barra (/), en contraste con los comodines de la shell: $ locate /home/mas/*mail* /home/mas/.fetchmailrc /home/mas/.procmaildata-bulk /home/mas/.procmaildata-inbox /home/mas/.procmailrc
Hay dos requisitos básicos para la utilización de locate, sin embargo pueden ser bastante molestos. El primero de todos, no todas las distribuciones de Linux instalan esta utilidad GNU. En segundo lugar, la base de datos normalmente se actualiza mediante cron. Si se apaga el equipo durante la noche y si la distribución no utiliza Anacron o una herramienta parecida para actualizar con las tareas del cron que han fallado, los usuarios necesitarán actualizar la base de datos manualmente uti■ lizando el comando updatedb.
www.linux-magazine.es
Número 04
61
ADMINISTRACIÓN
Kontact + IMAP
Kontact con agenda y gestión de direcciones basados en IMAP
Todos a Bordo Kontact proporciona correo electrónico, libreta de direcciones y agenda en un sólo paquete. Con soporte IMAP significa que se puede acceder a los datos desde cualquier sitio en la red. POR DANIEL MOLKENTIN
L
a aplicación Kontact 1.0 Personal Information Manager (PIM) para KDE soporta una característica que proporciona un sistema basado en IMAP para almacenar en la red la agenda y las direcciones. Kontact permite almacenar la información de la agenda y de las direcciones junto con los mensajes de correo electrónico en un servidor IMAP. Esta información está disponible cada vez que se acceda al servidor desde cualquier parte de la red.
Recursos IMAP Con el crecimiento diario de los buzones de correo electrónico, cada vez más proveedores ofrecen a sus clientes acceso a un servidor IMAP (Internet Message Access Protocol). IMAP tiene varias ventajas sobre el anterior protocolo POP (Post Office Protocol). A pesar de ello, tan sólo unos pocos proveedores de Internet han proporcionado a sus clientes la suficiente capacidad de almacenamiento como para aprovechar al máximo las capacidades que puede llegar a ofrecer IMAP. Pero Google ha empezado la ofensiva en la guerra de las cuentas de correo electrónico de los Gigabytes y sus competidores están
Glosario Recursos: El concepto Kontact de un recurso es una agenda o libreta de direcciones almacenada en una localización específica (como otro ordenador o un servidor), al que se puede acceder usando un protocolo específico (IMAP, ssh, etc).
62
Número 04
empezando a ofrecer capacidades similares en los buzones de sus cuentas. Independientemente de que se tenga una cuenta IMAP con un proveedor comercial o se tenga un servidor IMAP en una red local, uno puede aprovecharse de los beneficios que puede proporcionar Kontact con su característica de almacenamiento centralizado. Kontact soporta los llamados recursos IMAP, que fueron originalmente diseñados para usarse con el servidor Kolab [2]. De hecho, los recursos IMAP son carpetas especiales que almacenan información de contactos y direcciones en vez de correos electrónicos. Estas carpetas normalmente están escondidas, aunque se pueden hacer visibles para realizar pruebas. En este artículo, mostraremos cómo acceder a los datos de las direcciones y la agenda basadas en un servidor con Kontact. Se necesita al menos Kontact 1.0 de KDE 3.3.0, aunque es recomen-
dable KDE 3.3.1. Léase “Actualización de KDE” para más detalles sobre la manera de actualizar KDE en una instalación de Suse Linux.
Configuración de Kontact
El primer paso es proporcionarle a Kontact los detalles de la cuenta IMAP. Kontact permite especificar una cuenta IMAP online o una cuenta IMAP desconectada. Elegir la opción desconectada le indica a KMail que guarde localmente una copia de cada fichero almacenado en el servidor. Esta opción tiene sentido especialmente para los usuarios de ordenadores portátiles o si el servidor no tiene una conexión permanente a Internet. Por el contrario, no se recomienda el uso de la opción de IMAP normal, en vez de la de desconexión, ya que los usuarios tendrían que actualizar manualmente las carpetas - lo que no es viable. Para instalar la cuenta en Kontact, escoja Settings | Configure KMail | Network y selecciónese Add en la solapa Receiving. Una vez configurado el buzón de correo, váyase a la solapa Misc y selecciónese Configure KMail. Hay que seleccionar Enable groupware functionality. Para Figura 1: Las opciones del idioma en las carpetas del grupo de trabajo la opción etiquetada son tan solo requeridas cuando se intente acceder desde Microsoft Resource folders are subOutlook. folders of, se selecciona
www.linux-magazine.es
Kontact + IMAP
ADMINISTRACIÓN
anótese la URL de la libreta de direcciones local e impórtese la URL seleccionado File | Import | Import vCard.
Prioridades
Figura 3: La migración a la cuenta IMAP proporciona una gestión consistente de la agenda y la libreta de direcciones desde distintos ordenadores. Figura 2: Antes de que pueda migrar a la cuenta de IMAP, hay que definir una agenda nueva.
inbox. Pero hay que tener cuidado: si selecciona su bandeja de entrada normal, será capaz de guardar sus datos, pero tan sólo se almacenarán localmente. Esto es un punto a tener en cuenta para comprobar en el caso de que surja algún problema. Si las carpetas del grupo de trabajo no existen, Kontact las creará automáticamente ahora. Normalmente, no importa el idioma que use el programa para las carpetas: tan pronto como se tenga todo configurado, se querrá ocultar las carpetas seleccionando Hide workgroup folders. Pero si se usa un cliente Outlook al mismo tiempo que Kontact, no hay que perderle la vista a las opciones del idioma.
Migración Por último, tendrá que migrar su agenda y su libreta de direcciones. Tasks usa la misma configuración que la agenda, así que se puede ignorar. Lo primero que hay que hacer es crear una agenda nueva. Para ello, hay que abrir la vista sobre la agenda existente a la izquierda debajo de la vista del mes. Seccionando Add, se selecciona el elemento Calendar on IMAP-server via kmail en el desplegable, y por último se teclea un nombre intuitivo para la agenda nueva, como Agenda en el servidor IMAP. Kontact debería mostrar ahora la agenda local y la agenda nueva en Resources. El siguiente paso es mover las citas desde la agenda local a la agenda nueva. Para ello, primero se selecciona la agenda local y luego se usa el cuadro de diá-
logo Edit para copiar la ruta del sistema de ficheros. Posteriormente hay que deshabilitar el recurso local en el botón. Sus citas deberían estar ocultas al principio. Seleccionando File | Import | Merge Calendar, importará la ruta copiada en el paso anterior como una Address y se selecciona OK. Sus eventos deberían estar ahora en el servidor IMAP. Hay que seguir los mismos pasos para la libreta de direcciones: las libretas de direcciones están ocultas en Settings | Show extension bar | Address books. De nuevo hay que crear un recurso IMAP;
Actualización de KDE Para que todo esto funcione, se necesita Kontact 1.0 en KDE 3.3 o superior. Las buenas noticias son que los usuarios de Suse 9.1 y 9.0 se pueden beneficiar de KDE 3.3. Existe incluso una forma sencilla de actualizarse, suponiendo que se dispone de una conexión rápida de Internet: la descarga ocupa unos 300Mb. Para empezar la actualización, hay que salirse del GUI y, como root, lanzar la versión en modo texto de YaST en la consola. En Software | Change Source of Installation se añade una nueva entrada ftp://ftp.suse.com/ pub/suse/i386/supplementary/KDE/ update_for_9.1/yast-source/ (bzw. update_for_9.0). Una vez hecho esto, se selecciona System Update. Hay que indicarle al gestor de paquetes que resuelva (Resolve) cualquier dependencia. Se puede ignorar los conflictos que tengan que ver con kdebase3-suse. Si tiene problemas de estabilidad después de la instalación, habrá que eliminar kdebase3-suse. Sin embargo, eliminando kdebase3-suse se elimina la integración de KDE Suse.
El procedimiento que se ha detallado permite ligar cualquier número de ordenadores a sus recursos IMAP. Sin embargo, asegúrese de que la primera máquina intercambia los mensajes de correo con el servidor primero. Si no tiene eventos o direcciones que sincronizar, se pueden saltar los pasos de la migración. En este caso, simplemente hay que deshabilitar la agenda local. Si surge algún conflicto - quizás porque dos clientes tengan el mismo evento - la cita nueva ganará. Kontact no tiene un sistema de resolución de conflictos, es decir, una opción para mezclar dos citas.
Vistas Si intenta usar los recursos nuevos en Windows, tendrá dos opciones. Una opción es el cliente compatible Kolab Athera [3] para Windows de The Kompany. Pero si quiere tener Outlook o si no tiene permiso para eliminarlo, debería considerar usar el plug-in para Outlook de Toltech. Desafortunadamente, el cliente es software comercial y tiene un coste de 14 $ US por máquina. Ambos programas permiten que se puedan usar los recursos IMAP en el entorno de Microsoft. Los usuarios de la versión de Outlook tendrán que usar el idioma cuando creen los recursos en el servidor de IMAP.
Progreso Además de no disponer de una característica para la resolución de conflictos, Kontact actualmente carece de la opción para usar múltiples recursos IMAP. Ambas funciones estarán disponibles cuando la versión 3.4 del paquete KDE PIM salga a la luz. Su salida está prevista ■ para principios del 2005.
RECURSOS [1] Sitio web de Kontact: http://www. kontact.org [2] Sitio web Kolab: http://www.kolab.org [3] Cliente Athera: http://www.thekompany. com/projects/aethera/
www.linux-magazine.es
Número 04
63
ADMINISTRACIÓN
Bloqueos
Consejos Expertos
Competencia Encarnizada Un genuino sistema multitarea como Linux ejecuta varios procesos concurrentemente. Los programas deben competir por el acceso a los datos. Con la asignación de bloqueos a los ficheros se asegura el acceso exclusivo y se previene la posibilidad de pérdida BMW AG
de datos. POR MARC ANDRÉ SELIG
L
a mayoría de máquinas Linux tienen un MTA, un Agente de Transferencia de Correo. Este puede ser Postfix, Exim o simplemente Sendmail. El MTA utiliza el proceso Fetchmail o TCP para transferir mensajes de correo electrónico. Cuando el MTA encuentra un mensaje dirigido a un usuario local, se lo pasa al Agente de Entrega Local (LDA). Y el LDA lo almacena en un fichero buzón, posiblemente después de darse una vuelta por un filtro como Procmail. Si dos mensajes llegan a la vez, el MTA manejará a ambos en el mismo proceso de LDA (véase Figura 1). Cada proceso entonces intentará escribir en el mismo archivo buzón, al mismo tiempo. Si se tiene suerte, los mensajes terminarán en el archivo correcto, pero en orden incorrecto, aunque habrá mayor probabilidad de perder el archivo ya que los procesos se sobrescriben los datos unos a otros.
Acceso Organizado con Bloqueos Los bloqueos son la respuesta típica a esta cuestión. Un bloqueo deniega el acceso a un recurso mientras otro proceso lo esté usando. Si se intenta acceder a un fichero bloqueado, se mostrará un mensaje de error o el fichero que
64
Número 04
quiere utilizarlo deberá esperar un poquito. La función no volverá al programa principal hasta que el proceso actual no haya liberado el fichero, permitiendo al siguiente usuario abrirlo. Así, los bloqueos pueden solucionar el problema de los mensajes de correo electrónico que llegan al mismo tiempo. El LDA con el primer mensaje simplemente paraliza el buzón. El LDA con el segundo mensaje obtiene un error cuando intenta abrir el buzón, espera un ratito y vuelve a intentarlo otra vez más tarde. Cuando el primer LDA ha escrito el mensaje, ha cerrado el buzón y ha quitado el bloqueo no hay nada que detenga la llegada del segundo mensaje. Lamentablemente, los bloqueos de archivo también crean unos cuantos problemas. Uno de los problemas más comunes y de menor importancia es que pueden cambiar el orden en el que las cosas pasan. El argumento siguiente explica qué puede pasar: imaginemos que el LDA solamente entrega un mensaje y tiene bloqueado el buzón; un segundo proceso está esperando que el archivo sea liberado ya que necesita entregar un segundo mensaje. Qué ocurre si un tercer mensaje llega exactamente al mismo tiempo que el primer LDA libera el buzón. El tercer mensaje otra vez bloquea el archivo y el
www.linux-magazine.es
segundo LDA tiene que esperar: un clásico ejemplo de una carrera de competición.
Anticuado Los bloqueos antiguos son un problema mucho más serio. Este tipo de bloqueos ocurren cuando un programa no logra liberar archivos porque estos se han colgado o un usuario ha matado el programa. Esto significaría que otros procesos tendrían que esperar literalmente una eternidad a que el archivo sea liberado.
Listado 1: Bloqueo de un fichero con Perl 01 #!/usr/bin/perl -wT 02 use Fcntl ':flock'; 03 sysopen(FH, "File", O_RDWR|O_CREAT) or die 04 "Error sysopen: $!"; 05 flock(FH, LOCK_EX) or die "Error flock: $!"; 06 07 # ... Escribir a fichero ... 08 09 flock(FH, LOCK_UN) or die "Error flock: $!"; 10 close FH or die "Error close: $!";
Bloqueos
Figura 1: Sin bloqueo, dos mensajes de correo que llegan a la vez podrían sobrescribirse entre ellos, ya que un proceso LDA no se da cuenta de lo que el otro hace.
Los mensajes de correo electrónico no pueden ser entregados y los usuarios no pueden editar el buzón. Los bloqueos antiguos son particularmente peligrosos en servidores NFS; hasta pueden causar la parada del servidor. Cuando un programa utiliza bloqueos, debería comprobar si hay un proceso activo asignado al archivo bloqueado. Algunos bloqueos desaparecen automáticamente cuando el proceso que lo acompaña finaliza. Otros ficheros de bloqueo utilizan la identificación del proceso en sus nombres o como parte de su contenido.
Variantes de Bloqueos Hay muchas formas distintas de implementar el bloqueo de archivos. Las dos categorías básicas son bloqueos obligatorios y bloqueos informativos, el kernel que tenga el sistema llama a ambas variantes. Los procesos no pueden ignorar a los bloqueos obligatorios. El kernel tiene
Listado 2: Bloqueando un fichero en Perl 01 #!/usr/bin/perl -w 02 use Fcntl; 03 sysopen(FH, "file.lock", O_WRONLY|O_EXCL|O_CREAT) 04 or die "Error sysopen: $!");
cuidado de denegar el acceso al recurso bloqueado hasta que el bloqueo se quita. Esto es básicamente un método de seguridad, aunque sea susceptible a bloqueos antiguos e inútil para sistemas de ficheros de red como NFS y AFS. Un bloqueo informativo o circunstancial es simplemente una nota en el sentido en que un archivo está bloqueado, aunque no hay nada que indique si los programas respetarán el bloqueo. Esto siempre hace que tome sentido el tener cuidado con archivos bloqueados. Los bloqueos “blandos” de esta clase pueden implementarse por el kernel y por las bibliotecas específicas de los usuarios. Asimismo es posible usar ficheros para implementar bloqueos a modo de aviso. Este método también funciona con NFS, suponiendo que el programa proporciona funciones más o menos atómicas de apertura de ficheros. Las noticias malas son: si se busca escribir un programa para usar con cualquier tipo de Unix, los bloqueos obligatorios no son una buena opción. Lo bueno es que los programas para usar con cualquier versión de Linux son mucho más simples, desde que Linux tiene la función POSIX-compatible fcntl (que es idéntica a lockf en Linux) y la BSD-compatible flock. Las bibliotecas a menudo facilitan el empleo de estos monstruos. El listado 1 muestra un ejemplo en Perl.
Ficheros de Bloqueo Los antiguos semáforos son más simples que los bloqueos del kernel que hemos visto hasta ahora. Literalmente hablando, un semáforo es una señal visual para controlar el tráfico. Bajo Unix, un semáforo es un archivo o la estructura de
Listado 3: Bloqueo primitiva de fichero desde el Shell 01 #!/bin/sh 02 # lockfile is part of the procmail distribution and 03 # available on most Linux distributions 04 lockfile file.lock 05 # ... 06 rm -f file.lock
ADMINISTRACIÓN
datos que indica un estado, por ejemplo el estado de un recurso. Los programas indican que un buzón está bloqueado añadiendo una extensión .lock al nombre del archivo (por ejemplo, el archivo de buzón /var/mail/ mas conduciría a un fichero de bloqueo llamado /var/mail/mas.lock). Esta técnica funciona con NFS, aunque se supone que permite al programa modificar el buzón creando un archivo nuevo en /var/mail/. Los programas tienen que comprobar la existencia de ficheros bloqueados, como los mencionados anteriormente. La comprobación y la creación de este tipo de ficheros debe ser una operación única para permitir la exclusión mutua dentro de la sección crítica. El pseudocódigo siguiente muestra cómo controlar la condición de entrada a la sección crítica: IF: no existe fichero.lock THEN: crear fichero.lock ELSE: esperar
Si dos programas ejecutan este código exactamente en el mismo tiempo, ambos entran en la rama de la condición del THEN y crean el archivo de bloqueo. Esto debilita completamente el principio de bloqueo, ya que otra vez ambos programas tendrán acceso al buzón al mismo tiempo. El código siguiente tiene más sentido: IF: crear fichero.lock exclusivo THEN: hacer algo ELSE: esperar
Esto comprueba y crea el fichero de bloqueo en una única operación. Incluso si dos programas controlan este código al mismo tiempo, no entrarán a la vez en la sección crítica porque uno de los programas creará el archivo antes que el otro. El listado 2 muestra una puesta en práctica del pseudo-código anterior en Perl. El script del Listado 3 emplea el programa lockfile que forma parte de Procmail. Unas palabras de advertencia: para sistemas de archivos de red, los ficheros de bloqueo no son muy fiables normal■ mente.
www.linux-magazine.es
Número 04
65
Bienvenidos a Linux User Ésta es la sección dedicada a la presentación de software interesante y útil que nos ayuda en nuestro quehacer diario con el escritorio Linux. Aquí aprenderemos a utilizar software estándar de una manera más eficiente, adquiriremos valiosos conocimientos y descubriremos apasionantes nuevas aplicaciones.
Herramientas: Superkaramba
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67 SuperKaramba permite dotar de un aspecto precioso a tu escritorio con una colección de temas que te permitirá dar a tu entorno de trabajo un toque personal.
Desktopia: xvidcap
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69 Muchas veces puede resultar difícil explicar la funcionalidad de una aplicación con palabras. Un pantallazo puede ayudar, pero si necesitamos algo más que una imagen fija, xvidcap nos puede ayudar. Ahora es posible hacer ayudas de tutoriales que usan animaciones grabadas por nosotros mismos usando el software para que otros puedan ver exactamente lo que estamos haciendo.
Configuracion: GFTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72 Tanto si le gustan las transferencias de ficheros desde una GUI o desde la línea de comandos, GFTP tiene la herramienta adecuada para el trabajo diario. El cliente de GFTP también soporta características avanzadas como la transferencia segura de ficheros con SSH.
Programación Básica: XUL (IV)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75 Sin duda hay mucho donde rascar con el navegador Mozilla. En este artículo usaremos XUL para crear el menú de una página Web perfecta. A lo largo del camino aprenderemos cosas sobre el Lenguaje de Coligación Extensible (XBL) y como podemos usar XBL para realzar la potencia de nuestras creaciones en XUL
Educación: Otros Idiomas. Otros Caracteres
. . . . . . . . . . . .80 Con un poco de filosofía por compañera, expondremos el modo en que podemos satisfacer las necesidades de nuestros compañeros profesores de otras lenguas, y de los alumnos inmigrantes, en materia de interfaz de usuario y de entrada de caracteres.
Linea de Comandos: diff
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85 Los programas diff y diff3 del paquete diffutils nos ayudan a comparar ficheros de texto, mostrando cualquier variación entre ellos en la línea de comandos e, incluso, si es necesario, automáticamente mezclará los ficheros.
Iniciación a LaTeX (IV): Bibliografías y Más Allá
. . . . . .87 Con esta cuarta entrega llegamos al final de este curso. Hemos considerado necesario llegar hasta esta entrega para poder alcanzar un nivel que nos permita construir nuestro primer documento completo, un proyecto con índices, capítulos y bibliografía, construido a partir de ficheros independientes.
KTools
LINUX USER
Ktools: SuperKaramba
Decoración de Escritorios SuperKaramba permite dotar de un aspecto precioso a tu escritorio con una colección de temas que te permitirá dar a tu entorno de trabajo un toque personal. POR STEFANIE TEUFEL
L
a extensión de escritorio de extensiones del escritorio, no obstante, make; make install. Y, como de costumSuperKaramba realmente realza la versión 1.0 es tan inestable que para bre, no debemos olvidar la variable de nuestro escritorio. SuperKaramba este artículo hemos decidido restringirnos entorno KDEDIRS que refleje la ruta a los es útil para un amplio número de tareas, a la versión 0.34 (la versión estable más directorios KDE. Por ejemplo, podemos como mostrar información de la carga actual). El programa esta disponible en la ajustar la variable de entorno KDEDIRS del procesador o el uso de memoria, página Web del proyecto en la dirección de la siguiente forma: archivos de registros o alimentadores de http://netdragon.sourceforge.net/index. noticias. Superkaramba nos ofrece un php?page=Download%20SuperKaramba. export KDEDIRS=/opt/kde3:/usr/U enfoque ordenado y flexible a la hora de Como es habitual cuando se trata de local/kde personalizar nuestro escritorio aplicaciones en proceso de desarrollo, no Tras construir el programa satisfactoriaLa flexibilidad es uno de las mayores hay paquete oficial RPM disponible mente, tendremos una entrada en nuestro ventajas de SuperKaramba. Con sólo unas actualmente. Tras la descarga de menú de inicio para Tools | pocas líneas de código podemos modificar Superkaramba debemos descomprimir el SuperKaramba. La pulsaremos para fácilmente el programa para que iniciar el programa. Alternativarefleje nuestras necesidades. Esta mente podemos escribir flexibilidad significa que no existe superkaramba & en una ventana de una configuración predeterminada terminal. Seremos recompensados de Superkaramba. Pero continuemos con la aparición de una pantalla de viendo más sobre los variados y cobienvenida como la que aparece en lorista ejemplos preconfigurados la Figura 1. La pantalla nos solicita (también conocidos como temas) que indiquemos dónde queremos ir que van desde extremadamente a continuación. útiles a simplemente bonitos. Pulsando Help… iremos directaAlgunos lectores puede que estén familiarizados con el predecesor de mente a la página de ayuda del Superkaramba, conocido simpleprograma si tenemos conexión a mente como Karamba. La principal Internet. Download… nos lleva a innovación introducida por la página de temas oficiales de la Figura 1: La pantalla de bienvenida de SuperKaramba nos lleva Superkaramba es su habilidad de aplicación (también hay enlaces a importantes sitios. hacer guiones, por ejemplo con directos listados en el panel de la Python. Esta extensión significa que el código fuente y construir la aplicación derecha). Pulsar Open… nos permite programa está incluso mejor preparado nosotros mismos. De nuevo, el truco de abrir temas de Superkaramba en nuestro para usos interactivos. las tres cartas funcionará: configure; ordenador. Actualmente, los desarrolladores están trabajando duro en la nueva generación
Glosario
KTools En esta columna presentaremos cada mes herramientas que han demostrado ser especialmente útiles trabajando bajo KDE, resolver un problema que de otra forma se ignoraría deliberadamente o simplemente son de las cosas más agradables de la vida, sin las cuales no querríamos pasar una vez descubiertas.
Python: Python es un lenguaje de programación desarrollado a principios de los noventa por Guido van Rossum. No debemos preocuparnos si nos asustan las serpientes (el nombre del lenguaje proviene el los comediantes británicos Monty Python). Python es útil para escribir programas para el interfaz de comandos Linux al igual que Perl, pero también puede utilizarse para programar aplicaciones completas para el escritorio de
Linux. Una gran variedad de módulos (para manipulación de imagen y sonido o exportación XML por ejemplo) y el hecho de que el intérprete está disponible para casi cualquier plataforma de sistemas operativos ha hecho de Python un lenguaje aceptado universalmente. No obstante, en contraste con Perl o con PHP, Python fue diseñado desde el principio como un lenguaje orientado a objetos.
www.linux-magazine.es
Número 04
67
LINUX USER
KTools
mostrado en la Figura 5, es similar al main.theme pero mucho más colorista. Además, muestra los números de las versiones del kernel y KDE, nos monitoriza el tráfico de red, nos proporciona salida del comando uptime y controla el popular reproductor de audio XMMS.
Cálculos
Figura 2: Abriendo temas en SuperKaramba. Figura 4: Es una lástima que el tiempo sea más
El motivo de la calculadora del escritorio (http://www.kdelook.org/content/show. php?content=14426) proporciona al usuario una completa calculadora que nos recuerda a la del sistema operativo Mac OS X. Si nos hemos acostumbrado a las pulsaciones únicas como usuarios de KDE, esta aplicación puede que nos llegue a confundir, puesto que requiere pulsaciones dobles para introducir datos y calcular. Si es así puede que deseemos pulsar con el botón derecho del ratón para que aparezca el menú contextual y bloquear el tema. Esto cambiará su comportamiento hacia uno de pulsación simple.
Por cierto, en lugar de sólo visitar la difícil de cambiar que el tema. página de descarga predeterminado, puede que también queramos visitar memoria. Al igual que cualquier otro http://www.kde-look.org. La sección tema, añade una perfecta transparencia a Karamba tiene muchos más nuestro escritorio. Por motivos que la página oficial supuesto, esto solo se ve del proyecto. Pero los bien si tenemos una imagen desarrolladores prometen que como fondo de escritorio. Si esto cambiará pronto, puesto no es así puede que no que el archivo “temas” pronseamos capaces de ver nada. El Día de Mañana to dejará de ser beta y será Pulsaremos con el botón extendido en el futuro. derecho sobre el tema para ¿Paraguas o gafas de sol? ¿Abrigo de Es posible que también abrir el menú contextual, en invierno o protector solar? El tema “Liadvirtamos una bala de el que encontramos quid Weather” (http://www.message.co. cañón en nuestro lanzador opciones como Open new nz/~matt-sarah/lwp-3.1.1.tar.bz2) no que nos da acceso a los theme (abrir nuevo tema), solo nos mantiene al día de las últimas temas en nuestro equipo, bloquear o desbloquear la previsiones meteorológicas, si no que permitiéndonos cargar posición de un tema (Toggle también nos ofrece datos para los próxitemas adicionales o elegir Figura 5: Al margen de locked position), Close this mos cinco días en una bonito formato. entre los activos (Figura 2). mostrar información de theme (cerrar Tras descargar el tema nuestro sistema, el tema este tema), podemos recuperar el menú Ceñirse al Tema Ubermon nos ofrece Quit(cerrar) el contextual para proceder a controles de nuestro Como hemos mencionado programa o ediconfigurar el tema (Confireproductor MP3. previamente, podemos pultar el código gure theme, Figura 4). sar Open en la ventana de fuente del tema. La forma más fácil de selección para abrir un tema. El paquete Para editar el código debeencontrar el tiempo local es incluye por omisión un tema de prueba mos seleccionar esta última seleccionando Find location Figura 6: Liquid Weather llamado main.theme oculto en opción, y Superkaramba on weather.com (Buscar nos ofrece la predicción superkaramba-0.34/examples/autoHide/. cargará el código fuente del localización en del tiempo en nuestro Como podemos observar en la Figura tema actual en nuestro ediweather.com), donde introescritorio. 3, el tema nos muestra la hora del sistor de texto predeterminaduciremos el nombre de la tema, el uso de la CPU o la carga de do. Para saber como modilocalidad en la que nos ficar los parámetros que permiten camencontremos. No nos debemos preocubiar el aspecto y funcionalidad del tema par si no hay datos sobre la localidad recomendamos los HOWTOS localizados buscada de forma inmediata. Deberemos en las siguientes páginas: http:// recargar el tema para obtener la informanetdragon.sourceforge.net/index. ción que deseamos (en nuestro ejemplo php?page=Create+A+Theme thttp:// de la figura 6 muestra el tiempo en USCIwww.efd.lth.se/~d98hk/karamba. TYHERE). Incluso podemos optar por que nos muestre los resultados en Un Mundo de Color unidades métricas pulsando Use metric Figura 3: Toda la información que necesitamos en El tema Ubermon (http://www.kde-look. units (Celsius) si preferimos grados Cel■ un bonito paquete. org/content/show.php?content=13166), sius en lugar de grados Fahrenheit.
68
Número 04
www.linux-magazine.es
xvidcap
LINUX USER
xvidcap
Tele-Linux Muchas veces puede resultar difícil explicar la funcionalidad de una aplicación con palabras. Un pantallazo puede ayudar, pero si necesitamos algo más que una imagen fija, xvidcap nos puede ayudar. Ahora es posible hacer ayudas de tutoriales que usan animaciones grabadas por nosotros mismos usando el software para que otros puedan ver exactamente lo que estamos haciendo. POR ANDREA MÜLLER
L
a grabación de la ejecución de pasos de programas desde el escritorio nunca ha sido una tarea fácil. Si bien hay al menos una docena de programas luchando por el beneplácito de los usuarios que producen documentación, ninguno de ellos es en realidad un buen generador de películas. Presentamos xvidcap [1] de Rasca Gmelch. El programa, ahora mantenido y desarrollado por Karl H. Beckers, crea demostraciones en pantalla a medida. Podemos crear imágenes o archivos MPEG de áreas del escritorio definidas por el usuario, estando por tanto perfectamente capacitado para mostrar el camino a través de estructuras de menús anidadas.
Cámara, Luces, ¡Acción! Antes de dar los primeros pasos como director de películas en pantalla debemos evidentemente instalar el programa. Esto es sencillo para usuarios de distribuciones que soporten paquetes RPM o Debian desde la página de xvidcap. El RPM proporcionado por el desarrollador del programa soporta Suse Linux 9.0 y Red Hat 9.0 entre otros. Hay dos paquetes para Debian: uno para la versión estable (Woody) y otro para la versión de pruebas (Sarge). Los usuarios de otras distribuciones deberán compilar xvidcap ellos mismos.
Se supone que tenemos instalados los paquetes de desarrollo para libpng, libjpeg y XFree86 en nuestro sistema. Simplemente debemos seguir el procedimiento estándar: ./configure; make; su -c "make install" para construir xvidcap e instalar el programa en la estructura del directorio bajo /usr/local. Como root es el único usuario con permisos de escritura en este nivel tendremos que introducir su -c para asumir temporalmente privilegios de root para el paso make install. El programa xvidcap se basa en el programa ffmpeg [2] para crear vídeos. Si éste no está instalado en nuestro sistema aún podremos crear capturas de pantallas con nuestra versión de xvidcap, pero no manipular vídeos. Si nuestra distribución no incluye el paquete ffmpeg necesitaremos crear la versión de ffmpeg incluida con la distribución xvidcap. Para hacer esto debemos añadir el parámetro -withforced-embedded-ffmpeg al comando ./configure para crear un xvidcap con
soporte para embedded ffmpeg o cambiar al subdirectorio ffmpeg antes de compilar xvidcap. Introducimos ./configure; make; su -c make install en este directorio para crear el codificador ffmpeg y el reproductor ffplay, y entonces escribimos make install para copiar todas estas herramientas a /usr/local/bin. La principal ventaja de este método es que nos permite usar ffmpeg y ffplay de forma independiente de xvidcap, algo que no nos permite la versión integrada. La opción -with-gtk2 ./configure es muy interesante si estamos construyendo el programa nosotros mismos puesto que crea un programa llamado gvidcap. A diferencia del original, gvidcap dispone de un moderno gtk-2 GUI que se ajusta perfectamente al escritorio actual de Gnome.
El Archivo de Comandos Para lanzar la nueva herramienta instalada en el último paso escribimos: xvidcap &
Figura 1: El creador de películas de escritorio xvid-
o tecleamos
cap.
gvidcap &
Figura 2: La variante gtk-2 tiene un aspecto más moderno que la original.
para lanzar la versión gtk-2. Los elementos de control para xvidcap (ver figura 1) y para gvidcap (ver figura 2) están organi-
www.linux-magazine.es
Número 04
69
LINUX USER
xvidcap
Figura 3: Usaremos este diálogo para especificar el formato de salida y el nombre del archivo.
zados exactamente de la misma forma. Esto tiene una parte positiva y una negativa. La versión original puede que parezca aburrida, pero ciertamente es más estable y mucho más configurable que la versión moderna. Estabilidad, configurabilidad y el hecho de que ambas interfaces son similares es lo que hizo que nosotros nos decantásemos por concentrarnos en xvidcap en este artículo. Cuando lanzamos el programa nos muestra un marco rojo de aproximadamente el tamaño de una tarjeta de crédito para indicar el área de grabación. El marco se mueve con la ventana del programa. Para evitar esto podemos pulsar en el botón “x” para separar el marco del resto de la aplicación. Como el tamaño por defecto es muy pequeño para cualquier cosa excepto la más pequeña de las aplicaciones deberemos definir el área del escritorio que queremos grabar antes de hacer nada más. Pulsaremos en el aspa de la barra de herramientas para cambiar el puntero del ratón a una cruz.
Bien podemos mantener pulsado el botón izquierdo y arrastrar el ratón al área definida o pulsar en una ventana (Suponiendo que estemos interesados en el contenido de ésta). Si seleccionamos una ventana el vídeo no incluirá la barra del título de esta. Tras seleccionar nuestra localización, el siguiente paso es definir algunos parámetros, como el formato de grabación. [Alt-O] (o [Ctrl-P] para gvidcap) abrirá el diálogo de configuración mostrado en la figura 3. Lo primero que haremos será ajustar el valor de Max Frames a 0 debido a que xvidcap tiene una restricción por defecto de 30 imágenes. El valor 0 elimina este límite, permitiéndonos crear vídeo de cualquier longitud. Usaremos la caja Frames per Second (FPS) para especificar el número de imágenes por segundo que queremos que xvidcap capture. El valor por defecto es 25 (no debemos confundirnos con el formato en que está mostrado 25.000000). Si necesitamos vídeos MPEG1 o MPEG4 debemos ver la página principal de xvidcap (opción -fps) para ver los valores requeridos de imágenes por segundo. Por ejemplo, 25 y 50 son valores válidos para MPEG1, mientras que MPEG4 puede usar valores entre 7.5 y 30. Si introducimos un valor incorrecto nuestros vídeos o irán muy rápidos o muy lentos. Introducimos el código de vídeo (por ejemplo MPEG4) en el campo codec. Esto hace que por defecto usemos MPEG1, si bien podemos cambarlo a MPEG4 para grabaciones de mayor calidad. En nues-
GLOSARIO gtk-2: El conjunto de herramientas Gimp que vienen con la versión 2. esta librería gráfica proporciona a los desarrolladores controles pre-hechos para aplicaciones basadas en GUI, como botones de radio, cajas de diálogo y campos de entrada de datos. Al margen del escritorio Gnome versión 2 o superior, el nuevo Gimp también está basado en gtk-2. MPEG: Abreviatura de Motion Pictures Expert Group (Grupo Experto de Películas). Este grupo, el cual abarca empresas y universidades, estandarizó técnicas de compresión para formatos de vídeo. La codificación MPEG intenta describir todos los segmentos de imágenes posibles especificando en qué se diferencian de la imagen previa, obteniendo por tanto archivos más pequeños.
70
Número 04
ImageMagick: Una colección de diez herramientas de manipulación de imágenes. Como la mayoría de las herramientas basadas en la línea de comandos, ImageMagick es la solución perfecta para códigos de conversión de imágenes y trabajos de manipulación. ~/.Xdefaults: Aquí es donde los usuarios pueden definir sus preferencias para programas basados en GUI, como el color de fondo o las fuentes. Para averiguar las preferencias que un programa puede usar tenemos que comprobar la página Web de esa aplicación. Las aplicaciones actuales de KDE y Gnome ignoran habitualmente los ajustes de ~/.Xdefaults.
www.linux-magazine.es
tras pruebas, la resolución de los vídeos MPEG1, era tan pobre que en ocasiones no podíamos distinguir algunos de los menús.
¿Vídeo o imagen fija? Aún necesitamos escribir el nombre del archivo que deseamos grabar en la caja File pattern. Si dejamos el que aparece frm-%04d.xwd, xvidcap no creará un vídeo, si no archivos individuales de formato xwd (x window dump) en el directorio donde lanzamos el programa. La línea %04d añade un número de serie al nombre del archivo creado creando los archivos frm-0000.xwd hasta frm-9999.xwd. El símbolo del porcentaje indica información del formato: 04d (d para decimales) especifica el número de dígitos. Si nuestra demo va ha tener más de 10.000 imágenes deberemos cambiar el valor de File pattern o frm-%05d.xwd o incluso a frm-%06d.xwd. Podemos modificar el nombre base de archivos (frm) y el formato de salida. xvidcap también puede crear archivos JPEG o PNG. Las imágenes fijas son útiles para editar resultados o si estamos intentando conseguir un pantallazo que programas como ksnapshot no pueden ofrecer, como un mensaje de error que aparece en nuestra pantalla e inmediatamente desaparece. Para crear el vídeo directamente cambiamos la entrada en File pattern al nombre del archivo que deseemos con la extensión mpeg, por ejemplo programdemo.mpeg. Para evitar tener que modificar las opciones cada vez que usemos el programa pulsamos Save. Esto indica a xvidcap que debe almacenar los ajustes en el archivo .xvidcap.scf bajo nuestro directorio de inicio. El homólogo gtk-2, gvidcap lee los ajustes del mismo archivo. En otras palabras, cualquier cambio realizado en un programa tendrá efecto inmediato en el otro. Borrando ~/.xvidcap.scf restauraremos los valores por defecto del programa.
Toma uno, ¡acción! Pulsaremos el botón con el punto rojo para comenzar a grabar el área del escritorio dentro del cuadro rojo. Tras demostrar los aspecto del software en los que estemos interesados pulsamos el botón con el cuadrado negro para detener la grabación. Podemos usar un reproductor como MPlayer (ver figura 4)
xvidcap
LINUX USER
Figura 5: xvidcap usa Display para abrir imágenes individuales. Display dispone de una serie de funciones para manipular imágenes. El menú Enhance tiene opciones para modificar el brillo, valores gamma y la saturación.
Figura 4: MPlayer reproduciendo un vídeo sobre lectores de correo electrónico creado con xvidcap.
ffplay videodemo.mpeg
Presionando [q] cerramos la reproducción. Tras crear una serie de imágenes podemos pulsar los botones con las flechas hacia la izquierda o hacia la derecha para ir pasando entre las imágenes individuales. Pulsando el botón con la figura del lápiz a la derecha abrimos la imagen actual en display, el visor de imágenes del paquete ImageMagick. Entonces podemos pulsar sobre la ventana de la imagen para que se abra un menú con una serie de funciones para manipularla (ver Figura 5), pudiendo alterar colores y tamaño (Enhance), rotar (Transform) u otros efectos Effects (F/X). El botón con la tira de película ejecuta animate, otra herramienta de la colección ImageMagick. Como indica su nombre, animate crea y reproduce animaciones hechas de archivos imágenes individuales. Debemos evitar usar esta opción con colecciones de imágenes superiores a 400. Intentar alimentar a animate con demasiado material hará
que incluso el más potente de lo equipos se venga abajo.
De Simples Imágenes a Vídeos File | Make Video convierte nuestras imágenes en vídeos. xvidcap analiza gramaticalmente ~/.Xdefaults para averiguar que programa debe usar para esto. Aquí es donde se almacenan los valores por defecto para los programas gráficos. Dicho esto, gvidcap no distingue lo asignado en ~/.Xdefaults, por lo que el comando de conversión sólo se aplicará a xvidcap. Supongamos que tenemos una colección de imágenes con formato PNG con nombres basados en una serie con formato como pic%04d.png y deseamos usar ffmpeg para convertirlas en un vídeo MPEG1. la siguiente línea
RECURSOS [1] xvidcap:http://sourceforge.net/projects/ xvidcap [2] ffmpeg:http://ffmpeg.sourceforge.net/
xvidcap*mkVideoCommand:ffmpegU -i %s video.mpeg
en ~/.Xdefaults indica a xvidcap que debe ejecutar ffmpeg cuando seleccionemos Make Video. Para que esto funcione necesitamos el programa ffmpeg apropiado. No podemos utilizar la variante incrustada de xvidcap. xvidcap reemplaza la serie %s con el nombre del modelo usado por los archivos de imágenes individuales (pic%04d.png en nuestro ejemplo). Como
LA AUTORA
para reproducir nuestra demo a la audiencia. Para hacer las cosas sencillas podemos optar por usar el reproductor de la línea de comandos ffplay suministrado con ffmpeg. El siguiente comando ejecuta la herramienta:
ffmpeg reconoce esta norma de llamar archivos puede convertir archivos con nombres como pic0000.png, pic0001.png uno a uno y almacenar el resultado en el archivo resultante (video.mpeg) bajo el directorio actual. Hay un escollo del que debemos estar alerta cuando usemos ffmpeg para generar un vídeo desde archivos de imágenes individuales. Puede que el codificador no pueda soportar archivos xwd que xvidcap cree por defecto. ffmpeg usa los siguientes formatos gráficos: pnm, pam, pgmyuv, yuv, png, jpeg y gif. El formato PNG es una buena opción para capturar imágenes de pantalla con xvidcap. Para seleccionar el formato PNG debemos seleccionar la extensión de archivo PNG en File pattern en las opciones de menú de xvidcap. El método más rápido para que un director amateur triunfe es indicar a xvidcap que cree salida de vídeo y deje el procesado de imágenes individuales a usuarios que estén insatisfechos con los vídeo “automatizados” y deseen modificar el material base ■ antes de generar los vídeos.
Tras cerca de dos años como periodista independiente, Andrea Mueller acaba de acceder a un nuevo cargo editorial en Linux New Media AG. Cuando no se está ocupando de artículos o envolviendo paquetes para la zona de descargas de EasyLinux, Andrea va más allá de Linux y se involucra con otros sistemas operatives como QNX, BeOS y NetBSD.
www.linux-magazine.es
Número 04
71
LINUX USER
GFTP
Transferencia de ficheros versátil con GFTP
FTP y más allá Tanto si le gustan las transferencias de ficheros desde una GUI o desde la línea de comandos, GFTP tiene la herramienta adecuada para el trabajo diario. El cliente de GFTP también soporta características avanzadas como la transferencia segura de ficheros con SSH. POR MARTIN STEIGERWALD
G
FTP es un cliente para el protocolo de transferencias de ficheros (FTP) eficiente y versátil para sistemas Linux. GFTP, que fué escrito por Brian Masney, realiza todas las tareas asociadas con la descarga y subida de ficheros de los servidores de FTP, y además ofrece servicios adicionales, como la transferencia de ficheros HTTP, la transferencia de ficheros basada en SSH y la descarga simultánea desde múltiples servidores. El programa GFTP proporciona algunas características interesantes, como las de arrastrar y soltar, control inteligente de la gestión de los archivos existentes, entrada directa de comandos FTP y transferencias directas entre dos servidores FTP. Podemos encontrar GFTP en dos versiones: gftp-gtk que proporciona una interfaz gráfica para la transferencia de ficheros y gftp-text que es una versión del cliente de FTP en modo consola, lista para ser usada desde la shell. Si se teclea gftp,
¿Y FTPS? FTPS es una variante de FTP basada en la protección SSL. GFTP soporta el protocolo FTPS para encriptar las conexiones de control: El programa transmite comandos FTP con sus parámetros como las contraseñas con texto cifrado pero no cifra los ficheros.
72
Número 04
el sistema podrá lanzar tanto la versión X11 como la versión en modo texto, dependiendo de cómo esté configurado. GFTP está disponible para varias distribuciones Linux, aunque no siempre se instala de forma automática. Véase el cuadro titulado “Instalación de GFTP” para saber más acerca de la instalación de GFTP en Suse o Debian, además de
detallar cómo se puede compilar GFTP desde los ficheros fuentes.
Trabajando con GFTP GFTP lanza una ventana típica estilo FTP partida en dos zonas, con paneles indicando los directorios locales y remotos (Véase la Figura 1). Una zona de estado situada en la parte de abajo de la
Instalación de GFTP Si se tiene Linux Suse, se puede ejecutar YaST | Install and remove software para instalar el paquete gftp. SuSE Linux 9.1 tiene la versión 2.0.16-44. Si prefiere compilarse el software, necesitará instalar algunas herramientas y ficheros de desarrollo antes de empezar. Por ejemplo, en Suse, hay que asegurarse de tener instalado Yast C/C++ Compiler and Tools y Gnome Development. Hay que descargar el código fuente desde la página web del proyecto [1], y descomprimir el paquete tecleando tar -xjf gftp-2.0.17.tar.bz2, o usar las herramientas del escritorio para descomprimir el fichero tar. Hay que entrar en el directorio gftp-2.0.17 y seguir los pasos normales: ./configure; make; su -c make install. Por defecto, make install coloca los ficheros ejecutables de GFTP en /usr/local/bin. Esto coloca la versión recompilada en lo más alto del path y se asegura de que los elementos
www.linux-magazine.es
del menú que instala el paquete de instalación hacen referencia a esta versión. Si necesita eliminar su propia versión, porque Suse haya presentado algún paquete nuevo, por ejemplo, se puede introducir su -c "make uninstall". En Debian Linux, se puede introducir su -c -apt-get install gftp- o escoger un gestor de paquetes como Synaptic o KPackage para instalar GFTP. Hemos probado GFTP con Debian Sarge version 2.0.17-5. El paquete gftp instala automáticamente ambas versiones de GFTP, aunque si prefiere se puede instalar los paquetes individuales, gftp-gtk y gftp-text de forma separada. El paquete de la versión de Debian actualmente no soporta SSL (véase [2]). Si se intenta usar FTPS o HTTPS, hay que compilar el software como se describió anteriormente. Pero no olvidemos instalar el paquete libssldev con los ficheros de desarrollo de OpenSSL antes de hacerlo.
GFTP
GFTP intenta resolver los conflictos con los nombres de ficheros antes de que empiece la transferencia. Si un fichero con el mismo nombre ya existe en el directorio de destino, GFTP preguntará qué hacer con dicho Figura 1: La ventana principal de GFTP proporciona una GUI FTP típica para fichero (Véase la “subir” y “bajar” ficheros desde los servidores ftp. Figura 2). El cuadro de diálogo permite seleccionar una acción tanto ventana proporciona información de las para un fichero como para un grupo de transferencias actuales y otra muestra la ellos. El programa soporta sobrescritura acción actual del protocolo. y tiene un modo para continuar la Para conectarse a un servidor de FTP descarga de los ficheros cuyas transfehay que teclear el nombre del mismo en rencias hayan sido interrumpidas. Por la caja de texto titulada Host en la parte defecto, GFTP sugiere continuar una de arriba de la ventana principal. Tamtransferencia de fichero. Se puede selecbién se puede introducir el nombre de cionar Overwrite by default en FTP | usuario y la contraseña, además de Options | General para modificar este criespecificar el número de puerto en el que terio (Véase la Figura 3). se desee realizar la conexión. La ventana La configuración en Options | General dividida en dos muestra el árbol de etiquetada con Allow command input in directorios local en la zona de la izquierGUI permite la entrada de comandos FTP da y en la derecha los directorios remo(Véase la Figura 3). Esta opción permite tos. Cuando se encuentre el fichero que a los usuarios el poder usar una GUI sin se desee transferir, hay que seleccionarlo perder los beneficios de la entrada direcy pulsar el botón con la flecha adecuada. ta de comandos del cliente en modo con(Los botones con las flechas están locasola. Si esta opción está activada, se lizados entre las zonas local y remota de puede introducir un comando FTP al la ventana principal; ver Figura 1. Para estilo de la línea de comandos desde la transferir un fichero desde el directorio ventana principal de GFTP (véase la local al remoto hay que pulsar la flecha Figura 4). que apunta hacia la derecha. Para transSi se desea seleccionar múltiples direcferirlo desde el directorio remoto hasta el torios para transferir de una sola vez, directorio local, hay que pulsar la flecha hay que deshabilitar Start transfer para que apunta hacia la izquierda). que se pare GFTP y capture los ficheros. Entonces se seleccionan los ficheros que se necesiten, y se habilita de nuevo la opción para indicarle al programa que reanude la transferencia. El soporte de descargas desde múltiples servidores de GFTP es excelente. Simplemente hay que desconectarse del servidor actual y conectarse a otro durante la descarga de un fichero para que se quede en segundo plano. Si se selecciona Do transfer one at a time, el cliente de FTP procesará las Figura 2: Resolución de conflictos de nombres en descargas una después de otra. De otra GFTP. manera, el programa descargará un
LINUX USER
fichero de cada servidor simultáneamente. Esta opción es interesante si se tiene una rápida conexión a Internet. GFTP también soporta la transferencia de ficheros directa entre dos servidores de FTP. En otras palabras, se puede usar FTP para mover un fichero desde un servidor de FTP a otro, sin necesidad de almacenar el fichero en la máquina del cliente de GFTP. La opción de transferencia directa de GFTP requiere que ambos servidores soporten el protocolo de intercambio de ficheros (FXP – File Exchange Protocol), una extensión de FTP. Para lanzar una sesión de transferencia directa hay que conectarse al servidor de FTP que recibirá los ficheros. Entonces se selecciona Local | Open URL… para conectarse al servidor de FTP que enviará los ficheros. Si se intenta terminar una conexión mientras el programa está estableciendo una conexión o leyendo un directorio, GFTP mostrará un mensaje solicitando al usuario que primero pulse el botón Stop. Si no se advierte el mensaje que se muestra en el área de información, podría preguntarse que por qué el programa no responde.
Configuración de Tipos de Ficheros La configuración de ficheros de GFTP permite especificar qué programa usar para mostrar los ficheros de un tipo determinado. El programa no tiene un cuadro de diálogo para realizar esta tarea. Hay que abrir el fichero .gftp/gftprc del directorio home con un editor de textos. Hay que mirar las líneas que empiecen por ext=.
Figura 3: La solapa General en el cuadro de diálogo Options controla el comportamiento general del programa.
www.linux-magazine.es
Número 04
73
GFTP
Cada línea sigue el mismo patrón, empiezan por ext=, luego le sigue un punto y la extensión del fichero, el fichero XPM a usar, el modo de transmisión, B para binaria y A para ASCII y finalmente el nombre, y si fuera necesario, la ruta del programa a utilizar para mostrar o reproducir el tipo de fichero. Los ficheros más comunes de formatos de imágenes y música, así como los documentos HTML están predefinidos. Tan sólo hay que añadir el programa favorito que se desee para mostrar dichos ficheros. Es bastante fácil crear un nuevo tipo de fichero, copiando y modificando una línea existente.
GFTP desde Shell Si se necesita transferir ficheros automáticamente usando un script, la variante shell de GFTP es la mejor opción. Si se teclea help el programa muestra un listado de los comandos que soporta. Se puede teclear help nombrecomando para que muestre más detalles de un comando específico. Tecleando gftp -d ftp://nombredeusuario:contraseña@dominio.com/dir ectorio-con-sus-paginas-web conseguimos que almacene páginas HTML en nuestra cuenta de alojamiento web y configurando cronjob con este comando se obtendrá una copia de seguridad periódica. Hemos de asegurarnos de restringir los privilegios del script para proteger la contraseña de la cuenta FTP. Un script que contiene una contraseña no debería ser accesible por nadie más que uno mismo. En caso de duda, dejaremos en blanco la contraseña, entonces, tendremos que introducirla cada vez, lo que impedirá que nos podamos beneficiar de la ejecución automática del script por parte de cronjob.
Otros Protocolos GFTP también soporta la transferencia de ficheros por HTTP y SSH. Por HTTP, hay que teclear una URL que empiece por http:// en el cuadro de texto Host de la ventana principal; para SSH, hay que introducir una URL que empiece por ssh2://. No hay necesidad de modificar la configuración por defecto para las transmisiones de FTP y HTTP, a menos que se use un servidor proxy, pero para que las
74
Número 04
transmisiones SSH funcionen, hay que cambiar unos cuantos parámetros en FTP | Options | SSH. El cliente de FTP usa SFTP como protocolo de transmisión. Para que funcione, el servidor SFTP tiene que estar en un path Figura 4: Lo mejor de los dos mundos: GFTP permite usar el ratón para naveejecutable en el gar por el directorio destino y permite introducir comandos en formato texto servidor remoto. al estilo de los FTP en modo consola. Hay que habilitar la opción Use SSH2 SFTP subsys para los aún hay espacio para seguir añadiendo servidores que lo soporten. mejoras. El botón Stop no es siempre Hemos comprobado satisfactoriamente intuitivo. Y el programa se beneficiaría las dos versiones con una instalación del con un sistema de configuración de tipos servidor SSH en Debian. El primer intento MIME y programas asociados con una de conexión (usando la función SSH2 GUI. También sería interesante que SFTP) no funcionó porque SSH nos pidió soportara el proyecto de Free Desktop de ■ que confirmáramos la confianza en la base de datos MIME [4]. autenticidad del servidor. GFTP interpretó la consulta como un error. Pero en RECURSOS las conexiones restantes en esta sesión funcionaron correctamente, ya que SSH [1] Proyecto GFTP: http://www.gftp.org solamente pregunta una vez por sesión. [2] Binarios GFTP para Debian sin soporte Si se tiene la intención de usar SFTP SSH: http://bugs.debian.org/cgi-bin/ para transferencias seguras, probablebugreport.cgi?bug=251121 mente sería preferible esperar a que [3] GFTP FAQ: http://www.gftp.org/readme. salga la versión 2.0.18 de GFTP. La imahtml gen CVS actual de GFTP ya resuelve [4] Base de Datos compartida MIME: http:// dicho problema, según comenta su www.freedesktop.org/Standards/ autor. Y se han solucionado algunos shared-mime-info-spec problemas más, pero la versión actual [5] Acciones MIME: http://www.freedesktop. aún está refinándose según el FAQ [3]. org/Standards/mime-actions-spec Por ejemplo, ya no hace falta especificar el path del servidor SFTP. SFTP debería funcionar sin ninguna configuración adiMartin Steigercional. En una breve prueba con la verwald trabaja como sión pre-release 2.0.18, la conexión con administrador de un servidor SSH funcionó con la confisistemas en guración por defecto. team(ix) GmbH en Las transferencias seguras con SFTP Nuremberg, Aleson bastante útiles si estamos subiendo manía, http:// ficheros a nuestro propio sitio web. A www.teamix.de. Uno de los objediferencia de un cliente FTP, un cliente tivos de su trabajo SFTP cifra la contraseña y los datos, sin es dar soporte de segundo nivel para embargo, supone que el proveedor tiene Linux como herramienta de negocio acceso SSH y soporte SFTP.
EL AUTOR
LINUX USER
Conclusión GFTP es una herramienta efectiva con un amplio rango de características. Pero
www.linux-magazine.es
para los clientes de team(ix). Ya instaló Linux en su Amiga 4000 y usa Linux, preferiblemente Debian Linux, en su ordenador personal.
XUL
LINUX USER
Menús Web con XUL y XBL
Remate Final
Sin duda hay mucho donde rascar con el navegador Mozilla. En este artículo usaremos XUL para crear el menú de una página Web perfecta. A lo largo del camino aprenderemos cosas sobre el Lenguaje de Coligación Extensible (XBL) y como podemos usar XBL para realzar la potencia de nuestras creaciones en XUL POR JONO BACON
E
n los últimos números de Linux Magazine hemos explorado las diferentes formas de construir interfaces en XUL. En este artículo, el último de la serie, integraremos XUL
con contenidos Web añadiendo un interfaz XUL a una página Web en forma de una barra de menú especial. Esta barra de menú usará el mismo conjunto de componentes que Mozilla
y usará el tema y aspecto del buscador. El efecto será similar al de las barras especiales como las de Google o Yahoo, pero el usuario no necesitará instalarlas específicamente (se cargarán solo
www.linux-magazine.es
Número 04
75
LINUX USER
XUL
Figura 1: Nuestra página Web antes de convertirla con XUL.
cuando el usuario acceda a la página Web).
La Caja de Herramientas Con muchas innovaciones informáticas, los desarrolladores y los usuarios han puesto la tecnología en cajas, discriminando como deben ser usadas. PHP es un buen ejemplo. Si bien podemos usar Javascript, ASP u otras tecnologías en páginas PHP, la mayoría de los desarrolladores parece que se quedan con PHP y tecnologías relacionadas con PHP. PHP es un lenguaje de guiones por el lado del servidor, Javascript es un lenguaje del lado del cliente y HTML es un lenguaje para formatear el contenido. Cada tecnología tiene su uso definido y la mayoría de los desarrolladores se ajustan a estos usos. Puede que ya hayamos puesto XUL en una de estas cajas conceptuales. En esta serie hemos vistos ejemplos de scripts XUL como el Buscador Amazon de Mozilla, y parece que estos scripts convierten a Mozilla un entorno para aplicaciones Web. Estos ejemplos demuestran que las tecnologías orbitan casi por completo alrededor del XUL para crear la interfaz. Es por tanto bastante razonable poner a XUL en una caja conceptual donde se utiliza para la interfaz, Javascript se utiliza para la interacción y las otras tecnologías realmente ni aparecen. Al margen de la aplicabilidad de este concepto para algunas aplicaciones, ciertamente esto no es cierto para todas las aplicaciones. Javascript no tiene soporte
76
Número 04
nativo para recuperar información de una basa de datos MySQL. ¿Cómo conseguiremos introducir los datos de la base de datos en nuestra interfaz XUL? En una situación como ésta necesitaremos recurrir a un objeto especial de Mozilla XPCOM o usar otro lenguaje que disponga de este tipo de soporte. Otros ejemplos de integración de XUL con otras tecnologías se producen si queremos integrar elementos XUL en nuestro sitio Web. ¿Y si quisiésemos tener una caja especial que muestre información del mercado de valores dinámicamente? Sería ideal usar XUL para esta caja de información, pero necesitaremos integrarla perfectamente costura en nuestro sitio Web, donde HTML y CSS están a la orden del día. En su forma actual, XUL puede utilizarse para virtualmente cualquier sitio con casi cualquier tecnología. Hay algo de soporte dentro de Mozilla para ayudarnos a realizar este tipo de integraciones, pero en algunos casos necesitamos saber algunos trucos y pistas que nos ayuden a resolver determinadas limitaciones intrínsecas de XUL.
XUL en un Sitio Web Con el aumento de las personas cambiándose a Mozilla desde Internet Explorer u otros navegadores, XUL se está convirtiendo en una tecnología viable que puede utilizarse bajo contenidos Web en general. Si bien algunos puristas Web pueden no estar de acuerdo con que una tecnología tan específica sea buena para la Web, XUL puede uti-
www.linux-magazine.es
lizarse en las ocasiones en las que confiemos en que la mayoría de los usuarios usen Mozilla o cuando podamos ofrecer algunos contenidos para usuarios de Mozilla y algunos otros para no usuarios de Mozilla. Si bien podríamos crear contenidos específicos para usuarios de Mozilla, esto es desaconsejable por el mismo motivo que los contenidos específicos para usuarios de Internet Explorer están desaconsejados. Solo crearemos contenidos específicos para Mozilla si sabemos que se utiliza Mozilla o si podemos crear una alternativa adecuada. Vamos a integrar XUL con contenidos Web añadiendo una interfaz XUL a una página Web en forma de una barra de menú especial para el sitio Web. Esta barra de menú no solo usara el mismo conjunto de componentes que Mozilla, si no que también tendrá el mismo aspecto y contexto que el navegador. Esto puede proporcionar el mismo efecto que una barra de tareas especial como las de Google o Yahoo sin necesidad de que el
Página web de la Figura 1 01 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/lo ose.dtd"> 02 03 <html> 04 <head> 05 <title>XUL::Web</title><link rel="stylesheet" href="http://localhost/temp/ stylesheet.css" type="text/css"> 06 <link rel="icon" href="http://mozilla.org/image s/mozilla-16.png" type="image/png"> 07 </head> 08 <body> 09 <div id="top"> 10 XUL Is Cool 11 </div> 12 <div id="content"> 13
XUL
usuario las instale específicamente, puesto que se cargará al acceder a la página Web. Como hemos mencionado anteriormente, este artículo explora la tarea de integrar XUL con contenidos Web añadiendo una barra de menú XUL a una página Web. Este uso de XUL se llama Remote Application (Aplicación Remota). Teóricamente, el código XUL puede ejecutarse desde un equipo local (donde cargamos la página desde nuestro disco duro directamente con Archivo->Abrir Archivo) o desde un servidor Web remoto en el que podemos acceder a la página vía una URL como http://www.unsitio.com/. La localización geográfica de la página no indica si la aplicación es remota (si estamos ejecutando Apache en nuestro equipo local y accedemos a la página XUL vía URL la aplicación es remota). La diferencia clave es que una aplicación
La Barra de Menú 01 <xul:menubar oncommand="loadPage(event);"> 02 <xul:menu label="Features"> 03 <xul:menupopup> 04 <xul:menuitem label="Introducción a XUL" value="http://localhost/temp/i ntro.html" /> 05 <xul:menuitem label="¿Por qué XUL?" value="http://localhost/temp/p orque.html" /> 06 <xul:menuitem label="Creación de un Script" value="http://localhost/temp/c rearscript.html" /> 07 </xul:menupopup> 08 </xul:menu> 09 <xul:menu label="Ayuda"> 10 <xul:menupopup> 11 <xul:menuitem label="Ayuda General" value="http://localhost/temp/a yudageneral.html" /> 12 <xul:menuitem label="Ayuda Índice" value="http://localhost/temp/i ndice.html" /> 13 </xul:menupopup> 14 </xul:menu> 15 </xul:menubar>
remota se nos sirve mediante un servidor Web, mientras que la aplicación local se carga directamente en el navegador. Las aplicaciones locales XUL también se diferencian de las remotas por su funcionalidad. El conjunto de funcionalidades de las aplicaciones remotas es más limitado debido a los potenciales riegos de seguridad. Un ejemplo es el hecho de que una aplicación remota no puede escribir en un archivo del sistema en un servidor Web. Podemos evitar estas limitaciones ajustando la configuración que rige como funciona Mozilla, pero a costa de reducir nuestra seguridad y no es recomendable en entornos productivos. En su lugar nos vamos a centrar en usos perfectamente aceptables de aplicaciones XUL remotas – pulsar en un menú para acceder a otra parte de sitio Web, por ejemplo.
Creación del Código Para añadir una barra de menú a una página Web necesitaremos comenzar con una página Web. Primero deberíamos sentarnos y relajarnos mientras disfrutamos tomando el sol observando la página Web mostrada en la figura 1. El código que aparece más abajo la crea y debe ser añadido a xulpage.html. Este es el contenido principal de nuestra página Web. Si bien debería ser interesante, en realidad es bastante aburrido. Para hacer las cosas más interesante añadiremos esta lista: <ul> <li>One</li> <li>Two</li> <li>Three</li> </ul>
{ font: verdana, arial; font-size: 40px; font-weight: bold; text-transform: uppercase; letter-spacing: 0.3em; padding: 20px; background: #EACBCB; } #content { padding: 20px; border: solid thick black; }
Con nuestra simple página Web lista procederemos a añadir un poco de XUL y veremos como funciona. El primer paso es en realidad crear el XUL que queremos añadir a nuestra página Web. Añadiremos esto a un archivo llamado menu.xml. Si bien parte del código puede que nos parezca familiar, usaremos algunas funciones especiales del Mozilla para coligar funcionalidad en trozos de código que pueden llamase desde nuestro HTML. Repasaremos cada línea del código para discutir como funciona. Las primeras dos líneas indican que estamos usando XML y especifican que la hoja de estilo que estamos usando es parte del registro Chrome de Mozilla. Este registro especial trata con como pueden ser creadas las interfaces y que apariencia tienen: <?xml version="1.0"?> <?xml-stylesheet href="chrome:U //global/skin/"U type="text/css"?>
Para hacer nuestra página incluso más interesante, también hemos creado una hoja de estilo en el archivo stylesheet.css. Añadiremos este código al archivo: 01 body, html { 02 margin: 0; 03 background: #FFF; 04 color: #000; 05 } 06 07 #top
08 09 10 11 12 13 14 15 16 17 18 19 20 21 22
LINUX USER
Si bien XUL es la tecnología principal dentro de la suite Mozilla, en realidad hay una serie de tecnologías adicionales relacionadas que pueden utilizarse con XUL para permitir el desarrollo de aplicaciones. Una de estas tecnologías es la llamada Lenguaje de Coligación Extensible (XBL). El propósito de XBL es simplemente permitirnos crear un paquete de funcionalidades y vincularlas a otras vía CSS o el DOM. Esto nos da la capacidad de crear conjuntos definidos de funcionalidades que pueden ser llamados
www.linux-magazine.es
Número 04
77
LINUX USER
XUL
desde nuestro otro código. Esto no es distintos al concepto de funciones pero dentro de la arquitectura XUL/XBL. Debemos saber que esto no es lo mismo que una función, pero su concepto es muy similar. Para crear algunos de estos vínculos primero necesitaremos indicar que estamos usando vínculos dentro de este archivo. Esto lo hacemos especificando una etiqueta llamada <bindings> (vínculos) e indicando que estamos usando un espacio de nombres XBL. Un espacio de nombres nos permite definir que etiquetas son partes de una tecnología particular. Si tenemos una etiqueta XUL llamada <menu> y tenemos otra XBL llamada <menu> no tendremos manera de determinar que etiqueta <menu> queremos usar. Para resolver esto normalmente incluimos un prefijo a la etiqueta de la tecnología que estemos usando (como haremos más adelante para nuestras etiquetas XUL). El atributo xmlns en la etiqueta <bindings> indica que la etiqueta dentro de este archivo está bajo las especificaciones XBL. <bindings> por si solo no es una etiqueta XUL, si no una etiqueta XBL como muestra el siguiente ejemplo <bindings id="ourmenu" xmlns=U
"http://www.mozilla.org/xbl" xmlns:html="http://www.w3.orgU /1999/xhtml" xmlns:xul=U "http://www.mozilla.org/U keymaster/gatekeeper/U there.is.only.xul">
Ahora crearemos un vínculo específico que se refiere a un diagrama específico de XUL que podemos usar. Usaremos el atributo id para crear un nombre para nuestro diagrama XUL. Usaremos este valor para referirnos a nuestro diagrama XUL en el código HTML más tarde: <binding id="ourmenu"> <content>
Ahora debemos empezar a crear realmente la barra del menú. Para hacer esto crearemos una barra bastante común, con estructura tipo menús emergentes y objetos de menús que hemos cubierto en números anteriores. En el cuadro “La Barra de Menú” vemos el código para crear una barra de menú con dos menús y una serie de opciones. Veremos que usamos prefijos para cada una de las etiquetas con xul para indicar que estas etiquetas no son del espacio de nombres XBL, si no del espacio de nombres XUL.
Usando PHP con XUL Uno de los mayores problemas de XUL en la actualidad es que hay poco soporte respecto al acceso a servicios externos como a las bases de datos MySQL/PostgreSQL para obtener los datos e integrarlos en nuestras interfaces. Una opción es crear un objeto XPCOM que haga este trabajo por nosotros, siendo un poco laborioso realizar estos objetos. Si bien es una solución, es un poco compleja y requiere aprender otra plataforma de programación y su API. Otra opción es usar PHP. Una cuestión a tener en cuenta al usar PHP con XUL es que PHP es, obviamente, una tecnología tipo servidor, mientras que XUL es del tipo cliente. Con esto en mente, debemos intentar no machacar en exceso a nuestro servidor con requerimientos dinámicos XUL. Si creemos que haremos un uso adecuado de PHP en nuestro código podemos usarlo simplemente cambiando el tipo cabecera del contenido. Tendremos que poner a XUL en el archivo .php para que sea procesado por el
78
Número 04
subsistema PHP, y luego especificar en la cabecera HTTPD que el contenido es del tipo aplicación/vnd.mozilla. xul+xml (lo que es XUL). Para hacer esto, debemos añadir el siguiente código al principio del archivo XUL: <?php header( "Content-type:U application/vnd.mozilla.U xul+xml" ); ?> Ahora podemos usar PHP dentro de nuestro código XUL utilizando los bloques PHP encerrados entre <?php y ?> normales. Un ejemplo podría ser usar un bucle PHP while loop para obtener los datos de la base de datos e introducirlos en una cuadro de lista XUL. Llegado a este punto, podemos utilizar Javascript para tratar dinámicamente los datos desde el punto de vista del cliente. Añadir este soporte PHP realmente añade un gran potencial a XUL, a Javascript y a XBL en el cliente y en el servidor.
www.linux-magazine.es
Puede que hayáis notado que cada <xul:menuitem> tiene un atributo value que contiene una dirección URL. La razón de esto es que queremos que cada opción en el menú nos lleve a una página específica del sitio Web. Solo añadiendo la URL al atributo valor no hace esto, si no que deberemos usar una función especial llamada loadPage(event) referida en la primera línea (la etiqueta <xul:menubar>). Definiremos esta función más adelante en el archivo, pero todo lo que debemos recordar es que cuando se seleccione una opción, utilizaremos la función loadPage (event). Finalmente cerraremos el resto de etiquetas: </content> </binding> </bindings>
Si bien no hemos creado nuestra función load-Page(event) aún podemos probar nuestra interfaz XUL. Antes de hacer la prueba debemos hacer el importante trabajo de cargar el código XUL o, más específicamente, nuestro vínculo XBL, el que contiene el código XUL, en nuestra página HTML. Recordemos que podemos usar vínculos XBL a través de CSS y a través de DOM (usaremos CSS en este caso). Justo en la parte superior de nuestro archivo xulpage.html debemos añadir el siguiente código después de la etiqueta <body> (y por tanto antes de la etiqueta top <div>): <div style="-moz-binding:U url('menu.xml#ourmenu');"></div> </div>
Este código crea el área <div>y usa el atributo HTML "style" (estilo) para aplicar CSS a la etiqueta. Este CSS usa el elemento mozbinding, específico de Mozilla, indicando dónde está localizado el archivo vinculante XBL y qué vínculo queremos usar. La sintaxis url() común de CSS se usa para especificar dónde está el archivo y cómo se llama (recordemos que si no especificamos la ruta se supone que el archivo está en el mismo directorio donde se encuentra la hoja de estilo o, en
XUL
LINUX USER
var url = para.originalTargetU .getAttribute('value'); document.location = url;
Finalmente necesitamos cerrar el resto de las etiquetas restantes: </body> </method> </implementation>
Si bien parece que nuestro trabajo ha acabado, debemos añadir la parte final del código, un gestor que agrupará el evento oncommand creado referido como loadPage(event) en el código XUL con los eventos XBL. Tenemos que añadir este código inmediatamente tras las últimas implementaciones: Figura 2: Nuestra barra de menú XUL añadida a la página.
nuestro caso, debido a que estamos usando un estilo en línea, imbuido en el mismo HTML). Entonces usamos #ourmenu para indicar que queremos usar el vínculo ourmenu localizado dentro de ese archivo. Esto muestra como podemos tener una serie de vínculos dentro del mismo archivo. Ahora podemos acceder a xulpage.htm en nuestro navegador deberíamos ver algo parecido a la figura 2.
Creación de Funcionalidad Nuestro XUL tiene muy buena pinta encima de nuestra página Web pero no nos sirve de mucho si no podemos hacer que haga nada interesante. Ahora debemos definir la función loadPage, comentada anteriormente y añadirle un poco de Javascript para hacer que funcione. Para hacerlo podemos usar el bloque <implementation> proporcionado por XBL a nuestro código. Primero debemos crear nuestro bloque, lo que haremos antes de la etiqueta </content> y después de la etiqueta </binding>: <implementation>
Ahora tenemos que definir loadPage. Para esto usamos la etiqueta <method>. Función y método son términos diferentes que definen el mismo
concepto. Usamos el atributo name para nombrar nuestro método: <method name="loadPage">
<handlers> <handler event="command" actionU ="loadPage(event);"/> </handlers>
Conclusión
Cuando nos referimos a loadPage antes debemos prestar atención a que haya un simple parámetro llamado 'event' (loadPage(event)). Necesitamos definir cada parámetro en este bloque de implementación por separado: <parameter name="para"/>
Ahora estamos listos para crear un poco de código para definir lo que realmente hace loadPage. Lo primero que debemos crear es el bloque <body> donde poner el código:
Este artículo nos ha enseñado a usar XBL como intermediario entre XUL y HTML. Este ejemplo no sólo muestra como usar XUL de forma práctica, por ejemplo generando una barra de menú, si no que también muestra como XBL puede ser útil para definir funcionalidades basadas en XUL y su asociatividad con implementaciones Javascript. Con algunos trucos podemos enlazar HTML, XBL, XUL, CSS y Javascript en nuevas e interesantes ■ formas.
RECURSOS
<body>
Ahora escribiremos un poco de código en Javascript que extraerá los contenidos del atributo 'value' usando el método DOM getAttribute y poner el valor resultante en la variable llamada url. Ahora nos referimos al nombre del parámetro (para) como al objeto del que vamos a obtener el valor (ésta es la manera de obtener la URL correcta desde cualquier elemento de menú pulsado). A continuación utilizamos document.location para hacer que el navegador salte a esa página:
[1] La página Web de Mozilla: http://www. mozilla.org/ [2] XUL Planet: http://www.xulplanet.com/ [3] La referencia de los programadores XUL: http://www.mozilla.org/xpfe/xulref/ XUL_Reference.html [4] La referencia XBL: http://www.mozilla. org/ projects/xbl/xbl.html [5] Información XPCOM: http://www.mozilla. org/projects/xpcom/ [6] Navegador Mozilla Amazon: http://mab. mozdev.org/ [7] Juegos basados en Mozilla XUL: http:// games.mozdev.org/
www.linux-magazine.es
Número 04
79
LINUX USER
Educación
Elogio de la diversidad lingüística
Planos para disfrutar de Babel
Con un poco de filosofía por compañera, expondremos el modo en que podemos satisfacer las necesidades de nuestros compañeros profesores de otras lenguas, y de los alumnos inmigrantes, en materia de interfaz de usuario y de entrada de caracteres. POR JUAN RAFAEL FERNÁNDEZ
E
l fenómeno de la multiplicidad lingüística (la cuestión babélica: no hablamos una lengua, ni media docena ni veinte ni treinta; se piensa que en la actualidad se practican de cuatro a cinco mil) es un dato de la evolución humana que debe ser explica-
80
Número 04
do no como una desviación sino como esencial a nuestra especie, relacionada con su forma de adaptarse a la realidad (la inteligencia) y creatividad. Como escribía Steiner[1], «Cada lenguaje humano traza un mapa del mundo de manera diferente. Cuando un idioma
www.linux-magazine.es
muere, con él muere un mundo posible.» Muchos sueñan con un único idioma universal, que simplificara los problemas de comunicación, eliminara la necesidad de traductores, disolviera en el vacío las interpretaciones. Ahí está la clave: es como reducir la riqueza de
Educación
LINUX USER
Figura 1: Configurando localepurge.
Figura 2: Creación de locales.
las cocinas del mundo a la sutileza de un burger. Pero tranquilos, esta revista es de informática y este es un artículo práctico. Pretende responder a un problema real, de profesores y alumnos: vamos a aprender a internacionalizar nuestro ordenador. La solución pasa por enfrentarse -justifica el párrafo anterior- a la tentación de uniformismo predominante. Se ha dado el caso que algunos de los creadores de las distribuciones regionales que utilizamos olvidan que nuestras necesidades no son monolíticas ni raquíticas; que aunque parezca mentira el griego clásico es una
lengua muerta que sustenta nuestra filosofía y nuestro lenguaje científico; que tenemos cada vez más alumnos árabes, eslavos, chinos, que tienen derecho a leer sus propios alfabetos, y que los profesores de idiomas queremos una inmersión en el idioma que incluye -cómo no-- el entorno, los mensajes, los menúes. Veremos cómo se hace esto. El proceso tiene tres partes independientes: indicarle al sistema operativo el idioma que queremos para la interfaz, elegir un tipo de letra que tenga los caracteres adecuados para el idioma seleccionado y configurar un mapa de teclado que
los permita introducir los caracteres propios del idioma que pretendamos escribir.
Juegan los locales En GNU Linux el sistema de internacionalización y localización se basa en el modelo de los «locales»[2]. ¿Cómo funciona esto? Cuando se instala un programa internacionalizado (preparado para su traducción a distintos idiomas; no es necesario reescribir el programa en cada uno de ellos) se instalan también los mensajes en todos los idiomas a los que se ha traducido; cuando se ejecuta, el sistema operativo lee la variable de
Cuadro 1: Códigos, códigos, códigos En un principio todo era simple: en los ordenadores sólo se escribía en inglés de Estados Unidos, para el que bastan muy pocos caracteres; se decidió que con siete bits bastaba, lo que nos da 128 caracteres, incluidos códigos de control. Cuando la informática se internacionalizó surgieron dos problemas: por un lado la necesidad de traducir los programas, pero también la obligación de mostrar e introducir los caracteres de las otras lenguas. Fue necesario estandarizar codificaciones y los programadores y autores de sistemas operativos debieron buscar soluciones. Se optó por utilizar un byte completo, lo que permitió definir 256 caracteres. Así había una codificación para Estados Unidos, otra para la Europa Occidental, para el griego, el ruso, el japonés… Esto lo hemos vivido todos, recordemos los problemas de los caracteres extraños que padecimos cuando pasamos de guardar nuestros datos en DOS a guardarlos en Windows 95: técnicamente hablando pasamos de usar cp850 ó cp437 a usar windows-1252. En el mundo Unix se actuó de forma similar: los usuarios de todo el mundo tenían que utilizar distintas extensiones de ASCII específicas para cada idioma. Las más usadas eran ISO-8859-1 (también conocida como latin1; una modificación fue ISO-8859-15 --latin9 ó latin0—, creada para incorporar el símbolo del euro «?») y ISO-8859-2 en Europa, ISO 8859-7 en Grecia, KOI-8 / ISO 8859-5 / CP1251 en Rusia y países de alfabeto cirílico, EUC y Shift-JIS en Japón, BIG5 en Taiwan, etc. Esto hacía difícil el intercambio de ficheros y los programadores tenían que preocuparse de las pequeñas diferencias entre cada una de las codificaciones; habitualmente la internacionalización era incompleta o deficiente, porque era raro que los desarrolladores comprendieran o usaran estas escrituras. Pronto se comprobó que esta solución es incorrecta: ata la codificación que elige el usuario para su sistema a la de los textos que puede leer y escribir (¿por qué un profesor español no puede escribir textos en griego?), rompe la internacionalización en pequeños fragmentos inconexos difícilmente compatibles, obliga a crear tipos de letra para cada codificación… Se hizo evidente que era necesario separar la localización de la codificación, y a finales de los años 80 se impuso la idea de una codificación universal, unicode. Unicode asigna (o asignará, es un esfuerzo no terminado) de forma unívoca una posición y un nombre a cada uno de los caracteres de las distintas escrituras del mundo. Los principales sistemas operativos han adoptado el estándar unicode en alguna de sus concreciones: Apple estuvo en su génesis,Windows XP ha generalizado el uso de UTF-16. La forma de escribir unicode en GNU Linux se llama UTF-8, y los gurús juran que es superior y más eficaz que UTF-16. ¿Por qué unicode es superior? Porque independiza la cuestión de configurar el idioma del usuario del número de caracteres que puede escribir y leer en su configuración. Antes, si elegíamos un locale ruso difícilmente podríamos ver caracteres árabes; ahora podemos ver varios miles de caracteres, y podemos introducirlos con herramientas que nos permitan mapear el teclado. Descendamos a los ejemplos para no perdernos: el carácter «n» es el US-ASCII 110, en hex. 6e; nuestra «ñ» sencillamente no existe en esa codificación, no puede representarse. En latin1 (iso-8859-1) la «ñ» ocupa la posición 241 (F1 en hexadecimal), pero no se puede representar el euro. En latin9 (iso-8859-15) la «ñ» ocupa la misma posición y el euro la 164 (hex. A4). En unicode la «n» es la «U+006E LATIN SMALL LETTER N» (los primeros caracteres equivalen exactamente a los ascii; es una de las ventajas que señalan los gurús de los que hablábamos: un texto ascii es un texto correcto en utf-8) , la «ñ» es la «U+00F1 LATIN SMALL LETTER N WITH TILDE» y el signo del euro es «U+20A0 EURO-CURRENCY SIGN». Y tenemos además todos los caracteres de las principales lenguas, y símbolos matemáticos, y notas musicales…
www.linux-magazine.es
Número 04
81
LINUX USER
Educación
Figura 3: La fecha en chino de Taiwan.
entorno (más exactamente un conjunto de variables) correspondiente al locale y muestra los mensajes correspondientes. Los locales permiten definir cosas como el tamaño de papel más usado en un país, el símbolo de moneda, o el criterio con el que se ordenan alfabéticamente las palabras. Es muy probable que los autores de la distribución que usted utiliza hayan predefinido un locale, seguramente es_ES@euro (abreviatura de es_ES.iso8859-15), para los usuarios españoles y textos en español. Estas son dos decisiones independientes que no debemos confundir: la primera se refiere al idioma en que la máquina (los programas, los mensajes de error, etc.) se dirigirá a nosotros (si existe la traducción correspondiente al mensaje; incluso se puede distinguir español de España, es_ES, de las restantes variedades del castellano: es_AR, es_CO…; y al revés, ca_ES, ga_ES…), qué carácter mostrará en pantalla cuando pulsemos la tecla que tiene pintada una «ñ» y cuestiones similares (como que el tipo de letra que sale por la pantalla contenga la «ñ» y que el programa de impresión pueda enviársela a la impresora). La segunda se refiere a la codificación en que están los textos si no se indica lo contrario (ver el cuadro 1). Poner como locale es_ES@euro equivale a pedir que los mensajes estén en español, con criterio de ordenación alfabética, signo de moneda, etc. correspondiente a España, y utilizando determinada codificación que incluye el signo del euro. Para el castellano de España podrían utilizarse los locales es_ES (alias de es_ES.iso8859-1), es_ES@euro o es_ES.UTF-8. ¿Cuál es preferible? Como casi siempre, depende; la mayor parte de las distribuciones Linux están abandonando las codificaciones antiguas en favor de UTF-8 porque es manifiestamente superior. Pero se nos presentan varios problemas: en primer lugar no todos los programas están adaptados para funcionar correctamente con un locale UTF-8, por
82
Número 04
ejemplo es muy difícil trabajar en una consola UTF-8, el útil y conocido mc no va bien… por otro lado nuestros ficheros de texto deberán ser convertidos a la nueva codificación, y también los nombres de los ficheros y directorios, si hemos cometido el error de utilizar caracteres no ascii al guardarlos, o recibido archivos de nuestros amigos usuarios de Windows; ¿y qué pasa en una máquina donde conviven usuarios que han elegido utilizar codificaciones diferentes? En este sentido los usuarios de Windows XP lo tienen más fácil: quien sea ha tomado la decisión por ellos, sólo existe UTF-16, problema resuelto. En primer lugar averigüemos el locale en el que estamos trabajando. Basta con ejecutar la orden locale en una terminal: [Mi_maquina]$ locale LANG=es_ES.UTF-8@euro LC_CTYPE=“es_ES.UTF-8@euro” LC_NUMERIC=“es_ES.UTF-8@euro” LC_TIME=“es_ES.UTF-8@euro” LC_COLLATE=“es_ES.UTF-8@euro” LC_MONETARY=“es_ES.UTF-8@euro” LC_MESSAGES=“es_ES.UTF-8@euro” LC_PAPER=“es_ES.UTF-8@euro”
Cuadro 2: Internacionalización de un programa Un ejemplo de Santiago Vila servirá, porque además no se refiere a un programa en c: sino a un script de shell 01 #!/bin/sh 02 if [ -x /usr/bin/gettext ]; then 03 echo=/usr/bin/gettext 04 else 05 echo="echo -n" 06 fi 07 export TEXTDOMAIN=libc 08 $echo "cheese" 09 echo "" Escribimos en la consola [Mi_maquina]$ LANG=es_ES; ./test-script queso Los lectores pueden comprobar la instalación de los mensajes de los distintos idiomas en /usr/share/locale. Estos ficheros .mo son los que generan los traductores, ya se explicará en su momento.
www.linux-magazine.es
LC_NAME=“es_ES.UTF-8@euro” LC_ADDRESS=“es_ES.UTF-8@euro” LC_TELEPHONE=“es_ES.UTF-8@euro” LC_MEASUREMENT=“es_ES.UTF 8@euro” LC_IDENTIFICATION=“es_ES.UTF 8@euro” LC_ALL=es_ES.UTF-8@euro
¿Dónde se ha definido este locale? Hay diferentes posibilidades: si el administrador de la máquina quiere fijar un locale común para todos los usuarios y todos los entornos (lo que es frecuente en nuestras distribuciones) puede hacerlo en /etc/environment; basta lo siguiente, puesto que LC_ALL es la orden que engloba a las órdenes de detalle: export LC_ALL=es_ES.UTF-8@euro export LANG=es_ES.UTF-8@euro
Si se quiere independizar el trabajo en consola del trabajo en X el lugar es /etc/default/gdm. Si finalmente un usuario quiere modificar su entorno puede hacerlo de forma general en ~/.bash_profile o de forma granular en el directorio ~/.xsession.d. O puede hacerlo programa por programa, utilizando variables de entorno. Un ejemplo sencillo vale más que mil explicaciones. date es un programa que devuelve la fecha y la hora. Para un usuario que no ha configurado sus locales o que ha elegido el locale POSIX (C) la salida sería igual a la de un programa no internacionalizado, con mensajes probablemente en inglés: [Mi_maquina]$ LC_ALL=C date Wed May 8 20:46:09 CEST 2002
Para ver la salida en francés basta con usar [Mi_maquina]$ LC_ALL=fr_FR date mer mai 8 20:46:31 CEST 2002
Por supuesto que no hay que estar repitiendo la variable de entorno cada vez que se ejecuta un programa si el locale está definido en el sistema o en los ficheros de configuración del usuario. Como hemos elegido un locale español la orden nos responderá en español [Mi_maquina]$ date mié may 8 20:46:22 CEST 2002
Educación
Figura 5: Figura 4: El editor gedit en chino.
Glifos griegos
Ahora estamos en situación de comprender mi ataque anterior contra el monolitismo. Existe un programa, localepurge, que se encarga de borrar sistemáticamente los mensajes y ficheros de ayuda de los idiomas que el administrador de la máquina piensa que no va a utilizar. Y el administrador de estas máquinas puede pensar, él solito, que sólo se va a necesitar el castellano. Borra tan feliz los mensajes en tagalo, de acuerdo, en chino de HongKong, en rumano, pase, pero también en italiano, en francés… antes de continuar, antes de instalar el próximo programa o hacer el siguiente apt-get upgrade tenemos que comprobar si tenemos instalado localepurge y cómo está configurado. ¿Cómo? Con la orden [Mi_maquina]# dpkg-reconfigureU localepurge
En la figura 1 podemos ver cómo se seleccionan los distintos locales válidos para el castellano. De acuerdo, pensamos, ya podemos ver los mensajes en los idiomas que necesitan nuestros alumnos. Pues no: los mensajes estarán ahí, pero vamos a ver sus equivalentes en inglés porque los locales tienen que estar creados en el sistema. O sea que abrimos la terminal que seguro que habíamos cerrado, volvemos a cambiar a root y creamos los nuevos locales [Mi_maquina]# dpkg-reconfigureU locales
Para este artículo (figura 2) vamos a crear en mi ordenador los locales necesarios para mostrar mensajes y escribir en chino de Taiwan, porque responde a una petición real, de un compañero con dos alumnas chinas. En la figura 3 podemos al fin ver la salida de la orden date en chino tradicional. Y a partir de ahí
en gentium.ttf.
podemos lanzar cualquier programa y obtendremos el menú y los mensajes en chino. ¿No se me cree? Pues ahora abrimos este mismo editor con los menúes en chino (figura 4). Podemos crear una cuenta para las alumnas, configurarla con los locales apropiados, y tendrán la interfaz en chino. ¿De verdad es tan sencillo? Depende de la distribución y del administrador. Por un lado han debido instalarse los paquetes necesarios (las ayudas de OpenOffice, la documentación de KDE…), pero también se nos olvida un detalle esencial: los tipos de letra. Si los tipos disponibles no incluyen el carácter que queremos mostrar, será imposible mostrarlo.
Tipos Supongamos que queremos que la máquina se siga dirigiendo a nosotros en español (no vamos a tocar los locales ahora) pero queremos leer y escribir en otro idioma y otro alfabeto. Y luego queremos poder imprimirlo. Vale, es cuestión de tres cosas: tipos de letra, un locale UTF-8 y configuración de la entrada por teclado. Deberemos utilizar tipos de letra que contengan los caracteres de los idiomas que queremos poder representar. Más concretamente y como explicamos necesitamos tipos de letra unicode, iso10646-1. Históricamente el tema de los tipos de letra ha sido un problema complicado en Linux: no había una forma unificada de instalar y configurar nuevos tipos, porque los programas que conforman la distribución tenían orígenes distintos y habían implementado soluciones diferentes y propias. La mayoría de las aplicaciones,
LINUX USER
incluidas las X, utilizaban tipos bitmap; tardó bastante tiempo en aparecer un sistema de gestión coordinado de tipos de letra y la posibilidad de utilizar los tipos vectoriales. Afortunadamente esto ya no es verdad, y la gran mayoría de los programas que utilizamos (todos los programas de KDE3 y Gnome2, OpenOffice y Mozilla) reconoce el esquema de configuración fontconfig. ¿Cómo se añade un tipo? En primer lugar, debemos copiar el fichero Type1 o TrueType a alguno de los subdirectorios recogidos en /etc/fonts/fonts.conf (o añadir otro en /etc/fonts/local.conf). Seguidamente reiniciaremos las cachés de tipos ejecutando fc-cache: [root@Máquina]# dpkg-reconfigureU fontconfig
Abriendo el menú desplegable de fuentes en oowriter veremos que ya tenemos disponible la nueva letra. Vale, pero ¿cuántos de los tipos instalados o disponibles son unicode? Ya se sabe que los linuxeros viejos tenemos querencia a las terminales: xlsfonts | grep iso10646-1 nos las lista; xlsfonts | grep iso10646-1 | wc -l los cuenta por nosotros; en mi portátil devuelve 914. No obstante no hemos avanzado mucho. ¿Cuáles son, de dónde los descargo?, se preguntará el lector interesado. Antes de seguir debemos romper un mito: un tipo unicode no es un tipo universal, sino un tipo ordenado de determinada manera, con índices que siguen el estándar unicode. Un tipo unicode puede tener un sólo glifo (representaciones concretas de los caracteres, que son entes abstractos); necesitamos tipos que tengan glifos para los caracteres de los idiomas con los que trabajamos. Hay tipos unicode muy completos, que intentan cubrir el máximo de escrituras; otros tienen un objeto específico, cubren el griego clásico, las runas, el cheroqui o el gujarati. Hace tiempo que GNU Linux puede utilizar los tipos TrueType, y desde hace más tiempo admite los tipos Type1 de Adobe. Si somos propietarios legítimos de estos ficheros podemos reutilizarlos. gfontview nos informa del número de glifos de cada tipo, y nos los muestra por páginas (en la figura 5 tenemos un ejemplo). Existe un paquete de tipos
www.linux-magazine.es
Número 04
83
LINUX USER
Educación
Figura 6: La página taiwanesa de Debian.
LECTURAS RELACIONADAS «Debian Euro HOWTO», del paquete Debian euro-support. http://www.unicode.org/ history/ http://www.cl.cam.ac.uk/~mgk25/ unicode.html, de Markus Kuhn «UTF-8 in Debian», de Jan Willem Stumpel <jstumpel at planet.nl> http://www. jw-stumpel.nl/stestu.html. «Unicode fonts», de Edward H. Trager <ehtrager at umich.edu> http://eyegene. ophthy.med.umich.edu/unicode/fontguide/, http://dejavu.sf.net/
84
Número 04
distintas codificaciones; para ello visitaremos las distintas versiones de la página inicial del proyecto Debian. Utilizaremos lsof. Supongamos que el número de proceso de firefox cuando tenemos abierta la página es 6554 (se obtiene, claro, con ps); los ficheros ttf que utiliza el proceso se filtran así
cionalizado? Pues no: falta la cuestión más delicada, cómo conseguir con las tres filas de teclas de nuestro teclado introducir los miles de caracteres necesarios para escribir los distintos lenguajes. Esa nueva magia es el tema del si■ guiente artículo.
NOTAS
lsof +c 0 -p 6554 |grep ttf
La versión en español tiene la codificación iso8859-1. La salida es (simplificada por cuestión de espacio) VeraSe.ttf, Vera.ttf, VeraBd.ttf y VeraSeBd.ttf. Para textos en latin1 (y latin9, añado yo) nos basta el tipo ttf-bitstream-vera en sus distintas variantes negrita, serif… He buscado una página codificada en utf-8; hay pocas, usaremos esperanto. Nos devuelve Vera.ttf, VeraSe.ttf, Arial_Bold.ttf, Arial.ttf, VeraSeBd.ttf y Times_New_Roman.ttf. Vemos que para el esperanto ya no es suficiente el tipo vera y hace uso de los tipos proporcionados por el paquete msttcorefonts. ¿Qué ocurre si abro http://www.debian. org/index.zh-tw.html, en chino tradicional (Big5) (figura 6)? Se abren VeraSeBd.ttf, Arial.ttf, VeraSe.ttf, Cyberbit.ttf, Arial_Bold.ttf, Vera.ttf. Claro, los caracteres chinos no están en los tipos anteriores y sí en cyberbit (o en los arphic si se busca una fuente enteramente libre).
Y en el próximo número… Hemos aprendido a jugar con las variables de entorno que modifican la interfaz del usuario, y hemos aprendido a instalar los tipos de letra que necesitamos. ¿Tenemos ya un ordenador interna-
www.linux-magazine.es
[1] George Steiner, Después de Babel. Fondo de Cultura Económica. [2] El de LOCALE es un concepto básico introducido en el estándar C ISO (ISO/IEC 9899:1990). Este estándar fue ampliado en 1995 (ISO 9899:1990 Amendment 1:1995). En el modelo LOCALE, el comportamiento de algunas funciones C depende del entorno del LOCALE. El entorno del LOCALE está dividido en varias categorías y cada una de estas categorías se puede fijar independientemente usando setlocale(). POSIX también determina ciertos estándares relacionados con la internacionalización. Casi todos los estándares POSIX y C ISO se incluyeron en el estándar XPG4 (X/Open Portability Guide) y todos están incluidos en el estándar XPG5. Adviértase que XPG5 está incluido en las especificaciones UNIX versión 2. Por tanto todas las versiones del sistema operativo Unix cumplen XPG5.
EL AUTOR
propiedad de Microsoft que puede instalarse si no libre al menos gratuitamente: msttcorefonts, que aporta las conocidas Andale, Arial (1320 glifos), Comic, Verdana. El paquete ttf-freefont incluye entre otras la Free Serif, con 3513 glifos. gentium aporta 1699. Titus, 9779. Los tipos creados para las lenguas orientales son necesariamente grandes: «AR PL KaitiM Big5» (paquete ttf-arphic-bkai00mp) y «AR PL Mingti2L Big5» (paquete ttfarphic-bsmi00lp) tienen ambas 14148 glifos, «Kochi Gothic» y «Kochi Mincho» 15365. Y faltan las gigantes: Code 2000, 62891; Bitstream Cyberbit, 29934. Busque en su distribución porque la mayoría están empaquetadas. Y siga los enlaces de http://eyegene.ophthy.med. umich.edu/unicode/fontguide/ si tiene necesidades especiales (¿escribe usted textos en cretense o en devanagari?). ¿Por qué las alumnas no podían ver páginas en chino? Porque faltaban los tipos de letra. Un pequeña investigación puede ser instructiva (mejor enseñar a pescar que regalar un pescado). Vamos a averiguar los ficheros de tipo de letra que abre firefox cuando muestra páginas con
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
diff y diff3
Busque, compare... Los programas diff y diff3 del paquete diffutils nos ayudan a comparar ficheros de texto, mostrando cualquier variación entre ellos en la línea de comandos e, incluso, si es necesario, mezclará los ficheros automáticamente. POR HEIKE JURZIK
¿
Realizas un montón de cambios en los ficheros de configuración y otros ficheros de texto ASCII, pero prefieres guardar las versiones originales? Si es así, más tarde o más temprano acabarás con una gran colección de ficheros muy parecidos. En este caso, apreciarás utilidades que rápidamente encuentren cambios en los textos, tal como las herramientas incluidas en el paquete diffutils: *diff compara dos ficheros de texto *diff3 muestra las diferencias entre tres ficheros *sdiff mezcla dos ficheros interactivamente *cmp compara ficheros binarios En este artículo vamos a ver y usar las herramientas diff y diff3, o, para el caso, tu editor favorito para descubrir las diferencias.
Diferentes El programa diff compara dos ficheros de texto y muestra el resultado en una ventana. Si simplemente estamos interesados en descubrir si dos ficheros son distintos, tecleamos diff -q fichero1.txt fichero2.txt. El programa entonces mostrará que Files fichero1.txt and
Cuadro 1:Vimdiff Vimdiff le permite editar hasta cuatro ficheros a la vez,mostrando las diferencias en el texto. Este modo se ejecuta mediante vim -d file1.txt file2.txt o vimdiff file1.txt file2.txt. Vim muestra cada fichero en una ventana separada, usando por omisión mosaicos verticales. El parámetro -o le permite especificar mosaicos horizontales. El programa tiene una excelente ayuda, que puede consultarse escribiendo:help diff en vim.
fichero2.txt differ o no dirá nada. Si no pone la opción, las diferencias se mostrarán por pantalla: hj@asteroid:~$ diff fichero1.txtU fichero2.txt 1c1 < Hen --> Hens
Figura 1: El fichero “diferencias.diff”en el editor vim.
1c1 indica que la línea 1 en estos ficheros es distinta. La c en esta salida significa cambio. En otras palabras, necesita cambiar la línea 1 para hacer que los ficheros coincidan. A esto le sigue el contenido de la línea uno del primer fichero, un separador de línea y la misma línea del segundo fichero. diff también muestra nuevas secciones: 5a6,10 > > the diffutils include the > programs diff (for comparing > text files), diff3 (outputs > the differences between three > files), sdiff ...
5a6,10 significa que el primer fichero necesitaría insertar desde la línea 6 hasta la 10 del segundo después de la línea 5 (a se refiere a “append”, concatenar) si el fichero está marcado. Por supuesto, la salida rápidamente saldrá de la pantalla, especialmente si se está comparando dos ficheros muy grandes. En este caso podemos usar un paginador, como por ejemplo less o
more, para mostrar la salida página por página (diff fichero1.txt fichero2.txt | less), o redireccionar la salida a un fichero (diff fichero1.txt fichero2.txt > diferencias.diff). El editor vim tiene una práctica característica de resaltado de sintaxis para los ficheros diff, usando colores para mostrar las diferencias (véase Figura 1). El paquete vim también incluye la herramienta vimdiff (véase Cuadro 1), que puede comparar y manipular hasta cuatro ficheros distintos a la vez. Si prefieres (X)emacs, échale un vistazo al Cuadro 2 para unos consejos sobre ediff.
Más Contexto La salida de diff es más fácil de leer si se especifica la opción -c. La primera línea en la salida es el último cambio de fecha de ambos ficheros. El primer fichero (indicado por un asterisco) aparece
Figura 2: Vimdiff muestra hasta cuatro ficheros.
www.linux-magazine.es
Número 04
85
LINUX USER
Línea de Comandos
primero. Las líneas donde diff ha encontrado diferencias comienzan con una marca de exclamación. Las líneas que son iguales no se marcan. Después de la salida del primer fichero de texto, diff dibuja una línea punteada y luego la salida del segundo. Este tipo de comparación puede ser más compleja dependiendo de la longitud del fichero. La opción de contexto le dice a diff que marque nuevas secciones con el carácter de suma. El carácter de resta indica que la sección ha sido eliminada del segundo fichero.
Los Tres Cerditos diff3 compara tres ficheros. La salida no es la que se ha usado con diff. La forma más fácil de explicar esto es mediante un ejemplo. El listado 1 muestra tres ficheros de texto, seguido por la salida del comando diff3. diff3 indica las diferencias mostrando tres signos =, seguido por 1, 2 o 3, dependiendo del fichero en el que varíe el
Listado 1: Comparación de Ficheros 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
86
<I>fichero1.txt:<I> Gallina Gallo Pollo <I>fichero2.txt:<I> Gallinas Gallo Pollo <I>fichero3.txt:<I> Gallinas Gallo Pollo Capón <I>Salida de diff3:<I> 01 hj@asteroid:~$ diff3 fichero1.txt fichero2.txt fichero3.txt 02 ====2 03 1:1c 04 3:1c 05 Gallina 06 2:1c 07 Gallinas 08 ====3 09 1:3a 10 2:3a 11 3:4c 12 Capón
Número 04
texto. Tres signos de igualdad sin un número indica que todo en los tres ficheros es distinto. En el Listado 1 puede observarse que el segundo fichero es diferente (= = = = 2). La primera línea (1c) en el primero (1:) y el tercer fichero (3:) son diferentes. A esta salida le sigue una cita de la primera línea en el fichero 2. El tercer fichero = = = = 3 Figura 3: Ediff encuentra diferencias entre ficheros. tiene una línea adicional en comparación con los dos primeros. Para hacer que coincidan los quiere avisar a otro usuario sobre los ficheros, debería añadir una línea extra cambios, supongamos que este usuario del fichero tres (3:4c Frog) al primer y al tiene el fichero original, puede simplesegundo fichero (1:3a, 2:3a). mente almacenar las diferencias. El comando patch puede usarse para apliRemiendo carle los cambios al fichero original, o Por supuesto que se pueden ver las vasea: lo actualiza. riantes encontradas por diff en un pagiLos parches contienen los cambios nador o un editor y usarlos para realizar creados por diff en “unified diff format” los cambios manualmente. Esto es muy cuando se utiliza la opción -u. Los camfastidioso con los ficheros grandes. Si bios se muestran en secuencia y se marcan con los signos de suma o resta:
Cuadro 2: Ediff en (X)Emacs La herramienta ediff viene integrada con el editor (X)emacs. Ediff compara dos o tres ficheros de texto. El editor muestra estos ficheros en ventanas separadas (mosaicos verticales u horizontales) o en marcos separados. Dependiendo de la versión (X)emacs, se puede ejecutar ediff mediante el menú (Tools / Compare / …) o utilizar el atajo del teclado [Alt-x], ediff(“M-x ediff” en la notación emacs). A continuación se teclea ? en la ventana de ediff para mostrar una descripción de los comandos adecuados. También están disponibles las páginas de información (info ediff). Ediff por defecto no utiliza colores para destacar texto, usando varias escalas de grises para indicar las variantes. En cambio, si se prefiere utilizar los colores, igual que con vim, presionamos [Alt-x] y tecleamos customize ediff-highlighting. Las entradas Even Diff Face A, Even Diff Face B y Even Diff Face C son las responsables del resaltado entre otras cosas. Pulsamos en la flecha de la derecha para modificar el color y el estilo que prefiramos. No hay que olvidar pulsar en Save para guardar los cambios cuando finalicemos. Luego seleccionamos Done para salir del modo de configuración. La nueva distribución de colores se almacenará en los ficheros de configuración para el editor bajo su propio directorio home, esto es ~/ .xemacs/custom.el para Xemacs.
www.linux-magazine.es
--- file1.txt Sun Jan 25U 16:12:59 2004 +++ file2.txt Sun Jan 25U 16:13:33 2004 @@ -1,5 +1,11 @@ -You can perform many -tasks using KDE or GNOME +Though you can perform many +tasks using GNOME or KDE ...
Si se redirecciona la salida a un fichero, llamado patch por ejemplo, puede entonces usar este fichero para aplicarle los cambios en el segundo fichero desde el primer fichero. La siguiente sección muestra como hacer esto: hj@asteroid:~$ diff -uU file1.txt file2.txt > patch hj@asteroid:~$ patch -b -p0U < patch
Estas opciones le dicen a patch que cree una copia de seguridad del fichero original (-b) y que realice la operación de parcheo en el directorio actual (p0). patch tiene una página de ayuda muy detallada, que definitivamente merece ser leída si necesita más información ■ sobre este comando.
LaTeX
LINUX USER
LaTeX en Linux (IV)
Tipografía Profesional al Alcance de Todos Con esta cuarta entrega llegamos al final de este curso, donde nos hemos acercado al mundo de la tipografía profesional de la mano de LaTeX. Hemos considerado necesario llegar hasta esta entrega para poder alcanzar un nivel que nos permita construir nuestro primer documento completo, un proyecto con índices, capítulos y bibliografía, construido a partir de ficheros independientes, y con el que os convertiréis en auténticos LaTeXpertos. POR JOSE MANUEL GONZÁLEZ VIDA
E
n nuestro paseo a lo largo de las tres entregas anteriores hemos aprendido la “filosofía” de la escritura con LaTeX, partiendo de la construcción de un documento básico sobre el que hemos ido incorporando muchas de las funcionalidades de LaTeX: referencias cruzadas, listas, gráficos, tablas, escritura en modo texto y en modo matemático, etc. En esta entrega nos centramos inicialmente en la inclusión de bibliografía en nuestro documento, bien directamente o bien usando una base de datos y
finalmente vamos a generar nuestro primer proyecto completo.
Citas Bibliográficas Siempre que construimos cualquier tipo de documento es conveniente incluir un apartado dedicado a la bibliografía donde hacemos referencia a las textos que nos han servido de fuente o que pueden servir al lector para profundizar más en alguna de las partes de nuestro trabajo. El trabajo de inclusión de referencias bibliográficas en un texto puede
llegar a ser tedioso si no se utiliza un buen sistema de escritura como es LaTeX. La bibliografía suele ir colocada al final de nuestro documento y puede ir ordenada bien por orden de aparición de las diferentes citas o bien alfabéticamente según los apellidos de los autores. LaTeX es capaz de referenciar adecuadamente cada cita conforme vamos construyendo nuestro trabajo y, por ejemplo, irlas colocando automáticamente por orden alfabético en el apartado de bibliografía, de modo que cada cita bibliográfi-
www.linux-magazine.es
Número 04
87
LaTeX
LINUX USER
Figura 1: Ejemplo de uso del entorno thebibliography.
ca se vaya referenciando según dicho orden de colocación. Comprenderéis así el ahorro de trabajo que puede conllevar el que nuestro sistema de escritura se encargue de los “detalles” de ordenar la bibliografía… El manejo de las referencias bibliográficas con LaTeX no es difícil, de hecho es similar al uso de etiquetas que hemos visto ya anteriormente. En LaTeX las referencias bibliográficas se pueden generar de dos maneras distintas: obteniendo los datos de las citas bibliográficas de una lista incluida al final del documento (para ello usaremos el comando \thebibliography) o bien leyendo los datos bibliográficos a partir de una base de datos externa usando el programa BIBTeX.
El entorno thebibliography Si vamos a incluir la bibliografía incluyendo la lista de referencias al final de nuestro documento usaremos el entorno thebibliography cuya sintaxis describimos a continuación: \begin{thebibliography}U {Longitud Máxima} ... \bibitem[Leyenda]{Referencia}U Título, Autor, . . .
Figura 2: Otro ejemplo del entorno thebibliography.
... \end{thebibliography}
Los argumentos del entorno thebibliography son: • Longitud Máxima: es una cadena de caracteres de anchura mayor o igual a la mayor etiqueta que vaya a aparecer. • Leyenda: Se usa para modificar la leyenda que aparece, en la lista de referencias, a la izquierda de cada una de ellas. Por defecto LaTeX numera las referencias. • Referencia: Es el identificador de la referencia bibliográfica. Como siempre, lo mejor es ver el uso de este entorno a través de un ejemplo: 01 \begin{thebibliography}{10} 02 \bibitem{Cas03} 03 B.~Cascales Salina, P. Lucas Saurín, J.M. Mira Res, A.J. Pallarés Ruíz, S. Sánchez. 04 {\em El libro de \LaTeX.} 05 Pearson-Prentice-Hall, 2003. 06 \bibitem{Lam94} 07 L.~Lamport.{\em \LaTeX: A Document Preparation System.}
08 Addison-Wesley, Reading, Massachusetts, second edition, 1994, ISBN 0-201-52983-1. 09 \bibitem{Oetiker} 10 T.~Oetiker, H.~Partl, I.~Hyna and E.~Schlegl. 11 {\em The Not So Short Introduction to \LaTeX $2\varepsilon$}. 12 \end{thebibliography}
Si introducimos el ejemplo anterior dentro del cuerpo de un documento LaTeX y lo compilamos obtendremos como resultado algo similar a lo que mostramos en la Figura 1. Observemos que cada ítem de la bibliografía posee una etiqueta identificativa (nos va a servir para hacer las citas) y que LaTeX ha asignado un número a cada referencia bibliográfica, de modo que cuando incluyamos citas en nuestro texto aparecerán cosas como por ejemplo “Según se puede ver en [1]…”, de modo que el lector tiene que tener a mano la bibliografía para ver que “[1]” se refiere a determinado libro. Si, bien por ejemplo en el mundo de las matemáticas este método suele ser habitual para realizar las citas, sin embargo en otros ámbitos las citas se suelen hacer referenciando al autor o autores en un
Tabla 1. Estilos de bibliografía en LaTeX Tipo
Descripción
plain
Estilo estándar. Las entradas se numeran correlativamente por orden alfabético de los autores.
unsrt
Parecido al estilo plain pero las entradas se numeran según el orden de aparición.
alpha
La diferencia con el estilo plain es que las entradas se forman por el nombre del autor y el año de publicación (en lugar de usar números).
abbrv
Parecido al estilo plain pero las entradas son más compactas,abreviando los nombres de los autores,las revistas,etc.
acm
Estilo usado en las revistas de la ACM (Association for Computing Machinery). Es distinto a los anteriores.
apalike
Es el estilo usado en las revistas de la American Psychology Association (necesita el paquete apalike).
88
Número 04
www.linux-magazine.es
LaTeX
modo similar a como lo hacemos en el siguiente ejemplo (ver Figura 2): 01 \begin{thebibliography} {10000000000000000000} 02 \bibitem[Cascales y otros, 2003]{Cas03} 03 B.~Cascales Salina, P. Lucas Saurín, J.M. Mira Res, A.J. Pallarés 04 Ruíz, S. Sánchez. {\em El libro de \LaTeX.} PearsonPrentice-Hall, 05 2003. 06 \bibitem[Lamport, 1994]{Lam94} 07 L.~Lamport.{\em \LaTeX: A Document Preparation System.} 08 Addison-Wesley, Reading, Massachusetts, second edition, 1994, ISBN 09 0-201-52983-1. 10 \bibitem[Oetiker]{Oetiker} 11 T.~Oetiker, H.~Partl, I.~Hyna and E.~Schlegl. {\em The Not So 12 Short Introduction to \LaTeX $2\varepsilon$}. 13 \end{thebibliography}
Observemos el cambio del argumento Longitud Máxima en ambos ejemplos. Mientras que en el primer ejemplo al ancho para las citas lo dejábamos en dos caracteres (lo simbolizábamos con “10” como valor para dicho argumento) puesto que las citas se numeraban y sólo había 3 citas, en el segundo ejemplo, al no usar números para las citas, se hace necesario ampliar la Longitud Máxima para que las referencias aparezcan alineadas en la bibliografía. Probad, como ejercicio a cambiar el ejemplo anterior donde cambiáis el valor del argumento Longitud Máxima por “10” y observad el resultado. Y, ¿cómo se citan en el texto a los distintos autores? Pues muy fácil, para hacer referencias a las citas bibliográficas en el texto del documento se emplea el comando: \cite[Texto Opcional]U {Etiqueta}
Vemos su uso introduciendo como cuerpo de un documento el siguiente texto y compilándolo dos veces (Figura 3):
01 Como podemos ver en \cite[pp 44-50]{Lam94} o en \cite{Oetiker}, 02 \LaTeX{} es un lenguaje de escritura profesional fácil de 03 usar\dots 04 \begin{thebibliography}{10} 05 \bibitem{Lam94} 06 L.~Lamport.{\em \LaTeX: A Document Preparation System.} 07 Addison-Wesley, Reading, Massachusetts, second edition, 1994, ISBN 0-201-52983-1. 08 \bibitem{Oetiker} 09 T.~Oetiker, H.~Partl, I.~Hyna and E.~Schlegl. {\em The Not So 10 Short Introduction to \LaTeX $2\varepsilon$}. 11 \end{thebibliography}
Ya sabemos básicamente introducir bibliografía en nuestro documento, sin embargo, aún podemos perfeccionar más su uso mediante el uso de pequeñas bases de datos personales de referencias bibliográficas.
¿Qué es BIBTeX? El programa BIBTeX se usa para automatizar la elaboración de entornos para la bibliografía. La idea es crear una base de datos de referencias bibliográficas a partir de la cual BIBTeX crea el entorno bibliográfico para nuestro documento. La base de datos consiste en un fichero con extensión .bib con una determinada estructura. En nuestro documento ya no se usará el entorno thebibliography sino los comandos: \bibliography{fichero1,U fichero2,... } \bibliographystyle{tipo}
que se pueden colocar tanto en el preámbulo del documento como en el cuerpo del mismo. El primero de los comandos anteriores sirve para indicarle a LaTeX los ficheros de los que va a extraer la bibliografía, y el segundo indica a LaTeX el formato en el que se va a presentar en nuestro documento final. Un ejemplo del formato que han de tener las referencias en la base de datos .bib puede ser el siguiente: @BOOK{CLMPS, title = {\LaTeX: una imprentaU
LINUX USER
Figura 3: Referencia a las citas bibliográficas.
en sus manos}, publisher = {ADI}, year = {2000}, author = {B. Cascales and P.U Lucas and J.M. Mira and A.U Pallarés and S. Sánchez-Pedreño}, }
El fichero de referencias .bib será una sucesión de registros de este tipo donde, como podemos observar en el ejemplo anterior, indicamos el tipo de documento al que hacemos referencia, una etiqueta para referenciarlo, el título, la editorial, el año de publicación y el o los autores. El ejemplo anterior hace referencia a un libro y por eso va encabezado por el símbolo “@BOOK”. Hay símbolos para artículos, proyectos, tesinas, tesis, etc. Pero lo mejor es que no vamos a tener que estudiar el formato de estos registros, sino que tenemos herramientas en Linux para manejarlos cómodamente. Por ejemplo podemos mirar las dos siguientes aplicaciones: Pybliographer y gBib. Pybliographer (ver Figura 4) es una aplicación que trabaja directamente con ficheros .bib (no hace falta importarlos). Posee herramientas de edición muy potentes, un mecanismo de búsqueda jerárquica, e inserción directa de referencias en LyX y Kile. Por otra parte, gBib (ver Figura 5) es un editor de ficheros .bib con una interfaz bastante agradable y fácil de usar y adaptado para Gnome. Cualquiera de ellas es buena y cómoda para introducir nuestras referencias bibliográficas y generar el fichero .bib que usaremos desde LaTeX. En cuanto a los estilos de bibliografía que podemos generar los hemos resumido en la Tabla 1, aunque los más usuales suelen ser el plain y el alpha. Para referenciar las citas bibliográficas cuando se usa BIBTeX, se hace igual que antes, es decir, usamos el comando \cite.
www.linux-magazine.es
Número 04
89
LINUX USER
LaTeX
Figura 5: El programa gBib.
Figura 4: El programa Pybliographer.
Sin embargo, en este caso también podemos usar el comando \nocite, con la misma sintaxis que cite cuando queramos que alguna referencia esté presente en la bibliografía de nuestro documento aunque no la hayamos citado explícitamente en nuestro documento. Finalmente, para compilar nuestro documento cuando se usan ficheros .bib para generar la bibliografía, se debe seguir el siguiente orden: 1.Ejecutamos latex nombre_fichero.tex. Al ejecutar LaTeX por primera vez se genera un listado de referencias en el fichero auxiliar (con extensión .aux). 2.- Ejecutar bibtex nombre_fichero.tex, el cual leerá el fichero auxiliar, las bases de datos y el fichero de estilo (de extensión .bst) y escribirá un fichero con extensión .bbl que contiene un entorno de bibliografía formateado según el estilo escogido. Los errores se almacenan en un fichero con extensión .blg. 3.- Volver a compilar el fichero original con LaTeX (ahora se lee el fichero con extensión .bbl generado en el paso anterior). 4.- Volver a compilar otra vez con LaTeX para resolver todas las referencias cruzadas.
Tanto la portada como cada capítulo se colocan en ficheros separados que se integran en el documento principal en el proceso de compilación. La estructura de ficheros es la siguiente: • master.tex: Fichero principal. • proyecto.cls y anexo.sty: Ficheros de estilo (definiciones y características particulares usadas.) • portada.tex: Fichero con la portada. • capx.tex: Ficheros con el contenido de los capítulos donde x es el número de capítulo. • base.bib: Base de datos con la bibliografía. De todos los ficheros que os menciono arriba solamente os “sonarán” un poco raros los ficheros con extensiones .cls y .sty. Son ficheros de estilo, es decir, ficheros con configuraciones específicas para este tipo de documento y que podéis retocar a vuestro gusto sin más que editarlos e ir probando a cambiar algunas cosas (márgenes, tamaños y tipos de letra, etc). El fichero que hay que compilar es el de nombre master.tex, que es el que enlaza a todos los demás. Si editáis este fichero encontrareis fácilmente las distintas cosas que hay que cambiar o añadir para vuestro propio proyecto. La portada, que encontráis en el fichero portada.tex incluye el imagotipo de la Universidad de Málaga en mi caso. Cada capítulo del proyecto va en un fichero independiente que lo hemos llamado capx.tex, donde x es el número del capítulo. Si editáis los dos capítulos que ponemos de ejemplo, podéis observar que estos ficheros comienzan siempre con \chapter{título del capítulo}. Por último, la base de datos de citas bi-
Un ejemplo de proyecto Lo prometido es deuda, por eso a continuación os propongo un ejemplo de proyecto siguiendo un modelo que yo propongo a mis alumnos para sus proyectos de final de carrera, aunque es fácilmente adaptable a cualquier otro tipo de proyecto: libro, tesina, tesis… Todos los ficheros que nos hacen falta los podéis encontrar en la web de la revista: http:// www.linux-magazine.es en el apartado de descargas de este número.
90
Número 04
www.linux-magazine.es
Figura 6: Ejemplo de la portada del proyecto.
bliográficas está contenida en el fichero base.bib. Si antes de comenzar a editar vuestros propios documentos compiláis el fichero master.tex el resultado que obtendréis será muy parecido a lo que os muestro en la Figura 6. Por último, deciros que ahora os toca a vosotros. Creo que en estas cuatro entregas hemos dado un paseo por el mundo de LaTeX en el que nos hemos acercado a uno de los sistemas de escritura profesional más potentes de hoy en día, basado en software libre y donde podemos comprobar que la comunidad mundial ha enriquecido muchísimo al TeX inicial. Un ejemplo de ello puede ser el proyecto de la Clase Beamer para LaTeX, que básicamente es un sistema de producir transparencias basadas en LaTeX muy superior al archifamoso PowerPoint de Microsoft. Podéis ver ejemplos en la página web del proyecto: http://latex■ beamer.sourceforge.net.
RECURSOS [1] El libro de LaTeX. B. Cascales y otros. Ed. Prentice Hall. 2003. [2] LaTeX, a document preparation system. L. Lamport. 2ª Ed. Ed. Addison-Wesley. 1994. [3] “Una Descripción de LaTeX2e”. Tomás Bautista. http://www.iuma.ulpgc.es/ users/bautista/other/tex/ldesc2e/misc/ ldesc2e.pdf [4] gBib: Gnome BIBTeX editor. http://gbib. seul.org [5] Pybliographer. http://www.pybliographer. org [6] The LaTeX Beamer Class Homepage. http://latex-beamer.sourceforge.net
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.
Proyectos
COMUNIDAD
Software Libre y sus Creadores
Proyectos en Marcha El software libre incluye un abanico tan amplio de aplicaciones que puede ser difícil encontrar la herramienta perfecta. En esta sección, escogemos lo mejor de la cosecha. Este mes echamos un vistazo a distintas opciones para crear presentaciones y a Code Browser, una aplicación para la edición y estudio de código fuente. POR MARTIN LOSCHWITZ
A
sí que ¿que tenían de bueno los buenos viejos tiempos? Hace años, si querías presentar cualquier cosa ante un nutrido grupo de personas, se necesitaba un retroproyector y algún sistema para poner un mensaje en la pizarra… tal vez un rotulador y una regla bastarían.
Empieza el Espectáculo Después de unos años, las impresoras con capacidad para imprimir en diapositivas se convirtieron en útiles armas en la batalla para desterrar el retroproyector. Pero el sistema seguía sin ser perfecto. Por un lado las diapositivas eran caras y por otro, eran de un solo uso. La solución de los últimos años es íntegramente virtual: un videoproyector proyecta una imagen directamente desde un portátil. Powerpoint de Microsoft no es para nada la única herramienta para presentaciones disponible por ahí y los usuarios de Linux cuentan con varias alternativas, incluyendo soluciones que utilizan tanto la línea de comandos como un GUI. Es una mera cuestión de gustos.
Presentaciones Gráficas La herramienta de presentaciones de OpenOffice es tal vez la alternativa más parecida a Powerpoint. Le da a los usuarios una serie de estilos para presentaciones que pueden rellenar con contenidos a su gusto. El editor wysiwyg permite modificar el texto directamente en el GUI. Y existe un cuadro de diálogo tipo señalar y picar para animaciones que pueden hacer más atractivas la exposi-
ción. OpenOffice es tan fácil de utilizar que incluso los novatos y conversos recientes no encontrarán ningún problema en adquirir resultados profesionales. Pero existe una desventaja al utilizar OpenOffice: Necesitas OpenOffice en el ordenador que va a mostrar las diapositivas. Lógico, piensas, pero esto puede ser un problema, ya que OpenOffice requiere mucho espacio y es lento en hardware más antiguo. Si uno ha de instalar todo OpenOffice sólo para
mostrar diez diapositivas, puede que sea mejor pensar en una alternativa.
imagen de fondo) para cada sección de la presentación. Si se desea, Magicpoint incluso puede utilizar un tamaño de punto diferente para cada línea. Una presentación Magicpoint típica suele pesar como mucho 10 Kbytes, más lo que ocupen los ficheros de imágenes que utilice. Los usuarios de Magicpoint destacan sobre todo la característica que permite generar una presentación en un formato abierto que toma la forma de una galería HTML (ver Figura 2). A pesar de que Magicpoint nos se hallará instalado en muchas máquinas, requiere mucho menos espacio que OpenOffice y corre alegremente en hardware antiguo. Además, las diferentes versiones de Magicpoint son en general compatibles entre sí, por tanto un CD Knoppix puede proporcionarte todo lo que necesitas para ejecutar tu presentación.
Funciones Basadas en Texto
En los Huesos
Si puedes vivir sin un GUI, existen varias alternativas en lo que se refiere a herramientas de presentaciones. Por un lado tenemos Magicpoint [1]. Magicpoint genera una presentación lista para correr a partir de un fichero de texto. Se puede utilizar cualquier editor de texto para crear el fichero y el formato de Magicpoint recuerda al de LaTeX (ver Figura 1), sin embargo, aunque no se haya tocado LaTeX con anterioridad, cualquiera debería poder aprender a crear presentaciones vistosas en poco tiempo. Se necesitan varios comandos básicos y se pueden añadir detalles (como una
La tercera herramientas para presentaciones es LaTeX. Que no se queje nadie, que debido a que LaTeX nació como sistema de procesamiento de texto universal, aporta una marco ideal para presentaciones, permitiendo a sus usuarios diseñar formatos muy atractivos. El problema es que requiere bastante esfuerzo producir incluso el resultado más sencillo. Incluso los fans más ardientes de LaTex tendrán que dedicarle bastante trabajo, debido a que la distribución estándar de LaTeX no dispone de plantillas. Afortunadamente, existen unos cuantos añadidos, tales como Prosper [2] y Beamer [3], que pueden hacer que las cosas sean bastante más sencillas.
www.linux-magazine.es
Número 04
93
COMUNIDAD
Proyectos
Figura 3: Code-Browser compacta segmentos de código en carpetas. Figura 2: Magicpoint genera previsualizaciones y galerías HTML a partir de un fichero de presentación.
es un contendiente serio en el campo de las presentaciones, el software libre ofrece más alternativas.
En Busca del Código Perdido Figura 1: La sintaxis de Magicpoint es similar a la de LaTeX.
Prosper y Beamer son clases LaTeX con comandos especiales que permiten a los usuarios modificar parámetros como el color del fondo, tamaño, apariencia general y detalles para cada diapositiva. Prosper viene con una serie de temas. Después de crear un archivo .tex, se puede ejecutar el programa pdflatex para producir material formateado como PDFs. Esto significa que se puede ejecutar la presentación en casi cualquier PC, independientemente del sistema operativo que corra. Las diapositivas creadas con Prosper necesitan un paso más en su procesado: primero se compilan con LaTeX, Dvips y Ps2pdf. Estas dos utilidades son muy similares en lo que se refiere características y facilidad de manejo. Los programas de presentaciones basados en LaTex tiene una ventaja clara con respecto a Magicpoint y OpenOffice: LaTeX se halla instalado en casi cualquier sistema Linux, lo que significa que la mayoría de los PCs Linux podrán mostrar tus presentaciones Beamer o Prosper. Sin embargo, si no se disponen de los conocimientos necesarios de LaTeX, la curva de aprendizaje puede resultar ser un obstáculo. Los novatos deben darse un tiempo para aprender a utilizar el programa. Lo mejor de todo es que los cuatro programas que hemos visto se comportan estupendamente y no dan ninguna sorpresa desagradable y aunque Powerpoint
94
Número 04
Si existe algo más difícil que escribir tus propios programas, eso es entender el de los demás. Perl es un ejemplo clásico de esto, y por ello muchos lo consideran un lenguaje de solo escritura. Pero incluso en entornos más claros e inteligibles, los desarrolladores siguen pudiendo conseguir código críptico. A los desarrolladores a menudo se les exige trabajar en el código de otros y, en este caso, cualquier ayuda se agradece. Muchos editores cuentan con resaltado de sintaxis para bucles, funciones y otros pedacitos de código, pero ni Emacs ni vi son una alternativa para una estructura legible. Y cuando se mezclan trabajos de programadores con diferentes estilos, a menudo los resultados son caóticos. Aquí es donde entra Code-Browser, una aplicación orientada hacia grandes proyectos. Además del resaltado sintáctico, esta herramienta también utiliza carpetas. Es decir: puede compactar secciones libremente seleccionables en una sola línea. El editor muestra a continuación un nombre, permitiendo al desarrollador hacer clic sobre él y mostrar el código fuente en la carpeta. Otra cosa que hace Code-Browser es añadir enlaces a otros ficheros y carpetas. Un enlace te lleva a una nueva solapa con el recurso objeto.
GUI Incluido Code-Browser está escrito en el lenguaje de programación Zinc. El GUI utiliza la librería GTK y el código fuente está disponible en la página de inicio de Code-Browser en [4].
www.linux-magazine.es
El espacio de trabajo de Code-Browser está pensado para ser intuitivo en su manejo, permitiendo abrir cada fichero en una nueva solapa. También se pueden partir las ventanas vertical u horizontalmente, lo que permite a los desarrolladores mantener controlados varios ficheros o carpetas simultáneamente (ver Figura 3). Code-Browser no sólo es útil para estudiar código fuente existente. El búfer deshacer permite deshacer múltiples cambios si algo se tuerce en el desarrollo y la aplicación cuenta con un amplio abanico de opciones de configuración, aunque, la verdad sea dicha, algunos de los diálogos pueden ser un tanto enmarañados. El resaltado de sintaxis soporta la mayor parte de los lenguajes más populares, incluyendo C, C++, C#, Python y Ruby. Los webmasters agradecerán el soporte de CSS, XML y HTML. Y si echas en falta tu lenguaje de programación favorito, el paquete Code-Browser cuenta con ficheros de ejemplo que pueden ser modificados con poco esfuerzo para reflejar tus necesidades. Code-Browser es una aplicación que brinda a los programadores la oportunidad de salirse de la guerra entre los defensores de Emacs y los apóstoles de Vim. Y si buscas una alternativa por otras razones, la visualización de la estructuración de código es un buen argumento para pasarse a Code■ Browser.
RECURSOS [1] Magicpoint: http://member.wide.ad.jp/ wg/mgp [2] Prosper: http://prosper.sourceforge.net/ [3] Beamer: http://latex-beamer.sourceforge. net/ [4] Sitio web de Code-Browser: http:// code-browser.sourceforge.net
Eventos
LINUX MAGAZINE
Eventos Seleccionados
LinuxPark CeBIT 2005
LinuxWorld Expo Canadá
aKademy 2005
Fecha: 10-16 Marzo
Fecha: 18-20 Abril
Fecha: 27 Agosto - 4 Septiembre
Ciudad: Hannover, Alemania
Ciudad: Toronto, Canadá
Ciudad: Málaga, España
Sitio Web: www.cebit.de/ homepage_e
Sitio Web: www.linuxworld canada.com
Sitio Web: http://dot.kde.org
Calendario de Eventos Evento Solutions Linux Linux Park CeBIT 2005 O’Reilly Emerging Technology Conference Novell BrainShare 2005 YAPC::Taipei 2005 Festival Latinoamericano de Instalación de Software Libre LinuxWorld Conference & Expo, Canada MySQL Users Conference & Expo 2005
Fecha 01-03 Marzo 10-16 Marzo 14-17 Marzo 20-25 Marzo 26-27 Marzo 2 de Abril 18-20 Abril 18-21 Abril
linux.conf.au 18-23 Abril 3rd International Linux Audio Conference 21-24 Abril Xtech 2005 24-27 Mayo GUADEC 2005 29-31 Mayo LinuxTag 2005 22-25 Junio I Congreso de Tecnologías del Software Libre 7-8 Julio 2005 Linux Symposium 20-23 Julio Usenix Security Symposium 1-5 Agosto aKademy 2005 27 Agosto - 4 Septiembre
Ciudad París, Francia Hannover, Alemania San Diego, CA, EE.UU. Salt Lake City, UT, EE.UU. Taipei,Taiwan Venezuela, Argentina y Colombia Toronto, Canadá Santa Clara, CA, EE.UU. Canberra, Australia Karlsruhe, Alemania Amsterdam, Holanda Stuttgart, Alemania Karlsruhe, Alemania A Coruña Ottawa, Canadá Baltimore, MD, EEUU Málaga
Sitio Web www.solutionslinux.fr www.cebit.de/homepage_e conferences.oreillynet.com/etech www.novell.com/brainshare taipei.pm.org http://ingenieria.ean.edu.co/~azul/ svnwiki.cgi/colibri/fisl www.linuxworldcanada.com www.mysql.com/news-and-events/usersconference conf.linux.org.au/ www.zkm.de:81/lac www.xtech-conference.org http://2005.guadec.org www.linuxtag.org http://congreso.gpul.org www.linuxsymposium.org www.usenix.org http://dot.kde.org
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 Traductores Paqui Martín Vergara, Paul C. Brown, Jesús Reyes Delgado, Antonio Rueda. Maquetación Sergio Hardasmal Diseño de Portada Paul C. Brown, Pinball (info@pinball-werbeagentur.de) Publicidad www.linuxmagazine.com.es/pub/ Para España Paul C. Brown pbrown@linuxmagazine.com.es pbrown@linuxnewmedia.es Tel.: (+ 34) 951 010 556 Móvil.: (+ 34) 655 036 836 Fax.: (+ 34) 951 010 516 Sergio Hardasmal anuncios@linuxmagazine.com.es Tel.: (+ 34) 951 010 556 Para Alemania, Austria y Suiza Osmund Schmidt anzeigen@linux-magazine.com Tel.: (+49) 6335 9110 Fax.: (+49) 6335 7779
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.com Subscripciones: www.linuxmagazine.com.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@linuxmagazine.com.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.linuxmagazine.com.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
www.linux-magazine.es
Número 04
95
LINUX MAGAZINE
DVD Linux Magazine
En el DVD de Linux Magazine
Mandrake Linux 10.1 Con el número de Linux Magazine de este mes, traemos para todos los lectores el DVD de Mandrakelinux 10.1 Oficial. Mandrakelinux 10.1 es el más reciente de una larga lista de productos innovadores creados por Mandrakesoft para la comunidad Linux. La versión 10.1 incluida en el DVD de este mes es la referencia oficial de Mandrakelinux. Según Mandrakesoft,un periodo de pruebas expandido garantiza una alto nivel de estabilidad en la versión 10.1 Official.
L
a versión 10.1 de Mandrakelinux viene con un kernel Linux 2.6.8 y existe la posibilidad de elegir entre KDE 3.2.3 o Gnome 2.6 para el escritorio (ver Figura 1). Esta versión incluye soporte Wi-Fi y tecnología Intel Centrino Mobile, así como soporte extendido para portátiles y funcionalidades Bluetooth adicionales. También existen paquetes nuevos para el escritorio, como la aplicación de autoedición Scribus y Kphone,
para llamadas telefónicas a través de Internet, y Rosegarden, un paquete para la composición musical.
Instalación Asistida Mandrakelinux es célebre por su instalación automatizada y sencilla. Simplemente hay que enchufar el DVD y responder a las preguntas. La instalación facilita la detección y configuración automática del hardware. El instalador ofrece opciones de configuración para usuarios avanzados, así como un modo de rescate para salvar el sistema en el caso de emergencia. El instalador Mandrakelinux soporta cincuenta idiomas y ofrece varias opciones para sistemas de ficheros, entre ellos, EXT3, ReiserFS y XFS. También se pueden montar discos RAID y redimensionar particiones NTFS a través del instalador. Una útil herramienta de autoinstalación permite duplicar instalaciones de manera sencilla.
Centro de Control
Figura 1: Mandrakelinux viene con los escritorios KDE 3.2.3 y Gnome 2.6.
96
Número 04
El centro de control de Mandrakelinux (Figura 2) aporta un interfaz de usuario completo e intuitivo para la administración de la configuración del sistema. El centro de control incluye más de cincuenta asistentes y utilidades de configuración. A través del centro de control se puede administrar particiones, puntos
www.linux-magazine.es
de montaje, software, seguridad y servicios.
Seguridad Mandrakelinux ofrece varios niveles predefinidos de seguridad que permiten ajustar los parámetros de seguridad del sistema a los requisitos de cada cual. El centro de control permite configurar un sistema de cortafuegos completo utilizando Shorewall y también aporta una serie de opciones de seguridad avanzadas. Asimismo, Mandrakelinux suministra varias herramientas de criptografía, incluyendo OpenSSH, GnuPG, herramientas de certificaciones SSL, sistemas de ficheros cifrados y Linux Kernel Secure.
Redes La distribución Mandrakelinux incluye lo mejor de las herramientas de servidores estándar y ofrece algunas características especialmente innovadoras. En el DVD encontramos RPMs para BIND,
DVD Linux Magazine
Figura 2: El centro de control es de donde se administra el sistema Mandrakelinux.
NFS, DHCP, MySQL y PostgreSQL, Postfix (y Sendmail), Spam Assassin y también Samba. El Apache2 especialmente configurado para Mandrakelinux, suministra docenas de extensiones Apache listas para ser utilizadas. Otra herramienta exclusiva de Mandrake, DrakGW, permite a múltiples usuarios compartir una única conexión a Internet.
Desarrollo La distribución Mandrakelinux 10.1 también ofrece múltiples herramientas para desarrolladores, incluyendo gcc 3.4.1, Perl, Python y un buen surtido de herramientas Java. Se incluye con Mandrakelinux las librerías GTK+ y Qt, así como el entorno de desarrollo integrado, Kdevelop, el entorno de desarrollo HTML Quanta Plus y otras herramientas para componer y administrar código fuente.
Otras Herramientas Mandrakelinux incluye literalmente centenares de otras aplicaciones útiles.
Requisitos del Sistema Procesador: Tipo X586 i mejor. Esto incluye los Pentium I/II/III/IV/Celeron, AMD K6/II/III, AMD Duron y AMD Athlon/XP/IMP. Memoria: 64 MBs mínimo; 128 MBs o más recomendado. 32 MBs para una instalación sólo texto. Disco Duro: 500 MB mínimo; 1 GB recomendado. Se soportan unidades de alta capacidad de hasta 250 GBs. Ver la base de datos de hardware soportado por Mandrakelinux para más información: http://www.mandrakelinux.com/es/ hardware.php3
Encontramos herramientas multimedia como la aplicación de teleconferencia Gnome Meeting, Mplayer, el editor de vídeo Kdenlive y varias otras utilidades para la creación y tostado de CDs. Los juegos de Mandrakelinux incluyen FrozenBubble, Chromium y Tux Racer. Las herramientas de ofimática abarcan el cliente groupware Kontact y el servidor de groupware Kolab. El DVD también incluye Gnumeric, la aplicación de hoja de cálculo de Gnome y Karbon 14, la aplicación de diseño vectorial. La distribución Mandrakelinux aporta un extensa colección de herramienta para la administración del sistema, incluyendo un administrador de software, MandrakeUpdate, Webmin, la herramienta DrakConnect para administrar conexiones a Internet, así como el servicio de consultoría y actualización Mandrakeonline.
Pruébalo El formato en un solo DVD hace que sea fácil y cómodo configurar e
LINUX MAGAZINE
Figura 3: Mandrakelinux 10.1 soporta características tales como menús transparentes para el escritorio.
implementar tu sistema Mandrakelinux. Arranca el DVD de Linux Magazine y responde a las preguntas. Pronto estarás explorando Mandrakelinux 10.1 Official por ti mismo y podrás comprobar porque Mandrakelinux se le conoce por su sistema Linux seguro y de fácil uso, adecuado tanto para el principiante, pero con la suficiente potencia como para satisfacer también al usuario ■ experto.
Instalación con el DVD de Mandrake Linux El DVD Mandrakelinux 10.1 de Linux Magazine contiene la distribución completa Mandrakelinux 10.1 Official. Este único DVD es equivalente a tres o más CDs incluidos con la versión estándar de CDs de Mandrakelinux. Para poder instalar Mandrakelinux utilizando el DVD, se debe disponer de. • una unidad de DVD. La mayoría de los sistemas modernos disponen de una unidad que puede leer tanto CDs como DVDs, pero algunos sistemas antiguos sólo disponen de lectores de CDs. Necesita un lector de DVDs para poder instalar el DVD Mandrakelinux 10.1 Official de Linux Magazine. • soporte para arrancar desde CD/DVD. Los sistemas más modernos en general no tienen ningún problema para arrancar desde un DVD, sin embargo, sistemas más antiguos pueden carecer de esta funcionalidad. Para instalar Mandrakelinux. • Coloque el DVD de Mandrakelinux en el lector de DVDs. • Re-arranque el ordenador. • Siga las instrucciones proporcionadas en la instalación. La mayoría de los ordenadores revisan una lista de prioridades de dispositivos de
arranque al encenderse. El dispositivo de arranque es el dispositivo donde su ordenador encuentra los ficheros necesarios para su arranque. Si su sistema arranca normalmente y no empieza la instalación de Mandrakelinux cuando coloca el DVD en la unidad y re-arranca, puede que se deba a que su unidad de DVDs aparece después de su disco duro en la secuencia de búsqueda de dispositivos de arranque. Si esto ocurre, necesitará entrar en la configuración de la BIOS del sistema y cambiar la secuencia de arranque. Las instrucciones de cómo se entra en la configuración de la BIOS varía dependiendo de la marca y modelo de cada ordenador. Un mensaje que dice como entrar normalmente aparece brevemente en el momento inicial del arranque. El mensaje puede decir algo como “Pulse Supr para entrar en configuración”. Otros sistemas le dirán que pulse F2, la tecla Esc o una combinación de teclas, como Ctrl-Alt-Esc. Hay que introducir la combinación de teclas en las primeras fases del arranque del sistema. Si no ve el mensaje que describe como entrar en el menú de configuración, o si necesita más información sobre como cambiar la configuración de la BIOS, consulte la documentación del proveedor de su ordenador.
www.linux-magazine.es
Número 04
97
PRÓXIMO NÚMERO
Número 4
Mayo 2005: Número 5
Próximo Número Especial Correo Seguro El correo electrónico es uno de los más antiguos y más importantes servicios de Internet. Sin embargo ya no es lo bastante seguro en el entorno hostil de la red de redes de hoy en día. Más del 60 por ciento del correo no es solicitado y los administradores poco pueden hacer en la constante lucha contra la plaga de spam que asola las bandejas de entrada de los usuarios. En el tema de portada de Email Seguro de nuestro próximo número, nos aliaremos con los usuarios en la batalla contra el spam con un análisis en profundidad de la mentalidad del spammer y aprenderemos a explotar eficientemente uno de las más completas herramientas antispam en el mercado actual: Spamassassin. El siguiente paso será explorar el filtrado spam con la ayuda de procmail, lo que de paso nos servirá para entender esa misteriosa información encerrada en las cabeceras de los mensajes de correo.
También veremos formatos de bandejas de entrada de correo y estudiaremos las ventajas y desventajas ofrecidas por los formatos de buzones Linux. Por último veremos la encriptación de correo utilizando una combinación de GnuPG y los clientes de correo Kmail, Thunderbird y Evolution.
Desarrollo En nuestra sección dedicada a la programación, acabaremos de ver el uso de la librería SDL para la creación de un juego implementando sonido, crearemos un vistoso interfaz con uno de los widgets más complejos de la librería Qt: QTCanvas. Y veremos como correr instrucciones del shell desde dentro de un script Perl.
SysAdmins
Práctico Continuamos estudiando el complejo y completo programa Scribus para la autoedición y enseñamos como desarrollar scripts para GIMP. Tendremos un tutorial sobre uno de los interfaces más versátiles para la creación de interfaces a base de datos, Knoda y veremos como controlar un PC desde un teléfono con Bluetooth. Finalmente enseñaremos como hacer funcionar un sistema desde dentro de un sistema con Qemu.
Boletín Linux Magazine El Boletín de Linux Magazine te da la oportunidad de ver lo que se avecina en el siguiente número de Linux Magazine e incluye enlaces a artículos que aparecen en nuestro sitio web antes de que la versión impresa llegue a los quioscos. Suscríbete en www.linuxmagazine.com.es/boletin.
Los administradores de sistemas podrán seguir los siempre prácticos consejos de Charly. Además aprenderemos a administrar los recursos del sistema manteniendo un estricto control sobre los demonios en ejecución. Tendremos la segunda parte dedicada a la seguridad wireless donde vemos los sencillo que es crackear un sistema con encriptación wep y enseñamos a blindar un servidor Apache que corre PHP.
Linux User En el apartado dedicado al usuario final, tendremos una práctica aplicación para escritores profesionales y vocacionales: Kdict. Asimismo enseñamos a configurar un cliente de una red wifi con Kwifi. También veremos uno de las utilidades de la línea de comandos más útiles y versátiles: sort, a la vez que tendremos en nuestra sección de educación otro instructivo artículo para todos los profesores (y alumnos) que utilizan Linux en las aulas.
A LA VENTA ABRIL 2005 98
Número 04
www.linux-magazine.es