linux magazine - edición en castellano, nº 13
DESCRIPTION
Puesto a la venta enero 2006. Tema de Portada: Juegos. DVD: Ubuntu 5.10TRANSCRIPT
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
NÚ
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
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
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
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.
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
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.
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
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.
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
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
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
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.
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.
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?
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.
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
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.
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.
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.
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.
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.
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
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.
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.
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
• 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
(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
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
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
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.
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!
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
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
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.
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.
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
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.
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
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
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.
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
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.
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
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
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
“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.
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.
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
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
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
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
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.
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
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)
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.
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.
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.
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.
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.
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.
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()».
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.
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()».
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
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
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
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.
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
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 <,
>, "e;, y &, 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
< <
> >
& &
“ "
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.
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
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.
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.
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
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
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
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
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
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
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
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
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.
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
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
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.
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.
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.
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
• 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
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.
¡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
¡No esperes a quese agoten!
el REPOSITORIOde conocimientos LINUX
#12
#11
más COMPLETO
¡pídelos ya!
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
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.
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
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