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

Page 1

LINUX MAGAZINE

Perl

KOffice

Creamos un plug-in para Gaim

La ofimática de KDE

Edición en Castellano

Soporte de haedware mejorado

NÚMERO 13

Instalación sencilla de paquetes OpenOffice 2.0

NÚMERO 13 • P.V.P 5,95 E

Un centro de ocio en tu máquina

Juegos

Nexuiz

JUEGOS

Juegos Comerciales

Nexuiz: un shooter espectacular p12 Juegos comerciales bajo Linux p17 Crea un mundo de fantasía con WorldForge p23 Sudokus: El rompecabezas de moda en Linux p30

Phishing Evita el robo de tus datos p44

F-Spot Organiza tus fotos p78

KBarcode Genera etiquetas desde KDE p 74

WorldFrge

Sudoku

Knoppix Aprende los trucos de su creador p39

Java Anonymous Proxy

PDFReport Generación de PDFs con Python p57

Knoppix

Detección Scripts Bash para tu haedwaew p49

8 413042 594505

00013

Phishing

WWW.LINUX- MAGAZINE.ES

8 413042 594505

Moodle

Navega y protege tu privacidad con Java Anonymous Proxy p46

00013

KOffice

Anonimato



EDITORIAL

ANTIPROCESO Estimado Lector de Linux Magazine ntiproceso es el reconocimiento y marginalización preventiva de información no deseada a través de la combinación sinergética de mecanismos adquiridos de defensa mental de alta prioridad. – Timothy Campbell Hombre, así contado, no es el comienzo más prometedor para un artículo que se pretende ligero y de fácil lectura. Una manera más asequible de comprenderlo es cuando partimos de una discusión murmurando “¡Pero qué estúpida es la gente!”. Pues bien, cuando eso ocurre, ten por seguro que el antiproceso ha asomado su fea e irracional cabeza. Timothy Campbell (http://members. aol.com/timxcampbell/tc123.htm) inventó el término (http://members.aol.com/ intwg/antiprocess.htm) para describir y explicar la cerrazón mental que se produce cuando, a pesar de quedarse obviamente sin argumentos, alguien sigue discutiendo a pesar de todo. Cuando uno se encuentra inmerso en un diálogo de sordos en una fiesta y lo único que busca es impresionar a la concurrencia, que el contendiente esgrima argumentaciones cada vez más ridículas no hace más que acrecentar el placer de la caza del zopenco. Siempre y cuando no quedes como un prepotente engreído delante de la dama (y se vaya con el perdedor por lástima), no importa mucho que el contrario no atienda a razones. Pero si se da la casualidad de que estás convencido de que lo que dices es verdad, que mejoraría la situación en el mundo de manera perceptible y tienes las pruebas empíricas que demuestran ambas cosas, duele que se esgriman razonamientos peregrinos para contrariarte. ¿Te sientes identificado? ¡Claro que sí! Pero antes de echarme una brazo alrededor de los hombros y llorar en mi oreja, veamos porqué ocurren estas cosas.

A

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.

Todo cambio supone una crisis, toda crisis supone dolor y esfuerzo, todo dolor y esfuerzo supone que hay alguien que no está dispuesto a asumirlo. Y ahí es donde entra en juego el antiproceso. Tomemos como ejemplo una discusión que mantuve recientemente con el director de una microempresa de desarrollo. Ya sabéis cómo suelen desarrollarse este tipo de conversaciones: El tipo defiende su uso de Windows “porque para Linux no hay herramientas” y tú le rebates uno a uno sus argumentos con nombres de aplicaciones, que no sólo están en Linux, sino que son multiplataforma, y que por tanto son suceptibles de ser puestas a prueba antes de dar el salto a Linux. Además, en muchos casos, cuentan con el respaldo de una gran corporación o han demostrado su valía en el mundo real de manera incuestionable. Tú vas desgranando: OpenOffice, Eclipse, Intel C Compiler, GCC, Apache… El tipo resiste y resiste, no porque sea idiota (bueno, algo de eso también hay), sino porque, hablando mal y claro, está cagado. Tu misión es disipar sus dudas: mover una empresa, por pequeña que sea, a través del razonamiento al lado luminoso de la fuerza, es un paso más en la dirección correcta para la industria informática nacional. Pero ¿qué está pasando aquí? Su resistencia se vuelve más y más inconexa, en proporción directa a tu presión sanguínea. Pero no por ello el sujeto decide abandonar graciosamente el debate y decir “vale, sí, tienes razón. Dame una docena de esos CDs que llevas ahí”. Al final esgrimes el argumento más peregrino, algo que su cerebro de mosquito pueda entender, a ver si así…, y dices aquello de “y además ahorrarás una pasta en licencias”. Ya sabéis qué viene ahora: “Yo no pago ninguna licencia” dice él, con cara de autosuficiencia, pensando que ha igualado tu argumento. Aparte de que esta frase le invalida moralmente para cual-

WWW.LINUX- MAGAZINE.ES

quier tipo de enfrentamiento, ahí es cuando sus socios, que asistían circumspectos al intercambio, deberían haberse lanzado sobre el sujeto para degollarle con los bolígrafos promocionales de Guadalinex que les acabas de regalar, más que nada por el riesgo que supone tener semejante insensato a la cabeza de una empresa que acaba de empezar. Las multas y los costes legales derivados en los que se puede incurrir ante semejante irresponsabilidad son lo suficientemente altos como para dar al traste con una firma consolidada, ni hablemos de un startup. Las deudas que contraerían los socios de revelarse la actividad ilícita, no sólo destruirían la firma, sino que sumarían en la pobreza a sus promotores y sus familias durante muchos años. Pero, claro, te ha dejado tan de una pieza con su estupidez, que a lo único que alcanzas es a boquear como un pez en tierra y, por desgracia, el enlace a “Cómo ganar” en el sitio de Campbell está roto, así que te quedas con las ganas de saber cómo derrotar definitivamente a semejante zoquete por medios científicos.

Paul C. Brown Director

Número 13

3


CONTENIDOS • Linux Magazine nº 13

PORTADA 12 Nexuiz ¿Quieres disfrutar de una jugosa Ensalada de tiros… sin pagar una suscripción a Cedega? Nexuiz lo hace posible.

PRÁCTICO 30 Sudoku Presentamos software que genera siempre nuevos campos de juego, pero que también ayuda a solucionarlos.

49 Hard Detect Si se necesita una respuesta rápida sobre las tripas de un ordenador, podemos usar un script Bash para obtener un inventario del hardware de un sistema Linux.

EVALUACIÓN 17 Juegos Comerciales Linux entra a saco en el mercado del videojuego, creando a su paso nuevas formas de negocio y comunidades convertidos a programadores y creadores de sus propios juegos.

33 Koffice La última versión del paquete ofimático KOffice viene cargada de novedades, incluyendo más aplicaciones.

DESARROLLO 52 Perl El proyecto Gaim proporciona un cliente de mensajería instantánea que soporta un gran número de protocolos. En este artículo veremos cómo ampliar Gaim con plug-ins en Perl.

23 World Forge El sistema de mundos virtuales WorldForge, nos permite crear nuestro propio mundo virtual y sumergirnos en él en un entorno 3D.

PRÁCTICO 39 Knoppix

LINUX MAGAZINE 3 6 8 9 94 94 95 97 98

4

Editorial DVD Linux Magazine Inseguridades Noticias Eventos Información de Contacto Subscripciones Linux Local Próximo Número

Número 13

El creador de Knoppix, Klaus Knopper, comparte algunos trucos para usar Knoppix en el mundo real.

44 Phising Un nuevo ataque de phishing se basa en colocar una etiqueta HTML en un servicio vulnerable para capturar los datos de autenticación de los usuarios.

46 JAP Ghost Si no queremos ir ofreciendo información que acabará en algún estudio de mercado, Java Anonymous Proxy mantendrá nuestras incursiones en secreto.

WWW.LINUX- MAGAZINE.ES

57 ReportLab ReportLab es una biblioteca gratuita que permite crear documentos PDF empleando como lenguaje de programación Python

61 Python: AI y Sudoku Python es un lenguaje que gusta mucho en la comunidad de Inteligencia Artificial, no en vano Google dice que es una de sus armas. Hoy vamos a convertirlo en la nuestra.


ADMINISTRACIÓN 65 La Columna de Charly 66 NTP Las redes requieren a menudo de un control de la hora muy preciso. El Network Time Protocol proporciona este tiempo con precisión.

LINUX USER 76 Desktopia Si estás buscando escritorio rápido y funcional, prueba con WindowLab. Este administrador de ventanas minimalista se concentra en lo que es importante y funciona sin pitos ni flautas superfluos.

78 F-Spot El programa de administración de imagen F-Spot te ayuda a administrar tu archivo de fotos eficazmente y sin ningún tipo de pérdida de tiempo.

81 ZShell 69 Seguridad Web Como una manzana envenenada, un programa Web que aparentemente tiene un aspecto sabroso puede, sin embargo, encerrar un interior muy peligroso. Aquellos administradores que cubren ellos mismos sus necesidades de programación, deben seguir las prácticas de programación segura para evitar el amargo sabor del malware.

LINUX USER 74 KBarcode ¿Tienes problemas con la creación de las etiquetas de los precios de tu papelería, con la de las tarjetas postales o con los códigos de identificación? Deja que KBarcode te eche una mano.

La moderna Z-Shell con sus inumerables y útiles características ofrece a los fans de la línea de comandos una atractiva alternativa a Bash.

Configuración asistida con Yast2 ■ Kernel 2.6.13 ■ Suite ofimático OpenOffice 2.0 ■ Voz sobre IP Más información en la página 6.

85 Educación E-learning, teleformación, plataformas educativas… son palabras y conceptos de moda, que parece que van a acabar con las formas tradicionales de enseñanza y aprendizaje.

89 Línea de Comandos El comando ls lista ficheros en la línea de comandos además de ofrecer una lista detallada de las propiedades del fichero de gran utilidad.

WWW.LINUX- MAGAZINE.ES

Número 13

5


DVD LINUX MAGAZINE

La sorpresa del año

UBUNTU 5.10 Figura 1: Ubuntu viene con una detección y configuración de hardware mejorada que facilita la integración de dispositivos.

corrección de errores durante al menos 18 meses. Ubuntu incluye las mejores traducciones e infraestructura de accesibilidad disponibles en la comunidad del software libre para poder ofrecerlo al máximo número de personas. Es férreo defensor de los principios del software libre.

Instalación Para sistema de escritorio Un sistema de escritorio aporta un sistema con entorno gráfico desde el cual se pueden llevar a cabo tareas ofimáticas comunes. 1.- Inserte el DVD en su lector y arranque el equipo. 2.- Cuando aparezca la palabra boot pulse Enter. 3.- Se ejecutará el instalador. Siga las instrucciones que se muestran en la pantalla para completar la instalación.

S

i hay una distribución cuya carrera se puede considerar meteórica, esa distribución es Ubuntu. Desde que apareció en octubre del 2004 (siendo su primera versión Ubuntu 4.10 – Warty Warthog), Ubuntu ha gozado de una popularidad ascendente que lo ha convertido en indiscutible líder de DistroWatch durante meses. Dicha popularidad se debe en parte a la de su impulsor, el carismático millonario surafricano Mark Shuttleworth, pero sobre todo a su calidad en cuanto a detección de hardware, facilidad de uso e instalación y amplio abanico de paquetes. De momento se han liberado tres versiones: 4.10 – Warty Warthog, 5.04 – Hoary Hedgehog y la que os trae este

6

Número 13

mes Linux Magazine, 5.10 – Breezy Badger.

Compromiso La Fundación Ubuntu, fundada en el 2005, tiene un sólido compromiso con la comunidad del software libre, que sus promotores resumen en 4 puntos públicos: • Ubuntu siempre será gratuito y no hay un recargo para la versión “empresarial”. • Ubuntu viene con soporte comercial de centenares de empresas dispersadas a lo largo y ancho del globo. Se lanzan versiones con regularidad (cada seis meses), y cada nuevo lanzamiento se soporta con parches de seguridad y

WWW.LINUX- MAGAZINE.ES

4.- Una vez completada la instalación, aparecerá la pantalla de inicio y podrá conectarse para utilizar Ubuntu 5.10. Para sistema servidor El modo servidor provee de un sistema base apropiado para la instalación de aplicaciones de servidor. Se pueden añadir más servicios según las necesidades una vez completada la instalación. 1.- Inserte el DVD en su lector y arranque el equipo. 2.- Cuando aparezca la palabra boot escriba “server” y pulse Enter. 3.- Se ejecutará el instalador. Siga las instrucciones que se muestran en la pantalla para completar la instalación. 4.- Una vez completada la instalación, se le informará que Ubuntu 5-10 está listo para su uso.


DVD LINUX MAGAZINE

nueva versión 3 de Guadalinex [3], en fase de desarrollo beta.

El Tejón Aireado

Figura 2: Todo el software que vayas a necesitar se encuentra en el DVD. En la imagen, el programa de diseño the GIMP.

Siguiendo religiosamente estas cuatro premisas, no sólo ha conseguido granjearse la simpatía de la comunidad Linux, sino también ha atraído a usuarios profesionales, noveles e institucionales. Ya existen distribuciones derivadas de Ubuntu, como es el caso de Kubuntu, que implementa KDE por defecto en vez de Gnome; y Edubuntu, enfocada a la educación escolar [2]. Otra derivada de Ubuntu es la

Destacamos Para el escritorio • GNOME 2.12.1 • OpenOfficeorg 2.0 beta 2 • X.org 6.8.2 con soporte de hardware ampliado • Instalación de aplicaciones mejorada integrada en el menú • Soporte de multilenguaje mejorado Para el Servidor • Plone 2.1 y Zope 2.8.1 • PHP5 • Soporte para la instalación directa en volúmenes LVM • Funcionalidad thin client integrado

La nueva versión de Ubuntu, la 5.10 (5, por 2005 y 10 porque se liberó en Octubre) va camino de seguir las estelares trayectorias de sus antecesoras. La 5.10, también conocida como “Breezy Badger” (“Tejón Aireado”), incluye importantes novedades con respecto a sus anteriores. Por un lado cuenta con un soporte de hardware mejorado gracias a su kernel 2.6.12.6 modificado y ampliado con los módulos y drivers de terceros. Ubuntu 5.10 tal vez ofrezca uno de los mejores soportes de hardware de todas las distribuciones existentes. De hecho, La versión Breezy Badger se ha convertido en la distribución favorita para las instalaciones OEM (preinstalación en equipos para su venta) en muchos mercados, ya que es la que más garantías da para un soporte más amplio.

A Propósito de root En Ubuntu, por defecto, el superusuario root no cuenta con contraseña. Por tanto, ¿cómo se realizan tareas administrativas que requieren el uso de root? La respuesta es con sudo. sudo es una aplicación que permite a ciertos usuarios “normales” realizar tareas que normalmente están reservadas para root. Cada vez que Ubuntu requiera el uso de una contraseña para realizar cualquier tarea, el usuario ha de introducir su propia contraseña. De esta manera, Ubuntu da a entender que se accede a alguna funcionalidad potencialmente peligrosa y que hay que andarse con ojo.

• Soporte para hasta 4 gigabytes de RAM en arquitecturas de 32 bits

Para los que consideran este sistema un peligro, no hay más que dotar a root de contraseña…

• Soporte en el Kerneal para sistemas de ficheros de clusters (OCFS2 y GFS)

$ <B>su<B>

Soporte Hardware

Password: <B>[Introduzca su contraseña aquí]<B>

• Kernel 2.6.12.6 con drivers actualizados de terceros

# <B>passwd<B>

• Mejoras para el soporte de portátiles (teclas predefinidas, soporte suspensión/recuperación en más modelos) • Soporte para combis escáners/impresoras de HP integrado • Soporte para dispositivos de entrada Bluetooth (teclados, ratones, etc.) • Kernel de 64 bits para PowerPC

Changing password for root. New Password:

Figura 3: Por defecto, the Ubuntu instala el escritorio GNOME. En la imagen, el navegador de ficheros Nautilus.

Por otro, se ha facilitado la instalación de paquetes, mejorándose sustancialmente el proceso de instalación de software adicional una vez finalizada la instalación del sistema base. Por otra parte, Ubuntu cuenta con la herramienta de la línea de comandos apt, que aúna la potencia con la sencillez de uso. En muchos casos basta con escribir # apt-get installU <I>nombrepaquete<I>

en la línea de comandos para que se realice una instalación automatizada del paquete, pero para aquellos que se sienten más cómodos con una interfaz gráfica, Ubuntu también dispone de Synaptic, que ofrece una cara más amistosa para apt al permitir el uso del “apuntar y picar” en un entorno de ventanas. Y, nuevo en la versión 5.10, es el instalador de paquetes integrado en los menús. Siguiendo la tendencia de otras distribuciones como Suse y su Yast o Mandriva y su Drakconf, los ingenieros de Ubuntu han creado una entrada en el sistema de menús que enlaza con administrador de software que permita la instalación rápida y sencilla de paquetes adicionales. Asimismo se ha incorporado una nueva herramienta, el “Language Selector”, que hace que sea más fácil instalar idioma nuevo y permite el soporte para varios lenguajes simultáneamente. Por todo ello, Ubuntu se ha convertido en poco tiempo en uno de las distribuciones favoritas de la comunidad Linux. ■ Pruébalo y no te defraudará.

Type new password again: Password Changed. y cambiar los privilegios de los usuarios en el fichero /etc/sudoers. Para ello se puede utilizar el programa especial visudo desde la línea de comandos.

WWW.LINUX- MAGAZINE.ES

RECURSOS [1] Kubuntu: http://www.kubuntu.org/ [2] Edubuntu: http://www.edubuntu.org/ [3] Guadalinex V3: http://www. guadalinex.org/modules/news/

Número 13

7


INSEGURIDADES LINUX USER Schlagwort sollte hier stehen

INSEGURIDADES ■ Squid Squid es un proxy cacheador de páginas web. Se ha encontrado un fallo en la manera en la que presenta los mensajes de error. Un atacante podría enviar una petición conteniendo un nombre de host inválido, que resultaría en la presentación de un mensaje de error usado previamente. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado a este problema el nombre CAN-2005-2479. Se encontraron dos errores de Denegación de Servicio (el sistema se cuelga) en el modo en el que Squid maneja las peticiones malformadas. Un atacante remoto podría presentar una petición especialmente manipulada que haría que el sistema se colgara. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado a estos problemas los nombres CAN-2005-2794 ■ y CAN-2005-2796 respectivamente. -Referencia Debian: DSA-809-2 apache2 -Referencia Mandriva: MDKSA-2005:162 -Referencia Red Hat: RHSA-2005:766-7 -Referencia Suse: SUSE-SA:2005:053

■ Clam Antivirus Clam Antivirus es un juego de herramientas anti-virus con licencia GPL diseñado para su integración en servidores de correo para mejorar el escaneado de adjuntos. También ofrece un escáner desde la línea de comando, así como una herramienta para buscar actualizaciones para la base de datos de virus. Existe una vulnerabilidad de desbordamiento de búfer en libclamav/upx.c cuando procesa paquetes ejecutables UPX malformados. libclamav/fsg.c también puede caer en un bucle infinito cuando procesa ejecutables empaquetados FSG especialmente manipulados.

8

Número 13

Mediante el envío de un fichero especialmente manipulado, un atacante podría ejecutar código arbitrario con los permisos de otro usuario de Clam Antivirus o provocar una Denegación de ■ Servicio (el sistema se cuelga). -Referencia Debian: DSA-824-1 apache2 -Referencia Gentoo: GLSA 200509-1 -Referencia Mandriva: MDKSA-2005:166 -Referencia Suse: SUSE-SA:2005:055

■ X.org y XFree86 X.org y XFree86 son implementaciones del Sistema X Window. Ofrecen la funcionalidad de bajo nivel básica para interfaces de usuario gráficas (GUIS) sobre las que se apoyan gestores de ventanas tales como GNOME y KDE. Se encontraron varios errores de desbordamiento de entero en el modo en el que X analiza imágenes pixmap. Es posible que un usuario consiga privilegios elevados cargando una imagen pixmap especialmente manipulada. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado el nombre CAN-2005-2495 a ■ este problema. -Referencia Debian: DSA-816-1 -Referencia Mandriva: MDKSA-2005:164 -Referencia Red Hat: RHSA-2005:396-9 -Referencia Slackware: SSA:2005-269-02 -Referencia Suse: SUSE-SA:2005:056

■ util-linux util-linux es una juego de útiles programas Linux, incluyendo umount, un programa para desmontar sistemas de ficheros. Cuando un usuario normal monta un sistema de ficheros, se encuentra sometido a restricciones en el fichero de configuración /etc/fstab. David Watson descubrió que cuando se desmonta un fichero con la opción -r, se activa el bit de sólo

WWW.LINUX- MAGAZINE.ES

lectura, mientras que otros bits como el nosuid o nodev, no, incluso si ya lo estuvieron previamente. Un usuario sin privilegios frente a restricciones nosuid o nodev puede usar umount -r en un sistema de ficheros para desactivar esos bits, permitiendo que las aplicaciones sean ejecutadas suid, o interpretar nodos de dispositivos. En el caso de que el usuario puede modificar libremente el contenido del sistema de ficheros, puede darse un escalamiento de privilegios cuando un programa cliente se ejecute con permisos suid. Existen dos soluciones a este tema: el bit suid puede cambiarse desde la utilidad umount, o pueden restringirse los privilegios de montaje y desmontaje de los usuarios desde /etc/fstab. Todos los usuarios de util-linux deberían actuali■ zarse a la última versión. -Referencia Debian: DSA-823-1 -Referencia Gentoo: GLSA 200509-15 -Referencia Mandriva: MDKSA-2005:167 -Referencia Slackware: SSA:2005-255-02

■ CUPS El Sistema de Impresión Común UNIX (CUPS) ofrece una capa de impresión portable para sistemas operativos Unix(R). Se encontró un error en la manera en la que CUPS procesa las peticiones HTTP malformadas. Es posible que un usuario remoto capaz de conectarse a demonios CUPS emita una petición HTTP GET malformada que haga que CUPS caiga en bucle infinito. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado a este problema el nombre ■ CAN-2005-2874. -Referencia Mandriva: MDKSA-2005:138-1 -Referencia Red Hat: RHSA-2005:772-8


LINUX NEW MEDIA AWARDS 2005 • EVENTOS

Premios Linux New Media 2005

LA CRESTA DE LA OLA Linux y el software libre se encuentran presentes en numerosos ámbitos, al igual que ocurre con la gente que trabaja sobre y con Linux. Linux New Media ha reunido un jurado internacional de personalidades pertenecientes a la comunidad y a la industria para premiar las contribuciones más sobresalientes del Código Abierto. Los premios Linux New Media se presentaron en la Linux World Expo de Frankfurt, Alemania.

L

a comunidad del código abierto se compone de personas que viven y trabajan a lo largo y ancho del mundo y esto es precisamente lo que propició que Linux New Media AG invitara a un jurado internacional de 200 miembros para evaluar las contribuciones más destacados al software libre. Además de desarrolladores, autores y expertos de la industria, el jurado del 2005 incorpora por primera vez miembros de la administración pública, donde el Código Abierto se va consolidando progresivamente.

Tendencia VozIP Las categorías también reflejan las tendencias actuales. Linux se consolida en

nuevos campos de aplicación, por ejemplo en la telefonía IP. El software libre PBX, Asterisk (http://www.asterisk.org), atrajo la mayoría de los votos en la categoría de “Mejor Software para Voz sobre IP”, seguido de Skype (http://www. skype.com). Este último, para muchos, es el primer programa en acercar la comunicación basada en protocolos de Internet al usuario doméstico. En la actualidad, la comunicación corporativa sin Groupware, que integra correo electrónico, administración de direcciones y funciones de calendario, es impensable. Y el software de código abierto parece dispuesto a desterrar a Exchange de su puesto dominante en

WWW.LINUX- MAGAZINE.ES

muchas compañías. Kolab (http://kolab. org) se clasificó primero en la categoría de “Mejor servidor de Groupware”, seguido de cerca por Open-Xchange (http://www.openexchange.com). Los entornos corporativos tienen unos requisitos muy específicos cuando se trata de sistemas Linux y muchos proveedores ofrecen distribuciones empresariales para satisfacer esas necesidades. Más de la mitad del jurado estuvo de acuerdo con el hecho de que los productos de Novell son los mejores en este campo. El contendiente de toda la vida, Red Hat, atrajo aproximadamente un tercio de los votos y se clasificó en segundo lugar.

Número 13

9


EVENTOS • LINUX NEW MEDIA AWARDS 2005

A pesar del hecho de que el gigante de la industria informática, IBM, ha vendido su rama dedicada a la fabriacación de PCs, sigue utilizando Linux de manera consistente para sus servidores, tal y como es el caso de su serie OpenPower. Por ello el jurado otorgó el primer premio de “Proveedor de hardware más amistoso con Linux” a IBM.

Ubuntu: La Nueva Estrella Un vistazo en restrospectiva al 2004 muestra otra clara tendencia. El año pasado, Ubuntu (http://www. ubuntulinux.org), era un prometedor recién llegado al panorama Linux y se llevó el segundo premio en la categoría “Mejor Distribución de Nueva Aparición”, por detrás de Skole Linux, también basada en Debian. La confianza depositada por el jurado en Ubuntu no estaba equivocada: Ubuntu se mantuvo fiel a su promesa de ciclos de lanzamientos regulares en el 2005, estuvo bien representado en eventos de la comunidad, tales como LinuxTag o aKademy, y ha adquirido un asombroso número de fieles en tan sólo doce meses. Tanto es así, que logró hacerse este año con el primer premio con un 43.5 por ciento de los votos. Ubuntu, el “Linux para seres humanos”, de hecho, llegó a acaparar dos de los tres primeros puestos con Kubuntu, su variante KDE, en tercer lugar. El 25 por ciento de los votos fueron a parar a Knoppix, el referente en lo que se refiere a Live CDs, que se clasificó en segundo lugar. Tras la aplastante victoria de Ubuntu, no debe sorprender que Mark Shuttleworth también se llevará a casa otro trofeo como reconocimiento a su espíritu emprendedor, el mismo espíritu que hizo posible el alumbramiento del proyecto Ubuntu. Mark consiguió el premio especial a la “Contribución Sobresaliente a Linux y al soft-

10

Número 13

WWW.LINUX- MAGAZINE.ES

ware libre”, no sólo por su trabajo con Ubuntu, sino por la dedicación que ha demostrado en otros muchos proyectos de Código Abierto en su país de origen, Surafrica, y en otros puntos del globo. Sin embargo Mark tendrá que compartir este premio con las personas, sin las cuales, ni Linux ni otros programas libres existirían: Los desarrolladores anónimos. Al jurado le encantó la idea de esta nominación y, como resultado, se concede uno de los premios Linux New Media 2005 a todo aquellos que contribuyen al software libre, ya sea de manera voluntaria, a tiempo completo o parcial. No hay duda que “el desarrollador anónimo” es el corazón de la comunidad ■ del software libre.

Premios Linux New Media 2005 Hardware Proveedor de Hardware más amistoso 1. IBM 23,5 % 2. HP 16,3 % 3. AMD 11,3 %

Software Mejor Software de Groupware 1. Kolab 22,2 % 2. OpenXChange 21,5 % 3. OpenGroupware 15,3 %

Mejor Softare VozIP 1. Asterisk 42,4 % 2. Skype 18,8 % 3. Gnomemeeting 15,8 %

Mejor Derivado de Debian 1. Ubuntu 43,5 % 2. Knoppix 23,7 % 3. Kubuntu 9,6 %

Mejor Distribución de Servidor Empresarial 1. Novell / Suse 53,3 % 2. Red Hat 36,7 % 3. Mandriva 8,3 %

Premio Especial Contribución Sobresaliente a Linux / Código Abierto 1. Mark Shuttleworth 12,1 % 1. El Desarrollador Anónimo 12,1 % 2. nosoftwarepatents.com / Florian Müller 9,6 % 3. Ciudad de Munich 8,92 %


Juegos • PORTADA

Linux entra en la partida

A JUGAR l mercado del ocio es muy serio. Es el segundo mayor mercado en lo que a movimiento de dinero se refiere, sólo superado por el de la información. Tanto es así que las grandes empresas del sector se pelean encarnizadamente por obtener la mayor parte del pastel y gigantes como Sony y Microsoft han entrado en una guerra sin cuartel de prestaciones y precios para con sus consolas que, si bien favorece al consumidor, puesto que le permite adquirir centros de multimedia casi al precio de coste, deja poco espacio a otros proyectos comerciales. Sin embargo, el software libre siempre ha destacado por su capacidad de adaptación a mercados difíciles. Si se ha hecho con los servidores del mundo y ha hecho grandes progresos en el área de las estaciones de trabajo ofimáticas (forzando incluso a ciertas empresas a realizar un amago de liberación de código y formatos), no hay ningún motivo por el cual no pueda irrumpir en el mercado del videojuego y salir airoso. Máxime si tenemos en cuenta que la infraestructura modular de Linux permite que se adapte a casi cualquier arquitectura para casi cualquier propósito. ¿Un Linux optimizado para juegos? Ningún problema. De hecho ya existen unas cuantas distros por ahí, entre

E

ellas, la excelente Juegalinex de la Junta de Extremadura, que hacen del ocio su punta de lanza para penetrar en los hogares aún reticentes a la adopción de soluciones abiertas. Y ahí es donde reside el interés en volcar esfuerzos, serios esfuerzos, en el desarrollo de infraestructuras y aplicaciones lúdicas para Linux. Microsoft lo tiene claro: creando consolas que enganchen a los jóvenes en las casas y ofreciendo importantes descuentos a escuelas para que utilicen su software en las aulas, se invierte en un mercado que devolverá con creces la inversión realizada en la actualidad. La comunidad del software libre también tiene que tenerlo claro: entrar a los usuarios potenciales y noveles a través del software lúdico garantizará que más gente sea más receptivo hacia el software libre en su hogar y empresa en el futuro. Por tanto hay que escribir juegos, buenos y atractivos juegos. Juegos que hagan que los jugones

digan “Yo quiero eso” y que la única manera que tengan de conseguirlo, sea instalando una distro. En la sección de portada de Linux Magazine de este mes, analizamos el software de ocio bajo Linux y desgranamos que se está haciendo y que se puede hacer para convertir en efectivo el punto de entrada más importante del software libre en los hogares de los ciudadanos. Y es que el mercado del ocio es muy serio.■

TEMA DE PORTADA Nexuiz.................................................. 12 Juegos Comerciales.......................... 17 WorldForge......................................... 23 Sudoku................................................ 30

WWW.LINUX- MAGAZINE.ES

Número 13

11


PORTADA • Nexuiz

Acción 3D con Nexuiz

A MUERTE ¿Quieres disfrutar de una jugosa Ensalada de tiros… sin pagar una suscripción a Cedega? Nexuiz lo hace posible. El juego 3D de acción en primera persona funciona de manera nativa bajo Linux. Está basado en la maquina Quake y ha dado un “gran salto adelante” en Junio. POR KRISTIAN KIIßLING

C

ada vez más juegos 3D funcionan bajo Linux. Aunque bien es verdad que muchos necesitan el emulador de Windows Cedega, además de que no siempre la instalación funciona sin problemas. En cambio, el juego 3D de acción en primera persona, Nexuiz, funciona de manera nativa bajo Linux sin emulador Windows. Sólo pocos juegos 3D para Linux cumplen esto. Además Nexuiz (Figura 1) funciona independientemente de la plataforma y está cubierto por la GPL. El primer anuncio de este juego a finales de Mayo llegó un poco demasiado temprano y con fallos, pero un parche ha solucionado ya (casi) todos los problemas. En los distintos niveles aparecen enemigos aceptables, los gráficos son fluidos y hay muchas nuevas opciones para influir en el rumbo del juego. Funciona correctamente también por Internet… suponiendo que la velocidad de la conexión

12

Número 13

y el valor ping del servidor de juego estén bien.

Impacto Súbito Nexuiz se basa en un motor de gráficos denominado Darkplaces, el cual es una versión muy modificada del motor Quake1. Actualmente existen 18 niveles distintos y 15 modelos de jugador. De este modo podemos optar entre distintos avatares alternando los de humanos con los de repugnantes alienígenas. Aunque los gráficos de las figuras de juego no están del todo conseguidos (Figura 2). Si queremos jugar con efectos gráficos aceptables, el Readme recomienda para el juego un procesador con una frecuencia de un mínimo de 1500 MHz, una tarjeta gráfica como la nVidia 5700fx o la ATI 9600 y una memoria RAM de por lo menos 256 MByte. Como requisitos mínimos también bastan 800 MHz, una tarjeta gráfica al esti-

WWW.LINUX-MAGAZINE.ES

lo de GeForce y 256 MByte RAM. Si bien, el juego a un límite bajo, no proporciona mucha alegría.

Velocidad Terminal Nexuiz se descarga de [1]. Necesitaremos tanto el Nexuiz 1.1 Release como el parche correspondiente. Los dos paquetes tienen 175 MBytes y, por tanto, la bajada puede tardar un poco, dependiendo de la velocidad. Por añadidura tenemos que instalar los controladores 3D para nuestra tarjeta gráfica, lo cual puede resultar complicado a veces, pero en Internet hay ayuda respecto al tema en [2]. Con el comando glxinfo se puede probar si un controlador 3D está instalado. En el resultado aparece en el registro OpenGL renderer string el nombre de la tarjeta gráfica. En el directorio de descarga se crea una carpeta nexuiz11. Nos cambiamos a esta carpeta y descomprimimos el


nexuiz-linux-x86-glx. Si usamos un procesador de 64-Bit, elegimos el archivo cuyo nombre contiene x86_64. Opcionalmente se puede compilar el programa desde las fuentes: El Makefile lo encontramos en la carpeta Darkplaces en el subdirectorio sources. Si pensamos instalar un Dedicated Server, encontramos instrucciónes en el foro de Nexuiz [3] . Hay dos maneras de abrir el Figura 1: El juego 3D de acción en primera persona juego, bien pasando al directoNexuiz está basado en un motor Quake modificado. rio mencionado arriba y tecleFunciona de manera nativa bajo Linux, así que no ando ./nexuiz-linux-x86[vuestra necesita un emulador de Windows. versión] o bien estableciendo un enlace al escritorio KDE o archivo zip con unzip Gnome. En la linea comando en las pro/Pfad/zu/nexuiz11.zip. Para el parche piedades de nuestro enlace ponemos: de código, generamos una carpeta llacd /ruta/al/directorio/U mada patch11 y lo descomprimimos de nexuiz11/Nexuiz/; ./nexuiz-linU la misma manera allí. Para sobreescriux-x86[vuestra versión] bir los archivos de Nexuiz con los archivos del parche, hay que cambiarse Además marcamos en Opciones avana la carpeta patch11 y teclear las inszadas la opción Arranquar en terminal. trucciones siguientes: Ahora podemos abrir el juego con un cp *.* /ruta/al/directorioU click de ratón a través de este enlace. /nexuiz11/Nexuiz/

Desafio Total

Después tecleamos:

El principio de los juegos de acción en primera persona sigue sin cambios desde los noventa: “Si me disparas a mi, yo te cd /ruta/al/directorio/U disparo a ti”. Gana el más rápido y un nexuiz11/Nexuiz/ impacto letal se llama Frag. Hay dos opciones para hacer rápidamente unos para llegar al directorio con los archicuantos Frags. Si disponemos de una vos ejecutables. Dependiendo de si prelínea ADSL, lo mejor es elegir la opción ferimos el OpenGL-interfaz GLX o la Join Game para participar en un juego biblioteca de multimedia SDL, tenemos online. El juego genera una lista actualique introducir chmod u+x zada de todos los servidores disponibles nexuiz-linux-x86-sdl o chmod u+x en Internet. Cuanto más pequeños sean los valores Ping indicados, más accesible está el servidor correspondiente, con lo cual se mejoran las posibilidades de un juego sin atranques en los gráficos (Figura 3). Sin embargo, si queremos probar primero los gráficos, tenemos que arrancar un juego local con Create Game. Los valores predefinidos están bien, así que sólo hay que pulsar el botón Start. Se controla con el teclado y el ratón. Con [W] se Figura 2: Las superficies de los avatares necesitan avanza hacia delante y con [S] todavía mejorarse. Las figuras aparecen bastante hacia atrás. Con [D] y [A] se pixeladas a distancias cortas.

WWW.LINUX-MAGAZINE.ES


PORTADA • Nexuiz

mueve a la derecha y a la izquierda. El ratón se usa para cambiar la dirección de la mirada y para disparar. La dirección del movimiento siempre sigue la dirección de la mirada. Se dispara con el botón izquierdo del ratón, pero normalmente las armas disponen además de funciones alternativas que se pueden usar con un click del botón derecho. Es recomendable activar unos Bots en Create Game para poder tener algo a qué disparar. Con [F10] se termina el juego de golpe… una función importante si se juega en el trabajo.

Speed Sólo se puede “fragear” bien con unos gráficos fluídos ya que los retrasos pueden perturbar bastante el rumbo del juego. Si los gráficos se atrancan, hay que salir del juego con [Esc] y modificar las propiedades de los gráficos dentro de los Options. Aquí se encuentran una serie de opciones que podemos ajustar a nuestro gusto. Primero hay que elegir el registro Video. Allí se especifica la resolución de la pantalla: 800x600 píxeles con un valor de 16 bits por píxel suelen ser suficientes. Apretando [Esc] se vuelve al juego para probar si ha cambiado algo. Si la pantalla se queda en negro hay que terminar el juego con [F10] y abrirlo de nuevo. Esto significa que la selección de la resolución era demasiado baja o demasiado alta. Si todavía no se ejecuta de una manera fluída, hay que volver a las Options y elegir Effects (Figura 4). Aquí se encuentra un listado detallado de los efectos que genera el juego. Si hace falta, hay que apagar todos los efectos, lo que empobrece, por supuesto, los gráficos. En general no es necesario ser tan radical. Normalmente es suficiente desactivar uno u otro efecto. Los Real Time World Lights son impresionantes, pero prescindibles. Son los responsables, entre otras cosas de que los cohetes volantes o los rayos láser irradien luz a su alrededor. Los Decals son innecesarios, causan efectos de sangre que sólo distraen el rumbo del juego. Los Particles generan los efectos para las armas, orificios de entrada y unos detalles más. Sin estos los proyectiles parecen mucho menos espectaculares. Hay que probar simplemente varios ajustes hasta que el juego transcurra sin saltos.

14

Número 13

De todos modos, los jugadores entrenados suelen renunciar a todos las finezas gráficas para extraer el mejor rendimiento del juego y para mantener el valor Ping lo más bajo posible. Si el juego en general es demasiado oscuro, hay que cambiar, en el área izquierda, al registro Color Control. Allí se modifican la luminosidad y los valores de color para el juego.

Soldado Universal

Figura 3: A la izquierda de los gráficos se ven los

Al jugar por Internet, es imporvalores Ping. Cuanto más pequeño sea el valor, más tante intimidar a los enemigos accesible está el servidor y el juego se ejecutará de potenciales con nombres de manera más fluída. guerra adecuados y con una apariencia convincente y marcial desde bilidad del ratón. Cuanto más alto sea el comienzo. Para ello hay que ser un el valor, más rápido se gira la figura con poco creativo dentro de la opción un movimiento de ratón. Así se puede Player. 0so_4moros0 como nombre de reaccionar más rápido a los ataques, guerra no vale, mejor ponemos en pero a la vez se dificulta la puntería. Player Name por ejemplo Al Límite ^Bl00dh0und^ o -_D3Struct0r_-. En el Ya podemos jugar sólo contra los enelado izquierdo del nombre se ve la imamigos del ordenador, o bien contra amigen del avatar, encima aparece el nomgos o compañeros a través de una LAN bre de la especie correspondiente: los o, con una conexión a Internet, con el luchadores vienen de todo el universo. resto del mundo. En Create Game se Pulsando las flechas pequeñas encima especifican todas las propiedades necede la imagen, se cambia a otra especie. sarias para juegos privados. Esto se Ahora mismo Nexuiz soporta como hace con cinco opciones en el área de Game Mode solamente el Deathmatch, arriba. Primero hay que poner dentro la lucha de todos contra todos. Más de los Basic Options (Figura 5) el Public abajo mostraremos cómo se pueden Server a Disabled. Ahora hay que fororganizar equipos a través de la consola. El Field of view quiere decir campo mular las reglas del juego. En Frag visual. Valores encima de 100 provocan Limit se definen el número de los Frags un efecto de ojo de pez, valores por que hacen finalizar un juego. La opción debajo de 100 causan una visión de Max Players limita la cantidad de jugatúnel. Los jugadores suelen usar valodores en un nivel. Con la opción Bot res encima de 100 para lograr una mejor vista general sobre el mapa, o sea, del campo de juego. A través del View Size se cambia el tamaño de la sección de la imagen, Crosshair Type y Crosshair Size determinan el tamaño y apariencia de la cruz reticular. En caso necesario, en el registro Controls se puede modificar la organización del teclado. Hay que pulsar una letra ya asignada y luego a la nueva tecla a agregar. En la sección Audio se Figura 4: ¿Los gráficos se atrancan? Hay que deshacambia el volumen de la música bilitar los efectos gráficos en la medida de lo posible. y de los efectos acústicos. El De todos modos, los profesionales renuncian a los registro Input controla la sensiefectos.

WWW.LINUX-MAGAZINE.ES


Nexuiz • PORTADA

mapa seleccionado. Se elige entre los distintos mapas con las flechas pequeñas encima de la imagen. Normalmente el próximo campo de juego aparece automáticamente después de cada nivel terminado. Con la opción Map List (a la derecha de Basic Options) se decide qué mapa entra en la rotación. Con un doble click sobre un mapa se añade a la Cycle List. Ahora nos ocupamos de los Game Figura 5: Antes de empezar un juego nuevo, hay que Settings. Aquí existen también formular las reglas del juego. ¿Cuántos Bots habrá en muchas opciones, vamos a un nivel? ¿Qué fuerza deben tener los Bots y cuándo explicar a continuación las más se acaba un juego? importantes. En el modo Instagib cada jugador tiene sólo Count se indica cuántos enemigos conun disparo para mandar al enemigo al trolados por el ordenador aparecerán nirvana virtual. En la Rocket Arena se en el juego. En la siguiente opción se dispone exclusivamente de lanzadores define su potencia. Si no se juega a de cohetes. En el Vampire Mode se reciNexuiz todo el tiempo, el nivel más alto ben los puntos que se han quitado a los es casi imposible. Por eso conviene demás dañándoles. A los jugadores empezar despacio. apasionados de Unreal o Counterstrike La imagen de pantalla del lado les parecerán poco comunes algunos izquierdo de las opciones muestra el movimientos, pero también estos deta-

WWW.LINUX-MAGAZINE.ES

lles se pueden cambiar en Nexuiz. Jugando a ser Dios se puede cambiar la gravedad en Level Gravity y limitar o ampliar así la altura de los saltos. Se puede acelerar todo el rumbo del juego con Game Speed. Con Player Maxspeed se define la velocidad de los Avatares. Aquí se modifican también todos los aspectos relacionados con la salud. Nexuiz administra la salud según un sistema propio. Normalmente se estabiliza en 100 Puntos. La toma de los llamados Medi-Packs aumenta la salud a corto plazo, pero pronto baja otra vez a 100 puntos. Por eso muchos jugadores no dudan mucho y atacan antes de que se disminuya la salud otra vez. Cuando una figura resulta herida, la salud se regenera por sí misma a 100 puntos. El registro Health Rot fija la velocidad de deterioro. El Health Regeneration Speed concreta el proceso automático de la curación. Los mismos mecanismos valen para el armamento. El Self Damage designa el daño que uno mismo se hace con una maniobra inapropriada de su propia arma. El

Número 13

15


PORTADA • Nexuiz

Figura 6: Selección de armas. Con la ayuda de muchas opciones, se pueden adaptar las armas a las necesidades de cada cual. Después del cambio, una escopeta, que antes era poco peligrosa, es capaz de causar importantes daños.

Weapon Switch Delay especifica la velocidad del cambio del arma. La eficiencia de las armas depende en muchos casos del entorno, así que un valor de cambio rápido tiene sentido. Con los Weapon Settings (Figura 6) se adaptan las armas al gusto de cada cual. Una escopeta, por ejemplo, se vuelve muy atractiva si se aumenta el Shotgun Damage de 6 a 67. Así se puede matar al enemigo con un solo tiro. La opción Rocket Launcher Refire ajusta la distancia entre los cohetes que salen del lanzador. Bajando el tiempo de carga a 0.00 se pueden disparar salvas enteras de cohetes. Como hay tantas opciones, se tarda un rato hasta que se encuentran las propiedades adecuadas para nuestras necesidades de juego. Hay que guardar los cambios para no tener que empezar desde cero con el próximo arranque. Para esto se dispone de la opción Management en Create Game. Aquí se guardan las configuraciones para Maplist, Weapons y Game individualmente. Cuando uno se siente preparado para luchar contra enemigos en la red, hay que elegir Join Game para ver cuántos de los servidores listados están poblados. Los valores NP/MP lo indican. MP muestra la máxima cantidad posible de jugadores, NP informa de cuántos jugadores están en realidad presentes en el nivel. Según mi propia experiencia, hay más movida por la noche. No hay que ser el mejor jugador del mundo para participar en una partida en la red. Con un poco de suerte se encuen-

16

Número 13

tran enemigos de igual destreza. No se debe olvidar tener en cuenta el valor Ping para conectar con un servidor de alta velocidad. Se pierden una parte de los ajustes propios en el juego online porque los administradores de los servidores fijan las reglas. Sólo se mantienen las propiedades gráficas.

La Consola

Figura 7: La pantalla de juego permite desplegar una consola de control.

Como en otros juegos de acción en primera persona, se pueden manipular las propiedades directamente a través de la consola durante el juego. Es verdad que existen muchas opciones también a través de los menús gráficos, pero muchos ajustes son posibles exclusivamente con la consola, como por ejemplo jugar en LAN. La consola es además muy adecuada para cambiar opciones a mitad de una partida. Los comandos de la consola se encuentran, entre otros, en el archivo config.cfg en el subdirectorio ./nexuiz/data/ del directorio Home. Aquí aparece un problema: la tecla para activar la consola está mal seleccionada. Por ello hay que abrir primero con Kate un archivo config.cfg. Allí hay que poner bind "c" "toggleconsole". La consola aparece ahora en el juego pulsando [C] y se cierra con [Esc]. Para medirse a través de una LAN con otros jugadores, hace falta la dirección IP de vuestro ordenador. Tecleando

esta manera los otros jugadores se meten en el juego abierto. El juego en equipo se activa a través de la consola con teamplay 1, luego los jugadores eligen sus colores en las opciones Player dentro de las Options. También se pueden cambiar las líneas que empiezan con seta a través de la consola. Antes de cualquier cambio se debería hacer una copia de seguridad del archivo config.cfg. La introducción de seta bot_number 3 cambia, por ejemplo, la cantidad de los Bots dentro del juego a 3. También el comando set showfps 1 se usa mucho. Indica el número de Frames por segundo y ayuda a reconocer ganancias de rendimiento. Hay que experimentar un poco. Merece la pena visitar el foro de Nexuiz [4] para preguntas sin resolver. De todas formas se puede recomendar el juego a pesar de unos detalles a refinar como los skins de los jugadores y los movimientos de los Bots. Pero como Nexuiz es un producto de código abier■ to, están aseguradas las mejoras.

/sbin/ifconfig | grep Bcast

RECURSOS en una consola Linux, se recibe la dirección. Ahora se abre un juego con Create Game. El Public Server puede estar en Disabled. Normalmente un juego LAN funciona de tal manera que los otros jugadores se registran a través de Join Game para un juego abierto en una red local, pero no es el caso de Nexuiz. Aquí cada uno empieza su propio juego con Create Game. Los compañeros de juego abren entonces la consola con [C] e introducen connect dirección-IP con la dirección-IP del jugador que haya empezado una partida. De

WWW.LINUX-MAGAZINE.ES

[1] La sección de descargas en la página web de Nexuiz: http://www.nexuiz. com/index.php?module=downloads [2] Información sobre la aceleración 3D: http://wiki.linuxquestions.org/wiki/ 3D_graphics_acceleration [3] Instalación de un servidor dedicado: http://www.nexuiz.com/forums/index. php?showtopic=527 [4] El foro de Nexuiz: http://www.nexuiz. com/forums/index. php?showtopic=527


Juegos Comerciales • PORTADA

Análisis del panorama actual de juegos en Linux

¿GAME OVER? Aún lejos del mercado de videojuegos que hay en otras plataformas, el videojuego en Linux acaba de iniciar un ascenso imparable, creando a su paso nuevas formas de negocio y comunidades de jugadores que se han convertido en programadores y creadores de sus propios juegos. POR VICENTE CARRO

E

l ocio se ha convertido en la forma de negocio más rentable de nuestros tiempos. Cuando llegan fechas como las de las pasadas navidades, el consumo de regalos relacionados con el ocio se dispara. Todos queremos diversión en nuestras vidas, y esto se extiende también a nuestros ordenadores. Cada vez es mayor la demanda de juegos que los usuarios quieren para sus plataformas, ya sean desde móviles hasta consolas de nueva generación, especialmente en fechas navideñas; así la cantidad y calidad de los mismos aumenta en consecuencia. Y, por fin, Linux no es una excepción.

Tendencia al Alza Si bien es cierto que los videojuegos habían sido una asignatura pendiente para Linux, en los últimos años las cosas han cambiado bastante. Algunos equipos de desarrollo empiezan a ver el mercado Linux como un mercado viable y la comunidad está muy activa con algunos proyectos de juegos libres bajo licencias GPL o similares. Por su parte las editoras, que sólo buscan beneficio a corto plazo,

siguen sin ver en Linux un mercado en expansión y potencialmente rentable, y sin su apoyo es muy difícil que un equipo de desarrollo pueda abrirse camino en este mercado tan competitivo. Pero es sólo cuestión de tiempo para que el creciente consumo de juegos de Linux consiga que las editoras más importantes empiecen a crear versiones Linux de todos sus títulos.

Vayamos por Partes La situación actual de los videojuegos en Linux es algo confusa. Gracias a la organización de la comunidad GNU/Linux, se han generado varias líneas de desarrollo de juegos ajenas al habitual juego comercial que podemos encontrar en las demás plataformas. Así que vamos a clasificarlos en 3 grandes grupos:

1.- Juegos Libres En primer lugar encontramos los juegos libres. Estos son programados por y para la comunidad, no hay empresas detrás que los financien ni el objetivo es obtener beneficio alguno. Entre ellos podemos encontrar grandes proyectos como

WWW.LINUX-MAGAZINE.ES

Planeshift [1], un juego de rol masivo online 3D; proyectos más humildes como puede ser el proyecto español Glest[2], un juego de estrategia 3D; y juegos simples como Chromium[3], un matamarcianos 2D de la vieja escuela. Realmente el número de proyectos de juegos libres es impresionante: surgen proyectos nuevos casi todos los días y aunque sólo un pequeño porcentaje se completan, existe un más que amplio abanico de posibilidades donde elegir. El principal problema de los juegos libres suele ser el aspecto gráfico. Los gráficos de un juego requieren un equipo de diseño trabajando durante muchísimas horas, y es sumamente difícil encontrar un equipo de diseñadores que trabaje 8 horas al día sin cobrar nada a cambio. Sin embargo se espera que la evolución de las herramientas de diseño gráfico suplan esta falta de mano de obra artística.

2.- Juegos de Terceros El segundo grupo en nuestro análisis del panorama de juegos en Linux lo forman los juegos emulados (aunque en algunos

Número 13

17


PORTADA • Juegos Comerciales

gos de este sistema que he podido “emular” correctamente en Linux ronda el 15%. Además no podía terminar el análisis de este segundo grupo sin comentar que algunos juegos “emulados” van objetivamente mejor en Linux que en su plataforma original, aunque cueste creerlo, especialmente en lo referido a estabilidad y fluidez del número de imágenes por segundo.

3.- Juegos Comerciales

Figura 1: Los juegos punteros como Quake 4 y Doom 3 salen también para Linux y, si los comparamos con sus versiones Windows, vemos que son exactamente iguales.

casos realmente no estén técnicamente emulados). Algunos juegos de otras plataformas (casi siempre de Windows) se pueden “emular” para poder jugar en nuestro sistema Linux. Programas como WINE, WINEX o, su evolución, Cedega son los encargados de hacer que funcionen juegos

de Windows en Linux con mejor o peor resultado. Snes9x, Zsnes, Gngb, Visualboy Advance y otros, hacen lo propio con juegos de videoconsolas. Hay que decir que las “emulaciones” de juegos de Windows son problemáticas; por ejemplo en mi experiencia personal, el porcentaje de jue-

Figura 2a: Postal 2 – Esto es lo que pasa si te disparan en la cabeza a quemarropa con una escopeta de combate.

18

Número 13

WWW.LINUX-MAGAZINE.ES

En el tercer y último grupo de nuestra clasificación están los juegos puramente comerciales. Estos son creados por equipos de desarrollo profesionales con el fin de obtener beneficios. Normalmente una editora compra los derechos del juego y se encarga de su distribución. Lamentablemente este procedimiento está repercutiendo en la calidad de los juegos, ya que los plazos de entrega fijados (con multas por retraso) impuestos por las editoras obligan a lanzar al mercado juegos que no están del todo terminados o que podrían mejorarse sustancialmente. Afortunadamente para nosotros, los escasos juegos comerciales que salen para Linux suelen estar más elaborados, ya que las políticas de las editoras Linux son menos restrictivas que las del resto de plataformas. Los videojuegos comerciales en Linux le deben mucho a ID Software, empresa creadora de las sagas Quake y Doom. Estos caballeros han portado desde sus inicios los ejecutables de dichos juegos a Linux, a pesar de que si alguien quería jugar, tenía que comprarse el juego completo de otro sistema operativo. Así, desde el Doom hasta los recientes Quake 4 y Doom 3, los títulos de ID Software siempre han tenido versión Linux. Pero no son los únicos. Otras compañías han portado a Linux sus títulos más emblemáticos con más o menos problemas de distribución. Un caso reciente es el de Cold War [4], título desarrollado por el estudio Mindware y que ha sido portado por ellos mismos a Linux. Sin embargo su editora, DreamCatcher, se negaba a publicar el título en Linux sin una protección de copia segura, cosa harto difícil por otro lado. Finalmente, aunque todavía no es oficial, parece que será LinuxGamePublishing [5], la mayor editora de juegos Linux del planeta, la que se


Figura 2b: Postal 2 – La policía hará su trabajo y, si lo aprovechamos, sacaremos ventaja con guardaespaldas improvisados.

lleve el gato al agua y consiga publicar Cold War. También hay que decir que, de media, los juegos comerciales Linux tienen menos requerimientos de sistema y pueden correr en ordenadores modestos, aunque eso también se traduce en una peor calidad gráfica, pero de media repito; ya que las versiones Linux y Windows de un juego puntero y reciente como Quake 4 son exactamente iguales.

Juegos a la Carta Aparte de los citados 3 tipos de juegos, hay un nuevo tipo que no encaja exactamente en ninguna de las clasificaciones anteriores: los juegos a la carta. Esto es un nuevo modelo de negocio basado en el software libre. Con él se pretende que sean los usuarios los que soliciten un juego libre con determinadas características y, si lo desean, puedan también participar en su desarrollo. Los costes podrían ser soportados por la comunidad, como ya se hizo en su momento con el programa de modelado 3D Blender. Así un proyecto de juego simple, de digamos 6000 euros de presupuesto total, podría ser fácilmente costeado por una comunidad de 100 usuarios con una inversión de 60 euros por persona. Por supuesto estos tipos de desarrollo no se podrían dar si hubiese que progra-

mar cada juego desde cero, por lo que en la práctica se opta por usar motores de juegos libres prefabricados, que dan un menor rendimiento que uno hecho específicamente, pero reducen enormemente el tiempo y los costes de desarrollo. Entre este tipo de motores de juego libre podemos señalar el prometedor Raydium [6], Crystal Space [7] o Ogre [8] entre otros muchos. Algunas empresas españolas, como Guadagames [9], ya apuestan por este modelo como el formato de juego del futuro y, si las expectativas se cumplen, en 5 años podrían estar creándose entre 5 y 10 juegos por año en España con este modelo, lo que además significaría la creación de puestos de trabajo gracias al software libre. A continuación pasamos a un breve análisis de una selección de juegos comerciales para Linux.

Postal 2: Share the Pain Con este revelador título, “comparte el dolor”, se presenta esta secuela del clásico Postal, un juego de acción en primera persona con uso intensivo de la violencia. Lo primero que llama la atención de este juego es que está prohibido en numerosos países y es que realmente es “políticamente incorrecto”. Pero afortunadamente ahora en España podemos disfrutar de él.

WWW.LINUX-MAGAZINE.ES


PORTADA • Juegos Comerciales

Figura 2c: Postal 2 – Si nos disfrazamos de policía, los transeúntes no nos tendrán miedo.

El juego nos pone en el pellejo de un programador que tiene que realizar tareas bastante habituales en el día a día de cualquier persona. Estas tareas van desde comprar la leche, conseguir un árbol de navidad o incluso ir al médico a que nos den algo para una infección de orina. Pero no podía ser tan fácil y una ola de crecien-

te violencia ataca el pueblo donde se desarrolla la acción, con lo que día a día iremos teniendo más y más grupos y comunidades persiguiéndonos para acabar con nuestra vida. Las posibilidades de violencia explícita e incorrección que nos da este juego son simplemente brutales. Podemos decapitar

Figura 2d: Postal 2 – El pánico creciente genera escaladas de violencia que acaban con escenas dantescas como estos 9 cadáveres desfigurados por el fuego.

20

Número 13

WWW.LINUX-MAGAZINE.ES

a los transeúntes con una pala, hacer que se orinen encima castigándoles con un taser, prenderles fuego, patearlos, amenazarlos, hacer que vomiten, y todo lo que a nuestra retorcida mente se le ocurra. A nivel técnico el juego usa el conocido motor Unreal con lo que el rendimiento es muy alto y así el juego funcionará muy bien en casi cualquier ordenador. Los comentarios que hace el protagonista del juego son constantes a lo largo de la partida y muy adecuados, con la importante pega de que están en inglés, como el resto de los textos. Las músicas son sólo ambientales y con un punto de excentricidad que los autores han usado para darle un toque más cómico a todas las situaciones. Sin duda un juego muy recomendable en esos días duros en los que tienes que liberar tensiones, pero teniendo siempre muy claro que sólo es un videjuego y no debe ni puede extrapolarse al mundo real (no estaría bien arrancarle la cabeza a nuestro jefe con una pala…¿verdad?). Y por si alguien todavía tenía alguna duda: sí, este juego es exclusivamente para mayores de 18 años.

Soul Ride Los aficionados al snowboarding están de enhorabuena con este juego. Soul Ride es el único juego de su temática en Linux y además tiene algunos puntos fuertes. Su Principal baza está en que cuenta con montañas reales de los EEUU, que han sido levantadas en 3 dimensiones y reproducen con total fidelidad la geografía del terreno. Por supuesto eso no quiere decir que el juego se vea exactamente igual a las montañas reales, ya que algunos elementos como los tremendamente simples árboles no tienen nada que ver con los reales. Pero aun así este juego hará las delicias de los snowboarders. En lo que respecta a la jugabilidad, se ha compensado el riesgo en la vida real a tener un accidente con un aumento de la dificultad, cosa que nos hará pensarnos más de una vez si de verdad queremos intentar hacer un salto acrobático cuando estamos a punto de terminar un descenso. También es reseñable que las partidas se pueden grabar en un aparato de vídeo virtual para poder ver las repeticiones de los mejores descensos. Otra característica que entusiasmará a los fans del snowboard es la del “heli-drop”, que consiste en que, a vista de pájaro, elegimos un punto


Juegos Comerciales • PORTADA

aleatorio de cualquiera de las montañas y un helicóptero nos dejará ahí a nuestro libre albedrío. La mayoría de las veces acabaremos hundiéndonos en la nieve o cayendo en un grupo de rocas desnudas, pero es una herramienta genial para los locos del snowboard, ya que pueden hacerse una idea aproximada de lo que van a encontrar en ese descenso que quieren probar por si mismos en el mundo real. El objetivo del juego es completar los distintos descensos de las montañas que tenemos disponibles, pero estos descensos están puntuados y todas las acrobacias que podamos realizar nos ayudarán a mejorar nuestra puntuación. En el apartado técnico destaca que el juego está hecho con un humilde motor libre, y ya conocemos las ventajas de este tipo de motores. De hecho la distribuidora del juego en España ya ha hecho una traducción al español así como algunas mejoras al motor aprovechando que éste se puede modificar. Lamentablemente el motor no es gran cosa, y se limita a cumplir correctamente su trabajo sin introducir ningún efecto gráfico destacable. El juego viene con varias pistas de audio que nos harán mucho más emocionantes los descensos y también se nos pone en situación con un buen repertorio de efectos de sonido, que aunque no sobresalen en calidad, realizan su tarea correctamente. Un juego muy recomendable para los aficionados al deporte en general y al snowboard en particular.

Figura 3a: Soul Ride – Algunos descensos nos permitirán disfrutar relajadamente durante algunos segundos del paisaje.

truos de todo tipo, que incluso pueden aparecer de las cloacas de las ciudades. La jugabilidad queda condicionada en principio por el idioma, ya que todo el juego está en ingles y esto puede resultar un handicap importante para muchos jugadores. Aparte de esto , la curva de

dificultad está bien ajustada y si las primeras fases parecen fáciles, las últimas nos causarán mas problemas de los esperados. Además el juego incluye la expansión Northern Expansion, con lo que nuevas fases y algunos extras más se nos ofrecerán en la parte norte del continen-

Majesty: Gold La estrategia está representada en este análisis por Majesty: Gold, juego adictivo donde los haya. Majesty es un juego de estrategia en dos dimensiones y vista isométrica. Su principal característica diferenciadora con los demás juegos de estrategia es que en este juego no se puede controlar a los individuos ya que aquí no somos un dios, sino un simple rey. Así que el enfoque cambia de “dar ordenes” a “motivar acciones”, y estas motivaciones no podían venir en otra forma que monedas de oro y recompensas por matar a tal monstruo o por ir hasta tal punto. Para darle más acción, nuestro reino será constantemente atacado, bien por guerreros de otros reinos o bien por mons-

Figura 3b: Soul Ride – Para obtener buenas puntuaciones tendremos que aprender a hacer acrobacias como ésta.

WWW.LINUX-MAGAZINE.ES

Número 13

21


PORTADA • Juegos Comerciales

justo antes de entregarnos una jugosa recaudación. Otro punto a destacar es que los personajes pueden evolucionar y, a poco que realicen un par de misiones con éxito, sus capacidades aumentarán en consecuencia. Y como los personajes, los edificios también podrán evolucionar aumentando sus capacidades de producción o investigación, como viene siendo habitual en este tipo de juegos. Para mejorar más, si cabe, el conjunto, resulta que el juego tiene modo online, así que podremos jugar con hasta 4 amigos, bien cooperativamente, ya que los reinos pueden estar aliados, o bien enfrentados, lo que es más normal. Tanto los incondicionales de la estrategia como los jugadores casuales disfrutarán con este juego que, advertimos, es tremendamente adictivo.

Conclusiones Figura 4a: Majesty – Esta es una parte del mapa de misiones, donde elegiremos nuestros retos de acuerdo a su dificultad.

te donde se desarrollan las misiones del juego básico. La manera de recolectar dinero es curiosa. El recaudador irá casa por casa recolectando lo justo (salvo que queramos presionar la economía social extorsionándolos un poco) y una vez

termine su ronda volverá a palacio, y en ese momento el dinero que lleva será ingresado en nuestras arcas y podremos disponer de él. Por supuesto que es imperativo que este recaudador esté siempre protegido, ya que sería muy inconveniente que lo matasen

Con todo lo anterior podemos afirmar que, aunque de media los juegos en Linux tienen peor calidad y se encuentran en menor número que en otras plataformas, fuera de esta media están apareciendo en Linux superventas como Quake 4, Doom 3, Cold War, Unreal Tournament 2004 y muchos otros; y además la tendencia al alza es indiscutible y en no mucho tiempo la calidad llegará a igualarse o incluso a superar a la de otras plataformas. Además la comunidad Linux ha sido el caldo de cultivo ideal para la creación de otras líneas de juego como los juegos libres, los juegos a la carta o la especialización en emulación de juegos ■ de otras plataformas.

RECURSOS [1] Planeshift http://www.planeshift.it [2] Glest http://www.glest.org [3] Chromium http://www.reptilelabour. com/software/chromium [4] Cold War http://www.coldwar-game. com [5] LinuxGamePublishing http://www. linuxgamepublishing.com [6] Raydium http://www.raydium.org [7] CrystalSpace http://www. crystalspace3d.org [8] Ogre http://www.ogre3d.org Figura 4b: Majesty – La expansión Northern Expansion nos permitirá jugar en las nevadas cumbres de la zona norte del continente.

22

Número 13

WWW.LINUX-MAGAZINE.ES

[9] Guadagames http://www. guadagames.com


WorldForge • PORTADA

Forja de Mundos

WORLD FORGE El sistema de mundos virtuales WorldForge, diseñado como la alternativa libre a los MMORPGs (Massively Multiplayer Online Roleplaying Games), nos permite crear nuestro propio mundo virtual y sumergirnos en él en un entorno 3D. POR MIGUEL GUZMAN MIRANDA

C

omo si no tuviésemos ya bastante con el mundo real, en esta época online que vivimos, los mundos virtuales multijugador están en auge. Esto hace que podamos elegir entre un gran número de ellos cuando queramos transportarnos a una realidad paralela. Sin embargo, los mundos virtuales no son nuevos, muchos recordaréis los MUDs (Multi User Dungeon), unos juegos de rol multijugador online en modo texto que aunque eran muy sencillitos, nos enganchaban de mala manera haciéndonos perder nuestras horas de estudio. Los MMORPG actuales, en su mayoría, no son más que la versión tridimensional de los MUDs de antaño, como por ejemplo Everquest, Star Wars Galaxies o World of Warcraft. Todos estos son juegos de rol basados casi exclusivamente en el combate y en la mejora de las habilidades de tu avatar, aunque tam-

Créditos de WorldForge Cyphesis: Alistair Riddoch, Ahiplan Oy, Indri: James Turner, Sear: Simon Goodall, Ember: Erik Hjortsberg, Miguel Guzmán, Colaboradores: Kai Blin, Hans Häggström, Hagen Möbius, Media: Andor Holtsmark, Jason Oppel, Valerie A. Valusek, Malcolm Walker, Jayr, ChienNoir, Infra: Mike Taylor, Jack Cummings, Philipp Kaluza, Anubis, Elefth, Legal: Dave Turner

bién existen otros juegos orientados más a la socialización o a la inmersión en una realidad paralela, en este caso es más apropiado el término “mundo virtual” que MMORPG. La alternativa del Software Libre a todos estos productos propietarios es WorldForge [1]. Worldforge es un sistema completo para la creación y desarrollo de MMORPGs y mundos virtuales. Es importante resaltar que WorldForge no es un juego, sino un sistema consistente en un protocolo y distintos servidores y clientes que nos permitirán crear y jugar en nuestros propios mundos. Por eso no tiene sentido hablar de “el mundo de WorldForge” o “las reglas de WorldForge”, por ejemplo, ya que la definición del mundo y las reglas del juego

WWW.LINUX-MAGAZINE.ES

Número 13

23


PORTADA • WorlForge

se crean mediante scripts en el servidor. ¡Podrás hacer el mundo que quieras con WorldForge! WorldForge viene con un juego “por defecto”, que es el que se utiliza para demostrar las capacidades del sistema. Este juego es actualmente Mason, el cual está orientado hacia la creación y construcción, donde los jugadores pueden utilizar herramientas. Por ejemplo puedes utilizar un hacha para cortar un árbol y después utilizar un yesquero para prender fuego a la leña conseguida.

Arquitectura de WorldForge WorldForge sigue una arquitectura cliente/servidor. Todos los componentes utilizan un protocolo común, así que cualquier cliente podrá conectarse a cualquier servidor mientras hablen la misma versión del protocolo. En la práctica, existe un servidor funcional (aunque hay otro en desarrollo) y dos clientes 3D. El protocolo de WorldForge se llama Atlas. Es un protocolo orientado a la transmisión de información de mundos virtuales, y básicamente lo que hace es describir entidades y operaciones del mundo virtual. Atlas también se utiliza para la definición del mundo en el servidor. El servidor funcional de WorldForge es Cyphesis, un servidor de mediana escala orientado a la inteligencia artificial. Cyphesis utiliza un sistema de reglas basado en objetivos, mediante el cual los personajes controlados por el servidor se comportan de acuerdo a sus metas. Existe un servidor en desarrollo, Indri, orientado a sistemas a gran escala, aunque todavía no existe una versión estable del mismo. Los dos clientes existentes son Sear y Ember. Son muy parecidos, y tienen prácticamente la misma funcionalidad, lo que cambia es la filosofía de diseño. Sear está prácticamente entero “hecho en casa”, y aunque toma prestado código de otros proyec-

24

Número 13

tos de software libre, básicamente todos los componentes funcionales están dentro del código de Sear, como pueden ser el motor 3D (usa directamente OpenGL) y el sistema de ventanas. En contraposición, la filosofía de Ember es “recicla lo que puedas”, es decir, Ember utiliza sobre todo libreríFigura 1: Una vista de una torre en un mundo de WorldForge utilizanas externas, por do el cliente Ember. ejemplo utiliza OGRE como motor 3D y CEGUI como mos que para la primera toma de consistema de ventanas. tacto con WorldForge utilicéis el autoEn la práctica los dos implementan package. más o menos la misma funcionalidad. Descargamos el archivo emberSear es más eficiente, debido a que utiliX.X.X.x86.package que aparezca en la za sobre todo código propio, mientras página. En el momento de escribir este que Ember es más pesado y necesita artículo la versión más reciente de una tarjeta aceleradora gráfica más Ember es la 0.3.4, con lo cual el archivo potente. Para compensar, Ember es gráactual es ember-0.3.4.x86.package. Es ficamente más vistoso. posible que nos encontremos con una En este artículo describiremos la insversión posterior, aunque la forma de talación del cliente Ember y del servidor instalación será la misma. Cyphesis, así como la definición del Tras descargar el archivo debemos mundo para que podáis modificarlo y ejecutarlo: crear el vuestro propio. Si os gusta, os invitamos a probar el resto de elemenCuadro 1: Arranque de tos de WorldForge. En la sección de Cyphesis Recursos encontraréis las URLs, listas de 01 $ cyphesis correo, IRC, etc. para contactar con los 02 NOTICE: DATABASE: NOTICE: desarrolladores.

Instalación del Cliente Ember La instalación del cliente Ember es muy sencilla puesto que viene en un formato denominado autopackage. Es un instalador con interfaz gráfica, muy al estilo de los instaladores de windows, para olvidarnos de problemas de dependencias y demás. Podemos descargar el archivo de la página de Ember en [2]. Desde esta página también podemos descargar el código fuente de Ember y compilarlo nosotros mismos, es más eficiente porque es una compilación dinámica, pero tenemos que instalar también todas las dependencias. Como Ember tiene muchas dependencias os recomenda-

WWW.LINUX-MAGAZINE.ES

03

04

05 06 07

CREATE TABLE / PRIMARY KEY will create implicit index "accounts_pkey" for table "accounts" NOTICE: DATABASE: NOTICE: CREATE TABLE / UNIQUE will create implicit index "accounts_entity_ent_target_ke y" for table "accounts_entity_ent" NOTICE: DATABASE: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "entity_ent_pkey" for table "entity_ent" INFO: Restoring world from database... INFO: world restored INFO: Running


Ember es tan sencilla y limpia como ejecutar “package remove ember” desde la línea de comandos. Autopackage y Ember se instalan en nuestro directorio de usuario bajo “.local”. Podemos arrancar Ember desde el menú de inicio de nuestro escritorio, o bien con el comando “ember”. Figura 2: Podemos utilizar el yesquero para encender leña que preEn algunos casos viamente hemos cortado. raros el autopackage no actualiza chmod +x ember-0.3.4.x86.packag correctamente el PATH y el ./ember-0.3.4.x86.package LD_LIBRARY_PATH. En esos supuestos tendremos que añadir nosotros mismos Cuando instalemos cualquier autopacal PATH el directorio ~/.local/bin/ y al kage por primera vez, el sistema necesiLD_LIBRARY_PATH el directorio tará descargarse los archivos básicos de ~/.local/lib/ember para que funcione autopackage (autopackage.tar.bz2). correctamente, aunque lo normal es que Esto sólo será necesario hacerlo una se añadan correctamente y que con ejevez, ya que esta instalación servirá para cutar “ember” funcione. posteriores autopackages. Como Ember es un cliente 3D necesita Supondremos que es la primera vez una cantidad de objetos multimedia para que instalamos un autpackage (y si no lo funcionar: gráficos, modelos 3D, etc. Para es, entonces ya sabes cómo funciona obtener estos objetos multimedia se utiliza toda esta historia…). Tras descargarse el una aplicación específica de WorldForge código de autopackage nos pedirá la conque se llama WFUT (WorldForge Update traseña de root para instalarse a nivel de Tool). Al arrancar Ember, se lanzará WFUT sistema. Si no se la proporcionamos, lo para descargarse los gráficos del servidor. instalará únicamente para el usuario Este método es mejor que incluir los gráfilocal (normalmente esta segunda opción cos en la descarga del cliente, porque así es suficiente, salvo que queramos podrán actualizarse de forma automática instalar autopackage y Ember siempre que se añadan nuevos gráficos al para varios usuarios) servidor. Podéis encontrar más informaTras instalar el códición de WFUT en [3]. go común del autoWFUT necesita tener instalado una package, se instalamáquina virtual java (una libre como rá Ember. Una kaffe nos vale, y si no es posible, siempre ventana nos irá podemos descargar la de Sun) y xterm, informando del ya que WFUT utiliza xterm para mostrarprogreso. nos el progreso de las descargas. Cuando finaliLa primera vez que ejecutemos Ember ce, nos mosmostrará un mensaje y se abrirá una trará el traventana xterm que nos informará de las bajo realizadescargas, y una vez que se hayan do y cómo actualizado los gráficos, se arrancará la desinstalar el versión gráfica de Ember. paquete. En Utilización de Ember este caso, la forma de desAl arrancar Ember nos aparece una veninstalar tana con la ayuda detallada. De momen-

WWW.LINUX-MAGAZINE.ES


PORTADA • WorlForge

Figura 3: Podemos entablar conversación con otros habitantes del mundo. En este caso, con un vendedor de cerdos.

to sólo se encuentra disponible en inglés, pero eso es porque soy vago y perezoso. Con un poco de suerte en un futuro no muy lejano estará disponible el interfaz también en castellano. Tras echarle un vistazo a la ayuda, podemos cerrar esa ventana. Debajo está la ventana de servidores, donde nos aparece una lista con los distintos servidores que se encuentran activos y sus datos relevantes. Haciendo doble click sobre el nombre de un servidor nos aparecerá una ventana de conexión al mismo. Aparte de conectarnos a los servidores que hay en Internet, también podemos montar nuestro propio servidor y conectarnos a él. En el siguiente apartado describiremos cómo se instala el servidor y cómo se configura. Cuando nos conectamos a un servidor aparecerá una ventana para introducir nuestro nombre de usuario y contraseña. Si es la primera vez que nos conectamos, tendremos que crear la cuenta (pulsamos en el botón “Create”) y a partir de esa primera vez simplemente tendremos que hacer “Login”. Una vez autenticados contra el servidor, nos aparecerá la lista de personajes que tenemos a nuestra disposición. Al principio no

26

Número 13

Figura 4: Panorámica de un pueblo vista a través del cliente Ember.

tendremos ninguno, así que tendremos que crearlo. De momento, sólo se pueden elegir personajes de tipo “Settler” (colono) y de sexo “Male”. Apareceremos en el mundo y podremos usar las teclas típicas para movernos (WSAD), y el ratón para mirar a nuestro alrededor. Pulsando sobre los objetos nos aparecerá un menú contextual desde el cual podremos tocar cosas (por ejemplo, si tocamos un roble caerán bellotas), cogerlas (pasarán a nuestro inventario), inspeccionarlas o utilizar lo que llevemos en la mano. Para utilizar un objeto del inventario podemos blandirlo (Wield), así por ejemplo podremos utilizar el yesquero (tinderbox) para prender fuego a las cosas, o la pala (shovel) para hacer agujeros en el suelo. Podremos talar árboles con el hacha, para después prenderle fuego a los troncos. También podemos criar cerditos. Si hablamos con el vendedor de cerdos y le decimos “I would like to buy a pig” (para hablar puedes pulsar en la consola, que se encuentra en la parte superior de la pantalla). Nos dirá que un cerdito cuesta 10 monedas. Pulsando sobre el mercader, eligiendo la opción “Give”, le podremos dar las 10 monedas y él nos dará un cerdito (conviene comprobar antes que quedan cerditos en la pocilga, porque si no hay ninguno el muy tunante se quedará con nuestro dinero y no nos dará nada). Ahora podemos buscar un buen roble, soltar a nuestro cerdito cerca y ver cómo se come las bellotas y va creciendo.

WWW.LINUX-MAGAZINE.ES

Tocando el roble caerán más bellotas, y tocando a nuestro cerdito haremos que se desplace en la dirección opuesta, para que vaya a donde queramos, y diciendo “soweee” el cerdito nos hará caso y se parará. Cuando estéis criando cerditos… ¡cuidado con el lobo! Como se puede comprobar, de momento, el juego que viene con WorldForge es más una simulación de un mundo virtual que un juego propiamente dicho, pero ahora estamos empezando a implementar el combate, así que en breve podremos usar el hacha y el yesquero para tareas más agresivas.

El Servidor Cyphesis Vamos a ver cómo se compila, instala y configura el servidor de WorldForge. Aunque existe un autopackage para el servidor, se recomienda instalarlo como RPM o compilar directamente las fuentes. Podemos descargar las fuentes desde [4]. Cyphesis necesita las siguientes dependencias:

Listado 1: Definición del Mundo 01 points = { } 02 [... definición de varios puntos aleatorios ...] 03 04 points['0x0'] = [0, 0, 12.8] 05 points['1x0'] = [1, 0, 23.1] 06 points['0x1'] = [0, 1, 14.2] 07 points['1x1'] = [1, 1, 19.7]


WorldForge • PORTADA

Listado 2: Conocimientos del Lobo 01 wolf_knowledge=[('w1','location',(90,-90,settlement_heigh t)), 02 ('w2','location',(110,-90,settlement_heig ht)), 03 ('w3','location',(110,90,settlement_heigh t)), 04 ('w4','location',(90,90,settlement_height ))]

• •

Atlas-C++ es la librería que implementa el protocolo Atlas de WorldForge varconf es una librería de configuración de variables wfmath es una librería de utilidades matemáticas específica de WF skstream es una librería de comunicaciones específica de WF

Mercator es la librería de generación procedural de terreno de WF La página de Cyphesis se enlaza a las descargas de sourceforge.net de estas librerías. Para compilarlas se utiliza el sistema habitual: ./configure && make &&U make install

Ahora tendremos que crear una base de datos para cyphesis que pertenezca al usuario que va a lanzar el proceso cyphesis (por defecto, nuestro usuario local). Con su - cambiamos al usuario root, su - postgres para cambiar al usuario de PostgreSQL y con este usuario creamos el usuario de la BD con el mismo nombre que nuestro usuario local: createuser miguel

En el momento de escribir este artículo la versión más reciente de Cyphesis es 0.5.2, con las siguientes dependencias de WorldForge: Atlas-C++ 0.6.0rc1, varconf 0.6.3, wfmath 0.3.4, skstream 0.3.5, Mercator 0.2.4.

PostgreSQL Cyphesis necesita una base de datos PostgreSQL para funcionar. Todas las distribuciones de Linux que se precien deberían venir con PostgreSQL, así que lo mejor que podemos hacer es instalarla directamente desde nuestra fuente de paquetes favorita.

Éste necesita tener permisos para crear bases de datos, pero no para crear nuevos usuarios, aunque no pasa nada porque los tenga. Para crear la base de datos de cyphesis hacemos: $ createdb CREATE DAT BASE

Si tu usuario local no es el que va a lanzar cyphesis, habrá que utilizar la opción -O <nombre de usuario> para


PORTADA • WorlForge

que el propietario de esta base de datos sea el usuario que vaya a lanzar cyphesis. Si va a ser el usuario local, no es necesario, puesto que por defecto el propietario de la BD es el usuario que la ha creado. ¡Ya tenemos la base de datos lista para que el servidor acceda a ella!

Inicialización del Servidor Sólo nos queda inicializar el servidor y echarlo a andar. Primero tendremos que cargar las reglas en la base de datos. Esto lo hace el comando cyloadrules: @LI_$ cyloadrules NOTICE: DATABASE: NOTICE:ßß CREATE TABLE / PRIMARY KEYßß will create implicit indexßß “rules_pkey” for table “rules” Reading rules from mason 78 classes stored in ruleßß database. Reading rules from basic 29 classes stored in ruleßß database. Este comando lee las definiciones de las reglas de unos ficheros XML y las introduce en las tablas de la base de datos. Si algo ha ido mal nos dará un error y en este caso, revisaremos que la base de datos está correctamente creada y que el usuario local puede acceder

Figura 5: Cria cerdos, corta árboles y interactúa con otros personajes de los mundos de WorldForge.

(por ejemplo con ‘psql cyphesis’). A continuación, arrancamos el servidor (la salida puede verse en el cuadro 1) y, ahora que tenemos el servidor corriendo, será necesario poblar el mundo con contenido. Esto se hace con el comando cyclient. $ cyclient

Listado 3: Objetivos del cerdo y del lobo 01

02 03 04

pig_goals=[(il.avoid,"avoid([' wolf','skeleton','crab'],10.0) "), (il.forage,"forage('acorn')"), (il.forage,"forage('apple')"), (il.forage,"forage('mushroom')"), (il.herd,"herd()")]

05 06 07 wolf_goals=[(il.forage,"forage('ham')"), 08 (il.hunt,"predate(self,'pig',30.0)"), 09 (il.hunt,"predate(self,'crab',20.0)"), 10 (il.hunt,"predate(self,'squirrel',10.0)"), 11 (il.patrol,"patrol(['w1', 'w2', 'w3', 'w4'])")]

28

Número 13

La salida de cyclient es una lista muy muy larga de todos los objetos que está creando en el servidor, junto con su identificador. Ya tenemos nuestro mundo poblado, cosa que podremos comprobar si nos conectamos con el cliente.

Edición del mundo El mundo de WorldForge se define mediante scripts en Python en cyphesis. La edición de un mundo es un tema demasiado extenso como para poder dar una visión completa en este artículo, así que daremos simplemente una introducción. El script principal de definición del mundo en cyphesis es define_world.py. Se encuentra en /usr/local/share/cyphesis/ruleset/mason, y el comando que aplica este script al mundo es cyclient. En este script se definen el terreno y las entidades que lo pueblan, tanto los objetos inanimados como las personas y animales, para los cuales, además se definen sus conocimientos y objetivos.

WWW.LINUX-MAGAZINE.ES

La definición del mapa se hace asignandole valores de altura a la rejilla del mapa. El mapa del mundo es una rejilla cuyas casillas miden 64x64 metros. Dándole valores a los puntos de la rejilla de forma procedural se genera el terreno para todo el mapa. Esto, en el fichero de definición de mundo, se muestra en el Listado 1. Por ejemplo aquí se están definiendo 4 puntos de la rejilla. La última línea nos indica que el punto 1x1 de la rejilla (es decir, la coordenada 64 m x 64 m en el mapa) tendrá una altura de 19.7 metros. Los puntos intermedios se definen de forma procedural, es decir, mediante un algoritmo pseudoaleatorio que, dada la misma semilla, siempre obtiene el mismo resultado. Así podemos definir mundos muy grandes con muy pocos puntos, sabiendo que tanto el servidor como todos los jugadores verán el mismo terreno detallado gracias al algoritmo pseudoaleatorio. Vamos a ver ahora algo de inteligencia artificial. Compararemos al cerdito con el lobo y veremos en qué se diferencian. Para establecer la inteligencia artificial se definen unos conocimientos y unos objetivos. El conocimiento determina las cosas que la entidad conoce del mundo al iniciarse el servidor. En este caso los pobres cerditos no saben nada (porque están encerrados en la pocilga), pero el lobo que es listo, se conoce varias zonas del mapa: (ver Listado 2). Ahora asignaremos unos objetivos a las entidades, tal y como se muestra en el Listado 3. Vemos que el cerdito tiene miedo de los lobos, los esqueletos y los cangrejos, y si los ve huirá hasta estar al menos a 10 metros de ellos. Se alimentará de bellotas, manzanas y champiñones. El objetivo


WorldForge • PORTADA

Para añadir las entidades al mundo los creamos usando el elemento m, que es el editor del mapa (mapeditor), y que nos permite realizar las modificaciones al mundo (ver Listado 4). Aquí les estamos asignando sus objetivos, además de otorgarle las prioridades al lobo. Figura 6: Al entrar en el pueblo encontramos un mercado con sus Así, si está patrutiendas. llando y ve una presa, dejará de de “herd” (manada) hace que el cerdito hacerlo y se dedicará a cazar. sea gregario, es decir, que se mueva en La forma de modificar la configuramanada junto con otros de su especie. ción básica del servidor es detenerlo, El lobo, en cambio, es un solitario modificar el módulo default de intrépido y no le tiene miedo a nada. define_world.py, volver a arrancar el Comerá carne si la ve por ahí tirada, en servidor y lanzar cyclient. cambio, si se percata de la presencia de Pero también podemos crearnos nuesun cerdito, un cangrejo o una ardilla, tro propio módulo de Python en el fichelos perseguirá para cazarlos y comérsero de definición del mundo ya existente, los. El objetivo de “patrol” (patrullar) o en otro nuestro creado aparte (por indica que el lobo se moverá por unos ejemplo, mi_mundo.py), de la siguiente determinados puntos del mapa (que forma: son los que hemos definido en sus conocimientos) para acechar así a sus def mi_modulo(mapeditor): presas. m = editor(mapeditor)

01 piglet = m.make('pig', type='pig', xyz=(-3,-1,settlement_height)) 02 m.learn(piglet,pig_goals) 03 04 wolf = m.make('wolf', type='wolf', xyz=(90,-90,settlement_height)) 05 m.learn(wolf,wolf_goals) 06 m.know(wolf,wolf_knowledge) 07 m.tell_importance(wolf,il.fora ge,'>',il.hunt) 08 m.tell_importance(wolf,il.fora ge,'>',il.patrol) 09 m.tell_importance(wolf,il.hunt ,'>',il.patrol)

El argumento mapeditor y la creación del editor del mapa son necesarios para que el módulo pueda añadir cosas al mundo usando el elemento m, tal y como hemos visto anteriormente. Estas reglas se aplicarían con:

Más información Se han creado dos hilos de discusión en los foros de WorldForge en [6], en las secciones de Ember y Cyphesis, para discutir en castellano sobre este artículo. Intentaré responder todas vuestras dudas. También se puede contactar con los desarrolladores de worldforge en el IRC [7], canal #coders, aunque en el ■ IRC el idioma oficial es el inglés.

RECURSOS [1] Worldforge: http://www.worldforge. org [2] Página de Ember: http://www. worldforge.org/dev/eng/clients/ember [3] Información sobre WFUT: http:// worldforge.org/dev/eng/tools/wfut [4] Fuentes de Cyphesis: http://www. worldforge.org/dev/eng/servers/ cyphesis [5] Desarrolladores: http://worldforgedev. org [6] Foros: http://forums.worldforgedev. org [7] IRC (contiene los canales: #coders para on-topic, #lounge para off-topic): irc://irc.worldforge.org [8] IRC web: http://purple.worldforge.org/ cgiirc

cyclient mi_mundo.m

Nótese que ejecutar cyclient sin ningún argumento equivale a ejecutar: cyclient define_world.default

Y así podremos aplicar nuestros propios cambios “en caliente”. Tened en cuenta que el módulo por defecto define prácticamente el mundo entero, así que si lo aplicáis dos veces tendréis todos los objetos duplicados.

WWW.LINUX-MAGAZINE.ES

EL AUTOR

Listado 4: Añadimos entidades al mundo

comando 1 comando 2 [...]

La edición de mundos en WorldForge daría para escribir bastante más que un artículo, aunque con esto ya es suficiente para empezar. Se comienza probando a poner un árbol aquí, una casa allá, y al final acabaréis cambiando la inteligencia artificial para que los cerditos vayan cazando a las personas… ¡Ahora tenéis el control de un mundo en vuestras manos!

Miguel es uno de los desarrolladores de Ember, un cliente 3D para WorldForge. Además es coautor del universo de fantasía Cronos: las Esferas del Tiempo (http://www. worldforge.org/worlds/cronos). En el día a día, Miguel trabaja como Desarrollador para Telefónica I+D.

Número 13

29


PORTADA • Sudoku

Programas para el rompecabezas Sudoku

JUEGO SIN LÍMITES

Unos ya consideran Sudoku como el Cubo de Rubik del siglo 21. El juego tiene una lógica parecida al cubo mágico, pero se puede jugar tanto en papel como sobre el ordenador. Presentamos software que genera siempre nuevos campos de juego, pero que también ayuda a solucionarlos. POR OLIVER FROMMEL

E

l éxito del año en el campo de los juegos se llama Sudoku. Desde el metro al parque, la gente rellena con su lápiz, en todos los lugares, las cifras de uno hasta el nueve en pequeñas tablas. El pasado octubre, en la feria de juegos en Essen, la Asociación Alemana de la Industria de Juguetes calificó este nuevo pasatiempo como la “mega-tendencia” para el año que viene. Por este motivo, los fabricantes de juguetes mostraron en dicha feria más de diez clones diferentes de Sudoku disfrazados de juegos nuevos [1].

30

Número 13

Sudoku es un juego de lógica con normas sencillas. Siguiendo unas reglas determinadas, hay que rellenar una cuadrícula de nueve por nueve celdas con las cifras 1 hasta 9, sin cálculo alguno. Los programas expuestos generan nuevos campos de juego y ayudan a dar con la solución si hace falta.

Astronómico Quien lo desee más barato, puede calcular los campos de juego con su ordenador Linux, imprimirlos y llevárselos. Esto

WWW.LINUX-MAGAZINE.ES

proporciona diversión de juego sin límites, porque en total existen en las 9 por 9 celdas más de 6 x 1021 combinaciones distintas, tal como calculó el estudiante de matemáticas Bertram Felgenhauer [2]. Para solucionar tantas posibilidades, no bastaría con una vida humana. El artículo de Wikipedia cuenta un poco más sobre el origen de Sudoku [3] y la página web del periódico “El Correo Digital” ofrece por ejemplo rompecabezas Sudoku [4]. Encontraréis al final de este artículo dos cuadrículas de Sudoku,


Sudoku • PORTADA

uno de nivel fácil y otro avanzado para probarlas directamente.

Lógico

na como candidata para la subcuadrícula. Muchas veces sólo queda una cifra como solución viable y al instante sabremos rellenar la caja.

El principio del juego es sencillo: Hay que rellenar El ordenador partodas las casillas en el ticipa campo de juego con una cifra del uno al nueve de Para un juego tan lógico tal manera que no se repiFigura 1: Gnome-Sudoku caltambién existen, naturalta ninguna de ellas en una cula cuadrículas y si se pide, mente, unos programas misma línea, columna y ofrece sugerencias para su de ordenador. Los más subcuadrícula (véase solución. El campo consiste sencillos generan cuadrífigura 1), de ahí también en nueve subcuadradrículas culas y ofrecen la soluel nombre Sudoku, que con tres por tres casillas ción del rompecabezas en traducido del japonés sigcada una. la pantalla. Los usuarios nifica más o menos “cifra arraigados de Gnome elisoltera”. Bajo estas condiciones y con las gen Gnome-Sudoku [5], un programa cifras dadas, el jugador reduce cada vez escrito en Python. Calcula juegos más la selección para las casillas libres Sudoku con grados de dificultad distinhasta llegar al punto en el que, para una tos que vienen preparados con más o celda determinada, sólo quedará un canmenos cifras. El jugador puede soluciodidato. nar el rompecabezas generado directaNo hace falta sumar números o el uso mente en una ventana de Gnome (Figura de otras habilidades parecidas. Sudoku 1). sólo requiere ciertas dotes de combinaEl programa requiere para su instalación y una buena memoria. Lo último es ción Python 2.4 que está instalado solaopcional: Muchos jugadores apuntan los mente en las distribuciones más recienposibles candidatos para una casilla en tes. Gnome-Sudoku funciona bien en sus rincones para recordarlos en sus principio, pero contiene bastantes erropasos posteriores de razonamiento. res que, por cierto, no bloquean el proHay varias estrategias para la solución. grama, pero que sí pueden frenar un Por ejemplo, es conveniente pensar en poco el flujo del juego. Los errores ya un número que falta todavía en una subempiezan con la selección del grado de cuadrícula y entonces buscar ese númedificultad, donde el control (Easy hasta ro en las líneas y columnas que la cruHard) no causa ningún efecto visible. En zan. Si la cifra ya está presente, se elimisu lugar, es mejor elegir de la lista ofrecida, dentro del mismo diálogo, un juego con un grado de dificultad dado. De todas formas Gnome-Sudoku tiene una función bastante práctica llamada Tracker. Con Tracker se graban una serie de jugadas que se dejan deshacer más tarde de un golpe. Quien percibe con el tiempo que las supuestas cifras de solución no eran completamente correctas, puede volver rápidamente a una cuadrícula todavía en buen estado. Se puede deshacer un solo movimiento fácilmente con la función Undo. Gnome-Sudoku ayuda al jugador con los llamados Hints (Sugerencias). Cuando el cursor se encuentra en una Figura 3: Pulsando la tecla Shift, Ksudoku casilla, el programa indica con un click muestra todos los campos que pueden contede ratón los candidatos posibles. Si el ner el mismo número que la casilla donde se cursor no está en ninguna casilla, el proencuentra el cursor del ratón (aquí el 6 en el grama reacciona con un mensaje de centro). Todo lo demás lo colorea en rosa. error. La opción Resume Game ofrece

WWW.LINUX-MAGAZINE.ES

Figura 2: Ksudoku muestra una cuadrícula al comienzo del juego. El programa marca líneas, columnas y la subcuadrícula actual con colores.

continuar juegos interrumpidos desde el mismo lugar. Para principiantes el Sudoku de Gnome contiene una ayuda que introduce los principios del juego y el uso del programa.

Komfort con K El equivalente de KDE al Gnome-Sudoku se llama, como no podía ser de otra manera, Ksudoku. Para la autocompilación el programa sólo requiere las bibliotecas KDE. También se encuentran en la página web [6] paquetes listos para Fedora y Debian. Después del arranque a través de ksudoku aparece una ventana como en la figura 2. Jugando con Ksuduko, se aprecia que ofrece mayor comodidad frente al

Figura 4: Ksudoku contiene un modo 3D que es igual en sus principios a los del juego al Sudoku original. Se colocan las casillas en el espacio en lugar de en una superficie de dos dimensiones.

Número 13

31


PORTADA • Sudoku

Figura 5: Un Sudoku de resolución sencilla (a la izquierda) y otro de mayor dificultad (derecha). ¡Intenta resolverlos!

Sudoku de Gnome. Por ejemplo, colorea la línea, la columna y la subcuadrícula, que pertenecen a la casilla donde se encuentra el cursor del ratón. Hay dos maneras para colocar una cifra en una casilla: o bien seleccionar en la barra vertical de herramientas un número y luego pulsar con el botón izquierdo del ratón sobre una casilla, o bien pulsar la tecla de la cifra correspondiente en el teclado. Si se equivoca en el número, el programa colorea la cifra en rojo. Con el botón derecho del ratón se elimina de nuevo el número introducido. Como función práctica, Ksudoku permite también tomar apuntes sobre posibles candidatos para un campo. Para ello se elige un número a través del menú o del teclado y se pulsa el botón derecho del ratón. Entonces Ksudoku escribe el candidato en letra pequeña en el campo. En principio es posible cualquier cantidad de notas, pero el programa, por el tamño de cada cuadricula, solamente puede mostrar cuatro de los números en la parte superior del cuadro.

Ayuda Con un click en Hint, Ksudoku rellena simplemente la casilla actual. La tecla Shift presta una ayuda más sutil. Con shift, Ksudoku muestra todos los campos donde encaja la misma cifra como el de la casilla actual (Figura 3). Esta es naturalmente una considerable ayuda com-

32

Número 13

parado con el Sudoku analógico en papel. Quien realmente quiera solucionar su rompecabezas con su propio esfuerzo no debería usar esta opción. Por otro lado, el manual del menú de Ayuda resulta francamente escaso y no presta ni instrucciones para el uso del programa ni para el juego en sí. Pero Ksudoku viene con un modo 3D que muestra las casillas, normalmente ordenadas en dos dimensiones, en un modelo espacial (Figura 4). Esto no altera en nada los principios del juego, pero el modo ofrece a jugadores avanzados de Sudoku una nueva e interesante perspectiva al juego. Para los fans muy endurecidos, Ksudoku genera también cuadrículas más grandes con más de nueve por nueve casillas. En este modo, como ya no alcanzan los números de 1 hasta 9, el programa usa letras en su lugar.

La Solución, a mano Aparte de Ksudoku y Gnome-Sudoku, existen una serie de programas que se ocupan del popular juego de lógica. El Sudoko-Solver [7] soluciona los rompecabezas que ni siquiera un experto sabría. El Sudoku-Explainer [8] en cambio, no se contenta con proporcionar una solución hecha. Explica el camino hacia la solución del rompecabezas dado. Este último programa lee el Sudoku a través de su propio formato ASCII. En este for-

WWW.LINUX-MAGAZINE.ES

mato tenéis que introducir Sudokus ya existentes. Los fervientes admiradores de Gnome, encontrarán en Gnome-Sudoku, a pesar de sus escasos defectos, un programa adecuado para pasar el rato. Sin embargo, la versión KDE, Ksudoku, es, en la mayoría de los puntos, superior a su equivalente de Gnome. Primero por la útil y grata coloración de las líneas y columnas, y, segundo, por su ayuda para solucionar rompecabezas Sudoku. Quien quiera solucionar Sudokus en el ordenador, debería por lo menos echar un vistazo a Ksudoku .■

RECURSOS [1] Sudoku en la feria de juegos: http:// www.reich-der-spiele.de/specials/ Essen2005-Sudoku.php [2] Matemáticas Sudoku: http://web.inf. tu-dresden.de/~bf3/sudoku/ [3] Wikipedia sobre Sudoku: http://en. wikipedia.org/wiki/Sudoku [4] Rompecabezas Sudoku en el “Correo Digital”: http://sudoku.elcorreodigital. com/ [5] Gnome-Sudoku: http:// gnome-sudoku.sourceforge.net [6] Ksudoku: http://ksudoku.sourceforge. net [7] Sudoku-Solver: http://www.katletz.at/ katsudoku [8] Sudoku-Explainer: http://sourceforge. net/projects/sudoku-sensei


KOffice 1.4 • PRÁCTICO

Un veloz paquete ofimático para el escritorio KDE

UNA AYUDA EN LA OFICINA

La última versión del paquete ofimático KOffice viene cargada de novedades, incluyendo más aplicaciones. En este artículo veremos lo que hemos encontrado en el test realizado a KOffice 1.4. POR MARCEL HILZINGER

S

i somos usuarios de Linux que necesitamos intercambiar datos con Word y Excel, puede que no tengamos mejor alternativa que OpenOffice. Pero si fundamentalmente creamos documentos para nuestro propio uso, el nuevo paquete ofimático KOffice merece ser tenido en cuenta. KOffice es

rápido y estable, y dispone de algunas características que no encontraremos en otros entornos ofimáticos.

Componentes de la Familia Además del procesador de textos KWord, la hoja de cálculo KSpread y el software de presentaciones KPresenter, KOffice

WWW.LINUX- MAGAZINE.ES

comprende otros programas como: *Kivio, un generador de diagramas *Karbon14, un programa de diseño vectorial *Kugar, un generador de reportes *KChart, una herramienta de diseño de gráficos *KFormula, un editor de fórmulas

Número 13

33


PRÁCTICO • KOffice 1.4

importantes que modos de vista. Esto permite al usuario impiden que el ver diferentes partes de un documento al intercambio mismo tiempo. El programa, bien abre entre KOffice y una nueva vista dentro del documento OpenOffice sea actual o bien en una nueva ventana del perfecto. Por programa. La ventana puede ajustarse en ejemplo, aunque vertical o en horizontal. En teoría, estas no hemos enconvistas pueden ajustarse de nuevo, pero trado problemas esto va en contra de un uso adecuado del importando o programa. Podemos verificar el menú exportando View para ver estas características. archivos simples Interesante KWord con texto, el resultado solía Cada vez que ejecutamos una aplicación ser malo si el de KOffice, lo primero que aparece en la archivo incluía ventana es un cuadro de diálogo de un Figura 1: Al lanzar una aplicación de KOffice, aparece una ventana con imágenes o diaexplorador de archivos. Podemos elegir los principales tipos de documentos. gramas. El proceentre crear un nuevo documento basado sador de textos en una plantilla existente, o editar un Son novedad en la versión 1.4 el proimporta las tablas como texto. Y no fuidocumento ya creado o recientemente grama de base de datos Kexi y la herramos capaces de guardar una hoja de cáleditado (véase Figura 1). KWord guarda culo con diagramas creados con KSpread mienta de manipulación de imágenes las plantillas que ofrece al usuario en en formato OpenDocument. Dicho lo Krita. En total, este paquete ofimático /opt/kde3/share/apps/kword/templates. cual, OpenDocument no será el formato para KDE incluye al menos diez compoSi preferimos no ver esta ventana en lo por defecto hasta el próximo nentes (véase la Tabla 1). lanzamiento. La versión 1.4 Cambios Notables utiliza los formatos propietaLa última versión de KOffice incluye rios de KOffice. soporte mejorado para el formato de Un archivo OpenDocument documentos Open-Document de OASIS. es un archivo ZIP que puede Se trata de una extensión del formato de ser descomprimido en línea de documento XML de OpenOffice.org. Así comandos con unzip nombremismo, supone la base de los documenarchivo o con la utilidad con tos de OpenOffice 2.0. Los archivos creainterfaz gráfica ark. El archivo dos con el nuevo KOffice son por tanto en sí mismo comprende varios altamente compatibles con los archivos archivos XML, una miniatura de OpenOffice 2.0. Por ejemplo KWord en formato PNG y posiblemenpuede leer documentos creados con te unos cuantos archivos mulFigura 2: Ojo al detalle: por defecto en las listas numeraOpenOffice 2.0 beta que se incluye en timedia, suponiendo que el das no se inserta un punto después del número. Suse Linux 9.3. Si guardamos documendocumento tenga elementos tos en formato OpenDocument con multimedia. La Tabla 2 muestra un ejemsucesivo, podemos activar Always start KWord o KSpread, la versión de plo típico de un archivo de texto KWord with the selected template y pulsar OpenOffice incluida con Suse 9.3 debeOpenDocument. OK. Esto le indica al programa que arranría, teóricamente, ser capaz de abrirlos. Una de las novedades de KOffice es que con un documento de texto vacío. La En realidad existen algunos obstáculos que ahora sus aplicaciones tienen varios versión 1.4 permite personalizar los iconos de varias plantillas. La mayor ventaja que presenta KWord Tabla 1: Miembros de la Familia frente a OpenOffice es la velocidad. Mientras que OpenOffice tarda unos Programa Comando Tipo de programa segundos en arrancar, incluso con el KWord kword Procesador de textos hardware más reciente, KWord arranca Kspread kspread Hoja de cálculo velozmente incluso en ordenadores antiKPresenter kpresenter Presentaciones Kivio kivio Diagramas de flujo guos. Dicho esto, el tamaño de la letra Karbon14 karbon Diseño vectorial por defecto de 8 puntos es demasiado Krita krita Manipulación de imágenes pequeño para la mayoría de los usuarios. Kugar kugar Generador de reportes Para cambiarlo a un tamaño más fácil de Kexi kexi Front-end de bases de datos leer, como 12 puntos, seleccionamos KChart kchart Diseño de gráficos Format | Style Manager. En el cuadro de KFormula kformula Editor de fórmulas diálogo que aparece, pulsamos sobre Font

34

Número 13

WWW.LINUX- MAGAZINE.ES


KOffice 1.4 • PRÁCTICO

KWord la aplicará a nuestra selección. Aunque esto evita tener que acceder al menú para cambiar entre los estilos de numeración o tipo de viñetas, no es demasiado práctico, ya que es raro que el usuario esté cambiando continuamente de estilo dentro de un mismo documento. Los principiantes en KOffice suelen tropezar con otra funcionalidad de enumeración de éste. Si seleccionaFigura 3: Podemos usar el editor de combinación de mos una lista numerada y correspondencia para envíos rápidos y masivos. Word luego elegimos Arabic numguarda los registros con las direcciones en el documento. bers en la lista desplegable, KWord no añade un punto y seleccionamos el nuevo tamaño de la después del número (véase Figura 2). letra. Para cambiar esta configuración, seleccionamos Format | Paragraph, pestaña Viñetas y Números. Bullets/Numbers, y tecleamos un punto El uso del procesador de textos no debeen el cuadro Suffix text. ría suponer un reto para la mayoría de la En el lado positivo, el modo de viñetas gente, salvo por una o dos pequeñas de KWord es muy flexible. Por ejemplo, excepciones. Tomemos las viñetas y listas podemos usar cualquier carácter que elinumeradas, por ejemplo. Mientras que la jamos para las viñetas y podemos añadir mayoría de los programas ofimáticos percaracteres como prefijos. miten al usuario seleccionar un fragmenConfigurando los Sinónimos to del texto y pulsar a continuación en el símbolo de enumeración, KWord muestra KOffice tiene un diccionario de sinóniuna lista desplegable al hacer esto. mos, en idioma inglés, por defecto (están Podemos entonces seleccionar el tipo de disponibles descargas para otros idionumeración o viñeta que necesitemos y mas). Para usar el diccionario de sinóni-

Figura 4: El generador de reportes Kugar permite crear diseños, pero el programa es muy poco manejable a la hora de generar reportes.

WWW.LINUX- MAGAZINE.ES

mos, pulsamos con el botón derecho sobre una palabra en un documento de KWord y seleccionamos Show related words en el menú desplegable. Esto hace aparecer el cuadro de sinónimos. Si lo preferimos, podemos usar el menú Tools | Show related words en su lugar.

Combinación con el Correo Los desarrolladores de KOffice presentan dos métodos para las tareas de combinación de correspondencia. Podemos, bien ayudarnos de una base de datos externa como fuente de los datos, o bien podemos introducir los datos directamente usando el editor de combinación de correo, que se puede configurar seleccionando Tools | Configure mail merge. Si optamos por una base de datos existente, KOffice nos permite elegir entre una hoja de cálculo de KOffice, la libreta de direcciones de KDE o una fuente de datos SQL. En el momento de escribir estas líneas, no parecía haber manera de usar la base de datos Kexi como fuente de datos. Al contrario que en versiones anteriores de KOffice, sólo la hoja de cálculo de KOffice y el almacenamiento interno funcionaban como fuente de datos. El programa se negaba a aceptar otras fuentes. Para guardar las direcciones en un documento de KWord, seleccionamos Create new... en el cuadro de diálogo Mail merge configuration, y pulsamos OK en la ventana que aparece. Esto arranca el editor de combinación de correspondencia de KWord. En el editor, pulsamos en el símbolo Add entry y tecleamos un nombre para el campo, Título, por ejemplo. Repetimos estos pasos para otros campos que necesitemos, como Apellidos, Nombre, Calle, CP y Ciudad. El cuadro debe ser algo parecido a lo mostrado en la Figura 3. Después de pulsar sobre No Value, podremos rellenar el primer registro. Para añadir más registros, pulsamos sobre Add record. Después de agregar tantos registros como queramos, pulsamos el botón OK. Podemos ahora añadir los campos a nuestro documento seleccionando Insert | Variable | Mail merge. Desafortunadamente, la ventana se cierra cada vez que hacemos una selección y tendremos que repetir estos pasos varias veces. Si ya tenemos un documento con las direcciones, podemos seleccionar la hoja

Número 13

35


PRÁCTICO • KOffice 1.4

Figura 5: Problemas de juventud con los accesos a base de datos de Kexi.

de cálculo de KOffice como fuente de datos. Sólo necesitaremos una pequeña hoja de cálculo con el nombre de los campos en la primera línea y los datos en las siguientes líneas. Buscamos Tools | Configure mail merge | Open existing y seleccionamos la hoja de cálculo de KSpread como fuente de datos.

Hojas de Cálculo y Presentaciones KSpread sale bien parado en comparación con su homólogo de OpenOffice. Aunque la aplicación de KOffice puede no ser tan rica en funcionalidades como Calc, tiene más que suficiente para la mayoría de las aplicaciones. Además, hay tres cosas que KSpread hace mucho mejor que la hoja de cálculo de OpenOffice. Cuando seleccionamos una celda, KSpread no usa el color negro sino un azul claro. También usa el azul claro para destacar las cabeceras de las columnas y líneas nuevas, además de etiquetar las celdas que contienen fórmulas o funciones con un triángulo azul en la esquina inferior izquierda. Otra característica que muchos usuarios echarán de menos después de trabajar con KSpread es la herramienta para autoajustar el ancho de las columnas. Mientras que Calc de OpenOffice requiere que hagamos un pequeño tour por los menús, KSpread hace el auto-ajuste simplemente con hacer doble clic en la cabecera de la columna. Por último, la hoja de cálculo de KDE también soporta la creación de series arbitrarias. Para ello, seleccionamos Insert | Series y tecleamos los valores inicial, final y el paso. KSpread puede crear tanto series lógicas (2,4,6,8), como geométricas (2,4,8,16). No hay demasiado que contar acerca de KPresenter. Aunque obviamente, comparado con Impress de OpenOffice flaquea en términos de funcionalidad, sin embargo, las características disponibles son las que la mayoría de las personas pueden necesitar para crear atractivas presentaciones. Un aspecto positivo que

36

Número 13

apreciamos en las pruebas realizadas fue que, al contrario que con OpenOffice 2.0, KPresenter puede exportar las diapositivas en formato Sony Memory Stick, permitiendo al usuario realizar presentaciones sin ni siquiera necesitar un PC. El programa de KDE tiene la ventaja de soportar formato de pantalla de 16:9. Escala automáticamente las diapositivas para ajustarse a la pantalla, mientras que Impress deja bordes negros. Lo que los desarrolladores deberían añadir definitivamente a KPresenter es la funcionalidad de imprimir folletos.

Kugar y Kexi

solución que encontramos es el comando kudesigner, que lanza el diseñador de reportes de Kugar. Ahora podemos usar el diseñador para crear un diseño para nuestro reporte. El programa de KOffice guarda el diseño en un archivo separado con extensión *.kut. Hasta este momento todo bien, pero el diseñador de reportes no permite que le especifiquemos una fuente de datos (véase Figura 4). De acuerdo con la documentación, el usuario debe compilar la fuente de datos de manera manual en forma de archivo XML y guardar el resultado en un archivo con extensión *.kud. Si hemos llegado hasta este paso, podemos teclear el comando kugar layout.kut data.kud para cargar el reporte. Esto ni es amigable ni práctico. ¿Por qué no permiten los desarrolladores especificar una tabla de KSpread o una base de datos de Kexi como fuente de los datos?

Dificultades iniciales

El nuevo front-end de base de datos Kexi Los tres componentes principales, está repleto de problemas de juventud. KWord, KSpread y KPresenter son todo lo De los métodos de almacenamiento que que la mayoría de la gente necesita para ofrece el programa, Project in file y Project llevar a cabo cualquier trabajo típico de on database server, sólo el primero funoficina. Pero KOffice tiene más prograciona en realidad. Si seleccionamos un mas que ofrecer. Algunos de estos prograproyecto de base de datos basado en sermas resultaron ser auténticas joyas en vidor, aparece el cuadro para seleccionar nuestras pruebas, mientras que otros nos los conectores MySQL y PostgreSQL, pero dejaron preguntándonos qué demonios en realidad no podemos usarlos. Kexi hacer con ellas. Kugar pertenece a esta continúa mostrando un mensaje de error última categoría. El programa teórica(véase Figura 5). Incluso después de mente sirve para generar reportes, pero haber editado el archivo de conector (hay trabajar con él se volvió tan complicado un ejemplo en el código fuente en el que hasta los usuarios experimentados directorio kexi/tests/startup) y de haber en KDE necesitarán consultar la doculanzado la aplicación con kexi mentación para conseguir hacer algo. Para ejecutar el programa pulsamos [Alt+F2] y tecleamos kugar. Esto muestra un explorador de archivos con el que podemos seleccionar un archivo Kugar o datos Kugar. Si no tenemos un reporte previamente creado, no Figura 6: Pulsar para seleccionar la fecha debería ser algo sencillo. No podremos lanzar ocurre esto con Kexi, debido a los valores que sugiere. el programa. La

WWW.LINUX- MAGAZINE.ES


KOffice 1.4 • PRÁCTICO

Figura 7: La herramienta de manipulación de imágenes Krita es una de las estrellas del nuevo paquete KOffice.

testdb.kexis, Kexi fue incapaz de establecer una conexión con el servidor MySQL. El programa conseguía crear al menos un archivo local de base de datos. Con Create | Table le indicamos a Kexi que cree una nueva tabla. El programa soporta Text, Integer number, Floating point number, Yes/No y Date/Time. Pero, sin embargo, está plagado de bugs. Se necesita una clave primaria para cada tabla. Kexi no puede editar los datos si no existe. Los campos de fecha/hora no se pueden utilizar en esta versión: sólo se puede usar el campo de fecha, no es posible registrar entradas con la hora. Dicho

esto, no hay manera de introducir la fecha de manera manual: el usuario está obligado a pulsar en el botón adecuado de KDE. Y Kexi hace todo tipo de extrañas sugerencias para la fecha (véase Figura 6). Por último, el editor de formularios es poco práctico. Aunque el usuario pueda crear magníficos formularios con unos pocos clics de ratón, no tiene manera de especificar la fuente de datos para los campos individualmente, dejando como única salida la introducción de los datos por uno mismo. Por contra, el editor de consultas es bastante útil.

Tabla 2: Contenido de un Archivo de Texto de OpenDocuement Archivo content.xml meta.xml settings.xml styles.xml mimetype META-INF/manifest.xml Thumbnails/thumbnail.png

Función Archivo XML con el contenido propiamente del archivo. KOffice puede abrir los archivos XML directamente. Detalles del autor, compañía y email del autor, así como información del programa utilizado para la creación del documento. Información de estado del documento, como modo de visualización, último cambio y última impresión. Estilos, como encabezamientos, viñetas y listas numeradas. El tipo de documento, por ejemplo, application/vnd.oasis.opendocu ment.text para archivos de texto. Detalles de los archivos del fichero ZIP. Vista previa de la primera página en un archivo PNG transparente.

WWW.LINUX- MAGAZINE.ES

Ni Kugar ni Kexi están realmente integrados en KOffice: KWord usa su propio formato de base de datos, y es imposible crear reportes o formularios usando alguno de los tres componentes principales de KOffice. Además de esto, el entorno integrado de KOffice, que podemos lanzar tecleando el comando koshell, no añade nada de valor. En la parte positiva, los programas de dibujo Krita y Karbon14, junto con la herramienta de diagramas KChart, ofrecen una impresión mucho mejor. Kivio es otro componente bastante maduro de KOffice.

Krita y Karbon14 Krita supone la presentación de un programa de manipulación de imágenes para KOffice versión 1.4 (véase Figura 7). Si alguna vez hemos tenido dificultades para desenvolvernos con GIMP, debido a su peculiar interfaz, deberíamos echarle un vistazo a este programa de KDE. Su abanico de funcionalidades es comparable a GIMP, pero su interfaz es mucho más amigable para los novatos, los cuales terminarán prefiriéndolo. El programa de KDE le toma prestado a GIMP su selección de plantillas, gradientes y pinceles. Krita puede abrir archivos de GIMP y soporta capas. El uso de la aplicación es un proce-

Número 13

37


PRÁCTICO • KOffice 1.4

es un programa para diseñar gráficos. Y hace su tarea de una manera convincente y sencilla. Arrancamos el programa presionando [Alt + F2] y tecleando kchart. Aparecerá la ventana estándar de KOffice para abrir o crear archivos. Seleccionamos Bars y pulsamos OK. Si tenemos una plantilla para el gráfico, podemos simplemente seleccionar Edit | Edit data para cambiar los valores de las barras. Detalles como el tipo de gráfico, leyenda, colores, tipo de letra y fondo pueden especificarse en Edit | Chart | Create chart. KChart también se puede ejecutar como una aplicación empotrada en KWord y KSpread.

Conclusiones La nueva versión de KOffice está en el buen camino. Los tres componentes principales, KWord, KSpread y KPresenter, no aguantan el tipo frente a OpenOffice en cuanto a importar y Figura 8: El programa de dibujo vectorial Karbon14 ofrece al usuario un mundo para su creatiexportar formatos de terceros, pero el vidad. Los desarrolladores tendrán que mejorar aspectos como la paleta. hecho de que KOffice se mueva en la dirección de adoptar el formato so bastante intuitivo, y no sufrimos ni un color del gradiente. Pero si mantenemos OpenDocument debería eliminar la solo cuelgue durante nuestras pruebas. La el botón del ratón pulsado en el triángumayor parte de los problemas de commala noticia para los profesionales: Krita lo, podemos cambiar de color. Para añapatibilidad entre los dos principales sólo soporta modo de color RGB. dir un color nuevo, tendremos que hacer paquetes ofimáticos de Linux. La KOffice presenta también un completo doble clic en el área mostrada en rojo en denominación de KOffice quizás programa de dibujo vectorial denominala Figura 9, y luego podría ser un poco do Karbon14 (Figura 8). Hacernos con él seleccionar el nuevo excesiva: la base de puede ser complicado, ya que muchas de color. Después de datos Kexi está muy las funcionalidades se esconden en icocompletar el graverde en cuanto a nos que necesitan doble clic. Por ejemdiente, podemos su integración y a plo, para añadir texto, primero tendreseleccionar Add to años luz de poder mos que hacer doble clic en el icono T. Se predefined gradients. considerarse un abrirá un cuadro para introducir el texto. Podemos cambiar en sustituto de Access. Por algún extraño motivo, tendremos que este momento a la Por otra parte, los pulsar sobre Cancel para cerrar el cuadro pestaña Predefined y desarrolladores de después de teclear el texto. La línea seleccionar el nuevo KOffice harían bien donde se sitúa el texto no se hace visible gradiente. Figura 9: La herramienta de gradiente en plantearse el hasta que hemos hecho esto. Para modifiOtro punto criticade Karbon14 es algo complicada de futuro del generacar algún texto que hayamos insertado ble que encontramos encontrar y usar, pero el resultado final dor de reportes previamente, tendremos de nuevo que en nuestras pruebas es muy bueno. Kugar. hacer doble clic en el icono de texto y con Karbon14 fue El programa de confirmar los cambios pulsando sobre que las ventanas de herramientas no son dibujo vectorial Karbon14 y el de OK. El método para convertir texto en escalables. Krita ha solucionado esto de manipulación de imágenes Krita están curvas es similar. manera mucho mejor. ambos, en estos momentos, más conKarbon14 y Krita se integran muy bien seguidos que sus homólogos de Gradientes en KOffice. Esto significa que podemos OpenOffice. La mayor ventaja de Para crear un nuevo gradiente con añadir los dibujos de Krita o Karbon14 a KOffice puede ser la velocidad así Karbon14, de nuevo hacemos doble clic KWord, KSpread o KPresenter. como el menor tamaño del paquete. en el icono. Aparece un cuadro Edit graKOffice apenas ocupa unos 25 Kchart dient con un triángulo para cada color MBytes, una tamaño que otros paqueSiguiendo el principio de Unix de “una bajo el cuadro de gradiente. Si pulsamos tes ofimáticos sólo pueden soñar en ■ herramienta para cada tarea”, KChart en un triángulo, Karbon14 elimina el conseguir.

38

Número 13

WWW.LINUX- MAGAZINE.ES


Knoppix • PRÁCTICO

Técnicas Expertas Expertas para para Saber Saber más más de de Knoppix Knoppix Técnicas

TRUCOS KNOPPIX

El creador de Knoppix, Klaus Knopper, comparte algunos trucos para usar Knoppix en el mundo real. POR KLAUS KNOPPER

K

noppix es un sistema Linux completo ejecutable desde CD o DVD. Puede poner su disco Knoppix en cualquier máquina Intel, equipo compatible y Knoppix se ejecutará, independientemente del sistema operativo que tenga en el disco duro. Pero, a diferencia de muchas distribuciones Linux ejecutables desde CD o DVD, Knoppix no es apreciado sólo como un sistema de demostración o disco de recuperación. Es una distribución Linux real capaz de muchas de las tareas diarias que uno esperaría de un sistema Linux instalado en el disco duro. Como sabemos, la mayoría de la gente piensa en una distribución live como una herramienta para la solución y la recuperación de datos, y Knoppix seguramente se utiliza para estas tareas, pero además es capaz de proporcionar determinadas funcionalidades básicas menos exóticas. Coloque su disco Knoppix en la unidad CD o DVD y reinícielo. El arranque del sistema debe ser igual que cualquier otro sistema Linux. (Ver el cuadro titula-

do “Arrancando Knoppix”). Una vez que lo haya arrancado, Knoppix se ve como una instalación Debian preconfigurada, aparte de algunos scripts automáticos que crean iconos en el Escritorio para

Permisos de cdrecord ¿Recuerda el problema con los permisos erróneos de cdrecord en Knoppix 4.0.1 que mencioné anteriormente? Para evitar sorpresas, debería comprobar que todas las instancias en /usr/bin/cdrecord* son ejecutables por el usuario de Knoppix (bien, ejecute “cdrecord” en la shell) y fije los permisos de los programas en el caso de que no sean correctos, utilizando: sudo chmod a+x U /usr/bin/cdrecord* U /usr/bin/growisofs Ahora podríamos grabar con todos los programas que usen cdrecord (para los CDs) o growisofs (para los DVDs), como k3b, que viene integrado en los menús de KDE.

WWW.LINUX-MAGAZINE.ES

nuevos dispositivos USB y tienen en cuenta los automontadores de los CDROMs. Pero, ¿es lo mismo? El hecho de que el sistema operativo se ejecute desde un medio de sólo lectura hace más difíciles algunas tareas, aunque no tanto como cabría esperar. En este artículo describiré cómo usar Knoppix para tareas prácticas como: • instalar un nuevo programa • grabar CDs • escribir en particiones NTFS Estas técnicas le dan un poder y versatilidad que no pueden esperarse de una distribución en vivo, y una vez que las haya realizado, podría encontrarse descubriendo nuevas formas de hacer de Knoppix parte de su día a día con Linux.

Instalando Nuevos Programas Con Knoppix 3.8 se ha introducido una nueva característica que hace a Knoppix más fácil y añade capacidades que probablemente no esperaría en un sistema

Número 13

39


PRÁCTICO • Knoppix

diseñado para ejecutarse desde un medio de sólo lectura: unionfs. Básicamente, lo que hace unionfs es “simplificar” la mezcla de directorios. Por ejemplo, se pueden mezclar un directorio de sólo lectura (como un CDROM montado) en /KNOPPIX, y un directorio de lectura-escritura pero vacío, en un directorio ramdisk, para crear un directorio de lectura-escritura /UNIONFS totalmente escribible.

Arrancando Knoppix Cuando se arranca Knoppix, ocurre lo siguiente: 1. La BIOS de su equipo ejecuta el cargador isolinux desde el CD/DVD, que muestra algunos gráficos y le permite obtener ayuda (con F2-F3) o introducir opciones del núcleo. 2. isolinux carga el kernel de Linux y un fichero llamado minirt.gz, que contiene un pequeño ramdisk con todos los controladores necesarios para hacer accesibles a los discos duros y (la mayoría de SCSI, USB, Firewire) CD-ROMs/DVDs cn objeto de poder acceder al sistema principal de ficheros comprimidos de Knoppix. 3. El kernel empieza con todos los controladores internos (por ejemplo, IDE, SATA), descomprime el ramdisk inicial y empieza el script /linuxrc, que carga más controladores para SCSI, USB y Firewire. 4. linuxrc monta el CD/DVD y carga el módulo de dispositivo de bloques de descompresión transparente con /cdrom/KNOPPIX/KNOPPIX como fichero de entrada (posiblemente otros ficheros contengan más añadidos). 5. linuxrc mezcla el sistema de ficheros de sólo lectura con el ramdisk dinámico de lectura-escritura, así que ahora se puede modificar cualquier fichero en la sesión. 6. linuxrc finaliza, empieza init y ejecuta algunos scripts para investigar y hacer que todos los componentes hardware estén disponibles para el sistema (/etc/ init.d/knoppix-autoconfig). 7. La utilidad hwsetup basada en libkudzu carga los controladores correspondientes a cualquier hardware encontrado y genera un fichero de información de hardware que se usa por mkxf86config para crear el fichero de configuración del servidor X. 8. Empieza KDE.

40

Número 13

En las versiones previas de Knoppix había una separación estricta entre los datos de sólo lectura y los datos de lectura-escritura, y se usaban los enlaces simbólicos para ubicar los ficheros donde realmente deberían estar en sus directorios individuales. Este sistema funcionaba bien, aunque se Figura 1: Si no le gusta trabajar desde la línea de comandos, puede hizo complejo de grabar CDs con k3b. mantener a partir del momento en el que, para cada prounionfs después de instalar algún software grama que se le añadía a Knoppix, había nuevo o actualización de los ficheros de que averiguar qué ficheros se suponían configuración, lo que probablemente es que debían ser de lectura-escritura para causado por algún error en unionfs. copiarlos al ramdisk, dejando un enlace En el caso de updates-menus, podría simbólico en la zona de sólo lectura. eliminarse dicho comando usando la Desde ahora, unionfs se encarga de característica de unionfs de “borrar un copiar los datos modificados al directorio fichero desde el CD original de sólo lecramdisk y también permite borrar fichetura” con tan sólo realizar un ros en un disco de sólo lectura como un CD o un DVD, tan sólo se tienen que Copiar un CD o DVD de añadir los ficheros al sistema tal y como Datos para grabar se haría con una instalación normal en el disco duro. Copiar un CD de datos o un DVD en un Por ello, en teoría, para instalar un fichero ISO para grabarlo más tarde es fácil: paquete Debian nuevo desde los repositorios de Debian listados en cp /dev/cdrom U /etc/apt/sources.list, tan sólo hay que /mnt/hda2/copy-of-cd.iso ejecutar (como root): Para obtener una copia de un CD de apt-get update apt-get install pingus

De hecho, esto funcionaría en la mayoría de las versiones de Knoppix sin mayores problemas. Sin embargo, unionfs está en una primera etapa de desarrollo, y mientras las operaciones básicas de ficheros, como la creación, el copiado, el renombrado y el borrado funcionan bien en un sistema mixto, hay algunos errores conocidos, y se dan algunos problemas, cuando se sobrescriben o bloquean ficheros, lo cual, desafortunadamnete, se realiza muy a menudo por programas como updatemenus que se ejecutan automáticamente después de instalarlos. Por ello, no es de extrañar ver en la salida del comando dmesg algunos puntos relacionados con

WWW.LINUX-MAGAZINE.ES

audio no protegido, haría lo siguiente. Por supuesto, sólo debe decidir si es consistente con la aplicación de las leyes de copyright del país donde se encuentre: cd /mnt/hda2 cdrdao read-cd --device U /dev/hdc --driver U generic-mmc-raw --eject U my-cd.toc Puede grabar el CD más tarde con: cdrdao write --device U /dev/hdc --driver U generic-mmc-raw --eject U my-cd.toc Por supuesto, los usuarios del entorno gráfico pueden usar el k3b para este propósito (que llamará a cdrecord/frowisofs). Debe encontrar los botones correctos y pulsarlos.


Knoppix • PRÁCTICO

Figura 2: Knoppix 4 le permite al usuario crear una imagen persistente.

sudo rm -f U /usr/bin/update-menus

que tendrá el efecto lateral (en este caso deseado) de no volver a actualizar más los menús KDE. Se pueden eliminar algunos errores pequeños (como la omisión de dar permisos de ejecución en Knoppix 4.0.1 a cdrecord) sin la necesidad de tener que grabar otro DVD con sólo modificar el sistema unificado con sudo chmod 755 U /usr/bin/cdrecord*

Incluso hace que nos olvidemos de que estamos trabajando sin un disco duro cuando estamos ejecutando el sistema desde el CD.

Para las descargas largas y lentas de programas y su posterior instalación, la característica de imagen persistente de Knoppix es adecuada. La característica de imagen persistente realiza lo mismo que hace el ramdisk, usando la imagen ext2 del disco duro en vez del ramdisk, y además crea una imagen persistente de los cambios hechos en el sistema de CD o DVD. Se puede crear esta imagen persistente, conteniendo todos los cambios del sistema, invocando mkimage-knoppix desde el menú Knoppix bajo Create persistent Knoppix image. Para el caso de una partición NTFS, como no se puede escribir directamente con los controladores del kernel de Linux, se proporciona una utilidad Windows denominada mkimage.exe dentro del directorio KNOPPIX

en la parte descomprimida del CD o DVD. Una vez que ha sido creada dicha imagen, tiene un tamaño constante (como un disco virtual). Así que no debería hacerse muy pequeña. El tamaño ideal depende de cuanto se desee instalar o salvar a la parte de escritura de la imagen. Si se configura una impresora, se instalan uno o dos programas pequeños y se ejecuta OpenOffice una vez, se necesitarán al menos 100MB o más. Una vez que se ha creado una imagen persistente en el disco duro (o en la unidad de memoria USB portátil), la imagen es superpuesta a la de sólo lectura del DVD o CD en el próximo arranque del sistema, si se acepta la opción de arranque para usar la imagen. Todo lo que se cambie o salve es automáticamente conservado dentro de ella aunque se resetee. Una cosa muy importante que hay que recordar acerca de este procedimiento es que la imagen debe desmontarse. En otras palabras, se requiere un apagado normal para asegurarse de que los datos de la ramcache de Linux se escriban realmente. En caso de emergencia, el comando sync sería suficiente si se necesita hacer un reseteo rápido usando un botón del ordenador. Aunque esta solución alternativa debería ser una excepción.

Tostando CDs y DVDs con Knoppix La grabación de un CD puede ser difícil si sólo se tiene una unidad de CD o DVD que ya la está utilizando Knoppix. Sin embargo, se puede intentar liberar la unidad copiando el conte-


PRÁCTICO • Knoppix

nido del CD o DVD de Knoppix al disco duro y cargando el kernel y initrd desde la unidad de DVD, mientras que se ejecuta el resto desde la copia en el disco duro. Para esta forma de arranque no está soportada la escritura en las particiones NTFS. Sin

embargo, usando una partición FAT32 o ext2, se puede realizar tecleando (para la segunda partición en el primer disco de la controladora IDE) en el prompt de arranque: knoppix tohd=/dev/hda2 dma

Este comando le indica a Knoppix que copie todos los ficheros requeridos a la partición del disco duro y que se ejecute desde allí. En la siguiente sesión hay que usar: knoppix fromhd=/dev/hda2 dma

Problemas con el proceso de arranque de Knoppix Ahora, que todos sabemos que el disco duro es malvado, incompatible y está mal diseñado, nada funciona como debería. La RAM tampoco va bien, está desfasada, interrumpe la ejecución y el esquema de direccionamiento de E/S prehistórico aún está vivito y coleando en el siglo 21. ¿Qué podemos hacer si el kernel de Linux se encuentra con hardware defectuoso o con el firmware mal configurado? Por ejemplo, ¿qué pasaría si el sistema posee una versión de la BIOS que viene con un defecto que se soluciona con un controlador de la placa base que sólo está disponible para un determinado sistema operativo? Afortunadamente, el kernel de Linux ya contiene diversas soluciones automáticas para el software de la BIOS y el hardware defectuoso (recuérdese el error de la primera CPU Pentium que proporcionaba resultados erróneos en ciertas operaciones aritméticas), así que en la mayoría de los casos, Linux imprimirá un mensaje de aviso sobre la activación de la solución correspondiente y continúa. Esto no es posible en todos los casos, a veces todo parece que va a ser detectado, pero por ejemplo, la tarjeta de red no funciona, o el dispositivo USB no se reconoce, o incluso peor, si los dispositivos PCMCIA cuelgan el sistema completo tras inicializarse. Los siguientes comandos de arranque funcionan con la mayoría de las BIOS: knoppix nosmp acpi=off U noapic pnpbios=off pci=bios Las opciones de la línea de comandos tienen los siguientes efectos: • nosmp – apaga el soporte de la placa base de hiperthreading y multiprocesador (algunas placas no tienen realmente un segundo procesador, pero piensan que lo tienen y producen errores). • acpi=off – desconecta la configuración automática y las funciones de gestión de energía de las nuevas placas. Algunas de las placas simplemente poseen una implementación defectuosa de la ACPI de la BIOS o necesitan

42

Número 13

una configuración especial para funcionar correctamente. Por otro lado,otras placas requieren acpi=force porque no funcionan correctamente si no está activado el soporte ACPI. • noapic – Si algunos componentes hardware son detectados correctamente pero no responden, hay que intentar lo siguiente. Desactivar el chip de la placa base que se encarga de “hacer parecer que se tienen más interrupciones de las que realmente hay, para evitar los conflictos de hardware”. En realidad, esta característica no es tan mala o esencial como parece ser, lo que ocurre es que simplemente no funciona en algunas placas. Si la mayoría de las tarjetas PCI que se tienen pueden funcionar con el soporte de interrupciones compartido, no se necesitará APIC. No hay que confundir APIC con ACPI. No es lo mismo. Ambas pueden estar defectuosas, independientemente una de la otra. Si se tienen dudas, desactívense las dos. Como con acpi=off, hay placas que, por una razón desconocida, no funcionan con noapic. • pnpbios=off – apaga el sistema “Plug and Play” automático de las tarjetas ISA. Bueno, a veces esto ayuda si la placa piensa que es una buena idea reservar unas cuantas interrupciones para dispositivos inexistentes o reclamar interrupciones que deberían estar en los componentes de la placa (PCIbus). • pci=bios – dejemos que la BIOS use la configuración especificada por el usuario (como las interrupciones) para cada dispositivo; no intente leer la configuración de las interrupciones directamente del dispositivo específico. Esto funciona mejor para los ordenadores antiguos; es como utilizar lo que la BIOS mejor conoce sobre la configuración del hardware. Hay más opciones para la línea de comandos de arranque. Algunas son conmutadas directamente por el kernel de Linux y otras son utilizadas por los scripts de configuración hardware de

WWW.LINUX-MAGAZINE.ES

Knoppix. Por ejemplo, si una tarjeta gráfica es identificada incorrectamente como una controladora SCSI (si, he visto esto…) provocando que el sistema se cuelgue cuando el controlador SCSI correspondiente se cargue en Knoppix, y se es consciente de que no se dispone de la controladora SCSI en el equipo, hay que intentar lo siguiente knoppix noscsi También habría que cambiar la resolución de la pantalla si el sistema (como es el caso para la mayoría de los portátiles) no soporta la autodetección DDC de los modos de resolución favoritos. El siguiente comando funcionaría para una pantalla TFT de 75Hz 1280x1024: knoppix screen=1280x1024 U vsync=75 hsync=90 Nótese que la resolución “text” es siempre de 1024x768 en Knoppix, a menos que se añada la opción vga=normal o simplemente la opción vga=<número de modo> de las tablas mostradas en /usr/ src/linux/Documentation/fb/vesafb.txt. Si se va a usar un cañón de proyección para una presentación y (¿mencioné que el hardware era malvado?) el puerto de video del portátil no funciona, hay que intentar la opción de Knoppix framebuffer-only: fb1024x768 Hay que tener en cuenta que este comando de arranque se teclea SIN el prefijo knoppix que se ha usado en los ejemplos anteriores, porque REEMPLAZA las opciones de la línea por defecto. Para algunos portátiles, hay que activar manualmente el puerto de video con algunas combinaciones de teclas, pero si se está el modo framebuffer, una vez que se consiga que el proyector muestre el modo texto, X/KDE funcionará correctamente también. Si se está interesado en investigar más opciones que se han incorporado en la autoconfiguración de Knoppix que son necesarias en casos especiales, véase el fichero KNOPPIX/knoppix-cheatcodes.txt del CD del Knoppix.


Knoppix • PRÁCTICO

para reutilizar la copia previa de Knoppix en vez de realizar la copia de nuevo. La opción dma acelera el acceso al disco duro en un factor de cinco en la mayoría de las placas madre. Si se tiene una placa que no soporta DMA, no se puede usar esta opción, ya que corrompería los datos. (La posibilidad de la corrupción de datos es la razón por la que esta opción no está activa por defecto, aunque muy pocas placas presenten este problema). También se puede arrancar Knoppix sin ningún disco desde la red. Con tan sólo ejecutar knoppix terminalserver en uno de los ordenadores de la LAN y arrancar otro sistema vía PXE, o a través de un disco de arranque de red que se puede obtener de www.rom-o-matic.net para su tarjeta de red. Para Knoppix 4.0.1, hay que arreglar el script knoppixterminalserver con un parche disponible en los mirrors de DVD. Ahora que la grabadora de CD o DVD está libre se puede utilizar para grabar CDs o DVDs. (Véase el cuadro titulado “Permisos para cdrecord”). Se puede grabar cualquier directorio que aparezca en Konqueror pulsando el botón derecho del ratón sobre el icono del directorio y seleccionando burn data CD with k3b. Los usuarios profesionales que prefieran la línea de comandos podrían querer usar el siguiente comando con el objeto de crear un DVD Knoppix arrancable desde una copia modificada del disco duro: growisofs -dvd-compat -Z U /dev/hdc -no-emul-boot U -boot-load-size 4 U -boot-info-table -b U boot/isolinux/isolinux.bin -c U boot/isolinux/boot.cat -l -r U -J /mnt/hda2/copy-of-U knoppix-dvd-content

El comando anterior supone que se tiene una partición con permisos de escritura /mnt/hda2 que contiene una copia del DVD de Knoppix (los ficheros, no la imagen ISO) en el directorio “copy-of-knoppix-dvd-content”.

Escribiendo en Particiones NTFS Como ya habrá leído, el soporte de las particiones NTFS está limitado debido a las patentes, problemas de licencias y a

la falta de especificaciones técnicas del vendedor. El soporte de lectura existente de código abierto para NTFS del kernel, creado a partir de un trabajo intenso de ingeniería inversa, funciona bastante bien y es bueno para las tareas de rescate, como la copia de datos desde un sistema no arrancable a un lugar seguro. Figura 3: Uso de la herramienta ntfsmount para montar una parLa única operación tición NTFS en Knoppix. de escritura que soporta el kernel en este momento es la sobrescritura de 1. Cargar el módulo “Filesystem in ficheros sin cambiar su tamaño. (Esta Userspace”: sudo modprobe fuse opción es usada por Knoppix para las 2. Hacer la partición NTFS accesible imágenes persistentes, como se describió para los usuarios sin privilegios (en el anteriormente en el artículo). caso de nuestro ejemplo, partición priPero recientemente, la biblioteca Open mera del disco duro esclavo conectado a Source linux-ntfs (no el controlador del la controladora IDE 2 /dev/hdd1): sudo kernel) ha avanzado para permitir operachmod 666 /dev/hdd1 ciones limitadas de escritura en una par3. Crear un punto de montaje en el tición NTFS. Usando la imagen actual directorio home del usuario: mkdir CVS de libntfs, ahora se puede: $HOME/ntfs • borrar ficheros y directorios 4. Montar la partición de lectura/escri• crear hasta 9 ficheros nuevos o tura en $HOME/ntfs. ntfsmount $HOME/ subdirectorios dentro de un ntfs -odev=/dev/ directorio hdd1,force,umask=000. Ahora se debeEstas opciones son suficientes para ría ser capaz de acceder al contenido de muchas de las tareas que antes no se la partición en $HOME/ntfs, pero no hay podían hacer. que olvidar el siguiente paso. Como es muy complicado recompilar 5. Con un “umount” normal es probacada programa para que soporte libntfs para ble que no se tenga éxito con FUSE, hay las operaciones de escritura (recuérdese, el que usar el siguiente comando experimódulo del kernel está a medio año de mental para terminar: fusermount -u libntfs), se pueden usar el módulo del ker$HOME/ntfs nel FUSE y una utilidad denominada ntfsDespués del paso 4, debería también mount para montar una partición NTFS. ser capaz de acceder y navegar por la Lo siguiente es un pequeño HOWTO partición NTFS desde KDE con konquedesde el DVD actual de Knoppix, que ror $HOME/ntfs. Hay que tener cuidado explica cómo usar FUSE y libntfs para de no montar la misma partición dos montar particiones NTFS de lectura/ veces, una con el módulo del kernel y escritura, de modo que pueda borrar o otra con ntfs-mount; ya que el kernel se añadir ficheros con las limitaciones menconfundiría. cionadas anteriormente. Véase KNOPConclusión PIX/linux-ntfs/FOR-DEVELOPERS.txt del En este artículo, se ha descrito cómo insCD o DVD de Knoppix para ello. Por talar un programa, liberar la unidad de favor, téngase en cuenta que aún es una CD-ROM y escribir en particiones NTFS característica experimental, así que hay en Knoppix. Espero que estas técnicas le que asegurarse de que se dispone de una proporcionen un mundo de nuevas posicopia de seguridad de todos aquellos bilidades usando Knoppix en situaciones datos que sean importantes antes de rea■ prácticas. lizar el intento:

WWW.LINUX-MAGAZINE.ES

Número 13

43


PRÁCTICO • XSA Attack

Para los Ataques de Autenticación Multiplataformas

UN PEZ LLAMADO PHISHING Un nuevo ataque de phishing se basa en colocar una etiqueta HTML en un servicio vulnerable para capturar los datos de autenticación de los usuarios. POR JOACHIM BREITNER

C

on toda seguridad, las noticias sobre phishing les serán familiares a la mayoría de los lectores. Suelen provenir de un banco o de eBay, y aparecen como una página modificada en la que se solicitan las credenciales del usuario. Un ataque por phishing suele aprovecharse de trucos para espiar las credenciales de los usuarios. Otro método, conocido como “cross-site scripting” (XSS), coloca código activo en páginas vulnerables. El navegador web del usuario ejecuta el código sin sospechar y envía sus datos de credenciales al atacante.

¿Cerrando las escotillas?

que se considera inofensivo, normalmente se acepta. Muchas aplicaciones web permiten la inclusión de imágenes por medio de la etiqueta <img> siendo ésta la debilidad que un atacante puede aprovechar para llevar a cabo un ataque de autenticación multiplataforma (XSA). Los atacantes simplemente necesitan controlar un servidor donde almacenan la imagen y algo de código adicional. Entonces inyectan la etiqueta HTML, supuestamente inofensiva dentro del servicio vulnerable. <img src=“http://atacante/imagen.png”> (Figura 1). En realidad, la imagen se almacena en un área HTTP-AUTH protegida del servidor (Listado 1). El servidor solicita un nombre de usuario y una contraseña al navegador antes de servir el fichero. El servidor puede, opcionalmente, mostrar

una descripción, que el navegador muestra al usuario. Normalmente el servidor comparará las credenciales en texto plano enviadas a él con las entradas que tiene en su base de datos de usuarios. En el caso de una ataque XSA, el servidor almacena las credenciales y permite el acceso al usuario para evitar cualquier sospecha. Esto se puede hacer fácilmente con unas cuantas líneas de código Perl y el módulo mod_perl de Apache (Listado 2). Es casi imposible que el usuario se percate de ello. De hecho, él tan sólo ve la aplicación web en su barra de direcciones, y dependiendo del navegador y de la velocidad de conexión, posiblemente, parte del sitio web que está actualmente cargando. Los usuarios tienen que mirar muy detenidamente para

Para impedir los XSS, muchas aplicaciones web eliminan todo el contenido activo de las entradas que posteriormente se presentarán a los usuarios. Esto incluye las entradas de los foros, descripciones de subastas o mensajes de correo electrónico. Aunque el código HTML puro,

Listado 1: .htaccess 01 AuthType Basic 02 AuthName "Server has been restarted; please log in again" 03 PerlAuthenHandler Apache::AuthLog 04 require valid-user 05 PerlSetVar Authlogfile Pfad/ xsa-test/auth.log

44

Número 13

Figura 1: Pasos del ataque XSA: normalmente el usuario no se da cuenta de que el navegador está hablando con varios servidores. XSA se aprovecha de esto y pregunta al usuario que se autentique para acceder a una imagen almacenada en una dirección externa. A continuación, el nombre de usuario y la contraseña se enviarán al servidor del hacker.

WWW.LINUX-MAGAZINE.ES


XSA Attack • PRÁCTICO

darse cuenta de que la contraseña solicitada no pertenece a la página actual. La ventana de entrada no está manipulada, ya que es un componente del navegador y por ello coincide con el aspecto general del sistema.

web, el cuadro de diálogo del navegador debería indicar al usuario un mensaje como, “¡Aviso! Actualmente está viendo my.webmail.co.uk. Un elemento peligroso almacenado en hacker-malintencionado.co.uk le está pidiendo que Figura 2: Al contrario que Internet Explorer, Mozilla y otros navese autentique. Introduzca sus Contramedidas gadores de código abierto muestran al menos el nombre de dominio credenciales sólo si confía en Una aplicación web robusta en el texto del cuadro de diálogo, pero si se tiene prisa, probablehackercapaz de resistir un ataque mente no se vea el nombre del dominio al final de la descripción. malintencionado.co.uk”. XSA no permitirá hacer refeAlternativamente, el navegarencias a imágenes externas. Si no se pequeñas como los foros web privados. dor podría ignorar la solicitud de autentitiene esa opción, otra solución es la reesTiene más sentido modificar el navegacación, aunque esto podría significar la critura de los enlaces a las imágenes dor web. Los navegadores web actuales pérdida de una funcionalidad útil en externas, de modo que las solicitudes tienen diversas formas para indicarle al algunas circunstancias. vayan al propio servidor y que actúe usuario que está vagando por caminos ¡Desconfíe! como proxy. digitales inexplorados. Todos los navegaAmbas soluciones son problemáticas, dores muestran el nombre del servidor, Los ataques XSA proporcionan las creespecialmente para las aplicaciones además de la descripción, que la establedenciales del usuario al hacker. Las aplice el servidor y por ello es peligroso; sin caciones web pequeñas, como los foros Listado 2: Apache::AuthLog embargo, los navegaque se implementan dores son muy buenos sin una protección del 01 a la hora de ocultar lado servidor muy #/usr/local/share/perl/5.8.4/A esta información. compleja, son particupache/AuthLog.pm Internet Explorer es el larmente vulnerables. 02 package Apache::AuthLog; mayor culpable: el Esta clase de ataques 03 use Apache::Constants qw(:comnombre de dominio lo no están tan sólo resmon); oculta del título del tringidos a la web. Un 04 cuadro de diálogo. mensaje de correo elec05 sub handler { Mozilla (Figura 2) es trónico en formato 06 my $r = shift; Figura 3: Lo mejor de todo: el cuaalgo mejor que HTML cuidadosamente 07 my($res, $sent_pw) = dro de diálogo de fácil lectura de Internet Explorer, ya modificado podría pro$r->get_basic_auth_pw; Opera muestra el nombre del que muestra el nombre vocar que el usuario 08 return $res if $res != OK; dominio primero, forzando a los del dominio en la línea revelase sus credencia09 de descripción. Pero atacantes a llevar a los usuarios a les, dependiendo del 10 my $user = antes de que los usuaun servidor cuyo nombre de domicliente de correo. Es $r->connection->user; rios tengan tiempo de nio tiene un aspecto similar. bastante sencillo que 11 unless($user and $sent_pw) { leerlo, probablemente, los desarrolladores de 12 $r->note_basic_auth_failure; ya haya terminado de teclear y haya navegadores generen mensajes que aler13 $r->log_reason("Requires usertransmitido los datos personales. ten e impidan esta clase de ataques. Pero name hasta que todo el mundo tenga un nave14 and password", $r->filename); Los Mejores Navegadores gador con esta característica, su única 15 return AUTH_REQUIRED; Mi favorito es Opera (Figura 3). Primero protección es tener cuidado y no confiar 16 } muestra el nombre del servidor, facilitanen todo lo que se vea en la web. 17 do su lectura. Por ello, un atacante tenSi desea experimentar un ataque XSA 18 open LOG,'>>',$r->dir_condría que tener un servidor cuyo nombre en vivo, pruebe la página de demostrafig("Authlogfile"); se pareciese al nombre del servidor que ción de la página del autor en [1]. Pero 19 printf LOG "%s running %s:%s / está intentando suplantar, por ejemplo, no se le ocurra introducir ninguna con%s\n", my.webmai1.co.uk en vez de my.webtraseña de verdad: el fichero con los 20 $r->connection->remote_ip, mail.co.uk. valores almacenados es accesible públi21 $r->header_in('User-Agent'), ■ Para proporcionar mayor protección camente. 22 $user, $sent_pw; frente a los ataques XSA, los navegado23 close LOG; res deberían ser capaces de detectar los RECURSOS 24 ataques y avisar al usuario. Si un ele25 return OK; [1] Página demo XSA: http://people. mento HTTP inmerso le solicita al usua26 } debian.org/~nomeata/xsa-sample. rio que se autentique, a pesar de perte27 1; html necer a un dominio diferente del sitio

WWW.LINUX-MAGAZINE.ES

Número 13

45


PRÁCTICO • Ghost

Navegación anónima con Java Anonymous Proxy

NAVEGANTE FANTASMA Muchas páginas Web registran las direcciones IP y horas de acceso para identificar usuarios. Si no queremos ir ofreciendo información que acabará en algún estudio de mercado, Java Anonymous Proxy mantendrá nuestras incursiones en secreto. POR TOBIAS EGGENDORFER

S

alvo que seamos un VIP, nos será posible bajar a la panadería de nuestro barrio a por una barra de pan sin tener que revelar datos personales. Nadie tratará de registrar la manera en que nos movemos o intentará descubrir patrones en nuestro comportamiento. En el día a día, el anonimato es la regla. Por contra, Internet permite registrar sin ningún problema el tráfico de los visitantes a una página Web. Esta recolección continua de datos permite la identificación certera del visitante. Es tan sencillo como una corta llamada a nuestro proveedor, que accederá a nuestros datos con un simple whois. Los gobiernos han establecido leyes para evitar la apropiación más extrema de

46

Número 13

datos personales, pero los usuarios de fisgones puedan rastrear al usuario a traInternet con direcciones IP estáticas puevés de la Web. den ser fácilmente identificados en las Los usuarios utilizarán toda una gama páginas Web con una sencilla consulta de técnicas para navegar en Internet sin whois. ser detectados (véase el cuadro Para proteger nuestra intimidad, tendremos que recurrir a artillería pesada bajo la forma de un servicio de anonimato. Éste le permite al usuario navegar por la Web de manera anónima. El servicio oculta la verdadera Figura 1: El mensaje se encripta de manera separada para cada dirección IP del usuamezcla, como una carta en varios sobres, y continúa a través de la rio, evitando que los cascada de mezclas para mejorar el anonimato.

WWW.LINUX-MAGAZINE.ES


Ghost • PRÁCTICO

mezclador sólo mezclado, evitando poder sacar conclusiopuede abrir un nes acerca del orden de los paquetes. sobre (véase Si alguna vez hemos dejado nuestro Figura 1). correo a cargo del vecino en vacaciones, Este diseño proes muy probable que a nuestro regreso porciona una venhayamos tenido que escuchar algo como taja adicional: “¡Menudo paquete te enviaron la semana como los mensajes pasada!”, justo antes de escuchar alguna salientes siempre ristra de especulaciones al respecto de su parecen distintos a contenido. JAP elimina este tipo de espelos entrantes, no culaciones troceando los datos en fraghay manera de mentos de 998 bytes y rellenando los mapear los paquepedazos menores con datos aleatorios. tes entrantes con Al igual que PGP o SSL, JAP confía en los salientes. una combinación de encriptación simétriIncluso si un ataca y asimétrica para las comunicaciones cante fuese capaz entre los mezcladores y el proxy local. de colocar un snifJAP encripta los mensajes a los mezcladoFigura 2: El proxy es sencillo de configurar en el lado del navegador. fer en un mezclares con claves simétricas aleatorias de Podemos reconfigurar el puerto por defecto al 4001 con JAP. dor o capturar una sesión. En un primer momento, la clave mezcla por el simétrica se encripta asimétricamente “Navegación Confidencial”). Una de las camino, no podría hacer nada con esos usando la clave pública del mezclador. herramientas de privacidad más populadatos. Como muchos usuarios que enruInstalación res es Java Anonymous Proxy (JAP) [1], tan sus datos a través de cada cascada, un proxy portable que ofrece servicio de cada una de ellas contendrá un cocktail de A pesar de su aparente complejidad, JAP anonimato para Linux. JAP encripta paquetes de cada usuario perfectamente es fácil de instalar y usar. Sólo tenemos todas las peticiones y las envía a un Transmisión JAP mezclador, un sistema intermedio en Internet que mezcla los datos del usuario HTTP. El último mezclador de la cascada El intercambio de datos entre JAP y el procedente de varias fuentes. Los datos identifica un proxy adecuado basándose mezclador, o entre los mezcladores en la van rebotando a través de varios mezclaen el tipo de dato. cadena, usa un formato estándar. Cada dores antes de alcanzar un proxy que paquete tiene un tamaño de 998 bytes, y La parte asimétrica es la más interesanenvía la petición al servidor Web. En este las cabeceras se usan para especificar te. Los primeros 16 bytes contienen la artículo vamos a describir cómo podeinformación importante. clave de 128 bits usada para la encripmos navegar de manera anónima gracias tación simétrica en cada mezclador. El canal de 32 bits ID es el fragmento de a JAP. Para permitir que el siguiente mezclainformación más importante. La ID asig-

Entender JAP El principio en el cual se basa JAP es simple: los datos pasan desde el cliente Web a través de una cadena de mezcladores antes de llegar a un servidor proxy. En cada paso, los datos se mezclan con datos de otros usuarios. Los paquetes se encriptan también en cada etapa. El proxy encripta el mensaje de manera que el último mezclador pueda desencriptarlo. El último mezclador toma el texto cifrado y lo encripta para permitir que el penúltimo mezclador pueda leerlo. Los resultados son vueltos a encriptar para la antepenúltima mezcla, etc. Si un mezclador de la cadena desencripta un mensaje que le han enviado, sólo podrá ver el texto cifrado para el siguiente mezclador. Como cada mezclador usa claves distintas, se asegura un alto nivel de privacidad. Es como poner una carta en varios sobres opacos. Cada

na el paquete del mezclador a cada canal de mezcla. La ID del canal siempre ocupa los primeros 4 bytes de un paquete de mezcla. A esto le siguen 2 bytes, de los que 5 bits se usan como flags. Los flags describen la preparación del paquete de datos. Los restantes 11 bits se reservan para futuras extensiones. El canal ID identifica de manera única el enlace entre JAP y el mezclador, o entre dos mezcladores.

dor sepa su clave, todos los datos del paquete están desplazados hacia la izquierda 16 bytes, y el paquete de datos se rellena con 16 bytes aleatorios para llegar al tamaño estándar. El mezclador vuelve a encriptar los primeros 128 bytes con la siguiente clave de mezcla. Si el flag open no está activo, el intercambio de claves no tiene lugar. Esto incrementa el tamaño de la zona de datos del paquete.

El flag open (bit 45) se fija cuando se establece una conexión, para especificar un nueva ID de canal aleatoria. El nuevo canal confía en una clave simétrica. La versión asimétrica encriptada con RSA de ésta se guarda en los primeros 128 bytes del paquete de datos. El resto del paquete se encripta simétricamente usando AES.

Los mezcladores fijan el flag close en la cabecera para cerrar una conexión y rellenar el componente de datos con 992 bytes aleatorios. Cada vez que un mezclador recibe un paquete de este tipo, descarta la ID de canal y la clave simétrica asociada. El paquete indica también a JAP que se han trasmitido todos los datos y cierra la conexión TCP con el navegador. Para evitar ataques por deducción del tipo de paquete por el tipo de cabecera, los mezcladores también encriptan las cabeceras.

La parte de datos tiene una cabecera de 3 bytes que especifica la longitud exacta (2 bytes) y el tipo de datos de usuario (1 byte). Este tipo de datos puede ser FTP o

WWW.LINUX-MAGAZINE.ES

Número 13

47


PRÁCTICO • Ghost

que descargar la versión de JAP que coincida con nuestra versión de Java desde [1]. Para descubrir nuestra versión de Java podemos teclear: java -version

A continuación ejecutamos JAP con el siguiente comando: java -jar JAP.jar &

Este comando debería funcionar sin pro-

blemas, dando por supuesto que tenemos una interfaz gráfica de usuario así como la variable DISPLAY configurada apropiadamente. Todo lo que resta por hacer es modificar la configuración del proxy (véase la Figura 2). Por defecto, JAP se pone a la escucha en el puerto 4001 y sólo acepta peticiones desde localhost. Si tenemos pensado instalar un único JAP en nuestra red local, tendremos que activar Forwarder para permitir el acceso a otras máquinas.

Navegación Confidencial Los servicios de anonimato como The Cloak [2], Guardster [3], o Anonymization.net [4] proporcionan una forma sencilla de anonimato. Cuando tecleamos en ellas una URL, el servicio de anonimato hace la petición al servidor Web en cuestión, usualmente analizando el HTML y reemplazando los enlaces de manera que también usen el servicio de anonimato. Por último, el servicio sirve la página requerida (véase Figura 3). El servicio de anonimato basado en Web tiene algunas desventajas, una de las cuales es el problema de la confianza. El usuario no sabe a qué servicio se está conectando o cómo de anónimo es en realidad. Además, puede ser imposible rescribir enlaces generados por Javascript, y esto ciertamente podría dañar la cobertura del usuario que navega. (Para contrarrestar esto, The Cloak tiene la opción de eliminar todo el Javascript contenido en las páginas que visitamos). Por últitmo, la ruta entre nuestro propio navegador y el servicio de anonimato no está encriptada, por lo que cualquier servidor, incluyendo los proxies de nuestro propio proveedor, podría registrar nuestra actividad con el navegador. Este problema ha provocado que muchos servicios de anonimato basados en Web ofrezcan servicios encriptados vía HTTPS, aunque algunos de estos pueden no ser gratuitos. Un proxy proporciona una solución elegante al problema del análisis de páginas

48

Número 13

HTML y reemplazo de enlaces. Esto implica configurar el navegador para que transmita cada una de las peticiones HTTP al proxy. El proxy se comunica entonces con el servidor objetivo. Desafortunadamente, un proxy convencional no nos ofrece nada en cuanto a anonimato. Por ejemplo, el proxy de AOL identifica a sus usuarios. Los llamados open proxies se ajustan mejor al objetivo del anonimato. Los open proxies son servidores proxy que todo el mundo puede utilizar. Incluso el Senado de Estados Unidos ha puesto en marcha un open proxy, aunque sin darse cuenta [5]. Para identificar a un navegante que esté usando un open proxy, en primer lugar tenemos que verificar los ficheros de log del proxy y luego contactar con el proveedor. Sin embargo, pocos servidores Web guardan este contenido en sus logs. (Nótese que algunos proxies revelan, de hecho, al usuario en cuestión al añadir una cabecera HTTP que contiene la dirección IP de la maquina que hace la petición). Un open proxy no resuelve el problema del tráfico no encriptado. Si un atacante puede interceptar la comunicación entre el proxy y el usuario, este usuario deja de ser anónimo en ese mismo momento.

Elección de Cascada El resto de la configuración, a la que podemos acceder a través de los botones Settings o Details, se explica por sí misma. La única cuestión con la que pueden encontrarse los principiantes de JAP es la elección de las mejores cascadas disponibles. La cascada definirá nuestro grado de anonimato: cuantos más usuarios pueblen una cascada, y mayor sea la mezcla de paquetes, más complicado será que alguien que husmee pueda identificar algún comportamiento individual. Por otro lado, cuanto más usuarios estén accediendo al servicio, más lento será su acceso a Internet. JAP distribuye esta información a través de un servicio propio, que ofrece una lista de cascadas de mezcladores disponibles y su rendimiento. Por razones de seguridad, el cliente JAP verifica si la lista está validada correctamente. Esta precaución previene de que un posible atacante inserte una cascada fraudulenta.

Conclusiones Java Anonymous Proxy (JAP) es un proxy de anonimato portable para Linux. Teniendo en cuenta la compleja tecnología en la que está basada, JAP es muy sencillo de instalar y utilizar. Una vez tengamos instalado JAP en nuestro sistema, podemos probar nuestra configuración usando el servicio de prueba proporciona■ do en [8].

RECURSOS [1] Java Anonymous Proxy (JAP):http:// anon.inf.tu-dresden.de/index_en. html [2] The Cloak: http://www.the-cloak.com [3] Guardster: http://www.guardster.com [4] Anonymization.net: http://www. anonymization.net [5] Proxy del senado USA: http://online. securityfocus.com/news/1780 [6] JAP y prevención del crimen: http:// anon.inf.tu-dresden.de/ strafverfolgung/index_en.html [7] JAP en línea de comandos: http:// anon.inf.tu-dresden.de/develop/ commandline_jap_en.html

Figura 3: Un servicio de anonimato basado en Web separa al usuario del servidor Web, pero el servidor de anonimato intermedio podría dejar traza de la información del usuario.

WWW.LINUX-MAGAZINE.ES

[8] Test de anonimato: http://anon.inf. tu-dresden.de/anontest/test_en.html [9] Cookiecooker: http://cookie.inf. tu-dresden.de


Detección de Hardware • PRÁCTICO

Detección de Hardware PCI y USB basado en Bash

EL DESCUBRIMIENTO

Si se necesita una respuesta rápida sobre las tripas de un ordenador, podemos usar un script Bash para obtener un inventario del hardware de un sistema Linux. POR MIRKO DÖLLE

S

i uno está trabajando con una distribución distinta a las principales o si estamos compilando nuestro propio sistema Linux, ya sea un Linux embebido, un sistema de rescate o simplemente una distribución hágaselo-unomismo, tendremos que solucionar el problema de encontrar los módulos del kernel correctos para el hardware. Armado con algún conocimiento básico, se puede utilizar casi cualquier lenguaje de programación para crear un sistema útil para detectar el hardware PCI o USB. En este artículo se mostrará un método para obtener información sobre los dispositivos instalados en el sistema Linux con un script Bash. Haciendo uso de sysfs o de proc, se puede encontrar toda la información que se desee sobre el fabricante, el dispositivo y la clase de dispositivo con tan sólo preguntarle al kernel.

Las Interfaces del Kernel La detección de hardware es fácil si el kernel soporta sysfs. Al contrario que la inter-

faz proc, la interfaz sysfs no precisa de la invocación de aplicaciones externas o el procesado de ficheros binarios para la obtención del fabricante y de la ID del dispositivo. Es decir, proc proporciona la misma información, lo que significa que la detección del hardware funcionará igual de bien independientemente de la interfaz del kernel que se desee usar. sysfs utiliza un enlace simbólico con la ID PCI para cada dispositivo PCI bajo /sys/bus/pci/devices; el enlace apunta al dispositivo apropiado en el directorio /sys/devices/pci*. El acceso por /proc/bus/pci/devices es más sencillo, ya que es donde todos los dispositivos PCI residen para todos los buses PCI; por el contrario, /sys/devices posee un directorio separado con los dispositivos para cada bus PCI. El directorio de dispositivos contiene la información requerida para la detección del hardware: vendor proporciona la ID del fabricante en formato hexadecimal, device proporciona la ID del producto y class la clase del dispositivo

WWW.LINUX- MAGAZINE.ES

basado en [3]. El Listado 1 es un extracto del script Bash pcidetect, que podrá encontrar en la página web de Linux Magazine [1]. Las líneas desde la 11 a la 16 del Listado 1 analizan los ficheros requeridos para identificar el hardware de la estructura sysfs. Los pseudo-ficheros de dispositivos ordenados por la controladora PCI se listan bajo /proc/bus/pci. Cada fichero de dispositivo contiene un conjunto completo de datos en un formato compacto; sysfs presenta esta información individualmente. Las líneas de la 18 a la 20 del Listado 1 contienen la parte de detección del hardware PCI de [1] que identifica el fabricante hardware, las IDs de los productos y los códigos de las clases.

La Base de Datos PCI ID Con la idea de mostrar los nombres de los fabricantes y de los dispositivos en texto legible, el script de detección de hardware referencia a la base de datos PCI ID en [2], siguiendo la misma solución que

Número 13

49


PRÁCTICO • Detección de Hardware

adopta el kernel de Linux. La base de datos PCI es fácil de interpretar; el Listado 2 muestra la parte relevante del script de detección de hardware.

Listado 1: Evaluando PCI IDs 01 if [ -e /sys/bus/pci/devices]; then 02 PCIDevices=/sys/bus/pci/device s/* 03 Method="sysfs" 04 elif [ -e /proc/bus/pci ];then 05 PCIDevices=/proc/bus/pci/??/* 06 Method="proc" 07 fi 08 09 for device in $PCIDevices; do 10 if [ "$Method" = "sysfs" ];then 11 read Vendor < ${device}/vendor 12 Vendor=${Vendor:2:4} 13 read Device < ${device}/device 14 Device=${Device:2:4} 15 read Class < ${device}/class 16 Class=${Class:2:4} 17 elif [ "$Method" = "proc" ];then 18 Vendor=`hexdump -s 0 -n 2 -e '1/2 "%04x"' $device` 19 Device=`hexdump -s 2 -n 2 -e '1/2 "%04x"' $device` 20 Class=`hexdump -s 10 -n 2 -e '1/2 "%04x"' $device` 21 fi

Listado 2: Procesando la base de datos PCI ID 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

50

IFS="${Newline}" for z in `eval ${PCIIDCMD}`;do IFS="${Tab}" set -- $z case "$1" in v) if [ "$4" = "0" ]; then declare v${2}=$3 fi ;; d) declare d${2}=$3 ;; esac done

Número 13

La variable PCIIDCMD contiene el comando para interpretar la base de datos PCI ID, que es simplemente un cat del fichero o una llamada a wget. La estructura de la base de datos es sencilla; cada entrada para un fabricante o un dispositivo ocupa una línea con los campos separados por tabuladores. Para procesar una línea completa, la línea 1 del Listado 2 establece la variable de separación IFS a $‘\n’, además separa el bucle for al final de la línea. La línea 3 escribe un tabulador en la variable IFS para separar los campos y la línea 4 maneja la separación. La consulta en la línea 8, que averigua si la columna 4 contiene un cero, es por seguridad. Cualquiera puede escribir en la base de datos PCI y las nuevas entradas se identifican por un uno en la columna 4. El ID del fabricante, en las entradas de los fabricantes o en las combinadas de fabricante e ID de dispositivo, en las entradas de dispositivos, son almacenadas por las líneas 9 y 13 junto con la descripción.

Nombres de Variables Variables Para Bash, uno de los retos más importantes es el de almacenar en la base de datos PCI ID. Tanto el ID del fabricante como el del dispositivo son enteros de 16 bits,

Listado 3: Identificar los Módulos del Kernel 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18

IFS="${Newline}" for z in `cat $PCIMAP`; do IFS=" " set -- $z if [ "$2" = "0xffffffff" -a "$3" = "0xffffffff" ]; then id="c${6:4:4}" elif [ "$3" = "0xffffffff"]; then id="m${2:6}" else id="m${2:6}${3:6}" fi

if [ -z "${!id}" ]; then declare ${id}="$1" else declare ${id}="${!id}${Tab}${1}" 19 fi 20 done

WWW.LINUX- MAGAZINE.ES

pero Bash sólo soporta índices de 16 bits para los arrays, arrays unidimensionales. No hay soporte para las tablas hash. La solución para este problema se encuentra en los nombres variables de las variables. Como se muestra en las líneas 9 y 13, los nombres se pueden asignar como sigue: declare prefix${name}=$value

Para las entradas del fabricante, las variables reciben el prefijo v de “fabricante”, seguido por el ID del fabricante como un número de cuatro dígitos hexadecimal; las entradas para los dispositivos empiezan por d, seguido por el ID del fabricante y del dispositivo. Esta solución proporciona una ventaja sobre las soluciones basadas en grepen en las que tan sólo hay que analizar la base de datos PCI ID una vez para cada dispositivo. Por el lado negativo, el requerimiento de memoria es enorme, del orden de 8 a 9 Mbytes; además, el ordenador puede tardar un minuto en ejecutar el script. Hay diversas formas de optimizar la demanda de recursos.

Identificación de Módulos Usando una solución similar a la que se ha usado con la base de datos PCI ID, ahora se debe procesar el fichero modules.pcimap para el kernel actual. El fichero contiene una lista de todos los módulos del kernel y de los dispositivos que soporta en la forma de ID de fabricante y de dispositivo y el código de clase para los controladores genéricos como son los controladores de sonido o Firewire. El Listado 3 muestra el segmento de código que procesa modules.pcimap y almacena los resultados en nombres de variables variables, tal como se hizo con la base de datos PCI ID.

Listado 4: Análisis del System.map 01 02 03 04 05 06 07 08 09 10 11 12

IFS="${Newline}" for z in `cat $SYSTEMMAP`; do IFS="${Tab} " set -- $z if [ "${3:0:12}" = "__ devicestr_" ]; then IFS="_" set -- $3 declare k${4}=1 fi done


Detección de Hardware • PRÁCTICO

La funcionalidad proporcionada cada clase de dispositivo; el resto por el Listado 3 es la misma que la del Listado 5 no tiene nada de espefuncionalidad proporcionada por el cial, ya que simplemente usa los Listado 2, con la excepción de que nombres de variables variables para los ficheros de datos individuales referenciar las variables con los están separados por blancos en vez módulos del kernel o las descripciode por tabuladores. La evaluación del nes de los dispositivos y les muestra código de la clase en la línea 6 del el resultado. La línea 10 podría Listado 3, si la ID del fabricante y del parecer algo más compleja a simple dispositivo tienen un valor de -1, es vista; aquí es donde el script comotra función especial del script. La prueba si hay una entrada para el línea 8 proporciona una solución resdispositivo en los módulos regulaponsable para manejar los controlares del kernel, en los módulos espedores genéricos. cíficos del fabricante o en las clases La consulta de la línea 14 contiene de dispositivos. una construcción que rara vez se ve, USB y Firewire ${!id}. Esta construcción es el valor de retorno para la variable con el Figura 1: La detección automática de hardware no es La detección de hardware para los nombre de la variable, si las llaves algo reservado para los gurús. El kernel proporciona dispositivos USB no requiere mayovan seguidas por un signo de exclatoda la información de los dispositivos que necesita res cambios con respecto al script mación, Bash interpreta cualquier y un pequeño script manejará el proceso. Los detaPCI. A excepción de la posible carácter siguiente como valores lles del fabricante y la información del dispositivo mayor complejidad del formato del variables que deben usarse como el están disponible en la base de datos PCI ID. listado USB ID, que hace que la valor de la variable para la expresión separación sea más compleja, el entera. Si se almacena el valor 3c59x en En las líneas 1 a 6 del Listado 5, los script de detección USB de [1] simplela variable id, ${!id} devuelve el contenombres de las variables se concatenan mente analiza los diferentes pseudofinido de la variable 3c59x; dicho de otro para identificar las ID del fabricante y cheros /sys y /proc. Incluso la detecmodo, ${!id} se escribe como de los dispositivos, los módulos requeción del hardware Firewire sigue el ${3c59cx}. ridos, módulos genéricos, los soportamismo patrón, aunque este artículo no dos por el kernel y los módulos para ofrece un script específicamente diseDentro del Kernel ñado para la detección de hardware Listado 5: Salida Para descubrir qué dispositivo PCI carece Firewire. de controlador, el script de detección de Un listado simple de los dispositivos 01 v="v${Vendor}" hardware necesita descubrir qué controlasoportados y sus módulos del kernel es 02 d="d${Vendor}${Device}" dores han sido compilados con el kernel. el primer paso para obtener un mayor 03 m="m${Vendor}${Device}" Para ello, el script usa el fichero entendimiento de un router o de un sis04 g="m${Vendor}" System.map: cada controlador añade un tema Linux embebido. Con tan sólo unos 05 k="k${Vendor}${Device}" símbolo al kernel basado en el siguiente pequeños cambios, tales como reempla06 c="c${Class}" patrón: zar las referencias a las bases de datos 07 PCI ID y USB ID y la invocación automá08 echo "Proveedor: __devicestr_vendor-/device-id tica de modprobe, en vez de sacar los ${!v}${Tab}[0x${Vendor}]" módulos del kernel, el script de detec09 echo "Dispositivo: El Listado 4 muestra el segmento de ción de hardware podría fácilmente ser ${!d}${Tab}[0x${Device}]" código que analiza el fichero usado como script de comienzo para la 10 if [ -n "${!m}" -o -n "${!g}" System.map y almacena los resultados carga de los módulos del kernel requeri-o -n "${!c}" ]; then ■ en variables con nombres variables. La dos para arrancar el sistema. 11 set -- ${!m} ${!g} ${!c} única gran diferencia entre los Listados 2 12 if [ "$#" -gt "1" ]; then RECURSOS y 3 está en que las entradas simbólicas 13 echo "Módulos Kernel: $*" del listado 4 están separadas por _ y se 14 else [1] Scripts de detección de hardware almacena un 1 por cada dispositivo 15 echo "Mçodulo Kernel: $1" para PCI y USB: http://www. soportado. 16 fi linux-magazine.es/Magazine/ Ahora que ya se tienen almacenados el Downloads/13 17 elif [ -n "${!k}" ]; then ID del fabricante y del dispositivo, los 18 echo "Soportado por kernel" [2] Base de Datos PCI ID: http://pciids.sf. módulos del kernel y sus responsabilida19 else net/pci.db des y los dispositivos con soporte directo 20 echo "No suportado" [3] Ficheros cabecera PCI con las definidel kernel, todo lo que se necesita hacer 21 fi ciones del vendedor, dispositivos y es proporcionarle los resultados al usua22 echo clases: http://www.pcidatabase.com/ rio (Figura 1) en el Listado 5 (que es una pci_c_header.php 23 done continuación del Listado 1).

WWW.LINUX- MAGAZINE.ES

Número 13

51


DESARROLLO • Perl

Seguir las news de perlmonks.com con un plug-in para Gaim

EN BUSCA DE LA SABIDURÍA El proyecto Gaim proporciona un cliente de mensajería instantánea que soporta un gran número de protocolos. En este artículo veremos cómo ampliar Gaim con plug-ins en Perl. POR MICHAEL SCHILLI

A

quellos que visiten por primera vez perlmonks.com se frotarán los ojos al comprobar cómo hackers de primera línea en Perl se prestan a contestar hasta la duda más tonta de algún novato. La razón de esto es que la comunidad asigna puntos XP (de experiencia) a las mejores respuestas. Cuantos más XP tengamos más alto nos clasificaremos en el ranking, desde el nivel novato, pasando por monje y llegando poco a poco al status de experto.

El Primero de la Clase Debido a la dinámica de perlmonks.com, la primera persona que acierta a responder adecuadamente una pregunta consigue más XP. En lugar de estar verificando una y otra vez la página Web, es más correcto usar un script que nos avise de la llegada de una nueva pregunta. El script pmwatcher.pl que se describe en el presente artículo captura las Newest

52

Número 13

WWW.LINUX- MAGAZINE.ES

Nodes de perlmonks.com a intervalos regulares, lleva la cuenta de las preguntas anteriores y envía un aviso por mensajería instantánea cuando detecta novedades. Utiliza un método algo desconcertante. En lugar de invocar a un cliente de mensajería instantánea para que reenvíe un mensaje, es el propio script el que funciona como un plug-in del cliente de mensajería. La aplicación madre, Gaim, llama al script a intervalos regulares y mantiene el control sobre el plug-in. Ésta captura las últimas preguntas aparecidas y envía el mensaje oportuno al usuario a través de la interfaz de Gaim.

Trabajo Urgente Obviamente, el plug-in de Gaim no tiene tiempo que perder. Mientras se ejecuta, Gaim no puede procesar eventos y la interfaz gráfica queda congelada. Para evitar males mayores, el plug-in debe devolver el control a Gaim con la mayor celeridad. Sin embargo, puede llevar algunos segundos descargar el contenido de una página Web. Tanto la resolución DNS como el proceso de recuperación del contenido de la página Web requerida pueden llevar cierto tiempo, durante el cual la CPU debería retornar a otras tareas. El probado entorno POE [3] nos facilita justo lo que necesitamos. El kernel de POE ejecuta un solo proceso (y un solo hilo), pero usa multitarea cooperativa entre las tareas concurrentes para asegurar que cada una de ellas es procesada. Generalmente POE ejecuta su propio kernel, el POE task manager. Sin embargo, puede ser integrado con facilidad con otros bucles de eventos, como los propor-


Perl • DESARROLLO

Figura 2: Gaim se comunica con el plug-in de Perl, que a su vez controla una máquina de estados POE. Figura 1: Los posts nuevos que aparezcan en Perlmonks se reportan a través de mensajería instantánea, dándonos la oportunidad de ganar XP siendo los primeros en ofrecer ayuda.

cionados por Gtk o Perl/Tk. En el escenario Gaim, sin embargo, con un plug-in llamado por la aplicación principal a intervalos regulares, debemos pensar de manera diferente. En plugin_load(), llamado por Gaim durante el arranque, el plug-in script pmwatcher.pl define las distintas tareas que se ejecutarán más tarde. Antes de que plugin_load() le devuelva el control a Gaim, hace la llamada Gaim::timeout_add($plugin,$UPDATE,\&refresh);, y esto garantiza que Gaim llamará a la función refresh() del plug-in exactamente $UPDATE segundos más tarde. Aquí es donde aparece POE para dar paso a las tareas más urgentes antes de devolver el control a Gaim una vez más. Por supuesto, no sin antes programar otro evento para asegurar la llamada a refresh() después de un intervalo especificado, y de esta manera cerrar un bucle infinito. pmwatcher.pl guarda el objeto del plug-in que se ha pasado a plugin_load() en la variable global $PLUGIN para permitir a refresh() que haga una nueva petición de timeout a Gaim. Además de esto, las llamadas a Gaim::signal_connect de las líneas 61 y 68 controlan eventos relacionados con usuarios de Gaim que se validan o salen. Cuando ocurren estos eventos Gaim salta hasta las funciones buddy_signed_on_callback y buddy_signed_off_callback definidas en el plug-in, que verifican si el nombre de usuario coincide con el nombre especificado en la línea 25. Si coincide, buddy_signed_on_callback guarda la estructura del usuario en la variable glo-

bal $BUDDY. La variable se referencia más tarde cuando se envía un mensaje al usuario. buddy_signed_on_callback fija el flag $ACTIVE a 1 cuando se loguea este usuario especial. Y buddy_signed_off_callback lo fija a 0 cuando el usuario se marcha. Si $ACTIVE está activo, el plug-in ejecuta un único slot de tiempo POE. En caso contrario, no ocurre nada en el método del plugin refresh. Cada slot de tiempo puede procesar únicamente una pequeña parte de una petición. La petición HTTP completa puede requerir unos 20 ciclos refresh(), aunque esto no supone ningún problema en sí mismo. El único detalle importante es que la CPU se mantiene ejecutándose al máximo durante el proceso y no esperará a eventos externos como respuestas de datos HTTP. POE utiliza POE::Component::Client::HTTP para vigilar los detalles concernientes a la captura de la página Web. Si POE::Component::Client::DNS está instalado, incluso el nombre del dominio se resolverá de manera asíncrona en lugar de usar gethostbyname(). El estado inicial de POE definido en la línea 83, _start, no hace otra cosa sino iniciar el siguiente estado, http_start. El método post envía una petición al componente POE::Component::Client::HTTP, que ya estaba configurado y ejecutándose en el kernel de POE. La llamada al método spawn de la línea 76 cuida de esto. El objeto del cliente HTTP (etiquetado como ua) cambiará el estado a http_ready siempre que la respuesta HTTP empiece a cargarse. Antes de que http_start devuelva el control al kernel de POE, pide un timeout

WWW.LINUX- MAGAZINE.ES

de POE para 10 minutos más tarde. Esto activa de nuevo un estado http_start para recabar la página Web otra vez. El controlador de estado http_ready se pasa como referencia a un array en $_[ARG1]. El primer elemento del array es un objeto del tipo HTTP::Response con el resultado de la petición Web (para más detalles del inusual método de POE para pasar parámetros, consúltese [3]).

Una Aguja en un Pajar Para extraer los enlaces y textos de la sección de preguntas de la página de Perlmonks descargada, la función qparse de la línea 237 implementa un analizador de HTML. No todos los enlaces de la página van a pertenecer a una nueva pregunta, porque existen otras secciones asociadas con la página, como Discussion o Meditations, que querremos que el script pmwatcher.pl ignore.

Número 13

53


DESARROLLO • Perl

HTML::TreeBuilder crea un árbol de elementos HTML a partir de un elemento HTML. qparse() recorre el árbol generado por HTML::TreeBuilder, dirigiéndose en primer lugar a un elemento <A> conocido, con toc-Questions en su atributo name. Desde el nodo HTML::Element que encuentra, el método parent() sube un nivel en el árbol, donde el bucle while de la línea 269 se pone a buscar un elemento <table> llamando a right() para moverse a la derecha en este nivel del árbol. La tabla tiene filas de enlaces con las preguntas en la primera columna de la misma y enlaces a los creadores del post en la segunda columna. Ésta es la razón por la cual el primer bucle for en la línea 274 se dirige a cada

elemento <tr> (las filas de la tabla), y por la cual el bucle interior busca enlaces <a> cuando llega allí. Comenzando por el elemento actual, el método look_down() de un elemento del árbol, busca hacia abajo los nodos con propiedades específicas y entrega los elementos coincidentes como una lista. La condición _tag => $tagname busca etiquetas con los nombres requeridos. attrname =>$attrvalue verifica si las etiquetas encontradas tienen un atributo con un nombre específico. El texto del enlace y el valor del atributo href se extraen del primer enlace encontrado, este último se convierte en una URL absoluta y, finalmente, ambos valores se añaden al array @questions. El enlace de la segunda fila (que contiene el

nombre del demandante y sus detalles) se concentra mediante un par de bucles for (líneas 274 y 279) con una instrucción last que sigue el final del bucle interno. Otro aspecto importante es eliminar el árbol mediante delete() después de analizarlo para no malgastar memoria. Existen analizadores alternativos como XML::LibXML o XML::XSH. Ambos hacen uso de la poderosa sintaxis XPath. Sin embargo, ambos admiten mal el código HTML que esté pobremente escrito, y se saltan documentos que un navegador Web mostraría. El script aún tiene que llevar la cuenta de las preguntas que ya ha procesado para distinguir las nuevas. Para ello, aprovecha el hecho de que Perlmonks.com les asigna un nodo

Listado 1: pmwatcher.pl 001 #!/usr/bin/perl -w 002 ############################# 003 # pmwatcher - Plugin Gaim para 004 # controlar perlmonks.com 005 ############################# 006 use strict; 007 use Gaim; 008 use HTML::TreeBuilder; 009 use URI::URL; 010 use CGI qw(a); 011 use Cache::FileCache; 012 use POE 013 qw(Component::Client::HTTP); 014 use HTTP::Request::Common; 015 016 our $FETCH_INTERVAL = 600; 017 our $FETCH_URL = 018 "http://perlmonks.com/" 019 . "?node=Newest%20Nodes"; 020 021 our $ACTIVE = 0; 022 023 # Call plugins every second 024 our $UPDATE = 1; 025 our $USER = "mikeschilli"; 026 our $BUDDY = undef; 027 our $PLUGIN = undef; 028 029 our %PLUGIN_INFO = ( 030 perl_api_version => 2, 031 name => "pmwatcher", 032 summary => 033 "Perlmonks Watch Plugin", 034 version => "1.0", 035 description =>

54

Número 13

036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071

"Reports latest postings " . "on perlmonks.com, " . "Mike Schilli, 2005" . "(m\@perlmeister.com)", load => "plugin_load", ); our $cache = new Cache::FileCache( { namespace => "pmwatcher", } ); ############################# sub plugin_init { ############################# return %PLUGIN_INFO; } ############################# sub plugin_load { ############################# my ($plugin) = @_; Gaim::signal_connect( Gaim::BuddyList::handle(), "buddy-signed-on", $plugin, \&buddy_signed_on_callback, ); Gaim::signal_connect( Gaim::BuddyList::handle(), "buddy-signed-off", $plugin,

WWW.LINUX- MAGAZINE.ES

072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107

\&buddy_signed_off_callback, ); POE::Component::Client::HTTP ->spawn( Alias => "ua", Timeout => 60, ); POE::Session->create( inline_states => { _start => sub { $poe_kernel->yield( 'http_start'); }, http_start => sub { Gaim::debug_info( "pmwatcher", "Fetching $FETCH_URL\n" ); $poe_kernel->post( "ua", "request", "http_ready", GET $FETCH_URL); $poe_kernel->delay( 'http_start', $FETCH_INTERVAL ); }, http_ready => sub { Gaim::debug_info( "pmwatcher", "http_ready $FETCH_URL\n"


Perl • DESARROLLO

numérico ID a cada una, que está oculto en la URL de la pregunta. Mediante una expresión regular extraemos la ID de la URL y la comparamos con el último número guardado en el objeto persistente Cache::FileCache. Una pregunta se considera nueva si tiene una ID mayor que el último nodo conocido. A continuación se registra la última ID conocida para próximas consultas. La función latest_news() devuelve un array de mensajes con formato IM para el usuario. Si el array está vacío, no hay nada nuevo. Si hay novedades, las líneas 179 y 180 referencian a la estructura global de Gaim en $BUDDY para crear un objeto de clase Gaim::Conversation::IM. Se llama al método send() de este objeto y se consigue mostrar el mensaje con for-

mato HTML en la ventana IM del usuario, exactamente igual que si lo hubiera enviado un amigo.

Instalación Si no tenemos Gaim instalado, será buena idea descargar la última versión 1.4.0 desde gaim.sourceforge.net. La interfaz Perl, Gaim.pm, no está disponible desde CPAN, pero está incluida con la distribución de Gaim. Tecleamos lo siguiente para instalar el módulo de Perl Gaim.pm: cd plugins/perl/common perl Makefile.PL make install

Tenemos que crear de manera manual el directorio para el plug-in dentro de nues-

tro directorio home tecleando mkdir ~/.gaim/plugins. Todo script Perl ubicado allí y con la extensión .pl se cargará como plug-in de Gaim al arrancar el programa por el cargador Perl de Gaim. Sólo tenemos que copiar pmwatcher.pl al directorio plugins, hacerlo ejecutable y entonces arrancar Gaim. Podemos seleccionar Tools->Preferences->Plugins (Figura 3) para habilitar el plug-in de manera permanente, marcando el cuadro correspondiente. Gaim toma los datos mostrados en el cuadro de diálogo desde el hash %PLUGIN_INFO, como respuesta a plugin_init() (definida en la línea 51 de pmwatcher.pl). Los módulos de CPAN HTML::Tree-Builder, URI::URL, Cache::FileCache, POE,

Listado 1: pmwatcher.pl (continuación) 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

); my $resp = $_[ARG1]->[0]; if($resp->is_success()) { pm_update( $resp->content()); } else { Gaim::debug_info( "pmwatcher", "Can't fetch " . "$FETCH_URL: " . $resp->message() ); } }, } ); Gaim::timeout_add($plugin, $UPDATE, \&refresh); $PLUGIN = $plugin; } ############################# sub buddy_signed_on_callback{ ############################# my ($buddy, $data) = @_; return if $buddy->get_alias ne $USER; $ACTIVE = 1; $BUDDY = $buddy; } ############################# sub buddy_signed_off_callback { #############################

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181

my ($buddy, $data) = @_; return if $buddy->get_alias ne $USER; $ACTIVE = 0; $BUDDY = undef; } ############################# sub refresh { ############################# Gaim::debug_info( "pmwatcher", "Refresh (ACTIVE=$ACTIVE)\n" ); if ($ACTIVE) { $poe_kernel ->run_one_timeslice(); } Gaim::timeout_add($PLUGIN, $UPDATE, \&refresh); } ############################# sub pm_update { ############################# my ($html_text) = @_; if (my @nws = latest_news($html_text)) { my $c = Gaim::Conversation::IM::new ($BUDDY->get_account(), $BUDDY->get_name() );

WWW.LINUX- MAGAZINE.ES

182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218

$c->send("$_\n") for @nws; } } ############################# sub latest_news { ############################# my ($html_string) = @_; my $start_url = URI::URL->new($FETCH_URL); my $max_node; my $saved = $cache->get("max-node"); $saved = 0 unless defined $saved; my @aimtext = (); for my $entry ( @{ qparse($html_string) }){ my ($text, $url) = @$entry; my ($node) = $url =~ /(\d+)$/; if ($node > $saved) { Gaim::debug_info( "pmwatcher", "New node $text ($url)"); $url = a({ href => $url }, $url);

Número 13

55


DESARROLLO • Perl

Figura 3: Habilitamos el nuevo plug-in de Perl.

POE::Component::Client::HTTP, POE::Component::Client::DNS y HTTP::Request::Common tienen que instalarse utilizando una shell de CPAN. En el propio script, podemos fijar $FETCH_INTERVAL para definir el intervalo entre consultas a la Web. Por defecto es diez minutos, y esta cifra

debería ser suficiente para mantenernos actualizados sin enfadar mucho a la gente de perlmonks.com. Podemos arrancar Gaim con la opción -d (de debug) para mostrar los mensajes log de la función Gaim::debug_info del script Perl en la salida estándar. Una cosa a tener en cuenta: los scripts plug-in de Gaim no funcionan desde línea de comandos, y se cerrarán tras mostrar un mensaje de error. Sólo funcionan dentro de Gaim. No debemos olvidar que hay que fijar la variable $USER al nombre de usuario adecuado. Al loguearnos se activarán las acciones correspondientes del plugin. Si el usuario no está logueado, se

hace la llamada al plug-in una vez por segundo, pero sin activar ninguna petición Web. Una vez que el usuario se valide a través de Gaim (independientemente del servicio), las peticiones Web comienzan a recabar la información desde perlmonks.com cada 10 minutos. De esta manera, el plug-in mantiene actualizado al aspirante a experto con desafiantes preguntas, para ayudar a aquellos que se encuentran en el cami■ no hacia la sabiduría.

RECURSOS [1] Listados de este artículo: http://www. linux-magazine.es/Magazine/ Downloads/13 [2] Turorial básico de la interfaz Perl de Gaim: http://gaim.sourceforge.net/api/ perl-howto.html [3] Michael Schilli, “DJ Training”, Linux Magazine 08/ 2004, http://www. linux-magazine.com/issue/45/ Perl_Playlist_selecting.pdf

Listado 1: pmwatcher.pl (continuación) 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246

56

push @aimtext, "<b>$text</b>\n$url"; } $max_node = $node if !defined $max_node or $max_node < $node; } $cache->set("max-node", $max_node) if $saved < $max_node; return @aimtext; } ############################# sub qparse { ############################# my ($html_string) = @_; my $start_url = URI::URL->new($FETCH_URL); my @questions = (); my $parser =

Número 13

247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274

HTML::TreeBuilder->new(); my $tree = $parser->parse( $html_string); my ($questions) = $tree->look_down( "_tag", "a", "name", "toc-Questions"); if (!$questions) { Gaim::debug_info( "pmwatcher", "No Questions section" ); return undef; } my $node = $questions->parent(); while($node->tag() ne "table") { $node = $node->right(); } for my $tr (

WWW.LINUX- MAGAZINE.ES

275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301

$node->look_down( "_tag", "tr" )) { for my $a ( $tr->look_down( "_tag", "a" )) { my $href = $a->attr('href'); my $text = $a->as_text(); my $url = URI::URL->new($href, $start_url); push @questions, [ $text, $url->abs() ]; # Process only the question # not the author's node last; } } $tree->delete(); return \@questions; }


PDF Report • DESARROLLO

Generación de informes profesionales desde Python

REPORTLAB

Hoy en día se hace imprescindible disponer de herramientas que permitan generar informes en PDF de alta calidad rápida y dinámicamente. Existen diferentes herramientas para esta finalidad, entre ellas cabe destacar ReportLab, biblioteca gratuita que permite crear documentos PDF empleando como lenguaje de programación Python. POR ANA M. FERREIRO Y JOSE A. GARCÍA

L

a biblioteca ReportLab crea direchay que seguir para instalar y configurar tamente documentos PDF basánReportLab. dose en comandos gráficos y sin El paquete pdfgen es el nivel más bajo pasos intermedios, generando informes para generar documentos PDF, que se en un tiempo extremadabasa esencialmente en mente rápido y siendo de una secuencia de instrucgran utilidad en los ciones para “dibujar” siguientes contextos: cada página del docugeneración dinámica de mento. El objeto que proPDFs en aplicaciones web porciona las operaciones (empleado con Zope), de dibujo es el Canvas. El generación de informes y Canvas mide igual que publicación de datos una hoja de papel blanalmacenados en bases de co, con puntos sobre la datos, embebiendo el misma identificados motor de impresión en mediante coordenadas aplicaciones para consecartesianas (X,Y), que guir la generación de Figura 1: Coordenadas cartepor defecto tienen el oriinformes a medida, etc. sianas de una hoja. gen (0,0) en la esquina inferior izquierda de la Primeros pasos página. La coordenada X va hacia la derecha y la coordenada Y avanza hacia Lo primero es tener instalados Python y arriba (ver Figura 1). ReportLab para realizar todas las pruePara crear nuestro primer PDF basta bas que van surgiendo y las que se nos escribir en un fichero, que podemos llaocurran. En [1] se detallan los pasos que

WWW.LINUX- MAGAZINE.ES

mar ejemplo1.py, las siguientes líneas de código: from reportlab.pdfgenU import canvas c=canvas.Canvas("primer.pdf") c.drawString(50,500, " MiU PRIMER PDF") c.drawString(250,300,U "Coordenada=(250,300) ") c.drawString(350,200,U "(350, 10)") c.drawString(150,400,U "Aprendiendo REPORTLAB") c.showPage() c.save()

Probamos el programa y vemos que en el mismo directorio ya se ha creado un fichero llamado primer.pdf, análogo al que se muestra en la Figura 2, sin necesidad de realizar ningún otro paso intermedio. Mediante la línea from reportlab.pdfgen import canvas importamos Canvas, utilizado para dibujar en el PDF. El comando

Número 13

57


DESARROLLO • PDF Report

canvas.Canvas(path__fichero) permite indicar el nombre con el que se guardará el PDF. El método drawString(x,y,cadena_texto) empieza a escribir el texto en la coordenada (x,y) (se puede probar a cambiar las diferentes coordenadas). El método showPage() crea la página actual del documento. Finalmente, save() guarda el fichero en el path indicado. En el ejemplo previo hemos creado un PDF sin especificar el tamaño del documento, si queremos fijar el tamaño de la hoja (A4, letter, A5, etc.) bastaría indicarlo en el Canvas mediante: from reportlab.lib.U pagesizes import letter,A4,A5,U A3 c=canvas.Canvas("primer.pdf",U pagesize=letter)

Listado 1: ejemplo2.py 01 from reportlab.pdfgen import canvas 02 c=canvas.Canvas("canvas_draw.p df") 03 c.setFont("Helvetica",24) 04 c.line(50,50,50,350) 05 c.line(50,50,350,50) 06 c.setStrokeColorRGB(1,1,0.0) 07 c.setFillColorRGB(0,0.0,0.5) 08 c.roundRect(75,75,275,275,20,s troke=0, fill=1) 09 c.setFillColorRGB(0.8,0.,0.2) 10 c.circle(205,205,100,stroke=1,fill=1) 11 c.setFillColorRGB(0.75,0.75,0. ) 12 c.drawString(125,80,"Cuadrado" ) 13 c.setFillColorRGB(0,1,0.2) 14 c.drawString(155,200,"Circulo" ) 15 c.setStrokeColorRGB(1,0,0.0) 16 c.ellipse(75,450,350,335,fill= 0) 17 c.setFillColorRGB(0,0,0.5) 18 c.drawString(150,375,"Elipse") 19 c.showPage() 20 c.save()

El tamaño de las hojas se importa mediante from reportlab.lib.pagesizes import letter,A4,A5,A, y se especifica en el Canvas con la propiedad pagesize. Muchas veces querremos adaptar el dibujo a las dimensiones de la hoja, por lo que necesitamos conocer el ancho y el alto de la misma: ancho=tipo_hoja[0] y alto=tipo_hoja[1]; donde tipo_hoja puede ser letter, Figura 2: Primer documento generado. El resultado impreso A4, A5 , etc. refleja cómo controlar las coordenadas de una hoja. La clase Canvas dispone de diferentes herramientas para dibutipo de fuente se realiza usando jar líneas, circunferencias, rectángulos, canvas.SetFont(tipo_fuente,tamaño). En arcos, etc. Además permite modificar el la Figura 3 se muestra el PDF que creacolor de los objetos, rotar, trasladar, indimos con el simple código del Listado 1. car tipo y tamaño de fuente, etc. En el Podemos probar a cambiar propiedades código del Listado 1 podemos ver cómo (en el manual de ReportLab encontrarese dibujan, por ejemplo líneas, mos muchas otras). mediante canvas.line(x1,y1,x2,y2); círAñadiendo imágenes culos, empleando el método canvas.cirEn este instante ya podemos demostrar cle(x_centro,y_centro,radio,stroke=1,fill nuestra creatividad en dibujo “artístico”, =1); y rectángulos con esquinas redonaunque de un modo bastante laborioso. deadas, Seguro que más de uno preferimos canvas.roundRect(x,y,ancho,alto,anguincluir en nuestros ficheros imágenes ya lo,stroke=1,fill=0). Nótese que cada creadas. Pues esto es posible: en el área vez que se quiera emplear un color de descarga de Linux Magazine tenemos nuevo hay que indicarlo mediante la imagen Tux2.png para las diferentes canvas.setFillColorRGB(r,g,b), para el pruebas. color de relleno, o A la hora de incluir imágenes podemos canvas.setStrokeColorRGB(r,g,b), para fijar el color de las líneas. La elección del optar por las siguientes opciones. La pri-

Figura 3: Objetos que se pueden dibujar con un Canvas.

58

Número 13

WWW.LINUX- MAGAZINE.ES


PDF Report • DESARROLLO

Figura 4: drawImage.

Colocando

imágenes

con

mera y más sencilla, pero con la que no nos es posible rotar, trasladar, ni redimensionar es mediante el método drawImage(image,x,y,width=None,heig ht=None) de la clase Canvas (si no se especifica el alto y el ancho, coloca la figura con sus dimensiones originales). Mediante las siguientes líneas podemos crear un fichero similar al de la Figura 4. c.drawImage("Tux2.png",0,0)

Listado 2: Jugando con imagenes (ejemplo3_2.py) 01 from reportlab.graphics.shapes import Image, Drawing 02 from reportlab.graphics import renderPDF 03 from reportlab.lib.pagesizes import A4 04 inpath="Tux2.png" 05 IMAGES=[] 06 d=Drawing(80,100) 07 img=Image(200,0,80,100,inpath) 08 d.add(img) 09 d.rotate(45) 10 d.scale(1.5,1.5) 11 IMAGES.append(d) 12 d=Drawing(80,100) 13 d.add(img) 14 d.translate(10,0) 15 d.scale(2,2) 16 d.rotate(-5) 17 IMAGES.append(d) 18 d=Drawing(A4[0],A4[1]) 19 for img in IMAGES: 20 d.add(img) 21 renderPDF.drawToFile(d,"canvas_image2.pdf")

Figura 5: Modo en que se rota, traslada y escala un objeto Drawing.

c.drawImage("Tux2,png",200,300,U width=30,height=60)

Si lo que pretendemos es rotar imágenes o escalarlas, debemos emplear los objetos Image(x,y,ancho,alto,path_imagen) y Drawing(ancho,alto) que se importan mediante from reportlab.graphics.shapes import Image, Drawing. El objeto Drawing puede escalarse, rotarse y trasladarse; pero hay que tener en cuenta que todas estas operaciones son acumulativas (ver Figura 5). En el Listado 2 podemos ver cómo emplear correctamente estos objetos (Figura 6). Obsérvese que ahora el PDF no se genera a partir de un Canvas, sino que se genera mediante renderPDF.drawToFile(d,"canvas_image2.pdf"), donde d=Drawing(A4[0],A4[1]). Podemos probar a modificar los valores de los distintos métodos scale, rotate, translate; observaremos que a veces la imagen puede desaparecer del folio, eso es debido a que los valores que se dan hacen que nos salgamos de las dimensiones de la página.

Creación de párrafos y tablas La clase reportlab.platypus.Paragraph permite escribir texto formateado (justificado, alineado a la derecha o izquierda, centrado) en un aspecto elegante, además de modificar el estilo y color de t r o z o s d e l a l í n e a a t ra vés de XML. Mediante Paragraph(texto,style,bulletText=None) se instancia la clase; texto contiene el texto del párrafo, en el que se eliminan

WWW.LINUX- MAGAZINE.ES

Figura 6: Ejemplo de rotación, traslación y escalado de imágenes.

los espacios en blanco innecesarios; bulletText indica si el párrafo se escribe con un punto al inicio del mismo; la fuente y otras propiedades del párrafo y el punto se indican mediante el argumento style. Veamos cómo añadir un párrafo: 01 fr om repor tlab.lib.styles import getSampleStyleSheet 02 styleSheet=getSampleStyleShee t() 03 story=[] 04 h1=styleSheet['Heading1'] 05 h1.pageBreakBefore=0 06 h1.keepWithNext=1 07 h1.backColor=colors.red 08 P1=Paragraph("Estilo Cabecera - h1 ",h1) 09 story.append(P) 10 style=styleSheet['BodyText'] 11 P2=Paragraph("Estilo BodyText" ,style) 12 story.append(P2)

El paquete reportlab.lib.styles contiene estilos predefinidos. Con getSampleStyleSheet obtenemos un estilo ejemplo. Tenemos un estilo para la cabecera y otro para el texto normal. Mediante h1.pageBreakBefore=0 decimos que no queremos un salto de página cada vez que se escriba una cabecera h1, en caso contrario basta escribir 1. Los diferentes párrafos se van almacenando en la lista story porque posteriormente se añaden al pdf a través el paquete SimpleDocTemplate de reportlab.platypus:

Número 13

59


DESARROLLO • PDF Report

Figura 7: Ejemplo de párrafo, tabla e imagen.

doc=SimpleDocTemplate(U "paragrahp.pdf", pagesize=A4,U showBoundary=1) doc.build(story)

En este caso, se genera un PDF con tantas páginas como sea necesario. Comprobar esto es tan sencillo como

tener un texto muy largo. Si añadimos un párrafo cuyo texto sea "Hola"*300, seguro que se generan más de una hoja. Si lo que queremos es añadir una tabla, es necesario importar from reportlab.platypus import Table,TablsStyle. Una tabla se crea añadiendo una lista de listas, donde cada componente de la lista guarda la información de cada fila. Si queremos construir una tabla de 5 filas y 3 columnas hacemos t=Table([['','Ventas',U 'Compras'],U ['Enero',1000, 2000],U

['Febrero',3000,100.5],U ['Marzo',2000,1000],U ['Abril',1500,1500]]

En una tabla se puede fijar el estilo de cada miembro de la misma. Si por ejemplo, se quiere que el texto de la primera columna sea azul, y que los números sean todos verdes, haremos t.setStyle([U ('TEXTCOLOR',(0,1),(0,-1),U colors.blue), ('TEXTCOLOR',U (1,1), (2,-1),colors.green)])

En el código del Listado 3 mostramos un ejemplo en él se ilustra cómo adaptar el estilo según se quiera (Figura 7). Podemos ver que para incluir un nuevo elemento en el PDF es suficiente con ir añadiendo cada objeto a la lista story. Ahora ya sabemos todo lo necesario para crear nuestros propios carteles, infor■ mes, catálogos, presentaciones, etc.

RECURSOS [1] Reportlab: http://www.reportlab.org

Listado 3: Crear Tablas y Párrafos (ejemplo4.py) 01 from reportlab.lib.pagesizes import A4 02 from reportlab.lib.styles import getSampleStyleSheet,ParagraphS tyle 03 from reportlab.platypus import Spacer, SimpleDocTemplate, Table, TableStyle 04 from reportlab.platypus import Paragraph, Image 05 from reportlab.lib import colors 06 07 styleSheet=getSampleStyleSheet () 08 story=[] 09 h1=styleSheet['Heading1'] 10 h1.pageBreakBefore=0 11 h1.keepWithNext=1 12 h1.backColor=colors.red 13 h2=styleSheet['Heading2'] 14 h2.pageBreakBefore=0 15 h2.keepWithNext=1

60

Número 13

16 P=Paragraph("Estilo Cabecera h1 ",h1) 17 story.append(P) 18 P=Paragraph("Estilo h2 ",h2) 19 story.append(P) 20 style=styleSheet['BodyText'] 21 texto=" Texto escrito para ver como crear ficheros PDF."+\ 22 "Este parrafo esta escrito en estilo BodyText" 23 texto_largo=texto 24 #texto_largo=texto*100 25 P=Paragraph(texto_largo,style) 26 story.append(P) 27 story.append(Spacer(0,12)) 28 29 t=Table([['','Ventas','Compras '], 30 ['Enero',1000, 2000], 31 ['Febrero',3000,100.5], 32 ['Marzo',2000,1000], 33 ['Abril',1500,1500]] 34 ) 35

WWW.LINUX- MAGAZINE.ES

36 37 38 39 40 41 42 43 44 45

story.append(t) story.append(Spacer(0,15)) P=Paragraph("Cabecera h1",h1) story.append(P) cadena=''' Mediante ReportLab es posible generar ficheros PDF de gran calidad. Es posible incluir graficos, imagenes, tablas; creando informes de gran calidad ''' P=Paragraph(cadena,style)

46 47 48 49 50 story.append(Spacer(0,15)) 51 52 img=Image("Tux2.png",width=80, height=100) 53 story.append(img) 54 doc=SimpleDocTemplate("paragrahp.pdf",pagesize=A4,showBou ndary=1) 55 doc.build(story)


Python • DESARROLLO

HAL 9000 contra los Sudokus Mutantes

SUDOKUS

Python es un lenguaje que gusta mucho en la comunidad de Inteligencia Artificial, no en vano Google dice que es una de sus armas. Hoy vamos a convertirlo en la nuestra. POR JOSÉ MARÍA RUIZ Y JOSE PEDRO ORANTES

¿

Ha sucumbido el lector a los Sudokus? Debo confesar que jamás he hecho uno. Soy una persona algo vaga, debo reconocerlo, y la idea de estar mucho tiempo delante de un problema que no me reporta nada (alguno dirá diversión, pero no es mi caso) no me atrae demasiado.

El Ataque de los Sudokus Asesinos Pero si el verano del año 2005 se recordará por algo, será por el Reageton (o como se escriba) y por los omnipresentes Sudokus. Los hemos visto en los periódicos, en revistas, en bolsas de comestibles… y más de uno ha comprado libros de Sudokus para echar el rato. Tal ha sido la acogida que un día vino mi hermano diciendo que no era capaz de resolver uno. Me pidió consejo, pero le dije que no tenía ni idea de qué iba la cosa. Después de leer sobre el tema pensé que sería buena idea usarlo como base para explicar algunos conceptos de Inteligencia Artificial aplicados a Python.

Búsqueda de soluciones. La Inteligencia Artificial, o como gustan muchos de llamarla «Algoritmos

Ingeniosos», tiene como fin resolver pronúmeros y el resto huecos. Se tienen que blemas complejos. El lector puede dorrellenar los huecos de manera que en mir tranquilo, porque por el momento cada fila y columna aparezcan los númesus éxitos no han conseguido simular ros de uno al nueve sin repetirse. Así de cerebros reales, Terminator aún no está simple y así de complicado. cerca. En cambio, los éxitos Nosotros vamos a ver, y a cosechados en problemas implementar, un algoritmo complicados, como el control bastante famoso: el aéreo o la planificación, han Backtracking o Vuelta Atrás sido mucho más espectacula(haré uso del nombre en res de lo que se creía. inglés por ser el de más uso) Pero dicho de esa manera para solucionar Sudokus. parece quitársele el glamour, Un mini-Sudoku de El Backtracking. cuando en realidad aún lo 3x3 casillas. tiene. Uno de los campos que Se trata de un algoritmo de más éxito ha tenido ha sido en la creabúsqueda en el cual se explora un árbol ción de algoritmos de búsqueda de solude soluciones en anchura o profundidad. ciones. ¿Recuerda el lector las noticias Dicho de esta manera queda muy técnico sobre ordenadores que derrotan a granasí que mejor vemos un ejemplo con un des maestros de ajedrez? Pues su éxito se «mini-sudoku». debe a sofisticados algoritmos de búsDigamos que tenemos el siguiente proqueda de soluciones. blema: se nos presenta un cuadro como el de la Figura 1, tres filas por tres ¿Qué es un Sudoku? columnas, donde algunas de ellas están Según la página de Wikipedia, un pasaocupadas pero otras no. En cada hueco tiempo japonés que apareció a mediados solo podemos poner un número comde los años 80 en los diarios nipones y prendido entre el 1 y el 3 de tal manera que en el año 2005 ha arrasado en los del que en cada fila y en cada columna solo resto del mundo. El jugador tiene una aparezca cada uno de estos números una matriz de nueve filas por nueve columvez. Por tanto es imposible encontrar nas de las cuales algunas celdas tienen una fila que muestre un <1,3,3> o un

WWW.LINUX- MAGAZINE.ES

Número 13

61


DESARROLLO • Python

<2,1,1>. ¿Donde está el juego? en hallar los números que hay que poner en cada hueco de forma consecutiva de tal manera que se verifique que cada número es único en su fila y su columna. ¿Cómo podríamos elaborar un programa que resuelva este puzzle? Existen varias opciones, pero nos centraremos en la que queremos ver. Comenzaríamos centrándonos en los huecos, por tanto debemos ignorar las celdas que estén ocupadas. Para cada hueco tenemos que elegir un número que no se encuentre ni en su fila ni en su columna. Vamos a necesitar, por tanto, una función que escanee ambas en busca de números no usados. Seleccionaremos uno de los posibles números y avanzaremos hacia la derecha rellenando los huecos hasta llegar al último.

Estructura de datos No vamos a complicar mucho el diseño, usaremos una lista de listas. Cada fila se

corresponderá con una lista, por tanto un sudoku de tres filas por tres columnas podrá ser: >>> sudoku = [[1,0,0], [0,2,0], [0,0,3]] >>> sudoku[0][0] 1 >>> sudoku[1][2] 0

Ahora ya podemos trabajar sobre una estructura de datos. Los huecos los vamos a representar como 0s. Cuando nos movemos por el Sudoku tenemos que tener en cuenta cuando nos hemos salido de la fila y tenemos que seguir en la siguiente. Para ello vamos a emplear una clase que llamaremos Posicion. Esta clase nos va a permitir controlar la posición de manera sencilla a través de sus métodos. Funcionará como un iterador: primero definimos los límites,

Listado 1: clase «Posicion()». 01 class Posicion: 02 ### Gestiona una posición, controlando los incrementos 03 ### 04 def __init__(self,maxfila,maxcol): 05 self.maxfila = maxfila 06 self.maxcol = maxcol 07 self.fila = 0 08 self.col = 0 09 10 def setFila(self, fila): 11 if fila < 0: 12 self.fila = 0 13 elif fila >= self.maxfila: 14 self.fila = -1 15 else: 16 self.fila = fila 17 18 def setCol(self, col): 19 if col < 0: 20 self.col = 0 21 elif col >= self.maxcol: 22 self.col = -1 23 else: 24 self.col = col 25 26 def getFila(self): 27 return self.fila 28

62

Número 13

29 30 31 32 33 34 35 36 37 38 39 40

41 42 43 44 45 46 47 48 49 50 51 52

def getCol(self): return self.col def fin(self): return self.fila == -1 and self.col == -1 def reset(self): self.fila = 0 self.col = 0 def sig(self): # Incrementa la posición controlando que no se pasa # del final. if not self.fin(): self.col += 1 if self.col == self.maxcol: self.col = 0 self.fila +=1 if self.fila == self.maxfila: self.fila = -1 self.col = -1 def getPos(self): return [self.fila, self.col]

WWW.LINUX- MAGAZINE.ES

tenemos un método que nos permite avanzar y otros para ajustar los valores o recojerlos. Podemos ver el código en el Listado 1. Un ejemplo de uso es: 01 02 03 04 05 06 07 08 09 10 11 12 13

>>> p = Posicion(1,1) >>> p.getPos() [0,0] >>> p.sig() >>> p.sig() >>> p.getPos() [1,0] >>> p.sig() >>> p.sig() >>> p.fin() true >>> p.getPos() [-1,-1]

A Posicion le pasaremos el tamaño de las filas y las columnas del Sudoku, que al ser cuadrado serán los mismo.

El Sudoku. Vamos a crear una función que nos permita visualizar el Sudoku. Podemos ver el código en el Listado 2. Pero esta función acepta dos parámetros en lugar de uno ¿por qué? Usaremos una representación algo extraña. En lugar de ir rellenando los huecos sobre el propio Sudoku vamos a ir introduciendo los número que corresponden a los huecos en una PILA donde cada elemento tendrá la forma <FILA,COLUMNA,VALOR>. La razón de hacerlo así es que nos permitirá trabajar de manera más sencilla durante la búsqueda. En la función imprime esta PILA recibe el nombre de asignadas. En esta función generamos barras de guiones y recorremos el Sudoku imprimiendo las filas hasta completar un tablero. Se puede observar el resultado final en la Figura 2.

Buscando Posibilidades Cuando estemos en un hueco, necesitamos generar una lista de números no usados ni en la fila ni en la columna en las que se encuentra. Esa será la tarea de la función prueba que aparece en el Listado 3. Esta función generará una lista con los números sin utilizar. Para hacerlo prueba todos los números posibles tanto en la fila como en la columna. Si no encuentra ninguno disponible devuelve una lista [-1]. Como ya dijimos antes, guardaremos los huecos rellenos en una PILA, y por


Python • DESARROLLO

eso prueba no solo busca en nuestro Sudoku, sino en esta PILA, para buscar en los números que ya hemos puesto. Por tanto primero escanearemos la fila, después la columna y por último la PILA. Cada número que no aparezca en ninguno de los tres sitios será añadido a una lista que se devuelve al acabar la función.

¿Qué es el Backtracking? Podemos contestar haciendo otra pregunta ¿qué ocurrirá si en un momento dado la función prueba nos devuelve una lista vacía? Eso quiere decir que no se ha encontrado ningún número libre para poder usarlo. ¿Acaba con esto nues-

Listado 2: función «imprime()». 01 def imprime(sudoku, asignadas): 02 barra = "" 03 for i in range(0,COLUMNAS): 04 barra += "·---" 05 barra += "." 06 07 print barra 08 for fila in range(0,len(sudoku)): 09 cadena = "" 10 for columna in range(0,len(sudoku)): 11 if sudoku[fila][columna] == 0: 12 encontrado = False 13 for a in asignadas: 14 if a[0] == fila and a[1] == columna: 15 cadena += "| "+ str(a[2]) + " " 16 encontrado = True 17 if not encontrado: 18 cadena += "|"+" " 19 else: 20 cadena += "| "+str(sudoku[fila][columna])+" " 21 cadena += "|" 22 print cadena 23 print barra

básico consiste en usar bucles, es menos «elegante» pero no explota :). ¿Pero como vamos a guardar tanto la ruta como las opciones que no escogimos? Es hora de desvelar el misterio.

Las dos pilas Mostramos un Sudoku para su resolución.

tro intento de Sudoku? ¡Ni mucho menos! ahora comienza lo divertido. Un jugador humano suele tantear, pone un número aquí y otro allí. Intenta ir ajustado «a ojo» la posición de cada número. Nosotros estamos creando un programa, y estos suelen ser muy metódicos y mecánicos en lo que hacen. En palabras técnicas vamos a explorar el espacio de posibilidades. Imagina todas las combinaciones posibles de números que se pueden poner en el Sudoku, pues nosotros vamos a ir recorriéndolas paso a paso. Pero no lo vamos a hacer de manera tan bruta, sino que iremos comprobando hasta donde podemos llegar con cada una y cuando nos atasquemos, «volveremos atrás» hasta el último paso donde pudimos elegir entre varios números y cogeremos el siguiente al que cogimos la última vez. Si llegamos al hueco [1,3] y podemos elegir entre el 1, el 3 y el 5; escogeremos el primero, el 1, y nos guardaremos el 3 y el 5 por si los necesitamos. Avanzaremos tanto como podamos y cuando no podamos seguir, porque sea imposible, iremos deshaciendo el camino hecho y escogiendo en cada paso las otras posibilidades. Dicho así parece intuitivo y hasta fácil, pero hacer un programa que haga esto no es tan sencillo como pudiese parecer. Existen varias técnicas y este proceso posee innumerables optimizaciones. Pero nosotros nos quedaremos con el caso básico. Cuando comencé a escribir el programa opté por el enfoque recursivo, que consiste en hacer una función que se llamen a sí misma. Esta manera de hacer el programa requiere menos código pero en cuanto el Sudoku crece el programa deja de funcionar debido a que satura la pila del sistema. Esto ocurre cuando se invoca a muchas funciones, unas dentro de otras, y con problemas de este tipo podemos tener cientos o miles de invocaciones con lo que, tarde o temprano, el programa dará un error. El otro enfoque

WWW.LINUX- MAGAZINE.ES

El truco consiste en emplear dos pilas. Las pilas son estructuras de datos que nos permite guardar información y recuperarla posteriormente de una manera peculiar: lo último que almacenemos será lo primero que podamos guardar. Es como una pila de platos, puedes ponerlos unos encima de otros, pero es complicado sacarlos desde abajo así que se sacan en orden inverso a como se pusieron. Puede parecer una tontería, pero la estructura de pila es vital en casi todos los ámbitos de la informática y es quizás uno de sus mayores descubrimientos. Su secreto consiste en aprovechar su manera de funcionar. Haremos lo siguiente: tendremos dos pilas, una para guardar las elecciones hechas hasta el momento (con las más antiguas al fondo y las más nuevas al frente) y otra para ir almacenando las opciones que no escogimos. Por ejemplo digamos que estamos en la posición [3,4] y que la función prueba nos ha devuelto la lista [3,7,9], entonces las pilas tendrán los valores: >>> pilaActual [...[3,3,2],[3,4,3]] >>> pilaPosibles [...[3,4,7],[3,4,9]]

Supongamos que después de una serie de malas elecciones hemos llegado hasta [3,4,3] y ninguna de las elecciones posteriores nos ha valido. Debemos retractarnos de nuestra elección de [3,4,3] escogiendo ahora otra de las opciones que guardamos. Para ello usaremos la función pop(), que extrae el último elemento de una lista: >>> pilaActual.pop() [3,4,3] >>> pilaActual [...[3,3,2]] >>> pilaActual.appendU (pilaPosibles.pop()) [...[3,3,2],[3,4,7]] >>> pilaPosibles [...[3,4,9]]

Número 13

63


DESARROLLO • Python

Hemos sacado [3,4,3] de pilaActual y lo hemos reemplazado por [3,4,7] que sacamos de pilaPosibles. Eso ha sido un «Backtracking». El código de la función que realiza la búsqueda y el Backtracking aparece en el listado 4 (disponible en [1]. Vamos a analizarla con más detalle.

La función «resuelve()» Lo primero que hacemos es conseguir el tamaño de nuestro Sudoku y preparar las pilas (que son listas vacías) así como una variable que represente la posición. Entonces entramos en un bucle while del que saldremos cuando hayamos llegado al final del Sudoku. En el bucle buscamos todas los posibles números que se pueden usar en un hueco. Si la función prueba() nos devuelve una lista vacía, entonces debemos avanzar a la siguiente posición porque la actual ya tiene un número. Este

bucle es peligroso, porque en él es donde se da la condición que acaba con la función, por eso tenemos un return dentro de él. Comprobamos si prueba nos devuelve [-1], indicativo de que es imposible escoger un número porque todos están ya cogidos. Es aquí donde ejecutamos el Backtracking, pero lo veremos después, sigamos con el else. Una vez que tenemos la lista de posibles números, cogemos el primero y lo almacenamos en pilaActual para poder seguir avanzando. Los otros posibles números se almacenan, junto a la posición del hueco, en la pilaPosibles para su posterior uso si fuese necesario. Es entonces cuando avanzamos a la siguiente posición. Recuperemos el tema del Backtracking, prueba() nos había comunicado que no era posible dar ningún número candidato. Lo primero que hace-

Listado 3: función «prueba()». 01 def prueba(sudoku, asignadas, fila, col): 02 # Puede dar 3 cosas: 03 # a) [] si está ocupado 04 # b) tupla con números posibles 05 # c) [-1] si es imposible 06 07 if sudoku[fila][col] != 0: 08 return [] 09 10 else: 11 resultado = [] 12 13 # probamos todos los números posibles 14 for n in range(1,LINEAS+1): 15 16 existe = False 17 18 # barremos lineas 19 for l in range(0,LINEAS): 20 if sudoku[l][col] == n: 21 existe = True 22 break 23 24 # barremos columnas

64

Número 13

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

for c in range(0,COLUMNAS): if sudoku[fila][c] == n: existe = True break # Buscamos en las posiciones asignadas for asig in asignadas: if asig[0] == fila and asig[2] == n: existe = True break if asig[1] == col and asig[2] == n: existe = True break if not existe: resultado.append(n)

40 41 42

if resultado == []: # Un callejón sin

>>> pilaActual [......[6,1,4],[6,2,8][6,3,9]] >>> pilaPosibles [......[6,1,5]]

Pues que no existen alternativa para [6,2,8] ni [6,3,9], lo único que podemos hacer es desapilar estados de pilaActual hasta encontrar uno que coincida en coordenadas con el último de pilaPosibles. Sería como haber avanzado hasta el hueco [6,3], volver hasta el [6,1] y arrancar de nuevo. Cuando acabamos de desapilar actualizamos la posición a la de [6,1] y la avanzamos, porque ahora buscaremos cubrir el hueco [6,2]. ¡Y ya está! Es algo complejo, pero ahora podemos resolver Sudokus automáticamente… ¿y el rendimiento? Las exploraciones de espacios de soluciones son lentas. No he introducido optimizaciones porque complicarían innecesariamente el código. En mi máquina, 1600Mhz, tarda alrededor de 10 minutos en resolver el Sudoku. Esto se debe a que Python no es tan eficiente como otros lenguajes. En la página de Wikipedia acerca de los Sudokus se dice que los algoritmos que los resuelven de manera eficiente tardan entorno a dos minutos, así que el lector se puede hacer una idea de donde está el límite. Aún así nuestro código, sin ser el más óptimo, es sin duda de los más sencillos. Como dice el gran maestro Knuth, «la optimización prematura es el origen de todos los males». Lo importante es que el programa sea sencillo, fácil de escribir y correcto. Después siempre hay tiempo ■ para optimizar.

RECURSOS

salida 43 44 45

mos es desapilar con pop() el último estado de pilaActual, porque desde ahí no nos hemos podido mover a la siguiente posición. ¿Por qué hay un bucle while? Como hemos ido introduciendo en una pila las otras posibilidades, las más recientes son las que están al final de la pila. Si las coordenadas de los estados que vamos sacando de pilaActual no coinciden con las de pilaPosibles… ¿qué puede significa eso?

resultado = [-1] return resultado

WWW.LINUX- MAGAZINE.ES

[1] Listado completo de este artículo en http://www.linux-magazine.es /Magazine/Downloads/13


La Columna de Charly • ADMINISTRACIÓN

El Día a Día del Administrador de Sistemas: TOR

NAVEGACIÓN OCULTA A algunas personas no les importa dejar el rastro de sus direcciones IP en cualquier parte adonde van, sin embargo otros prefieren usar una herramienta como The Onion Router. POR CHARLY KÜHNAST

T

he Onion Router (TOR) [1] se ejecuta como un proxy Socks 4 y maneja las conexiones entrantes por una red de servidores distribuidos, independientes, quitando cualquier rastro de los paquetes de datos originales. El Onion es parecido a Java Anonymous Proxy (JAP), una herramienta que soporta la navegación anónima. Su ex no será capaz de averiguar la dirección IP de una entrada en el blog para averiguar quién añadió aquellos comentarios poco gratos sobre él/ella. La dirección IP será la del último servidor al que Onion encamine la cadena. Descargué Tor desde [2], que tiene una colección de paquetes preparados para una gran variedad de distribuciones Linux, derivados BSD, MacOS y Windows. Decidí compilarlo utilizando los ficheros tar, un proceso rápido. He instalado las bibliotecas de OpenSSL y Libevent en mi equipo, pero luego tuve que hacer el procedimiento estándar: ./ configure && make && make install. Como no especifiqué ninguna preferencia para el directorio de destino, los binarios fueron a /usr/local/bin, y un fichero de configuración de ejemplo fue a parar a /usr/local/etc/tor/. Es preferible configurar un usuario Tor cada vez que ejecute Tor con privilegios de root. Tor soporta modos de operación cliente y servidor. En modo cliente es útil si su equipo tiene una dirección privada, no enrutable, por ejemplo 10.x.x.x y utiliza una puerta de enlace NAT para cone-

SYSADMIN El Taller del Administrador: NTP.......66 El Network Time Protocol (NTP) proporciona la hora exacta a través de la red. Programación Segura………..…..... 69 Asegure su servidor aprendiendo a pensar como un atacante.

xiones Internet. Para equipos con módem, el modo cliente también es la elección correcta. La configuración es muy simple. Después de ejecutarlo, Tor escucha en el puerto 9050 para las conexiones entrantes de Socks 4. Puede apuntar su navegador a este puerto para enrutar las conexiones mediante la red de enrutado de Onion. La documentación correcta apunta a que sería buena idea utilizar la combinación de Tor y Privoxy para navegar. Para mas detalles, vaya a [3].

Socks con Nodos Si tiene una dirección IP pública y bastante ancho de banda, querrá ejecutar Tor en modo servidor. La ventaja del modo servidor es que su equipo se convierte en un nodo sobre Onion que encamina la red. Cuantos más nodos tenga la red más eficiente la hacen y mejor funcionamiento tiene. Nada se cambia desde el punto de vista del uso de Socks – el servidor es todavía un proxy Socks 4. Tendrá que tener cuidado con algunas cosas si ejecuta Tor en modo servidor. Su reloj de sistema debería ser tan exacto como fuese posible; puede sincronizarlo con un servidor de tiempo. También tiene que añadir un alias para el servidor al archivo de configuración torrc (viene muy bien documentado), además tiene que especificar qué puerto del servidor escuchará las conexiones entrantes. También son útiles otros ajustes, como límites de amplitud de banda o redes a las que quiere permitir o denegar cone-

WWW.LINUX-MAGAZINE.ES

xiones entrantes. La exit policy es digna de ser leída. Esta política oculta el mecanismo de Tor para prevenir conexiones a puertos específicos. En este caso, el programa no enrutará el correo electrónico, incluso si un cliente de correo usa el servidor Socks. Esta característica previene a los spammers del mal empleo de su servidor Tor. Diviértase jugando al escondite con él. ¡Y que no le pille escribiendo mensajes anónimos ■ sobre mi peso en mi blog!

RECURSOS [1] Tor: http://tor.eff.org [2] Descarga: http://tor.eff.org/download. html [3] Combinando Tor y Privoxy: http://tor. eff.org/cvs/tor/doc/tor-doc. html#client-or-server

Número 13

65


ADMINISTRACIÓN • NTP

Trucos: Network Time Protocol

EN PUNTO

Las redes requieren a menudo de un control de la hora muy preciso. Network Time Protocol proporciona este tiempo con precisión. POR MARC ANDRÉ SELIG

C

ualquier reloj baratucho dará la hora mejor que los chips de los equipos actuales. Hay trucos para mejorar la precisión, como por ejemplo, averiguar la desviación y calcular un vector de corrección, pero nunca encontrará una alternativa real a la utilización de las herramientas apropiadas. Los ordenadores, con frecuencia, toman el tiempo de relojes de referencia sumamente exactos. Hay muchas opciones. Un receptor DCF77 unido al puerto serie o al puerto USB permite a un ordenador recibir el tiempo de un reloj de referencia (Figura 1). Si necesita exactitud en su control de entrada y salida del trabajo, pero no quiere invertir dinero en hardware adicional, simplemente puede consultar una fuente de tiempo en Internet. El protocolo que necesita para hacer esto es

66

Número 13

Network Time Protocol (NTP), que puede usar para comunicarse tanto TCP como UDP (Puerto 123). El ntpd en Linux implementa el protocolo NTP. Este protocolo se basa en una serie de trucos para conseguir una sincronización precisa en un período de tiempo específico. El tiempo de referencia se conoce como UTC (Universal Time Coordinated). NTP no sincroniza el tiempo en múltiples equipos, pero sincroniza el tiempo en una sola máquina con UTP como su mejor opción. Para hacerlo emplea una estructura jerárquica (Figura 2). La idea es que algunos equipos tengan fuentes de tiempo exactas, tal como el reloj atómico en PTB. Los ordenadores que utilizan un reloj de este tipo como referencia directa ocupan el nivel más alto en la jerarquía: estrato 1. Existen más niveles conocidos,

WWW.LINUX-MAGAZINE.ES

como 2, 3, 4, 5, etc. Encontrará una lista de servidores de los estratos 1 y 2 en [1]. Cada equipo en este sistema puede conectarse a varios equipos de un estrato con un número más bajo (mejor).

Modos NTP NTP soporta tres modos distintos para pasar una señal de tiempo desde un ordenador a otro. En las operaciones tradicionales de cliente/servidor, un ordenador se apoyará en otro para obtener el tiempo. El cliente puede aceptar una señal de tiempo desde el servidor, pero no al contrario. El modo simétrico es parecido a las operaciones cliente/servidor, sin embargo, en él, la dirección de transmisión puede ser cambiada. Si el servidor de tiempo cae, el cliente original pasa a ser servidor y actúa como una fuente para


NTP • ADMINISTRACIÓN

otros equipos. En otras palabras, las máquinas son pares. La Figura 3 muestra un grupo de tres pares que sirven el tiempo de forma redundante. Este grupo se emplea como interfaz final para la recepción de clientes. Pero normalmente, sólo grandes redes harán bien utilizando el modo asimétrico y consultando a múltiples servidores de tiempo en Internet. Todos los servidores retransmiten en el tercer modo NTP. Cada servidor retransmite un paquete vivo y le dice a los clientes la IP para enviar su petición NTP; esto guarda la configuración manual.

El Servicio Muchos sistemas Linux y Unix incluyen ntpd, el cual utiliza el fichero de configuración /etc/ntp.conf. En el caso más simple, que es lo típico en la mayoría de los sistemas Linux, este fichero tiene el nombre o la dirección IP del servidor de referencia. Para eliminar la necesidad de actualizar los servidores NTP continuamente que sus clientes utilizan como fuente de tiempo, el proyecto NTP en [2] ejecuta un alias DNS denominado pool.ntp.org. Resuelve un grupo de servidores públicos. El Listado 1 muestra cómo puede ser de simple la configuración. El servicio sólo escoge una de las tres direcciones IP que el ntpd extrae del fichero. Los ordenadores deberían poner el tiempo lo antes posible en el proceso de arranque, incluso si no tienen un demonio local NTP. El comando ntpd-q se encarga temporalmente de esto lanzando al servidor NTP para conseguir el tiempo correcto. Luego el programa sale automáticamente. Muchas distribuciones usan este método en sus procesos de arranque. La llamada ntpdate proporciona resultados similares, pero esta herramienta no posee toda la delicadeza de que dispone su hermano mayor. El

Listado 1: Un típico /etc/ ntp.conf 01 server pool.ntp.org 02 server pool.ntp.org 03 server pool.ntp.org 04 restrict default kod notrap nomodify nopeer noquery

Figura 1: El Physikalisch-Technische Bundesanstalt en Brunswick, Alemania, tiene unos cuantos relojes atómicos. Los relojes son exactos aproximadamente de uno a tres billones de segundos por día, es decir, sobre un millón de segundos por año. Los ordenadores en Internet pueden usar estos relojes como fuentes de tiempo.

comando generalmente se considera anticuado, aunque aún se utiliza con relativa frecuencia.

Tiempo de Problemas En la sincronización del tiempo pueden ocurrir varios problemas. Para evitarlos ntpd tiene diversos trucos. Si el ordenador tiene el tiempo equivocado, el programa necesita impedir la sincronización rápidamente. Por ejemplo, si una tarea programada se estuviera ejecutando y ntpd decide retrasar el reloj, esta tarea programada se ejecutará de nuevo. El servicio necesita asegurar la continuidad, proporcionando incrementos lineales de tiempo sin saltos hacia adelante o hacia atrás. Para conseguirlo, establece el reloj en pasos pequeños, para ser más preciso, incrementa o decrementa el tiempo del sistema un segundo por medio millón de segundos por segundo, o un 0,05 por ciento. Y continúa haciéndolo hasta que el ordenador se encuentre sincronizado. Utilizando esta aproximación, corregir el tiempo para un solo segundo cuesta 2000 segundos (esto es, más de media hora). Para establecer el tiempo correcto tan pronto como sea posible, ntpd recurre a unos acuerdos. Si nota una desviación de más de 128 milisegundos, da saltos para configurar el

WWW.LINUX-MAGAZINE.ES

tiempo de una vez. Luego utiliza la solución de rotación normal para poner a punto el tiempo por ajustes de milisegundos.

Fuentes de Tiempo Incorrectas Si tiene varios servidores en Internet como fuentes de tiempo, necesita algún tipo de protección contra los tiempos erróneos. Un cliente NTP resuelve este problema comparando múltiples servidores de tiempo, y averigua cual de estos servidores es el más cercano al UTC. Además, sincroniza con uno de estos servidores. Es decir, el mejor algoritmo para esta tarea puede devolver resultados erróneos alguna vez, como ocurre, por ejemplo, si varios servidores están negociando. Hay un plan de contingencia para dominar esta situación: si el servicio NTP nota un cierto grado de inexactitud (más de 1000 segundos por ausencia), no corregirá el tiempo. NTP puede manejar situaciones donde la conexión de red o el servidor de tiempo configurado están caídos. En este caso, el demonio mide la precisión del sistema, cronometra y corrige el tiempo basado en sus conclusiones, incluso si un tiempo de referencia no está temporalmente disponible.

Número 13

67


ADMINISTRACIÓN • NTP

necesita una solución para este problema, puede habilitar el filtro añadiendo el siguiente comando tinker huffpuff 7200 a /etc/ntp.conf. Los clientes que se conectan a una red esperan trabajar sin mucho esfuerzo de configuración, sería preferible utilizar la configuración automática de NTP. Figura 2: Una red NTP se organiza de forma jerárquica en varios Existen varias soluniveles. Las fuentes de tiempo como los relojes atómicos se encuenciones para esta tran en el nivel 0; los equipos que hacen referencia a este tipo de configuración autorelojes directamente residen en el nivel 1. Por turnos, los ordenadomática. La alternares con una señal horaria exacta se encuentran en el nivel 2. tiva menos flexible es la adoptada por Apple en sus ordenadores Mac. Si la Conexiones Lentas administración permite el servicio NTP, Otro problema potencial es la variación éste usa un servidor fijo por defecto. de la latencia de las conexiones en la La colección de servidores de tiempo conexión del servidor NTP. Una conedel proyecto NTP es una alternativa xión ISDN o DSL sin una carga pesada mucho más sensible y más simple. La tiene una latencia de unos cuantos miles versión 4 además apoya la configurade milisegundos, pero si una subida alta ción autónoma con el demonio utilizano una descarga están en progreso sobre do muchas identidades para preguntar a esta conexión, dicha latencia puede los ordenadores de la red y encontrar aumentar rápidamente a múltiples automáticamente el servidor NTP aprosegundos en una u otra dirección. Como piado. el servidor NTP no tiene ningún modo Seguridad de averiguar variaciones de latencia, puede poner el reloj del sistema en la Los administradores siempre andan presucesión rápida. ocupados por la seguridad de la red y ntpd tiene un filtro especial para más aún en el caso de NTP. Básicamente manejar esta clase de situación, aunque hay dos tipos distintos de ataques: denhabitualmente no esté habilitado. Si tro o fuera del protocolo. Trabajando con el protocolo, un atacante puede suplantar una señal de tiempo incorrecta para cubrir las entradas de los registros o incluso lanzar un ataque de denegación de servicio. Los administradores añadirán entradas Figura 3: Los tres servidores NTP (a la izquierda) están ejecutando en restrict al fichero modo simétrico y actúan de forma redundante. El cliente (a la derede configuración cha) simplemente busca uno de los servidores para obtener el tiempo simplemente para correcto.

68

Número 13

WWW.LINUX-MAGAZINE.ES

proteger al host (ver Listado 1). La única protección contra señales de tiempo incorrectas es la criptografía. ntpd proporciona varias opciones [3]. Como ntpd normalmente se ejecuta como el usuario con ID 0 (root), puede ser un destino potencial. Un buffer overflow sería todo lo necesario para obtener el control del sistema. La única solución es utilizar la opción ntpd -q, esto es, utilizar una tarea programada para estar seguros de que el programa no está permanentemente ejecutándose.

Alternativas para NTP NTP puede proporcionarle el tiempo de manera precisa, y el servicio es fácil de manejar. Sin embargo, hay un número de herramientas alternativas con funcionalidades similares. Una herramienta denominada RDate, por ejemplo, utiliza el protocolo de tiempo que se estandarizó en el RFC 868 [4]. RDate utiliza TCP o UDP en el puerto 37. RDate siempre emplea un valor binario para el tiempo del sistema en vez de un formato legible. Junto al formato RDate legible por el ordenador, se encuentra también el protocolo Daytime (RFC 867 [5]), que utiliza TCP o UDP en el puerto 13 para transferir una cadena de tiempo. Este formato es muy útil para los errores y las depuraciones. Tanto con Rdate como con Daytime debe dejar abiertos los puertos en el cortafuegos. Si abrir los puertos no es una de sus opciones, su única alternativa es utilizar un puerto no bloqueado. El programa HTPDate [6] se conecta a un servidor HTTP o HTTPS y coge el tiempo enviado por el servidor en su respuesta HTTP como referencia de tiempo. Pero si planea utilizar HTPDate, necesitará asegurarse de que está ■ utilizando un servidor de confianza.

RECURSOS [1] Página web de los Servidores NTP: http:// ntp.isc.org/ bin/ view/ Servers/ WebHome [2] Proyecto NTP: http://www.ntp.org [3] Soporte de Autenticación de NTP: http://www.eecis.udel.edu/~mills/ntp/ html/authopt.html [4] RFC 868 – Protocolo de tiempo: http:// www.faqs.org/rfcs/rfc868.html [5] RFC 867 – Daytime: http://www.faqs. org/rfcs/rfc867.html [6] HTPDate: http://www.clevervest.com/ htp/


Seguridad Web • ADMINISTRACIÓN

Estudio sobre Programación Segura para Administradores

ENTRADAS PELIGROSAS Como una manzana envenenada, un programa Web que aparentemente tiene un aspecto sabroso puede, sin embargo, encerrar un interior muy peligroso. Aquellos administradores que cubren ellos mismos sus necesidades de programación, deben seguir las prácticas de programación segura para evitar el amargo sabor del malware. POR DOMINIK VOGT

E

ste artículo describe algunas clases de entradas de datos de programas que los administradores encargados de mantener un sitio Web deben tener en cuenta. Presentaré algunos casos de estudio que mostrará los problemas y las posibles soluciones a los scripts, a las direcciones de email maliciosas y los desbordamiento de buffers.

Como punto de partida, los desarrolladores deben validar cuidadosamente todas las entradas y sus relaciones entre varios tipos de entradas. Supongamos que todas las entradas son culpables hasta que se demuestre lo contrario. Y que cuanto más compleja sea ésta, más importante será la codificación de la misma para anticiparse a los posibles ataques. En

el caso de problemas complejos, se corre la tentación de pasar de ellos, dejando de lado la validación de la entrada de los programas (“¡Los chicos de desarrollo habrán hecho sus deberes!”). Desafortunadamente, a menudo se da el caso de que todos los que están involucrados en el proceso piensan de igual forma y el agujero de seguridad permanece abierto. Cada administrador y cada programador debería escuchar su conciencia de vez en cuando y recordar que su salida puede ser la entrada de un programa en algún punto de la cadena.

Caso 1: Los Scripts Multiplataformas El desarrollo de sitios web probablemente no sea una de las tareas clásicas de los administradores. Pero en las pequeñas y medianas empresas, es habitual encontrarse al administrador enfrascdo en el desarrollo de un sitio web público. Los administradores de sistemas que no han sido formados como programadores puede que subestimen los peligros que entrañan estos temas. Uno de los mayores peligros es una clase especial de entrada: Texto formateado en HTML (o texto formateado en cualquier otro lenguaje Web). Una fachada aparentemente inocente puede contener código Javascript malévolo. El objetivo real del atacante no es el servidor web que almacena el documento, sino el navegador web del cliente que lo abre. En un ataque de tipo script multiplataforma, el script dañino se ejecuta en la máquina de la víctima cuando el internauta se encuentra navegando por un sitio diferente. El script se ejecuta en el contexto y con los privilegios del sitio donde el

WWW.LINUX-MAGAZINE.ES

Número 13

69


ADMINISTRACIÓN • Seguridad Web

Figura 1: El atacante inyecta un script dañino en un foro (1) y el servidor almacena la entrada (2). Un poco más tarde, un usuario visitará el foro (3); el servidor pone el marco de trabajo (4a) y la entrada de la base de datos juntas (4b) y sirve la página al visitante (5). Por último, el navegador ejecuta el script.

navegador está actualmente conectado (Figura 1).

Un Libro de Visitas poco Amistoso En un simple libro de visitas, los usuarios pueden escribir entradas que posteriormente se publican en el sitio web. Si la gente que está encargada del sitio permite entradas arbitrarias, un hacker podría ocultar un script en su entrada que abra una ventana con un anuncio en el navegador de un visitante: Nice page. Good work! <!-- <script> window.open U ("http://debian.org/"); </script> -->

Esto puede que parezca que no es muy dañino, pero dependiendo del sitio web, los atacantes podrían sacarse algo más peligroso de la manga. Por ejemplo, podrían robar cookies con identificadores de sesiones y asumir la identidad del usuario o bien usar sitios webs falsos para robar las contraseñas de los usuarios (phishing). Los daños pueden ser realmente graves en páginas que tengan algo que ver con dinero: bancos y casinos online, por poner

algún ejemplo. El Libro de Recetas de la Programación Segura dedica un capítulo entero a este asunto y proporciona numerosos ejemplos. Lo que permite que los script multiplataformas funcionen es la falta de validación de la entrada de datos de los usuarios. Los desarrolladores webs a menudo sobrestiman la importancia de este problema, porque a nadie se le ocurre atacar a su propio servidor. El servidor web es el intermediario que pasa el exploit al usuario. Lo mismo sucede con los ataques de autenticación multiplataforma. (Véase el artículo de este mismo número denominado “Un pez llamado Phishing”).

Contramedidas Los scripts multiplataformas podrían extenderse, pero es bastante sencillo combatirlos. Una aplicación segura primero eliminaría cualquier script de sus entradas o simplemente la rechazaría. Si está tratando con HTML, cualquier script estará entre etiquetas de formato, es decir, entre los símbolos <…>. Una solución brutal pero efectiva sería convertir los metacaracteres en código HTML inofensivo antes de continuar procesando (Véase la Tabla 1).

Pero si se desea permitir a sus visitantes introducir etiquetas simples, la cosa se complica. El código Javascript puede esconderse casi en cualquier parte, en las etiquetas <img…>, <div…> o <body…>, por ejemplo. En [1] puede encontrar varios ejemplos. Las listas negras no son una buena opción, aunque las listas blancas podrían mostrarse más efectivas. La idea que se esconde detrás de las listas blancas es la de dejar las etiquetas HTML que se saben que son inofensivas y eliminar cualquier otra cosa que sea susceptible de ser dañina, incluida cualquier etiqueta con atributos. Por ejemplo, las etiquetas de la Tabla 2 son inofensivas. Esta solución al problema de los scripts multiplataformas no le proporciona la suficiente libertad, probablemente desee pasar el problema a los desarrolladores o leer algunos libros sobre el tema [1] [2].

Filtrado de Etiquetas Una solución para C y C++: La biblioteca de The Gate Guardian [3] proporciona a los desarrolladores una forma sencilla para eliminar estos problemas. La función inputg_escape_html() escapa los metacaracteres HTML < > “ & como <, >, &quote;, y &, pero deja las etiquetas inofensivas como <h1> o <br> tal cual. Los enlaces libres de scripts como <a href=“http://Foo”> se dejan sin cambios. La llamada sería como la siguiente: #include <inputguardian.c> [...] char *escaped; escaped= U inputg_escape_html(input);

La función devuelve un puntero al documento HTML modificado, que apunta a una zona de memoria reservada mediante una llamada a malloc(), que el desarrollador tendrá que liberar con una llamada a la función free(escaped). La función devol-

Tabla 2: Script libre de Etiquetas HTML Tabla 1: Metacaracteres HTML Carácter < > & “

70

Codificado en HTML < > & "

Número 13

abbr blockquote del h1 hr nobr s sub

acronym br dfn h2 i ol samp sup

b center dir h3 ins p small tt

WWW.LINUX-MAGAZINE.ES

bdo cite dl h4 kbd plaintext spacer u

big code dt h5 li pre strike ul

blink dd em h6 menu q strong var


Seguridad Web • ADMINISTRACIÓN

do un cliente de correo o un servidor, puede ser que no se moleste validando las direcciones introducidas. ¡Hay que ser Paranoico! RFC 2822 [6] y sus predecesores definen con precisión cómo deben ser las direcciones. El nuevo estándar estipula que los programas de correo deben ser Figura 2a: El Scbuilder UI es una interfaz para capaces de procesar los forLibshellcode. Gracias al UI, cualquiera puede crear un matos antiguos. El propósito código para la shell rápido y elegante para cualquier tipo es soportar el uso de los prode aplicación. gramas antiguos. Un hecho poco conocido es el de que verá un puntero nulo si se olvida de reserlas direcciones pueden incluir comentavar espacio en memoria. rios anidados.

Baile de Máscaras

Una Solución Radical

La variante input_escape_all_html() convierte todos los meta-caracteres HTML a código inofensivo sin ninguna excepción. inputg_escape_html_with_tag_table() permite a los usuarios definir la lista de etiquetas permitidas por ellos mismos. Hay que tener cuidado, aunque las funciones Gate Guardian son tomadas desde spc_escape_html() del Libro de Recetas de la Programación Segura [4], el original está, desafortunadamente, repleto de errores. Como un remedio al código con errores, puede que desee usar mi archivo que contiene una versión corregida en [5]. Una nueva versión libre de errores apareció cuando se imprimió la tercera parte, así que posiblemente desee descargarse la última versión. Una solución para la shell: la más sencilla es un pequeño envoltorio que hace uso de las funciones de Gate Guardian. Los administradores pueden llamar al programa escape-html del Listado 1 de la siguiente forma ESCAPED=‘escaped-html “$INPUT”‘ desde sus propios scripts de la shell.

En la mayoría de los casos, los programadores de la shell pueden resolver este problema con una solución radical. Todo lo que coincida con el patrón Nombre@Dominio se acepta, cualquier otra cosa no. También se puede restringir el conjunto de caracteres válidos para el nombre y para el dominio y se puede llamar a egrep para guardarnos las espaldas:

Caso 2: Direcciones de Email Los scripts y programas de administración a menudo esperan entradas con el formato de una dirección de correo electrónico. Los administradores suelen especificar las direcciones ellos mismos, por ejemplo, si necesitan un script que les proporcione las ultimas actualizaciones. En otros casos, los usuarios especifican las direcciones de correo, como en un formulario de informe de errores, por ejemplo. A menos que esté desarrollan-

echo "$ADDR" | U egrep '^[a-zA-Z0-9_+-.]+?? @[a-zA-Z0-9-]+ U (\.[a-zA-Z0-9-]+)*$' || ?? exit 1

Si esta solución carece de la clase de elegancia a la que está acostumbrado, puede consultar el libro de expresiones regulares de Jeffrey Regex llamado Mastering Regular Expressions [7] para una expresión regular elegante que cubra por completo el RFC, con la excepción de los comentarios anidados.

Listado 1: escape-html.c 01 #include "inputguardian.c" 02 #include <stdio.h> 03 04 int main(int argc, char **argv) 05 { 06 char *ret = inputg_escape_html(argv[1]); 07 if (ret != 0) 08 printf("%s", ret); 09 return !ret; 10 }

WWW.LINUX-MAGAZINE.ES

Se encuentra disponible en [8] un programa Perl que use esta expresión para validar las direcciones de correo. Es bastante sencillo de usar: perl email-opt.pl U "$ADDR" >/dev/null || exit 1

Una buena solución para los programadores de C y C++ es usar la función de Gate Guardian inputg_is_simple_email_address() para implementar un test egrep en C: #include <inputguardian.c> [...] int rc; rc = U inputg_is_simple_email_address U (addr) if (rc == 0) exit(1);

No es una buena idea intentar implementar el programa Perl en C o C++, porque el análisis sintáctico complejo suele llevar a errores o efectos colaterales no deseados. La mejor idea ante esta situación sería usar un parser ya preparado o bien hacer una llamada externa al script Perl.

Caso 3: Desbordamiento de Buffers Los desbordamientos de buffers están estrechamente ligados a las cadenas formateadas y a su tamaño. En ambos casos, la pila es el principal (pero no el único) objetivo de los hackers. Un desbordamiento de buffer sucede cuando un programa intenta escribir datos en una zona de memoria (buffer) que es demasiado pequeña para almacenar esos datos. Este intento lleva al programa a sobrescribir direcciones de memoria que han sido reservadas para otras tareas.

Código Shell Las cosas empiezan a ponerse feas cuando nuestro hacker, Fred, inyecta código ejecutable en el buffer. El código típicamente ejecuta una shell: execve(“/bin/sh”,0,0);, permitiendo a Fred hacerse con la cuenta del usuario. Es relativamente fácil escribir código para la shell, pero los script kids raramente lo hacen. En vez de ello, utilizan bibliotecas como Libshellcode. La biblioteca suele venir con una pequeña interfaz de usuario Ncurses titulada Scbuilder (Figura 2a y 2b).

Número 13

71


ADMINISTRACIÓN • Seguridad Web

Ataques a la lógica del programa son más sutiles y muy difíciles de impedir; como ejemplo, Fred podría intentar sobrescribir otras variables locales almacenadas en direcciones de memoria superiores. En nuestro ejemplo, esto significaría sobrescribir la variable len o las variables usadas por la función invocada. En escenarios reales, los hackers se las arreglan para hacerse con sistemas remotos simplemente sobrescribiendo variables que contienen el UID de un programa que pretende eliminar los privilegios cambiados. Para más detalles sobre los desbordamientos de buffers véase [9].

abs_path. Funciona porque el buffer es lo suficientemente grande. Pero en la línea 10, strcat() falla al comprobar si el buffer está lleno y podría continuar escribiendo fuera del buffer. Una ruta mayor que PATH_MAX es otra fuente de peligro (dependiendo del sistema de ficheros). El programa debería detectar este error (valor de retorno de ERANGE) y manejar esta situación de modo satisfactorio.

Roots

Los programadores de C y C++ deben usar memoria dinámica para asegurarse de que tienen suficiente memoria disponible o bien deben restringir la longitud de la entrada a la cantidad de espacio disponible. Esta última solución es a menudo preferible para programas pequeños, ya que es más fácil de implementar. La Tabla 3 muestra las variantes seguras de algunas funciones de la biblioteca estándar. Los desarrolladores de C++ deberían evitar las funciones vulnerables y usar la clase de cadenas std::string, así como los operadores << y >>.

Los desbordamientos de memoria siempre implican la lectura, escritura y copiado de datos por parte del código del programa. El código fuente de C normalmente tiene funciones de cadena (strcat(), strcpy(),…), una función para entrada y salida formateada (sprintf(), scanf(),…), una función para acceso a ficheros (fread (), gets(),…) o aritmética de punteros. Una llamada a gets() es casi siempre una mala idea: el desarrollador no puede indicarle a la función cuanta memoria debe ser reservada. Dicho de otro modo, gets viene con un desbordamiento de buffer incorporado. Pero scanf(input,”%s”,buffer) no es mucho mejor: scanf almacena una cadena que la analiza en un buffer sin tener en cuenta el tamaño. La Tabla 3 presenta una solución mucho mejor. El Listado 2 muestra un error común en el manejo de los nombres de ficheros. La llamada a getcwd() en la línea 9 almacena el directorio de trabajo en la variable

Tabla 3: Evitar Desbordamientos de Memoria Incorrecto sprintf(buf, “%s”, str)

scanf(“%s”, str)

gets(buf) strcat(buf, str) strcpy(buf, str)

72

Número 13

Correcto sprintf(buf, “%99s”, str) or snprintf(buf, 100, “%s”, str) scanf(“%99s”, str)está disponible en [8] fgets(buf, 100, stdin) strncat(buf, str, 99) strncpy(buf, str, 99); buf[99] = 0;

¡Dándole Forma!

Figura 2b: Si es necesario, Scbuilder puede almacenar el código shell resultante como el código de un programa C. El administrador no podrá aceptar excusas del tipo “la vulnerabilidad es difícil de explotar” por los overflows.

Manteniéndolo Simple. La diversidad y complejidad de los problemas descritos aquí deberían haberle proporcionado alguna idea de la dificultad que entraña separar el código inofensivo de ese otro peligroso de las entradas. El problema de la programación segura trae a la mente un antiguo dicho que a menudo citan los administradores y los desarrolladores de software: Manténgalo simple.

Listado 2: path_max.c 01 02 03 04 05 06 07 08 09 10 11 12 13 14

#include <limits.h> #include <string.h> #include <unistd.h> int main(void) { char abs_path[PATH_MAX]; getcwd(abs_path, PATH_MAX); strcat(abs_path, "/filename"); /* ... */ return 0; }

WWW.LINUX-MAGAZINE.ES

Los programadores ocasionales normalmente no disponen del tiempo suficiente para profundizar en los formatos y sus complejidades. Si este es su caso, debería permitir un subconjunto de las entradas y descartar el resto. Las estrategias descritas en este artículo proporcionan un punto de inicio para empezar a escribir código seguro y sensible. Siempre hay que proteger la entrada del programa y asegurarse de colocar las manzanas podridas donde deben estar: en ■ el cubo de la basura.

RECURSOS [1] David A. Wheeler, “Secure Programs HOWTO”: http://www.dwheeler. com/ secure-programs/ [2] Sverre H. Huseby, Código Inocente: Wiley, ISBN 0-470-85744-7 [3] Dominik Vogt, Gate Guardian: http:// sourceforge. net/projects/ gateguardian/ [4] Viega y Messier, Secure Programming Cookbook, O’Reilly, ISBN 0-59600394-3: http://www. secureprogramming.com [5] Libro de Recetas de la Programación Segura: http://www.dominikvogt.de/ de/index.html#Links (en Alemán) [6] RFC 2822, “Internet Message Format”: http://www.ietf.org/rfc/ rfc2822.txt [7] Jeffrey E. F. Friedl, Mastering Regular Expressions, O’Reilly, ISBN 0-59600289-0: http://www.oreilly.com/ catalog/regex2/ [8] Sample scripts from the regex book: http://examples.oreilly.com/regex/ [9] Aleph One, “Smashing The Stack For Fun And Profit”, Phrack Vol. 7, Issue 49, File 14: http://www.phrack.org/ show.php?p=49&a=14


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 nuevas y apasionantes aplicaciones.

KBarcode

74

¿Tienes problemas con la creación de las etiquetas de los precios de tu papelería, con la de las tarjetas postales o con los códigos de identificación? Deja que KBarcode te eche una mano.

Desktopia

76

Si estás buscando escritorio rápido y funcional, prueba con WindowLab. Este administrador de ventanas minimalista se concentra en lo que es importante y funciona sin pitos ni flautas superfluos.

F-Spot

78

El programa de administración de imagen F-Spot te ayuda a administrar tu archivo de fotos eficazmente y sin ningún tipo de pérdida de tiempo.

ZShell

81

La moderna Z-Shell con sus inumerables y útiles características ofrece a los fans de la línea de comandos una atractiva alternativa a Bash.

Educación

85

E-learning, teleformación, plataformas educativas… son palabras y conceptos de moda, que parece que van a acabar con las formas tradicionales de enseñanza y aprendizaje.

Línea de Comandos

89

El comando ls lista ficheros en la línea de comandos además de ofrecer una lista detallada de las propiedades del fichero de gran utilidad.

WWW.LINUX- MAGAZINE.COM

ISSUE 52 MARCH 2005

73


LINUX USER • KBarcode

Impresión de Etiquetas con KBarcode

BARRA FIJA

Tras completar la instalación, simplemente escribe en una ventana del terminal kbarcode, de este modo arrancará el protu papelería, con la de las tarjetas postales o con los códigos de idengrama. La primera vez que lo arranques, tificación? Deja que KBarcode te eche una mano. te presentará una vista de programas de código de barras que ha descubierto y POR FRANK WIEDUWILT ofrece establecer la conexión a una base de datos (Figura 1). l programa KBarcode [1] no sólo te grama correrá bastante bien sin una base Introduce las credenciales para un usuaayuda a diseñar etiquetas de distinde datos de fondo. rio de la base de datos con privilegios de tos tamaños y formas, sino que creación de tablas en los campos Instalación también puede generar e imprimir código Username y Password. Si el usuario no de barras para facturación y tasación de Para instalar la versión actual de KBarcode tiene los privilegios requeridos, KBarcode precios. Y si lo deseas, el programa recunecesitas tanto el código fuente de la aplise detendrá y mostrará un mensaje de perará datos del artículo y del cliente cación como el programa que genera el error cuando chequee la conexión a la desde el servidor MySQL. código de barras. Barcode GNU, que se base de datos. El programa automáticaLa versión actual de KBarcode, 1.8.1, encuentra disponible en [2], es un programente introducirá kbarcode en Database. necesita un entorno de trabajo KDE, verma libre que generará la mayoría de los Esta es la base de datos que usa KBarcode. sión 3.3 ó superior, así como el driver Qt principales tipos de códigos de barras. Lo Selecciona el driver de la base de datos SQL. Para la impresión ocasional de etiprimero que tienes que hacer es instalar MySQL de la lista Driver. La opción quetas, etiquetas de DVD o tarjetas de visieste programa, en nuestro ejemplo será correcta es QMYSQL3. También conviene ta no es necesario un servidor SQL. El proBarcode GNU. marcar la caja Autoconnect on program El paso siguiente consiste start para decirle a KBarcode en la instalación del prograque conecte automáticamenma en sí: los usuarios con te a la base de datos cuando Suse Linux 9.1 y KDE 3.2 arranque. La otra alternativa descubrirán paquetes RPM es seleccionar la entrada listos para correr en la págiSettings | Database connecna de inicio. Como root, tion. introduce el comando rmp Figura 2: La ventana Para conectarte a la base de -Uvh kbarcode-1.8.0principal de KBarcode datos y correr unas cuantas 1SuSE91. Para instalar el posee cuatro botones. pruebas, haz click en Test setpaquete será i586.rpm. Si tings. Desafortunadamente, usas cualquier otra distribución necesitacuando consultamos el programa para rás preparar el programa desde el código hablar con el servidor de la base de datos, fuente. La instalación sigue los mismos la presentación resultó ser muy inestable. pasos que la de Barcode GNU, pero el Tuvimos que repetir el test cuatro veces Figura 1: La conexión a la base de datos MySQL archivo de código fuente, en este caso, se hasta completarlo. Un error reproducible queda establecida cuando arranca el programa llama 1.8.1.tar.gz. ocurrió en otros tres ordenadores. por primera vez.

¿Tienes problemas con la creación de las etiquetas de los precios de

E

74

Número 13

WWW.LINUX- MAGAZINE.ES


KBarcode • LINUX USER

database field para añadir informaselecciona la información del cliente ción desde tu base de datos a la etirequerida para Customer name and no. A queta. Los campos de la base de continuación puedes hacer click en Edit datos pueden ser formateados y alipara que aparezca un diálogo en el que neados como campos de texto. La puedas seleccionar la información del artíherramienta Insert System Field te culo requerida. permite añadir campos con valores Usa el campo Number of Labels para de fecha y hora. Existen varios forintroducir el número de etiquetas que Figura 3: Uso del Editor de Etiquetas para el rápido matos disponibles. imprimirás para este artículo. Especifica el formateo de etiquetas. Para añadir un código de barras artículo en la lista Article. El campo Group único a la etiqueta, primero haz te permite introducir una tecla para la Si todo va bien, KBarcode te invitará a click en Insert Barcode, para que aparezca impresión de grupos de etiquetas. Esto que establezcas las tablas requeridas en la el Editor Barcode. Aquí es donde diseñas podría serte útil si deseas enviar un deterbase de datos y que la puebles con datos el formato del código de barras y el conteminado número de artículos a un cliente de ejemplo. Cuando el programa haya nido. Desafortunadamente, el generador específico, por ejemplo. Si haces click en finalizado, te volverá a presentar la ventadel código de barras también resultó ser Add, cierras el diálogo y se añade el artícuna principal de KBarcode (Figura 2). muy inestable. lo a la lista. Puedes cambiar las configuraciones de la La selección de los formatos de código Conclusiones base de datos después seleccionando de barras depende del programa que Settings | Start configuration wizard. hayas instalado. Puedes usar la lista KBarcode no ofrece ayuda on-line. El Necesitas de un programa externo como Rotation para rotar el código de barras 90 manual formateado en PDF es una útil grados. Si el valor que has introducido no PHPMyAdmin [3] para administrar los guía para correr el programa, aunque es válido, el programa predatos de artículos y clientes y para modifialgunas de las pantallas mossentará un mensaje de error. car los registros de la base de datos. tradas parecen estar en aleEn teoría, podrías colocar el KBarcode no dispone de una herramienta mán. Este manual corresponcódigo de barras en cualcon la que poder ayudarte para hacer esto. de a la versión 1.4 del prograquier parte de la etiqueta ma, la cual está bien, adeEtiqueta Nº1 que desees, pero nuestras más, ha cambiado muy Para crear una etiqueta haz click en Label pruebas revelaron que el poco, a excepción de la Editor… en la ventana principal. KBarcode programa presentaba algumanera en la que se encuencarga toda la información de formateo nas dificultades cuando tran organizados algunos eleconocida, momento en el que puedes eleinsertaba códigos de barras mentos de diálogo. gir la etiqueta referida. rotados. De hecho, falló El software es útil para El programa soporta una amplia seleccuando intentamos insertar etiquetado por lotes y para ción de formatos de etiqueta. Si la que tú un código de barras rotado la impresión de código de necesitas no se encuentra, simplemente desde 90 a 270 grados. Figura 4: KBarcode disbarras. La interfaz es ordehaz click en Add own label definition para pone de una útil selección nada y limpia, ofreciendo a Correo Masivo que aparezca la ventana Add Label de herramientas para el los usuarios un fácil acceso Definition. Para una etiqueta individual diseño de etiquetas. a las funciones del prograCuando selecciones o añadas un formauna base de datos es excesima. to de etiqueta, aparece en la pantalla el vo. Pero si necesitas imprimir etiquetas en Lo malo es que llega a ser inestable en editor de etiquetas Label Editor (Figura 3). lote, entonces lo que se requiere es una según qué partes, existiendo el riesgo de Éste es una especie de programa de dibujo base de datos con datos de clientes. pérdida de datos, lo cual desvirtua una que dispone de herramientas estándar Probablemente establezcas la base de buena impresión general. En este para abrir, almacenar e imprimir etiquedatos cuando arranques el programa por momento los desarrolladores están tratas, además de una caja de herramientas vez primera. De lo contrario, selecciona bajando en una nueva versión que prode formateo. La figura 4 nos muestra lo Settings | Start Configuration | Wizard, y mete mejoras, especialmente en lo que a ■ que hacen los botones individuales. luego especifica las configuraciones para la impresión por lotes se refiere. Para posicionar un objeto en una etiquetu conexión al servidor MySQL. ta, selecciona el objeto en la caja de herraPara la impresión por lotes, haz click en RECURSOS mienta y haz click en la posición sobre la el botón en la ventana principal para que [1] Página de inicio de KBarcode: http:// etiqueta donde desees insertar el elemenaparezca el diálogo Batch Printing y luego www.kbarcode.net. to. Con un doble click sobre el objeto se conecta las etiquetas que has diseñado o [2] Barcode GNU: http://prdownloads. abre el cuadro de diálogo, donde puedes selecciona en Label Editor con la base de sourceforge.net/kbarcode/barcode-0. modificar las propiedades del objeto. El datos de tus clientes. 98.tar.gz?download menú contextual te permite establecer la Introduce el nombre de una etiqueta [3] Página de inicio de posición de los objetos y ordenarlos. disponible en el campo Label. De este PHPMyAdmin:http://www. Si has establecido el acceso a la base de modo estarás insertando información de phpmyadmin.net. datos, puedes usar el elemento Insert tu base de datos en esta etiqueta. Luego

WWW.LINUX- MAGAZINE.ES

Número 13

75


LINUX USER • Desktopia

El escueto administrador de ventanas WindowLab

EQUIPO DE LABORATORIO Si estás buscando un escritorio rápido y funcional, prueba con WindowLab. Este administrador de ventanas minimalista se concentra en lo que es importante y funciona sin pitos ni flautas superfluos. POR HAGEN HÖPFNER

T

rabajar en un laboratorio significa que hay que mantenerse al tanto de todo. Una funcionalidad superflua puede producir resultados inconsistentes. WindowLab [1] (Figura 1) centra la atención en la función principal de un administrador de ventanas: la organización de ventanas de aplicaciones en el escritorio, evitando complicaciones innecesarias que puedan inducir a errores.

paquetes de desarrollo del GUI. Para Suse Linux 9.3 el paquete recibe el nombre de xorg-x11-devel. Para arrancar tu nuevo administrador de ventana una vez que te hayas identificado, necesitas añadir WindowLab al menú de selección de administrador. Si dispones de Suse Linux 9.3 y estás dispuesto utilizar WindowLab a menudo, todo lo que necesitas saber se encuentra en el cuadro titulado “WindowLab en Experimentos Preliminares Suse Linux 9.3”. Si lo que deseas es proWindowLab está basado en el código bar WindowLab, selecciona la sesión fuente aewm [2]. Puedes usar el archivo Failsafe en el menú KDM. Esta opción le de código fuente descargable desde la dice al menú de presentación que arranpágina de inicio del proyecto para crear el que el servidor X y una ventana de termiadministrador de ventanas. No necesitas nal. Luego puedes escribir en la ventana correr un programa de configure para windowlab para abrirlo. No notarás WindowLab. Pero sí el make y los comanmucha diferencia. El fondo de pantalla dos de su -c "make install" en el directorio será el mismo y no obtendrás un menú de de código fuente y copiar los ficheros del arranque o un icono de escritorio. Sin programa a directorios bajo /usr/local. En embargo, Windowlab añade un marco a cuanto al uso de recursos, el programa es la ventana terminal y coloca una barra de frugal y solamente necesitas gcc para tareas en el borde superior de la pantalla. crear el administrador junto con los La lista de ventana (Figura 2) presenta el título de la ventana así como tres botones en la parte derecha. De izquierda a derecha, puedes hacer click sobre los botones para iconizar la ventana, mover la ventana actual al fondo de pantalla o cerrarla. También se encuentran disponibles atajos de teclado para navegar a través de ventanas. [Alt] + [Q] mueve las ventaFigura 1: La configuración predeterminada de WindowLab es esparnas a un primer tértana y funcional. mino en el orden

76

Número 13

WWW.LINUX- MAGAZINE.ES

mostrado en la barra de tareas. [Alt] + [Tab] las cambia en la dirección opuesta. El atajo de teclado [Alt] + [F12] mueve la ventana activa al fondo de pantalla. [Alt]

WindowLab en Suse Linux 9.3 Para añadir WindowLab al menú de selección de KDM en Suse Linux 9.3, crea un fichero /opt/kde3/share/apps/ kdm/ses sions/windovwlab.desktop y cumpliméntalo con los siguientes contenidos: [Desktop Entry] Encoding=UTF-8 Type=XSession Exec=windowlab TryExec=windowlab Name=WindowLab Comment[es]=Mi WindowLab Para presentar una imagen de fondo de pantalla cuando se arranque el administrador de ventanas, puedes usar un programa como start_window-lab.sh. #!/bin/bash xv -quit -root /opt/kde3/shareU /wallpapersU /SuSE-Desktop_1024.png & windowlab Hazlo ejecutable y añade el path completo al programa de la entrada Exec=entry en tu fichero windowlab.desktop.


Desktopia • LINUX USER

Figura 2: La lista de ventanas de WindowLab ofrece a los usuarios las necesidades al descubierto.

+ [F11] cambia entre los modos de pantalla normal a pantalla completa. Haciendo click sobre el escritorio o sobre la barra de tareas con el botón derecho, lo convierte en un menú de inicio (Figura 3). El menú ofrece una entrada (Quit), otra entrada (About) y otro número de entradas para arrancar las aplicaciones. Para habilitar una entrada simplemente puedes soltar el botón derecho del ratón mientras éste permanece inmóvil sobre un ítem. La entrada Edit menu no te lleva a un diálogo de configuración basado en GUI, tal y como podrías esperar, sino a un editor de texto, que por defecto es gvim, y que puedes usar para editar el fichero de configuración de WindowLab. Hay algo con lo que debes tener cuidado cuando estás moviendo ventanas. Los marcos de éstas deben encontrarse completamente sobre el escritorio y no está permitido cubrir la barra de tareas. Esto hace imposible trasladar una ventana fuera del área del escritorio. Para escalar una ventana mantén la tecla [Alt] y haz click sobre el marco de la ventana. De este modo WindowLab no te muestra el contenido de la ventana, sino que simplemente presenta un estilizado marco de ventana. Luego puedes arrastrar el ratón para escalarla.

Configuraciones

XEmacs:xemacs significa que tu menú de comienzo tendrá una entrada para XEmacs después de rearrancar WindowLab y que dicha entrada arrancará el editor de texto. La entrada de menurc aparece en el extremos izquierdo del menú.

Más Trabajo de Laboratorio WindowLab sólo ofrece un escritorio por defecto. Si te gusta trabajar con escritorios virtuales, deberás añadir una herramineta externa tal como vdesk para que quede incluída esta funcionalidad. Puedes descargar este programa de la línea de comandos desde [3] y seguir el procedimiento normal para la creación: ./ configure && make && make install. La herramienta corre en el fondo, dando a los usuarios la impresión de que trabajan con escritorios virtuales. Para añadir cuatro escritorios virtuales a WindowLab, escribe las siguientes líneas en el fichero ~/.windowlab/menurc: Desk1:vdesk Desk2:vdesk Desk3:vdesk Desk4:vdesk

1 2 3 4

Después de rearrancar WindowLab, te presentará cuatro entradas de menú adicionales que puedes usar para moverte por los diferentes escritorios. Si además también quieres disponer de la posibilidad de mover las ventanas de la aplicación a otros directorios virtuales, puedes usar un programa para determinar el ID de una ventana interna y pasar el ID a vdesk. Primero añade las siguientes líneas a tu fichero menurc para crear los botones que te permitirán mover una ventana a uno de los cuatro escritorios:

Puedes usar el fichero de configuración de WindowLab para modificar el menú de arranque. Para evitar cambir las configuraciones para todos los usuarios, deberás crear primero un directorio ~/.windowlab y copiar la plantilla etc/X11/windoToDesk1:/path/to/to.sh 1 wlab/menurc a esta carpeta. Incluso si ToDesk2:/path/to/to.sh 2 nunca has editado un fichero de configuToDesk3:/path/to/to.sh 3 ración previamente, la creación de este ToDesk4:/path/to/to.sh 4 fichero menurc no debería plantearte demasiados problemas. Cada línea que no A continuación usa un editor de texto comienza con un signo (#) contiene una para crear un programa llamado to.sh con entrada de menú con la sintaxis general el siguiente contenido: elemento-menu: programa. elementomenu representa el texto que WindowLab #!/bin/bash presentará en el menú. El nombre del programa sigue a conFigura 3: La barra de tareas cambia a un menú de inicio cuando tinuación de los dos hacemos click con el botón derecho. puntos. Por ejemplo,

WWW.LINUX- MAGAZINE.ES

vdesk $1 `xwininfo | grep U "Window id:" | cut -d" " -f4`

y ejecuta el programa. Ahora, cuando selecciones una de las cuatro entradas de menú, el comando xwininfo | grep “Window id:” | cut -d” “ -f4 devolverá el ID de la ventana de una ventana que pulsaste. El programa pasa el ID a vdesk, el cual mueve luego la ventana a un escritorio que hayas elegido. Adicionalmente, vdesk puede insertar de manera opcional una ventana sobre todos los escritorios virtuales al mismo tiempo. Para presentar una ventana universal necesitas moverla al escritorio O. La entrada de menú debiera parecerse a algo así: Sticky:/path/to/to.sh 0

Un conjunto de herramientas externas te permiten añadir más funcionalidades. Para la presentación del fondo de pantalla podrías usar una herramienta como Esetroot o el visor de imagen xv. El comando xv -quit -root /pt/kde3/share/ wallpapers/SuSE-Desktop_1024.png que corre en Suse Linux 9.3, mejora el aspecto del escritorio con una imagen de fondo predeterminada. También puedes pintar el escritorio en un color único. Usando xsetroot: xsetroot-solid blue el escritorio quedará pintado de color azul.

Conclusiones WindowLab es un administrador de ventanas minimalista que combina la barra de tareas y el menú de inicio en un elemento único para ahorrar espacio. La herramienta es interesante para minimalistas así como para algunos usuarios interesados en personalizar sus propios entornos de escritorio de cliente. Claro que todos estos esfuerzos pueden tener efectos colaterales, tal y como demuestra el hecho de que no todas los programas funcionaron perfectamente con WindowLab. Por ejemplo, usar la barra de tareas para cambiar entre ventanas ■ realmente desconcierta a vdesk.

RECURSOS [1] WindowLab: http://www. nickgravgaard.com/windowlab/ [2] aewm: http://www.red-bean.com/ ~decklin/aewm/ [3] vdesk: http://offog.org/code/

Número 13

77


LINUX USER • F-Spot

El administrador de imagen F-Spot

ORGANIZADOR DE FOTOS El caos es inevitable cuando el disco duro se encuentra lleno de fotos digitales. El programa de administración de imagen F-Spot te ayuda a administrar tu archivo de fotos eficazmente y sin ningún tipo de pérdida de tiempo. POR MATTHIAS WARKUS

C

on la reciente popularidad que ha adquirido la fotografía digital, los discos duros tienden a encontrarse inundados de fotos. El problema con el almacenamiento de imágenes en un ordenador es encontrar la foto que necesitas en un período de tiempo razonable. La tradicional costumbre de guardar ficheros en un árbol de directorios es inútil si necesitas aplicar determinados criterios de clasificación. Aunque el árbol de directorios puede mantener una distribución por fecha y hora, no es posible clasificar las imágenes en categorías descriptivas como “trabajo”, “gente”, “placer” o “edificios”. F-Spot [1] puede llevar a cabo esta tarea y poner en orden tu colección personal de fotos. El proyecto fue iniciado en 2003 por el desarrollador de GNOME Ettore Perazzoli, que desafortunadamente falleció en Diciembre de ese mismo año. Ahora, es Larry Ewin (el tipo que diseñó el pingüino Tux) el que ha tomado el relevo.

Instalación y Primeros Pasos F-Spot cuenta con instalación basada en paquetes, con paquetes nativos para distribuciones como Debian, Fedora y Suse.

78

Número 13

Suse 9.3 incluso incluye F-Spot en los medios de instalación. Como fue escrito en C#, necesita de Mono [2] acompañado del intérprete del programa, mono, además de unos cuantos paquetes GNOME, varias bases de datos y algunas librerías gráficas. La compilación de F-Spot a partir de las fuentes no es una tarea fácil. Cuando arranca por primera vez, presenta un catálogo de imágenes completamente vacío, pero el programa ofrece un diálogo desde donde se pueden importar nuevas fotos para ayudarte en la tarea inicial. Luego puedes seleccionar un medio de almacenamiento adjunto o cualquier carpeta, como tu fuente de importación. Al mismo tiempo, también puedes definir categorías para las imágenes importadas. Haciendo click en OK, F-Spot buscará la carpeta especificada y, si contiene ficheros de imágenes, los cataloga. Puedes abrir la ventana de importación en cualquier momento después, usando el menú File.

Busca y Captura Tras importar unas cuantas imágenes, FSpot debería tener un poco más de colo-

WWW.LINUX- MAGAZINE.ES

rido, como muestra la Figura 1. Cuando haces click en una imagen se presentan algunos detalles, tales como el nombre, tamaño o la fecha. El campo nombre te permite renombrar las imágenes, aunque los desarrolladores aún no han implementado esta función. F-Spot recupera datos como el tiempo de exposición u orientación desde los ficheros de imágenes usando EXIF (un estándar para la transferencia de metadatos específicos de imagen entre los ficheros). Los campos EXIF se presentan en un cuadro de diálogo. Existen dos modos de organizar la jungla de imágenes: por un lado puedes usar las etiquetas en la lista que se muestra en la parte superior izquierda de la ventana de F-Spot. Además de las etiquetas especiales Favorites y Hidden, existen cuatro categorías predefinidas: People, Places, Events y Other. Para añadir nuevas etiquetas o para especificar una nueva categoría, puedes usar o bien el menú contextual, o bien la entrada Tags. Arrastrando una etiqueta o una categoría a un dibujo, asigna la imagen a la etiqueta. También puedes hacer uso del menú



LINUX USER • F-Spot

muestra a primera vista un índice de tiempo con marcas de años y meses. Puedes usar las flechas para listar los segmentos visibles. Una barra encima del segmento para un mes específico, te dice que las imágenes de ese mes existen en el catálogo actual, quedando Figura 1: F-Spot ofrece una visión de las imágenes almacenadas. reflejado el número de imágenes contextual para administrar las etiquetas mediante el tamaño de la barra. Si luego seleccionando Add tag o Remove tag. pulsas el deslizador hasta un punto espeCuando habilitas una caja de comprobacífico en el tiempo, el índice salta a la ción en la lista categoría, F-Spot presenta imagen más cercana a dicho punto. las imágenes de esa categoría. Si se habiliPuedes usar las manecillas para mover tan en el índice múltiples cajas de comprolos umbrales de los datos superiores e bación, entonces presentará las imágenes inferiores para restringir el índice a un con una de esas etiquetas, pero no la período específico. intersección de las selecciones. Cabe preSi seleccionamos Folder view, F-Spot cambia la escala temporal a una escala de directorio. Esta opción puede ser muy útil si clasificas las imágenes en Figura 2: Deslizador temporal. carpetas antes de importarlas. De lo contrario, los beneficios guntarse si esta característica es útil. que aporta la extensión de un árbol de Seleccionando Edit tag en el menú contexdirectorios en una escala lineal serían tual (o Tags | Edit selected tags…) abre más que debatibles. una ventana donde puedes cambiar la Profundizando… asignación de la categoría de una etiqueta. Un control de deslizamiento de los Después de encontrar la imagen que estaíndices permite a los usuarios un acceso bas buscando, haz doble click en ella para rápido a las imágenes, sin necesidad de visionarla ampliada desplazable, tal y que tengan que establecer categorías de como muestra la Figura 3. Los botones imágenes primero (Figura 2). Esta herrapara características típicas, como rotar a mienta, la cual es bastante curiosa, la izquierda o a la derecha, o mover imágenes retrato a paisajes, se encuentran disponibles en el índice. Adicionalmente, en modo zoom puedes usar la herramienta marco para seleccionar un detalle o eliminar los ojos rojos de un retrato. También hay una lista de aspectos proporcionados que permiten cortar imágenes para adaptarlas a un formato de página específico. La paleta incluye un histograma de color y una herramienta Figura 3: Vista aumentada. de enfoque suave.

80

Número 13

WWW.LINUX- MAGAZINE.ES

Cuando un usuario elige editar una imagen, F-Spot crea siempre una nueva versión de ésta para prevenir que se dañe la original. Si algo va mal, los usuarios pueden seleccionar Original en el menú Version para restaurar la imagen original. El programa también dispone de herramientas para seleccionar la imagen actual como fondo de escritorio, un modo de presentación a pantalla completa y un modo slideshow. La función de impresión que usa Gnome para crear copias impresas permite imprimir las imágenes cuando nos sean necesarias. El menú Export ofrece más funciones para clasificar y editar imágenes. Además de copiarlas en diferentes directorios, también soporta el servicio de compartición Flickr [3] y permite a los usuarios crear y subir galerías HTML. Así mismo, pueden copiar sus colecciones en CDs o en DVDs usando el interfaz de copia GNOME.

Conclusiones F-Spot se encuentra en un estado de desarrollo inicial y aún cuenta con unas cuantas asperezas que limar. Así que, la idea de un administrador de imagen integrado en GNOME nos presagia un buen futuro. Los controles son simples, y están bien pensados, lo cual es bueno, ya que actualmente este proyecto carece de documentación. Si tu colección de fotos ha ido creciendo a lo largo de los años, te gustará la característica de escala temporal. La versión CVS de F-Spot posee un buen número de mejoras. Por ejemplo, el programa muestra los resultados mientras analiza los árboles de directorios. También podrás encontrar una nueva lista que te dirá qué etiqueta busca el índice actual. Si eres aficionado a la fotografía digital y estás teniendo problemas con la administración de tu colección de fotos, FSpot es justamente lo que necesitas. Es una herramienta bastante poderosa y posee un gran potencial para desarrollo ■ futuro.

RECURSOS [1] Página de inicio de F-Spot: http:// www.gnome.org/projects/f-spot [2] Descargas de mono: http://www. mono-project.com/Downloads [3] Flickr: http://www.flickr.com


Z-Shell • LINUX USER

La shell Zsh

SHELL MEJORADO La moderna Z-Shell con sus inumerables y útiles características ofrece a los fans de la línea de comandos una atractiva alternativa a Bash. POR SIMON KÖLSCH

Si prefieres, puedes compilar Z-Shell a partir del código fuente. Éste se encuentra disponible desde cualquiera de los espejos del proyecto Zsh. No existen dependencias específicas que vigilar. Usa el procedimiento estándar para compilar e instalar (como root) Zsh: ./configure make su -c "make install"

Migrando a Zsh

H

oy en día una shell debe hacer mucho más que interpretar comandos. Una que shell moderna debe completar cualquier número de comandos y parámetros; debe poseer un lenguaje de programación propio y debe incluir funciones que hagan la vida de los usuarios mucho más fácil. La mayor parte de las distribuciones usan Bash como shell predeterminada. Pero si haces un uso intensivo de la línea de comandos, te interesará Z-Shell, la cual dispone de algunas interesantes opciones que no se encuentran en Bash. Z-Shell (o Zsh) fue desarrollada por Paul Falstad en 1989. Su idea fue escribir una shell que combinara los beneficios y mejoras que ofrecían Bash, Csh y Ksh, al mismo tiempo que ofrecía nuevas características. Los miembros de la lista de correos zsh-workers@sunsite.dk continúan trabajando actualmente bajo la coordinación de Peter Stephenson.

Instalación Muchas distribuciones instalan Zsh por defecto y, con otras, puedes usar fácilmente para la instalación el administrador de paquetes. Los paquetes RPM se encuentran disponibles en RPM-Seek [1], por ejemplo, y puedes correr el comando rpm -i nombrepaquete.rpm para instalarlo.

Si quieres probar con los ejemplos de este artículo, puedes arrancar Zsh escribiendo el comando exec zsh. Pero para usar Zsh como shell de inicio, primero debes comprobar si tu sistema tiene una entrada con la ruta completa a Zsh en tu fichero /etc/shells. Si no se encuentra esta entrada, escribe primero which zsh para descubrir la ruta a Zsh, y luego, como root, añádela a /etc/shells (Ver listado 1). Para cambiar tu shell de inicio actual por el de Zsh, escribe chsh -c /path/to/zsh username. Deberás correr chsh como root. Cuando cambies de shell, es una buena idea que permanezcas conectado a otra consola con objeto de comprobar que los cambios se lleven a efecto. Un error tipográfico en el nombre de la ruta le impediría al usuario iniciarse sin tener que usar el comando chsh otra vez o editando el fichero /etc/passwd. Si prefieres, puedes usar los parámetros -l o -login para arrancar Zsh explícitamente como shell de inicio.

de cada usuario. Puedes usar la variable $zdotdir para especificar una localización diferente: $HOME ZDOTDIR=$HOME/ .zsh, por ejemplo. Lo convenido es que los nombres de los ficheros de configuración localizados en los directorios de los usuarios comiencen con un punto, por ejemplo, .zshenv, .zprofile, etc. Para mejorar la legibilidad, dejaremos los nombres de las rutas y los puntos iniciales en los ficheros de configuración que siguen. Cuando arranca, Zsh primero analiza los ficheros de configuración central (en /etc o /etc/zsh), antes de continuar analizando los ficheros específicos del usuario. Esto significa que cualquiera de ellos puede modificar la configuración central, diseñada por el administrador del sistema, con sus propios ficheros de configuración. Z-Shell primero analiza zshenv. Esto es, donde se localizan las variables de entorno críticas, tales como rutas (PATHS, CDPATH, MANPATH) o configuraciones tales como DISPLAY, EDITOR, PAGER y PRINTER. Si Zsh es la shell de inicio, continúa analizando zprofile y zlogin después de zshenv. Cada Z-Shell (no importa si es la shell de inicio) analiza luego zshrc. Antes de salir, una shell de inicio de Zsh también analizará zlogout. No es necesario adaptar los ficheros de configuración: como la mayoría de las

Configuración de Ficheros Los administradores del sistema poseen cinco ficheros de configuración para configurar Zsh: /etc/zsh-env, /etc/profile, /etc/zshrc, /etc/zlogin y /etc/zlogout (Debian coloca estos ficheros en /etc/ zsh). Esto archivos también pueden almacenarse en los directorios de inicio

WWW.LINUX- MAGAZINE.ES

Figura 1: Uso de secuencias de escape para colorear el prompt de Zsh. Un emoticono verde indica la ejecución de un comando libre de error; si el emoticono es rojo, algo ha ido mal.

Número 13

81


LINUX USER • Z-Shell

shells, Zsh corre bastante bien sin necesidad de que modifiques la configuración. Es decir, los ficheros de configuración son susceptibles de darte una configuración a medida. La Tabla 1 muestra los ficheros responsables de dichas tareas.

Historia Zsh es capaz de almacenar una lista de comandos que introdujiste bajo el nombre de history. Para habilitarlo, necesitas establecer tres variables de entorno:HISTSIZE, HISTFILE y SAVEHIST. HISTSIZE especifica el número máximo de entradas que Zsh almacenará en la historia. HISTFILE especifica los ficheros donde Zsh almacena la historia antes de salir. Y finalmente, SAVEHIST define el número de líneas que Zsh puede escribir en $HISTFILE. Una configuración típica sería algo parecido a : HISTSIZE=500 HISTFILE=~/.zsh_history SAVEHIST=100

Esto le dice a Zsh que “recuerde” las últimas 500 líneas de comandos, pero que almacene solamente las últimas 100 en el fichero especificado. La próxima vez que arranques Zsh, puedes rellamar a las líneas de comandos almacenadas a través de la función historia. Adicionalmente, pulsando [CTRL]+[R] te permite buscar en la historia para comandos. Presionando este atajo de teclado múltiples veces, se muestran las líneas que contienen el modelo que estás buscando.^ representa el comienzo de la línea y puede preceder al modelo buscado. Si Zsh encuentra el comando requerido, entonces puedes pulsar [Enter] para correr el comando una vez más. [CTRL]+[4] sale de la búsqueda.

El Prompt Un prompt claro facilita el uso efectivo de la shell y hace que su apariencia

Listado 1: Comprobando /etc/shells 01 # grep zsh /etc/shells 02 # where zsh 03 /usr/bin/zsh 04 # echo "/usr/bin/zsh" >> /etc/ 05

82

shells

Número 13

Figura 2: Para presentar la configuración completa de las opciones de Z-Shell, escribe “setopt” y pulsa dos veces la tecla tabulador.

sea más impactante. El prompt de Zsh usa distintas notaciones desde Bash, y esto te evitará copiar simplemente un fichero de configuración bash existente. La variable de entorno PROMPT define la apariencia del prompt. Contiene comodines para información del sistema y rutas. La shell interpreta el contenido de esta variable y presenta el prompt a emparejar. Como PROMPT es una variable de entorno que se configura cada vez que arranca la shell, la entrada debe colocarse en zshenv. Encontrarás una vista de los comodines y cómo se encuentran expandidos para formar el prompt en el manual zshmisc bajo “Prompt Expansion”:

comando que envía muchas salidas a stdout como make, por ejemplo.

Un Prompt a Medida Vamos a comenzar estudiando el prompt. Por defecto, sigue la pauta username@host: PROMPT=%n@%m

La notación %m se refiere al nombre de host, y %n al nombre de usuario. Añade un separador entre el prompt y la entrada de la línea de comando: %# te dará un signo pound si root usa la shell y un signo de porcentaje para los usuarios normales: PROMPT='%n@%m%#'

man zshmisc | less +/^PROMPT

En la sección siguiente desarrollaremos un prompt práctico que muestra dos de las propiedades más útiles de la shell. Restringiremos la presentación del directorio actual a unos cuantos de los últimos directorios superordinarios para evitar que el prompt llegue a ser inmanejable. Adicionalmente, Zsh soporta condiciones, con las que podemos contar para reaccionar con estados específicos ante eventos específicos. Podemos usar esta habilidad para evaluar el valor de retorno del último comando y poder ver de un vistazo si ha ocurrido un error. Esto es especialmente útil si necesitamos correr un

WWW.LINUX- MAGAZINE.ES

Ahora podemos añadir %~ para producir el directorio actual, y dos puntos para separar el directorio del nombre de host. Para dar al prompt una apariencia pulcra enmarca todo entre corchetes y añade un espacio antes del carácter final: PROMPT=$'[%n@%m:%~] %#'

Si el directorio actual está a más de cuatro niveles del directorio raíz, el prompt que hemos diseñado comienza a presentar un aspecto deshilachado. Lo que es más, va penetrando más y más hacia la derecha en la terminal a medida que vamos profundizando en el árbol de directorios. Para evitar que esto ocurra,


Z-Shell • LINUX USER

Figura 3: El englobamiento y los cualificadores hacen que la búsqueda de ficheros en Z-Shell sea un juego de niños.

puede que prefieras presentar el nombre del directorio actual a apartir del cuarto nivel. Esto se denomina “truncado” y Zsh usa condiciones para manejarlo. La sintaxis general para esto es %(condición, acción si cierto, acción si falso). No es necesario usar una coma para separar condiciones y acciones. Zsh interpretará el primer carácter a partir de la condición como el separador. Has de asegurarte de que necesitas el mismo separador para el resto de la expresión. La condición que necesitamos aquí es 4c .c, que se refiere al número de elementos en la ruta actual (/ no cuenta como elemento). El 4 comprueba si la ruta contiene 4 ó más elementos. Como una acción, bien puedes imprimir la ruta completa, especificando %~, o bien el primer elemento en la ruta, esto es, el directorio actual, especificando en este caso %1~. Vale la pena señalar al usuario que estamos usando truncado añadiendo ./ a la ruta truncada: PROMPT=$'[%n@%m:%(4c,./%1~,%~)]U %# '

Una condición simple te da el valor de retorno para el último comando: PROMPT=$'[%n@%m:%(4c,./%1~,%~)]U %(?,:%),:%() %# '

La condición ? está completada si el estado de salida del último comando fue 0, es decir, si no ha ocurrido ningún error. En este caso, Zsh añadirá un emoticono al prompt. El emoticono pondrá cara triste si el valor de retorno no fue cero (es decir, se produjo un error). El prompt también soporta el uso de color para una legibilidad mejorada. Si quieres colorear los corchetes y el signo @ de color verde, y el emoticono que indica el valor de retorno de rojo o verde, puedes usar secuencias de escape para hacerlo.

En Zsh se especifica una secuencia de escape con ${}. Por ejemplo, la secuencia siguiente presentará el signo @ en verde: %{e\[0;32m%}@%{e\[0m%}

El segundo, que encierra la secuencia de escape e\[0m%] asegura que cualquier carácter siguiente será presentado en letra normal. También podrías usar negrita para realzar la apariencia de tu prompt. En este caso, %B hará que el texto de Zsh se muestre en negrita, y el %b lo volverá a la presentación normal: PROMPT=$'%{\e[0;32m%}%B[%b%U {\e[0m%}%n%{\e[0;32m%}@%U {\e[0m%}%m%{\e[0;32m%}%B:%b%U {\e[0m%}%(4c,./%1~,%~)%U {\e[0;32m%}%B]%b%{\e[0m%}U %(?,%{\e[0;32m%}:%)%{\e[0m%}U ,%{\e[0;31m%}:(%{\e[0m%}) %# '

Si añades todas las secuencias de escape que hemos discutido, los resultados deberían ser parecidos a los de la Figura 1.

Opciones Interesantes Zsh dispone de un número de opciones que pueden habilitarse usando el comando setopt. Para crear una opción permanente, añade el comando setopt y los parámetros requeridos al fichero zshrc. El nombre del parámetro puede contener letras mayúsculas o minúsculas y se permiten los subrayados en la mayoría de los casos.Por ejemplo, Zsh entenderá autocd, AUTOCD, e incluso Auto_cd. La página man zshoptions tiene una lista de opciones. Para deshabilitar una opción coloca un “no” delante del nombre: setopt no_Auto_cd o setopt NOAUTOCD. Si escribes setopt sin configurar ningún parámetro, te dice qué opciones han sido establecidas.

WWW.LINUX- MAGAZINE.ES

setopt soporta el autocompletado con los tabuladores. Si necesitas listar una opción completa (ver Figura 2), simplemente escribe setopt y pulsa dos veces la tecla del tabulador. Las opciones más importantes entre las 150 ó más, son las siguientes: • AUTO_CD – Si la primera palabra en la entrada no es un comando, Zsh intentará cambiar a este directorio. El auto completado con el tabulador hace cd más o menos redundante. • LIST-PACKED – Esta opción usa el autocompletado para reducir la separación entre columnas en el listado de salida. • SHARE_HISTORY – Esta opción comparte las historias de múltiples Z-Shells, es decir: los comandos de una Zsh activa se colocan luego en la historia de las otras shells. • GLOB – Z-Shell intenta resolver los comodines (tales como *). Por ejemplo, puedes escribir ls * y pulsar [Tab] para reemplazar el comodín por todos los ficheros. • GLOB_COMPLETE – Normalmente cuando pulsas [Tab] después de escribir ls *, el comodín es reemplazado por todos los ficheros. Si está habilitado GLOB_COMPLETE puedes pulsar [Tab] múltiples veces para seleccionar el fichero requerido (ver también MENU_COMPLETE). • MENU_COMPLETE – Si el auto completado devuelve múltiples resultados, Zsh no te avisará antes de que presente el primer resultado, sino que simplemente lo insertará. En caso de múltiples resulta-

Número 13

83


LINUX USER • Z-Shell

dos, puedes moverte a través de ellos pulsando [Tab]. CORRECT_ALL – Zsh intenta corregir errores, tales como errores tipográficos sencillos. HUP – Cuando abandonas la shell, una señal HUP se envía a todos los procesos activos. Si esta opción no está configurada, los procesos pueden continuar ejecutándose. BEEP – Especifica si Z-Shell debería dar emitir un pitido a través del altavoz del PC en el caso de una entrada errónea.

Englobamiento Una de las características más importantes de Z-Shell es su poderoso sistema de englobamiento. Este término se refiere al modo en el que funciona la herramienta glob, es decir la manera en la que se encuentran los ficheros y carpetas mediante referencias a pautas de búsqueda tales como expresiones regulares. El comando setopt EXTENDEDGLOB habilita el englobamiento extendido. Luego puedes usar argumentos como <x-y> para direccionar rangos numéricos. También parámetros como (foo|bar) que soportan grupos de argumentos, y que buscan el árbol del sistema de ficheros recursivamente: % chmod 644 U ~/public_html/**/*.html(.)

Los cualificadores te permiten centrar los resultados de las búsquedas. Para hacerlo, añade un cualificador a la pauta de búsqueda como sigue: pauta(cualificador). Por ejemplo, si deseas encontrar programas en /usr/bin con el bit setuid, puedes añadir un cualificador s:

ls /usr/bin/*(s)

La página man zshexpn tiene una lista completa de cualificadores. Los más comunes son los siguientes: • @ – Filtra los resultados de enlaces simbólicos. • w – Muestra ficheros de escritura solamente. • W – Encuentra solamente ficheros de escritura globales. • U – Filtra los ficheros del usuario. LA Figura 3 muestra unas cuantas aplicaciones de englobamiento Zsh. Puedes negar los resultados añadiendo ^. Por ejemplo, ls *(^U) te dará los ficheros que pertenecen a otros usuarios, pero no los tuyos propios. Si configuras el parámetro EXTENDENGLOB, el modificador noglob puede resultar ser muy útil en algunos casos. Deshabilita el englobamiento para el comando siguiente. Por ejemplo, el siguiente comando no descarga la página de la URL especificado, sino que muestra un mensage de error: % wget http://www.foobar.de/U index.php?action=test zsh: no matches found: http://U www.foobar.de/index.php?U action=test

Cuando está habilitado el englobamiento, Zsh interpreta el signo de interrogación como el comienzo de una pauta de búsqueda, y a causa de que la esperada pauta de búsqueda no se encuentra, Zsh da entonces un mensage de error. Si das al comando noglob para deshabilitar el englobamiento, también deshabilitará la expansión del nombre del fichero, y el parámetro no se expandirá. En vez de ello, se pasa a wget tal y como está, el cual descarga posteriormente la página web requerida: % noglob wget http://www.U foobar.de/index.php?test --11:41:25-- http://www.U foobar.de/index.php?action=U test => `index.php?action=test' (...)

Fuentes Si esta corta excursión por el

84

Número 13

WWW.LINUX- MAGAZINE.ES

Tabla 1: Ficheros de Configuración de Zsh Fichero zshenv zlogin

zprofile

zshrc zlogout

Contenido Variables de entorno (Solamente shell de inicio) comandos que corren cuando arranca Zsh (Solamente shell de ini cio) comandos para el perfil de usuario. Zsh corre estos antes zshrc en el momento del inicio Comandos que corre Zsh cuando arranca la shell (Solamente shell de inicio) comandos que corren cuando se sale de Zsh

mundo de Zsh te ha abierto el apetito y estás planteándote investigar más profundamente acerca de él, deberías acercarte a las siguientes fuentes de información. En el sitio oficial de Z-Shell encontrarás una corta introducción a Zsh [2] y el FAQ Zsh oficial [3]. Aprender más sobre las características de Zsh y compararlas con las de otras shells, te aconsejamos visitar la página de Christian Schneider en [4]. También está el pequeño proyecto Zsh Lovers, el cual reúne ejemplos de las funciones descritas en las páginas man y publicadas bajo la forma de página man para los amantes de Zsh. Finalmente, no olvides excelente libro en papel, From Bash to Zsh (ISBN 159050-376-6) de Oliver Kiddle, Jerry Peek y Peter Stevenson, el cual hará que migres definitivamente aZSH. La publica Apress y cuesta unos 35 dólares americanos. Y si todas esas búsquedas en fuentes online o material escrito son demasiado largas, siempre puedes intercambiar experiencias con otros usuarios de Zsh através de los canales IRC #grml y ■ #zsh en Freenode (irc.freenode.org).

RECURSOS [1] RPMSeek: http://www.rpmseek.com [2] Introducción a Zsh: http://zsh.sunsite. dk/Intro/ [3] Zsh FAQ: http://zsh.sunsite.dk/FAQ/ [4] Página Zsh de Christan Schneider: http://www.strcat.de/zsh/ [5] Zsh Lovers: http://grml.org/zsh/ #zshlovers


Educación • LINUX USER

La plataforma educativa Moodle

LA HORA DEL E-APRENDIZAJE

E-learning, teleformación, plataformas educativas… son palabras y conceptos de moda, que parece que van a acabar con las formas tradicionales de enseñanza y aprendizaje. ¿Es esto así de sencillo? Vamos a tratar de dar respuesta a esta pregunta analizando el gestor de contenidos educativos libre más popular, moodle. POR JUAN RAFAEL FERNÁNDEZ GARCÍA.

P

equeña introducción terminológica al e-learning: moodle (figura 1) es un LMS, clase especial de los CMS. O un VLE. A su vez formas destacadas del CAT de nuestros tiempos. Sencillo, ¿verdad? Las cosas deberían estar más claras de lo que el marketing y el oscurantismo pedantesco nos lo ponen: moodle es un tipo de aplicación que pertenece al género de los gestores de contenidos educativos (en inglés Learning Management Systems), también conocidos como entornos de aprendizaje virtuales (Virtual Learning Managements, en castellano he visto EVA, Entornos Virtuales de Aprendizaje, con un énfasis en la «virtualidad» que comentaremos después), un subgénero de los gestores de contenidos (Content Management Systems, aunque a veces para nuestra confusión se use Course Management Systems, otra vez CMS, o Courseware, para referirse a los LMS).

¿Ha quedado claro? ¿No? Empecemos otra vez: gestores, entornos… moodle es una aplicación para montar y gestionar plataformas educativas. Espacios donde una organización (centro educativo, universidad, academia o empresa) gestiona recursos educativos proporcionados por un profesorado y organiza el acceso a esos recursos por el alumnado, y además permite la comunicación entre los profesores,

Figura 1: Sitio central de Moodle.

WWW.LINUX- MAGAZINE.ES

entre profesores y alumnos y quizás entre los propios alumnos. Algunas plataformas además fomentarán el trabajo cooperativo y la discusión de los temas. Pero ese será un rasgo distintivo, no pertenece a la definición genérica. ¿Todas son herramientas de teleformación? Ah, buena pregunta :-) . La respuesta es no: la «e» de «e-learning» no tiene que ver con distancia, sino con electrónica: son herramientas para la enseñanza con ayuda de la informática, sea presencial, mixta o a distancia. Sí hay un énfasis en la «virtualidad» que podemos analizar. Virtual tiene que ver con imaginario o aparente («imagen virtual», por ejemplo), y se opone a real y físicamente presente. Un entorno o un aula virtual sustituyen de algún modo (puede que complementando) a las aulas presenciales. Lo que conlleva que no tengan sentido expresiones como «plataforma virtual» o «enseñanza

Número 13

85


LINUX USER • Educación

virtual». ¿Dónde quiero llegar? A que los entornos virtuales pretenden crear un aula donde ésta no está disponible, o bien ampliar las potencialidades del aula real. Los entornos virtuales de aprendizaje son eso, virtuales: reproducen el modelo de enseñanza/aprendizaje que tiene el profesor. Si su modelo es transmisor en el aula, en su virtualidad electrónica también será cerrado. Si los momentos importantes son la matriculación y la evaluación final, estamos manifestando claramente una modalidad de enseñanza, que evidentemente no es la única. La discusión, aprender a razonar y a ser convincente, la inves-

Figura 2: Modelos de aprendizaje.

tigación en equipo, el reparto democrático de tareas son cosas que también se hacen en la clase. La teleformación es quizás un

mal necesario, pero personalmente me interesa mucho más la constitución de redes y espacios de creación colectiva de conocimiento. Foros -en el sentido pleno de la palabra- virtuales. Por supuesto que alguno de los usos más conocidos es la creación de cursos a distancia, y que algunas plataformas incorporan un sistema de matriculación vinculada a pagos. Pero ni esto es esencial a los LMS ni es la dimensión que me interesa. Hay otro detalle en el que como docentes debemos fijarnos: se habla casi siempre de enseñanza/aprendizaje, y ambiguamente de formación, no de educación.

Cuadro 1: Instalación de moodle Estos artículos tienen, como todo hoy, la obsolescencia programada. Cuando llegan al kiosko los problemas señalados ya han sido resueltos o sustituidos por otros, el gran descubrimiento es una noticia vieja, las pequeñas astucias (sí, esto es un galicismo pero me gusta) se han vuelto innecesarias… son artículos cargados de historicidad. Cuando escribo la versión disponible en Debian Estable es la 1.4.2, en Testing está la 1.5.2. En el sitio de moodle http:// download.moodle.org/ se señala como estable la 1.5.3. El lector queda situado: este es un artículo y sus circunstancias. Supongamos que administramos una máquina de trabajo cara al público; por tanto nada de experimentos, tendremos una Sarge y versiones estables de las aplicaciones. Aprendamos cómo instalar el paquete moodle de Sarge.

Moodle es un ejemplo típico del paradigma LAMP. Estas son las siglas de Linux + Apache + Mysql + PHP. LAMP se ha convertido en uno de los ejes vertebradores de los servicios que pueden encontrarse en internet. Pues bien, antes de instalar moodle hay que tener correctamente instalados los programas en los que se basa. De GNU Linux no vamos a hablar (más bien llevamos hablando de manera indirecta desde el primer artículo), Apache es el servidor de páginas html, el programa que responde a las peticiones enviadas con el protocolo http por los navegadores web. Un solo detalle: conviene instalar también apache-ssl o el módulo libapache-mod-ssl, para que en el momento de autentificarse en la plataforma las contraseñas no viajen por la red en abierto. Las versiones modernas de apache incluyen la línea Include /etc/apache/conf.d

86

Número 13

en su fichero de configuración /etc/apache/httpd.conf. Esto nos permitirá no tener que tocar este archivo y si poner nuestras modificaciones y ajustes (la configuración de php y de moodle) en el subdirectorio /etc/apache/conf.d/. ¿Vamos a dejar acceder a nuestro moodle desde otras máquinas, cualquiera, sólo desde mi ordenador de pruebas? Eso equivale a permitir o negar el acceso al directorio donde se haya instalado moodle y se configura en /etc/moodle/apache.conf dejando una de las tres líneas deny from all allow from 127.0.0.0/255.0.0.0 allow from all El siguiente paso es instalar php4 y php4-mysql (o php4-pgsql, porque hace varias versiones, que moodle también puede utilizar la base de datos PostgreSQL). Php es un lenguaje de guiones (scripting language) que se integra en las páginas html y permite crear webs dinámicas. En este momento conviene repasar con detenimiento /etc/php4/apache/php.ini para atar bien los cabos de la seguridad del sistema. En dicho fichero también se establece un límite que después puede darnos grandes quebraderos de cabeza ; Maximum allowed size for uploaded files. upload_max_filesize = 2M No podremos configurar en moodle la subida de ficheros mayores si en php hemos puesto un límite inferior. Y llegamos al momento delicado: la instalación del gestor de bases de datos mysql (o PostgreSQL, como hemos dicho). El paquete es mysql-server.

WWW.LINUX- MAGAZINE.ES

Aconsejo instalar de forma paralela phpmyadmin, una herramienta web fantástica para trabajar con mysql. Los problemas pueden venir con la creación de cuentas y permisos. Y con la accesibilidad por red: para poder utilizar phpmyadmin y moodle es preciso comentar la línea skip-networking del fichero /etc/mysql/my.cnf, pero debemos tener mucho cuidado con las conexiones. En principio es razonable fijar bind-address 127.0.0.1

=

Moodle no necesita más, porque es el servidor apache en modo local el que consulta la base de datos. También deberemos crear un fichero /root/.my.cnf con la contraseña del administrador de la base de datos y de phpmyadmin. Reiniciamos apache y mysql (/etc/init.d/apache restart y así sucesivamente) para que tomen los nuevos parámetros de configuración. Ya podemos hacer aptitude install moodle. Nos preguntará la contraseña del administrador del gestor de bases de datos y los datos de la nueva base, que se guardarán en /etc/moodle/config.php. También creará la base de datos (no las tablas). Y un fichero cron que ejecuta periódicamente un guión php (limpia tablas, envía correos…). ¿Qué falta por hacer? Nos falta dejar que el sistema cree las tablas donde se van a guardar los datos de la plataforma. En nuestro navegador abriremos la url http:// localhost/moodle/admin y seguiremos las instrucciones. Para terminar podemos comprobar que los datos se han creado correctamente con phpmyadmin (figura 7). ¡Ya tenemos nuestro propio sitio moodle! (figura 8). Se llama Sócrates :-)


Educación • LINUX USER

Hasta nuevo aviso las máquinas no educan, es tarea de personas guiar el proceso y determinar la elección de herramientas y procedimientos para que el resultado sea educativo. Y en la elección de la plataforma será criterio fundamental la herramienta que más contribuya a la comunicación, la discusión abierta y la colaboración, porque son educativas. Sólo entonces será una plataforma educativa.

Figura 3: Mapa conceptual del constructivismo.

¿Una comparativa de plataformas? ¿Moodle? ¡Qué palabra tan extraña, seguro que es un acrónimo! Pues sí, podemos leer en http://moodle.org/mod/resource/ view.php?id=684 que la palabra moodle era al principio un acrónimo de Modular Object-Oriented Dynamic Learning Environment (Entorno de Aprendizaje Dinámico Orientado a Objetos y Modular). Parece haber también un juego de palabras con doodle, hacer garabatos, esos dibujos que pinta la gente de forma distraída cuando se aburre: sería, dice la documentación, un verbo que describe el proceso de deambular perezosamente a través de algo, o hacer las cosas cuando se te ocurre hacerlas, una placentera chapu-

Figura 4: Identificándose en un sitio moodle.

Figura 5: Listado de cursos en los que el usuario está inscrito.

za que a menudo te lleva a la visión y la creatividad. Las dos acepciones se aplican a la manera en que se desarrolló moodle y a la manera en que un estudiante o profesor podría aproximarse al estudio o enseñanza de un curso en línea. El desarrollo de moodle fue iniciado por Martin Dougiamas (Martin continúa dirigiendo el proyecto) en los años noventa, por su insatisfacción con la comercial y cara WebCT y para crear una herramienta que permitiera a los profesores de los colegios e instituciones pequeñas explotar el uso pedagógico de internet. La versión 1.0 apareció el 20 de agosto de 2002. La versión 1.5.3 es el 20 de noviembre de 2005. Muchas cosas han cambiado en este periodo de tiempo: moodle se usa en numerosas universidades, institutos, colegios… El que usa moodle es un moodler. Circula un chiste entre los moodlers hispanohablantes: la comunidad se divide entre los que pronuncian «múdl» y los que pronuncian «modle». Sin comentarios. Ahora recuerdo que prometía al iniciar esta sección hablar de las comparativas de plataformas. ¿Quieren comparativas? Aquí tienen unas cuantas • http://www.unesco.org/ webworld/portal_freesoftware/ Software/Courseware_Tools/ • http://www.edutools.info/course/ compare/bygroup/selectproducts. jsp?group=2 • http://www.elearningworkshops. com • http://www.xplana.com/ whitepapers/archives/ Open_Source_Courseware Voy a cerrar la sección sin hacer mi comparativa. ¿Por qué? Por varias razones, espero que convincentes: • He estudiado con interés un buen numero de ellas, hasta lle-

WWW.LINUX- MAGAZINE.ES

gar a la conclusión de que cada comparativa está realizada según unos criterios diferentes; una plataforma será válida o no según las necesidades de la institución donde se va a aplicar. Lo que es válido en una universidad puede que ocupe demasiados recursos o sea demasiado difícil de administrar en un colegio; una herramienta de teleformación comercial destacará en las herramientas que impiden que la información se abra al libre acceso • Las evaluaciones están cargadas de historicidad: se evalúa la versión del momento con las características del momento; una plataforma aparece como superior a otra porque dispone de un módulo que la otra mejora en la siguiente versión… en el mundo del software libre tres meses son una eternidad Más que una comparativa de características nos interesa hacer un listado de criterios que guíe la elección de la plataforma de nuestra institución. Y hay una serie de puntos que son irrenunciables: que el entorno de aprendizaje sea libre y libremente mejorable, que los datos introducidos sean nuestros y podamos reutilizarlos y rescatarlos cuando lo deseemos (ver el cuadro 2), que esté internacionalizado, y para mí, decisivo es que tenga detrás una comunidad viva y dinámica de desarrolladores y usuarios. Moodle cumple todas estas condiciones.

Un poco de teoría tampoco está de más ¿Qué tiene moodle de especial? Su carácter libre, el enfoque y la filosofía que tiene detrás. Y la comunidad. El esquema de Rafael Casado Ortiz (figura 2, tomada de http://moodle.org/ mod/forum/discuss.php?d=25768) nos servirá de introducción. El diseño y el desarrollo de moodle se basan en la teoría del aprendizaje que se denomina pedagogía construccionista social. Para el construccionismo el aprendizaje es particularmente efectivo cuando se construye algo que debe llegar a otros (se habla de artefactos: una frase, este artículo, un programa informático). Cito el ejemplo de http://

Número 13

87


LINUX USER • Educación

Figura 6: Un curso del proyecto Edukalibre.

moodle.org/mod/resource/view. php?id=3849: «Usted puede leer esta página varias veces y aun así haberla olvidado mañana; pero si tuviera que intentar explicar estas ideas a alguien usando sus propias palabras, o crear una presentación que explique estos conceptos, entonces puedo garantizar que usted tendría una mayor comprensión de estos conceptos, más integrada en sus propias ideas. Por esto la gente toma apuntes durante las lecciones, aunque nunca vayan a leerlos de nuevo.» Pero no estamos ante una psicología individualista: el aprendizaje no se realiza en burbujas aisladas. La construcción de artefactos se realiza en el ámbito de un grupo social, creando colaborativamente una pequeña cultura de artefactos compartidos con significados compartidos. Según esta visión el aprendizaje es un fenómeno fundamentalmente social: el aprendizaje tiene lugar en el ámbito de la comunidad social a las que se pertenece. El papel del profesor sería el de «facilitador» que anima a los estudiantes a descubrir los principios por sí mismos y a construir conocimiento trabajando en la resolución de problemas reales en un proceso social colaborativo. La wikipedia en inglés tiene un buen resumen de las teorías de Papert (http:// en.wikipedia.org/wiki/ Constructionist_learning; sobre constructivismo se habla en http://en.wikipedia.org/ wiki/ Learning_theory_%28education%29). No podemos entrar a exponerlas con detalle ni a reflexionar sobre ellas (el director de la revista no me deja, dice que esta es una revista de informática). Sí me atreveré a colar la figura 3, procedente de http:// www.uib.no/People/sinia/CSCL/ HMM_Constructivism.htm, y a afirmar que deberíamos preguntarnos qué hacemos con ordenadores en nuestras clases

88

Número 13

Figura 7: Comprobación de que las tablas se han creado.

sin una reflexión previa sobre cómo se aprende y cómo pueden modificar el sistema escolar. Aunque admito que estas reflexiones pertenecen a otro lugar. Sí es verdad que moodle se está desarrollando en comunidad; son varios cientos los desarrolladores con acceso al cvs de la aplicación y muy frecuentados los foros de sugerencias, comentarios y evaluación de cada uno de los módulos. Es otro éxito y otro producto de internet como comunidad mundial.

Primer contacto como usuario Supongamos un sitio con moodle instalado y configurado (la instalación se describe en el cuadro 1). El administrador puede elegir varios modos de dar de alta en la plataforma (su tarea la veremos en la siguiente parte de esta serie de artículos). La figura 4 nos muestra una modalidad típica de la página de acceso. Hay cuatro clases principales de usuarios en moodle. El modo inferior es el invitado. Un invitado puede visitar algunas páginas (aquellas abiertas a todo el mundo) y leer los foros y descargar los documentos, pero no tiene permiso de escritura en la plataforma y por tanto no puede participar en ninguna discusión. Se puede configurar el sistema para que sea posible entrar en las páginas abiertas como invitado sin tener que realizar ninguna identificación. El segundo nivel es el de alumno o participante en una actividad. Un alumno tiene que estar dado de alta en la plataforma y puede acceder a los cursos abiertos (autoinscribiéndose) y a aquellos en los que está inscrito. El tercer nivel es el de profesor, tutor o, en la jerga de moodle, facilitador de un curso. Su nivel de permisos es mucho mayor: puede modificar la estructura del curso, subir materiales, pedir trabajos y leer los materiales elaborados por los alumnos (tareas, diarios)…

WWW.LINUX- MAGAZINE.ES

Figura 8: Nuestro propio sitio moodle.

Por último es necesaria la existencia de uno o varios administradores. Por lo pronto vamos a describir la experiencia de un usuario de a pie. Cuando el participante se ha autentificado, con su identificador de usuario y su contraseña, se le presenta el listado de cursos en los que está inscrito (la figura 5 muestra el listado de cursos y actividades del proyecto Cor-Edux ya presentado en esta serie de artículos). También puede inscribirse en un curso nuevo si el responsable le facilita la contraseña de acceso: basta con que intente entrar y cuando el sistema le pida la contraseña el estudiante la introduzca. Pero… ¿cómo se estructura un curso de moodle? Tenemos un nuevo ejemplo en la figura 6, la página principal de uno de los cursos del proyecto Edukalibre (http:// edukalibre.org/moodle/course/view. php?id=3). Una cabecera y la omnipresente disposición en tres columnas. Las funcionalidades de moodle se dividen en bloques (espacio configurables) y módulos que ocupan espacio en esos bloques. Hay módulos de recursos (enlace a otras páginas, creación y edición de páginas web, subida de ficheros y creación de subdirectorios para alojarlos) y módulos de actividades (foro, wiki, chat, glosario, taller, cuestionario, tarea, encuesta…). El profesor decide cuáles de estos módulos están presentes y visibles en su curso y cuándo.

En el próximo número… Hemos agotado el espacio de este primer artículo. Nos queda por ver cómo se utilizan los principales módulos y se saca partido de ellos, cómo se crea y configura un curso, cómo se importan y exportan los cursos y sus datos para que puedan reutilizarse en otro LMS. Y hablaremos de hacia dónde se encamina moodle, sus novedades y los módulos en preparación. ¿Nos ■ vemos el mes que viene?


Línea de comandos: ls • LINUX USER

Listado detallado de directorios con ls

LA HERRAMIENTA DE LISTADO $ echo $LS_OPTIONS -N --color=tty -T 0

Para deshabilitar un alias de la sesión de la shell actual y experimentar con el comando ls original escribe: unalias ls

Si quieres utilizar siempre el comando básico, o bien puedes añadir el comando unalias al fichero de configuración de tu shell (.bashrc) o definir tu propio alias para ls (ver la sección titulada Adaptable) y sobreseer la configuración global del sistema.

Vistas

El comando ls lista ficheros en la línea de comandos además de ofrecer una lista detallada de las propiedades del fichero de gran utilidad. Con o sin color, este comando te ofrece lo mejor de tus ficheros. HEIKE JURZIK

E

l comando ls es difícil que pueda ser superado cuando se acompaña de las opciones y parámetros. La página man se lee como un bestseller. Como usuario puedes seleccionar innumerables opciones para decidir lo que deseas que te muestre y cómo formatear la presentación.

¿Qué contiene? Escribiendo ls en el prompt verás el contenido del directorio actual, pero puedes proporcionar una ruta absoluta o una relativa para ver el contenido de otro directorio: ls /etc

o ls ../../etc

Si la salida tiene demasiado colorido o si se muestra demasiada información (los asteriscos para ficheros ejecutables y barras para directorios), deberías trabajar con un alias ls. Muchas distribuciones modernas definen una abreviatura estándar para sus usuarios y pasan al programa parámetros por defecto. Puedes escribir el siguiente, por ejemplo, para ver si ls tiene un alias en tu sistema: $ alias ls alias ls='/bin/ls $LS_OPTIONS'

El alias le dice a la shell que use el nombre completo de la ruta para el programa (/bin/ls) y los argumentos contenidos en $LS_OPTIONS siempre que un usuario escribe ls. También puedes usar la línea de comandos para descubrir el valor actual de la variable:

WWW.LINUX- MAGAZINE.ES

Por defecto, una simple llamada a ls no muestra los ficheros y directorios ocultos, es decir, ficheros y directorios con nombres que comienzan por un punto. Si deseas ver objetos ocultos, puedes configurar la opción -a (para “all” – “todo”): $ ls -a ./ ../ .bash_history .bash_logout .bashrc

Esta lista también incluye los directorios actual y padre (indicados por un punto o dos puntos respectivamente). Para excluir esos directorios de la lista, pero manteniendo los objetos ocultos, usa -A en lugar de -a.

Informativo 100% El comando ls te da una gran cantidad de información si especificas el parámetro -l (ver el cuadro titulado “Listado de Directorios Detallado”). El nombre del fichero se muestra a la derecha. Para enlaces simbólicos (como blubb.ps en nuestro ejemplo) una flecha indica los puntos de unión al fichero original. A la izquierda puedes ver el último cambio

Número 13

89


LINUX USER • Línea de comandos: ls

de fecha y hora (puede ser un año si el cambio tuvo lugar en un momento anterior). Más a la izquierda puede verse el tamaño de los ficheros en bytes, el propietario y el grupo. Si deseas cambiar la salida del tamño del fichero de bytes a una unidad de un tamaño diferente, simplemente añade el parámetro -h y ls mostrará el tamaño en Kilobytes, Megabytes o Gigabytes. La segunda columna por la izquierda da un número Figura 1: Puedes colorear la salida con ls. de entradas de directorio para directorios (incluyen• b/c para un fichero de disposido . y ..) y el número de enlaces duros tivo (“bloque” o dispositivo de para ficheros. Finalmente, los 10 caractecarácter”) res de la parte izquierda final representan el fichero tipo y los permisos. Los Clasificación por Tamaño designadores de los ficheros tipo son los El comando ls dispone de opciones que siguientes: te permiten clasificar los ficheros por su • – para un fichero normalmente tamaño. La opción -S da un listado de • d para un directorio clasificación con el fichero de mayor • l para un enlace simbólico tamaño en primer lugar. Puedes usar Listado de Directorios este parámetro en combinación con -s para que presente el tamaño (de nuevo Detallado 01 $ ls -l en bytes) delante del nombre de fichero: 02 total 11844 03 drwxrwxr-x 2 hen users 4096 2005-07-20 10:25 bla 04 lrwxrwxrwx 1 hen users 10 2005-07-20 10:49 blubb.ps -> ../post.ps 05 -rw-r--r-- 1 hen users 12101636 2005-07-20 10:48 hen.mpg 06 -rwxr-xr-x 1 hen users 1325 2005-07-20 10:49 script.sh 01 $ ls -lh 02 total 12M 03 drwxrwxr-x 2 hen users 4,0K 2005-07-20 10:25 bla 04 lrwxrwxrwx 1 hen users 10 2005-07-20 10:49 blubb.ps -> ../post.ps 05 -rw-r--r-- 1 hen users 12M 2005-07-20 10:48 hen.mpg 06 -rwxr-xr-x 1 hen users 1,3K 2005-07-20 10:49 script.sh

90

Número 13

$ ls -sS 11836 user.mpg 4 bla U 4 script.sh 0 blubb.ps

De nuevo puedes usar la bandera -h para decirle a ls que use unidades más intuitivas: $ ls -sSh 12M user.mpg 4,0K bla U 4,0K script.sh 0 blubb.ps

Claro que puedes cambiar el orden de la clasificación de esta salida usando el parámetro -r con el que obtendrás primero el fichero de menor tamaño: $ ls -sShr 0 blubb.ps 4,0K script.sh U 4,0K bla 12M user.mpg

¿La Antigüedad antes que la Belleza? Si es necesario, ls puede clasificar la lista de directorios por el último cambio de

WWW.LINUX- MAGAZINE.ES

fecha y hora. Por defecto, el fichero “más joven” encabeza la lista: $ ls -t script.sh blubb.ps U user.mpg bla

De nuevo, opcionalmente -r puede cambiar el orden y la salida para que el primer fichero sea el más viejo. Como una lista de este tipo no es fácil de leer, ya que múltiples ficheros son listados en una línea única, puedes especificar la opción -1 para que ls entienda que sólo ha de listar una entrada por columna. $ ls -tr1 bla user.mpg blubb.ps script.sh

Palabrería Si encuentras esta detallada salida demasiado prolija, ya que lo que deseas es conocer el tipo de ficheros con los que estás tratando, puedes especificar la opción -F con ls: $ ls -F bla/ blubb.ps@ blubb.ps~ U user.mpg script.sh*

En este formato de listado, ls coloca una barra a los directorios, un signo [@] a enlaces simbólicos y un asterisco a los ejecutables. También le puedes decir que restrinja la presentación, excluyendo copias de seguridad, las cuales son identificables por la tilde al final del nombre del fichero, especificando la opción -B. Si tus copias de seguridad tienen un sufijo como .bak, por ejemplo, puedes pasarle el parámetro -I a ls y adicionalmente especificar una pauta de búsqueda para ignorar los ficheros: ls -I *.bak

También puedes decirle al comando que no presente los contenidos de los subdirectorios si estás trabajando con comodi-


Línea de comandos: ls • LINUX USER

nes. Si escribes el siguiente comando

Basado en los códigos de color que recientemente identificaste mediante la introducción de dircolors -p | less, puedes comenzar ya a colorear tu mundo. Si no te agrada la idea de usar el rojo para los paquetes Debian (extensión .deb), puedes reemplazar el número 31 por un número propio, por ejemplo, el 35 para magenta:

ls /etc/cron*

para ver cualquier fichero que comience con cron en la carpeta /etc, se muestra el contenido del subdirectorio /etc/ cron.daily. Bash en este caso interpreta el asterisco y pasa el comando ls al directorio /etc/cron.daily como un argumento, no dejándole a ls otra opción más que presentarlo. Puedes configurar la opción -d para evitar que esto ocurra. En este caso ves una entrada para el subdirectorio, pero no los contenidos de los subdirectorios:

*.deb=00;35:

Figura 2: Konqueror te ofrecerá también una información detallada sobre los ficheros, pero es más lento que ls.

A continuación reanaliza tu fichero de configuración bash con el siguiente comando:

de color usando el comando siguiente: $ ls -d /etc/cron* /etc/cron.d /etc/cron.monthly /etc/cron.daily /etc/crontab /etc/cron.hourly U /etc/cron.weekly

Un Mundo de Colores Con la opción -F puedes identificar los tipos de ficheros eficazmente, pero existe otra manera más simple de identificar los contenidos de los directorios de un vistazo. La opción -color añade un código de color a varios tipos de ficheros (Figura 1). El parámetro acepta las definiciones color=always, -color=none o color=auto como parámetros adicionales. La última de estas variantes es la predeterminada, y le dice a ls que use el color solamente para salidas directas al terminal. Si rediriges la salida a otro fichero o programa, ls vuelve a una presentación monocroma. En contraste, always siempre emplea color, y none nunca lo hace. Para comprobar la paleta que usa ls , es decir, para descubrir qué color emplea para cada tipo de fichero, puedes echar un vistazo a la variable LS-COLORS: $ echo $LS_COLORS no=00:fi=00:di=01;U 34:ln=00;36:pi=40;33:so=01;U 35:do=01;35:bd=40;33;01:...

Como los códigos de color no son fáciles de leer, deberías comprobar el mapeado

source ~/.bashrc dircolors -p | less

Para evitar que la salida sobrepase los límites de la pantalla, vale la pena dirigir esta salida a la utilidad less que permite moverse arriba y abajo por el listado de página en página. La salida mostrará los directorios en negrita y azul: # 00=none 01=bold U 04=underscore 05=blink U 07=reverse 08=concealed # 30=black 31=red U 32=green 33=yellow U 34=blue 35=magenta U 36=cyan 37=white DIR 01;34 # directory

Versátil Si prefieres definir un esquema de color para el comando ls, necesitarás definir otra variable en tu fichero de configuración bash, LS_COLORS. Selecciona la salida desde el comando echo $LS_COLORS pulsando el botón izquierdo del ratón y arrástralo, a continuación suelta el contenido del portapapeles en .bashrc usando el botón medio del ratón. Antes de hacerlo, llama a export LS_COLORS=. Usa comillas para cualquier carácter de control. El fichero debería contener una línea parecida a: export LS_COLORS=U "no=00:fi=00:di=..."

WWW.LINUX- MAGAZINE.ES

y tus paquetes Debian serán presentados en color magenta la próxima vez que invoques a ls -color. Como mencioné al comienzo de este artículo, la mayoría de los distribuidores definen un alias para el comando ls, el cual invoca a un conjunto de opciones por defecto. Puedes personalizar el conjunto de parámetros que usas en tu fichero .bashrc. Por ejemplo, si deseas que ls siempre use símbolos (-F) para tipos de ficheros, junto con color (-color), introduce lo siguiente: alias ls='ls -F --color'

También es interesante añadir un alias separado para un comando largo y complejo usado para presentar directorios, incluyendo directorios ocultos y ficheros. Por ejemplo, podrías introducir: alias ll='ls -laF --color'

No olvides guardar tu fichero de configuración en cuanto hayas realizado los cambios (source ~/.bashrc).

Demasiado Si todas estas opciones son demasiado numerosas para memorizarlas, dispón de alias para los comandos que usas más frecuentemente. Esto te ahorrará tener que escribir, así como energía de la CPU ■ humana.

Número 13

91


¡Hazte con tus ejemplares atrasados! #1

¡pídelos ya!

#2

#5

#8

¡pídelos ya!

#3

#6

o d a t o g a

#9

¡pídelos ya!

#4

#7

#10

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


¡No esperes a que se agoten!

#12 #11

¡pídelos ya!

el REPOSITORIO de conocimientos LINUX más COMPLETO

atrasados@linux-magazine.es


EVENTOS

OSWC 2005

LinuxWorld Conf. & Expo México

Festival Digital de Andalucía

Fecha: 15-17 Febrero Ciudad: Málaga, España

Fecha: 14-17 Febrero

Ciudad: Málaga, España

Sitio Web: http://www.opensourceworldconference.com

Calendario de Eventos Evento linux.conf.au 2006 Solutions Linux 2006 Linux Asia Conference & Expo Southern California Linux Expo LinuxWorld Conference & Expo México OSWC 2005 PyCon 2006 O'Reilly Emerging Technology Conference UKUUG Spring Conference 2006 LinuxWorld Conference & Expo Australia LinuxWorld Conference & Expo Boston 7º Fórum Internacional Software Libre LinuxWorld & NetworkWorld Canada LinuxWorld Conference & Expo Italy LinuxWorld Conference & Expo SA LinuxWorld Conference & Expo Brazil LinuxWorld Conference & Expo Japan 6º Fórum Internacional Software Livre LinuxWorld Conference & Expo

Ciudad: Ciudad de México. Sitio Web: www.linuxworldexpo.com

Fecha 23-28 Enero 06 31 Enero - 06 Febrero 08-10 Febrero 06 11-12 Febrero 06 14-17 Febrero 06 15-17 Febrero 06 24-26 Febrero 06 06-06 Marzo 06 22-23 Marzo 06 28-30 Marzo 06 3-6 Abril 06 19-22 Abril 06 24-26 Abril 06 9-10 Mayo 06 16-19 Mayo 06 23-25 Mayo 06 31 Mayo - 6 Junio 06 4-6 Junio 06 5-7 Junio 06

Ciudad Dunedin, Nueva Zelanda París, Francia Nueva Delhi, India Los Angeles, CA, EE.UU Ciudad de México, M. Málaga, España Addison,Texas, EE.UU. San Diego, CA, EE.UU. Durham, Reino Unido Sydney, Australia Boston, MA, EE.UU Porto Alegre, Brasil Toronto, Canada Milan, Italia ohanesburgo, S. África Sao Paulo, Brasil Tokio, Japón Porto Alegre, Brazil Korea Seúl, Korea

Fecha: 10-23 Abril Sitio Web: http://www.festivaldigital.org

Sitio Web http://lca2006.linux.org.au www.solutionslinux.fr www.technetra.com/linuxasia2006 www.socallinuxexpo.org www.linuxworldexpo.com. www.opensourceworldconference.com www.python.org/pycon/2006 http://conferences.oreillynet.com/etech www.ukuug.org/events/spring2006 www.linuxworldexpo.com.au www.linuxworldexpo.com http://fisl.softwarelivre.org www.lwnwexpo.plumcom.ca www.linuxworldexpo.it www.linuxworldexpo.co.za www.linuxworldexpo.com www.linuxworldexpo.com http://fisl.softwarelivre.org www.linuxworldkorea.com

Información de Contacto Director Paul C. Brown

Director Editorial Paul C. Brown

Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas, Jose A. García, Ana Mª Ferreiro

Director de Producción Sergio Hardasmal anuncios@linux-magazine.es

Traductores Paqui Martín Vergara, Paul C. Brown, Antonio Rueda, Víctor Tienda.

Subscripciones: www.linux-magazine.es/ magazine/subs

Maquetación Sergio Hardasmal Diseño de Portada Pinball info@pinball-werbeagentur.de Publicidad www.linux-magazine.es/pub/ Para España Expresando Comunicaciones info@exprecom.com Tel.: (+ 34) 952 216 406 Fax.: (+ 34) 952 217 115 Paul C. Brown pbrown@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497

94

Número 13

Precios Subscripción España: Europa: Resto del Mundo - Euros: Resto del Mundo - Dólares U.S.A.:

49,50 € 59,90 € 79,90 € $ 94,90

Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516 subs@linux-magazine.es Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linuxnewmedia.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516

www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania

WWW.LINUX- MAGAZINE.ES

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


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

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

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

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

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



LINUX LOCAL

LINUX LOCAL Leyenda inux Local es tu directorio de servicios y empresas de Linux cerca de ti. ¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuentra quién ofrece qué y dónde. El directorio se divide en regiones autónomas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Utiliza la leyenda de la derecha para encontrar la empresa que ofrece el servicio que precises. Linux Local es tu guía de servicios Linux.

L

1.- Hardware 2.- Software / Desarollo 3.- Formación 4.- Soporte / Consultoría 5.- Servidores 6.- Redes 7.- Migración 8.- Hospedaje

Andalucía Logo

Empresa

Correo-e

Web

1

2 3 4 5 6

Gesinfo

info@gesinfoweb.com

www.gesinfoweb.com

BitRock

info@bitrock.com

bitrock.com

Properly Software

info@properly.es

www.properly.es/site

Empresa

Correo-e

Web

IWS

iws@iws.es

www.iws.es

Empresa

Correo-e

Web

Mono::labs

contacte@monolabs.com

www.monolabs.com

Datum

info@datum.ws

www.datum.ws

7 8

Cataluña Logo

1

2 3 4 5 6

7 8

Madrid Logo

1

2 3 4 5 6

7 8

¿Por qué no está su empresa en este directorio? LINUX MAGAZINE llega a miles de empresas, profesionales y usuarios cada mes. Si tiene servicios o productos Linux que ofrecer ¡Llámenos! Tlf.: +34 951 010 556 Fax: +34 951 010 516 info@linux-magazine.es

WWW.LINUX- MAGAZINE.ES

Número 12

97


PRÓXIMO NÚMERO

Marzo 2006: Número 14

PRÓXIMO NÚMERO FOTOGRAFÍA DIGITAL La revolución de la fotografía digital ha traído consigo un nuevo tipo de cámara que, a su vez, ha dado pie a nuevas herramientas para el procesado de imágenes. La visualización, manipulación y administración de fotografías ha cambiado radicalmente y el mes que viene veremos qué aplicaciones existen en Linux para llevar a cabo estas tareas. Empezamos haciendo un repaso general de las herramientas que existen para el manipulado de imágenes para, a continuación aprender a manejar imgSeek, un buscador de fotos muy especial. En tercer lugar veremos Xnview, un visualizador/clasificador con interesantes opciones. Continuamos nuestro recorrido a través del procesamiento de imágenes con consejos sobre cómo instalar, configurar y utilizar Xsane, el interfaz Linux a los escáneres más comunes. Finalmente os descubrimos todo lo que hay que saber sobre las extensiones EXIF, metainformación que se almacena junto con la imagen cada vez que la cámara registra une imagen.

EVALUACIÓN ¿Con K3B no tienes suficiente? ¿Echas de menos a tu Nero de toda la vida? Pues estás de enhorabuena… o no. Evaluamos la versión de Nero para Linux y vemos si está listo para su uso.

PRÁCTICO Le nueva versión de OpenOffice viene con una nueva aplicación destinada a acabar de convencer a

todos aquellos reticentes a dar el salto desde MSOffice. El administrador visual de bases de datos OOBase es la novedad más importante de OpenOffice 2 y el mes que viene tenemos un tutorial para ayudarte a aprender cómo manejarlo. Taskjuggler es la salvación de los jefes de recursos humanos con demasiado que hacer. En el próximo número explicamos cómo empezar a planificar con esta potente aplicación.

La configuración de la conexión a una red inalámbrica puede ser un engorro, sobre todo si nos movemos mucho de un entorno de red a otro. Wlassistant nos puede ayudar. Linux Multimedia Studio es a la música lo que el GIMP es al retoque fotográfico. En el número 14 de Linux Magazine, os contamos en detalle cómo iniciarse en el manejo de esta fabulosa aplicación.

A LA VENTA: FEBRERO 2006 98

Número 13

WWW.LINUX- MAGAZINE.ES




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.