Firefox
LINUX MAGAZINE
Extensiones para incrementar la funcionalidad p70
Edición en Castellano
Con más de 3.000 paquetes
NÚMERO 19
Se ejecuta desde el DVD Incluye libro sobre Knoppix en PDF
NÚMERO 19 • P.V.P 6,95 €
Radio
Transmite tu voz alrededor del mundo
Last.fm
Audacity
Icecast
RADIO
Shredder 9
Crea tus propios podcasts con Audacity p12 Last.fm: Una radio virtual a medida p24 Estrena una emisora con Icecast p18
Contraseñas Personaliza tu ventana de validación p38
Clusters Tomcat Alta disponibilidad para servidores web p60
Extensiones Firefox
Shredder 9
Clusters Tomcat
Conviértete en un grand master con este programa de ajedrez p73
Blender 3D
XChat Expande la funcionalidad de tu cliente IRC con Python p50
PCs Antiguos
Antiguallas
AppArmor
Arovecha tu viejo ordenador con DamnSmall Linux p41
Blender Animación en 3D p33
WWW.LINUX- MAGAZINE.ES
-JOVY8PSME $POGFSFODF &YQP o
8PSMEXJEF 4FSJFT 4JOHBQPSF
+VMZ
XXX MJOVYXPSMEFYQP DPN
4BO 'SBODJTDP
"VHVTU o
XXX MJOVYXPSMEFYQP DPN
#FJKJOH
"VHVTU o
XXX MJOVYXPSMEDIJOB DPN
.PTDPX
4FQUFNCFS o
XXX MJOVYXPSMEFYQP SV
4UPDLIPMN
4FQUFNCFS
XXX MJOVYXPSMETVNNJU TF
6USFDIU
0DUPCFS o
XXX MJOVYXPSMEFYQP OM
-POEPO
0DUPCFS o
XXX MJOVYXPSMEFYQP DP VL
$PMPHOF
/PWFNCFS o
XXX MJOVYXPSMEFYQP EF
(VBOH[IPV
/PWFNCFS o
XXX MJOVYXPSMEDIJOB DPN
/FX :PSL
'FCSVBSZ o
XXX MJOVYXPSMEFYQP DPN
.FYJDP $JUZ
'FCSVBSZ o .BSDI XXX MJOVYXPSMEFYQP DPN NY
4ZEOFZ
.BSDI o
XXX MJOVYXPSMEFYQP DPN BV
5PSPOUP
"QSJM o .BZ
XXX MXOXFYQP QMVNDPN DB
4BO 'SBODJTDP
"VHVTU o
XXX MJOVYXPSMEFYQP DPN
8PSME T MFBEJOH 5SBEF &WFOU GPS -JOVY BOE 0QFO 4PVSDF JO CVTJOFTT
*/5&3/"5*0/"- .&%*" 410/403
EDITORIAL
HARDCORE Estimado Lector de Linux Magazine
na queja que he oído con frecuencia últimamente es que no hay desarrolladores para las tareas serias relacionadas con servidores Linux. Según un profesional del sector, en este área se ha pasado de una tecnología a la ofensiva, que estaba bien colocada para dominar el mercado, a estar a la defensiva, viendo cómo sus competidores han establecido una cabeza de playa en su territorio. La inercia de la implantación de Linux se ha perdido, negras nubes se acumulan en el horizonte y las violas, quejumbrosas, anuncian el inevitable desenlace de la batalla. No sé yo. Si la manera de evaluar la evolución del mercado es mirar las estadísticas de Netcraft, donde se comparan las carreras de Apache y IIS, permitid que dude de la fiabilidad de los datos. Estamos hablando de un software muy específico ante otro software muy específico al fin y al cabo. Ni siquiera se menciona la plataforma sobre la que corren. Porque Apache puede correr sobre Windows (y MacOS) y supongo que, con WINE, se podrá correr IIS sobre Linux, aunque, que me aspen si entiendo el porqué nadie haría algo así. Pero, en fin, con tal de que no decaiga la discusión y, al no poseer un baremo mejor, supongamos la batalla entre Apache e IIS por la supremacía en Internet, tal y como aparece registrada en Netcraft, como fiel reflejo de todas las batallas entre Linux en el servidor y todos sus competidores. Personalmente no creo que se haya perdido cuota de mercado, a lo sumo se ha estabilizado el crecimiento. Si Netcraft es representativo de algo, en el último mes podemos ver que, después de varios meses de pérdidas, la adopción de Apache como servidor web vuelve a crecer. Mientras que lo contrario es cierto para IIS: su vector de crecimiento, positivo desde abril, vuelve a su tendencia negativa en julio [1].
U
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 Magazine, 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.
Por otro lado la adopción de Linux ha crecido de manera exponencial, de acuerdo, pero no ha ido acompañado de un crecimiento de sus desarrolladores hardcore. Sin embargo, es un problema de proporción más que de abandono: El número de desarrolladores para Linux ha aumentado en proporción al número de usuarios y, según un estudio de Evans Data [2], se espera que para finales del 2006 el número de desarrolladores que programan para Linux se equipare a los que lo hacen para Windows. Que no se haya visto incrementado en el área de los servidores es algo que analizaremos más adelante. Mientras tanto, la competencia de Linux se ha puesto las pilas. Por un lado están las migraciones masivas de dominios de GoDaddy y otros ISPs a IIS. Hablamos de no menos de 4,5 millones de dominios migrados. Esos son un montón de dominios migrados cuyo efecto se refleja en las gráficas de Netcraft, aunque cabe preguntarse ¿cuán significativo es en realidad? Según algunos analistas, la mayoría de esos dominios son antiguos y están inactivos. Incluso Warren Adelman, COO de GoDaddy, admite que sólo se migró una pequeña parte de la infraestructura del ISP, remarcando que era la que servía dominios “aparcados” [3]. Asimismo, no se conocen exactamente los términos comerciales tras la migración ¿tendría sentido para Microsoft pagar a GoDaddy para que realizase la migración de dominios muertos y así inflar sus estadísticas de uso? O, más bien, y en vista de otras acciones de marketing de la empresa, ¿alguien duda de que lo haría? A la larga, este tipo de acciones suelen difuminarse con el tiempo. Dentro de un año, miraremos las gráficas de Netcraft y nos preguntaremos a qué demonios se debió ese pico. Valiente cabeza de playa. Por otro, cada vez hay más servidores de toda especie. Vale que una compañía
WWW.LINUX- MAGAZINE.ES
con experiencia TI pueda tomar una decisión estratégica y optar por una alternativa a Windows, pero ¿y los que no conocen nada mejor? Puede tener perfecto sentido para una empresa poco ducha en materia TI una solución de arriba abajo que utilice una sola arquitectura, puede tener perfecto sentido contar con un solo proveedor, poder llamar a un único servicio técnico, pagar una sola factura al año… por enorme que nos parezca. Así que nuevas empresas que buscan llevar su infraestructura informática más allá del mero escritorio se encuentran con que ahora tienen varias opciones de varios proveedores. ¿No estábamos a favor de la libre competencia? Y ¿dónde está nuestro departamento de marketing? Porque el de Microsoft está claro que se está ganando el salario. Pero, claro, sí es un problema. Si en vez de 2 desarrolladores tuviésemos 10 para depurar y desarrollar software de servidor, ¡todo lo que se podría avanzar! Sin embargo, hemos de ser claros: el desarrollo de servidores es tan glamoroso como la minería del carbón. Puede que el programador le encuentre su punto, sobre todo cuando escribe un parche que arregla una condición de carrera abierta desde 1999 en Samba o descubre una manera de aumentar el número de threads disponibles en Apache de 1000 a 10000 sin impactar en el rendimiento. Pero intenta explicar a tus padres y a tu pareja lo que te ha mantenido sin dormir el último mes y medio y entenderás a qué me refiero. Si ya es difícil explicar lo que es una condición de carrera, es del todo imposible explicar porqué había que arreglarlo. Continúa en la página 89
Número 19
3
CONTENIDOS • Linux Magazine nº 19
PORTADA 11 Especial Radio ¿Pensabas que Internet no daba para más revoluciones? Con la radio por Internet cualquiera puede montar una emisora. Si quieres empezar a emitir radio o podcasts, o si sólo te interesa sintonizar la emisora perfecta, échale un vistazo a nuestro tema de portada de este mes: Radio por Internet.
12 Podcasting Mostramos cómo crear nuestros propios podcasts con el sencillo editor libre, Audacity.
EVALUACIÓN 26 Inkscape 0.44 La nueva versión de este programa de diseño gráfico incluye nuevas novedades muy interesantes.
29 Enlightenment Enlightenment tiene una gran comunidad de seguidores que han estado esperando pacientemente una nueva versión. Evaluamos este gestor de ventanas extremadamente flexible y estéticamente agradable.
PRÁCTICO
18 Streaming Para la emisión en directo de radio por Internet es necesario un servidor de streaming. Vamos a mostrar en este artículo los primeros pasos para comenzar con Icecast, una alternativa de código abierto para Linux.
33 Blender Blender no genera sólo fotogramas realistas aislados. También es capaz de capturar los movimientos naturales de la gente y los animales. Presentamos algunas de las funcionalidades de animación de Blender.
24 Last.fm Last.fm registra nuestros gustos musicales y nos ayuda a encontrar usuarios con intereses similares.
LINUX MAGAZINE 3 6 8 10 94 94 95 97 98
4
38 Contraseñas con truco Vamos a mostrar algunos trucos para configurar la ventana emergente de contraseñas de root en los sistemas basados en RedHat.
Editorial DVD Linux Magazine Inseguridades Correo Eventos Información de Contacto Subscripciones Linux Local Próximo Número
Número 19
PRÁCTICO 41 Antigüedades Si nuestro ordenador es una pieza de museo que lleva años acumulando polvo, con un procesador viejo y a falta de memoria RAM, es más que posible que muchas de las distribuciones modernas no funcionen en él. Pero esto no es un problema: otras muchas distros diferentes encuentran en máquinas paleolíticas su mejor entorno para funcionar.
DESARROLLO 44 Perl: Artista de la compilación Los analizadores léxicos y sintácticos no son sólo para barbudos gurús. Este mes mostramos cómo podemos crear un parser para nuestras propias aplicaciones.
50 Python: Extendiendo XChat ¿Por qué escribir comandos de IRC cuando Python puede hacerlo por nosotros? Vemos como crear plugins que extienden las funcionalidades de nuestro cliente de chat.
ADMINISTRACIÓN 55 Charly: Nmap4 Muchas herramientas van creciendo con cada nueva versión, pero Nmap 4.00 ha perdido peso gracias al proyecto DietNmap. La última encarnación de Nmap no es sólo más rápida, sino que también consume menos memoria e incorpora nuevas funcionalidades.
WWW.LINUX- MAGAZINE.ES
ADMINISTRACIÓN 56 AppArmor Tras penetrar en un sistema remoto, los intrusos podrían pensar que ya han pasado la parte más dura y están a salvo, pero AppArmor les va a estropear la diversión, encerrándolos en una jaula virtual.
LINUX USER 76 Educación: Oportunidad de colaborar Aunque no seamos programadores, hay una gran oportunidad de contribuir en los campos de la documentación y de la traducción.
81 Línea de comandos: Procesos 60 Cluster En los entornos empresariales suele ser un requisito tener en funcionamiento aplicaciones críticas ejecutándose en alta disponibilidad y balanceo de carga entre varios servidores. Veamos cómo se configura Apache Tomcat para estos menesteres.
Innumerables procesos pueden estar corriendo simultáneamente en un sistema Linux en cualquier momento dado. Enseñamos cómo detener, continuar o matar tareas y examinamos cómo enviar los restos de programas colgados al cielo de los procesos muertos.
84 Juegos: J-Shooters
LINUX USER 68 Ktools: Klear Si estás cansado de batallar con la configuración del software para tu tele digital, prueba Klear, un sistema de televisión para Linux fácil de instalar y de usar.
Ha surgido en tierras del sol naciente una nueva vuelta de tuerca al género de los “matamarcianos”. Gráficos vectoriales muy simples, velocidad, buena jugabilidad y dosis monumentales de adicción.
■ ■
Incluye más de 3.000 paquetes
■ ■
Se ejecuta desde el DVD
■ ■
No requiere instalación
■ ■
Opción de instalación en el disco duro
ADEMÁS: ■ ■
Incluye libro sobre Knoppix en PDF
MÁS DETALLES EN LA Pág 6
COMUNIDAD 86 Konsultorio
70 Desktopía: Firefox Si buscas en Internet encontrarás útiles añadidos para Mozilla Firefox. Examinamos los más populares y vemos como instalarlos y configurarlos.
73 Shredder Shredder 9 trae el campeonato mundial de ajedrez al ordenador de casa. Echamos un vistazo a la versión Linux de este famoso programa de ajedrez.
Si tienes algún problema de configuración, o simplemente quieres conocer mejor cómo funciona Linux, Klaus Knopper, el creador de Knoppix, te ayuda.
90 Debconf6 Bajo el lema “Hot and Spicy” (Calentito y Picante) se reunieron más de 300 voluntarios llegados de todo el mundo en México, para celebrar la DebConf6.
WWW.LINUX- MAGAZINE.ES
Número 19
5
DVD LINUX MAGAZINE
KNOPPIX 5.0 K
noppix es una de las herramientas preferidas por desarrolladores, administradores y miles de usuarios de a pie. Para muchos profesionales en redes, Knoppix constituye es la herramienta definitiva para la búsqueda y eliminación de errores. Puede arrancarse de manera rápida y fácil desde el DVD en la gran mayoría de los sistemas basados en Intel, y una vez arrancado pueden utilizarse las herramientas de diagnóstico para restablecer el sistema. Una distro live es el no va más en portabilidad, y según usuarios repartidos por todo el mundo, Knoppix es el no va más de las distros live. En este número de Linux Magazine, el no va más de Knoppix: la versión 5.0.
Contenido Knoppix 5.0.1 viene con el Kernel de Linux 2.6.15.4 y X.org 6.9. Se puede elegir el sistema de escritorio KDE 3.5.1 o
Requisitos del Sistema Procesador CPU Intel (486 o superior). Memoria 32 MB para modo de prueba; al menos 96 MB para modo gráfico con KDE; 128 MB recomendado para modo gráfico con aplicaciones de oficina. Tarjeta gráfica VGA compatible estándar. Puntero Serie, PS/2 o PS/2 IBM compatible con ratón USB. También se requiere una unidad de DVD arrancable.
Gnome 2.12. Además trae las herramientas de escritorio de Código Abierto más populares, tales como OpenOffice.org, AbiWord, Gimp, Evolution y Firefox. También encontrarás herramientas VoIP como Linphone y utilidades de mensajería instantánea como GAIM y Kopete, además de una gran variedad de aplicaciones multimedia y educativas. La Versión 5.0.1 incluye también algunas mejoras del instalador Knoppix, como es el caso de una nueva característica que permite actualizar instalaciones ya existentes de Knoppix. Los desarrolladores encontrarán una importante y accesible colección de herramientas.
Administración del Sistema Knoppix comenzó su vida como un sistema portable para los administradores de sistemas, siendo sus herramientas de administración una de las mejores cosas con las que cuenta. El DVD de Knoppix contiene muchas de las aplicaciones para servidores que encontrarás en los sistemas Linux que se instalan en discos duros. Además, de los servidores, Knoppix contiene numerosas y prácticas utilidades de administración para la configuración, administración de discos y administración de redes. El live DVD de Knoppix destaca como herramienta para la recuperación de sistemas
Figura 1: Knoppix arranca fácilmente en un gran número de sistemas Intel.
6
Número 19
corruptos. Knoppix se usa para la diagnosis, el análisis y la recuperación de datos. Si el sistema no arranca, engánchate a Knoppix y explora el estado de tu disco duro. Knoppix 5 introduce también una nueva y excitante característica que suministra acceso de escritura transparente para particiones NTFS.
Pruébalo Ahora Sabrás si deseas usar Knoppix sólo con colocarlo en tu lector DVD y arrancando el sistema. No te cuesta nada probar, ni siquiera tendrás que reconfigurar tu sistema para quitarlo. Incluso en el caso de que te encuentres a gusto con tu sistema actual, te será una gran ayuda tener Knoppix a mano. Úsalo como un sistema de backup o llévalo contigo cuando viajes. Puedes engancharte a Knoppix desde cualquier lugar y conseguir el mismo sistema familiar, aunque el sistema esté configurado para Windows. Knoppix proporciona una gran colección de herramientas que deberías tener siempre a mano por si las necesitas, aunque no vayas a viajar, pero que deberías guardar en tu esritorio. Tanto si usas Knoppix una vez al día o una vez al año, en cualquier ocasión, estarás encantado de poder contar con él. Esperamos que disfrutes del DVD Knoppix 5.0.1 que te trae este mes Linux Magazine.
Figura 2: El Knoppix contenido en el DVD es un Linux repleto de características.
WWW.LINUX- MAGAZINE.ES
DVD LINUX MAGAZINE
DESTACAMOS • Kernel Linux 2.6.15.4 • X.org 6.9 • KDE 3.5.1 • Gnome 2.12 • GCC 4.0.3 • OpenOffice 2.0.2 • KOffice 1.5.0 • Abiword 2.4.1 • GIMP 2.2.11 • Inkscape 0.43 • Evolution 2.6.1 • Firefox 1.5.0 • Mozilla 1.7.12 • Thunderbird 1.5.0 • Kopete 3.5.2 • Linphone 1.3.3 • Apache 1.3.34 • Bind 9.3.2 • Samba 3.0.22 • Perl 5.8.8 • PHP 4.4.2
RECURSOS [1] Página de contacto de Knoppix: http:// www.knopper.net/kontact [2] Foro Knoppix: http://www.knoppix. net/forum
AYUDA Y SOPORTE La mejor fuente de ayuda sobre Knoppix es su página web: http://www.knopper.net/ knoppix/index-en.html o la página de inicio del creador de Knoppix (y columnista de Linux Magazine) Klaus Knopper: http://www.knopper.net Puedes enviar tus preguntas sobre Knoppix a la dirección de correo info@knoppix.net
Figura 3: Además de las herramientas de administración encontrarás una gran variedad de juegos.
[3] Wiki de Knoppix: http://knoppix. wikiverse.org [4] Gnoppix (variante de Knoppix con escritorio Gnome): http://www. gnoppix.org/
Figura 4: Knoppix también viene con algunas herramientas multimedia populares.
WWW.LINUX- MAGAZINE.ES
Número 19
7
LINUX USER INSEGURIDADES Schlagwort sollte hier stehen
INSEGURIDADES ■ GnuPG GnuPG es una utilidad para la encriptación de datos y la creación de firmas digitales. Tavis Ormandy descubrió un fallo en la manera en la que GnuPG verifica los datos firmados criptográficamente con firmas separadas. Un atacante que conozca este fallo puede crear un mensaje firmado criptográficamente que podría parecer venir de un tercero. Cuando una víctima procesa un mensaje GnuPG con una firma separada
malformada, GnuPG la ignora, procesa y produce los datos firmados, y sale con estado 0, tal y como si la firma hubiera sido válida. En este caso, el estado de salida de GnuPG no debería indicar que ha tenido lugar una verificación de firmas. Este problema sería peligroso en el caso de que los resultados del proceso de GnuPG se obtuviesen a través de un script automatizado. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common
POLITICAS DE SEGURIDAD DE LAS DISTRIBUCIONES MAYORITARIAS Distribuidor
Fuente Seguridad
Debian
Info:http://www.debian.org/security/ Lista:http://www.debian.org/debian-security-announce/ Referencia:DSA-…1)
Gentoo
Mandrake
Red Hat
Slackware
Suse
Comentario
Los avisos de seguridad actuales se incluyen en la página de inicio. Los avisos se proveen como páginas HTML con enlaces a los parches. Los avisos también incluyen una referencia a la lista de correo. Info:http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para Foro:http://forums.gentoo.org/ la lista Gentoo en el sitio web de Lista:http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la Referencia:GLSA:… 1) página principal. Los avisos se presentan en HTML con códigos para fusionar las versiones corregidas. Info:http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionados con Referencia:MDKSA:… 1) la seguridad. Entre otras cosas,incluye avisos seguridad y referencias a las listas de correo. Los avisos son páginas HTML,pero no contienen enlaces a los parches. Info:http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad Lista:http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A Referencia:RHSA-… 1) continuación los problemas para cada versión de Red Hat se agrupan. Los avisos de seguridad se proveen como una página HTML con enlaces a los parches. Info:http://www.slackware.com/security La página de inicio contiene enlaces al Lista:http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo. Referencia:[slackware-security]… 1) No existe información adicional sobre seguridad en Slackware. Info:http://www.suse.de/en/private/support/ Ya no existe un enlace a la página de security/index.html seguridad tras un remodelado en el sitio Parches:http://www.suse.de/en/private/ web de SuSE. Existe información en la download/updates Lista:suse-security-announce lista de correos y los avisos. Los parches de Referencia:SUSE-SA… 1) seguridad para versiones individuales de SuSE Linux se muestran de color rojo en el sitio de actualizaciones generales. Contiene una corta descripción de la vulnerabilidad que soluciona el parche.
1) Todos los distribuidores muestran correos de seguridad en el campo Subject.
8
Número 19
WWW.LINUX- MAGAZINE.ES
Vulnerabilities and Exposures o CVE, http:// cve.mitre.org) ha asignado a este problema el nombre CVE-2006-0455. Tavis Ormandy también descubrió un fallo en la manera en la que GnuPG verifica los datos firmados criptográficamente con firmas inline. Es posible para un atacante introducir datos sin firmar en un mensaje firmado, de modo que cuando la víctima procese el mensaje para recuperar los datos, los que están sin firmar aparecen junto a los datos firmados. De esta manera los datos no firmados tienen la apariencia de haber sido firmados. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE, http://cve.mitre.org) ha asignado a este problema el nombre CVE-2006-0049. ■ Referencia Debian: DSA-993-1,2 Referencia Gentoo: GLSA-200603-08 Referencia Mandriva: MDKSA-2006:055 Referencia Red Hat: RHSA-2006:0266-8 Referencia Slackware: SSA:2006-072-02 Referencia Suse: SUSE-SA:2006:014
■ Sendmail Sendmail es un Agente de Transporte de Correo (MTA) usado para el envío de correo entre máquinas. Se descubrió un fallo en la manipulación de señales asíncronas en Sendmail. Un atacante remoto podría explotar una condición de carrera para ejecutar código arbitrario como superusuario. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE, http://cve.mitre.org) ha asignado a este problema el nombre CVE-2006-0058. Mediante esta vulnerabilidad solamente podría ser explotar los servidores configurados para que Sendmail escuchara hosts remotos. ■ Referencia Debian: DSA-1015-1 Referencia Gentoo: GLSA-200603-21 Referencia Mandriva: MDKSA-2006:058 Referencia Red Hat: RHSA-2006:0264-8 Referencia Slackware: SSA:2006-081-01 Referencia Suse: SUSE-SA:2006:017
INSEGURIDADES
■ Zoo Zoo es una utilidad de archivado de ficheros escrita por Rahul Dhesi para el mantenimiento de colecciones de ficheros. Zoo es vulnerable a un nuevo desbordamiento de búfer debido al uso inseguro de la función strcpy() cuando intenta crear un archivo desde determinados directorios o nombres de ficheros. Un atacante podría explotar este problema persuadiendo a un usuario para que cree un archivo zoo de directorios y ficheros especialmente manipulados, permitiendo así la ejecución de código arbitrario con los derechos del usuario que ejecuta zoo. ■ Referencia Debian: DSA-991-1 Referencia Gentoo: GLSA-200603-12 Referencia Suse: SUSE-SR:2006:006
■ X.org-x11 Un fallo de programación en el Servidor X.Org X permite a atacantes locales conseguir privilegios de superusuario cuando el servidor es root setuid, tal y como ocurre en la configuración por
defecto de SUSE Linux 10.0. Este fallo fue descubierto por el proyecto Coverity. Solamente se encuentra afectado SUSE 10.0; los productos anteriores a él no incluyen el fragmento de código problemático. El problema está siendo seguido por Mitre CVE ID CVE-2006-0745. ■ Referencia Mandriva: MDKSA-2006:056 Referencia Suse: SUSE-SA:2006:016
■ OpenOffice OpenOffice.org en una suite de productividad ofimática. Contiene herramientas de productividad tales como un procesador de texto, hoja de cálculo, etc. Otras herramientas incluyen presentaciones, edición de fórmulas, exploración de datos y conversión de ficheros. lib-curl, que se encuentra incluido en OpenOffice.org, es una librería libre y de fácil uso por el lado del cliente para la transferencia de ficheros con sintaxis URL. Dicha librería incluye numerosos protocolos. OpenOffice.org posee código libcurl. Dicho código es vulnerable a un
desbordamiento de pila cuando intenta analizar una URL que excede el límite de 256 Byte (GLSA 200512-09). Un atacante conocedor de este problema con libcurl podría tentar a un usuario para que invocara a una URL especialmente manipulada con OpenOffice.org, produciendo de manera potencial la ejecución de código arbitrario con los derechos de un usuario que está corriendo la aplicación. ■ Referencia Gentoo: GLSA-200603-25
■ Flash Player Ha sido identificada una vulnerabilidad de seguridad crítica en Adobe Macromedia Flash Player que permite a un atacante que explote dicha vulnerabilidad con éxito tomar el control de la aplicación corriendo flash player. Para que un atacante explote dichas vulnerabilidades un usuario debe cargar un SWF malicioso en el Flash Player creado por el atacante. Este problema está siendo seguido por Mitre CVE ID CVE-2006-0024. ■
LINUX USER CORREO
Schlagwort sollte hier stehen
Correo del Lector
ACCESO DE ESCRITURA Estimado Sr. Brown, Acabo de comprar el numero 18 de su revista y encuentro que está bien presentada y no dudo de que el contenido es tan bueno como la presentación. Intento aprender de ella, pero supera mi escasa formación. El contenido es para un nivel de conocimientos superior. Así y todo también suelo comprarla cada mes, por cierto. El mensaje que intento presentar es que su revista tiene un publico, pero que existe otro publico, probablemente varias veces superior que necesita una revista para principiantes donde encuentren instrucciones muy, pero que muy, detalladas que le permitan comenzar a usar Linux. Para Windows encontramos cursillos que sirven para los que se inician y además hay muchas revistas como, por ejemplo, Computer Hoy, que facilitan el uso y aclaran dudas. Espero que mi comentario les sea de utilidad, vuestra revista es buena, pero para que Linux coja fuerza hay que sacarlo al gran publico, al público que aún no lo ha usado, el que le tiene miedo, de lo contrario seguirá siendo un sistema operativo para minorías, y las minorías constituyen un mercado pequeño y poco rentable. Les sugiero que comiencen una seccion pequeña en ese estilo y comprueben la aceptación, si gusta, ir incrementándola poco a poco, y al mismo tiempo darle la forma con más demanda. Creo que resultará. Rubén
LM
Estimado Rubén, Creemos que todos sus comentarios son justos y veraces y somos conscientes del nivel de la revista. Asimismo creemos que sus sugerencias dan en el clavo y por eso lanzamos como experimento piloto “EasyLinux” (el primer número apareció en los quioscos en junio – ver http://www.easylinux.es) que se amolda
10
Número 19
a las características que usted describe, amén de venir con una distro de las consideradas más amistosas del mercado: Suse 10.1. El DVD también contiene la opción de ejecutarse como live CD para probar tanto KDE como Gnome y así permitir hacerse con una idea de cómo funciona Linux sin tener que tocar nada del disco duro. Creemos que este tipo de publicación puede complementar muy bien a Linux Magazine, la cual parte de la premisa de que el lector ya tiene Linux instalado y con al menos una configuración funcional básica. De hecho, habiendo dado los primeros pasos gracias a EasyLinux, creemos que el lector ya puede empezar a explotar la información contenida en Linux Magazine, como por ejemplo los tutoriales sobre la línea de comandos, las secciones dedicadas a la instalación y uso de aplicaciones, o los artículos de portada de, por ejemplo, este número, donde se explica cómo recibir (y emitir) radio por Internet desde Linux y que sólo requieren una distro Linux instalada para poder seguirse. Esperamos que, con la combinación EasyLinux y Linux Magazine, podamos llegar a ese gran público que usted menciona que se merece un sistema operativo como Linux: libre, de bajo coste, fiable y profesional.
Mejorando lo presente Estimados Señores, Soy asiduo a su revista, pero últimamente me reconcome la conciencia al pensar que, al comprar su publicación en papel, estoy contribuyendo a la deforestación en el mundo. Por otro lado, vivo en Méjico D.F. y, la verdad, su revista no llega aquí con la velocidad que querría. En realidad, el último que me ha llegado es el número 13, que, según veo en su web, apareció en su país hace cinco meses. Personalmente, los DVDs de su publicación no me interesan mucho, ya que soy de los pocos afortunados que cuentan con una conexión rápida en mi país, pero aun con un modem de 56Ks, con el retraso con la que llegan las revistas, tendría tiempo de sobra para bajarme el software en el momento en que se libera antes que esperar conseguirlo de su publicación.
WWW.LINUX- MAGAZINE.ES
Creo que sería una buena idea que publicasen una versión de descarga, que, a un precio justo, nos permitiera a los usuarios de fuera de España, acceder a los contenidos sin por ello destrozar el medio ambiente y mejorando la velocidad con la que llegan a sus lectores de acá, en Latinoamérica. Espero que tengan en cuenta mi sugerencia y podamos disfrutar pronto de un Linux Magazine más ecológico, más barato y más universal. Reciban un cordial saludo, Roberto
LM
Estimado Roberto, Desde el principio hemos publicado los contenidos de Linux Magazine en nuestra web para su libre descarga en formato PDF. La mayoría de los números publicados se pueden bajar gratuitamente de http://www. linux-magazine.es/Magazine/Archive y, en el momento de escribir esto, están disponibles todos los artículos de los números del 1 al 13, ambos inclusive. Sin embargo, hemos querido llevar la publicación online un paso más allá y, a partir de este número es posible suscribirse a la revista en formato puramente digital, lo que supone un ahorro en los costes de producción para nosotros y un sustancial ahorro en el precio de la subscripción para los lectores, tanto para España, como para el extranjero. Aparte de las mencionadas, la subscripción digital viene con otras importantes ventajas, tales como el acceso a todos los artículos de los números anteriores (y no sólo a algunos, tal y como sucede ahora) y la posibilidad de descargar el número actual incluso antes de que llegue a los quioscos. Creemos que este es el camino correcto a seguir y esperamos que encontréis este servicio interesante. Hay más información sobre este nuevo sistema de subscripción en http://www.linux-magazine.es/digisubs y en la página interior de la contraportada ■ de este número.
Puedes enviar tus comentarios y sugerencias a: correo@linux-magazine.es
www.almogon.de
Se pasan, se pasan
Radio Linux • PORTADA
Sintoniza el mundo de la radio por Internet
RADIO LINUX ¿Pensabas que Internet no daba para más revoluciones? Con la radio por Internet cualquiera puede montar una emisora. Si quieres empezar a emitir radio o podcasts, o si sólo te interesa sintonizar la emisora perfecta, échale un vistazo a nuestro tema de portada de este mes: Radio por Internet. POR JOE CASAD ubo un tiempo en el que jóvenes y mayores se reunían alrededor de la radio para escuchar noticias, humor, opinión y música de lugares distantes. Todos sabían que cualquier cosa que fuese digna de conocerse se encontraría en la radio, además, podíamos viajar por todo el mundo simplemente con mover el dial. Pero la radio cayó en desgracia con la llegada de la televisión, quedando arrinconada a un pequeño nicho formado por seguidores de fútbol, usuarios de transportes públicos y adolescentes fanáticos de la música pop. Este medio aún conservaba cierto significado para sus oyentes, pero la promesa de una radio como herramienta mágica para hacer del mundo un lugar sin distancias es hoy papel mojado. La vieja radio ha languidecido hasta un estado raquítico durante un par de generaciones, hasta que al fin ha vuelto a nacer. Puede que no nos hayamos dado cuenta, pero estos últimos años hemos presenciado el renacimiento de un nuevo tipo de radio. ¿O acaso se trata de algo distinto que simplemente se parece a la radio? La aparición de los servidores de radio por Internet refleja el surgimiento de tecnologías de streaming y avances recientes en
H
hardware de radio. Podemos escuchar en nuestro ordenador de la misma manera que una generación anterior escuchaba con un receptor de radio o un equipo HiFi. Y si estamos conectados a Internet, podremos recibir el sonido de cualquier lugar del mundo. La revolución de la radio por Internet ha provocado una nueva clase de oyentes y una nueva clase de emisoras. Desde cualquier rincón de Internet surgen ideas y exóticos sonidos si sabemos dónde buscarlos. En este número revisamos el fenómeno de la radio por Internet, tanto desde el punto de vista del oyente como del de la emisora. Dentro de su contenido encontraremos temas de interés si queremos inaugurar nuestra propia emisora, o incluso si sólo queremos sintonizar alguna. El artículo titulado “Quédate con la copla” describe cómo grabar, editar y etiquetar un archivo de audio para hacer podcasting usando el editor de sonido de software libre Audacity. También revisaremos el streaming de audio con un repaso al servidor de streaming Icecast.
Y como artículo final, os mostramos Last.fm, un servicio basado en Internet que nos permite crear una “emisora de radio virtual” orientada a nuestros propios intereses musicales. ■
TEMA DE PORTADA Podcasting con Audacity. . . . . . . . . . . 12 Streaming con Icecast . . . . . . . . . . . . . 18 Last.fm. . . . . . . . . . . . . . . . . . . . . . . . . . 24
WWW.LINUX- MAGAZINE.ES
Número 19
11
PORTADA • Podcasting
Grabación de Podcasts con Audacity
QUÉDATE CON LA COPLA Mostramos cómo crear nuestros propios podcasts con el sencillo editor libre, Audacity. POR JON WATSON
E
l podcasting es una popular técnica para distribuir contenidos similares a la radio entre los usuarios de Internet. Los programas en podcast son sencillos de producir, y el proceso de distribución basado en RSS es muy cómodo y apenas supone carga para el sistema. Aspirantes a artistas, entrevistadores y analistas faltos de tiempo o recursos para producir un programa mediante tecnologías más convencionales encuentran una audiencia receptiva y mundial mediante los podcasts. En este artículo mostramos cómo crear nuestros propios archivos de podcast con el editor de sonido Audacity. El verdadero podcast se distribuye directamente al usuario a través de un feed RSS. Muchas compañías de hosting ofrecen planes para podcasts. El servicio de hosting de podcasts atiende la parte técnica del mantenimiento del
12
Número 19
feed RSS, lo que significa que nos podemos concentrar en la parte creativa de la producción. Por supuesto, también tenemos la opción de configurar y mantener nuestro propio feed RSS si preferimos administrarlo nosotros mismos. En cualquier caso, los detalles de la configuración del RSS pueden variar de un caso a otro. En este artículo nos vamos a concentrar en el contenido de audio. Mostramos cómo crear, editar y etiquetar un archivo de audio para podcast.
Primeros Pasos Audacity es un editor de audio maduro, libre y gratuito, que tiene versiones para GNU/Linux, Windows, Mac y cualquier otro sistema operativo en el que seamos capaces de compilarlo. Aunque Audacity no es una herramienta específica para podcasting, su editor incluye un magnifico
WWW.LINUX- MAGAZINE.ES
conjunto de herramientas para los podcasters, ya sean principiantes o avanzados. Es bastante probable que exista una versión de Audacity directamente de los repositorios de nuestra distribución, pero si no lo encontramos, o si queremos la ultimísima versión, debemos dirigirnos a la página Web de Audacity [1]. En el momento de escribir este artículo, la versión estable era la 1.2.3b, y existe una beta disponible, la 1.3.0b. Hay algunos severos avisos acerca de pérdida de datos y cuelgues en relación a la beta 1.3.0b, pero nosotros la hemos usado sin incidentes. Las capturas de pantalla de este artículo son de la beta 1.3.0b bajo KDE en un portátil con Linspire. No solemos recomendar versiones beta, por lo que, a pesar de que no hemos tenido problemas con esta beta 1.3.0b, oficialmente vamos a recomendar el uso de la versión 1.2.4b.
Podcasting • PORTADA
de sonido, y sólo tenemos que apretar el botón rojo de grabación y comenzar a hablar. Sin embargo, deberíamos verificar algunas configuraciones antes de lanzarnos para asegurarnos que el podcaster y la audiencia puedan usar el archivo. En primer lugar, es preferible grabar en Figura 1: Podemos reconocer una grabación en estéreo (panel estéreo en lugar de inferior) por la pista doble de audio. mono. Por defecto, Audacity graba en mono. Si estamos El editor de sonido Audacity en una habituados con los editores de audio, enorme aplicación con suficientes cosas nos daremos cuenta rápidamente, pues interesantes dentro como para adecuarse la representación en la interfaz muestra a proyectos de cualquier tamaño. El podsólo un canal mono en lugar de uno casting conlleva tareas no demasiado doble en estéreo (véase Figura 1). complicadas, por lo que vamos a centrarPara realizar el cambio de mono a nos sólo en un subconjunto de todas las estéreo seleccionamos Edit | Preferenherramientas disponibles en Audacity. A ces. A continuación escogemos la grandes rasgos, un podcaster va a usar pestaña Audio I/O y seleccionamos 2 Audacity para grabar desde un micró(estéreo) en la lista desplegable Chanfono, importar clips de audio de otras nels. Podemos grabar hasta 16 canales, fuentes, editar el flujo de datos de audio, pero dada la relativa simplicidad del crear el archivo de audio final y por podcasting, esto normalmente es inneúltimo etiquetar el archivo. cesario. Vamos a suponer que el lector ha insSi tenemos más de un dispositivo de talado ya Audacity, pero si encuentra audio en nuestro equipo, Audacity problemas con la compilación o la instapodría elegir el dispositivo equivocado. lación, la página de ayuda de Audacity Para indicarle el que debe seleccionar, [2] contiene enlaces a los foros de lo escogemos de una lista desplegable soporte, FAQs, documentación y tutoriatanto en la sección Playback como en les. Record de la pestaña Audio I/O en PrefeUn aspecto importante de Audacity es rences (véase Figura 2). el uso de archivos de proyecto. Cuando Esto debería ser todo lo que necesitaguardamos una grabación por primera mos para dejar a Audacity listo para vez, este editor intenta guardarla en su grabar. Pulsamos el botón OK para formato XML *.aup. Es altamente recocerrar la ventana Preferences y volvemendable dejar que Audacity use este mos a la pantalla principal de Audacity. formato mientras trabajamos con el proA lo largo del borde superior de la venyecto, en lugar de exportarlo a MP3 u tana principal se sitúa una línea de OGG en cada paso. El formato *.aup es botones para comenzar a grabar, parar, mucho más fácil de editar que un MP3 o rebobinar y avance rápido. Para grabar un OGG porque toda la información de simplemente tenemos que pulsar el las pistas y el formato se guardan de botón rojo grande y comenzar a hablar manera individual y sin comprimir. Edi(véase Figura 3). Mientras hablamos, tar un *.aup es mucho más fácil que deberíamos ver una pista parecida a la abrirnos camino dentro de un archivo mostrada en la Figura 1, junto con una MP3 u OGG, donde tenemos todo comonda sonora color azul. pactado. A pesar de que esta es la parte fácil, Grabación de Audio dos detalles a tener en cuenta. Audacity En la mayoría de los casos Audacity ofrece varias maneras de controlar el detecta correctamente nuestro sistema nivel de volumen de voz. Algunas de
WWW.LINUX- MAGAZINE.ES
las herramientas son internas y otras son parte del entorno Linux estándar, como Kmix de KDE. Una de las herramientas que ofrece Audacity es un medidor arriba a la derecha de la ventana principal (véase Figura 4). Mientras grabamos, el medidor varía indicando el volumen de nuestra voz. Parece intuitivo probar a mantener el medidor en la parte media, pero hemos encontrado que tiene que estar puesto al máximo a la derecha o no vamos a ser capaces de escucharnos adecuadamente. Podemos controlar también el nivel de entrada global con el control deslizante situado en el centro, ligeramente a la izquierda, de los botones de la barra de herramientas (véase Figura 3). Por último, cada pista tiene un pequeño control de volumen de entrada (uno con una barra con un “+” y un “” a la izquierda de cada pista, véase Figura 1) que controla el volumen de esa pista en concreto. Tras mucho experimentar, y algunas pruebas defectuosas, hemos llegado a las siguientes conclusiones y filosofías respecto a los ajustes. Lo recomendable sería grabar todo el sonido para que suene de manera adecuada en la mitad del volumen de nuestro equipo. Recordemos que los oyentes van a escuchar el programa en todo tipo de reproductores y en todo tipo de entornos. El único denominador común es que la mayoría lo oirán con unos auriculares. Por tanto, si nos suena de manera adecuada con nuestros cascos, es razonable pensar que los reproductores de los oyentes tendrán controles de volumen adecuados para hacer los ajustes concretos necesarios. Hemos encontrado que es mejor hacer caso omiso a los medidores de Audacity. Como hemos mencionado, en la grabación tenía que estar completamente a la derecha para tener un volumen decente. Si lo dejamos en el medio, puede que no nos oigan. Claro que esto va a depender de cada caso, ya que el sistema de sonido puede afectar al medidor de manera diferente. A continuación ponemos el medidor mostrado en la Figura 3 en 0.5 (en la mitad) y lo dejamos ahí. Hacemos lo mismo con los niveles de entrada individuales de cada pista (Figura 1). Vamos a dejar que KMix se preocupe de nuestros niveles de sonido. La
Número 19
13
PORTADA • Podcasting
interfaz no sólo es más fácil de usar, sino que parece más tranquilizador controlar esto a nivel de sistema operativo que a nivel de aplicación. Dentro de KMix, ponemos el micrófono ligeramente por encima de cero (Figura 5) y habilitamos el Mic Boost. Eso es todo. La única configuración que hay que tocar de vez en cuando es el control de nivel de entrada para pistas concretas (véase Figura 1). En ocasiones, cuando importamos un fragmento de audio, su volumen resulta ser demasiado alto o bajo, por lo que tenemos que ajustarlo con el control deslizante de la pista importada.
Importar Otro Audio Uno se da cuenta después de pocos programas que un show compuesto sólo de voz llega a ser bastante aburrido. Además, probablemente querremos crear una intro que importemos al comienzo de cada programa. Nosotros hemos importado entrevistas por Skype, clips de efectos sonoros, mails de voz de oyentes y música podsafe de Magnatune. Que los contenidos sean variados ayuda a que el programa sea interesante y enganche. Audacity puede importar formatos WAV, MP3, OGG, AIFF, AU, Flac, Midi y algunos otros más desconocidos. Importar es tan sencillo como seleccionar Project | Import Audio. Para importar Midi, seleccionamos Project | Import Midi. Si tenemos un archivo de audio en un formato que no está directamente soportado por Audacity, podemos probar suerte con Project | Import Raw Data.
Cuando importamos audio, y siempre que sea posible, es mejor hacerlo en un formato que esté sin compresión. Debemos tener en cuenta que, al final del proceso, vamos a crear un archivo MP3 u OGG, que son formatos de compresión con pérdida. ¿Recuerda el lector la paradoja con los archivos JPEG de finales de los noventa? Muchos grafistas sin experiencia editaban una imagen JPEG y guardaban, volvían a editar y volvían a guardar una y otra vez. Cada vez que se grababa la imagen se perdía información, con lo cual al final del proceso el resultado era espantoso. La misma idea es aplicable al importar audio. Si importamos audio ya comprimido en MP3 en el proyecto, y volvemos a guardarlo entero a un MP3 de nuevo, la parte importada, de hecho, ha perdido información dos veces. Generalmente vamos a intentar importar sólo archivos WAV o AU sin comprimir en los proyectos, pero no siempre será posible. La regla general es usar el archivo con la mayor calidad posible que podamos. Extrañamente, no podemos importar un archivo nativo de Audacity *.aup en nuestro proyecto. Si queremos importar algo que hemos guardado en este editor, primero vamos a guardar la grabación en cuestión como un WAV sin comprimir y luego importamos ese archivo WAV.
Editar el Archivo de Audio Pocos podcasters hacen un programa entero de un tirón. Lo normal es editarlo antes de sacarlo a la luz. No importa lo bien o mal que salga, siempre hay detalles difíciles de controlar,
Figura 2: Configuramos la reproducción, grabación y el playthrough en el cuadro Audacity Preferences.
14
Número 19
WWW.LINUX- MAGAZINE.ES
Figura 3: Los botones parecidos a los de un vídeo están en la parte superior de la ventana, como los de grabación, reproducción, rebobinado y avance rápido.
como el ladrido del perro o el timbre de casa. Algunos podcasters dejan estos fallos, pero queda más profesional si los eliminamos. Existen tres herramientas que se usan muy frecuentemente en Audacity. Son los botones de parar y pausa, la herramienta de desplazamiento en el tiempo y el efecto de normalización. Y menos frecuentemente también tenemos el filtro de eliminación de ruido, para eliminar algún ruido de fondo no deseado. Los botones de comienzo y pausa operan de diversas maneras. Si pulsamos el botón de parar al grabar, la pista termina y la siguiente pulsación sobre el botón play hace que Audacity comience con una nueva pista. En cambio, cuando pulsamos el botón de pausa, la pista no termina y la siguiente pulsación sobre play hace que Audacity continúe la grabación en la misma pista. En general, es más fácil mover pistas enteras arrastrando la parte izquierda de éstas, y después soltarlas en su nueva ubicación. Sin embargo, si vemos que apretamos demasiado el botón de stop, la cantidad total de pistas pueden hacer que la situación resulte complicada de manejar. Como regla general, podemos presionar pausa cuando tenemos que hacer algo que no requiera edición posterior (como ir a beber algo). Si hay un error más grave (como el timbre de una puerta) que necesite edición posterior, podemos darle al botón de stop. Así será más fácil encontrar los errores al final de cada pista en lugar de buscarlos en medio de la grabación. A menos que todos en el programa sean unos genios del timing, tendremos
Podcasting • PORTADA
que mover pistas de un lado para otro. Podemos usar esta herramienta con frecuencia simplemente para dar un nexo y unir pistas. La herramienta de desplazamiento en el tiempo se encuentra entre los botones a la izquierda de los botones parecidos a los de un vídeo. Concretamente, es el botón con dos flechas en él. Para movernos por la pista, pulsamos el botón de desplazamiento temporal. El botón permanece presionado, y al mover el cursor por una pista de la ventana principal de Audacity, toma la apariencia de una doble flecha. Situamos el cursor sobre la pista que queremos mover y la arrastramos. Desafortunadamente Ksnapshot no captura el cursor del ratón, por lo que no hemos podido proporcionar una imagen de este paso. Puede que nada salve más el pellejo que el efecto de normalización. Audacity incluye una impresionante lista de efectos (véase el menú Effects), aunque generalmente las funciones más usadas son solamente las de normalización y eliminación de ruido. Es importante destacar que los efectos se supone que deben aplicarse sobre la pista o selección de pista después de haber sido grabadas. No se pueden usar mientras se está grabando. El efecto de normalización consigue que la sección o pista seleccionada se suavice de manera que los puntos altos no sean tan altos y los puntos bajos no sean tan bajos. Sólo hay dos opciones en la herramienta de normalización, Remove y DC offset and Normalize maximum amplitude to -3 dB (véase
Figura 6). Funciona bien con ambas activadas. Si normalizamos una pista, deberíamos normalizarlas todas. Como la herramienta sólo actúa sobre la selección, tenemos que seleccionar cada pista individualmente y ejecutar la función. A veces si la diferencia de pitch entre las voces de los presentadores es muy acusada, es recomendable usar la normalización para preservar la cordura de los oyentes. El único tipo de audio que no vamos a normalizar es la música. Suponemos que el músico sabe más de audio digital que nosotros y que ha compuesto su fichero de la manera que él o ella ha querido. La normalización aquí puede parecer un poco presuntuosa. La otra herramienta realmente útil es la de eliminación de ruido (véase Figura 7). Esta herramienta puede sacarnos de algún apuro. Una anécdota: en uno de nuestros programas estábamos de viaje y decidimos grabar parte de él dentro de un coche mientras esperábamos un ferry que nos llevaba a una isla. La batería del portátil estaba en las últimas y tuvimos que conectarla a un inversor de corriente. No nos dimos cuenta hasta más tarde, pero el inversor estaba introduciendo un espantoso ruido de fondo en la grabación. Los últimos 15 minutos del programa parecían completamente perdidos. Afortunadamente, el efecto de eliminación de ruido funcionó, y aunque no lo eliminó completamente, si que lo restauró lo suficiente como para poderlo usar en el programa. La herramienta de eliminación de ruido tiene que ejecutarse dos veces. La
Figura 5: Configuración del micrófono en KMix.
primera es para tomar la muestra del ruido de fondo que queremos eliminar y la segunda es para realizar la verdadera eliminación. El proceso es el siguiente: 1. Seleccionamos unos segundos de audio de una pista que contiene sólo el ruido de fondo que queremos eliminar. 2. Escogemos Effect | Noise Removal. 3. Pulsamos sobre el botón Get Noise Profile. La ventana toma la muestra y luego se cierra con unas florituras nada intuitivas. 4. De nuevo, seleccionamos Effect | Noise Removal del menú. 5. Y a continuación el botón Preview para ver cómo suena la pista con el ruido eliminado. 6. Si el sonido no es adecuado, jugamos con el control situado encima del botón Preview para eliminar más o menos ruido. Pulsamos sobre el botón Preview de nuevo. Repetimos hasta que estemos contentos con el resultado. 7. Pulsamos sobre el botón OK y el ruido de fondo quedará eliminado. Es importante señalar que el éxito de esta herramienta depende profundamente del tipo de ruido de fondo. Cuanto más previsible sea el ruido, más posibilidades hay de que se elimine adecuadamente. En el caso de la anécdota comentada anteriormente, funcionó muy bien porque era bastante predecible. Si intentamos eliminar el ruido de una aceleración rápida de un coche, o el de un claxon, las posibilidades de que la herramienta pueda eliminarlas completamente sob bastante bajas.
Creamos el Archivo de Audio Final Figura 4: El medidor situado en la esquina superior derecha de la ventana principal de Audacity varía para mostrar el volumen de nuestra voz.
WWW.LINUX- MAGAZINE.ES
El podcasting ya es suficientemente viejo como para que haya evolucionado
Número 19
15
PORTADA • Podcasting
la expectación levantada. Cuanto más cerca estemos de lo que esperan nuestros oyentes, más fácil será que se suscriban al programa. Existen dos extensas áreas a las que prestar atención: el tipo de archivo y su calidad. Si no fuésemos entusiastas del software libre no nos plantearíamos un estudio acerca del tipo de archivo en relación al podcasting. El formato MP3 es, de lejos, el más usado. Está soportado por todos los editores digitales y por todos los reproductores de música. ¿Por qué querría nadie producir un programa en otro formato? El MP3 es un formato propietario que pertenece a Thomson y al Instituto Fraunhofer. Mucha gente no es consciente de que no es un formato libre debido a su uso masivo. De hecho, yo mismo no me di cuenta hasta que Richard Stallman vino a mi programa “GNU/ Linux User Show” número 13 y me preguntó porqué no empezaba a producir programas en el formato OGG Vorbis. A partir de ese momento comencé a realizarlos en OGG además de MP3. Me gustaría realizarlo sólo en formato OGG, pero seguro que eso sería un suicidio desde el punto de vista del podcaster. Simplemente no hay suficiente soporte en los reproductores ni en los oyentes para este formato aún. Ciertamente existen algunos reproductores que pueden reproducir OGG Vorbis, pero no son muchos, e incluso algunos de ellos no son capaces de reproducir OGG Vorbis con tasa de bit variable. Nuestras estadísticas muestran que sólo un 25% de nuestros oyentes descargan el OGG. El resto prefiere MP3. Recomendamos producir al menos el MP3, y si es posible, también OGG. Debido a problemas de licencias con MP3, Audacity no puede codificar archivos MP3 por defecto. Para poder codificarlos necesitamos el archivo libmp3lame.so y además debemos indicarle a Audacity dónde puede encontrarlo. Descargamos libmp3lame.so a una ubicación conocida de nuestro equipo. Luego usamos el botón de File | Preferences | File Format tab | Find Library para llevar a Audacity hasta allí. Audacity puede codificar OGG Vorbis directamente.
16
Número 19
Antes de codificar nada, sin embargo, debemos asegurarnos que la codificación debe hacerse con los ajustes óptimos. El primer ajuste importante es la tasa de muestreo. Para verla pulsamos sobre la pestaña File | Preferences | Quality y miramos la lista desplegable Default Sample Rate. De una manera increíblemente simple, la tasa de muestreo controla la frecuencia con la que se toman las muestras de la fuente original para hacer la digitalización. Esta frecuencia se mide en Herzios (Hz). Cuanto mayor sea la tasa de muestreo, mayor será la calidad. Desafortunadamente, una tasa de muestreo mayor también significa un archivo mayor. Como nuestros oyentes van a descargar estos archivos desde Internet, cuanto menor sea el archivo, mejor. La configuración de tasa de muestreo afecta tanto al MP3 como al OGG. La tasa de bits es otra configuración que juega un papel importante en la calidad del archivo. Por contra a la tasa de muestreo, Audacity tiene configuraciones separadas para las tasas de bits de MP3 y OGG. Para llegar a la configuración de tasa de bit, seleccionamos File | Preferences y elegimos la pestaña Format. Los apartados en los que estamos interesados son OGG Export Setup y la sección MP3 Export Setup. El OGG Export de Audacity consiste en una única barra que varía de 0 a 10. La configuración de tasa de bits en MP3 consiste en una lista desplegable que lista un rango desde 16 Kbps hasta 320 Kbps. El Santo Grial del podcasting es el compromiso entre un pequeño tamaño de archivo para distribuir y un nivel de calidad decente. No existe una única combinación de tasa de bits y tasa de muestreo que funcione con todos los podcasts. La configuración correcta depende mucho del contenido. Un podcast sólo de voz, por ejemplo, puede funcionar bien codificado a 22050Hz de tasa de muestreo y tasa de bits de 48Kbs. Un podcast musical debería codificarse con mucha mayor calidad, a unos 96000Hz de tasa de muestreo y 128Kbs como mínimo de tasa de bits. Estas configuraciones representan los niveles por arriba y por abajo, debiéndose encontrar el adecuado en cada caso particular.
WWW.LINUX- MAGAZINE.ES
Figura 6: La herramienta de normalización nos ofrece sólo dos opciones.
Nuestro programa JaK Attack! es fundamentalmente conversación con una única canción en medio del show. Como esta parte musical es de sólo 2 ó 3 minutos, no hay demasiada ventaja en codificar el archivo entero como si fuese música. Por tanto, normalmente se codifica a 22050 Hz y a 48Kbps (para el MP3) o nivel cero (para el OGG). Un programa típico de JaK Attack! ocupa unos 5 ó 6 MB para 15 minutos. Probablemente el lector haga ajustes en función del tipo de contenido. Si tenemos más música, deberíamos codificar a una tasa mayor, y menor en caso contrario. La clave es la experimentación. Si probamos con pequeñas grabaciones esto nos servirá de muestra para ver el tamaño de los archivos y las diferencias en calidad generadas con distintas configuraciones. En cualquier caso, una vez que hayamos configurado nuestras tasas de muestro y de bits, codificamos el archivo seleccionando File | Export as MP3 o File | Export as OGG Vorbis.
Etiquetar el Archivo Las etiquetas ID son pequeños fragmentos de información incrustados en el archivo de audio. La mayoría de los reproductores digitales son capaces de leer estas etiquetas y mostrar la información contenida en la pantalla mientras se reproduce el archivo. Audacity tiene una aplicación interna para aplicar etiquetas ID, pero no está del todo pensada para podcasts, por lo que no es una herramienta perfecta. Para etiquetar nuestro archivo, seleccionamos Project | Edit ID3 Tags (véase Figura 8). Nótese que estas etiquetas sólo se aplican a archivos MP3 y no a archivos OGG. Tendremos que recurrir a un programa etiquetador externo como EasyTag [3] para etiquetar nuestros archivos OGG Vorbis.
Podcasting • PORTADA
Nosotros, particularmente, usamos EasyTag para etiquetar tanto los MP3 como los OGG, pero no vamos a hablar en este artículo de EasyTag. La razón por la cual no usamos la herramienta interna de Audacity es doble. Por un lado, la poblada lista de géneros no tiene, por desgracia, el apartado “podcast”. Por otro lado, no etiqueta, como hemos dicho, los archivos OGG. EasyTag tiene un formulario más flexible para las etiquetas y funciona tanto sobre los MP3 como sobre los OGG. Con independencia de la herramienta que usemos, las etiquetas que deberíamos rellenar como mínimo son: •
•
•
Artista: nuestro nombre. Al igual que con el blogging, la gente relaciona mejor un nombre real que un seudónimo. Título: el nombre del programa. Esta etiqueta genera scrolls por la pantalla del reproductor mientras se escucha el programa. Se considera una buena práctica hacer referencia a la fecha del programa en este campo antes del título. Particularmente, nosotros no lo hacemos, pero está altamente recomendado. Género: seleccionamos “podcast” si podemos. Si no, puede recurrirse a “other”.
Existen muchos otros campos ID, pero los de arriba constituyen los tres que más deberíamos tener en cuenta.
Paso Final: RSS Nuestro feed RSS para el podcast es el elemento mágico que hace que el
programa se pueda “podcastear”. Sin un feed RSS adecuadamente formateado para distribuir el programa, nuestros oyentes no serán capaces de suscribirse con un podcatcher. Esto no significa necesariamente que estemos fuera de juego, ya que nuestros oyentes pueden aún hacer la descarga directa, aunque un cierto segmento de éstos prefiere el formato de podcatching. Simplemente le ponemos podcatcher en el nombre del género del lector RSS que sea capaz de reconocer el elemento <enclosure> de RSS 2.0. El elemento <enclosure> anuncia la presencia desde un URI hasta un archivo binario. Un podcatcher [4] tiene la habilidad de verificar en los feeds suscritos en busca de nuevos programas, y si encuentra alguno, de descargar el programa hasta nuestro equipo. Los diferentes podcatchers tienen diferentes funcionalidades, por encima o por debajo de las básicas, pero cualquier podcatcher debe ser capaz de llevar a cabo la tarea “check and download”. Algunos de los podcatchers más populares son Bashpodder y las variantes GNU/ GPL para GNU/Linux, e iTunes para Windows o Mac. amaroK tienen también algunas funcionalidades avanzadas de podcatching. Para los geeks más detallistas, como nosotros, el elemento enclosure es un subelemento de <item> que tiene tres atributos requeridos: el protocolo (debe ser http) y URI al archivo binario, tamaño en bytes y el formato del archivo. Un enclosure típico sería algo como: <enclosure url=”http://U www.podcastingrocks.com/U media/mypodcast_20060224_12.ogg ” length=”16257377” U type=”audio/x-ogg”>
o
Figura 7: La herramienta de reducción de ruido ha sido la salvación de muchos podcasts.
<enclosure url=”http://U www.podcastingrocks.com/U media/mypodcast_20060224_12.mp3 ” length=”16257377” U type=”audio/mpeg”>
WWW.LINUX- MAGAZINE.ES
Figura 8: Audacity viene con herramienta de etiquetado interna.
una
La mayoría, si no todos, de los hosting de podcasts generan un feed RSS adecuadamente formateado como parte del servicio. Si optamos por albergar nosotros mismos nuestros programas, algunas herramientas de blogware pueden crear elementos enclosure, por ejemplo Feedburner. Probablemente el mejor lugar para obtener información de primera de cómo funcionan el RSS y el podcasting juntos es el artículo de la Wikipedia acerca del Podcasting [5] o la de RSS Enclosures [6].
Conclusión Una vez que creamos, editamos, codificamos y etiquetamos nuestro programa, todo lo que tenemos que hacer es buscar un lugar donde subirlo y proporcionar un feed RSS adecuado. ¡Feliz Podcasting! ■
RECURSOS [1] Audacity: http://audacity.sourceforge. net [2] Página de ayuda de Audacity: http:// audacity.sourceforge.net/help/ [3] EasyTag: http://easytag.sourceforge. net/ [4] “Audio Delivery: Podcatching without an iPod,” Linux Magazine Internacional nº56, Julio 2005 www. linux-magazine.com/issue/56/ Podcatching.pdf [5] Podcasting en la Wikipedia: http://en. wikipedia.org/wiki/Podcasting [6] RSS enclosures en la Wikipedia: Http://en.wikipedia.org/wiki/ RSS_Enclosures
Número 19
17
PORTADA • Streaming
Streaming de Audio con Icecast y Muse
RADIO MICASA Para la emisión en directo de radio por Internet es necesario un servidor de streaming. Vamos a mostrar en este artículo los primeros pasos para comenzar con Icecast, una alternativa de código abierto para Linux. POR DANN S. WASHKO
E
n Internet se puede encontrar el audio de diversas formas, desde enlaces ordinarios a clips sonoros, a podcasts desarrollados mágicamente con la tecnología push basada en RSS. Muchos oyentes, sin embargo, prefieren contenidos en directo en tiempo real. Las retransmisiones de radio por Internet llegan a su PC de casa por cortesía de los servidores de streaming. En Internet se pueden encontrar servidores de streaming que transmiten audio o vídeo en directo, listas pregrabadas o bien contenidos bajo demanda. La mayoría de los servidores de streaming proporcionan búfers de fuentes y ofrecen compresión para reducir los costes del ancho de banda.
18
Número 19
Para los sistemas Linux existen diversos servidores de streaming, tanto comerciales como de código abierto. El servidor Quicktime Streaming de Apple, producto comercial diseñado para ejecutarse en los servidores OS X, se basa en el servidor de Apple Darwing Streaming Server. Este servidor [1] es un proyecto de código abierto que se ejecuta igualmente en Linux/BSD, OS X y Windows. La versión comercial de Apple ofrece una buena integración con las utilidades del servidor OS X y soporte de Apple. El servidor Darwin carece de soporte oficial, pero posee una comunidad creciente accesible vía IRC, listas de correo y foros. Similarmente, RealNetworks ofrece una solución de streaming comercial llamada
WWW.LINUX- MAGAZINE.ES
Helix Server [2], basada en el servidor Helix DNA Server, cuyo código fuente es liberado tanto por RealNetworks Community y RealNetworks Public Source. Aunque la versión comercial incluye soporte para la mayoría de los formatos, la oferta de la versión de código abierto está limitada a MP3, RealAudio y RealVideo. Una buena versión estable de un servidor de streaming para los usuarios de Linux es Icecast2 [3]. Icecast es un proyecto de código abierto soportado por Xiph.org, una organización dedicada a “…proteger las fundaciones de multimedia de Internet del control de los intereses privados” [4]. Se puede descargar el código fuente de Icecast desde [3], pero puede ser que la distribución
Streaming • PORTADA
de Linux que se esté utilizando ya traiga el paquete de Icecast listo para su instalación. En el momento de escribir este artículo la versión actual de Icecast2 es la 2.3.1.
¿Qué es Icecast? Un servidor de streaming como Icecast está a la escucha de las peticiones de las conexiones entrantes por parte de los clientes de Internet, conectando al cliente a un flujo de datos multimedia. El servidor Icecast puede transmitir datos en formato ogg vorbis, ogg theora y mp3 sobre HTTP. En un escenario típico de streaming los oyentes realizan una conexión con el servidor utilizando un navegador normal y corriente y el stream comienza a sonar en el ordenador por medio de un reproductor multimedia como AmaroK o XMMS. Por supuesto que el stream de audio que Icecast manda al cliente debe originarse desde alguna parte. Icecast es capaz de reproducir ficheros de audio desde una lista
de reproducción. Pero quizás es más común ver a Icecast recibiendo los datos de audio desde una aplicación externa denominada fuente de stream o cliente fuente. Esta fuente transmite los datos a Icecast e Icecast hace que el stream esté disponible al mundo a través de las conexiones cliente de Internet. En el caso de una retransmisión en directo, el cliente fuente podría ser una aplicación que interactúe directamente con el interfaz de audio donde los micrófonos estén conectados. En el caso de audio pregrabado, el cliente fuente simplemente podría actuar como un reproductor de música que transmite un stream de audio a Icecast. En este artículo se va a describir cómo se instala y configura Icecast, además se verá cómo hay que configurar un cliente fuente para que le envíe su stream de salida al servidor Icecast. Se encuentran disponibles diversos clientes fuente, incluido IceS, desarrollado por el equipo de Icecast. IceS
se verá más adelante, y además se mostrará la forma de configurar un stream utilizando la fuente cliente MuSE.
Instalación de Icecast Si se va a compilar desde los ficheros fuente, Icecast requiere que se tengan las librerías de desarrollo libxml, libxslt, libogg y libvorbis. Por defecto Icecast requiere curl, pero se puede optar por compilarlo sin curl usando el parámetro -without-curl. Sin curl, Icecast no puede realizar ninguna interacción con el Servidor de Directorios; es decir, no se podrá anunciar el stream en las listas públicas YP de Icecast. Para los streams de video theora se requieren las librerias Theora (véase ezstream [5] para la fuente cliente theora). Para los streams mp3, se debe tener instalado Lame [6]. Lo más probable es que las características opcionales se detecten por el script de configuración, así que no hará falta añadirle los parámetros adicionales.
Listado 1: Fichero de configuración icecast.xml de ejemplo 01 <icecast>
27 <mount>
02 <limits>
28 <mount-name>/myshow</mount-name>
03 <clients>5</clients>
29 </mount>
04 <sources>2</sources>
30
05 <threadpool>5</threadpool>
31 <fileserve>1</fileserve>
06 <queue-size>524288</queue-size>
32
07 <client-timeout>30</client-timeout>
33 <paths>
08 <header-timeout>15</header-timeout>
34 <basedir>/usr/local/share/icecast</basedir>
09 <source-timeout>10</source-timeout>
35 <logdir>/usr/local/var/log/icecast</logdir>
10 <burst-on-connect>1</burst-on-connect>
36 <webroot>/usr/local/share/icecast/web</webroot>
11 <burst-size>65535</burst-size>
37 <adminroot>/usr/local/share/icecast/admin</adminr oot>
12 </limits> 13
38 <alias source=”/” dest=”/status.xsl”/>
14 <authentication> 15 <source-password>sourcepassword</source-password> 16 <relay-password>relaypassword</relay-password>
18 <admin-password>changeme</admin-password>
20 21 <hostname>myhost.org</hostname> 22 23 <listen-socket> 24 <port>8000</port> 25 </listen-socket> 26
40 41 <logging>
17 <admin-user>admin</admin-user>
19 </authentication>
39 </paths>
42 <accesslog>access.log</accesslog> 43 <errorlog>error.log</errorlog> 44 <loglevel>1</loglevel> 45 <logsize>10000</logsize> 46 </logging> 47 48 <security> 49 <chroot>0</chroot> 50 </security> 51 </icecast>
WWW.LINUX- MAGAZINE.ES
Número 19
19
PORTADA • Streaming
Tras la descarga y la descompresión de los ficheros fuente, se instala Icecast mediante el siguiente proceso de tres pasos: ./configure make make install
Por defecto, Icecast se instala en el directorio /usr/local. Si ésta se realiza utilizando el gestor de paquetes será bastante más sencillo. Los usuarios de Debian deben tener en cuenta lo siguiente: por defecto, Icecast está deshabilitado en /etc/default/icecast2. Antes de habilitarlo y de que se ejecute el servicio, es
imprescindible que se edite el fichero de configuración de Icecast y que se cambie la contraseña para los clientes fuente y para las estaciones repetidoras además de la cuenta del administrador. Los usuarios de Arch Linux deben tener en cuenta que los subdirectorios de los ficheros de registro no están creados. Habrá que crear manualmente el directorio, que por defecto es /var/log/icecast.
Configuración de Icecast El fichero de configuración por defecto, icecast.xml está ubicado en /usr/local/etc, si se instala desde los ficheros fuente. La mayoría
Configuración de Icecast La primera sección del fichero icecast.xml establece algunas restricciones para el servidor. El ancho de banda determinará el número de clientes a los que se les permitirá conectarse simultáneamente. Hay que tener en cuenta que los streams fuente también consumirán ancho de banda. Si estos valores se establecen con un valor muy alto se corre el riesgo de interrumpir el flujo de datos o causar problemas a las conexiones de los clientes.
Threadpool indica el número de hilos separados que el servidor debe iniciar para manejar las conexiones de los clientes. El valor por defecto es cinco, pero puede que sea necesario aumentarlo para poder soportar flujos altos de tráfico. No hay que incrementar excesivamente este valor, ya que se corre el riesgo de quedarse sin recursos en el servidor. Queue-size es el valor máximo, expresado en bytes, de memoria a reservar para la cola de cada cliente. Se pueden ocasionar problemas con las colas debido al ancho de banda o a las interrupciones de la red. El servidor Icecast mantiene una cola separada para cada usuario. Si la cantidad de datos de la cola excede el valor máximo queue-size, se desconectará al cliente. Los tres valores umbrales: client-timeout, header-timeout y source-timeout se deben dejar a sus valores por defecto. De acuerdo con la documentación de Icecast, clienttimeout no se utiliza. Header-timeout se refiere al intervalo entre la conexión inicial del cliente y la solicitud de contenido. Source-timeout indica cuanto tiempo hay que esperar cuando la conexión fuente finaliza antes de cerrar la conexión y el punto de montaje. Todos estos valores vienen expresados en segundos.
20
Número 19
Burst-on-connect enviará una ráfaga de datos de audio al cliente en la conexión. Esto ayuda a reducir el tiempo de retraso que el cliente podría experimentar debido al búfer que mantienen los reproductores multimedia. Como el tiempo total desde la conexión hasta que el cliente recibe el contenido se reduce, la implementación de Burst-onconnect introducirá una pequeña laguna en el stream del cliente. Burst-on-connect se activa con un 1 y se desactiva con un 0. Burst-size es el tamaño en bytes de la ráfaga de datos. El valor por defecto es de 65535 bytes (64Kb), que debe ser suficiente. Hostname es bastante evidente, aquí se introduce el nombre del servidor o su dirección IP. Icecast usa este valor para crear la URL de las listas de reproducción y para las listas en los directorios YP. YP son las siglas de Yellow Pages (Páginas amarillas). Hay que recordar que Icecast tiene que compilarse con el soporte curl con idea de poder utilizar YP. Xiph.org posee un directorio YP para streams Icecast. Para incluir un stream en el directorio YP de Icecast, hay que consultar la documentación o los comentarios del fichero de configuración proporcionado con los ficheros fuente de Icecast. listen-socket establece el puerto desde el que el servidor Icecast aceptará las conexiones de los clientes. Aunque se puede utilizar cualquier puerto por encima del 1024, la mayoría de los servidores Icecast normalmente utilizan los puertos entre el 8000 y el 8010. A menos que sea imprescindible su modificación, se debe dejar el valor 8000. Los clientes requerirán el número del puerto cuando intenten conectarse al servidor.
WWW.LINUX- MAGAZINE.ES
de los gestores de paquetes probablemente lo instalen o en /etc o en un subdirectorio de /etc. La ubicación real del fichero no es de mucha importancia, ya que se puede especificar la ruta del fichero de configuración cuando se ejecute Icecast. El Listado 1 muestra un fichero icecast.xml simple. Cuando se edite el fichero icecast.xml, hay que asegurarse de que todos los elementos xml estén cerrados, que las etiquetas xml estén bien escritas y que solamente se pongan aquéllas que sean válidas, y que todos los elementos que estén anidados se encuentren cerrados de forma correcta. Los valores más importantes que hay que establecer en el fichero icecast.xml se encuentran en la sección Authentication. Es preciso asegurarse de establecer unas contraseñas nuevas para las fuentes, los repetidores y la administración, así como para el usuario admin, que se emplea para las funciones administrativas a través de HTTP. Icecast permite administrarse por medio de páginas webs, lo que es mucho más sencillo que la sintaxis de administración. Para mayor información acerca de la sintaxis de administración, consúltese la documentación de Icecast. La contraseña para los repetidores es necesaria para los servidores repetidores. (Véase el cuadro titulado “Repetidores Icecast”). Los parámetros de la sección Authentication son los únicos valores que hay que establecer para empezar a trabajar. El resto de los parámetros se pueden dejar con sus valores por defecto, pero se recomienda que se personalice con los valores adecuados para cada situación. Para más información sobre los parámetros de configuración de Icecast véase el cuadro titulado “Configuración de Icecast”. Si se desea servir ficheros estáticos con el servidor Icecast, el valor de fileserver debería establecerse a 1. Si se establece a 0 se impide que se puedan transmitir ficheros estáticos. Estos ficheros se deben ubicar en el directorio webroot y especificar en la URL del cliente como una ruta relativa desde el directorio webroot. Los ficheros ogg-vorbis, ogg-theora y mp3 pueden servirse de esta forma. Además, se puede crear una lista de reproducción que contenga una mezcla de formatos de ficheros diferentes. Una lista de reproducción debería contener una lista de puntos de montajes y terminar con la extensión .m3u. Un ejemplo de lista podría ser el siguiente:
Streaming • PORTADA
http://mystream.org:8000/U intro.ogg http://mystream.org:8000/U song1.ogg http://mystream.org:8000/U song2.mp3
Es posible mezclar diferentes tipos de ficheros en la lista de reproducción. Ésta requiere que los tres ficheros se localicen en el directorio webroot. El resto de las secciones de configuración tienen que ver con las rutas y los registros. Lo más probable es que no haya que modificar estos valores, pero hay que tenerlos en cuenta, particularmente si se ha instalado desde los ficheros fuente utilizando Arch Linux. La ruta de los ficheros de registro podría no existir, por lo tanto se requeriría la creación de la estructura de ficheros manualmente. El valor de loglevel podría ayudar con los problemas de depuración del servidor, de los streams fuentes o de los repetidores. El valor establecido en el ejemplo tan sólo informa de los errores. Si se están teniendo problemas, puede incrementarse el valor a 4 para las labores de depuración.
Ejecución de Icecast Una vez que el fichero de configuración icecast.xml haya sido configurado apropiadamente, es hora de ejecutar el servidor Icecast. No hay que ejecutarlo como root. Si se ha instalado con el gestor de paquetes, se habrá creado un usuario y grupo denominados icecast. Si es este el caso, simplemente con la ejecución del script (para los usuarios de Debian: /etc/init.d/icecast start) debería ejecutarse el servidor. Si se ha instalado desde los ficheros fuente, se puede optar por varias opciones. Primero, hay que asegurarse de que se haya creado el subdirectorio de registro
donde el elemento logdir indique en el fichero de configuración. Segundo, hay que decidir qué cuenta de usuario se utilizará para ejecutar el servidor (se pueden crear un usuario y un grupo nuevo para este propósito). Hay que establecer el usuario y el grupo propietarios del directorio de registro de icecast al usuario y grupo que ejecutará el servidor Icecast y asegurarse de que estos usuario y grupo poseen permisos de escritura del directorio de registro y los ficheros bajo el directorio de registro. Como root: Figura 2: Tras rellenar la información del servidor Icecast se puede comenzar a realizar streaming!
su [user] -c ‘U [path_to_icecast_binary] U /icecast U -c [path_to_configuration] U /icecast.xml &’ su iceuser -c U ‘/usr/local/bin/icecast -c U /usr/local/etc/icecast.xml’
Por otro lado, si se ha conectado al sistema con la cuenta del usuario con el que se desea ejecutar Icecast, simplemente hay que ejecutarlo bajo la cuenta actual: [path_to_icecast_binary] U /icecast -c U [path_to_configuration] U /icecast.xml & /usr/local/bin/icecast -c U /usr/local/etc/icecast.xml
Si se ha establecido el elemento fileserver a 1, puede comprobarse rápidamente el servidor copiando un fichero .ogg al directorio webroot y conectarse al servidor con un reproductor multimedia desde otro sistema. Por ejemplo, usando xmms, simplemente hay que escoger que reproduzca un sitio introduciendo la siguiente URL: http://[url or ip of server]: U 8000/yourfile.ogg http://myhost.org: U 8000/hellow.ogg
Figura 1: La ventana del canal MuSE con dos ficheros en cola.
La documentación de Icecast recomienda que se ponga la extensión .ogg para cada punto de montaje o ficheros .ogg. Algunos reproductores multimedia podrían no procesar de forma adecuada el stream como un
WWW.LINUX- MAGAZINE.ES
fichero .ogg a menos que se haya especificado la extensión.
Añadiendo un Cliente Fuente Ahora que el servidor Icecast se está ejecutando, es hora de conectarse a algunas fuentes externas. Existen diversos programas clientes que son capaces de proporcionar una fuente
Repetidores Icecast Si se monta un servidor Icecast y con el tiempo sus streams se hacen muy populares comenzarán a notarse las limitaciones del ancho de banda, es el momento de añadir un servidor repetidor. Icecast ofrece dos clases de repetidores: Master-Slave y SingleBroadcast. Un repetidor Master-Slave hace una imagen de todos los puntos de montaje configurados en el servidor maestro en el servidor esclavo. Los puntos de montaje son críticos si se planea tener repetidores, particularmente si se tiene un servidor esclavo Icecast con imágenes de todos los puntos de montaje. El parámetro mount del Listado 1 muestra un punto de montaje simple sin ningún parámetro. El montador hace uso de los valores por defecto y de los valores especificados en las otras secciones del fichero de configuración. Puede aceptar diversos parámetros, incluyendo contraseñas específicas, copias de las fuentes (por si la fuente original no estuviese disponible), límites, ficheros de audio con las entradillas y mucho más.
Número 19
21
PORTADA • Streaming
Figura 3: La página de información general de la interfaz web de Icecast muestra información sobre los puntos de montaje para permitir que los clientes se conecten fácilmente.
de datos para el servidor Icecast. El equipo de Icecast ofrece IceS. IceS es una utilidad de la línea de comandos que se configura utilizando un fichero XML. La documentación de IceS contiene ficheros de configuración de ejemplo. (Si se está instalando IceS desde un paquete, se deberían encontrar estos ficheros en el paquete de la documentación doc o en el directorio share). Se puede copiar el fichero de configuración deseado al directorio home del usuario y editarlo según las necesidades. Es especialmente importante introducir los detalles del módulo y del servidor. Cuando se hayan hecho los cambios pertinentes al fichero de configuración, se puede ejecutar IceS:
decide probar Dynebolic para el servidor y el cliente fuente, habrá que usar dos sistemas separados. No se puede conectar MuSE y el servidor Icecast ejecutándose ambos en el mismo sistema. El código fuente de MuSE está disponible en el sitio web Dyne.org, junto con los
paquetes para Slackware, Debian, Redhat y OS X. Para compilar MuSE desde los ficheros fuente con un cliente gráfico, hará falta GTK+, junto con las librerías de desarrollo libxml y glib. MuSE tiene una interfaz basada en ncurses (que requiere que se tengan instaladas las librerías ncurses [9]) y puede ejecutarse también como una aplicación de línea de comandos. Se recomienda la instalación de Lame para el soporte de streams mp3. MuSE también puede utilizar el formato ogg-vorbis si están instaladas las librerías ogg y vorbis. Además, el soporte para los ficheros de sonido sin compresión requiere que está presente la librería libsnd. Hay que tener cuidado de no confundir la aplicación MuSE de Dyne.org con el proyecto del secuenciador MusE MIDI/Audio. (http:// www.muse-sequencer.org). Es preciso estar seguros de no tener instalado MusE, ya que de lo contrario la instalación de MuSE no sobrescribirá ningún fichero de MusE. Por ello, si se tiene instalado el secuenciador MusE MIDI/ Audio, lo más seguro es que se desee configurar MuSE para que se instale en su propia estructura de directorios: ./configure -prefix=/opt/MuSE
Una vez instalado, simplemente se ejecuta con el comando: muse. La ventana principal de MuSE (Figura 1) aparecerá con seis
ices configfile.xml
La configuración de IceS está bastante detallada; hay que asegurarse de leer la documentación cuidadosamente.
MuSE como Fuente Si se quiere comenzar rápidamente con un cliente con una interfaz gráfica, entonces hay que probar MuSE de Dyne.org [7]. MuSE es un motor múltiple de streams que forma parte de la distribución Linux multimedia de Dyne denominada Dynebolic [8]. La forma más fácil de comenzar con MuSE es descargando y ejecutando Dynebolic. Dynebolic incluye un servidor Icecast y la capacidad de editar fácilmente los ficheros de configuración. Si se
22
Número 19
Figura 4: La administración es sencilla con la interfaz web de Icecast. Se puede utilizar la página de estadísticas globales del servidor (Global Server Stats) para comprobar el estado actual del servidor.
WWW.LINUX- MAGAZINE.ES
Streaming • PORTADA
botones en la parte superior, con barra de control y una ventana de canal. Se pueden añadir ficheros multimedia en el canal pulsando el botón derecho del ratón en la ventana. Pueden añadirse más canales presionando el segundo botón de la parte superior. Para eliminar los canales, hay que pulsar el icono X en la esquina inferior izquierda. La Figura 1 muestra un canal en MuSE con dos ficheros multimedia encolados. A la izquierda de la ventana del canal hay una palanca de control de volumen que facilita el control del volumen del fichero, permitiendo, al reducirlo, hablar por encima. Debajo de la ventana del canal está la opción para la reproducción individual de los ficheros del canal, para hacer una reproducción en bucle de un fichero específico para que se reproduzca repetidamente o para reproducir la lista continuamente. Si se está actuando en directo y se desea tener música de fondo, habrá que encolar los ficheros de audio y seleccionar la opción de bucle, a continuación sólo hay que ajustar el volumen de forma adecuada. Además de los ficheros, se pueden encolar otros streams. El orden en la lista de medios puede ser ajustado con sólo pulsar y arrastrar en la lista, y los ficheros encolados pueden borrarse seleccionándolos y marcando la opción de borrado del menú que aparece tras pulsar el botón derecho del ratón. Los botones del micrófono (tercero) y el altavoz (cuarto) conmutan la fuente de entrada de audio. Ambos botones pueden activarse al mismo tiempo. Por defecto, tan sólo el botón del altavoz está activo, lo que hace que sólo se envíe al servidor el contenido de la lista. Pulsando el micrófono se enviará el audio de la línea de entrada de la tarjeta de audio del sistema. El quinto botón, vumeter proporciona un vúmetro gráfico de modo que pueda echársele un vistazo a los niveles. Una vez que se haya establecido lo que se desea transmitir, el primer botón, “Let’s Stream”, mostrará la ventana de configuración del servidor de streaming (Figura 2). MuSE puede enviar streams mp3 y/o ogg-vorbis. Pueden añadirse servidores adicionales a cada sesión pulsando la opción “Add Server” en la parte superior de la ventana y escogiendo entre Lame (mp3) u ogg. Antes de poder enviar el stream al servidor, hay que rellenar la información del servidor en la tercera de las ventanas de la parte de abajo. Para Host, se introduce la URL (sin el http://) o la dirección IP del servidor de streaming y se verifica que el puerto sea el correcto. Si no hay un punto de montaje
específico definido en el servidor, se puede poner cualquier punto de montaje y se creará automáticamente. Los parámetros Name, URL y Description son opcionales. Dependiendo de cómo esté configurado el servidor, esta información puede que no se le muestre a los clientes. Por último, se selecciona Icecast2 para el tipo de autenticación y se introduce la contraseña del servidor. Ahora, pulsando el botón de conexión se debería empezar la transmisión. MuSE ofrece opciones adicionales de audio en la ventana “Let’s Stream”. Es posible ajustar la calidad del audio, la tasa de bits y la frecuencia entre otros. Los que vienen por defecto pueden ser los adecuados. Hay que tener en cuenta que el incremento de cualquiera de estos valores aumentará el ancho de banda por cliente. Puede grabarse lo que se está transmitiendo para llevar un registro. Simplemente hay que colocarse en el directorio donde se desea salvar el stream, se introduce el nombre del archivo y se pulsa OK. Cuando se esté listo para comenzar la sesión, sólo hay que pulsar el botón record. Si se tiene un fichero con el mismo nombre en el mismo directorio, el fichero nuevo se renombrará con un # al final, donde # es el siguiente valor incremental.
Administración Web de Icecast Una vez que el servidor Icecast esté listo y en funcionamiento, se pueden visitar sus páginas de información y administración desde un navegador web. Se introduce la URL o la dirección IP del servidor de streaming, seguido del puerto por el que el servidor Icecast está funcionando, para llegar a la página de estado de Icecast (Figura 3). Todos los puntos de montaje que actualmente están siendo servidos por Icecast son accesibles desde esta página, junto con algunas estadísticas básicas. Los clientes pueden hacer clic en el enlace para escuchar con sus reproductores multimedia preferidos. También es posible el acceso a las páginas webs de Administración. Pulsando en este enlace se solicitará la autenticación del usuario utilizando el nombre de usuario del administrador del servidor y la contraseña. También puede accederse a las páginas webs de administración directamente tecleando la URL (por ejemplo: http:// miservidor.org:8000/admin). La interfaz de administración permitirá realizar diversas tareas, como listar los clientes conectados a una fuente, mover los clientes a un punto de montaje diferente o
WWW.LINUX- MAGAZINE.ES
incluso eliminar una fuente. Incluso pueden verse diversas estadísticas del servidor Icecast (véase la Figura 4).
Conclusiones Tras unos pocos minutos de instalación y configuración del servidor de streaming de código abierto Icecast, se estará listo para crear una estación de radio web propia. Antes de despegar en serio, deberían consultarse los términos del contrato del servicio prestado por el ISP o los acuerdos de la red del campus. La puesta en marcha de un servidor de streaming podría violar el contrato y poner en peligro el servicio. Montar un servidor de radio web propio es tremendamente entretenido y muy educativo. Hay que asegurarse, sin embargo, de que se está al tanto de las leyes locales aplicables referentes al copyright. Las reglas exactas por las que se puede o no realizar stream podrían depender de las leyes del país. Si se desea transmitir música, debería obtenerse alguna licencia para ello. Compruébense servicios musicales como Magnatune [10] y asegúrese de que siempre se nombra al artista original. Si en cualquier momento se tienen dudas sobre si se tiene permiso para emitir un contenido, err…, sea prudente. ■ Y ahora, ¡a pasárselo bien!
RECURSOS [1] Servidor Darwin:http://developer. apple.com/darwin [2] Servidor Helix: http://helix-server. helixcommunity.org/ [3] Icecast: http://www.icecast.org [4] Xiph.org: http://www.xiph.org/ [5] Cliente Ezstream, cliente que procesa videos Theora: http://www.ezstream. com/ [6] Lame: http://lame.sourceforge.net/ index.html [7] MuSE, Multiple Streaming Engine: http://muse.dyne.org [8] Distribución Dynebolic Live Multimedia: http://www.dynebolic.org [9] ncurses: http://www.gnu.org/ software/ncurses/ncurses.html [10] Magnatune, almacén musical gratuito: http://www.magnatune.com [11] Ogg Vorbis: http://www.vorbis.com/ [12] Theora.org: http://www.theora.org/ [13] Wikipedia sobre streaming: http:// en.wikipedia.org/wiki/ Streaming_media
Número 19
23
PORTADA • Last.fm
Una emisora de radio virtual con Last.fm
RADIO PERSONAL
Last.fm registra nuestros gustos musicales y nos ayuda a encontrar usuarios con intereses similares. POR MARCEL HILZINGER
S
i tu ordenador es algo así como una mina, probablemente estará lleno de canciones MP3 y OGG Vorbis de distintas procedencias. La radio por Internet es una verdadera alternativa para llenar el disco duro de canciones. Pero, al igual que con la radio clásica, las canciones suelen repetirse tras cierto tiempo, y tenemos que buscar otra emisora. Last.fm [1] es una opción a los reproductores de radio por Internet tradicionales. El reproductor de Last.fm está enlazado con una base de datos en línea que guarda información de nuestros intereses musicales. Cuando configuramos un perfil musical creamos un espacio para que Last.fm guarde
información de la música que nos gusta. Esta información puede usarse para crear una “emisora de radio personalizada” en base a nuestros hábitos de escucha. Last.fm genera una lista de reproducción orientada a nuestros intereses. Last.fm, que está producido por el proyecto anteriormente conocido como Audioscrobbler [2], intenta proporcionar una completa experiencia para el oyente. El sistema puede incluso sugerir nuevas canciones que son similares a la música que hemos seleccionado previamente. Se pide a los oyentes que mantengan actualizada la información guardada acerca de sus intereses musicales en una página Web personal, mientras que la base de datos nos permite mantener una lista de “amigos” oyentes con gustos similares a los nuestros.
Para Empezar
Figura 1: Creamos un perfil en la página de Last.fm.
24
Número 19
La manera más sencilla de comenzar con Last.fm es registrarse en la página Web [1]. El formulario Web de registro es muy fácil de usar.
WWW.LINUX- MAGAZINE.ES
Empezamos por crear un nombre de usuario y contraseña (véase Figura 1). Una vez creada la cuenta, Last.fm instala el plugin Audioscrobbler, que envía la información de las canciones que escuchamos al servidor. El último paso es descargar el reproductor de Last.fm. Una vez registrados y con los programas descargados, ya podemos comenzar a explorarlo .
Last.fm El reproductor de Last.fm aparece con una sencilla interfaz gráfica de usuario (véase
Figura 2: La ventana principal de Last.fm ofrece opciones de configuración y proporciona enlaces a información de la canción que suena.
RECURSOS [1] Last.fm: http://www.last.fm [2] Audioscrobbler: http://www.audioscrobbler.net/
Last.fm • PORTADA
Búsqueda Para empezar a escuchar la radio por Internet pulsamos sobre el icono de la llave inglesa y seleccionamos Change Station. En el cuadro que aparece seleccionamos la pestaña Search. Podemos buscar por artista o género. La función Similar Artist Radio está Figura 4: La página Web Last.fm proporciona información de la activa por defecto. canción, álbum o artista. Tecleamos el nomFigura 3: El cuadro Settings nos permite bre de un grupo o introducir la configuración, como nuestros correspondiente. El programa arranca entonartista y pulsamos Listen Now para indicarle datos de usuario y navegador. ces nuestro navegador por defecto, que nos al reproductor que comience a sonar. Si buslleva hasta la página Web de Last.fm, y nos camos por género, pulsamos en Similar Figura 2). El sistema es realmente amistoso muestra la información (véase Figura 4). Los Artist Radio y seleccionamos la entrada con el usuario novel. Pulsamos en el icono de dos iconos grises rectangulares arriba a la Tags, y a continuación tecleamos una clave la llave inglesa para configurarlo . Introduciderecha nos permiten editar las etiquetas de de búsqueda (por ejemplo “Blues”) y presiomos nuestros datos de usuario en el cuadro las canciones o postear un comentario en la namos Go. Last.fm mostrará una lista de Settings (véase Figura 3). Para poder usar las página Web de Last.fm. géneros. Seleccionamos un género de la lista características avanzadas, deberíamos señalar y pulsamos Listen Now. Antes de que se iluAsuntos De La Comunidad también nuestro navegador por defecto. Si sione demasiado, debemos decir que, a realmente nos gusta una canción, pulsamos Last.fm está muy interesado en promover la modo de ejemplo, la búsqueda por en el icono con un corazón (véase Figura 2). interacción con el oyente. El diseño del sisJazz-Fusion devolvió una canción de Frank El sistema guarda el nombre de la canción y el tema se aprovecha del hecho de que los Sinatra. artista. Por contra, si realmente no nos gusta navegantes de la Web buscan otros usuarios La página Web de Last.fm proporciona una canción, pulsamos sobre el icono de procon intereses comunes. una función de búsqueda avanzada. Pueden hibido aparcar para quitar la canción de El área Users en la página Web de Last.fm introducirse múltiples nombres de artistas nuestra lista de reproducción. Para las cancioproporciona una interfaz para interactuar en una máscara de búsqueda. La página nes que nos gustan, pero que no queramos con la comunidad de Last.fm (véase Figura muestra entonces un botón etiquetado como oírlas en ese momento, podemos pulsar el 5). Pulsamos en el icono de un usuario para Play Music Like These Artists, que apunta a icono con los dos símbolos “mayor que”. visitar su página personal. Fijémonos en el una URL que comienza por lastfm://. Se Last.fm busca entonces en Internet otra cancuadro a la izquierda titulado “Find by copia esta URL al portapapeles, se pulsa ción. Musical Taste”. Podemos introducir el nomsobre el icono de llave inglesa y se selecPara saber más acerca de una canción, bre de un artista o grupo en el cuadro y ciona Enter Station Address. A continuación álbum o artista, pulsamos en la cabecera pulsar el botón Go para mostrar los iconos se pega la nueva URL y se pulsa OK para de otros usuarios escuchar 30 segundos de la canción. Esta que han expresado característica no funcionó del todo bien en interés en este nuestro laboratorio. Tras unos instantes, artista o grupo. comenzamos a dudar de la fiabilidad de Play La página Web Music Like… Por ejemplo, la página Web personal de cada devolvió unas cuantas canciones de Guns n’ usuario lista los Roses, pero al pulsar Listen Now, se trataba favoritos de cada de una canción de Herbie Hancock. uno de ellos. La página contiene Conclusiones también algunos breves datos biográLa idea tras Last.fm es excelente, pero la ficos del usuario, así implementación deja bastante que desear. como opciones para Otra cosa que nos molestó es que, al selecenviarle un mensaje cionar temas que se decía que eran de Figura 5: La sección User de Last.fm nos ayuda a encontrar otros o añadirlo a una nuestros grupos favoritos, resultaba no ser ■ usuarios con intereses musicales similares. lista de amigos. del grupo que se esperaba.
WWW.LINUX- MAGAZINE.ES
Número 19
25
EVALUACIÓN • Inkscape 0.44
Examinamos la última versión de Inkscape
Andy Fitzimon
DISEÑA LIBREMENTE
Inkscape se ha convertido en la aplicación vectorial por excelencia de los entusiastas del software libre. Echemos un vistazo a su última versión y descubramos por qué levanta pasiones. POR JUAN MIGUEL RAMIREZ
T
odo comenzó en 2003 cuando 4 desarrolladores de Sodipodi (Bryce Harrington, MenTaLguY, Nathan Hurst y Ted Gould) decidieron darle un nuevo rumbo al proyecto con el fin de conseguir una herramienta de dibujo vectorial totalmente compatible con el formato SVG (Scalable Vector Graphics o lo que es lo mismo: gráficos vectoriales escalables), el adoptado por el W3C [1] como estándar para gráficos mediante vectores. Se pusieron mano a la obra en la creación de Inkscape y desde entonces la herramienta ha ido creciendo de manera vertiginosa, tanto en colaboraciones, traducciones, nuevas características, asi como en popularidad y número de descargas; tan sólo en la primera semana, tras la aparición de la versión 0.44, fueron cerca de 54.100 usuarios los que optaron por bajarse esta magnífica aplicación.
Mejoras en la interfaz
Nuevos iconos
Tras descargarnos la versión más apropiada de la web de inkscape [2], instalarlo y abrirlo por primera vez lo primero que apreciamos es que la interfaz ha sufrido un buen lavado de cara y ha sido mejorada considerablemente dandole un aspecto mucho más profesional debido, en gran parte, a que la mayoría de sus iconos han sido rediseñados (Figura 1). Además han sido añadidas nuevas paletas, algunas incrustadas en la interfaz, como es el caso de la relacionada con las muestras de color, y otras de manera flotante como la de capas. Si a esto le añadimos el nuevo modo de vista por contornos, magnífico cuando trabajamos con gráficos complejos, o la nueva barra de control de texto, nos damos cuenta que las mejoras de la interfaz han sido realmente considerables asi que pasemos a ver en detalle cada una de estas mejoras.
Andre Sousa ha sido el diseñador encargado de la elaboración de los nuevos iconos , dandole un aspecto mucho más profesional a la aplicación. Los anteriores, en algunos casos, tendían a confundir las verdaderas funciones de algunas herramientas, como es el caso del correspondiente a la creación de polígonos, y su gama cromática dejaba mucho que desear; los nuevos poseen un colorido más vistoso, usando degradados de manera acertada, y están mucho mejor definidos tanto en diseño como en concepto.
Figura 1: los nuevos iconos realizados por Andre sousa le dan un aspecto visual más agradable a Inkscape.
26
Número 19
WWW.LINUX-MAGAZINE.ES
Paletas Otro de los aspectos a destacar es la inclusión de nuevas paletas inclusive la de muestras de color que ha sido incrustada en la interfaz. Ésta no ha sido la única novedad puesto que ahora es mucho más cómodo aplicar colores a los trazos y rellenos pudiendo elegir colores inversos a los seleccionados, copiar los de un objeto y pegarlos en otro e incluso invertir los de trazo y relleno. Además ha sido incluida, a petición popular, una nueva paleta flotante para poder administrar las capas a nuestro antojo; ya podemos mover, añadir,
Inkscape 0.44 • EVALUACIÓN
eliminar, mostrar u ocultarlas de una manera mucho más cómoda y eficaz.
Modo de vista por contornos Anteriormente cuando trabajabamos con gráficos complejos, con multitud de rellenos y objetos, podiamos perder el norte con la estructura de nuestro gráfico. Para que esto no ocurra, la nueva versión viene con un nuevo modo de vista incluido, llamado vista por contornos, el cual, como su nombre indica, nos muestra nuestro gráfico sin relleno alguno y mostrando sólo los contornos de los objetos, todos ellos con el mismo color de trazo (figuras 2 y 3).
Figura 2: Gráfico realizado con Inkscape previsualizandose en modo de vista normal
Herramienta de nodos La herramienta de edición de nodos se ha visto mejorada también en esta versión; por un lado se ha incluido un botón en la propia barra de control de nodos para poder mostrar u ocultar los tiradores de los nodos (las líneas con un punto de nodo al final que aparecen en aquellos nodos que forman líneas curvas y que se usan para darle la forma necesaria a ésta) y se ha mejorado el comportamiento a la hora de borrar los haciendo que si, por ejemplo, éstos forman una curva entre varios al borrar uno intermedio la curva se vea dañada lo menos posible obteniendo, de esta manera, úna practicamente igual o muy parecida a la original. Por otro lado a la hora de modificar nodos existe una nueva opción que nos permite, si hacemos click y arrastramos, manteniendo pulsada al mismo tiempo la tecla “alt” uno de los diferentes nodos que hayamos seleccionando previamente, que éste sea modificado igual que siempre pero sufriendo los seleccionados también una ligera modificación, intentando adaptarse a la nueva forma, consiguiendo de esta manera que el cambio haya sido más gradual, como si de esculpir una figura se tratara. Es por ello que este
nuevo comportamiento sea llamado “esculpiendo nodos”.
Clips Hasta ahora era realmente complicada la tarea de hacer que una imagen o figura pudiera estar incrustada dentro de otra u obtener la forma de ella (una de las opciones, no siempre válida, era la de convertir esa imagen o figura en un relleno y usar éste como relleno de la figura en cuyo interior queriamos incrustar la figura o imagen) pero ahora podemos realizarlo de una manera muy sencilla con la nueva herramienta Clip. Su funcionamiento es muy fácil e intuitivo:
Figura 3: Gráfico de la figura 2 en modo de vista por contornos
Inkscape VS Gimp Mucha gente confunde el verdadero fin de las aplicaciones de diseño vectorial y tiende a compararlas con las de diseño bitmap, como por ejemplo Gimp. Esto es un grave error, ya que cada una de ellas se usa para diferentes procesos pudiendose complementar la una con la otra pero nunca suplantandose.
El diseño o retoque mediante bitmaps consiste en la manipulación (o creación) de los diferentes pixeles existentes en la imagen y su tamaño final vendrá dado por la cantidad de pixeles que esta imagen posea, por lo tanto Gimp es ideal para realizar ajustes (montajes, variaciones de color, etc) a tus fotografías o para diseñar algo cuyo tamaño final sepamos de manera aproximada. Sin embargo, si quisieramos aumentar drásticamente el tamaño de nuestro trabajo nos encontraremos con que el resultado final es muy decepcionante (ver Figura 4) ya que pierde toda definición existente al tener que “inventarse” el programa los nuevos pixeles necesarios para tal redimensión. Por otro lado, el diseño vectorial consiste en la manipulación (o creación) de diferentes nodos, totalmente independientes de la resolución, que forman un gráfico y su tamaño final es indiferente puesto que al no estar compuestos éstos de pixeles sino de vectores (fórmulas matemáticas) podemos aumentar o disminuirlos sin perder ni un ápice de definición (ver Figura 4), incluso llevandolos a tamaños extremos como la fachada de un edificio. Por el contrario si quisieramos retocar una imagen nos sería imposible hacerlo con él, ya que aparte de poder incrustar gráficos bitmaps en nuestros documentos poco más se puede hacer relacionado con la manipulación de pixeles.
En resumen, si quieres retocar una imagen o realizar un diseño con diferentes fotografías, sin duda alguna, Gimp es el elegido mientras que si quieres realizar diseños o ilustraciones mediante trazos, como suele ser el caso de logotipos, identidades corporativas dibujos, y que pueden ser redimensionadas sin problemas, tu elección es Inkscape.
WWW.LINUX-MAGAZINE.ES
Número 19
27
EVALUACIÓN • Inkscape 0.44
usamos una escala de grises, Inkscape lo hará en base al valor de su luminosidad (sería el paso equivalente a pasar este color a escala de grises); también hay que tener en cuenta que podemos usar degradados permitiendonos de esta forma obtener imagenes que vayan fundiendose. Para aplicar una máscara basta con realizar los mismos pasos que hicimos para los clips cambiando, lógicamente, la opción Clip por Máscara.
Otras mejoras Figura 4: En esta imagen hemos aumentado drásticamente el tamaño de 1 gráfico, en la parte izquierda en su versión vectorial y en la derecha en la de mapa de bits.
1.Colocamos la figura en cuyo interior queramos incrustar otro elemento u obtener la forma de éste por encima, solapando el elemento que vamos a modificar. 2.Seleccionamos ambos objetos. 3.Hacemos click en el menú objeto y ahí en Clip – Establecer. 4.Listo. Con esto conseguimos que la figura o imagen situada por debajo tome la forma de la que estaba situada por encima; es como si hubiesemos recortado con unas tijeras el elemento que estaba por debajo con la forma del que teníamos justo en su parte superior. Por último, si quisieramos mantener las líneas de nuestro objeto, tan sólo bastaría con haber creado un duplicado sin relleno previamente y obteniendo de esta manera el efecto deseado, pareciendo que la figura está incrustada en el interior de la que duplicamos.
Existen otras muchas mejoras añadidas, como viene siendo habitual por parte de los desarrolladores de Inkscape en cada versión que actualizan pero, por falta de espacio, no las veremos de una manera tan detallada como las anteriores. Entre otras tenemos la opción, aunque de momento editando directamente el fichero XML que los controla, de editar los atajos de teclado del programa adaptándolos a nuestro gusto. El menú efectos ha sido ligeramente remodelado para ayudar a la comprensión de la función de cada uno de ellos y ha sido activado por defecto (anteriormente teníamos que irnos al menú de configuración para activarlo). Incluye además soporte para exportación a PDF, inclusive con transparencias y por último, y no por ello menos importante, tenemos la opción de poder añadir imágenes con perfiles de color ICC a través de LittleCMS [3].
Inkscape en la vida real Inkscape lo usaremos, claro está, para la creación de gráficos vectoriales pero os preguntareis ¿y para qué
28
Número 19
tipo de trabajo usaremos algo asi en la vida real? Pues podeis usarlo para infinidad de aplicaciones, desde la creación de iconos, cartelería, identidades corporativas (logotipos, folios de empresa, sobres, tarjetas de visita, etc), páginas webs y un sinfín más [4]. Valga como ejemplo las figuras 5 y 6 donde podemos observar 2 logotipos o en la propia web de Inkscape [5] donde encontraremos, entre otras cosas, algunos diseños de mapas para juegos o, por ejemplo, el diseño de un CD.
Conclusión A inkscape le queda un largo camino por recorrer y aún no se considera un programa lo suficientemente maduro y estable como para usarlo profesionalmente (aunque haya gente como yo que sí lo haga) pero está en el buen camino y es una herramienta ideal para multitud de aplicaciones; tan sólo hace falta echarle ganas e ■ imaginación al asunto.
RECURSOS
Máscaras El concepto de las máscaras es muy parecido al de los Clips, con la única excepción de que el objeto de la parte superior determinará, basándonos en su color( si éste es negro la opacidad será del 0%, si es blanco del 100% y sus valores intermedios, de 0 a 255, harán el resto de las opacidades), el grado de transparencia del objeto inferior al que vamos a realizarle la máscara. Es por esto que importará muchísimo el color del objeto que usaremos como máscara y que si no
Figura 5: Otro logotipo creado con Inkscape
[1] Especificaciones SVG del W3C: http://www.w3.org/Graphics/SVG/ [2] Descarga de Inkscape: http://www.inkscape.org/download. php [3] Gestor de color LitlleCMS: http://www.littlecms.com/ [4] Blog con ejemplos de diseños gráficos con software libre: http://www.yomizmo.com/portfolio
Figura 5: Logotipo creado integramente con Inkscape de la asociación Linux Málaga.
WWW.LINUX-MAGAZINE.ES
[5] Ejemplos de trabajos realizados con Inkscape: http://www.inkscape.org/showcase/ index.php
Enlightenment • EVALUACIÓN
Explorando el Gestor de Ventanas Enlightenment 17
HÁGASE LA LUZ Enlightenment tiene una gran comunidad de seguidores que han estado esperando pacientemente una nueva versión. Si se es lo suficientemente valiente
desarrollo. E17 es estable y vale la pena probarlo. Pero si se decide a dar el paso decisivo, se debería tener en cuenta que Enlightenment 17 está sujeta a cambios. La sintáxis del fichero de configuración está cambiándose; una actualización podría simplemente borrar la configuración existente y reemplazarla por una totalmente nueva; no hace falta ni decir que se perderían todos los cambios que se hayan realizado para personalizarlo.
como para probar la versión 17 de desarrollo, se encontrará con un gestor de ventanas extremadamente
flexible
y
estéticamente agradable. POR KARSTEN JÄGER
La Instalación
E
nlightenment vió la luz en el año 1997 como un gestor de ventanas modificado a partir de Fvwm. Sus desarrolladores están aún trabajando en la versión 0.17, que proporcionará un entorno de escritorio lleno de características agradables a la vista y que da a los usuarios la mayor libertad posible. Aunque la versión anterior, Enlightenment 16, ya tiene unos cuantos años y posee una gran cantidad de fans, la historia de la versión en desarrollo actual, Enlightenment DR17 (Development Release 17, también conocida como E17) ha sido cualquier cosa menos sencilla. En el proceso los desarrolladores han tenido que reescribir numerosas herramientas y librerías y han eliminado gran parte del código. El hecho de que muchos de estos desarrolladores sean además responsables de otras librerías importantes, como la librería gráfica Imlib2, que se utiliza en Gnome, también ha tenido
su efecto en el progreso. Aunque E17 está aún en un estado prealfa, muchos usuarios de Enlightenment se han pasado a esta versión para proporcionar informes de depuración y acelerar el
WWW.LINUX-MAGAZINE.ES
La forma más sencilla de probarlo es cargando el live CD de Elive [2]. Los expertos pueden obtener la última versión del código desde el CVS. Hay diversos scripts de ayuda para ello en [3] y [4]. Otro script compila los paquetes necesarios para Debian [5] desde el CVS. La forma más sencilla de instalación es utilizando los paquetes listos para instalarse. Se encuentran disponibles los paquetes de varias distribuciones; para más detalles puede consultarse el cuadro “La Instalación”. Después de instalar E17, el gestor de ventanas aparece con un aspecto limpio y ordenado (Figura 1). Por defecto, el gestor de ventanas modular carga unos cuantos módulos. Ésta es su forma de ahorrar recursos. E17 se ejecuta bien en el hardware antiguo. Incluso la configuración por defecto posee algunos efectos ópticos, incluyendo las
Número 19
29
EVALUACIÓN • Enlightenment
Figura 1: Un estupendo escritorio Enlightenment con el tema por defecto.
barras de los títulos de las ventanas animadas con una sombra plateada. El lanzador IBar de Enlightenment 17 dibuja una especie de sombra alrededor del icono seleccionado, que al mismo tiempo parpadea.
La configuración Al contrario que otros gestores de ventanas, Enlightenment 17 utiliza ficheros de configuración binarios. Esto implica un cambio en los hábitos de configuración de
muchos usuarios. Además de la herramienta de línea de comandos enlightenment _remote, E17 posee ahora un panel de configuración gráfica (Figura 2) que le ha proporcionado un sistema mucho más amigable. Si embargo, la herramienta enlightenment _remote aún ofrece más parámetros que la interfaz gráfica. Por ejemplo, únicamente la herramienta de la línea de comandos puede cargar módulos y modificar los atajos de teclado. enlightenment _remote -h proporciona a los usuarios una pequeña descripción de cada opción. El panel de configuración está dividido en Focus Setting (Figura 3), Desktop Settings y Window Display. Los usuarios pueden realizar diversas tareas de configuración para modificar el comportamiento del gestor de ventanas. Los ficheros binarios .eap también son los responsables de ejecutar los programas. Estos ficheros no incluyen solamente el comando del programa, sino también los iconos. Para crear un fichero eap nuevo, los usuarios deben ejecutar primero el menú de la ventana y luego pulsar en Create Icon (Figura 4). Con esto se abre el editor Eap (Figura 5). El campo App
Instalación Los miembros del equipo de Enlightenment tienen paquetes de instalación y otros paquetes experimentales para algunas distribuciones. La forma más sencilla de instalación para los usuarios con Suse Linux es yendo al repositorio de Packman. Para ello se configura el servidor http:// packman.iu-bremen.de y el directorio suse/Version como la fuente de instalación de Yast, reemplazando Version por la versión que se tenga de Suse. Si se tiene Fedora Core 4, Didier Casse tiene un programa en [6] que configura el gestor de paquetes Yum para que use el repositorio adecuado. Los usuarios con Fedora Core 2 y 3 tendrán que añadir la entrada al repositorio manualmente. La entrada en /etc/yum.conf sería la siguiente: [Didier] name=Didier’s yum repository U for e17 apps/lib baseurl=http://sps.nus.edu.sgU /~didierbe/fedora/X/en/i386 http://dentrassi.de/e17/fedoraU /X/en/i386/RPMS.e17/ http://fedora.oceighty.net/e17U
30
Número 19
/fedora/X/en/i386/RPMS.e17/ http://dr17.saaf.co.uk/fedoraU /X/en/i386/RPMS.e17/
La X en el listado representa la versión de Fedora. Los comandos yum check-update y yum install enlightenment instalarán E17. Developer Shadoi tiene paquetes para Debian (Sid) y Ubuntu (Breezy). Sólo hay que añadir una entrada a /etc/apt/souces.list y luego ejecutar apt-get y apt-get install enlightenment para instalarlo: # E17 for Debian deb http://www.soulmachine.net/ debian unstable/ # E17 for Breezy deb http://www.soulmachine.net/ breezy unstable/
Como la anterior versión 16 de Enlightenment, también está disponible en los repositorios; únicamente hay que forzar la instalación de DR17 (0.16.999.xxx).t Para instalar Enlightenment 17 en un
WWW.LINUX-MAGAZINE.ES
sistema con la distribución Gentoo Linux, hacen falta unas cuantas entradas en el fichero /etc/portage/package.keywords (véase el cuadro Palabras clave de Portage). Si embargo, un simple emerge no será suficiente. Hay que instalar los programas y las librerías en el orden correcto para resolver cualquier dependencia posible y asegurarse que todo funciona como la seda. Para la instalación se usará el siguiente comando: emerge -av dev-db/edb eet U imlib2 imlib2_loaders evas U ecore epeg epsilon embryo U edje esmart emotion etox ewl engrave e entice elicit U examine engage e_utils U entrance xine-lib emotion U envision elation evidence U eterm enotes equate
Para todas las distribuciones, se necesitará una entrada para E17 en el gestor de visualización, y si se ejecuta startx la entrada estará en el fichero ~/.xinitrc.
Enlightenment • EVALUACIÓN
Fondos, Módulos y Otros Los fondos también se almacenan en ficheros con formatos binarios, como los ficheros .edj, y pueden ser o estáticos o animados. Por defecto, E17 tiene cuatro escritorios virtuales, con fondos individualmente configurables. De nuevo, la configuración está restringida a la herramienta enlightenment_remote:
Figura 2: La nueva configuración gráfica.
herramienta
de
name se corresponde con el nombre del programa y el campo Executable se corresponde con la orden de la línea de comandos, incluyendo cualquier parámetro necesario. Pulsando en el icono grande bajo Icon abre el gestor de ficheros Efm, donde se puede seleccionar un icono. A pesar de todos estos asistentes gráficos, aun se pueden encontrar algunos ficheros de configuración basados en texto, por ejemplo, ~/.e/e/applications/bar/.order. Tanto éstos como los otros ficheros .order se usan para cambiar el orden de las entradas en IBar, en favoritos y en otros módulos. Los ficheros tienen una estructura simple con un único fichero eap por línea: eterm.eap firefox.eap gimp.eap bmp.eap
Figura 3: El cuadro de diálogo de Focus Setting de Enlightenment 17.
enlightenment_remote U -desktop-bg-add 0 0 0 0 /path/to/background.edj enlightenment_remote U -desktop-bg-add 0 0 1 0 /path/to/background.edj enlightenment_remote U -desktop-bg-add 0 0 2 0 /path/to/background.edj enlightenment_remote U -desktop-bg-add 0 0 3 0 /path/to/background.edj
U
U
U
U
Los ficheros binarios de fondos de este tipo se crean con el programa edje_cc, que compila un fichero EDJ de un directorio con una imagen y con el fichero background.edc. El manual de usuario contiene un ejemplo en [9]. Hay fondos disponibles en el sitio web Get-e.org [8] y solamente hay que depositarlos en el directorio ~/.e/e/backgrounds/. Para las transparencias E17 necesita un módulo; los desarrolladores no pretenden integrar esta funcionalidad en el futuro. La transparencia Eterm puede utilizarse con E17, pero cuidado: pueden o no aparecer
errores extraños irreproducibles, aunque probablemente ocurran. Una de las mayores ventajas de E17 es su diseño modular. Al contrario que la mayoría de los entornos de escritorio, tan sólo carga unos cuantos módulos esenciales, tal y como se pueden ver en el menú de la Figura 1. Sin embargo, vale la pena cargar Figura 4: El botón y habilitar algunos Create Icon permite la módulos adiciona- creación de nuevos les una vez más iconos para los utilizando la herra- programas. mienta de la línea de comandos enlightenment_remote: nonumber enlightenmU ent_remote U -module-load ‘modulname’ enlightenment_remote U -module-enable ‘modulname’
Uno de los módulos más populares (mostrado en la esquina de la Figura 6) es Engage.
Palabras Clave de Portage 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
#e17 cvs stuff app-misc/evidence -* app-misc/examine -* app-misc/enotes -* dev-db/edb -* dev-libs/eet -* dev-libs/embryo -* dev-libs/engrave -* dev-util/e_utils -* mail-client/embrace -* media-gfx/eclips -* media-gfx/elicit -* media-gfx/entice -* media-gfx/imlib_tools ~x86 media-libs/edje -* media-libs/emotion -* media-libs/epeg -* media-libs/epsilon -* media-libs/etox -* media-libs/imlib2 -*
WWW.LINUX-MAGAZINE.ES
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
media-libs/imlib2_loaders -* media-libs/xine-lib -* media-video/eclair -* media-video/envision -* media-video/elation -* net-news/erss -* sci-calculators/equate -* sys-fs/evfs -* x11-libs/ecore -* x11-libs/esmart -* x11-libs/evas -* x11-libs/ewl -* x11-misc/e17genmenu -* x11-misc/engage -* x11-misc/entrance -* x11-misc/iconbar -* x11-plugins/e_modules -* x11-terms/eterm -* x11-terms/enterminus -* x11-wm/e -*
Número 19
31
EVALUACIÓN • Enlightenment
Figura 5: El editor Eap asocia un icono con un programa o comando.
El módulo Engage es una reminiscencia del Dock de Mac OS X, que proporciona un lanzador, con funcionalidad systray y un aspecto divertido. Cuando se sitúa el ratón sobre un icono, Engage amplía el icono. Los programas activos muestran un segundo icono más pequeño en lo alto del icono normal. Se puede conmutar entre los iconos pequeños utilizando la rueda del ratón y tan sólo hay que hacer clic directamente para ejecutar un programa. Como con los fondos, los temas también utilizan ficheros con formato binario, .edj. Se puede encontrar una gran colección de temas en el sitio web http://get-e.org que alberga el repositorio central para la comunidad E17 [8]. Estos ficheros proporcionan todo lo que un tema necesita: gráficos, funciones de animación y fondos estándar, otras gestores de ventanas y entornos de escritorio necesitan directorios completos para sopor-
tar lo mismo. Sólo hay que descargar los ficheros .edj y depositarlos en el directorio ~/.e/e/themes. Ahora se puede seleccionar el tema preferido en el menú principal bajo Themes. La Figura 6 muestra el tema Winter.
Ayuda Enlatada La comunidad de Enlightenment Figura 7: El tema Slate de Enlightenment 17. ofrece diversas opciones de ayuda. La lista de correo vale la pena investigar la versión de [e-users] no está restringida a los usuarios, y desarrollo E17. Se trata de una versión estaa menudo se pueden encontrar desarrolladoble en su mayor parte, aunque pueda resultar res echándoles una mano a otros usuarios molesto la perdida de los ficheros de [10]. La recompensa por apuntarse a la lista configuración en la actualización. Como nota de correo es obtener información de depurapositiva, las actualizaciones normalmente ción rápida y sencilla. Para encontrarla vienen acompañadas de nuevas característitambién se encuentra disponible un foro cas. Los desarrolladores pueden tener aún [11]. Enlightenment tiene además multitud una larga lista de quehaceres por delante, de seguidores a través del canal de IRC en pero están haciendo un progreso rápido. inglés (#e) en freenode.org. Resulta realmente excitante seguir el ■ desarrollo de este gestor de ventanas.
Conclusiones
Si se está buscando un gestor de ventanas ordenado y agradable a la vista, entonces
RECURSOS [1] Enlightenment: http://www. enlightenment.org [2] Elive CD: http://www.elivecd.org/ [3] CVS script (1): http://www.rasterman. com/files/get_e.sh [4] CVS script (2): http://omicron.homeip. net/projects/easy_e17/easy_e17.sh [5] CVS script (2): http://nooms.de/misc/ e17install.sh [6] Modificando Yum: http://sps.nus.edu. sg/~didierbe/share/dc-fc4-yum-repo-1. 3-1.fc4.noarch.rpm [7] COMO de la instalación de Fedora: http://sps.nus.edu.sg/~didierbe/ [8] Noticias, módulos, temas y guía del usuario de E17: http://get-e.org [9] Manual de usuario de edje_cc: http:// get-e.org/E17_User_Guide/English/ _pages/3.8.html [10] Lista de correo de E17: https://lists. sourceforge.net/lists/listinfo/ enlightenment-users [11] Foro de E17: http://edevelop.org/ forum
Figura 6: El tema Winter de Enlightenment.
32
Número 19
WWW.LINUX-MAGAZINE.ES
Blender • PRÁCTICO
Creación de personajes animados con Blender
DIBUJOS ANIMADOS
Blender no genera sólo fotogramas realistas aislados. También es capaz de capturar los movimientos naturales de la gente y los animales. Presentamos algunas de las funcionalidades de animación de Blender. POR PETER KREUSSEL
L
a animación de personajes, es decir, el arte de dar vida a personajes virtuales, es la contraparte computerizada de la animación dibujada a mano. Se reemplaza el tablero de dibujo por el ordenador, aunque no deja de ser un trabajo casi artesano. Las animaciones generadas por ordenador se aprovechan del aspecto y apariencia realistas que se les pueden dar. Blender es capaz de producir imágenes fotorealistas ofreciendo algunas ventajas que la animación tradicional nunca disfrutará. Por ejemplo, los objetos en una escena Blender “interactúan” de manera autónoma, calculando además correctamente las luces y sombras cuando las figuras 3D cambian de posición (véase Figura 1). En el artículo anterior mostramos cómo crear una imagen 3D con Blender. Este mes veremos cómo ponerla en movimiento haciendo uso de sus herramientas de animación.
Mover los Hilos Blender incorpora poderosas herramientas para generar imágenes en movimiento. Estas herramientas trabajan con los denominados key frames: es decir, no es
necesario generar todas y cada una de las imágenes de una secuencia. Por ejemplo, podríamos especificar la posición de un objeto en el primer y décimo fotograma. Blender calcula automáticamente los pasos intermedios, lo cual reduce considerablemente nuestra carga de trabajo. Unos objetos flotantes y que rotan al tiempo que cambian de color y tamaño puede ser un buen efecto para la intro de un programa de noticias, por ejemplo, pero no es lo que se podría llamar animación de caracteres. Después de todo, no sólo queremos mover nuestra figura por la pantalla: queremos que sus piernas se muevan cuando atraviesan la escena. Y queremos que las uniones de la rodilla sean continuas. Es por esto que la animación de caracteres no significa sólo rotar y mover un objeto, sino también cambiar específicamente la forma del objeto tridimensional. Si doblamos una manguera, esto tiene un efecto sobre su diámetro. Aunque no es un ejemplo demasiado halagador para los humanos, el principio es el mismo para la piel y la carne que cubre nuestros huesos cuando movemos brazos y piernas.
WWW.LINUX-MAGAZINE.ES
De nuevo, esta herramienta simplemente imita a la Madre Naturaleza: el programa usa un “esqueleto” (Armature) de huesos y articulaciones como base para mover figuras. Podemos mover los huesos de la misma forma que se mueve una marioneta. Blender trata los miembros como objetos elásticos y cambia su forma para adaptarse.
Figura 1: Los objetos en Blender pueden rotarse, y generan sombras exactamente iguales a las del mundo real.
Número 19
33
PRÁCTICO • Blender
Podemos descargar Blender desde su página Web [1]. Vamos a usar la última versión del programa en los pasos de este tutorial. Después de todo, las funciones de animación son mucho más rápidas en esta última. Como Blender usa OpenGL para mostrar el mallado, tendremos que asegurarnos que nuestra tarjeta gráfica soporta aceleración 3D. En los siguientes pasos supondremos que estamos familiarizados con los pasos básicos en Blender como pueden ser hacer zoom en la escena y seleccionar objetos. En caso contrario, puede que sea buena idea leer previamente el primer artículo de la serie. La animación 3D es un proceso computacionalmente caro. Incluso un pequeño clip puede contener 20 fotogramas, lo que significa que el programa tiene que recalcular la escena 20 veces. Antes de lanzarnos a la animación deberíamos simplificar el modelo de mallas. Para ello pulsamos el botón Editing situado en el tercio inferior de la ventana (véase Figura 2, item 1), para mostrar el panel Editing de manipulación de objetos. Pulsamos [Z] para conmutar entre la vista de malla y la vista sólida. Es preferible el mallado, y además es más rápido. También necesitamos asegurarnos de que estamos trabajando en el modo Object Mode y no en el Edit Mode. El panel Editting se ha rediseñado en Blender 2.40. Muchas funciones que estaban confusamente agrupadas en Mesh en versiones anteriores están ahora agrupadas con más lógica en Modifiers. El suavizado de superficie (Subsurf), que habilitamos para la mayoría de nuestros objetos en la primera parte de este tutorial, se agrupa ahora también bajo Modifiers. Empezaremos seleccionando la gorra, luego deshabilitamos el botón destacado a la derecha de Subsurf, mostrado en la Figura 2, ítem 2. Esto deshabilita el mallado del elemento concreto pero sin
Glosario Key frames: Un key frame es un fotograma en vídeo comprimido que contiene un conjunto completo de información de la imagen. En Blender, un key frame es un fotograma donde fijamos manualmente la posición de un objeto, en contraposición a los fotogramas que se generan automáticamente por el programa.
34
Número 19
Figura 2: Ahorrando esfuerzos: usamos la herramienta “Decimator” para reducir el tiempo de procesado y la memoria necesaria para el rendering.
que afecte a los resultados finales del rendering. Sin embargo, con ello se acelera definitivamente la vista previa. Ahora pulsamos Add Modifier y seleccionamos Decimate en el menú desplegable. En el campo Percent: fijamos el valor 0.100, y pulsamos sobre Apply. Esperamos que Blender se actualice (es decir, esperamos mientras los botones cambian de color cuando posicionamos el ratón encima de ellos), pulsamos el botón de nuevo, y le damos a OK cuando nos pregunte Blender. Repetimos este procedimiento para que todos los objetos tengan un valor en Decimate / Percent como el mostrado en la Figura 2. Deshabilitamos la vista previa de la superficie de los elementos (Figura 2,2) para el resto de objetos que tengan el valor Subsurf en Modifiers.
Los Huesos Posicionamos el cursor como se muestra en la Figura 3. Verificamos la posición desde las vistas frontal y lateral. Pulsamos la barra espaciadora y seleccionamos Add | Armature del menú. Ahora presionamos [G] y
arrastramos el ratón para mover el punto final del “hueso” que acabamos de añadir a la posición de la rodilla (en el medio de la pierna). A continuación pulsamos [E] para extrudir hasta añadir un segundo hueso. Movemos el hueso a una posición que tenga sentido anatómicamente hablando. Entonces pulsamos [A] dos veces para seleccionar ambos huesos. Con [Shift]+[D] creamos una copia que podemos arrastrar hasta la otra pierna con ayuda del ratón. De nuevo pulsamos [A] dos veces para seleccionar los cuatro huesos. Habilitamos los botones Draw Name y X-Ray en medio del área Armature en la parte inferior de la ventana. En este momento Blender nos mostrará los nombres de los huesos, desde Bone hasta Bone.003. Para facilitar las cosas, puede que queramos asignar nombres más intuitivos. Si la lista de huesos no encaja en la ventana, podemos arrastrar el borde del panel inferior un poco hacia arriba. Llamemos a los huesos ul de “upper leg” y ll de “lower leg”. Añadimos .L o .R de left o right (véase Figura 4). La convención para etiquetar objetos simétricos como .L y .R es un requerimiento para realizar un efecto espejo de manera automática, cosa que haremos más tarde. Con esto completamos la estructura de las piernas. Pero si intentamos mover todo no tendremos mayor efecto en los resultados del rendering. Los huesos son simples objetos auxiliares en Blender: todo lo que hacen es definir los movimientos y deformaciones del mallado que los rodea. Para que ocurra eso, tenemos que indicarle a Blender qué áreas del entorno de los objetos 3D se dirigen moviendo los huesos. Este proceso se denomina skinning, ya que lo que se hace es poner una piel virtual y flexible cubriendo los huesos. Queremos que las piernas con forma de tubo se doblen en
Figura 3: Cuando posicionamos el cursor en el espacio 3D, siempre debemos verificar las dos perspectivas.
WWW.LINUX-MAGAZINE.ES
Blender • PRÁCTICO
¡En Movimiento!
Figura 4: Un objeto Blender tiene un sistema de músculo-esqueleto idéntico al de un auténtico animal. Nuestro personaje animado usa huesos y articulaciones.
las rodillas cuando la figura camine, y queremos que cambien las formas para reflejarlo. Por tanto necesitamos indicarle a Blender qué áreas del objeto 3D están conectadas a qué huesos. Hasta ahora las piernas se han formado a partir de un único tubo. Para ser capaces de asignar la mitad superior de la pierna al hueso superior, y la parte inferior al hueso inferior, tenemos en primer lugar que dividirlas. Como éstas siempre se mueven al mismo tiempo, tiene sentido agruparlas hasta formar un único objeto antes de hacer esto. Seleccionamos la pierna izquierda pulsando el botón derecho del ratón, mantenemos pulsada la tecla de [Shift] y añadimos la pierna derecha. Pulsamos [Ctrl]+[J] para agrupar los dos objetos. Pulsamos la tecla de [Tabulador] para habilitar el modo edición. Si vemos unos puntos amarillo brillante, los deshabilitamos pulsando [Ctrl]+[A]. En la vista lateral, pulsamos [B] y arrastramos un marco de selección sobre las secciones de cruce de las partes superior e inferior de la pierna (véase Figura 5, izquierda). Seleccionamos ahora Mesh | Edges | Subdivide en el menú del borde inferior del área de dibujo. Un anillo de nuevos asideros divide la pierna en la posición en la que necesitamos tener la unión de la rodilla (véase Figura 5, derecha). Ahora salimos del modo edición. Nos aseguramos que el mallado de las piernas esté habilitado, pulsamos la tecla [Shift] y
seleccionamos los huesos. Todo lo que necesitamos es un simple clic, y los cuatro huesos pasan a ser sub-elementos del mismo objeto. Pulsamos [Ctrl]+[P] y seleccionamos Armature en la ventana Make Parent que aparece. Ahora seleccionamos Create From Closest Bones en el menú Create Vertex Groups. Los Vertex Groups representan los huesos superior e inferior de ambas piernas, que pueden moverse de forma separada. Ahora pulsamos [Ctrl]+[A] para deseleccionar la selección actual, y seleccionar sólo las piernas. Al habilitar el modo edición encontramos los nombres de los cuatro huesos en el área Link and Materials bajo Vertex Groups. Pulsamos [Ctrl]+[A] para deseleccionar todos los puntos destacados amarillos, y pulsamos sobre Select bajo Vertex Groups. Todos los puntos que se mueven cuando se rota Us.L (la parte inferior de la pierna izquierda), se vuelven ahora amarillos. Como podemos ver, el mapeado automático de los puntos del mallado a los huesos ha funcionado perfectamente. Debido a que nuestra figura no tiene tobillos, tenemos que mover los pies junto con la parte inferior de las piernas. Pulsamos [B] y seleccionamos los puntos que faltan. Seguidamente pulsamos sobre Assign para asignarlos al hueso de la parte inferior de la pierna. Pulsamos [Ctrl]+[A] para deseleccionar, y repetimos los pasos para la pierna derecha y el Vertex Group Us.R
WWW.LINUX-MAGAZINE.ES
Ya podemos mover las piernas de nuestro personaje. Salimos del modo edición. Simplemente seleccionamos la estructura de esqueleto y pasamos a vista lateral. En lugar de Object Mode, seleccionamos Pose Mode en la lista del menú Object. Escogemos uno de los huesos inferiores de la pierna y pulsamos [G]. La rodilla debería doblarse cuando arrastramos el ratón. Salimos de la rotación pulsando [Esc] . Nuestro próximo objetivo es que la figura corra en la escena. Para ello necesitamos cuatro fotogramas, cada uno de los cuales representa una fase de la acción de correr (véase Figura 6). Blender calcula los pasos intermedios automáticamente. En el primer fotograma de la secuencia de vídeo queremos que la figura esté simplemente como en la primera parte del tutorial. Para seleccionar la pose actual para el sub-fotograma 1 nos aseguramos primero que el campo en el que se basa el fotograma actual (Figura 6) contiene un 1. Pulsamos [A] dos veces para seleccionar todos los huesos, que deberían volverse azules. Ahora pulsamos [I] y seleccionamos LocRot. Esto le indica a Blender que guarde la información de posición y rotación de los huesos seleccionados en el fotograma 1. A continuación nos vamos al campo del fotograma 5. En él queremos que nuestro personaje mueva su pierna izquierda hacia adelante, su derecha hacia atrás y que doble las rodillas ligeramente, como se muestra en la Figura 6. Para permitir que ocurra esto, seleccionamos el hueso superior de la pierna en la vista frontal. Posicionamos el cursor exactamente en la
Figura 5: Para mover la rodilla, la pierna tiene que dividirse en dos secciones.
Número 19
35
PRÁCTICO • Blender
Figura 6: Un paso de la figura animada requiere 4 key frames. Blender genera automáticamente los fotogramas intermedios.
unión superior de la pierna. Pulsamos [R] para mover ligeramente la pierna a la izquierda para reflejar la posición del paso. Habilitamos el hueso inferior de la pierna, pulsamos [R], y doblamos ligeramente la pierna. Seguimos el mismo procedimiento para mover la otra pierna ligeramente a la izquierda, y de nuevo doblamos la rodilla. Finalmente, habilitamos todos los huesos y pulsamos [I] para guardar los valores de la posición y rotación. La tercera pose, con la pierna derecha hacia adelante y la izquierda atrás, es una imagen especular de la pose del fotograma 5, por lo que no es necesario crearla manualmente. Para copiar la pose, seleccionamos Copy Current Pose en el menú Pose, y seleccionamos el fotograma 15. Seleccionamos Paste Flipped Pose. Nos aseguramos que todos los huesos están habilitados y guardamos los valores pulsando [I]. En el fotograma 20, queremos que la posición de las piernas vuelvan al punto de partida del fotograma 1. Para conseguirlo, nos vamos al fotograma 1 y seleccionamos Copy Current Pose. Pegamos la pose en el fotograma 20 seleccionando Paste Pose y pulsamos [I] para guardar. Podemos ahora irnos al fotograma 1 y pulsar [Alt]+[A] para mover la figura en vista previa. El cursor señala qué fotograma se muestra en cada momento. Salimos de la animación con [Esc]. Si queremos que el personaje corra de verdad, por supuesto que tenemos que moverlo a través de la escena. Esto es fácil de conseguir con Blender: sólo tenemos que guardar distintas posiciones de la figura 1 y 20. Para ello, pulsamos sobre el área de dibujo y presionamos [A] para seleccionar todos los objetos. Esto hace que los objetos se separen del personaje y también selecciona la cámara y las luces. Pulsamos [Ctrl]+[izq] y [Ctrl]+[der]
36
Número 19
para navegar por los distintos diseños de ventana de Blender. Ahora presionamos [Ctrl]+[izq] para mostrar una vista general en la parte izquierda de la pantalla. Mantenemos pulsada la tecla [Shift] y pulsamos Camera y desde Lamp.001 hasta Lamp.003 para eliminar estos objetos de la selección. Si pulsamos [Ctrl]+[der] volvemos a la disposición normal de ventanas. Tenemos que encontrar lo que ha de moverse la figura en cada paso. Para ello nos vamos al fotograma 5 y hacemos zoom para mostrar únicamente los pies. Contamos los cuadros grandes y pequeños entre los límites inferiores de los huesos inferiores de las piernas. La figura tiene que moverse el doble de lejos en el avance de cada paso. Ahora seleccionamos el fotograma 1. El personaje está en el centro de la pantalla en este momento. Pulsamos [0 XXXX] en el bloque numérico para conmutar la perspectiva de la cámara, pulsamos ahora [G], [Y] y arrastramos el personaje hacia atrás hasta una posición en la que la cabeza esté alineada con la cámara (se indica con el marco exterior de puntos). Pulsamos [I] y seleccionamos LocRot para fijar la posición de partida del primer fotograma. A continuación nos vamos al fotograma 20. Pulsamos [G], [Y] y arrastramos la figura a la izquierda la distancia que averiguamos anteriormente. Con [I] y LocRot mapeamos la posición al fotograma. Ahora, cuando vamos al fotograma 1, pulsamos [Alt]+[A], y deberíamos ver cómo nuestro personaje comienza a caminar. Es hora de renderizar. Pulsamos en la parte inferior de la ventana y presionamos [F10] para mostrar el panel de renderizado. La configuración de la primera parte del tutorial sigue siendo válida. Renderizar una secuencia puede llevar un buen rato. Para tener una primera impresión, puede que queramos
WWW.LINUX-MAGAZINE.ES
reducir la resolución y hacer oversampling, lo que crea superficies más suaves en el proceso de renderizado. Deshabilitamos el botón OSA en el área Renderer, y reducimos la resolución pulsando en 25%. La secuencia comprende 20 fotogramas, por lo que necesitamos un valor de 20 en End, que es el campo situado bajo el botón Play. El botón grande Anim en el centro de la ventana inferior da inicio al proceso. El cursor muestra el número del fotograma. Blender termina la animación cuando el cursor vuelve a su estado normal y la ventana de rendering muestra el último fotograma de forma permanente. Cerramos la ventana de rendering y pulsamos Play para comprobar los resultados. Si pulsamos [F9] en el tercio inferior de la ventana volvemos al panel Editing.
Un Poco Más Allá Blender ha calculado los pasos intermedios entre los fotogramas mediante interpolación. También es posible extrapolar pasos. Esto nos permite que nuestro personaje camine por toda la pantalla sin tener que redefinir las posiciones de las piernas. Pulsamos [Ctrl]+[izq] para habilitar el modo pantalla dividida, que usamos anteriormente para seleccionar elementos individuales en una lista. Esta pantalla fue diseñada especialmente para trabajar con animaciones. Además de la lista de objetos a la izquierda y la vista previa del mallado, encontraremos la ventana de IPO (IPO viene de interpolación) a la derecha. Esta herramienta nos permite controlar la manera en la que Blender interpola y extrapola movimientos. Habilitamos Armature en la lista de objetos. Fijamos los dos campos de lista de la ventana Object Mode / Object a Pose Mode y Pose, respectivamente.
Blender • PRÁCTICO
Figura 7: De un fotograma a un ciclo: Blender puede repetir secuencias de animación un cierto número de veces.
Seleccionamos uno de los huesos inferiores en la vista previa. Las curvas coloreadas en la ventana derecha representan la posición del objeto y la rotación del hueso. El eje X muestra el tiempo transcurrido en fotogramas. El eje Y muestra el movimiento/rotación en unidades Blender. Podemos usar la rueda del ratón para cambiar la escala de tiempo del movimiento y el botón central del ratón para cambiar la selección. Arrastramos el ratón hasta la ventana IPO, y presionamos [A] para seleccionar todos los puntos del gráfico. Ahora, cuando seleccionamos Curve | Extend Mode | Cyclic en el menú bajo la ventana, todas estas curvas se extienden cíclicamente por toda la pantalla. Fijamos los valores del campo End: a 100, y pulsamos [Alt]+[A] mientras posicionamos el ratón sobre la vista previa del personaje. Los 20 primeros fotogramas nos son familiares. Entonces el movimiento hacia adelante se detiene pero las piernas siguen moviéndose. El
movimiento cíclico de las piernas se ha extrapolado y el personaje corre en todos los fotogramas, pero el movimiento lineal de la figura completa no se ha extrapolado más allá. Seleccionamos Curve.001 en la lista de objetos. Suponiendo que tenemos un factor de zoom y un segmento de vista adecuados, veremos que la línea naranja mostrada como LocY (= posición en la dirección Y) en el gráfico, es al principio constante, luego va de 0 a 20, y luego vuelve a ser constante. Esto refleja el movimiento de nuestro personaje animado, que comienza en el fotograma 0 y termina en el fotograma 20. Pulsamos [A] mientras posicionamos el ratón sobre la ventana IPO. Seleccionamos entonces Curve | Extend Mode | Extrapolation en el menú bajo la ventana. La línea naranja LocY se desarrolla entonces por todo el sistema de coordenadas. Podemos usar esta técnica para extrapolar el movimiento de todos los objetos, excepto World, Camera, y de Lamp.001 hasta Lamp.003.
Seleccionamos Object Mode/ Object en ambas ventanas para el objeto Armature en esta ocasión. Se creó anteriormente el movimiento de las piernas en Pose Mode, sin embargo, el movimiento lineal de la figura se ha definido en Object Mode. Blender soporta dos sistemas de animación en este caso. Ahora ya podemos configurar los últimos fotogramas para permitir que la figura se mueva completamente fuera de la escena. Con [F10] accedemos a los controles de rendering. Seleccionamos el directorio donde guarda Blender la animación terminada, dentro de Output. Por defecto el programa guarda los fotogramas como imágenes individuales jpeg. Esto puede modificarse en Format abajo a la izquierda. Seleccionamos AVI Jpeg en lugar de Jpeg. Nuestro personaje animado puede mover sus piernas, aunque su apariencia es bastante rígida. Las técnicas de animación que hemos examinado en este artículo nos ayudarán a seguir aplicándolas a todo el sistema locomotor de la figura (podemos mover los brazos para acompasar a las piernas, e indicarle que mueva la cabeza, por ejemplo). Los profesionales usan técnicas similares cuando diseñan huesos y articulaciones de sus personajes en Blender para imitar expresiones faciales. Si necesitamos algo de inspiración tras el duro trabajo, podemos pasarnos por la Web, donde el equipo de Pixar describe el desarrollo de la producción de “Toy Story ■ 2” en [2].
RECURSOS [1] Descarga de Blender: http://www. blender.org/cms/Blender.31.0.html [2] “Toy Story 2”, de Pixar: http://www. pixar.com/howwedoit/index.html
PRÁCTICO • Contraseñas
Personalización de la Ventana Emergente de Contraseñas
CONTRASEÑAS CON TRUCO Vamos a mostrar algunos trucos para configurar la ventana emergente de contraseñas de root en los sistemas basados en RedHat. POR ARMIJN HEMEL
S
i se está usando la versión de Linux Red Hat Enterprise o una versión derivada de Red Hat, como Fedora Core o CentOS, probablemente se esté familiarizado con la ventana emergente que solicita la contraseña de root antes de ejecutar un programa que deba ejecutarse como root (Figura 1). La mayoría de los programas que utilizan este mecanismo de autenticación son herramientas que necesitan privilegios extras en el sistema. Un ejemplo de esta clase de herramientas es un programa que requiera acceder de forma directa a la tarjeta de red o un programa que necesite acceso de escritura a directorios con información de configuración. Puede que no se sepa que el mecanismo completo detrás de esta ventana emergente
es completamente personalizable. En este artículo se va a mostrar cómo funciona este mecanismo y cómo modificar su comportamiento por defecto.
consolehelper y userhelper Los dos paquetes que hacen esto posible se denominan usermode y user-mode-gtk. El paquete usermode contiene dos herramientas que son importantes: consolehelper y userhelper. El paquete user-mode-gtk, por su parte, contiene la ventana gráfica emergente y unas cuantas herramientas. consolehelper y userhelper funcionan conjuntamente para permitir a un usuario distinto de root ejecutar un programa que se tenga que ejecutar como root. Considérese, por ejemplo, el sniffer de red Ethereal. Ethereal requiere los privilegios de root porque necesita establecer la tarjeta de red a modo promiscuo. En una instalación por defecto, el menú está configurado de modo que si se selecciona Ethereal, se ejecuta el programa /usr/bin/ethereal. Este programa es un enlace simbólico a consolehelper: $ ls -l /usr/bin/ethereal lrwxrwxrwx 1 root root U 13 aug 11 20:01 U /usr/bin/ethereal -> U consolehelper
Cuando se ejecuta consolehelper, arranca userhelper. Los permisos de userhelper están establecidos a SUID root, así que se ejecuta como root cuando se le invoca. Si un programa es SUID, cuando se ejecute lo hará con todos los privilegios del usuario al que pertenece. Como userhelper tiene como
38
Número 19
WWW.LINUX-MAGAZINE.ES
propietario al usuario root y SUID, se ejecutará con todos los privilegios de root. Cuando consolehelper ejecuta a userhelper, le pasa el nombre del programa que desea ejecutar (en nuestro ejemplo, Ethereal) a userhelper, el cual intentará autenticar al usuario. Si la autenticación tiene éxito, userhelper (ejecutándose como root) ejecutará el programa como root. El programa userhelper comprueba primero un fichero de configuración para determinar qué programa debe ejecutar realmente, además de examinar otras opciones de configuración. A continuación, userhelper invoca al sistema PAM (Pluggable Authentication Modules) para ver si el usuario tiene permiso para ejecutar el servicio. Si el servicio está permitido, entonces se ejecuta el programa real. Si el usuario ha fallado a la hora de autenticarse correctamente, se muestra un mensaje de error (Figura 2). Los ficheros de configuración para userhelper se encuentran en /etc/security/console.apps/.userhelper. La configuración para Ethereal es la siguiente: USER=root PROGRAM=/usr/sbin/ethereal SESSION=true FALLBACK=true
En este ejemplo el programa solicitará la contraseña del usuario root. Si la autenticación vía PAM tiene éxito, se ejecutará el programa ubicado en /usr/sbin/ethereal. La variable SESSION indica si se tiene que utilizar o no el gestor de sesiones de PAM. Para las aplicaciones gráficas, como Ethereal, es necesario el gestor de sesiones. La variable FALLBACK se utiliza para determinar si el programa debe ejecutarse aunque falle la autenticación. El programa se
Figura 1: Los usuarios de Red Hat están familiarizados con la ventana que solicita la contraseña de root.
Contraseñas • PRÁCTICO
ejecutará, por supuesto, sin todos los privilegios y no estarán operativas todas las funciones. En el caso de Ethereal, puede leer los volcados de la red, pero no será capaz de crear ninguno. Otra parte de la configuración se realiza vía PAM. Estos parámetros, que se pueden encontrar en /etc/pam.d, siguen el estándar PAM. Esta solución tiene un punto débil: si el directorio que contiene el programa “real” (en este caso /usr/sbin) se encuentra antes en la variable $PATH que el directorio donde se encuentra consolehelper (por defecto, /usr/bin), consolehelper no será invocado primero y el programa no funcionará o no lo hará con los privilegios adecuados. Hay que tener esto en cuenta si se decide rehacer el orden en el que son buscados los directorios en el $PATH.
Adaptaciones Sencillas Personalmente siempre he creído que es un poco peligroso cuando las credenciales pasan por la caché. Probablemente haya visto el pequeño icono keyring en alguna de las barras de menú tras introducir la contraseña de root con el mecanismo usermode (Figura 3). Si este keyring está visible, se pueden
ejecutar programas que de otro modo requerirían la introducción de la contraseña de root vía usermode. Muchos programas poseen por defecto esta regla en su fichero de configuración PAM : session optional U pam_timestamp.so
Esta configuración implica que PAM mantendrá una marca de tiempo. Cuando un programa tiene esta regla en su fichero de configuración PAM, comprobará primero si ya se ha hecho una autenticación válida y si está en la caché: auth sufficient U pam_timestamp.so
Comentando las reglas mencionadas anteriormente se impedirá que las credenciales del usuario se almacenen en la caché después de una autenticación válida e impedirá las autorizaciones utilizando las credenciales de la caché.
Uso Avanzado Digamos que se desea controlar qué usuarios
pueden ejecutar ciertos programas. Para ello existen varios mecanismos. El primero es por medio de la configuración de consolehelper; el otro, y más potente, es por medio de PAM. Si se está configurando consolehelper, se puede evitar que los usuarios tengan que utilizar la contraseña de root permitiendo que se autentiquen con sus propias contraseñas. En la configuración de userhelper en /etc/security/console.apps/ hay que cambiar la autenticación como root a lo siguiente: USER=<user>
Si se hace esto, se le pedirá la contraseña del usuario. Si ésta se introduce correctamente se ejecutará el programa. Téngase en cuenta que aunque se utilice otra contraseña esto no cambia nada con respecto a los privilegios del programa. El programa que se ejecute lo hará aún como root, así que hay que asegurarse de hacerlo con cuidado. Si se establece USER a la variable especial <none>, no se permitirá ningún acceso: USER=<none>
Si se intenta ejecutar Ethereal ahora, se obtendrá un error y el programa no se
PRÁCTICO • Contraseñas
ejecutará (Figura 4). Probablemente se esté preguntando para qué es útil esta característica. Uno de los otros parámetros de configuración es UGROUPS. Éste puede ser establecido a una lista separada por comas de grupos. Los miembros de estos grupos se autenticarán como si sus nombres hubiesen sido establecidos en el fichero de configuración (USER=<user>). Es decir, serán autenticados con sus propias contraseñas. Si la configuración contiene USER=root, todos los demás usuarios tendrán que introducir la contraseña de root. Si se utiliza al mismo tiempo USER=<none> y UGROUPS en el fichero de configuración, se podrá asignar a los miembros de ciertos grupos la posibilidad de ejecutar programas sin que tengan que conocer la contraseña de root. De este modo se puede crear un comportamiento parecido al de sudo.
Figura 2: El usuario falla a la hora de autenticarse correctamente.
Personalización con PAM PAM ofrece una gran variedad de módulos, incluyendo opciones para autenticar a los usuarios con una base de datos o con algún hardware simbólico e incluso con herramientas de reconocimiento de voz. En este artículo tan sólo se van a proporcionar unos cuantos ejemplos de cómo utilizar PAM dentro de consolehelper. Sólo quiero que algunos de mis usuarios puedan husmear el tráfico de red de determinadas máquinas conectadas en mi red. Para ello, PAM posee un módulo denominado pam_localuser. Normalmente comprueba en /etc/passwd si cierta cuenta está listada, aunque también puede configurarse para que utilice un fichero separado. Para ello, mantengo a los usuarios a los cuales deseo darles el permiso en un fichero denominado /etc/localusers, al cual sólo el usuario root tiene permiso para leerlo y escribirlo. En este fichero tan sólo tengo a dos usuarios y posee el mismo formato que /etc/passwd: root:x:0:0:: armijn:x:500:500::
40
Número 19
Figura 3: Si el sistema posee credenciales para el usuario, el keyring será visible en el panel.
En la configuración de PAM, añado la siguiente regla: account required U pam_localuser.so U file=/etc/localusers
Ahora cuando se intenta ejecutar Ethereal por medio de usermode, también se comprueba si el usuario está o no en /etc/localusers. Antes de que esto funcione limpiamente, hay que realizar un cambio más: el usuario que consolehelper autentica debería ser cambiado de root al usuario actual. Si no, el sistema comprobará si el root está en /etc/localusers en vez de comprobar al usuario real. La configuración para Ethereal debería cambiarse a: USER=<user> PROGRAM=/usr/sbin/ethereal SESSION=true FALLBACK=true
Si elimino al usuario armijn de este fichero, ya no podré ejecutar más el programa Ethereal con todos los privilegios, excepto como root. Con el módulo localuser de PAM, se pueden tener ficheros separados con permisos para cada programa. Otro uso para este módulo particular es el control de los comandos poweroff, halt y reboot. En Red Hat Linux (y sus derivados) estas herramientas son también controladas por usermode. Añadiendo un fichero donde se encuentren los usuarios autorizados, se puede controlar qué usuarios poseen qué privilegios. Por ejemplo, pueden controlarse los que tienen el permiso de apagar la máquina. Estos tres comandos también utilizan otro módulo PAM interesante denominado pam_console, que comprueba si el usuario está actualmente conectado en una consola local. Dos de las reglas en la configuración de PAM para estos comandos son: auth sufficient U pam_rootok.so auth required U pam_console.so
WWW.LINUX-MAGAZINE.ES
El significado de estas reglas es el siguiente: sólo el usuario root y el usuario que Figura 4: El usuario no actualmente posee los permisos correspondientes para esté conectado ejecutar el programa. en la consola pueden apagar el sistema, pararlo o reiniciarlo. Los usuarios que se hayan conectado remotamente, excepto el root, no tienen permiso para apagar o reiniciar el sistema. Eliminando la segunda regla, el usuario que está conectado actualmente en la consola no podrá realizar estas acciones, excepto si dicho usuario es el root. Desde luego, aún se puede apagar el sistema utilizando GDM.
Consejo Las técnicas descritas en este artículo son útiles en algunos entornos, pero en otros casos, puede que resulten totalmente innecesarias. Antes de empezar a recompilar el sistema completo para que soporte usermode, debería tenerse en cuenta que las herramientas que hacen uso de usermode poseen una característica en común: tienen que acceder a ficheros que normalmente no tienen que ser accedidos o modificados por la mayoría de los usuarios mortales. A menudo no hay razón para modificar la seguridad del sistema por defecto. Antes de decidirse a utilizar usermode para restringir el acceso a los programas, debería comprobarse si estas opciones valen realmente el esfuerzo y asegurarse de que no se está complicando innecesariamente la configuración de la seguridad.
Para Más Información Si se necesita más información, se puede comenzar con las páginas man de consolehelper y userhelper. La página man de userhelper es especialmente útil. Existen multitud de recursos de ayuda para PAM. Es posible iniciarse con la página web de Linux-PAM, que se puede encontrar en http://www.kernel.org/pub/linux/libs/ pam/. Otra buena fuente sobre PAM es el libro Essential System Administration, 3rd edition de AEleen Frisch, ■ publicado por O’Reilly.
Antigüedades • PRÁCTICO
Aprovechando ordenadores viejos con software libre
ANTIGÜEDADES
Si nuestro ordenador es una pieza de museo que lleva años acumulando polvo, con un procesador viejo y a falta de memoria RAM, es más que posible que muchas de las distribuciones modernas no funcionen en él. Pero esto no es un problema: otras muchas distros diferentes encuentran en máquinas paleolíticas su mejor entorno para funcionar. POR HEIKE JURZIK
L
inux y hardware viejo ¿un choque entre dos mundos diferentes? Las distribuciones modernas con un programa de instalación gráfica proporcionan poca alegría en ordenadores lentos. Los escritorios como KDE o Gnome sobrecargan las máquinas de generaciones más antiguas. Pero esto no significa que haya que deshacerse de ellas, todo lo contrario, se les puede sacar un buen provecho usando distribuciones adecuadas dependiendo de las características de nuestra máquina, para lo cual dispondremos de varias distribuciones Linux a elegir con las que se podrán obtener buenos resultados. El cuadro “Generaciones Antiguas” presenta varios modelos y recomienda una distribución para cada tipo de hardware.
Amplia oferta Si nuestra distribución favorita viene solamente con un programa de
instalación gráfica que consume muchos recursos, no será adecuado en muchos casos para ordenadores antiguos. Pero la mayoría de los sistemas ofrecen una instalación a base sólo de texto. Debian, por ejemplo, renuncia completamente a una instalación gráfica. Después de una instalación con éxito hay que procurar un uso moderado de los recursos. Por ejemplo, en vez de escritorios lujosos como KDE o Gnome, vale la pena echar un vistazo a un administrador de ventanas ligero. La página web XWinman [5] ofrece información y enlaces sobre este tema.
especialmente adecuada para el uso en máquinas viejas. Esta distribución, basada en Debian, sólo tiene 50 MBytes y funciona también en ordenadores con un procesador 486 y 16 MBytes de memoria RAM. DSL no solamente funciona muy bien como distribución live, sino que también la podemos instalar en nuestro disco duro en pocos pasos. Si nuestro ordenador puede iniciarse desde el CD-ROM, introducimos un disco con DSL y arrancamos de nuevo. Como alternativa, podemos consultar el cuadro “DSL desde disquete”, donde se
Damn Small Linux La base ideal para probar el potencial de un ordenador antiguo son distribuciones live como Knoppix, Kanotix o Damn Small Linux (DSL, en inglés: Linux Condenadamente Diminuto). Esta última se puede encontrar en la página web del proyecto en [6] y es
WWW.LINUX-MAGAZINE.ES
Número 19
41
PRÁCTICO • Antigüedades
Tabla 1: DSL: Palabras clave dsl lang=us (cs, da, de, es, fr, nl, it, pl, ru, sk, …) dsl toram dsl tohd=/dev/hda1 dsl restore=sda1 (hda1, floppy) dsl fromhd=/dev/hda1 dsl dma dsl 2
explica cómo se genera un disquete de inicio y cómo se arranca el sistema con él. Comprobamos que el orden de inicio está bien puesto en la BIOS: el First Boot Device (en inglés: primer dispositivo de arranque) debería poner CDROM y como Second Boot Device, o sea como segundo, el disco duro (HDD0). Después de un momento debería aparecer la pantalla de inicio y el prompt de arranque. Igual que en otras distribuciones live, controlamos el inicio del sistema con palabras o teclas clave, que son parámetros opcionales de arranque que introducimos en el prompt boot: (también es posible usar combinaciones). Pulsamos la tecla [F2] o [F3] para obtener una lista de los comandos. La tabla “DSL: Palabras clave” reúne los más importantes.
Configura el idioma/disposición del teclado. Por ejemplo: dsl lang=es para cambiar al Español. Carga la distribución entera en la memoria RAM, para ello hacen falta por lo menos 128 MByte RAM. Copia el CD a una partición del disco duro (en este caso /dev/hda1) y reinicia luego el sistema desde allí. Integra la configuración guardada en el arranque. Arranca DSL desde la partición indicada. Activa DMA (“Direct Memory Access”). Arranca el sistema en el runlevel 2 (= modo de texto).
Listo para empezar Después de poco tiempo nos saluda el escritorio DSL. El administrador de ventanas predeterminado es Fluxbox (Figura 1). Si no nos gusta el diseño de Fluxbox, nos podemos cambiar a Joe’s Window Figura 1: Damn Small Linux usa Fluxbox como administrador de Manager (JWM) ventanas. pulsando el botón derecho de nuestro ratón y eligiendo En el escritorio hay varios iconos que Window Manager / Switch to jwm sirven como atajo a las aplicaciones desde el menú contextual. instaladas. Si pulsamos el botón
Generaciones Antiguas Según la característica del equipo, las distintas distribuciones son más o menos aptas para el uso de Linux: i486 (80486), año 1990 hasta 1995 • CPU: i386/i486 (80386/80486), ca. 50 hasta 100 MHz • Memoria RAM: entre 8 y 16 MBytes • Disco duro: entre 200 y 500 MBytes • Sistema Bus: ISA, VESA, (PCI) • Gráfico: 1 hasta 4 MByte ISA o PCI Las distribuciones modernas requieren, incluso para la instalación más pequeña, un espacio en el disco duro de 1 GByte como mínimo. Varios de los servicios que arrancan automáticamente necesitan además una memoria RAM mínima de entre 30 y 50 MBytes incluso sin sistema gráfico. Por ello los ordenadores de esta generación sirven exclusivamente para las distribuciones mini, como por ejemplo Damn Small Linux [1]. Como alternativa existe además Puppy Linux [2]. Pero el mejor uso para semejante hardware sería sin duda la configuración como firewall o router con CoyoteLinux [3] o TinyLinux [4].
42
Número 19
• CPU: Pentium, ca. desde 60 a 233 MHz
actualizaciones o software parcheado para otras distros más antiguas.
• Memoria RAM: desde 32 a 128 MBytes
Pentium II, año 1997 hasta 2001
• Disco duro: desde 500 MBytes a 2 GBytes
• CPU: Pentium II, ca. desde 233 a 1.400 MHz
• Sistema Bus: PCI, ISA, VESA
• Memoria RAM: desde 64 a 256 MByte
Pentium, año 1994 hasta 1997
• Gráfico: 8 hasta 32 MByte PCI o ISA Los ordenadores de esta generación no están todavía lo suficientemente dotados para el uso de los sistemas modernos de Linux, pero normalmente pueden instalarse sin problemas distribuciones más viejas como Suse Linux 6.0 o Red Hat 6.2. Aunque tampoco debían esperarse récords de velocidad con estas distribuciones, ya que los entornos gráficos de Gnome y KDE consumían ya en este época muchos recursos. Como alternativa pueden recomendarse escritorios ligeros como IceWM, que necesitan mucha menos potencia de cálculo y espacio de memoria. Lo más conveniente es el uso de una distribución mini como Damn Small Linux, ya que apenas existen
WWW.LINUX-MAGAZINE.ES
• Disco duro: 4 GByte hasta 20 GByte • Sistema Bus: PCI, AGP • Gráfico: 16 hasta 64 MByte PCI o AGP Los ordenadores con estas características están adecuados bajo ciertas limitaciones para el uso de las distribuciones actuales. Así, para poder trabajar sin problemas, el ordenador debería tener por los menos 128 MByte de memoria RAM y un procesador de 500 MHz. Si las características del equipo están por debajo de estos valores, las distribuciones más adecuadas serían por ejemplo Suse Linux hasta la versión 8.0. Además es recomendable renunciar a derrochadores de recursos como KDE y usar Gnome como entorno gráfico para el escritorio.
Antigüedades • PRÁCTICO
Arranque desde disquete Si el ordenador no arranca desde el CDROM, creamos un disquete de arranque con los siguientes pasos: 1 Abrimos la página web de DSL y descargamos el archivo bootfloppy.img [6]. 2 Para generar este disquete bajo Windows, necesitamos el programa RawWrite. Las instrucciones y la herramienta se encuentran en [7]. Para Linux escribimos la imagen al disquete en la línea de comandos con lo siguiente: dd if=bootfloppy.img of=/dev/fd0 Luego reiniciamos el ordenador con el disquete introducido en la unidad. Procuramos que la BIOS tenga el orden de arranque correcto para que la máquina busque el sistema operativo primero en el disquete y luego en el CD.
derecho del ratón encima de un espacio libre del fondo encontramos más programas en el menú contextual. Como última entrada en este menú vemos el punto “Power down” que sirve para apagar o reiniciar el ordenador. Por defecto no hay ninguna contraseña root: en el shell podemos conseguir derechos de administrador, si tecleamos $ sudo su
o si ponemos sudo por delante de los comandos que queremos ejecutar como root. Aunque en Damn Small Linux la mayoría de las tareas administrativas se realizan de manera muy cómoda con un click de ratón: en el símbolo DSLpanel tenemos un interfaz para llegar a las distintas opciones de la
Figura 2: En el “DSLpanel” se pueden configurar las partes más importantes del sistema.
instalación. Aquí configuramos por ejemplo la tarjeta de red, una conexión a Internet, el diseño del teclado, fecha y hora, tarjetas WIFI o PCMI, el servidor SSH y mucho más (Figura 2). Si nos falta algo, probablemente lo encontraremos en el menú System al que se puede acceder con un clic con el botón derecho encima del fondo de pantalla. Si estamos conectados a Internet, la instalación posterior de componentes suele ser igual de fácil. Pulsamos el icono MyDSL y elegimos la aplicación que queremos entre las categorías ofrecidas. Después de la descarga, la encontramos en el menú MyDSL que sale con un clic con el botón derecho encima del fondo de pantalla.
Para siempre Para guardar nuestras propias configuraciones, arrancamos el DSLpanel y elegimos el punto “Backup/Restore”. En la ventana que aparece introducimos el nombre del dispositivo, por ejemplo fd0 para la disquetera, sda o sda1 para un dispositivo de memoria flash USB, hda1 para una partición del disco duro, etc., y pulsamos “Backup”. El sistema guarda unas subcarpetas de /opt en la carpeta home predeterminada. Este comportamiento está definido en el archivo /home/dsl/.filetool.lst. Los datos que quedan excluidos automáticamente de la copia de seguridad se encuentran en /home/dsl/.xfiletool.lst. Para la integración de la copia de seguridad desde el arranque introducimos como palabra clave dsl restore= seguido por el nombre del dispositivo donde se encuentra la copia de seguridad, o arrancamos otra vez “Backup/Restore” desde el DSLpanel. Aquí introducimos también el dispositivo y a continuación pulsamos “Restore”. Para la instalación de Damn Small Linux en el disco duro, se necesitan al menos una partición Swap y una partición Linux. El Wiki en inglés en la página de DSL explica los detalles de la preparación e instalación [8]. Existen varios maneras de instalar Damn Small Linux: bien introducimos la palabra clave install detrás del boot prompt al inicio, bien abrimos el asistente de instalación. Para esto último, escribimos en una terminal del sistema $ sudo dsl-hdinstall
WWW.LINUX-MAGAZINE.ES
Figura 3: Damn Small Linux viene con un script que permite su instalación en el disco duro .
En los dos casos es preciso responder las preguntas sobre la partición deseada, las cuentas de usuarios y el sistema de archivos. Si estamos seguros, decimos sí con la tecla [Y] a la última confirmación (Figura 3). Le siguen preguntas sobre el Bootloader (gestor de arranque. Se puede elegir entre Grub y Lilo) e información sobre el estado de la instalación. A continuación el programa de instalación nos pide el reinicio y listo.
Resumen Los ordenadores siguen siento aparatos valiosos, incluso si no están hechos para el uso de distribuciones modernas. Lo que cuenta es la elección de un sistema operativo adecuado que se adapte a las características de la máquina. Si podemos renunciar a escritorios complejos como KDE o Gnome, vale la pena aprovechar las pequeñas y potentes distribuciones como Damn Small ■ Linux.
Recursos [1] Damn Small Linux: http://www. damnsmalllinux.org/ [2] Puppy Linux: http://www.puppylinux. org [3] Página web de CoyoteLinux: http:// coyotelinux.com/ [4] Proyecto TinyLinux: http://tiny.seul. org/en/ [5] Vista general de los distintos administradores de ventanas para Linux: http://xwinman.org/ [6] Página de descarga para DSL: http:// www.damnsmalllinux.org/download. html [7] RawWrite para Windows: http:// uranus.it.swin.edu.au/~jn/linux/ rawwrite.htm [8] DSL-Wiki: http://www. damnsmalllinux.org/wiki/
Número 19
43
DESARROLLO • Perl
Creamos un analizador sintáctico con Perl
ARTISTA DE LA COMPILACIÓN Los analizadores léxicos y sintácticos no son sólo para barbudos gurús. Este mes mostramos cómo podemos crear un parser para nuestras propias aplicaciones. POR MICHAEL SCHILLI
L
os lexers y parsers son herramientas cotidianas para los diseñadores de compiladores e inventores de nuevos lenguajes de
programación. Ambos analizan expresiones arbitrariamente complejas para validarlas sintácticamente y ayudan a traducir estas expresiones
complejas desde un formato comprensible para las personas a formato de lenguaje máquina. La verdad es que hoy día es raro que tengamos que escribir nuestro propio parser, ya que la información está frecuentemente en formato XML, existiendo muchos parsers sencillos de utilizar capaces de manejar esta información XML. Pero si necesitamos analizar y evaluar fórmulas tecleadas por los usuarios, no existe más remedio que crear nuestro propio parser.
Análisis final Si tenemos que evaluar una expresión como 5+4*3, en primer lugar será necesario aislar los operadores de los operandos. Como muestra la Figura 1, el llamado lexer extrae primero los símbolos 5, +, 4, * y 3 de la cadena. Estas cadenas, a las que llamamos tokens, alimentan al parser, que verifica si tienen sentido desde el punto de vista matemático. Para ello, el parser crea generalmente una estructura de árbol que luego usa para verificar si la expresión pasada sigue las reglas de una gramática previamente definida. La gramática especifica también cosas como la precedencia de los operadores (por ejemplo, PEMDAS: paréntesis, exponentes, multiplicación, división, adición, substracción) o la asociatividad (de izquierda a derecha, o viceversa). Tras averiguar el significado exacto de la expresión, el ordenador ya puede evaluarla. La parte inferior
44
Número 19
WWW.LINUX- MAGAZINE.ES
Perl • DESARROLLO
Figura 1: El lexer convierte la cadena a tokens, y el parser crea el árbol de parseo. El traductor convierte esto a Notación Polaca Inversa (RPN) y calcula el resultado aplicando un sencillo algoritmo.
de la Figura 1 muestra un ejemplo de procesador RPN (RPN: Notación Polaca Inversa). La máquina virtual acumula tanto números como operadores en la pila, y luego intenta reducir las combinaciones operandooperando-operador a valores. En la Figura 1, en primer lugar 4 3 * se reduce a 12, y la combinación de la parte superior de la pila, 5 12 +, resulta 17, que es el resultado correcto de cálculo original 5+4*3. Por supuesto, nada nos impide pasarle una cadena como 5+4*3 a la función eval de Perl, que aplicará las reglas matemáticas de éste para calcular las expresiones. Pero si la expresión contiene variables, operadores que no entiende Perl, o incluso construcciones if-else, es decir, si manejamos un lenguaje de programación en miniatura, no tendremos alternativa a un verdadero parser. Volviendo al lexer: tenemos que ignorar los espacios en blanco de la cadena que estamos evaluando. Es decir, de la expresión 5 +4 *3 tiene que resultar 5+ 4*3. Sin embargo, el análisis léxico no es siempre tan trivial como este ejemplo. El operando puede ser un número real como 1.23E40, o incluso una función como sin(x), la cual tendríamos que separar en sin, (, x y ). CPAN tiene el módulo Parse::Lex para análisis
léxicos como éste. Cuando se instale el módulo, debe tenerse en cuenta que se requiere al menos la versión 0.37 del módulo Parse::Template. El script mathlexer (Listado 1) muestra un ejemplo. Aguarda una expresión arbitrariamente compleja como entrada y se la pasa al lexer. El lexer devuelve el tipo de token y el contenido del token, que se pasan como salida para propósitos de prueba. El módulo que usa mathlexer, MathLexer.pm, define la clase MathLexer, que proporciona el constructor new para aceptar una cadena para el análisis léxico (Listado 2). Luego pasa a verificar si la cadena coincide con una serie de expresiones regulares guardadas en el array @tokens. Para cada lexema que encuentra el método next, el lexer devuelve dos valores (un lexema es una secuencia de caracteres encontrado por el lexer a partir del cual se genera un token). El primer elemento de la referencia al array devuelto es el nombre del token que ha encontrado el lexer (por ejemplo, “NUM”, “OPADD” o “RIGHTP”). El segundo elemento contiene el valor realmente encontrado en el texto analizado (por ejemplo, “4.27e-14”, “+” o “)”). La figura 2 muestra la salida de prueba, que se usará para alimentar el parser en una situación real.
WWW.LINUX- MAGAZINE.ES
Nótese que Parse::Lex aguarda expresiones regulares como cadenas en el array @token. Esto significa que necesitamos evitar las barras \\ si no queremos que símbolos como * se interpreten como metacaracteres de expresiones regulares. Como las expresiones tal que \\*\\* son difíciles de descifrar, MathLexer usa una expresión regular idéntica, pero con un aspecto algo extraño: “[*][*]”, para la definición del primer token. No es nada sencillo formular una expresión regular que cubra las diferentes maneras de representar un número real (por ejemplo, 1.23E40, .37, 7, 1e10). Afortunadamente, el módulo de CPAN Regexp::Common tiene expresiones preconstruidas para muchas tareas, incluyendo una para números reales con todo tipo de detalles. Tras realizar la llamada use Regexp::Common en el programa, podemos usar un hash global para aprovechar estas perlas de la sabiduría en expresiones regulares. La expresión para números reales puede recuperarse con un simple $RE{num}{real}. Por cierto, esta expresión también permite un signo menos opcional delante del número real. Pero debido al orden elegido de los lexemas detectados en @tokens, el lexer supondrá que un signo menos precedente es un OP. Sin embargo, si el signo menos está en el exponente del número real, el lexer lo toma como parte del lexema NUM. Adicionalmente, el método skip llamado en la línea 32 del Listado 2 asegura que el lexer ignora los espacios y caracteres de nueva línea. Sin embargo, si el método skip se topa con una secuencia de caracteres que no reconoce (como con }), se usa el pseudo-token ERROR de la línea 19. Este token define una rutina de manejo de errores, que usa el comando die para indicarle al lexer que finalice.
¡Tokens Por Favor! El parser verifica entonces la validez sintáctica de una expresión. 4+*3 sería inválida. Queremos que el parser reporte un error en este caso y cancele el procesamiento. En muchos casos, los parsers no sólo
Número 19
45
DESARROLLO • Perl
verifican la sintaxis de una expresión, sino que también controlan el trabajo de traducción. Después de todo, por qué no dejar al parser que calcule el resultado mientras estudia una expresión aritmética. El Listado 3, AddMult.yp, define una gramática para el parser. Especifica cómo combina el parser los tokens que salen del lexer en estructuras predefinidas. La primera producción, expr: add | mult | NUM, especifica que la tarea global del parser es reducir la secuencia de todos los tokens a una construcción de tipo expr. Si esto no es posible, los tokens no obedecen la gramática: ha ocurrido un error y el parser finaliza. Las producciones como la del Listado 3 tienen un símbolo de no terminal a la izquierda. El objetivo del parser es hacer coincidir de alguna manera la salida del lexer con la parte derecha de una producción y entonces reducirla al no terminal de su izquierda. En la parte derecha, una producción puede listar tokens que ya pasaron el lexer (también conocidos como terminales) pero también otros no terminales, que son resueltos por otras producciones. En nuestro ejemplo, expr puede ser tres cosas, con las alternativas separadas por
Listado 1: mathlexer 01 #!/usr/bin/perl -w 02 use strict; 03 use MathLexer; 04 05 my $str = “5*sin(x*-4.27e-14)**4*(e-pi)” ; 06 print “
$str\n\n”;
07 08 my $lex = MathLexer->new($str); 09 10 while(1) { 11
my($tok, $val) = $lex->next();
12
last unless defined $tok;
13
printf “%8s %s\n”, $tok, $val;
14 }
46
Número 19
tuberías “|” a la derecha de los dos puntos. add (suma), mult (multiplicación) o un NUM terminal, un número real que llega del lexer. Los no terminales add y mult se definen en las siguientes producciones en AddMult.yp. add: expr OPADD expr especifica que el no terminal add comprende dos expr no terminales enlazados por el operador “+”. Como ya sabíamos expr puede contener adiciones, multiplicaciones o números sencillos. El archivo con la gramática, AddMult.yp, proporciona una descripción abstracta de un parser al módulo Parse::Yapp disponible en CPAN. AddMult.yp se divide en tres secciones separadas por la cadena %%. La cabecera está al comienzo, puede contener instrucciones del parser o código Perl. Las producciones que pertenecen a la gramática están en el centro y le sigue el pie de página, donde se puede definir más código Perl, aunque está vacío en el Listado 3. Para implementar el parser, AddMult.yp se convierte a un
módulo Perl por la utilidad yapp incluida en Parse::Yapp. El módulo que se crea en este proceso, AddMult.pm, implementa un parser bottom-up. Este tipo de parser lee un flujo de tokens desde el lexer e intenta crear el árbol mostrado en la Figura 1, desde abajo hacia arriba. Para ello, combina las unidades leídas para crear construcciones de mayor nivel desde tokens y construcciones de menor nivel. Se continúa este proceso, basado en las reglas de la gramática, hasta que los resultados coinciden con la parte izquierda de la primera producción. En cada paso, el parser hace una de estas dos cosas: desplazar o reducir. Al desplazar se le indica al parser que tome el siguiente token del flujo de entrada y lo ponga encima de la pila. Al reducir se le está indicando que combine los terminales y los no terminales de la pila para crear no terminales de nivel superior, basándose en las reglas de la gramática, y por tanto reduciendo la altura de la pila. Si la
Listado 2: MathLexer.pm 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
############################## package MathLexer; ############################## use strict; use Regexp::Common; use Parse::Lex; my @token = OPPOW => OPSUB => OPADD => OPMULT => OPDIV => FUNC => ID => LEFTP => RIGHTP => NUM => ERROR =>
( “[*][*]”, “[-]”, “[+]”, “[*]”, “[/]”, “[a-zA-Z]\\w*\\(“, “[a-zA-Z]\\w*”, “\\(“, “\\)”, “$RE{num}{real}”, “.*”, sub { die qq(Can’t lex “$_[1]”) }, 21 ); 22 23 ############################## 24 sub new { 25 ############################## 26 my($class, $string) = @_; 27
WWW.LINUX- MAGAZINE.ES
28
my $lexer = Parse::Lex->new(@token); 29 $lexer->skip(“[\\s]”); 30 $lexer->from($string); 31 32 my $self = { 33 lexer => $lexer, 34 }; 35 36 bless $self, $class; 37 } 38 39 ############################## 40 sub next { 41 ############################## 42 my($self) = @_; 43 44 my $tok = $self->{lexer}->next(); 45 return undef if $self->{lexer}->eoi(); 46 47 return $tok->name(), $tok->text(); 48 } 49 50 1;
Perl • DESARROLLO
cola de entrada está vacía, y si la última reducción acaba de salir del parser con la parte izquierda de la producción inicial, significa que el parser se ha ejecutado satisfactoriamente. La Tabla 1 muestra un parser bottom-up, implementado en base a la gramática de AddMult.yp, que procesa los tokens extraídos de la cadena de entrada 5+4*3 paso a paso. En el paso 0, los tokens [NUM, “5”], [OPADD, “+”], [NUM, “4”], [OPMULT, “*”] y [NUM, “3”] están disponibles en la cola de entrada. En el paso 1, el parser pone el 5 (que es un token NUM) encima de la pila (desplazando). En el paso 2, reduce el terminal NUM a expr basándose en la tercera alternativa de la primera producción de la gramática de AddMult.yp. El parser procesa entonces los tokens [OPADD, “+”] y [NUM, “4”] desde la entrada, los desplaza hasta la pila, y luego reduce el 4 a expr. ¿Y ahora qué? El parser podría reducir expr OPADD expr de la pila a expr, siguiendo la segunda producción de la gramática. Por otro lado, podría traerse [OPMULT, “*”] desde la entrada y esperar a encontrar otra expr más tarde para reducir expr OPMULT expr (tercera producción).
Conflicto Este tipo de problema es común. Las gramáticas son a menudo ambiguas. Si no tuviéramos la tradicional regla
Figura 2: Expresión matemática procesada por el lexer MathParser.pm.
Listado 3: AddMult.yp 01 02 03 04 05 06 07 08 09 10 11 12 13
%left OPADD %left OPMULT %% expr: add | mult | NUM; add:
expr OPADD expr { return $_[1] + $_[3] }; mult: expr OPMULT expr { return $_[1] * $_[3] }; %%
PEMDAS en matemáticas, el parser estaría completamente desconcertado por los conflictos de desplazamiento-reducción causados por la expresión “5+4*3”. El hecho de que estos operadores algebraicos tengan precedencia, no obstante, evita el conflicto. El parser tiene que esperar antes de reducir 5+4, y necesita desplazar el token * hasta la pila, ya que un * es un enlace más fuerte entre operandos que el +, más débil. Si se presentan los mismos operadores varias veces en sucesión, como en 5-3-2, todas las operaciones tienen la misma precedencia, y aparece otro tipo de conflicto. Si el parser decide reducir, tras parsear 5-3, evalúa los operadores de izquierda a derecha, de acuerdo a las reglas del álgebra. Un desplazamiento, por otro lado, evaluaría la expresión como 5-(3-2), y esta expresión conduciría a un sorprendente resultado de 6, en lugar del 0 que esperábamos. Es por esto que el operador menos se considera como asociativo por la izquierda. Necesitamos indicarle esto al parser para que pueda resolver también este tipo de conflicto. Por cierto, en el caso del operador de potencia ( en Perl), el álgebra dicta un método contrario: “4 3 2” (“4 elevado a 3 elevado a 2”) se calcula como 4**(3**2). ¡El operador potencia es asociativo por la derecha! Esto puede verificarse fácilmente en Perl: perl -le ‘print 4**3**2’ devuelve 262144 (4 9) y no 4096 (64 2).
WWW.LINUX- MAGAZINE.ES
Asociatividad y Precedencia El generador del parser yapp también detecta que la gramática es ambigua. Aquí vemos cómo el generador yapp crea el módulo del parser AddMult.pm a partir del archivo AddMult.yp: $ yapp -m AddMult AddMult.yp 4 shift/reduce conflicts
Las dos primeras líneas del Listado 3 resuelven el conflicto en la gramática: %left OPADD %left OPMULT
Estas sentencias estipulan que tanto el operador + como el * son asociativos por la izquierda, y, lo que es más importante: OPMULT tiene prioridad sobre OPADD, dado que %left OPMULT aparece más tarde que %left OPADD en la definición del parser. Si el parser fuese a definir una operación OPMINUS usando el operador -, sería importante insertar
Listado 4: addmult 01 #!/usr/bin/perl 02 ############################## ############# 03 # addmult 04 # 2005, Mike Schilli <cpan@perlmeister.com> 05 ############################## ############# 06 use strict; 07 use warnings; 08 09 use MathParser; 10 use AddMult; 11 12 my $mp = MathParser->new(AddMult->new() ); 13 14 for (qw( 5+2*3 5+2+3 5*2*3 5*2+3)) { 15 print “$_: “, $mp->parse($_), “\n”; 16 }
Número 19
47
DESARROLLO • Perl
Listado 5: MathParser.pm 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
############################## package MathParser; ############################## use MathLexer; use strict; use warnings; ############################## sub new { ############################## my($class, $parser) = @_; my $self = { parser => $parser }; bless $self, $class; } ##############################
%left OPMINUS antes de la definición de OPMULT. Si la cabecera del archivo yp tiene una entrada %right OPMINUS en lugar de %left OPMINUS, el parser evaluaría expresiones como 5-3-2 de derecha a izquierda. Y esto sería desastroso, ya que 5-(3-2) es 6, en lugar de 5-3-2, que nos da un valor de 0. Para indicarle al parser cómo elevar números a potencias, vamos a necesitar un operador de potencias asociativo por la derecha, %right OPPOW, situado después de la definición de OPMULT debido a la alta prioridad de la operación potencia y a su asociatividad por la derecha. Estos trucos le permiten al parser terminar como se muestra en la Tabla 2. Además de la gramática, AddMult.yp define cierto código ejecutable en Perl, adjunto a las producciones. Por ejemplo:
21 sub parse { 22 ############################## 23 my($self, $str, $debug) = @_; 24 25 my $lexer = MathLexer->new($str); 26 27 my $result = $self->{parser}->YYParse( 28 yylex => sub { $lexer->next(); }, 29 yyerror => sub { die “Error” }, 30 yydebug => $debug ? 0x1F : undef, 31 ); 32 } 33 34 1;
mult: expr OPMULT expr { return $_[1] * $_[3] };
estipula que el valor devuelto de la producción (que acompaña al no terminal en la parte izquierda) es el producto de los valores devueltos de las expresiones expr. Esto significa que el parser va a continuar acumulando arriba el resultado de la expresión aritmética que está evaluando hasta que alcance la producción inicial, y el resultado puede devolverse a quien lo llamó desde el parser. Ello proporciona automáticamente al verificador de sintaxis la posibilidad de calcular fórmulas. Las Tablas 1 y 2 muestran los valores devueltos en la reducción en curso, en la columna “Return”. Nótese que $_[1] en los segmentos de código refieren a la primera expresión en el lado derecho de la
Tabla 1: Pasos del Parser Paso 0 1 2 3 4 5
48
Regla
Devuelve
Pila
DESPLAZA REDUCE expr: NUM 5 DESPLAZA DESPLAZA REDUCE expr:NUM 4 *Conflicto: ¿Desplazamiento/Reducción?
Número 19
NUM expr expr OPADD expr OPADD NUM expr OPADD expr
Entrada 5+4*3 +4*3 +4*3 4*3 *3 *3
WWW.LINUX- MAGAZINE.ES
producción (esto es, expr). Partiendo de la norma, el contador no comienza en 0, ya que $_[0] de la producción de Parse::Yapp es siempre una referencia para el parser. Si una producción contiene múltiples alternativas separadas por |, cada alternativa puede definir su propio bloque de código. Nótese que un bloque de código sólo se refiere a la alternativa a la que está adjunta. Antes de que pueda usarse el parser, sólo un paso intermedio más: la interfaz del parser yapp es algo exótica, y como vamos a usar nuestro lexer MathLexer previamente definido, se puede definir una interfaz más sencilla en el Listado 5. El método parse() de MathParser simplemente acepta la cadena a parsear y devuelve el resultado aritmético. Si surge un error, el parser se dirige a la subrutina anónima definida en la línea 35 y finaliza. El listado mathparser muestra una sencilla aplicación que usa MathParser.pm para parsear y evaluar cuatro expresiones diferentes: 5+4*3: 5+4+3: 5*4*3: 5*4+3:
17 12 60 23
Esto muestra que el parser hace honor a las reglas de precedencia y evalúa expresiones como 5+4*3 y 5*4+3 de manera correcta.
Listado 6: UnAmb.yp 01 ############################## 02 # UnAmb.yp - Unambiguous +/* grammar 03 ############################## 04 %% 05 expr: expr OPADD term { 06 return $_[1] + $_[3]; 07 } 08 | term { 09 return $_[1]; 10 }; 11 12 term: term OPMULT NUM { 13 return $_[1] * $_[3]; 14 } 15 | NUM { 16 return $_[1]; 17 }; 18 %%
Perl • DESARROLLO
Tabla 2: Pasos Finales de la Ejecución del Parser Paso 6 7 8 9 10
Regla DESPLAZA DESPLAZA REDUCE expr: NUM REDUCE expr: expr OPMULT expr REDUCE expr: expr OPADD expr
Existe otra manera de resolver conflictos de precedencia. Si formulamos una gramática como la del Listado 6, la mayor precedencia del operador “*” deriva de las relaciones entre las producciones. Una multiplicación se reduce primero al no terminal term, antes de que se haga alguna reducción. Este método nos permite implementar el comportamiento de los paréntesis, si se permiten en la cadena de entrada. Para forzar “(5+4)*3”, por ejemplo. Para hacer esto, simplemente redefinimos la producción term y añadimos otra producción para force, que salta ante cualquier paréntesis y reduce inmediatamente las expresiones de su interior: term: term OPMULT force { ... } | force force: LEFTP expr RIGHTP
Listado 7: RPN.yp 01 02 03 04 05 06 07
%left OPADD %left OPMULT %% expr: add | mult | NUM { return [ $_[1] ]; };
08 09 add: expr OPADD expr { 10 return [ 11 @{$_[1]}, @{$_[3]}, $_[2] 12 ]; 13 }; 14 15 mult: expr OPMULT expr { 16 return [ 17 @{$_[1]}, @{$_[3]}, $_[2] 18 ]; 19 }; 20 %%
Devuelve
12 17
Pila expr OPADD expr OPMULT expr OPADD expr OPMULT NUM expr OPADD expr OPMULT expr expr OPADD expr expr
{ return $_[2]; } | NUM
En lugar de evaluar la expresión aritmética directamente, tiene más sentido convertirla a un formato que sea más sencillo de computar, como RPN. El Listado 7 muestra la gramática para hacer esto. Hemos cambiado sólo los segmentos de producción de código, que, en lugar de pasar sobre los valores calculados, ahora escribe los números y las operaciones en un array, que se pasa como referencia, para llegar finalmente donde fue llamado el parser. rpn es el script al que se llama. Como es de suponer, produce conversiones completamente diferentes de 5+4*3 y 5+4+3: 5+4+3: [5, 4, +, 3, +, ] 5+4*3: [5, 4, 3, *, +, ]
En la expresión superior, el traductor simplemente procesa la expresión de izquierda a derecha y
Listado 8: rpn 01 02 03 04 05 06 07 08
#!/usr/bin/perl use strict; use warnings; use MathParser; use RPN; my $mp = MathParser->new(RPN->new());
09 10 for my $string (qw(5+4+3 5+4*3)) { 11 print “$string: [“; 12 for (@{ $mp->parse($string) }) { 13 print “$_, “; 14 } 15 print “]\n”; 16 }
WWW.LINUX- MAGAZINE.ES
Entrada 3
añade los valores individuales, primero sumando 5 y 4, y luego sumando 3 al resultado. En la expresión de abajo, 5+4 no puede reducirse de manera directa debido a las reglas PEMDAS. En vez de esto, el traductor acumula el siguiente número, 3, encima de la pila RPN, y luego realiza la multiplicación. Sólo entonces suma el resultado, 12, al 5 ubicado en la parte inferior de la pila. Existen numerosos libros acerca de la materia. El Dragon Book [2] es uno de los clásicos. Puede que no sea demasiado sencillo de leer, pero es indispensable. Además del generador de parser bottom-up, Parse::Yapp, que está basado en técnicas usadas por las herramientas de Unix lex y yacc ([5]), CPAN tiene también un generador de parser topdown, Parse::RecDescent. Parse::RecDescent tiene características completamente diferentes debido a las tecnologías de parseo utilizadas. [4] ofrece algunos ejemplos sobre cómo usar Parse::Yapp y Parse::RecDescent. Por último, podemos escribir parsers a mano. Esta opción es particularmente efectiva en programación funcional, como se ■ describe en [3] y [6].
RECURSOS [1] Listados de este artículo: http://www. linux-magazine.es/Magazine/ Downloads/19 [2] Compilers, Aho, Sethi, Ullman, Addison Wesley, 1986 [3] Higher Order Perl, Mark Jason Dominus, Morgan Kaufmann, 2005 [4] Pro Perl Parsing, Christopher M. Frenz, Apress, 2005 [5] lex & yacc, Levine, Mason & Brown, O.Reilly, 1990 [6] “Parser Combinators in Perl”, Frank Antonsen, theperlreview.com, Summer 2005
Número 19
49
DESARROLLO • Python
EXTENDIENDO XCHAT ¿Por qué escribir comandos de IRC cuando Python puede hacerlo por nosotros?
Los fanáticos del IRC encuentran pesado tener que escribir ciertas combinaciones de comandos cada vez que entran en un servidor. Pero XChat nos echa una mano mediante los scripts Python. POR JOSÉ MARÍA RUIZ
X
Chat (ver Recurso [1]) es uno de los más famosos clientes de mensajería IRC existentes. Es simple, gráfico y extensible. Y es esta última cualidad la que vamos a explotar gracias a Python. XChat soporta plugins en varios lenguajes de programación con los que nos podemos ahorrar muchos tecleos innecesarios. Vamos a automatizar la ejecución de ciertos comandos. Para comenzar es imprescindible que nuestra versión de XChat soporte módulos Python (documentación de referencia en Recurso [2]). En este artículo estoy empleando la versión 2.6.4, pero cualquiera superior a la 2.6.0 será parecida. Durante el arranque de XChat podemos ver si soporta módulos Python si aparece:
__module_name__ =U “Hola Mundo” __module_version__ = “1.0” __module_description__ =U “Ejemplo de módulo Python”
__module_name__ =U “Hola Mundo” __module_version__ = “1.1” __module_description__ =U “Ejemplo de módulo Python” import xchat xchat.command(“msg %s %s” %U (“#python-es”,”Hola a todos”))
print “¡Hola Mundo!”
Este es nuestro primer módulo, y como todo ejemplo simple, hace más bien poco. Básicamente muestra en la ventana de XChat la frase «¡Hola Mundo!» (ver Figura 1). Lo peor de todo es que ni siquiera manda esta frase como mensaje, sino que sólo aparece en nuestra ventana local como se puede apreciar en la Figura 1. Para cargarlo tenemos que ejecutar en la linea de comandos de XChat:
Para poder escribir un mensaje a un canal tenemos que emplear un comando de IRC, el comando msg que acepta dos parámetros, el canal y el texto a escribir. Para poder enviar comandos a XChat necesitamos usar la librería xchat que incorpora las funciones necesarias para interactuar con XChat. Pero este código no es muy polivalente, puesto que hemos puesto en una
/load /home/josemaria/p.py Python interface loaded
Pasemos a la acción con un par de ejemplos rápidos antes de enumerar las funciones de las que dispondremos:
«Hola mundo» Comenzaremos con el infame «Hola mundo» que a todos gusta:
50
Número 19
Hay que especificar la ruta, por eso aconsejo poner los plugins en el directorio personal, así podrán cargarse usando /load ejemplo.py. Es importante que los ficheros acaben en .py, en caso contrario XChat no sabrá cómo manejarlos. Prosigamos a algo más útil para que podamos mandar un mensaje a un canal:
WWW.LINUX- MAGAZINE.ES
Figura 1: Probamos nuestro plugin “Hola Mundo”.
Python • DESARROLLO
cadena el canal en el que nos encontramos. Necesitamos algo más dinámico, de manera que podamos ejecutar la función en un canal cualquiera y funcione: __module_name__ =U “Hola Mundo” __module_version__ = “1.2” __module_description__ =U “Ejemplo de módulo Python” import xchat chan = xchat.get_info(“channel”) xchat.command(“msg %s %s” %U (chan,”Hola a todos”))
Ahora se coge el nombre del canal con la función get_info() y lo empleamos para mandar el mensaje. get_info devuelve la información del canal donde hayamos cargado la función. En la Figura 2 se puede ver el resultado. Vamos a ver unas descripciones de las funciones que podremos usar en el desarrollo de nuestros scripts.
Funciones genéricas Comencemos con las funciones más simples. En la documentación se les denomina funciones genéricas, debido a que no tienen un uso predefinido o especial. Las dos primeras son xchat.prnt(cadena) y xchat.emit_print(nombre_evento, *argumentos). Ambas nos permiten escribir en la ventana de XChat, pero no enviar un mensaje al canal. Esta información
sólo la veríamos nosotros, es decir, sólo sirve para dar información de forma local. xchat.emit_print() imprimirá el mensaje cuando se genere el evento que le digamos. xchat.prnt() tiene ese nombre tan peculiar debido a que la función print() es especial en Python y no podemos definir otra que se llame igual. Los eventos posibles se pueden ver en XChat pulsando en la barra de menú en la opción «Configuración> Avanzado > Textos de eventos…». El nombre de evento debe ponerse entre “” puesto que Python espera una cadena de texto. Ejemplos de eventos serían: • • •
“Join”, alguien entra en el canal “Channel Message”, alguien escribe en el canal “Kick”, se ha echado (de una patada) a alguien de un canal
xchat.command(cadena) ejecuta el comando que le pasemos. Con esta función ya podemos escribir en un canal, empleando el comando IRC para ello. Hay dos maneras: • •
xchat.command(“msg %s %s” % (canal, mensaje)) xchat.command(“say %s” % (mensaje))
El primer comando escribe el mensaje en el canal que le digamos, mientras que el segundo comando lo hace en el que esté activo en ese momento. Por último, la función xchat.nickcmp(s1,s2) nos permite comparar nicks y nombres de canales. Parece extraño porque ¿para qué necesitamos
Listado 1: Algunos Datos de XChat 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
__module_name__ = “Datos del canal” __module_version__ = “1.0” __module_description__ = “Ejemplo de módulo Python” import xchat print “========================================” print print “Lista de usuarios:” print usuarios = xchat.get_list(“users”) for usuario in usuarios: print usuario.nick print print “Temática de el canal: “ +xchat.get_info(“topic”) print print “========================================”
WWW.LINUX- MAGAZINE.ES
Figura 2: El módulo prueba.py escribe la cadena en la ventana de X-Chat.
una función para algo que podemos hacer con comparación de cadenas de caracteres? Porque resulta que es necesario realizar la comparación según el RFC1459, el estándar donde se define el protocolo de IRC.
Funciones que devuelven información Existen 3 funciones que nos permiten extraer información de XChat. Con esta información podremos tomar decisiones, por ejemplo, si podemos usar ciertas características de XChat que sólo están presentes en sus últimas versiones. xchat.get_info(type) permite obtener una serie de datos sobre la sesión actual de XChat, como pueden ser: • • • • • • • • •
“away” mensaje de away “channel” canal en el contexto actual “host” hostname del servidor al que estás conectado “network” nombre de la red de servidores, en caso contrario none “nick” tu nick actual “server” Nombre del servidor al que estás conectado o None si no lo estás “topic” topic del canal actual “version” versión de Xchat “xchatdir” directorio de configuración de XChat (por ejemplo “/home/josemaria/.xchat2”)
xchat.get_prefs(nombre-preferencia) permite obtener los valores que normalmente puedes ajustar con /set. Estos valores son exclusivos de XChat, y van desde los colores que se están usando hasta el tipo de fuente que se ha configurado. Mientras que xchat.get_list(tipo) nos permite obtener listas de datos sobre los siguientes objetos: • • • •
“channels” canales “dcc” conexiones dcc “users” usuarios “ignore” usuarios ignorados
Número 19
51
DESARROLLO • Python
Listado 2: Nuestro Recordador. 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 28 29 30 31 32 33 34 35 36 37
version = “1.0” __module_name__ = “Saludos” __module_version__ = versión __module_description__ = “Módulo de XChat para recordar cosas” __module_author__ = “José María Ruiz Aguilera” import xchat # Variable global para almacenar el enganche y poder controlarlo enganche = None
/comando NICK josemaria word[0] = “comando” word[1] = “NICK” word[2] = “jose maria”
Mientras que word_eol guarda toda la cadena, desde el parámetro en cuestión hasta el final:
# si quedan menos de 10 minutos para las 00 se queja cada 5 segundos def parar_cb(word, word_eol, userdata): global enganche if enganche is not None: xchat.unhook(enganche) enganche = None print “¡Recordador desactivado!” def timeout_cb(userdata): print userdata return 1 # El 1 hace que siga ejecutándose
/comando NICK josemaria word_eol[0] = “comando NICKU josemaria” word_eol[1] = “NICK josemaria” word_eol[2] = “josemaria”
Sinceramente no logro entender la utilidad de word_eol, def arranca(word, word_eol,userdata): pero es obligatorio global enganche esperarlo en nuestra # arrancamos el contador de tiempo, multiplicando los segundos por 1000 función, por lo que # deberíamos controlar los parámetros pero por falta de espacio no es tendrá que ir en la # posible cabecera de la enganche = xchat.hook_timer(int(word[1])*1000, timeout_cb,userdata=word[2]) misma. userdata es un parámetro que xchat.hook_command(“ARRANCA”,arranca,help=”/arranca <segundos> <mensaje>”) puede contener valoxchat.hook_command(“PARA”, parar_cb) res que nosotros mismos pasemos a xchat.prnt(“Módulo «Recordado»”) la función de callxchat.prnt(“Puedes hacer que te recuerde algo cada cierta cantidad de segundos”) back. Veamos un ejemplo de las funciones que prioridades, y una vez que una Toda callback debe devolver un valor recogen información: un script que nos función se ejecuta, puede decidir de cuatro posibles. Es aquí donde se lista los usuarios presentes así como el impedir que se sigan ejecutando las decide si dejaremos que se sigan ejecu«topic», temática, del canal. El código de menor prioridad, lo que nos da tando las callbacks que queden en la aparece en el Listado 1 y el resultado es mucho juego. lista si las hubiese: el que aparece en la Figura 3. Pero antes de comenzar con las • EAT_PLUGIN, no permitimos que funciones de XChat para gestionar ningún otro plugin reciba este evento Funciones de enganche eventos debemos comprender los • EAT_XCHAT, no permitimos que Uno de los puntos fuertes de emplear parámetros que recibirán nuestras XChat dispare sus propias funciones scripts es que XChat posee un sistema de funciones de callback. con este evento eventos. Cada evento posee una lista de Una función de callback recibe en • EAT_ALL, no permitimos que nadie funciones, también llamadas «callbacks», XChat tres parámetros: más use este evento (ni otras callbacks dentro de nuestro módulo) a las que se debe llamar si el evento • word • EAT_NONE, dejar que todo ocurra de acontece. Podemos insertar nuestras pro• word_eol forma normal pias funciones dentro de esa lista, y • userdata Puede haber varios módulos esperando además tendremos algo de control sobre en qué punto de la lista serán insertadas. La lista que se asigna a cada evento está ordenada por
52
Número 19
El parámetro word es una lista con cada parámetro que acompañe al comando:
WWW.LINUX- MAGAZINE.ES
este evento, y cada módulo tener varias callbacks esperándolo. Con el valor de salida de la función de callback
DESARROLLO • Python
controlamos qué ocurrirá después de que procesemos este evento. Ahora ya estamos listos para ver las funciones que asignan las callbacks.
Funciones de enganche xchat.hook_command(nombre, callback, userdata=None, priority=PRI_NORM, help=None) nos permite asignar un comando a una callback. Imaginemos que queremos automatizar una acción, digamos autoinvitarnos a un canal y entrar en él, entonces tendríamos que usar el siguiente código: 01 __module_name__ = “Autoinvitado” 02 __module_version__ = “0.1” 03 __module_description__ = “Ejecutamos dos comandos” 04 import xchat 05 06 def autoinvita (word, word_eol,userdata): 07 xchat.command(“chanserv invite #micanal”) 08 xchat.command(“join #micanal”) 09 return None 10 11 xchat.hook_command(“entra”, autoinvita, help=”/entra”)
Después de cargar el script sólo tendríamos que usar el comando /entra y se ejecutaría la función autoinvita. xchat.hook_print(name, callback, userdata=None, priority=PRI_NORM) permite capturar eventos de impresión, cualquier cosa que se imprima en XChat. Mientras que xchat.hook_server(name, callback, userdata=None, priority=PRI_NORM) captura eventos
del servidor, como pueden ser PRIMSG, NOTICE, o PART. xchat.hook_timer(timeout, callback, userdata=None) te puede granjear muchos enemigos, puesto que sirve para ejecutar una callback cada cierta cantidad de milisegundos. Puede hacer que cada 10 segundos digas algo gracioso o no demasiado acertado. La decisión es personal. Yo personalmente uso este tipo de enganche para generar mensajes y por tanto probar el resto de callbacks que se disparan cuando algo se imprime. xchat.hook_unload(timeout, callback, userdata=None) se dispara cuando se descarga un plugin, se puede usar para imprimir por pantalla su descarga o hacer tareas de limpieza. Y por último xchat.unhook(handler) elimina la función reflejada por handler que se registró con anterioridad. Todas las funciones hook_ devuelven un handler, así que es posible guardarlo en una variable para posteriormente desactivarlo.
Gestión de contexto El último grupo de funciones son las encargadas de gestionar lo contextos. XChat posee pestañas, y las pestañas contienen una conversación en un canal o privada dentro de un servidor. A esta información se le denomina contexto en el argot de XChat. Por el momento hemos estado usando el contexto xchat que engloba a toda la aplicación. xchat.get_context() nos devuelve el contexto actual y xchat.find_context(server=None, channel=None) localiza el contexto que pertenece al servidor y canal que le especificamos. Una vez tengamos el contexto necesario podemos hacer uso de sus funciones, como pueden ser micontexto.prnt() o micontexto.command().
Creemos un plugin
Figura 3: El módulo Datos del canal imprime los usuarios y la temática del canal.
54
Número 19
Ahora que disponemos de todas las herramientas necesarias para comunicarnos con XChat, podemos crear algo útil. Digamos que eres una persona despistada, como lo es el autor del artículo, y mientras
WWW.LINUX- MAGAZINE.ES
Figura 4: El módulo Recordador nos imprime un recordatorio cada cierto tiempo en la ventana del canal.
hablas con otras personas usando XChat se te olvidan las cosas. He creado un script que hace uso de algunos de los conceptos explicados. Su misión es permitir al usuario mostrar por pantalla un mensaje usando intervalos en segundos. El usuario podrá activar y desactivar los mensajes. Para ello he creado dos comandos /arranca segundos mensaje y /para. Arranca activa un enganche que se dispara según la cantidad de segundos especificada. Con para podemos parar la aparición del mensaje en cualquier momento. Todo el código está en el Listado 2 y en la Figura 4 podemos ver el resultado. ¿Qué podemos hacer para que cargue cada vez que lo haga XChat? Es tan simple como poner el fichero que contenga nuestro script dentro del directorio ~/.xchat2. Cuando XChat arranca comprueba ese directorio en busca de script para ejecutar.
Conclusión El interfaz de XChat puede resultar algo complicado de entender, pero una vez se hayan visto unos cuantos ejemplos no es tan complicado de manejar. Quizá lo que más puede dificultar nuestra tarea es la escasa documentación, así como el reducido número de ejemplos que podemos encontrar en Internet. Aún con todo esto, es una ayuda imprescindible para aquellos que pasamos muchas horas en canales de IRC. Ya no hay excusa para automatizar esas combinaciones de comandos tan ■ complicados a veces.
RECURSOS [1] http://www.xchat.org [2] http://labix.org/xchat-python
La Columna de Charly • ADMINISTRACIÓN
El Día a Día del Administrador de Sistemas: Nmap 4
LA DIETA DE FYODOR Muchas herramientas van creciendo con cada versión nueva, pero Nmap 4.00 ha perdido peso gracias al proyecto Diet-Nmap. La última encarnación de Nmap no es sólo más rápida, sino que también consume menos memoria. POR CHARLY KÜHNAST
SYSADMIN AppArmor . . . . . . . . . . . . . . . . . . . .56
AppArmor construye una cárcel virtual para proteger las aplicaciones que se están ejecutando en su ordenador. Clusters Tomcat . . . . . . . . . . . . . . .60
Vemos cómo ejecutar aplicaciones críticas con alta disponibilidad y balanceo de carga con Apache Tomcat.
Engañar es Placentero El parámetro —badsum también es nuevo. Le indica a Nmap que envíe paquetes TCP o UDP con un checksum incorrecto a la tarjeta del host. La mayoría de los ordenadores que reciben un paquete como éste lo suprimen inmediatamente, pero si Nmalp recibe una respuesta, puede suponer que la tarjeta sea un cortafuegos o IDS que no tiene problemas con la inspección de checksums. Ahora la herramienta puede alterar fácilmente su propia dirección MAC utilizando la opción de la línea de comandos —spoofmac dirección MAC. Nmap soporta diversas versiones de sistemas operativos utilizando el parámetro O. Por ejemplo, he escaneado un router en mi laboratorio utilizando el comando nmap -O 10.0.0.50. He obtenido la siguiente salida de Nmap 3.70 (reducido a lo esencial): MAC Address: 00:05:5E:96:3D:00U (Cisco Systems) No exact OS matches for host
Nmap 4.0 proporciona un mensaje más detallado: Device type: router Running: Cisco IOS 12.X OS details: Cisco 2600 U router running IOS 12.2(3), Cisco router running IOS 12.1
Lo mismo se aplica a las versiones. Si quiero encontrar la versión del servicio IMAP que se está ejecutando en un servidor, puedo teclear nmap -sV 10.0.0.88 -p143 para obtenerla:
WWW.LINUX-MAGAZINE.ES
143/tcp open imap U UW imapd 2004.352
Nmap siempre ha sido un medio fantástico de detección de gente no deseada en tu red, y de evitar la pérdida de toneladas de papel mediante el escaneado de impresoras. Las impresoras de red a menudo escuchan en el puerto 9100, y más de unos cuantos modelos convierten cualquier dato para enviarlo a este puerto como copia impresa. Los desarrolladores de Nmap 4.00 han incluido actualmente una característica para ahorrar papel de manera elegante. Cuando introduzco nmap -sV printer -p 9100, primero estoy preguntando: 9100/tcp open jetdirect? U Excluded from version scan
que evita la avalancha de papel. Pero esta técnica para ahorrar papel no significa que Fyodor sea un aguafiestas. Si realmente decide que quiere gastar papel, puede decirle al cerebro de ocho años de Fyodor que escanee —allports, extendiendo la avalancha de papel durante ■ siete años en la siguiente generación.
RECURSOS [1] Nmap: http://www.insecure.org/nmap/
EL AUTOR
L
a herramienta Network Mapper, o Nmap [1], es mi compañera preferida. Recientemente, su inventor Fyodor celebró el octavo cumpleaños de su invención y como regalo ha recibido una dieta de código con muchas funciones nuevas y útiles. Una de las más interesantes es el escaneado de ARP. El sistema operativo utiliza peticiones ARP para preguntar la dirección MAC de la tarjeta de red. Nmap realiza esta tarea para el sistema operativo y como resultado, el escáner Nmap genera una colección útil de datos fiables del número y tipo de equipos activos en la red. Esta característica elimina la necesidad de hacer ping o trucos parecidos. (Pinging es una técnica imprecisa, de todas formas, no es necesario que el host responda). No necesita familiarizarse con una nueva sintaxis. Cuando escanea la red local, Nmap escoge automáticamente el escaneado ARP más efectivo, incluso si se especifica -sP (Ping Scan) en la línea de comandos. De acuerdo a las páginas de ayuda, esto sólo ocurre si ejecuta Nmap con los privilegios de superusuario. Si quiere indicarle a la herramienta que guarde su comportamiento anterior, necesita especificarle el parámetro —send-ip.
Charly Kühnast es Administrador de Sistemas Unix del centro de datos de Moers, cerca del famoso río Rin. Sus tareas incluyen velar por la seguridad del cortafuegos y ocuparse de la DMZ.
Número 19
55
ADMINISTRACIÓN • AppArmor
Fortificando el Sistema con AppArmor
JAULA DORADA
Tras penetrar en un sistema remoto, los intrusos podrían pensar que ya han pasado la parte más dura y están a salvo, pero AppArmor les va a estropear la diversión, encerrándolos en una jaula virtual. POR RALF SPENNEBERG
N
adie es perfecto, algo que es particularmente cierto en el mundo del software. Cualquier aplicación que no sea trivial contendrá errores de programación que serán aprovechados por los hackers para hacerse con el control del software, haciendo que los programas realicen tareas que sus desarrolladores jamás llegaron a pensar. La situación comienza a ser crítica cuando la aplicación posee privilegios diferentes de los privilegios del atacante. Por ejemplo, el comando ping necesita de los privilegios de superusuario para poder enviar el formato especial de paquete que utiliza. Aunque teóricamente es posible hacer un mal uso de estos privilegios para causar toda clase de problemas. A pesar de que el comando ping es un programa con un buen comportamiento, un atacante capaz de hacerse con la herramienta tendría acceso sin restricciones al resto del sistema. AppArmor [1] modifica esta situación. En vez de permitir a un programa de
56
Número 19
competir con sistemas más complejos como SELinux o RSBAC, pero de nuevo, la configuración de estas alternativas requiere más conocimientos sobre la administración de sistemas.
Fortificado root el acceso sin restricciones a todo el sistema, asigna límites con la intención de obtener un balance entre efectividad y complejidad. AppArmor utiliza un mecanismo simple y transparente para proporcionar un estándar alto de protección, similar al de Systrace. No intenta
Listado 1: Compilando un kernel compatible con AppArmor 01 tar xjf linux-2.6.15.tar.bz2 02 cd linux-2.6.15 03 patch -p1 <../aa_2.0-2.6.15.patch 04 patch -p1 <../aa_namespace_sem-2.6.15. patch 05 make oldconfig 06 make bzImage 07 make modules 08 make modules_install 09 make install 10 rmdir /subdomain 11 ln -s /sys/kernel/security/ subdomain /subdomain
WWW.LINUX-MAGAZINE.ES
Además de todos los obstáculos adicionales, la primera regla de seguridad es evitar las vulnerabilidades. En un ordenador protegido con AppArmor, o en cualquier sistema de esta clase, deben deshabilitarse todos los servicios que no se necesiten, tener los últimos parches instalados y utilizar una configuración a medida cuidadosamente estudiada. Esto deja a AppArmor con un sistema libre de vulnerabilidades conocidas hasta la fecha y libre de exploits. AppArmor monitoriza los ficheros y las aplicaciones accedidas y el tipo de acceso de que se trate; al mismo tiempo, gobierna el uso de los privilegios de superusuario. Dependiendo de la versión del kernel, Linux puede distinguir entre 29 capacidades diferentes (véase man 7 capabilities). Por ejemplo, CAP_KILL se refiere a la habilidad del superusuario de terminar un proceso y CAP_NET_RAW a la de crear paquetes de red arbitrarios. En el caso del comando ping, AppArmor le asignaría el uso de CAP_NET_RAW, pero le denegaría el uso de CAP_KILL. Esto impediría a un
AppArmor • ADMINISTRACIÓN
Figura 1: AppArmor mantiene un perfil para cada aplicación protegida.
atacante la posibilidad de matar otros procesos.
AppArmor en Linux Las distribuciones Novell SLES9 y Suse Linux 10.0 vienen con el sistema AppArmor por defecto. AppArmor no era libre por
entonces (véase el cuadro “Immunix”). Tras la aparición de la versión de AppArmor bajo la licencia GPL, Novell ha anunciado ahora que integrará AppArmor en OpenSUSE 10.1. Si no se desea esperar, puede utilizarse OpenSUSE 10.0, aunque la instalación es bastante compleja. Entre otras cosas habrá
Immunix Novell adquirió Immunix a mediados de 1995. Immunix se ha especializado en el desarrollo de soluciones de seguridad durante años. La compañía modificó el GCC, conocido como StackGuard, para que compilase las aplicaciones de modo que impidiese los diversos tipos de problemas relacionados con los desbordamientos de búfers. Para ello, StackGuard utiliza el denominado canario. Este sistema genera números aleatorios cuando el programa se ejecuta. Antes de cada llamada a una subrutina almacena los valores canarios en la pila. Si el valor se ve modificado cuando el programa regresa, se termina con la sospecha de un desbordamiento de búfer. (El término canario viene de la minería, cuando los mineros utilizaban canarios para asegurarse de que la atmósfera estaba libre de acumulaciones de monóxido de carbono). Immunix también lideró el desarrollo de la interfaz LSM (Linux Security Modules [2]) en el kernel 2.6. Esta interfaz le permite a los módulos del kernel monitorizar los eventos críticos con respecto a la seguridad en diversos puntos. Algunos sistemas seguros utilizan LSM, como LIDS (Linux Intrusion Detection System) y SELinux (Security Enhanced Linux). Este último desarrollado por la NSA (National Security Agency, USA) implementa un sistema MAC (Mandatory Access Control) que permite a los administradores definir políticas detalladas de permisos de accesos. Este conjunto restrictivo de políticas puede incluso monitorizar y restringir al superusuario, root, y todas sus actividades.
que modificar y recompilar el kernel, por lo que la actualización no está recomendada para usuarios sin experiencia. Los RPMs de AppArmor para OpenSUSE 10.0 están disponibles en Novell Forge [3]. Aunque Suse/Novell compilaron los RPMs para OpenSUSE 10.1 Alpha, también funcionan en OpenSUSE 10.0. La instalación sigue los pasos habituales, rpm -ivh nombre-paquete.rpm. El kernel también requiere el soporte para AppArmor. Novell dispone de los parches necesarios en [4]; los parches están diseñados para la versión original del kernel 2.6.15 [5]. Para compilar un kernel compatible con AppArmor, hay que cargar tanto el kernel original como los parches aa_2.0-2.6.15.patch y aa_namespace_sem-2.6.15.patch. Luego tan sólo hay que seguir los pasos del Listado 1. También es posible instalar AppArmor en sistemas que no sean Suse, como Debian o Fedora. Sin embargo, esto implica la compilación de los archivos con el código fuente y realizarlo sin un GUI, como GUI se entiende que corre Yast 2.
Arranque y Parada Suse dispone de controles basados en el GUI para ejecutar AppArmor. Se ejecuta
Perfiles El paquete de AppArmor contiene perfiles para los siguientes servidores: • Postfix • Apache (en modo prefork) • Squid • OpenSSH server • NTP server • Name Service Caching Daemon (ncsd) • Identd • Protocol services Klogd and Syslogd También dispone de perfiles para diversos programas clientes: • Acrobat Reader • Ethereal • Opera • Firefox
Como las distribuciones actuales de Novell/Suse Linux poseen el soporte a nivel del kernel para el programa SELinux, no necesita las políticas necesarias para que funcione.
• Evolution
El sistema AppArmor es también de Immunix. Novell ha posicionado a AppArmor como una alternativa simple y efectiva a SELinux. SELinux es una solución que requiere una compleja configuración, sin embargo, AppArmor simplemente tiene como objetivo las aplicaciones individuales y los eventos críticos. A finales de enero de 2006, Novell sacó a la luz el código fuente de AppArmor bajo la licencia GPL e inmediatamente publicó el código en su propio sitio web [3].
• Realplayer
WWW.LINUX-MAGAZINE.ES
• Gaim
• Man • Netstat • Ping • Traceroute
Número 19
57
ADMINISTRACIÓN • AppArmor
Se ejecuta la aplicación y se maneja durante un rato. Hay que asegurarse de utilizar todas las funciones de Kpdf. Pero también hay que asegurarse de que en la fase de aprendizaje es imposible que se produzca un ataque. AppArmor posteriormente permitirá todas las funciones que Kpdf utilice ahora. Tras la ejecución de la lista completa de funciones, se puede cerrar la aplicación. Ahora pueden analizarse los resultados grabados en el perfil del asistente. Para ello, se selecciona Scan system log for AppArmor events (Figura 3).
Procesos Hijos
Figura 2: Kpdf mostrando un documento PDF. Si el documento fuera de un atacante, éste podría explotar alguna vulnerabilidad en el PDF.
Yast y se selecciona AppArmor en la columna de la izquierda. Luego aparece en la derecha la barra de control de AppArmor. Aquí es donde se puede comprobar el estado actual de AppArmor y donde se puede habilitar. Si se prefiere puede utilizar se la línea de comandos: introduciendo rcsubdomain start y rcsubdomain stop (como root). Para que AppArmor funcione, la herramienta debe ejecutarse antes de que arranquen las aplicaciones protegidas. Esto es por lo que AppArmor se ejecuta en el arranque del sistema. El programa también necesita un fichero de perfil en /etc/subdomain.d para cada aplicación que vaya a proteger.
Autoprotección Novell posee perfiles para una gran cantidad de comandos críticos (véase el cuadro “Perfiles”). Voy a utilizar el visor de ficheros Kpdf (Figura 2) para mostrar lo fácil que resulta la generación de un
Probando AppArmor Cuando se utilice el asistente para crear un perfil, no incluirá el comando print. Esto significa que el asistente no incluirá la función en el perfil. De este modo cuando se use posteriormente Kpdf, se observará que todas las funciones están disponibles como siempre, excepto que no se podrá imprimir.
58
Número 19
perfil gracias al modo de aprendizaje de AppArmor. En los últimos años se han descubierto diversos errores de programación en varios visores PDF, como Xpdf y Kpdf. Un atacante que supiera de estos errores podría manipular un fichero PDF para inyectar y ejecutar un código dañino y hacerse con el control del visor de PDF. Para añadir Kpdf a la lista de programas que AppArmor monitoriza, hay que ejecutar Yast 2 y seleccionar el asistente de perfiles bajo AppArmor. Se comienza introduciendo el nombre de la aplicación y su ruta completa. Si no se conoce la ruta, se puede teclear which kpdf para averiguarla. La ruta en Suse Linux es /opt/kde3/bin/kpdf.
Tras completar el análisis de eventos, que puede llevar unos cuantos minutos, el asistente pregunta si se desean permitir todos los tipos de accesos, sugiriendo una acción para cada uno. Si el programa monitorizado invoca a otro programa, por ejemplo, el asistente de perfiles proporciona las siguientes opciones: • Inherit: Las mismas restricciones de Kpdf se aplican a la nueva aplicación Kdialog. • Profile: Esta aplicación posee su propio perfil. • Unconfined: AppArmor no monitorizará este programa. • Deny: Se impedirá la ejecución de la nueva aplicación. Unconfined es una opción, ya que el Kpdf utiliza el programa KDialog para abrir y cerrar ficheros. Como esto da al programa completa libertad, el asistente advierte de posibles vulnerabilidades (Figura 4). Podría ser mejor crear un perfil para KDialog para restringir el acceso del programa sólo a los ficheros PDF.
Listado 2: Incluyendo Abstractionsv 01 # vim:syntax=subdomain 02 # Last Modified: Sun Jan 22 10:16:55 2006 03 /opt/kde3/bin/kpdf flags=(complain) { 04 #include <abstractions/authentication> 05 #include <abstractions/base> 06 #include <abstractions/bash> 07 #include <abstractions/gnome> 08 #include <abstractions/kde> 09 #include <abstractions/nameservice> 10 #include
WWW.LINUX-MAGAZINE.ES
<abstractions/user-write> 11 12 / r, 13 /etc r, 14 /etc/X11/.kstylerc.lock rw, 15 /etc/X11/.qt_plugins_3.3rc.loc k rw, 16 /etc/X11/.qtrc.lock rw, 17 /etc/exports r, 18 /etc/rpc r, 19 ... 20 }
AppArmor • ADMINISTRACIÓN
Figura 3: AppArmor grabando eventos para el análisis.
Acceso a Fichero Tras tomar una decisión sobre cada aplicación que Kpdf llama, el asistente pregunta sobre los ficheros usados por Kpdf. Se puede escoger Allow para permitir el acceso a la mayoría de los ficheros. El asistente tiene una directiva incluida para ciertos ficheros. Muchas aplicaciones necesitan acceder a los ficheros de configuración de KDE. En vez de permitir el acceso a cada fichero individualmente y saturar innecesariamente el perfil, simplemente se le puede añadir una plantilla a éste. Para ello se utiliza la línea #include <abstractions/kde>. Las plantillas para los perfiles son referidas como abstracciones en la jerga de AppArmor. AppArmor viene con una colección de abstracciones adicionales para el intérprete de comandos Bash y para el DNS, por ejemplo. Tras contestar todas las preguntas se regresa a la pantalla de bienvenida del asistente. El perfil se almacena en /etc/subdomain.d/opt.kde3.bin.kpdf (véase el Listado 2 para una muestra). Ahora ya se puede quitar el asistente de perfiles y cerrar la aplicación.
Afinando Si la aplicación falla a la hora de funcionar como se esperaba, sólo hay que ejecutar el asistente de perfiles de nuevo y repetir el proceso de aprendizaje. El asistente primero analiza el perfil existente y luego actualiza los cambios efectuados en él. Cualquier
Figura 4: Cuando se selecciona Unconfined, el asistente advierte sobre el potencial riesgo de seguridad.
Figura 5: Yast 2 permite la edición del perfil de AppArmor.
entrada que se haya añadido manualmente por medio de un editor se conservará. Después de cada entrada manual, hay que reejecutar AppArmor para indicarle a la herramienta que cargue de nuevo el perfil. Como alternativa, se podría utilizar Yast 2 y elegir o bien actualizar el perfil o seleccionar el icono con el bolígrafo para editar un perfil (Figura 5). Como los servicios de red están expuestos al peligro constantemente, Novell proporciona el programa unconfined, que descubre los servicios de red que se están ejecutando en el sistema y muestra su estado bajo AppArmor. La salida proporcionada en el Listado 3 muestra que el sistema del ejemplo está ejecutando CUPS y que el portmapper RPC no está siendo monitorizado. Novell no tiene perfiles para estos servicios. En las próximas semanas y meses, se espera que Novell amplíe los perfiles disponibles. Si se está interesado en seguirle la pista
Listado 3: Mostrando el estado de AppArmor 01 # unconfined 02 7988 /usr/lib/postfix/master confined by ‘/usr/lib/postfix/master (enforce)’ 03 7988 /usr/lib/postfix/master confined by ‘/usr/lib/postfix/master (enforce)’ 04 8025 /usr/sbin/cupsd not confined 05 8025 /usr/sbin/cupsd not confined 06 8081 /sbin/portmap not confined 07 8081 /sbin/portmap not confined 08 8109 /usr/sbin/sshd confined by ‘/usr/sbin/sshd (enforce)’
WWW.LINUX-MAGAZINE.ES
a los desarrollos, hay que revisar la lista de correo [6] y consultar de vez en cuando el sitio web de AppArmor [1].
Bien Protegido AppArmor monitoriza las aplicaciones críticas. Los programas sólo tienen permitido el acceso a los ficheros especificados y únicamente pueden invocar a una serie de comandos específicos. Si la aplicación tiene un agujero de seguridad que pudiera permitirle a un atacante ejecutar un intérprete de comandos u otros comandos con los privilegios de la víctima, surge AppArmor para proteger el sistema. La aplicación se ejecuta en una especie de caja de arena, o jaula, y es incapaz de salir de ella. AppArmor no puede evitar las vulnerabilidades, pero puede impedir que los atacantes puedan explotarlas en su beneficio. Esto protege de forma efectiva a los usuarios de aquéllos. AppArmor está altamente recomendado para los programas que son accesibles a través de la red o que manejen datos de fuentes poco fiables como correos electrónicos, imágenes, vídeos o documentos ■ ofimáticos.
INFO [1] AppArmor: http://www.opensuse. org/AppArmor [2] LSM: http://lsm.immunix.org [3] Paquetes AppArmor: http://forge. novell.com/modules/xfcontent/ downloads.php/apparmor/Stable [4] Parches del Kernel para AppArmor: http://forge.novell.com/modules/ xfcontent/downloads.php/apparmor/ Development/ [5] Kernel repository: http://www.kernel. org [6] Lista de correo de AppArmor: http:// forge.novell.com/mailman/listinfo/ apparmor-general
Número 19
59
ADMINISTRACIÓN • Cluster
Cómo configurar Tomcat en cluster
REPLICACIÓN DE SESIONES
En los entornos empresariales suele ser un requisito tener en funcionamiento aplicaciones críticas ejecutándose en alta disponibilidad y balanceo de carga entre varios servidores. Veamos cómo se configura Apache Tomcat para estos menesteres. POR CAYETANO DELGADO ROLDÁN
A
pache Tomcat es un contenedor de servlets desarrollado en Java por la Apache Software Foundation que implementa las especificaciones de JSP (Java Server Pages) y Servlets de Sun Microsystems. A partir de la versión 5.0, Tomcat incluye la posibilidad de configurar varias instancias en cluster. ¿Por qué íbamos a querer configurar Tomcat en cluster? Pues porque los beneficios que se obtienen son múltiples: vamos a tener alta disponibilidad y alto rendimiento, ya que el tráfico y ejecución se distribuirán entre varias máquinas, y por otro lado, se obtiene tolerancia a fallos, ya que la caída de una de las máquinas no va a afectar al funcionamiento de las aplicaciones, quedando un resultado transparente para el usuario. Existen varios modelos distintos a la hora de configurar un sistema que ofrezca posibilidades de alta disponibilidad, tolerancia a fallos y escalabilidad. Por ejemplo, la arquitectura mostrada en la Figura 1, donde cada servicio (Apache, Tomcat y BD) estará ubicado separadamente en máquinas distintas. Esta solución está claro que es la que mayor coste supone (por la cantidad de “hierro”
60
Número 19
implicado), pero también hay que tener en cuenta que los servidores pueden ser compartidos entre varias aplicaciones que funcionen en entornos similares. Puede verse un listado de direcciones IP de ejemplo en la Tabla 1. La definición de clustering en Tomcat tiene mucho que ver con el replicado de sesiones, que no es más que distribuir una sesión HTTP entre los distintos nodos de los que se compone el cluster, sesión cuyo estado se mantiene en una cookie dentro del navegador. Existen tres formas de habilitar el replicado de sesiones: • Usando persistencia de sesiones y guardándolas en un sistema de ficheros compartido • Usando persistencia de sesiones y guardándolas en una base de datos compartida • Usando replicación en memoria mediante SimpleTcpCluster incluido en las últimas versiones de Tomcat 5 Junto a la réplica de sesiones, un concepto bastante popular en la implementación de clusters es el despliegue en granja, que permite desplegar una aplicación en un nodo del cluster y que dicho despliegue se replique en
WWW.LINUX-MAGAZINE.ES
todos los servidores del cluster. Para el replicado de sesiones y despliegue en granja se utilizan peticiones (pings) multicast, que no es más que enviar la información en una red a múltiples destinos simultáneamente, enviándose una sola vez y copiándose a nivel de enlace a todos los rincones de la red. Evidentemente, esto genera demasiado tráfico, por lo que hay que tener cuidado con él y filtrar los pings multicasts en switchs gestionados.
Figura 1: Arquitectura modelo de los distintos sistemas en cluster.
Cluster • ADMINISTRACIÓN
Instalación en nodos Al estar desarrollado en Java, Tomcat va a funcionar en cualquier sistema operativo y plataforma para la que exista una máquina virtual, así que la instalación y configuración definida a continuación debería ser similar en cualquier entorno. Nosotros vamos a usar Linux, como no iba a ser de otro modo, concretamente la distribución CentOS, aunque también habrá algunas referencias a Debian. La instalación y configuración inicial de Tomcat se detallará para uno de los nodos del cluster (nodo1) y luego se especificarán los cambios necesarios para replicar la instalación en el segundo nodo (nodo2). Antes de instalar Tomcat, hay que tener instalada y configurada una máquina virtual de Java (JVM), de Sun o IBM, versión
Listado 1: Ejemplo de jk.conf 01 LoadModule jk_module modules/mod_jk.so 02 <IfModule mod_jk.c> 03 JKWorkersFile “conf/workers.properties” 04 JkLogFile “logs/mod_jk.log” 05 JkLogLevel error 06 JkMount /* front
1.5.0, que se puede descargar desde la página de Sun [1] y que instalaremos, por ejemplo, en /opt/jdk1.5.0_07, directorio que será el contenido de la variable de entorno $JAVA_HOME, que puede definirse en el fichero /etc/profile.d/java.sh (en CentOS) o /etc/profile (en Debian). La instalación de Tomcat es bastante sencilla, basta con descargar de la web de Tomcat [2] el paquete “Core” correspondiente a la versión 5.5.17, y descomprimir, por ejemplo, en /opt/tomcat55-nodo1. Este directorio se puede almacenar en la variable de entorno $CATALINA_HOME. Por defecto, Tomcat viene configurado con su propio servidor web autónomo configurado en el puerto 8080. El puerto 8005, además, se utiliza para enviar los comandos de gestión al servidor Catalina. Es importante tener esto en cuenta ya que es uno de los errores típicos que nos podemos encontrar si esos puertos ya estuviesen en uso por cualquier otro proceso. Como el propósito de este artículo no es una introducción a Tomcat, para aquellos que quieran conocer en profundidad cómo funciona y se configura, tendrán que pasarse por la documentación oficial disponible en [3]. De todas formas, a modo de resumen rápido, para iniciar Tomcat
WWW.LINUX-MAGAZINE.ES
bastaría con ejecutar el script $CATALINA_HOME/bin/startup.sh, o bien el script $CATALINA_HOME/bin/shutdown.sh para detener la ejecución. Respecto a la configuración, se realiza en el fichero $CATALINA_HOME/conf/server.xml, que no es más que un fichero XML con una serie de directivas: • <Server> es el elemento raíz de toda la configuración. • <Service> representa un grupo de conectores. • <Connector> representa las interfaces de clientes externos que envían peticiones a (y reciben respuestas de) un Service particular, pueden ser de tipo HTTP y AJP. • Contenedores, que son los componentes que procesan las peticiones recibidas y generan las correspondientes respuestas. Un contenedor de tipo
Tabla 1: Direcciones IP de servidores Servidor Servidor web Tomcat nodo1 Tomcat nodo2 Servidor BD
IP 192.168.10.1 192.168.10.2 192.168.10.3 192.168.10.4
Número 19
61
ADMINISTRACIÓN • Cluster
Listado 2: Ejemplo de configuración CATALINA_HOME/conf/server.xml 01 <Server port=”8005” shutdown=”SHUTDOWN”> 02 <Listener className=”org.apache.catalina. core.AprLifecycleListener” /> 03 <Listener className=”org.apache.catalina. mbeans.ServerLifecycleListener” /> 04 <Listener className=”org.apache.catalina. mbeans.GlobalResourcesLifecycle Listener” /> 05 <Listener className=”org.apache.catalina. storeconfig.StoreConfigLifecycl eListener”/> 06 07 <GlobalNamingResources> 08 <Resource name=”UserDatabase” auth=”Container” 09 type=”org.apache.catalina.UserD atabase” 10 description=”User database that can be updated and saved” 11 factory=”org.apache.catalina.us ers.MemoryUserDatabaseFactory” 12 pathname=”conf/tomcat-users.xml ” /> 13 </GlobalNamingResources> 14 15 <Service name=”Catalina”> 16 <Connector address=”192.168.10.2” port=”8009” emptySessionPath=”true” 17 enableLookups=”false” protocol=”AJP/1.3” /> 18 19 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”nodo1”> 20 <Realm className=”org.apache.catalina. realm.UserDatabaseRealm” 21 resourceName=”UserDatabase”/> 22 <Host name=”localhost” appBase=”webapps” unpackWARs=”true”
62
Número 19
autoDeploy=”true” xmlValidation=”false” xmlNamespaceAware=”false”> 24 <Context path=”/servlets-examples” reloadable=”true” docBase=”servlets-examples” distributable=”true”/> 25 <Cluster className=”org.apache.catalina. cluster.tcp.SimpleTcpCluster” 26 managerClassName=”org.apache.ca talina.cluster.session.DeltaMan ager” 27 expireSessionsOnShutdown=”false ” 28 useDirtyFlag=”true” 29 notifyListenersOnReplication=”t rue” 30 clusterName=”TOMCAT cluster”> 31 32 <Membership 33 className=”org.apache.catalina. cluster.mcast.McastService” 34 mcastAddr=”228.0.0.4” 35 mcastPort=”45564” 36 mcastFrequency=”500” 37 mcastDropTime=”3000”/> 38 39 <Receiver 40 className=”org.apache.catalina. cluster.tcp.ReplicationListener ” 41 tcpListenAddress=”192.168.10.2” 42 tcpListenPort=”4001” 43 tcpSelectorTimeout=”100” 44 tcpThreadCount=”6”/> 45 46 <Sender 47 className=”org.apache.catalina.
cluster.tcp.ReplicationTransmit ter”
23
WWW.LINUX-MAGAZINE.ES
48 replicationMode=”pooled” 49 ackTimeout=”15000”/> 50 51
<Valve className=”org.apache.catalina. cluster.tcp.ReplicationValve”
52 filter=”.*\.gif;.*\.js;.*\.jpg; .*\.png;.*\.htm;.*\.html;.*\.cs s;.*\.txt;”/> 53 <Valve className=”org.apache.catalina. cluster.session.JvmRouteBinderV alve” 54 enabled=”true” /> 55 <ClusterListener className=”org.apache.catalina. cluster.session.JvmRouteSession IDBinderListener” /> 56 <Deployer className=”org.apache.catalina. cluster.deploy.FarmWarDeployer” 57 tempDir=”${catalina.base}/war-t emp/” 58 deployDir=”${catalina.base}/war -deploy/” 59 watchDir=”${catalina.base}/warlisten/” 60 watchEnabled=”true”/> 61 62 <ClusterListener className=”org.apache.catalina. cluster.session.ClusterSessionL istener”/> 63 </Cluster> 64 </Host> 65 </Engine> 66 </Service> 67 </Server>
Cluster • ADMINISTRACIÓN
Tabla 2: Directorios de Tomcat Directorio bin/ common/ conf/ logs/ server/ shared/ temp/ webapps/ work/
Descripción Contiene los scripts de inicio y parada Es donde se guardan los paquetes y clases comunes a todas las aplicaciones Ficheros de configuración Ficheros de trazas y depuración Clases y paquetes de Tomcat Similar al directorio common/ Ficheros temporales Directorios y paquetes de aplicaciones Directorios de trabajo en tiempo de ejecución
<Engine> recibe todas las respuestas de un <Service>, un <Host> gestiona todas las peticiones de un determinado host virtual y un <Context> gestiona las peticiones de una determinada aplicación web. • Otros componentes, que pueden residir dentro de un <Container> o de un <Context>. Ahora vamos a por la configuración. La verdad es que pueden dejarse por defecto la inmensa mayoría de los parámetros, algunos de ellos se pueden quitar porque están comentados, o simplemente porque están activados a modo de ejemplo, pero no suelen ser necesarios. Respecto a los que se pueden quitar o. por el contrario son imprescindibles, nos lo irá dando la experiencia de instalación de tipo de entornos. La parte que hace referencia a la configuración del cluster viene comentada por defecto, por lo que habría que quitar los comentarios <!— —> que engloban a <Cluster> </Cluster>. Las etiquetas de Cluster se pueden poner tanto a nivel de <Engine> como a nivel de <Host>, con lo que conseguiremos, respectivamente, clusterizar Tomcat a nivel de todo el servidor, o bien por cada uno de los hosts virtuales configurados. Para configurar un cluster con los parámetros por defecto (por ejemplo para entornos de pruebas o desarrollo), bastaría con añadir la opción <Cluster className=”org.U apache.catalina.cluster.tcp.U SimpleTcpCluster”/>
en Engine o Host. En el Listado 2 puede verse un fichero de ejemplo de configuración completa para el nodo1. Veámoslo más en detalle: • Se añade en Engine el parámetro jvmRoute=”nodo1”, que en realidad se usa en arquitecturas con más de dos nodos, para que la máquina virtual
sepa el lugar al que redireccionar las peticiones ante una caída y recuperación. • Respecto a los Connectors, se elimina el conector HTTP/S del puerto 8080, que no se va a usar, ya que sólo vamos a utilizar el conector AJP en el puerto 8009, que servirá para sincronizar con el servidor web Apache HTTPD. De todas formas, es habitual dejar el conector 8080 en los entornos de desarrollo. También puede indicarse la dirección IP donde escuchará el conector, que aunque no es obligatorio, es útil en el caso de que tengamos varias tarjetas de red con distintas IP. • Como contexto se deja el de una de las aplicaciones web que vienen como ejemplo. En este caso se trata de los ejemplos de servlets, que además nos servirá más adelante para probar el replicado de sesiones. En dicho contexto es muy importante el parámetro distributable=”true”, que indicará al servidor Tomcat que dicha aplicación tiene que mantener la sesión en todos los nodos del cluster. • La configuración del cluster establece ese nodo como máster en el despliegue (Sender) de las aplicaciones en la granja en modo “pooled”. Las otras opciones de replicación posibles son synchronous, asynchronous o fastasyncqueue. Una vez finalizada la configuración del nodo1, podemos replicar la misma instalación en el nodo2 cambiando simplemente la dirección IP en el parámetro address del conector y del cluster, así como cambiar nodo1 por nodo2 en el parámetro jvmRoute en la directiva Engine. Y ahora manos a la obra. Iniciamos el nodo1 y nos fijamos en el fichero de trazas CATALINA_HOME/logs/catalina.out con nuestro paginador favorito (a mí me gusta less y pulsar F), esperamos a que
WWW.LINUX-MAGAZINE.ES
Listado 3: Ejemplo de workers.properties 01 # Define some properties 02 workers.apache_log=/var/log/ht tpd/ 03 ps=/ 04 # Define 3 workers the last one being a loadbalancing worker 05 worker.list=front 06 # Set properties for nodo1 (ajp13) 07 worker.nodo1.type=ajp13 08 worker.nodo1.host=192.168.10.2 09 worker.nodo1.port=8009 10 worker.nodo1.lbfactor=1 11 worker.nodo1.cachesize=10 12 worker.nodo1.cache_timeout=600 13 worker.nodo1.socket_keepalive= 1 14 worker.nodo1.socket_timeout=60 15 # Set properties for nodo2 (ajp13) 16 worker.nodo2.type=ajp13 17 worker.nodo2.host=192.168.10.3 18 worker.nodo2.port=8009 19 worker.nodo2.lbfactor=1 20 worker.nodo2.cachesize=10 21 worker.nodo2.cache_timeout=600 22 worker.nodo2.socket_keepalive= 1 23 worker.nodo2.socket_timeout=60 24 # Set properties for front (lb) which use nodo1 and nodo2 25 worker.front.type=lb 26 worker.front.balance_workers=n odo1,nodo2 27 worker.front.sticky_session=tr ue
termine de iniciar y acto seguido iniciamos el nodo2 y, si todo ha ido bien, veremos cómo se descubren entre sí ambos nodos y se replican las sesiones que haya disponibles. Un ejemplo de este funcionamiento se puede ver en la Figura 3.
Balanceando la carga Como balanceo de carga se podrían utilizar distintas técnicas: vía DNS (con políticas de resolución de IP en bucle RoundRobin), o bien con algún servicio
Número 19
63
ADMINISTRACIÓN • Cluster
tipo Linux Virtual Server en cada uno de los nodos para que hagan el balanceo de carga a nivel de red, o incluso se podría usar la aplicación balancer que viene de ejemplo con Tomcat. Nosotros vamos a usar mejor el servidor web Apache HTTPD, configurado con el módulo mod_jk disponible dentro de Tomcat Connectors [4]. Para instalarlo se podría utilizar el paquete que exista en la distribución en cuestión (mod_jk-ap20 en CentOS o libapache2-mod-jk en Debian), pero por compatibilidad con las últimas versiones de Tomcat que estamos usando, es preferible compilarlo a partir de las fuentes. Para ello bastaría con descargar la versión 1.2.15 y tener instalado el paquete de desarrollo de Apache (como siempre, httpd-devel en CentOS y apache2-dev en Debian) que proporciona apxs (APache eXtenSion tool).
Tabla 3: Tipos de workers Tipo ajp12 ajp13 jni lb status
Descripción Worker que implementa el protocolo ajpv12. (a extinguir) Worker que implementa el protocolo ajpv13. Worker que implementa peticiones JNI. Worker para balanceo de carga. Worker de estado para gestión de balanceo de carga.
Ya sólo queda cargar y configurar el módulo en el servidor. Para ello creamos un fichero jk.conf como el del Listado 1, ubicado en el directorio de carga automática de Apache (/etc/httpd/conf.d en CentOS y /etc/apache2/conf.d en Debian). Es ahora cuando entra en juego el
significado de los llamados workers, cuyo fichero de configuración se referencia mediante el JKWorkersFile, ubicado en el directorio conf/ de Apache. ¿Qué es un worker? Pues es una instancia de Tomcat que ejecuta peticiones de servlets recibidas desde un servidor web, o lo que es lo mismo, el servidor Apache se encargará, mediante la directiva JkMount, de redirigir la url de la petición recibida hacia un worker concreto. En el fichero de ejemplo se establece que todas las peticiones recibidas (/*) se redirijan al worker “front”. Vamos ahora a por el fichero del Listado 3, workers.properties, donde se definen los distintos tipos de workers desplegados, como los indicados en la Tabla 3. En nuestro caso, se trata de un único worker, que va a trabajar como balanceador de carga. Ojo porque en la directiva workers.list sólo se incluyen los workers, separados por comas, que vayan a ser usados en el fichero jk.conf, los nodos que se conecten a los nodos de un cluster sólo se usan en la definición del worker de tipo “lb”. El fichero de configuración comienza con la definición de varias propiedades comunes, como es el directorio de logs de Apache (utilizado para que el módulo mod_jk, que también guarda trazas) y un parámetro “ps” que se utiliza para indicar el separador de rutas (/ en Linux/Unix y \ para Windows). Después de definir el número de workers existentes, se pasa a detallar el funcionamiento de cada uno. Como vemos, existe un worker por cada
Figura 2: Página inicial de Tomcat accediendo desde la IP del balanceador.
Figura 3: Muestra de los ficheros de logs de las dos instancias de Tomcat en el arranque.
tar -xzvf jakarta-tomcat-U connectors-1.2.15-src.tar.gz cd jakarta-tomcat-connectorsU -1.2.15-src/jk/native ./configure —with-axps=/usrU /sbin/axps make
Para instalarlo, copiamos el módulo resultante en el directorio de módulos del servidor web (/usr/lib/httpd/modules/ en CentOS y /usr/lib/apache2/modules/ en Debian): cp apache-2.0/mod_jk.so U /usr/lib/httpd/modules/
64
Número 19
WWW.LINUX-MAGAZINE.ES
Listado 4: Script de inicio /etc/init.d/tomcat 01 02 03 04 05 06
#!/bin/bash # # tomcat # # chkconfig: 345 63 37 # description: Start up the Tomcat servlet engine.
07 08 CATALINA_HOME=”/opt/tomcat55-n odo1/” 09 10 case “$1” in 11 start) 12 if [ -f $CATALINA_HOME/bin/startup.sh ]; 13 then 14 echo $”Starting Tomcat” 15 /bin/su tomcat $CATALINA_HOME/bin/startup.sh 16 fi 17 ;; 18 stop) 19 if [ -f $CATALINA_HOME/bin/shutdown.sh ]; 20 then 21 echo $”Stopping Tomcat” 22 /bin/su tomcat $CATALINA_HOME/bin/shutdown.sh 23 fi 24 ;; 25 restart) 26 /bin/su tomcat $CATALINA_HOME/bin/shutdown.sh 27 sleep 5 28 /bin/su tomcat $CATALINA_HOME/bin/startup.sh 29 ;; 30 *) 31 echo $”Usage: $0 {start|stop|restart}” 32 exit 1 33 ;; 34 esac
ADMINISTRACIÓN • Cluster
uno de los nodos, cuyo tipo es ajp13, donde se especifica también la dirección IP y el puerto donde están escuchando los respectivos Connectors definidos en Tomcat. También se pueden indicar aquí otros parámetros interesantes como el peso lbfactor del worker dentro del balanceo de carga, el tamaño de la caché y el tiempo de refresco. Ya por último, se define el worker “front”, que se encargará de balancear las peticiones entre los workers, separados por coma, en balance_workers. Un parámetro bastante importante a tener en cuenta es el de sticky_session o sesión persistente, que hace que las peticiones se redirijan siempre al mismo nodo en el que se haya creado la sesión inicialmente, y sólo pasaría a usarse el segundo nodo cuando el primero dejase de existir. En la documentación de los conectores de Tomcat [6] se puede ver el significado de todas las directivas disponibles tanto en lo que respecta al módulo, como a la configuración de los workers. Una vez creados los ficheros descritos, bastaría con reiniciar Apache y empezar a jugar un poco con las sesiones. En la Figura 2 podemos ver el funcionamiento de cómo acceder directamente a la IP del servidor web: http://192.168.10.1/, donde se nos mostraría la página por defecto de Tomcat, y si usamos los servlets de ejemplo que se incluyen en Tomcat (http://192.168.10.1/ servlets-examples/), podemos ir viendo cómo crear sesiones y alojar parámetros en cookies, iniciar varios navegadores y comprobar cómo se balancea la carga asignando cada petición a un nodo distinto. También podríamos simular la caída de un nodo forzando la salida de uno de ellos y seguir haciendo peticiones al servidor y comprobar cómo se redirigen las peticiones sólo al nodo que está en funcionamiento. Mola ¿no?
Mejorando la instalación Como mejoras principales a realizar a la configuración anteriormente detallada, podrían realizarse algunas consideraciones de seguridad, como ejecutar Tomcat con su propio usuario no privilegiado tomcat, y luego asignar permisos reducidos a los directorios propios de la instalación de Tomcat. Por ejemplo, los directorios imprescindibles serían conf, logs, work y webapps. Ya sólo faltaría crear el típico fichero script de inicio de Tomcat para que se ejecute en cada reinicio del servidor. Un ejemplo sencillo podría ser el detallado en el Listado 4, ubicado en /etc/init.d/tomcat, con permisos de ejecu-
66
Número 19
ción y activado en los niveles de ejecución típicos mediante chkconfig tomcat on en CentOS y en Debian update-rc.d tomcat defaults. Otra mejora posible sería optimizar Tomcat mediante la compilación nativa, ya que las últimas versiones de Tomcat 5 están integradas con la Apache Portable Runtime[ 7], que es un subproyecto de Apache para la creación de un paquete de librerías que sirvan de abstracción consistente a implementaciones específicas por plataforma. Esto rompería a priori la portabilidad de Tomcat pero por contra se obtienen múltiples beneficios como… • … funcionalidades avanzadas de Entrada/Salida • … funcionalidades a nivel de sistema operativo y de gestión de procesos nativos, que redundará en la obtención de mejores parámetros de estado y consumo de proceso y memoria • … la obtención de una superior escalabilidad y rendimiento. Para instalar APR se podrían utilizar los paquetes precompilados de cada distribución, pero mejor vamos a compilar la última versión disponible en su web [7], la 1.2.7, en la que realizaremos los pasos típicos de compilación (huelga decir que nos hará falta tener instalado el compilador gcc y make previamente): tar xvjf apr-1.2.7.tar.bz2 cd apr-1.2.7 ./configure && make make install
Mediante estos pasos se nos instalarán en /usr/local/apr los componentes necesarios que implementan el acceso nativo. Ahora tocaría instalar los wrappers JNI de Tomcat para que usen APR, además nos hará falta tener instalado el paquete de desarrollo de OpenSSL (openssl-devel en CentOS, libssldev en Debian): cd $CATALINA_HOME/bin tar xvzf tomcat-native.tar.gz cd tomcat-native-1.1.3U /jni/native ./configure —with-apr=/usrU /local/apr/bin/apr-1-config U —with-java-home=/optU /jdk1.5.0_07 make && make install
Que generará una serie de librerías JNI en /usr/local/apr/lib/ que tendremos que
WWW.LINUX-MAGAZINE.ES
incluir en nuestra instalación de la JVM. Para ello, copiamos o enlazamos en: cd /opt/jdk1.5.0_07/jre/lib/i386/ ln -s /usr/local/apr/lib/U libtcnative-1.a libtcnative-1.a ln -s /usr/local/apr/lib/U libtcnative-1.so libtcnative-1.so ln -s /usr/local/apr/lib/U libtcnative-1.so.2 libtcn tive-1.so.2 ln -s /usr/local/apr/lib/U pkgconfig/ pkgconfig
Ahora sólo habría que reiniciar Tomcat et voilà. Por cierto, hay un pequeño problema en lo que respecta al direccionamiento IP en esta versión de Tomcat, y es que el parámetro address del Connector AJP tiene que estar en IPv6 en lugar de IPv4. Este problema estará solucionado en la próxima versión 5.5.18. Mientras tanto, habría que traducir el formato de las IP 192.168.10.2 y .3 a IPv6 en los conectores que tengan especificado el parámetro address, aunque ya vimos que no era obligatorio especificarlo.
Conclusiones En definitiva, usando Apache Tomcat es posible desplegar una aplicación crítica funcionando con tolerancia a fallos y existen muchas arquitecturas distintas con balanceo de carga y alta disponibilidad. Ahora sólo queda que la aplicación esté preparada para funcionar en un entorno en cluster, aunque eso ya daría para otro ■ artículo.
RECURSOS [1] Página de descarga de JDK de Sun: http://java.sun.com/javase/ downloads/index.jsp [2] Página de descarga de Tomcat 5.5.x: http://tomcat.apache.org/ download-55.cgi [3] Documentación de Tomcat 5.5: http:// tomcat.apache.org/tomcat-5.5-doc/ [4] Página de descarga de Tomcat Connectors: http://tomcat.apache.org/ download-connectors.cgi [5] Documentación de Tomcat Connectors: http://tomcat.apache.org/ connectors-doc/ [6] Documentación de Apache HTTPD: http://httpd.apache.org/docs/2.0/ [7] Apache Portable Runtime: http://apr. apache.org/
Bienvenidos a Linux User Esta 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 nuevas y apasionantes aplicaciones.
Ktools: Klear
68
Si estás cansado de batallar con la configuración de tu software para la tele digital, prueba Klear, un sistema de televisión para Linux fácil de instalar y de usar.
Desktopía: Firefox
70
Si buscas en internet encontrarás útiles añadidos para Mozilla Firefox. Examinamos los más populares y vemos como instalarlos y configurarlos.
Shredder
73
Shredder 9 trae el campeonato mundial de ajedrez al ordenador de casa. Echamos un vistazo a la versión linux de este famoso programa de ajedrez.
Educación: La traducción del software libre
76
Aunque no seamos programadores, tenemos una gran oportunidad de contribuir en los campos de la documentación y de la traducción. Por una vez querer es poder, ¿queremos ser miembros activos de la comunidad?
Línea de comandos: Procesos
81
Innumerables procesos pueden estar corriendo simultáneamente en un sistema linux en cualquier momento dado. Enseñamos cómo detener, continuar o matar tareas y examinamos cómo enviar los restos de programas colgados al cielo de los procesos muertos.
Juegos: J-SHOOTERS
84
En tierras del sol naciente ha surgido una nueva vuelta de tuerca al género de los “matamarcianos”. Gráficos vectoriales muy simples, velocidad, buena jugabilidad y dosis monumentales de adicción que, totalmente gratis, están disponibles para nosotros.
WWW.LINUX- MAGAZINE.COM
ISSUE 52 MARCH 2005
67
LINUX USER • Ktools: Klear
TV Digital con Klear
IMAGEN KLARA Si estás cansado de batallar con la configuración del software para tu tele digital, prueba Klear, un sistema de televisión para Linux fácil de instalar y de usar. POR OLIVER FROMMEL
L
a televisión Digital en Linux a menudo se asocia con arduas instalaciones y mucho tiempo perdido. Configurar MythTV puede ser todo un desafío mientras que el sistema alternativo VDR es de todo menos trivial, a menos que se use una distribución especializada como LinVDR. Klear [1] es un programa basado en GUI que permite ver y grabar programas DVB de manera mucho más sencilla. Fue escrito por Patric Bico Sherif, Omar El-Dakhloul, Manuel Habermann y Marco Kraus en la Universidad Técnica de Berlín como parte de un curso de programación. Klear usa la herramienta Qt para suministrar una GUI y supone un subsistema de trabajo DVB, aunque los kernels más actuales deberían soportar hardware DVB sin ningún problema. Las secciones DVB-S/T/C devices en la wiki de LinuxTV [2] informan
68
Número 19
sobre tarjetas PCI y sticks DVB USB que Linux soporta.
Instalación Para compilar el paquete son necesarios los paquetes de desarrollo de Qt y de KDE (kdebase-devel, kdebase-dev o similar) junto con Xine. La mayoría de las distribuciones tienen paquetes listos para ejecutar la herramienta de compilación Scons [3], la cual también es un componente requerido. En contraste con la mayoría de otros proyectos de software libre, Klear no ofrece un script de configuración, en su lugar proporciona un script shell denominado build.sh. Cuando se ejecuta este script, se comprueban primero las dependencias antes de continuar con la compilación. Puede incluso arrancarse directamente scons. Si se ejecuta scons help, se obtienen los parámetros disponibles, que
WWW.LINUX- MAGAZINE.ES
serán necesarios para establecer las rutas no estándares a las librerías que se usan. En nuestro laboratorio, experimentamos un problema con algunos sistemas que no encontraron la librería libxine.so. En la mayoría de los casos, para resolverlo, establecimos un enlace simbólico desde libxine.so.1 a libxine.so en el directorio /usr/lib. Tras completar la compilación, puede instalarse el programa ejecutando scons install como superusuario. Cuando se arranca Klear por primera vez, dirá que no dispone de un fichero de configuración y presenta el fichero de dispositivo DVB establecido en un diálogo. Habitualmente se aceptan como valores por defecto adapter0, dvr0, demux0 y frontend0. Si se presentan dificultades, hay que asegurarse de que dichos ficheros se encuentran en /dev/ dvb, además de comprobar que se dispone de accesos de escritura y lectura al directorio /dev/dvb. Klear espera también un fichero denominado channels.conf en el directorio $HOME/.klear. Aquí es donde se almacenan los datos de frecuencia del canal para su localización. Para un fichero de
Ktools: Klear • LINUX USER
respuesta es Desentrelazado: se hace clic o se presiona la tecla [D] para habilitar y deshabilitar esta característica. Desafortunadamente, Klear espera hasta el último minuto para limpiar la imagen. Esto significa que las capturas de pantallas (tecla [S]) y cualquier stream que se grabe Figura 1: Ventana principal de Klear con la imagen de la televisión tendrán todavía listas y el canal. de entrelazado. Para eliminarlos, se puede muestra se aconseja comprobar la usar una herramienta como Transcode o página de inicio de Klear. Mencoder que habilitan el desentrelazado cuando se convierte a un formato Tele-visionando diferente en la etapa final. Para arrancar un canal de televisión hay Se puede utilizar la lista de canal o las que hacer un doble clic sobre el nombre teclas [Página Arriba] o [Página Abajo] del canal que aparece en la lista. Despara cambiar el canal. Si al hacerlo pués de unos cuantos segundos de Klear se cuelga, habrá que deshabilitar demora en la sintonización, debería Automatic OSD display on switching en aparecer una imagen en la ventana la solapa General. El programa es más Klear (Figura 1). Para ocultar los controestable sin OSD. les se pulsa la tecla [M] o se hace clic en Para grabar el programa actual, se el botón correspondiente (Figura 1). presiona el botón de grabación o se Pulsando [M] volverán a presentarse los pulsa la tecla [R]. Se puede configurar controles de nuevo. [F] o haciendo clic un directorio diferente bajo Recording sobre el botón correspondiente nos para la configuración por defecto que ofrece el modo de pantalla completa. guarda las grabaciones ene el escritorio. Sin embargo, esta característica sólo Klear permite elegir entre dos formatos funciona actualmente en KDE. Los prode grabación distintos: el stream de gramadores se afanan por traer hasta transporte MPEG (MPEG-TS) y el los usuarios de Gnome Klear el modo de stream de programa (PS). Entre ambos pantalla completo en un futuro próno existen grandes diferencias, aunque ximo. la grabación con el stream de transporte Pueden notarse algunas interferencias es más ligero para la CPU. con imágenes en movimiento. Después de todo, el stream DVB está diseñado para verse en receptores que usan en modo entrelazado, algo que los monitores de ordenador no pueden dar. La
Planificación Las aplicaciones DVB son útiles porque permiten programar múltiples sesiones de grabación. Klear ofrece una guía de programas electrónica (EPG) para ayudar a la hora de llevar a cabo una planificación. Un EPG permite la programación anticipada de canales para un determinado número de días. Para ello se selecciona un programa y se pulsa el botón de grabación. Klear ofrecerá un diálogo en el que poder realizar cambios, tales como detener una grabación unos minutos más tarde, en caso de que el programa de televisión se haya retrasado en su emisión. Puede que no te guste la idea de Klear en ejecución hasta las 3 de la madrugada para grabar un programa. Sus desarrolladores poseen una solución simple pero funcional. Se habilita Mute on iconizing en las configuraciones bajo General. Ahora, una vez se iconiza la aplicación a través de la barra de título de la ventana (y no a través del menú Klear) se le podrá dejar dormir hasta la hora de la grabación, aunque ésto, de momento, sólo funciona con KDE. Los usuarios de Gnome, deberán cambiar el stream manualmente pulsando [V] e iconizar la ventana Klear. Tras almacenar las grabaciones en disco pueden usarse programas como DVB_CUT [4] para cortar la grabación antes de la conversión al formato requerido. DVBCUT está hecho a medida para ello y puede manejar formatos DVB MPEG.
Imperfecto Klear posee las funciones que necesita un programa DVB práctico que evita el exceso de características. Permite ver la televisión y planificar las grabaciones. Claro que para hacer un uso completo de las características de esta aplicación necesitaremos KDE. Los cuelgues ocasionales estropean la diversión de ver televisión digital. Entre las prioridades de sus desarrolladores se encuentran la mejora de la estabilidad y llevar la aplicación con las características completas del ■ programa a otros escritorios.
RECURSOS [1] Klear: http://wwww.klear.org/ [2] Wiki deLinuxTV:http://linuxtv.org/wiki
Figura 2: Los botones de Klear permiten controlar el programa con el ratón.
Figura 3: Se usa la etiqueta Recording para especificar el formato de grabación así como los directorios previstos para golpes de pantalla y grabaciones.
WWW.LINUX- MAGAZINE.ES
[3] Scons: http://www.scons.org [4] DVBCUT: http://dvbcut.sourceforge.net
Número 19
69
LINUX USER • Desktopía: Firefox
Búsqueda e instalación de extensiones de Firefox
EXTENSIBILIDAD
Si buscas en Internet encontrarás útiles añadidos para Mozilla Firefox. Examinamos los más populares y vemos como instalarlos y configurarlos. POR ANDREAS KNEIB
E
l navegador Mozilla Firefox está diseñado para alojar extensiones fácilmente, de modo que su comunidad ha respondido con un variado tipo de módulos de añadidos. Tanto si tenemos interés en mejorar el rendimiento del navegador, como si simplemente queremos consultar las noticias del tiempo encontraremos una extensión que se adapte a nuestras necesidades. Echaremos un vistazo a algunos de los módulos más útiles para el nuevo Firefox 1.5.
Cómo empezar Si la distribución de Linux de la que se dispone no cuenta con la última versión de Firefox, es posible descargársela de la página de inicio de Firefox en [1]. Una vez
Figura 1: El Administrador de Extensiones de Firefox muestra las extensiones instaladas en nuestro navegador.
70
Número 19
instalada, seleccionando Tools | Extensions puede abrirse el Administrador de Extensiones Firefox (Firefox Exension Manager, ver Figura 1). El administrador de extensiones es una herramienta central para la administración de plugins. Si la versión Firefox 1.0 ya tiene instaladas determinado número de extensiones antes de actualizarla a Firefox 1.5, el navegador debería mostrar si los módulos son compatibles con la nueva versión. De lo contrario, se hace clic sobre el botón Update de la parte inferior de la ventana de Administración de Extensión. En este momento el programa comprueba el sitio web del proyecto para verificar si se encuentra disponible una nueva versión del módulo. A continuación rearranca el navegador web para habilitar las herramientas. Si Firefox falla al localizar las extensiones que funcionen, las antiguas permanecerán deshabilitadas hasta que se encuentre disponible otra actualización o hasta que se eliminen manualmente las extensiones. Si siguen encontrándose problemas, tales como que el programa se cuelga porque el navegador ha tropezado con un módulo incompatible o roto, puede intentarse arrancar el programa en modo seguro usando los siguientes parámetros desde la
WWW.LINUX- MAGAZINE.ES
línea de comandos: firefox -safe-mode. En modo seguro todos los temas [4] y extensiones están deshabilitados, pudiéndose ejecutar Extension Manager para eliminar el módulo problemático.
Material Nuevo Si se ha estado utilizando Firefox sin ningún añadido, se aconseja visitar el sitio web de añadidos de Firefox en [2] para ver todo lo que hemos estado perdiéndonos. Se puede ir sin salir de Extension Manager haciendo clic sobre el enlace Get more extensions. La lista contiene los diez añadidos más populares, así como enlaces a otras extensiones y recursos. Las categorías se muestran a la izquierda, y van desde las extensiones para blogging a través de herramientas de descarga, hasta herramientas para la protección de la privacidad. Aparte de este sitio web, existen varios proyectos alternativos que ofrecen extensiones para el navegador Firefox, tales como la extensión Mirror [3].
Ad Blocker Comenzaremos con un plugin que resulta indispensable para hacer útiles algunos sitios web: Adblock. El módulo bloquea o
Desktopía: Firefox • LINUX USER
cierra elementos tales como gráficos de anuncios y banners intrusivos. Ad Blocker es uno de los diez añadidos más populares. La instalación es bastante simple. Una vez en el sitio web de Adblock [5] se hace clic en el enlace Install Now. Dicho enlace abre el diálogo de instalación del software (Figura 3). El proceso se arranca presionando Install. Después de restablecer el navegador, Adblock está listo para despegar. Si por alguna razón falla este proceso se selecciona Edit | Preferences | Content para ver qué sitios web han sido aprobados para la instalación del software. Pero es necesario recordar que hay que restringir este proceso a sitios de confianza para evitar que se abra un agujero de seguridad. Otro método de integración de ad blocker es descargar el fichero de extensión y luego arrastrar y soltar el icono del fichero a instalar. Se hace clic en el enlace Install Now y se selecciona Save link as... para guardar la extensión con la extensión del fichero xpi en el disco duro. El siguiente paso es usar el administrador de ficheros Konqueror para arrastrar el fichero a la ventana principal de Firefox para arrancar la instalación del software. Trabajar con Adblock es sencillo: en la barra de la parte inferior de la ventana del navegador aparece un mensaje Adblock. Cuando se hace clic sobre el mensaje, la herramienta muestra una lista de elementos del sitio web que se está viendo en ese momento y ofrece ocultar algunos de esos elementos. Es posible hacer clic sobre un elemento en la página para que emerja un menú que permite deshabilitar una imagen o un elemento Iframe, por ejemplo. Para administrar y editar las reglas del filtro para la herramienta es preciso ir a Tools | Adblock | Preferences. Adblock entiende comodines como el asterisco “*”, lo cual es una buena cosa, especialmente si te cobran la conexión por minutos, ya que ayuda a presentar la página más rápidamente, lo cual puede evitar gastar mucho dinero.
Un zorro veloz Para mejorar un poco más la velocidad del navegador podemos instalar la extensión Fasterfox. Al igual que Adblock, esta extensión puede encontrarse en la lista de herramientas Most Popular Firefox Extensions o en la página de inicio del proyecto en [6]. El plugin ofrece determinadas técnicas para mejorar las velocidades de descarga.
Figura 2: La página Add-ons de Firefox proporciona enlaces a las extensiones Firefox más populares.
Una vez completada la instalación, se puede usar el administrador de preferencias para completar la configuración. Se comienza con un clic sobre el plugin Fasterfox. A continuación se hace clic en Preferences para ir a las opciones. Los usuarios con pocos conocimientos, técnicos pueden marcar el cuadro Turbo para hacer que el navegador coja más velocidad. Pero si se disfruta experimentando, haciendo clic sobre Modify se presentará una selección de etiquetas para una personalización individualizada. Uno de los mayores fuerzas de fasterfox es la habilidad que posee para precargar páginas web, la cual se conoce como Enhanced Prefetching (Precarga Mejorada). Esto significa que mientras se abre un sitio, el navegador también carga los sitios con los que enlaza aquél. Cuando se hace clic sobre alguno de los enlaces, el navegador presenta el documento sin ninguna demora. Pulsando en la solapa General podemos configurar la precarga. Por defecto esta opción se encuentra deshabilitada debido a que utiliza mucho ancho de banda de la conexión a Internet. El cuadro de texto debajo de la opción permite excluir ciertos enlaces de la precarga. La precarga mejorada es diferente de la característica de precarga integrada en el navegador. El servidor web tiene que soportar la precarga estándar para que se pueda utilizar. Sin embargo, la precarga mejorada descarga sitios webs enlazados de manera autónoma , incluso si el servidor no soporta la precarga.
WWW.LINUX- MAGAZINE.ES
En la parte inferior de la solapa hay un cuadro de comprobación que pregunta si se desea que se presente un reloj automático al pie de la ventana de Firefox. Este reloj dirá cuánto tiempo necesitará el navegador para cargar la página. Haciendo clic sobre este reloj, se muestra un cuadro de diálogo conteniendo varias opciones. Cuando Fasterfox pisa el acelerador con un puñado de configuraciones optimizadas, Firefox sale disparado a través de la World Wide Web a alta velocidad. Suponiendo que no se nos cobra por el volumen de descarga, no hay duda que disfrutaremos con las prestaciones que ofrece la precarga mejorada.
Tiempo Fox Forescastfox suena ligeramente parecido a Fasterfox, pero la función que da es completamente diferente. Se trata del
Figura 3: Puede usarse este cuadro de diálogo para añadir Adblock.
Número 19
71
LINUX USER • Desktopía: Firefox
Figura 4: La extensión Noscript identifica código Javascript y muestra al usuario un menú de opciones.
pronosticador del tiempo para el navegador. También se encuentra entre una de las diez extensiones más populares del sitio web de Firefox e incluso dispone de su propia página de inicio [7]. La herramienta presenta un pronóstico del tiempo actualizado regularmente en la parte inferior de la ventana Firefox. Como Forescastfox no tiene manera de saber dónde vives, querrás configurar el lugar en el administrador de extensiones. Para hacerlo se pulsa Find location en la sección General. Se escribe el nombre de la ciudad en la máscara que aparece ahora. El programa busca en la base de datos la estación meteorológica con el mismo nombre que tu ciudad y ofrece una lista de opciones. Tras seleccionar el lugar de la lista, la extensión te mantendrá actualizado sobre el tiempo local. Otra de las opciones afecta a las unidades de medida de la estación meteorológica local. Dependiendo del gusto personal, pueden escogerse dos medidas, imperial o métrica. Otras secciones de las tantas disponibles están relacionadas con las configuraciones opcionales, tales como la presentación, advertencias o enlaces. Además del pronóstico del tiempo para los próximos días, esta herramienta de previsión del tiempo virtual ofrece una imagen satélite centrada en tu ciudad.
72
Número 19
Para presentar la imagen satélite, arrastra el ratón hasta el icono del radar verde en la parte inferior de la pantalla. Haciendo clic en él se abre en el navegador la página http://wwwa.accuweather.com ofreciendo una imagen satélite a pantalla completa. Es cierto que Forecastfox no hace nada por mejorar el tiempo, pero al menos sabrás si vale la pena abandonar tu escritorio y salir a dar una vuelta. Asimismo, la herramienta elimina la necesidad de arrancar alguna otra aplicación de pronóstico del tiempo, como es Wmweather.
Trucos El último añadido que examinaremos es una herramienta de navegación llamada Noscript [8], la cual permite habilitar y deshabilitar Javascript y Java para adaptarlo a nuestras preferencias. Existen varias maneras de acceder a las opciones de esta popular extensión. Bien puede tomarse la ruta vía Extension Manager, al igual que con Fasterfox, o bien usar la barra Noscript en la ventana del navegador o el icono al pie de la ventana del programa. Existen tres solapas con configuraciones: General, Appearance y Advanced. La solapa General se usa para introducir páginas web donde se permitirá correr Javascript. Appearance permitirá especificar dónde se desea que
WWW.LINUX- MAGAZINE.ES
resida el icono Noscript o el tono de alerta que avisa cuando el plugin rechaza un script. Los otros campos son para cambiar la presentación. Los parámetros extendidos permiten especificar cómo manipular el copiado y pegado, Macromedia Flash, Java u otros plugins. Siempre que se encuentre con una página en la World Wide Web que intente arrancar Javascript, aparecerá una barra con el botón Options (Figura 4). El botón nos lleva hasta un menú donde pueden permitirse que se ejecuten scripts del sitio web, o bien permanentemente o bien en la sesión de navegación actual. Este menú permite a los usuarios la posibilidad de que se ejecuten scripts caso por caso en las preferencias del navegador. Esta característica no es sólo por comodidad, también conlleva implicaciones en términos de seguridad. Si se modifican las configuraciones Javascript en diferentes ocasiones durante una sesión de Internet, es seguro que se perderá la trayectoria de las configuraciones en algún paso; es bueno saber si Javascript está habilitado o no.
Conclusiones Los navegadores como Firefox se adaptan al usuario igual que un traje hecho a medida. Con su amplio número de extensiones a elegir, es posible personalizarlo a las necesidades individuales ■ de cada uno.
RECURSOS [1] Firefox: http://wwww.mozilla.com/ firefox/ [2] Extensiones Oficiales Firefox: https:// addons.mozilla.org/extensions/ ?application=firefox [3] Extensiones mirror: http://www. extensionsmirror.nl [4] Temas Oficiales Firefox: http://addons. mozilla.org/themes/ ?application=firefox [5] Adblock: https://addons.mozilla.org/ extensions/moreinfo. php?id=10&application=firefox [6] Fasterfox: http://fasterfox.mozdev.org [7] Forecastfox: http://forecastfox. mozdev.org [8] NoScript: http://noscript.net
Shredder • LINUX USER
El programa de ajedrez Shredder para Linux
MASTER VIRTUAL Shredder 9 trae el campeonato mundial de ajedrez en el ordenador de casa. Echamos un vistazo a la versión Linux de este famoso programa de ajedrez. POR MIRKO ALBRECHT
L
os bits y los bytes han pasado a formar parte del mundo del ajedrez: las férreas infraestructuras pueden poner en jaque a un campeón. Incluso alguno de ellos, de la talla de Gary Kasparow hacen uso de programas de ordenador de ajedrez para “hacer sus deberes”. En el pasado, los usuarios de Linux interesados en este juego disponían de menos opciones que los usuarios de Windows, y la mayoría de los programas Linux de ajedrez disponibles exigían al usuario no pocas habilidades técnicas (ver el cuadro “Linux y Ajedrez”). La llegada de Shredder 9 para Linux es una nueva e importante oportunidad para que los usuarios Linux puedan explorar las posibilidades del ajedrez en el ordenador.
Al Cubo En el mundo de Windows, el motor UCI Shredder 9 es la aplicación por excelencia y un líder dentro del ranking mundial. Shredder ha ganado diez campeonatos mundiales por ordenador de ajedrez, mientras que la interfaz Shredder Classic está considerada por los expertos del ajedrez como una de las GUIs mejor diseñadas y lógicas del mercado. Stefan Meyer-Kahlen, programador del motor del programa ha
ampliado recientemente su imperio creando versiones de Shredder 9 para Linux y Mac OS X. En Octubre, Meyer-Kahlen inició la venta del equivalente de Shredder 9 para Linux y Mac OS X desde su página de inicio [1]. En total existen tres versiones de la aplicación: la versión de inicio, Shredder Classic Linux,
cuyo precio es de 29.95 EUR y viene con el motor más lento, Shredder Classic. El motor Shredder 9 de gama media asciende a 49.95 EUR, mientras que Deep Shredder 9 para Linux, que ofrece un rendimiento mayor en SMP o en ordenadores multinúcleo, sube hasta los 99.95 EUR. Las tres versiones poseen la GUI Classic Shredder y se encuentran disponibles mediante descarga de la página web de Shredder. El sitio no ofrece paquetes con manuales ni otros medios.
Linux y Ajedrez Existen para Linux un buen número de recursos de ajedrez en lo que se refiere a motores (ver el cuadro “Motores de Ajedrez y GUIs). De todos ellos, el primero y principal, y probablemente el programa de código abierto más poderoso de todos, es Crafty [2] del Profesor Robert Hyatt. Este programa pierde frente a sus competidores comerciales en el ranking mundial, aunque tiene asegurado su lugar dentro de los primeros 40. Los restantes motores son bastante apropiados para un juego rápido, aunque no son aconsejables para competidores de torneos serios, ya que carecen de características de análisis. Las cosas empeoran si se analizan las GUIs. La mayoría de ellas se limitan a ofrecer una visión del tablero de ajedrez,
WWW.LINUX- MAGAZINE.ES
evitando tener que jugar un partido a ciegas contra el ordenador. La base de datos de ajedrez Scid [3] es una bienvenida excepción a la regla: su riqueza de características lo hacen una genuina alternativa a programas Windows comerciales. Sin embargo, Scid no es apropiado para juegos de competición, ya que no dispone de cronómetro. El programa Knights para KDE, así como otras GUIs, poseen esta característica, pero no disponen de nada en la línea de análisis o funcionalidad de la base de datos. José Chess [4] es un programa Java digno de mención. Dispone de una opción para añadir oberturas. José Chess probablemente sea el candidato más prometedor de todas las GUIs de código abierto hasta el momento
Número 19
73
LINUX USER • Shredder
Stefan Meyer-Kahlen escribió el motor en C y lo compiló directamente para Linux. Corre nativamente, pero es ligeramente más lento que su equivalente Windows. Esto es debido a las menos que perfectas optimizaciones de GCC, argumenta el desarrollador. Para la GUI se usó Java, probablemente para apoyar versiones de Shredder 9 para Mac y Shredder 9 para Linux sin tener que reinventar la rueda.
Configuración de Shredder 9 Después de adquirir el programa, se nos envía un mensaje de correo con un número de registro y un enlace al archivo de descarga de Shredder 9. La descarga es un tarball de 4 MB. Tras desempaquetarlo, el programa puede arrancarse corriendo el script de inicio, Shredder9, suponiendo que se dispone de una instalación Java, versión 1.4 o superior. Cuando el programa arranca, invita a seleccionar un idioma y luego se reinicia. Comienza con una GUI ordenada y limpia, que se encuentra dividida en cuatro paneles, los cuales corresponden a las ventanas para el tablero de ajedrez, el reloj, el estado del juego y el área del motor (Figura 1). Después de unas cuantas jugadas, debería notarse que la GUI es un poco pesada. En nuestros sistemas de laboratorio (Athlon XP 1600+ ; Intel Centrino 1.5 Mhz, ambos con 512 MByte de RAM) la GUI reaccionó muy lentamente. La prometida actualización por parte de Stefan Meyer-Khalen del pasado Noviembre corrigió los peores fallos de la
mayor parte de la GUI de la versión original, tales como la desaparición de piezas, aunque esta actualización falló a la hora de aumentar la velocidad de la GUI.
Características Ausentes Muchas características que se encuentran en la versión de Shredder para Windows no se encuentran aún disponibles para la versión Linux. Aunque existen extensas bases de datos online con finales de juego, la versión Linux no puede conectarse a ellas. Además, esta versión Linux también carece de muchas de las opciones de análisis inteligente disponibles para la versión Windows. La base de datos del juego del programa no permite buscar por juegos mediante posición y no contiene más que 2000 registros, lo que impide un uso serio, más si se considera que cientos de miles de juegos son bastante normales. Aunque Shredder para Linux permite integrar varios motores UCI, el programa carece del modo en el que dos motores pueden jugar uno contra el otro, a diferencia de la versión Windows. Incluso carece de una función de impresión que permita imprimir partidas completas y sus diagramas. A pesar de ello, Shredder 9 para Linux tiene una colección de oberturas de 100 MBytes, la cual puede ser descargada como un fichero comprimido de 27 MBytes después de comprar la clave de registro. La ventana del motor ofrece una vista de las posibles jugadas. La versión Linux viene sin manual, aunque la buena organización de los menús
Motores de Ajedrez y GUIs El motor de ajedrez es el núcleo de cualquier programa de ajedrez, es el lugar en el que reside la inteligencia del juego. Para ayudar a controlar el motor, es necesaria una GUI que ofrece una representación gráfica del tablero para visualizar la partida. Los motores más populares para Linux incluyen Crafty, Phalanz, Gnuchess y viejas versiones de Sjeng y Fruit. Las GUIs Linux incluyen Knights, Xboard, José Chess o Scid. Para la integración de un motor con una GUI se dispone de dos protocolos diferentes: el protocolo WinBoard compatible y la Interfaz UCI Universal Chess, ésta última es del desarrollador de Shredder, Stefan Meyer-Kahlen. La mayoría de los motores y GUIs de código abierto soportan solamente el protocolo WinBoard compatible. GUIs más recientes, como José Chess, soportan ambos, tanto WinBoard como UCI. La interfaz Polyglot [5] te ayuda a integrar motores UCI con GUIs WinBoard compatibles.
permite a los usuarios un acceso fácil a las funciones del programa, suponiendo que se está familiarizado con el juego del ajedrez. Haciendo clic con el botón derecho en la ventana de notación hace que se muestre una paleta para rápidos comentarios sobre jugadas. La ventana Mode lleva hasta los modos posibles de juego. La entrada Analysis seguirá analizando un juego para la mejor jugada posible hasta que le sea permitido. El Shredder de Linux soporta análisis variantes múltiples. Si se tiene ilusión por aprender más acerca del juego, pueden introducirse rutas variantes completas y jugar las distintas opciones con varios motores. Pueden promocionarse variantes útiles a variantes principales y eliminar las más pobres. Si se desea, Shredder indicará posibles peligros mostrando una flecha roja o bien indicando los movimientos más prometedores mediante una flecha verde ([Ctrl]+[T]).
Opciones del Juego
Figura 1: La interfaz de Shredder combina tablero de ajedrez, reloj, protocolo de juego y controles del motor en una única GUI.
74
Número 19
WWW.LINUX- MAGAZINE.ES
Si se juega a nivel de club, puede que se esté interesado en una opción de Shredder que permite jugar a partidas de ajedrez con reglas estilo torneo basadas en un programa preestablecido. Por ejemplo, puede usarse Shredder para jugar a un ajedrez relámpago con penalizaciones de tiempo, o bien jugar a partidas más largas con más
Shredder • LINUX USER
Figura 2: Shredder 9 soporta algunas opciones de tiempo y permite restringir la fuerza del ordenador.
comprobaciones de tiempos. Los usuarios de Shredder incluso pueden asignarse un Bono Humano. Esta característica es una muy buena idea cuando se considera el tiempo que lleva mover piezas de ajedrez arrastrando el ratón. Shredder también es útil para los principiantes y jugadores ocasionales. El menú Mode | Levels permite a los jugadores limitar la fuerza de los oponentes computerizados. La fuerza se mide en la unidad normal ELO (Figura 2). En el nivel de juego más bajo, el programa incluso imita errores humanos típicos. Otros programas de ajedrez devalúan típicamente sus piezas a niveles de diversión. Algunas
Tabla 1: Shredder 9 para Linux Fabricante: Stefan meyer-Kahlen Características: +Motor poderoso +Front-end Profesional +Buenas opciones de análisis -No Manual -GUI lenta - Menos funciones que la versión Windows Precios: Shredder Classic Linux 29.95 US$/EUR Shredder 9 Linux 49.95 US$/EUR Deep Shredder 9 Linux 99.95 US$/EUR Fuente: http://www.shredderchess.de
Problema El tablero de la Figura 1 muestra un bien conocido problema de jaque mate: las negras están intentando convertir su peón en reina, forzando a las blancas a ceder. Es el turno de las blancas. ¿Ves alguna manera de salir de esta situación?
aplicaciones de ajedrez realizan Figura 3: Shredder 9 soporta motores alternativos, tantos como jugadas agresivas soporten protocolos UCI. con la reina. Shredder 9 toma pasos adicionales para simular el juego de un ajedrez más poderosos del mundo recienhumano inexperimentado. temente lanzado para Linux. El nivel más bajo (1000 ELO) incluso Conclusiones debería dar a los jugadores ocasionales una oportunidad para batir a la máquina. En este A pesar de su lenta GUI, Shredder 9 para nivel, Shredder incluso hace la vista gorda Linux es una potente herramienta de ajedrez después del comienzo a los campos de jaque que me ha dejado una buena impresión. mate g7 y h7. Pero estoy completamente Definitivamente ofrece más en la línea de seguro de que Linux Magazine no posee características que una combinación de, demasiados lectores que ganen a Shredder 9 pongamos, Xboard/Crafty o Knights/Crafty, sin restricciones algunas. aunque no puede competir con la riqueza de características de la base de datos de ajedrez Funciones y Características de Scid. Por otra parte, la interfaz Shredder La GUI posee todas las funciones que se Classic es muy fácil de utilizar. podrían esperar de una GUI de ajedrez, Lo más molesto del programa es el hecho incluyendo la habilidad de rotar y escalar de que los jugadores de ajedrez Linux tienen el tablero, revisión de jugadas y rejugada, que contentarse con un subconjunto de las oberturas de partidas o guardado de parfunciones que ofrece la versión Windows, tidas en distintas bases de datos. aunque el precio sea el mismo. Cuando se Si se requiere, es posible modificar el puntualiza esto a Stefan Meyer-Kahlen, simtamaño de la tabla en File | Options | plemente contesta que la versión Linux Engine options. En palabras sencillas, solamente lleva en el mercado unas cuantas éste es el espacio de memoria para almasemanas, mientras que la primera versión cenar las cálculos realizados por el para Windows fue lanzada por primera vez ■ motor. El valor no debería ser mayor que hace unos diez años. la mitad de la memoria física total del ordenador. Permanent Brain especifica si RECURSOS Shredder usará la CPU para cálculos todo el tiempo o justo cuando se produce la [1] Shredder 9: http://www. jugada del programa. shredderchess.com Si se intentan usar otros programas [2] Crafty: http://www.cis.uab.edu/hyatt/ mientras se espera que el motor realice hyatt.html una jugada, puede habilitarse la opción [3] Scid: http://scid.sourceforge.net Engine with low priority. [4] José Chess: http://jose-chess. Como ya se mencionó previamente, sourceforge.net Shredder funcionará con otros motores, [5] Polyglot: http://theorie.physik. tantos como soporten el protocolo UCI. Si uni-wuerzburg.de/~arwagner/chess/ se es un jugador perspicaz debería probar shredder.html adicionalmente el motor comercial Fruit [6] Fruit: http://www.fruitchess.com 2.2.1 (29 EUR), uno de los motores de
WWW.LINUX- MAGAZINE.ES
Número 19
75
LINUX USER • Educación
La traducción del software libre
OPORTUNIDAD DE COLABORAR Aunque no seamos programadores,
hay
una
gran
oportunidad de contribuir en los campos de la documentación y de la traducción. Por una vez querer es poder, ¿queremos ser miembros activos de la comunidad? POR
JUAN
RAFAEL
FERNÁNDEZ GARCÍA.
C
uando soñábamos con una implantación masiva del software libre, uno de las campos que creíamos que podía tener un desarrollo más fluido era el de la traducción: imaginábamos con ingenuo sentido común que en las escuelas de traducción los estudiantes practicarían haciendo traducciones necesarias, además de continuar con los mismos artificiales ejercicios de siempre, y que los profesores de idiomas se lanzarían encantados a colaborar en algo en lo que al fin tienen (tenemos) algo que aportar. Sin embargo, es curioso cómo nos hemos instalado en la cultura de la queja y el fatalismo. ¿Algo no está traducido? «Que me lo traduzcan», dicen los más positivos; comparten con los fatalistas la tendencia a la pasividad. «Pues es que esto será así», piensan los fatalistas resignados, como cuando tienen que reformatear cierto sistema operativo con tendencia a ser caldo de cultivo de virus; o bien, para los fatalistas de lo fatal, «esto del software libre no funciona» cada vez que a ellos algo no les funciona. Pues bien, si algo no funciona o no está traducido, puede ser porque, como usuarios, no hayamos sabido hacerlo funcionar o actualizarlo a una versión
76
Número 19
traducida, pero también puede ser que la aplicación esté mal, incompleta… y es bastante posible que nadie se haya ofrecido para traducirla. ¿Por qué no lo hacemos nosotros? En esta nueva serie de artículos exploraremos las herramientas a nuestra disposición, conoceremos a los principales equipos de traducción al castellano, y señalaremos también los problemas no resueltos. ¿Qué necesitamos para poder seguir de forma práctica esta primera entrega? En nuestro sistema deberán estar instalados los siguientes paquetes: gettext, kbabel (recuerden: aptitude install gettext kbabel). Deberemos tener también ante nosotros algún fichero en formato PO para poder estudiarlo; podemos descargar cualquiera de http://l10n-status.gnome.org/ HEAD/es/fifth-toe/index.html por ejemplo.
las lenguas oficiales están cubiertas y países en los que está cubierta la lengua más hablada). Listos para la dominación del mundo, va a ser verdad. Segundo ejemplo: las estadísticas del grupo de traducción del proyecto GNOME (figura 2). ¡El equipo español había traducido el 100% de los 33.909 mensajes de la versión 2.14, la que probablemente esté presente en nuestros ordenadores! ¡Y en julio de 2006 el equipo va en primer lugar (figura 3) en el top ten de los equipos en la tarea de traducir la nueva versión (la 2.16)! Tercer ejemplo: estadísticas de los equipos del proyecto KDE, otro trabajo ímprobo (figura 4).
De la importancia del esfuerzo realizado Quizás no tengamos una conciencia clara del esfuerzo que realizan los traductores desinteresadamente. Unos pocos ejemplos pueden ayudarnos a hacernos una idea[1]. Primer ejemplo: en estos momentos se está trabajando en el desarrollo de una nueva versión del instalador de Debian, que deberá poder ser utilizado en el mayor número posible de lenguas. La imagen 1 nos muestra la evolución del número de idiomas en los que puede trabajarse durante la instalación (las tres columnas corresponden a la versión de Debian, países en los que al menos una de
WWW.LINUX- MAGAZINE.ES
Figura 1: Evolución del instalador de Debian.
LINUX USER • Educación
Figura 2: Estadísticas del proyecto GNOME.
Y la reflexión: ¿de verdad creen ustedes que al software comercial le interesa la traducción a idiomas tan minoritarios como el esperanto, el azerbayán o la lengua de las Islas Feroe? ¿o que les compensa tener al día sus traducciones al vasco o al bretón? ¿que cada Service Pack pasa por sus equipos de traducción? Quisiera que estas cifras, que al menos a mí me resultan asombrosas en equipos de voluntarios, sirvan para que cambie nuestra reacción cuando encontremos un error de traducción o que alguna cadena del programa que estamos usando está en inglés. Lo más probable es que se trate de un error que se corrigió hace año y medio y la corrección nos esté esperando en la nueva versión de la distribución; pero si no es así, ¿por qué no les enviamos un correo con el error y su corrección?
Internacionalización y localización En nuestros artículos sobre la multilingualización (al final me gustará la palabra) de los números 4 y 5 de Linux Magazine ya tuvimos que tratar estos conceptos básicos para comprender cómo se puede adaptar un sistema a distintas lenguas. Es el momento de refrescar los conceptos. La internacionalización (abreviada i18n, por el número de letras entre la i y la n) es la adaptación que los desarrolladores tienen que hacerle a los programas para que sea posible traducirlos y adaptarlos a distintos idiomas (la adaptación va más allá de la mera traducción: de un idioma a otro cambian el orden alfabético, el signo de la moneda o el separador de decimales…). La localización (l10n) es lo que hace el traductor, gracias al trabajo previo de i18n. Entonces este artículo que ahora tenemos entre manos trata del estado de la localización al castellano del software libre, de cómo se realiza y de cómo se
77
Número 19
Figura 3: El top ten de traducción de GNOME.
Figura 4: Estadísticas de KDE.
puede echar una mano (y por añadidura de la localización a cualquier otro idioma, por supuesto). Pues bien, empecemos diciendo que la localización del software libre es una labor de equipo, que sólo muy raramente es realizada por una sola persona. En primer lugar el programador debe preparar su código, y es él el que genera (pronto lo veremos) los ficheros que deberán ser traducidos. Pero además, los traductores suelen agruparse en equipos: uno traduce, otro revisa, alguien coordina el reparto de trabajo y anima… entonces se envía la traducción al programador y quizás también a los mantenedores de los paquetes; y el proceso no acaba aquí, porque es normal que las aplicaciones tengan nuevas versiones, habrá que actualizar los ficheros que se van a traducir, realizar nuevas traducciones comprobando que la terminología es coherente, lo que añade una capa de control de calidad… Pero estábamos explicando la localización. ¿Cómo sabe el sistema en qué idioma queremos los mensajes? Mediante unas variables de entorno, los LOCALES, cadenas como LANG=es_ES@euro o LC_ALL=zh_TW.UTF-8 (man(1) locale). Estas variables pueden fijarse en ficheros de configuración únicos para todo el sistema (caso de que por ejemplo no queramos la localización más que en castellano), o pueden ser libremente modificados por el usuario (supongamos un ordenador de un centro bilingüe en el que se desee que, en determinadas clases, la interfaz esté en inglés o alemán). La flexibilidad es tal que es posible modificar la localización programa por programa sencillamente anteponiéndole el LOCALE deseado. Como prueba, la figura 5, la información de la versión del programa gettext bajo distintos LOCALES. Parece magia, ¿verdad? ¿Cómo funciona esta magia?
Cuando instalamos un paquete cualquiera no sólo instalamos su ejecutable, instalamos además las cadenas de texto de todos los idiomas a los que ha sido traducido[2]. Estas cadenas cuelgan todas del directorio /usr/share/locale. Por aclarar la cuestión, en el ordenador en el que escribo hay ahora mismo 932 archivos en /usr/share/locale/es/LC_MESSAGES, todos con la extensión .mo. MO viene de Machine Object, y es el formato binario en el que se almacenan en el ordenador los mensajes. Estos ficheros .mo se generan a partir de unos archivos fuente PO (de Portable Object), que son con los que trabajamos los traductores. Amigo futuro traductor libre, tenemos que presentar aún un paso intermedio: antes que los ficheros PO existen las plantillas PO (ficheros POT, con T de template). Un fichero POT inicial es el esqueleto, común a todos los idiomas, al que el traductor de cada lengua irá añadiendo sus traducciones. ¿Cómo y quién crea un fichero POT? El autor del programa. Mediante la herramienta xgettext del paquete gettext aplicada a un archivo fuente de código que previamente ha sido internacionalizado. Esto es más fácil de comprender que de explicar, y los detalles no nos incumben a los traductores. Por poner un ejemplo, el código fuente de drgeo tiene la siguiente línea:
WWW.LINUX- MAGAZINE.ES
Ficheros PO y ficheros MO
printf (_ (“\nMiss aU filename to evaluate inU —evaluate\n\n”));
Para los que no sabemos programar: printf es la función en lenguaje C que sirve para imprimir (en pantalla) mensajes; ahora nos encontramos con una modificación: “(_ ... )” es la magia que le indica a gettext que ese es un mensaje listo para ser traducido. Xgettext se va a
Educación • LINUX USER
encargar de reunir estos mensajes (msgid) y de ir anotando en qué línea aparecen, y va a crear el fichero de texto POT inicial. El primer traductor de drgeo se encontró al recibir el fichero POT con el siguiente fragmento correspondiente a la línea de código de arriba: #: drgenius_main.cc:172 #, c-format msgid “” “\n” “Miss a filename to evaluateU in —evaluate\n” “\n” msgstr “”
¿Qué hay en este fragmento? La referencia a la línea del fichero fuente donde aparece la cadena de texto, la indicación de que incluye código en C («\n» es la instrucción en C de nueva línea), y msgid recoge el texto que deberá traducirse. Ahora, y sólo ahora, comienza la tarea del traductor.
Anatomía de un fichero PO Un fichero PO es esencialmente una cabecera, una lista de mensajes originales y su traducción, más alguna información de contexto y comentarios. Empecemos por la cabecera. Ésta es la del fichero que estamos estudiando, la traducción al castellano de drgeo realizada por el equipo de traductores de GNOME [3] (ver Listado 1). Vemos el copyright, el listado de traductores que han trabajado a lo largo del tiempo en el fichero, la fecha de creación de la plantilla y de traducción (¡anterior! porque no se ha revisado o porque no ha habido cambios), y cierta información sobre el archivo (codificación, herramienta con la que se ha creado…). Antes de ver cómo se trabaja en la práctica comentaremos la última línea. ¿Qué es eso de las formas de plural? Es la última novedad del formato PO (vea de nuevo el cuadro 1). Un ejemplo nos aclarará la cuestión:
Listado 1: Traducción al castellano de drgeo 01 # translation of drgeo.HEAD.es.po to Spanish 02 # Copyright © 1998-2006 Free Software Foundation, Inc.
#: src/msgcmp.c:338U src/po-lex.c:699 #, c-format msgid “found %d fatal error” msgid_plural “found %d fatalU errors” msgstr[0] “s’ha trobat %dU error fatal” msgstr[1] “s’han trobat %dU errors fatals”
Es común que a la hora de programar o traducir no sepamos si la salida calculada (la determinación de una variable) va a ser singular o plural (¿se producirá «un error» o «varios errores»?); además, el número de formas del número varía según el idioma, desde nuestras dos formas hasta un número sorprendente. Esta nueva instrucción intenta dar solución al problema. Ahora puede informarse del número de formas singulares y plurales de la lengua destino (algunas lenguas no tienen forma de plural, otras tienen hasta cinco) y de las reglas para elegir las formas (por ejemplo el inglés o el castellano usan el singular para 1 elemento, el plural para el resto, pero hay lenguas que usan la forma singular para los números que acaban en 1: 21, 31…) [4]. En polaco la línea de la cabecera sería
03 # This file is distributed under the same license as the drgeo package. 04 # Miguel de Icaza,computo, 622-4680 <miguel@metropolis.nuclecu.unam.mx>, 1998. 05 # Pablo Saratxaga <pablo@mandrakesoft.com>, 1999,2000. 06 # Francisco Javier F. Serrador <serrador@arrakis.es>, 2003.
“Plural-Forms: nplurals=3; \ plural=n==1 ? 0 : \ n%10>=2 && n%10<=4 && (n%100<10U || n%100>=20) ? 1 : 2;\n”
Y la traducción
07 # Adrian Soto <adrianmatematico@yahoo.com.mx>, 2003,2004. 08 # Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004. 09 # Rodrigo Marcos Fombellida <rmarcos@cvs.gnome.org>, 2005,2006. 10 msgid “”
msgid “1 file” msgid_plural “%count files” msgstr[0] “1 plik”
11 msgstr “” 12 “Project-Id-Version: drgeo.HEAD.es\n” 13 “Report-Msgid-Bugs-To: \n” 14 “POT-Creation-Date: 2006-07-14 18:19+0200\n” 15 “PO-Revision-Date: 2006-03-11 23:47+0100\n” 16 “Last-Translator: Rodrigo Marcos Fombellida <rmarcos@cvs.gnome.org>\n” 17 “Language-Team: Spanish <traductores@es.gnome.es>\n” 18 “MIME-Version: 1.0\n” 19 “Content-Type: text/plain; charset=UTF-8\n” 20 “Content-Transfer-Encoding: 8bit\n” 21 “X-Generator: KBabel 1.10.2\n” 22 “Plural-Forms:
nplurals=2; plural=(n != 1);\n”
WWW.LINUX- MAGAZINE.ES
Figura 5: La versión de gettext en distintos LOCALES.
Número 19
78
LINUX USER • Educación
msgstr[1] “%count pliki” msgstr[2] “%count plików”
A la cabecera le siguen las entradas. Cada una de las entradas de un fichero PO tiene la siguiente estructura (información procedente del manual de gettext): ESPACIO EN BLANCO # COMENTARIOS DEL / DE LOSU TRADUCTORES #. COMENTARIOS AUTOMÁTICOS #: REFERENCIA(S)DEL MENSAJE... #, MARCAS (traducción dudosa,U c-format...) msgid CADENA EN IDIOMA ORIGINAL msgstr CADENA TRADUCIDA
La labor del traductor al francés consistió en rellenar en el fichero que había recibido 01 #: drgenius_main.cc:172 02 #, c-format 03 msgid “” 04 “\n” 05 “Miss a filename to evaluate in —evaluate\n” 06 “\n” 07 msgstr “” 08 “\n” 09 “Il manque un nom de fichier dans —evaluate\n” 10 “\n”
msgmergeU Traduccion_Vieja.poßs Nueva_Version.pot >U Nuevo_Fichero.po
El programa msgmerge, por supuesto que una más del conjunto de herramientas gettext, nos va a permitir reutilizar las traducciones de las cadenas de texto ya traducidas. Con una particularidad: si la cadena no es exactamente la misma entre una versión y la otra (el autor ha podido hacer cualquier pequeña modificación), va a marcar la traducción como dudosa (fuzzy). 01 #: web/template/ editaccount_main.tpl:31 02 #, fuzzy 03 msgid “New password (again)” 04 msgstr “Contraseña nueva” 05 06 # jr: aceptado 07 # jorge: en este caso yo pondría “información”, en vez de “datos”. 08 # It is more suitable to the context. 09 #: web/template/editaccount_top. tpl:2 10 msgid “You may modify your account data here.” 11 msgstr “Puede modificar la información de su cuenta aquí.”
Esto podía haberlo hecho con cualquier editor de textos. Pero los traductores disponemos de herramientas especializadas que simplifican enormemente nuestro trabajo. Es el momento de conocerlas. Pero antes vamos a repasar el ciclo de trabajo del que hablábamos. ¿Qué ocurre si el desarrollador crea una nueva versión, si el programa pasa de la versión 1.0 a la 1.1? ¿Tenemos que retraducirlo todo desde cero? ¡Vaya herramientas tendríamos si fuera así! Es el momento de conocer msgmerge.
En este ejemplo real podemos ver dos de los elementos que hemos comentado. En la primera entrada vemos que el autor ha añadido a una cadena “New password” la palabra “(again)”; msgmerge encuentra la cadena similar, pero marca la traducción como dudosa, para que el traductor sepa que debe revisarla. Traducirá “Contraseña nueva (repetir)” y borrará entonces la marca fuzzy.
Figura 6: Kbabel.
Figura 7: Revisión ortográfica en Kbabel.
79
Número 19
WWW.LINUX- MAGAZINE.ES
La segunda entrada es un ejemplo de colaboración entre traductores que debe leerse de abajo-arriba: el primero había traducido “data” por “datos”, y el segundo sugiere que por el contexto, “información” sería una traducción más apropiada. Aunque la decisión última corresponde al traductor y no al revisor, aquel acepta la sugerencia. Hemos hablado de reutilizar traducciones ya realizadas. Y hemos hablado de equipos de traductores, que traducen un número alto de ficheros. Es muy probable que haya expresiones («Guardar fichero», «¿Confirma que desea usted borrar este archivo?»…) que se repitan una y otra vez. ¿No sería útil reunir las expresiones traducidas en un gran fichero de texto, que nos facilite la traducción cuando la expresión vuelva a aparecer y nos sugiera una traducción aproximada si se da una equivalencia? Ésta es la idea que hay detrás de los llamados compendia, compendios de traducciones: grandes catálogos de mensajes traducidos. Se generan con una nueva utilidad, msgcat msgcat -o compendium.poU Fichero1.po Fichero2.po
Podríamos seguir examinando utilidades de la línea de órdenes que examinan la corrección ortográfica de un fichero PO o su corrección sintáctica… pero creo que hemos abusado ya de la paciencia de nuestro futuro traductor habituado a interfaces gráficas. En un equipo bien organizado es posible que nunca se vea obligado a utilizarlas porque existen editores PO especializados.
La herramienta de los traductores: kbabel Existen, decíamos, varios editores de ficheros PO. Históricamente el primero es el modo po de emacs (se encuentra en el
Figura 8: Validación sintáctica de un fichero PO.
Educación • LINUX USER
paquete gettext-el), y aún el manual de gettext hace continuas referencias a él. Sin embargo, este editor se ha quedado atrás en el tema de los catálogos de mensajes[5]. Gtranslator fue durante bastante tiempo la alternativa GNOME a la herramienta de KDE que veremos más adelante. Aunque es un proyecto que se quedó desfasado: aspectos tan importantes como las formas de plural simplemente no funcionan. Otra opción es poedit, útil si se piensa trabajar en Windows. Sin embargo las lenguas no latinas no acaban de funcionar. La opción elegida por la gran mayoría de los traductores actuales es kbabel, de KDE (de hecho sólo conozco a un traductor que use poedit, y a algunos viejos hackers que siguen con el modo po). Dos aportaciones destacan en kbabel: el potente y flexible gestor de catálogos de mensajes y la posibilidad de utilizar diccionarios, sean archivos PO auxiliares (personalmente uso las traducciones francesas para tener una referencia de cómo se ha solucionado algún problema de traducción en otro equipo), sean Compendios PO.[6] En la figura 6 tenemos un ejemplo de kbabel en uso. Ahora podemos respirar: menúes, iconos, todo lo que se necesita
para vivir… Vale vale, sin ironías. Por lo pronto el espacio de trabajo se divide en varios subespacios bien delimitados. El traductor ya no corre el peligro de modificar por error el texto original en lugar de la msgstr: sólo puede escribir en el espacio que corresponde a sus traducciones, presentadas una a una. Vemos que el espacio para referencias y comentarios se ha separado. Y lo que es más importante, vemos el uso que hemos ido citando de los compendios y de los ficheros PO auxiliares: en este caso la interfaz nos presenta también la traducción al francés de la misma cadena, lo que es muy práctico a la hora de tomar decisiones de traducción en caso de duda (y más aún si sabemos que la autora del programa es francesa y que su traducción es posiblemente más correcta que el original inglés). También es importante la línea de estado de la parte inferior de la interfaz: nos informa del número de mensajes del programa, pero también de los mensajes que todavía están marcados como dudosos y de los que nos faltan por traducir. Dos herramientas son importantes y no debemos dejar de destacarlas: por un lado es posible (figura 7) realizar una revisión ortográfica, tan necesaria a veces, de todos los mensajes traducidos. Por otro lado, debemos
siempre validar la correción sintáctica de nuestro fichero antes de decidirnos a dar la traducción por terminada; eso se realiza (figura 8) desde el menú Herramientas -> validación -> comprobación de sintaxis. ¿Cómo se genera el fichero MO? Permitan por un segundo que vuelva a la línea de órdenes. msgfmt -v -o Fichero.moU Fichero_es.po
¿Fácil, verdad? Y si ponemos el fichero MO en /usr/share/locale/es/LC_MESSAGES ya tendremos en uso la nueva traducción. Pero queremos que la pueda utilizar todo el mundo, no sólo nosotros ¿verdad?
Y en el próximo número… Hemos hablado de los ficheros PO; será el momento de resumir sus ventajas pero también de señalar los defectos de esta tecnología. Nos falta también hablar de las nuevas herramientas disponibles, de las alternativas al formato… Por lo demás, hemos insistido en que la traducción es cosa de equipos y de que tenemos la oportunidad de colaborar con estos equipos, nos falta conocerlos un poquito más de cerca. Quedamos citados para la próxima ■ entrega.
NOTAS [1] Sobre el instalador de Debian, http://d-i.alioth.debian.org/manual/po_stats/ y http://d-i.alioth.debian.org/l10n-stats/. Sobre GNOME http://developer.gnome.org/projects/gtp/. Para KDE, http://l10n.kde.org/stats.php. [2] Esto es verdad si se han generado los LOCALES (dpkg-reconfigure locales; para ver los que tiene instalados locale -a), pero también es verdad que si en nuestro sistema está instalada la aplicación localepurge se borrarán los mensajes de todos los idiomas que no hayamos seleccionado y además, probablemente los ficheros man de ayuda (se puede reconfigurar con dpkg-reconfigure localepurge). Esto sirve para ganar espacio de disco a costa de perder tiempo (borramos lo que ya estaba instalado) e idiomas (¿francés?, ¿catalán?) que, quizás queramos poder utilizar en algún momento. [3] Hemos buscado la versión más reciente en http://l10n-status.gnome.org/HEAD/PO/drgeo.HEAD.es.po. [4] Información encontrada en la sección 10.2.5, «Additional functions for plural forms», del manual de gettext. La problemática que ha dado pie a estas funciones adicionales se había planteado ya en 1999 en el artículo «Localization and Perl: gettext breaks, Maketext fixes», de Sean M. Burke y Jordan Lachler, publicado en el número 13 del The Perl Journal, y disponible en nuestros ordenadores (paquete perl-doc) como salida de la orden man 3perl Locale::Maketext::TPJ13. Hay problemas similares al de las formas de plural que no se han tratado todavía, como el del caso o el del género; recuerdo los problemas con los que me he encontrado en expresiones como «¿desea abrir un … hoja de ejercicios?». Aunque cuando se han discutido en la lista Translation-i18n se ha reconocido la dificultad de una posible solución y se han remitido a una necesaria «educación del programador para que use oraciones completas» (palabras de Bruno Haible). [5] Puede ampliarse la información sobre los editores PO en «Debian Installer Internationalization and Localization Guide», escrita por el equipo de desarrollo del Instalador de Debian: Petter Reinholdtsen, Dennis Stampfer, Christian Perrier (http://d-i.alioth.debian.org/ i18n-doc/apes01.html) y http://es.tldp.org/Articulos/0000otras/doc-traduccion-libre/doc-traduccion-libre/. [6] La página web de kbabel es http://kbabel.kde.org/ y tenemos un listado de características en http://kbabel.kde.org/features.php. El autor original es Matthias Kiefer y actualmente lo mantiene Stanislav Visnovsky. [7] Esta sección es un resumen de la sección 14.1 «History of GNU gettext» del fichero info de gettext. Probablemente tenga usted el fichero completo instalado en su ordenador. Si no es así puede leer el manual de gettext en formato html en http://www.iro.umontreal. ca/translation/HTML/gettext.html (en inglés).
WWW.LINUX- MAGAZINE.ES
Número 19
80
Línea de comandos: procesos • LINUX USER
Control y finalización de procesos desde la línea de comandos
CONTROL TOTAL Innumerables procesos pueden estar corriendo simultáneamente en un sistema Linux en cualquier momento dado. Enseñamos cómo detener, continuar o matar tareas y examinamos cómo enviar los restos de programas colgados al cielo de los procesos muertos. POR HEIKE JURZIK
¿
Qué es exactamente lo que está haciendo en estos momentos el sistema Linux? ¿Qué programas y procesos están corriendo en el fondo? ¿A qué aplicación está accediendo el lector de CD-ROMs? ¿Cómo se finaliza un proceso que no quiere morir elegantemente? En este artículo se darán respuesta a algunas de estas eternas cuestiones.
Listado de Procesos con ps El programa ps lista los procesos activos. Cuando se ejecuta sin especificar ninguna opción muestra un listado de aplicaciones corriendo en la shell actual. Si se necesita más información pueden especificarse algunas de las opciones de la impresionante colección de herramientas disponible. Tal y como figura en el manual, ps entiende parámetros Unix con un simple guión, opciones BSD sin guión y opciones GNU con dos guiones. La elección de cómo pasamos los parámetros a ps es un asunto de preferencia personal, aunque en este artículo nos
centraremos en las variantes abreviadas sin guiones. Para listar todos los procesos que se están ejecutando como usuario hay que especificar la opción x (ver Listado 1), por ejemplo. El comando ps proporciona una lista clasificada muy clara de los procesos que corren bajo ID del usuario. Clasifica la salida mediante Process Identifier, es decir, el número del proceso (PID), el número del terminal o de la consola virtual (TTY), el estado del proceso (STAT), los ciclos de uso de la CPU (TIME) y el nombre del comando incluyendo los parámetros (COMMAND). En el campo STAT, ps lista típicamente uno de los siguientes estados: • S: sleeping (durmiendo), es decir, el programa no tiene nada que hacer en este momento • R: running (o ejecutando) • D: El proceso está muerto y no puede ser rearrancado • Z: Zombie: el proceso se ha comple tado, pero no ha pasado correcta mente su estado de devolución
W WW WW W.. LL II N NU UX X -- M MA AG GA A ZZ II N N EE .. EE SS
Si se está interesado en ver tareas que pertenecen a otros usuarios del mismo sistema, puede especificarse la opción a. Como esta larga lista de tareas no ofrece los IDs del usuario para los programas, se puede utilizar también el parámetro u para obtener el propietario, el tiempo CPU y el uso de memoria (ver Listado 2 para un ejemplo).
Relaciones En determinados casos, algunos procesos dan lugar a otros procesos. Tras arrancar, el primero que se produce es el denominado init. Seguido de este proceso padre se arrancan también otras tareas o procesos hijos, que a su vez dan lugar a otros procesos. Con la opción l pueden verse las relaciones entre ellos, pues exige a ps que presente otra columna con los procesos ID padre (o Parent Process ID) (PPID). El parámetro f permite que la jerarquía sea más fácil de leer, usando para ello una imagen ASCII. Como alternativa al
Número 19
81
LINUX USER • Línea de comandos: procesos
Listado 1: ps con la opción x 01 $ ps x
Listado 2: Procesos de otros usuarios 01 $ ps aux
02 PID TTY
STAT
TIME COMMAND
03 3705 ?
Ss
0:00 /bin/sh /usr/bin/startkde
02 USER PID %CPU %MEM START TIME COMMAND
RSS TTY
04 3763 ? Ss bin/startkde
0:00 /usr/bin/ssh-agent /usr/
03 root 1 0.0 0:00 init [2]
05 3789 ?
Ss
0:00 kdeinit Running
04 ...
06 3792 ?
S
0:00 kdeinit: dcopserver —nosid
07 3794 ?
S
0:00 kdeinit: klauncher
05 huhnix 3705 0.0 0.2 2748 1296 ? 0:00 /bin/sh /usr/bin/startkde
1504 512 ?
STAT S
08:31
Ss
08:33
06 ...
08 ...
parámetro f puede ejecutarse el programa pstree, que también presentará una visión útil de las relaciones (Figura 1). Si se están buscando procesos que acaparan los ciclos del CPU, ps no es la mejor opción, ya que, como simplemente muestra una instantánea del estado actual, no se conseguirá obtener demasiada información acerca de la carga del sistema actual. Para ayudar en esta tarea Linux dispone de la herramienta top. Top es un controlador de procesos que actualiza la presentación para proporcionar el estado actual. Puede arrancarse escribiendo top en la línea de comando. El programa proporciona una extensa información sobre el sistema y los procesos que corren en él. La línea superior muestra la hora, el tiempo que lleva la máquina conectada, el número de procesos y los detalles del estado junto con la
CPU, memoria y la carga de la memoria de intercambio. La línea de estado top contiene información sobre los procesos individuales. La línea de estado posee columnas para los procesos ID (PID), el uso de memoria en formato de porcentaje (%MEM), el proceso ID padre (PPID), el tiempo consumido por la CPU como porcentaje (%CPU) y el nombre del comando (COMMAND). Pero puede decírsele a top lo que se desea ver: se pulsa [F] y las letras adecuadas para especificar el contenido de la línea de estado. Un determinado número de comandos permiten controlar top interactivamente. Por ejemplo, pulsando [H] se obtendrá la ayuda en línea. [U] seguido del nombre de usuario presenta los procesos para ese usuario. [Shift]+[R] invierte la salida mostrando los procesos más frugales en lugar de los acaparan a la CPU. Con [Q] se sale del programa y se regresa a la shell. Si se pulsa [Shift[+[Z] se
Figura 1: Comparando los comandos f de ps y pstree. ¿Se distingue el bosque de los árboles?
82
0.0
VSZ
Número 19
podrá añadir más color al programa. La tecla [W] permite elegir entre un número de esquemas de color predefinidos, aunque también pueden pulsarse las letras y números apropiados que permitan definir un esquema de color personalizado (Figura 2).
Quiero Más El programa lsof (lista de ficheros abiertos) suministra más información sobre procesos individuales. Esta herramienta ayuda a descubrir los procesos que están accediendo a los ficheros. Si se ejecuta lsof sin especificar ningún parámetro, el comando ofrecerá una lista completa de ficheros, lo cual puede ser bastante extenso. Para mejorar la legibilidad de la lista debería encauzar la salida al paginador less: lsof | less. Para conocer qué usuario se encuentra trabajando actualmente con el editor Vim, puede pasarse el nombre del binario Vim al programa cuando éste es invocado (Listado 3). Lsof es particularmente útil cuando interesa encontrar los procesos que están bloqueando en ese momento un fichero en un dispositivo. Si el sistema se niega a
Figura 2: La salida desde el monitor de procesos top… coloreado.
WWW.LINUX- MAGAZINE.ES
Línea de comandos: procesos • LINUX USER
También son kill -18 pid a la ID del proceso. Para interesantes otras reanalizar un super-demonio modifi01 $ isof /usr/bin/vim señales que le cado, una configuración Inetd o dicen a los proceXinetd, se envía al servidor la señal 02 COMMAND PID USER FD TYPE DEVICE SIZE sos que acaben siguiente: NODE NAME (SIGSTOP) y que 03 VIM 4065 huhnix txt REG 3.10 1411096 647400 recomiencen (SIGkill -l `cat /usr/bin/vim CONT). kill -l /var/run/inetd.pid` 04 vim 4609 ardbeg mem REG 3.10 1411096 64700 ofrece una lista kill -l U /ur7BIN7vim completa (Figura `cat /var/run/xinetd.pid` 3). A menos que se Listado 4: Comprobación de Ficheros de sea el administraComando Asesino dor del sistema, Dispositivos solamente se pueEl programa killall suministra las 01 $ isof /dev/hdc den enviar estas mismas señales que su colega kill, 02 COMMAND PID USER FD TYPE DEVICE SIZE NODE señales a los propero en lugar del ID espera el nombre NAME cesos propios. El del proceso. Si se ejecuta killall sin 03 kdeinit 4466 huhnx 12r BLK 22.0 2846 superusuario, por especificar la señal, el programa asu/dev/hdc otro lado, tiene mirá que se trata de -15 (TERM). Es permitido ejecutar decir, invocando a killall firefox-bin Listado 5: Consiguiendo una salida amplia kill contra proce- se finalizarán elegantemente todas sos globales o las instancias del navegador Firefox. 01 $ ps auxwww | grep 4466 procesos perteneLo que realmente hace killall es 02 huhnix 4466 o.o 2.4 27972 12572 ? S 11:33 cientes a otros tomar un atajo para eliminar los pro0:00 kdeinit: kio_audiocd usuarios. cesos activos. Es aconsejable tener Por defecto, el precaución: el comando killall bash 03 audiocd comando kill (sin finalizará todos las instancias de /tmp/ksocket-huhnix/klauncherz9ZRha.slave-socket parámetros) envía Bash, incluyendo la shell donde se /tmp/ksocket-huhnix/konquerorVPZ1va.slave-socket la señal 15 al proescribió el comando. Puede especifidesmontar la unidad del CD-ROM, por ceso. Otro argumento que puede carse la opción -i para conectar con ejemplo, puede usarse lsof para conocer especificarse es el PID, como en kill el modo interactivo; esto permite eleel proceso que está accediendo al fichero 4200. Si esto no ayuda, y el proceso gir los procesos a matar del dispositivo (Listado 4). persiste en la lista, se necesitarán individualmente: Ahora puede añadirse el comando ps adoptar medidas más drásticas y para ver el proceso oculto tras el PID enviar la tarea al Nirvana de los proce$ killall -i xterm 4466. Para ello se usa el parámetro aux sos recalcitrantes. kill xterm(3838)? (y/n) y con la opción w para obtener una Un valor numérico permite masacrar kill xterm(4242)? (y/n) n salida ampliada (este parámetro puede el proceso de manera expeditiva (kill kill xterm(4246)? (y/n) y especificarse múltiples veces) (Listado -9 4200). Puede usarse como alternakill xterm(4250)? (y/n) y 5). tiva el nombre (kill -KILL 4200). El culpable obviamente es una venObsérvese que es preciso omitir el preEste comando asesino presenta el PID tana de Konqueror que muestra el fijo SIG con la última opción. Si con y solicita el proceso que enlaza con el contenido de un CD. Para liberar la uniesto aún sigue sin detenerse el molesto nombre que se especificó. Posteriordad, probablemente sea necesario cerrar proceso, todo lo que puede hacerse es mente puede decidirse si se desea que la ventana del administrador de ficheros esperar durante algún tiempo. En alguel proceso viva (pulsando [N]); si se o simplemente cambiar de directorio. Si nos casos (afortunadamente raros) pulsa [Y] es “Hora de decir adios”. ■ esto no ayuda, siempre se puede recurrir será necesario reia matar un programa para acabar de una niciar el ordenador vez con un proceso testarudo. para limpiar. También resulta Al Ataque muy útil la funcioEl programa kill envía señales a un nalidad que proceso, incluyendo una señal que le permite detener dice que reanalice su fichero de tareas específicas configuración (SIGHUP), que termine (kill -19 pid). Para elegantemente y que limpie que el proceso con(SIGTERM), o que termine indepentinúe a partir del dientemente de las consecuencias punto donde se Figura 3: La opción -l ofrece una lista de las señales kill. (SIGKILL). quedó, se envía
Listado 3: ¿Quién está usando Vim?
WWW.LINUX- MAGAZINE.ES
Número 19
83
LINUX USER • Juegos
Los matamarcianos clásicos re-interpretados.
J-SHOOTERS Ha surgido en tierras del sol naciente una nueva vuelta de tuerca al género de los “matamarcianos”. Gráficos vectoriales muy simples, velocidad, buena jugabilidad y dosis monumentales de adicción que, totalmente gratis, están disponibles para nosotros. POR VICENTE CARRO
D
esde hace años el programador Kenta Cho (alias Saba) ha estado realizando una serie de “matamarcianos” (también llamados shooters o shoot’em ups) libres con un toque muy especial. Estos juegos, aunque de licencia libre (BSD en su mayoría), están escritos en lenguaje D, una versión mejorada del conocido lenguaje C, pero con el gran inconveniente de no ser completamente libre (al menos el compilador). Si a esto le unimos que Kenta Cho no los realizaba para linux, obteníamos unos geniales juegos que no podíamos disfrutar. Afortunadamente esto ha cambiado.
Ports para Linux
Lo más evidente de todos ellos es que hacen uso de unos gráficos extremadamente simples, incluso en algunos casos mostrando sólo lineas vectoriales que definen la formas, como si el mundo en el que se desarrollase la historia fuese siempre una realidad virtual donde la materia y la textura no tuvieran cabida. Junto a estos gráficos simples hay que añadir una dificultad creciente y que llega a ser desmedida a todas luces. Nos encontraremos con modos de dificultad “Insane”, “Extreme” y similares sólo recomendados para los más adeptos a exprimir sus reflejos al máximo. También es necesario que haya multitud de elementos en pantalla, en algunas ocasiones cientos de elementos entre enemigos y
proyectiles. Esquivar decenas o centenares de disparos enemigos puede ser estresante, pero provoca una extraña sensación adictiva en nosotros. Más aún cuando logramos salir intactos de una tormenta de disparos, ya que experimentaremos un enorme orgullo por nuestras habilidades, e incluso lamentaremos que no estuvieran delante nuestros amigos para jactarnos de lo que hemos sido capaces de hacer. La jugabilidad es fundamental en este tipo de juegos, ofreciendo un control sensible y muy ajustado para que el jugador pueda sentir que lo que define realmente la situación no es otra cosa que sus propios reflejos. Además hay que regalar “vidas extra” a intervalos para recompensar la habilidad del jugador, y por
Figura 1: No sólo tendremos que esquivar todos estos proyectiles, sino que además habrá que recoger los proyectiles verdes.
Figura 2: Cuanto más avancemos en el juego, más rápido y difícil será el recorrido en el tubo.
En Junio de 2004, otro programador conocido como EvilMrHenry se decidió a portar los títulos de Kenta Cho. La tarea fue dura pero finalmente estas fueron viendo la luz para linux e incluso a día de hoy EvilMrHenry continua portando nuevos juegos del incansable Saba y de algún nuevo programador de este estilo, como Jumpei Isshiki con su juego Z-lock.
Características comunes Este tipo de juegos, que podemos clasificar como japan shooters o J-shooter, tienen una serie de características comunes que los diferencian del resto.
84
Número 19
WWW.LINUX- MAGAZINE.ES
Juegos • LINUX USER
Figura 3: Nuestro avión con algunos “extras” recogidos en pleno vuelo.
supuesto es necesario que haya una puntuación para que quede constancia numérica de nuestro progreso. Por último tiene que acompañar una música que nos ponga en situación, generalmente maquinera y trepidante, para que nuestra atención esté al 100% en la pantalla. Quizás no sean las mejores composiciones musicales de la historia, pero es innegable que encajan con este tipo de juego como ninguna otra lo haría. A esta música hay que añadirle unos efectos de sonido adecuados, basados en explosiones y disparos contundentes y creíbles.
Uno a uno A continuación vamos a dar un breve repaso a los mejores exponentes de los Jshooters destacando los puntos que los diferencian entre ellos. Nois2za Es, a título personal, el mejor de los JShooters actuales. En este juego, creación de Saba, pilotas una nave compuesta de un punto (zona que puede explotar por contacto con cualquier cosa) y unas barras verdes giratorias decorativas. Lo más diferenciador de este título es que la destrucción de los enemigos genera unos proyectiles verdes
que tendremos que recoger para aumentar nuestra puntuación. Se puede descargar desde este enlace: [1]. Torus Trooper La acción se desarrolla en el interior de un tubo sin límites. Nuestra nave irá pegada a sus paredes interiores sobre las que podremos desplazarnos esquivando obstáculos y eliminando enemigos a velocidades de vértigo. Será el tiempo el que determine cuando se acabó la partida, así que tendremos que ganar tanto tiempo extra como sea posible evitando nuestra muerte, alcanzando ciertas puntuaciones y destruyendo jefes finales. También disponemos de un disparo especial que podremos cargar durante unos segundos antes de liberarlo con todo su poder contra las naves enemigas. También ha sido creado por Saba. Se puede descargar desde este enlace: [2]. Tumiki Fighters Saba cambia de tercio con este juego y nos coloca a los mandos de un avión que se enfrenta a una multitud de enemigos en un mundo de estética un poco infantil. Cuando un enemigo es destruido, su aeronave salta en pedazos y, si somos lo suficientemente hábiles, podremos ir a recoger algunas de dichas piezas que, mágicamente, se pegarán a nuestra nave. Estas piezas pueden ser usadas como simples armaduras o, si incluían un arma, se pondrán a disparar por su cuenta, dándonos cobertura extra. Se puede descargar desde este enlace: [3]. rRotage Otro de los grandes entre los J-Shooters. Centenares de proyectiles en los niveles más duros y cuatro modos de juego distintos (NORMAL, PSY, IKA y GW) nos darán horas y horas de diversión. Los distintos modos cambian notablemente la jugabilidad y cada modo podría considerarse un juego por sí mismo. También es obra del incansable Saba. Se puede descargar desde este enlace: [4]. Parsec 47 Este juego, el favorito de EvilMrHenry, nos pone en manos de un clásico “matamarcianos” donde la única diferencia con la jugabilidad habitual reside en que nuestra nave responderá mucho más rápidamente a nuestras indicaciones de lo normal, lo cual es especialmente evidente si jugamos en modo Extreme. Por lo demás el juego sigue a rajatabla el guión establecido de este tipo de juegos. Se puede descargar desde este enlace: [5].
Distribución Figura 4: Probablemente rRotage sea el JShooter con más proyectiles en pantalla, una verdadera locura.
Dado que la mayor parte de estos juegos se han programado en lenguaje D y el compilador D no es libre, se ha optado por
WWW.LINUX- MAGAZINE.ES
Figura 5: Velocidad y más velocidad es lo que encontraremos en Parsec 47, todo depende de nuestros reflejos.
incluir en los archivos de distribución tanto las fuentes con el código como un binario precompilado que debería funcionar en la mayoría de las máquinas i386 o superiores. Así se podrá jugar inmediatamente simplemente haciendo doble click sobre el ejecutable.
Conclusión Desde el principio de la historia de los videojuegos, los “matamarcianos” han gozado de un gancho natural que crea adicción en los jugadores nada más probarlos. Estos J-shooters heredan esa adicción pero la potencian añadiendo un poco más de todo y simplificando en extremo la complejidad gráfica para centrar al jugador en su tarea de destruir enemigos y esquivar disparos. Sólo los detractores de los “matamarcianos” quedarán impasibles ■ ante estos juegos.
Puntuación GLOBAL:
7
Lo mejor • Libres (BSD) • Muy adictivos Lo peor • Requieren muchos reflejos • El compilador D no es libre
RECURSOS [1] Noiz2sa http://noiz2sa.sourceforge. net/ [2] Torus Trooperhttp://www.emhsoft. net/ttrooper/ [3] Tumiki Fightershttp://tumiki. sourceforge.net/ [4] rRotagehttp://rrootage.sourceforge. net/ [5] Parsec 47http://parsec47.sourceforge. net/
Número 19
85
COMUNIDAD · Konsultorio
EL CONSULTORIO DE KLAUS Klaus Knopper es el creador de Knoppix y co-fundador de la LinuxTag Expo. Trabaja en la actualidad
como
profesor,
programador y consultor. Si tiene algún problema de configuración, o simplemente quiere conocer mejor cómo funciona Linux, no dude en escribir sus preguntas a:
preguntas@linux-magazine.es.
Administración de Energía No importa qué distribución de Linux esté usando: no hay manera de que me funcionen las características de administración de energía en mi portátil con micro Intel. El sistema, o bien no hiberna, o bien estropea algo en este proceso. ¿Cómo puedo averiguar cuál es el problema, y qué puedo hacer para conseguir que me funcione la administración de energía? Hace un par de años existía una cosa llamada “Automatic Power Management” o APM (que aún funciona bien incluso
86
Número 19
en algunos ordenadores modernos, aunque la documentación de la placa diga que ya no está soportada). Con APM el hardware controlaba la velocidad de la CPU, el consumo de la CPU, aspectos de la batería, suspensión a RAM e incluso suspensión a disco, mientras que el sistema operativo podía ignorar felizmente estas funciones. Las cosas empezaron a cambiar con la introducción del ahora estándar ACPI, que se supone que no sólo debe permitir al sistema operativo controlar las características de energía, sino también administrar parte de la configuración hardware (IRQ) y la administración del estado del sistema. Algunos dirán que ACPI fue introducido para conseguir más beneficios al vender chipsets más baratos, ya que toda la lógica se centra ahora en software en lugar de en hardware auto-controlado. Pero los fabricantes de placas elogian a ACPI por su “acceso completamente controlable” a algunas características (como la administración de energía y configuración del hardware) desde el sistema operativo, y hoy día vemos placas que realmente no funcionan sin un kernel con el ACPI habilitado. Si tu placa todavía soporta APM, y no te importa dejar que el hardware controle automáticamente la administración de energía, en lugar de ACPI cambia a APM. En mi opinión, APM, si está disponible, ofrece mejores resultados (tanto en términos de rendimiento como en duración de las baterías para portátiles) haciendo que cualquier cosa sea extremadamente fácil de configurar. Sólo tenemos que compilar el soporte de APM dentro del kernel y deshabilitar ACPI en el arranque, con la opción acpi=off del kernel. Para algunas placas ésta es la única manera fiable de conseguir que funcione adecuadamente la suspensión a RAM o la suspensión a disco.
WWW.LINUX-MAGAZINE.ES
Ahora bien, si sigues queriendo usar ACPI (o si estás obligado porque tienes una placa que así lo requiere), y lo configuras todo por ti mismo, te vas a enfrentar a un buen número de sesiones de prueba y errores hasta encontrar qué partes de ACPI funcionan y cuáles no. Yo también he tenido que pasar por este procedimiento con muchas placas. Si los fabricantes simplemente ofrecieran ejemplos de configuración operativos para Linux (como hacen para Windows proporcionando “drivers de placa” que arreglan también errores de la placa madre), todo sería mucho más fácil. Pero por algún motivo deben pensar que todos los usuarios de Linux son expertos en hardware capaces de arreglar chipsets defectuosos. Para configurar y experimentar con ACPI, deberíamos instalar en primer lugar un kernel REALMENTE ACTUALIZADO con ACPI habilitado. Placas con diferentes implementaciones aparecen cada dos por tres, y los desarrolladores de Linux tienen que arreglar fallos y encontrar cómo controlar ACPI en estas placas nuevas en cada lanzamiento previsto del kernel. Por tanto es fundamental usar un kernel que al menos sea más reciente que nuestra placa de ordenador.
Konsultorio • COMUNIDAD
Las partes de ACPI están en la zona estática del kernel, pero virtualmente cualquier módulo del kernel debe implementar también los conectores ACPI para poder apagar un dispositivo o cambiar el modo de energía, tras una petición. En algunos ordenadores tendremos que usar la opción de arranque acpi=force para habilitar DE VERDAD ACPI, incluso si al kernel no le parece una buena idea. Para cosas como suspensión a disco, la parte complicada del asunto es encontrar qué componentes hardware la soportan, así como los módulos del kernel que tienen los conectores ACPI necesarios para poner un componente en estado latente y despertarlo más tarde sin confundir al hardware. Un ejemplo de procedimiento para habilitar la suspensión a disco en nuestro portátil podría ser algo como: 0. ¿Recuerdas la lección acerca de hacer copia de seguridad de todos los datos importantes, no? 1. Nos aseguramos de que nuestra partición swap tiene tamaño suficiente para albergar toda la RAM de nuestro ordenador, además de todos los componentes de software en ejecución con componentes en la swap. (Esto es necesario sólo para la suspensión a disco, no para la suspensión a RAM). El kernel debería compilarse con el “software suspend-to-disk” habilitado. Ojo: esta opción aparece sólo en kernels SMP si también hemos habilitado “software suspend-to-disk”. De igual manera, debemos asegurarnos que la partición para la suspensión (la mayor partición swap) se ha configurado en el setup del kernel. Podemos usar, no obstante, la opción resume = /dev/hd* para declarar esto en el arranque. 2. Descargar TODOS los módulos del kernel antes de intentar la suspensión a disco. Las tarjetas de sonido en placa, los controladores PCMCIA y USB y los dispositivos son especialmente críticos. De todos modos, la mayor parte de estos componentes no necesitan realmente soporte para la suspensión, por lo que otros sistemas operativos hacen lo mismo: deshabilitan o descargan los drivers en la suspensión y los reinician al despertar el equipo. Probablemente deberíamos probar esta técnica sin el modo framebuffer en la consola. Hasta hace muy poco (kernel 2.6.15), el framebuffer aparentemente no despertaba bien, en especial cuando el rendering directo estaba habilitado. El mismo problema aparece en los servidores X, aunque no tendríamos que apagar las X para hacer suspensión a disco (y luego despertar) de manera adecuada. A veces ayuda cambiar a una consola de texto
antes de la suspensión, de manera que se fuerza a refrescar más tarde el servidor X. Incluso podemos hacer esto dentro de un script con chvt 1. 3. Iniciamos la suspensión a disco con: sync ; sync ; sync # Trust me... echo 4 > /proc/acpi/sleep
(Previamente deberíamos haber conmutado a la consola del sistema para ver qué está
pasando). Nuestro kernel debería intentar liberar memoria copiando todo lo que está en RAM, más el estado del chipset, a la partición swap. Después debería borrar los bits de swap de la partición (de manera que swapon falle si alguien arranca por error sin la opción resume), y por fin, apagar el equipo. Esta parte normalmente funciona sin problemas (la parte realmente “excitante” es cuando intentamos despertar el ordenador más tarde).
Listado 1: Ejemplo ACPI 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
# cat /proc/acpi/thermal_zone/THRM/cooling_mode \ /proc/acpi/processor/CPU0/performance Result: cooling mode: active state count: 2 active state: P0 states: *P0: 1800 MHz, 20000 mW, 250 uS P1: 1200 MHz, 10000 mW, 250 uS # echo 1 >/proc/acpi/processor/CPU0/performance # echo 1 >/proc/acpi/thermal_zone/THRM/cooling_mode # cat /proc/acpi/thermal_zone/THRM/cooling_mode \ /proc/acpi/processor/CPU0/performance Result: cooling mode: passive state count: 2 active state: P1 states: P0: 1800 MHz, 20000 mW, 250 uS *P1: 1200 MHz, 10000 mW, 250 uS
Acerca del Calor Muchas placas DEBERÍAN tener implementaciones correctas de ACPI que enciendan el ventilador si la CPU comienza a recalentarse. Sin embargo, mi recomendación es no confiar en esto y hacer algunas comprobaciones al respecto. Podemos comprobar la temperatura de nuestra CPU en cualquier momento tecleando: # acpi -V Result: Battery 1: discharging, 99%, U 02:27:58 remaining Thermal 1: ok, 75.0 degrees C AC Adapter 1: off-line
(El comando “acpi” es parte del paquete de utilidades “acpi”) Si vemos que la temperatura sube por encima de los 90ºC y nuestra placa falla al controlar la “emergencia”, deberíamos activar la refrigeración rápidamente:
WWW.LINUX-MAGAZINE.ES
# echo 0 >/proc/acpi/U thermal_zone/THRM/cooling_mode
Algunos programas que se ejecutan como demonios se supone que reducen automáticamente la velocidad de la CPU y el consumo si no están haciendo nada demasiado exigente, proporcionando potencia extra de CPU en caso de que se necesiten cálculos intensivos o la carga sea elevada. No obstante, muchos de estos programas no funcionan del todo bien, y los patrones bajo los cuales se decide proporcionar más o menos potencia de CPU son bastante arbitrarios. Si queremos probar, sólo tenemos que teclear load acpi-cpufreq, o speedstep-ich y ver qué podemos cambiar en /proc/acpi. Programas como cpufreqd, powernowd y powersaved se supone que proporcionan cierto control sobre el escalado de frecuencia y el consumo de las CPUs que los soportan.
Número 19
87
COMUNIDAD · Konsultorio
Si experimentamos un kernel panic en este punto, debemos verificar si todo lo que puede compilarse como módulo (y no sea necesario en un estadio temprano del arranque para acceder a la información del sistema de archivos) está realmente compilado como módulo y ha sido satisfactoriamente descargado con rmmod antes de la suspensión. No debemos olvidar ejecutar el verificador de sistema de archivos tras una suspensión a disco fallida, si es que nuestro sistema no lo hace automáticamente. Tal vez necesitemos un kernel más reciente… 4. Para arrancar en la sesión guardada/suspendida, sólo tenemos que iniciar nuestro kernel de Linux, pero (véase punto 1) previamente deberíamos haber especificado la partición “resume” en nuestra configuración del kernel o haber usado la opción resume=/dev/ hd*. De otra manera, el kernel arrancará en modo normal e ignorará el hecho de que hay una sesión guardada en la partición de swap. Esto puede llevar a una situación bastante indeseable. Se verificará todo el sistema y probablemente habrá modificaciones, pero cuando se detecte correctamente la sesión salvada en un arranque posterior, tomará el sistema de archivos como bueno, lo que provocará un sistema de archivos corrupto. Lo mejor será que no arranquemos nunca sin continuar una sesión guardada, incluso si planeamos montar nuestro sistema de archivos como de sólo lectura. Ext3, por ejemplo, al menos en las versiones que he podido ver, modifica la partición incluso cuando está montado como sólo lectura. El kernel debería mostrar el progreso al cargar los datos almacenados en la partición de swap. Tras esto, vuelve a colocarse la marca de swap, por lo que la partición de swap ya puede reconocerse como tal. En el desafortunado caso de que la reanudación desde disco realmente no funcione al primer intento, tendríamos que (re)cargar los módulos del kernel que han sido anteriormente descargados de manera que podamos tener operativa la tarjeta de sonido y todo lo demás. Si todo funciona correctamente, guardar a disco y reanudar desde disco pueden ayudar realmente a acelerar el proceso de arranque, porque mantienen los programas existentes en funcionamiento (salvo por aquellos que necesitan los módulos del kernel que han tenido que descargarse). Tendremos que averiguar qué módulos podemos mantener durante la suspensión y reanudación y cuáles otros dependen de la CPU. Los más
88
Número 19
problemáticos suelen ser los relacionados con las tarjetas de sonido, pcmcia (controlador + dispositivos) y USB (controlador + dispositivos). Los deberíamos compilar siempre como módulos de modo que pudiesen ser deshabilitados y recargados de manera sencilla y no molesten al proceso de Figura 1: Verificamos el uso de la CPU y la memoria con el comando suspensión y “top”. reanudación. A pesar de todos los problemas, ACPI prokill -CONT process_id porciona algunas opciones interesantes. Algunas de las cosas “sencillas” que podemos lo cual permite que el programa gane algo hacer con ACPI pueden ser trucos para conde tiempo de CPU. Este truco puede que no mutar la potencia/frecuencia de la CPU y el libere temporalmente memoria, pero puede ruido del ventilador (véase Listado 1). Al ayudar si no queremos finalizar un promenos en mi portátil, puedo reducir la fregrama en ejecución, sino que sólo queremos cuencia de la CPU (y disminuir drásticamente suspenderlo. el consumo) y a continuación bajar la velociPodemos también usar nice al iniciar un dad del ventilador de la CPU para tener un programa, o renice más adelante, para dar equipo más silencioso sin que vaya del todo menos prioridad a un proceso. Pero lo que lento. Por supuesto, si estamos toqueteando el es obviamente cierto es que un programa ventilador del disipador, debemos asegurarque no se ejecuta no consume recursos de nos que podemos conectarlo de nuevo. Más sistema. información en el cuadro “Acerca del Calor”. Desafortunadamente, KDE puede pensar que un programa suspendido se ha colgado, Apuesta acerca de Ventanas y puede que aparezca algún molesto aviso Por favor, ayúdeme a dilucidar una sugiriendo que lo matemos de verdad. apuesta. ¿Corre un sistema significaEstoy de acuerdo en que OpenOffice en tivamente más rápido si se cierran las segundo plano consume un montón de ventanas abiertas que están minimizadas memoria y puede ralentizar otros procesos en la barra de tareas? (a menos que las partes inactivas de OpenOffice hayan pasado a swap). El caso más Esta apuesta no tiene un ganador común de programa que consume muchos claro, ya que todo depende de los recursos del sistema es el de un navegador programas que están abiertos. Si son Web como Konqueror o Firefox, que se intensivos en cuanto a CPU y glotones de queda ejecutando gráficos animados, flash o memoria, por supuesto, el sistema irá applets de Java que consumen CPU y mucho más rápido si cerramos la memoria. Podemos teclear “top” para verifiaplicación. car esto. Si vemos una gran cantidad de Por cierto, en términos de uso de CPU, a memoria asignada a este tipo de programas, veces ayuda si simplemente SUSPENDEel sistema irá más rápido si no los ejecutaMOS el proceso en lugar de finalizarlo. Para mos. También podemos cerrar el navegador ello mandamos: y reiniciarlo. Probablemente es mejor idea editar las kill -STOP process_id preferencias del navegador, y deshabilitar la ejecución automática de los plugins, y luego al proceso process_id en cuestión. La venejecutar los que elijamos (si es que el navetana deja de responder, pero podemos gador lo permite. Konqueror sí lo permite). ■ volver a despertarla más tarde enviando: ¿Quién ganó la apuesta?
WWW.LINUX-MAGAZINE.ES
EDITORIAL
HARDCORE Viene de la página 3 El segundo problema con el que nos encontramos es que los que ya están dentro suelen tener el ego del tamaño de un Airbus. Son autoritarios, bocazas y despectivos. No apetece nada trabajar con gente así. Además, suelen despreciar a los desarrolladores de otros proyectos más “frívolos” (escritorios y cosas así), tachando sus proyectos de superfluos e innecesarios. Bonita manera de conseguir ayuda: insultando el trabajo de los que te la pueden ofrecer. Pero es que aparte de contraproducente, las acusaciones son injustas y mentira: el desarrollo de un escritorio usable favorece de manera clara a los programadores de Linux, a cualquier programador de Linux. Cuando personalmente sólo tenía un ordenador y Linux no daba la talla en el escritorio, tenía que saltar de un sistema operativo a otro para escribir un artículo. Gracias a los desarrolladores del escritorio, puedo escribir un artículo técnico sin tener que reinicar al principio y al final de cada párrafo. Ya les oigo, ya: “Pues podías utilizar Emacs o vi desde la consola”. Según esa regla de tres ¿por qué no componer mis artículos directamente en binario? O, para el caso, ¿por qué no utilizar un martillo y un cincel sobre un bloque de granito? Existe una suerte de desarrollador prepotente “machito” que, al igual que el insolente paleta que silba e insulta a las mujeres que pasan por la calle, tiene que pasar a la historia. Su actitud es inapropiada, es soez, es contraproducente, y esto último es lo peor de todo. Si como desarrolladores encontrásemos un cuello de botella en un
programa y supiéramos cómo eliminarlo, no dudaríamos en hacerlo. Pues los bocazas que creen estar en posesión de la verdad absoluta son el cuello de botella que impiden el paso de nuevos programadores a las imprescindibles tareas de desarrollo de Linux para el servidor. Para cada problema existe una solución. Ya se sabe que si tu problema tiene solución ¿de qué te preocupas? y si no la tiene ¿de qué te preocupas? Y esto no es para nada como lo de la velocidad de la luz o el conflicto palestino-israelí. Sólo es cuestión de logística. Pero, si bien el primer paso hacia la resolución de un problema es admitir su existencia (y esto, a juzgar por los aullidos que provienen del sótano, es algo ya superado), el segundo es querer resolverlo. La pregunta clave es: ¿Se está dispuesto a aceptar a más gente en el seno del desarrollo hardcore? ¿Se está dispuesto a quitarse tiempo de desarrollo para formar a los recién llegados, a coordinarlos y supervisar su trabajo? ¿O se prefiere seguir quejándose? Los enfermos del síndrome de Munchhausen consiguen ser el centro de atención de su entorno simulando enfermedades en su persona. El verdadero peligro ocurre cuando un paciente, en su afán de convencer a los médicos de que su enfermedad no es imaginaria, se autoinfligen daños tomando drogas que ayudan a simular mejor los síntomas, cayendo en un círculo vicioso donde, cuanta más atención reciben, más enfermos se ponen. ¿No será éste también un problema de los desarrolladores hardcore? ¿Cómo piensan atraer gente hacia su área de especialidad siendo desagradables con todo el mundo?
Si, como ya hemos visto, el trabajo de depuración y de desarrollo de drivers ya de por sí es poco agradecido, y encima la persona con la que contactas ofreciendo tu ayuda te trata con la punta del pie porque utilizas Kate en vez de Emacs, apaga y vámonos. El mensaje, desde mi punto de vista y en muchos casos, es muy claro: muchos desarrolladores hardcore son desagradables porque (a) eso les granjea la atención que creen que se merecen y (b) mantiene alejado a todo aquel que les pudiera ayudar lo que (c) sirve como excusa para seguir siendo desagradable. En este escenario, los responsables de la falta de desarrolladores serían, al menos en parte, los mismos que denuncian esa falta. Pero, insisto, el problema es muy real y uno de los primeros pasos es hacer acto de contrición, admitir la propia culpa y humillarse, aunque sea en privado. A continuación, dejar de insultar a los desarrolladores de otros proyectos, reconocer su valía, con el fin de que se respete la valía propia. Es necesario que los desarrolladores de servidores se den cuenta de que han de estar dispuestos a dar un paso atrás con el fin de intentar conseguir dos pasos hacia delante. Esto exige dejar de programar un rato, organizarse entre ellos y coordinar una campaña de captación de programadores, ya sean de otros proyectos, ya sean de entre los nuevos programadores que desembarcan en Linux por motivos profesionales o curiosidad personal. Pero, de nada servirá captarlos para que al día siguiente salgan pitando por no poder soportar la arrogancia de los veteranos. En muchos casos, los programadores se software libre trabajan por amor al arte y no tienen porqué aguantar desaires de ■ nadie.
RECURSOS [1] Análisis del uso de servidores en Internet de los últimos meses de Netcraft: http:// news.netcraft.com/archives/web_server_survey.html [2] Artículo de Linux Today donde se explican los hallazgos de los estudios de Evans Data: http://www.linuxtoday.com/news_story. php3?ltsn=2006-06-02-028-26-OP-MR-DV [3] Artículo sobre la migración de GoDaddy en Newsforge: http://business.newsforge. com/article.pl?sid=06/04/20/1652228&from=rss
WWW.LINUX- MAGAZINE.ES
Paul C. Brown Director
Número 19
89
COMUNIDAD · Debconf6
Conferencia Debian 2006
DEBCONF6 Bajo el lema “Hot and Spicy” (Calentito y Picante) se reunieron más de 300 voluntarios llegados de todo el mundo en el Centro Vacacional de Oaxtepec, México, para celebrar la DebConf6, la séptima conferencia de desarrolladores y contribuidores de Debian. POR ANA GUERRERO.
L
a DebConf se celebra anualmente con el objetivo de estrechar lazos dentro de la comunidad Debian, que habitualmente trabaja repartida por todo el mundo. Este año, con el objetivo de promocionar el software libre entre la comunidad mexicana y la latinoamericana en general, el país anfitrión ha sido México.
Charlas, BOFS, redondas,…
Mesas
La conferencia es mucho mas que un ciclo de charlas. Se desarrolló a lo largo de dos semanas durante las cuales se celebraron una serie de actos tanto sociales como técnicos.[1] Durante la primera semana, del 6 al 12 de mayo, tuvo lugar la DebCamp, donde algunos de los equipos de desarrollo de Debian, tales como el equipo del instalador (debian-installer) o el equipo del kernel, tuvieron la oportunidad de reunirse y trabajar cara a cara durante unos días. Además, gracias a la esponsorización del gobierno de Extremadura, algunos de estos equipos tendrán una reunión adicional este año, lo que les permitirá agilizar el trabajo de cara a la próxima versión estable de Debian, que se llamará Etch. El 13 de mayo se celebró con bastante éxito, el DebianDay [2]. Con la intención de acercar GNU/Linux y el
90
Número 19
software libre al publico en general, a las empresas locales y a los medios de comunicación, se impartieron una serie de charlas en español o con traducción simultánea. A pesar de que Oaxpetec se encuentra alejado unas 2 horas por carretera de México D.C., medio centenar de mexicanos se acercaron para participar en la jornada. Además, merece la pena destacar la charla de Luciano Bello, ¡A darle átomos a Debian!, sobre cómo contribuir en Debian aunque no seas una persona técnica. Luciano mantiene una página en el wiki de Debian [3] con algunas sugerencias de cómo puedes participar siendo por ejemplo, una persona de leyes, un maestro de escuela, etc. En la semana siguiente, del 14 al 21 de mayo, tuvo lugar la DebConf propiamente dicha: un ciclo de conferencias donde se mezclaron charlas técnicas, políticas y sociales que giran entorno a Debian. Una de las que creó más expectación fue Releasing in Time – Etch in December 06. Andreas Barth y Steve Langasek, directores de lanzamientos
WWW.LINUX-MAGAZINE.ES
de Debian, explicaron que para que la próxima versión de Debian, Etch, vea la luz en diciembre como está previsto en este momento, es necesaria una estrecha colaboración por parte de los desarrolladores y mantenedores de Debian, de tal forma que puedan concluirse algunas de las metas propuestas para el lanzamiento de esta nueva versión según el calendario propuesto [4] y [5]. Entre otras muchas novedades, Etch contará con X.org en lugar de XFree86, con la versión 4.1 de GCC, con el largamente esperado soporte oficial para amd64, la versión 2.4 de Python, compatibilidad con LSB 3.1, apt seguro, y además, toda la documentación licenciada bajo DFSG que contiene partes invariantes, se moverá a la sección non-free del archivo. Christoph Berg en su charla “The future of the NM process”, abordó uno de los temas más polémicos: el actual proceso por el que hay que pasar para llegar a ser un desarrollador oficial de Debian. Hoy por hoy, un candidato necesita ser avalado por un desarrollador, ha de esperar algún tiempo hasta conseguir un examinador, además de someterse y pasar una serie de pruebas. Estas pruebas llevan mucho tiempo, tanto para el candidato como para el desarrollador que le evalúa, lo cual
Debconf6 • COMUNIDAD
supone una gran carga de trabajo sin que ello redunde directamente en la mejora de la distribución, lo que ha llevado a la búsqueda de alternativas y mejoras. Otra charla muy interesante por su contenido social fue la de Gabriella Coleman llamada “Codes of Value: An Anthropological Analysis of Hacker Values”. Grabiella es una antrópologa que ha pasado varios años estudiando la interacción de los hackers en los proyectos de software libre, centrándose especialmente en Debian. En su disertación examinó el código de valores de los hackers, cómo éstos valoran y decretan la libertad, qué significa para ellos, y algunos de los efectos políticos de sus acciones, no siempre comprendidas por la comunidad no hacker. También hizo un repaso a algunos de los puntos de la cultura del hacker, como su humor, la meritocracia o el elitismo.
Pájaros Paralelamente a las conferencias se celebraron sesiones de discusión (en inglés BoF – Birds of Feather), sesiones de trabajo y mesas redondas. Las sesiones de discusión fueron de lo más variadas: cómo optimizar el tiempo de arranque de Debian, el estado actual en Latinoamérica, cómo se gobierna un proyecto como Debian, o cómo mejorar su actual página web. También se contó con la participación de Ubuntu[11], distribución derivada de Debian. Mark Shuttleworth [8], su fundador, dio una charla a través de la cual hacía un repaso informal de los logros obtenidos durante el ultimo año y organizó un par de sesiones de discusión sobre cómo mejorar la calidad dentro de Ubuntu y aumentar la colaboración con Debian. Uno de los proyectos más ambiciosos dentro de Debian es la internacionalización y localización, normalmente abreviadas i18n y l10n, su meta es la de hacer llegar Debian al mayor número de personas posible en su lengua materna. En la mesa redonda sobre el estado actual de los proyectos de traducción se dejó patente el gran esfuerzo que esto supone. Por ejemplo, el instalador de la actual versión estable de Debian, Sarge, está traducido a 42 idiomas, la versión anterior, Woody,
Figura 1: La Debconf6 tuvo un alto nivel de participación
lo estaba a 16, y actualmente el instalador de la futura versión, Etch, está traducido a 53 idiomas. Este crecimiento hace necesario mejorar la coordinación entre todos los proyectos y la creación de nuevas infraestructuras que permitan trabajar mejor a los diferentes equipos.
Debian TV Gracias al esfuerzo del equipo de vídeo, las charlas y BOFs fueron retransmitidas por streaming y han sido grabadas en vídeo. Aunque no están disponibles en el momento de escribir estas líneas, se está trabajando duro en su edición y estarán pronto dispuestas en el archivo de encuentros de Debian [6]. Además, alguno de los asistentes han subido sus fotos a la galería de fotos oficial de la DebConf [7]. De entre todos los recopilatorios, quizás el más divertido es el de Lars Wirzenius, quien realizó durante toda la conferencia fotos personales de los asistentes junto con su nombre escrito a mano (mugshot), al más puro estilo ficha policial. También se han publicado muchas otras fotos junto con resúmenes y crónicas diarias de la conferencia en los blogs personales de los asistentes, sindicados vía planet Debian [9]. Organizar un evento de estas características no es nada fácil. Los organizadores de la DebConf fueron voluntarios que tuvieron que vérselas con todo tipo de problemas, siendo los más destacables los que se
WWW.LINUX-MAGAZINE.ES
solucionaron al inicio de la conferencia para poder montar la red. La frustración de los organizadores quedó plasmada en alguno de los artículos del blog oficial [10]. Sin embargo, pese a todo, la oportunidad de reunir a toda la gente que trabaja en Debian una vez al año merece todo el esfuerzo, y ya se está trabajando en la organización de la octava conferencia que tendrá lugar en el verano del próximo año. El sitio aún está por determinar, lo que sí es seguro es que se celebrará en el continente europeo, siendo a día de hoy Edimburgo y Sarajevo las candidatas con más votos. ■ ¡Nos vemos allí!
RECURSOS [1] https://debconf6.debconf.org/about/ schedule/ [2] http://es.debconf.org/debianday/ [3] http://wiki.debian.org/LucianoBello [4] http://lists.debian.org/ debian-devel-announce/2006/05/ msg00000.html [5] http://lists.debian.org/ debian-devel-announce/2006/05/ msg00015.html [6] http://ftp.acc.umu.se/pub/ debian-meetings/2006/debconf6/ [7] https://gallery.debconf.org/debconf6 [8] http://www.markshuttleworth.com/ [9] http://planet.debian.org/ [10] http://debconf6.debconf.org/blog [11] http://www.ubuntu.com/
Número 19
91
ยกHazte con tus ejemplares atrasados! #08
#09
#10
#11
#12
#13
#14
#15
#16
o d a t o g a
W W W. L I N U X - M A G A Z I N E . E S / AT R A S A D O S
¡pídelos ya! el REPOSITORIO
de conocimientos LINUX más COMPLETO
¡No esperes a que se agoten! #17
#18
W W W. L I N U X - M A G A Z I N E . E S / AT R A S A D O S
EVENTOS
I Concurso Universitario de Software Libre
EuroOSCON 2006
LinuxWorld Conf. & Expo UK
Fecha: 18-21 Septiembre
Fecha: 25-26 Octubre
Fecha: 1-27 Septiembre
Ciudad: Bruselas, Bélgica
Ciudad: Londres, UK
Sitio Web:
Sitio Web:
http://conferences.oreillynet.com
http://www.linuxworldexpo.co.uk
Ciudad: Sevilla, España Web: http://concurso-softwarelibre.us.es
Calendario de Eventos Evento I Concurso Universitario de S.L. EuroOSCON 2006 New Security Paradigms Workshop 2006 Nagios Konferenz aKademy 2006 AUUG 2006 LinuxWorld Conference & Expo NL hack.lu 2006 LinuxWorld Conference & Expo UK Zend/PHP Conference 2006 International PHP Conference 2006 Web 2.0 Conference Forum PHP 2006 Firebird Conference 2006 LinuxWorld Conference & Expo Germany Open Source Developers' Conference 14. DFN-Cert-Workshop Open Source Developers' Conference
Fecha 1-27 Sept. (Inscripción) 18-21 Septiembre 19-22 Septiembre 21-22 Septiembre 23-30 Septiembre 8-13 Octubre 11-12 Octubre 19-21 Octubre 25-26 Octubre 29 Oct.-2 Noviembre 5-8 Noviembre 7-9 Noviembre 9-10 Noviembre 12-14 Noviembre 14-16 Noviembre 5-8 Diciembre 7-8 Febrero 07 20-22 Febrero 07
Ciudad Sevilla, España Bruselas, Bélgica Dagstuhl, Alemania Nürnberg, Alemania Dublín, Irlanda Melbourne, Australia Utrecht, Holanda Kirchberg, Luxemburgo Londres, U.K. San Jose, EEUU Frankfurt, Alemania San Francisco, EEUU Paris, Francia Praga, República Checa Colonia, Alemania Melbourne, Australia Hamburgo, Alemania Netanya, Israel
Sitio Web concurso-softwarelibre.us.es conferences.oreillynet.com www.nspw.org www.netways.de/de/nagios_konferenz conference2006.kde.org new.auug.org.au/events_store/auug2006 www.linuxworldexpo.nl www.hack.lu www.linuxworldexpo.co.uk devzone.zend.com/node/view/id/89 www.phpconference.com www.web2con.com www.afup.org/article.php3?id_article=304 www.ibphoenix.com www.linuxworldexpo.de www.osdc.com.au/ www.cert.dfn.de/events/ws/2007/ www.osdc.org.il/2007
Información de Contacto Director Paul C. Brown
Director Editorial Paul C. Brown
Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas, Jose A. García, Ana Mª Ferreiro
Jefe de Producción Juan Miguel Ramírez
Traductores Paqui Martín Vergara, Paul C. Brown, Víctor Tienda, Oliver Kurz.
Subscripciones: www.linux-magazine.es/magazine/subs
Maquetación Juan Miguel Ramírez Diseño de Portada Pinball info@pinball-werbeagentur.de Publicidad www.linux-magazine.es/pub/ Para España Marketing y Comunicaciones anuncios@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Paul C. Brown pbrown@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497
94
Número 19
Precios Subscripción España: Europa: Resto del Mundo - Euros: Tel.: Fax.: subs@linux-magazine.es
54,90 € 64,90 € 84,90 € (+34) 951 010 556 (+34) 951 010 516
Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linux-magazine.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516
www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania
WWW.LINUX- MAGAZINE.ES
Si bien se toman todas las medidas posibles para garantizar la precisión del contenido de los artículos publicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en la revista. Asimismo, Linux Magazine no comparte necesariamente las opiniones vertidas por sus colaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupulosamente para confirmar que está libre de virus y errores. Copyright y Marcas Registradas © 2006 Linux New Media Spain, S.L. Linux New Media Spain S.L. prohíbe la reproducción total o parcial de los contenidos de Linux Magazine sin su permiso previo y por escrito. Linux es una Marca Registrada de Linus Torvalds. Impreso en Alemania Impresión: Dierichs Druck + Media GmbH Distribución: SGEL Depósito Legal: MA-116-2005 ISSN edición impresa: 1576-4079 ISSN edición online: 1699-2237
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.
LINUX LOCAL
LINUX LOCAL Leyenda inux Local es tu directorio de servicios y empresas de Linux cerca de ti. ¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuentra quién ofrece qué y dónde. El directorio se divide en regiones autónomas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Utiliza la leyenda de la derecha para encontrar la empresa que ofrece el servicio que precises. Linux Local es tu guía de servicios Linux.
L
1.- Hardware 2.- Software / Desarollo 3.- Formación 4.- Soporte / Consultoría 5.- Servidores 6.- Redes 7.- Migración 8.- Hospedaje
Andalucía Logo
Empresa
Correo-e
Web
1
2 3 4 5 6
7 8
Gesinfo
info@gesinfoweb.com
www.gesinfoweb.com
BitRock
info@bitrock.com
bitrock.com
Properly Software
info@properly.es
www.properly.es/site
GuadaGames
vicentecarro@guadagames.com
www.guadagames.com
Exprecom
info@exprecom.com
www.exprecom.com
Empresa
Correo-e
Web
1
IWS
iws@iws.es
www.iws.es
Empresa
Correo-e
Web
Mono::labs
contacte@monolabs.com
www.monolabs.com
Datum
info@datum.ws
www.datum.ws
Cataluña Logo
2 3 4 5 6
7 8
Madrid Logo
1
2 3 4 5 6
7 8
¿Por qué no está su empresa en este directorio? LINUX MAGAZINE llega a miles de empresas, profesionales y usuarios cada mes. Si tiene servicios o productos Linux que ofrecer ¡Llámenos! Tlf.: +34 951 010 556 Fax: +34 951 010 516 info@linux-magazine.es
WWW.LINUX- MAGAZINE.ES
Número 19
97
PRÓXIMO NÚMERO
Octubre 2006: Número 20
PRÓXIMO NÚMERO NAVEGACIÓN SEGURA A medida que la red se hace más grande, se agudizan los peligros que acechan al internauta medio. Hoy en día hasta el ritual de la navegación, antaño percibido como una actividad segura, está siendo objeto de ataques. El mes que viene examinamos estrategias para devolver la seguridad a la navegación por una web cada vez más hostil. Primero estudiamos el fenómeno del phishing y el arte de hacer que incautas víctimas pierdan la confidencialidad de sus datos y, de paso, su dinero. Y ya que hablamos de confidencialidad, veremos una de las maneras de mantenerla a buen recaudo con Tor y Privoxy, dos herramientas que sirven para mantener oculta nuestra IP al mundo externo. Claro que con legislaciones intervencionistas cada vez más represivas, no sólo querremos ocultar nuestra identidad en la web. Antsp2p nos ayuda a guardar el anonimato también cuando intercambiamos ficheros en una red P2P.
GREENSTONE
LINKCHECKER
Cada año más gobiernos, bibliotecas, empresas y grupos de comunidades deciden colocar sus archivos en línea. Greenstone es una serie de aplicaciones de software de código abierto que puede utilizarse para crear una colección digital en línea. Enseñaremos cómo organizar y publicar documentos digitales con Greenstone.
¿Te darías cuenta inmediatamente si un sitio web al que enlazas desde el tuyo propio ha desaparecido de la red? La herramienta Linkchecker es una pieza imprescindible en el arsenal del webmaster que quiere estar al tanto del estado de su sitio.
A LA VENTA: SEPTIEMBRE 2006 98
Número 19
WWW.LINUX- MAGAZINE.ES