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

Page 1

Twin LINUX MAGAZINE

Gestor de Ventanas de Texto

TJ-Racer

El Juego Definitivo (según Paul C. Brown)

Python

Acceso a Ficheros Locales y Remotos

Konserve Backups fáciles desde KDE

NÚMERO 02

NÚMERO 2 • P.V.P 4,95 €

Impresoras, Cámaras, Grabadoras de DVD

Hardware

Impresoras

PCs Silenciosos

HARDWARE

Cámaras Digitales

Qué impresora comprar y cuál evitar p12 Un PC silencioso para el salón p18 Cómo hacer que tu cámara se hable con Linux

p23

Desarrollo

Grabadoras DVD

Objetos cuánticos en Perl: Haz saltar la banca jugando al Blackjack p61

Python

TaskJuggler

Sleuthkit

Programa las tareas para el personal de tu empresa p96

Twin

Filtrado Web

Sleuthkit

p61

Análisis forenses informáticos

WWW.LINUX- MAGAZINE.COM.ES

Edición en Castellano


Linux va a CeBIT Muestre sus productos y servicios en la sección especial dedicada a Linux en CeBIT 2005:

Por cuarto año consecutivo, un gran número de compañías y proyectos de código abierto van a presentar sus soluciones de software, productos y servicios en LinuxPark. En CeBIT 2005, LinuxPark será de nuevo el punto de visita obligatoria para lo directivos TI, especialmente aquellos provenientes de las PYMEs y de la administración pública. Sólo hay un sitio en CeBIT con toda la información sobre las tecnologías de código abierto más novedosas y como explotarlas de manera efectiva: LinuxPark. Su empresa también puede beneficiarse enormemente de esta plataforma, ideal para la promoción de sus soluciones de código abierto.

La solución perfecta para su presencia ferial: • Comuníquese directamente con una gran variedad de clientes potenciales • Anúnciese en un campaña promocional anterior a la feria de gran envergadura • Realice su propia presentación en el LinuxForum • Aprenda de ponentes de primera categoría • Consolide sus relaciones con la comunidad Linux internacional • Benefíciese del contacto con socios y patrocinadores de reconocido prestigio en el sector • A su disposición: paquetes feriales todo incluido desde 4 m2

Consiga más información en +49 (0) 26 02 16 01374 ó profair@abresch.de

Patrocinado por:

Presentado por:


Escritorios

EDITORIAL

Ser o no ser Estimado Lector de Linux Magazine

E

l año del escritorio, el año del escritorio… Ni que fuera un nuevo signo en el horóscopo chino (“Sí, señora su hijo nació en el año del escritorio, lo que significa que la vida le deparará no pocos iconos”). Pero a mi entender, el tan cacareado “año” del escritorio Linux ya fue, o más bien, sigue siendo y, a la vez, está por venir. Me explico. Esto no va a ser (o no fue, o no se-… bueno, ya paro) como el invento de la gramola, que un día concreto, alguien tuvo la idea y fue y lo construyó (y patentó, todo hay que decirlo) y ya está: aparece el producto terminado. El “año” del escritorio Linux probablemente abarque décadas, tal vez iniciándose el día que alguien con largas patillas y una corbata de lana tejida (el uniforme de los programadores de los años setenta y primeros ochenta) se le ocurrió que estaría bien dotar a Unix de una pantalla para gráficos. Tal vez ni siquiera estaba pensando en iconos y ventanas, sino lo único que quería era plotear una función polinómica o algo por el estilo. Cosas de los ingenieros. Lo que es servidor, llevo utilizando escritorios Linux desde el 96 y hoy en día encuentro más “intuitivo” (concepto traicionero como ninguno) que cualquier otro sistema de ventanas. Lo he dicho antes y lo repito ahora: todo es a lo que te acostumbras. Un escritorio Linux es igual de difícil o fácil que cualquier otro escritorio al cual te has habituado. Y si el escritorio con el que te topas es radicalmente diferente a aquel con el que te has criado, pues tendrás problemas. Por ejemplo, últimamente me ha sumido en la más ignominiosas de las depresiones el no entender nada el escritorio de un iMac con el cual me he visto obligado a torear por

razones profesionales. Si solo pudiese encontrar donde puedo abrir un terminal de línea de comandos, tendría donde agarrarme. Pero no. El maldito se me resiste. Claro que no ayuda para nada que esté todo en alemán (no preguntéis). Por no saber, no sé ni como se abre el DVD-ROM. Pero, cuando fui a comprar un teclado para dicha máquina, el vendedor se interesó por las características del artefacto en cuestión. Me pregunto por la RAM me retorcí en mi asiento y murmuré un “No sé”. Me preguntó por la velocidad del procesador. “¿750 Mhz?” aventuré. “Imposible” sentenció él. “No hay ningún iMac a esa velocidad”. “Pues no sé” admití de nuevo, cabizbajo. Una vez le hube explicado el problema del idioma me dijo: “Pulsa en la manzanita. La primera opción te dará el perfil del ordenador”. Regresé a la oficina y probé lo que me había sugerido y… ¡Alejop! Aparecieron todos lo entresijos de hardware del cacharro. “¡Ajá!” pensé. Esto sí era agradable. No importa con que modelo de máquina te las estés viendo, ni que sistema operativo estés corriendo, si es un Mac, pulsas en la manzanita y la primera opción es el perfil del sistema. Y, aparentemente, todo es igual: Los menús son consistentes de versión a versión, siempre en el mismo lugar, siempre con el mismo comportamiento. Para un macignorante como yo, eso es lo que yo llamo una ventaja. Acostumbrado a Mandrake desde hace años, la nueva versión de Fedora que regalamos con el número 1 de Linux Magazine, me ha dado incontables quebraderos de cabeza. Como con el Mac, no tengo ni idea de donde están las cosas y acabo siempre optando por abrir una consola y operando desde ahí. Al menos eso sí es consistente. Sin embargo, habrá entre el respetable alguien que vea esto como un obstáculo para que Linux se adopte como sistema operativo de consumo entre lo población en general. Esto de abrir una consola,

Nos sentimos orgullosos de nuestros orígenes como publicación, que se remonta a los primero días de la revolución Linux. Nuestra revista hermana, la publicación alemana Linux Magazin, fundada en 1994, fue la primera revista dedicada a Linux en Europa. Desde aquellas tempranas fechas hasta hoy, nuestra red y experiencia han crecido y se han expandido a la par que la comunidad Linux a lo ancho y largo del mundo. Como lector de Linux Magazine, te unes a una red de información dedicada a la distribución del conocimiento y experiencia técnica. No nos limitamos a informar sobre el movimiento Linux y de Software Libre, sino que somos parte integral de él.

teclear una instrucción, ver que no funciona, corregir permisos, segunda prueba, no funciona, establecer variables de entorno, probar otra vez, maldita sea, sigue sin funcionar… Que, no, que no veo a alguien que lo que necesita es un escritorio para ser inmediatamente productivo, pasando por lo que yo he tenido que pasar para hacer que OpenOffice se hablara con MySQL, por poner un ejemplo reciente. ¿Conclusión? Unificación de criterios y escritorios. Pero entonces ¿dónde queda la flexibilidad y la libertad de elegir que tan atractivo hace los sistemas Linux? Amigo, he ahí el dilema.

Paul C. Brown Director

www.linuxmagazine.com.es

Número 02

3


LINUX MAGAZINE

Contenido

NOTICIAS

12

Premios LNM ......................................................................................6 Inseguridades ....................................................................................8 Negocios ..............................................................................................10 PORTADA

Especial Hardware .........................................................................11 Impresoras ..........................................................................................12

Impresoras bajo Linux

La impresora que elijamos dependerá del uso que hagamos de ella. Los usuarios de Linux basan parte de su elección en el tipo de soporte que el sistema operativo provee para su modelo de impresora. Este artículo proporciona información útil y una guía en la que basar nuestra decisión.

No todas las impresoras funcionan bajo Linux. Vemos cual nos conviene con este completo artículo.

Equipos Silenciosos ......................................................................18

18

Vemos cómo diseñar un PC que no desentonará en el salón de tu casa.

Un ordenador beige, con ventiladores ruidosos y descuidadas ampliaciones difícilmente convencerán a un usuario que busca una estación multimedia para su salón o un PC bien diseñado para un elegante despacho domestico. Este mes ayudamos al lector a elegir los componentes adecuados para construir un sistema elegante.

Cámaras Digitales .........................................................................23 Analizamos el software más adecuado para conectar una cámara a un equipo Linux.

Grabadoras DVD ............................................................................29 La batalla de los formatos puede dar al traste con la compra de nuestra grabadora. Éste artículo explica qué comprar y cómo no equivocarse.

DESARROLLO

La librería SDL ..................................................................................32 Aprendemos a utilizar SDL en este taller de programación de juegos.

Interfaces ............................................................................................38 Con curses podemos desarrollar interfaces de texto rápidos y eficientes.

Blackjack

.............................................................................................43

El juego del 21 sirve para ilustrar el uso del paquete cuántico de Perl.

La API Pear .........................................................................................46 PEAR proporciona una API que simplifica la creación y gestión de formularios web.

Gestiónde de Ficheros Bajo Python ................................52 Todas las operaciones necesarias (y alguna más) para trabajar con ficheros se explican en este artículo.

4

Número 02

www.linuxmagazine.com.es

23

Equipos Silenciosos

Cámaras Digitales Bajo Linux

Las cámaras digitales progresivamente van reemplazando a las tradicionales en nuestras casas. La forma típica en Linux de transferir imágenes desde la cámara al disco duro es con gPhoto o mediante el módulo basado en kernel de memoria masivos USB. Los entornos gráficos como digikam prometen un uso mejorado.


Contenido

38

LINUX MAGAZINE

SYSADMIN

Botones en Curses

En nuestra nueva entrega de programación de interfaces bajo C++, vemos lo que podemos hacer para crear botones en ventanas curses que respondan a entradas del teclado y que devuelvan un valor a la programa principal para que ésta actúe en consecuencia.

La Columna de Charly ................................................................57 Los mejores trucos y consejos del SysAdmin.

Filtrado Web

.....................................................................................58

Los banners ralentizan y dificultan la navegación web. Vemos como impredir su aparición.

Sleuthkit

..............................................................................................61

Las utilidades Sleuthkit permiten realizar análisis forenses en equipos comprometidos.

Email Cluster ....................................................................................67 Cómo agilizar el tránsito de mensajes en una empresa.

LINUX USER

61

Análisis Forenses con Sleuthkit

Sleuthkit realiza análisis forenses en archivos del sistema de Microsoft y Unix aplicando sus habilidades como detective desde la línea de comandos para identificar evidencias, recuperar archivos borrados o reconstruir escenarios. Todo esto es esencial en el arte del trabajo de los forenses digitales. En este incipiente campo es mejor prepararse y practicar para los problemas que nos acecharán en el futuro.

TaskJuggler .........................................................................................71 Planifica tareas en el seno de una organización.

DeskTOPia: Twin

............................................................................74

¿Un gestor de ventanas en modo texto? Twin es justamente eso.

Aplicaciones: Konserve

.............................................................77

Utilidad para aligerar la tarea de las copias de seguridad.

Curso de Programación: XUL (II) ........................................79 Un lenguaje sencillo para programar interfaces web.

Educación: WIMS (II) ...................................................................83 creación de aulas virtuales con WIMS.

Tipografía con LaTeX (II) ...........................................................88 Documentos de aspecto profesional con LaTeX.

77

Backups con Konserve

La “Konservación” es una Buena cosa y Konserve, una herramienta KDE no es una excepción. Sus sofisticados mecanismos de copia de seguridad realmente previenen los dolores de cabeza provocados por esta tarea.

Comandos: Head, tail y cat .....................................................93 Documentos de aspecto profesional con LaTeX.

COMUNIDAD

Proyectos Eventos

............................................................................................95

................................................................................................96

Contacto

.............................................................................................96

Humor ...................................................................................................97 Próximo Número ..........................................................................98

www.linuxmagazine.com.es

Número 02

5


NOTICIAS

Premios Linux New Media

Galardones Linux New Media 2004

Elegidos para la Gloria El 2004 ha sido un año fascinante en los que se refiere a acontecimientos interesantes. Linux New Media AG le pidió a los expertos de la comunidad del código abierto y la industria TI que nombrase a los que llevan la voz can-

Galardones Linux New Media 2004 Hardware1

tante en el mundo del Software Libre. El Linux World Expo fue el marco perfecto para los galardones de Linux New Media de este año.

E

l peligro de las patentes de software, los primeros pasos hacia la migración a escritorios Linux el esfuerzo de Novell por tomar el control de Suse… todos fueron temas candentes en la comunidad Linux y del código abierto a lo largo del 2004. Sin embargo, también hubieron muchos progresos en otras áreas. Linux New Media, el editor de contenidos Linux más grande del mundo, le pidió a célebres representantes del mundo del código abierto, a protagonistas Linux del mundo empresarial y a miembros de nuestro propio equipo de editorial que votaran por proyectos y organizaciones que creyesen que merecían ser reconocidos por sus

contribuciones al año del código abierto. Los ganadores de este año representan bien las tendencias actuales.

Y el Ganador es... Los miembros del jurado otorgaron el bien merecido galardón en la categoría de Mejor Distribución Novel al proyecto noruego Skole Linux (http://www. skolelinux.org). Skole Linux es una distribución especialmente diseñada para su uso en escuelas. En la misma categoría, Ubuntu Linux (http://www. ubuntulinux.org) mereció una mención honorífica. El jurado preve una cada vez mayor popularidad de Ubuntu Linux, una distribución basada en Debian espe-

Mejor Proveedor de Portátiles 1. IBM 2. Apple 3. HP

33.6 % 23.2 % 13.6 %

Mejor Proyecto Libre para Soporte de Hardware 1. X.Org 36.3 % 2. ACPI4Linux 13.1 % 3. Linuxprinting.org 11.3 % 3. growisofs/mkisofs for DVD Support 11.3 % 3. Ndiswrapper 11.3 % Proveedor de Impresión Más Amigable 1. HP 2. Canon 3. Kyocera

45.8 % 18.1 % 16.0 %

Software Mejor Distribución Novel 1. SkoleLinux 2. Ubuntu Linux 3. UserLinux

31.9 % 21.6 % 19.8 %

Mejor Distribución para Principiantes 1. Suse Personal/Professional 2. Fedora Core 3. Mandrake Linux

47.4 % 18.1 % 17.2 %

Mejor Infraestructura Multimedia 1. Jack 2. GStreamer 3. SDL

20.2 % 17.5 % 16.7 %

Mejor Reproductor de Medios 1. MPlayer 2. Xine/Kaffeine 3. XMMS

29.8 % 25.8 % 23.4 %

Mejor Cliente de Correo 1. Mutt 1. Kontact/KMail 2.Thunderbird/Mozilla Mail 3. Evolution

23.7 % 23.7 % 22.9 % 22.1 %

Mejor Sistema de Bases de Datos 1. PostgreSQL 8 2. MySQL 5.0 3. Oracle 10g

48.7 % 37.0 % 5.9 %

Galardón Especial para la Promoción Sobresaliente de Linux y el Código Abierto

Figure 1: Ganadores y miembros del jurado en el escenario de los Galardones Linux New Media.

6

Número 02

www.linuxmagazine.com.es

Institución/Organización 1. Eurolinux/FFII 2. Free Software Foundation 3. City of Munich 3. Groklaw

23.1 % 16.2 % 13.7 % 13.7 %


Premios Linux New Media

cialmente diseñada para ser amistosa con los nuevos usuarios. El proyecto lo desarrolla un equipo liderado por el exCEO de Thawte, el sudafricano Mark Shuttleworth. Casi la mitad de los miembros del jurado votaron por Suse Linux en la categoría de Mejor Distribución para Principiantes. La empresa Suse, basada en Nuremberg, tiene una enorme aceptación, que no se ha visto afectada por su absorción por parte de la empresa especialista en redes, Novell. Esto explica el porqué Suse batió por goleada al segundo y tercer contendientes, Fedora Core 2 y Mandrake, respectivamente. Las asombrosas capacidades de X.org (http:// www.x.org), el sucesor de XFree86, resultaron obviamente prometedoras para la mayoría del jurado que eligió el

proyecto como Mejor Proyecto Libre para Soporte de Hardware.

Bajo la Capota Menos visible, pero igual de vital es el soporte ACPI. El proyecto ACPI4Linux, http://acpi.sourceforge.net, ha desembocado en mucho trabajo duro pero poco renombre para los miembros del proyecto. El jurado premió a los esfuerzos del equipo con el segundo premio en el apartado de Mejor Proyecto Libre para Soporte de Hardware. El tercer lugar lo ocupan dos proyectos empatados: http:// fy.chalmers.se/~appro/linux/DVD+RW/ y Growisofs para el soporte de DVD http://ndiswrapper,sourceforge.net. Le competencia feroz en esta categoría demuestra como el movimiento del software libre tiene muchos proyectos que

NOTICIAS

aspiran a suministrar un extenso soporte de hardware. Este año, también hubo una dura competencia en la categoría de Mejor Proveedor de Portátiles. Apple fue la ganadora la anterior edición por un puñado de votos, pero este año, los dispositivos móviles de IBM le ha ganado la partida, siendo el segundo lugar para el PowerPC portátil.

En Contra de las Patentes de Software Eurolinux/FFIII (http://www.eurolinux. org) recibió un galardón por su batalla en contra de las patentes de software. Los miembros de Eurolinux hicieron campaña a lo largo de todo el año, organizando eventos y recogiendo firmas en contra de la patentabilidad del software, proce■ sos comerciales y algoritmos.

Jurado Galardones 2004 Este año el jurado estaba compuesto de miembros de la comunidad,representantes de la industria,el comité de programas de Linux World Expo y expertos de la industria TI. Claro que los galardones de Linux New Media no merecerían tal nombre sin la participación en el jurado del equipo editorial de Linux Magazine y cinco de las revista en lengua no inglesa publicadas por Linux New Media. Este año,los votación se llevó a cabo en un proceso de dos fases orientado a seleccionar candidatos que habían demostrado una mayor actividad y originalidad en los pasados 12 meses. Más de cien personas participaron como jurado. Entre ellos,destacamos: Elisabeth Bauer, un miembro del equipo editorial de EasyLinux (EasyLinux es una publicación en alemán orientada hacia usuarios noveles de Linux). Zack Brown. Zack ha seguido las discusiones llevadas a cabo en las listas de discusión del kernel durante años y a menudo informa a los lectores de Linux Magazine de lo que descubre. Eva Brucherseifer,desarrolladora y vicepresidenta de KDE e.V. Simon Budig,desarrollador senior de The GIMP. Alan Cox es un desarrollador del kernel Linux de primera generación que ha vuelto a dedicarse a la programación del kernel después de un año dedicado a concentrarse en sus estudios. Lars Eilebrecht es un evangelista del código abierto y uno de los miembros fundadores

del Apache Software Foundation. Lars ha escrito varios libros sobre el servidor web Apache y en la actualidad trabaja como Consultor TI Senior.

Frauke Oster es una miembro del equipo de desarrollo de KDE, donde se concentra principalmente en Kivio y proyectos de mujeres en KDE.

Hong Feng es un impulsor de la propagación del software libre en China.

Rafael Peregrino da Silva se trasladó desde el fabricante de hardware Cyclades a Linux Magazine do Brasil, del que ahora es el director.

Jutta Horstmann es administrador de sistemas especialista en bases de datos que investiga la usabilidad de aplicaciones en Relevantive AG. Miguel de Icaza es el fundador del proyecto Gnome y de la empresa de código abierto Ximian. Klaus Knopper es el hombre tras el Knoppix Live CD, el cual ha dado a muchos usuarios su primera experiencia con Linux y ha generado una gran variedad de nuevos proyectos. Marc Lehmann es un desarrollador senior de GCC y un impulsor del software libre. Jörg Luther es un periodista especializado en temas de tecnología que ha trabajado para Internet World y Tecchannel.de. Martin Michlmayer es el líder del Proyecto Debian. En general se dedica a la divulgación del software libre y contribuye en multitud de proyectos en su tiempo libre. Arturo Fernández Montoro es un desarrollador web y autor freelance para varias publicaciones de Linux. Christian Ney es un administrador Unix y de cortafuegos que ha contribuido a muchos proyectos de código abierto.

Christian Perle es un desarrollador en Secunet AG.También mantiene la instalación minimalista HAL91 y escribe de manera habitual para LinuxUser. Chris Schläger es el director de desarrollo de Suse Linux y desarrollador KDE de primera generación. Franz Schmid es un autodidacta en el mundo de la programación y empezó el proyecto de autoedición Scribus. Richard Seibt fue el director de marketing y ventas del departamento de software de IBM Alemania, Austria y Suiza. En la actualidad, es el responsable de Novell Europa. Marcelo Tosatti trabaja en la actualidad para Cyclades. Marcelo se convirtió en el mantenedor del Kernel 2.4 a la edad de 18 años. Andrew Tridgell proviene de Australia y es fundador del proyecto Samba, el cual ha ayudado a que se establezcan servidores Linux en redes Windows. Oliver Zendel es el presidente de Linuxtag e.V., una organización sin ánimo de lucro que organiza el mayor evento Linux de toda Europa.

www.linuxmagazine.com.es

Número 02

7


NOTICIAS

Inseguridades

Inseguridades ■ MySQL MySQL es un servidor de bases de datos multi-usuario y multi-hebra. Se han informado de varios problemas de seguridad que afectan al paquete mysqlserver. Oleksandr Byelkin descubrió que el “ALTER TABLE … RENAME” comprobaba los derechos CREATE/INSERT de la antigua tabla, en vez de los de la nueva. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado el nombre CAN-2004-0835 a este problema. Lukas Wojtow descubrió una sobrescritura de búfer en la función

mysql_real_connect. Para poder explotar este problema, un atacante tendría que forzar el uso de un servidor DNS malicioso (CAN-2004-0836). Dean Ellis descubrió que múltiples hebras que ALTERasen el mismo (o diferentes) tablas MERGE para cambiar la UNION, podrían provocar un cuelgue o parada del servidor (CAN-2004-0837). Sergei Golubchik descubrió que si a un usuario se le otorgaban privilegios para un base de datos cuyo nombre contuviera un guión bajo (“_”), también adquiría la habilidad de ceder privilegios a otras bases de datos con nombres similares (CAN-2004-0957). También se han des-

Políticas de seguridad de la Distribuciones Mayoritarias Distribuidor

Fuente Seguridad

Debian

Info:http://www.debian.org/security/ Lista:http://www.debian.org/debian-security-announce/ Referencia:DSA-…1)

Gentoo

Mandrake

Red Hat

Slackware

Suse

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

8

Comentario

Los avisos de seguridad actuales se incluyen en la página de inicio. Los avisos se proveen como páginas HTML con enlaces a los parches. Los avisos también incluyen una referencia a la lista de correo. Info:http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para Foro:http://forums.gentoo.org/ la lista Gentoo en el sitio web de Lista:http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la Referencia:GLSA:… 1) página principal. Los avisos se presentan en HTML con códigos para fusionar las versiones corregidas. Info:http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionadas con Referencia:MDKSA:… 1) la seguridad. Entre otras cosas,incluye de avisos seguridad y referencias a las listas de correo. Los avisos son páginas HTML,pero no contienen enlaces a los parches. Info:http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad Lista:http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A Referencia:RHSA-… 1) continuación los problemas para cada versión de Red Hat se agrupan. Los avisos de seguridad se proveen como una página HTML con enlaces a los parches. Info:http://www.slackware.com/security La página de inicio contiene enlaces al Lista:http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo. Referencia:[slackware-security]… 1) No existe información adicional sobre seguridad en Slackware. Info:http://www.suse.de/en/private/support/ Ya no existe un enlace a la página de security/index.html seguridad tras un remodelado en el sitio Parches:http://www.suse.de/en/private/ web de SuSE. Existe información en la download/updates Lista:suse-security-announce lista de correos y los avisos. Los parches de Referencia:SUSE-SA… 1) seguridad para versiones individuales de SuSE Linux se muestran de color rojo en el sitio de actualizaciones generales. Contiene una corta descripción de la vulnerabilidad que el parche soluciona.

Número 02

www.linuxmagazine.com.es

cubierto diversos pequeños errores relacionados con el sistema de bases de datos MySQL, algunos de los cuales plantean potenciales agujeros de seguridad. El proyecto de Vulnerabilidades y Exposiciones Comunes ha asignado los nombres (Common Vulnerabilities and Exposures o CVE - http://cve.mitre.org) CAN-2004-0381, CAN-2004-0388, CAN2004-0457 a estos problemas de seguri■ dad de MySQL. 6 Referencia Gentoo: GLSA 200410-22/ MySQL Referencia Mandrake: MDKSA-2004:119 Referencia Red Hat: RHSA-2004:569-1

■ IPtables Fahem Mitha informa de que la instrucción iptables, una herramienta de administración para el filtrado de paquetes IPv4 y NAT, no siempre cargaba los módulos requeridos por sí mismo, tal y como debería hacer. Esto podría conllevar a que las reglas de un cortafuegos no se cargasen en el arranque del sistema. Esto provoca un fallo en la conexión con reglas suministradas al menos por lokkit. Se recomienda a los usuarios que ■ actualicen su versión de iptables. Referencia Debian: DSA-580-1 iptables Referencia Mandrake: MDKSA-2004:125 Referencia Suse: SUSE-SA:2004:037

Apache

El servidor HTTP Apache es uno de los más populares servidores web en Internet. mod_include es un módulo Apache que maneja inclusiones por el lado del servidor (SSI). Existe un posible desbordamiento de búfer en la función get_tag() de mod_include.c. Si las inclusiones por el lado del servidor están habilitados, un atacante local podría ser capaz de correr código arbitrario con los derechos de un proceso hijo httpd haciendo uso de un documentos especialmente manipulado con SSI malformado. También se ha descubierto un desbordamiento de búfer basado en pila en mod_proxy. mod_ssl has sido actualizado de la versión mod_ssl2.8.19-1.3.31 a la versión 2.8.21-1.3.32, lo que corrige un fallo que permitía a un cliente usar un cifrado que el servidor no considera lo suficientemente seguro. También existe un nuevo paquete PHP (php-4.3.9) para


Inseguridades

todas estas plataformas. Se pueden consultar más detalles sobre estos problemas en la base de datos del proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE http:// cve.mitre.org). Véase CAN-2004-0492 y ■ CAN-2004-0885. Referencia Gentoo: GLSA 200411-03/ apache Referencia Mandrake: MDKSA-2004:122 Referencia Slackware: SSA:2004-305-01

■ ImageMagick ImageMacgick(TM) es una herramienta de manipulación de imágenes para el sistema X Windows. Se ha descubierto un fallo de desbordamiento de pila en el manejador de imágenes de ImageMagick. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://cve.mitre.org) ha asignado el nombre CAN-2004-0827 a ■ este problema. Referencia Gentoo: GLSA 200411-11/ imagemagick Referencia Red Hat: RHSA-2004:466-12

■ Libtiff libtiff es utilizado por visualizadores de imágenes y navegadores web para mostrar imágenes “TIFF”. Chris Evans descubrió varios fallos de seguridad durante una auditoría de la librería de manipulación de imágenes libtiff, algunos relacionados con desbordamientos de búfers, otros relacionados con desbordamientos de enteros y similares. Este problema se sigue en CVE ID CAN2004-0803. Matthias Claasen encontró una división por cero en libtiff. Este problema tiene su seguimiento en CVE ID CAN-2004-0804. Otras auditorías llevadas a cabo por Dmitry Levin expuso varios otros desbordamientos de enteros, el seguimiento de los cuales se lleva a cabo en CVE ID CAN-2004-0886. iDEFENSE Security descubrió un desbordamiento de búfer en el manejo que hace el paquete libtiff de OJPEG (old JPEG) bajo SUSE. Esto se arregló deshabilitando el soporte pare old JPEG y se realiza un seguimiento del problema en ■ CVE ID CAN-2004-0929. Referencia Mandrake: MDKSA-2004:109 Referencia Red Hat: RHSA-2004:577-16

Referencia Slackware: SSA:2004-305-02 Referencia Suse: SUSE-SA:2004:038

■ Squid Squid es un cache de proxy web con muchas prestaciones. iDEFENSE Security informa de un fallo en el módulo de SNMP de squid. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE - http://cve.mitre.org) ha asignado el nombre CAN-2004-0918 a ■ este problema. Referencia Debian: DSA-576-1 squid Referencia Gentoo: GLSA 200410-15/ squid Referencia Mandrake: MDKSA-2004:112 Referencia Red Hat: RHSA-2004:591-04

■ Gaim La aplicación gaim es un cliente de mensajería instantánea multi-protocolo. Se ha descubierto un desbordamiento de búfer en el manejador del protocolo MSN. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado el nombre CAN-2004-0891 a este problema. Los paquetes actualizados gaim también arreglan errores en el interfaz de usuarios múltiples, de protocolos y de manejo de errores, incluyendo un problema con la codificación de comunicación ICQ. ■ Referencia Gentoo: GLSA 200410-23/gaim Referencia Red Hat: RHSA-2004:604-05 Referencia Slackware: SSA:2004-239-01

■ CUPS El Common UNIX Printing System (Sistema de Impresión Común UNIX o CUPS) es una cola de impresión. Durante una auditoría de código fuente, Chris Evans descubrió una serie de errores de desbordamiento de entero que afectan a xpdf. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado el nombre CAN-2004-0888 a este problemas de seguridad. Cuando se configura para imprimir en una impresora compartida a través de Samba CUPS se autentifica con esa impresora compartida utilizando un nombre y una contraseña. Por defecto, el nombre de usuario y la contraseña utilizadas por CUPS para

NOTICIAS

conectar con la compartición Samba se escribe en el fichero de registro de errores. Un usuario local que tenga permisos de lectura de este fichero de registro de errores podría cosechar estos nombres de usuario y contraseñas. El proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE http://cve.mitre.org) ha asignado el nombre CAN-2004-0923 a este problema. ■ Referencia Debian: DSA-581-1 xpdf Referencia Mandrake: MDKSA-2004:116 Referencia Red Hat: RHSA-2004:543-15 Referencia Suse: SUSE-SA:2004:039

■ webmin webmin es un kit de herramientas de administración basadas en web. Ludwig Nussel ha descubierto un problema cuando un directorio temporal se utiliza pero no se comprueba el dueño previo. ■ Referencia Debian: DSA-544-1 Referencia Mandrake: MDKSA-2004:101

■ KDE KDE es un entorno de escritorio para sistemas Unix y Linux. La integridad de los enlaces simbólicos utilizados por KDE no se pueden asegurar y. como resultado, pueden ser abusdaos por atacantes locales para crear o truncar ficheros arbitrarios o evitar que aplicaciones KDE funcionen correctamente (CAN-2004-0689). Konqueror permite a sitios web cargar páginas web en un marco de cualquier otra página basada en web que el usuario pudiera tener abierto. Konqueror también permite establecer cookies para ciertos dominios nacionales de primer nivel. Todos aquellos dominios nacionales de primer nivel que utilizan más de dos caracteres en la parte secundaria del nombre de dominio se encuentran afectados, al igual que aquellos que utilizan una parte secundario que no sea uno de los siguientes: com, net, mil, org, gove, edu o int (CAN-2004-0746 y CAN■ 2004-0721) Referencia Debian: DSA-539-1 kdelibs Referencia Mandrake: MDKSA-2004:086 Referencia Slackware: DSA-539-1 kdelibs - directorio vulnerabilidades temporal

www.linuxmagazine.com.es

Número 02

9


NOTICIAS

Negocios

Negocios ■ Ballmer: Linux Infringe 228 patentes… o no Y es que este hombre da más juego que un tonto con una tiza (o que SCO, que para el caso, es lo mismo). En una conferencia pronunciada el pasado noviembre ante la cumbre de Líderes Gubernamentales Asiáticos (evento patrocinado por Miscrosoft), Ballmer dijo: “Hubo un informe este verano de un grupo de código abierto que subrayaba el hecho de que Linux viola 228 patentes. Algún día, […] alguien vendrá en busca de dinero para pagar los derechos de patentes para toda esa propiedad intelectual”. La primera incorrección es que su fuente (un informe del Open Source Risk Managment) no cita 228, sino 283. Mucho peor ¿no? El problema es que el estudio no dice que Linux viola esas patentes, sino que “podría potencialmente violar” 283 patentes. Y precisamente aquí está el quid de la cuestión. Dan Ravicher, autor del estudio, alega que el propósito del informe era precisamente el contrario para el que el CEO de Microsoft lo ha (mal)utilizado. No se pretendía extender FUD (Fear, Uncertainty and Doubt) sino más bien exorcizarla. Ravicher declara: “Cualquiera que esté familiarizado con

■ IBM Vende Ordenadores Personales Pues valiente novedad. Sin embargo, no es lo que parece: lo que de verdad ocurre es que el Gran Azul vende su división de ordenadores personales a un antiguo competidor, Lenovo, una empresa china, fabricante de informática de consumo. ¿El precio? No te molestes en romper la hucha para intentar mejorar la oferta: 1,75 mil millones de dólares. Con la compra de la división de PCs de IBM, Lenovo, que controlaba del 2,2 % del mercado mundial, pasa a poseer el 7,7 %, consolidándose como el tercer proveedor de ordenadores personales, por detrás sólo de Dell y HP. La historia de Lenovo, antiguamente Legend, parece calcada a las historias de éxito de la industria TI americana: En vez de un humilde garaje en un campus de Berkeley, los fun-

este tipo de cifras reconocerá como de aburridamente rutinarias las cantidades citadas para software de esta envergadura. Además” añade Ravicher “de momento no ha habido ni un sólo programa de código abierto que ha sido llevado a juicio por infracción de patentes”. Cosa que Ballmer no puede decir de sus productos. Según Con Zymaris, CEO de CyberSource, un empresa australiana especialista en soluciones Linux, “Microsoft se enfrenta a entre 30 y 35 acciones judiciales. Para mencionar unos pocos, se le ha condenado a Microsoft a pagar 521 millones de dólares a Eolas por infracciones encontradas en Internet Explorer, 440 millones a InterTrust Technologies Corp. por infracciones a patentes de administración de restricciones digitales y 1,6 mil millones como compensación a Sun en un pleito antimonopolio”. Saquen sus calculadoras: más de 2 mil millones de dólares por sólo tres casos. Si además tenemos en cuenta que los casos contra Microsoft se incrementan a diario, como hace notar Zymaris, “hasta su depósito de efectivo [valorado en 50 mill millones de dólares] empieza a parecer insuficiente”. ■ http://www.osriskmanagement.com/ pdf_articles/OSRMMSStatement.pdf http://asia.cnet.com/news/software/ 0,39037051,39202293,00.htm.

dadores de Lenovo empezaron su aventura en una pequeña caseta en el campus de Beijing. Lenovo empezó como distribuidor de terceros, precisamente de los que ahora conforman uno de sus mayores competidores: Hewlett Packard. Y fue gracias a una temprana estructuración de una red de ventas como llegó ■ a las cimas del éxito. http://www.lenovogrp.com/cgi-bin/main. cgi?section=press&sub_section=200412 08_r1_content

dios independientes, pues digo que Novell parece haber convertido la sección “anti-Get the Facts” en algo permanente, o si no sírvanse visitar el enlace al pie de esta pieza. Con el título “Toda la Verdad” y con el lema “Restore”, Novell revela en detalle todo lo que Microsoft decide ignorar, omitir o directamente ocultar a los usuarios y potenciales compradores. Novell plantea sin ninguna clase de titubeo la creencia de que Linux es superior en todos los sentidos a Windows y apoya sus razon-

amientos que le han llevado a esta conclusión con datos extraídos de estudios independientes y, en algunos casos, incluso de los mismos informes en los que se basó Microsoft para su campaña de “Get The Facts”. Todo ha de tomarse con cierto escepticismo, por supuesto, ya que al final de cuentas hablamos de una empresa que trata de vender su producto estrella: SuSE Linux. Pero es ■ refrescante de todas maneras. http://www.novell.com/es-es/linux/ truth/

■ Ballmer vs. Novell Lo que va camino de convertirse en el segundo culebrón Linux y que podríamos titular “Pobre CEO”, “Los Ricos También Flamean” o “Cristal” (por lo de las Ventanas) , tiene nuevo capítulo. Si bien el mes pasado, Novell “se limitó” a publicar una nota de prensa (bastante vitriólica, eso sí) negando punto por punto las aseveraciones que hacía Steve Ballmer, CEO de Microsoft, en un mensaje de correo electrónico a clientes, reales y potenciales, y distribuidores y basadas en supuestos estu-

10

Número 02

www.linuxmagazine.com.es


Introducción

El ordenador doméstico ideal

Un Sistema Perfecto Una caja de un ordenador estándar de color beige puede que esté muy bien para la sala de servidores, pero cuando llega el momento de diseñar una equipo para casa, hay que pensar en la elegancia. Es muy probable que se pase muchas noches agradables con el ordenador en casa y tal vez sea el momento de darle un poco de glamour a tu equipo POR JOHN SOUTHERN

N

o vale la pena gastarse los ahorros de toda una vida en la decoración del hogar ideal si no se piensa en un presupuesto para el ordenador personal. Que nuestros amigos admiren la decoración, pero que comentan lo feo que es nuestro ordenador es algo que cualquier usuario de

EN PORTADA La Impresora Perfecta ..............12 Todo lo que se necesita saber antes de comprar una impresora, ya sea para casa o para la oficina. Qué se necesita tener en cuenta, qué es lo más adecuado y qué opciones existen para asegurarnos de una perfecta compatibilidad con Linux.

PCs Sileciosos................................18 Vemos los mejores componentes que se pueden comprar para acallar el ruido que arma un PC convencional, con la intención de crear un PC lo bastante silencioso como para que vaya en el salón. Acalla ese ventilador, silencia el disco duro. No quieres que un ordenador turbe la paz de tus ratos de ocio.

Cámaras Digitales .....................23 A medida que las cámaras digitales continúan ganándole la batalla a las cámaras convencionales de antaño, existe una mayor necesidad de integrarlas con nuestro sistema operativo favorito. En este artículo vemos como se hace.

Tostadores de DVDs .................29 Vale, así que tenemos un PC silencioso, impresora para las fotos y cámara para tomar instantáneas… Pero ¿que hacemos con las películas que grabamos de la tele? Pues tostarlas a DVD, por supuesto. Sin embargo, como con todo, esto es más fácil de decir que de hacer. En este artículo vemos las tostadoras que mejor se adaptan a tu superequipo.

informática no se puede permitir. Pero, lo que puede ser incluso más importante es el nivel de molestia proporcionada que pronto nos confrontará debido a los ruidosos ventiladores que se encuentran en la mayoría de los PCs.El ruido puede suponer la diferencia entre un sistema con encanto a uno que da espanto.Nos pusimos manos a la obra para averiguar como se puede producir un PC poco ruidoso, si no completamente silencioso, máxime si tenemos en cuenta que la polución sonora puede tener efectos negativos en la salud. Probamos las mejores opciones en nuestros laboratorios Linux, para darles a nuestros lectores la oportunidad de elegir las mejores propuestas. También estudiamos en profundidad los complementos que se vayan a añadir al equipo. El primer periférico que habitualmente se compra es una impresora. No todas las impresoras cuestan lo mismo ni ofrecen las mismas funciones. Este mes presentamos la guía definitiva para la compra de un impresora para un equipo Linux. La guía contempla desde las grandes impresoras láser en color que se encuentran en talleres de diseño gráfico, hasta económicas impresoras de inyección de tinta y láser monocromo diseñadas para adaptarse a cualquier presupuesto. Y ahora que tenemos un equipo silencioso y una impresora a juego, sólo necesitamos una cámara dig-

ital para sacarle unas fotos. La próxima vez que tus amigos se dejen caer por tu casa, esperando ver una caja beige en el salón, muéstrales tu nuevo equipo de diseño y observa como se ponen verdes de envidia.■

www.linuxmagazine.com.es

Número 02

11


PORTADA

Impresoras

En busca de la impresora adecuada para usuarios de Linux

Decisiones de Impresión La impresora que elijamos dependerá del uso que hagamos de ella. Los usuarios de Linux basan parte de su elección en el tipo de soporte que el sistema operativo provee para su modelo de impresora. Este artículo proporciona información útil y una guía en la que basar nuestra decisión. POR TILL KAMPPETER

L

os mostradores de las tiendas de electrónica está llenos de impresoras para diversas tareas. Desde baratas impresoras de inyección de tinta por menos de 50 dólares hasta láser de alto nivel y plotters de gran tamaño que fácilmente pueden costar miles de dólares, las opciones parecen infinitas. ¿Cuál de esas impresoras es la opción adecuada para los usuarios de Linux? La primera cuestión que nos debemos plantear no tiene nada que ver con el sistema operativo. Los criterios más importantes deben ser lo que pretendemos imprimir y los volúmenes de impresión que esperamos. Las impresoras láser son rápidas y producen copias de alta calidad pero no imprimen con buena calidad las fotografías. Son bastante caras en especial si necesitamos color. En el otro lado de la balanza el precio de mantenimiento y el del precio por copia es razonablemente bajo. Por otro lado, las impresoras de inyección de tinta son mucho más baratas en términos de inversión inicial, siendo muchas de ellas capaces de producir fotografías con calidad similar a la de los laboratorios. Desafortunadamente son mucho más lentas y el coste por copia impresa es

12

Número 02

mucho más alto, especialmente si utilizamos papel fotográfico. Si necesitamos imprimir mucho texto y ocasionalmente una copia a color puede que incluso debamos considerar comprar dos impresoras: una láser monocromo y una de inyección con color. Esto mitigará el impacto de los costes de utilización de la impresora de inyección. La parte más difícil respecto a comprar una impresora es encontrar un modelo con soporte Linux para todas las utilidades de que disponga. Esto dependerá de dos cosas: en primer lugar, el lenguaje de las descripción de la página que la impresora utiliza, y en segundo lugar, que tipo de soporte Linux ofrece el fabricante u otros proveedores (como un proyecto libre).

Postscript y PCL Una cosa esta clara desde el principio: Linux siempre ofrecerá soporte completo para dispositivos PostScript. Por supuesto esto supone que el fabricante no ha escondido los comandos para acceder a las utilidades bajo un controlador DLL de Windows sino en un archivo ASCII PPD (PostScript de descripción de impresión) [1] como requiere el estándar. Esto garantiza al

www.linuxmagazine.com.es

menos el mismo nivel de funcionalidad para modelos PostScript que en Windows NT. El soporte PCL no está tan avanzado pero al menos podemos garantizar que una impresora basada en PCL imprimirá bajo Linux. También nos permitirá controlar la configuración básica de la misma, como la resolución o el tamaño del papel. Funciones especiales como las selección de la bandeja, el modo de ahorro de toner o el suavizado de fuentes puede que no estén disponibles con controladores Linux estándar.

PostScript y PPDs Los fabricantes de impresoras PostScript proporcionan habitualmente un PPD con el controlador de MS Windows y Mac OS. El PPD incluye comandos PostScript o PJL codificados para cada una de las utilidades especiales del dispositivo, como la impresión a dos caras, selección de bandeja o incluso el grapado y agujereado. Estos códigos necesitan estar integrados en el archivo de la impresora para permitir el acceso a las opciones de la tarea cuando estas sean analizadas gramaticalmente por el intérprete. Antes del sistema de impresión común de Unix (CUPS) se estableció como el estándar para Linux, los archivos PPD eran igno-


Impresoras

PORTADA

rados habitualmente. Los archivos CUPS pueden gestionar los archivos nativos de descripción de impresoras, mientras que otros sistemas de impresión mediante almacenamiento temporal (spooling) usan el filtro Foomatic RIP para analizar la información en el PPD. Esto significa que existe un soporte completo para impresoras PostScript en Linux. No obstante nos debemos asegurar de que el intérprete PostScript está realmente integrado en el hardware del dispositivo en lugar de en una herramienta de emulación basada en Windows.

PCL y PJL Los comandos específicos PCL para impresoras se implementan principalmente como comandos PJL (lenguaje de tarea de impresión). PJL es un estándar de facto. No siempre es posible hacer que nuestra impresora hable PJL. Las impresoras habitualmente se ciñen estrictamente a las secuencias de escape y comandos de PCL. En este caso solo podemos esperar que el fabricante proporcione documentación útil o que un desarrollador curioso haya analizado la alida del controlador Windows y haya encontrado como controlar la impresora. No obstante hay algunos modelos que implementan soporte PCL sólo por razones de compatibilidad con programas DOS usando el controlador Windows para hacerlo. El programa DOS envía PCL al controlador y el controlador convierte este código a un mapa de bits propietario. En este caso no tiene ningún sentido enviar datos PCL a la impresora en Linux.

Protocolos de Alto Secreto Hay muchas impresoras que usan lenguajes propietarios o protocolos que sus fabricantes mantienen en el más alto secreto. La mayoría son dispositivos de bajo coste, pero hay algunos que en realidad son bastante caros. Si el fabricante no proporciona un controlador, las impresoras que pertenecen a esta categoría son completamente inútiles bajo Linux hasta que un desarrollador independiente encuentre tiempo para examinar los resultados del controlador Windows y adivine el protocolo. Incluso entonces la calidad de los resultados no suelen llegar al nivel alcanzado en Windows.

Figura 1: Linuxprinting.org es el sitio ideal para ir si estamos teniendo dificultades imprimiendo bajo Linux.

Podemos comprobar la base de datos Foomatic en [3] para encontrar si una impresora tiene soporte en Linux. La base de datos tiene una lista con todas las impresoras conocidas e indica como se comportan con Linux. Este artículo incluye una pocas de recomendaciones para varios tipos de impresoras y categorías de precios.

Inyección de Tinta a Color Al margen del gran número de fabricantes de impresoras de inyección de tinta, solo hay dos cuyas impresoras soporten el software Open Source realmente bien: Epson y HP. Las impresoras Epson Stylus son una elección particularmente buena para Linux. Epson desveló información sobre sus protocolos a los desarrolladores Gimp Print [4] hace bastante tiempo. Esto permite a Gimp Print dar soporte a las nuevas impresoras Epson tan pronto como son lanzadas al mercado. Gimp Print es software gratuito y proporciona resultados en color de alta calidad. La herramienta dispone de un amplio abanico de posibilidades de configuración que proporcionan al usuario un amplio margen desde un buen compromiso entre calidad y velocidad hasta reproducciones con calidad fotográfica realista. Esto hace de las impresoras Epson una opcón interesante para los fotógrafos aficionados en Linux.

La mayoría de las impresoras sin PostScript de HP usan el controlador propio libre de HP HPIJS [5]. Este controlador soporta la mayoría de las características de los dispositivos HP, como la impresión duplex, selección de bandeja y la impresión a seis tintas. La calidad de fotografías y textos es impresionante, especialmente en modelos más nuevos. No obstante el controlador no dispone de opciones para un control más detallado. Las impresoras de otros fabricantes deben ser evitadas. Puede que seamos capaces de soportar una impresora Canon con la licencia comercial Turboprint [6] o con una licencia gratuita pero propietaria de Canon Japón [7]. La página está en Japonés. Simplemente descargamos los RPMs y los instalamos. Algunos modelos tienen nombres diferentes en Japón, Europa y Estados unidos. No todos los modelos están soportados.

Lexmark y Canon Lexmark introdujo los primeros controladores propietarios para algunos modelos hace algunos años. Es difícil hacer que esta generación de impresoras funcionen con los sistemas modernos. Lexmark ha introducido ahora un nuevo concepto de controlador el cual, desafortunadamente, también es propietario. Los controladores son supuestamente capaces de funcionar

www.linuxmagazine.com.es

Número 02

13


PORTADA

Impresoras

Figura 2:La HP Deskjet 450 es una buena opción para usuarios móviles. Soporte Linux, buena calidad de impresión, impresión en seis colores y sin requerimientos de fuentes de alimentación.

con las distribuciones más modernas [8] si bien no hemos sido capaces de confirmarlo hasta ahora. Al margen de un pobre soporte de los controladores, Lexmark también pierde puntos debido al alto precio de sus consumibles. Solo hay dos o tres proyectos de controladores gratuitos para Lexmark y canon, pero la funcionalidad que proporcionan es restringida por que los desarrolladores típicamente no tienen más alternativa que hacerle ingeniería inversa con la salida del driver propietario. Si estas interesado comprueba la base de datos de controladores en Linuxprinting.org en busca de la información más reciente [9]. Ver figura 1. Los controladores para impresoras de otros fabricantes son desconocidos. Todos esto no lleva a que debemos optar por Epson y HP si estamos buscando una impresora de inyección de tinta con soporte Linux. HP diseña con el cabezal de impresión integrado en el cartucho desechable de tinta y esto es preferible en ambientes donde las boquillas tienden a obstruirse. Por otro lado, Epson utiliza cabezales piezoeléctricos permanentes: los cartuchos son simplemente reservas de tinta. Epson también provee tintas especiales para conseguir determinados objetivos, tintas en escala de grises y sistemas de tinta continua. Los usuarios deben ser prudentes con ofertas de bajo coste al comprar impresoras. El soporte es típicamente malo o inexistente para las impresoras de esta

14

Número 02

gama de precios o los costes de mantenimiento son extremadamente altos debido al precio de los consumibles.

Barata pero funciona Los modelos básicos de Epson son el C42 y el C44. Ambos están soportados por Gimp Print desde su versión 4.2.6. Los precios de los cartuchos de están en lo más alto de la escala. El modelo C64 es barato pero requiere la versión 4.2.7 o superior de Gimp Printer. Los modelos básicos de HP son las Deskjet 33xx, 34xx y 36xx. Estos dispositivos usan LIDIL (lenguajes de dispositivos de interfaces de imágenes ligeras). Como HPIJS no soporta completamente LIDIL, estos modelos no pueden ser recomendados. Las impresoras PCL baratas con soporte HPIJS son las series 38xx y la Deskjet 5150.

Impresoras de Sobremesa Robustas Las mejoras impresoras Epson para cualquier trabajo en papel A4 estándar son las Stylus C82 y C84 (ver figura 4). Disponen de cuatro cartuchos separados para los cuatro colores y proporcionan copias de alta calidad de texto y fotografías. Estos modelos usan tintas con pigmentos no menguantes. El modelo C84 necesita la versión 4.2.7 o superior de Gimp Print. El modelo Deskjet 5625 es nuestra elección de HP como impresora de inyección en formato A4. Gracias a su unidad

www.linuxmagazine.com.es

duplex usa la mitad de papel y si disponemos de cartuchos especiales de fotografía podemos usar el modo seis colores para impresión de fotografías. Podemos añadir una bandeja secundaria para extender la capacidad de papel hasta las 400 páginas. HPIJS habilita todas las características de estas impresoras excepto la impresión sin bordes. Según HP, se está trabajando en la habilitación de esta característica. La mejor impresora portátil del momento es la HP Deskjet 450 (ver figura 2). Ofrece a los usuarios móviles la misma calidad en copias que sus hermanas de sobremesa e incluso impresión con seis tintas en modo de ahorro de batería y todo viene en un formato atractivo y compacto. Los modelos de la gama HP Business Inkjet se recomiendan para amplios volúmenes de impresión. Estos modelos son más rápidos y tienen mejores capacidades de papel y tintas. La mayoría de las nuevas impresoras de inyección de HP nos permiten reemplazar el cartucho de tinta negra por un cartucho de tinta fotográfica con depósitos de tinta negra, cián claro y magenta claro. Esto permite una calidad de impresión de fotografía perfecta. No hay necesidad de modificar el controlador para permitir el modo de impresión de seis tintas. La impresora gestiona el color internamente.

Impresoras Fotográficas La gama Photosmart de HP está especialmente diseñada para imprimir copias de imágenes digitales. Casi todos estos modelos disponen de un lector de tarjetas que permite la impresión directa sin PC. Las series 100 y 200 son modelos portátiles que admiten tamaños máximos de papel de 10 x 15 cm. La serie 7000 soporta A4 y la 7600 incluso ofrece impresión de ocho colores (negro, gris medio y claro, cián, magenta, amarillo, cián claro y magenta claro). El controlador de dispositivos multifunciones propio de HP, HPOJ [10], permite el acceso al lector de tarjetas en Linux. Los últimos modelos (14x, 24x, 72xx, 77xx, 79xx) en realidad usan el lector de tarjetas como un dispositivo de almacenamiento masivo USB. La serie Epson Stylus Photo soporta la impresión de fotografía. Las impresoras


Impresoras

PORTADA

clásicas de seis colores producen copias excelentes usando Gimp Print. Los modelos más nuevos (R200, R300 y R800) no están soportados todavía, por tanto los modelos recomendados son el 830U, el 925 o el 950. El 925 dispone de un lector de tarjetas que puede ser accesible como un dispositivo de almacenamiento masivo USB (kernel 2.4.21 o superior) y el 950 tiene seis cartuchos de tinta separados.

Dispositivos Multifunción Estos incluyen dispositivos que proporcionan impresión, escaneado y otras funciones como fax o lectura de tarjetas, todo en un único dispositivo. Desafortunadamente ninguno de estos dispositivos ofrece soporte de fax basado en PC con software gratuito. La impresión, el escaneado y la lectura de tarjetas funcionará en todos los dispositivos Epson y HP con la excepción del Epson Stylus Photo RX500, si bien se está trabajando en un controlador de Gimp Print. Los dispositivos de otros fabricantes imprimirán en algunos casos y en otros no harán nada. Los dispositivos HP necesitan un controlador de bajo nivel para acceder a todos sus componentes. HPOJ proporciona un interfaz que acepta tareas de impresión, un controlador Sane para el escáner y acceso al lector de la tarjeta vía Mtools [11]. HPIJS se usa como el filtro de la impresora. Los dispositivos Epson funcionan como si fueran dispositivos separados de impresión, escaneado y lectura de tarjetas. El Sane epson soporta el escaneado y la lectura de la tarjeta vía almacenaje masivo USB. Con la excepción de las impresoras “LIDIL”, los modelos PSC 1xxx y los Officejet 4xxx, podemos recomendar cualquier modelo HP. Los dispositivos LIDIL multifunción están parcialmente soportados por HPOJ. Hay que evitar el Epson RX800 puesto que Gimp Print no proporciona un controlador para este modelo. Si necesitamos imprimir en formato A3 debemos ver los modelos de cuatro colores Epson Stylus Color 1160, 1520 y 3000 o los modelos de seis colores Epson Stylus Photo 1290(s) y 2100. De HP, podemos probar las impresoras CP1700 y las Deskjet 93xx para impresión en cuatro colores. Hay cartuchos de de tinta

Figura 3:La Epson C84 es útil para usos generales de impresión de inyección. Se requiere la versión 4.2.7 de Gimp Print para proveer soporte perfecto para Linux.

fotográfica disponibles para la serie Deskjet 96xx. La Epson Stylus Pro puede imprimir formato DIN A3 sobredimensionado. Gimp Print gestiona esto sin ningún problema. No obstante los desarrolladores no fueron capaces de calibrar correctamente la gestión y optimización del color para estas series debido a la falta de máquinas para pruebas. Las impresoras A1 Stylus Pro 7000 y 7500 han sido probadas y proporcionan calidades similares a sus hermanas pequeñas Stylus Photo. Las Stylus Pro 900 y 9500 son las versiones A0 de la 7000 y deben producir también copias de alta calidad. Gimp Print incluso soporta los modelos actuales de las Stylus Pro 7600 y 9600. Si decidimos optar por un producto de HP o de cualquier otro fabricante debemos asegurarnos de que sea un modelo de alta gama con un intérprete de PostScript basado en hardware.

Láser Monocromo La mayoría de los fabricantes de impresoras láser no proporcionan soporte nativo para Linux. Afortunadamente la mayoría de modelos usan lenguajes

estándar PCL y/o PostScript por lo que la mayoría de las impresoras funcionarán perfectamente bien sin necesidad del soporte del controlador nativo. No obstante hay un gran número de impresoras (especialmente las de bajo presupuesto) que usan protocolos propietarios y no proporcionan soporte de controladores. Muchos de ellos tienen un sufijo, como “L” para “ligero” al final de sus nombres y la mayoría tienen hermanas mayores que hablan PCL o PostScript. Debemos asegurarnos de que elegimos el modelo de alta gama al comprar una impresora. Muchas de las impresoras de bajo coste no soportan software libre. De nuevo, afortunadamente hay una pocas impresoras PCL y PostScript e incluso unos pocos controladores para protocolos propietarios. En general debemos comprar una impresora PCL o PostScript. Debemos recordar que muchas impresoras láser de bajo coste pierden esta ventaja debido a consumibles caros.

Láser de bajo coste Las impresoras láser Kyocera, con la excepción de los dispositivos multifunciones, hablan normalmente PostScript o

www.linuxmagazine.com.es

Número 02

15


PORTADA

Impresoras

Figura 4: El soporte Linux es cuestionable en impresoras láser de bajo coste de Epson. La Epson EPL6200L solo dispone de soporte parcial puesto que usa protocolos propietarios.

al menos PCL. Adicionalmente disponen de un tambor permanente que tiene el efecto agradable de ofrecer bajos costes de impresión por página. Los modelos de Kyocera FS-1010 y FS-1020D hablan PostScript, y la FS-1020D dispone además de unidad duplex. Las impresoras láser Lexmark son mucho más amigables con el software libre que sus impresoras de inyección de

tinta. La mayoría de sus modelos en el rango Optra hablan o PCL o PostScript. Lexmark dispone de su propio intérprete y esto permite incluso a las Optras de bajo coste hablar PostScript. La página Web de Lexmark indica la compatibilidad Linux de sus modelos y existe la posibilidad de descargar controladores. Los modelos de comienzo PCL5e (compatible con HP Laserjet 4)

E220 y E321 son buenas opciones de bajo coste. Brother principalmente tiene láser PCL y PostScript y proporcionan soporte nativo Linux con su propia página de controladores [13]. Muchas impresoras Brother que usan protocolos propietarios Brother funcionan bien, debido a que el filtro Ghostscript hl7x0 ayuda a producir buenos resultados. Los módulos de toner y tambor separado permiten costes de operación bajos. Los modelos de bajo coste HL 1430 y HL 5130 son ambas impresoras PCL5e. Las impresoras más baratas de Epson son los modelos del rango EPL “L” (por ejemplo la EPL 6200L), sin embargo usan protocolos propietarios. Ver figura 4. Epson no proporciona controladores Linux y no proporciona ninguna otra información sobre el protocolo. A pesar de que un proyecto independiente está trabajando en el desarrollo de un controlador [14], este rango de impresoras no puede ser recomendado. Siendo el mayor fabricante del mundo de impresoras láser, HP dispone de un amplio abanico de impresoras PCL y PostScript. HP usa el controlador HPIJS para soportar PCL y proporciona PPDs bajo la licencia gratuita MIY de PostScript (e incluso permite su distribución a través de Linuxprinting.org[15]. Las impresoras láser más baratas que proporcionan soporte completo para software libre son las láser PostScript LJ1200 y 1300. Los modelos LJ1010, 1012 y 1015 tienden a colgarse debido a problemas de compatibilidad PCL. Tanto la HP LasérJet 1000 como la 1005 funcionan con el controlador foo2zjs [16], pero necesitan cargar un soporte lógico incorporado al reiniciarlas. Nuevamente probablemente es mejor evitar estos modelos.

Gama Media

Figura 5: La Officejet 7130 de HP es un dispositivo multifunción con buen soporte Linux. Incluso podemos utilizar su alimentador de corte de papel.≠

16

Número 02

www.linuxmagazine.com.es

El llamado grupo de impresoras de gama media disponen de motores más rápidos, puertos de red y son extensibles. Todas estas impresoras soportan o PCL o PostScript y la mayoría de ellas también soportan PJL. Esto más o menos soluciona los problemas con software libre. Tanto HP, Kyocera como OCE proporcionan archivos PPD para sus modelos PostScript como software libre bajo licencia MIT [17]. Epson proporciona


Impresoras

controladores gratuitos para sus impresoras PCL (las serie EPL sin la “L” al final del identificador del modelo). Tanto Brother como Lexmark ofrecen descarga de controladores.

Pros y Contras Todos los fabricantes de impresoras tratados en este artículo tienen sus pros y sus contras. Lexmark tiene impresoras más rápidas y mejores microcódigos que HP al mismo precio. Los cartuchos de tinta y los tambores de HP se venden normalmente como unidades completas y esto puede suponer costes de operación más altos. Los tambores permanentes de Kyocera y los consumibles separados de Epson y Brother son más eficientes en costes. Por otro lado el hardware de HP tiene la reputación de durar más. Muchas impresoras láser a color de baja gama o no proporcionan soporte de software libre en ningún caso o este soporte está sujeto a limitaciones. Este tipo de impresoras no está recomendado. La HP Color LaserJet 1500 (el trabajo de desarrollar un controlador ha empezado [18]), la HP LaserJet 3500 y la Epson Aculaser 1000 son ejemplos de esto. La Minolta Magicolor 2200 DL y 2300 Dl usan ambas protocolos propietarios pero funcionan muy bien con el controlador foo2zjs. Al margen de esto debemos estar seguros de que PCL o PostScript está implementado en el hardware en lugar

de cómo una emulación. Los modelos que proporcionan esto son las Kyocera FS-8000C y la HP Color LaserJet 2500, 3700 y 4600. Algunos fabricantes dan a los usuarios acceso a los controladores libres como para las Epson Aculaser 1900, 200, 400, 8500 y 8600.

Impresoras Gama Alta La impresión en grandes volúmenes, grandes departamentos de empresas o que requieren tareas especiales como taladrar, grapar o doblar son del dominio típico de impresoras láser de alta gama con velocidades de hasta 100 páginas por minuto o más. Las bandejas de papel tienen capacidad para más de 2000 páginas. Vienen con dispositivos adicionales que ofrecen encuadernadores con marcas de encuadernado o capacidades de doblar, bandeja de correo y preparación y acabado de páginas impresas sobre la marcha. Los dispositivos de este tipo normalmente tienen un intérprete interno de PostScript. Funcionan perfectamente con software libre. Si usamos un archivo PPD podemos acceder a las mismas opciones que los usuarios de sistemas Windows y Mac.

Comunicaciones vía protocolos de Internet Hay una tendencia notable a dispositivos multifunciones en modelos de

PORTADA

gama alta. Muchas impresoras de gama alta comenzaron su vida como fotocopiadoras digitales con módulos adicionales de impresión y escaneado. Si el escáner ofrece un interfaz Web y saca los datos de las imágenes como correos electrónicos, HTTP o FTP podemos escanear con cualquier sistema operativo. Si no es así la capacidad de escaneo proporcionada por el dipositivo multifunción no ■ estará disponible en Linux.

INFO [1] Especificaciones en Formato PPD: http:// partners.adobe.com/asn/tech/ps/index. jsp [2] Tutorial Foomatic: http://tinyurl.com/ 3gf2g [3] Base de datos de Foomatic en Linuxprinting.org: http://www.linuxprinting.org/ database.html [4] Página Web del proyecto Gimp Print: http://gimp-print.sourceforge.net/ [5] Proyecto del controlador HPIJ: http:// hpinkjet.sourceforge.net/ [6] Turboprint, controlador comercial par impresoras de inyección: http://www. turboprint.de/english.html [7] Controlador para impresoras Canon: http://cweb.canon.jp/drv-upd/bj/ bjlinux220.html [8] Nuevos controladores Lexmark: http:// support.lexmark.com/en/ldk/index.htm [9] Base de datos de controladores: http:// www.linuxprinting.org/driver_list.cgi [10]Controlador HP para lectores de chips de tarjetas: http://hpoj.sourceforge.net/ [11] MTools:http: //www.tux.org/pub/tux/ knaff/mtools/index.html [12] Projecto Sane escaner: http://www. sane-project.org/ [13] Controladores Brother: http://solutions. brother.com/linux/ [14] Desarrollo del controlador EPL: http:// epsonepl.sourceforge.net/ [15] PPDs para láser de HP: http://www. linuxprinting.org/download/PPD/HP/ [16]Foo2zjs: http://foo2zjs.rkkda.com/ [17] Descargas PPD: http://www.linuxprinting. org/download/PPD/

Figura 6: Para altos volúmenes de impresión: Digimaster de Heidelberger. Estos monstruos no tienen

[18] Proyecto para láser de color de HP: http:// www.epkowa.co.jp/english/linux_e/ dl_laser.html

ninguna objeción a ser controlados por ordenadores Linux

www.linuxmagazine.com.es

Número 02

17


PORTADA

PCs Silenciosos

Diseño y construcción de un PC para el salón.

Ejecución silenciosa Un ordenador beige, con ventiladores ruidosos y descuidadas ampliaciones difícilmente convencerán a un usuario que busca una estación multimedia para su salón o un PC bien diseñado para un elegante despacho domestico. Este mes ayudamos al lector a elegir los componentes adecuados para construir un sistema elegante. POR MIRKO DOLLEY JOHN SOUTHERN

L

a mayoría de los ordenadores personales están en oficinas. No hay duda sobre esto, las cajas grises, vulgares y corrientes con sus ventiladores ruidosos, suministradas por la tienda de la esquina, sencillamente no tienen sitio en el salón. Desde luego, si el precio es el factor determinante, no habrá mucho margen para aislar el ruido, componentes que ahorren electricidad o cajas elaboradas. Dicho esto, hay una notable tendencia hacia máquinas que sean de uso simple y que no hagan mucho ruido mientras funcionan. Es decir, nada que se parezca a un ordenador corriente. Normalmente la elección de los componentes estará determinada por el papel que le asigne al ordenador, una consola de juegos, una estación multimedia o una máquina para una oficina domestica. Elegir la caja correcta es delicado, especialmente porque su tamaño y el número de bahías de dispositivos con

18

Número 02

las que cuente determinaran el grado en que podrá ampliar su máquina en una etapa posterior. Las cajas compactas a menudo carecen de espacio incluso para añadir un segundo disco duro.

Consolas de Juego Una consola de juegos basada en Linux necesitara un procesador de gran rendimiento, un adaptador gráfico 3D medianamente potente y una tarjeta de sonido de un cierto nivel. Existe un número de sistemas básicos que cumplen

www.linuxmagazine.com.es

este cometido bastante bien, como por ejemplo la gama de Shuttle o la EX5-300S de Elito Epox (veasé la Figura 1). Esta ultima se suministra con una placa base para Pentium 4 realmente adecuada (EP4PGF con chipset Intel i865G), un lector de tarjetas de memoria flash, y una pantalla LCD con pulsadores. La pantalla nos permite reproducir MP3s o CDs incluso con el ordenador apagado. El software está almacenado en un área especial de la BIOS y puede ejecutarse pulsando un botón.


PCs Silenciosos

PORTADA

La placa base tiene un chip gráfico integrado, pero se puede usar el slot AGP 8x para añadir fácilmente otro adaptador distinto si fuese necesario. El equipo también dispone de un slot Firewire y un puerto de red Ethernet. Completa el conjunto un sistema especial de refrigeración de 3G-Tek, que es famoso por ser extremadamente silencioso. El sistema básico cuesta alrededor de 250€ en su tienda favorita y está a la venta en [1] entre otros.

Grabadora de vídeo Los requerimientos de una grabadora de vídeo son completamente diferentes. El adaptador gráfico y la velocidad del disco duro no son demasiado importantes y es improbable que la CPU tenga mucho trabajo que hacer. Por otra parte el estilo de la caja, la capacidad del disco duro y el nivel de ruido serán factores decisivos para este equipo. La Travla c137 (149€) [2], como la mostrada en la Figura 2, es una solución interesante. La alimentación es similar a las fuentes de alimentación de los portátiles y su tarjeta de potencia interna es inaudible en circunstancias normales. La placa base mini ITX Epia ME-6000 de VIA es una buena elección ya que el radiador para la CPU de 600 MHz queda bajo los agujeros de ventilación de la caja. Las unidades están localizadas en un caballete sobre los slots PCI. Las bahías pueden acomodar una unidad de perfil estrecho y un disco duro de 3,5 pulgadas. El disco duro está montado sobre pasadores de goma para impedir la transmisión de ruido a la caja. Sin embargo, el disco duro seguirá siendo el componente más ruidoso del equipo. Aparentemente no habrá problemas de temperatura. La caja tiene rendijas que, sin la ayuda de ventiladores, facilitan la disipación del calor

Figura 2:La caja Casetronics Travla c137 planta cara fácilmente a los procesadores más ardientes. Las rejillas de la tapa favorecen la fácil disipación del calor.

Figura 1:El sistema compacto EX5-300S de Elito-Epox es ampliable con una tarjeta AGP y una tarjeta PCI. Se puede usar el sistema como un reproductor de discos CD y MP3 aunque el PC este apagado.

producido por el disco duro y otros componentes.

¡Levantate! El hecho de que el equipo utilice refrigeración pasiva, proporciona un valor añadido. Un equipo de escritorio estándar consume entre 100 y 120 vatios y esto puede significar unos costes de gasto eléctrico de 150€ al año. Durante el funcionamiento normal con dos tarjetas DVB, un disco duro y un lector de DVD de perfil estrecho, el consumo eléctrico de el Travla c137 fue alrededor de 50 vatios, lo que supone un coste de menos de 70€ si deja la máquina funcionando durante todo un año ¡aunque no hay una verdadera razón para hacerlo así! El kernel 2.4.2x acepta ACPI sobre Via Epia ME-6000 realmente bien, tecleando echo 2004-01-01 20:15:00 > /proc/acpi/alarm se le dice al equipo que le levante a las 08:16 pm; sin embargo (cuando se escribió esto) el equipo parecía ignorar la fecha, impidiendo a los usuarios de este método despertar el equipo más de una vez al día. La potencia del Via Epia ME-6000 es

perfectamente adecuado para ejecutar software de videograbación, aunque la CPU Eden se atraganta con DivX y otros formatos de vídeo. Precisamente por eso Via ha lanzado una versión a 1 GHz con refrigeración pasiva, que permite a los usuarios reproducir formatos DivX y Quicktime sin ninguna molestia. Hay que indicar que la caja Travla c137 permite la utilización de una tarjeta “Riser” de Via con 2 slots PCI.

Frontal de Aluminio Tenemos un frontal de aluminio solido, sujeto en su sitio con cuatro tornillos tipo “allen”, un slot para un lector de Compact Flash y también el hueco habitual para el lector óptico de perfil estrecho. También hay un pequeño agujero para un receptor infrarrojo, preferentemente del tamaño de un transistor tipo TSOP 1838. El receptor simplemente se pega a la parte posterior del panel frontal con un poco de resina epoxy, o adhesivo térmico. Éste ultimo tiene la ventaja de ser más fácil de eliminar posteriormente, si fuera necesario. No es recomendable utilizar cola de contacto. Entonces conectamos el receptor

www.linuxmagazine.com.es

Número 02

19


PORTADA

PCs Silenciosos

infrarrojo al segundo puerto serie de la placa Epia usando un circuito adaptador [3,4]. Como alternativa, puede usar el conjunto vdronf desde [5], que le permitirá encender y apagar el ordenador.

Su Propio Equipo Silencioso Tampoco hay necesidad de tener un ordenador ruidoso en su salón, aunque la solución de auto-construcción es decidídamente más cara que comprar un equipo listo para usar al vendedor de clónicos de la esquina. Una caja compacta no es lo más indicado para una máquina con mucho uso y más pronto o más tarde necesitará ampliar el equipo. La caja ST11 de tamaño mini-torre de Silentmaxx [6] es una de las soluciones posibles. Está disponible en color blanco, negro y plateado y cuesta alrededor de 135€ Las cajas Silentmaxx están acondicionadas con espuma acolchada aislante. Un ventilador lento de 12 cm de diámetro, con control de temperatura, está situado al fondo de la caja y suministra un flujo constante de aire. La silenciosa fuente de alimentación, con refrigeración pasiva, Fanless 350PCS del mismo fabricante cuesta 199,95€ y puede adaptarse para otras cajas de PC. La fuente de alimentación está refrigerada por un irradiador externo. Elegir la CPU adecuada es una decisión difícil. Las CPUs Pentium de Intel son apenas más rápidas que los chips Athlon funcionando a la misma velocidad, pero no generan tanto calor. Además, el calor

Figura 3: Las tarjetas adaptadoras gráficas 3D con el chipset ATI’s Radeon 7000 pueden ser refrigeradas pasivamente, están bien reconocidas bajo Linux y ofrecen variedad de conexiones,

muy bien, pero no con en el ventilador de la CPU. Los ventiladores pequeños y de alta velocidad, igual que los de las adaptadoras gráficas, son los más molestos de todos. El Heatlane Zen P4, que también está disponible en http://www. overclockers.co.uk/ o http://www. coolerguys.com/ por 80€ usa tuberías de calor y se refrigera pasivamente por el ventilador de 12 cm de la caja. Los irradiadores de cobre con grandes ventiladores y control de temperatura están en el mismo rango de precios.

incluyendo VGA,DVI, y salida de TV.

Tuberías de Calor

se incrementa de manera proporcional con la velocidad de reloj. Ralentizar la CPU, permite ralentizar el ventilador y así se conseguirá un equipo más silencioso. Dicho esto, no hay una respuesta general a la pregunta de cual es la velocidad de reloj que realmente se necesita. 2 GHz es excesivo para el uso de aplicaciones de oficina e Internet, pero si se quiere ver películas en HDTV o jugar juegos, simplemente no tendrá suficiente potencia. El problema es que los fabricantes tienden a dejar de suministrar las CPU más lentas y antiguas, debiendo recurrir a un chip usado. Algunas tarjetas le permiten ajustar el reloj manualmente y así se tiene la posibilidad de hacer funcionar a 1,6 GHz, o menos, un CPU de 2GHz. También hay que resaltar que el consumo de potencia se incrementará proporcionalmente al cuadrado de la velocidad de reloj. Recortar costes está

Las tuberías de calor disipan muy eficientemente y sin ventiladores ni bombas, pero es necesario hacerlas a medida. No puede doblar o cortar un canalizador de calor ya terminado. Por esta razón algunos fabricantes proporcionan dos o incluso tres canalizadores de calor conectados a un irradiador de cobre. Desgraciadamente, aumentar los acoplamientos reduce el rendimiento de la disipación del calor, haciendo difícil diseñar un sistema en el que pueda confiar ¡y que la masilla termoconductora no pueda mejorar! El Poweroid 1200 [7] es un ordenador completamente silencioso. Posee una CPU P4 a 3.2GHz y está montado en una caja Zalman Totally No Noise. La tarjeta gráfica es una GeForce FX5700 de 128 MBytes y la placa base es una Asus P4C800 Deluxe. Desgraciadamente el precio de 3650€ quizá sea algo excesiva. Solo la caja vale 1200 US$ en los EE.UU

Cómo Montar un PC en la Sala de Estar

Nombre

Elito-Epox

Casetronic

Via Epia

Ready made

Silentmaxx

Silentmaxx

Modelo

EX5-300S

Travla c137

ME-6000

Receptor IrDA

ST11

Fanless 350 PSU

Descripción

Sistema básico con

Caja Mini ITX con

Placa base Mini ITX

Receptor InfraRojo

Caja minitorre que

Fuente de

una placa base para P4

ranuras para disipar

con múltiples interfaces

con conexión serie.

antenúa el ruido.

alimentación,

El Panel LCD frontal

el calor.

y tarjeta riser PCI.

Contiene un ventilador

sin ventilador,

permite reproducir discos

regulado por

para PC de 350 W

CD y MP3 cuando la

temperatura de 12 cm.

de potencia.

máquina está pagada. URL

Precio

20

www.komplett.co.uk.

www.mini-itx.com

www.mini-itx.com

www.intolect.com

www.kustompcs.co.uk

www.kustompcs.co.uk

www.epox.com

http://shop.store.

www.axiontech.com

www.evation.com

www.silentmaxx.net

www.silentmaxx.net

www.directron.com

yahoo.com/kmexpress www.myelectronics.nl

www.myelectronics.nl

www.zapway.de

www.silentmaxx.de

www.silentmaxx.de

EUR 250

EUR 149

EUR 103

EUR 17.40

EUR 135

EUR 199.95

Número 02

www.linuxmagazine.com.es


PCs Silenciosos

en http://www.directron.com y 1200€ en Europa.

Refrigeración liquida Lo peor de la refrigeración liquida es tener que preocuparse de que las fugas en el sistema de refrigeración inunden su ordenador. A la luz de los actuales sistemas de presilla, con sellado doble, esas preocupaciones son infundadas. Es fácil hacer un corte recto en los tubos e insertarlos en los conectores de la bomba o del bloque de refrigeración. No olvide purgar el sistema, ya sabe eliminar las burbujas de aire del interior del circuito después de rellenarlo. El sistema de refrigeración es más o menos inaudible durante su funcionamiento. Normalmente un cierto numero de aletas refrigeradoras con una gran superficie que esta sujeta a la parte trasera del PC, elimina la necesidad de ventiladores. La única cosa que escuchará es el silencioso zumbido de la bomba y el ventilador de la fuente de alimentación. El kit de refrigeración liquida Thermaltake Aquarius II disponible en [8] solo enfría la CPU y cuesta 109€; un bloque disipador adicional para la adaptadora gráfica puede costar alrededor de 45€.

Las ruidosas adaptadoras gráficas. El rendimiento 3D no solo significa formar imágenes más rápidamente,

también implica un mayor consumo energético y de este modo mayor disipación de calor. Las adaptadoras gráficas actuales a menudo necesitan tener acoplada un pequeño ventilador de alta velocidad para disipar el calor del chip gráfico. Estos ventiladores muchas veces son los ventiladores más ruidosos del ordenador. Si no necesita el rendimiento de una nVidia Geforce 4 o una ATI Radeon 9600, puede ahorrarse un ventilador y un montón de dinero. Las tarjetas adaptadoras gráficas con el, ligeramente obsoleto, chip gráfico ATI Radeon 7000, pueden funcionar sin refrigeración activa y tienen potencia sobrada para Parsec, Quake, y Tuxracer con una resolución de 1024x768 pixels. La versión de 32 MBytes mostrada en la figura 3 (y disponible en [9]) cuesta alrededor de 35€, una fracción del precio de una adaptadora moderna de alto rendimiento, pero manteniendo características tales como salidas DVI o de TV. Aemás de esto, la totalidad de los actuales distribuciones soportan el chipset ATI Radeon 7000 por defecto. Desde luego, una adaptadora gráfica con aceleración hardware para 3D solo tiene sentido si va a usar el ordenador para jugar. Si no, una placa base con el chipset de la adaptadora gráfica integrada debería ser suficiente, como los i845G o i865G de Intel o incluso la gama de placas base Epia de Via. La mayoría de los chips gráficos integrados

PORTADA

no son demasiado potentes, pero puede ejecutarlos como dispositivo framebuffer bajo Linux, lo cual es suficientemente bueno para procesar textos y navegar por Internet.

Discos ruidosos Los discos duros con un velocidad de rotación alta, como 7200 o incluso 10000 rpm, no conviene usarlos en los PCs para el salón. Estos discos duros se oyen con facilidad por encima del ruido de fondo de un PC normal con ventiladores ruidosos. Hay dos discos de Samsung, el SV1604N de 160 GBytes y el SV0802N de 80 GBytes, que son baratos y silenciosos. Ambos funcionan a 5400 rpm y cuestan 150€ y 60€, respectivamente. Su temperatura no tiende a sobrepasar el calor del cuerpo, incluso cuando fueron sometidos al test Bonnie de resistencia, de esta manera eliminamos la necesidad de sistemas de refrigeración o ventiladores adicionales para el disco duro. Un disco duro IDE normal se conecta con un cable plano de 80 pines que suele estorbar la ventilación de los PCs, incluso en sistemas que funcionan con ventiladores de bajo régimen de revoluciones. Los cables bloquean el flujo de aire, que ya es bastante escaso de por si. Serial ATA podría ser una solución, si tan solo puede encontrar un disco duro silencioso que se ajuste a las especificaciones. El único en la actualidad que se aproxima es un adaptador SATAPATA para el disco

Cómo Montar un PC en la Sala de Estar

Poweroid

Thermaltake

ATI

Samsung

LG Electronics

Toshiba

Matrix

1200

Aquarius II Water

Radeon 7000

SV-1604N

GSA-4081B

SD-C2612

Orbital MX212

Cooling kit PC completamente

Completo kit de

Tarjeta gráfica con

Disco duro de

Grabadora DVD

Unidad DVD

Panel digital .

silencioso con

refrigeración liquida,

aceleración 3D por

160GBytes de .

capaz de reconocer

de perfil estrecho.

frontal para

refrigeración pasiva,

con bomba,bloque

hardware y

bajo nivel de

DVD-RAM además

bahía de 5,25”

CPU P4 3.2GHz y

refrigerador para la

refrigeración pasiva.

ruido ya que

de DVD-R,DVD+R y

para controlar los

montado sobre una

CPU y radiador.

funciona a

DVD+RW.

ventiladores y

caja Zalman Totally

5400rpm

mostrar

No Noise.

información en el diplay

www.poweroid.com

www.overclock.co.uk, www.crazypc.com, www.new-generation.nl

www.overclockers.co.uk, www.tigerdirect.com, www.computer-land.nl

www.savastore.com, www.computerhq.com, www.crazypc.nl

www.microdirect.co.uk, www.eebuy.com, www.alternate.de

www.wstore.co.uk, www.computerhq.com, www.bauers.com

www.kustompcs.co.uk/, www.matrixorbital.com, www.myelectronicx.nl

£3,100

EUR 109

EUR 35

EUR 115

EUR 120

EUR 65

EUR 120

www.linuxmagazine.com.es

Número 02

21


PORTADA

PCs Silenciosos

duro de Samsung, suponiendo que se ha elegido una placa base que incluya los conectores Serial ATA.

Unidades DVD silenciosas A pesar de que las aberturas para unidades facilitan un manejo perfecto, a duras penas son idóneas para dispositivos de pequeño tamaño en ambientes sensibles al ruido. Por ejemplo, la Pioneer Slot Load (DVD-120SZ) esta alrededor de las 40€ y es más ruidosa que la mayoría de las unidades con bandeja. Son preferibles las unidades de carga por bandeja de perfil bajo, como las utilizadas en los ordenadores portátiles. En el caso de las unidades de perfil bajo el disco está directamente sujeto al eje rotor de la unidad. Los dispositivos normales de bandeja o slot usan muelles para sujetar el DVD entre el eje rotor y el cojinete y esto puede producir vibraciones, especialmente si el disco está desequilibrado. Vale la pena incluir una unidad de DVD ROM, incluso si no desea reproducir DVD. Las unidades de DVD son más lentas que las unidades de CDROM de 52X y eso las convierte en más silenciosas. También se puede intentar hdparm -E speed device para restringir la velocidad de la unidad a la deseada, sin embargo algunas unidades no responderán a esta orden. Si se pretende quemar CDs, o incluso DVDs, nuestra recomendaciones son las grabadoras GSA-4081B o GSA-4082B DVD de LG. Ambas unidades pueden manejar todos los estándar actuales de DVD, desde DVD RAM hasta DVD+RW, y alcanzar una velocidad de grabación en DVD de 8x, dependiendo de la calidad del disco. La GSA-4081B es una unidad asequible, con un precio de venta de aproximadamente 120€. Este modelo está siendo sustituido por el GSA-4082B.

Maestro y Esclavo La elección de la caja puede imponer restricciones al cableado interno. Si opta por una Travla c137, se vera forzado a conectar el disco duro y la unidad de DVD al mismo cable IDE, como unidades maestra y esclava. Por motivos de rendimiento es más sensato conectar cada unidad a un controlador IDE separado, así subirá la velocidad a la cual se intercambiara la información entre los dispositivos, ya que solo un dispositivo

22

Número 02

IDE conectado a un mismo cable puede transferir datos en un momento dado. Desde un punto de vista práctico, esto en modo alguno creará ninguna diferencia a su ordenador para el cuarto de estar. Después de todo, no se diseño para sustituir al servidor de ficheros y la unidad de DVD casi no será usada a la vez que use el disco duro. Un segundo cable IDE solamente impedirá, de forma innecesaria, la disipación del calor. Las unidades DVD de perfil estrecho como la Toshiba SDC2612 pueden causar reparos aquí. Están codificadas en hardware para funcionar como Seleccionado por cable, y no se pueden cambiar para funcionar como Maestro o Esclavo. Para que esta unidad funcione como esclava, necesitara conectarla al conector central del cable IDE, y eso puede ser laborioso y en algunas circunstancias - incluso imposible, dependiendo de la caja que haya elegido. La mayoría de las BIOS de los ordenadores le permiten iniciar desde un dispositivo conectado como esclavo, por lo que podrá dejar la unidad de DVD como unidad maestra y al disco duro como esclavo, si es necesario. Esto es preferible, sin duda alguna, a tener que usar cables extra largos que no se adaptan a las especificaciones UDMA 100, solo por conectar el lector DVD como esclavo.

Sin Teclado, Sin Monitor El panel MX2 de Matrix Orbital es una interesante manera de controlar un dispositivo aislado usado como grabadora de vídeo o como enrutador. El panel encaja en una bahía de 5,25 pulgadas y tiene un display LCD azul de dos lineas con 20 caracteres por linea y siete pulsadores, más de los que se necesitan para apagar o cambiar la dirección IP. El panel utiliza USB para conectarse al ordenador; no hemos tenido problemas con los controladores. El modulo ftdi_sio reconoce el panel perfectamente. Un conjunto de pruebas en Java, está disponible desde la página de Matrix Orbital [10]. El CD que acompaña al panel tiene un código de registro para un software de control LCDC repleto de características. Se puede usar esta herramienta, para controlar medidas y extensiones de hardware como consultar los sensores de temperatura, o controlar los LED de estado. El Matrix Orbital MX212 cuesta alrededor de 120€ en [11].

www.linuxmagazine.com.es

INFO [1] Sistema básicos Elito Epox EX5-300S: http://www.komplett.co.uk/ http://www. epox.com/ http://www.directron.com/ [2] Caja Travla Casetronic C137: http://www. mini-itx.com/ http://shop.store.yahoo. com/kmexpress/ http://www. myelectronics.nl/ [3] Guía para construir un receptor IR serie: http://www.lirc.org/receivers.html [4] Receptor IR montado: http://www. zapway.de/e_index1.htm [5] Kit de software wake on lan VDRonf: http://home.pages.at/linux/dvb.html [6] Cajas aisladas acusticamente y fuentes de alimentación sin ventiladores Silentmaxx: http://www.kustompcs.co.uk/ http://www.silentmaxx.net/ http://www. silentmaxx.de/ [7] Poweroid 1200: http://www.poweroid. com/ [8] Kit de refrigeración liquida Thermaltake Aquarius II Water: http://www.overclock. co.uk/ http://www.crazypc.com/ http:// www.new-generation.nl/ [9] Tarjeta gráfica ATI Radeon 7000: http:// www.overclockers.co.uk/ http://www. tigerdirect.com/ http://www. computer-land.nl/ [10]Programa de prueba para el panel LCD: http://www.matrixorbital.com/ [11] Matrix Orbital MX2: http://www. kustompcs.co.uk/ http://www. matrixorbital.com/ http://www. myelectronicx.nl/

Presupuesto Los PCs no tienen por que ser ruidosas cajas de color beige. Los diseños de caja atractivos y el aislamiento acústico convierten el PC en un suplemento agradable en cualquier sala de estar. Sin embargo, al igual que el silencio, la belleza es dorada. Un sistema hecho a medida puede fácilmente costar dos veces más caro que un equipo listo para usar del vendedor de clónicos de la esquina. Hacéselo uno mismo nos ahorrará dinero, pero esto hará que se tenga que pasar un montón de tiempo reflexionando en la configuración del sistema. Nada es más molesto que descubrir, cuando es demasiado tarde, que la máquina de sus sueños no es lo bastante potente como para reproducir DivX, o ■ jugar a Parsec como una seda.


Cámaras Digitales

PORTADA

Cámaras digitales bajo Linux

La Caja de Fotos Las cámaras digitales progresivamente van reemplazando a las tradicionales en nuestras casas. La forma típica en Linux de transferir imágenes desde la cámara al disco duro es con gPhoto o mediante el módulo basado en kernel de memoria masivos USB. Los entornos gráficos como digikam prometen un uso mejorado. POR ANDREA MÜLLER

C

omprar carretes, revelarlos, ordenar y almacenar las copias, comprar marcos y montar las copias en álbumes. Todas estas tareas que nos ocupan tanto tiempo son ahora cosas del pasado para fotógrafos aficionados que han pasado de un equipo de fotografía tradicional a uno digital. Aquellos que han hecho el cambio se encuentran con diferentes aspectos como encontrar el mejor software para su ordenador y transferir las imágenes digitales desde la cámara hasta el PC de su casa. La respuesta para usuarios de Linux depende de la marca y modelo de la cámara digital. Los dispositivos que se conectan por sí mismo al sistema como si fueran discos duros son los más sencillos, permitiendo al usuario la simple introducción del comando mount para tener acceso al dispositivo. Si tenemos una cámara que usa un protocolo especial para comunicarse

con el PC y es un modelo reciente, Puede que podamos utilizar el software producido por el proyecto gPhoto [1]. Este artículo describe ambos procedimientos y nos introduce a software diseñado específicamente para interactuar con cámaras digitales.

Montando la Cámara Algunas cámaras, como las series Exilim de Casio o Aito, se comunican con el sistema como un disco duro SCSI de la misma forma que un dispositivo de memoria USB se conecta al equipo. Podemos usar el comando mount para montar la cámara, comprobando el archivo /var/log/messages para descubrir el dispositivo adecuado: Feb 1 19:27:18 aries kernel:U SCSI device sdb: 20208U 512-byte hdwr sectors (10 MB) Feb 1 19:27:18 aries kernel:U

sda: Write Protect is off Feb 1 19:27:18 aries kernel:U sda: sda1

El siguiente comando ejecutado desde la raíz monta la cámara detectada que ha detectado como un sda 1: mount -t vfat /dev/sda1U /mnt/usb -o umask=0

en /mnt/usb. Los dispositivos son formateados con el sistema de archivos VFAT típicamente usado en Windows 9x. Como este sistema de archivos no tiene ningún permiso, el administrador puede asignarlos usando la opción umask. 0 es el valor más permisivo y asigna acceso de lectura y escritura a cualquier directorio de la cámara a cualquier usuario. Una entrada en /etc/fstab permitirá a usuarios sin privilegios el montaje de la cámara. Las opciones de montaje per-

www.linuxmagazine.com.es

Número 02

23


PORTADA

Cámaras Digitales

Figura 1: La opción de montaje “showexec” copia los permisos de archivos de Windows bajo Linux.

miten métodos para los permisos como asignar a un grupo usbusers permisos para borrar los archivos de la cámara. Tras crear el grupo y definir el punto de montaje, la entrada puede ser algo como: /dev/sda1 /mnt/usb auto users,U noauto,gid=333,umask=002,U showexec 0 0

La entrada gid es seguida por una ID numérica como la almacenada en el archivo /etc/group. Todos los miembros del grupo tienen acceso de lectura y escritura a la cámara. La entrada users, al contrario que user, permite a usuarios no privilegiados desmontar la cámara aún si ellos mismos no la han montado. showexec le resuelve el problema resultante de que VFAT no disponga de privilegios de sistema. Se debe asignar permisos de ejecución a los usuarios en umask para permitirles el acceso a la estructura del directorio. Un efecto secundario es que los archivos normales son etiquetados como ejecutables. Algunos programa de Linux como las versiones más antiguas del gestor de archivos Rox rehusan mostrar una previsualización de imágenes ejecutables. Podemos usar showexec para solucionar este problema puesto que emula el comportamiento de Windows. Los archivos con extensiones como .exe, .bat, y .com son etiquetadas como ejecutables pero no otras (ver figura 1). La entrada fstab permite a usuarios normales montar la cámara en /mnt/usb usando mount/dev/sda1. Los usuarios de Suse Linux pueden evitar este trabajo manual. El demonio hotplug crea automáticamente la fstab apropiada tan pronto se detecta la conexión de un dispositivo de memoria masiva USB.

24

Número 02

Podemos usar casi cualquier gestor de archivos para transferir archivos de imágenes desde nuestra cámara al disco duro. Si preferimos un programa especializado debemos probar Digikam [2]. Es el único que funciona con gPhoto 2 y también soporte dispositivos de almacenamiento masivo de memoria USB.

El proyecto gPhoto. gPhoto 2, que alcanzó la versión 2.1.4 en enero del 2004 consiste en dos componentes: la librería libgphoto2, que soporta más de 400 tipos de cámaras, y el programa línea de comandos gphoto2 que permite a los usuarios el acceso a las cámaras soportadas. El proyecto tienen sus raíces en gphoto0.4.x. La versión antigua tenía un interfaz gráfico integrado y una arquitectura monolítica. gphoto2 tienen una estructura modular y fue completamente reescrito por sus desarrolladores. La primera versión estable se comenzó a poder descargase en febrero del 2002. Las nuevas versiones de este software están disponibles cada pocos meses con versiones beta y preestrenos para acortar el espacio entre versiones estables y permitir a los usuarios probar cámaras nuevas. A medida que las versiones incluidas por los distribuidores tienden a quedarse atrás respecto al actual estado de desarrollo, los usuarios con nuevos modelos necesitan recopilar nuevos recursos. No obstante, esto también nos obliga a recompilar nuevas interfaces gráficas y gtkam, puesto que esta herramienta no funcionará habitualmente con la última versión si esta conectada a una librería antigua. Antes de probar todas estas cosas debemos introducir el comando gphoto2 --list-cameras para buscar que disposi-

www.linuxmagazine.com.es

tivos se soportan en la versión suministrada con nuestra distribución. Si no encontramos nuestro modelo debemos navegar hasta [3] para verificar el listado de compatibilidades de la versión actual de gphoto2. Últimamente, gPhoto 2 ha mejorado el soporte a modelos nuevos. Muchas de las cámaras actuales usan el Protocolo de Transferencia de Fotografías (Picture Transfer Protocol -PTP) [4] que asegura una transmisión simple de archivos entre dispositivos PTP. Esto elimina la necesidad de controladores especiales y permite a cualquier ordenador el intercambio de datos con cualquier otro dispositivo PTP sin la necesidad de instalar ningún software adicional. De hecho este tipo de dispositivo no tiene porque estar limitado a cámaras y ordenadores. El intercambio de datos con teléfonos móviles o impresoras es igual de fácil. Las cámaras PTP son “plug and play” en Windows XP y MacOS X.

Soporte Mejorado PTP Si bien el estándar fue publicado en el año 2000, muy pocos fabricantes estaban preparados para adoptarlo desde el principio, siendo Kodak y Sony unos de los pioneros. Afortunadamente, otros fabricantes comenzaron a apreciar las ventajas, por ejemplo, el del ahorro de costes, puesto que ya no necesitaban producir sus propios controladores. gPhoto 2 introdujo el soporte de cámaras PTP en junio del 2002. Al principio era bastante espartano, siendo solo capaz de transferir archivos de imágenes a disco. Otros comandos como sacar el listado de los archivos de imágenes, pistas destinadas a la reproducción de errores I/O o interfaces basados en GUI solo funcionaban a ratos. La estabilidad se incrementó dramáticamente con la versión 2.1.3. No obstante, una cámara explícitamente listada en la lista de dispositivos soportados estaba mejor soportada que una cámara de clase genérica USB USB PTP Class Camera. Esta característica sigue en fase de pruebas.

Permisos Si nuestra cámara está soportada, aún tenemos que lidiar con el problema de los permisos a no ser que nuestro distribuidor se haya preocupado de permitir


Cámaras Digitales

a otros usuarios al margen de root el acceso a la cámara. Las cámaras USB se detectan por el sistema como entradas debajo del punto de montaje /proc/bus/usb. Aquí es Figura 2: gPhoto 2 reconoce nuevas cámaras conectadas donde está localizado el sistema de automáticamente por conexión USB. archivos USB. El kernel genera el sistema de archivos de forma /etc/hotplug/usb/usbcam.usermap para genérica de forma similar al pseudo sisla cámara. tema de archivos /proc [5]. Los cambios en permisos se pierden cada vez que se Scripts reinicia el sistema. Cuando el demonio conecta con un disHay dos formas de permitir acceso a la positivo llama al código cámara a otros usuarios: /etc/hotplug/usb/usbcam, que ajusta los • Cambiando los opciones de permisos para la cámara conectada. libgmontaje para el sistema de photo2 proporciona cuatro códigos de archivos USB. ejemplo. Si construimos el código • Ajustando dinámicamente los nosotros mismos, los encontraremos en el permisos usando el demonio directorio de código fuente bajo packahotplug. ging/linux-hotplug. La mayoría de las El primer método es el más simple de los distribuciones los almacenan bajo dos. La siguiente entrada en /etc/fstab /usr/share/doc/libgphoto2-versionnumber. none /proc/bus/usb usbfsU Los cuatro scripts de ejemplo suminisdevmode=0664,devgid=333 0 0 trados consisten en: usbcam.group, donde el administrador introduce el grupo al que monta en /proc/bus/usbv con permisos asignar los permisos correctos, de lectura y escritura para usuarios y usbcam.user, el cual espera el nombre del grupos con la identidad (ID) de 333 usuario al que asignar permisos, usb(estos son los usuarios USB en nuestro cam.x11-app, el cual lanzará sistema). Los usuarios que no sean parte inmediatamente gPhoto y usbcam.console. de este grupo solo tienen acceso de lecEl código requiere PAM [6], instalado tura. por defecto en Red Hat o Mandrake Estas opciones de montaje son válidas Linux. Éste asigna todos los permisos de para cualquier dispositivo USB y no sólo la cámara al usuario conectado a la conpara cámaras. sola. Si construimos nuestra propia El demonio hotplug proporciona una versión de gPhoto, necesitaremos actuaforma más elegante de resolver este lizar usbcam.usermap usando el problema. Monitoriza los puertos USB siguiente comando: del sistema y reconoce cualquier dispositivo USB conectado por sus respectivos /usr/local/lib/libgphoto2/U Ids, los cuales se almacenan en archivos print-usb-usermap >U /etc/hotplug. Dependiendo de nuestra /etc/hotplug/usb/usbcam.usermap distribución, el demonio analiza el archivo /etc/hotplug/usb.usermap o el Si nuestra distribución analiza archivo usb.usermap deberemos borrar cualquier

PORTADA

archivo que comience con usbcam y luego añadir el ID de la cámara al final del archivo: /usr/local/lib/libgphoto2/U print-usb-usermap >>U /etc/hotplug/usb.usermap

La configuración de las cámaras de esta forma garantiza el acceso a usuarios normales. Un interfaz gráfico no es absolutamente necesario. La herramienta de la línea de comandos de gPhoto 2 proporciona un amplio abanico de funciones. La siguiente sintaxis: gphoto2 --auto-detect

Muestra nuestra cámara tal y como es detectada por el programa (ver figura 2).

Cámara en la Línea de Comandos Solo se requieren unos pocos parámetros para el acceso básico. -l lista los directorios, -L añade los nombres de los archivos. Los usuarios pueden hacer referencia a los números de serie en estos resultado (ver figura 3) usando la sintaxis -p number(n) para filtrar archivos específicos. -P hace referencia a todas las imágenes encontradas en el directorio actual de trabajo. Si solo queremos transferir archivos de imagen específicos al disco duro podemos indicar gphoto2 -p 2,4,5 para descargar las imágenes 2, 4 y 5 o especificar un rango, por ejemplo gphoto2 -p 2-4, es bastante fácil excluir archivos de un rango. Por ejemplo gphoto -p 2-6,4 descarga las imágenes 2, 3, 5 y 6, pero no la número 4.

Nombres Intuitivos El programa puede hacer muchas más cosas. Las cámaras digitales asignan

Figura 4: El parámetro -a lista las capacidades de la cámara, indicando si la Figura 3: gPhoto 2 muestra una lista de las imágenes en la cámara.

cámara soporta miniaturas, por ejemplo.mentación.

www.linuxmagazine.com.es

Número 02

25


PORTADA

Cámaras Digitales

nombres de archivo a las imágenes que son francamente poco intuitivos, pero gphoto2 puede cambiar el nombre cuando descarga los archivos. Para hacer esto debemos indicar el parámetro --filename seguido por un nombre. --filename acepta formatos típicos de fechas (date) como %y, %m, y %d para años, meses y días. Adicionalmente, %n especifica un número, %C el Figura 5: Claro y funcional: el GUI de GTKam. sufijo de un archivo y finalmente %f especifica un la línea de comandos interna del pronombre de archivo sin sufijo. gphoto2 -P grama. Si alguna vez hemos usado un --filename cumpleaños_juanito_%n.%C cliente basado en texto FTP, no debemos descarga las fotografías de la cámara y tener problemas en encontrar el camino. construye el nombre del archivo con la ristra cumpleaños_juanito_, el número Funciones Adicionales de la imagen, un punto y el sufijo del help muetstra lista de los comandos archivo. disponibles para gPhoto2, help nombreLos parámetros -T y -t número(s) comando muestra la sintaxis de descargan cualquier o una selección de comandos individuales. ls lista los miniaturas de nuestra colección de fotos. archivos. cd cambia a otro directorio de Si disponemos de una cámara que puede la cámara. delete file borra un archivo. almacenar clips de vídeo, al margen de get file inicia la descarga de una imágenes, podemos especificar fotografía al directorio actual, y --get-audio-data número(s) o --get-allauget-thumbnail hace lo mismo con la dio-data para acceder a estos archivos. miniatura de la imagen actual. Si abriPara hacer sitio a nuevos archivos intromos el shell de gPhoto en un directorio ducimos --delete-files número(s) y para el que no tenemos privilegios de --delete-all-files. escritura, podemos escribir lcd directory Las funciones que gPhoto 2 ofrece para cambiar a otro directorio local. El dependen en parte de la cámara que comando show-exif fichero está diseñado conectemos. gphoto2 -a nos mostrará las para mostrar los meta-datos del archivo funciones de la dispositivo conectados de una imagen, pero no funcionó en (ver figura 4). nuestro laboratorio. q, quit o exit finaliza Algunas cámaras permiten que les el programa de la línea de comandos. subamos archivos de imágenes. El parámetro -m seguida de un nombre crea Entornos gráficos un directorio en la cámara y gphoto2 -u Si no estamos contentos con la línea de nombrefichero sube archivos. Los resulcomandos, podemos probar uno de los tados de gphoto2 -a no son entornos gráficos de gphoto. Hay completamente fiables. Si bien se supone muchos compitiendo actualmente por la que el controlador para nuestra cámara posición de mejor amigo del fotógrafo de ensayo no soporta capture según el amateur. programa, es posible controlar la cámara El competidor más antiguo es gtkam remotamente y gphoto2 --capture-image [7], competidor fuerte (ver figura 5) que capturará una imagen. Desafortunadasolo provee funcionalidades básicas. mente, la opción -- capture-sound nos Seleccionando Camera | Add | Camera | llevó a errores entrada / salida en nuDetect indica al programa que acceda a la estro laboratorio Linux. función de auto reconocimiento de El parámetro --shell permite al usuario gPhoto 2. Podemos usar una vista tipo navegar por los directorios de la cámara árbol del gestor de archivos en una igual que haría por los sistemas de cámara que lo soporte. GTKam muestra archivos locales. Los usuarios pueden imágenes en la parte derecha del panel. introducir gphoto2 --shell para desplegar

26

Número 02

www.linuxmagazine.com.es

La vista miniaturizada proporciona una vista general inicial. El menú File nos permite descargar todas las imágenes o solo las seleccionadas y borrar de la cámara cualquier imagen que hemos transferido correctamente a nuestro disco duro. digikam proporciona muchas más ventajas para el usuario. En lugar de abandonar al usuario tras la descarga, la herramienta también gestiona imágenes en el disco duro. Las imágenes se organizan en álbumes, los cuales con en realidad simples directorios. El programa mostrará los álbumes en lugar de simplemente ofrecer una vista general del sistema de archivos. Las vistas miniaturizadas se muestran en la zona derecha del panel (ver figura 6). Podemos arrastrar y soltar una imagen para copiarla o moverla a otro álbum en la vista árbol.

Digikam, la estrella emergente Digikam muestra utiliza una método abierto a la hora de montar una cámara. Al margen de los modelos soportados por gPhoto 2, ofrece además acceso a dispositivos de almacenamiento masivo USB. Podemos seleccionar USB Mass Storage e introducir un pinto de montaje (ver figura 7) para ajustar este tipo de dispositivos. Seleccionando Camera | Connect montamos el dispositivo en el archivo del sistema. Además de las funciones de descarga y borrado de imágenes, Digikam también tiene la función de subir imágenes. Para ver imágenes a escala completa podemos abrirlas opcionalmente en un visor externo en lugar de en el visor interno. Los programas KDE como kuickshow y kview son algunos ejemplos de visores externos. Una función de presentación de diapositivas que opcionalmente soporta etiquetas con nombres de archivos redondea el programa. La nueva versión 0.7 acaba de salir. Esta versión tendrá funcionalidades adicionales. Digikam usa una arquitectura plug-in en la nueva versión, permitiendo a los desarrolladores extender la funcionalidad del programa. Los candidatos de versión 1 y 2 ya disponían de una


Cámaras Digitales

PORTADA

colección de funciones plug-in que la típica vista en forma de que proporcionaban las siguienárbol, puesto que deja más tes ampliaciones entre otras: espacio para la imágenes en el • Presentaciones de diaescritorio (ver figura 9). positivas con efectos. Si preferimos usar el mismo • Codificador MPEG que programa para todas las operapuede usar la heciones con nuestros archivos, rramientas mjpeg- o puede que lo preferible sea Imagemagick para optar por usar el gestor de crear vídeos para archivos KDE Konqueror para VCDs, SVCDs o DVDs. transferir imágenes desde • Galería HTML, una nuestra cámara al disco. extensión de los plugGracias a la Kioslave camera ins de Konqueror , la herramienta de gestión de Gallery archivos de KDE puede usar la • Editor de comentarios. librería libgphoto2 para acceder • Ayudante de impresión Figura 6: Vista de árbol, vista cámara y previsualización en Digikam. a cualquier cámara digital de fotografía para soportada como si estuvieran ordenar múltiples imálocalmente conectada al sisgenes en la misma tema. Escribiendo camera:/ en hoja. la línea de direcciones URL, el • Archivo de CD (neceproceso de auto detección le sita K3b). indica a Konqueror que debe • Funciones de correo mostrar el directorio raíz de la electrónico con cámara. opciones para cambiar Información Exif el tamaño y ratio de compresión de los Las imágenes de algunas archivos. Funciona cámaras digitales incluyen el con KMail, Sylpheed y llamado Exif (Formato de interMozilla. cambio de archivos de En lo que se refiere a la gestión imágenes.Exchangeable y archivo de imágenes digitales, Image File Format) [9], que Digikam ha desarrollado funalmacena información como la ciones que atienden a todas las fecha y hora, la distancia focal, necesidades de los usuarios. el modo del flash o el tipo de flphoto [8] usa un método discámara. Los usuarios que tinto. El programa es realmente deseen mantener esta metaFigura 7: Digikam también soporta cámaras que el sistema detecta una herramienta de gestión de información mientras procesan como sistemas de almacenamiento masivo USB. imágenes que ofrece acceso a la las imágenes, no pueden usar cámara como un añadido. La herramientas de manipulación herramienta carece de la opción de imágenes tradicionales, de borrar imágenes de la puesto que la meta-informacámara. El diálogo Album | ción se pierde al guardar las Import | Camera proporciona imágenes de la cámara al disco una solución fácil no obstante. duro. Cuando arrancamos este proSe está buscando una solugrama, FLPhoto detecta ción a este problema en la automáticamente la cámara y próxima versión de Gimp, muestra previsualizaciónes en puesto que es capaz de guardar miniatura de las imágenes en la la información Exif. Mientras Figura 8: Importación de imágenes desde una cámara digital en ventana de transferencia (ver tanto debemos optar por el FLPhoto. imagen 8). comando llamado jhead [10]. Las funciones de gestión de imágenes seleccionamos Image | Remove para bojhead analiza la cabecera de Exif, la son muy avanzadas. El programa trabaja rrar una imagen del álbum, no borramos almacena y luego manda la imagen a con álbumes, que en realidad son la imagen físicamente de nuestro disco. otro programa donde pueda ser editada. archivos de texto que contienen los nomLa barra de previsualización en la parte La siguiente sintaxis ejecutará exactabres de las imágenes del álbum. Si inferior de la ventana es más práctica mente esta tarea:

www.linuxmagazine.com.es

Número 02

27


PORTADA

Cámaras Digitales

jhead -cmd "jpegtran -rot 270U &i > &o" foto_retrato.jpg

jpegtran rota la imagen 90 grados a la izquierda (-rot 90 rotará el mismo ángulo pero hacia la derecha). Esto es algo que los fotógrafos aficionados necesitan habitualmente cuando hacen fotografías con la cámara en posición vertical. jhead &i con el nombre del archivo original. &o se refiere a un archivo temporal donde los resultados serán almacenados. jhead inserta la cabecera Exif en este archivo y reemplaza la imagen original con la rotada. Como el programa automáticamente asigna el nombre del archivo correcto podemos usar comodines como *.jpg para procesar múltiples imágenes en un mismo lote.

JPegtran: Mejor que Imagemagick Comparado con convert del paquete Imagemagick, el programa JPegtran usado en nuestro ejemplo tiene la ventaja de crear archivos jpeg sin pérdidas. Si usamos convert, el almacenaje de imágenes recomprimirá la imagen y perderá datos de la misma. JPegtran es parte de libjpeg y debe estar disponible con la mayoría de las distribuciones. La solución más directa para visualizar cabeceras Exif actualmente en GTK es un programa llamado gexif, disponible para su descarga desde la

página Web del proyecto libexif [11]. Usa pestañas para mostrar los campos individualmente e incluso muestra explicaciones de algunos tipos de contenidos (ver figura 10). La última versión de Digikam, a partir de la 0.6, dispone de la misma función. exiftags [12] es útil para mostrar información de Exif en la línea de comandos. Separa el resultado en la cámara y las partes específicas de la imagen. El mismo paquete incluye adicionalmente exifcom, que puede ser utilizarse para rellenar el campo de comentarios del usuario (UserComment) de la cabecera de Exif (se supone que la propia cámara fija este campo). Llamar a la herramienta sin ningún tipo de indicador o parámetro mostrará un comentario, si está disponible.

INFO ≠[1]gphoto2: http://www.gphoto.org/ [2] Digikam: http://digikam.sourceforge.net/ [3] lista de las cámaras compatibles con gPhoto2: http://www.gphoto.org/proj/ libgphoto2/support.php [4] Software gratuito con soporte PTP: http:// ptp.sourceforge.net [5] Sistemas de archivos de dispositivos USB: http://www.linux-usb.org/USB-guide/ x173.html [6] PAM: http://www.kernel.org/pub/linux/ libs/pam/ [7] Gtkam: http://www.gphoto.org/proj/ gtkam/ [8] flphoto: http://www.easysw.com/~mike/ flphoto/ [9] Exif: http://www.exif.org/ [10]jhead: http://www.sentex.net/ ~mwandel/jhead/

exifcom -w "myU comment"U imagefile.jpg

[11] gexif: http://sourceforge.net/projects/ libexif/ [12] exiftags: http://johnst.org/sw/exiftags/

fijará o sobrescribirá el comentario. Si deseamos prevenir que exifcom nos solicite permiso antes de sobrescribir, simplemente debemos añadir el parámetro -f.

Con Buena Voluntad… Algunas personas aún mantienen que Linux no implementa multimedia como otros sistemas. Obviamente hace tiempo que no prestan atención al mundo de las cámaras digitales, puesto que se han producido unos

progresos tremendos en esta área a lo largo de los últimos meses. El proyecto KDE, Digikam,es un buen ejemplo esta afirmación: es un paquete potente y cómodo de utilizar, que hace que el procesado de imágenes en Linux sea un verdadero placer. Incluso si no tenemos suerte y Digikam no soporta nuestra cámara, aún podemos utilizar como último recurso un lector de tarjetas basado en USB que nos garantizará ser capaz de transferir nuestra fotografías a ■ nuestro disco duro

Figura 9: Ventana de previsualización y visualizador de imágenes de

Figura 10: Gexif muestra toda la gama de información Exif, desde la configu-

FLPhoto.

ración de la cámara, hasta miniaturas.

28

Número 02

www.linuxmagazine.com.es


Grabadoras DVD

PORTADA

Prueba de seis grabadoras de DVD

La Tostadora ¿Cuándo un DVD no es un DVD? Actualmente hay al menos cinco estándares de DVD en el mercado y nadie puede predecir cual prevalecerá. Linux Magazine ha probado seis grabadoras de DVD que soportan todos estos estándares. Continua leyendo para evitar cometer un caro error. POR MIRKO DÖLLE

¿

Una grabadora de DVD por navidades? Bueno, ¿por qué no? Desafortunadamente, si esta es la única información de la que disponemos para hacer la compra, pronto nos encontraremos perdidos en un laberinto de estándares compitiendo. Todos son DVDs, pero todos los estándares como RAM, Minus, Plus, R o RW requieren medios específicos. Otro asunto es el disco que puede ser reproducido en nuestro reproductor de vídeo DVD o en nuestro ordenador.

La jungla de los estándares Al principio solo estaba el DVDROM, difícil de distinguir del CD-ROM a primera vista. Para permitir que ambas caras del disco se pudiesen usar, la capa de datos no se creaba mediante la deposición por vacío, si no que era puesta entre la superficie inferior y la superior. Esto hace que casi todos los DVDs laminados estén compuestos de dos discos pegados con un espesor de 0.6 milímetros (ver figura 1). Al margen de esto, el DVD-ROM es muy similar al CD excepto por el hecho de que las pistas de la estructura de datos son más pequeñas y la espiral es más cerrada. Por supuesto que los DVD-ROMs no son grabables, pero al menos han sido normalizados y aprobados por el foro DVD [1], mostrando el familiar logotipo de DVD como prueba. Los medios regrabables deben preferiblemente usar este formato para permitir que funcionen en dispositivos y reproductores antiguos. El primer medio DVD regrabable fue el DVD-RAM. Originalmente fue ideado

para almacenar datos como un disco duro. Por este motivo puede ser reescrito hasta 100.000 veces. El medio DVD-RAM puede ser reconocido por las marcas doradas que encontramos en la parte inferior a modo de sectorización. Los DVD-RAMs pueden ser leídos en prácticamente cualquier DVD. Los otros dos formatos de escritura aprobados por el foro DVD son el DVD-R y el DVD-RW. Estos formatos, llamados “DVDMinus” son muy similares al CD-R y al CD-RW y es especial respecto a su manejo. Los programas de grabación escriben datos al disco DVD, y los medios regrabables DVD-RWs pueden ser borrados completamente si esto es necesario por el software de grabación.

Formatos competitivos Los formatos “DVD-Plus” fueron creados para competir con los formatos “minus” y no son formatos DVD oficiales. En lugar de usar largas espirales como los formatos DVD-R o CD-R, los DVD+RW disponen de pistas reales organizadas en círculos concéntricos como los discos duros. El estándar DVD-Plus está soportado por los reproductores más importantes, como Philips, Ricoh, Hewlett Packard, Sony, Mitsubishi, Yamaha y Verbatim. El primer medio “plus” fue el DVD+RW, no apareciendo el que permitía la escritura (DVD+R) hasta 18 meses más tarde.

Similitudes y diferencias En teoría, cualquier disco DVD puede ser reproducido o leído por cualquier

reproductor de DVD. Como es habitual esta teoría tiene poco que ver con las aplicaciones en la vida real. El único formato que es más o menos fiable en el DVD-R, puesto que al menos los dispositivos de DVD-ROM más antiguos y los reproductores de DVD pueden usarlo. Esto es debido al hecho de que el DVDR existía, al menos en en teoría, cuando los reproductores de DVD empezaron a ser producidos. Otra razón es que el DVD-R está más cercano a las normas de las características ópticas del DVDROM. El nivel de reflexión en superficie está entre el 45 por ciento y el 85 por ciento (justo como el DVD+R) en comparación con el DVD-ROM. Además, los datos están organizados en espiral, mientras que en el DVD+R utiliza sectores y pistas. Algunos reproductores de DVD son también capaces de reproducir DVDRAMs, si bien este medio fue diseñado para almacenar datos y usa la sectorización de forma similar a los medios DVD-Plus. Los sectores forman un patrón fácilmente reconocible en la parte inferior (ver figura 2), siendo esta una característica inequívoca del DVDRAM. Por cierto, no se requieren controladores o programas de grabación especiales para escribir DVD-RAMs. El dispositivo de grabación funciona exactamente como un disco duro cuando un DVDRAM es insertado, pudiendo ser particionado, formateado y escrito según se requiera. Para formatear un nuevo DVD-RAM con Ext3 simplemente podemos escribir mke2fs -j /dev/scd0 antes de ir a mount /dev/scd0 /mnt para

www.linuxmagazine.com.es

Número 02

29


PORTADA

Grabadoras DVD

Se requiere que el láser enfoque de forma distinta para medios de capa doble y para medios de capa simple. Es bastante común que el firmware use el nivel de reflexión como un indicador. Esto normalmente provoca que los reproductores más antiguos confundan DVD-RW y DVD+RW con DVDROMs de doble capa, y, puesto que el láser no puede enfocar la segunda capa, no se pueda reproducir el disco.

Omnívoros y Huelgas de Hambre Figura 1: DVDs compuestos de dos discos pegados conjuntamente de 0.6 milímetros de espesor. La capa de reflexión, que se daña muy fácilmente, está protegida en el centro entre los dos discos.

usar el medio de la misma forma que un disquete.

Problemas “Plus” Uno de los mayores factores que evitan que el DVD+R tenga mayor difusión es el hecho de que fue introducido con posterioridad. Es habitual que el firmware de un reproductor DVD sea incapaz de

soportar DVD+Rs. Y los medios DVD reescribibles son una fuente constante de problemas. Estos reflejan solo entre el 18 y el 30 por ciento de la luz del láser (ver figura 2) en comparación con un DVDROM de capa simple, consiguiendo por tanto reflexiones típicas de DVD-ROMs de doble capa donde los datos están almacenados en capas superpuestas.

La batalla entre el formato “Plus” según está soportado por los fabricantes y el formato “Minus” aprobado por el foro DVD continúa siendo frenética. Por este motivo hemos restringido nuestras pruebas a dispositivos de grabado de formatos múltiples que anuncian soporte para ambos formatos, lo que nos dejá, como usuarios, en el lado seguro de la guerra. Hemos probados un total de seis dispositivos SCSI con controladores ATAPI que actualmente solo se utilizan en estudios profesionales.

Tabla resumen de las grabadoras del ensayo Posición:

1

2

3

4

5

6

Imagen:

Fabricante: Modelo: Internet:

LG

Iomega

NEC

Teac

Plextor

BTC

GSA 4040B

Super DVD

DV-1300A

DV-W50DK

PX-708A

DRW-1004

http://www.lgelectronics. .co.uk

http://www.iomega.com

http://www.nec.co.uk/

http://www.teac.co.uk

http://www.plextor.be

http://www. btceurope.nl

Cache: 2 MByte Interfaz: ATAPI,UDMA-2 Formatos y velocidades de grabación:

2 MByte

2 MByte

2 MByte

2 MByte

2 MByte

ATAPI,UDMA-2

ATAPI,UDMA-2

ATAPI,UDMA-2

ATAPI,UDMA-2

ATAPI,UDMA-2

DVD-R/DVD-RW

4x/2x

4x/2x

4x/2x

4x/2x

4x/2x

4x/2x

DVD+R/DVD+RW

4x/2.4x

4x/2.4x

4x/2.4x

4x/2.4x

8x/4x

4x/2.4x

DVD-RAM/DVD-ROM

3x/12x

3x/12x

-/12x

-/12x

-/12x

-/12x

24x/16x/32x

16x/10x/40x

16x/10x/32x

40x/24x/40x

40x/24x/40x DVD-R1

CD-R/CD-RW/CD-ROM 24x/16x/32x

Programa de grabación en Linux: Discos soportados cdrecord-ProDVD 2.0.1 growisofs 5.13.4.7.4 dvdrecord 0.1.5

DVD-R,DVD-RW,

DVD-R,DVD-RW,

DVD-R,DVD-RW,

DVD-R,DVD-RW,

DVD-R,DVD-RW,

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD-R,DVD-RW,

DVD-R,DVD-RW,

DVD-R1,DVD-RW,

DVD-R1,DVD-RW,

DVD-R,DVD-RW,

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD+R,DVD+RW

DVD-R1,DVD-RW

DVD-R1,DVD-RW

DVD-R1,DVD-RW

DVD-R1,DVD-RW

-

mini-guía,software

mini-guía,software

cable IDE,cable audio,

cable IDE,tornillos,

cable audio,

Windows

Windows

tornillos,DVD-R,CD-R,

jumpers,herramienta

tornillos,

Incluye (Kit de compra) cable IDE,cable audio, DVD-RAM,manual, software Windows

-

Manual,software

extracción,DVD+R,

DVD+RW,software

Windows

miniguía,software

Windows

Windows Precio:

150 US$

210 US$

1:No se pudo escribir en Prodisk DVD-R

30

Número 02

www.linuxmagazine.com.es

150 US$

200 US$

280 US$

150 US$


Grabadoras DVD

Figura 2: vista de los 5 discos grabables de DVD: DVD-RW arriba a la izquiera, DVD+RW arriba a la derecha, DVD-R abajo a la izquierda, DVD+R abajo a la derecha y DVD-RAM abajo. Las diferencias en las características de reflexión son fácilmente reconocibles.

Para las pruebas, escogimos deliberadamente discos sin marca de gama baja, de precio por debajo de 2 euros. Los productos de marca pueden ser muy caros en comparación, costando habitualmente de 3 a 5 veces más que los de marca blanca, siendo este el motivo de que discos como Prodisk, Princo o Xcitek sean tan populares. Los resultados fueron ambivalentes, no pudiendo todos los dispositivos manejar todos los discos que utilizamos con ellos. En el caso de la grabadora BTC DRW-1004, incluso disco DVD-R de marca como TDK o Teac no funcionaron. Solo las grabadoras LG GSA-4040B y la Iomega Super DVD aceptaron todos los discos sin protestar. Lamentablemente no solo fue el problema de compaginar los discos y las grabadoras. El programa de grabación dvdrecord simplemente no pudo soportar algunos discos, por ejemplo los discos Prodisk en ninguna grabadora. La tabla proporciona una vista general de la comparación de discos, grabadoras y programas de grabación.

Los ganadores El ganador de nuestro ensayo es LG. La grabadora GSA-4040B cuesta unos 150

euros (140 para mayoristas), lo que significa en torno a un 25 por ciento menos que la Iomaga Super DVD. Ninguno de estos dispositivos nos dieron el más mínimo problema a lo largo de nuestras pruebas, funcionando las dos perfectamente con un amplio abanico de discos y programas de grabación. Por otro lado, solo los dispositivos LG e Iomega son capaces de escribir DVDRAMs. Estos discos (ver la parte inferior de la figura 2) son bastante caros (de 8 a 12 dólares cada uno), pero pueden ser reescritos hasta 100.000 veces, lo que significa una 100 veces más que los DVD-RWs o los DVD+RWs en teoría. Estos lo convierte en una alternativa interesante a las cintas o los discos magnetoçópticos (MODs) en aplicaciones donde gran cantidad de datos necesitan ser transportados frecuentemente. Por supuesto que el DVD-RAM no ofrece la misma velocidad que un disco duro Firewire o USB 2.0. El tercer lugar ha sido para la popular NEC DV-1300ª. Es tan cara como el dispositivo ganador pero no puede grabar DVD-RAMs. Tuvo problemas con los DVD-Rs de Prodisk usando los programas dvdrecord y growisofs pero sí los pudo usar con el programa cdrecord-ProDVD.

PORTADA

La grabadora Teac DV-W50DK fue ocupa una modesta cuarta plaza. Es sólo un poco más barata que la omega Super DVD pero no soporta discos DVD-RAM. En el penúltimo lugar encontramos la Plextor PX-708A con un precio de 280 dólares, siendo la única grabadora de la comparativa capaz de grabar DVD+Rs a una velocidad de 8, lo que explica la diferencia en precios. No obstante, la Plextor no puede grabar DVD-RAMs. Hubo una cosa que nos ocurrió con un disco defectuoso de DVD+RW. Cuando growisofs canceló el proceso de grabación debido al error del disco tuvimos que abrir y cerrar manualmente la bandeja del dispositivo para convencerlo de que aceptara el disco. El intentar montar el disco sin abrir la bandeja primero provocaba que nuestro ordenador se colgara una y otra vez. En otros casos, el sistema y el comando montar se colgaban juntos durante casi media hora. La grabadora BTC DRW-1004 se clasificó la última en el ensayo. Al igual que la ganadora, cuesta en torno a 150 dólares, pero tuvo muchos problemas con los discos DVD-R de Prodisk, Princo, TDK, y Teac independientemente del programa de grabación que usásemos. O el dispositivo rehusaba escribir el disco o el disco no funcionaba en un reproductor de DVD posteriormente. Los discos Xcitek DVD+RW tampoco funcionaban correctamente, siendo de hecho la grabadora BTC muy selectiva con los discos que usa. Nuestra recomendación es la grabadora LG GSA-4040B.

Conclusión Los dispositivos de grabación de DVD funcionan en Linux, si bien deberíamos matizar esta declaración. Un conjunto compuesto por una grabadora, disco y software de grabación puede no funcionar, como prueba el caso del dvdrecord. Nuestra recomendación es elegir o la versión actual de growisofs o la comercial de cdrecord-ProDVD (que es gratuita para usuarios privados) puesto que ninguno de estos programas nos ha ■ dado ningún problema.

RECURSOS [1] Foro DVD, la organización de la estandarización del DVD:http://www. dvdforum.org

www.linuxmagazine.com.es

Número 02

31


DESARROLLO

SDL

Moviendo “Sprites” por la pantalla

Cash and Carry En la primera parte de este tutorial vimos como cargar una imagen en una superficie, y como transferir un bloque (blit) sobre la pantalla. Este mes, mostraremos cómo esas operaciones básicas de carga y transferencia de bloque se pueden utilizar para componer la pantalla completa del juego. POR STEVEN GOODWIN

N

uestra pantalla de titulo en el número 1 de Linux Magazine, publicada en la página 28, consistió en una superficie y una transferencia de bloque (blit). Pero con una superficie y varias transferencias de bloque, podemos hacer mucho más ¿Cómo? Bien, pues si tomamos una sola superficie y señalamos un área de 32 por 32 pixeles. A cada área la llamaremos ladrillo, o región. Podemos entonces transferir un bloque desde cada ladrillo a lugares específicos en la superficie de la pantalla para construir una imagen completa. Como podemos transferir en bloque varias veces desde un ladrillo (y a varios lugares diferentes), utilizaremos

32

Número 02

menos memoria que en la pantalla de bienvenida, aunque cubriremos la misma área. La mayoría de las plataformas de juegos usan este método. Incluso en los juegos de estrategia en tiempo real (como Command & Conquer y Warcraft) usan este sistema, aunque sus gráficos sean isométricos en apariencia. Al hacer el tamaño del ladrillo uniforme a través de todo el juego, nuestros gráficos pueden presentarse en lugares predecibles de la superficie de la imagen haciendo que el código de control sea entonces mucho más fácil de escribir. También estipularemos que cada superficie deba ser 640 pixeles de ancho, dando un número constante de ladrillos (20) en

www.linuxmagazine.com.es

cada línea. Esta es una decisión arbitraria para hacer el trabajo del artista más uniforme: mientras más opciones proponga, ¡mas sitio habrá para el error! El código para dibujar un solo ladrillo en la pantalla será entonces como el mostrado en el Listado 1. Aunque cada ladrillo será alineado sobre un espacio limitado de 32x32,

Figura 1: Un grupo de bloques de muestra.


SDL

Figura 2: A la izquierda, Explorer Dug desprovisto de un alpha. A la derecha, con un alpha de 128.

nuestra función exDrawTile ha de ser escrita para dibujar ladrillos en cualquier posición arbitraria, permitiendo que sea reutilizada por el código renderizador para el jugador y su enemigo. Determinar que ladrillo se dibuja y en que lugar se colocará, es la responsabilidad de un bucle y una simple matriz de índice de ladrillos. Podemos hacerlo con una breve función como la del Listado 2. Puesto que no tenemos ningún medio de estirar nuestros ladrillos, cualquiera de las cosas grandes en nuestros niveles (como la puerta de salida) tendrá que ser construida combinando varias ladrillos más pequeños. Por el contrario, cualquier imagen que sea más pequeña que 32x32 solo ocupara una porción del ladrillo y tendremos que utilizar pixeles transparentes para ocultar el resto.

Abriendo puertas La transparencia se maneja con una técnica conocida como afinado del color. Por cada superficie que requiera trans-

Listado 1: Dibujando un ladrillo 01 void exDrawTile(SDL_Surface *pTile, int iRegion, int x, int y) 02 { 03 SDL_Rect src, dest; 04 src.x = (iRegion % iNumTileWidth) * iTileWidth; 05 src.y = (iRegion / iNumTileWidth) * iTileHeight; 06 src.w = iTileWidth; 07 src.h = iTileHeight; 08 dest.x = x; 09 dest.y = y; 10 dest.w = iTileWidth; /* No son necesarios actualmente, ya que son ignorados */ 11 dest.h = iTileHeight; 12 if (SDL_BlitSurface(pTile, &src, pScreen, &dest) < 0) 13 fprintf(stderr, "Blit error! %s", SDL_GetError()); 14 }

parencia especificamos un color simple que, en lugar de ser transferido en bloque, sera ignorado. No existe un color especifico que tenga que usarse para este propósito. Tampoco debería haberlo. Puesto que todos los juegos son diferentes y cada gráfico en el juego utilizará un sistema de colores distinto, debemos elegir un color clave especifico. Sin embargo, un color cuidadosamente elegido será, normalmente, suficiente para todos los gráficos del juego. Las mejores opciones son los colores muy brillantes, extremos, los que, por lo general, nadie usaría. En Explorer Dug usaremos el verde brillante ¡Incluso el verde fluorescente! Con unos componentes RGB de 0, 255, 0 es muy improbable que alguien pueda ‘accidentalmente’ usarlo como parte de un gráfico autentico, incluso para la hierba. Si los artistas quieren un verde brillante seguro que 0,254,0 es suficientemente bueno, con tal de que tengamos bastante resolución con la profundidad de color elegida (Véase el cuadro “Claridad de Color”). He utilizado siempre una clave de color verde intenso en mis juegos, y sin embargo nunca he tenido un problema. Hemos elegido un color, ahora tenemos que decirle a la superficie cual es SDL_SetColorKey(pGeneralTileGfxU , SDL_SRCCOLORKEY, SDL_MapRGB(U pGeneralTileGfx->format,U 0, 255, 0));

Esta función toma la superficie y le aplica una clave de color verde brillante. La clave de color tiene que ser dada en el mismo formato que la superficie y por tanto necesitamos usar la función SDL_MapRGB (la cuál pasa el formato de la superficie), para convertir los componentes de color RGB. Si estamos usando color de 8 bits (p.e. una superficie paletizada), entonces esta función buscará el resultado más cercano a los valores dados de RGB en su tabla. Especificando después la clave de color para la superficie, cada transferencia de bloque para esta superficie ignorará todos los pixels de ese color, tratándolos como transparentes. Desde luego que puede cambiar la clave de color en cualquier punto durante su aplicación o desviarla completamente con:

DESARROLLO

Perdiendo el Juego Para ahorrar espacio en la revista, las variables usadas en los recortes del código normalmente son abreviaturas del código fuente actual. Por ejemplo, notará que la variable global theGame no está presente en la mayoría de los listados que ofrecemos.

SDL_SetColorKey(pGeneralTileGfxU , 0, 0);

Esto posibilita reemplazar la clave de color para gráficos concretos (o incluso para regiones de ladrillos especificas) en el juego sin tener que crear una superficie separada. Desafortunadamente, SDL no facilita una forma fácil de retomar la clave de color actual, pero puede alcanzarla directamente en la estructura de la superficie para conseguirla como en el Listado 3. El valor old_colour_key mantiene el color en un formato que la superficie pueda entender y así no necesita la función SDL_MapRGB cuando re-apliquemos la clave a la superficie.

Made in Japan Además de hacer un solo color transparente, a veces queremos hacer transparente la superficie completa. No totalmente, pero si parcialmente. Esto dará a la imagen una apariencia fantasmagórica, de tal manera que podamos ver al personaje y al escenario detrás de él. Para hacer esto necesitamos aplicar un canal alpha. Los efectos especiales hacen un uso exhaustivo de canales alpha; explosiones, humo y lluvia usan

Listado 2: Bucle 01 int iNumTileHeight = 20, iNumTileHeight = 15; 02 /* rellenar una pantalla de 640x480 */ 03 int iTileWidth = 32, iTileHeight = 32; 04 for(ty=0; ty<iNumTileHeight; ty++) 05 for(tx=0; tx<iNumTileWidth; tx++) 06 exDrawTile(pTileSurface, map_data[tx + ty * iNumTileWidth],U 07 tx*iTileWidth ty*iTileHeight);

www.linuxmagazine.com.es

Número 02

33


DESARROLLO

SDL

embargo, excede nuestro propósito actual.

Ahora Todos Juntos Ahora estamos listos para combinar las tres partes de nuestra pantalla de juego (telón de fondo, nivel de ladrillos y objetos dinámicos). Esto se puede hacer de un par de maneras. La más obvia, podemos dibujar cada una de las partes por turnos, como en el listado 5. No obstante, para mejorar la velocidad del juego, pondremos una condición adicional: El primer ladrillo (región 0) nunca será renderizado en el área de juego. Nunca. Esto es porque la mayor parte de este área está, de hecho, vacía. Se perdería un montón de tiempo de proceso de la CPU si la mayor parte del código de renderizado involucrado dibujara bloques completamente

Listado 3: Rescate de la clave de color

Figura 3: Apilado de las superficies.

varias texturas sobrepuestas, cada una con su propio componente alpha. Usaremos alpha para un propósito mucho más simple: desdibujar al jugador al comienzo del juego, para indicar que es imbatible. El componente alpha de una superficie se mantiene

Claridad de Color Si la superficie a la que se ha aplicado la clave de color ha sido creada con SDL_LoadBMP, usará color de 24 bits. Esto significa que el componente verde tiene 8 bits de resolución, 254 y 255 deben ser colores diferentes y no hay problema. Por otra parte si la superficie solo tiene color de 16 bits, entonces es probable que el verde solo ocupe 5 o 6 bits. Esta perdida de precisión significa que 254 y 255 son el mismo color puesto que ambos se representan internamente como 31 (255>>3 == 254>>3). Para estar absolutamente seguro hemos de verificar el formato de la superficie manualmente. Lamentablemente esta prueba sucede durante el juego, pero nuestros gráficos son creados fuera del juego donde esta información no está disponible. En realidad, no importa, siempre y cuando el componente verde de los colores reales no exceda 247 (suponiendo una precisión de 5 bits) estaremos sobre terreno seguro.

34

Número 02

como un simple valor de 8 bits, que el rango de SDL_ALPHA_TRANSPARENT (0) a SDL_ALPHA_OPAQUE (255). Por tanto cualquier valor entre estos dos es valido, aunque internamente 128 se trata como un caso especial y por eso se procesa más rápidamente. Es posible utilizar las claves de color y las superficies alpha al mismo tiempo. Como con la clave de color, SDL no proporciona una forma de recuperar el valor alfa de una superficie sin referirse a la variable directamente, como en el Listado 4. También es posible especificar una cantidad distinta de alpha para cada pixel individual, lo cual nos permitirá crear un borde mucho mas brumoso alrededor del personaje. De todos modos, esto es muy lioso, ya que la mayoría de los formatos de fichero no incluyen esta información. El formato XCF de GIMP lo hace, pero actualmente no hay muchas librerías que apoyen este formato. En vez de eso, tenemos que cargar dos imágenes, una contiene la información alpha y otra contiene la información gráfica (intensidad) y unificarlas manualmente mediante la lectura de los pixeles específicos de la superficie alpha y combinándolos con la superficie de intensidad. Esto, sin

www.linuxmagazine.com.es

01 Uint32 old_colour_key; 02 old_colour_key = pGeneralTileGfx->format->color key; 03 SDL_SetColorKey(pGeneralTileGf x, 04 SDL_SRCCOLORKEY, 05 SDL_MapRGB(pGeneralTileGfx->fo rmat, 0, 255, 0)); 06 exDrawTile(pGeneralTileGfx, 12, xpos, ypos); 07 SDL_SetColorKey(pGeneralTileGf x, 08 SDL_SRCCOLORKEY, 09 old_colour_key);

Listado 4: Rescate del valor alpha 01 Uint8 old_alpha; 02 old_alpha = pPlayerGfx->format->alpha; 03 SDL_SetAlpha(pPlayerGfx, SDL_SRCALPHA, iAmountOfAlpha); 04 exDrawTile(pPlayerGfx, iFrame, xpos, ypos); 05 SDL_SetAlpha(pPlayerGfx, SDL_SRCALPHA, old_alpha);


SDL

Figura 4: Completando la imagen del juego.

transparentes en la pantalla y, en los juegos, siempre nos alegramos de descubrir optimizaciones de velocidad. La manera mas rápida para dibujar algo es no dibujarlo en absoluto, así que sacrificaremos esta minúscula cantidad de memoria al gran dios de la velocidad. Podemos mejorar la velocidad más aun mediante la combinación del telón de fondo y los ladrillos en una única función de renderizado. Esto se puede hacer muy fácilmente diciendo que si queremos dibujar el primer ladrillo (el único completamente transparente), copiamos realmente (p. e.: transferir un bloque) una porción del telón de fondo sobre la pantalla. Por otra parte, dibujaremos un ladrillo en vez del telón de fondo. De este modo, en una pantalla con 300 ladrillos (20x15) dibujaremos 300 ladrillos con datos validos. Mientras que, en la propuesta original, habríamos dibujado 600. La cuestión de “es más rápido dibujar un ladrillo grande (el telón de fondo) qué varios pequeños” se la dejaré a las pruebas de rendimiento. Hay muchas variables a considerar en este tipo de optimización y la única forma de saber que método se ejecutará más rápido es probar ambos. Durante el desarrollo encontré que la solución “varios pequeños” usaba menos tiempo de proceso (alrededor del 8% , según top) y por eso la adopte. Usando esta idea, ahora podremos escribir una rutina especial para dibujar un ladrillo plano, que debería (o no debería) copiar la superficie del telón de fondo en lugar de un ladrillo (Véase el Listado 6).

Si hay ladrillos que impliquen transparencias también necesitaremos copiar el telón de fondo antes de dibujarlos. Determinar que ladrillos específicos tienen pixeles transparentes no es difícil, pero es lento. Así que podemos comprobar cualquiera de ellos cuando comienza el juego, o indicarle al artista que solo los ladrillos con 8 o superior (por ejemplo) pueden tener transparencias. Elegiremos la segunda opción.

Borrando y rebobinando Ahora somos capaces de dibujar la pantalla una vez; necesitamos ser capaces de dibujarla varias veces. Lo cual nos permitirá animar algunos enemigos moviéndose en la parte superior. El código para esto es muy fácil, pero ha de estar hecho correctamente o tendremos desagradables chismes en la pantalla, o una carga innecesaria para la CPU (Véase el Listado 7). Por “dinámica” realmente queremos decir dos cosas:

Listado 6: Dibujado de un ladrillo plano 01 void exDrawLevelTile(int tx, int ty) 02 { 03 SDL_Rect src; 04 int iRegion; 05 iRegion = exGetTileRegion(tx, ty); 06 src.x = tx * iTileWidth; 07 src.y = ty * iTileHeight; 08 src.w = iTileWidth; 09 src.h = iTileHeight; 10 if (iRegion == 0 && pBackdrop) 11 SDL_BlitSurface(pBackdrop, &src, pScreen, &src); 12 if (iRegion) 13 exDrawTile(pGeneralTileGfx, iRegion, src.x,U 14 src.y); 15 }

DESARROLLO

• •

Objetos que se mueven Objetos que permanecen quietos, pero animados Componer la pantalla implica eliminar cada objeto dinámico de ella, así que nos hemos quedado con el fondo estático otra vez. Esto se puede hacer de una cuantas formas distintas. Primeramente, podríamos interrogar a cada objeto dinámico para recordar a que se parecía la pantalla antes de haberla dibujado y entonces redibujar ese bloque cuando solicitemos una reposición. A pesar de ser aceptable, esto implica un montón de trabajo en la parte de cada objeto y no estamos considerando que dos (o más) objetos puedan superponerse. Aun así, éste puede ser seguramente el método más eficiente de reposición. Además podríamos llamar a exDrawStatic otra vez. Esto podría funcionar, pero será muy lento. Sin embargo, si la imagen del telón de fondo alguna vez estuvo animada necesitaríamos implementar esta solución.

Listado 5: Dibujando la pantalla del juego 01 02 03 04 05 06

void exDrawStatic(void) { int tx, ty; int obj; /* Telon de fondo */ SDL_BlitSurface(pBackdrop, NULL, pScreen, NULL); 07 /* Ladrillos */ 08 for(ty=0;ty<iNumTileHeight;ty+ +) 09 for(tx=0;tx<iNumTileWidth;tx++ ) 10 exDrawTile(pGeneralTileGfx, map_data[tx + ty * 11 iNumTileWidth], tx, ty); 12 /* Objetos dinámicos- por ejemplo, enemigos */ 13 for(obj=0;obj<iNumEnemies;obj+ +) 14 exDrawTile(pEnemyTileGfx, Enemy[obj].Graphic, 15 Enemy[obj].xpos, Enemy[obj].ypos); 16 }

www.linuxmagazine.com.es

Número 02

35


DESARROLLO

SDL

Doble Búfer Bajo X11, podemos conseguir gráficos suaves porque nunca escribimos directamente en la pantalla: escribimos en un búfer separado y SDL transfiere los bloques a la pantalla. Sin embargo algunos controladores escriben directamente en la pantalla. Si estamos usando uno de estos controladores y no puede dibujarlo todo lo bastante rápido, lo vera “deshilachado”. Esto ocurre porque se puede ver la mitad del ultimo cuadro y la mitad del cuadro actual, al mismo tiempo. En esas situaciones puede emplear un doble búfer. Esta técnica conlleva dos búferes de pantalla , uno que dibuja sobre el monitor y otro que dibuja nuestro juego internamente. Esto significa que nunca se escribirá el mismo cuadro que está siendo mostrado. Emplear doble búfer en SDL es muy fácil. Primero necesitamos ajustar el modo de vídeo: pScreen = SDL_SetVideoMode(U iWidth, iHeight, 16, U SDL_HWSURFACE | SDL_DOUBLEBUF); Esto añade dos búferes a la superficie de la pantalla, un búfer frontal y un búfer trasero. Podemos escribir en esta superficie como normal con la función SDL_BlitSurface y SDL solo escribirá dentro de un búfer: en el trasero. Entonces, en lugar de actualizar la pantalla con UpdateRect, intercambiamos los búferes de pantalla usando: SDL_Flip(pScreen); Esto realizará una copia de la nueva imagen desde el búfer trasero al búfer delantero y estaremos listos para escribir el siguiente cuadro. Es el búfer delantero el que entonces se muestra en la pantalla.

La tercera opción es hacer uso de la función exDrawLevelTile y redibujar el ladrillo por debajo de cada objeto dinámico usando código existente. Esto es un punto intermedio entre ambas opciones razonable. tile_x = Enemy[obj].xpos /U iTileWidth; tile_y = Enemy[obj].ypos /U iTileHeight; exDrawLevelTile(tile_x, tile_y);

Si los enemigos se extienden sobre dos a más ladrillos, entonces cada uno de esos ladrillo necesitará ser redibujado. Detectar esto es bastante fácil puesto que nos hemos cerciorado de que cada ladrillo del juego

36

Número 02

tiene el mismo tamaño: 32x32. Así que si la posición del enemigo no está en el límite de los 32 pixels (p.e. 0, 32, 64, 96, 128, etc), debe superponerse por lo menos a más de un ladrillo. Podemos ampliar el código anterior para incluirlo en el Listado 8. Para eso necesitamos un reciclador C, el símbolo de porcentaje (%) es el operador del modulo y devuelve el resto del calculo (en nuestro caso xpos/Ancho). Así que si aparece un resto es que estamos solapando el ladrillo vecino. Desde aquí podemos dibujar y actualizar la pantalla completa. También podemos llamarla repetidamente en un bucle para mover los enemigos alrededor de la pantalla.

Capta el mensaje SDL utiliza un paradigma conocido como programación orientada a eventos. Esto funciona de la misma manera que lo hace X Window, Microsoft Windows y la mayoría de la programación para entornos gráficos de usuario (GUI para los amigos). También está algo relacionado con la programación de redes. En una aplicación “tradicional” para consolas, el programa comienza, hace algo y termina. Un software altamente interactivo no pueden trabajar de este modo, por culpa de la etapa “esperar una entrada(input)”. Mientras esperamos una entrada, no puede suceder nada y si ocurre algún tipo de entrada que no es la que esperamos (como una entrada de ratón, mientras esperamos una pulsación del teclado) seremos incapaces de procesarla. Además, la rutina de entrada está diciendo que está “bloqueada”, lo cual impide que el resto de la acción (como las actualizaciones de pantalla o las animaciones) ocurra hasta que se reciba la entrada esperada. Los juegos basados en turno, como el ajedrez, funcionan bien con el bloqueo de entrada, pero los juegos de acción como el nuestro no lo hacen, así que tendremos que usar el paradigma de programación orientado a eventos. Con la programación orientada a eventos, en lugar de preguntar, cuando queremos, a Linux por una entrada específica, nuestro programa se pone en un bucle y continuamente pregunta “hay alguna entrada, hay alguna entrada”. Entonces, cuando llega la entrada (que puede ser de cualquier tipo), la procesaremos y continuaremos con nuestro

www.linuxmagazine.com.es

Listado 7: Dibujado de la pantalla 01 02 03 04 05 06

07 08

exDrawStatic(); while(TheGame.bIsRunning) { exRepairScreen(); /* Quitar todos los objetos dinámicos */ exUpdateLevel(); /* Actualizar los objetos dinámicos */ exDrawDynamic(); /* Dibujar los objetos dinámicos que regresan a la pantalla */ SDL_Update(pScreen, 0,0,0,0); }

bucle. Preguntando de nuevo “hay alguna entrada, hay alguna entrada”. Este proceso también es conocido como encuesta (polling). Fijémonos que se llama “orientada a eventos” y no “orientada a entrada” porque Linux puede decirnos varias cosas (como que la ventana se ha redimensionado o se ha cerrado) y no solamente que el teclado o el ratón envían una entrada de datos. Bajo SDL nos da eventos cuando: • Hay señal de entrada desde el teclado, el ratón o la palanca de juegos • Nuestra ventana se activa o se desactiva • Nuestra ventana se redimensiona (solo ocurre si se llama a SetVideoMode desde SDL_VIDEORESIZE) • Nuestra ventana se cierra, en

Listado 8: Detectado de los límites del ladrillo 01 if (Enemy[obj].xpos % iTileWidth) 02 exDrawLevelTile(tile_x+1, tile_y); 03 if (Enemy[obj].ypos % iTileHeight) 04 exDrawLevelTile(tile_x, tile_y+1); 05 if ((Enemy[obj].xpos % iTileWidth) && (Enemy[obj].ypos % iTileHeight)) 06 exDrawLevelTile(tile_x+1, tile_y+1);


SDL

Listado 9: Un manejador de eventos bastante simpático para Explorer Dug 01 02 03 04 05

06 07 08 09

SDL_Event ev; while(SDL_PollEvent(&ev) >= 0) { /* ev.type representa el tipo de mensaje que recibimos */ /* Maneja el mensaje y continua la encuesta para más eventos */ if (ev.type == SDL_QUIT) /* Debemos manejar esto */ break; /* Otros manejadores de mensajes van aquí */ }

cuyo caso debemos salir del bucle de eventos y cerrar el programa • Nuestra ventana necesita redibujarse (en ese caso debemos llamar a SDL_UpdateRect) Estos eventos son puestos en una cola internamente y nos los dan cuando preguntamos por ellos, uno por uno con la función SDL_PollEvent. Este bucle funciona muy mal ¿Por qué? Porque no hay noción del tiempo. Primero, con un lazo tan apretujado, Linux tiene muy poco tiempo para procesar algo. Es el equivalente moderno del ¡10 GOTO 10! Este problema se puede resolver fácilmente introduciendo un corto retraso con la función SDL_Delay que vimos el mes anterior. Esperando un milisegundo cada vez que ejecutamos el bucle no significa mucho para nuestro juego (seguimos sintiendo que el teclado y el ratón responden), pero para el Sistema Operativo será la diferencia entre trabajar bien y detenerse completamente. El segundo problema con el tiempo es que el juego se ejecutara tan rápido como pueda. De una forma bastante divertida, pero eso no es lo que queremos. Los juegos deben funcionar tan rápido como sea posible, pero no al máximo. Si nuestro monitor refresca su pantalla 70 veces en un segundo, entonces tendremos 70 imágenes diferentes cada segundo. Si nuestro monitor refresca a 85 Hz tendremos 85 imá-

genes. Este es un limite natural provocado porque la función SDL_UpdateRect espera hasta el siguiente ciclo de redibujado del monitor antes de permitir que nuestro juego continúe. Para hacer esta temporización uniforme tenemos que manejarla nosotros mismos introduciendo bloqueos de cuadro, donde el ritmo de presentación de cuadros se tapona hasta pararlo si exceder un valor específico. Los juegos comerciales de 3D (como Unreal) siempre marcan 60 marcos por segundo, ya que esto está bastante cerca del índice de refresco de una televisión o de un monitor y hace que el juego parezca que va fino. 60 cuadros por segundo (fps) significa que debemos terminar el proceso de cada cuadro en menos de 16,666 milisegundos. Desde luego que se puede conseguir, si bloqueamos nuestro juego a 60 fps. Si conseguimos producir el cuadro actual más aprisa que esto, esperaremos un rato (otra vez, con la función de SDL_Delay) hasta que han expirado nuestros 16,666 milisegundos, si no continuaremos con el cuadro siguiente. Sin embargo, cada vez que completemos un ciclo de nuestro bucle esperaremos siempre 1 ms, lo mínimo para cerciorarnos de que el procesador, y otros aplicaciones (tales como los demonios del servidor) consiguen un momento de respiro. Podemos medir tiempo con la función SDL_GetTicks. Ésta devuelve el número de milisegundos desde que el programa fue iniciado y puede ser colocada en cualquier parte del código de actualización del dibujo para averiguar cuánto tiempo tomó el cuadro anterior. Esto debe estar en torno a algunos milisegundos. El resultado de SDL_GetTicks se almacena en un Uint32 lo que significa que el contador de tiempo se reiniciará después de alrededor de 4 mil millones de milisegundos o, en otras palabras, 49 días. En nuestro juego, esto solamente sucederá si usted juega 49 días seguidos. Esto es inverosímil, y los efectos secundarios (negativos) serán probablemente mínimos. Pero en los juegos en línea con acceso masivo de multijugadores tales como Ultima Online, esta acontecimiento es la norma, no la excepción. Así que si está utilizando

DESARROLLO

Listado 10: Un manejador de eventos aun más simpático para Explorer Dug 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

SDL_Event ev; Uint32 prev_time, curr_time; Uint32 period, delta_time; period = 1000/60; /* 16 millisegudos entre cuadros */ TheGame.bIsRunning = TRUE; prev_time = SDL_GetTicks(); while(SDL_PollEvent(&ev) >= 0 && TheGame.bIsRunning) { exUpdateInterface(&ev); /* procesado de eventos del teclado/palanca etc */ do { curr_time = SDL_GetTicks(); /* Comprobar si han pasado 49 días */ if (curr_time > prev_time) delta_time = curr_time-prev_time; else delta_time = 0xffffffff (prev_time-curr_time) + 1; SDL_Delay(1); } while(SDL_PollEvent(&ev) >= 0 && delta_time < period); prev_time = curr_time; if (ev.type == SDL_QUIT) break; exRepairScreen(); exUpdateLevel(); exDrawDynamic();

SDL_UpdateRect(TheGame.pScreen , 0,0,0,0); 27 }

esta función ya está advertido sobre el tema y de los pasos convenientes para evitar el problema, como hacemos en el Listado 10. Ahora tenemos un lazo de evento en su sitio, y estamos listos para procesar cualquier evento que recibamos, sea del ratón, el teclado o, incluso, de una palanca de juegos. Pero por lo que se refiere a abarcar completamente esos acontecimientos, y lo más importante, cómo los utilizaremos para controlar nuestro juego, tendremos que esperar ■ hasta el mes próximo…

www.linuxmagazine.com.es

Número 02

37


DESARROLLO

Curses

Interfaces de Texto con curses

Dialogando se Entiende la Gente El otro día estuve en un taller mecánico de esos que tanto me gusta poner como ejemplo (sí, los frenos de mi coche ya funcionan de nuevo, gracias por preguntar) y tuve ocasión de comprobar por enésima vez lo que ya mencioné en esta misma sección hace un mes: ahí los tenías, dos ordenadores Pentium de trigésima generación, corriendo Ventanuflas eXPlosión, chupando miles de megas de RAM, requiriendo tarjetas gráficas de última generación y discos duros del tamaño del desierto de los Monegros y todo ¿para qué? Para que el personal de administración corriese un programa de facturación en modo texto. POR PAUL C. BROWN

¡

Que desperdicio! O tal vez no. Creo que cada vez hay más gente aparte de mi que piensan que para lo único que sirve un Windons es para jugar, ver DVDs y correr programas en modo texto. Es la única manera de estar seguros de que no se cuelgue o se comprometa el sistema con algún fallo de seguridad. A mi entender, comprar un superordenador, más potente que los que se

38

Número 02

utilizaron para poner a los primeros hombres en la Luna, y pagarle una licencia a Microsoft para eso, es una burrada. Ya puestos, sirve una instalación de Linux (o BSD) en modo texto, sobre cualquier trasto viejo rescatado del desván y un buen programa en curses, que con un poco de trabajo, se puede hacer de todo. Precisamente, el ejercicio de este mes consiste en demostrar lo sencillo que es crear botones en una aplicación de consola. Envolveremos todo en clases C++ y nos basaremos en la aplicación que ya iniciamos el mes pasado. El ejemplo que implementaremos es una ventana de

www.linuxmagazine.com.es

diálogo con tres botones: “Aceptar”, “Cancelar”, “Abortar”. El usuario ha de ser capaz de navegar por los botones (utilizando, por ejemplo, las teclas cursor derecha y cursor izquierda) y seleccionar uno de los botones con, por ejemplo, Enter. Al pulsar esta última tecla, el diálogo se ha de cerrar y la aplicación ha de poder recuperar el valor del botón pulsado para así actuar en consecuencia. Si os descargáis el fichero curses.tar.gz que encontraréis en http:// www.linuxmagazine.com.es/Magazine/ Downloads/02 y lo compiláis (se incluye un Makefile para simplificar este paso), descubriréis que el programa de ejemplo


Curses

funciona como se ha descrito en el párrafo anterior. Una vez con la aplicación corriendo, si pulsamos en F1 se abre una ventana de diálogo con los tres botones descritos. Podemos movernos de izquierda a derecha o de derecha a izquierda con las teclas de cursor, y se irán iluminando cada uno de los botones (ver Figura 1). Cuando pulsamos Enter el diálogo se cierra y la aplicación recoge el valor e imprime el nombre del botón pulsado (ver Figura 2). Para salir de la aplicación y volver a la línea de comandos, pulsaremos Esc.

Aplicación Lo primero es echarle un vistazo a la función main(). Como podemos observar en el Listado 1, sigue siendo minimal. Aunque hacemos una llamada a un nuevo método (dialwin()) en el bucle principal de la función, que es precisamente la que se encargará de poner un cuadro de diálogo en la pantalla. Como en la vasta mayoría de los casos, el número de botones que contiene un

Listado 1: principal.cpp 01 #include "application.h" 02 03 int main() 04 { 05 int ch, cDialogos=1; 06 int counter=0; 07 application my_App(TRUE,"Mi Aplicación número %i",1); 08 09 while((ch=my_App.wGetch())!=27 ) 10 { 11 my_App.wWrite(1,2,"Vuelta nº: %i",counter++); 12 if(ch==KEY_F(1)) 13 { 14 my_App.dialWin(50,10,"Esto se supone un Diálogo.","Diálogo %i",cDialogos++); 15 } 16 17 } 18 19 my_App.~application(); 20 exit(0); 21 }

diálogo son dos, Aceptar y Cancelar (aunque nuestro ejemplo contenga tres), en aras de la simplicidad y para mantener el código simple, no implementamos ningún método en la clase application (ver Listado 2) que sirva para personalizar los botones (esto veremos como se hace en futuras entregas de esta serie). Y ya que hablamos de application, veamos como ha cambiado desde el mes pasado. Como podemos ver en el Listado 2, es igualmente muy sencillo y minimal. Primero tenemos un nuevo tipo de dato, el tipo button, del que después hablaremos, y con él creamos un vector que almacena los datos de los tres botones, Aceptar, Cancelar y Abortar, que vamos a mostrar. Para aquellos no familiarizados con la clase vector, os diré que es una adición muy útil al arsenal de clases de C++. Para utilizarlo, hay que incluir el fichero de cabecera vector (con #include <vector>). Básicamente, un vector en C++ es un array que puede admitir cualquier tipo de dato, primitivo o no, e implementa una serie de útiles métodos para añadir nuevos elementos, devolver elementos de una posición determinada (con el método at(índice), del que después veremos un ejemplo) o para calcular su tamaño tanto en bytes, como en número de elementos. Para llenar el vector utilizamos el método push_back() asociado a la clase vector que lo que hace es añadir un elemento a la cola del vector. El siguiente paso consiste en crear un objeto window (en este caso lo llamamos dial_box) y, como tenemos sobrecargado el constructor de la clase window (después lo veremos), al pasarle como parámetro el vector de botones, entre otros, se invoca al constructor que crea una ventana de diálogo. Básicamente eso es todo, puesto que, una vez llamada, el control se pasa a la ventana de diálogo, que implementa su propio bucle y que no cede el control de vuelta a application hasta que se seleccione uno de los botones y se pulse Enter. Cuando esto sucede, application puede consultar el botón activo en el momento de cerrar la ventana de diálogo recogiendo el valor devuelto por el método closeWindow(). El valor devuelto por closeWindow() es un número, que en esto caso puede ser o 0 (Aceptar), o 1 (Cancelar), o 2 (Abortar). En nuestro

DESARROLLO

ejemplo, el método dialWin() se limita a imprimir la etiqueta del botón para efectos de depurado.

Ventana Pasemos ahora a los métodos de la clase window, que son los que hacen la mayor parte del trabajo sucio. Podemos ver un fragmento del archivo window.cpp en el Listado 3. Lo primero que destaca es el constructor que implementa las ventanas de diálogo. Tenemos un atributo,

Listado 1: El método dialwin() en application.cpp 01 void application::dialWin(int dial_Width, int dial_Height, string dial_Text, string dial_Title="Untitled",...) 02 { 03 button the_Button(1,dial_Height-4,"Ac eptar"); 04 vector<button> dial_Buttons; 05 dial_Buttons.push_back(the_But ton); 06 the_Button=button(11,dial_Heig ht-4,"Cancelar"); 07 dial_Buttons.push_back(the_But ton); 08 the_Button=button(22,dial_Heig ht-4,"Abortar"); 09 dial_Buttons.push_back(the_But ton); 10 11 makeString(dial_Title); 12 window dial_Box(dial_Width, dial_Height, dial_Text, dial_Buttons, 0, dial_Title); 13 14 int button_Pressed=dial_Box.closeW indow(); 15 16 app_Window.wWrite(2,2,dial_But tons.at(button_Pressed).getTag ()); 17 }

www.linuxmagazine.com.es

Número 02

39


Curses

DESARROLLO

Listado 2: Los métodos relevantes de window en window.cpp 001 002 003 004 005 006 007

008 009 010 011 012 013 014 015 016 017

#include "window.h" . . . window::window(int wide,int high,string content,vector<button> buttons,int button_Num=0, string win_Name="Untitled"...) { w_Buttons=buttons; borders_Inactive.push_back(ACS_ULCORNER); borders_Inactive.push_back(ACS_URCORNER); borders_Inactive.push_back(ACS_LLCORNER); borders_Inactive.push_back(ACS_LRCORNER); borders_Inactive.push_back(ACS_HLINE); borders_Inactive.push_back(ACS_VLINE);

borders_Active.push_back(ACS_ULCORNER|A_STANDOUT ); 018 borders_Active.push_back(ACS_URCORNER|A_STANDOUT ); 019 borders_Active.push_back(ACS_LLCORNER|A_STANDOUT ); 020 borders_Active.push_back(ACS_LRCORNER|A_STANDOUT ); 021 borders_Active.push_back(ACS_HLINE|A_STANDOUT); 022 borders_Active.push_back(ACS_VLINE|A_STANDOUT); 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043

40

active_Button=button_Num; if(wide>COLS || high>LINES) { makeDialogue(20,10,"Dialogue too big","Error"); closeWindow(); } makeString(win_Name); makeDialogue(wide,high,content,win_Name); }

int window::closeWindow() { del_panel(p_Handle); delwin(w_Handle); refresh(); return (active_Button); } .

Número 02

www.linuxmagazine.com.es

044 . 045 . 046 047 void window::makeDialogue(int wide,int high,string content,string win_Name) 048 { 049 int posX=(COLS/2)-(wide/2); 050 int posY=(LINES/2)-(high/2); 051 052 w_Handle=newwin(high,wide,posY,posX); 053 054 title=win_Name; 055 has_Frame=TRUE; 056 057 p_Handle=new_panel(w_Handle); 058 059 putTitle(); 060 wWrite(0,0,content); 061 062 activeButton(); 063 064 showPanels(); 065 dialLoop(); 066 } 067 068 void window::dialLoop() 069 { 070 int ch; 071 072 while((ch=getch())!=13) 073 { 074 switch (ch) 075 { 076 case KEY_LEFT: 077 if(active_Button==0) active_Button=w_Buttons.size(); 078 active_Button--; 079 activeButton(); 080 break; 081 case KEY_RIGHT: 082 active_Button++; 083 if(active_Button==w_Buttons.size()) active_Button=0; 084 activeButton(); 085 break; 086 } 087 //wWrite(0,1,"Botón %i",active_Button); 088 //wWrite(0,2,"Pulsado %i",ch); 089 } 090 } 091 092 . 093 . 094 . 095 096 void window::activeButton()


Curses

DESARROLLO

Listado 2: Los métodos relevantes de window en window.cpp (continuación) 097 { 098 for(unsigned int i=0;i<w_Buttons.size();i++) 099 { 100 drawButton(w_Buttons.at(i).getTag(),w_Buttons.at (i).getPx(), w_Buttons.at(i).getPy(),borders_Inactive); 101 } 102 drawButton(w_Buttons.at(active_Button).getTag(), w_Buttons.at(active_Button).getPx(), w_Buttons.at(active_Button).getPy(), borders_Active); 103 } 104 105 void window::drawButton(string label,int but_X, int but_Y, vector<chtype> borders) 106 { 107 //Primera fila del botón 108 mvwaddch(w_Handle,but_Y,but_X,borders.at(0)); 109 for(unsigned int i=0;i<label.length();i++) 110 { 111 mvwaddch(w_Handle,but_Y,but_X+1+i,borders.at(4)) ; 112 } 113 mvwaddch(w_Handle,but_Y,but_X+label.length()+1,b orders.at(1));

114 115 116

//Segunda fila del botón mvwaddch(w_Handle,but_Y+1,but_X,borders.at(5));

117 mvwprintw(w_Handle,but_Y+1,but_X+1,label.c_str() ); 118 mvwaddch(w_Handle,but_Y+1,but_X+label.length()+1 ,borders.at(5)); 119 120 121 122 123 124

//Tercera fila del botón mvwaddch(w_Handle,but_Y+2,but_X,borders.at(2)); for(unsigned int i=0;i<label.length();i++) {

mvwaddch(w_Handle,but_Y+2,but_X+1+i,borders.at(4 )); 125 } 126 mvwaddch(w_Handle,but_Y+2,but_X+label.length()+1 ,borders.at(3)); 127 128 wrefresh(w_Handle); 129 } 130 . 131 . 132 .

w_Buttons, que contiene el vector de qué botón esta activo. Seguidamente, el todos. Otra cosa es que, tal y como viene botones de la ventana de diálogo. A conconstructor comprueba el tamaño de la implementado, su comportamiento no es tinuación, los atributos borders_Inactive ventana de diálogo, y si es demasiado del todo funcional, exigiendo que el y borders_Active guardan el usuario pulse dos veces Enter estilo de los bordes del botón en para volver a la ventana prinmodo inactivo (botón no seleccipal de la aplicación. Pero, cionado) y modo activo (botón como el motivo de su presenseleccionado), respectivamente. cia es meramente a efectos de Yo he escogido mostrar los bordepurado (nunca nos va a des normales en el primer caso y interesar que un usuario vea en vídeo inverso en el segundo. esta ventana de error), así se El efecto se puede apreciar en la queda, como doble recordatoFigura 1 donde se ve el botón rio de lo malos que son los central seleccionado. La librería bugs en versiones de produccurses implementa una serie de ción de un programa. Después seudo-caracteres para dibujar de este constructor un tanto líneas y bordes, y estos son los especial, tenemos el método que utilizo aquí para crear el closeWindow(), que el mes canto de los botones. Por ejem- Figura 1: Se puede navegar por los botones utilizando las teclas de cursor. pasado se limitaba a cerrar la plo, ACS_ULCORNER es un ventana y este mes, además, carácter que se utiliza en la esquina grande, imprime un error. Este diálogo devuelve un valor: el número del botón superior izquierda (UL = Upper, Left) de de error mostrará los botones que hemos pulsado. El método makeDialogue() es un cuadro y ACS_HLINE es una línea descrito para la ventana de diálogo que el que se encarga de colocar la ventana horizontal. El atributo active_Button pretendíamos crear, por tanto, puede ser del diálogo en la pantalla. Lo primero contiene el valor que le dice a la clase demasiado pequeño para mostrarlos que hace es calcular un posición más o

www.linuxmagazine.com.es

Número 02

41


DESARROLLO

Curses

Figura 2: La aplicación

Listado 4: La clase button en button.cpp

muestra el nombre del botón pulsado.

01 #include "button.h" 02 03 button::button(int pos_X=0,int pos_Y=0,string label="Aceptar") 04 { 05 px=pos_X; py=pos_Y; 06 tag=label; 07 button_Length=tag.length()+2; 08 } 09 10 button::~button() 11 { 12 13 }

42

Número 02

Figura 3: El diálogo de error por exceso de tamaño.

tor, size(). Después, utilizamos i para poder referirnos a cada uno de los elementos del vector de botones con el método at(), explicado más arriba. A continuación, volvemos a utilizar at() para dibujar un borde activo alrededor del botón activo, utilizando como índice active_Button. Y llegamos al método del que todos estaban hablando: drawButton(). Este método parece complejo, pero en realidad es una tontería. Un botón normalmente constará de tres filas de caracteres ¿vale? El borde superior, la parte central con el texto de la etiqueta y el borde inferior.drawButton se limita a dibujar cada una de esas filas con el borde con el atributo (activo o inactivo) correspondiente.

Botón Lo difícil se ha acabado, pero nos queda una pequeña clase antes de poder dar carpetazo al artículo. En el Listado 4 podéis ver la sencillísima clase button que almacena en su interior la información necesaria (la posición del botón y la etiqueta a mostrar) para que podamos dibujar cada uno de los botones. ¿Que de tan sencilla que es esta clase podría haber sido una estructura? Pues sí, pero preferí hacerlo clase, no fuera que más adelante se me ocurriera funcionalidades

www.linuxmagazine.com.es

extra. Por ejemplo, como alguno ya sabrá, es posible pasar una función C como parámetro de otra función. ¿No sería éste un mecanismo ideal para asociar una acción con un botón? Tal vez en otro capítulo.

Conclusión Hemos visto lo relativamente sencillo que es implementar botones en curses y como podemos hacer que afecten al resto del entorno. El siguiente paso iría dirigido a coger el valor devuelto por la ventana de diálogo, a través de un estructura switch... case, llevar a cabo las distintas acciones para cada caso. El mes que viene veremos como crear menús para nuestra aplicación y con ello habremos abordado ya la mayor parte de la implementación de interfaces con curses. Hasta entonces, disfrutad de la progra■ mación.

EL AUTOR

menos central para nuestro diálogo. A continuación crea la ventana curses que contendrá la ventana de diálogo, le coloca un título, un borde, y lo pone sobre un panel para poder apilarlo encima de otras ventanas. Después se invoca a activeButton(), que es el método encargado de dibujar (por medio del método drawButton()) cada uno de los botones, primero sin enfoque, y después redibuja el botón que tiene el enfoque con los bordes resaltados. A continuación, makeDialogue() muestra la ventana, actualizando la pantalla y llama a dialLoop(), el método que contiene el bucle del diálogo. Prosigamos con dialLoop, que es el siguiente en orden de aparición. Este método es un sencillo bucle que comprueba en cada pasada si se ha pulsado la tecla Enter para salir. Si no es así, mira si las teclas pulsadas son las de cursor izquierda (si es así, suma 1 al atributo active_Button) o cursor derecha (en tal caso resta 1 al atributo active_Button). A continuación, redibuja los botones, iluminando el botón activo. El redibujado de los botones lo realiza la función activeButton() que itera por el vector apagando todos los botones (dibujando el borde inactivo). El bucle utilizado es otro buen ejemplo de la flexibilidad de los vectores: la variable i inicialmente vale cero y va incrementándose hasta el límite del tamaño del vector, que podemos averiguar con el método de la clase vec-

Paul C. Brown lleva ya unos cuantos años escribiendo sobre tecnología e informática, especializándose en GNU/ Linux y tecnologías de Software Libre. En la actualidad comparte la dirección de Linux Magazine España y la escritura con la programación recreativa y la ardua tarea de enseñar Squeak a su hijo de cinco años.


Perl

DESARROLLO

Lógica cuántica en Perl y su efecto sobre el juego organizado

Casino Cuántico La superposición del mundo de la física cuántica estará pronto disponible en el núcleo de Perl 6, en las llamadas “yunciones”. En la actualidad, ya hay disponible un módulo. En el artículo de este mes le echaremos un vistazo a este revolucionario concepto haciendo uso de un script que juega al blackjack. POR MICHAEL SCHILLI

R

ecientemente estuve en una librería ojeando algunos títulos cuando encontré uno titulado “Winning Casino Play” [2], donde un jugador profesional explicaba como jugar en los casinos de Las Vegas y de Atlantic City con una alta probabilidad de ganar. El Blackjack era uno de los temas tratados por el autor en detalle, ya que es uno de los juegos, dentro del casino, que ofrece una de las mejores probabilidades de ganar.

19, 20, 21… ¡Me pasé! Decidí ponerlo en práctica antes de irme a probar suerte en el casino, así que me puse a escribir un script en Perl que simulara el juego. Las reglas son las siguientes: el juego lo juegan el jugador y el crupier. Se usan varias barajas de 52 cartas. Las cartas son extraídas de una en una del dispensador de cartas. El objetivo del juego es tener todas las cartas que sean posibles para conseguir una mano de 21. Pero cuidado: si te pasas de 21, automáticamente pierdes. Esto es conocido como “busted”. Las cartas del 2 al 10 tienen como valor el número indicado, y las figuras (la Jota, la Reina y el Rey) valen

10 puntos cada una. Un As puede valer 1 u 11.

¡Cuidado con la Superposición! ¿1 u 11? De acuerdo, si le sale un 7, un 8 y un As, 7 + 8 + 11 = 26, se pasa. Pero se puede quedar en el juego contando el As como un 1: 7 + 8 + 1 = 16. En otras palabras, es una mano que no tiene un valor fijo, sino dos estados solapados (26, 16), del que podemos quedarnos con el más favorable: 16. Imagínese que tiene cuatro Ases. Esto supondría 4 posibles estados (4, 14, 24, 34). Pero como 24 y 34 no son exactamente manos ganadoras, tan sólo estaremos interesados en dos de ellos: 4, la “mano suave” y 14 la “mano dura”. Los estados solapados son conocidos como superposiciones en física cuántica y permite a una partícula ocupar dos lugares al mismo tiempo. Después de instalar el módulo Quantum::Superpositions de Damian Conway (disponible en CPAN), se pueden crear una superposición de valores numéricos como los mostrados anteriormente, llamando a la función any():

use Quantum::Superpositions; my $count = any(4,14,24,34);

A partir de este punto, la variable $count parecerá tener cuatro valores diferentes. Una expresión lógica como la siguiente if($count == 4 and $count ==U 14){ print "¡Correcto!<\\>n"; }

devolverá verdadero y ejecutará el comando print. Además, comparaciones lógicas como $count <= 21 ya no serán más verdaderas o falsas en el contexto de Quantum::Superpositions, sino que devolverán una superposición de los estados que cumplan la condición. La sintaxis siguiente filtrará los estados que son irrelevantes mayores que 21, de los posibles resultados que dependen de como contemos el As (4, 14, 24, 34): $count = ($count <= 21);

Ahora $count contiene sólo any(4, 14). ¡Qué ahorra un montón de tecleo! Las operaciones aritméticas basadas en la superposiciones son bastante simples de

www.linuxmagazine.com.es

Número 02

43


DESARROLLO

Perl

formular ya que Quantum::Superpositions sobrecarga todos los operadores. Si el valor any(4, 14) está almacenado en $count, $count += 10;

devolverá como resultado any(14, 24). Así pues, any() especifica la llamada superposición disyuntiva que puede ser consultada para todos los estados y responderá correctamente a las consultas lógicas de cualquiera de sus estados que la cumpla. La segunda función presentada por Quantum::Superpositions es all(), que define una superposición conjuntiva que tiene todos los estados simultáneamente. La siguiente condición no es verdadera: my $count = all(4,14,24,34); if($count <= 21) { print "Todos válidos<\\>n"; }

al no tener todos los estados valores menores que 21. Por el contrario, all(4, 14) <= 21 devolvería verdad.

¿Está el Gato Muerto? Si un investigador comprueba la verdad de la física cuántica en el mundo real, los

estados múltiples colapsarían en un único estado, eliminando la ambigüedad: Esto significa que el gato de Schrödingers [3] debería estar muerto o vivito y coleando. Esto es diferente en Perl: se puede jugar con los estados ambiguos sin destruir el sistema. Para descubrir los estados que una superposición contiene, Quantum::Superpositions importa la función ownstates(), que simplemente devuelve una lista de estados: my @counts = ownstates($count);

Estas tres funciones any(), all() y ownstates() permiten al desarrollador escribir construcciones dentro del programa impresionantes. La siguiente sintaxis es lo único que se necesita para descubrir la “mano suave” para las cartas especificadas, o sea, el mínimo de any(4, 14, 24, 34): my $counts = any(4, 14, 24, 34); my $soft = ($counts <= allU (ownstates($counts));

la comparación lógica usa $counts para devolver una superposición de todos los estados que son menores o iguales que

todos los estados de la superposición. Esta es la definición clásica de mínimo.

La Clase Shoe en Perl La implementación: El listado Blackjack.pm (por motivos de espacio, este listado sólo está accesible a través de la web en [1]) contiene dos clases: Blackjack::Shoe, que representa el dispensador de cartas del que el repartidor extrae las cartas que van a ser jugadas, y Blackjack::Hand, que representa o bien la mano del jugador o del crupier. La clase Shoe usa el módulo CPAN Algorithm::GenerateSequence para generar unas cuantas barajas de cartas. El constructor new() acepta referencias a un array, cuyos elementos combina. Si el primer array contiene todos los palos (Corazones/Diamantes/Picas/Tréboles) y el segundo todos los valores (A 2 3 4 5 6 7 8 9 10 J Q K) del juego de cartas, el método as_list() devolverá una lista de combinaciones que coincidirán con las cartas: As de Corazones, 2 de Corazones, … Q de Trébol, K de Trébol. La lista creada es replicada por el operador x para reflejar el número de cartas que contendrá el dispensador (línea 29). El módulo Algorithm::Numerical::Shuffle exporta el método shuffle. Este

Listado 1: blackjack 01 01 #!/usr/bin/perl 02 ############################## 03 # Jugar al blackjack con crupier 04 # Mike Schilli, 2003 (m@perlmeister.com) 05 ############################## 06 use warnings; use strict; 07 use Blackjack; 08 use Term::ANSIColor 09 qw(:constants); 10 use Term::ReadKey; 11 $| = 1; my $total = 0; 12 my $shoe = Blackjack::Shoe->new(nof_decks => 4); 13 { 14 if($shoe->remaining() < 52) { 15 print "Shuffling ...\n"; 16 $shoe->reshuffle(); 17 } 18 my $player = Blackjack::Hand->new(shoe =>

44

Número 02

$shoe); 19 my $dealer = Blackjack::Hand->new(shoe => $shoe); 20 $dealer->draw(); 21 P(RED, "D", $dealer); 22 $dealer->draw(); 23 $player->draw(); 24 $player->draw(); 25 while(!$player->busted()) { 26 P(BLUE, "P", $player); 27 print 28 "([H]it/[S]tand/[Q]uit) "; 29 ReadMode 4; 30 my $move = ReadKey(0); 31 ReadMode 0; 32 print "\r"; 33 last if $move =~ /^s/i; 34 exit 0 if $move =~ /^q/i; 35 $player->draw(); 36 } 37 P(BLUE, "P", $player); 38 while(!$dealer->busted() and

www.linuxmagazine.com.es

39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

$dealer->count("soft") < 17) { P(RED, "D", $dealer); $dealer->draw(); } P(RED, "D", $dealer); $total += $player->score($dealer); print "Score: ", $player->score($dealer), ", Total: ", $total, "\n\n"; redo; } sub P { # Print status in color print(BOLD, $_[0], "$_[1]", "[", $_[2]->count_as_string(), "]", RESET, ": ", $_[2]->as_string(), "\n") }


Perl

Blackjack::Hand->new(shoe->U $shoe)

liga el dispensador del que se obtendrán las cartas con el jugador/repartidor. El método draw() añade una carta nueva a la mano.

Usando la superposición para contar la puntuación El método count() de la línea 64 y siguientes cuenta la puntuación de la mano y devuelve el resultado, como una superposición, una “mano dura” $hand->count("hard") o una “suave” $hand->count("soft") . Para permitir esto, el bucle for de la línea 68 y siguientes itera sobre las cartas, comprobando los valores y sumándolos. La variable $count almacena la superposición de las puntuaciones potenciales de la mano. Hace uso de la sobrecarga del operador + de Quantum::Superpositions, así que $counts += 10 añadirá 10 a todas las superposiciones de $counts. Cuando un As es extraído, el número de superposiciones es doblado, sumándole un uno a la mitad de ellos y 11 a la otra mitad. $counts = any($counts+1,U $counts+11);

La línea 79 elimina inmediatamente cualquier puntuación superior a 21 de las

superposiciones. Si una superposición no tiene valores después de esta operación, o sea, ownstates($counts) devuelve una lista vacia, significa que el jugador ha excedido la máxima puntuación de 21 y se ha pasado. El método count() de la línea 83 y siguientes descubre las manos “suaves” y “duras”, usando el truco visto anteriormente para encontrar los valores máximos y mínimos. La función int() convierte la superposición en un valor escalar.

valores de las teclas pulsadas, sin la necesidad de que el usuario tenga que pulsar la tecla Enter. Pasando a ReadMode 0 devuelve el terminal al modo Cooked, donde las entradas deben consistir en líneas completas, si el usuario pulsa Enter y ninguna otra tecla está pulsada provoca una reacción del programa. Cuando es el turno del usuario, la siguiente salida es mostrada en pantalla: [H]it/[S]tand/[Q]uit

Gana Blackjack Si la mano de un jugador contiene exactamente un As y una carta cuya puntuación es 10, ha conseguido un Blackjack, y gana a cualquier otra mano que sume 21. El método blackjack() definido en la línea 94 y siguientes comprueba si se da esta situación, chequeando si el valor de la mano corresponde a una superposición con los valores 11 y 21, y si la mano contiene exactamente dos cartas. El método score() averigua si la mano ha ganado o perdido contra el objeto Blackjack::Hand del crupier, que lo acepta como parámetro. Si el resultado es negativo, el jugador pierde. Si es positivo, gana. Echémosle ahora un vistazo a algunos casos especiales: El jugador de Blackjack paga 1:1.5, mientras que el repartidor sólo consigue ventajas frente a la apuesta del jugador. Si el jugador tiene más de 21, se ha pasado, y pierde incluso si el repartidor también excede después la puntuación de 21.

El jugador puede optar por Hit (extrae otra carta), Stand (se planta) y Quit (se sale del juego), pulsando las teclas H, S o Q. La Figura 1 muestra una jugada típica. El crupier empieza el juego sacando dos cartas, aunque tan solo una de ellas es mostrada boca arriba. Al jugador se le sirve dos cartas y se le pregunta si desea una carta nueva, para acumular puntos en su mano. Si opta por plantarse, el crupier seguirá un patrón fijo establecido para su propia mano. Si la puntuación total “suave” es menor que 17, tomará una carta nueva. 17 o más puntos, provocará que se plante, en ningún momento está influenciado por la mano del jugador y por ello el crupier tiene que pagar o recaudar. El juego Blackjack.pm puede ser utilizado libremente. Podemos añadir una GUI o escribir un servidor TCP/IP que juegue al Blackjack a través de la red. Disfrútalo bien y como se dice en Las ■ Vegas, “¡Qué tengas buena suerte!”.

Texto en Color y Entradas por Teclado

RECURSOS

El listado blackjack contiene un script que le permite jugar contra un repartidor computerizado al Blackjack, como en Las Vegas. Usa las clases definidas en Blackjack.pm para el dispensador de cartas, clase Shoe, y las manos del jugador y del repartidor, clase Hand. Text::ANSIColor se usa para proporcionar la salida coloreada; el módulo exporta constantes como BOLD, RED, BLUE o RESET, que está etiquetada como la secuencia de escape del terminal, basado en los valores de las constantes pasadas como :constants. Esto permite tener la salida en “negrita” o coloreada, o volver al modo normal. Text::ReadKey en modo Raw (iniciado por ReadMode 4) permite capturar los

[1] Listado de este artículo: http//www. linuxmagazine.com.es/descargas [2] Avery Cardoza,“Winning Casino Play”, Cardoza Publishing,3rd Ed.,2003,1-58042090-7 [3] Ilustración del experimento de Schrödinger con su gato: http://mist.npl. washington.edu/npl/int_rep/tiqm/ TI_fig_09.html

EL AUTOR

método baraja los elementos del array que se le pasa por el argumento, usando el método de Fisher-Yates. El método reshuffle() del objeto Blackjack::Shoe coloca las 52 cartas definidas en la variable de instancia nof_decks en el dispensador de cartas, shoe. remaining() devuelve el número de cartas que quedan en el dispensador; esto permite al repartidor comprobar que el juego puede ser completado con las cartas restantes. draw_card() extrae una carta del dispensador y devuelve una referencia a un array, cuyo primer elemento es el palo (Corazones/Diamantes/ Picas/Tréboles) y el segundo elemento es el valor de la carta (A, 2, 3,…, J, Q, K). La clase Blackjack::Hand representa la mano que está jugando un jugador. Trata con las cartas que se han sacado y sus valores. No importa si la mano pertenece al jugador o al repartidor. El constructor

DESARROLLO

Michael Schilli trabaja como ingeniero Web para AOL/Netscape en Mountain View, California. Escribió “Perl Power” para Addison-Wesley y puede ponerse en contacto con él en mschilli@perlmeister.com. Su página web es http://perlmeister.com.

www.linuxmagazine.com.es

Número 02

45


DESARROLLO

Pear

Uso de Componentes PHP

Formularios a Tope Al igual que otros lenguajes, PHP el lenguaje de guiones para la Web, está repleto de componentes prefabricados. En este artículo echaremos un vistazo a aplicaciones prácticas usando como ejemplo formularios de gestión. POR RICHARD SAMAR

L

os programadores, y sobre todo sus clientes, están siempre interesados en resultados rápidos. La necesidad de trabajar en proyectos en paralelo y unos plazos de cierre muy ajustados es particularmente duro para los desarrolladores web. Debido a esto los desarrolladores profesionales gastan más tiempo buscando como afrontar la tarea que tienen entre manos que escribiendo miles de funciones auxiliares. PHP [2] soporta esta filosofía en muchas áreas de desarrollo de aplicaciones, pero desgraciadamente esto no lo sabe todo el mundo. Y esto es algo que intentaré arreglar en este artículo. La idea tras Pear, la “PHP Extension and Aplication Repository” (Repositorio de aplicaciones y extensiones de PHP) surge en paralelo con la publicación de PHP 4 en 1.999. Muchos programadores vieron esto como una analogía con el CPAN de PERL. Pero donde CPAN ofrece más cantidad que

46

Número 02

calidad, los mantenedores de la librería de clases de PHP habían puesto el punto de mira en la calidad de su colección. En la fecha en que apareció PHP 4.3m, Pear dejó el estado de desarrollo beta y ahora es un componente esencial de cualquier distribución Linux que incluya PHP.

El navegador de paquetes muestra las categorías de aplicaciones. Cuando en PHP se habla de componentes, se está haciendo referencia a los paquetes. Estos están organizados, por

www.linuxmagazine.com.es

categorías de aplicación, en un árbol, con un nombre subrayado. El denominado navegador de paquetes [4] en la Web muestra esta estructura de árbol (véase la figura 1). En este artículo veremos las capacidades de Pear en la práctica, utilizando el paquete QuickForm como ejemplo. QuickForm facilita el uso de formularios, la principal interfaz para el usuario y de uso obligatorio en las aplicaciones Web. QuickForm ha sido asignado a la categoría HTML y así puede ser localizado bajo HTML_QuickForm. Tal y como hemos dicho con


Pear

anterioridad, se puede utilizar el navegador para determinar el ámbito de aplicación, la versión, el historial de cambios, obtener estadísticas y dependencias con otro paquetes.

Instalando PEAR y QuickForm Si PHP 4.3 o posterior está instalado en nuestro sistema, con casi toda seguridad que lo estará también Pear. En ese caso, no necesitaremos realizar los pasos de instalación. En el improbable caso de que PHP haya sido explícitamente configurado y compilado con la opción --without-pear, el administrador necesitará recompilarlo sin esta opción. Si su distribución aún usa una versión antigua, puede dar un rodeo, como alternativa a la actualización de PHP, para obtener el instalador de paquetes Pear, el cual es esencial para las tareas de configuración de paquetes. Para hacer esto, abra una conexión a Internet y teclee lo siguiente en una terminal:

lynx -source http://go-pear.orgU | php Esta linea descarga un guión PHP. En cuanto lo tengamos en nuestro disco duro, lo ejecutamos y se encargará de todo automáticamente. El así llamado include_path en el fichero de configuración PHP (normalmente en /etc/php.ini) ha de estar correctamente configurado para evitar problemas cuando se añadan componentes Pear. Si PHP está instalado en /usr/local lo normal es que Pear se configure para que esté en /usr/local/lib/php/. Si no queremos andar arreglando errores de instalación, un vistazo rápido al fichero de configuración nos revelará si las entradas están apuntando a los directorios correctos.

Visualización de Paquetes La orden pear list muestra en la terminal una lista de los paquetes

DESARROLLO

$pear list Installed packages: =================== Package Version State Archive_Tar 0.9 stable Console_Getopt 1.0 stable DB 1.3 stable

Podemos teclear pear install HTML_QuickForm en una terminal para instalar el paquete automáticamente. Si la conexión a Internet se viniera abajo en cualquier momento, podemos utilizar el navegador de Paquetes de la siguiente manera, para recuperar el paquete, resolver cualquier dependencia, en este caso HTML_Common, e instalar la colección: $ pear install /Path/to/DownU load/HTML_Common-1.2.1.tgz install ok: HTML_Common 1.2.1 $ pear install /Path/to/DownU load/HTML_QuickFrom-3.0.tgz install ok: HTML_QuickForm 3.0

Listado 1: emailformular.php 01 <?php 02 require_once 'HTML/QuickForm.php'; 03 04 // Muestra la versión de QuickForm 05 print 'PEAR::HTML_QuickForm Version '; 06 print HTML_QuickForm::apiVersion() . '<br/><br/>'; 07 08 $myForm = new HTML_QuickForm('Formulario de Email', 'POST'); 09 $myForm->addElement('header', '', 'Datos Personales'); 10 11 $myForm->addElement('text', 'textName', 'Apellido:'); 12 $myForm->addElement('text', 'textFirstname', 'Nombre:'); 13 $myForm->addElement('text', 'textEmail', 'Email:'); 14 $myForm->addElement('submit', 'submitButton','Entrar datos'); 15 16 $name =& $myForm->getElement('textName' );

17 $name->setMaxLength(30); 18 $name->setSize(30); 19 20 $vname =& $myForm->getElement('textFirst name'); 21 $vname->setMaxLength(20); 22 $vname->setSize(30); 23 24 $email =& $myForm->getElement('textEmail '); 25 $email->setMaxLength(50); 26 $email->setSize(30); 27 28 // Añade las reglas de validación 29 $myForm->addRule('textName', 'Por favor indique el apellido ', 'obligatorio'); 30 $myForm->addRule('textFirstnam e', 'Por favor indique el nombre', 'obligatorio'); 31 $myForm->addRule('textEmail', 'Por favor indique la dirección de email', 'obligatorio'); 32 $myForm->addRule('textEmail', 'Email incorrecto', 'email'); 33 $myForm->addRule('textEmail2',

'Por favor indique la dirección de email ', 'obligatorio'); 34 $myForm->addRule('textEmail2', 'Email incorrecto ', 'email'); 35 36 // También es posible validar del lado del cliente usando JavaScript 37 // $myForm->addRule('textEmail', 'Email invalid', 'email', NULL, 'client'); 38 39 // El formulario se congela si la validación es OK 40 if ( $myForm->validate() ) 41 { 42 print '¡Gracias! Sus datos son:'; 43 $myForm->removeElement('submit Button'); 44 $myForm->freeze(); 45 } 46 47 48 // Display form 49 $myForm->display(); 50 51 ?>

www.linuxmagazine.com.es

Número 02

47


DESARROLLO

Pear

A continuación, tecleamos pear list otra vez para que muestre los paquetes instalados. Más tarde podemos introducir periódicamente pear upgrade-all para actualizar cualquier paquete que tengamos instalado. pear unistall seguido del nombre del paquete desinstalará un paquete. Y si estamos interesado en más detalles de la configuración general de Pear, tecleamos config-show y se nos facilitará esa información.

HTML_QuickForm en Acción El paquete PEAR::HTML_QuickForm (nótese el peculiar modo de nombrar con el símbolo de los dos puntos) facilita funciones para la creación, validación y manejo de formularios en HTML. Es fácil de manejar y extremadamente flexible a la vez. además de su facilidad para obtener resultados senci–llamente, el paquete también facilita interfaces para los motores de plantilla más conocidos, como Smarty [5]. el listado 1 muestra un pequeño ejemplo. El paquete Pear utiliza un enfoque de programación orientada a objetos, tal como suele entenderse. El formulario de prueba requiere al usuario que introduzca el apellido, el nombre de pila y la dirección de correo electrónico. Se realiza una validación para fallos en la entrada de datos, la experiencia diaria de los programadores revela que hay que incluir validaciones, incluso con la más simple de las estructuras. La estructura require_once HTML/QuickForm.php de la linea 2 contiene el paquete Pear requerido. En este punto no es necesario un nombre de ruta absoluto, ya que PHP la buscará

Tabla 1: Tipos de validaciones para addRule() Entrada

48

Significa

required

El campo debe ser rellenado

maxlength

Longitud máxima del campo

minlength

Longitud mínima del campo

email trónico

Dirección valida de correo elec-

lettersonly letras

La entrada solo debe contener

numeric números

La entrada solo debe contener

regex una expresión regular

La entrada debe coincidir con

Número 02

Figura 1: En la jerga de PHP los componentes se denominan paquetes. El navegador de paquetes basado en Web muestra los paquetes en una vista de árbol, ordenados por categorías de aplicaciones.

automáticamente en el include_path configurado anteriormente. De nuevo esto es un reflejo de la estructura de Pear: QuickForm ocupa una posición debajo de HTML en la jerarquía y HTML es un directorio físico.

Un Derroche de Funciones El API QuickForm es de rango amplio y extremadamente funcional, especialmente desde la versión 3. Por tanto tiene sentido conseguir la salida de apiVersion() en la línea 6. Esto es conocido como método estático, algo que debería resultarle familiar a la mayoría de los desarrolladores que usan un lenguaje orientado a objetos: Cuando usan un operador con doble signo de dos puntos para llamar a un método de esta clase, no se necesita inicialización. Se pasan dos parámetros a la estructura en la línea 8: EmailFormular identifica el formulario y posteriormente se utilizará como el nombre del formulario en el código HTML. POST especifica el método HTTP POST para la transmisión de datos. Se pueden incluir otros parámetros y modificadores si son necesarios. Por ejemplo, puede usarse un tercer parámetro para especificar el do–cumento objeto que será generado. Como en este caso el parámetro ha sido

www.linuxmagazine.com.es

omitido, se supondrá el documento actual como el objetivo.

Una cabecera y cajas de texto Una cabecera, como la de la línea 9, es útil para identificar más fácilmente el documento y conseguir formularios impecables. Después vienen tres elementos del tipo de formulario text, que cualquier navegador Web dibujará como una caja de texto HTML. El segundo parámetro identifica el elemento, mientras que el tercero especifica el texto que aparecerá junto a la cajas en la página Web; esta es a la que se refiere como una etiqueta. Para el botón de enviar de la línea 14 están disponibles los siguientes tipos de elementos: • caja de verificación • imagen • oculto • contraseña • radio • seleccionar • texto • área de texto Normalmente, en un formulario de texto, necesitaremos especificar la longitud de los campos. Para hacer esto así los desarrolladores pueden usar getElement() que devuelve una referencia a cada elemento y los asigna a la correspondiente variable. En


Pear

nuestro ejemplo, de la línea 16 a la 26 se ajusta la longitud visible de todos los campos a 30 caracteres, aunque la longitud máxima sea distinta.

Figura 2:Gracias a QuickForm, validar direcciones de correo electrónico es una tarea fácil. Los campos obligatorios se

Validación de Campos Gracias a QuickForm es bastante fácil validar las entradas de los usuarios. El método addRule() le permite asignar un número arbitrario de reglas a cada elemento. Los elementos se identifican por nombres únicos. Las facilidades de validación son extremadamente amplias, ya que el método tiene muchos parámetros opcionales. Las líneas de la 29 hasta la 34 en el listado 1 muestra un caso muy simple, pasando el texto de error como el segundo y el tipo de validación como tercer parámetro. La tabla 1 muestra una visión general de los tipos de validación más importantes (véase la Tabla 1). Dependiendo del tipo, el programador deberá pasar al método addRule() un valor numérico, una expresión regular o nada como cuarto parámetro. Nuestro ejemplo implemente la validación de campos desde el lado del

DESARROLLO

especifican como tales y una entrada errónea genera el correspondiente mensaje de error.

servidor. El comentario en la línea 37 también indica la posibilidad de realizar la validación del lado del cliente usando Javascript. Entonces la instrucción if usa validate() para comprobar si cada campo ha sido correctamente validado. Luego, validate(), devuelve TRUE y congela todo el formulario. La característica de freeze() es que muestra los datos de entrada, sin permitir editarlos. Esto es muy practico, ya que permite al usuario crear una copia impresa, después de completar la entrada de datos. El botón Enviar se elimina dentro de la directiva if, pues no tendría ningún sentido mostrar el botón después de que la entrada de datos se haya terminado satisfactoriamente. Finalmente el

método más importante aparece en la línea 49: Se llama a display() para que muestre el formulario. La figura 2 se puede ver el resultado de todo este esfuerzo, con y sin errores.

Más Flexibilidad La funcionalidad proporcionada por el Listado 1 es aceptable para lo que es, pero el aspecto del formulario (véase la Figura 2) definitivamente no tiene nada de especial. Además, puede que prefiramos personalizarlo en vez de utilizar los mensajes convencionales. Esto es fácil de hacer gracias al alto grado de flexibilidad que facilita QuickForm, tal como se muestra en otro ejemplo en el Listado 2. Éste crea un un simple for-

Listado 2: creditcard.php 01 <?php 02 require_once 'HTML/QuickForm.php'; 03 04 // Plantilla para la cabecera 05 $headerTemplate = '<tr><td style="white-space: nowrap; background-color: blue;" align="center" '; 06 $headerTemplate .= 'valign="top" colspan="2"><font size="5" color="yellow">{header}</font> </td></tr>'; 07 08 // Plantilla para los campos de texto (miembro de y número) 09 $elTemplate = '<tr><td align="right" valign="top">'; 10 $elTemplate .= '<!-- BEGIN required --><font color="blue"><b>#</b></font><! -- END required --><b>{label}</b></td>'; 11 $elTemplate .= '<td valign="top" align="left"><!-BEGIN error --><span

style="color: #ff0000">'; 12 $elTemplate .= '{error}</span><br /><!-- END error -->{element}</td></tr>'; 13 14 // Instanciar el formulario 15 $myForm = new HTML_QuickForm('CreditcardForm ', 'POST'); 16 // Nuevo texto para los campos obligatorios 17 $myForm->setRequiredNote('<fon t color="blue"><b>#</b></font> are mandatory'); 18 19 // Añadir la cabecera y configurar la nueva plantilla 20 $myForm->addElement('header', '', 'Creditcarddata'); 21 $myForm->setHeaderTemplate($he aderTemplate); 22 23 // Añadir campos de texto y configurar la nueva plantilla para cada uno

24 $myForm->addElement('text', 'textCardholder', 'Cardholder:'); 25 $myForm->addElement('text', 'textCardnumber', 'Cardnumber:'); 26 $myForm->setElementTemplate($e lTemplate, 'textCardholder'); 27 $myForm->setElementTemplate($e lTemplate, 'textCardnumber'); 28 29 // Matriz para los tipos de tarjeta de credito 30 $cardtypes = array( 'visa' => 'VISA', 'master' => 'EuroCard', 'amex' => 'American Express',); 31 // Menu desplegable para los tipos de tarjeta de credito 32 $myForm->addElement('select', 'selectCardtypes', 'cardtype:', $cardtypes); 33 34 // Matriz para mese y años 35 $months = array (

www.linuxmagazine.com.es

Número 02

49


DESARROLLO

Pear

pio campo de texto. Las áreas encerradas en los comentarios HTML contienen los mensajes de error para los campos obligatorios y los símbolos. En el ultimo caso el asterisco rojo es reemplazado por un diamante azul. Como un formulario está, predeterminadamente, empotrado en una tabla, solo tiene que asegurarse que las etiquetas internas de la tabla están bien configuradas. No obstante, podría plantearse usar una plantilla de formulario sin una tabla. El método setRequiredNote() de la línea 17 reemplaza los mensajes estándar con mensajes personalizados. Adicionalmente setHeaderTemplate() y setElementTemplate() registran las plantillas definidas con los elementos.

¿Qué es Pear? ¿Qué es PECL? PHP es un lenguaje extremadamente universal que puede fácilmente integrar librerías de programación y así implementar interfaces a bases de datos, herramientas gráficas, analizadores gramáticos (parsers) para XML y muchas otras cosas. Esto que ha hecho a PHP popular y que la mayoría de la comunidad comenzara a ponerse a trabajar en el desarrollo de extensiones, ¡ésta es una de las ventajas más obvias del Código Abierto! Pero para mantener la extensión del paquete de PHP en un tamaño razonable, solo se proporcionan de manera predeterminada con PHP las extensiones más importantes y más usadas. Figura 3: QuickForm es extremadamente flexible

mulario para la entrada de los datos de una tarjeta de crédito. Los desarrolladores pueden utilizar plantillas para modificar el color, formato y el orden de los elementos individuales del formulario a su gusto. Estas plantillas están definidas en dos variables de cadena, para la cabecera y para las cajas de texto, al comienzo del Listado 2. La

cuando hay que alinear campos y asignar etiquetas y colores. Las plantillas se pueden usar para cumplimentar casi cualquier requisito.

cadena entre corchetes define la parte del texto del elemento actual y puede ser colocado donde quiera. Para campos de texto, {label} indica el nombre, como Miembro de, y {elemento} el pro-

Menús Desplegables Los menús desplegables (elemento tipo select) se definen como valores en las áreas apropiadas desde la línea 30 hasta la 41. El área $cardtypes es el cuarto parametro de addElement() en la línea 32. Este mecanismo posibilita añadir nuevos valores rápidamente en un momento posterior sin sacrificar la

Listado 2: creditcard.php (continuación) 36 37 38

39

40 41

'01' => 'Enero', '02' => 'Febrero', '03' => 'Marzo', '04' => 'Abril', '05' => 'Mayo', '06' => 'Junio', '07' => 'Julio', '08' => 'Agosto', '09' => 'Septiembre', '10' => 'Octubre', '11' => 'Noviembre','12' => 'diciembre' ); $years = array ( '2003' => '2003', '2004' => '2004', '2005' => '2005' );

42 43 // Crear el grupo de elementos para meses y años 44 $validTo[] = &HTML_QuickForm::createElement ('select', 'selectValidMonth', NULL, $months); 45 $validTo[] = &HTML_QuickForm::createElement ('select', 'selectValidYear', NULL, $years); 46 47 // Grupo de elementos creados

50

Número 02

para meses y años 48 $myForm->addGroup($validTo, 'validToGroup', 'Valid to:'); 49 50 // Add Submit button 51 $myForm->addElement('submit', 'submitButton','Submit Data'); 52 53 // El número de la tarjeta de credito tiene 16 dígitos 54 $cardnumber =& $myForm->getElement('textCardn umber'); 55 $cardnumber->setMaxLength(16); 56 57 // Reglas de validación: Los dos campos de texto debes estar ocupados 58 // El número de la tarjeta de credito debe ser numérico y comprende 16 dígitos 59 $myForm->addRule('textCardhold er', 'Por favor introduzca miembro de', 'Obligatorio'); 60 $myForm->addRule('textCardnumb

www.linuxmagazine.com.es

er', 'Por favor indique el número de tarjeta', 'Obligatorio'); 61 $myForm->addRule('textCardnumb er', 'Número de tarjeta invalido', 'numérico'); 62 $myForm->addRule('textCardnumb er', 'Número de tarjeta demasiado corto', 'longitud mínima', 16); 63 64 // Freeze form if validation succeeds 65 if ( $myForm->validate() ) 66 { 67 $myForm->removeElement('submit Button'); 68 $myForm->freeze(); 69 } 70 71 // Display form 72 $myForm->display(); 73 74 ?>


Pear

Ejemplos Sencillos Como no es necesario escribir el software cliente y existe un navegador Web para casi cada sistema operativo, más y

No es necesario el escepticismo Los desarrolladores tienden a ser meticulosos y desconfiados con el código de los demás. Esta es la razón por la cual muchos desarrolladores ven Pear con un cierto grado de escepticismo. Pero esta clase de resistencia a la librería de la clases de PHP está injustificada. Si se confía en PHP, también debemos estar preparado para confiar en la calidad de Pear, al menos en lo que se refiere a los paquetes estables de la Pear Foundation Classes (PFC).

más programadores están adoptando la metodología de aplicaciones basadas en servidor Web para desarrollar aplicaciones. También se pueden estimar los costes operativos, pues los costes de mantenimiento del software y similares son más bajos que para las soluciones tradicionales cliente/servidor, debido al hecho de que el software solamente necesita ser actualizado del lado del servidor. Ambos ejemplos de PHP mostrados aquí son muy simples, pero demuestran que ambas aplicaciones Web se desarrollan fácilmente. Y al mismo tiempo es fácil acostumbrarse a evitar los errores de entrada. Los sistemas de gestión de flujo de trabajo son un uso típico que implica un montón de formularios y son un campo perfecto para el uso de QuickForm. La biblioteca presentada en este artículo proporciona una amplia gama de las funciones adicionales satisfaciendo varios campos de aplicación, tales como procesado de carga de ficheros, mejoras personalizadas, funciones especializadas de

INFO [1] Listados de este artículo: http://www. linuxmagazine.com.es/descargas [2] Sitio oficial de PHP: http://www.php.net [3] Sitio oficial de Pear: http://pear.php.net [4] Navegador de paquetes Pear: http://pear. php.net/packages.php [5] Motor de plantillas Smarty: http://smarty. php.net/ [6] Protocolo de la reunión Pear del 2003: http://pear.php.net/news/ meeting-2003-summary.php

Calidad con C mayúscula Estos paquetes de alta calidad están sujetos a medidas rigurosas de control de calidad. Cuando se agregan nuevas características, o cambian las necesidades de una implementación, esos cambios son discutidos por un equipo de experimentados desarrolladores usando una lista de correo. Los paquetes de Pear cumplen con una codificación estándar que define con precisión como deben programar los desarrolladores, que incluye como hay que sangrar el código, como asignar nombres de variables. Esta metodología permite que los desarrolladores de Pear y recién llegados al lenguaje se hagan rápidamente con el código fuente. Además, es un requisito facilitar una buena documentación para el código. Gracias a este estándar, la documentación del API para el paquete puede crearse automáticamente.Y es por esta razón que la página Web de Pear en [3] contiene abundantes descripciones de este tipo. Muchos de los autores de paquetes Pear son miembros respetados y bien conocidos de la comunidad de desarrolladores que también han contribuido en otras partes de PHP. Para descubrir cuánta sangre, sudor y lágrimas se ha derramado para producir código de calidad, solo se debe dedicar unos minutos a leer el resumen de la ultima reunión de Pear [6].

Peras y Adobos Gratis Con una gama tan grande de extensiones disponibles, hay que poner un cierto esfuerzo para promover una librería. Es por esto que el promotor de Pear, Stig Saether Bakken, distribuye peras y adobos a los asistentes a sus presentaciones y talleres de Pear. A pesar de que la virtud de este dúo culinario es discutible. atrae la atención de la audiencia sobre los nombres Pear y PECL (se dice “pickle”,“adobo” en inglés). PECL es el acrónimo de PHP Extension Code Library, que abarca un subconjunto de Pear y contiene las extensiones PHP programadas en C. Si se busca extensiones más exóticas, que faciliten Mono, el clon del marco de trabajo de Microsoft .NET, deberemos examinar PECL. La instalación es manejada por el instalador de paquetes, como con cualquier otro paquete Pear. En el caso de los paquetes PECL, nos aseguraremos de que cualquier dependencia del sistema que surja se resuelva. Si se está instalando el paquete Mono, por supuesto que se necesitará el marco de trabajo Mono.

“callback” o filtros inteligentes para entrada de campos. Pero QuickForm no es solamente la librería facilitada por Pear para simplificar las tareas de los programadores. La transferencia de datos de una tarjeta de crédito, la cuál podría considerarse como una extensión al segundo ejemplo, se maneja normalmente a través de HTTP o Soap. De nuevo los paquetes de Pear reducen este proceso a apenas algunas líneas de código y ahorran a los desarrolladores el esfuerzo de implementar protocolos estándar. Gracias a Pear, no es necesario reinventar la rueda para cada campo de aplicación en el que se aven■ ture.

EL AUTOR

legibilidad. El paquete QuickForm también facilita los grupos, donde los elementos individuales se sitúan juntos. En el caso del formulario de la tarjeta de crédito (véase la Figura 3), tiene más sentido organizar la validez de los datos (que es la combinación de los meses y de los años que forman la fecha) de esta manera. Para hacer esto, las líneas 44 y 45 añaden dos menús desplegables a la matriz $validTo[]. Estos elementos individuales no contienen etiquetas y esto es porque el tercer parámetro en el método estático createElement() es NULL. Se especifica una etiqueta para todo el grupo en la línea 48 usando addGroup(); la matriz será el primer parámetro que se le pasará. Las restantes instrucciones están en el Listado 1.

DESARROLLO

Richard Samar, http:// richard-samar. de, es un consultor independiente de TI que vive cerca de Frankurt, Alemania. Es un entusiasta de PHP desde hace muchos años y es bien conocido en la comunidad alemana de PHP.

www.linuxmagazine.com.es

Número 02

51


DESARROLLO

Python

Manejo básico de ficheros

Crea un álbum de imágenes Siguiendo con nuestro paseo por Python vamos a seguir viendo características básicas, y concretamente en este artículo, el tratamiento de ficheros. POR JOSÉ MARÍA RUÍZ Y JOSÉ PEDRO ORANTES

E

n el último artículo vislumbramos algo sobre cómo trabajar con objetos en Python. Fue algo muy simple, pero que ya nos daba la posibilidad de organizar nuestro código en torno a ello. Python hace un uso extensivo de los objetos en sus APIs, y especialmente del control de errores mediante excepciones, lo que nos da la posibilidad de lanzar excepciones cuando algo va mal. Una excepción es un mensaje que podemos capturar cuando se ejecuta cierta función o método y aparece un error de algún tipo. Normalmente controlamos estos errores mediante el valor devuelto por la función (como por ejemplo en C). Esta técnica es engorrosa, pero al igual que todo, tiene sus virtudes y sus desventajas. Sin embargo, Python hace uso de las excepciones en su lugar. Cuando una función genera una excepción decimos que eleva una excepción. Es muy normal tener que controlar las excepciones en las operaciones que realicemos con recursos que pueden no estar disponibles. Por eso las vamos a ver, puesto que en este artículo vamos a trabajar con archivos y conexiones a Internet. Vamos a crear un objeto que gestione un recurso que puede no estar disponible. En este caso el objeto ges-

52

Número 02

tiona una variable (vease Listado 1). Alguien puede crear un objeto de la clase obj_variable y llamar al método set_variable(23), pero ¿cómo puede estar seguro de que la variable var tiene el valor 23 después de la llamada? Puede que var no fuese 0, porque otra llamada anterior ya podría haberla asignado. Lo único que podríamos hacer es llamar a reset_variable() y así asegurarnos de que nuestro valor sea asignado, pero entonces destruiríamos el valor anterior y no sabríamos qué podría pasar. Por lo tanto, necesitamos un mecanismo de comunicación para darle a conocer al usuario que esa variable ya está asignada. Esto lo podemos hacer con las excepciones. En el Listado 2 aparece una clase que hereda de la clase Exception (veremos los mecanismos de herencia en otro artículo dedicado a los objetos) llamada Var_Asignada. Cuando en la clase obj_variable intentamos asignar un valor a la variable var y ésta no es 0, entonces se dispara, se eleva, la excepción Var_Asignada. Si no controlamos la porción de código en la que se encuentra set_variable() y aparece una excepción, el programa se detendrá y acabará. La idea detrás de las excepciones es que es posible tratarlas y evitar males

www.linuxmagazine.com.es

mayores, pudiendo en ocasiones incluso recuperarnos de ellas. Para ello está la estructura try-except. Rodeamos el código que puede disparar excepciones con esta estructura (Vease Listado 3). A partir de ahora, y hasta que no expliquemos con más profundidad el tema de las excepciones, cuando digamos que una función genera una excepción, significará que ese código deberá estar rodeado con una estructura try-except.

Trabajo con Ficheros Ya que hemos conseguido cierta soltura con los conceptos de objetos en Python, ahora vamos a ver como se manejan los accesos a ficheros en él. Para acceder a un fichero primero necesitamos crear un objeto file. El objeto file es parte de la librería base de Python, así que no es necesario importar ninguna librería externa. >>> archivo = file(‘texto.txt’) file abre los ficheros en modo de sólo lectura por definición. Eso significa que si el fichero no existe obtendremos un error. Para verificar si el fichero existe podemos usar la función exists() de la librería os.path. LI:>>> import os.path >>> os.path.exists(‘texto.txt’) True >>>


Python

os.path.exists(‘algo-peludo-y-feo.txt’) False Por lo tanto, si vamos a abrir un fichero, será importante asegurarse de que ya existe. Si en lugar de leer, lo que queremos es crear el fichero, deberemos invocar al constructor de file con los parámetros: >>> archivo = file('texto.txt'U ,'w')

Este segundo parámetro opcional nos permite definir el tipo de acceso que vamos a realizar al fichero. Tenemos varias posibilidades: podemos leer (r), escribir (w), añadir al final del fichero (a) y también tener acceso de lectura/ escritura (r+w). Disponemos también del modificador b para indicar acceso binario. Python considera a los ficheros como ficheros de texto por definición. Vamos a ver todas las combinaciones en el Listado 4. Con cualquiera de estas llamadas tendríamos en archivo, si todo ha ido bien, un objeto que gestiona el archivo indicado. Es entonces cuando podemos operar sobre él. Las operaciones más típicas son las de leer desde el archivo y escribir en él. Para ello el objeto file dispone de los métodos read(), readline(), write() y writeline(). Todos ellos operan con cadenas de caracteres: readline() y writeline() trabajan con líneas de texto (acabadas en retorno de carro), mientras que read() y write() lo hacen con cadenas sin restricciones. Lo que vemos en el Listado 5 son algunas manipulaciones sobre un fichero. Lo

Listado 1 01 02 03 04 05 06 07 08 09 10 11 12

>>> class obj_variable: ... __init__(this): ... var = 0 ... ... set_variable(this, valor): ... if (var == 0): ... var = valor ... ... reset_variable(this): ... var = 0 ... >>>

primero que tenemos que hacer es crear el fichero, para lo cual lo abrimos en modo de escritura, ‘w’, que creará el fichero o truncará el existente (lo borrará para crearlo de nuevo, aunque si lo que queremos es añadir al final, usaremos ‘a’). Posteriormente escribimos en él una cadena con un retorno de carro en mitad (para hacer nuestras pruebas) y cerramos el fichero. Es importante cerrar los ficheros cuando dejemos de usarlos, pero en este caso la razón para cerrarlo es que vamos a volver a abrirlo en modo de lectura. Ahora volvemos a abrir el fichero en modo de lectura y leemos 4 bytes que almacenamos en la variable cadena. Cuando leemos con read() avanzamos en el fichero, esa es la razón de que el posterior readline() lea la cadena “ mundo\n” en lugar de “Hola mundo”. También vemos que se para en el retorno de carro en lugar de continuar. El segundo readline() ya nos permite leer la cadena “Adios mundo”. Pero… ¿qué ocurriría si en una de las lecturas nos encontrásemos con el fin de fichero? En el caso de que leyésemos una cadena con el fin de fichero (EOF), al final simplemente nos quedaríamos con la cadena hasta el EOF. En cambio, si sólo leemos el EOF, entonces obtenemos una null. Esto es importante para comprobar que hemos acabado con el fichero. Así, un bucle que escriba por pantalla el contenido del fichero, comprobaría en cada vuelta si la cadena que devuelve readline() es null. Ahora que ya sabemos crear archivos, tenemos que aprender a borrarlos. Esto se realiza mediante la función remove() de la librería os. Esta función acepta la ruta de un fichero y lo borra. Si en lugar de un fichero le pasamos un directorio elevará una excepción “OSError”. >>> import os >>> os.remove(texto.txt) >>>

Directorios y Sistema de Ficheros Con estos pocos métodos tenemos ya a nuestro alcance la manipulación básica de ficheros. Pero vamos a necesitar para nuestro programa la posibilidad de crear directorios. ¿Cómo lo haremos? Pues

DESARROLLO

mediante la función mkdir(), que acepta una cadena y crea un directorio con ese nombre. Si queremos crear un directorio que esté dentro de otros directorios también nuevos, tenemos que usar makedirs(). Ambas funciones pertenecen al módulo os por lo que para usarlas tendremos que hacer: >>> import os >>> os.mkdir('uno') >>> os.makedirs('dos/tres')

Para borrar esos directorios usaremos la función rmdir() y removedirs(). La primera borra un directorio, mientras que la segunda borra una ruta de directorios. Vamos a ver esto con más detenimiento. >>> os.rmdir('uno') >>> os.removedirs('dos/tres')

Listado 2 01 >>> class Var_Asignada(Exception): 02 ... """ Excepción que se dispara al intentar asignar 03 ... una variable ya asignada en obj_variable""" 04 ... pass 05 ... 06 >>> 07 >>> class obj_variable: 08 ... """ Administra una variable """ 09 ... def __init__(self): 10 ... self.var = 0 11 ... 12 ... def set_variable(self, valor): 13 ... if (self.var == 0): 14 ... self.var = valor 15 ... else: 16 ... raise Var_Asignada 17 ... 18 ... def reset_variable(self): 19 ... self.var = 0 20 ... 21 >>> 22 >>> a = obj_variable() 23 >>> a.set_variable(12) 24 >>> a.set_variable(34)

www.linuxmagazine.com.es

Número 02

53


DESARROLLO

Python

Listado 3 01 02 03 04 05 06 07 08 09 10

>>> try: ... set_variable(12) ... set_variable(34) ... except: ... print "ERROR: Se ha intentado asignar" ... print "un valor a una variable ya asignada" ... ERROR: Se ha intentado asignar un valor a una variable ya asignada >>>

rmdir() borrará el directorio “uno”, que no contiene ningún otro objeto en su interior (ni directorios, ni ficheros). En caso de tenerlo, la llamada devolvería un error. La función removedirs() comenzaría a borrar desde el directorio que está más a la derecha de la ruta (“tres”) hacia el que está más a la izquierda (“dos”). Pero imaginemos que dentro de “dos” también hay un directorio “cuatro”. Entonces se borraría el directorio “tres”, y cuando la función fuese a borrar el directorio “dos” se encontraría con que no puede porque existe dentro de él un directorio llamado “cuatro” y pararía. En cuanto a removedirs(), este comando aplica rmdir() de derecha a izquierda en la ruta. Imaginemos ahora que necesitamos cambiar el directorio en el que estamos trabajando. En el momento de arrancar el programa ese directorio es el que alberga el programa o bien es el directorio desde el que se ejecutó, pero no siempre es en el que queremos que el programa trabaje. Cualquier referencia a un fichero será tomando como base el directorio de trabajo, en caso contrario tendríamos que especificar la ruta de trabajo. Para poder cambiar el directorio de trabajo, el módulo os tiene la función chdir(). Si invocamos dentro de nuestro programa: >>> os.chdir('/tmp')

Desde ese momento cualquier referencia a un fichero será direccionada a “/tmp”. Ahora podemos: • Abrir, cerrar, modificar un fichero.

54

Listado 5

Número 02

01 >>> archivo = file('/tmp/texto.txt','w') 02 >>> archivo.write("Hola mundo\nAdios mundo") 03 >>> archivo.close() 04 >>> 05 >>> archivo = file('/tmp/texto.txt','r') 06 >>> cadena = archivo.read(4) 07 >>> cadena 08 'Hola' 09 >>> cadena = archivo.readline() 10 >>> cadena 11 ' mundo\n' 12 >>> cadena = archivo.readline() 13 >>> print cadena 14 'Adios mundo' 15 >>> archivo.close()

• •

Crear, eliminar un directorio. Cambiar el directorio de trabajo.

Python y la web Python posee gran cantidad de librerías para trabajar con recursos de Internet. De hecho Zope [1], un servidor de aplicaciones con gran éxito, está creado en Python y hace uso de todas sus características. Mailman [2] o Bittorrent [3] son también buenos ejemplos. Debido a su flexibilidad, Python es usado como lenguaje de implementación para multitud de aplicaciones de red así como aplicaciones distribuidas. Por eso, no es de extrañar que Python suela ser el lenguaje en el que se implementan muchas de las más novedosas tecnologías de red. En este apartado vamos a comenzar con lo básico. Queremos traer un recurso de la red a nuestra máquina, y para ello emplearemos una URL[4] del estilo http://www.algunaweb.algo/imagen.jpg. Pero primero necesitamos crear una conexión con el servidor. Vamos a emplear para ello la librería httplib que viene con Python. Esta librería nos permite establecer una conexión con un servidor http y mandarle comandos http. Los comandos http son simples, y de todos ellos, de momento sólo nos interesa uno, el comando GET.

www.linuxmagazine.com.es

Listado 4 01 >>> archivo = file('texto.txt','r') 02 >>> archivo = file('texto.txt','w') 03 >>> archivo = file('texto.txt','a') 04 >>> archivo = file('texto.txt','r+w') 05 >>> archivo = file('texto.txt','r+b') 06 >>> archivo = file('texto.txt','rb')

Cuando accedemos a un servidor http, por ejemplo para ver una página web, lo que hacemos es pedirle objetos. Esto se hace mediante el comando GET <objeto>. Por ejemplo, si queremos la página index.html de la web http://www.python.org, primero conectamos con el servidor http de http://www.python.org y después, una vez conectados, le enviamos al servidor http el comando GET index.html. En ese momento el servidor nos devuelve por el mismo canal el contenido del archivo index.html. Dicho así parece muy fácil, pero es una tarea que en un lenguaje de más bajo nivel requeriría gran cantidad de librerías y control de errores. En Python vamos a tener muchas menos dificultades. Siguiendo con la explicación vamos a ver en el Listado 6 como haríamos precisamente lo que hemos dicho Lo primero es importar la librería httplib, creamos entonces una conexión con el host en cuestión y pedimos el archivo index.html. Esa conexión genera una respuesta. La respuesta está formada por varias partes, entre ellas un código numérico (como el famoso 404), un texto que describe el error y una conexión al archivo que pedimos. En el caso de una conexión correcta recibiremos un 200, un OK y una conexión con el fichero. De esa conexión leemos con read() el contenido y lo almacenamos en una variable que llamamos dato. Entonces podremos cerrar la conexión como si de un fichero se tratara. En ese momento ya tenemos la información que queríamos en dato y el canal cerrado. ¿No es muy difícil, no?


Python

DESARROLLO

Listado 6: El “Recogedor” de Imágenes 001 #!/usr/local/bin/python 002 # ---NOTA------------------------------------003 # El fichero que debe ser pasado como argumento 004 # debe consistir en un listado con una url por 005 # linea. 006 # -------------------------------------------007 class Lista_URLs: 008 """Recibe un fichero y carga 009 sus cadenas en una lista. Provee de métodos 010 para obtener de nuevo las cadenas desde la 011 lista.""" 012 013 def __init__(self,nombre): 014 self.lista= [] 015 self.contador = 0 016 self.archivo = file(nombre) 017 self.cadena = self.archivo.readline() 018 019 while(self.cadena != '\n'): 020 self.lista.append(self.cadena ) 021 self.cadena = self.archivo.readline() 022 self.archivo.close() 023 024 def rebobina(self): 025 self.contador = 0 026 027 def siguiente(self): 028 if ( self.contador >= len(self.lista)): 029 return '' 030 else: 031 self.valor = self.lista[self.contador] 032 self.contador = self.contador + 1 033 return self.valor 034 035 def fin(self): 036 return (self.contador

== len(self.lista)) 037 038 039

072 073 074

def longitud(self): return len(self.lista)

040 041 def crea_directorio(cadena): 042 componentes = cadena.split('.') 043 044 if(os.path.exists(componentes [0])): 045 print "Error: el directorio ya existe" 046 sys.exit() 047 else: 048 os.makedirs(componentes[0]) 049 os.chdir(componentes[0]) 050 print 'Creando directorio ' + componentes[0] 051 052 def descarga_urls(lista): 053 lista.rebobina() 054 055 while( not lista.fin() ): 056 url = lista.siguiente() 057 058 componentes = url.split('/') 059 servidor = componentes[2] 060 061 ruta_imagen = '/' 062 for i in range( 3, len(componentes)): 063 ruta_imagen = ruta_imagen + '/' + componentes[i] 064 065 print 'Descargando imagen: ' + url[:-1] 066 conexion = httplib.HTTPConnection(servid or) 067 068 conexion.request("GET", url) 069 respuesta = conexion.getresponse() 070 071 datos =

respuesta.read() conexion.close()

if( respuesta.status != '200'): 075 nomb_fichero = componentes[len(componentes) -1] 076 nomb_fichero = nomb_fichero[:-1] 077 archivo = file(nomb_fichero ,'w') 078 archivo.write(datos) 079 archivo.close() 080 else: 081 print "Fallo descargando" + url 082 083 def genera_index(lista): 084 print 'Generando índice index.html' 085 archivo = file('index.html','w') 086 087 archivo.write('<html>\n') 088 archivo.write('<head>\n') 089 archivo.write('<title> Imagenes </title>\n') 090 archivo.write('</head>\n') 091 archivo.write('<body>\n') 092 archivo.write('<h1>Imagenes</ h1>\n') 093 archivo.write('<ul>\n') 094 095 lista.rebobina() 096 url = lista.siguiente() 097 098 componentes = url.split('/') 099 imagen = componentes[len(componentes) - 1] 100 101 while( url != ''): 102 archivo.write('<li><img src=\"'+ imagen +'\"></img></li>\n') 103 url = lista.siguiente() 104 componentes = url.split('/')

www.linuxmagazine.com.es

Número 02

55


DESARROLLO

Python

Listado 6: El “Recogedor” de Imágenes (continuación)

106 107 108

imagen = componentes[len(componentes) - 1]

114 #-------------------------------------------------115 if __name__ == '__main__': 116 117 import httplib 118 import os 119 import os.path 120 import sys 121 122 if len(sys.argv) == 2: 123 lista = Lista_URLs(sys.argv[1]) 124 crea_directorio(sys.argv[1])

archivo.write('</ul>\n') archivo.write('</body>\n')

109 archivo.write('</html>\n') 110 111 112

archivo.close()

#-------------------------------------------------113 # Main

Parámetros Estamos acostumbrados a poder pasar parámetros a los programas; en UNIX es algo común. Pero… ¿cómo podemos obtener los parámetros de ejecución en Python? De nuevo tenemos que recurrir a una librería: la librería sys. sys nos proporciona el acceso a los argumentos a través de su variable argv. Esta variable es una lista, por lo que podemos obtener los argumentos accediendo a las posiciones de la misma. La posición 0 contiene el nombre del programa que estamos ejecutando, y a partir de la posición 1 encontraremos los parámetros pasados. Al ser una lista podemos controlar la cantidad de los parámetros llamando a len().

Programa Ahora es el momento de poner todo lo aprendido en práctica con un programa que puede ser útil. En este caso vamos a examinar un programa que realizará las siguientes tareas: • El programa aceptará un parámetro de entrada que le indicará el nombre de un fichero. • El programa abrirá ese fichero y lo leerá línea por línea. Cada línea del fichero será la dirección URL de una imagen. • Cada URL será introducida dentro de una lista para su posterior uso. • Una vez que hayamos acabado de leer el fichero, lo cerraremos y entraremos en la segunda

56

Número 02

parte del programa. Crearemos un directorio con el nombre del archivo que nos hayan dado. • Cambiaremos el directorio de trabajo a ese directorio. • Descargaremos cada una de las URLs dentro del directorio. • Generaremos un archivo index.html que muestre las imágenes. ¿Mucho trabajo? Para eso están los programas. Evidentemente no realizaremos todas las comprobaciones que serían necesarias, ya que en tal caso el programa se alargaría demasiado, por lo que se deja al lector la opción de mejoras. Pensemos ahora en el diseño del programa. Tenemos varias partes: Primero comprobaremos y almacenaremos la opción con el nombre del archivo. A continuación leeremos las URLs. El siguiente paso es crear un directorio y cambiar el directorio de trabajo. Después descargaremos las URLs. Y, por fin, hemos de generar el archivo HTML. Vamos a seguir estos puntos para crear las funciones. Las URLs vamos a almacenarlas en una lista. ¿Deberíamos usar objetos? Esta es una de las cosas maravillosas que ofrece Python: NO estamos obligados a usar objetos. Y no digo que los objetos sean malos, sino que en ocasiones pueden llegar a ser engorrosos. Por ejemplo, podríamos crear un objeto Lista_URLs que aceptase como parámetro en su constructor el nombre de un fichero y que después nos permitiese ir cogiendo las URLs una •

www.linuxmagazine.com.es

125 126 127 128 129 130 131

132 133

descarga_urls(lista) genera_index(lista) elif len(sys.argv) == 0: print 'La sintaxis del programa es:\n' print sys.argv[0] + ' archivo\n' print 'El archivo debe contener una URL por línea' else: print "ERROR: la sintaxis es " + sys.argv[0] + " <fichero>"

detrás de otra. También podemos hacer lo mismo usando una función que cargue las URLs en una variable global. Aquí vamos a hacerlo con un objeto. Es en este momento cuando se deja al lector que explore la posibilidad de sustituir el objeto por una variable global y las funciones de lista. Algunas notas finales, el programa solo funciona con URLs de imágenes, y el archivo que contenga las URLs debe acabar con un fila vacía (un enter después de la última imagen). Este programa (que se puede ver en el Listado 6) es muy simple y esta ampliamente comentado, pero de nuevo retamos a los lectores a mejorarlo y a introducirle control de excepciones. Suerte. ■

RECURSOS [1] Zope: http://www.zope.org [2] Mailman: http://www.gnu.org/software/ mailman/ [3] BitTorrent: http://bittorrent.com/ [4] Universal Resource Language

José María Ruiz actualmente está realizando el Proyecto Fin de Carrera

LOS AUTORES

105

de Ingeniería Técnica en Informática de Sistemas. Lleva 7 años usando y desarrollando software libre y, desde hace dos, se está especializando en FreeBSD. Pedro Orantes está cursando 3º de Ingeniería Técnica en Informática de Sistemas.


Charly

ADMINISTRACIÓN

Apachetop

Rastreando a Apache Apachetop es a Apache lo que el comando top a los procesos. Esta herramienta permite a los administradores monitorizar lo que el servidor Web está haciendo y cuanto trabajo consume una tarea determinada. POR CHARLY KÜHNAST

Apachetop -f /pathU /Apache-Logfile

SYSADMIN Filtrado de Web...........................58 La publicidad de los sitios web dificulta la navegación por Internet y consume ancho de banda. Analizamos herramientas que permiten bloquear los banners de publicidad en la propia máquina o en la red local

Sleuthkit .........................................61 La herramienta para análisis forenses en archivos que identifica evidencias, recupera archivos borrados y reconstruye escenarios.

Para empezar obsérvese el parecido con top (ver Figura 1). La primera línea no es muy interesante, ya que contiene sólo la hora del último hit, el uptime y la hora actual. La siguiente línea contiene el número de respuestas que Apache ha manejado desde que se arrancó Apachetop, el número de demandas por segundo, el total de datos transferidos, el volumen de transferencias por segundo y la media de datos transferidos por demanda. Las líneas que siguen clasifican las demandas por sus valores de retorno.

K.O. Las dos líneas siguientes son interesantes por una cosa, pueden ser parametrizadas. Por defecto se muestra el valor medio de todas las demandas en los últimos 30 segundos. El siguiente código incrementará este período a 60 segundos: apachetop -T 60 -f /Apache-Logfile

/pathU

Pero ¡cuidado!, las configuraciones con intervalos muy altos en servidores muy cargados, impactarán en la monitorización de Apache ya que no tendrá tiempo para realizar los cálculos. Es preferible decirle a Apachetop que mire las últimas 1000 demandas, independientemente del período en el que ocurrieron. Apachetop -H 1000 -f /pathU /Apache-Logfile

Taller del Administrador........67 Proporcionar medios de correo básicos es cada vez un desafío mayor para los administradores en grandes redes. Echamos un vistazo a los clusters de correo.

Figura 1: Apachetop no intenta esconder su similitud con el comando top.

[R] ordena por el número de demandas • [Mayúscula] + [R] ordena por demanda/segundo • [B] ordena por Kbytes transferidos • [Shift] + [B] ordena por Kbytes/segundo. Apachetop actualiza la pantalla cada 5 segundos. Si el valor de refresco parece demasido frenético… y esto puede pasar si se ha pasado la noche entera hackeando, simplemente hemos de usar el parámetro -r 20 para incrementar el intervalo de refresco a 20 segundos. Esto es aconsejable por las mañanas para los ojos cansados de los ■ administradores

INFO 1] Webalizer: http://www.mrunix.net/ webalizer [2] Apachetop: http://clueful.shagged.org/ apachetop/

EL AUTOR

C

uando se necesita generar un perfil de actividad para un servidor Web, normalmente se utiliza un generador de informes tradicional como Webalizer [1]. Pasando un fichero de log de Apache a una herramienta de informes que generará todo tipo de estadísticas útiles e inútiles. Los más impacientes, como los administradores, quienes tratan de seguir lo que está ralentizando la ejecución de su servidor, estarán más interesados en lo que Apache está haciendo ahora mismo. Desafortunadamente, los generadores de informes no proporcionan este tipo de información… ¡Apachetop[2] al rescate! La versión 0.7 apareció cuando estaba escribiendo la columna de este mes y el autor del programa, Chris Elsworth estará trabajando duro en la versión 0.8. La herramienta se proporciona como una tarball o un RPM; una vez instalado es muy fácil arrancar el programa. Simplemente tecleamos:

Atajos de Teclado Al igual que con el proceso top, Apachetop puede aceptar comandos en tiempo de ejecución a través del teclado:

Charly Kühnast es un administrador de sistemas bajo entorno Linux en el centro de datos de Moers, cerca del Rin, el famoso río Alemán. Sus tareas incluyen asegurar la seguridad y disponibilidad del cortafuegos y el mantenimiento del DMZ (zona desmilitarizada).

www.linuxmagazine.com.es

Número 02

57


ADMINISTRACIÓN

Bloqueo Banners

Bloqueo de anuncios con Navegador o Proxy

Calma Total La publicidad de los sitios web dificulta la navegación por Internet y consume ancho de banda. En este artículo se verán herramientas que permiten bloquear los banners de publicidad en la propia máquina o en la red local. POR OLIVER FROMMEL

E

s difícil encontrar hoy en día un sitio web que no tenga banners de publicidad. Además de los banners que cubren toda la pantalla, cada vez se incluyen imágenes más grandes que reemplazan las cabeceras, dificultando al usuario su navegación por la web. Aunque esto pueda ser comprensible desde el punto de vista del proveedor de contenidos, para los usuarios es de todo menos divertido cuando se encuentra con banners de publicidad, especialmente, con aquellos que reducen la velocidad de navegación. De hecho, es bastante común encontrarse con banners llamativos, con formatos de imágenes o destellos que consumen más memoria que el contenido real que aportan. Por ello se han desarrollado un número de programas que impiden que los banners aparezcan en los sitios webs e incluso que lleguen a descargarse. Las herramientas de bloqueo filtran el flujo de datos permitiendo que los contenidos interesantes pasen, y bloqueando la publicidad no solicitada. Esto funciona porque el navegador primero obtiene la página solicitada del sitio web. El software inteligente comprueba la página en busca de imágenes publicitarias y elimina las partes ofensivas del fichero HTML. Sólo así el navegador obtiene los elementos para mostrar en la página.

58

Número 02

Hay varias alternativas. Algunos navegadores tienen una característica integrada o usan un plug-in. Los programas filtros que se ejecutan como servidores proxy independientemente del navegador, pero en la misma máquina, son otra alternativa. Incluso se pueden ejecutar en una máquina distinta si hiciera falta, proporcionando un servicio de proxy a los ordenadores de la red de casa o de la oficina.

Integrados en el Navegador Los usuarios de Mozilla tienen un opción sencilla. El navegador de Mozilla cuenta con un plug-in que bloquea la publicidad. La herramienta, apropiadamente llamada, AdBlock filtra la URL. Es fácil

de instalar: Tan solo hay que hacer clic en el enlace de la página principal del proyecto [1]. No hacen falta privilegios de administrador para instalarlo, ya que AdBlock se instala en el directorio home del usuario en ~/.mozilla. Hace falta reiniciar el navegador para activar el plug-in. El menú del plug-in está disponible en la sección AdBlock bajo Tools. Si se añade el patrón mostrado en la Figura 2, el plug-in bloqueará un número impresionante de anuncios. El mismo menú permite ver los elementos en la página actual. Si se descubre un anuncio no solicitado, se puede usar su URL para crear una nueva regla de filtro. Incluso se le puede hacer clic con el botón derecho del ratón y seleccionar Adblock Image en el menú desplegable para acceder a las mismas características. Siguiendo estos pasos aparece una ventana mostrando la dirección de la imagen. Se puede usar un comodín (*) que modifique la URL para que encaje con direcciones similares. Suponiendo que la URL siguiente sea la mostrada: http://img-cdn.mediaplex.com/U ads/2399/9556/DE_DE_mofg_dimU 4600_dhs_q1w0304_300x200_15k_U FL_gif.gif

Figura 1: Una página Web repleta de anuncios dificulta la visión del contenido real.

www.linuxmagazine.com.es

Se puede quitar la sección que aparece detrás del nombre del servidor y el direc-


Bloqueo Banners

ADMINISTRACIÓN

Figura 2: Usando el menú de Mozilla para config-

Figura 3: Se puede inspeccionar el código HTML para localizar las direcciones de los anuncios. Muchos

urar AdBlock.

sitios webs usan ‘ad’ como parte de sus nombres.

torio ads y colocar un asterisco como comodín:

página, sino que son proporcionados por terceros que se encargan de la publicidad y son invocados por el proveedor de contenidos. Para usar esta característica mientras se navega, hay que pulsar el botón derecho del ratón en el anuncio y seleccionar Block images from server. Nótese que este método podría volverse contra usted, ya que impide que se pueda descargar cualquier imagen que no esté almacenada directamente en el servidor original. Además, este método no bloqueará los anuncios contenidos en el mismo sitio web. El plug-in AdBlock es mucho más eficaz. Si con todo, no está satisfecho aún, podría usar un proxy que es más potente y flexible, y además funciona con cualquier navegador como Opera o Konqueror.

http://img-cdn.mediaplex.com/U ads/*

Esta línea le dice al plug-in que bloquee cualquier fichero del directorio ads en el servidor Mediaplex. Ahora si se pulsa el botón Reload, el anuncio desaparece una vez recargada la página. Usando el menú anteriormente mencionado, es probable que se encuentren otros candidatos o bien inspeccionando el código fuente del fichero HTML (Véase la Figura 3). Los usuarios que usen el navegador Firefox de Mozilla estarán encantados al escuchar que el plug-in también funciona en este navegador. Algunos anuncios se pueden bloquear sin el plug-in. La manera más fácil de hacerlo es activando la opción Load Images | For the originating Web site only en Options | Web Features. Esto funciona bastante bien, porque la mayoría de los banners de anuncios no están almacenados en el mismo servidor Web que la

Saboreando Java Muffin es uno de dichos proxy. Se coloca entre el servidor Web y el navegador. Como es un paquete Jar, Muffin puede ser ejecutado directamente con Java y no necesita ser compilado ni instalado. Tan sólo hace falta el JRE (Java Runtime

Enviroment), pero la mayoría de las distribuciones lo instala por defecto. Cuando se descargue desde [2], hay que asegurarse de que se pulsa el enlace con el botón derecho del ratón en el archivo Jar y se selecciona Save link to disk. De lo contrario el navegador podría ejecutar el fichero Jar directamente. Si el programa java no está en el path, añádase el directorio donde esté ubicado el programa, por ejemplo: export PATH=$PATH:/usr/javaU /j2sdk1.4.2/bin

Ahora ya se puede ejecutar Muffin tecleando java -jar muffin-0.9.3a.jar (Véase la Figura 4). Muffin usa el filtro NoThanks por defecto. El filtro aplica unas reglas sencillas para bloquear los banners de publicidad. El proxy incluye unos filtros extras que no están activos por defecto, como son AnimationKiller para eliminar los gifs animados y Cookiemonster que se encarga de las Cookies. El filtro NoThanks no funciona directamente. Necesita cargar primero

Glosario Servidores Proxy: (o simplemente proxies) residen entre un cliente (p.e. un navegador Web) y un servidor.Visto desde la perspectiva del cliente, el proxy es un servidor y desde el punto de vista del servidor, el proxy es un cliente. Los proxies tienen una caché de los sitios web visitados para mejorar la velocidad. En algunos casos, son utilizados para que los clientes puedan acceder a Internet sin necesitar una conexión directa. URL: Uniform Resource Locator engloba un acrónimo del servicio (http, ftp,…), la dirección de un servidor de Internet y opcionalmente un nombre de directorio y fichero. Permitiendo que los documentos de Internet sean identificado de forma unívoca, por

ejemplo, http://www.linux-magazine.com.es/issue/02. Cookies: Pequeños trozos de información basados en texto que los navegadores asocian a los sitios webs. Los proveedores de contenidos usan las cookies para almacenar información específica de ese usuario sobre el comportamiento de la navegación por Internet entre dos visitas al sitio web (“¿Cuándo fue la última vez que visitó la página?”). Comodines: La mayoría de los programas Linux (como la shell) usan caracteres especiales para representar una o más letras. Por ejemplo, el asterisco (*) representa típicamente una cadena arbitraria, aunque puede

significar cualquier número de repeticiones de cierto carácter (en las expresiones regulares). Cuando se teclea ls *.jpg, la shell mostrará todos los nombres de ficheros con el sufijo .jpg, sin importar por qué letras empiece el nombre del fichero. Puerto: Como múltiples programas servidores se pueden ejecutar en una misma máquina, una combinación formada por el número de puerto y la dirección IP identifican de forma unívoca una conexión. El estándar de Internet asigna a ciertos servicios específicos unos puertos determinados llamados “well-known ports”, por ejemplo, el puerto 80 está asignado a la World Wide Web (HTTP) y el puerto 25 al email (SMTP).

www.linuxmagazine.com.es

Número 02

59


ADMINISTRACIÓN

Bloqueo Banners

un fichero de configuración, llamado killfile. Existe un ejemplo de killfile disponible en el sitio web de Muffin en la sección Samples. Para cargar el fichero, hay que seleccionar la entrada para el filtro NoThanks en Enabled Filters bajo Preferences. En el cuadro de diálogo que aparece, hay que seleccionar Browse en Kill File y localizar el killfile en el directorio de Muffin. Púlsese Apply y luego Load para indicarle a Muffin que use el killfile. El botón Save almacena esta configuración de forma permanente, y es una buena idea, a menos que se quiera repetir este proceso cada vez que se lance Muffin. El programa filtro crea un directorio y lo usa para guardar la configuración y el fichero de log. Para que esto funcione, hace falta modificar las opciones del navegador, añadiendo la herramienta nueva como un proxy. Esto se aplica a cualquier herramienta de proxy que se necesite usar. Si se tiene el navegador Mozilla, abrir las opciones (Edit | Preferences) y pulsar el triángulo pequeño titulado Advanced. Búscar la opción Proxies. Así es como se activa la configuración manual y poner los valores correctos en HTTP Proxy y Port. El primer campo típicamente contiene localhost. Poner el número de puerto del proxy en el segundo campo (Véase la Tabla 1). Opera tiene una configuración similar en Network | Proxy Servers. Firefox usa Tools | Options y finalmente Connection Settings.

Filtros con Historia Este software se basa en una herramienta clásica, Junkbuster [3]. Privoxy [4] está aún en desarrollo, al contrario que los otros programas comentados en este artículo. La página web de Privoxy tiene paquetes para distintas distribuciones. Por defecto, el paquete tiene que ser instalado de forma global usando la cuenta del administrador.

Figura 4: El programa basado en Java Muffin tiene su propio GUI e indica que fichero está procesando.

En Red Hat, el sistema operativo lanza el filtro en el arranque del sistema, junto con los otros programas de servidor. Se puede hacer de forma manual usando /etc/rc.d/init.d/privoxy start. Los ficheros de configuración se encuentran en /etc/privoxy, el fichero de configuración principal es /etc/privoxy/config. Hay que usar este fichero para especificar opciones más detalladas, pero Privoxy realizará un buen filtrado con los valores por defecto. Una vez establecido el puerto del proxy como 8118 en el navegador de Internet, como se describió anteriormente, Privoxy empezará a filtrar los anuncios de las páginas Web que se visiten. El software tiene una característica especial para colocar unas etiquetas en los lugares donde ha quitado los anuncios y puede mostrar la imagen filtrada y la regla de filtrado que ha usado. Esta opción permite comprobar que la herramienta está quitando realmente los anuncios o si está eliminando también imágenes que realmente se desean ver. Incluso se puede configurar Privoxy directamente desde el navegador accediendo a una dirección especial http://p.p.

Limpia, Fija y da Esplendor A los usuarios domésticos les podría gustar probar Webwasher [5], una herramienta gratuita de la empresa Webwasher. Esta versión está restringida a dos usuarios o a un máximo de 20

conexiones simultáneas. La versión comercial tiene filtros especiales para Javascript que no están disponibles en la versión gratuita. Webwasher necesita de privilegios de administrador para ser instalado y no es trabajo fácil. Webwasher suministra dos formatos de paquete, un RPM o un archivo tar comprimido, que contiene un script de instalación. El software se ejecuta directamente sin habérselo indicado y empieza a escuchar el puerto 9090 a la espera de peticiones. Los ficheros de configuración se encuentran en /etc/wwasher y los ficheros de log en /var/log/wwasher. El sistema de log está desactivado por defecto, pero puede ser activado usando una interfaz basada en Web, a la que se puede acceder por medio de una dirección especial, http://-web.washer-/. El nombre del usuario por defecto es admin y la contraseña es webwasher.

Malcriados La elección de la herramienta de filtrado es una cuestión de gusto. Si no le gusta Java, no le gustará Muffin. Si se insiste en software libre, se puede descartar Webwasher. Los usuarios de Mozilla y Firefox pueden usar AdBlock, aunque no es tan potente como los otros filtros. Privoxy es una herramienta madura que está bajo desarrollo y está disponible como un paquete para distintas distribuciones. No es difícil instalar ninguno de ■ los programas mencionados.

RECURSOS [1] AdBlock: http://adblock.mozdev.org [2] Muffin: http://muffin.doit.org [3] Junkbuster: http://internet.junkbuster. com/ [4] Privoxy: http://www.privoxy.org [5] Webwasher: http://www.webwasher. com/client/download/private_use/linux

Tabla1: Filtros Web AdBlock

Muffin

Privoxy

Webwasher

Posibilidad de instalación sin ser administrador

no

Proxy

no

Puerto estándar

-

51966

8118

9090

En desarrollo

no

Preconfigurado

o

no

Licencia

gratis

gratis

gratis

Restringida, gratis para uso privado

60

Número 02

www.linuxmagazine.com.es


Sleuthkit

ADMINISTRACIÓN

Sleuthkit, la herramienta forense digital

La Huella Sleuthkit realiza análisis forenses en archivos del sistema de Microsoft y Unix aplicando sus habilidades como detective desde la línea de comandos para identificar evidencias, recuperar archivos borrados o reconstruir escenarios. Todo esto es esencial en el arte del trabajo de los forenses digitales. En este incipiente campo es mejor prepararse y practicar para los problemas que nos acecharán en el futuro. POR RALF SPENNEBERG

L

os cortafuegos y los sistemas de detección de intrusión (IDS) alertan a los administradores y proporcionan protección contra la mayoría de los ataques. Pero los intrusos siguen encontrando agujeros y atacando máquinas. El administrador entonces debe actuar como un forense realizando pruebas en el sistema aún vivo (encendido) o ya muerto (apagado) para salvar evidencias vitales. Herramientas como TCT, la clásica utilidad forense (el paquete de herramientas Coroner [4] o el más nuevo Sleuthkit [1], objeto de este artículo), ayudan a resolver estos problemas. Tras una intrusión, hay una serie de difíciles preguntas que responder como: • ¿Cómo ocurrió la intrusión? • ¿Qué provoco que el cortafuegos no parase el ataque? • ¿Por qué el IDS no detectó el ataque (hasta que fue demasiado tarde)? • ¿Qué sistemas han sido afectados?

¿Ha sido modificada alguna información almacenada en los sistemas modificada? ¿Cuál? • ¿Qué pretendía el intruso? Habitualmente es posible responder a estas preguntas tras examinar los protocolos del cortafuegos y del IDS… si previamente el administrador ha implementado un sistema de seguridad y acceso adecuado. Pero la monitorización integral de sistemas y redes normalmente va en contra de las políticas de protección de datos personales. El análisis forense de los sistemas afectados tras el evento es la única forma de obtener evidencias claras. Los procedimientos exactos son complicados y dependen de numerosos factores. Si estamos buscando una introducción completa en la materia hay unos pocos de documentos (algunos disponibles en la Red) que pueden ayudar [5]. El propósito de cualquier investigación forense es averiguar los eventos y la secuencia en la que sucedieron: la serie de actividades que llevaron a la ocurrencia y cualquier

acción que el intruso ejecutara en la máquina de la víctima. Si los resultados van ha ser usado posteriormente como evidencias hay requerimientos de cara a documentación ambigua de los pasos individuales de la investigación.

Dispositivo de circuito cerrado mejorado Una vez que el controlador de circuito cerrado mejorado y el comando losetup modificado han sido instalados hemos creados los dispositivos adecuados usando el comando createdev. Ahora simplemente podemos montar la imagen de una disco duro completo usando los siguientes comandos: # losetup -r /dev/loopa host_U hda.dd # fdisk -l /dev/loopa Ahora podemos acceder a las particiones individuales usando /dev/loopa1,/dev/loopa2, etc. Puesto que la opción -r establece el dispositivo de circuito cerrado como solo lectura, incluso los sistemas de archivos de publicación no pueden escribir.

www.linuxmagazine.com.es

Número 02

61


ADMINISTRACIÓN

Sleuthkit

TCT y Sleuthkit El primer paquete de herramientas para el análisis forense de sistemas UNIX fue escrito por Wietse Venema y Dan Farmer en 1999 [5]. El paquete Coroner (TCT) es una colección de comandos que los administradores pueden usar para realizar tareas forenses tras un incidente en ordenadores UNIX.Wietse Venema aún mantiene este paquete de herramientas y ofrece regularmente actualizaciones en su página Web [4].TCT puede analizar los siguientes sistemas operativos: Sun Solaris, SunOS, Linux, FreeBSD, OpenBSD y BSD/OS. Brian Carrier de Atstake (típicamente dele-

Ejecutar los pasos individuales de la investigación en un orden determinado asegurará que los resultados son reproducibles: “Asegurar y aislar la escena. Grabar la escena, proseguir con una búsqueda sistemática de evidencias”. [6]

Asegurar y Aislar. El primer paso en el análisis forense es un asunto muy controvertido. La mayoría de expertos recomiendan desconectar el sistema de la red activa inmediatamente. Esto previene que el intruso se de cuenta del análisis y borre sus pasos. Algunos expertos no están de acuerdo con esto. El intruso puede haber instalado un código oculto que automáticamente borra el sistema si este es desconectado de la red. Es difícil hacer una recomendación general, pero yo suelo recomendar y usar el primer método.

Grabando el escenario Analizamos un ordenador comprometido, el experto forense primero debe procurar salvar la información volátil antes de proceder a salvar la no-volátil. Las siguientes son volátiles: • Memoria principal. • Mensajes del Kernel.

Figura 1: Cuando el IDS anuncia un intruso (en este caso Short está usando Win-Popup para alertar una explotación IMAP) es tarea del administrador el iniciar los procedimientos de respuesta ante incidentes. Sleuthkit nos puede ayudar a analizar los sistemas de archivos.

62

Número 02

treado @stake [3]) comenzó añadiendo herramientas adicionales a TCT al principio, lanzando estos como utilidades de TCT. Estas utilidades ofrecen una serie de funciones de sistemas de archivos añadidos a los que aparecen en TCT. Analizando sistemas de archivos no UNIX. Al principio del 2002 Brian Carrier implementó el soporte a FAT y NFTS para proporcionar capacidad analítica a sistemas de archivos adicionales. También trabajo en los códigos fuente de TCT, lo que fue razón suficiente para cambiar el nombre a TASK,

• Fecha y hora. • Procesos activos. • Archivos abiertos. • Configuración de red. • Conexiones de red. Esta información se pierde cuando el sistema es apagado, pero puede ser extremadamente útil. Típicamente solo necesitamos comandos de Linux normales para asegurar estos datos, y el comando grave-robber de tct es muy útil. El comando no es parte de Sleuthkit. Es importante usar programas de fuentes muy fiables cuando aseguramos una evidencia. Por ejemplo, comandos compilados estáticamente en un CD o en un disquete protegido contra escritura. Los datos no-volátiles es lo siguiente. Estos significa los archivos del sistema y la memoria intercambio. Adicionalmente debemos grabar cualquier documento cercano y la apariencia general del sistema. Una cámara puede ser muy útil por motivos de documentación.

Simple Copia de Seguridad Una simple copia de seguridad del sistema no es suficiente. La copia de los archivos del sistema deben ser idénticos a los originales, y podemos perder archivos borrados por el intruso. La copia de seguridad debe incluir espacio de sobra. La herramienta dd de UNIX puede ejecutar esta tarea. La versión Windows está disponible en [7]. EL administrador debe usar dd para hacer copias de seguridad del disco duro completo y no solo de particiones individuales. Al hacerlo es importante no almacenar ningún dato en el disco original. En su lugar debemos usar un disco externo usando la herramienta Netcat, su

www.linuxmagazine.com.es

The Atstake Sleuth Kit. Brian lanzó adicionalmente el visor Autopsy Forensic. Al margen de su nombre es un visor Web que los administradores pueden encontrar útil como un interfaz GUI para comandos TASK. En abril del 2003 Brian Carrier cambió de nuevo el nombre del proyecto a “The Sleuthkit” para marcar el lanzamiento de la versión actual, la 1.61. Esto enfatiza la naturaleza Código Abierto del proyecto y su independencia de la corporación Atstake. Los archivos del proyecto están disponible en Sourceforge [1,2].

homólogo criptográfico Crytcat o un túnel SSU para transferir los datos al sistema forense en el que comprobaremos y analizaremos los datos.

Migrando datos El Netcat debe estar a la escucha en la máquina de destino si usamos Netcat para transferir el contenido del disco: nc -l -p 3000 > host_hda.dd

Y entonces pasamos los datos del disco duro desde el sistema que tenemos que copiar hasta Netcat: dd if=/dev/hda | nc Server 3000

Los investigadores forenses saben muy bien que deben calcular la suma de control del disco imagen inmediata-

Listado 1: Particiones para el primer ejemplo. 01 Disk /dev/hda: 0 heads, 0 sectors, 0 cylinders 02 Units = sectors of 1 * 512 bytes 03 Device Boot Start End Blocks Id System 04 /dev/hda1 63 15119999 7559968+ 83 Linux 05 /dev/hda2 15120000 80408159 32644080 5 Extended 06 /dev/hda5 15120063 16178399 529168+ 82 Linux swap 07 /dev/hda6 16178463 24373439 4097488+ 83 Linux 08 /dev/hda7 24373503 32568479 4097488+ 83 Linux 09 /dev/hda8 32568543 80408159 23919808+ 83 Linux


Sleuthkit

mente después de la copia. Esta suma proporciona después evidencia de que la copia de seguridad no ha sido manipulada. md5sum host_hda.dd

La siguiente tarea es dividir el disco duro en particiones puesto que Sleuthkit solo puede manejar particiones. El comando fdisk -lu host_hda.dd lista las particiones (ver listado 1). Podemos usar de nuevo dd para extraer particiones individuales. Para hacer esto necesitamos calcular el tamaño de estas usando los cilindros del inicio y del final. En el caso de hdal esto supone 15 119 999 - 63 + 1 = 15 119 937. ddpuede entonces usar esta información para guardar la primera partición en un archivo propio: dd if=host_hda.dd of=host_hda1U .dd bs=512 skip=63 count=U 15119937

Si estos pasos parecen muy complicados podemos hacer copia de seguridad de las particiones individuales, pero esto supone correr el riesgo de perder información necesaria para el análisis forense si ésta está almacenada en áreas no particionadas. El controlador mejorado de circuito cerrado [8], que es capaz de acceder al disco duro completo como un dispositivo de circuito cerrado, es más práctico que la separación manual de imágenes individuales del disco.

Búsqueda Sistemática Tras guardar los archivos del sistema del equipo comprometido, crearemos las sumas de comprobación y almacenaremos una copia en un lugar seguro, el investigador puede proceder a analizar una copia de los archivos del sistema dejando el original como una evidencia no tocada. Sleuthkit proporciona una serie de comandos para este paso. Veremos algunas de las más importantes herramientas en las siguientes secciones.

ADMINISTRACIÓN

La segunda parte de esta serie describe unas sencillas investigaciones usando Autopsy. Su instalación es extremadamente sencilla: descargamos el paquete desde su página Web, lo extraemos y ejecutamos make. Esto sitúa las herramientas en el subdirectorio bin/. El visualizador forense Autopsy es muy fácil de compilar, sin embargo, puede que prefiramos usar los paquetes RPM. Las herramientas Sleuthkit están divididas en 4 categorías. La primera muestra información de sistemas de archivos completos y solo contiene el comando fsstat. El segundo grupo comienza por d y nos permite acceder a los datos almacenados en archivos como: dcalc, dcat, dls, and dstat. Sleuthkit nos proporciona las siguientes herramientas para información meta almacenada en ínodos: icat, ifind, ils, and istat. Los comandos en el 4º grupo comienzan con f y están diseñados para tareas de nivel de

Despertando de la Muerte Restaurar archivos borrados no es para nada una tarea trivial en sistemas de archivos UNIX. No conozco ningún comando unerase para restaurar datos sin peligro de pérdidas independiente del sistema operativo UNIX que usemos. Por tanto ese esencial disponer de algunos conocimientos previos de cómo guarda y borra datos el sistema de archivos para usar herramientas como TCT o Sleuthkit y para afrontar los incidentes que puedan surgir al restaurar archivos borrados. El segundo sistema de archivos extendidos (EXT 2) es un útil ejemplo de un ínodo heredado basado en sistemas de archivos UNIX. Cada archivo se representa por una estructura especial, su ínodo. El ínodo almacena la información meta que pertenece al archivo. Adicionalmente, se requieren los bloques de datos para almacenar el payload. Los directorios son simple archivos especiales que de nuevo comprometen el ínodo. Sus bloques de datos almacenan las listas de directorio que contienen nombres de archivos y enlaces a los ínodos apropiados. El ínodo en EXT2 Los ínodos almacenan la información meta para un archivo excepto su nombre. Esto incluye su tamaño, tipo, permisos, propi-

etario y grupo, el contador de referencia y 3 sellos de tiempo UNIX (ctime,atime y mtime). El ínodo también contiene 12 referencias directas a bloques de datos que son las direcciones de los primeros 12 bloques de datos en el archivo. Los ínodos usan adicionalmente referencias indirectas, apuntando la primera a un bloque de datos que contiene referencias directas a bloques de datos. Las 2 últimas referencias apuntan a un bloque indirecto doble o triple (ver figura 2). Cuando el sistema de archivos borra un archivo simplemente marca el acceso del directorio y el ínodo como borrado y libera el espacio ocupado por el ínodo y los bloques

de datos. Las referencias a los bloques de datos y el enlace entre el nombre del archivo y el ínodo tiende a no cambiar. Por tanto es posible usar herramientas como ils para mostrar ínodos borrados e icat para restaurar los contenidos de los archivos. No obstante esto solo funciona si el sistema de archivos no ha reasignado el ínodo o los bloques de datos a otro archivo. El comando fls muestra los nombres de los archivos borrados. Las implementaciones modernas borran más.

Muchas distribuciones modernas de Linux borran archivos de una forma que previenen de forma efectiva que sean restauradas. Desafortunadamente esta opción de seguridad tiende a impedir el análisis forense con herramientas como ils y icat. En este caso, el administrador que realice la investigación se ve forzado normalmente a restaurar usando el comando Sleuthkit dls, que lee el espacio descuidado del disco duro. El investigador puede entonces usar grep o la herramienta sorter para investigar los resultados. Autopsy es un Figura 2: El ínodo (izquierda) guarda la información meta para un archivo. interfaz elegante que ayuda con Referencia los bloques de datos con los contenidos del archivo. Los estas investigaciones más comarchivos más grandes pueden requerir el uso de referencias indirectas. plejas.

www.linuxmagazine.com.es

Número 02

63


ADMINISTRACIÓN

Sleuthkit

copias de seguridad. Nuestro ejemplo usa el sistema de archivos Forensic Challenge. 01 class|host|device|start_time Esta competición fue organiza02 ils|kermit.spenneberg.de|honeypot.hda5.dd|1052056153 da por el proyecto Honeynet en 03 st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime|st_dtime|st_mode|st enero del 2001. Un archivo tar 04 _nlink|st_size|st_block0|st_block1 que contiene datos está 05 1|a|0|0|973385737|973385737|973385737|0|0|0|0|0|0 disponible para ser descargado 06 1890|f|17275|20|973695367|973695367|973695367|973695367|40755|0|0|6172|0 desde varios sitios [9]. Puesto 07 1891|f|17275|20|846630170|973695173|973695367|973695367|100644|0|1082|6173|0 que las particiones han sido 08 1892|f|17275|20|973695367|973695367|973695367|973695367|40755|0|0|6174|0 separadas previamente no 09 1893|f|17275|20|846630171|973695173|973695367|973695367|100644|0|1458|6175|0 podemos usar estos archivos 10 1894|f|17275|20|846630171|973695173|973695367|973695367|100644|0|1362|6176|0 para ilustrar los primeros pasos 11 2243|f|17275|20|846630171|973695173|973695367|973695367|100644|0|1465|6177|0 de la copia de seguridad del disco duro. la información hacia la que las heTras la descarga, el forense novato archivos como la creación de listas y rramientas están orientadas y mostrando debe extraer los datos y verificar la suma búsqueda de archivos. sus limitaciones. de comprobación. Esta última está locaEl comando mactime muestra los EXT2 y EXT3 pueden producir algunos lizado en el archivo readme. El siguiente eventos cronológicamente en un sisefectos secundarios desagradables en comando extrae la suma MD5 y las veritemas. Los comandos file y sorter clasifialgunas distribuciones modernas. fica con las imágenes individuales: can los archivos en la imagen del disco Dependiendo de los parchas aplicados, duro por tipo. # tail +12 readme | headU estos archivos de sistema pueden borrar Archivos de Sistema -6 | md5sum -c la referencia a los bloques de datos del Soportados honeypot.hda1.dd: Ok ínodo y esto impide a herramientas senhoneypot.hda5.dd: Ok cillas como icat restaurar el contenido de Sleuthkit analiza los tipos de archivos en honeypot.hda6.dd: Ok un ínodo borrado. el sistema mostrados en la tabla 1. honeypot.hda7.dd: Ok desafortunadamente no soporta archivos Sugerencias Prácticas: honeypot.hda8.dd: Ok de sistema típicos de Linux como Reiser Reanimación. honeypot.hda9.dd: Ok FS, JFS o XFS. El cuadro “Despertando Ahora es momento de analizar las imáde la Muerte” describe como funcionan La función de las particiones indivigenes del disco duro de las que hicimos los archivos del sistema UNIX, indicando duales se proporciona para suplementar la investigación (ver tabla 2). Listado 3: Descubriendo Datos Interesantes Montaremos las particiones como solo lectura usando el dispositivo de circuito 01 # ils -f linux-ext2 -r honeypot.hda5.dd | tail +4 | cerrado que proporciona un vistazo ini02 > awk -F '|' '$11 > 0 {print $1}' | cial. Pero esto puede ser peligroso 03 > while read in; do porque puede modificar los datos. Ver el 04 > icat honeypot.hda5.dd $in > data/hda5.icat/$in cuadro “Solo lectura, escritura a veces”. 05 > done Los comandos Sleuthkit proporcionan 06 # file data/hda5.icat/* | egrep "tar|gzip|RPM|ELF" un vistazo más profundo. Los archivos 07 data/hda5.icat/109791: GNU tar archive borrados son el primer punto de interés 08 data/hda5.icat/109861: GNU tar archive (si el atacante ha intentado borrar sus 09 data/hda5.icat/109865: RPM v3 bin i386 nfs-utils-0.1.9.1-1 huellas) este es normalmente el mejor 10 data/hda5.icat/109866: RPM v3 bin i386 wu-ftpd-2.6.0-14.6x camino para descubrirlos. 11 data/hda5.icat/109943: ELF 32-bit LSB relocatable, Intel 80386,

Listado 2: Archivos Borrados

version 12 1 (SYSV), not stripped 13 data/hda5.icat/109944: ELF 32-bit LSB relocatable, Intel 80386, version 14 1 (SYSV), not stripped 15 # tar tf data/hda5.icat/109791 16 ssh-1.2.27/ 17 ssh-1.2.27/COPYING 18 ssh-1.2.27/README 19 ssh-1.2.27/README.SECURID 20 [...]

64

Número 02

www.linuxmagazine.com.es

Ínodos de archivos borrados El comando ils muestra información ínodo de un archivo del sistema; el parámetro -r indica al parámetro que se concentre en ínodos borrados (por defecto). El listado 2 muestra los resultados para ils -f linux-ext2 -r honeypot.hda5.dd El resultado esta en formato de tabla, conteniendo la línea 1 la cabecera y la línea 2 los datos correspondientes. Evidentemente el comando se ejecutó en


Sleuthkit

ADMINISTRACIÓN

Solo lectura, Escritura a Veces Cuando realicemos análisis forenses es normalmente útil montar las particiones del disco duro para buscar archivos. Esto es particulamente cierto para Reiser FS, puesto que Sleuthkit no soporta el sistema de archivos de Reiser. Para garantizar la integridad de los datos, los investigadores deben generar sumas e comprobación para todos los sistemas de archivo y montarlas como solo lectura. Desafortunadamente, el modo solo lectura no siempre se puede considerar como válido: los sistemas de no publicación realmente no cambian nada si son montados como solo lectura. Sin embargo, los sistemas de archivos de publicación como EXT3 o reiser FS tienden a actualizar la evento de la publicación de opciones montadas como de solo

el puesto kermit spenneberg.de para un archivo llamado honeypot hda5.dd . Las cosas comienzan a ser más interesantes en la línea 3. Ésta es la segunda cabecera de la tabla y se utiliza para cualquier línea restante. La primera columna, st_ino contiene el número ínodo, y la segunda columna (st_alloc) indica si el ínodo esta libre (f) u ocupado (a). Hay muchos caminos para descubrir archivos interesantes. El primer camino supone cualquier archivo con tamaño superior a cero (columna 11, st_size). Estos archivos se investigan usando el comando file con el objeto de catalogar el contenido del archivo. Para hacer esto la herramienta accede a una gran base de datos que contiene casi todos los formatos de archivos conocidos (magic*). La versión Sleuthlit de file no es diferente de la versión incluida con muchas distribuciones, si bien la base de datos puede ser mayor.

Archivos Interesantes El listado 3 muestra las sintaxis posibles. La línea 1 quita las primeras 4 líneas de la información ínodo del comando ils y pasa el resto al comando awk (línea 2). Esto encuentra cualquier ínodo con tamaño superior a cero y pasa su número al comando icat. Este último extrae los archivos de la imagen y los guarda en un subdirectorio llamado data/hda5.icat/ usando como nombre del archivo el número del ínodo. El comando filees entonces usado para garantizar el tipo de archivo y grep filtra los archivos interesantes (línea 7). La

lectura. Por supuesto, esto cambia la suma de comprobación MD5. hay una simple prueba para esto: necesitaremos una imagen de prueba y su suma de comprobación para el ensayo: # dd if=/dev/zero of=/tmp/testimage.origU bs=1024k count=50 # losetup /dev/loop0 /tmp/testimage.orig # mkreiserfs /dev/loop0 # md5sum /tmp/testimage.orig 2ceed9e819bf4348a33a21f7697149c8U /tmp/testimage.orig Tras montar en solo lectura e inmediatamente desmontar, la suma MD5 ha cambia-

do: # mount -o ro -t reiserfs /dev/loop0 /mnt umount /mnt # md5sum /tmp/testimage.orig c6ffc8a13a6821cd327d1db9ee351fafU /tmp/testimage.orig Solo hay 3 formas de evitar esto: • Modificar los controladores EXT3 o Reiser FS. • Salvar el sistema de archivos en un CDROM. • Usar el controlador mejorado de circuito cerrado [8].

Listado 4: Sumario de Mactime 01 ed Nov 08 2000 14:51:53 17969 .a. -/-rwxr-xr-x 1010 100 109832 /usr/man/.Ci/scan/x/x 02 1760 .a. -/-rwxr-xr-x 1010 100 109829 /usr/man/.Ci/scan/bind/ibind.sh 03 15092 .a. -/-rwxr-xr-x 1010 100 109836 /usr/man/.Ci/scan/x/pscan 04 4096 .a. d/drwxr-xr-x 1010 100 109841 /usr/man/.Ci/scan/port/strobe 05 1259 .a. -/-rwxr-xr-x 1010 100 109834 /usr/man/.Ci/scan/x/xfil 06 4096 .a. d/drwxr-xr-x 1010 100 109831 /usr/man/.Ci/scan/x 07 [...] 08 Wed Nov 08 2000 14:52:09 9 m.c l/lrwxrwxrwx 0 0 46636 /root/.bash_history -> /dev/null 09 9 m.c l/lrwxrwxrwx 0 0 23 /.bash_history -> /dev/null

investigación en el primer archivo tar (línea 15) muestra que hemos descubierto SSH Versión 1.27.

Diario de Abordo

familiar comando ils, este implica usar fls. Este comando recoge información de cualquier archivo que aún existe en el sistema de archivos. La opción-m crea un resultado que luego es procesado por el comando mactime. También se muestra el punto de montaje. Se require el parámetro -m para lis, no para el punto de montaje. El archivo utilizado para recoger la mayoría de los datos se llama body por

El segundo método para analizar archivos borrados implica que el investigador forense cree primero un diario cronológico de las operaciones de los archivos en el sistema. El diario cubrirá cualquier archivo en lugar de solo Tabla 1: Sistemas archivos borrados. Sistema de Archivos También tiene senBSDi FFS tido cubrir todos FAT Filesystem FAT12 los archivos del FAT Filesystem FAT16 sistema en el FAT Filesystem FAT32 análisis. FreeBSD FFS El administrador Linux Filesystem EXT2 primero recoge Linux Filesystem EXT3 datos de los NTFS archivos del sisOpenBSD FFS tema (ver figura 3). Solaris FFS Al igual que el

de archivos en Sleuthkit

www.linuxmagazine.com.es

Opción de Línea de Comandos bsdi fat12 fat16 fat32 freebsd linux-ext2 linux-ext3 ntfs openbsd solaris

Número 02

65


ADMINISTRACIÓN

Sleuthkit

en la tercera columna. Una a indica acceso al archivo y una c indica que ha sido modificada información meta (permisos, propietarios, …). Podemos ver donde se han llamado a los compiFigura 3: Para analizar el orden de las modificaciones de múltiples ladores y librerías asociasistemas de archivos el investigador necesita cotejar la informadas, lo que nos permite ción del archivo y del ínodo en el archivo body. reconstruir los pasos del atacante. motivos históricos. Ejecutar mactime para Hay una contrapartida a este camino. este archivo genera un diario de abordo de Si el atacante ha modificado el archivo modificaciones del sistema de archivos. más de una vez el ínodo solo salvará la Podemos restringir el resultado al punto fecha de la última modificación. La heen el que estemos interesados. En nuestro rramienta mactime solo mostrará la últiejemplo cogido de Forensic Challenge ma modificación. podemos suponer que el ataque se produGUI al rescate jo el 7 de noviembre de 2000. Los comandos Sleuthkit pueden ser Monitorización del Tiempo muy difíciles de usar y eso hace compliConsistente cado prestar atención a los resultados. Para proveer monitorización del tiempo La búsqueda de códigos específicos en constante debemos usar el parámetro -z todos los sistemas de archivos y para especificar la zona horaria usada analizar los contenidos de archivos bopor el sistema que crea los datos. En este rrado puede ser tedioso y requerir caso usamos CTS (horario central estánmucha programación. dar - GMT-0600). El resultado muestra En estas circunstancias, GUI puede ser actividades no usuales a las 14:51 el 8 de muy útil cuando realizamos análisis noviembre (ver listado 4). El directorio forenses. Proporciona una capa abstracta /usr/man/.Ci/ no debería estar allí en para los comandos y presenta solo los realidad. resultados, lo que significa que los invesLos archivos que contienen cambios tigadores forenses no necesitan consultar también son de interés. Estos archivos las páginas principales para obtener son fácilmente reconocibles por la m resultados.

RECURSOS [1] Sleuthkit: http://www.sleuthkit.org [2] Autopsy Forensic Browser: http://autopsy. sf.net [3] Atstake: http://www.atstake.com [4] The Coroner’s Toolkit: http://www. porcupine.org/forensics/tct.html [5] Dan Farmer and Wietse Venema,“Computer Forensic Analysis”: http://www.porcupine.org/forensics/ [6] Richard E.Saferstein,“Criminalistics: An Introduction to Forensic Science”,Prentice Hall [7] dd for Windows - Unx-Utils: http:// unxutils.sf.net/ [8] Enhanced Loopback: ftp://ftp.hq.nasa. gov/pub/ig/ccd/enhanced_loopback/ [9] Forensic Challenge files: http://project. honeynet.org/challenge/images.html

El visor forense Autopsy (ver figura 4) proporciona un GUI de este tipo. También permite al investigador documentar y comentar los datos y resultados. Bajo algunas circunstancias puede tener sentido o ser necesario usar la línea de comandos, pero los investigadores serán capaces de realizar los pasos más importantes dentro del GUI. La segunda parte de esta serie revisará el visor forense Autopsy Forensic Browser usando los ejemplo de la ■ Forensic Challenge.

Tabla 2: Particiones del Desafío Partición

Sistema de archivos

/dev/hda8

/

/dev/hda1

/boot

/dev/hda6

/home /usr

/dev/hda7

/var

/dev/hda9

swap

EL AUTOR

/dev/hda5

Figura 4: El visor forense Autopsy provee una apariencia Web a Sleuthkit y facilita el análisis de sistemas de archivo.

66

Número 02

www.linuxmagazine.com.es

Ralf Spenneberg es instructor y autor de Unix/Linux. El año pasado vió publicado su primer libro. “Intrusion Detection Systems for Linux Servers” (Sistemas de Detección de Intrusión para Usuarios de Linux). Ralf también ha desarrollado diverso material formativo.


Email Clusters

ADMINISTRACIÓN

Trucos: Clusters para Emails

El Cartero más Rápido Uno de los mayores retos para los administradores es proporcionar servicios básicos de correo electrónico en redes a gran escala. La mayoría de las distribuciones Linux hacen lo mejor posible para reenviar el correo electrónico, pero los administradores pueden hacerlo aún mejor. Instalar un MTA (Mail Transfer Agent) no tiene por qué ser una pesadilla si se toma un poco de tiempo para planear lo que se quiere conseguir. Se pueden usar varios servidores para compartir la carga de diferentes maneras, asegurándose de que el correo siempre se envíe. POR MARC ANDRÉ SELIG

E

s raro que los usuarios de las estaciones de trabajo tengan problemas con el email. Los MUAs (Mail User Agents) tales como Mozilla, KMail o Evolution recogen el correo de su proveedor de servicios de Internet y envían los mensajes nuevos al proveedor. En otras palabras, se comunica directamente con el MTA de su proveedor, tal y como se muestra en la Figura 1. Esta configuración está diseñada para manejar a un único usuario con un único programa. Si el usuario tiene varios clientes, normalmente necesitará configurarlos de forma separada. En el caso de una estación de trabajo que soporte múltiples usuarios, tiene sentido instalar un MTA local. Véase la Figura 2. Sendmail [1] es el MTA por antonomasia, aunque Qmail [2], y Postfix [3] también son populares. El MTA le permite configurar de forma automática los procesos para enviar los emails. Este trabajo típicamente se realiza por el servicio cron, que enviará cualquier salida de sus tareas al root.

Sin Escalabilidad Desafortunadamente, esta configuración tiene limitaciones, incluso en instala-

ciones a pequeña escala con unas 30 o 40 máquinas. Imagínese cada host queriendo enviar sus propios mensajes. Sería casi imposible seguirles la pista. Se tendría que reconfigurar cada host de forma individual si el jefe quisiera ver algunas estadísticas o si se necesitara instalar un servicio de encriptación o un archivo estandarizado. Obviamente, se deseará evitar todo ese trabajo y por el contrario, optar por un sistema de correo centralizado. Además, la tarea de filtrar los paquetes será mucho más fácil si se impide el contacto directo con el mundo exterior a los dispositivos internos de nuestra red.

Los hosts internos simplemente reenvían cualquier mensaje al mismo relay. El Listado 1 muestra la configuración de un smart host para Sendmail en el archivo M4 .../sendmail/cf/cf/sendmail.mc. Al mismo tiempo, esta configuración deshabilita el MSA (Message Submission Agent), que rara vez se necesita, y restringe el servicio a las conexiones locales de SMTP (Simple Mail Transfer Protocol) [5]. La configuración de smart host para Qmail es bastante más simple. Una única línea en /var/qmail/control/smtproutes es todo lo que se necesita:

Permanezcamos Unidos

El servidor SMTP de Qmail se llama desde inetd. Y este es el único sitio donde restringir el servicio al host local, usando TCP Wrapper por ejemplo. Postfix permite incluir ambas configuraciones en /etc/postfix/main.cf:

La mayoría de las instalaciones a gran escala designan uno o más ordenadores como relays o smart hosts (Véase la Figura 3). Estas máquinas aceptan mensajes enviados por los sistemas internos y los reenvían a los buzones, sin importar si el destino final está dentro o fuera de la red local. Se pueden centralizar las tareas avanzadas de email en los smart hosts. Y las estadísticas solicitadas por el jefe se podrán obtener del análisis de los archivos de log de los smart hosts.

:relay.myorg.uk

relayhost = relay.myorg.uk inet_interfaces = 127.0.0.1

Desde luego, se debe asegurar de que el relay central proporcione este servicio sólo a los sistemas internos de la red,

www.linuxmagazine.com.es

Número 02

67


Email Clusters

ADMINISTRACIÓN

Listado 1: Smart Host con Sendmail 01 define(`SMART_HOST', `relay.myorg.uk')dnl 02 FEATURE(`no_default_msa',`dnl')dnl 03 DAEMON_OPTIONS(`Port=smtp, Addr=127.0.0.1, Name=MTA') 04 FEATURE(`nocanonify')dnl

Listado 2: Configuración MX de la Universidad de Trier 01 02 03 04 05 06 07 08 09 10 11

mas@ishi:~> dig uni-trier.de mx ; <<>> DiG 8.3 <<>> uni-trier.de mx [...] ;; ANSWER SECTION: uni-trier.de. 1D IN MX 10 rzmail.uni-trier.de. uni-trier.de. 1D IN MX 50 rzmail2.uni-trier.de. ;; AUTHORITY SECTION: [...]

Listado 3: Configuración MX de AOL 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

mas@ishi:~> dig aol.com mx ; <<>> DiG 8.3 <<>> aol.com mx [...] ;; ANSWER SECTION: aol.com. 1H IN MX 15 aol.com. 1H IN MX 15 aol.com. 1H IN MX 15 aol.com. 1H IN MX 15

mailin-01.mx.aol.com. mailin-02.mx.aol.com. mailin-03.mx.aol.com. mailin-04.mx.aol.com.

;; AUTHORITY SECTION: [...] ;; ADDITIONAL SECTION: mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M mailin-01.mx.aol.com. 5M [...]

IN IN IN IN IN IN IN

A A A A A A A

64.12.138.152 152.163.224.26 205.188.156.122 64.12.136.57 64.12.137.89 64.12.137.184 64.12.138.57

para evitar que los spammers se aprovechen de ello. Muchas de las distribuciones lo tienen ya activado por defecto. De hecho, será más probable que se tengan dificultades, si se quiere permitir que el relay reenvíe los correos generados internamente. Si se tiene Sendmail, se puede editar el archivo

68

Número 02

entrantes. Se necesitaría un nombre de dominio para la dirección de correo de cada host. Además, supondría el tener que instalar los filtros antispam y los antivirus en cada máquina. Y que no se olvide el riesgo de seguridad que podría suponer tener el puerto 25 (SMTP) abierto en cada host. El método típico es similar al adoptado para el correo saliente. El correo entrante debe manipulase y repartirse por un pequeño grupo de máquinas especializadas. El cómo se realiza esta tarea dependerá de lo grande que sea la red y del volumen de correo que sea necesario manejar.

Centro de Control Una pregunta importantes es ¿se usará un sistema centralizado de buzones o se distribuirá cada mensaje de correo a cada máquina? La solución centralizada es más sencilla y fácil de proteger. La distribución del correo tiene más sentido en ambientes con una alta cualificación técnica, ya que permite a los usuarios tener mayor libertad de elección con respecto a las configuraciones individuales. Además, los usuarios pueden mermar la potencia de proceso de sus estaciones de trabajo aplicando filtros adicionales y reglas de ordenación. En ambos casos, un servidor MX (Mail Exchage) central manipulará los correos entrantes al principio. Luego podrá reenviar los mensajes a los usuarios profesionales directamente a sus estaciones de trabajo. Se puede deshabilitar el servidor SMTP o restringirlo a recibir solamente las transmisiones locales para todas las máquinas. El protocolo POP (Post Office Protocol), IMAP (Internet Message Access Protocol) o, en algunos casos, un sistemas de ficheros de red como NFS, se encargarán de distribuir los mensajes desde el sistema central de correo a las estaciones de trabajo individuales.

Sincronizados /etc/mail/relay-domains; Qmail necesita que se establezca la variable de entorno RELAYCLIENT y Postfix la variable mynetworks en el archivo main.cf.

Recepción de Correo No es una buena idea dejar que los hosts individualmente reciban los mensajes

www.linuxmagazine.com.es

Nuestros ejemplos anteriores suponen un único relay y un único servidor MX para el manejo del correo. En la mayoría de las pequeñas y medianas empresas ambas funciones las realiza una única máquina. La experiencia nos dice que una única máquina puede manejar unos 25000 mensajes por día o incluso más, dependiendo de las condiciones locales.


Email Clusters

Figura 1: Para sistemas independientes el manejo de email es sencillo. El cliente de correo (MUA) contacta directamente con el servidor de correo del proveedor (MTA).

Figura 2: Cuando el mensaje es enviado por una estación de trabajo independiente, el MUA le pasa el mensaje al MTA local.

Este hecho hace que la selección y programación de los filtros sea algo que se preste bastante al uso de trucos. Procmail es útil para un único usuario que quiera crear rápida y fácilmente un filtro que se aplicará a toda clase de productos como software antivirus o el Spam Assassin. Tan pronto como el volumen llegue a un nivel crítico, sin embargo, Procmail se convierte en un devorador de recursos: engendra procesos gigantescos y realmente delegar en su tarea se hace inviable. Sendmail, es preferible con su elegante Milter.

Distribución de Carga Si un servidor de correo está sobrecargado, lo primero que hay que buscar es una configuración Figura 3: Un relay central de correo o smart host se encarga de reeninapropiada, tal como el viar los mensajes salientes. de Procmail. Pero esto no es siempre la respuesta. El envío del correo es típicamente una Si está teniendo problemas con los mentarea más crítica que la recepción de los sajes entrantes en su servidor MX, es mismos. Aunque no necesita mucha bastante simple delegar en otros servipotencia de proceso, las conexiones dores MX adicionales. El Listado 2 muessalientes suelen ser más lentas o incluso tra la disposición típica de la configuprovocan fallos. Esto implica que los ración MX, tal y como se usa en la recursos pueden estar ocupados por basUniversidad de Trier. Nótese las prioritante tiempo. Incluso, los MTAs como dades asignadas a cada servidor MX (a la Qmail tienen problemas manejando izquierda de cada nombre de host). grandes colas de correo. Sin embargo, la Los programas que envíen el correo siempre presente inundación de spam intentarán usar la máquina con la priorihace que los mensajes salientes repredad más baja; de este modo senten tan solo una fracción de la carga rzmail.uni-trier.de (prioridad 10) será la total. Irónicamente, esto en realidad que espere la mayor cantidad de menfacilita el escalado. sajes. El sistema de backup, rzmail2 (prioridad 50) no se usará a menos que el Aceleración de Sistemas sistema principal no esté disponible. En el caso de la recepción de email, Aunque este método produzca reduncualquier mecanismo de filtro impactará dancia, no distribuye la carga. Cada en el rendimiento del sistema. Cuantos cliente y cada MTA intentará enviar el más filtros se apliquen y más complicacorreo a rzmail.uni-trier.de. dos sean, mayor tiempo tardará en AOL.com (véase Listado 3) hace esto recibir un único mensaje. Esto implica de manera diferente, combinando dos que un menor número de mensajes se métodos de distribución de la carga. Por procesaran de forma simultánea en una un lado, los cuatro servidores MX tienen única máquina. la misma prioridad (15), lo que implica

ADMINISTRACIÓN

que se usarán indistintamente por las fuentes externas. Insertando el comando dig varias veces con distintos intervalos entre una vez y otra, se podrá observar que el orden de salida ha cambiado. También, cada una de las cuatro entradas MX apuntan a direcciones IP diferentes. Esto permite a AOL distribuir los mensajes entrantes entre un gran número de máquinas para proporcionar un equilibrado de la carga.

Reunido AOL necesita almacenar los mensajes recibidos por los distintos servidores antes de asignarlos a los buzones de los clientes. La solución típica a este reto es un servidor de ficheros rápido que albergue a cada uno de los buzones. Cada uno de los servidores MX monta este directorio de correo del servidor de ficheros y escribe cualquier mensaje recibido directamente en el buzón del usuario apropiado. Desafortunadamente, este método no es trivial: situaciones donde dos servidores MX intenten entregar mensajes al mismo usuario a la vez y colisionen, deben ser evitadas. En un próximo artículo para esta columna se verá con más detalle el problema y sus posibles soluciones. La arquitectura que se ha estado mirando proporciona un ahorro de recursos en otros sitios. Donde sea que se necesite un servidor MX central que ejecute servicios para POP o IMAP, puede ser ahora descargado por el servidor de ficheros o por otros ordenadores. El segundo truco (permitiendo que un único nombre de host en el DNS apunte a varias direcciones IP) también ayuda a proporcionar un balanceo de la carga del servidor de relay. Si este servidor está sobrecargado, simplemente hay que añadir un segundo servidor con el ■ mismo nombre.

RECURSOS [1] Sendmail:http://www.sendmail.org/ [2] Postfix: http://www.postfix.org/ [3] Qmail: http://www.qmail.org/ [4] Milter: http://www.sendmail.com/partner/resources/development/milter_api/; Milter Perl modules: http://search.cpan.org/~cying/ [5] Relevant RFCs:821 and 2821 (SMTP),1939 (POP3),3501 (IMAP) http://www.rfc-editor.org

www.linuxmagazine.com.es

Número 02

69


Bienvenidos a Linux User Ésta es la sección dedicada a la presentación de software interesante y útil que nos ayuda en nuestro quehacer diario con el escritorio Linux. Aquí aprenderemos a utilizar software estándar de una manera más eficiente, adquiriremos valiosos conocimientos y descubriremos apasionantes nuevas aplicaciones.

Herramientas: TaskJuggler

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71 Todas las organizaciones, desde las empresas a los grupos de usuarios sin ánimo de lucro pueden ahorrar mucho tiempo y dinero con la herramienta adecuada.TaskJuggler ayuda a organizar los recursos y proporciona una descripción clara de cada uno.

Desktopia: Twin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74 Escribir mensajes, leer noticias, grabar CDs o incluso procesar imágenes, ninguna de estas tareas requiere GUI en Linux.Y Twin incluso proporciona un gestor de ventanas para la consola.

Aplicaciones: Konserve

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .77 La “Konservacióbn”es una buena cosa y Konserve, una herramienta KDE, no es una excepción. Sus sofisticados mecanismos para realizar copias de seguridad evitan el engorro que suele suponer esta tarea.

Programación Básica: XUL (II)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79 Mozilla, aparte de estupendo navegador, es toda una plataforma de desarrollo que permite crear interfaces de manera sencilla y rápida. En la segunda parte de esta serie aprendemos a añadirle funcionalidad real y útil a nuestros componentes.

Educación: WIMS (II)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83 En nuestra segunda parte de la serie sobre WIMS explicamos cómo se crean las clases, cómo se las llena de contenido, cómo se inscribe a los alumnos y el modo en que pueden trabajar.

Iniciación a LaTex (II)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88 En esta nueva entrega sobre el procesador de textos LaTeX, os vamos a ir mostrando con mayor detalle todas las múltiples, y a veces casi mágicas, posibilidades que este sistema de escritura nos ofrece.

Línea de Comandos: Head, tail y cat

. . . . . . . . . . . . . . . . . . . . . . .93 Utilidades pequeñas como head, tail y cat se usan para mostrar el contenido de los ficheros de texto. Aunque todos traten con ficheros de texto, estas herramientas de la línea de comandos son dignas de mención ya que pueden combinarse para formar potentes utilidades.


Herramientas

LINUX USER

TaskJuggler

Un Plan sencillo Las empresas y los proveedores de servicios no son los únicos que confían en los ordenadores para planear tareas y proyectos. Los clubs y organizaciones sin ánimo de lucro pueden ahorrar mucho tiempo, dinero y dolores de cabeza con la herramienta adecuada. TaskJuggler le ayuda a organizar sus recursos y proporciona una descripción clara. POR FREDERIK BULSMA Y PATRICIA JUNG

L

as tareas y los proyectos que necesitan de organización han acompañado a la humanidad durante siglos. Lamentablemente, las personas y más recientemente los programas que pueden asignar recursos y tareas de manera eficiente siempre han escaseado. TaskJuggler [1] por Chris Schläger y Klaas Freitag no sólo proporciona esta clase de funcionalidad sino que ha resultado ser una enorme ayuda en optimizar cualquier escenario definido en términos de proyectos y recursos. El programa permite definir costes y utilidades sencillas de control, con turnos y prioridades. Acepta como entrada un fichero de texto con extensión .tjp que describe los objetos. La siguiente sintaxis indica al programa que analice un archivo taskjuggler nombre_fichero.tjp

TaskJuggler produce informes en HTML o ficheros con formato CSV que son perfectos para publicaciones en Internet o para la manipulación de hojas de cálculos en OpenOffice. Como alternativa, el programa puede generar datos XML que

pueden convertirse a cualquier otro formato permitiendo una migración fácil a su sistema de gestión de contenidos.

Funcionalidad Avanzada Echémosle un vistazo a la versión de desarrollo 1.9.2, que proporciona nuevas opciones tales como los Informes CSV mencionados anteriormente. Además de un compilador C++, como g++ del “GNU Compiler Collection”, GCC, también será necesario el paquete de desarrollo del sistema X Windows. La documentación se encuentra en el sitio web de Taskjuggler, http://www.taskjuggler. org/, también se necesitará al menos la versión 3.1 de la biblioteca Qt. Para descomprimir el paquete TaskJuggler hay que introducir lo siguiente tar xjf taskjuggler-1.9.2_U unstable.tar.bz2 cd taskjuggler-1.9.2_unstable

Entonces lanzamos el proceso de compilación introduciendo ./configure --with-kde-support make

Puede omitirse la opción --with-kde-support si no tiene KDE. La rutina de configuración se ha diseñado para proporcionar tanta funcionalidad como la máquina de desarrollo pueda soportar. Como ejemplo, esto regenera los ficheros de documentación si se puede localizar las librerías Docbook. Si Perl y los módulos XML::Parser, Postscript::Simple, Date::Calc, Class::Method Maker y Data::Dumper CPAN están instalados, el proceso de compilación también genera un programa llamado tjx2gantt el cual crea diagramas Gantt como se muestra en la Figura 1. Después de completar el proceso de make, hay que asumir privilegios de administrador antes de instalar TaskJuggler tecleando make install.

Proyectos, Turnos y Recursos Tiene sentido crear un directorio para sus propios proyectos, dándole un lugar a TaskJuggler para almacenar sus definiciones e informes. La página web de TaskJuggler [2] proporciona algunos ejemplos para ayudar a explicar como utilizar la aplicación.

www.linuxmagazine.com.es

Número 02

71


LINUX USER

Herramientas

Figura 1: Un diagrama Gantt de un proyecto.

Podemos echarle un vistazo al directorio de los ejemplos en las fuentes que nos hemos bajado. El fichero ShiftSchedule.tjp detalla los cuatro componentes del proyecto: La definición, los niveles, los recursos disponibles y las tareas. Echémosle un vistazo a la sección project de este primer ejemplo (Véase el Listado 1). shifts proporciona un identificador, que va seguido por el nombre del

1: Definiciones Shift 01 project shifts "Duty Schedule 02 SysAdmin Team" "$Id" 2002-06-01 03 2002-08-01 { 04 02 dailyworkinghours 8 05 yearlyworkingdays 256 06 } 07 flags hidden 08 shift phonesupport "Phone 09 support" { 10 workinghours mon 9:00 - 12:00 11 workinghours tue 9:00 - 12:00 12 workinghours wed off 13 workinghours thu 14:00 - 17:00 14 workinghours fri 9:00 - 12:00 15 } 16 shift studenthours "Student Hours" { 17 workinghours mon 9:00 - 14:00 18 [...] 19 workinghours fri 9:00 - 14:00 20 }

72

Número 02

proyecto. Este proyecto tiene que ver con los turnos de trabajo para el equipo formado por los administradores de sistemas. Los últimos parámetros indican la línea temporal del proyecto en el formato AAA-MM-DD. A la hora de definir la fecha de conclusión del proyecto no debería ser muy estricto y permitir definirla con algo de margen, ya que las tareas fuera de la línea de tiempo del proyecto se ignoran. El tercer parámetro que se necesita es el número de versión. Puede ser un simple “1.0”; si se utiliza un sistema de control de versiones para gestionar los ficheros de TaskJuggler, se puede especificar un comodín (”$Id” para CVS). Estos parámetros obligatorios pueden llevar detrás opciones detalladas entre paréntesis, como las horas diarias trabajadas (ocho horas en nuestro ejemplo) y el número de días trabajados por año (256 en el ejemplo). Los objetos shifts se pueden usar para definir períodos de turnos de trabajo. Los turnos se usan para acumular la cantidad de tiempo de la gente que trabaja a la vez. El objeto workinghours define los períodos de trabajo diarios específicos. Los días se abrevian de la siguiente manera: tue para martes, wed para miércoles, etc. La palabra off indica un día sin horas de trabajo dentro del proyecto. Si se pierde un día, TaskJug-

Listado 2: Definiciones de Recursos 01 resource joe "Joe Bughunter" {vacation 2002-06-10 2002-06-13 02 } 03 resource khaled "Khaled Safri" 04 { 05 shift studenthours 06 } 07 [...] 08 resource anders "Anders Gundstrom" { 09 maxeffort 0.8 10 } 11 resource paul "Paul Gutier" { 12 vacation 2002-07-02 13 2002-07-08 14 }

www.linuxmagazine.com.es

gler supondrá las horas de trabajo por defecto del proyecto para este turno. Cada turno está asignado a un ID (por ejemplo phonesupport para el tiempo que los miembros del equipo de administradores de sistemas pasarán dando soporte telefónico) y un título. Los miembros de la plantilla afectados por el proyecto están indicados por el uso de la palabra resource como se muestra en el Listado 2. Además de un descriptor único (como joe), el nombre completo es útil como descripción. El atributo vacation puede usarse opcionalmente para definir un período vacacional; maxeffort define un factor que permite calcular el trabajo a media jornada. En vez de una semana de trabajo de cuarenta horas, Anders Gundstrom sólo trabaja 8*0.8=6.4 horas. La palabra shift vincula a Khaled Safri con un horario de trabajo especial; en este caso, las horas definidos para los estudiantes en el Listado 1. Finalmente, lo más importante: que se completen las tareas (ver Listado 3). Nuestro primer ejemplo define una

Listado 3: Definiciones de Tareas 01 task sysadmin "System Administration" { 02 03 # Lo siguiente no es realmente una tarea. Sólo 04 # define la fecha de comienzo del proyecto. 05 task start "Start of plan" { 06 start 2002-06-01 07 milestone 08 flags hidden 09 } 10 11 task usersup "User Support" { 12 depends !start 13 duration 2m 14 shift phonesupport 15 priority 900 16 allocate joe { alternative 17 anders, khaled, sally select 18 minloaded } 19 } 20 [...] 21 } # Fin de Sysadmin Tasks


Herramientas

tarea, sysadmin que se divide en trabajos individuales entre llaves. El punto start define un hito, donde puede comenzar otra tarea. El soporte de los usuarios depende de la terminación de start y no puede suceder antes del 1 de Enero de 2002. El hito no aparecerá en los informes debido a que es una etiqueta oculta. Ahora podemos asignar las tareas de soporte que van a ser planeadas para los próximos dos meses (duration 2m) al turno phonesupport con una prioridad de 900. 1 indica Figura 2: Calendario HTML de Sally. algo sin importancia, mientras que 1000 tiene la máxima prioridad. El atributo allocate asigna la plantilla a las tareas. Esto significa en este caso seleccionar aquellos miembros de la plantilla de un grupo formado por joe, anders, khaled y sally que tienen la carga de trabajo más ligera (select minloaded). La selección de criterio Figura 3: OpenOffice con los datos cargados desde TaskJuggler. maxloaded es lo contrario a esto y selecciona los miembros de la xmlreport "ShiftSchedule.tjx" plantilla con la carga más pesada. Order selecciona el primer miembro de le dice a TaskJuggler que cree un informe la plantilla sin nada asignado y ranXML y lo almacene en un fichero llamadom simplemente coge uno do ShiftSchedule.tjx. Por supuesto se cualquiera. puede ver este fichero con un editor XML o una herramienta similar, pero su Planificación Simplificada potencia real queda reflejada cuando se necesita importar o exportar datos. El Tan pronto como el alcance del proyecto DTD apropiado está disponible en http:// ha sido especificado, TaskJuggler puede www.taskjuggler.org/show_dtd.php. proporcionar el planning: Añadiendo la Puede pasarse el fichero XML al script siguiente línea al fichero .tjp Perl mencionado antes, tjx2gannt [3],

Listado 4: Programa Asignado a Sally 01 htmlweeklycalendar "Calendar-sally.html" { 02 headline "Assignment Schedule 03 for Sally" 04 columns schedule 05 hidetask 1 06 hideresource 07 ~isresource(sally) 08 }

Listado 5: Vistazo del número de horas de trabajo por pregunta y día 01 csvtaskreport "effort.csv" { 02 columns name, daily, effort 03 start 2002-06-01 04 end 2002-07-01 05 hidetask hidden 06 loadunit hours 07 }

LINUX USER

para crear un diagrama de Gantt. Además TaskJuggler está perfectamente capacitado para generar informes HTML útiles sin usar ninguna herramienta adicional. Añadiendo el código del Listado 4 htmlweeklycalendar al fichero .tjp para el calendario de Sally de la Figura 2 se creará un planning semanal del período del proyecto en Calendarsally.html. La función isresource(sally) filtra las asignaciones para el recurso sally y hideresource oculta cualquier recurso que no (~) coincida con este criterio. columns schedule saca un programa detallado usando estos datos. Dejando la línea hidetask 1 inserta una línea para notas entre la fecha y la tarea en el calendario HTML. El informe CSV también está definido en el fichero .tjp, como se muestra en el Listado 5. csvtaskreport proporciona los nombres individuales y effort en horas (loadunit hours9 para todas las tareas que no están ocultas para el período entre 06.01.2002 y 07.01.2002 (ver Figura 3).

Un Plan Diferente No importa si se necesita informes de quien trabajará, durante cuanto tiempo y en qué, o planes sencillos de asignación para su plantilla, TaskJuggler ofrece un abanico de funciones que podrían fácilmente rellenar un manual de referencia. El directorio Examples en el fichero fuente taskjuggler proporciona más ejemplos. Este directorio y los ficheros de ejemplo también ofrecen un número de pistas, por ejemplo, en el uso de scripts de macros y proyectos multi■ partes.

RECURSOS [1] TaskJuggler:http://www.penguin.org/ handbook [2] Proyecto TaskJuggler:http://www. taskjuggler.org/example.php [3] Script de Perl tjx2gantt: Instalado por defecto con TaskJuggler

www.linuxmagazine.com.es

Número 02

73


LINUX USER

deskTOPia

Componer mensajes, leer noticias, grabar CDs o incluso procesar imágenes,

librerías instaladas introduciendo ldconfig con privilegios de root. Antes de hacer esto debemos estar seguros de que /etc/ld.so.conf contiene una línea para /usr/local/lib. SuSE dispone de esto por defecto, pero los usuarios de Mandrake y de Red Hat deberán añadirla manualmente.

ninguna de estas tareas requiere GUI en Linux. Y Twin incluso proporciona un

Arranque

gestor de ventana para la consola. POR ANDREA MÜLLER

Es indiferente si lanzamos Twin en una consola o en X. El programa automáticamente elegirá el modo apropiado según el entorno. En sistemas basados en GUI, Twin abrirá su propia ventana de escritorio en una ventana normal. En consolas basadas en texto, Twin ocupará la pantalla completa, proporcionando una apariencia genuina de gestor de ventanas. Antes de lanzar Twin debemos recordar activar el servicio gpm, que proporciona soporte al ratón en modo texto. Mandrake y Red Hat Linux habilitan gpm por defecto. Los usuarios de SuSE pueden hacer su para convertirse en root e introducir /etc/init.d/gpm start. Si el soporte del ratón causa problemas con X podemos deshabilitar gpm tecleando etc/init.d/gpm stop. Una vez nuestro gestor de ventanas se esta ejecutando no hay nada que nos impida poblar el escritorio de ventanas

Twin

XFree-libre V

entanas basadas en la línea de comandos le puede sonar a muchos como una hoguera en el fondo del mar. Pero esto es exactamente lo que hace Twin, Textmode Windows Enviroment (Entorno de Ventanas en Modo texto) [1] de Massimiliano Ghilardi. El gestor de ventanas basado en consola nos permite hacer malabarismos con las ventanas de la misma forma que nos lo permitiría X. Si no disponemos de un servidor X activo ya no necesitaremos cambiar entre consolas más, y Twin incluso se puede ejecutar sobre GUI.

Ajuste de Ventanas No debemos esperar encontrar Twin en el CD de nuestra distribución. En su lugar, necesitaremos lanzar nuestro compilador y crear el programa desde el código fuente que esta disponible para su descarga en [1]. Para compilar Twin necesitaremos nuestra herramientas estándar de desarrollo, las librerías ncurses y zlib y el paquete de desarrollo adecuado. Si deseamos lanzar una sesión de Twin en X necesitaremos adicionalmente el paquete de desarrollo Xfree (XFree86-devel para SuSE o xlibs-dev para otras distribuciones). También podemos instalar gpm y gpm-dev para proporcionar manipulación de ventanas basadas en el ratón. Este paso no es necesario en SuSE debido a que el paquete gpm está preinstalado por defecto y contienen adicionalmente los archivos de desarrollo. Twin incluye un reproductor de CD llamado twcd en el subdirectorio contrib bajo el directorio del código fuente. Para usar esta aplicación necesitamos instalar libcdaudio [2] desde el DVD o desde [3]. Por supuesto que hay muchos reproductores útiles basados en consolas como

74

Número 02

cdp, por lo que quizás no necesitemos twcd. Descomprimimos el código fuente de Twin y cambiamos al directorio creado por este primer paso twin-0.5.1. Después viene el truco habitual de las tres cartas, ./configure, make y make install, que se ocupará de compilar e instalar el software. Para compilar también twcd ejecutamos un make -C contrib tras el paso make. Esto funcionó en nuestra versión de laboratorio, estando libcdaudio y las cabeceras adecuadas disponibles en /usr/lib/ y en /usr/include. Twin se instalará por defecto en los directorios bajo /usr/local, por lo que necesitaremos ser root para ejecutar make install. Entonces podemos proceder a introducir nuestro sistema en las

Figura 1: Debemos prestar atención a nuestras aplicaciones, desde el monitor del sistema, hasta el cliente de correo de electrónico, con Twin.

www.linuxmagazine.com.es


deskTOPia

Figura 2: Twsysmon usa una barra gráfica para visualizar el uso de recursos.

de programas. Presionando la tecla [Pausa | Inter] o pulsando el botón derecho del ratón, se mostrará el menú Twin en la parte superior de nuestra pantalla. Entonces podemos seleccionar File / New Term para lanzar twterm, equivalente xterm de Twin, si bien puede que prefiramos usar el atajo [Alt-flecha hacia arriba]. Twin añade una pequeña barra de título a cada ventana. Los botones en la barra proporcionan funcionalidades útiles. El botón de la izquierda cierra la ventana, el segundo colapsa la ventana, dejando solo la barra a la vista o la expande de nuevo si está colapsada. El tercer botón (en la derecha) hace activa la siguiente ventana abierta en nuestro escritorio. Esto es muy útil debido a que Twin solo proporciona acceso al menú del objeto que actualmente esta activo (los usuarios de Macintosh estarán familiarizados con este comportamiento).

Listado 1: Colores diferentes y nuevos atajos en Twin 01 #Esta entrada en línea 23, aproximadamente 02 in ~/.twinrc 03 #define un fondo verde 04 for Twin. 05 Background 1 High Black On 06 Green ("\xb1") 07 08 #atajo teclado de mutt keyboard shortcut 09 [Shift-Tab] 10 Key Shift "Tab" ExecTty "mutt" 11 12 #Arranque rápido para top con [F1] 13 Key "F1" ExecTty "top"

Como alternativa podemos pulsar con el botón izquierdo del ratón en una espacio vacío del escritorio para indicar a Twin que muestre el menú principal. [Alt-Tab] cambiará de una ventana a otra. Al igual que a otros muchos gestores de ventanas, a Twin le podemos indicar que mueva una ventana pulsando sobre ella y manteniendo pulsado el botón izquierdo del ratón. Para cambiar la escala de la ventana debemos pulsar sobre el ancla situada en la esquina inferior derecha arrastrando el puntero del ratón. También podemos usar el teclado para hacer esto. Seleccionando Window / Resize y después usando las teclas de flecha para escalar la ventana. Presionando [Intro] finalizaremos. Por supuesto, un simple twterm no es un gran avance sobre la consola normal, por lo que deberemos lanzar unos pocos de terminales más y asignarles programas para monitorizar múltiples aplicaciones. File / Execute lanza un programa directamente sin necesidad de usar la línea de comandos. En el caso de aplicaciones interactivas como el cliente de correo mutt podemos marcar la casilla Run in Terminal para proporcionar soporte a las aplicaciones necesarias. Como podemos observar en la figura 1, Twin nos permite estar pendientes de aplicaciones críticas. Si comenzamos a perderles la pista, la lista de la ventana, al cual podemos dejar en el escritorio pulsando el botón central del ratón, nos ayudará a resolver este entuerto.

Todo Incluido Twin vienen con una colección de herramientas. Para usarlas de debemos primero lanzar un scocket de Twin seleccionando Modules / Run Socket Server. Twin utiliza el método de cliente/servidor como el sistema de ventanas X. Algunas aplicaciones de Twin utilizan este socket para hablar con el escritorio. La entrada del menú ? / Clock arranca el reloj integrado de Twin. El comando twsysmon arranca un monitor del sistema gráfico que proporciona estadísticas de los recursos del sistema y actualiza la hora (ver figura 2). twcat es una alternativa al comando cat. La sintaxis es igual a la original (twcat filename), pero adicionalmente proporciona con-

LINUX USER

venientes barras de desplazamiento que nos permiten desplazar los resultados.

Opciones El primer sitio al que debemos ir cuando queramos configurar Twin a nuestro gusto es a la entrada del menú ? / Options, que abre el menú Options (ver figura 3). Si las sombras de nuestras ventanas actuales son muy grandes para nuestros gustos podemos seleccionar Shadows para reajustarlas o simplemente quitar la marca de la casilla para no utilizar las sombras. Seleccionando Hidden Menu ocultará el menú. En este caso debemos pulsar el botón derecho del ratón para ver el menú de nuevo. Si pretendemos ejecutar muchas ventanas en el mismo escritorio Twin simultáneamente quizás debamos habilitar el Enable Screen Scrolling (habilitación del desplazamiento de ventanas). Esto levanta las restricciones del área visible del escritorio y nos permite mantener pulsado el botón izquierdo del ratón para desplazar fuera del área visible de la ventana, por ejemplo, mientras movemos ventanas. Un editor de texto nos permite más configuraciones individuales en Twin. Copiamos el archivo /usr/local/lib/twin en ~/.twinrc y editamos el archivo (muy bien comentado) hasta que satisfaga nuestras necesidades. El archivo proporciona detalles de mucha ayuda sobre las combinaciones de color disponibles y los atajos de teclado. El listado 1 nos muestra como cambiar el color de fondo en Twin y como añadir botones de acceso rápido para el monitor mutt y top. \xb1, en la sección Background es la notación hexadecimal del asterisco (*) que Twin usa como imagen de fondo. Opcionalmente podemos usar la anotación octa para caracteres individuales como \100 para @. Si estas anotaciones son muy complicadas podemos usar como alternativa texto normal para animar nuestro fondo. La siguiente entrada proporciona los resultados mostrados en la figura 4: Background 1 High White on Magenta ( "Linux Machine! " "###################"

www.linuxmagazine.com.es

Número 02

75


LINUX USER

deskTOPia

" " " " " " )

comando twattach o twdisplay para volver a poner Twin en nuestra pantalla. twattach usa menos recursos pero Si blanco intenso no es como desventaja debede nuestro gusto mos apuntar que solo podemos omitir el nos facilita permisos parámetro High. de lectura a la actual La palabra clave sesión de Twin. No ExecTty en el cuadro de obstante, intentar Figura 3: Configuración desde el comandos de lanzarestaurar una sesión de menú de Opciones. miento rápido indica a Twin basada en consoTwin que debe lanzar un programa en la usando el comando GUI twattach un terminal. Debemos asegurarnos de corromperá el display poner todas las instrucciones de teclaDebido a que twattach causa errores do entre comillas excepto Ctrl, Alt y ocasionales al restaurar el modo de disShift. play original en nuestros ensayos de laboratorio, twdisplay es preferible para Twin Móvil equipos con potencia suficiente. El siguiente comando restaura nuestra sesión Siempre parece que, tan pronto lande Twin en X: zamos GUI o cambiamos a otra consola o máquina para hacer alguna otra cosa, twdisplay --twin@:0 --hw=X necesitamos alguna de las aplicaciones que actualmente se ejecutan en Twin --twin@:0 especifica el display de Twin. como el programa de correo electrónico. La primera sesión de Twin lanzada siemAfortunadamente, el desarrollador de pre será la 0. Si no estamos seguros del Twin pensó en esto. El escritorio de Twin número, la herramienta twfindtwin nos esta disponible siempre que lo necesitadirá cual es la correcta. mos, incluso si nos hemos desconectado Si no especificamos el nombre del con anterioridad. anfitrión, twdisplay supondrá que se está detach es la palabra mágica: Twin se ejecutando localmente. Si deseamos desconecta el solo de la consola en la tomar control de una sesión que fue lanque fue lanzado y pasa a ejecutarse en zada en otro equipo en nuestra red debesegundo plano. Primero arrancaremos mos usar el siguiente comando, el servidor socket y luego File / Detach. suponiendo que la dirección IP es Sin el servidor socket, Twin desaparece 192.168.0.1: en segundo plano donde no podremos hablar más. Ahora podemos desconectwdisplay -twin@ tarnos de el y lanzar un GUI o 2.168.0.1:0 --hw=X cualquier otra aplicación. Cuando necesitemos la sesión Twin escribiremos el El valor de --hw= especifica el modo que Twin usará para los resultados. Si estamos trabajando en la consola, tty es el valor correcto. Usaremos X o gfx para X. Este último añadirá algo de condimento a nuestra ventana Twin (ver ventana 6). Si nuestra conexión de red es lenta (puede que sea el caso) y lanzamos una sesión de Twin a través de Internet, el compresor zlib puede ayudarnos. Especificaremos las Figura 4: Un fondo personalizado para el escritorio Twin. opciones adicionales de la

76

Número 02

www.linuxmagazine.com.es

conexión separadas por coma del parámetro --hw=X de la siguiente forma: twdisplay -twin@ 2.168.0.1:0 --hw=X,gz

para indicar al gestor de ventanas que comprima los datos a transferir, haciendo por tanto un uso óptimo de la conexión de red. La sobrecarga adicional requerida para la compresión no debería ser ningún problema incluso para máquinas antiguas.

Caja de herramientas El paquete twutils de la página Web de Twin está diseñado para almacenar futuras herramientas de Twin. De momento, sólo contiene una calculadora científica. Tras descomprimirla debemos cambiar el directorio twutils-0.2, y ejecutar ./configure y make para compilarla. Nos hacemos root e introducimos make install para hacer que twkalc esté disponible en las sesiones de Twin.

Compañía de fiar Twin proporciona un gestor de display al igual que otros entornos de escritorio twdm. Esta pantalla de conexión en modo de texto proporciona una ventana de conexión pseudo gráfica que nos solicita que introduzcamos nuestro nombre de usuario y contraseña antes de conectarnos a nuestra sesión de Twin. root puede introducir /usr/local/sbin/twdm para arrancar el gestor de displays. El tutorial Twin, localizado en el subdirectorio doc bajo el directorio del código fuente, contiene el procedimiento de cómo integrar twdm en el sistema de inicio. Debemos usar una máquina de pruebas no obstante: tras arrancar twdm, fuimos incapaces de usar el teclado, lo que complicó sobre manera ■ la conexión.

RECURSOS [1] Twin: http://linuz.sns.it/~max/twin/ [2] libcdaudio: http://cdcd.undergrid.net/ libcdaudio [3] rpm de libcdaudio: ftp://194.199.20.114/ linux/contrib/libc6/i386/libcdaudio-0.99. 9-1.9.0.i386.rpm


KTools

LINUX USER

Konserve

Más Vale Prevenir... La “Konservación” es una Buena cosa y Konserve, una herramienta KDE no es una excepción. Sus sofisticados mecanismos de copia de seguridad realmente previenen los dolores de cabeza provocados por esta tarea. POR STEFANIE TEUFEL

P

uede que este terrorífico escenario le sea familiar. Según se aproxima la fecha tope de la entrega de su tesis, artículo o contrato, de pronto notamos que el documento clave de repente ha desaparecido de nuestro equipo. Por supuesto no siempre hemos recordado (o simplemente hemos sidos muy vagos) hacer una copia de seguridad de nuestros documentos más importantes. ¿No sería Figura 1: Pequeño, una buena idea que pero tan útil… alguna herramienta en segundo plano se ocupara de realizar estas tediosas tareas? Esta es la idea que básicamente tuvo Florian Simnacher cuando lanzó el proyecto Konserve. La página Web del proyecto, http:// www.simnacher.net/konserve/konserve. html, proporciona un tarball con el código fuente. Si disponemos de Red Hat 8.0 podemos usar el paquete RPM; si no debemos compilar las fuentes. Los pasos habituales harán el trabajo: configure; make; make install.

KTOOLS En esta columna presentamos herramientas que mes a mes han demostrado ser especialmente útiles funcionando bajo KDE, resuelven un problema que de otra forma sería ignorado deliberadamente o simplemente son unas de las cosas más bonitas de la vida, las cuales, una vez descubiertas, no podemos dejar de utilizar.

Debido a que el programa se instala en /usr/local/kde y éste no es el típico directorio KDE, la llamada /usr/local/kde/bin/konserve no encontrará los iconos o el archivo de ayuda. Hay dos formas de solucionar esto. Mientras configuramos podemos introducir la ruta a nuestro directorio KDE: ./configure -prefix=/U path/a/driectorio-kde

1). Ahora debemos pulsar con el botón derecho del ratón sobre el icono para que aparezca el menú que se muestra en la figura 2.

Invisible

Esto permite a make install poner la instalación del software en este directorio más tarde. Debido a que esta forma no nos permite distinguir entre aplicaciones claves de software de nuestro distribuidor y las herramientas que nosotros hemos añadido, la segunda opción es preferible. Pasamos los directorios de mayor nivel de nuestro software KDE a la variable KDEDIRS de la siguiente forma: export KDEDIRS=/opt/kde3:/usrU /local/kde

Tras completar los pasos de la instalación podemos iniciar la herramienta de copia de seguridad accediendo a través del menú de inicio KDE a Programs/konserve o escribiendo konserve & en una ventana de consola (puede que necesitemos indicar la ruta). Haciendo esto aparecerá un pequeño icono con forma de lata en la barra del menú (ver figura

El asistente es la modalidad que yo al menos recomendaría para ayudarnos en las primeras copias de seguridad. Debido a que Konserve soporta cualquier número de copias de seguridad con alcance definido por el usuario tendremos Figura 2: El menú despleque facilitar gable proporciona acceso a un nombre funciones críticas. para el perfil de la copia de seguridad en la primera pantalla. Elegiremos algo intuitivo que nos ayude con el perfil más fácilmente. ¿Hemos acabado? Bien, entonces pulsaremos Next para continuar. En la siguiente caja de dialogo (ver figura 3) debemos especificar cuales son los archivos de los que deseamos hacer copia de seguridad en el campo Source url. El nombre de componente “URL” es

www.linuxmagazine.com.es

Número 02

77


LINUX USER

KTools

Figura 3: Los archivos fuente para la copia de

Figura 4: Especificamos los intervalos entre

Figura 5: Una comprobación rápida de las selec-

seguridad.

copias de seguridad.

ciones.

un poco confuso debido a que el programa espera nombres de archivos o directorios. Konserve de hecho rehusó realizar una copia de seguridad de una página Web en nuestras pruebas. Si especificamos un directorio, cualquier subdirectorio o archivo dentro de este será incluido en nuestra copia automáticamente. Si no recordamos el nombre del directorio que deseamos copiar, simplemente pulsaremos en el icono de carpetas y usaremos el gestor de archivos para localizar los archivos requeridos. Entonces pulsamos Next de nuevo. Konserve nos solicita ahora que especifiquemos donde queremos almacenar el archivo. Si utilizamos el campo Backup url para especificar un directorio, Konserve proporcionará un nombre único con el siguiente formato directoryname-yyyyMMddhhmmss.tar.gz (nombre del directorio - año mes día hora minutos segundos.gz). El archivo no será sobrescrito por la próxima copia de seguridad. No obstante, si especificamos el nombre de una archivo Konserve machacará la copia de seguridad previa con la nueva. Una cosa más: el directorio objetivo debe existir previamente en el sistema o Konserve mostrará un error y se pondrá en huelga. Tras especificar qué y dónde, la cuarta pantalla (ver figura 4) nos permite indicar cuándo. Podemos especificar el intervalo entre copias de seguridad indi-

viduales. El menú desplegable nos permite elegir entre días, horas, minutos o segundos. Al acabar el asistente, podemos activar la marca de Backup active (Copia de seguridad activa) para lanzar los trabajos de copias de seguridad. O también podemos acceder al diálogo de menú Preferences (preferencias) para lanzar los trabajos manualmente. La quinta pantalla (ver figura 5) proporciona un

mos seleccionar el menú Preferences y añadir los detalles requeridos en la caja de diálogo mostrada en la figura 6. La caja de diálogo dispone de las mismas funciones que el asistente, si bien algunos nombres han cambiado: Source url es ahora solo Source, y Backup url es ahora Archive. También podemos utilizar los botones Move Up (Mover hacia arriba) y Move Down (mover hacia abajo) para cambiar el orden de los perfiles. Como indican sus propios nombres, el botón Add (Añadir) creará un nuevo perfil y Remove (Quitar) eliminará el perfil seleccionado. Una pulsación sobre Restore (Restaurar) indicará a Konserve que debe restaurar la última copia de seguridad realizada. Esto es muy útil si eliminamos los archivos originales por error. Lo único que perderemos serán los cambios realizados desde la última copia de seguridad. Cualquier perfil existente puede ser utilizado para crear una copia de seguridad no programada. El menú desplegable proporciona una lista de los nombres de los perfiles. Simplemente debemos pulsar en el nombre del perfil deseado para que Konserve inicie la copia. Por ejemplo, esto es útil si necesitamos salvar el trabajo de un día de trabajo antes de salir de la oficina. Konserve puede realizar copias de seguridad de servidores FTP al igual que las realiza de archivos locales. Para utilizar esta funcionalidad simplemente debemos indicar una ruta como ftp://tunombredeusuario@ftp.tuproveedor.org/path/a/fichero/fichero.tar.gz como nuestro Archive (Archivo) objetivo. Cuando creamos que hemos hecho las suficientes copias de seguridad simplemente debemos pulsar Quit para ■ finalizar.

Figura 6: El diálogo de preferencias proporciona un atajo para crear perfiles de copias de seguridad.

vistazo general de las selecciones realizadas. Entonces podemos pulsar Finish para finalmente lanzar el proceso de copia de seguridad.

Un Atajo Independientemente de lo amigable que sea el asistente, una vez hayamos comprendido la forma de trabajar de Konserve, es muy probable que prefiramos hacer el trabajo sin la ayuda la próxima vez. Para hacerlo de esta forma, debe-

GLOSARIO Tarball: El programa tar compara archivos múltiples para crear un único archivo. Esta recolección de datos es habitualmente conocida como “tarball”. Los tarball tienen normalmente extensión como .tar, .tar.gz o .tgz. las dos últimas extensiones indican que los archivos fueron añadidos al tarball antes de

78

Número 02

ser comprimidos usando el programa gzip. Path (Ruta): la ruta nos indica la localización de un archivo en el árbol de archivos del sistema. Es, por tanto, una lista de todos los directorios que necesitamos cruzar para acceder a ese archivo.

www.linuxmagazine.com.es


XUL

LINUX USER

Mozilla XUL: Diseño de Interfaces.

Jugando con Bloques En el primer capítulo de nuestro tutorial de programación en XUL del último mes exploramos algunos de los diferentes componentes y facilidades que XUL ofrece a la hora de construir interfaces gráficas. Si bien era bonita de ver, nuestro interfaz era lo más inconsistente que podamos imaginar.- muy bonita, pero sin materia gris. POR JONO BACON

E

ste mes vamos a incrementar nuestros conocimientos en construcción de elementos de interfaces y añadirles funcionalidades reales y útiles que se utilizarán para crear los bloques de construcción de aplicaciones futuras usando XUL.

Bloques de Interactivos Cualquier tipo de herramienta gráfica, donde se incluye XUL, es inútil si no dispone de funciones que traten la interacción. Cuando un usuario pulsa un botón, desplaza una barra de desplazamiento, selecciona una pestaña, selecciona un objeto de un menú o pulsa en el botón de una barra de herramientas, esperamos que suceda algo. Por ejemplo,

Otros lenguajes y XUL Una de las mayores preguntas que se realiza al mirar a XUL es si hay otros lenguajes disponibles para escribir código XUL. Actualmente el único lenguaje soportado es Javascript, si bien se está pensando en la inclusión de otros lenguajes en versiones futuras de Mozilla. Entre estos lenguajes puede que estén incluidos Python o C#. Muchas de de las discusiones entre los desarrolladores se giran alrededor de la creación de un nuevo nivel de funcionalidad de la aplicación Mozilla: la máquina virtual de Mozilla. Podemos encontrar más información al respecto del progreso del proyecto Mozilla en las Webs Mozillazine (http:// www.mozillazine.org/) y en Planet Mozilla (http://planet.mozilla.org/).

si pulsamos en el menú Archivo y luego en el Salir, esperamos que la aplicación se cierre como se supone que ha de hacer. Este tipo de interacción involucra 2 tipos de procesos: un Manipulador de Eventos y una Función. Algunos lectores puede que estén familiarizados con este tipo de funcionalidad por otras herramientas gráficas: Qt tiene sus Señales/Slots, por ejemplo. La premisa básica es que cada tipo de control gráfico (como un botón, barra de desplazamiento, menú, barra de herramientas, caja de texto, …) tenga diferentes formas en las que el usuario pueda interaccionar con él. Por ejemplo, un botón dibujado en la pantalla podemos pulsarlo, con una lista de objetos en una caja podemos seleccionar un componente y con una barra de desplazamiento podemos desplazarlo. Cada uno de estos diferentes tipos de interacción se llama Evento. Algunos componentes o widgets (los controles gráficos son normalmente llamados en inglés widgets) también tienen diferentes formas de eventos para diferentes formas de interacción. Cada uno de estos eventos no es útil si no podemos responder a ese evento con algo útil, y para hacer esto necesitamos usar una función. Una función es simplemente un trozo especial de código que podemos escribir y que hace algo útil. Esto puede ser cambiar el texto de algunas partes de la interfaz, añadir algo de información al componente, procesar información o cualquier otra cosa que sea de utilidad.

Los beneficios de usar funciones es que pueden ser utilizadas una y otra vez por diferentes eventos. Por ejemplo, si escribimos una función que crea un documento nuevo querremos conectarla al objeto del menú Archivo > Nuevo y también al botón de la barra de herramientas utilizado para abrir un nuevo documento. De esta forma todas las cosas se conectan entre sí como una sola.

Código Bajo Control Con toda esta teoría discutida, probablemente el lector se estará preguntando como encaja todos esto en el contexto general. ¿Cómo creamos un manipulador de eventos, cómo creamos una función y, sobre todo, cómo agrupamos todo junto para qué funcione de forma conjunta? La respuesta a todas esta preguntas es Javascript. Antes de que continuemos debemos hablar un poco de Javascript. Muchas personas se mofan de solo pensar en Javascript y lo consideran solo útil para crear esos molestos mensaje que reptan por la barra de estado de los navegadores web y para crear menús que pueden hacer una página Web aparentar ser incómoda y que solo funcionan parcialmente en algunos visores. Sí es cierto, Javascript puede ser utilizado para todas esas cosas y es posiblemente la cara más pública del lenguaje. Realmente pienso que Javascript es un lenguaje maravilloso, compacto y útil que puede ser considerado como el pegamento de los

www.linuxmagazine.com.es

Número 02

79


LINUX USER

XUL

Listado 1: first.xul 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17

<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window id="test-window" title="Test Program" xmlns="http://www.mozilla.org/ keymaster/gatekeeper/there.is. only.xul"> <button id="name" label="Mi botón"/> </window>

Un ejemplo de este tipo de funcionalidad con el que todos estamos familiarizados es la del software de foros web modernos. Cuando usamos los botones de formateo al componer un mensaje para el foro, el botón añadirá etiquetas de formateo a la caja de texto principal. ¿Cómo sabe comunicarse el botón con la caja de texto del mensaje cuando lo pulsamos? Sencillo: usa DOM. DOM funciona de forma que crea un árbol con todos los elementos en nuestra página Web. Veamos el siguiente código como un ejemplo: 01 <html> 02 <head> 03 <title>MiU Sitio Web</title> 04 </head> 05 <body> 06 <div> 07 <h1>Bienvenidos aU mi sitio web</h1> 08 </div> 09 <div> 10 Contenido. 11 </div> 12 </body> 13 </html>

visores Web: es muy útil para unir diferentes tipos de funcionalidades. En el terreno de XUL usamos un objeto especial llamado Documento Objeto Modelo (DOM), la idea tras DOM es que los elementos en una página Web deben ser todos accesibles en código de forma que todos podemos ver y cambiar los contenidos de estos cuando y como necesitemos. Por ejemplo sería útil cambiar el título, la fecha y etiquetas de los botones de una página Web cuando interactuemos con ella.

Cada una de las etiquetas del código anida dentro de otra, menos la etiqueta

Listado 2: Código Completo

Listado 3: second.xul

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

80

01 <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window id="test-window" title="Programa de Prueba" xmlns="http://www.mozilla.org/ keymaster/gatekeeper/there.is. only.xul"> <script src="functions.js"/> <button id="name" label="Mi botón" onclick="func_showdialog();"/> </window>

Número 02

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21

01 <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window id="test-window" title="Programa de Prueba" xmlns="http://www.mozilla.org/ keymaster/gatekeeper/there.is. only.xul"> <script src="second.js"/> <textbox id="textbox"/> <button id="showinfo" label="Mostrar Información" onclick="func_getinfo();"/> </window>

www.linuxmagazine.com.es

<html> que es la etiqueta padre. La etiqueta padre es como la raíz del árbol y cada una de las otras etiquetas son como ramas que surgen del árbol. Por ejemplo, si miramos a la etiqueta <body>, tenemos dos etiquetas <div> que están dentro de esta. Estas dos etiquetas <div> son como dos ramas. Debajo podemos ver como nuestras etiquetas forma un árbol con la etiquetas <html> como raíz: <html> <head> <title>Mi Sitio Web</title> <body> <div> <h1>Bienvenidos aU mi sitio web</h1> <div> Contenido.

Con nuestras etiquetas en un árbol como este podemos usar DOM para encontrar ciertas etiquetas y mostrarlas o conseguir la información requerida de ellas. De esta forma podemos encontrar una etiqueta en particular y modificarla de cualquier forma. Como resultado, DOM no sólo nos provee de un método para encontrar las etiquetas adecuadas, si no que también nos proporciona un método para actualizarlas.

DOM y XUL Para empezar de forma rápida utilizaremos como ejemplo simple la creación de un botón con un sistema de evento/funcionalidad. Lo primero de todo será crear un nuevo archivo llamado first.xul, al que añadiremos el siguiente código (ver listado 1 en la página previa). Cuando cargamos este archivo en un visor Mozilla obtendremos un simple botón como esperamos. Nuestro primer paso ahora es añadir un manipulador de eventos que especifique a que tipo de interacción queremos responder. Cada evento se activa por un manipulador especial que especifica con que tipo de interacción estamos tratando. La tabla de eventos XUL es una lista de eventos soportado concurrentemente que está disponibles en XUL (lista conseguida de XULPlanet.com).

El Señor de los Botones Empezaremos explorando uno de los manipuladores de eventos más común:


XUL

onclick. Para añadir este manipulador necesitamos añadir onclick a la línea de código que crea el botón y luego especificar que debe ocurrir. Cambiemos el código del botón a esta línea: <button id="name" label="Mi boU tón" onclick="alert('Hola');"/>

En este código añadimos el controlador onclick y dentro de las comillas decimos lo que queremos que haga el controlador. En este simple ejemplo usamos la función de alerta de Javascript para que aparezca una caja de dialogo con la palabra “Hola” dentro. Si ahora salvamos el código, recargamos la página y pulsamos el botón veremos las cajas que aparecen cuando pulsemos con el ratón.

y gestionar muchas funcionalidades, también pueden ser simples. Exploraremos nuestra primeras funciones en Javascript con un ejemplo muy sencillo. Para usar funciones se recomienda poner todas las funciones en un archivo separado y acceder al mismo desde nuestro archivo de comandos XUL. Para empezar debemos crear un archivo llamado funtions.js y añadirle el siguiente código: function func_showdialog() { alert("Esto es una función"); }

Este código contiene una serie de elementos claves. La primera línea dice que

Evento onclick

function func_getinfo() { var info=document.getElementById(' textbox'); alert(info.value); }

Descripción se llama a la acción de pulsar y soltar el ratón sobre un elemento. Sólo debemos usar el evento onclick cuando tenemos una razón para responder a pulsaciones de ratón. Para botones,elemen tos de menús y similares debemos usar oncommand como respuesta porque responde también a usuarios que usan el teclado u otros dispositivos.

onmousedown

acción de pulsar el ratón sobre un elemento. El gestor de eventos será llamado tan pronto el botón del ratón sea presionado,incluso antes de ser soltado.

onmouseup onmouseover

cuando el botón del ratón se suelta estando sobre un elemento. se llama a la acción de mover el puntero del ratón sobre un elemento. Podemos usar esta acción para destacar un elemento,si bien CSS proporciona una manera de hacer esto automáticamente, por lo que no debemos usar un evento para esto. Pero por ejemplo puede que queramos mostrar un texto de ayuda sobre una barra de menú.

onmousemove

acción de mover el puntero del ratón mientras está sobre un elemento. El evento será ejecutado muchas veces si el usuario mueve el ratón,por lo que debemos evitar usar este evento en la medida de lo posible.

onmouseout

se llama a la acción de mover el puntero del ratón fuera de un elemento. Puede que entonces dejemos de destacar el elemento o quitemos el texto marcado.

oncommand

evento que ocurre cuando se selcciona un botón o elemento de un menú. Para menús debemos añadir este evento al elemento menuitem. Debemos usar este evento en lugar de manejar el ratón nosotros mismos puesto que el usuario puede seleccionar el botón o el elemento del menú usando el ratón, una tecla de acceso directo o atajos del teclado.

onkeypress

ocurre cuando una tecla se presiona y suelta cuando un elemento tiene el enfoque. Puede que queramos usar este evento para añadir una tecla de acceso directo extra o para verificar la posi bilidad de incluir determinados caracteres en un campo.Veremos como crear accesos directos desde el teclado en posteriores números.

onkeydown

se ejecuta cuando se presiona una tecla mientras un elemento tiene el enfoque. Debemos obser var que el evento se ejecutará en cuanto se presiona la tecla,incluso antes de que ésta sea soltada. Puede que no usemos este evento habitualmente, puesto que hay otros eventos de teclado más usuales.

onkeyup onfocus

se ejecuta cuando una tecla es soltado teniendo un elemento el enfoque.

onblur

se ejecuta cuando un elemento deja de tener el enfoque debido a que hemos pulsado otro ele mento o pulsamos el tabulador. Podemos usarlo para verificar información o cerrar elementos emergentes. No obstante es recomendable verificar campos al pulsar el botón de confirmación (OK).

onload

se ejecuta en una ventana al abrirse. Normalmente añadiremos este evento a la etiqueta de una ventana para inicializarla. Estos añadirá usualmente valores por defecto en condiciones incluidas en el código.

onunload

se ejecuta cuando se cierra una ventana. Normalmente añadiremos esta etiqueta de ventana para registrar información antes de que esta se cierre.

Listado 4: second.js 01 02 03 04 05 06 07

estamos creando una función (“function”) y que queremos llamarla fun_showdialog. Los paréntesis vacíos se usan para indicar que nuestra función no procesa nada. Una actividad propia de las funciones es pasarles información entre paréntesis, procesando la información y devolviendo el resultado. Con nuestra función simplemente estamos ejecutando el código dentro de ella y no procesado nada, siendo este el motivo de que los paréntesis estén vacíos. Las llaves indican la extensión de la función. El código dentro de la función comienza tras el símbolo { y termina tras el símbolo }. En nuestra función actual solo tenemos una línea que nos da un caja de dialogo de alerta familiar. El

Eventos XUL

Todo Funciona Como podemos observar en nuestro primer ejemplo, añadir funcionalidad a un widget es muy sencillo. Al margen de la sencillez, nos encontramos con el problema de que nuestro código va ha ser muy largo y confuso si ponemos toda su funcionalidad entre marcas de comillas. ¿Qué hacemos si lo que necesitamos es hacer algo de matemáticas, procesado expansivo y magia con la programación que requeriría mucho código escrito? La respuesta es hacer nuestra propia función. Una función es un bloque de código que puede ser llamado por otro trozo de código. Podemos considerar las funciones como libros dentro de librerías. Podemos estar leyendo un libro y no entender un asunto concreto, cogiendo entonces otro libro que nos aclare el asunto. Lo que nos permite básicamente una función es empaquetar conjuntamente en código un complejo paquete de programación y acceder a ésta de una forma simple en sólo una línea. Si bien las funciones pueden resultar complejas

LINUX USER

se ejecuta cuando un elemento obtiene el enfoque bien mediante la pulsación del ratón o por el uso del tabulador. Podemos usar este evento para destacar un elemento o mostrar texto.

www.linuxmagazine.com.es

Número 02

81


LINUX USER

XUL

(ID) textbox que es nuestra caja de texto. Podemos observar que la función getElementById está escrita justo al lado de la palabra document. La forma de funcionar es que document se refiere a nuestro documento XUL principal y a los widgets incluidos en él.

Punto Figura 1: Nuestro primer código Javascript habili-

Figura 2: Usando DOM para conectar nuestras

tado.

widgets.

punto y coma que aparece tras cada una de las líneas de la función es importante. Se utiliza para indicar el final de cada línea en Javascript.

Debemos asegurarnos de que este atributo es único y fácil de recordar, puesto que nos referiremos a los widgets por él. En nuestro código también hemos cambiado el nombre de la función a fun_getinfo() al igual que el nombre del archivo de nuestra función en la línea 9 a seconds.js. El siguiente archivo que debemos editar es seconds.js. Añadimos el código del listado 4. En este código es donde realmente ocurre la acción. El objetivo de este código es que el usuario pueda escribir algo en la caja de texto y que los contenidos de la caja sean mostrados en la caja de alertas de diálogo. Para hacer esto necesitamos comunicarnos con la caja de texto, obtener la información y ponerla en la caja de alertas. En la primera línea del código de la función creamos una nueva variable llamada info. Para hacer esto usamos la palabra clave var para indicar que info es una variable. Para aquellos no familiarizados con variables, una variable nos permite almacenar información en la memoria del ordenador y referirnos a ella con un nombre. Podemos pensar en las variables como una caja de cartón con un nombre escrito en su lateral. Si metemos algo en la caja nos podemos referir a ella por el nombre que aparece en el lateral. En este caso el nombre escrito en el lateral es info. En la misma línea de nuestro código var info fijamos los contenidos de la variables con el código a la derecha del signo =. Este es el código que realmente coge la información de la caja de texto. Dentro del código utilizamos la función getElement-ById de Javascript para acceder al widget con la identidad

Conexión Con nuestra función acabada ya estamos listos para conectarla a nuestro código XUL principal. primero necesitamos cargar el archivo funcions.js en nuestro archivo XUL como fuente de nuestro código. Para hacer esto usamos la etiqueta <script> dentro de la etiqueta <window> para especificar la fuente del archivo. Adicionalmente también necesitamos cambiar el contenido del atributo onclick del botón al nombre de nuestra función. Para clarificar estas modificaciones mostramos el código completo en el listado 2. La principal razón por la que he reproducido el código complete ha sido para demostrar el correcto emplazamiento del código nuevo. Si pusiésemos la etiqueta <script> debajo de las etiquetas <?xml> (un error muy común en aquellos que piensan que el script se aplica al archivo entero) obtendríamos un error y nuestro esfuerzos serían baldíos. Debemos estar seguros de que nuestro script está dentro de la etiqueta <window>.

Exploración de DOM Avancemos y exploremos DOM un poco más. Para empezar, crearemos un poco de código nuevo. Este nuevo archivo lo vamos a llamar second.xul, al que le añadiremos el código del listado 3. En este código tenemos dos elementos gráficos principales: una caja de texto y un botón. Es importante observar como cada widget tiene un atributo id que le proporciona un nombre único.

82

Número 02

www.linuxmagazine.com.es

El símbolo del punto (.) indica que el código a la derecha del mismo debe ser aplicado al código a la izquierda del símbolo. En este caso buscamos un widget dentro del id textbox dentro de nuestro documento principal. Con esta línea completa tenemos los contenidos de nuestra caja de texto almacenados en nuestra variable info. El concepto de usar puntos para indicar dónde aplicar la función es común a muchos lenguajes de programación. Usamos este concepto de nuevo en la segunda línea al usar la función value para obtener el valor de la variable info. Anidamos este código dentro de la función alerta para mostrarlo en la caja de dialogo. Debemos prestar atención a que no se usan comillas dobles en el código de la caja de alertas. Solo usamos comillas dobles cuando queremos imprimir texto (llamado string o cadenas en castellano) en la caja de alertas. En nuestra caja de alertas, en esta ocasión, estamos imprimiendo los contenidos de la variable.

Conclusión En este número hemos realizado unos importantes primeros pasos hacia conseguir un interfaz funcional XUL. Todavía nos falta camino por andar, pero estos cimientos harán nuestros programas futuros sean más sencillos de escribir y entender. Siempre es importante tener claro los fundamentos antes de continuar el camino. En el siguiente capítulo vamos a continuar con algunas funciones y funcionalidades más elaboradas para unir diferentes partes de nuestras interfaces XUL. Hasta entonces debemos mirar con detenimiento los ejemplos que hemos visto e intentar entenderlos con el mayor detalle posible. Si hay conceptos aún confusos no debemos preocuparnos, puesto que la mayoría serán explicados con mayor detalle en próximos números. ¡Buena ■ suerte!


Educación

LINUX USER

El servidor interactivo de actividades matemáticas WIMS (II)

Bienvenidos a la Aula Virtual Acabábamos el primer artículo sobre WIMS[1] prometiendo dedicar espacio a aprender a crear clases virtuales y a desarrollar nuestras propias actividades. Es el momento de cumplir nuestras promesas: explicaremos cómo se crean las clases, cómo se las llena de contenido, cómo se inscribe a los alumnos y el modo en que pueden trabajar. POR JUAN RAFAEL FERNÁNDEZ

L

as clases virtuales son un mecanismo que permite a los profesores organizar el trabajo de los alumnos en torno a los distintos tipos de recursos de un sitio WIMS y les permite también realizar un seguimiento de sus progresos. Recordemos que en la página inicial (ver la figura 1) teníamos un enlace al área de profesores. Entremos en este espacio y podremos conocer las clases que ya han sido creadas y tendremos la oportunidad de crear una clase nueva. Eso es lo que vamos a hacer ahora, crearemos una clase de ejemplo, a la que vamos a llamar Artículo sobre WIMS. Varias aclaraciones son necesarias antes de que se creen confusiones: el sistema utiliza el término supervisor para referirse al profesor que

Figura 1: Página inicial de un servidor WIMS.

crea la clase y la va a administrar. Este administrador de la clase no debe confundirse con un administrador del sistema y no necesita permisos especiales. Por otro lado es necesario que la máquina que realiza la función de sitio WIMS pueda enviar correo y que el profesor tenga una cuenta, porque el mecanismo de autentificación se basa en una contraseña que se le envía por correo. Por último se nos ofrece también la posibilidad de crear superclases, para supervisar grupos de clases. Evidentemente no es esta la tarea que nos urge ahora. Rellenaremos el formulario de creación de la clase como en la figura 2. A la hora de configurar el acceso de los alumnos tenemos varias posibilidades: que todo el mundo pueda entrar en la

clase, que el profesor inscriba a los alumnos manualmente o la entrada mediante una contraseña que el profesor comunica a los alumnos. El sistema preferido es este, por razones bien explicadas en la ayuda de WIMS: la entrada no-restringida presenta problemas de control y de seguridad para los administradores, y requiere que se habilite expresamente. Por otro lado, la entrada manual, además de ser laboriosa, es más propia de sistemas cerrados y comerciales de educación (no obstante, hay habilitado un sistema de importación de datos a partir de hojas de cálculo y de ficheros en formato csv). Una contraseña por clase es un sistema sencillo y razonablemente abierto; es el sistema que vamos a utilizar.

Figura 2: Creación de una clase virtual.

www.linuxmagazine.com.es

Número 02

83


Educación

LINUX USER

Figura 3: Confirmación de que se ha creado la clase.

Rellenados los campos y pulsado el botón de enviar, WIMS comprueba la corrección de los datos y nos presenta otra pantalla en la que deberemos confirmar datos y contraseñas. Finalmente, envía el mensaje de correo con la contraseña aleatoria que permitirá crear la clase. En este caso es 60009 (ningún secreto, son contraseñas de un solo uso), la figura 3 nos muestra la pantalla de confirmación de que se ha creado la clase y nos presenta tres enlaces que deberemos guardar: la página de administración de la clase, la de inscripción de alumnos y el enlace a la página de trabajo de los estudiantes.

Figura 4: Administración de la clase.

Administración de una clase virtual La figura 4 nos muestra la interfaz de administrador de las clases. Recordemos que hemos creado la clase, pero no hemos inscrito a ningún alumno y está vacía de contenidos[2]. Vamos a entrar ahora como alumno (desde la página inicial pulsando en la zona de alumnos, área de estudiantes) y a inscribirnos en la clase. La figura 5 nos muestra este momento. Previamente el profesor nos habrá comunicado la contraseña de acceso a la clase. Nos inscribimos y comprobamos que todo funciona poniendo un mensaje en el foro del grupo.

Entramos nuevamente como profesor, contestamos al mensaje del foro como señal de cortesía, y nos centramos en el tema: es el momento de añadir actividades ya disponibles en WIMS, previamente a aprender a crear las nuestras propias. Para ello añadamos una de cada uno de las tipos de recursos disponibles, salvo las votaciones y encuestas, que considero de menor interés en este primer momento. Y además el uso de esta funcionalidad es de aprendizaje fácil e intuitivo. Si hacemos clic en documento podremos crear una lección. Los llamados documentos de WIMS son conjuntos de páginas html con un conjunto de

Tabla 1: Lista de directivas directiva

número de parámetros

descripción

title

1

define el título de un ejercicio

language

1

el lenguaje del ejercicio,en,es o fr

author

1

define el autor del ejercicio

email

1

define la dirección de e-mail del autor

format

1

formato de la explicación

precision

1

precisión al comparar la respuesta del usuario con la solución. Damos un entero positivo n aquí:la comparación se hará con precisión de 1/n

range

1

rango de la variable cuando se evalúa una función proporcionada por el usuario. Se daría con la forma n1..n2,donde n1 es el punto inicial, n2 es el punto final

statement

1

El parámetro es la explicación del ejercicio

plot

?

un gráfico dinámico (en construcción)

answer

2

define una respuesta libre. El primer parámetro es el texto de la pregunta, y el segundo,la respuesta correcta. El tipo de respuesta (numérica o funcional) se determinará automáticamente de acuerdo a la respuesta correcta

choice

3

define una elección múltiple. El primer parámetro es el texto de la elección,el segundo,la(s) elección(es) correcta(s), y la tercera la(s) otra(s) elección(es). Los últimos dos parámetros serían listas separadas por comas. Se permiten mútiples elecciones correctas. Si una elección aparece tanto en la lista de elecciones correctas y erróneas,se tomará como buena.

condition

2

define una condición especial para la evaluación de respuestas libres

solution

1

da la solución del ejercicio con la explicación. El gestor OEF puede decidir si mostrar esta explicación al usuario,de acuerdo con el nivel de dificultad asignado

hint

1

da una pista sobre el ejercicio. El gestor OEF puede decidir si mostrar la pista, de acuerdo con el nivel de dificultad asignado al usuario

84

Número 02

www.linuxmagazine.com.es


Educación

Figura 5: Inscripción en una clase.

ventajas frente al uso de páginas html de origen externo: en primer lugar permiten el enlace de ejercicios WIMS para acompañar la teoría con la práctica, y la integración de ejemplos que permiten la explotación de su potencia de cálculo. Por último incluyen la posibilidad de plegar y desplegar secciones, facilitando la claridad de exposición o el acceso al detalle si es necesario. Un buen ejemplo de documento de este tipo siempre disponible es la ayuda de WIMS, basta desplegar una sección para que nos aparezca la opción de volver a cerrarla. En nuestro caso se tratará de la incorporación de un documento escrito en LaTeX (los documentos incorporados pueden ser documentos LaTeX, html o documentos fuente WIMS, .src, que el sistema se encarga de convertir a html. No obstante, siempre es preferible el uso de este formato, por seguridad de que el resultado va a ser el deseado y por velocidad)[3]. El resultado se puede apreciar en la figura 6. ¿Cómo se añade un ejercicio? No pulsaremos en ejercicio o ejercicios de la clase porque estos nos lanzan el proceso de creación de ejercicios nuevos. Lo que haremos será crear una hoja de ejercicios a la que añadiremos varios ejercicios del nivel en el que estamos trabajando, H1. En primer lugar creamos la hoja, le pondremos un título (por ejemplo Ejercicios con fracciones) y volvemos a la página de administración, donde constará que está en preparación. Pondremos levelH1 en la casilla de búsqueda (estamos creando una clase del primer año

LINUX USER

Figura 6: Un documento LaTeX en una lección WIMS.

de secundaria) y seleccionaremos Ejercicios OEF (recordemos que OEF significa Online Exercise Format, Formato de Ejercicios En línea) o Actividades WIMS como las categorías donde vamos a buscar. Seleccionamos el ejercicio Fracciones OEF, lo configuramos fijando sobre todo el nivel de dificultad y lo lanzamos. Al pie de la página aparecerá el enlace que nos permitirá insertar el ejercicio en la hoja. Pulsamos y confirmamos los datos y el sistema nos devuelve a la página de preparación de la hoja, donde aparecerá el ejercicio que hemos añadido. Así podremos seguir modificando la hoja hasta que la consideremos completa. Finalmente deberemos activarla para que pueda ser utilizada por los alumnos; debemos tener en cuenta que la activación implica que ya no podremos realizar más modificaciones sobre ella (más exactamente no podremos realizar modificaciones sin perder los datos del progreso de los alumnos). La figura 7 nos muestra el resultado de este proceso tal como lo verá un alumno. La documentación nos proporciona una serie de consejos importantes para el uso eficaz de las hojas de ejercicios: en el comentario que acompaña a la hoja conviene dar información clara sobre las condiciones de uso de la hoja (recordemos que podemos configurar repeticiones de práctica para ejercicios que no son evaluables en sí mismos y ajustar la ponderación de la nota de cada ejercicio en el cálculo de la media de todos los ejercicios).

¿Cómo se crea un examen? Con un título y los ejercicios de una hoja de ejercicios. Se le pone una fecha límite de realización y un tiempo para el examen y un número de oportunidades. Finalmente se activa. Ahora la página de administración de la clase tiene un aspecto distinto del inicial (figura 8).

Creación de ejercicios sencillos con createxo Creemos una nueva hoja de trabajo y pulsemos en ejercicio: hemos lanzado la aplicación createxo, que nos permitirá generar de forma interactiva y sencilla nuevas actividades. Createxo viene muy bien documentada en la documentación integrada en WIMS. Antes de lanzarnos a explorar la interfaz, deberemos plantearnos las características del ejercicio que queremos generar: con qué tipo de preguntas vamos a trabajar (de texto, numéricas, gráficas…) y el tipo de respuestas que esperamos (única entrada tecleada por el alumno, múltiple para elegir la correcta…). En WIMS el número de respuestas correctas puede ser única (la capital de España es Madrid), múltiple pero cerrada o múltiple abierta (cuatro capitales europeas), o infinita (dos números cuya suma sea 0, respuestas: -1 y +1, -2 y +2, …); lo que es necesario es que el resultado sea computable. Además la pregunta admite parámetros modificables aleatoriamente y el mismo ejercicio puede utilizarse repetidas veces sin que nunca sea igual. Mejor ejercicio que el del ejemplo primero será la capital del país

www.linuxmagazine.com.es

Número 02

85


LINUX USER

Educación

Figura 8: Una clase completa.

Figura 7: Hoja de trabajo para los alumnos.

europeo X es Y, donde X se selecciona aleatoriamente. Nuestro primer ejercicio es el de mayor simplicidad posible: nos pregunta cuál es la capital de España y debemos teclearla en una pequeño recuadro. Lo hemos generado sin ver una línea de código. Podemos aprender más leyendo la documentación (disponemos incluso de algunos ejercicios comentados) y examinando, modificando y ampliando los ejercicios ya disponibles. Empezaremos por examinar el código que hemos generado, vamos a levantar el capó y mirar cómo funciona el motor. Porque además es que estamos hablando de un programa de unas cuantas líneas de cabecera y cuatro líneas reales de programación. 01 \title{Ejercicio de respuesta única} 02 \language{es} 03 \range{-5..5} 04 \author{Juan Rafael Fernández} 05 \email{juanrafael.fernandez @hispalinux.es} 06 \computeanswer{no} 07 \format{html} 08 \precision{10000}

09 10 11 \statement{¿Cuál es la capital de España?} 12 13 \hint{Está en el centro de la península ibérica} 14 \answer{La capital es}{Madrid} {type=set} 15 16 \solution{Madrid es la capital del Reino de España desde 1561,año en que Felipe II trasladó allí su corte.}

Acabamos de echar nuestro primer vistazo al formato OEF. A los que conozcan LaTeX, les resultará muy familiar (y para los que no, pueden seguir el curso de LaTeX que comenzó el mes pasado en Linux Magazine). Se compone de directivas (en nuestra primera línea es \title) seguidas por uno o más parámetros encerrados entre corchetes. La directiva \answer (respuesta) admite tres parámetros, el texto que acompaña a la respuesta (lo que en inglés se llama prompt), la respuesta propiamente

BIBLIOGRAFÍACOMPLEMENTARIA A LA DEL ARTÍCULO ANTERIOR Las FAQ se instalan con el paquete wims-common, pero siempre habrá una versión más actualizada en http://wims.auto.u-psud.fr/wims/faq/fr/. Sobre los ejercicios OEF http://wims.auto.upsud.fr/wims/wims.cgi?lang=fr&+module=adm/doc.fr&+cmd=new&+job=read&+doc=1027&+b lock=main.

86

Número 02

www.linuxmagazine.com.es

dicha y el tipo de respuesta que es (numérica…). Como podemos ver en la tabla 1, todo ejercicio OEF empieza con su título, el idioma es que está creado y los datos del autor (nombre y dirección de correo electrónico). Vemos también que el lenguaje es de muy alto nivel. No nos cuesta nada hacer una versión más avanzada (figura 9): 01 \title{Ejercicio con respuesta múltiple} 02 \language{es} 03 \range{-5..5} 04 \author{Juan Rafael Fernández} 05 \email{juanrafael.fernandez @hispalinux.es} 06 \computeanswer{no} 07 \format{html} 08 \precision{10000} 09 10 \statement{La capital de España es...} 11 12 \choice{Capital actual de España} {Madrid} {Benalmádena, Toledo, Valladolid}

Un aviso: las respuestas correctas se muestran cuando comprobamos los ejercicios porque estamos trabajando en modo supervisor. ¡Los alumnos no lo tendrán tan fácil! Vemos que el sistema añade la respuesta no lo sé (esto es configurable), y deja fuera aleatoriamente una de las respuestas erróneas que hemos proporcionado. Finalmente


Educación

Figura 9: Un ejercicio OEF.

crearemos un ejercicio que modifica la pregunta a partir de un listado de países y sus capitales. Esto nos servirá para aprender cómo funciona la selección aleatoria de preguntas. 01 \title{Ejercicio con parámetros} 02 \language{es} 03 \range{-5..5} 04 \author{Juan Rafael Fernández} 05 \email{juanrafael.fernandez @hispalinux.es} 06 \computeanswer{no} 07 \format{html} 08 \precision{100} 09 10 \matrix{data= 11 Madrid,España 12 Lisboa,Portugal 13 Roma,Italia

LINUX USER

Figura 10: Una vista del foro de la clase.

14 } 15 \text{row=randomrow(\data)} 16 \text{capital=item(1,\row)} 17 \text{pais=item(2,\row)} 18 19 \statement{ 20 <p> 21 <center> 22 ¿Cuál es la capital de \pais? 23 <p> 24 <br> 25 \embed{reply 1,18} 26 </center> 27 } 28 \answer{La capital de \pais es...}{\capital} {type=atext}

Hasta este momento no hemos utilizado más que actividades ya disponibles y creado ejercicios con Createxo. La documentación de WIMS nos deja claro que la verdadera potencia del sistema se logra cuando se utiliza Modtool para crear módulos WIMS. Con Createxo no se tiene control sobre la notación del ejercicio, ni sobre la progresión de la dificultad. Por otro lado Modtool es mucho más flexible pero requiere mucho Figura 11: Podemos ver el progreso del alumno con WIMS. más trabajo: es

una herramienta para programadores. Y esa es otra película…

… Y el Mes que Viene En la tercera y última parte veremos cómo se aplica todo lo que hemos aprendido a una clase real, y haremos un balance de los valores pedagógicos de ■ WIMS.

NOTAS [1] Hablábamos en el artículo anterior del Web Interactive Mathematical Server; pues bien, la aplicación ha cambiado de nombre oficial para subrayar su flexibilidad a WWW Interactive Multipurpose Server. El artículo anterior se puede descargar de http://www.linuxmagazine. com.es/issue/01. [2] Para los obsesos de la seguridad y de la salvaguardia de sus datos informaremos de que lo que se ha creado es un subdirectorio en /var/lib/wims/log/classes, del que podemos hacer copias de seguridad. En nuestro caso la clase se guarda con el nombre de 9128182, y a medida que vamos añadiendo actividades contendrá a su vez las carpetas doc para los documentos, exam para los exámenes, sheet para las hojas de ejercicios, forum para el foro o tablón de anuncios, vote para las encuestas, score y noscore para registrar la marcha de los alumnos, y src y def para los fuentes y los ejercicios generados. Además se guarda el número y datos de los alumnos inscritos en la clase. [3] Las FAQ nos informan de que es posible hacer referencia a cualquier otro tipo de documentos (pdf, imágenes, ficheros de sonido, etc.) en nuestras lecciones. Basta seguir el enlace depósito de ficheros.

www.linuxmagazine.com.es

Número 02

87


LINUX USER

LaTeX

LaTeX en Linux (2ª Parte)

Tipografía Profesional al Alcance de Todos Continuando con el artículo que os presentamos en el número anterior de nuestra revista en el que nos introducíamos en el mundo de la Tipografía Profesional de la mano de LaTeX, en esta nueva entrega os vamos a ir mostrando con mayor detalle todas las múltiples, y a veces casi mágicas, posibilidades que este sistema de escritura nos ofrece. POR JOSE MANUEL GONZÁLEZ VIDA

C

oncretamente vamos a abordar desde el uso de texto de distintos colores hasta el uso de referencias cruzadas, listas o enumeraciones. Veremos con ello la razón por el cual, si bien hasta hace pocos años LaTeX era usado fundamentalmente por matemáticos y demás gente “rara”, en la actualidad su uso está siguiendo un ritmo de crecimiento exponencial dentro de ámbitos profesionales, universitarios e incluso dentro del público en general, y hay motivos por ello. Por ejemplo…

¿LaTeX genera sólo ficheros DVI? Aquí os presentamos una primera sorpresa… LaTeX genera también de manera muy fácil documentos de tipo PDF con calidad profesional. Para ello sólo hay que compilar el texto de nuestro documento con el compilador PDFLaTeX. Seguramente ya lo tendremos instalado en nuestro ordenador al instalar el paquete teTex, pero si no fuera así buscaremos en el programa de gestión de software de nuestra distribución de Linux el paquete pdflatex y lo instalaremos. El uso de este nuevo compilador es casi idéntico al que hemos usado en nuestro artículo anterior con la única diferencia de que ejecutaremos en nuestro terminal la orden pdflatex en lugar de latex para compilar nuestro documento. El formato PDF tiene la ventaja de ser más estandarizado que el DVI y

88

Número 02

se puede usar incluso para colgar documentos en Internet. Vamos a empezar a generar documentos. En todos los ejemplos que vamos a ir viendo utilizaremos el siguiente formato de fichero: \documentclass[a4paper,12pt]U {article} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[spanish]{babel} \begin{document} Aquí va el cuerpo del documento \end{document}

Nótese, que además de los paquetes que explicamos el mes pasado, hemos incluido el paquete fontenc con la opción <T1> cuya utilidad es, “enseñar” a LaTeX a cortar adecuadamente las palabras con acentos que caigan al final de una línea.

El Maravilloso Mundo del Texto Multicolor En nuestro artículo anterior veíamos cómo cambiar el tipo de fuente y cómo usar letra negrita, itálica, etc. Sin embargo también es típico en cualquier procesador de texto el poder cambiar el tamaño de texto o incluso su color. En LaTeX existen distintos tamaños de letra predeterminados por las instrucciones (de mayor a menor) \Huge, \huge, \LARGE, \Large, \large, \normalsize, \small, \footnotesize y \tiny. Naturalmente, salvo que usemos

www.linuxmagazine.com.es

alguna de estas instrucciones, LaTeX adapta el tamaño de letra de cada apartado de nuestro documento de forma automática. Si observamos los ejemplos de nuestro último artículo el tamaño de la fuente del título, del autor, de una sección, etc. son distintos según el nivel en el que nos encontremos y ese trabajo lo hace LaTeX automáticamente. Uno de los efectos más llamativos en la presentación de un documento es el poder cambiar los colores del texto. Para ello, en el preámbulo de nuestro documento, tenemos que incluir el paquete \usepackage[controlador] {color} junto con un controlador que debemos elegir en función del compilador que vamos a usar para generar nuestro documento. Si usamos como compilador latex el nombre del controlador que tenemos que colocar es dvips. Por el contrario, si usamos pdflatex el nombre del controlador es pdftex. Una vez cargado este paquete disponemos, en principio de 6 colores, rojo (red), azul (blue), verde (green), cian (cyan), magenta (magenta) y amarillo (yellow). Para insertar en el texto una frase o pa-labra en color usaremos la instrucción \textcolor{nombrecolor}{texto}, donde el nombrecolor es el nombre del color en inglés. Pero ¿sólo tenemos 6 colores? La respuesta es no, de hecho si añadimos al paquete color, además del controlador antes mencionado, la opción usenames disponemos de los 68 colores que mostramos en la Figura 1.


LaTeX

Referencias cruzadas Otra de las grandes ventajas que tiene LaTeX es el uso de lo que se denominan referencias cruzadas, es decir, añadir a determinadas partes del texto ciertas “etiquetas” para poder hacer referencia a ellas posteriormente. Para ello vamos a usar tres instrucciones, \label{etiqueta}, \ref{etiqueta} y \pageref{etiqueta}. El uso es muy sencillo y para verlo lo mejor es un ejemplo. Introducimos en el cuerpo de nuestro documento las siguientes líneas y lo compilamos dos veces seguidas:

LINUX USER

Figura 1: Tabla con los 68 colores de texto que nos proporciona la opción usenames del paquete color.

Figura 2: Un primer

01 \section{Las referencias cruzadas en \LaTeX} 02 \label{sec:refcru} 03 En este apartado estamos aprendiendo a manejar 04 referencias cruzadas con \LaTeX. 05 06 \section{Creación de Listas} 07 \label{sec:tablas} 08 En esta sección abordamos la creación de listas \dots 09 10 \dots como podemos ver en la sección \ref{sec:refcru} 11 (véase página \pageref {sec:refcru}) \LaTeX \ permite 12 hacer referencias cruzadas de manera muy fácil \dots

(\dots, por cierto, sirve para mostrar puntos supensivos […]). Si vemos el resultado de nuestro ejemplo comenzamos a ver la potencia de LaTeX. ¿Cómo han funcionado las referencias cruzadas? Observemos que, en primer lugar hemos puesto etiquetas a las dos secciones de nuestro documento. Como etiqueta se puede colocar cualquier palabra (sin espacios ni símbolos “raros”). Normalmente para “etiquetar” alguna parte de nuestro documento se suelen usar algunos caracteres indiquen de qué tipo de estructura se trata (aquí la parte sec: la utilizamos para indicar que estamos etiquetando una sección) seguida de otra palabra que relacionemos con la zona etiquetada. Posteriormente cuando en nuestro texto queramos hacer referencia a esa estructura (en el ejemplo es una sección) podemos emplear \ref{etiqueta} de modo que al compilar dos veces LaTeX sustituirá la instruc-

ejemplo de una lista de tipo enumerate.

ción \ref{etiqueta} por el número que LaTeX haya asignado automáticamente a la sección en cuestión. El comando \pageref{etiqueta} hará referencia al número de la página de nuestro documento donde se encuentra la estructura etiquetada. Una cuestión a tener en cuenta es el no repetir etiquetas, ya que las referencias apuntarían a etiquetas equivocadas. LaTeX nos avisa en el proceso de compilación si tenemos etiquetas repetidas con un mensaje del tipo LaTeX Warning: Label ‘NombreEtiqueta’ multiply defined. También nos puede pasar que al hacer alguna referencia nos equivoquemos al escribir la etiqueta y tal etiqueta no exista. En tal caso el error que nos devuelve LaTeX al compilar es LaTeX Warning: Reference ‘NombreEtiqueta’ on page x undefined on input line xxx. De cualquier manera, hay que observar dos detalles: en ambos casos el proceso de compilación del documento no se detiene, por lo que conviene estar atentos a la salida que obtenemos del compilador y, por otra parte, si hay eti-

quetas mal referenciadas en el documento final veremos dos símbolos de interrogración, ??, en aquellas referencias que no tienen etiqueta. Tal vez lo mejor para manejar este tipo de errores sea retomar el ejemplo anterior y hacer dos pequeños ejercicios de los errores que acabamos de mencionar, compilar el resultado y ver lo que nos devuelve el compilador.

Listas Una forma habitual de presentar información estructurada en cualquier documento es usando listas con sus distintos elementos, bien sean numerados o no. Incluso, a veces, es necesario anidar unas listas dentro de otras unas numeradas de una forma y otras de otra, etc. En esta sección aprenderemos a crear listas con LaTeX y veremos lo fácil que nos pone su tratamiento: numeraciones automáticas, sangrías relativas al nivel de cada lista también automáticas, etc. Lo mejor será comenzar viendo un ejemplo. Añadamos lo siguiente al cuerpo de nuestro documento LaTeX

www.linuxmagazine.com.es

Número 02

89


LINUX USER

LaTeX

Figura 3: Un segundo ejemplo con listas anidadas.

Figura 4: Una lista descriptiva, con los nombres de los campos en negrita.

RECURSOS [1] El libro de LaTeX. B. Cascales y otros. Ed. Prentice Hall. 2003. [2] LaTeX, a document preparation system. L. Lamport. 2ª Ed. Ed. Addison-Wesley. 1994. [3] Comprehensive TeX Archive Network: http://www.ctan.org [4] XFIG Drawing Program for the X Window System: http://www.xfig. org

dentro de la sección Creación de Listas: \begin{enumerate} \item Aquí colocamos un ßßelemento de la lista. \item Y aquí otro elemento. \end{enumerate}

Compilamos el documento anterior y observamos el resultado. Debe ser parecido al que reproducimos en la Figura 2. Observemos que cada elemento de la lista aparece automáticamente numerado y con una sangría horizontal específica para todos los elementos de su mismo nivel en la lista. Compliquemos el ejemplo añadiendo otra lista anidada: \begin{enumerate} \item Aquí colocamos unU elemento de la lista. \item Y aquí otro elemento. \begin{itemize} \item Un primerU elemento en el segundo nivel. \item Otro elemento enU este nivel. \end{itemize} \end{enumerate}

90

Número 02

El resultado ahora (ver Figura 3) nos muestra dos listas de distinto tipo Figura 5: Nuestro documento también se puede guardar como PDF. anidadas. En LaTeX existen tres tipos de listas con el texto que hemos puesto entre definidas por sus correspondientes corchetes resaltado en negrita y a continentornos: enumerate, itemize y uación el resto del elemento. description. El formato es siempre el Podéis probar a poner varios niveles mismo: \begin{TipodeLista} y anidados de una lista de tipo enumerate \end{TipodeLista} y los elementos o o itemize y observar que la numeración elementos de la lista van precedidos o los símbolos que emplean para cada del comando \item. Las listas de tipo nivel cada uno de estos entornos es disenumerate son listas numeradas, tinta. En principio LaTeX nos permite mientras que las del tipo itemize profundizar hasta cuatro niveles con emplea pequeños iconos en cada cualquiera de estos entornos. nivel. Por último las listas de tipo Conclusión description tienen un formato ligeramente diferente. Lo vemos en el siguComo hemos podido comprobar, LaTeX iente ejemplo: puede hacer mucho más aparte de mostrar generar texto llano. Con los dis\begin{description} tintos formatos y colores de letras, las \item[Nombre:] Fulanito. referencias y listas, podemos dotar a \item[Apellido:] Gutiérrez. nuestros documentos de agilidad y clar\item[Cargo:] Presidente. idad, conservando siempre un aspecto \end{description} muy profesional. El mes que viene ahondaremos en Si compilamos nuestro documento escriotros aspectos para mejorar la prebiendo en el cuerpo del mismo el ejempsentación de nuestras obras con la lo anterior obtendremos como resultado inclusión de gráficos y fórmulas ■ una lista donde cada elemento comienza matemáticas.

www.linuxmagazine.com.es


5

buenas razones para suscribirse

SI UTILIZAS LINUX, NECESITAS LINUX MAGAZINE 1 2 3

AHORRO Más del 15% descuento con respecto al precio de portada: Consigue 12 números por el precio de 10 y 4 DVDs ¡Gratis!

4

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

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

5

RENOVACIÓN AUTOMÁTICA A diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios para que renueves tu subscripción. Con Linux Magazine, tu subscripción se renovará cada año. Recibirás una confirmación aproximadamente 60 días antes del final de tu periodo de subscripción, pero no se requiere que hagas nada al respecto para seguir suscrito.

GARANTÍA DE DEVOLUCIÓN DE DINERO Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el precio de todos los números que no hayas recibido. Sin preguntas, sin fechas de cancelación, sin problemas.

Pedidos online: www.linuxmagazine.com.es/subs o utiliza el formulario al dorso W W W. L I N U X M A G A Z I N E . C O M . E S / S U B S


Formulario Suscripción Para un servicio más rápido, realice su pedido online en: www.linuxmagazine.com.es

(+ 34) 951 010 516

Dirección Facturación

Número Inicial Zona

Modo de Pago Dirección Envío

Condiciones


head, tail

LINUX USER

Head, Tail, Cat

De Cabo a Rabo Pequeñas utilidades como head, tail y cat se usan para mostrar el contenido de los ficheros de texto. Otros comandos y programas proporcionan funciones parecidas. Aunque todos traten con ficheros de texto, estas herramientas de línea de comando son dignas de mención ya que pueden combinarse para formar potentes herramientas. POR HEIKE JURZIK

L

inux proporciona unos cuantos programas capaces de mostrar ficheros de texto. Por supuesto, se puede arrancar un editor como Vi ó Emacs ó un paginador como less o more, para leer estos ficheros. Pero ¿por qué no usar algo más simple, como cat, head y tail?

El Gato Multifunción El programa cat no sólo “concatena” múltiples ficheros para crear uno sólo, también es útil para mostrar ficheros individuales en la salida estándar del equipo. De la forma más simple, cat fichero.txt, muestra por pantalla el contenido de fichero.txt. A veces se necesita añadir números de línea a un fichero de texto para referirse a estas líneas. Esto, por ejemplo, puede facilitar la explicación del listado de un

programa. Para hacerlo, cat usa la opción -n cuya salida coloca un número al principio de cada línea del fichero. Pero hay que tener cuidado con los formatos binarios. Si por error se muestra un fichero binario usando cat, no sólo podríamos encontrarnos con una pantalla llena de caracteres de control extraños, sino que las propias entradas podrían volverse ilegibles (ver Figura 1). El comando reset puede ayudar a remediar esta situación. Escribimos reset en el prompt, y presionamos [Return] para restaurar el terminal. Puede que no seremos capaces de ver lo que escribimos. Si esto no ocurre también puede intentarlo con echo [Crtl-v][Esc][c][Return]. cat se usa a menudo para redireccionar datos mediante una cauce a otros programas. Se puede usar cat como salida a

una lista que será redireccionada al comando sort: $ cat lista.txt | sort Arnie 42 Easter 120 Petronella 100 Spátula 30

Cualquier salida desde cat puede redireccionarse fácilmente usando herramientas típicas de Unix. El operador > envía la salida a un nuevo fichero, fichero2: cat fichero1 > fichero2

Esto se puede hacer con múltiples ficheros. Para hacerlo así, simplemente hay que teclear el nombre de los ficheros uno tras otro:

Línea de Comandos

cat fichero1 fichero2 > fichero3

Aunque los GUIs (interfaces de usuario) como KDE o GNOME son útiles para muchas tareas, si se tiene la intención de dominar al máximo una máquina Linux, necesitaremos volver a utilizar la antigua línea de comandos de vez en cuando. Además de esto, probablemente nos enfrentaremos a varios escenarios donde algún conocimiento básico será muy útil al poder movernos por la jungla de los comandos de la shell.

Si fichero3 no existe, este comando lo creará. Si el fichero existe, cat simplemente lo sobreescribirá. Un operador distinto permitirá a cat añadir a un fichero existente:

www.linuxmagazine.com.es

Número 02

93


LINUX USER

head, tail

Listado 1: head incluye un separador para múltiples ficheros 01 huhn@asteroid:/etc$ <B> head -n 3 *.conf 02 ==> aatv.conf <== 03 # fichero de configuración de aatv. 04 # Modo de video. Escoger entre PAL, SECAM y NTSC. 05 ==> abcde.conf <== 06 # Sistema por defecto para abcde. 07 # Nada en este fichero está descomentado por defecto. 08 # 09 ==> adduser.conf <== 10 ...

Listado 2: Combinación de tail -f y grep 01 root@marvin[~] <B>tail -f /var/log/isdn/isdnlog | grep RING<B> 02 Sep 25 13:25:51 * Call to tei 127 from +353 77777777, Ireland on +44 207/40, London RING (Speech) 03 Sep 25 13:31:09 * Call to tei 127 from +39 2/4444444, Milano on +44 207/40, London RING (Speech) 04 Sep 27 12:38:30 * Call to tei 127 from ? on + 44 207/40, London RING (3.1 05 kHz audio)

Figura 1:“Basura binaria” en la línea de comandos – resetear normalmente ayuda.

fichero muy largo a través de múltiples paquetes que son reensamblados usando cat. Una aplicación típica de esta técnica sería para transportar datos en disquetes o en ficheros adjuntos en los emails. Algunos grupos de noticias, como comp.unix.shell han estado realizando un concurso, desde hace unos años, llamado “Useless Use of Cat Award” [1]. El ganador es la persona que sugiera la forma más inútil de usar el comando cat. La idea es la siguiente: “El propósito de cat es concatenar ficheros. Si un fichero, concatenándolo con nada, es una pérdida de tiempo y coste, tenemos lo que buscamos”. Dejo a la discreción de los lectores lo que consideren “inútil”. Pero un uso redundante de cat sigue el principio de Unix del uso de pipes para conectar las herramientas pequeñas. Y cualquier hardware moderno debería ser capaz de manejar ese proceso adicional sin demasiado esfuerzo.

A la Cabeza

cat fichero1 fichero2 >>U fichero3

Si redirigimos la salida a un fichero de esta forma, cat no tendrá problemas en el manejo de ficheros binarios. Esto permite el uso de split para distribuir un

Nomen est omen: head muestra la primera línea de un fichero por pantalla. Si se ejecuta head fichero.txt normalmente se mostrarán las diez primeras líneas. Se puede cambiar esta opción que trae por defecto usando -n número. El fichero de

GLOSARIO Salida estándar: Hay tres “canales estándar” para la entrada y la salida, stdin (entrada estándar), stdout (salida estándar) y stderr (salida estándar de errores). La entrada estándar típicamente es el teclado, mientras que la salida y el error estándar normalmente usarán la pantalla. Los operadores especiales > y < permitirán redireccionar

94

Número 02

estos canales de E/S para enviar la salida de error estándar a un fichero, por ejemplo. Pipe: Permite encadenar múltiples comandos conectando la salida de un comando con la entrada de otro. Los pipes se crean usando el carácter |. Como ls-l | less enviará la salida del comando ls al paginador less, el cual lo mostrará por pantalla página a página.

www.linuxmagazine.com.es

configuración en /etc a menudo indica el nombre y uso del fichero en la primera línea. Para mostrar las tres primeras líneas de los ficheros de configuración de este directorio se puede teclear head -n 3 *.conf Práctico: Si se ejecuta head para múltiples ficheros, la herramienta añade un separador visible (Listado 1). Si no quiere que aparezca este separador se puede utilizar el parámetro -q (--quiet).

Final Feliz El comando tail trabaja de forma similar, pero como sugiere el nombre, la salida es la última línea de un fichero. Se pueden especificar múltiples ficheros en la salida. Junto con la opción -n número, la opción -f es muy usada. Esto permite visualizar las últimas líneas de ficheros a los que están continuamente añadiéndoseles datos, como los ficheros de logs. Así tail para un fichero de logs de RDSI indicará quién está conectado a través del teléfono (Listado 2). Se puede obtener el mismo efecto con el paginador less, simplemente tecleando [Shift+f] mientras se visualiza el fichero. El programa entonces escuchará las nuevas lineas en el fichero (aparece el estado de las líneas leídas: Waiting for dataU ...(interrupt to abort)

mientras se hace). Tecleamos [Ctrl-c] ■ para salir del modo “Follow”.

RECURSOS [1] Useless Use of Cat Award: http://rhols66. adsl.netsonic.fi/era/unix/award.html#cat


Proyectos

COMUNIDAD

Software Libre y sus Creadores

Proyectos en Marcha El software libre incluyes un abanico tan amplio de aplicaciones que puede ser difícil encontrar la herramienta perfecta. En esta sección, escogemos lo mejor de la cosecha. Este mes exploramos “los PCs dentro de los PCs”, máquinas virtuales y emuladores varios. POR MARTIN LOSCHWITZ Y GEORGE C.F. GREVE

L

os usuarios a menudo necesitan aislar partes del sistema para evitar el acceso al sistema principal desde el área aislada. Esta práctica protege al sistema principal de un potencial ataque contra el subsistema aislado.

Venerable Anciano

Bueno, Bonito y Barato VServer [1] es software libre. VServer abarca dos componentes: un parche para el kernel y las utilidades VServer, que administra las tareas en el espacio del usuario. Cada VServer puede ser arrancado separadamente. Como cada

Ronald Raefle, visipix.com

Chroot es el método más antiguo y sencillo. Los administradores simplemente necesitan emular un sistema Linux con los ficheros requeridos bajo un nivel de directorios específico. Chroot engaña a cualquier programa que se arranque en este subárbol de directorios y le hace creer que está corriendo bajo el directorio raíz del sistema. Los procesos sólo pueden acceder a los ficheros encerrados en este entorno. Pero chroot tiene sus desventajas. Por ejemplo, los programas en la “cárcel” chroot comparten los recursos del sistema principal. Si un programa se comporta mal, puede colgar a todo el sistema. Lo que es más, atacantes experimentados pueden escapar de la cárcel y acceder al sistema principal. Vmware, que emula un PC, lleva ya algunos años dando tumbos por ahí. El servidor Vmware permite a los usuarios montar múltiples entornos que utilizan sistemas diferenciados y aislados sobre el mismo hardware. Desafortunadamente, el código fuente es cerrado, lo que es común en aplicaciones comerciales, y el precio ha hecho llorar a más de un administrador de sistemas.

VServer tiene su propio proceso init, puede arrancar procesos con sus propias direcciones IP. VServer, y los procesos que utiliza, terminan limpiamente, junto con las utilidades VServer. Además, las versiones más recientes de VServer pueden imponer restricciones a los recursos permitidos a un servidor. Pero, al igual que chroot, el servidor virtual utiliza el kernel del sistema anfitrión. User Mode Linux (Linux en Modo Usuario o UML) [2] adopta un método diferente, a pesar de que también ejecu-

tar un sistema dentro de un sistema. UML carga su propio kernel en el espacio de usuario del sistema anfitrión. A diferencia de VServer, UML posee su propio sistema de ficheros, que o bien puede crear el usuario a partir de un fichero de imagen, o descargar de la página de inicio de UML. Nuevamente, la configuración básica incluye un parche para el kernel, sin el cual no funcionaría el sistema. A pesar de lo cual, algunos sistemas, por ejemplo Suse, ya vienen con el parche integrado de serie en su kernel estándar. UML proporciona un control detallado sobre el hardware al cual se le permite acceder al sistema cliente. A diferencia de VServer, UML puede emular hardware del que el sis-

tema anfitrión no dispone. Desafortunadamente, existen distribuciones que no se podrán ejecutar dentro de un entorno UML, mientras que VServer ejecutará casi cualquier host Linux.

Nuevas Propuestas Xen [3] utiliza el kernel a un nivel incluso más bajo. En vez de arrancar un kernel Linux normal, arranca una imagen Xen especial, asignando números a todos los sistemas en el ordenador (incluyendo el sistema anfitrión y los clientes virtuales) y dotándoles de direcciones como entidades lógicas, denominados dominios virtuales. Otra característica especial de Xen es que emula un PC idealizado en los dominios huésped, en vez de intentar emular toda la gama de hardware. Los dominios virtuales cargan el kernel optimizado para Xen, que sólo dispone de una selección mínima de los drivers que necesita para arrancar. Esto se puede comprobar en la salida de dmesg después del arranque, que contiene unas escasas cincuenta líneas. Habiendo dicho lo cual, cada dominio virtual sigue comportándose como un ordenador completo. Estos proyectos hacen que me sienta optimista sobre la posibilidad de existencia de alternativas a VMware en los entornos de producción algún día. Pero si lo que buscas es un sistema virtual en tu propia máquina, chroot puede que sea justo lo que necesitas, ya que UML, VServer y Xen son mucho más difíciles de configurar. ■

RECURSOS [1] Proyecto VServer: http://www. linux-vserver.org [2] Página de User Mode Linux: http:// user-mode-linux.sourceforge.net [3] Xen, un emulador de PCs: http://xen. sourceforge.net

www.linuxmagazine.com.es

Número 01

95


Eventos

LINUX MAGAZINE

Eventos Seleccionados

LinuxWorld Expo

FOSDEM 2005

LinuxPark CeBIT 2005

Fecha: 14–17 Febrero

Fecha: 26–27 Febrero

Fecha: 10-16 Marzo

Ciudad: Boston, MA, EE.UU.

Ciudad: Bruselas, Bélgica

Ciudad: Hannover, Alemania

Sitio Web: www.linuxworld expo.com

Sitio Web: www.fosdem.org

Sitio Web: www.cebit.de/ homepage_e

Calendario de Eventos Evento OSDL Enterprise Linux Summit SAINT 2005 CodeCon 4.0 Southern California Linux Expo LinuxWorld Conference & Expo UKUUG LISA/Winter Conference FOSDEM 2005 Solutions Linux Linux Park CeBIT 2005 O’Reilly Emerging Technology Conference Novell BrainShare 2005 YAPC::Taipei 2005 LinuxWorld Conference & Expo, Canada MySQL Users Conference & Expo 2005

Fecha Fecha 31 Enero –02 Febrero 31 Enero–04 Febrero 11-13 Febrero 12 Febrero 14-17 Febrero 24-25 Febrero 26-27 Febrero 01-03 Marzo 10-16 Marzo 14-17 Marzo 20-25 Marzo 26-27 Marzo 18-20 Abril 18-21 Abril

Ciudad Ciudad Burlingame, CA, EE.UU. Trento, Italia San Francisco, CA, EE.UU. Los Angeles, CA, EE.UU. Boston, MA, EE.UU. Birmingham, R.U. Bruselas, Bélgica París, Francia Hannover, Alemania San Diego, CA, EE.UU. Salt Lake City, UT, EE.UU. Taipei,Taiwan Toronto, Canadá Santa Clara, CA, EE.UU.

linux.conf.au 3rd International Linux Audio Conference GUADEC 2005

18-23 Abril 21-24 Abril 29-31 Mayo

Canberra, Australia Karlsruhe, Alemania Stuttgart, Alemania

Sitio Web Sitio Web www.osdllinuxsummit.org www.saint2005.org www.codecon.org/2005 www.socallinuxexpo.org www.linuxworldexpo.com www.ukuug.org/events/winter2005 www.fosdem.org www.solutionslinux.fr www.cebit.de/homepage_e conferences.oreillynet.com/etech www.novell.com/brainshare taipei.pm.org www.linuxworldcanada.com www.mysql.com/news-and-events/usersconference conf.linux.org.au/ www.zkm.de:81/lac http://2005.guadec.org

Información de Contacto Director Paul C. Brown Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz Traductores Paqui Martín Vergara, Paul C. Brown, Jesús Reyes Delgado, Antonio Rueda. Maquetación Sergio Hardasmal Diseño de Portada Paul C. Brown, Pinball (info@pinball-werbeagentur.de)

Para España Paul C. Brown pbrown@linuxmagazine.com.es pbrown@linuxnewmedia.es Tel.: (+ 34) 951 010 556 Móvil.: (+ 34) 655 036 836 Fax.: (+ 34) 951 010 516

Para Alemania, Austria y Suiza Osmund Schmidt anzeigen@linux-magazine.com Tel.: (+49) 6335 9110 Fax.: (+49) 6335 7779

96

Número 02

Director Editorial Paul C. Brown Director de Producción Sergio Hardasmal anuncios@linux-magazine.com Subscripciones: www.linuxmagazine.com.es/ magazine/subs

Publicidad www.linuxmagazine.com.es/pub/

Sergio Hardasmal anuncios@linuxmagazine.com.es Tel.: (+ 34) 951 010 556

Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497

Precios Subscripción (12 números + 1 DVD cada 3 números) España: 49,50 € Europa: 59,90 € Resto del Mundo - Euros: 79,90 € Resto del Mundo - Dólares U.S.A.: $94,90 € Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516 subs@linuxmagazine.com.es Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linuxnewmedia.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516

www.linuxmagazine.com.es

www.linuxmagazine.com.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania Si bien se toman todas las medidas posibles para garantizar la precisión del contenido de los artículos publicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en la revista. Asimismo, Linux Magazine no comparte necesariamente las opiniones vertidas por sus colaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupulosamente para confirmar que está libre de virus y errores. Copyright y Marcas Registradas © 2004 Linux New Media Spain, S.L. Linux New Media Spain S.L. prohíbe la reproducción total o parcial de los contenidos de Linux Magazine sin su permiso previo y por escrito. Linux es una Marca Registrada de Linus Torvalds. Impreso en Alemania Impresión: Dierichs Druck + Media GmBH Distribución: SGEL


Humor

LINUX MAGAZINE

La Carretera en Estado Puro

TJ Racer 2004 M

eternos en la piel de un intrépido conductor urbano, un Fernando Alonso de la bocacalle y la circunvalación, ya no es privilegio de unos pocos. Llega a las consolas y al PC lo último en simulaciones automovilísticas, llega TJ Racer 2004. Levántate al alba, ponte al volante de tu utilitario y prepárate a enfrentarte a la aventura de cada día: el tráfico de camino al trabajo. El juego permite jugar sólo contra la máquina, en modo multijugador y en red y dispone de un amplio abanico de circuitos donde elegir, recreados a partir de localizaciones reales,

incluyendo la M30 de Madrid, el M25 de Londres, la S30 de Sevilla o la célebre N340. Una vez elegida la modalidad y el circuito, se nos presenta una imagen estática de la carretera tomada desde dentro de un turismo atrapado en un embotellamiento un lunes a las ocho de la mañana. Los mandos que controlan la conducción son de un realismo sorprendente. Podemos girar el volante, cambiar de marchar, acelerar el motor, pisar el freno, encender y apagar los faros, señalizar con los intermitentes o las luces de emergencia… todo. Pero no importa, puesto que nuestro vehículo no

Figura 1:TJRacer: Pura adrenalina.

TJ Racer Precio: Fabricante: Requisitos Mínimos:

Más de lo que estás dispuesto a pagar por semejante basura StressWare (www.mushoestres.com) Pentium VIII a 9.8 GHz,1024 Gbytes de RAM,120 Gbytes de disco duro y tarjeta gráfica 3D de 128 Mbytes compatible.

Calificación: Gráficos

9,6

Sonido

3,1

Jugabilidad

2,1

Precio

1,0

GLOBAL

4,0

irá a ninguna parte. “Hemos pretendido llevar la experiencia de los juegos de conducción a nuevas cotas de realismo y veracidad” comenta Epifanio Rovira, Director de Marketing de StressWare, los fabricantes del juego. “Creemos que muchos jugadores están hartos de simuladores que descuidan los aspectos que aportan mayor disfrute al viaje en automóvil”. La factura del juego, es impecable, sin duda. Se ha recreado hasta el último manchón de insecto estrellado contra el parabrisas. Aunque, por otra parte, no hace falta ser ingeniero de cohetes para crear una imagen estática desde el interior de un coche. Sin embargo, para aportar precisamente mayor realismo, aparte de los controles vistos anteriormente y que son propias de las conducción (aunque no influyen para nada en el desenlace de la partida), existe otra serie de controles a las que se llega a través de combinaciones de teclas. F1, por ejemplo, permite tamborilear sobre el volante; F2 permite lanzar un exabrupto (el tono de los cuales se puede configurar según la edad de los jugadores en la pantalla de control) sobre el estado del tráfico; F3 permite encender la radio, aunque lo único que emiten todas las emisoras sintonizables es información sobre el estado del tráfico. La tecla F4 permite acceder a un menú donde existen otras acciones alternativas seleccionables con el ratón, entre ellas: Bostezar, Aplicar Maquillaje, Rascar > Cabeza/Mano/Entrepierna, Pegar Moco en Salpicadero y Tirar Pedo. Sin lugar a dudas, el juego más realista ■ desde los Sims.

www.linuxmagazine.com.es

Número 02

97


PRÓXIMO NÚMERO

Número 3

Marzo 2005: Número 3

Próximo Número Especial seguridad Érase una vez que se era un tiempo cuando sólo las grandes redes necesitaban cortafuegos. Pero hete que en la red

indefenso. La mayoría de las distribuciones Linux incorporan una o más herramientas para configurar o adminis-

Desarrollo En la sección dedicada a la programación, veremos una interesante aplicación programado en Ruby, aprenderemos a controlar una casa domótica con un bot para jabber escrito en Perl y como controlar procesos de la línea de comando con PHP.

SysAdmins En la sección dedicada a los administradores de sistemas tendremos más útiles consejos de Charly, nuestro redactor/administrador y veremos como “hibernar” un portátil.

Linux User www.photocase.de

de hoy en día, donde los escaneadores de puertos llaman a la puerta disfrazados de inocentes cabritillas y un lobo feroz acecha a cada router, cada ordenador necesita alguna forma de protección en forma de cortafuegos. Si utilizas Internet, si no tomas alguna medida, estás

trar la barrera de seguridad de tu ordenador. A pesar de ello, a veces tiene sentido ver lo que se ofrece en el mundo del sofware comercial. El mes que viene abordaremos lo que se tiene que saber sobre los cortafuegos, su análisis y su configuración.

Boletín Linux Magazine El Boletín de Linux Magazine te da la oportunidad de ver lo que se avecina en el siguiente número de Linux Magazine e incluye enlaces a artículos que aparecen en nuestro sitio web antes de que la versión impresa llegue a los quioscos. Suscríbete en www.linuxmagazine.com.es/boletin.

Seguiremos con nuestro cursos de XUL y presentaremos nuevas aplicaciones y herramientas que nos harán la vida más fácil. Continuaremos nuestra serie sobre LaTeX, ahondando en su utilidad para representar ecuaciones e imágenes. Seguiremos conociendo la línea de comandos para que todos puedan aprovechar el poder de las instrucciones del shell.

Noticias También traeremos las noticias más candentes del mundo Linux, un calendario de eventos completo, información sobre los últimos avances en materia de inseguridades de las aplicaciones e información sobre los proyectos más interesantes que se llevan a cabo en el campo del Software Libre.

A LA VENTA FEBRERO 2005 98

Número 01

www.linuxmagazine.com.es



Quiere Linux. Desea que el funcionamiento de sus aplicaciones y la administración de sus sistemas se realice a través de un soporte profesional de confianza. Necesita Red Hat. Disponible en 7 distintas arquitecturas y certificado por Oracle, Bea, IBM y Sap, entre otros, le permitirá gestionar sus sistemas a través del canal Red Hat Network.

THE PLATFORM OF CHOICE. redhat.es | ES 900 800 409

© 2004 Red Hat, Inc. All rights reserved. “Red Hat,” the Red Hat “Shadowman” logo, and the products listed are trademarks or registered trademarks of Red Hat, Inc. in the US and other countries. Linux is a registered trademark of Linus Torvalds.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.