Está en la página 1de 100

F

i
r
e
w
a
l
l
s
G
u
a
r
d
d
o
g






A
n
a
l
i
z
a
d
o
r
e
s

d
e

R
e
g
i
s
t
r
o
s







S
h
o
r
e
w
a
l
l







B
r
i
d
g
e
w
a
l
l







D
o
m

t
i
c
a

P
e
r
l







A
u
t
o
p
s
y







V
i
g
i
l
a
n
c
i
a







K
D
M
/
G
D
M




Domtica
Controla tu casa con
un Jabberbot Perl p42
Ruby Rails
Una infraestructura web
diferente p32
NMERO 3 P.V.P 4,95
PHP
Ejecucin desde la
linea de comandos
CCCP
Autores al Gulag
con Paul C. Brown
KRecipe
La cocina KDE
de cada da
CSI del CPUp55
Anlisis de equipos comprometidos
con Autopsy
WWW. L I N U X - MA G A Z I N E . C O M. E S
KDM/GDM
Configuracin del
arranque X
L
I
N
U
X

M
A
G
A
Z
I
N
E




N

M
E
R
O

0
3
Edicin en
Castellano
FIREWALLS
Seguridad para todo el mundo
Configuracin sencilla con Guarddog p11
Implementa un cortafuegos puente p14
Registros con Logfile p18
Shorewall
Configura iptables de
sin complicaciones p22
Linux va a CeBIT
Muestre sus productos y servicios en la seccin
especial dedicada a Linux en CeBIT 2005:
Por cuarto ao consecutivo, un gran nmero de
compaas y proyectos de cdigo abierto van a
presentar sus soluciones de software, productos
y servicios en LinuxPark.
En CeBIT 2005, LinuxPark ser de nuevo el punto
de visita obligatoria para lo directivos TI, espe-
cialmente aquellos provenientes de las PYMEs y
de la administracin pblica. Slo hay un sitio en
CeBIT con toda la informacin sobre las tecnolo-
gas de cdigo abierto ms novedosas y como
explotarlas de manera efectiva: LinuxPark.
Su empresa tambin puede beneficiarse enor-
memente de esta plataforma, ideal para la pro-
mocin de sus soluciones de cdigo abierto.
La solucin perfecta para su presencia
ferial:
Comunquese directamente con una gran
variedad de clientes potenciales
Annciese en un campaa promocional ante-
rior a la feria de gran envergadura
Realice su propia presentacin en el
LinuxForum
Aprenda de ponentes de primera categora
Consolide sus relaciones con la comunidad
Linux internacional
Benefciese del contacto con socios y patroci-
nadores de reconocido prestigio en el sector
A su disposicin: paquetes feriales todo inclui-
do desde 4 m
2
Consiga ms informacin en
+49 (0) 26 02 16 01374
profair@abresch.de
Patrocinado por:
Presentado por:
EDITORIAL Escritorios
3 www.linuxmagazine.com.es Nmero 03
T
odo el
mundo
piensa
que est a
salvo. Nadie
piensa que le
puede tocar a
l/ella. Los
accidentes de
coche ocurren a los dems, los dems
contraen enfermedades incurables, a los
dems se les ven introducirse virus en
sus sistemas. La desgracia tiene un
curioso efecto distanciador.
Pero que nadie se crea invulnerable,
todo lo contrario: como la seccin de
invulnerabilidades demuestra mes a
mes, los fallos de seguridad que per-
miten ejecutar cdigo aleatorio abun-
dan en el sistema operativo Linux. Es
cierto, no ms que en otros sistemas,
pero, como me recuerda a cada oportu-
nidad mi esposa cada vez que hablamos
de cambiarnos de casa: No vayamos a
compararnos con lo que no queremos
ser. Y, s, es una gran ventaja que haya
tanta gente auditando y probando el soft-
ware de manera abierta y se publiquen
los resultados para que nos curemos en
salud. Defender la proteccin a travs de
la ocultacin es como defender aquello
de, bueno, s, las alas del avin estn
pegadas con chicle pero no se caern
si no se lo decimos a nadie.
Sin embargo, el peligro existe en el
mbito de la informtica y no slo viene
bajo la forma de virus, troyanos y
jaquens aburridos, de los que buena
cuenta damos en este nmero y, por
tanto, sobre los que no me voy a expla-
yar. Hablo de otro peligro, mucho ms
insidioso contra el cual no te puedes pro-
teger configurando un firewall, deshabi-
litando servicios o blindando el sistema.
Y no importar el sistema que utilices, ya
sea Linux, Windows, Mac o BSD, siem-
pre estars a la merced de uno de sus
ataques, los cuales vienen sin avisar y
sin motivo aparente.
Hablo de los abogados.
El ataque te puede venir en la forma
de carta de SCO reclamndote el pago de
un impuesto revolucionario que a santo
de qu, o te puede llegar como aviso de
citacin a juicio por no pagar una factura
de un servicio telefnico que por
supuesto no has contratado ni mucho
menos utilizado. A m me lleg una de
dichas cartas hace un par de das.
69,72 euros es el motivo de que me
quieren arrastrar a juicio los ilustres
seores letrados. Esta gente son los encar-
gados de perseguir a toda esa panda de
sinvergenzas internautas que rehsa
pagar servicios de ADSL que no funcio-
nan, facturas emitidas despus de bajas o
misteriosos cobros por servicios no con-
tratados, el cual, como digo, es mi caso.
Su cliente, WANADOO S.L., asegura
que servidor contrat un servicio de tele-
fona llamado rimbombantemente
Premier Plus. Ahora bien, servidor no
es ningn lince legal, pero creo que sin
contrato firmado no hay tu ta Y esto lo
confirm mi abogado, que s lo es. (He de
decir que mi abogado es de los buenos. Es
un encanto, lo puedes sacar de la jaula y
todo y no se pleitea con nadie a no ser
que le caiga realmente mal).
Ni que decir tiene que ni servidor
jams ha contratado, suscrito, solicitado,
ni mucho menos disfrutado de este
excelso servicio. Pero eso da igual. Un
da vas caminando por la calle, te cae
una maceta en la cabeza y te quedas en
el sitio; o administras un sistema para
una importante firma y un estpido
script-kiddie logra cargarse todo la base
de datos de clientes y proveedores, junto
con el fichero donde guardabas tus par-
tidas de Quake; o un da ests sentado en
tu casa y, mira por donde, te meten un
pleito Y plas! Te has convertido en
una estadstica. De humano te has trans-
formado en una cifra en las listas de la
DGT o de las crecientes casos de abusos
por parte de operadores de telefona.
Si no pago 69,72 euros antes del da 11
del corriente (enero), me arrastrarn a
juicio, me demostrarn culpable, pedirn
La Amenaza Fantasma
Nos sentimos orgullosos de nues-
tros orgenes como publicacin, que
se remonta a los primero das de la
revolucin Linux. Nuestra revista
hermana, la publicacin alemana
Linux Magazin, fundada en 1994,
fue la primera revista dedicada a
Linux en Europa. Desde aquellas
tempranas fechas hasta hoy, nues-
tra red y experiencia han crecido y
se han expandido a la par que la
comunidad Linux a lo ancho y largo
del mundo. Como lector de Linux
Magazine, te unes a una red de
informacin dedicada a la distribu-
cin del conocimiento y experiencia
tcnica. No nos limitamos a infor-
mar sobre el movimiento Linux y de
Software Libre, sino que somos
parte integral de l.
Estimado Lector de Linux Magazine
Paul C. Brown
Director
la pena capital para mi y mis allegados y,
de paso, escupirn sobre mi tumba. Lo
peor de todo es que para mandarles un
burofax jurando que no he sido yo,
Correos me cobra 20 euros, perder una
maana de trabajo para ir a juicio puede
costar unos 50 euros, aparcar en el cen-
tro 4 euros. La minuta del abogado me
puede salir por 300 euros. Que el juez
me de la razn, no tiene precio, pero
para todo lo dems, Mastercard.
La solucin fcil: pagar los 69,72 euros
y olvidarse. Pero, haciendo esto no dejo
abiertas la puertas a ms chantajes por
parte de las operadoras y sus canes
legales?
As que ya sabis: una vez instalado
vuestro firewall, deshabilitado servicios
innecesarios y blindado vuestro sistema
siguiendo los buenos consejos de Linux
Magazine cuidado con los abogados!
4 Nmero 03 www.linuxmagazine.com.es
NOTICIAS
Inseguridades ....................................................................................6
Negocios ................................................................................................8
Correo ......................................................................................................9
PORTADA
Especial Cortafuegos ..................................................................10
Guarddog .............................................................................................11
KDE ofrece una aplicacin que simplifica en gran medida la
configuracin de un cortafuegos.
Bridgewall ...........................................................................................14
Los cortafuegos pueden implementar como routers, pero
tambin pueden filtrar a nivel de puente.
Logfile ....................................................................................................18
Analizar los datos de ataques puede ser tan importante
como evitarlos.
Shorewall ............................................................................................22
Shorewall Simplifica la configuracin de iptables del kernel.
DESARROLLO
La librera SDL (III).........................................................................27
Abordamos el control del protagonista y de los enemigos en
nuestro juego.
Ruby Rails ...........................................................................................32
Una infraestructura para aplicaciones web diferente
Interfaces ............................................................................................37
Integramos la librera menu.h en una clase que simplifica la
creacin de interfaces con el usuario.
Jabberbot ............................................................................................42
Controla las luces de tu casa a distancia con perl y un jabberbot.
PHP en Lnea ....................................................................................46
PHP no slo sirve para programar aplicacionesc web. Vemos
como escribir programas para la lnea de comandos.
Python y la RAE ..............................................................................49
Creamos un diccionario de interfaz minimal que consulta
palabras en la web de la RAE.
18 Shorewall
Cuando los usuarios piensan en su estacin de trabajo en
casa olvidan normalmente la seguridad. Pero el peligro
acecha, esperando
golpear a los despre-
venidos. Shorewall
ayuda a los usuarios
habituales de Linux a
mantener a los intru-
sos fuera.
14 Bridgewall
Normalmente los cortafuegos se implementan como routers,
pero no tiene por qu ser as. Los filtros a nivel del bridge
tienen una serie
de ventajas que
puede aadirlas
a su red en una
etapa ms tarda
sin necesidad de
cambiar la con-
figuracin de los
componentes de
red.
11 Guarddog
El programa KDE Guarddog promete una configuracin fcil
del cortafuegos de Linux con tan solo unos cuantos clics.
Guarddog ayuda a
los usuarios inex-
pertos a proteger
sus mquinas, e
incluso redes com-
pletas, contra los
atacantes.
Contenido LI NUX MAGAZI NE
5 www.linuxmagazine.com.es Nmero 03
SYSADMI N
La Columna de Charly ...............................................................54
Los mejores trucos y consejos del SysAdmin.
Autopsy ................................................................................................55
En esta segunda parte dedicada al anlisis forense, estudia-
mos un ordenador comprometido con Autopsy.
Suspend ...............................................................................................59
La hibernacin de un ordenador consiste en volcar la RAM a
swap y despus recuperarla. Analizamos el software para
hacerlo.
LI NUX USER
KHotkeys ............................................................................................64
Implementar gestos de ratn y teclas personalizadas bajo
KDE es fcil con KHotkeys.
DeskTOPia: Krecipe .....................................................................67
Un recetario digital para el escritorio KDE.
Configuracin: KDM/GDM .....................................................73
Aprendemos como configurar el arranque grfico de Linux.
Curso de Programacin: XUL (III) .......................................76
Un lenguaje sencillo para programar interfaces web.
Educacin: WIMS (III) ..................................................................81
Un ejemplo prctico de clases con WIMS.
Comandos: su y sudo..................................................................84
Ser root es imprescindible... de vez en cuando. su y sudo
ayudan a no abusar.
Tipografa con LaTeX (III)..........................................................87
Documentos de aspecto profesional con LaTeX.
COMUNI DAD
Humor ...................................................................................................92
Proyectos ............................................................................................95
Eventos .................................................................................................97
Contacto ..............................................................................................97
Prximo Nmero ..........................................................................98
59 Suspend
Casi todas las placas bases tienen la caracterstica de control
de energa, diseada para apagar el ordenador y ponerlo en
modo suspendido. En
la vida real, esta ca-
racterstica no siem-
pre funciona. Linux
tiene varias alternati-
vas para tratar de
solucionar el proble-
ma.
32 Ruby Rails
La mayora de las bibliotecas web hacen que el 90 por ciento
del trabajo sea fcil y el resto imposible. Rails, un infraestruc-
tura de cdi-
go abierto
programado
en Ruby, es
lo bastante
flexible como
para tener
xito con ese
10 por ciento
restante.
LI NUX MAGAZI NE Contenido
64 KHotkeys
Los gestos con el ratn y los atajos con el teclado aaden
velocidad y simplicidad a las operaciones con el PC. Los
gestos de ratn solan
ser coto privado de los
usuarios de Opera y
de Mozilla, pero
KHotKeys las ofrece
ahora a Konqueror
para usuarios de KDE
3.2 o superior. Incluso
podemos lanzar pro-
gramas no-KDE con
KHotKeys.
usuarios de Ruby 1.6.x debern ac-
tualizar sus versiones. I
-Referencia Mandrake:
MDKSA-2004:128
IKernel
El kernel Linux se encarga de llevar a
cabo las funciones bsicas del sistema
operativo.
Se ha descubierto un fallo de ausencia
de serializacin en unix_dgram_recvmsg
que afecta a kernels anteriores al 2.4.28.
Un usuario local podra potencialmente
aprovecharse de una condicin de carre-
ra para hacerse con privilegios de root.
Se pueden consultar ms detalles sobre
estos problemas en la base de datos del
proyecto de Vulnerabilidades y
Exposiciones Comunes (Common
Vulnerabilities and Exposures o CVE -
http://cve.mitre.org). Vase CAN-2004-
1068.
Paul Starzetz de iSEC descubri varios
fallos en el cargador binario ELF, fallos
que afectan a kernels anteriores a 2.4.28.
Un usuario local podra utilizar estos fa-
llos para conseguir acceso de lectura a
binarios slo ejecutables o posiblemente
conseguir privilegios (CAN-2004-1070,
CAN-2004-1071, CAN-2004-1072 y CAN-
2004-1073).
Se descubri un fallo en la configu-
racin de lmites TSS que afecta a los
kernels para las arquitecturas AMD
AMD64 e Intel EM64T anteriores a
2.4.23. Un usuario local podra provocar
una ataque de denegacin de servicio o
cuelgue del sistema o, posiblemente,
conseguir privilegios (CAN-2004-0812).
Se ha descubierto un fallo de desbor-
damiento de entero en la funcin
ubsec_keysetup en el driver Broadcom
5820 cryptonet. En los sistemas que utili-
cen este driver, un usuario local podra
provocar un ataque de denegacin de
servicio (o cuelgue del sistema) o utilizar
el fallo para adquirir privilegios (CAN-
2004-0619).
Stefan Esser descubri varios fallos,
incluyendo desbordamientos de bfers
en el driver smbfs en kernels anteriores a
2.4.28. Un usuario local podra provocar
un ataque de denegacin de servicio
(cuelgue) o utilizar el fallo para escalar
privilegios. Para poder explotar este
fallo, el atacante necesitara tener el con-
trol de un servidor Samba (CAN-2004-
0883 y CAN-2004-0949).
SGI descubri un error en el cargador
elf que afecta a los kernels anteriores a
2.4.25 que podra activarse con un bina-
rio malformado. En arquitecturas dife-
rentes a x86, un usuario local podra
crear un binario malicioso que provocara
un ataque de denegacin de servicio o
cuelgue (CAN-2004-0136).
Conectiva descubri fallos en drivers
USB que afectaban los kernels anteriores
a 2.4.27 que utilizaban las funciones
copy_to_user en estructuras no inicia-
lizadas. Estos fallos podran permitir a
usuarios leer pequeas cantidades de la
memoria del kernel (CAN-2004-0685). I
-Referencia Red Hat: RHSA 2004:549-10
-Referencia Suse: SUSE-SA:2004:042
IPlugin Java de Sun
La seguridad en los entornos del plugin
Java de Sun y Blackdown Java puede ser
sobresedo para conseguir el acceso a
paquetes arbitrarios, lo que permitira
que applets sin confianza llevaran a cabo
acciones sin restricciones en sistema
husped.
El proyecto de Vulnerabilidades y
Exposiciones Comunes (Common
Vulnerabilities and Exposures o CVE -
http://cve.mitre.org) ha asignado el
nombre CAN-2004-1012 y CAN-2004-
1029 a este problema.
Tanto Sun como Blackdown proporcio-
nan implementaciones del Kit de
Desarrollo Java (JDK) y el entorno de eje-
cucin Java (JRE). Ambas implementa-
ciones contienen un plugin Java que per-
mite la ejecucin de applets Java en un
entorno restringido en navegadores web.
Todos los plugins Java estn sujetos a
una vulnerabilidad que permite el acceso
no restringido a paquetes Java.
Un atacante remoto podra embeber
un applet Java malicioso en una pgina
web y engaar a un vctima para que la
visualizase. Este applet podra sobreseer
las restricciones de seguridad y ejecutar
cualquier comando o acceder a cualquier
fichero con los permisos del usuario
visualizando la pgina web.
Inseguridades
6 Nmero 03 www.linuxmagazine.com.es
NOTICIAS Inseguridades
ICyrus-imapd
El servidor Cyrus IMAP es un servidor de
correo electrnico eficiente y altamente
escalable. Se han descubierto mltiples
vulnerabilidades en los analizadores de
argumentos de los comandos partial y
fetch del servidor. El proyecto de
Vulnerabilidades y Exposiciones
Comunes (Common Vulnerabilities and
Exposures o CVE - http://cve.mitre.org)
ha asignado el nombre CAN-2004-1012 y
CAN-2004-1013 a este problema.
Tambin existen problemas de desbor-
damiento de bfers en el cdigo imap
magic plus que son vulnerables de ser
explotados (CAN-2004-1011 y CAN-2004-
1015).
Un atacante podra explotar estas vul-
nerabilidades para ejecutar cdigo arbi-
trario con los permisos del usuario que
ejecuta el servidor Cyrus IMAP. No
existe ninguna solucin por el momento
para este problema. Todos los usuarios
de Cyrus IMAP debern actualizar sus
servidores a la ltima versin. I
-Referencia Debian:
DSA-597-1 cyrus-imapd
-Referencia Gentoo:
GLSA 200411-34 /cyrus-imapd
-Referencia Suse: SUSE-SA:2004:043
IRuby
Ruby es un lenguaje de scripts interpreta-
do para la creacin de programas orien-
tados a objetos de manera fcil y rpida.
El mdulo CGI de Ruby puede ser utiliza-
do para crear aplicaciones web.
Los desarrolladores de Ruby encon-
traron y arreglaron un fallo del mdulo
CGI que permita su activacin remota.
Esta vulnerabilidad poda, en teora,
provocar un bucle infinito. Una atacante
remoto podra activar la vulnerabilidad a
travs de una aplicacin web Ruby
expuesta y provocar que el servidor uti-
lizara recursos de CPU innecesarios, lo
que podra causar un ataque por dene-
gacin de servicio. Mitre ha asignado el
nombre CAN-2004-0983 a este problema.
No existe solucin para este problema
en el mdulo CGI de Ruby. Todos los
La solucin inmediata es deshabilitar
los applets Java en los navegadores web.
Todos los usuarios de Sun JDK debern
actualizar sus versiones. I
-Referencia Gentoo:
GLSA 200411-38/Java
IBNC
BNC es un proxy de devolucin de
sesiones IRB. Leon Juranic descubri
que BNC no siempre protege a los bfers
de la sobreescritura. Esto poda ser
explotado por un servidor malicioso IRC
para desbordar un bfer de tamao limi-
tado y ejecutar cdigo arbitrario en el
host cliente. El proyecto de
Vulnerabilidades y Exposiciones
Comunes (Common Vulnerabilities and
Exposures o CVE - http://cve.mitre.org)
ha asignado el nombre CAN-2004-1052 a
este problema. I
-Referencia Debian: DSA-595-1 bnc
-Referencia Gentoo: GLSA 200411-24/
BNC.
Iez-ipupdate
ez-ipupdate es una utilidad para actua-
lizar informacin de nombres de hosts
para un gran nmero de servicios de
DNS dinmicos. Ulf Harnhammar, del
Proyecto de Auditoras de Seguridad de
Debian, descubri una vulnerabilidad de
formato de cadena en ez-ipupdate. A
este problema se la ha asignado el Mitre
CVE CAN-2004-0980. I
-Referencia Debian: DSA-592-1 ez-ipu
date
-Referencia Gentoo: GLSA 200411-20/
ez-ipupdate
ISamba
Samba es una implementacin SMB/CIFS
abierto y libre que permite una
interoperabilidad sin fisuras de servicios
de ficheros e impresin con clientes SMB/
CIFS. Se han identificado varias vulnera-
bilidades en Samba recientemente.
Existe un problema con el demonio del
servicio de comparticin de ficheros de
Samba, el que permite a un usuario
remoto hacer que el servicio consuma
mucha potencia de computacin, lo que
podra conllevar potencialmente un
cuelgue al consultar nombres de ficheros
con comodines especiales.
Este ataque puede tener xito si el
demonio Samba est en ejecucin y un
usuario remoto tiene acceso a una com-
particin (aunque slo sea en modo lec-
tura). A este problema se la ha asignado
el Mitre CVE CAN-2004-0930.
Stefan Esser descubri un problema en
el manejo de cadenas Unicode en el
manejo de ficheros Samba que podra
conllevar un desbordamiento de pila
remoto y podra permitir a usuarios
remotos inyectar cdigo en el proceso
smbd. A este problema se le ha asignado
el Mitre CVE CAN-2004-0882.
Los paquetes actualizados no son vul-
nerables a estos problemas. Se recomien-
da que todos los usuarios de Samba se
actualicen a la ltima versin. I
-Referencia Gentoo: GLSA 200411-21/
samba
-Referencia Mandrake:
MDKSA-2004:136
-Referencia Red Hat: RHSA-2004:632-17
-Referencia Suse: SUSE-SA:2004:040.
Isudo
sudo es un programa que aporta privile-
gios de superusuario limitados a usua-
rios especficos. Liam Helmer not que
sudo no limpia el entorno lo suficiente.
Algunas funciones de bash y la variable
CDPATH se siguen pasando al programa
en ejecucin como usuario privilegiado.
Este hecho deja el sistema vulnerable
a la posibilidad de que un atacante
pueda encontrar una manera de sobre-
cargar las rutinas del sistema. A este
problema se le ha asignado el Mitre CVE
CAN-2004-1051.
Estas vulnerabilidades slo pueden ser
explotadas por usuarios a quienes se les
haya otorgado privilegios de super-
usuario limitados. Se recomienda actua-
lizar los paquetes sudo instalados. I
-Referencia Debian: DSA-596-2 sudo
-Referencia Mandrake:
MDKSA-2004:133
7 www.linuxmagazine.com.es Nmero 03
Inseguridades NOTICIAS
Distribuidor Fuente Seguridad Comentario
Debian Info: http://www.debian.org/security/ Los avisos de seguridad actuales se in-
Lista:http://www.debian.org/debian-security-announce/ cluyen en la pgina de inicio. Los avisos
Referencia: DSA-1) se proveen como pginas HTML con
enlaces a los parches. Los avisos tambin
incluyen una referencia a la lista de
correo.
Gentoo Info: http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para
Foro: http://forums.gentoo.org/ la lista Gentoo en el sitio web de
Lista: http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la
Referencia: GLSA: 1) pgina principal. Los avisos se presentan
en HTML con cdigos para fusionar las
versiones corregidas.
Mandrake Info: http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web
Lista: http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionadas con
Referencia: MDKSA: 1) la seguridad. Entre otras cosas,incluye
de avisos seguridad y referencias a las
listas de correo. Los avisos son pginas
HTML, pero no contienen enlaces a los
parches.
Red Hat Info: http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad
Lista: http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A
Referencia: RHSA- 1) continuacin los problemas para cada
versin de Red Hat se agrupan. Los avisos
de seguridad se proveen como una
pgina HTML con enlaces a los parches.
Slackware Info: http://www.slackware.com/security La pgina de inicio contiene enlaces al
Lista: http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo.
Referencia: [slackware-security] 1) No existe informacin adicional sobre
seguridad en Slackware.
Suse Info: http://www.suse.de/en/private/support/ Ya no existe un enlace a la pgina de
security/index.html seguridad tras un remodelado en el sitio
Parches: http://www.suse.de/en/private/ web de SuSE. Existe informacin en la
download/updates Lista: suse-security-announce lista de correos y los avisos. Los parches de
Referencia: SUSE-SA 1) seguridad para versiones individuales de
SuSE Linux se muestran de color rojo en el
sitio de actualizaciones generales.
Contiene una corta descripcin de la
vulnerabilidad que el parche soluciona.
1) Todos los distribuidores muestran correos de seguridad en el campo Subject.
Polticas de seguridad de la Distribuciones Mayoritarias
Negocios
8 Nmero 03 www.linuxmagazine.com.es
NOTICIAS Negocios
IIBMDona Patentes
IBM es ao s y ao tambin la compaa
que ms patentes registra a nivel mundial.
El ao 2004 no fue una excepcin: el Gran
Azul registr 3.248 patentes, 1.314 ms
que los de cualquier otra empresa.
Afortunadamente, IBM tambin tiene
un compromiso contrado con la comu-
nidad del software libre y, en virtud de
ello, el 11 de enero de este ao, publi-
caron una nota de prensa declarando
que donaban 500 de estos patentes a los
desarrolladores del cdigo abierto, para
ser utilizados en cualquier proyecto que
se conforme a la definicin de software
de fuente abierta acuada por la Open
Source Initiative (OSI).
Algunos de los patentes cedidos van
desde lo peregrino (US6199070 Uso de
bases de datos para registros de progra-
mas) hasta lo ininteligible (US5634006
Sistema y mtodo para asegurar QOS en
una red token ring utilizando un regu-
lador de acceso en cada nodo para la
asignacin del tamao de marco para
aplicaciones de transmisin virtuales
basadas en informacin negociada y
prioridad en la red)
Qu sera mucho mejor que IBM
donara TODOS sus patentes o que directa-
mente abandonara su poltica de registro
masivo de patentes? Hombre, eso sera lo
ideal en un mundo ideal, donde nadie
ms intentara acaparar lo que IBM no re-
gistra. Mientras tanto, 500 patentes dona-
dos pues es un comienzo. I
http://www-1.ibm.com/press/ Press
ServletForm.wss?TemplateName=ShowPre
ssReleaseTemplate&SelectString=t1.docu-
nid=7473.
IEl FUD No es
Necesariamente Malo...
Especialmente si no significa Fear,
Uncertainty and Doubt (Miedo,
Incertidumbre y Duda), sino Fedora
Users and Developers (Usuarios y
Desarrolladores de Fedora), la aso-
ciacin de los cuales va a
celebrar su primera
conferencia
internacional
el 18 de
febrero del
2005 en la
Massachusetts
Institute of
Technology, justo
despus de la
LinuxWorld Conference and Expo.
Una de las razones por las que Red
Hat, la empresa detrs de la iniciativa,
desea promocionar este evento, es por
que, sin ser un absoluto fracaso, las
aportaciones de la comunidad del cdigo
abierto a Fedora ha sido menor del
esperado. Greg Dekoenigsberg, director
de relaciones con la comunidad de Red
Hat, dice que se debe a que
Simplemente no haba mucho que
pudieran hacer ya que Red Hat no
poda hacer mucho ms que aceptar
informes de errores. (Esta vez) quere-
mos asegurarnos de que tenemos los sis-
temas y procesos que permita a la gente
contribuir.
Aparte de la conferencia, Red Hat ha
tomado los pasos necesarios para hacer
que la contribucin por parte de los
usuarios sea una realidad. Por un lado
ha abierto el CVS para que los usuarios
puedan acceder a software en fase de
desarrollo. En breve, los desarrolladores
externos tambin podrn aprobar con-
tribuciones al rbol de desarrollo.
Asimismo, la empresa ha empezado un
proyecto llamado Fedora Extras, que
permite a terceros mantener paquetes
que se hallan fuera de la responsabilidad
directa de Fedora. Y, por ltimo, ofrecen
servidores accesibles pblicamente que
permiten automatizar el proceso de
construccin de software Fedora y los
extras mencionados. Estos servidores
permitirn evaluar posibles conflictos
entre componentes. I
http://fedora.redhat.com/ http://
fedoraproject.org/wiki/FUDCon1.
Mandrake estuvo a punto de ser
financieramente guillotinado en el 2002
cuando se declar en bancarrota ante un
tribunal de cuentas. Pero hete que
nuevos vientos soplan para la empresa
gala y ya se encuentra casi recuperada de
un fatdica gestin por parte de una
plantilla de directivos de categora
mundial con experiencia (uno ya se
puede imaginar el dao que hace un
individuo con semejante ttulo a una
compaa, no querremos ni pensar en
toda una plantilla).
Afortunadamente los directivos
fueron sumariamente despedidos cuan-
do fue obvio que sus ambiciosos planes
lo nico que producan eran enormes
gastos.
En la actualidad, Mandrake ha vuelto
a sus orgenes y concentra sus esfuerzos
en la produccin de buenos productos de
cdigo abierto. A la lnea de SOs de con-
sumo, y sus ya reputadas distros para
fines especficos (p.e.: Multi Network
Firewall), se suma ahora un tndem de
distros diseado para asaltar la Bastilla
de los escritorios corporativos. El do de
productos se denominan Corporate
Desktop y Corporate Server respectiva-
mente.
El doblete est diseado para que
ambas partes se integren perfectamente
la una con la otra. Por un lado,
Corporate Desktop viene con el software
necesario para disponer de un escritorio
Linux y ser productivo en el rea de la
ofimtica en poco tiempo. Corporate
Server, por otro lado, trae todos los servi-
dores necesarios para soportar la carga
de un red empresarial. Las dos distribu-
ciones vienen con una serie de los ya
habituales asistentes Mandrake para la
configuracin por separado de cada una,
pero tambin vienen con otra serie de
asistentes para integrar los clientes con
los servidores y viceversa.
El software de escritorio cuesta 99
euros y el servidor 329 euros. Ambos
vienen con soporte tcnico y con asis-
tentes (como no) para actualizaciones. I
http://www.mandrakesoft.com/
products.
IMandrake para la Empresa
9 www.linuxmagazine.com.es Nmero 03
Buzn del Lector CORREO
Correo del Lector
Acceso de Escritura
IDe Vuelta al Cole, Paul
Hace unos das que cay en mis manos
el nmero 1 de vuestra revista y tras leer-
lo por completo decid comprar el
nmero 2 y realizar la suscripcin de
prueba para los 3 siguientes nmeros. La
revista me parece bien elaborada en
cuanto a contenidos, algo pobre en cuan-
to a diseo grfico aunque aceptable si
lo comparamos con el resto de revistas
de similar temtica pero sobre todo me
pareci muy decepcionante en lo refe-
rente a ortografa, gramtica y expresin.
A lo largo de las pginas de ambos
nmeros hay tildes que no estn puestas,
errores gramaticales, frases que no lle-
gan a trmino, confusiones entre a ver
y haber, errores de guionado y lo que
me ha impulsado a escribir este correo:
el ttulo del artculo de la pgina 83 del
segundo nmero que dice Bienvenidos
a la Aula Virtual. El ttulo es digno de
ser usado como comentario de texto en
un aula presencial de un curso no supe-
rior a quinto de primaria, pero su autor
ha necesitado largos aos de estudio,
una amplia experiencia laboral y, segura-
mente, el paso por la universidad para
cometer semejante tropela lingstica.
Yo comprendo que los costes de pro-
duccin de una revista y los escasos
mrgenes comerciales (?) que deja, no
permiten mantener en plantilla a un
corector de estilo, pero incorrecciones
como la de ese ttulo ni siquiera
traspasan por la ventana de los correc-
tores ortogrficos de procesadores de
El mes pasado, compr en la calle el
nmero 1 de la revista Linux magazine.
Me gustara beneficiarme de la oferta de
tres primeros nmeros de prueba al pre-
cio de 5 euros pero solamente haciendo
el pago contra reembolso. Me gustara
saber lo antes posible si puedo hacerlo
de esta forma.
Gracias,
Un saludo.
Lucas Jimnez
ISubscripcin
Para los que han expresado preocu-
pacin sobre la seguridad del sistema,
informaros que el formulario donde se
consignan los datos en la web est prote-
gido contra abusos y los detalles que via-
jan por correo hasta nuestro buzn de
suscripciones se encriptan con una clave
PGP de 1024 bits, por tanto, al menos
hasta que se popularicen los orde-
nadores cunticos, podemos decir que
vuestros datos estn seguros. I
Por tanto, descartando al redactor
como autor del fallo a quien hay que
culpar? Pues al director, a servidor, al
que suscribe. S, fui yo! Paul C. Brown!
Lo admito! En un arrebato de megalo-
mana, decid modificar el ttulo original
de Juan Rafael (muy largo para mi
gusto) por otro con ms gancho y, a la
postre, un fallo gramatical horroroso.
Espero que tanto los lectores como el
autor sepan disculparme y prometo pen-
srmelo dos veces antes de meterle
mano a otro titular sin consultarlo
primero. I
Puedes enviar tus
comentarios y sugerencias a
correo@linuxmagazine.com.es
texto, por lo que tampoco debieran pasar
de largo a los ojos del maquetista, el edi-
tor o incluso el director editorial (y no
digamos del autor). Pero eso s, jams
debiera ser el lector quien tenga que
padecer tales incorrecciones.
En definitiva, la tcnica no est reida,
ni debe estarlo nunca, con la lingistica
y la mejor forma de expresar y transmitir
el conocimiento tcnico es hacerlo con
correccin y rigor lingstico.
Muchas gracias por leer mi correo y
espero que la revista eleve el listn de la
calidad de las publicaciones tcnicas.
Un saludo.
Fernando Bueno
LM Tienes toda la razn.
Lamentablemente (y sirva de excusa) en
estos momentos contamos con un
equipo de esqueleto de correctores (una
sola persona) que ha de corregir las cien
pginas de la revista en un tiempo
rcord, mientras compagina sus tareas
con otros menesteres.
En cuanto al garrafal titular que men-
cionas, he de decir en defensa del autor,
Juan Rafael Fernndez, que Juan Rafael
no comete errores. Es un profesor de
largo historial y ahora coordina cursos
de Guadalinex para profesores de centros
educativos para la Junta de Andaluca.
Es escrupuloso tanto en lo que se refiere
al contenido tcnico de sus artculos,
como en lo que se refiere a su ortografa
y gramtica.
LM Lamentamos informaros a todos
los que nos habis preguntado lo mismo
que de momento Linux Magazine no
puede servir suscripciones contrareembol-
so, ni prevemos hacerlo en el futuro. Sin
embargo, existe una solucin: la transfe-
rencia bancaria. Para todos aquellos que
desean realizar un pago controlado,
podis mandarnos un correo a subs@li-
nuxmagazine.com.es y os facilitaremos
los detalles para realizar la transaccin.
10 Nmero 03 www.linuxmagazine.com.es
seguridad. El cortafuegos tradicional
es una especie de router que reside
en la Capa 3 del modelo de referen-
cia OSI. La Capa 3 es la capa de la
pila que escucha al Protocolo de
Internet, lee direcciones IP y toma
decisiones sobre donde dirigir los
datagramas IP. Un cortafuegos adems
inspecciona las cabeceras de la Capa 4
(TCP o UDP) para identificar servicios y
evaluar flags.
Pero los productos de cortafuegos
modernos pueden operar en otros niveles
de la pila de protocolos (Figura 1). Esta
metodologa multinivel puede extenderse
de modo descendente a la Capa 2, donde
encontrar el llamado bridgewall. Mien-
tras que un bridge (o switch)
simplemente evaluar la direccin MAC,
el bridgewall inspeccionar los paquetes
de la Capa 2 hasta la Capa 4. El bridge-
wall es un filtrador de paquetes hecho y
derecho, tan flexible como un switch.
Un gateway a nivel de aplicacin pro-
porciona una capa adicional de
seguridad al ms alto nivel. El gateway
captura la conexin TCP actuando como
un proxy entre el cliente y el servidor.
Esto permite al cortafuegos antes de
finalizar mirar el protocolo de aplicacin
y detectar los paquetes ilegales que
incumplan las reglas del protocolo
basadas en RFC.
Por
supuesto que la mayora de las variantes
de cortafuegos son productos caros para
grandes redes y configuraciones comple-
jas. Nosotros estamos ms interesados en
lo que podemos hacer slo con Linux y
con un software de cortafuegos fcil de
encontrar.
Como veremos en el tema de portada
de este mes, Linux tiene una buena
coleccin de cortafuegos, incluyendo
algunas utilidades poderosas que simpli-
fican el proceso de configuracin de
modo que no hace falta ser un experto
para manejar uno.
En nuestro artculo sobre Guarddog
vamos a mostrar como usar este programa
KDE para realizar configuraciones de
cortafuegos IPTables o IPChains. En nues-
tro siguiente artculo, sobre Bridgewall,
hablamos de los instrumentos para confi-
gurar un cortafuegos a nivel de la Capa 2.
Un problema en el manejo de cortafue-
gos es la cantidad de datos que maneja y
que se acumulan en los registros del soft-
ware de proteccin. En nuestro tercer
artculo se habla de herramientas para el
manejo y anlisis de los registros de los
cortafuegos. Y nuestra ltima historia
describe Shorewall, otra utilidad que no
es un cortafuegos propiamente hablando,
sino un instrumento para simplificar la
configuracin de un cortafuegos. I
S
u ordenador le permite ver el
mundo, pero usted no quiere que el
mundo le vea. Los intrusos son
cada vez ms sofisticados y cabe esperar
a que alguno se de cuenta tarde o tem-
prano de que su equipo est sin
proteccin. Si se conecta a Internet, nece-
sita estar detrs de algn tipo de
cortafuegos.
Hay cortafuegos de muchos tamaos,
formas, precios y diseos. Es Bastante
interesante notar que, lo que se sola lla-
mar cortafuegos, ahora tan solo es uno
ms de la gran gama de productos de
Los cortafuegos son cada vez ms complejos. Por suerte, las herramientas para su
manejo son cada vez ms simples y ms accesibles para los usuarios normales.
POR JOE CASAD Y ACHIMLEITNER
Introduccin
PORTADA
Cortafuegos para el da a da
No Slo para Expertos
Guarddog.........................................11
a utilidad de KDE Guarddog proporciona un
interfaz intuitivo para la configuracin de
cortafuegos en Linux.
Brigdewall ......................................14
Un cortafuegos a nivel de bridge puede pro-
porcionar una solucin simple con un
mnimo de reconfiguracin.
Analizadores Registros ...........18
Herramientas para analizar los ficheros de
log y que nos ayudan a entender el estado
de la red.
Shorewall .......................................22
Shorewall es un conjunto de ficheros para la
configuracin de cortafuegos basados en fil-
tros de red.
EN PORTADA
Figura 1: Los cortafuegos modernos puede actuar como bridges (izquierda), routers (centro) o gateways
a nivel de aplicacin (derecha).
11 www.linuxmagazine.com.es Nmero 03
Guarddog est diseado para usuarios
domsticos o de redes privadas. Aunque
distribuciones como Red Hat, Mandrake
y Suse tienen herramientas simples
basadas en GUI para los cortafuegos,
carecen de la posibilidad de manejar sis-
temas distribuidos. Los usuarios ms
exigentes que requieran una configu-
racin ms detallada, probablemente
preferirn usar Guarddog.
Agujeros de Seguridad
Los usuarios inexpertos tienen que ser
muy cuidadosos cuando configuren un
cortafuegos con Guarddog. La facilidad
que supone escoger una opcin y hacer
clicen ella de la GUI a menudo lleva a
los usuarios a abrir ms puertos de los
necesarios. Por otro lado, es bastante
fcil reforzar una mquina hasta tal
punto que algunos servicios dejen de
funcionar.
Tambin hay que tener en cuenta que
Guarddog es una aplicacin KDE y no
debera ejecutarse en un servidor en el
sentido tradicional de la palabra. Si tiene
un servidor dedicado en su LAN, lo pro-
pio es crear una configuracin con
L
as herramientas IPChains (Linux
2.2) e IPTables (Linux 2.4) confi-
guran el cortafuegos de Linux,
pero estas herramientas de lnea de
comandos pueden ser algo crpticas
para los recin llegados a Linux. Simon
Edwards desarroll Guarddog [1] para
simplificar la tarea de configurar el
cortafuegos. Guarddog es una utilidad
basada en GUI para manejar los corta-
fuegos. La utilidad Guarddog viene con
licencia GPL y funciona tanto en KDE 2
como KDE 3.
Los usuarios se pueden descargar la
versin estable 2.2.0 desde [2]. Adems
de los fuentes, el sitio tiene tambin
disponible los binarios ya listos para ser
ejecutados para Mandrake, Red Hat y
Debian. Si desea probar las ltimas ca-
ractersticas, pruebe la versin 2.3.2
desde [2]. Pero antes de hacerlo, com-
pruebe los pros y los contras en el
cuadro Para los Valientes.
El programa KDE Guarddog promete
una configuracin fcil del cortafue-
gos de Linux con tan solo unos
cuantos clics. Guarddog ayuda a los
usuarios inexpertos a proteger sus
mquinas, e incluso redes completas,
contra los atacantes.
POR HOLGER JUNGE
PORTADA Guarddog
Configuraciones de cortafuegos con Guarddog
Cuidado con el Perro!
La versin de desarrollo actual de Guarddog es la 2.3.2. Hay varias reticencias para usar esta ver-
sin en entornos productivos. Por un lado, el usuario valiente puede encontrar algunas
caractersticas nuevas. La versin 2.3.2 soporta reas de puertos para los protocolos definidos por
el usuario. Los desarrolladores han modificado tambin la versin para soportar Linux 2.6 y han
aadido algunos protocolos nuevos a la lista, como RSync, Distcc, GKRellm, Bittorrent, PGP Key
Server, Jabber sobre SSL y el protocolo Microsoft Media Server.
Para los Valientes
12 Nmero 03 www.linuxmagazine.com.es
Guarddog
PORTADA
Guarddog en un ordenador distinto y
luego copiar el script resultante al servi-
dor.
Como Guarddog est basado en
IPChains o en IPTables, los usuarios
deben asegurarse que los mdulos nece-
sarios del kernel estn disponibles en el
servidor. La mayora de las distribu-
ciones se hacen cargo de esto
automticamente. Si su distribucin no
lo hace, necesitar recompilar el kernel
para que incluya IPTables o IPChains.
Guarddog usa comandos filtros orien-
tados al protocolo. Los usuarios no
necesitan especificar los nmeros de
puertos, lo que ayuda a evitar errores de
configuracin.
Asimismo Guarddog soporta grupos
de mquinas o zonas y permite a los
usuarios la opcin de establecer zonas
desmilitarizadas (DMZ).
La GUI
Se debe ejecutar Guarddog con los privi-
legios de root para permitir al programa
aplicar las reglas del cortafuegos. La
Figura 1 muestra Guarddog justo
despus de haber sido ejecutado.
Desafortunadamente, la GUI de Guard-
dog no es muy intuitiva. La GUI de
Guarddog tiene cuatro solapas. La
primera de estas solapas, la solapa
Zones, permite a los usuarios agrupar
las mquinas en zonas.
Zone Properties acepta direcciones IP
o rangos de direcciones para la zona.
Hay dos zonas preconfiguradas lla-
madas Internet y Local que el usuario no
puede borrar. La zona Internet automti-
camente incluye cualquier direccin IP
(Asegrese que se aplican los cambios
pulsando Apply). Si se pulsa de nuevo la
caja de verificacin la marca se trans-
forma en una X para indicar que el
cortafuegos denegar de forma explcita
las conexiones que usen este protocolo.
Una caja de verificacin vaca indica
que el cortafuegos ignorar cualquier
peticin al puerto.
Los protocolos HTTP, FTP (en la cate-
gora File Transfer) y los protocolos de
correo SMTP y POP3 son otros protoco-
los que se usan habitualmente.
Registro de Protocolos
La solapa Logging (vase la Figura 3)
proporciona opciones detalladas para el
que no est incluida en cualquier otra
zona. Local incluye las direcciones de la
tarjeta de red local. Una mquina indi-
vidual estar bien con tan solo estas dos
zonas.
Se puede usar la solapa Protocol
(Figura 2) para permitir o denegar proto-
colos especficos. La estructura en rbol
del lado derecho de la ventana organiza
los protocolos por categoras. Normal-
mente el servicio DNS es el primero que
se necesita habilitar. La entrada DNS
est ubicada en la categora Network.
Haciendo clic en la caja de verificacin
de DNS Domain Name Server se coloca
una marca de verificacin que indica
que el servicio est permitido.
Figura 3: Los administradores pueden usar la solapa Logging para especificar que clase de registro debe
proporcionar el cortafuegos.
Figura 1: El GUI de Guarddog despus de ser ejecutado con dos zonas de red
preconfiguradas: Internet y Local.
Figura 2: La solapa Protocol permite especificar el protocolo permitido o dene-
gado por el cortafuegos. No hay que preocuparse por los nmeros de puerto.
13 www.linuxmagazine.com.es Nmero 03
opciones del cortafuegos para reflejar
sus necesidades. Si algo va mal, no se
preocupe: siempre se puede pulsar en
Restore to factory defaults para restau-
rar las opciones por defecto de
Guarddog. Las opciones por defecto
para Local Dynamic Port Range estn
bien en la mayora de los casos. Especi-
fica que rango de puertos puede usar
Linux para las conexiones salientes.
Si echa en falta algn protocolo en la
solapa Protocol, puede pulsar New Proto-
col e introducir el nombre del protocolo,
establecer si el protocolo es TCP o UDP
y especificar los nmeros de puertos que
usa.
Guarddog tiene una opcin til para
importar y exportar los scripts de corta-
fuegos creados con la herramienta.
Guarddog puede exportar la configu-
racin actual a un script de la shell
sencillo y almacenarlo en
/etc/rc.firewall. Como los servidores nor-
malmente no ejecutan KDE, los
administradores pueden simplemente
pulsar el botn Export para exportar un
script, copiar este script al servidor y
ejecutarlo en l.
Puerta de Enlace al Mundo
Desde luego, los cortafuegos de Linux
no se usan tpicamente para los sistemas
aislados, sino que se usan como parte de
la estructura de seguridad de una red
completa. En este caso, la mquina
Linux acta como una puerta de enlace
y tiene dos tarjetas de red, una de cara a
Internet y otra de cara a la red interna
(vase la Figura 5). Es bastante simple
configurar Guarddog para este esce-
nario, sin embargo se necesita un
sistema con la versin 2.4 del kernel.
Adems de configurar IP masquerading
antes de instalar el cortafuegos. Guard-
dog no puede ayudarle en este paso,
pero s la herramienta Guidedog en [4].
El primer paso es crear una zona
Guarddog nueva para la red local. Para
hacerlo, pulse New Zone en la solapa
Zone. Se puede llamar a la zona LAN,
por ejemplo. Despus plsese New
Address para establecer la direccin IP,
tal como 192.168.1.0/24. Ahora plsese
en Internet y Local en Connection para
asegurar que la LAN est conectada a
Internet y al ordenador local.
Seleccione Internet en la solapa Proto-
col y marque las cajas para los
protocolos requeridos en la columna de
la LAN. Finalmente, pulse Apply para
almacenar la configuracin en
/etc/rc.firewall y lance el cortafuegos. I
PORTADA Guarddog
registro de Guarddog en syslog. El re-
gistro proporciona a los usuarios una
herramienta para detectar escaneos de
puertos. Los usuarios de Guarddog
pueden establecer la tasa de registro
para restringir el nmero de entradas en
los registros del cortafuegos. Un lmite
para el nmero mximo de entradas
ayudar a evitar un ataque potencial por
denegacin de servicios, que a veces es
causado por una tormenta de paquetes
IP que llenan el syslog y sobrecarga el
disco duro.
Si necesita detalles de todos los
paquetes IP y TCP entrantes, puede
seleccionarse la opcin para registrar
todos los paquetes y los nmeros de
secuencia TCP en la base de la ventana.
La solapa Advanced (vase la Figura
4) permite a los administradores experi-
mentados ajustar con precisin las
[1] Guarddog:http://www.simonzone.com/
software/guarddog
[2] Descarga: http://www.simonzone.com/
software/guarddog/#download
[3] Manual online: http://www.simonzone.
com/software/guarddog/#manual
[4] Guidedog: http://www.simonzone.com/
software/guidedog/
INFO
Holger Junge trabaja para Lifemedien,
donde se encarga de los servidores de
dominio, de los servidores Web, el servi-
dor de base de datos MySQL y el
servidor de base de datos Oracle.
E
L
A
U
T
O
R
Figura 4: Guarddog soporta configuraciones del cortafuegos detalladas. Por ejemplo, los usuarios
pueden definir protocolos y exportar e importar scripts.
Figura 5: El ordenador cortafuegos de Linux acta como puerta de enlace para la red interna.
14 Nmero 03 www.linuxmagazine.com.es
Normalmente los cortafuegos se implementan como routers, pero no tiene por qu ser as. Los filtros a nivel del bridge
tienen una serie de ventajas que puede aadirlas a su red en una etapa ms tarda sin necesidad de cambiar la configu-
racin de los componentes de red.
POR RALF SPENNEBERG
L
inux se ha ganado una buena repu-
tacin como plataforma para
implementar un cortafuegos. El
kernel posee un poderoso filtro de
paquetes basado en Netfilter/IPTables.
En un escenario clsico de cortafuegos,
Netfilter est en el router, donde divide
la red en dos o ms subredes. Pero el
aadir un cortafuegos a una red ya
instalada puede suponer cambiar la
infraestructura de la misma. Este
transparente como cortafuegos de la red.
Por supuesto, el puente evala los
paquetes de los protocolos de las capas
superiores (direcciones IP, puertos TCP)
en su rol de cortafuegos. Pero los hosts
de la red no notarn nada, a menos que
intenten enviar paquetes ilegales.
Configuracin del Kernel
Lennert Buytenhek y Bart de
Schuymer desarrollaron un parche que
Bridgewall
PORTADA
esfuerzo supone cambiar las direcciones
IP y modificar los controles de accesos a
los servicios internos.
Es bastante sencillo aadir un bridge.
Los bridges actan en la capa 2 del
Modelo de Referencia OSI y normal-
mente inspeccionan las direcciones
MAC en vez de las direcciones IP (vase
el cuadro titulado Construyendo
Puentes). Linux realiza esta tarea de
forma inteligente efectuando un filtrado
Implementando un cortafuegos a nivel de bridge
Puente Levadizo
15 www.linuxmagazine.com.es Nmero 03
PORTADA Bridgewall
este paquete por defecto. El paquete con-
tiene el comando brctl, cuyo uso est
reservado al usuario root. El comando
brctl addbr br0 crea un bridge llamado
br0. El comando ip link show br0 con-
firma la existencia del bridge. Como el
bridge tiene un nombre, se pueden eje-
cutar mltiples bridges virtuales en una
misma mquina Linux.
A continuacin el bridge necesita
saber qu tarjetas Ethernet (NICs) tiene
que controlar. El comando brctl permite
asignar las NICs al bridge:
brctl addif br0 eth0
brctl addif br0 eth1
Las tarjetas de red no deben estar con-
figuradas en este punto; es decir, no
deben estar UP o tener una direccin IP.
La idea es habilitar las tarjetas despus
de habrselas asignado al bridge:
ip link set eth0 up
ip link set eth1 up
ip link set br0 up
El bridge ya est listo para entrar en
accin, como el comando ip link show
muestra (Figura 3). El bridge redirige
los paquetes y mantiene su propia
cach ARP; usa la cach para registrar
las entradas mostrando qu direccin
MAC tiene asignada cada interfaz
(vase el cuadro Construyendo
Puentes).
Bloqueando el Puente
Como cualquier otro cortafuegos, el
bridge tiene un conjunto de reglas que
describen qu paquetes debe permitir y
cuales debe denegar. Hay tres comandos
para crear dichas reglas:
iptables
ebtables
arptables
Todos los paquetes que el puente
redirige pasan por el filtro de red FORD-
WARD. Hay algunas cosas a destacar
cuando se usan las bien conocidas ipta-
bles en un bridge. Si una regla especifica
que los paquetes pueden pasar por el
bridge en una nica direccin, es impor-
tante usar -m physdev (vase la Tabla 1).
Esto permite a la poltica identificar el
puerto del bridge por el cual el paquete
llega o comprobar si incluso debe ser
manipulado por el bridge.
El siguiente ejemplo est diseado
para permitir conexiones SSH a la direc-
cin IP 192.168.0.16 (puerto TCP 22) en
una nica direccin. El servidor SSH est
accesible por eth1. Las conexiones slo
pueden establecerse por clientes conec-
tados por eth0. Se necesitan dos
comandos iptables para definir dicha
poltica:
iptables -A FORWARD -m physdev
--physdev-in eth0 U
--physdev-out eth1
--dport 22 -d 192.168.0.16 U
-m state
--state NEW -j ACCEPT
iptables -A FORWARD -m physdev
--physdev-is-bridged -m state
--state ESTABLISHED,RELATED U
-j ACCEPT
aade la funcionalidad de cortafuegos
a nivel de bridge al kernel 2.4 de
Linux. El kernel 2.6 lleva el parche
instalado por defecto y los admi-
nistradores simplemente tienen que
configurar el kernel correctamente
(vanse las Figuras 1 y 2).
Todas las opciones del bridge en el
grupo netfilter son importantes, por
ejemplo, ARPtables soporta
IP_NF_ARPTABLES, IP_NF_ARPFILTER y
IP_NF_ARP_MANGLE. Estas funciones
pueden implementarse como mdulos o
bien ir incluidas dentro del kernel. El
soporte de Physdev match tambin es
importante: IP_NF_MATCH_PHYSDEV.
Esta opcin es necesaria en el kernel 2.6
o posteriores para comprobar el interfaz
fsico cuando filtre paquetes en el
bridge.
Una vez que se haya compilado e
instalado el nuevo kernel de forma
satisfactoria, tan solo sern necesarias
algunas herramientas de usuario.
Aunque la mayora de las distribu-
ciones traen el programa iptables,
habr que instalar arptables y ebtables.
Si se est ejecutando el kernel 2.6 o
uno anterior, tambin habr que insta-
lar una versin ms reciente del
comando iptables.
El paquete bridge-utils [2] es necesario
para configurar el bridge. Las distribu-
ciones modernas normalmente instalan
Opcin Significado
--physdev-in Nombre Especifica el puerto por el que el paquete tiene que llegar al bridge para que se le aplique esta
regla.
--physdev-out Nombre Especifica el puerto por el que el paquete tiene que salir del bridge para que se le aplique esta regla.
--physdev-is-in El paquete viene desde un interfaz conectado al bridge.
--physdev-is-out El paquete saldr del ordenador va un interfaz conectado al bridge.
--physdev-is-bridged El paquete viaja a travs del bridge.
Tabla 1: Physdev Match
Figura 1: Para permitir el modo bridge con el kernel 2.6, los administradores
necesitan seleccionar 802.1d Ethernet Bridging en Networking Support.
Figura 2: La opcin Bridged IP/ARP packets filtering en la configuracin de fil-
trado de red del kernel debe estar habilitada.
16 Nmero 03 www.linuxmagazine.com.es
perteneciente a esta conexin
pasar por el bridge.
Coleccin de
Direcciones
Los cortafuegos a nivel de
bridge se utilizan muy a
menudo para aadir seguri-
dad a las redes, eliminando la
necesidad de cambiar la
infraestructura de la red y las
direcciones IP. Un punto posi-
ble de insercin es justo
delante del router que el administrador
no pueda cambiar o que no posea fun-
cionalidades de cortafuegos. Pero lo
mejor que hacen los cortafuegos a nivel
de brigde es subdividir redes que ante-
riormente estaban contiguas.
En este caso, las direcciones IP en
cada lado del bridge no pueden ser de
rangos especficos ya que han sido asig-
nadas de forma arbitraria. El comando
ipset proporciona a los administradores
un medio para subdividir la red: ipset
crea un conjunto de direcciones del que
los administradores pueden coleccionar
direcciones IP arbitrarias. Las siguientes
lneas crean un conjunto de direcciones
llamado left y aade tres direcciones IP
al conjunto:
ipset -F; ipset -X; ipset -N U
left iphash
El primer comando se encarga del
establecimiento de las conexiones, que
est restringido en la direccin deseada.
El segundo permite a cualquier paquete
Bridgewall
PORTADA
Figura 3: El bridge virtual est ejecutndose. La salida de ip
link showmuestra los datos del bridge seguidos de la etiqueta
:4 bro:.
El trmino bridge se refiere a una categora
de dispositivos que manejan directamente el
reenvo de paquetes de red en la capa 2 del
modelo OSI. (Los dispositivos conocidos
como switch son un tipo de bridge). Para
reenviar paquetes de la capa 2, el bridge
tiene que obtener las direcciones MAC de la
red local y recordar que interfaces y puertos
pertenecen a qu ordenador. Cuando el
bridge recibe un paquete con un destino
cuya direccin MAC es conocida, simple-
mente lo reenva al interfaz correcto y de
este modo evita el trfico innecesario. Si el
bridge no conoce la direccin MAC del des-
tino, tendr que reenviarlo por todos los
interfaces.
El comando brctl showmacs bro lista todas
las direcciones MAC conocidas de un bridge.
El comando proporciona una tabla de
entradas. La primera columna contiene el
nmero de puerto para la entrega de paque-
tes del ordenador y la segunda columna
tiene la direccin MAC. Le siguen ms colum-
nas con informacin de
configuracin.
Olvido de Tablas
Para estar al corriente, el bridge
elimina las entradas de direc-
ciones MAC antiguas de su base
de datos de reenvios. Los admin-
istradores pueden especificar
cunto tiempo debe manten-
erse una direccin MAC no
usada en la base de datos antes
de deshacerse de ella. El
comando para esto es brctl
setageingtime brosegundos.
El esfuerzo computacional
interno sera excesiva e innece-
sariamente alto, si el bridge
olvidara las direcciones MAC no usadas
inmediatamente. En vez de ello, el bridge eti-
queta primero las entradas no usadas como
invlidas y luego las elimina a intervalos
regulares (conocidos como intervalos de
recoleccin de basura). Se puede establecer
dicho intervalo introduciendo el comando:
brctl setgcint bro segundos. Por defecto es 0
segundos.
El protocolo Spanning Tree
Los switches modernos usan el protocolo
spanning tree para proporcionar una
configuracin avanzada. Si dos o ms
switches conectan dos subredes, descubren
todas las rutas posibles de una red a otra.
Despus de elegir un switch como raz , el
switch raz define caminos activos e inac-
tivos a travs de la red y propaga esta
informacin a todos los switches que haya
en la red.
Los switches bloquean los caminos y los
interfaces inactivos, impidiendo el duplicado
de paquetes (paquetes que vayan por dos
caminos) que puedan llegar a la red destino
(vase la Figura 4). Si un switch falla, el resto
de los switches descubren de nuevo qu
caminos estn an disponibles y evitan el
paso por el switch cado.
Linux soporta el protocolo spanning tree, sin
embargo, los administradores necesitan
introducir el comando brctl stp bro on para
activarlo. Los bridges pueden asignarse con
una prioridad de 0 a 65535: brctl set-
bridgeprio bro prioridad. El bridge con la
prioridad ms baja asume la funcin de raz.
Test de Funcin
Los bridges comprueban si los otros bridges
estn funcionando enviando un mensaje
hello a intervalos regulares. Los adminis-
tradores pueden establecer el intervalo de
intercambios de mensajes hello intro-
duciendo brctl sethello bro segundos. El
comando brctl setmaxage bro segundos
especifica cunto tiempo el otro bridge debe
esperar si no recibe un mensaje hello.
Pasado este intervalo, el bridge asume que el
otro est fuera de servicio.
Cuando un bridge est conec-
tado a una red, debe esperar un
perodo de tiempo antes de
empezar a reenviar paquetes.
Tiene que usar este perodo
para comprobar si la red usa el
protocolo STP. El siguiente
comando establece el retraso
inicial: brctl setfd brosegundos.
STP debe estar desactivado en
un bridge de filtrado: brctl stp
bro off. El cortafuegos tiene
que confiar en sus propias
reglas y debe evitar ser desha-
bilitado por un ataque STP.
Construyendo Puentes
Figura 4: Los bridges 1 y 2 conectan las redes A y B. El bridge con la prioridad ms
baja usa STP para definir caminos vlidos para los paquetes enviados desde A a B.
17 www.linuxmagazine.com.es Nmero 03
PORTADA Bridgewall
--destination-mac U
fe:fd:0:0:0:1 -j DROP
Esta sintaxis elimina todas los paquetes
respuestas ARP enviados al ordenador
con la direccin MAC fe:fd:0:0:0:1 que
no son originados desde el ordenador
con la IP 192.168.0.15. El paquete de
respuesta ARP le dice a una entidad
solicitante la direccin MAC asociada
con la direccin IP especificada. Aqu el
ordenador con la direccin MAC
fe:fd:0:0:0:1, que est en la red al otro
lado del bridge, slo consigue ver la
direccin MAC del ordenador con la
direccin IP 192.168.0.15.
EBtables
El comando ebtables es mucho ms
potente que el ARPtables. El comando
ebtables soporta NAT para las direc-
ciones MAC del bridge. El bridge incluso
puede impedir a los atacantes averiguar
la direccin MAC de un ordenador
conectado a otro puerto. El bridge enva
su propia direccin MAC en respuesta a
solicitudes ARP y proporciona MAC-
NAT para todos los paquetes IP. El
primer comando en el Listado 1 le dice
al bridge que responda con su propia
direccin MAC (0:ff:90:2b:a6:16) a
cualquier solicitud ARP que quiera saber
la direccin MAC para la IP
192.168.0.16.
La direccin IP del ordenador que se
desea esconder detrs del bridge nece-
sita seguir: --arp-ip-dst. --arpreply-mac es
la direccin MAC del bridge. Para los
paquetes IP de MAC-NAT, adicional-
mente se necesitan las lneas 2 y 3 del
Listado 1. En nuestro ejemplo
192.168.0.16 es la direccin IP del orde-
nador que se esconder detrs del
bridge, y su direccin MAC es
fe:fd:0:0:0:1.
La excelente documentacin en la
pgina Web de EBtables en [3] propor-
ciona ms informacin sobre las
capacidades del comando ebtables.
En las Profundidades de la
Red
Un cortafuegos a nivel de bridge pro-
porciona a los administradores una
nueva clase de filtrado de paquetes que
permite mayor control sobre la capa 2.
Lo realmente prctico de los cortafue-
gos de tipo bridge es que pueden
aadirse de forma transparente a una
red existente. El bridge simplemente
reemplaza a un hub, switch o cable
cruzado en una red. Si se necesita blo-
quear unos cuantos ordenadores con
apariencia sospechosa detrs de un
cortafuegos, se puede hacer sin tener
que reconfigurar la red entera simple-
mente aadiendo un cortafuegos a nivel
de bridge. I
ipset -A left 192.168.0.5
ipset -A left 192.168.0.17
ipset -A left 192.168.0.18
El nuevo conjunto puede utilizarse por
las reglas IPtables. Con la opcin -m set
se maneja esto. -set Nombre especifica el
conjunto:
iptables -A FORWARD -m physdev
--physdev-in eth0 U
--physdev-out eth1
--dport 22 -m set U
--set left -m state
--state NEW -j ACCEPT
Adems de los paquetes IP, los paquetes
ARP son tambin objetivo de las reglas
del cortafuegos. Muchos ataques a
travs de redes internas estn basados
en la manipulacin de peticiones y
respuestas ARP.
ARPtables
El comando arptables filtra paquetes
ARP. Fuera de las operaciones del
bridge, el comando slo tiene sentido en
las cadenas INPUT y OUTPUT, ya que
los routers no redirigen los paquetes
ARP. Pero en un bridge, ARPtables
puede filtrar paquetes en la cadena FOR-
WARD. La sintaxis del comando es
similar a iptables. ARPtables usa los
objetivos ACCEPT y DROP, la opcin
REJECT no tiene sentido aqu.
arptables -A FORWARD -s ! U
192.168.0.15
[1] IPtables: http://www.iptables.org
[2] Linux bridge: http://bridge.sf.net
[3] EBtables: http://ebtables.sf.net
INFO
Figura 5: La pgina de Sourceforge para EBtables proporciona documentacin y ejemplos del mundo real.
01 01 ebtables -t nat -A
PREROUTING -p ARP --arp-ip-dst
-j arpreply
02 --arpreply-mac
0:ff:90:2b:a6:16
03 02 ebtables -t nat -A
PREROUTING -p IPv4 -d
0:ff:90:2b:a6:16 --ip-dst
04 192.168.0.16 -j dnat
--to-dst fe:fd:0:0:0:1
--dnat-target ACCEPT
05 03 ebtables -t nat -A
POSTROUTING
06 -p IPv4 -s
fe:fd:0:0:0:1 -j snat --to-src
0:ff:90:2b:a6:16
07 --snat-target ACCEPT
Listado 1: MAC-NAT
18 Nmero 03 www.linuxmagazine.com.es
El cortafuegos Netfilter crea ficheros
de registros muy detallados que real-
mente nadie quiere inspeccionar a
mano. Las herramientas de anlisis
de ficheros de registros como IPtables
Log Analyzer, Wallfire Wflogs y
FWlogwatch ayudan a los admi-
nistradores a seguir la pista de
acontecimientos y de filtros para
mensajes importantes.
POR RALF SPENNEBERG
E
n un entorno protegido por un
cortafuegos, el administrador debe
seguir la pista de los acontecimien-
tos mediante el registro de tantas
transacciones como sean posibles. Al
mismo tiempo, los administradores
quieren evitar inspeccionar ficheros de
registros de cientos de megabytes
porque slo estn interesados en
algunos en concreto.
Asistentes para los Ficheros
de Registros
Las herramientas de anlisis de proto-
colo proporcionan una solucin a este
dilema. Los usuarios de Linux tienen
varias opciones a la hora de elegir un
programa de anlisis de cortafuegos. En
datos Ulog son raras. Ulogd-php [5] es
uno de los primeros. Al contrario que los
otros sistemas de registros, Ulogd puede
registrar los eventos que causaron una
alerta en el cortafuegos en su base de
datos.
IPtables Log Analyzer
IPtables Log Analyzer presta servicio a
los registros de IPtables para Linux 2.4 o
2.6 en formato de pginas HTML (Ver
Figura 1). La herramienta incluye tres
componentes. El sistema de entrada de
la base de datos almacena los eventos
en una base de datos MySQL; los admi-
nistradores pueden usar el interfaz web
para acceder a la base de datos. El sis-
tema de entrada de la base de datos, la
Analizadores de Registros de Cortafuegos
PORTADA
este artculo, veremos tres alternativas:
IPtables Log Analyzer [1], WFlogs del
proyecto Wallfire [2] y FWlogwatch [3].
Los tres programas soportan una amplia
gama de protocolos y muestran los
resultados como pginas HTML muy
bien formateadas; WFlogs y FWlog-
watch adems tienen modos en tiempo
real. IPtables Log Analyzer es la nica
herramienta que utiliza bases de datos
para el almacenamiento de mensajes.
IPtables Log Analyzer se basa en un
sistema de entrada especial. Ulogd de
Harald Weltes [4] maneja esto de forma
nativa, sustituyendo el sistema de syslog
que trae por defecto. Desafortunada-
mente, las herramientas de anlisis
gratuitas que soportan las bases de
Herramientas de Anlisis para Ficheros de Registros de Cortafuegos
Anlisis Final
19 www.linuxmagazine.com.es Nmero 03
PORTADA Analizadores de Registros de Cortafuegos
parmetros de la base de datos y la con-
figuracin del servidor web (usuario,
password, URL). El ltimo paso es insta-
lar y activar el sistema de entrada de la
base de datos. Ser necesario de nuevo
modificar las credenciales de los usua-
rios de la base de datos.
IPtables Log Analyzer tiene tres va-
riantes del sistema de entrada de la base
de datos denominadas feed_db.pl,
feed_db-shore-wall.pl y feed_db-
suse.php. Para lanzar el sistema de
entrada automticamente, el admi-
nistrador necesita mover el script de
arranque, scripts/iptablelog, a /etc/init.d
y crear los enlaces en rc.
WFlogs
WFlogs es la herramienta de anlisis
que pertenece al proyecto Wallfire [2],
aunque puede usarse independiente-
mente. El mdulo del programa analiza
y procesa Netfilter, Ipchains, IPfilter,
Cisco PIX, Cisco IOS y ficheros de re-
gistro Snort, mostrando los resultados
como texto, HTML, XML o en tiempo
real. WFlogs no tiene soporte de base de
datos, pero puede convertir formatos de
ficheros de registros entre Netfilter,
IPchains e IPfilter.
Instalar WFlogs en Debian es muy
fcil. Debian Sid incluye WFlogs y los
paquetes para Woody estn disponibles
en [8]. Los usuarios de otras distribu-
ciones pueden compilar WFlogs desde el
cdigo fuente. Wflogs tambin necesita
la biblioteca WFnetobjs, otro compo-
nente de Wallfire [2]. La librera
alternativa DNS, adns [9], tambin se
recomienda para la resolucin de nom-
bres de forma asncrona DNS.
Para compilar Wflogs, se siguen los
pasos tpicos ./configure; make; make
install; se necesitar especificar el direc-
torio de WFnetobjs en los pasos de
configuracin.
De Netfilter a HTML
WFlogs puede procesar los registros del
cortafuegos de forma online u offline.
Los siguientes comandos crean una
vista en formato HTML de un fichero de
registro de Netfilter (Figura 2):
wflogs -i netfilter -o htmlU
netfilter.log > logs.html
En el modo tiempo real, WFlogs analiza
las nuevas entradas del fichero de re-
gistros y muestra por pantalla estas
entradas. Los administradores pueden
usar la shell para modificar interactiva-
mente el comportamiento de WFlogs.
Los siguientes comandos le dicen a
base de datos y el interfaz web pueden
ejecutarse todos en la misma mquina o
en mquinas distintas. Por otro lado, la
base de datos puede almacenar ficheros
de registros de varios cortafuegos.
Despus de decidir la arquitectura,
el administrador necesita crear una
base de datos MySQl denominada ipta-
bles, permitir a los usuarios el acceso
a iptables_admin e iptables_user y
generar tablas en la base de datos (Lis-
tado 1). Tambin es necesario definir
las reglas de IPtables. Dos cadenas
definidas por el usuario es la mejor
forma (Listado 2).
Creando Cadenas
En vez de -j ACCEPT, IPtables ahora
usar -j LOG_ACCEPT. Estas modifica-
ciones no son necesarias para Shorewall
[6] o Suse Firewall en CD [7]. Sin
embargo Suse dice que no dar soporte
a su producto de cortafuegos en el
futuro, que es otra razn para que los
administradores escojan herramientas y
actualizaciones del mundo de cdigo
abierto.
El siguiente paso es instalar el interfaz
web. Para hacer esto, el administrador
necesita mover el directorio web al
directorio raz del servidor web y modi-
ficar config.php para reflejar los
Figura 1: IPtables Log Analyzer da al administrador una clara visin de los ficheros de registros del corta-
fuegos.
01 # mysql -u root -p
02 mysql> create database
03 iptables;
04 mysql> grant
05 create,select,insert
on
06 iptables.* to
07
iptables_admin@localhost
08 identified by
'g3h31m';
09 mysql> grant create,select on
10 iptables.* to
11
iptables_user@localhost
12 identified by
'auchgeheim';
13 mysql> quit
14 # cat sql/db.sql | mysql -u
15 iptables_admin -p
iptables
Listado 1: Base de Datos
MySQL
20 Nmero 03 www.linuxmagazine.com.es
enviando mensajes de correo o
automticamente modificando las reglas
del cortafuegos.
Los administradores pueden usar el
servidor web integrado para supervisar
el estado de FWlogwatch desde un nave-
gador web.
FWlogwatch soporta IPchains
(opcin i), Netfilter (n), Ipfilter (f),
IPFW (b), Cisco IOS (c), Cisco PIX (p),
Netscreen (e), Windows XP (w), Elsa
Lancom (l) y formatos Snort (s). La
instalacin es tan fcil como lanzar los
procesos make && make
install && make install-con-
fig. Boris Wesslowski tiene
los paquetes para Red Hat y
Debian en la pgina princi-
pal del sitio web de
Fwlogwatch.
Los administradores
pueden configurar el com-
portamiento de FWlogwatch
usando el archivo de confi-
guracin, que viene
sumamente comentado.
Tambin pueden configurar
FWlogwatch mediante la
lnea de comandos. En las
pginas de ayuda (comando
man) vienen explicadas las
opciones. Por ejemplo, el
siguiente comando ejecuta
FWlogwatch en modo
resumen:
fwlogwatch -b -Pn -U U
'Spenneberg.Com'-p -n -N -o U
output.html -t -w U
/var/log/messages
La opcin -Pn habilita el analizador de
Netfilter. -U permite al usuario especi-
ficar una cabecera para el resumen. La
opcin -o especifica el fichero de salida; -
w estipula la salida HTML. -n y -N
permite la resolucin de nombres de
hosts y servicios. El resultado es un
resumen en formato HTML del fichero
de registros del cortafuegos.
Respuesta Rpida
La opcin de ejecucin de FWlogwatch
en modo tiempo real permite a los
administradores reaccionar ante men-
sajes del fichero de registros y a la vez
mostrar el estado actual en la ventana
del navegador. FWlogwatch se ejecuta
en segundo plano como un servicio y
monitoriza el fichero de registros, ana-
lizando de nuevo el archivo de
configuracin si se recibe un SIGHUP.
SIGUSR1 le indica al servicio que vuelva
a abrir el fichero de registros. Esta carac-
terstica es til para ir rotando ficheros
de registros, por ejemplo.
Los administradores pueden especi-
ficar el valor umbral para que
FWlogwatch reaccione a mensajes del
fichero de registros disparando alarmas o
respondiendo con scripts. Hay dos
WFlogs que monitorice inte-
ractivamente un fichero
denominado /var/log/warn
en tiempo real:
wflogs -RI -o humanU
/var/log/warn
La opcin -P le dice a WFlogs
que procese los mensajes
ms antiguos del fichero.
WFlogs no se lanza por men-
sajes que no sean del
cortafuegos.
Filtrado
Las opciones de filtrado
pueden restringir la salida a
mensajes especficos. El fil-
tro siguiente es de la
documentacin de WFlogs;
lista las conexiones Telnet y
SSH denegadas para los lti-
mos tres das de la red
10.0.0.0/8:
wflogs -f '$start_time >= U
this 3 days ago] &&$start_timeU
< [this 2 days ago] && U
$chainlabel =~ /(DROP|REJECT)/U
&& $sipaddr == 10.0.0.0/8 && U
$protocol == tcp && ($dport ==U
ssh || $dport == telnet) && U
($tcpflags & SYN)' -i U
netfilter -o text U
--summary=no
FWlogwatch
Boris Wesslowski desarroll FWlogwatch
para RUS-CERT en la Universidad de
Stuttgart, Alemania. La versin 1.0 [3]
de la herramienta de anlisis ahora ha
sido lanzada bajo licencia GPL.
FWlogwatch tiene tres modos de
operacin: Modo Log Summary, Modo
Interactive Report y Modo Realtime
Response. En el modo Log Summary, el
programa genera texto o pginas HTML
con el resumen del anlisis de los
ficheros de registros del cortafuegos
(Figura 3). En el modo Interactive Report,
FWlogwatch genera automticamente
informes de incidencias que los admi-
nistradores pueden reenviar a quienes
hayan sido afectados por el incidente.
En el modo Realtime, FWlogwatch
responde a ataques ejecutando scripts,
Analizadores de Registros de Cortafuegos
PORTADA
Figura 2: La pgina del Resumen de WFlogs muestra cuantos paquetes han
sido registrados para cada fuente.
01 iptables -N LOG_DROP
02 iptables -A LOG_DROP -j LOG
--
03 log-tcp-options
--log-ipoptions
04 --log-prefix
05 '[IPTABLES DROP] :'
06 iptables -A LOG_DROP -j DROP
07 iptables -N LOG_ACCEPT
08 iptables -A LOG_ACCEPT -j LOG
09 --log-tcp-options
--log-ipoptions
10 --log-prefix
11 '[IPTABLES ACCEPT] : '
12 iptables -A LOG_ACCEPT -j
13 ACCEPT
Listado 2: Analizador de
Registros de IPtables
21 www.linuxmagazine.com.es Nmero 03
PORTADA Analizadores de Registros de Cortafuegos
con el analizador Netfilter. El proceso se
ejecuta bajo la identificacin de usuario
fwloguser.
Si se excede el umbral de cinco cone-
xiones en 600 segundos, Fwlogwatch
realiza una accin configurable. Fwlog-
watch monta un servidor de web en
127.0.0.1:8888, donde un usuario ralf
puede conectarse con la contrasea pass-
word. FWlogwatch utiliza contraseas
encriptadas con DES, que pueden gene-
rarse tecleando htpasswd -nb usuario
contrasea. Cuando el usuario se registra
en esta pgina, aparece lo mostrado en la
Figura 4. Esta pgina conduce a otras
pginas con una amplia gama de
opciones de configuracin de Fwlog-
watch (Figura 5).
Opciones
FWlogwatch tiene una enorme va-
riedad de caractersticas, que van
desde un simple resumen hasta un
modo en tiempo real con respuestas
configurables. Pero las otras herra-
mientas que se comentan en este
artculo merecen tambin una buena
consideracin. Si necesita filtros
potentes, WFlogs puede ser una
buena opcin para su red. El IPta-
bles Log Analyzer es una opcin
interesante para algunas situaciones
por su soporte de base de datos.
El IPtables Log Analyzer da a los
administradores de sistemas la opcin de
utilizacin de sentencias SQL para bus-
car los mensajes del cortafuegos, en vez
de tener que lanzar las bsquedas desde
una interfaz web. I
opciones de configuracin importantes:
recent (-l) define el perodo de tiempo a
monitorizar y alert_threshold (-a) define
el nmero de eventos que en este tiempo
tienen que suceder para lanzar una
respuesta. El Listado 3 muestra su con-
figuracin. Este ejemplo configura
FWlogwatch para el modo en tiempo real
Figura 4: El servidor web integrado en FWlog-
watch permite a los administradores monitorizar
el estado actual del cortafuegos.
Figura 5: Los administradores pueden utilizar un
navegador para configurar FWlogwatch. El Alert
Threshold especifica el nmero de mensajes nece-
sarios para lanzar la respuesta de FWlogwatch.
E
[1] IPtables Log Analyzer: http://www.gege.
org/iptables/
[2] Proyecto Wallfire (WFlogs y WFnetobjs):
http://www.wallfire.org
[3] FWlogwatch: http://fwlogwatch.
inside-security.de
[4] Ulogd: http://gnumonks.org/projects/
ulogd
[5] Ulogd PHP:http://www.inl.fr/download/
ulog-php.html
[6] Cortafuegos Shorewall: http://shorewall.
sourceforge.net
[7] Cortafuegos Suse:http://www.suse.de/
en/ business/products/suse_business/
firewall/
[8] Paquetes WFlogs,Debian Woody: http://
people.debian.org/~kelbert/
[9] GNU adns:http://www.chiark.greenend.
org.uk/~ian/adns/
INFO
Ralf Spenneberg es un freelance de
Unix/Linux, profesor y autor. El ao
pasado vi la luz su primer libro: Sis-
temas de Intrusin y Deteccin para
Servidores Linux. Ralf tambin ha
desarrollado varios trabajos de edu-
cacin.
E
L
A
U
T
O
R
Figura 3: En Modo Resumen, FWlogwatch da a los administradores una vista de la actividad del fichero
de registro del cortafuegos.
01 realtime_response = yes
02 parser = n
03 run_as = fwloguser
04 recent = 600
05 alert_threshold = 5
06 notify = yes
07 notification_script = /usr/
08 sbin/fwlw_notify
09 server_status = yes
10 bind_to = 127.0.0.1
11 listen_port = 8888
12 status_user = ralf
13 status_password =
14 i0QlAmOg4PrAA
15 refresh = 10
Listado 3: Fwlogwatch en
Modo Tiempo Real
22 Nmero 03 www.linuxmagazine.com.es
Cuando los usuarios piensan en su estacin de trabajo
en casa olvidan normalmente la seguridad. Pero el peli-
gro acecha, esperando golpear a los desprevenidos.
Shorewall ayuda a los usuarios habituales de Linux a
mantener a los intrusos fuera.
POR JAMES MOHR
L
a nica forma de que nuestro sis-
tema sea completamente seguro
frente a ataques es no conectarlo
nunca a Internet. Cada vez que abrimos
la puerta para salir tambin la abrimos
para que hackers potenciales entren.
Algunos usuarios tienen la equivocada
creencia de que los intrusos solo atacan
sitios de alto renombre y no estn intere-
sados en estaciones de trabajo
personales. La verdad es que todas las
estaciones de trabajo conectadas a Inter-
net estn en peligro de ser atacadas,
incluso las que se conectan mediante
telfono analgico normal. En muchos
casos estos ataques son aleatorios, de
fuerza bruta, donde el atacante utiliza
una larga lista de conocidos agujeros de
seguridad.
Para frustrar a los atacantes simple-
mente podramos deshabilitar todos los
puertos de entrada, haciendo en esencia
nuestro equipo invisible al mundo. Sin
embargo, cuando necesitamos o simple-
mente queremos proporcionar servicios
desde nuestro ordenador debemos usar
otro tipo de proteccin.
sita ser especficamente configurado en
el modo compatibles con ipchains
para que trabaje con stas.
Podemos descargar la ltima versin
de Shorewall desde la pgina Web de
Shorewall Web [2] bien como cdigo o
como paquete RPM. Debemos saber que
la versin RPM no ha sido comprobada
con cada una de las distribuciones, si
bien s ha sido comprobada con las prin-
cipales como SuSE, Redhat y Mandrake.
Si no estamos seguros debemos compro-
barlo en la pgina de Shorewall.
Para que Shorewall funcione necesita-
mos los paquetes de iptables e iproute/
iproute2. Estos paquetes son propor-
cionados habitualmente por defecto en
la mayora de las distribuciones por lo
que no debera ser un problema. La
razn por la que necesitamos las iptables
es porque Shorewall no es realmente un
cortafuegos en s mismo. Shorewall no
es responsable de comprobar, filtrar y
gestionar paquetes. Shorewall simple-
mente coge sus archivos de
configuracin y usa el comando iptables
para cargarlas en el ncleo.
Shorewall
PORTADA
Incluso el ms pequeo de los nego-
cios necesita la proteccin que
proporciona un cortafuegos. La mayora
de los usuarios no puede permitirse los
miles de dlares que cuesta un cortafue-
gos comercial. Afortunadamente hay
soluciones de cdigo abierto que ofrecen
la proteccin adecuada. Una de esas
soluciones es Shorewall.
Entre Bastidores
Shorewall es el nombre comn del
cortafuegos Shoreline Firewall. Desde
la perspectiva del usuario, Shorewall es
un conjunto de archivos fciles de con-
figurar que se utilizan para configurar
Netfilter [1]. Netfilter es una funcin
del ncleo de Linux 2.4.x y 2.6.x que
permite a los mdulos del ncleo
acceder al conjunto de protocolos de
red en distintos lugares. El mdulo del
ncleo puede hacer casi todos con el
paquete de red, incluyendo simple-
mente dejarlos caer o manipularlo.
Netfilter tambin soporta las antiguas
ipchains, la instalacin empaquetada
de filtro en ncleos 2.2. Netfilter nece-
Configuracin de Netfilter y tablas ip con Shorewall
La Mesa Servida
23 www.linuxmagazine.com.es Nmero 03
PORTADA Shorewall
el paquete. Este concepto es bsicamente
comn en todo software cortafuegos y
puede utilizarse en redes con decenas,
incluso cientos de ordenadores, si bien
es probable que, con muchos orde-
nadores hablando entre ellos, prefiramos
subdividir nuestra red en pequeos seg-
mentos. Cada segmento tambin puede
ser gestionado por su propio cortafuegos
Shorewall.
Algo que debemos saber es que no
necesitamos dedicar un equipo especfi-
camente como cortafuegos. Si bien esto
es una prctica comn y generalmente
una buena idea, los usuarios domsticos
no dispongan del espacio necesario para
usar un equipo especfico para cada fun-
cin. Si nuestra estacin de trabajo se
conecta directamente a Internet
podramos aadir un cortafuegos direc-
tamente a nuestro equipo.
Mi red consiste en un ordenador con
tarjeta DSL que se conecta a Internet,
una mquina con Windows XP y otra
con Linux. Cada una tiene una funcin
especfica y permito diferentes cone-
xiones desde y hasta estas mquinas.
Tan simple como es la configuracin
de mi red, solo tengo que cambiar un par
de archivos de configuracin para usar
Shorewall. Debido a que esta es una con-
figuracin comn y simple, es un buen
punto de partida.
Configuracin Bsica
El archivo principal de configuracin es
/etc/shorewall/shorewall.conf. shore-
wall.conf nos permite configurar todo,
desde el comportamiento al arranque
hasta el comportamiento al apagarlo. Si
bien podemos configurar muchos va-
lores distintos en este archivo an no he
encontrado ninguna razn para cambiar
ninguno de ellos en mi sistema.
Puede que ya estemos familiarizados
con el trmino segmento para denomi-
narporciones especficas de una red.
Shorewall usa el trmino zona. En mi
configuracin tengo cuatro zonas: fw (el
propio cortafuegos y mi estacin de tra-
bajo), net (Internet) y loc (la red local).
Los nombres de las zonas deben ser
cortos (5 caracteres o menos) y pueden
contener letras o nmeros. Debemos
saber que no podemos usar el nombre de
zona especial all. Tampoco nos podemos
referir a una zona distinta a la del corta-
fuegos mediante la variable FW del
archivo shorewall.conf. Este nombre
cambia por defecto a fw.
Aunque no proporcionamos ningn
servicio a ordenadores fuera de nuestra
red local necesitamos la zona Internet.
Recordemos que las reglas iptable se
definen mediante una conexin espec-
fica, o lo que es lo mismo, definida por
dos puntos finales. Uno de los puntos
puede ser nuestra estacin de trabajo,
siendo el otro Internet. Por tanto necesi-
tamos definir una zona especficamente
como Internet.
Debemos saber que estos nombres son
solo un acuerdo. Si bien son los que
Shorewall usa por defecto para estas
zonas, las podemos llamar como que-
ramos mientras que seamos consistentes
Debido a que iptables asume la tarea
de manipular tablas dentro del ncleo,
Shorewall no se necesita ms una vez lo
hemos ejecutado. Incluso podemos ver
que esta ocurriendo echando un vistazo
al propio programa Shorewall. No es
necesario rebuscar a travs de mucho
cdigo. El programa Shorewall (normal-
mente /sbin/shorewall) es un archivo de
comandos.
Para que iptables sepa lo que debe
hacer debemos indicarle al ncleo las
reglas. Las llamadas rulesets se definen
dentro de las iptables y estn compues-
tas de una conexin y una serie de
clasificadores. Esto determina si una
conexin en particular se permite y si y
como debe ser manipulado o redirigido
Figura 1: Una configuracin Shorewall para entornos empresariales. Ntese las distintas zonas de
seguridad.
24 Nmero 03 www.linuxmagazine.com.es
net ppp0 routefilter,norfc1918
loc eth0 detect -
Como podemos observar, la zona Inter-
net est conectada a la interfaz ppp0 y
la zona local est conectada a la inter-
faz eth0. Debido a que tengo tres
zonas, puede que nos preguntemos por
qu no hay ninguna lnea para la zona
del cortafuegos. Bueno, es sencillo, el
cortafuegos se conecta a las otras zonas
a travs de una de las interfaces ya
especificadas. Por tanto quizs sea
mejor pensar en el archivo interface
como el lugar donde se define que
interfaz usa el firewall para hablar con
las otras zonas.
En el caso de la interfaz ppp0 la
columna difusin tiene un guin (-).
Debido a que la conexin PPP no tiene
difusin, podramos haberlo dejado en
blanco. No obstante, como deseaba
especificar algunas opciones adicionales,
necesitaba ocupar el espacio de alguna
manera. Si no hubiera opciones simple-
mente podramos haber dejado los dos
espacios en blanco. No obstante, a m
siempre me gusta incluir un guin en
vez de dejar el espacio libre con el fin de
recordar que falta algo.
La opcin routefilter que hemos
especificado le indica al ncleo que debe
rechazar cualquier paquete de la interfaz
indicado cuya direccin origen haya sido
encaminada fuera con un interfaz dis-
tinta. En este caso, si el interfaz ppp0
recibe un paquete con una direccin
original entrante que normalmente se
habra dirigido fuera desde la interfaz
eth0, esta sera abandonada. Esto es lla-
mado anti-spoofing.
La segunda opcin, norfc1918, indica
al ncleo que no debe enrutar direc-
ciones especificadas como privadas en
RFC 1918. RFC 1918 lista una serie de
rangos de direcciones que pueden ser
usadas por cualquiera y no deben se
enrutadas. Esta opcin asegura que no lo
sern. Los detalles respecto a RFC 1918
pueden ser encontrados en [3].
Aqu hemos tenido un problema.
Queremos que nuestros otros orde-
nadores sean capaces de acceder a
Internet, pero tienen direcciones en el
rango marcado por RFC 1918. Entonces,
cmo pueden acceder a Internet?
Bueno, eso lo veremos en breve.
Podemos configurar Shorewall de
forma que se comporte de determinadas
maneras en base a las zonas ajustando
condiciones especficas para cada zona.
Los ajustes por defecto para cada zona
son iguales (como nos podemos imagi-
nar) y estn en el archivo policy. Los
campos en este archivo son: cliente (la
zona origen), servidor (la zona destino),
poltica (lo que se debe hacer por
defecto) y nivel de registro (cuanta infor-
macin debe ser almacenada).
El listado 3 muestra un archivo de
poltica de ejemplo. Observemos las lti-
mas dos lneas. La primera indica que
cualquier trfico que haya sido compro-
bado y venga desde Internet
simplemente debe ser abandonado
(ignorado). Tenemos cuatro opciones
para la poltica de conexin:
ACCEPT (Aceptar) - Acepta la solicitud
de conexin. DROP (Dejar) - Ignora la
solicitud de conexin. REJECT (Re-
chazar) - Devuelve un error determinado
al equipo solicitante. CONTINUE (Con-
tinuar) - Nos permite tener anfitriones en
mltiples zonas y aplicar reglas de
ambas zonas.
El nivel de registro determina cuanta
informacin se envia al registro del sis-
tema (syslog). Debemos recordar que
todo esto se realiza con los iptables que
existen en el ncleo. Esto significa que
toda la informacin es enviada por la
a los largo de los archivos de configu-
racin.
Los permisos en el directorio
/etc/shorewall est puesto en 700 por
defecto, lo que significa que solo el
propietario (raz) tiene acceso. Incluso el
permiso de lectura puede ser peligroso
puesto que alguien puede ser capaz de
ver un agujero en la seguridad y
explotarlo.
Las zonas estn definidas en el archivo
/etc/shorewall/zones. Cada entrada tiene
tres valores: nombre de la zona (usado
para referirse a sta en los otros
archivos), nombre a mostrar (aparece
cuando shorewall esta cargando las
reglas) y un comentario. El listado 1 nos
muestra el archivo zones bsico.
Definicin de los Caminos de
Comunicacin
Si bien hemos definido las zonas, el
cortafuegos an no sabe como comuni-
carse con cada zona. Esto es debido a
que an no hay asociacin entre los
nombres de las zonas y la propia red.
Esto se hace usando el archivo
/etc/shorewall/interfaces, compuesto de
cuatro columnas: zona, interfaz,
difusin y opciones.
En mi sistema, el archivo interfaces es
parecido al que aparece en el listado 2.
La zona es simplemente el nombre de
la zona cogido del archivo zones. El
interfaz es el nombre de la interfaz de
la red. Por ejemplo, en mi conexin
DSL, que usa el protocolo punto a
punto (PPP), el nombre de la interfaz
es ppp0. El nombre del interfaz para la
tarjeta de red es eth0. Para saber que
interfaces tenemos debemos usar el
comando /sbin/ifconfig. La columna
difusin es la direccin de difusin de
la red anexa a esa interfaz. Como
habrs podido imaginar, la columna
opciones especifica cualquier opcin
que deseemos usar.
En mi sistema aparecen dos entradas
como las siguientes:
Shorewall
PORTADA
01 #ZONE DISPLAY COMMENT
02 net Net the Internet zone
03 loc Local the local network
04 fw FW the firewall
05 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Listado 1: Archivo de zones de ejemplo
01 #ZONE OPTIONS BROADCAST INTERFACE
02 net ppp0 - routefilter,norfc1918
03 loc eth0 detect -
04 #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Listado 2: Archivo de interfaces de ejemplo
25 www.linuxmagazine.com.es Nmero 03
PORTADA Shorewall
solicitud saliente lo primero que hace el
sistema es comprobar la solicitud con las
conexiones definidas en el archivo de
reglas. Si no se encuentra ninguna usa el
valor por defecto del archivo de poltica.
Las columnas del archivos de reglas son:
accin a ejecutar, la fuente de la solici-
tud, el destino, el protocolo usado, el
puerto de destino, el puerto origen y el
destino original.
Adicionalmente a las acciones del
archivo zona, tenemos un par de
acciones adicionales en el archivo de
reglas. DNAT nos permite hacer traduc-
ciones de direcciones de destino de red
(Destination Network Address Transla-
tion). De esta forma las solicitudes
pueden ser redireccionadas a equipos
distintos e incluso a distintos puertos en
esos equipos. La accin REDIRECT (redi-
reccionar) redireccionar las solicitudes
a puertos especficos en el mismo
equipo. Esto se utiliza normalmente para
redireccionar solicitudes HTTP al proxy
local (por ejemplo, squid).
Para redes ms pequeas que no nece-
sitan proporcionar acceso completo a
Internet he averiguado que la accin
REDIRECT es extremadamente til (posi-
blemente slo permitiendo acceso
HTTP). Hay una entrada que es como
sigue:
REDIRECT loc 3128 tcp www -U
!10.2.38.0/24
En un interfaz de comandos, esta
entrada indica que todas la conexiones
entrantes usando el protocolo TCP y
solicitando servicios www (por ejemplo
HTTP) sern redireccionados al puerto
3128. Este es el puerto en el que el servi-
dor proxy Squid est escuchando.
Mirando en el destino original especi-
ficamos una completa red tipo C
usando la anotacin CIDR: 10.2.38.0/
24. Adems esta entrada est precedida
de una marca de exclamacin. Como en
otros contextos, la marca de excla-
macin se utiliza para negar el acceso.
Por tanto el significado de la lnea
entera en inverso. Lo que significa que
todas las solicitudes excepto aquellas
destinadas a direcciones en la red
10.2.38.0 son redireccionadas a Squid.
Esto tiene sentido porque 10.2.38.0 es
mi red local y cualquier servidor Web
en la red local puede o debe ser accesi-
ble sin necesidad de tener que pasar a
travs de un proxy.
La accin LOG (registro) primero
registrar el paquete y luego continuar
con la siguiente regla de aplicacin. La
accin QUEUE (cola) se utiliza para diri-
gir paquetes a aplicaciones de espacio de
usuario, las cuales se manipulan y se
devuelven a la pila IP.
Una norma a seguir cuando configure-
mos el archivo rules es poner apagar todo
(off>) en principio y luego ir encen-
diendo cosas segn las necesitemos.
Muchas personas lo hacen al revs
empezando con una red abierta y luego
van apagando servicios innecesarios. En
el primer caso, si olvidamos algo lo nico
que ocurre es que no tendremos acceso
segn esperamos (lo que es un simple
inconveniente), pero si esto ocurre en el
segundo caso, olvidar apagar algo puede
significar estar abierto a un ataque.
Cavando ms profundo
El archivo /etc/shorewall/hosts nos per-
mite definir anfitriones especficos.
Habitualmente no hay razones para
aadir nada en el archivo hosts para
redes pequeas. Cuanto ms pequea es
la red es ms posible que todas la
mquinas en una zona estn configu-
radas de la misma forma (o dicho de una
forma ms correcta, que todas las
mquinas de un interfaz concreto tienen
la misma configuracin).
Este puede que no sea el caso y puede
que necesitemos diferentes reglas de
acceso para distintas mquinas de la
misma red. Hace un par de meses mi
hijo comenz a jugar a un juego de rol
en Internet. Esto implica que l necesita
algo ms de un simple acceso HTTP a
Internet, por lo que no pude continuar
simplemente usando la redireccin al
proxy Squid como describimos antes.
Para proporcionar este acceso he
definido un grupo especfico de orde-
nadores como una zona nueva. Primero
he creado una nueva entrada en mi
archivo de zonas para esta nueva zona, la
cual he llamado juego (game). Luego
he creado una entrada en el archivo hosts
que solo contiene el equipo de mi hijo:
game eth0:10.2.38.13.
Pero esto no es todo. Recordemos que mi
red local es 10.2.38.0/24. ste es una de
utilidad de registro del ncleo. Todo lo
que nosotros hacemos es especificar la
prioridad de los mensajes que a registrar.
Debemos repasar la pgina principal del
syslogd para encontrar ms detalles al
respecto.
Las dos ltimas lneas de mi archivo
de poltica tienen este aspecto:
net all DROP info
all all REJECT info
La primera lnea indica que cualquier
trfico que no haya comprobado y
provenga de Internet debe ser abando-
nado (ignorado). No obstante, el resto
del trfico debe ser rechazado. Esto
puede parecer un poco absurdo al princi-
pio, pero tiene sentido cuando
consideramos las diferencias entre aban-
donar y rechazar. Cuando un paquete
viene de Internet con destino a una
direccin especfica o puerto no permi-
tido deseamos ignorarlo. No deseamos
que el remitente sepa lo ocurrido. Esto
puede darle al usuario alguna pista
respecto de cmo evadir la seguridad.
Por otro lado, los paquetes provenientes
de cualquier otro lugar (mi estacin de
trabajo o el equipo local) son rechaza-
dos, dando indicaciones a la aplicacin
cliente de lo ocurrido.
Estamos configurando el compor-
tamiento por defecto en el archivo de la
zona. Esto significa que si no definimos
ninguna conexin adicional ste ser el
comportamiento que aplicar en el
archivo de poltica.
En mi archivo de poltica solo tengo
una entrada para la zona de red. Terica-
mente, esto significa que todos los
paquetes que provengan de Internet
deben ser abandonados. No obstante,
tengo en mi mquina un servidor Web
con mucha informacin de referencia
que deseo acceder desde el trabajo.
Debido a que esta conexin es va Inter-
net, el archivo de reglas no me permitir
acceder a mi servidor.
La respuesta a este problema es el
archivo reglas. El archivo de reglas es el
corazn de la configuracin de Shore-
wall. Aqu definimos una conexin
especfica en trminos de zonas, servi-
cios de red (puertos), segmento de red,
equipos individuales y bsicamente
cualquier combinacin en la que
podamos pensar. Cuando llegue una
las redes privadas listadas en RFC
1918. Incluso si yo quisiese dirigirla a
travs de mi tarjeta DSL, podramos
apostar a que mi ISP no va ha aceptarla.
Entonces, qu podemos hacer?
La solucin es algo llamado enmas-
carar IP (IP masquerading). Como su
nombre implica, una direccin IP es
enmascarada por las otras. En mi caso,
la direccin IP en la tarjeta DSL (la cual
tiene una direccin de Internet vlida) es
enmascarada por la direccin IP en la red
local. Por tanto necesito creer una
entrada en el archivo
/etc/shorewall/masq como la siguiente:
ppp0 10.2.38.0/24
Esta entrada hace que todo el trfico
saliente de la interfaz ppp0 desde la red
clase C 10.2.38.0 debe ser enmascarada.
En este punto ya hemos acabado la
configuracin bsica del enmascarador.
No obstante, lo siguiente es la parte ms
complicada. No fue muy sencillo encon-
trar informacin acerca de cmo ejecutar
este juego a travs de cortafuegos. De
hecho encontr determinada informa-
cin al respecto que sugeran
deshabilitar el cortafuegos si se desea
jugar.
Bien, pues al final consegu que fun-
cionara. Para hacerlo necesit ajustar el
nivel de acceso en el archivo policy para
depurar y vigilar en el archivo de regis-
tros todos los intentos de conexin desde
el equipo de mi hijo con cualquier otra
mquina para entonces comprobar el
DNS para ver si fue una mquina de los
desarrolladores del juego. Entonces
aad un puerto especfico a mi archivo
rules.
Si lo hubiese deseado, tambin podra
haber aadido reglas para el servicio
WWW (puerto 80). No obstante, debido
a que esto es lo nico que mi hijo nece-
sitaba al margen de acceso a la Web, an
continuo usando REDIRECT para el
acceso Web.
Resolucin de problemas y
acceso
Es posible (y probable) que tengamos
problemas la primera vez que configure-
mos Shorewall. Por tanto, rastrear las
causas de un problema nos ser til.
Una tcnica til para depurar proble-
mas es ajustar el nivel de registro en el
archivo policy. Ajustarlo para depurar
nos proporciona mucha ms informa-
cin. Entrar en mucho detalle respecto a
las entradas del registro est ms all del
alcance de este artculo, pero es bastante
fcil entender de que van incluso sin
comprender del todo la terminologa. Por
ejemplo, veamos estos datos:
Nov 1 11:19:32 saturn kernel:U
Shorewall:net2all:DROP:IN=ppp0U
OUT= MAC=
SRC=1.2.3.4 DST=10.2.38.11U
LEN=48 TOS=0x00 PREC=0x00U
TTL=116 ID=47048 DF
PROTO=TCP SPT=1 292 DPT=1080U
WINDOW=64240 RES=0x00 SYN URGP=0
Estos son datos estndar de
/var/log/messages. Al principio tenemos
la fecha, el nombre del equipo y el regis-
tro del sistema (kernel en este caso). A
continuacin encontramos el mensaje
propiamente dicha. Fcilmente podemos
ver que el paquete entraba en mi tarjeta
DSL (ppp0) y que el paquete fue aban-
donado. Tambin podemos observar que
estaba usando la conexin net2all de
Internet a todas las otras zonas.
Si volvemos a repasar lo comentado
respecto al archivo policy veremos que
tenamos una entrada que indicaba que
el comportamiento por defecto deba
ser el abandono de todos los paquetes
que vengan de Internet hacia el resto
de las interfaces. Haba un paquete
intentando acceder el puerto 1080
(DPT). No hay nada ejecutndose en
ese puerto y desde luego no me he
comunicado con nadie que deba usar
ese puerto. Puesto que no hay ningn
servicio estndar asociado a este
puerto no hay razn para que nadie
intente acceder a el desde Internet, por
lo que parece bastante obvio que
alguien intentaba aprovecharse de un
error de Windows.
Si el equipo remoto (o incluso otro
equipo en la misma red) continua inten-
tando acceder a distintos puertos de mi
equipo puede que desee aadirlo a la
lista negra. Esto se hace aadiendo la
direccin del anfitrin o de red en
formato CIDR al archivo /etc/shore-
wall/blacklist. Eso implica que, al
margen de que cualquier otra entrada les
permita el acceso, estos equipos tienen
el acceso especficamente prohibido.
Por defecto, Shorewall usa un sistema
de acceso que normalmente enva un
mensaje a /var/log/messages. Incluso
cuando configur syslogd para enviar
mensajes a otro archivo encontr
molesto hacer que el registro de mi
cortafuegos no se confundiera con otros
mensajes del kernel.
Para resolverlo podemos usar el
soporte ULOG del kernel. Este debe estar
disponible para nuestro kernel, siendo
habitual en la mayora de las distribu-
ciones. No obstante, el paquete ulogd no
est siempre disponible, por lo que es
posible que lo tengamos que descargar
desde [4].
Una vez ulogd esta configurado en
nuestro sistema no usaremos ms los
niveles de acceso del syslogd. En su lugar
usaremos el ULOG. I
26 Nmero 03 www.linuxmagazine.com.es
Shorewall
PORTADA
[1] Netfilter Website: http://www.netfilter.
org
[2] Shorewall Website: http://www.
shorewall.net
[3] Asignacin de Direcciones Privadas de
Internet RFC 1918: http://rfc.net/rfc1918.
html
[4] Ulog: http://www.ulog.ch/english/index.
html
[5] Squid Proxy: http://www.squid-cache.org/
INFO
01 #SOURCE DEST POLICY LOG LEVEL
02 fw net ACCEPT info
03 fw loc ACCEPT info
04 loc net REJECT info
05 loc fw ACCEPT info
06 net all DROP info
07 all all REJECT info
08 # LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Listado 3: Archivo policy de ejmplo
27 www.linuxmagazine.com.es Nmero 03
DESARROLLO SDL
informacin sobre el controlador, sea
del ratn, el teclado o una palanca de
juegos, para permitirnos la suficiente
flexibilidad para crear un buen sistema
de control.
La entrada del teclado es la forma de
entrada ms empleada en este juego, ya
que la mayora de los PCs tiene tenden-
cia a tenerlo! Pero como cada pulsacin
del teclado tiene 2 partes, un evento de
tecla pulsada y un evento de tecla libe-
rada, es necesario escuchar ambos.
Manejar mltiples teclas es muy fcil y
la velocidad de auto repeticin del
teclado no causa problemas adicionales,
ya que solo importa si la tecla ha sido
pulsada o no. Si aparece auto repeticin,
una caracterstica importante es que se
puede almacenar siempre el tiempo en el
E
l mes pasado vimos cmo SDL pro-
porciona toda la entrada a nuestro
juego a travs de un bucle de even-
tos con SDL_PollEvent. Esta funcin
cumplimenta nuestra variable
SDL_Event con informacin til sobre el
evento siguiente. Ahora necesitamos
interpretar estos datos.
Mensaje en una botella
Lo primero que hay que advertir es que
SDL_Event no est implementado como
estructura, sino como una unin, porque
cada elemento es mutuamente exclusivo,
no tiene sentido obtener informacin
sobre el puntero del ratn para un evento
que reporta la pulsacin de una tecla.
Por consiguiente, la lectura de parte de
una estructura que no corresponda con
el tipo de evento producir invariable-
mente datos inutilizables y no el
contenido del ultimo mensaje del ratn,
por ejemplo.
Solamente necesitamos manejar los
eventos en los que tenemos inters; todo
lo dems ser ignorado, SDL no inten-
tar ni supondr qu hacer con el
evento. En nuestro juego la pantalla
siempre se actualiza 60 veces por
segundo, as que no necesitamos mane-
jar el mensaje de SDL_VIDEOEXPOSE,
por ejemplo.
Cada estructura del evento contiene
una mirada de informacin que
pertenece al evento. Por ejemplo,
SDL_MouseButtonEvent indica qu
botn de ratn fue pulsado, la posicin x
e y del puntero del ratn y qu disposi-
tivo del ratn era (para sistemas con dos,
o ms, ratones). Los nombres asociados
a las variables dentro de cada estructura
se pueden encontrar en las pginas de
Diseo de juegos bajo Linux
Todo bajo Control
manual, o en SDL_events.h, que general-
mente habita en /usr/local/include/SDL.
Desde aqu podemos crear mane-
jadores de evento para cada mensaje en
el que estemos interesados. Esto se hace
creando funciones separadas que mane-
jen una clase particular de evento (como
la entrada).
Whisky en la Jarra
El control es probablemente la parte
ms importante de un juego de orde-
nador. Es la interfaz entre el jugador y
el juego. Todos los diseadores de jue-
gos saben esto y pasarn muchas
semanas (incluso meses) retocando el
sistema de control hasta que est per-
fecto. SDL no hace este proceso ms
fcil, sino que proporciona la suficiente
Este mes todo est bajo control. Y Steven Goodwin con-
trola un montn. Veremos cmo el jugador controla el
juego y cmo el juego controla los personajes.
POR STEVEN GOODWIN
28 Nmero 03 www.linuxmagazine.com.es
SDL DESARROLLO
cual la tecla fue presionada utilizando la
funcin SDL_GetTicks.
Con la asignacin de un puntero
SDL_Event (pEevnt), se encuentra la
tecla correcta con la linea:
SDLKey key = pEvent->keyU
.keysym.sym;
Esto puede parecer un poco agotador
para una simple pulsacin de tecla, pero
los otros miembros de estas estructuras
tambin son redundantes (Por ejemplo
pEvent ->key.state incluye la misma
informacin como tipo de evento; pul-
sado o soltado) o intrascendente (el
cdigo de exploracin especfico del
teclado). Prefiero pensar que esto es
minucioso y no prolijo.
El valor sym equivale a una de las
muchas definiciones que indican una
tecla especfica: Por ejemplo SDLK_LEFT
para el cursor izquierdo y SDLK_RIGHT
para el cursor derecho. Las teclas
alfanumricas mapean muy bien el
ASCII, as que comprobar la tecla 0 es
tan simple como debe ser:
if (key == '0') /* ...se podiaU
haber usado SDLK_0 aqu... */
No obstante, recomiendo usar las defini-
ciones de SDL_keysyms.h ya que las
letras activan siempre eventos con sus
homlogas minsculas del ASCII (el
valor de tecla sera igual a a no A) sin
tener en cuenta el bloqueo de mayscu-
las o la tecla maysculas.
if (key == SDLK_a) /* ...Vaya!U
Efectivamente son minsculas...
*/
Usaremos este conocimiento recin
encontrado para almacenar pulsaciones
de tecla de una manera parecida a los
juegos, mediante la creacin de una
matriz especial para indicar que teclas
estn controlando el
personaje. Esto es
diferente de que tecla
ha sido pulsada
porque, cuando dos
teclas son pulsadas,
queremos la pulsada
ms recientemente
para controlar la
direccin. Nuestro
cdigo ser algo as
como el Listado 1.
Escribir el sistema
de control de esta
manera hace que sea ms fcil cambiar
la asignacin de teclas o aadir un con-
trol de palanca de juegos. Advirtase, sin
embargo, que el mensaje de tecla libera-
da se perder si cambia del juego al
depurador. SDL no funciona y no est
habilitado para escuchar mensajes de
tecla liberada (los cuales, ahora van al
depurador). Por tanto cuando retorne al
juego tomar un evento adicional de
tecla pulsada y tecla soltada para
restablecer el sistema Esto es ms noto-
rio si el personaje contina movindose
a pesar de que no se pulsan teclas!
Sin embargo, comprobar todas las
teclas de este modo, puede ser leve-
mente incomodo. La abstraccin de las
teclas de control del juego es una buena
cosa, pero tener que escribir el cdigo
para aceptar el nombre de los jugadores
para la tabla de puntuaciones mximas
cuando el cursor izquierdo ha sido rema-
peado, digamos, a Z. en este caso,
solamente queremos preguntarle a SDL
que tecla concreta se ha pulsado.
Podemos hacer esto con la funcin
Uint8 *keystate = SDL_U
GetKeyState(NULL);
El puntero devuelto es una matriz (que
no est permitido modificar) que repre-
senta cada tecla en el sistema y est
referenciado con las macros SDLK_* que
Figura 1: Nuestro juego hasta ahora.
SDL ha hecho que capturar la pantalla sea un
asunto muy simple que apenas requiere una
funcin, SDL_SaveBMP. Esta es el espejo
exacto de la funcin SDL_LoadBMP que
hemos usado en la primera parte y toma el
puntero de la superficie (que en nuestro
caso es la superficie de pantalla) y un nom-
bre de fichero.
01 if (ev.type == SDL_KEYDOWN &&
02 ev.key.keysym.sym==SDLK_F12)
03 {
04 static int curr_grab = 0;
05 char GrabName[32];
06 sprintf(GrabName,
07 "DugPic%d.bmp", curr_grab);
08 ++curr_grab;
09 SDL_SaveBMP(TheGame.pScreen,
10 GrabName);
11 }
Cuadro 1: Di Patata
Este mes hemos hecho una adicin a la fun-
cin de actualizacin. Es un parmetro para
controlar el tiempo. Generalmente, cada lla-
mada a los comportamientos que la funcin
de Update() realizara un cuadro valido de la
actividad. Sin embargo, en casos extremos,
el juego podra haber tomado dos cuadros
para procesar la ultima imagen. Esto
requerira que la funcin de Update() se lla-
mara dos veces dentro de un solo cuadro
para compensar. Sin embargo, llamar dos
veces a Update() no permite que el compor-
tamiento se optimice con eficacia. As que en
vez de eso lo llamamos una vez y le pedimos
que actualice N cuadros. Los juegos con una
granularidad ms fina pasaran un nmero
de coma flotante (indicando los segundos
transcurridos) a sus funciones de la actua-
lizacin.
Cuadro 2: Acerca del
tiempo
Funcin Notas
Start game Llamada una vez al comienzo del nivel
Reset game Llamado siempre que el nivel consiga reiniciarse, despus de que el jugador muera por ejemplo
Update Mover o animar al objeto
Draw Dibujar este objeto en la pantalla
Destroy Liberar cualquier memoria ocupada al inicio del juego
Tabla 1: Retrollamadas
29 www.linuxmagazine.com.es Nmero 03
DESARROLLO SDL
Al contrario que el control de teclado,
SDL no inicializa la palanca de juegos
automticamente cuando se llama a
SDL_Init. Hay tres pasos adicionales: Ini-
cializar el subsistema de la palanca de
juegos (que no es distinto del subsistema
de vdeo o el temporizador), poner en
marcha los eventos de la palanca de jue-
gos (si no el bucle de eventos no
informar sobre los eventos de la
palanca de juegos) y abrir un puerto de
palanca de juegos para la lectura. Vase
el Listado 3.
Si se tienen que manejar varias palan-
cas de juegos, entonces la funcin
SDL_NumJoysticks informar del
nmero de palancas de juegos conec-
tadas al sistema. El parmetro para la
funcin SDL_JoystickOpen, como se
puede esperar, indica cual de las palan-
cas de juegos hay que abrir.
Una vez que se tiene un puntero
SDL_Joystick se pueden consultar las
capacidades y los parmetros de la
palanca. Esto es importante porque cada
palanca de juegos es distinta: Algunos
tienen controles tipo HAT (conmutador
digital de 8 vas, otros tienen track balls
y otros tienen ms botones de lo que se
pueda imaginar. Las palancas de juegos
para simulacin area suelen incluir
todos los anteriores.
Determinar las capacidades de la
palanca de juegos le permitir saber,
por ejemplo, si el jugador tendr que
reasignar los botones de la palanca de
juegos al teclado. Nosotros solo nece-
sitamos control a izquierda, derecha y
botn de salto, as que cualquier
palanca de juegos disponible debe ser
suficientemente buena para Explorer
Dug.
Refiriendonos de nuevo a la tabla
comentada anteriormente hay tres even-
tos principales en los que estamos
interesados: SDL_JOYAXISMOTION,
SDL_JOYBUTTONDOWN y SDL_JOY-
BUTTONUP. Puesto que solamente hay
una palanca de mando en nuestro juego,
podemos ignorar cualquier elemento de
la estructura del evento y suponer que
cualquier evento de la palanca de juego
debe haber venido de la palanca cero
(porque es la nica que hemos abierto).
Entonces podemos usar
pEvent->jaxis.value (que oscila entre
-32768 y 32767, indicado totalmente a la
izquierda, totalmente a la derecha) para
controlar el juego. Vase el Listado 4.
La banda muerta es un tema intere-
sante. Todas las palancas de juego se
mueven, que yo sepa. Pero las palancas
de juego tambin se mueven cuando
nadie las est tocando. Tiemblan ligera-
mente y por tanto generan eventos de
palanca de juegos espreos en cada
cuadro. Puesto que esto es una carac-
terstica del hardware no podemos evitar
que suceda, pero podemos limitar los
efecto que esto tiene en nuestro juego.
Para hacerlo, crearemos una banda
muerta alrededor de la parte central de la
palanca. Cualquier movimiento que
ocurra en esta rea ser ignorado y
tratado como si la palanca de juegos
enviara 0,0. Fuera de la banda muerta,
se tratar a la palanca normalmente.
Aqu he usado una banda muerta de
8000, que es un nmero razonable para
este tipo de juegos, aunque en un juego
veremos ms tarde. Cualquier valor dis-
tinto de cero en esta matriz significa que
la tecla est actualmente pulsada.
if ( keystate[SDLK_F12] ) U
printf("The F12 key is down.");
Cualquier tecla que se ha mantenido pul-
sada durante dos cuadros consecutivos
ser considerada VERDADERO para
ambos cuadros, porque esta funcin
informa del estado de la tecla y no even-
tos. Normalmente esto no es un
problema, pero si se est usando esta
caracterstica para realizar una captura
de pantalla, obtendr una imagen por
cada cuadro mientras la tecla este pul-
sada. Vase el Cuadro 1 Di Patata,
para ms detalles sobre como realizar
una captura de pantalla.
Tambin se puede determinar que
modificador de teclas estn pulsados
(como maysculas o alt); pero para
esto necesita una funcin diferente.
Vase el Listado 2.
Mi Chica Piruleta
La entrada de la palanca de juegos es muy
fcil de programar bajo SDL, que incluso
permite mltiples palancas de juego sin
ningn esfuerzo extra. En nuestro ejem-
plo, se supondr que hay una palanca de
juegos, pero en un juego ms completo es
deseable dejar al jugador que seleccione
que palanca de juegos utilizar y que per-
sonaje controlar.
01 SDL_Joystick *pJoyStick;
02 SDL_InitSubSystem(SDL_INIT_JOYSTICK);
03 SDL_JoystickEventState(SDL_ENABLE);
04 pJoyStick = SDL_JoystickOpen(0);
Listado 3: Inicializacin de la palanca de juegos
01 if (SDL_GetModState() & KMOD_SHIFT) printf("Una de las teclas de
maysculas se ha presionado.");
02 if (SDL_GetModState() & KMOD_LSHIFT) printf("Se ha presionado la
tecla de maysculas izquierda.");
Listado 2: Modificadores de teclas
01 void exUpdateInterface(const
SDL_Event *pEvent)
02 {
03 if (pEvent->type ==
SDL_KEYDOWN)
04 {
05 SDLKey key = pEvent-
>key.keysym.sym;
06 if (key == SDLK_LEFT)
07 {
08 iMovement[EXI_MOVE_LEFT] =
TRUE;
09 iMovement[EXI_MOVE_RIGHT] =
FALSE;
10 }
11 /* ... etctera ... */
Listado 1: Pulsaciones de
teclas
30 Nmero 03 www.linuxmagazine.com.es
SDL DESARROLLO
profesional, este valor debe ser confi-
gurable.
Jumpin Jack Flash
Como los dispositivos del teclado y el
ratn, las palancas de juegos tambin se
pueden leer sin el bucle de eventos. Para
hacerlo hace falta llamar a la funcin
SDL_JoystickUpdate que lee el hardware,
antes de usar una de las funciones del
listado 5 para consultar los datos.
Ahora hemos recuperado la entrada,
deseamos controlar algo en el juego y
por eso, necesitamos algn objeto del
juego
Gente corriente
cada objeto del juego, ya sea el jugador,
un enemigo, o una puerta de salida,
tiene un nmero de elementos comunes.
Todos tienen una posicin de comienzo,
todos tienen grficos y todos hacen
cosas. Sin embargo, cada objeto en el
juego tendr una posicin de comienzo
distinta, grficos distintos, y todos hacen
cosas distintas. Para implementar un
buen armazn debemos poder identi-
ficar esos elementos y aislarlos con efica-
cia del motor comn del juego.
Datos comunes para todos los objetos:
Posicin de comienzo
Una superficie conteniendo gr-
ficos
Cdigo nico para cada tipo de objeto:
Como inicializar el objeto
Como actualizarlo, p. e. direc-
cin y velocidad de la
trayectoria.
Como dibujar el objeto
Como destruir el objeto
Necesitamos estas distinciones porque,
por ejemplo, aunque podemos describir
cada objeto en trminos de una superfi-
cie, cada objeto en el juego no utilizar
esta superficie de la misma manera.
Algunos objetos consistirn en un
ladrillo (los enemigos), algunos usarn
varios (la puerta de salida) y otros se
desvanecern en algn momento (el
jugador).
Realmente esta lista no est completa
y no dudaremos en introducir nuevas
caractersticas durante el desarrollo del
juego, pero es un buen punto de partida.
El mtodo que he elegido para imple-
mentar estas caractersticas utiliza
retro-llamadas (callback) individuales a
las funciones, donde cada una tiene un
propsito especfico.
Sin embargo, la implementacin
exacta de cmo trabaja esa funcin se
controla por el cdigo que es especfico
para cada tipo de objeto. Cada uno de
esos tipos se denomina comportamiento.
Y cada funcin de retro-llamada mane-
jar como se comporta ese objeto en una
situacin en particular. Nuestro juego
inicial de retro-llamadas se muestran en
la Tabla 1. Esta lista imita nuestro bucle
de juego general realmente bien: Comen-
zamos el juego, procesamos un bucle de
actualizacin del dibujo y entonces sali-
mos. No tenemos ninguna distincin
entre el nivel y el juego, puesto que cada
nivel es un mini-juego en s mismo. La
lista tambin demuestra que tenemos
una jerarqua de dos niveles de datos:
configuracin y estado. Los datos de la
configuracin se crean en el comienzo
del juego e incluyen cosas como la
superficie SDL o su posicin de
comienzo. Por el contrario, los datos del
estado incluyen las cosas que cambian
durante el juego, como la posicin o la
direccin actual.
Esto perfila la informacin que necesi-
tamos para nuestra estructura
EX_OBJECT. Cada objeto del juego uti-
lizar esta estructura genrica,
almacenada como parte de una lista
enlazada, con las funciones de retro-lla-
mada pdicamente ocultas dentro de
otra estructura (EX_OBJ_VTABLE),
como se ve en el Listado 6.
Aqu hemos creado la configuracin
ms usada y las variables de estado den-
tro de la estructura EX_OBJECT y
marcado las otras con punteros nulos.
Ser responsabilidad de cada compor-
tamiento asignar la memoria para estos
01 if (pEvent->type ==
SDL_JOYAXISMOTION)
02 {
03 if (pEvent->jaxis.axis == 0)
/* X-axis; assume
04 stick 0 */
05 {
06 int DeadBand = 8000;
07
TheGame.iface.iMove[EXI_MOVE_L
EFT] = FALSE;
08
TheGame.iface.iMove[EXI_MOVE_R
IGHT] = FALSE;
09 if (pEvent->jaxis.value <
-DeadBand)
10
TheGame.iface.iMove[EXI_MOVE_L
EFT] = TRUE;
11 else if (pEvent->jaxis.value >
DeadBand)
12
TheGame.iface.iMove[EXI_MOVE_R
IGHT] = TRUE;
13 }
14 }
Listado 4: Movimiento de
la palanca de juegos
01 SDL_JoystickGetAxis(SDL_Joystick *joystick, int axis);
02 SDL_JoystickGetHat(SDL_Joystick *joystick, int hat);
03 SDL_JoystickGetBall(SDL_Joystick *joystick, int ball, int
04 *dx, int *dy);
05 SDL_JoystickGetButton(SDL_Joystick *joystick, int
06 button);
Listado 5: Consultado la palanca de juegos
01 typedef struct sOBJECT {
02 /* Setup - los datos no
cambian */
03 int init_x, init_y; /*
Posicin de inicio */
04 SDL_Surface *pGfx; /* apunta a
una superficie existente */
05 void *pBhvSetupData;
06 /* Estado - consigue el
reinicio */
07 int x, y; /* Posicin actual
*/
08 void *pBhvStateData;
09 /* Admin */
10 EX_OBJ_VTABLE VTable;
11 /* Lista de componentes
enlazados */
12 struct sOBJECT *pNext;
13 } EX_OBJECT;
Listado 6: EX_OBJECT
31 www.linuxmagazine.com.es Nmero 03
DESARROLLO SDL
(donde no debera cambia nada). Por lo
tanto tenemos que confiar en el sentido
comn y en los programadores compe-
tentes. Pero hay una caracterstica del
lenguaje que podemos utilizar para cen-
trar el desarrollo.
La Tabla La palabra VTable es la abre-
viatura de virtual table y se ha cogido
prestado de C++. Es una manera de
llamar a funciones especficas en obje-
tos especficos, sin tener que
especificarlos en tiempo de compi-
lacin. Esto permite un cierto nivel de
abstraccin. Cada objeto hace esto
estableciendo los punteros a las fun-
ciones privadas como en el listado 9.
Declaramos cada una de las funciones
(dheStart, dheUpdate y dheDraw) como
estticas para hacer sus nombres invisi-
bles a cualquiera fuera del fichero
actual. Esto asegurara que solo
podemos llamar a estas funciones refe-
renciando a VTable, de este modo:
pObject->VTable.Start(pObject);
Para prevenir referencias a NULL o a
otros punteros de funcin invlidos,
prepararemos un conjunto de retro-lla-
madas predeterminadas bajo demanda.
Cada objeto podr entonces reemplazar
(o sobrecargar) esos punteros de fun-
ciones con los suyos propios.
Este mtodo puede parecer redun-
dante, ya que requiere 2 instancias de
pObject, pero normalmente es ms efi-
ciente que aadir conmutadores de
estado en torno a cada llamada a Start,
Update o Draw. Esto tambin escala bien
si aadimos nuevas funcionalidades a los
objetos a travs de su VTable. Siempre
podremos usar una pequea funcin de
envoltorio para prevenir el error casual
cuando una VTable de un objeto se esta
usando, pero se pasa el puntero de otra.
void exDrawObject(EX_OBJECT U
*pObj)
{
pObj->VTable.U
Draw(pObj);
}
Tu me llevas
Pero porque cada EEH utiliza el mismo
cdigo, no significa que utiliza los mis-
mos datos! Tenemos ya una estructura
para la informacin de la configuracin,
as que si tenemos una manera de cam-
biar estos datos iniciales entonces
podemos introducir mucha variedad en
nuestro juego, basndolo en los datos.
Bien, eso se hace antes los que se dice,
ya que podemos ampliar nuestra
susodicha funcin Bhv_CreateDumbHori-
zontal para incluir un juego de
parmetros, tales como velocidad y
direccin.
A fin de hacer estos parmetro gene-
rales para todos los comportamientos,
los crearemos como cadenas de carac-
teres y dejaremos que el
comportamiento los analice en busca de
algo significativo. De esta manera
podramos tambin leerlos directamente
de un archivo de texto para hacer los
niveles de juego personalizables de una
forma muy simple.
Todas los objetos basados en compor-
tamiento trabajan usando exactamente
los mismos mtodos; aunque algunos
requerirn ms cdigo que otros. El
jugador, por ejemplo, requerir manejar
colisiones con el mundo, manejar las
recolecciones y el contacto con los ene-
migos. Programaremos un manejador el
prximo mes. I
punteros y crear estructuras que el pro-
pio comportamiento pueda comprender.
Tomando el ejemplo de un enemigo que
camina a ciegas de izquierda a derecha
(vase el listado 7). Este estpido ene-
migo horizontal (EEH) inicializar su
estado en cada reset de los datos de con-
figuracin que hemos definido como tal
como se ve en el listado 8.
Como lenguaje, C no facilita ningn
mecanismo para parar su cambio de
informacin de configuracin durante el
ciclo de actualizacin (donde solamente
debera ser cambiado el estado), ni le
previene de datos del estado que cam-
bian durante el ciclo de la creacin
01 typedef struct sDHE_SETUP {
02 int x1,y1,x2,y2; /* grados
para el enemigo */
03 int iInitialDir; /* -1 para
izquierda, +1 para derecha */
04 int iSpeed;
05 } EX_DHE_SETUP;
Listado 8: Enemigo
horizontal mudo
01 BOOL Bhv_CreateDumbHorizontal(EX_OBJECT *pObj)
02 {
03 /* ... otras initializaciones de cosas ... */
04 pObject->VTable.Start = dheStart;
05 pObject->VTable.Update = dheUpdate;
06 pObject->VTable.Draw = dheDraw;
07 /* ... */
08 }
09 static void dheStart(EX_OBJECT *pObj) { /* ... hace cosas ... */ }
10 static void dheUpdate(EX_OBJECT *pObj) { /* ... hace cosas ... */ }
11 static void dheDraw(EX_OBJECT *pObj) { /* ... hace cosas ... */ }
Listado 9: Ajustando punteros
01 typedef struct sDHE_STATE {
02 int iDirection; /* La direccin en que camina, -1 para izquierda, +1
para derecha */
03 int iAnimFrame; /* Marco actual de la animacin, mapeado directamente
a una regin */
04 int iAnimDir; /* La animacin ping-pong entre cuadros
0->1->2->3->2->1->0. ser -1 or +1, dependiendo de la direccin */
05 } EX_DHE_STATE;
Listado 7: Enemigo caminando
E
l desarrollo web a menudo est ca-
racterizado por los hackeos rpidos
y sucios con una pintoresca mezcla
de cdigo y HTML. Sin embargo, hay en
camino un esfuerzo para llevar una
estructura ms formal a la programacin
web. Por ejemplo, Rails [1] usa Ruby
para implementar una clsica
infraestructura Model View Controller
(MVC), algo que en el mundo de
smalltalk se ha usado algunas veces. La
infraestructura MVC abstrae el proce-
samiento de datos del modelo de manejo
de cdigo (controlador) basada en GUI y
de la representacin del cdigo (la vista),
vase la Figura 1.
Esta tcnica de abstraer los datos de
los mtodos del procesamiento de datos
puede aplicarse a cualquier cosa, desde
una tabla de una base de datos a un
modelo de flujo de trabajo para una
empresa de gran tamao. El modelo es
parcial o completamente visualizado en
la vista. Los controladores reaccionan a
la entrada del usuario (entre otras cosas)
para comenzar los cambios de estado
dentro del modelo.
32 Nmero 03 www.linuxmagazine.com.es
Ruby DESARROLLO
Aplicaciones Web con Ruby y Rails
Bien Encaminados.
La mayora de las bibliotecas web hacen que el 90 por ciento del trabajo sea fcil y el resto imposible. Rails, un
infraestructura de cdigo abierto programado en Ruby, es lo bastante flexible como para tener xito con ese 10 por
ciento restante.
POR ARMIN RHRL Y STEFAN SCHMIEDL
33 www.linuxmagazine.com.es Nmero 03
DESARROLLO Ruby
Rails sea realmente til para el desarrollo
de aplicaciones de bases de datos
basadas en web, como el software de
gestin de proyectos Basecamp [2], que
ha sido programado usando Rails (vase
el cuadro entrevista con el desarrollador
de Rails). Cuando se trabaja con Rails,
se nota que el diseo del sistema viene
de un entorno prctico. Rails evita
muchos de los fallos presentes en la
mayora de las estructuras tericas de
trabajo.
Rails est basado en el concepto DRY
(Dont Repeat Yourself: No se repita; en
otras palabras, una vez y solamente
una vez.) Repetir cdigo dentro de un
programa suena a programa mal dise-
ado. Rails tiende a utilizar la reflexin y
mdulos en tiempo de ejecucin para
sustituir los ficheros de configuracin;
esto elimina la necesidad del tpico
maratn de configuracin al estilo XML.
Tambin tiene el efecto de aplicar los
cambios inmediatamente sin tener que
pasar por un proceso de generacin que
consuma mucho tiempo.
Rails tambin ha integrado la fun-
cionalidad de comprobacin general y
unitarias. RubyDoc proporciona la docu-
mentacin. El gran avance es que los tres
componentes de la estructuras de trabajo
MVC fueron escritas en Ruby.
Si los desarrolladores se adhieren a las
convenciones de Rails (mapeado entre
base de datos y estructura de objetos), la
estructura ayudar a lanzar un proyecto
rpidamente. Las funciones para aadir,
modificar y borrar objetos estn
disponibles con unas pocas pulsaciones
de teclado.
Popularizacin de la Base de
Datos de Objetos
Nuestro ejemplo de aplicacin est
basada en el tutorial de la pgina web de
Ruby. Crearemos una simple aplicacin
Esta estructura hace a la lgica de la
aplicacin independiente de la repre-
sentacin externa y de la interfaz del
usuario. Algunos productos de desarrollo
afirman ofrecer MVC, aunque esta afir-
macin resulta ser un poco pretenciosa
cuando se analiza de cerca.
Software en Aplicaciones
Prcticas
Para mantener el modelo, Rails incluye
el Registro Activo (Active Record) que
proporciona el mapeado relacional del
objeto. El modelo Paquete de Accin
(Action Pack) subdivide la peticin web
en controladores y componentes espec-
ficos de la vista. Este diseo hace que
Para los usuarios de Mac OS X (versin 10.3 o posterior), dos vdeos [5]
muestran el proceso de instalacin. Desde luego que tambin hay cosas
interesantes para los usuarios de Linux. Rubygems [6] (versin 0.7 o pos-
terior) una herramienta de gestin de paquetes para Ruby, facilita una
aproximacin sencilla a la instalacin:
gem install rails
Cada vez que una nueva versin de Action Pack o Active Record se pu-
blica, puede actualizarse simplemente tecleando gem update.
Asegrese de que la conexin de la base de datos al back-end est
disponible; puede usar tanto MySQL como PostgreSQL. Los usuarios de
Debian necesitaran cumplir algunos requisitos para la instalacin, ya
que los componentes necesarios estn dispersos a lo largo de un gran
nmero de paquetes (vase tambin [7]):
irb1.8,libbigdecimal-ruby1.8, libdbm-ruby1.8, libdl-ruby1.8, libdrb-
ruby1.8, liberb-ruby1.8, libgdbm-ruby1.8, libiconv-ruby1.8,
libopensslruby1.8, libpty-ruby1.8, libracc-runtime-ruby1.8, libreadline-
ruby1.8, librexml-ruby1.8, libruby1.8,libruby1.8-dbg, libsdbm-ruby1.8,
libsoap-ruby1.8, libstrscanruby1.8, libsyslog-ruby1.8, libtest-unit-
ruby1.8, libwebrick-ruby1.8, libxmlrpc-ruby1.8, libyaml-ruby1.8,
libzlibruby1.8, rdoc1.,ri1.8 ruby1.8,ruby1.8-dev, ruby1.8-elisp, y por
ultimo, ruby1.8-examples.
Configuracin de Apache
Si aun no lo ha hecho, necesitar habilitar el modulo rewrite de
Apache:
# a2enmod
Which module would you like to enable?
Your choices are: ... rewrite ...
Module name? rewrite
Module rewrite installed;
run /etc/init.d/apache2 force-reload to enable.
Para ejecutar aplicaciones en /var/www/myapp necesitar aadir una
entrada al host virtual en su fichero de configuracin de Apache. La
entrada puede ser algo como esto:
01 01 <VirtualHost *:80>
02 ServerName rails
03 DocumentRoot /var/www/railsdemo/public
04 ErrorLog /var/www/railsdemo/log/apache.log
05 <Directory/var/www/railsdemo/public/>
06 Options ExecCGI FollowSymLinks
07 AllowOverride all
08 Order allow,deny
09 Allow from all
10 </Directory>
11 </VirtualHost>
Compruebe el archivo htaccess para la aplicacin web para ms ajustes;
en nuestro ejemplo, ste est en /var/www/railsdemo/public/.htaccess.
Ahora trabajando como root, recargue su configuracin de Apache
como sigue, para aplicar los cambios:
/etc/init.d/apache2 force-reload
Cuadro 1: Instalacin
Aplicacin Java Ruby
GUI Aplicacin Swing TK,QT,Fox
GUI Web JSP,XSLT,XMLC Iowa,Rails
Domino de objetos permanentes y gestin de transacciones Entity EJBs,JDO, generados manual-
mente Kansas
Mecanismo RPC (Llamadas a Procedimientos remotos) Para la comunicacin entre front-end y back-end DAOs
& Session EJBs,Servlets Drb
Infraestructura para comunicacin asncrona EJBs manejado por mensaje DRb/Rinda/Tupleserver
Tabla 1: Java y Ruby
web en la carpeta /var/www/railsdemo.
Rails comenzar por crear una estructura
conteniendo los archivos necesarios:
rails /var/www/railsdemo
Esta orden sobreescribir la aplicacin
Rails que exista en el directorio especi-
ficado, as que procedamos con
cuidado. Necesitamos una base de
datos MySQL para la tabla de ejemplo;
vase el listado 1.
El archivo Yaml config/database.yml
define el acceso a la base de datos; el
archivo serializa los datos en un lenguaje
independiente del formato:
production:
adapter: mysql
database: rails_production
host: localhost
username: root
password:
El acceso a la base de datos de prueba
ser parecida a sta. En la vida real, no
querr ejecutar esto con privilegios de
root que estn sin contrasea.
El guin new_controller crea un nuevo
controlador; su nombre debe aparecer
con letras maysculas. La vista sigue el
nombre del controlador:
./script/new_controller Friends list
display new edit
Evite usar process como nombre de
vista, ya que Rails usa este nombre inter-
namente. El proceso para crear un nuevo
modelo es similar:
./script/new_model U
Person
Normalmente Rails descubre automti-
camente la tabla subyacente de la base
de datos. Si fuera necesario el guin
aceptara un nombre de tabla, despus
del nombre de modelo:
@LI./script/new_model Person
people
Para comprobar la configuracin de
una aplicacin Rails, los desarrolladores
pueden ejecutar rake (el make de Ruby)
en el directorio de la aplicacin. Podrn
ocurrir toda una serie de cuestiones en
funcin de la configuracin de su sistema:
Si mysql.sock no est en la
ubicacin habitual, podr edi-
tar cualquier mysql.rb (en un
directorio tal como
usr/lib/ruby/gems/1.8/gems/act
ive-record-0.9.5/lib/active_recor
d/vendor ) o configurar la va-
riable de entorno
MYSQL_UNIX_PORT.
Los permisos para la base de
datos no estn bien configura-
dos.
El guin espera que
/usr/local/bin/ruby sea la ruta a
Ruby. Si Ruby est ubicado en
otro sitio, puede crear un
enlace simblico o cambiar el
nombre de ruta en el archivo
del guin.
Para completar la aplicacin web, ahora
necesitaremos proporcionar algo de
contenido para app/views/friends/dis-
play.rhtml:
01 <html>
02 <body>
03 <h1>Amigos</h1>
04 <p>Muestra un entrada de
alguien</p>
05 <p>
06 <%= @person.name %><br />
07 <%= @person.street1 %><br />
08 <%= @person.street2 %><br />
09 <%= @person.city %><br />
10 <%= @person.state %><br />
11 <%= @person.zip %><br />
12 </p>
13 </body>
14 </html>
34 Nmero 03 www.linuxmagazine.com.es
Ruby DESARROLLO
Figura 2: El portal de planificacin para empresas Basecamp (http://www.basecamphq.com) utiliza Ruby
Rails como aplicacin web de fondo.
01 CREATE DATABASE
rails_production;
02 USE rails_production;
03
04 CREATE TABLE people (
05 id int(10) unsigned NOT NULL
auto_increment,
06 name varchar(50) NOT NULL
default '',
07 street1 varchar(70) NOT NULL
default '',
08 street2 varchar(70) NOT NULL
default '',
09 city varchar(70) NOT NULL
default '',
10 state char(2) NOT NULL default
'',
11 zip varchar(10) NOT NULL
default '',
12 PRIMARY KEY (id),
13 KEY name (name)
14 ) TYPE=MyISAM
AUTO_INCREMENT=2;
15
16 INSERT INTO people VALUES (1,
'Superman',
17 '123 Somewhere', '',
'Smallville', 'KS', '123456')
Listado 1: SQL para Person
35 www.linuxmagazine.com.es Nmero 03
DESARROLLO Ruby
contiene los mtodos de acceso. La
orden require aade el modelo.
require 'person'
Ahora la aplicacin web puede usar la
clase Active Record para acceder a la
base de datos. Si ahora insertamos el
siguiente cdigo para el mtodo display,
coger la primera entrada de la tabla y lo
escribir en la variable de la instancia
@person para la vista de clase.
def display
@person = Person.find(1)
end
La definicin del modelo de clase en
app/models/person.rb tambin es digno
de examinar.
require 'active_record'
class Person < U
ActiveRecord::Base
end
La clase de base ActiveRecord::Base hace
la mayora del trabajo, ya que define
mtodos simples de acceso a la base de
Esto es parecido a Erb, la variante de
HTML incrustado de Ruby. La pgina
HTML muestra los datos que el
modelo proporciona. El control tiene
que definir y crear el objeto referen-
c i a do @p e r s o n a qu . Es t o
o c ur r e e n el archivo app/con-
trollers/friends_controller.rb, que
<LM>:Por qu desarroll Rails?
<DH>:Yo haba estado programando en
PHP durante unos aos mientras vigilaba
de cerca todos los proyectos de desarrollo
web basados en Java. Yo amaba PHP por su
inmediatez y estaba muy inspirado por los
infraestructura en Java. As que no quera
rendirme rpidamente y y abandonar PHP,
pero ni uno ni otro eran lo que yo buscaba
para lidiar con las dificultades de grandes
sistemas orientados a objeto.
En el momento lgido de mi enojo con PHP
y no mucho despus de mi desilusionante
encuentro con Java (trabaj en con J2EE
durante 6 7 meses), le sobre como Martin
Fowler y los Programadores Pragmticos
trabajando sobre un lenguaje que encajaba
a la perfeccin con mis exigencias. Por
supuesto que ese lenguaje era Ruby, y una
vez que supere los primeros escollos, fue
amor a primera vista.
Poner todas mis inspiraciones de Java en
una infraestructura impulsada por Ruby
result ser un camino muy natural para mi.
Tena que hacerlo de todos modos, con el
propsito de construir Basecamp tan
rpido como lo hice (en dos meses).
<LM>:Cul es la mayor fortaleza de Rails?
<DH>:Sobre todo la inmediatez. Puedes
crear aplicaciones increblemente rpido
sin que por ello acabes con cdigo
enmaraado. Se construye una aplicacin
rpidam, pero te sirve para toda la vida.
Totalmente enfocado a patrones probados,
tales como pruebas y desarrollo dirigidos a
dominios, junto con una divisin MVC que
de verdad ayuda en este caso.
<LM>:Cul es la mayor debilidad de Rails?
<DH>:Puede ser difcil de convencer a los
potenciales clientes (o sus gerentes) que
ellos podran ser productivos en un
lenguaje relativamente desconocido
cuando todos ellos han ledo sobre Java y
C#.
<LM>:Cul es el futuro de Rails?
<DH>:Espero publicar la versin 1.0 en el
ao 2004. Pienso que el 2005 ser El Ao de
Ruby y espero que la publicacin de Rails
ayude a conseguirlo. Pero por otra parte,
tengo unas metas bastante humildes para
el ulterior desarrollo de la infraestructura.
Rails tiene en este momento alrededor de
2.500 lneas de cdigo. Me gustara que no
creciera mucho ms all de eso.
<LM>: Por favor dganos 2 prrafos sobre
Basecamp. Quiz debera mencionar tam-
bin el modelo de negocio.
<DH>:Basecamp es una aplicacin de
gestin de proyectos basado en web,
construida en torno a weblogs, hitos y lis-
tas de quehaceres (TODO en ingls). Es
una aplicacin engaosamente sencilla
que ha tenido un impacto enorme en
todas las personas que gestionan proyec-
tos. Es una aplicacin alojada en un
servidor externo y las empresas pagan
entre 19 y 59 dolares al mes por usarla.
Para el que slo desea probarla, incluso
hay un plan gratuito por el tiempo de
duracin de un solo proyecto.
<LM>:Cul es el futuro de Basecamp?
<DH>:Estamos mejorando la aplicacin
constantemente. Justamente la semana
pasada lanzamos un montn de nuevas
caractersticas para gestionar mejor las
responsabilidades de un proyecto. Adems,
pienso que acabamos de hacernos con un
porcentaje minsculo de un mercado
enorme. La gestin de proyecto est por
todas partes. Adems de las obvias aplica-
ciones en los negocios, estamos viendo que
la gente usa Basecamp para planificar
cualquier cosa, desde bricolaje casero hasta
bodas. Basecamp se ajusta muy bien a un
amplio rango de proyectos debido a su sen-
cillez. Gestionar un proyecto no es un
proyecto en s mismo.
<LM>:Hacia donde piensa que va la pro-
gramacin basada en web?
<DM>:Espero que no hacia la intensa com-
plejidad que J2EE, .NET y otros entornos
torpes que de alguna manera han conven-
cido a la gente que los necesitan. Los
lenguajes dinmicos como Ruby y las
estructuras de trabajo construidas con l,
como Rails, los van a barrer de la escena en
los prximos aos. Clientes y desarrolla-
dores comenzarn a darse cuenta de que la
mayora de los aplicaciones web no necesi-
tan la potencia de fuego de un destructor
Imperial, sino ms bien la flexibilidad de un
Caza rebelde (S, acabo de ver Star Wars en
DVD).
Cuadro 2: Una entrevista con el desarrollador de Rails, David Heinemeier Hansson
01 01 USE rails_production;
02 CREATE TABLE phones (
03 id int(10) unsigned NOT NULL
auto_increment,
04 person_id int(10) unsigned NOT
NULL default '0',
05 phone varchar(15) NOT NULL
default '',
06 PRIMARY KEY (id),
07 KEY people_id (person_id),
08 KEY phone (phone)
09 ) TYPE=MyISAM
AUTO_INCREMENT=3;
10
11 INSERT INTO phones VALUES (1,
1, '1234567890');
12 INSERT INTO phones VALUES (2,
1, '1122334455');
Listado 2: SQL para Nmeros de telfonos
datos. El nombre de la tabla es el plural
del nombre de la clase. Curiosamente, la
forma plural es gramaticalmente correcta
para los nombres irregulares, por ejem-
plo, men para man o people para person.
Vase la documentacin de la clase para
ms detalles sobre las reglas sobre los
nombres y las convenciones [8].
El resultado de este trabajo ahora es
visible bajo http://localhost/rails/friends/
display. Esta URL apunta al controlador
(friends) y a la accin (display).
Tablas Asociadas
Rails tambin tiene una solucin para la
asociacin de tablas. Usaremos dos
tablas con nmeros de telfono (vase el
listado 2).
Rails utiliza un sufijo (_id) para identi-
ficar claves externas, por ejemplo
person_id. Como se menciono anterior-
mente el nombre de la tabla es la forma
plural del nombre del modelo:
./script/new_model Phone
El archivo generado anteriormente, per-
son.rb necesita dos modificaciones:
require 'active_record'
require 'phone'
class Person < U
ActiveRecord::Base
has_many :phones
end
La llamada
has_many :phones
especifica un vinculo
1:n. En otras pala-
bras, una persona
puede tener ms de
un nmero de tel-
fono. Necesitaremos
aadir las siguientes
lneas a display.html
para cambiar el for-
mato de
visualizacin.
<% for phone in U
@person.phones %>
<%= phone.phone
%><br/>
<% end %>
Si un modelo ya
existe, en Rails es
bastante fcil usar tcnicas de estruc-
turacin para definir visualizaciones y
mtodos de manipulacin para los datos.
Los desarrolladores Web pueden ajustar
los mtodos bsicos tanto como lo nece-
siten.
Estructuracin Automtica
El siguiente ejemplo supone un directo-
rio de aplicacin Rails vaco. Primero
crearemos un controlador y un modelo
(./script/new _controller Friend y
./script_new _model Person, vase ms
arriba). Nos aseguraremos de que no
tenemos una accin llamada list. Rails
utilizar la base de datos existente. Sim-
plemente necesitamos modificar el
controlador friends:
scaffold :person
Este aadido crea nuevos mtodos con la
conducta predefinida, como se especifica
en la documentacin en [9]: list, show,
destroy, new, create, edit y update.
Esto facilita la estructuracin con Per-
son, pero an necesitamos los nmeros
de telfono. Si se establecen los indi-
cadores correctos, Rails aade una
referencia a la accin al nombre del
modelo para evitar colisiones de nom-
bres con las acciones de nombres
definidas:
scaffold :person, :suffixU
=> true
scaffold :phone, :suffixU
=> true
Esto nos da las siguientes URLs:
http://rails/friends/list_person http://
rails/friends/list_phone
Como puede ver, hemos creado una
estructura para una aplicacin Web con
un esfuerzo mnimo. La aplicacin alma-
cenar y manipular objetos en una base
de datos relacional. Ruby implementa el
modelo MVC elegantemente e incluso
genera el cdigo bsico asociado con la
estructura de MVC.
Logout
Rails facilita el desarrollo de aplicaciones
bsicas si se siguen las reglas. El sistema
proporciona una introduccin suma-
mente til a la programacin de
aplicaciones web. Si necesita ms ayuda
para empezar con Ruby, revise el Manual
de Ruby. I
36 Nmero 03 www.linuxmagazine.com.es
Ruby DESARROLLO
[1] Ruby on Rails: http://www.rubyonrails.org
[2] Basecamp: http://www.basecamphq.com
[3] Apache Struts: http://struts.apache.org
[4] Struts Action Invocation Framework
(SAIF):http://struts.sourceforge.net/saif/
[5] Videos del tutorial: http://www.
rubyonrails.org/show/HomePage
[6] Rubygems:http://rubygems.rubyforge.
org/wiki/wiki.pl
[7] Rails para Debian: http://www.
rubyonrails.org/show/RailsOnDebian
[8] Rules para nombres plurales: http://api.
rubyonrails.org/classes/ActiveRecord/Base.
html
[9] Metodos de estructuracin: http://api.
rubyonrails.org/classes/ActionController/
Scaffolding/ ClassMethods.html
[10]El weblog del autor de Rails: http://
loudthinking.com
RECURSOS
Figura 1: Esquema Model View Controller (MVC). El flujo de datos no es
idntico para todas las aplicaciones y podra diferir del flujo de datos
mostrado aqu.
Armin Rhrl y Stefan Schmiedl dirigen
una compaa llamada Agile Soft-
wareschmiede Approximity GmbH. Usan
Ruby desde hace cinco aos y todava se
divierten trabajando con Ruby y otras
soluciones de desarrollo y administracin
de proyectos hiperproductivos. Para los
autores es ms importante la productivi-
dad que estar a la ltima.
L
O
S
A
U
T
O
R
E
S
37 www.linuxmagazine.com.es Nmero 03
DESARROLLO Curses

Qu hacer? Acudir a la seccin de


interfaces del to Paul, por
supuesto. De hecho, para empezar
a comprender como funcionan los
mens, ni siquiera vamos a verlos con
una envoltura C++, sino que vamos a
estudiar unos sencillos programas en C
pelado y mondado para evitar los y con-
fusiones.
Con tal motivo presento la prueba
A: el listado 1, que contiene un pro-
grama, y sin que sirva de precedente,
completo, compilable (se puede uti-
lizar g++ o gcc, monta tanto, tanto
monta) y ejecutable que presentar en
pantalla nuestro primer men (ver
Figura 1) S, ya s que no es muy
impresionante, pero paciencia. Anali-
cemos lo que hace el cdigo y
podremos mejorarlo.
Primer men
Lo primero es declarar una matriz de
cadenas (options) que contiene las
opciones que vamos a mostrar en nuestro
men. Atencin, que si bien se mostrarn
cuatro elementos en el men, hay que
definir 5 porque curses exige que el men
termine en una cadena nula, que es exac-
tamente lo que es el elemento (char*)
NULL al final de la matriz.
A continuacin, nos metemos directa-
mente en la funcin main del programa
y inicializamos la ventana estndar de
curses (esto a estas alturas no debera
entraar ningn misterio).
De la lnea 18 a la 21, declaramos
variables que nos servirn en la creacin
del men. Tenemos, por un lado, un
puntero a una variable MENU, que es la
que apunta al men propiamente dicho.
A continuacin tenemos un puntero a las
cadenas options, un entero i que servir
de iterador en un bucle y, finalmente,
una matriz de punteros ITEM (barra)
cada elemento del cual contendr las
opciones disponibles en el men.
El siguiente paso consiste en asignar
espacio de memoria a barra. Esto lo
hacemos con la funcin C calloc() y le
asignamos tanto espacio como elemen-
Mens con Curses
Men del Da
El tema de los mens con curses es com-
plejo. La informacin que se
puede consultar por ah, es
contradictoria. Una fun-
cin puede aparecer
como menu_post(),
display_menu()
o, incluso,
menu_dis-
play() en
segn que
versin del
manual mires, cuando
en realidad se llama
post_menu(). Los ejemplos que se
encuentran por Internet no estn documentados y
muchos de ellos no compilan. POR PAUL C. BROWN
tos del men disponemos (en este caso,
5). A continuacin, en la lnea 26, tene-
mos un bucle que asigna los elementos
del men a barra y, despus, creamos el
men propiamente dicho pasando barra
como parmetro a la funcin
new_menu() de curses.
Y, por fin, podremos ver nuestro
men. Lo mandamos a la ventana con
post_menu(). Como no se especifica
ninguna otra ventana, el men apare-
cer en la ventana estndar por
defecto, stdscr. Para que se pueda
visualizar el men, habremos de
refrescar la pantalla, cosa que hacemos
con refresh().
El resto del listado debera ser obvio:
se espera un entrada del teclado, si el
usuario pulsa la tecla [Inicio], el bucle
termina, se retira el men, se liberan los
elementos, se cierra curses y se acaba el
programa. Alguien est viendo maneras
de envolver todas estas feas tareas
domsticas en una hermtica clase
C++? Por que yo s.
El ejemplo anterior es un poco aburri-
dillo verdad? Pero si de verdad queris
probarlo, para compilar el listado 1, bas-
tar con ejecutar
gcc -o menu menu.c -lcursesU
-lmenu
en el directorio donde tengamos el
cdigo fuente. O, si prefers
g++ -o menu menu.c -lcursesU
-lmenu
que lo compilar igual.
El aspecto de nuestro men no es
exactamente como lo queremos. Esto es
porque no hemos definido la geometra
del men y la librera menu aplica la
geometra por defecto, que, segn la
documentacin, consiste en un men de
una columna y diecisis filas. Adems,
no podemos desplazarnos por las
opciones, lo cual hace que nuestro men
sea incluso menos interesante.
Vamos a ver como se solucionan los
dos problemas anteriores y despus
pasaremos a abstraer el cdigo a una
clase.
Un poco de Movimiento
En el listado 2 podemos ver una versin
mejorada del programa, o al menos la
parte que nos atae. Observemos, por
ejemplo, que hemos insertado una
nueva funcin, set_menu_format(), a la
cual, pasndole el puntero del men el
cual queremos modificar y las filas y
las columnas, modifica el formato por
defecto. Como nosotros queremos tener
una barra de mens, utilizamos una
sola fila y varias columnas, tantas
38 Nmero 03 www.linuxmagazine.com.es
Curses DESARROLLO
01 #include <stdlib.h>
02 #include <menu.h>
03
04 char* opciones[5] =
05 {
06 "Fichero", "Editar",
"Ventana", "Ayuda",(char*)
NULL
07 };
08
09 int main(int argc, char
*argv[])
10 {
11 (void) initscr();
12 keypad(stdscr, TRUE);
13 (void) nonl();
14 (void) cbreak();
15 (void) noecho();
16 wclear(stdscr);
17
18 MENU * menu_principal;
19 char ** o=opciones;
20 int i;
21 ITEM ** barra;
22
23
barra=(ITEM**)calloc(5,sizeof(
ITEM*));
24
25 for(i=0;i<5;i++)
26
barra[i]=new_item(opciones[i],
"");
27
28
menu_principal=new_menu((ITEM*
*)barra);
29 post_menu(menu_principal);
30 refresh();
31
32 int ch;
33
34 while
((ch=getch())!=KEY_HOME)
35 {
36 /* procesar entrada del
teclado */
37 }
38
39 unpost_menu(menu_principal);
40 refresh();
41 free_menu(menu_principal);
42
43 while(*barra)
44 free_item(*barra++);
45
46 endwin();
47 exit(0);
48 }
Listado 1: menu.c - nuestro primer men
01 .
02 .
03 .
04
menu_principal=new_menu((ITEM*
*)barra);
05
set_menu_format(menu_principal
,1,5);
06 post_menu(menu_principal);
07 refresh();
08
09 int ch;
10
11 while ((ch=getch())!=KEY_HOME)
12 {
13 switch(ch)
14 {
15 case KEY_RIGHT:
16
menu_driver(menu_principal,
REQ_RIGHT_ITEM);
17 break;
18 case KEY_LEFT:
19
menu_driver(menu_principal,
REQ_LEFT_ITEM);
20 break;
21 default:
22
menu_driver(menu_principal,
ch);
23 break;
24 }
25 }
26 .
27 .
28 .
Listado 2: Men mejorado.
39 www.linuxmagazine.com.es Nmero 03
DESARROLLO Curses
como elementos del men, para el for-
mato.
Lo siguiente es conseguir mover el
enfoque de elemento a elemento. Esto lo
conseguimos dentro del bucle principal,
consultando a la variable ch. Si ch con-
tiene el seudo-carcter KEY_RIGHT
(correspondiente a la tecla de flecha de
cursor derecha), llamaremos a la funcin
menu_driver() de la librera menu. La
funcin menu_driver() es el motor tras la
interaccin del usuario con el men una
vez creado este. Acepta como entrada el
puntero al men al cual afectarn los
cambios y un carcter o seudo-carcter
que dicta el comportamiento del enfoque
del men.
En el ejemplo que nos ocupa, al pul-
sar el usuario en las flechas izquierda y
derecha, el enfoque se desplaza hacia el
elemento de la izquierda o derecha,
respectivamente. La tercera opcin, per-
mite que menu_driver() busque una
coincidencia en la lista de opciones en
el caso de que ch sea un carcter
imprimible.
Por ejemplo, si tenemos el enfoque en
el primer elemento del men (Fichero
- ver figura 2) y pulsamos la letra v,
menu_driver() desplazar el enfoque a la
opcin Ventana (ver figura 3) y
empezar a examinar la segunda letra de
todas las opciones que empiecen por v
a la espera de otro carcter imprimible
que le puede permitir depurar la selec-
cin. Aqu, en este caso, es una
funcionalidad un poco tonta, pero podis
imaginar su utilidad si tenemos una
larga lista de nombres sacada, por ejem-
plo, de una base de datos y podemos ir
tecleando las letras del apellido buscado
y menu_driver() nos ira acercando al
registro buscado.
Ha llegado el momento de crear la
clase men.
Un Men con Clase
Ahora es cuando empieza lo interesante
y quitamos de en medio todos esas feas
funciones. El listado 3 muestra un frag-
mento de la implementacin de la clase
application (ver los dos captulos anteri-
ores de esta serie, aparecidas en Linux
Magazine 1 y Linux Magazine 2 - el
Figura 2: Eso est mejor: una barra de mens, y adems
Figura 3: Podemos desplazarnos por ella!
01 .
02 .
03 .
04 void application::mainMenu()
05 {
06 window
main_Menu(COLS-2,3,1,1,TRUE,""
);
07 vector<string> mitems;
08
09 mitems.push_back("Fichero");
10 mitems.push_back("Editar");
11
mitems.push_back("Ventanas");
12 mitems.push_back("Ayuda");
13
14 menuClass
main_App_Menu(mitems,main_Menu
.getWHandle(),1,10);
15
app_Window.wWrite(2,10,main_Ap
p_Menu.hideMenu());
16
17 main_Menu.closeWindow();
18 }
19 .
20 .
21 .
Listado 3: application.cpp
(fragmento)
cdigo completo se puede descargar de
[1]) que muestra el mtodo que activa el
men principal de la aplicacin. No
requiere mucha explicacin. Creamos
una ventana donde alojar el men (esto
es prctica habitual en curses) y a con-
tinuacin utilizamos un vector de
cadenas para almacenar las etiquetas de
cada opcin. Despus creamos un objeto
menuClass al cual pasamos el vector, el
handle de la ventana y la posicin del
men dentro de esa ventana. He optado
por la fila 1 y columna 10 para no pisar
el borde del cual he dotado la ventana
con el fin de que quede el rea del men
claramente delimitado (ver figura 4).
La inicializacin de la clase implica la
creacin y visualizacin del men, a la
vez que se traslada el enfoque a l. El
enfoque permanece con el objeto hasta
que el usuario pulsa [Enter] habiendo
realizado su seleccin (todo esto lo
vemos un poco ms abajo).
Una vez que el men libera el enfoque,
recogemos la salida del mtodo hide-
Menu(), que es la opcin escogida
cuando el usuario puls [Enter] y lo
imprimimos en pantalla para demostrar
que es correcto. Obviamente, en un caso
real, la clase application tendra que
hacer algo ms productivo con esta sali-
da, como guardar el fichero en edicin,
abrir una ventana de ayuda, etc.
Por fin, cerramos la ventana del men
para que desaparezca del entorno.
Cmo habris imaginado, la clase
menuClass es el meollo de la cuestin. El
listado 4 muestra su implementacin.
Esta clase es virtualmente hermtica, es
decir casi ninguno de sus mtodos ni
ninguno de sus atributos son accesibles
desde fuera de la clase. Ella se la guisa y
40 Nmero 03 www.linuxmagazine.com.es
Curses DESARROLLO
01 #include <menuclass.h>
02
03
menuClass::menuClass(vector<st
ring> items, WINDOW*
window=stdscr,int rows=16, int
columns=1)
04 {
05 item_List=items;
06 createItemList();
07 menu_Window=window;
08
menu_Thing=new_menu((ITEM**)me
nu_Items);
09
set_menu_format(menu_Thing,row
s,columns);
10
set_menu_win(menu_Thing,menu_W
indow);
11
set_menu_sub(menu_Thing,derwin
(menu_Window,1,COLS-4,1,2));
12 showMenu();
13 moveFocus();
14 }
15
16 menuClass::~menuClass()
17 {
18 }
19
20 string menuClass::hideMenu()
21 {
22 string
option=getSelectedItem();
23
24 unpost_menu(menu_Thing);
25 refresh();
26 free_menu(menu_Thing);
27 while (*menu_Items)
28 free_item(*menu_Items++);
29 return option;
30 }
31
32 void
menuClass::createItemList()
33 {
34 unsigned int i;
35
menu_Items=(ITEM**)calloc(item
_List.size(),sizeof(ITEM*));
36
37 for
(i=0;i<item_List.size();i++)
38
menu_Items[i]=new_item(item_Li
st.at(i).c_str(),"");
39
menu_Items[i]=new_item(NULL,""
);
40 }
41
42 void
menuClass::setMenuWindow(WINDO
W* window=stdscr)
43 {
44 menu_Window=window;
45 setMenuWindow(menu_Window);
46 }
47
48 void menuClass::showMenu()
49 {
50 post_menu(menu_Thing);
51 wrefresh(menu_Window);
52 }
53
54 void menuClass::moveFocus()
55 {
56 int ch;
57 while((ch=getch())!=13)
58 {
59 switch (ch)
60 {
61 case KEY_RIGHT:
62
menu_driver(menu_Thing,REQ_RIG
HT_ITEM);
63 break;
64 case KEY_LEFT:
65
menu_driver(menu_Thing,REQ_LEF
T_ITEM);
66 break;
67 case KEY_UP:
68
menu_driver(menu_Thing,REQ_UP_
ITEM);
69 break;
70 case KEY_DOWN:
71
menu_driver(menu_Thing,REQ_DOW
N_ITEM);
72 break;
73 default:
74
menu_driver(menu_Thing,ch);
75 break;
76 }
77 wrefresh(menu_Window);
78 }
79 }
80
81 string
menuClass::getSelectedItem()
82 {
83
selected_Item=item_name(curren
t_item(menu_Thing));
84 return(selected_Item);
85 }
Listado 4: Implementacin de la clase menuClass
41 www.linuxmagazine.com.es Nmero 03
DESARROLLO Curses
ella se la come. La excepcin son el con-
structor (a partir de la cual se llaman
todos los otros mtodos), el destructor
(que est vaco), el mtodo hideMenu()
(que se llama para cerrar el men y
recoger el valor seleccionado) y getSe-
lectedItem(), que devuelve la etiqueta de
la opcin actual escogida (ya que es til
poder acceder a esta informacin en
cualquier momento).
El constructor menuClass() (de la lnea
3 a la 14) es la encargada de llamar a
todos los otros mtodos (a excepcin de
hideMenu()) en su debido orden. Primero
inicializa un vector string llamado
item_List que, como su nombre indica,
contendr la lista de elementos que
mostrar el men. Seguidamente, lla-
mamos al mtodo createItemList() que
hace exactamente eso: crear la lista de
elementos en un formato que podr inser-
tarse en el men. Si se ha seguido este
artculo hasta el momento, el mtodo
createItemList() (de la lnea 34 a la 42) no
entraar ningn misterio: Primero reser-
vamos memoria para la lista (lnea 37) y a
continuacin volcamos las etiquetas en el
espacio reservado (lneas 39 y 40), para,
finalmente, marcar el final de la lista con
un elemento nulo.
De vuelta al constructor, el siguiente
paso consiste en inicializar el men
propiamente dicho (lnea 8), establecer
su formato, la ventana y la subventana
donde se va a mostrar y exhibirlo. El
encargado de esto ltimo es el mtodo
showMenu() (ver de la lnea 51 a la 55)
que simplemente utiliza la funcin
post_menu() de la librera menu y
refresca la ventana con wrefresh().
El constructor, por ltimo, llama al
mtodo moveFocus() que se puede ver
en el listado de la lnea 57 a la 82. Este
mtodo se limita a escuchar las entradas
del teclado y mueve el enfoque de un
elemento a otro segn convenga. Para
que se puedan apreciar los cambios,
despus de que el enfoque haya cambia-
do, hay que refrescar la ventana (ver
lnea 80). Si el usuario pulsa [Enter]
(clave ASCII 13), el bucle termina.
Por ltimo, hideMenu() recoge la
ltima opcin escogida y lo coloca en la
variable de cadena option, esconde el
men y libera el espacio reservado por la
lista de elementos. La variable option se
devuelve a la funcin que llam al
mtodo para ser procesada.
Todos Juntos En el listado 5 podemos
ver una funcin main que hace uso de la
clase explicada a travs de la clase appli-
cation. Como se puede comprobar, no es
nada complejo explotar esta clase. Para
mostrar el men, pulsaremos en F2 y
para mostrar una ventana de dilogo
como el que vimos el mes pasado, pul-
samos en F1.
Conclusin
En este artculo no hemos hecho ms
que rayar la superficie de las funcionali-
dades de la librera menu de curses. Exis-
ten muchas otras cosas que se pueden
hacer. Entre ellas, la posibilidad de aso-
ciar una funcin con cada elemento de
men que se ejecute cuando se selec-
ciona una opcin.
En todo caso, si tanto escribir te da
pereza, existe por ah toda una serie de
clases (como, por ejemplo, las que se
suelen instalar en /usr/share/doc/libn-
curses5-devel-5.3/c++/ con el paquete
estndar de curses) con sus ejemplos que
implementan ms funcionalidades, tanto
de mens, como formularios y otros
aspectos de curses. Pero, estate adver-
tido, estn mal documentadas y son
bastante ms complejas que los mas. I
01 #include "application.h"
02
03 int main()
04 {
05 int ch, cDialogos=1;
06 application my_App(TRUE,"Mi
Aplicacin nmero %i",1);
07
08
while((ch=my_App.wGetch())!=KE
Y_HOME)
09 {
10 switch (ch)
11 {
12 case KEY_F(1):
13
my_App.dialWin(50,10,"Esto se
supone un Dilogo.","Dilogo
%i",cDialogos++);
14 break;
15 case KEY_F(2):
16 my_App.mainMenu();
17 break;
18 }
19
20 }
21 my_App.~application();
22 exit(0);
23 }
Listado 5: El fichero
principal.cpp
[1] Listados completos en formato tar.gz con
Makefile para facilitar la compilacin
http://www.linuxmagazine.com.es/
Magazine/Downloads/03
RECURSOS
Figura 4: Un men delimitado en nuestra aplicacin.
www.linuxmagazine.com.es
Perl DESARROLLO
/tmp/agent.log. La lnea 33 de este guin
crea un nuevo objeto Net::Jabber::Client
que implementa el cliente de mensajera
instantnea que actuar como agente.
Antes agent.pl entra en el bucle principal
de eventos en la lnea 83, se necesita definir
unas cuantas retro-llamadas para varios
eventos en la lnea 35ff. El manejador
onauth en la lnea 68 se llamar despus de
que el cliente haya ingresado en el servidor
usando las credenciales especificadas en la
lnea 23. El manejador entonces llamar a
RosterGet() para que vaya a buscar la lista
de conocidos y la almacene en una variable
global %ROSTER.
El mtodo siguiente, Presence(),enva
un mensaje presence a todos los clientes
en la lista para decirles que agent.pl est
en lnea. A partir de este punto, un
cliente gaim que haya ingresado como el
usuario mikes-agent-sender mostrar a
mikes-agent-receiver como cliente activo
en su propia lista de conocidos (Vase la
Figura 2).
La retro-llamada message en la lnea
37 se invocar cuando alguien enve un
mensaje a agents.pl. Cualquier cliente en
la red Jabber puede hacer esto y es por
eso que la lnea 45 comprueba si el
emisor es un amigo. En este caso
mikes-agent-sender es el nico al que se
le permite enviar un mensaje, ya que es
la nica entrada en la lista de conocidos
del cliente (Vase la seccin Insta-
lacin). La funcin simplemente
descarta todas las dems peticiones,
almacena un mensaje de informacin en
archivo de log y vuelve al bucle princi-
pal en la lnea 50.
El mtodo getBody() en la lnea 57 del
guin extrae la orden de control enviada
con el mensaje de texto y la pasa a la
funcin run_cmd definida en la la lnea
93.
En la lnea 83, Execute() conecta con
el servidor de Jabber en jabber.org e
ingresa como mikes-agent-receiver. Si se
pierde temporalmente la conexin el
bucle principal, que se ejecuta
indefinidamente, la rescatar. Si tambin
se detiene porque se han producido
muchos errores, la lnea 90 los eliminar
y parar el programa.
Para estar seguro de que el agente
empiece a funcionar cuando se inicialice
el sistema, se aade lo siguiente:
Control remoto con un bot Jabber
Contacto Interior
Para acceder a una LAN traspasando un cortafuegos, se necesita una puerta
trasera secreta o un agente colaborador dentro. Un cliente Jabber dentro de la
LAN conecta con un servidor Jabber pblico y esperar que aparezcan instruc-
ciones en forma de mensajes instantneos enviados por su conocido de
Internet. POR MICHAEL SCHILLI
P
or supuesto, que una manera de
realizar tareas, desde Internet, en
una red local es abrir un agujero a
travs del cortafuegos y conectar con un
servidor web local. Servicios como
http://www.dyn-dns.org/ (entre otros)
permiten un acceso casi esttico a travs
de la direccin IP dinmica que asigna el
proveedor de Internet.
Un agente o bot (palabra derivada
de robot) hace la vida ms fcil: Un
cliente de mensajera detrs del cortafue-
gos puede conectar con una red pblica
de mensajera Jabber y aceptar ordenes
en formato de mensajes de texto. El
cliente descrito en este artculo solo
aceptar ordenes desde clientes de su
lista de conocidos y solo permitir cuatro
acciones: cargar la comprobacin para el
ordenador bot, consultar la direccin
pblica del enrutador (orden: ip) y
encender y apagar las luces de mi
apartamento en San Francisco (lamp
on|lamp off).
El guin agent.pl (Vase el Listado
1)necesita Log::Log4perl y transacciones
de log en un archivo
llamado Figura 1: El botdetrs del cortafuegos, ejecuta
las ordenes que se le envan mediante un cliente
Jabber basado en Internet.
Figura 2: El
botaparece
ahora en la
lista de cono-
cidos del
emisor.
Nmero 03 42
43 www.linuxmagazine.com.es Nmero 03
DESARROLLO Perl
x:3:respawn:su U
username -cU
/usr/bin/agent
a /etc/inittab. Este cdigo tambin se
cerciora de que el agente consiga reini-
ciarse inmediatamente si deja de
funcionar por cualquier razn.
Arriba y Abajo
El agente descubre la direccin
externa del enrutador enviando una
solicitud web a la URL pblica http://
perlmeister.com/cgi/whatsmyip. El
objetivo es un simple guin que
devuelve la direccin del cliente
solicitante:
print U
"Content-Type: text/html\n\n";
print $ENV{REMOTE_ADDR}, "\n";
Para hacer esto agent.pl usa
LWP::Simple; si el mensaje de
texto que el cliente Jabber recibe
es IP, la funcin get de la lnea
99 toma el contenido de la
pgina web.
Determinar la carga actual
del sistema sigue un patrn
similar: La lnea 17 llama a
uptimes y el resultado pasa de
vuelta a la lnea 55. La si-
guiente llamada a chomp
elimina el contenido sobrante y
la lnea 62 amontona el resul-
tado en el cuerpo del mensaje;
el mtodo send enva este resultado
hacia el compaero solicitante.
Pero como hace un agente que est
funcionando en un ordenador Linux,
para encender la luz del dormitorio?
La Figura 3 muestra la configuracin.
En EE.UU. se utiliza mucho una tec-
nologa conocida como X10 para
transmitir seales a travs del cableado
de la instalacin elctrica de los hoga-
res (por supuesto que los equipos
americanos solo funcionan con el
voltaje de ese pas, aunque en Europa
tambin se venden productos que uti-
lizan esta tecnologa adaptados a los
valores europeos [5]). Estos equipos se
comunican con el ordenador a travs
de interfaces serie o USB. Hay
disponible una amplia gama de disposi-
tivos X10 para diversas tareas de
automatizacin domestica. Adems de
simples interruptores, se pueden
encontrar sistemas con capacidades
X10 en cmaras de vigilancia, sensores
de movimiento, sistemas de alarma,
reproductores mp3, televisiones y
detectores de metales.
Cada unidad de control X10 (Figura 4)
tiene un cdigo de casa (A-P) y un
cdigo de unidad (1-16) que la unidad
de control (por ejemplo la de la Figura
5) ha de seleccionar para encender la
lampara correcta (en vez de la del
vecino). X10 no es caro (en EE.UU.): Un
kit bsico con cuatro componentes con
toda clase de extras y un control remoto
cuesta en algunos sitios entre 50$ y
100$ en [3].
El listado lamp.pl muestra un guin
corto que enva los cdigos a travs del
puerto serie al controlador de la lam-
para. El guin solo usa
Device::ParallelPort y ControlX10::CM11
de CPAN, para direccionar la unidad
usando el cdigo de casa/unidad en la
lnea 38. El subsiguiente send() con el
cdigo y una J (para encender) o una
K (para apagar) activa el dispositivo
indicado. El puerto serie usado en este
ejemplo en la lnea 34 es /dev/ttyS0,
donde la pequea caja blanca que se ve
en la Figura 6 est conectada al primer
puerto serie del ordenador. Evidente-
mente, este equipo no est a la ultima,
pero eso es solo para demostrar que
Linux es poco exigente con los recursos.
La lnea 35 configura el baudrate a 4800
Figura 4: La dispositivo X10 espera a la seal y
conecta y desconecta la lampara.
Figura 6: Encendiendo la lampara del dormitorio
va Internet.
Figura 3: Visin general del interruptor de luz controlado por
un bot.
Figura 5: La unidad de control X10 con un conector
serie puede enviar seales desde el ordenador a los
dispositivos X10 a travs de la instalacin elctrica.
44 Nmero 03 www.linuxmagazine.com.es
Perl DESARROLLO
un envoltorio C, que se puede com-
pilar as de fcil:
gcc -o lamp lamp.c
Ajustando el bit de setuid va chmod
4755 lamp de manera que un usuario
normal pueda ejecutar el binario com-
pilado lamp y por tanto el guin Perl
/usr/bin/lamp.pl como root:
$ ls -l /usr/bin/lamp*
-rwsr-xr-x 1 root root 11548U
Oct 2 08:48 lamp
-rwxr-xr-x 1 root root 742 U
Oct 2 08:45 lamp.pl
En esta configuracin, solamente root
puede modificar el guin lamp.pl, pero
un usuario normal puede ejecutar
lamp.pl con el ID efectivo de root.
Guardian Bot
Y ahora volvamos al bot:
Para evitar que cualquier cliente
antiguo de Jabber enve ordenes,
para asegurar que el dispositivo X10
conectado al puerto serie reciba el men-
saje correctamente.
Potencia de root restringida
lamp.pl accede al puerto serie del
ordenador y necesita ejecutarse
como root para hacer esto. La lnea
29 comprueba que el user ID sea el
correcto y detendr la ejecucin si
no es 0 (root). Como el cliente Jab-
ber se ejecuta con un user ID sin
privilegios, el listado lamp.c define
001 #!/usr/bin/perl
002 #############################
003 # agent -- Jabber bot
004 # Operando tras un
cortafuegos
005 # Mike Schilli, 2004
006 # (m@perlmeister.com)
007 #############################
008 use warnings;
009 use strict;
010
011 use Net::Jabber qw(Client);
012 use Log::Log4perl qw(:easy);
013 use LWP::Simple;
014
015 Log::Log4perl->easy_init(
016 {
017 level => $DEBUG,
018 file =>
019 '>>/tmp/agent.log'
020 }
021 );
022
023 my $JABBER_USER =
024 'mikes-agent-receiver';
025 my $JABBER_PASSWD = "*****";
026 my $JABBER_SERVER =
027 "jabber.org";
028 my $JABBER_PORT = 5222;
029
030 our %ROSTER;
031
032 my $c =
033 Net::Jabber::Client->new();
034
035 $c->SetCallBacks(
036
037 message => sub {
038 my $msg = $_[1];
039
040 DEBUG "Mensaje '",
041 $msg->GetBody(),
042 "' from ",
043 $msg->GetFrom();
044
045 if ( !exists
046 $ROSTER{ $msg->GetFrom()
047 } ) {
048 INFO "Denegado (no est en "
049 .
050 "la lista)";
051 return;
052 }
053
054 DEBUG "Ejecutando ",
055 $msg->GetBody();
056 my $rep =
057 run_cmd(
058 $msg->GetBody() );
059 chomp $rep;
060 DEBUG "Resultado: ", $rep;
061
062 $c->Send(
063 $msg->Reply(
064 body => $rep
065 )
066 );
067 },
068
069 onauth => sub {
070 DEBUG "Auth";
071 %ROSTER =
072 $c->RosterGet();
073 $c->PresenceSend();
074 },
075
076 presence => sub {
077 # Ignorar todas las
078 # peticiones de subscripcin
079 },
080 );
081
082 DEBUG "Conectando ...";
083
084 $c->Execute(
085 hostname => $JABBER_SERVER,
086 username => $JABBER_USER,
087 password => $JABBER_PASSWD,
088 resource => 'Script',
089 );
090
091 $c->Disconnect();
092
093 #############################
094 sub run_cmd {
095 #############################
096 my ($cmd) = @_;
097
098 # Encontrar IP Externo
099 if ( $cmd eq "ip" ) {
100 return LWP::Simple::get(
101 "http://perlmeister" .
102 ".com/cgi/whatsmyip"
103 );
104 }
105
106 # Imprimir Carga
107 if ( $cmd eq "load" ) {
108 return `/usr/bin/uptime`;
109 }
110
111 # Encender/Apagar luz
112 if ( $cmd =~
113 /^lamp\s+(on|off)$/ )
114 {
115 my $rc =
116 system(
117 "/usr/bin/lamp $1");
118 return $rc == 0
119 ? "ok"
120 : "not ok ($rc)";
121 }
122
123 return "Orden desconocida";
124 }
Listado 1: agent.pl
45 www.linuxmagazine.com.es Nmero 03
DESARROLLO Perl
agent.pl solo acepta mensajes de las per-
sonas de su lista de nombres. Cuando
llega un mensaje, la lnea 45 comprueba
que el emisor est en la lista y lo recha-
zar si no es as.
El manejador de peticin de presencia
definido en la lnea 75 est vaco e ignora
cualquier peticin desde clientes que
quieran aadir al agente en su propia
lista de conocidos. Net::Jabber::Client
trae un manejador predeterminado que
acepta mensajes presence desde
cualquier cliente de la red. Esto no sera
tan malo, pero sin ms dificultades, pon-
dr a estos clientes en su lista de
conocidos. Un manejador de presence
vaco evitar que ocurra esto.
Instalacin
Cuando se instale el bot, se debe confi-
gurar su lista de conocidos. La mejor
manera de hacerlo es usando
un cliente gaim [4], creando 2
nuevas cuentas en Jabber,
mikes-agent-receiver y
mikes-agent-sender y hacer
que mikes-agent-receiver tenga
a mikes-agent-sender en su
lista de conocidos (Vase la
Figura 7).
Si ambas cuentas estn en
lnea, en mikes-agent-sender
emerger el cuadro de dialogo mostrado
en la Figura 8 y ser necesario pulsar en
Authorize para indicar al servidor que
permita que se realice la accin. Entonces
se preguntara a mikes-agent-sender si
quiere poner a mikes-agent-receiver en su
lista de conocidos (Figura 9); por
supuesto que s, hacer esto tiene sentido
para permitir al remitente seleccionar el
nombre en la lista de conocidos para
enviar una orden al bot.
Despus de salir de la sesin, hay que
asegurarse de que la cuenta
mikes-agent-receiver solo se utilice por
agent.pl y no por otros clientes, para evi-
tar que enreden en la lista de conocidos,
que proporciona el mecanismo de la
autorizacin.
Cuando se lance agent.pl,
mikes-agent-receiver debe aparecer en la
lista de conocidos de mikes-agent-sender
(Vase la Figura 2). El archivo de bit-
cora /tmp/agent.log, anotar lo sucedido
en el caso de que sea necesario depurar
la configuracin.
Hay que ser cuidadoso cuando se
aplican modificaciones, un pequeo
error en la implementacin puede abrir
un agujero en el cortafuegos Hay que
vigilarlo!
Desde luego que si se vive en una
zona donde la infraestructura elctrica
no da soporte a X10, se necesitar encon-
trar otra manera de comunicar con el
interruptor de la lampara. Pero, aparte
de este proyecto, estas tcnicas ayudarn
a comenzar con la construccin de un
agente de mensajera instantnea. I
Michael Schilli trabaja como desarro-
llador de software en Yahoo!, Sunnyvale,
California. Es el autor de Perl Power de
la editorial Addison-Wesley y se le puede
contactar en mschilli@perlmeister.com.
Su pgina est en http://perlmeister.
com.
E
L
A
U
T
O
R
01 #!/usr/bin/perl
02 #############################
03 # lamp -- x10 light switch
04 # Mike Schilli, 2004
05 # (m@perlmeister.com)
06 #############################
07
08 use warnings;
09 use strict;
10
11 use Device::SerialPort;
12 use ControlX10::CM11;
13
14 my $UNIT_CODE = "F";
15 my $HOUSE_CODE = "1";
16
17 my %cmds = (
18 "on" => "J",
19 "off" => "K",
20 );
21
22 die "utilizacin: $0 [on|off]"
23 if @ARGV != 1
24 or $ARGV[0] !~
25 /^(on|off)$/;
26
27 my $onoff = $1;
28
29 die "Debe ser root"
30 if $> != 0;
31
32 my $serial =
33 Device::SerialPort->new(
34 '/dev/ttyS0', undef );
35 $serial->baudrate(4800);
36
37 # Unidad de Direccin
38 ControlX10::CM11::send(
39 $serial,
40 $UNIT_CODE . $HOUSE_CODE );
41
42 # Enviar Instruccin
43 ControlX10::CM11::send(
44 $serial,
45 $UNIT_CODE . $cmds{$onoff}
46 );
Listado 2: lamp.pl
01 main(int argc, char **argv) {
02 execv("/usr/bin/lamp.pl",
03 argv);
04 }
Listado 3: lamp.c
[1] Listados de este artculo: http://www.
linuxmagazine.com.es/Magazine/
Downloads/03
[2] Jabber Developers Handbookde Dana
Moore y William Wright, Coleccin Devel-
opers Library, de la editorial Sams
Publishing, 2004.
[3] Dispositivos X10 de: http://x10.com
[4] Gaim, el cliente de mensajera instan-
tnea universal: http://gaim.sourceforge.
net
[5] Dispositivos Domticos: http://www.
domotica.net/
RECURSOS
Figura 7: Usando el cliente gaimpara aadir el
agente de ordenes a la lista de emisores aceptados.
Figura 9: Aadiendo
el bota la lista de
conocidos del
emisor.
Figura 8: Aadiendo
el emisor a la lista
de conocidos del
bot.
46 Nmero 03 www.linuxmagazine.com.es
PHP ADMI NISTRACIN
La mayora de los administradores suelen usar la shell, Perl o
Python si necesitan programar un script de administracin. Pero
para los programadores de la web no es necesario aprender
otros lenguajes para escribir una tarea de rutina. PHP propor-
ciona a los administradores la potencia para programar
herramientas de lnea de comandos e incluso interfaces web
completos. POR CARSEN MHRKE
Uso de PHP en scripts de administracin
Operacin Comando
L
os scripts escritos en PHP para la
consola tienen bsicamente la
misma forma que scripts escritos
para la web: los programadores pueden
usar todo el rango de caractersticas de
PHP. Para permitir de forma sencilla, que
los programas se ejecuten en la lnea de
comandos, se necesita especificar el
intrprete de PHP en la primera lnea del
fichero de scripts de la siguiente forma
#!. Si no se conoce el path al intrprete,
tecleando which php se averiguar.
Tambin, los ficheros de scripts necesi-
tan tener activado el permiso de ejecu-
cin. Echmosle un vistazo al tpico
ejemplo Hello, World en PHP:
#!/usr/bin/php -q
<?php
echo "Hello, World\n";
?>
Las herramientas de PHP es lo que se nece-
sita para cualquier clase de manipulacin
de texto, como modificacin de ficheros de
configuracin, ficheros de registro,
entradas de gestin de usuarios y cosas
as. Si se necesita acceder a las funciones
de sistema operativo, para tareas como
administracin de procesos, se necesitar
aadir algunos comandos Linux.
Lnea de Comandos
PHP tiene cuatro funciones diseadas
para la ejecucin de comandos del sis-
tema: exec(), system(), passthru() y
shell_exec():
*exec() ejecuta el comando que se le
pasa como primer argumento y elimina
cualquier salida del comando. La ltima
lnea del comando se devuelve como
resultado. Si el segundo parmetro es el
nombre de un array, exec() rellena el array
lnea a lnea con la salida que debera
aparecer en la pantalla. Si se necesita
procesar el cdigo de salida del comando
exec() se puede usar un tercer parmetro.
*system() no suprime la salida al con-
trario que exec(). Tiene un segundo
parmetro opcional para el cdigo de salida.
*passthru() funciona como system(),
pero en modo binario compatible. Esto
permite al comando pasar imgenes ge-
neradas como salida convertidas para un
navegador web.
*shell_exec() funciona como una ver-
sin simple de parmetros de exec(),
pero en vez de extraer la ltima lnea,
devuelve una cadena con la salida com-
pleta del comando. La cadena contiene
caracteres de nueva lnea en contraposi-
cin a las entradas que devolva el
comando exec() en el array de valores.
Tanto exec() como shell_exec() son
tiles en casos donde se necesite mani-
pular el texto de salida de un comando
externo. Los ejemplos que vienen a con-
tinuacin hacen uso de la funcin exec(),
que es mucho ms flexible que las otras
funciones. Nos encontramos con un
pequeo fallo tcnico relacionado con
esto en la actualidad: PHP no siempre
devuelve el cdigo de salida correcto del
comando externo (por ejemplo cuando
concatenamos comandos).
Control de Procesos
El siguiente script PHP usa exec() para
mostrar el nmero de procesos que se
ejecutan en el sistema:
unset ($out);
$cmd="ps axu | wc -l";
$erg=exec($cmd,$out);
$erg-=1; //minus 1 line header
echo "Number of active U
processes is $erg\n";
Las versiones de PHP 4.3.0 o posteriores tienen un nuevo interfaz para la shell para programar
herramientas desde la lnea de comandos: el CLI(Command Line Interface). Las versiones previas
de PHP (incluso algunas nuevas) tienen un interfaz de programacin llamado Server Application
Programmers Interface (SAPI), pero SAPI fue diseado para usarse en servidores web (CGI-SAPI) y
aade una cabecera HTTP a la salida. (Se puede suprimir la cabecera colocando la opcin -q cuan-
do se lanza el intrprete de PHP, pero esto no eliminar las etiquetas HTML de los mensajes de
error). Se puede comprobar si se tiene la versin CGI, que no tiene el mismo alcance de caractersti-
cas que tiene la interfaz de lnea de comandos, tecleando php -v. El ejemplo de este artculo fun-
cionar con cualquier versin.
Interfaces para la Shell Antiguos y Modernos
El fichero primero elimina el contenido
de la variable $out, que representa el
array donde se almacenar la salida del
comando. exec() no sobrescribira el
array sino que simplemente le aadira
al final la nueva salida. El ejemplo impi-
de que se mezclen los resultados de
mltiples scripts vaciando primero el
array. El comando detecta el nmero de
lneas en la lista de procesos y resta una
lnea de las cabeceras de columna.
shell_exec() y exec() tan slo pueden
manejar datos de stdout. Para capturar la
salida de error estndar desde stderr, se
necesita redireccionar la salida de error a
stdout: 2 >&1.
Los programadores a menudo necesitan
pasar argumentos de la lnea de comandos
al script. Para permitir que esto pueda
hacerse, PHP introduce los argumentos
que siguen al nombre del fichero en la
lnea de comandos dentro de un array lla-
mado $argv, conservando el orden origi-
nal. Adems, el nmero de argumentos se
almacena en la variable $argc.
Buenos Argumentos
PHP no soporta comandos que lean
datos directamente desde el teclado. Para
proporcionar soporte a las entradas de
teclado, los programadores pueden abrir
el flujo stdin como un fichero y leer
desde l. Esto permite el uso de los flujos
stdout y stderr relacionados:
$in=fopen("php://stdin","r");
$err=fopen("php://stdin","w");
$input=trim(fgets($fp, 100));
while (""==$input)
{
fputs($err,"Please input a U
value\n");
}
Si se usa stdin para leer las entradas de
teclado de esta forma, el script debera
usar la funcin trim() para eliminar los
espacios en blanco al final de la cadena.
No hay necesidad de usar stdout para la
salida de datos, ya que PHP cuenta con
las funciones echo y print para realizar
estas tareas. La salida de ambos coman-
dos pueden ser redireccionadas.
Coloreado
Para disear aplicaciones ms cmodas,
los programadores necesitan funciones
que borren la pantalla, que controlen el
cursor y que aadan color a la salida. Las
secuencias ANSI [1] proporcionan una
solucin til, ya que la shell es capaz de
interpretarlas. Estas secuencias empiezan
con el carcter Escape y son conocidas
como secuencias de Escape. Por ejemplo,
la secuencia echo "\033[2J" limpia la pan-
talla. La Tabla 1 lista unas cuantas de las
secuencias ms importantes.
El color seleccionado permanece vli-
do hasta que se selecciona un color
diferente. Las funciones de PHP ncurses
proporcionan mayor portabilidad y un
rango mucho ms amplio de caractersti-
cas. Vase los ejemplos de las pginas
web de PHP o Zend en [2], [3] para ms
detalle.
Gestin de Usuarios
El siguiente ejemplo muestra las fun-
ciones referidas a aquellas en el con-
texto de un script para la gestin de
usuarios de un servidor con el fin de
que se vean ejemplos prcticos. El
Listado 1 es una muestra y el script
completo est disponible para descar-
garse desde [4].
Ntese que el script abre la entrada
estndar con fopen() pero no hace uso
de fclose() para cerrarla. Ya que PHP
automticamente cierra todos los flujos
abiertos cuando finaliza el programa, el
script evita cerrar el flujo por razones de
legibilidad. El tiempo de ejecucin para
los programas de la lnea de comandos
no est restringido.
PHP es ideal para crear interfaces web.
Esta atractiva opcin tiene algunas pegas
ocultas. Cuando se disea una aplicacin
se necesita considerar los riesgos poten-
ciales de seguridad. El ms pequeo de
los agujeros de seguridad podra tener
consecuencias fatales. Un ejemplo:
01 <form method="POST">
02 Command: <input name=
"cmd" /><br />
03 <input type=
"submit" value=
"Execute" />
04 </form>
05 <?php
06 if (isset ($_POST['cmd']))
07 {
08 $outp=shell_exec
09 ($_POST[cmd]);
10 echo "<pre>$outp</pre>";
11 }
12 ?>
Las soluciones que ejecutan comandos
arbitrarios (como esta) estn fuera de
lugar. Los scripts de administracin tan
slo deberan ser ejecutables dentro de
un entorno seguro y no deberan permi-
tir ninguna posibilidad de que sean
manipulados.
Privilegios Especiales
Los scripts a menudo necesitan privile-
gios de root. Un script PHP basado en
web normalmente se ejecuta con los
privilegios del identificador de usuario
del servidor web. Podra parecer obvio
darle a este usuario (tpicamente www,
wwwrun o nobody) muchos ms privile-
gios, pero esto es extremadamente peli-
groso. Comandos como sudo o su pro-
porcionan una alternativa. Sin embargo,
su requiere la prctica insegura de aadir
la clave de root como texto en claro den-
tro del script.
La herramienta sudo tambin puede
asignar privilegios de root para acciones
especficas a un usuario sin la necesi-
dad de que este usuario conozca la
clave de root. En vez de ello, los usua-
rios se autentican con su propia clave y
se les asignan los privilegios especficos
por el root en el fichero /etc/sudoers. Si
un administrador necesita asignar al
usuario webadmin el derecho de termi-
nar procesos con el comando kill, l o
ella podra aadir la siguiente lnea a
/etc/sudoers:
webadmin ALL = /bin/kill, U
/usr/bin/killall
Es una buena idea usar el editor visudo
para esto. El editor se asegura de que
slo un usuario puede editar el fichero
47 www.linuxmagazine.com.es Nmero 03
ADMI NISTRACIN PHP
Significado Secuencia
Borrar Pantalla \033[2J
Posicionar el cursor en x,y
\033[x;yH
Coloca el cursor n posiciones a la izquierda
\033[nC
Coloca el cursor n posiciones arriba
\033[nA
Color de Fuente rojo \033[0;31m
Color de Fuente negro \033[0;30m
Color de Fuente verde \033[0;32m
Color de Fuente gris \033[0;37m
Tabla 1: Secuencias de
Escape importantes
Si el usuario webadmin no es el
usuario root del servidor web desde el
punto de vista de los procesos de Unix
(esto implicara la herencia de los privi-
legios del usuario que probablemente no
sera deseada en la mayora de los
casos), con toda seguridad se necesitar
una combinacin de su y sudo. El
usuario del servidor web primero
asumir la identidad de webadmin tem-
poralmente ejecutando su y entonces es
cuando se le asignan los privilegios de
root especficos por medio de sudo. Un
script que usa esta solucin puede pare-
cerse a este:
$user="webadmin"; //sudoer
$pwd="clave"; U
// Webadmin password
$befehl="kill -9U
".escapeshellarg($_GET
["pid"]);
$cmd_line="echo $pwd | U
su -l $user -c
\"echo $pwd | sudo -S U
$command 2>&1\"";
$ret=shell_exec($cmd_line);
El script primero usa escape-shellargs()
para manipular el pid, que lo procesa
desde un formulario. Esto elimina los
ataques potenciales a la shell, que por
otro lado se podran insertar en el cdigo
de forma maliciosa. I
de configuracin al mismo tiempo.
Adems se asegura de que las entradas
concuerden con las reglas y no entren en
conflicto.
La sintaxis genrica para asignar privi-
legios con sudo es: QUIEN DONDE =
QUE. QUIEN puede ser un nombre de
usuario, como en nuestro ejemplo, o un
grupo de usuarios que deben ser
definidos usando un User_Alias. DONDE
significa el host donde el usuario tendr
estos privilegios.
Cambio de Identidad
Gracias a las entradas en el fichero de
configuracin de sudo, el usuario webad-
min puede ahora matar procesos de
forma arbitraria despus de introducir su
clave para la cuenta de usuario. Un
script automatizado podra pararse y pre-
guntar por la clave antes de continuar.
Suele colocarse el parmetro -S para indi-
carle a sudo que lea la contrasea desde
la entrada estndar. La lnea de coman-
dos sera como sigue: echo clave | sudo -S
kill 13221
48 Nmero 03 www.linuxmagazine.com.es
PHP ADMI NISTRACIN
01 #!/usr/bin/php -q
02 <?php
03 function cls()
04 {
05 echo "\033[2J"; // Borrar
Pantalla
06 echo "\033[0;0H"; // Cursor
07 to 0,0
08 }
09
10 function text_red()
11 {
12 echo "\033[0;31m";
13 }
14
15 function text_black()
16 {
17 echo "\033[0;30m";
18 }
19
20 // Funciones adicionales
21 // Se ha insertado nombre de
usuario?
22 $in=fopen("php://stdin","r");
23
$err=fopen("php://stderr","w")
;
24 if (3==$argc &&
25 "-u"==$argv[1] &&
26 isset($argv[2]))
27 {
28 $user=$argv[2]; // leer
29 username
30 }
31 else
32 { // no hay nombre de usuario
33 fputs($err,"Por favor utilice
-u para insertar un nombre de
usuario\n");
34 exit(1);
35 }
36 // Comprobar existencia
usuario
37 // con etc/passwd
38 if (false
===user_exists($user))
39 {
40 fputs($err,"Nombre de usuario
no existe\n");
41 exit(2);
42 }
43
44 while (1) //Procesado infinito
45 loops
46 {
47 cls();
48 text_red();
49 echo "Administracin para
usuario $user\n";
50 text_black();
51 echo "1) Comprobar
consistencia\n";
52 echo "2) Crear usuario MySQL
DB\n";
53 // Ms elementos del men
54 echo "q) Salir Programa\n\n";
55 echo "Escoja una opcin: ";
56 // Eliminar blancos e entrada
57
58 $input=trim(fgets($in,255));
59
60 switch ($input)
61 {
62 case "1":
63 consistency_check($in);
64 break;
65 // Ms casos
66 case "q": exit(0);
67 // beep en caso de entrada
incorrecta
68 default: echo chr(7);
69 }
70 }
71 ?>
Listado 1: Men PHP
[1] Cdigos ANSI:http://en.wikipedia.org/
wiki/ANSI_escape_code
[2] Manual de Funciones Ncurses: http://
www.php.net/ncurses
[3] Tutorial Ncurses: http://www.zend.com/
zend/tut/tut-degan.php
[4] Listado: http://www.linuxmagazine.com.
es/Magazine/Downloads/03
RECURSOS
Carsten Mhrke es un consultor free-
lance y profesor, es el autor de Better
PHP Programming y el CEO de
Netviser. Puede ponerse en contacto
con Carsten en cmoehrke@netviser.de.
E
L
A
U
T
O
R
49 www.linuxmagazine.com.es Nmero 03
DESARROLLO Python
T
anto GNOME como KDE disponen
de sendas aplicaciones para con-
sultar diccionarios. A nosotros nos
resultan muy tiles cuando, por ejemplo,
aparece en alguna pgina o documento
una palabra de argot o difcil en ingls.
Entonces recurrimos a ellas, realizan
consultas en prestigiosos diccionarios
como el Webster o en el famossimo (a la
par que desternillante) Jargon file.
Pero no todo el mundo est dispuesto
a usar GNOME o KDE (al menos uno de
nosotros no lo hace), as que parece un
poco desmedido instalar todo un escrito-
rio grfico solamente para tener acceso a
un programa que podemos realizar sin
demasiada dificultad usando nuestro
querido Python y el maravilloso Tkinter.
Hablando con el servidor de
la R.A.E.
La R.A.E. (Real Academia de la lengua
Espaola) tiene una pgina web (http://
www.rae.es) donde podemos consultar el
Desde que lleg Internet todos escribimos ms. Se supone que con los ordenadores y sus fabulosos correctores ortogr-
ficos y gramaticales no volveramos a cometer errores garrafales al hescrivir. La realidad es que, a pesar de estas ayudas,
cuando escribimos a travs de los sistemas de mensajera o en los correos solemos usar argot, lo que nos obliga a desac-
tivar los correctores. Es entonces, despus de escribir mil veces k en lugar de que, al enfrentarnos a escribir algo
normal comienzan a asaltarnos dudas esto era con b o con v? Existe esta palabra?.
POR JOS MARA RUZ Y JOS PEDRO ORANTES
Problemas de ortografa? La R.A.E. y Python raudas al rescate.
Python y Palabra
Empiezan por P
50 Nmero 03 www.linuxmagazine.com.es
Python DESARROLLO
parmetros seleccionemos
nosotros, lo que nos per-
mitir hablar con el servi-
dor directamente sin
necesidad de usar un
navegador. De esta man-
era podemos crear progra-
mas que salten el paso del
navegador y accedan
directamente al servidor
HTTP.
Ese es nuestro objetivo.
Tenemos que localizar
esos parmetros en el
servidor HTTP de la R.A.E. en la pgina
de bsqueda de palabras.
Localizando los Parmetros
Ahora comienza nuestra labor de detec-
tives. Primero accedemos a la pgina de
la R.A.E y pinchamos en Diccionario de
la lengua espaola, lo primero que nos
debera extraar es que la URL no ha
cambiado, sigue siendo http://www.rae.
es. Eso significa que nuestro browser
est volviendo a pedir el mismo objeto al
servidor HTTP, pero lo que vemos es una
pgina distinta. Esto puede significar
varias cosas, pero una inspeccin del
cdigo HTML de la pgina nos dice que
se estn usando FRAMES.
El W3C [1], entidad que gestiona
muchos de los estndares de la web,
desaconseja el uso de FRAMESET, la
razn es que engaan a las URLs y al
usuario. Por ejemplo, estoy diciendo que
estamos en la pgina de bsqueda del
diccionario de la R.A.E., pero la URL
sigue siendo la de la pgina principal de
la R.A.E. (http://www.rae.es), as que no
podemos deciros que vayis a esa URL
porque no se corresponde con la de
bsqueda en el diccionario. Por ello los
FRAMES destruyen la idea de que una
URL, una direccin, corresponde a un
solo objeto en la red.
La pgina de bsqueda la componen 2
FRAMES ( o subpginas): cabecera y por-
tada. La cabecera no nos interesa. La por-
tada a su vez la componen los FRAMES:
eleccin y presentacin. Este ltimo es el
que presenta los resultados de la bsque-
da pero como sabe a qu palabra nos
estamos refiriendo?
Cada FRAME contiene varias pginas,
y los FRAMES se disearon para mostrar
varias pginas la vez. A nosotros solo
nos importa una pgina: http://buscon.
rae.es/draeI/SrvltGUIBusUsual.
Esta pgina es la que acepta un
parmetro, LEMA, y devuelve una web
con la definicin (o un aviso de fallo) de
LEMA. El mtodo usado es POST, lo
sabemos porque si vemos la informacin
de la pgina, los parmetros pasados son
LEMA de tipo POST. Pero muchas aplica-
ciones web, en particular la que usar
Servlets de Java, suelen buscar los
parmetros tanto en POST como en GET.
Y ste es nuestro caso.
Cmo se pasan parmetros? Pues
muy sencillo, vamos a usar GET. Se pone
la URL y se le aade ?<PARA-
METRO1>=<VALOR1>&<PARA-
METRO2>=<VALOR2>. Por ejemplo:
http://buscon.rae.es/draeI/
SrvltGUIBusUsual?LEMA=hola. Ahora
tenemos que ver como es posible obten-
er el contenido de esa URL.
Lynx al Rescate
Podramos haber diseado algn com-
plejsimo sistema, para traer la pgina
HTML, eliminarle las etiquetas, for-
matearla y dems; pero la vagancia, alia-
da poderosa del buen programador, nos
hace buscar una manera ms simple de
hacer esto.
La manera ms simple, consistira en
seguir el ejemplo de xdrae [2]. Esta apli-
diccionario o realizar preguntas sobre
dudas lingsticas. Tener que acceder a
esa pgina es un poco engorroso si lo vas
a hacer ms de una vez.
A pesar de todas esas buzzwords (que
si PHP, que si J2EE, que si .NET) al final
todo acceso a un servidor web se realiza
a travs del protocolo HTTP. Este proto-
colo no posee estados y, bsicamente,
sirve para pedir ficheros. En teora
implementa varios tipos de mensajes, de
los cuales solo el GET y el POST se uti-
lizan (existe otros ms, como PUT que
nos permitira depositar archivos, pero
casi nadie lo usa). GET sirve para pedir
un fichero a travs de una URL y POST
para enviar informacin al servidor
HTTP.
Desde este punto de vista, un servi-
dor HTTP solo ve dos cosas: archivos
que le pedimos y datos que le damos.
Tanto GET como POST se pueden uti-
lizar para pasar informacin al servidor.
Ambos tienen ventajas e inconve-
nientes. Generalmente se usa GET,
porque los parmetros que pasamos al
servidor van incluidos en la URL. De
esta manera podemos pasarle una URL
a alguien o ponerla en nuestra pgina y
cualquiera podr ver la pgina con los
parmetros que nosotros selec-
cionamos. Con POST esto no es posible,
ya que los parmetros no estn pre-
sentes en la URL. Los estndares dicen
que GET debe usarse para pasar
parmetros (opciones por ejemplo)
mientras que POST debe ser usado para
mandar informacin al servidor que
posteriormente sea almacenada.
Si entramos en una pgina web y
prestamos atencin a las URLs que se
van generando podemos encontrar las
opciones que acepta esa pgina. Si las
localizamos podemos crear URLs cuyos
01 #!/usr/local/bin/python
02
03 from popen2 import popen2
04 from sys import argv
05
06 def busca_palabra(palabra):
07 salida, entrada =
popen2('lynx -dump --nolist
"http://buscon.rae.es/draeI/Sr
vltGUIBusUsual?TIPO_HTML=2&LEM
A=' + palabra + '"')
08 entrada.close()
09 cadena = salida.read()
10 print(cadena)
11
12 if __name__ == "__main__":
13 if ( len(argv) == 1 ):
14 print("ERROR: hace
falta un argumento")
15 else:
16 busca_palabra(argv[1])
Listado 1: Programa
buscador.py
Figura 1: Nuestra utilidad busca-palabras en marcha.
cacin, realizada en Tcl/Tk, descansa en
otro programa, lynx, para obtener el
resultado de las bsquedas parseado y
en formato texto.
Esto nos ensea un leccin muy
importante de la manera en que UNIX
entiende la reutilizacin de cdigo. La
manera propuesta por UNIX es la
creacin de utilidades compactas y
pequeas que puedan ser conectadas
mediantes tuberas (por ejemplo ls -l | wc
-l). Para que esto sea posible, las salidas
deben ser en formato texto.
lynx acepta multitud de parmetros
pero posee uno, -dump, que hace que
vuelque en la salida estndar la pgina,
pero ya formateada de manera que es
ASCII sin etiquetas HTML. Si lo hace-
mos as, lynx nos volcar la pgina for-
mateada ms una lista de todos las
URLs de los hipervnculos de la misma.
Para que no lo haga aadimos --nolist.
Nos quedara al final algo as: lynx
-dump --nolist URL.
popen2
Para poder recoger lo que lynx genera
tenemos que crear una tubera entre l y
nosotros. Para ello existe la funcin
popen2 de la librera del mismo nombre.
Esta funcin ejecuta un programa y crea
dos descriptores de fichero, uno para
mandarle texto al programa y otro para
recibirlo. Se corresponden con la entrada
y la salida estndar del programa que se
ejecuta.
La idea es ejecutar lynx... con
popen2. Su entrada estndar no nos
interesa, as que la cerramos, pero la
salida estndar es lo que buscbamos.
Una vez ejecutado popen2, el volcado
de lynx... puede ser ledo como si
leysemos un fichero.
>>> salida, entrada = popen2U
("wc -w")
>>> entrada.write("En un lugarU
de la mancha de cuyo nombre noU
quiero acordarme")
>>> entrada.close()
>>> print salida.read()
12
>>>
wc -w devuelve el nmero de palabra
que son ledas de su entrada estndar
hasta el fin de fichero (por eso tenemos
que hacer un entrada.close()).
51 www.linuxmagazine.com.es Nmero 03
DESARROLLO Python
01 #!/usr/local/bin/python
02
03 from popen2 import popen2
04 from Tkinter import *
05 from Tkconstants import *
06
07 class GUI:
08 def __init__(self):
09 self.root = Tk()
10
self.crea_panel_busca()
11
self.crea_panel_muestra()
12
13 def arranca(self):
14 mainloop()
15
16 def busca_palabra(self):
17
self.label_estado.config(text=
"Estado: buscando palabra...")
18 palabra =
self.entry_palabra.get();
19 salida, entrada =
popen2('lynx -dump --nolist
"http://buscon.rae.es/draeI/Sr
vltGUIBusUsual?LEMA=' +
palabra + '"')
20 entrada.close()
21 texto = salida.read()
22 # Borramos el texto
que hubiese antes
23
self.label_estado.config(text=
"Estado: mostrando texto")
24
self.text_muestra.delete(1.0,E
ND)
25
self.text_muestra.insert(1.0,t
exto)
26 salida.close()
27
28 def
crea_panel_muestra(self):
29 self.panel_muestra =
Frame(self.root)
30
self.panel_muestra.pack()
31
32 # Vinculamos una barra
de desplazamiento
33 self.scrollbar=
Scrollbar(self.panel_muestra)
34
self.scrollbar.pack(side=RIGHT
,fill=Y)
35
36 # Caja de texto para
mostrar la definicin de la
37 # palabra
38 self.text_muestra =
Text(self.panel_muestra,
yscrollcommand =
self.scrollbar.set)
39
self.text_muestra.pack()
40
41 def
crea_panel_busca(self):
42 self.panel_busca =
Frame(self.root)
43
self.panel_busca.pack()
44
45 self.label_estado =
Label(self.panel_busca,
text="Estado: parado")
46
self.label_estado.pack(side=LE
FT)
47
48 self.entry_palabra =
Entry(self.panel_busca)
49
self.entry_palabra.pack(side=L
EFT)
50
51 # Botn de salida
52 self.btn_salir =
Button(self.panel_busca,text="
Salir", command=
self.root.destroy)
53
self.btn_salir.pack(side=RIGHT
)
54
55 self.btn_busca =
Button(self.panel_busca,
text='Buscar',
command=self.busca_palabra)
56
self.btn_busca.pack(side=RIGHT
)
57
58 if __name__ == "__main__":
59
60 app = GUI()
61 app.arranca()
Listado 2: Programa buscador2.py
52 Nmero 03 www.linuxmagazine.com.es
Python DESARROLLO
de empotrar en aplicaciones realizadas
en C. La idea era que el usuario pudiese
extender la funcionalidad de la apli-
cacin sin tener que ponerse a progra-
mar en C, sino creando scripts que la
aplicacin ejecutara.
Al poco tiempo comenz a trabajar en
Tk, una extensin de Tcl que permitira
la creacin de interfaces grficos de
manera rpida y simple gracias a Tcl.
Aunque no hayamos escuchado hablar
mucho de Tcl/Tk, su importancia en el
software es muy grande, muchos lengua-
jes usan Tk como libreras grficas. Tcl/
Tk se ha usado mucho en el prototipado
de aplicaciones.
El hola mundo Grfico
Despus de esta pequea leccin de
historia, pongmonos manos a la obra.
Lo primero que necesitamos saber es
como estructura Tk los widgets (usare-
mos esta palabra a partir de ahora,
viene a significar elementos grficos).
Tk usa un rbol, como el rbol de
directorios, pero en lugar de usar el
smbolo / y usa el punto, .. La apli-
cacin se crea desde la raz, . hacia
adelante. Los widgets pueden contener
otros widgets, o sea, los widgets
pueden ser directorios de otros widgets.
As podemos tener un widget .panel
que tenga dos hijos .panel.campo_texto
y .panel.boton1. Visualmente veramos
a campo_texto y a boton1 dentro de
panel.
Veamoslo en prctica con un hola
mundo.
01 >>> import Tkinter
02 >>> from Tkconstants import *
03 >>> tk = Tkinter.Tk()
04 >>>
05 >>> panel = Tkinter.Frame(tk,
relief=RIDGE, borderwidth=2)
06 >>> panel.pack(fill=BOTH,
expand=1)
07 >>>
08 >>> etiqueta = Tkinter.Label
(panel, text="Hola Linux
Magazine")
09 >>> etiqueta.pack(fill=X,
expand=1)
10 >>>
11 >>> boton = Tkinter.Button
(panel,text="Salir",
command=tk.destroy)
12 >>> boton.pack(side=BOTTOM)
13 >>>
14 >>> tk.mainloop()
El mtodo pack posiciona los widgets
dentro de su widget padre, si le especifi-
camos side=BOTTOM los ir posicio-
nando uno encima de otro; fill=X sirve
para que el widget ocupe todo el espacio
horizontal (con fill=Y ocupara el verti-
cal y con fill=XY todo el espacio
disponible); expand=1 hace que el wid-
get crezca si su padre crece, en caso con-
trario no modificar sus dimensiones.
Tk funciona de la siguiente manera.
Primero se construye el interfaz grfico.
Cada elemento del interfaz responde a
una serie de eventos (ser pulsado, que el
ratn pase por encima) y cada uno de
estos eventos puede estar vinculado con
un procedimiento que se dispara al ocu-
rrir el evento. As que asignamos proce-
dimientos a los eventos de los widgets.
Por ltimo entramos en el bucle principal
(main loop).
Todas las invocaciones a las funciones
de creacin de widgets tienen un primer
argumento, en l se especifica de quien
cuelga (o dentro de quien est) nuestro
widget. Aqu el widget tk representa la
ventana, dentro de la cual hay un panel
y dentro del cual hay dos widgets, una
etiqueta y un botn.
El botn tiene vinculado un comando,
en este caso tk.destroy, pero podra
Ahora solo tenemos que ejecutar nues-
tro comando lynx... y leer su salida,
almacenando el valor en una variable.
Script de Consulta Sencillo
xdrae hace uso de esta metodologa de
trabajo, invocando a lynx, que realiza la
mayor parte del trabajo pesado, dejn-
dole a xdrae la gestin del GUI. Un script
sencillo para que consigamos el mismo
resultado sera el del Listado 1.
Cuando Python comenz a tener
expansin se hizo evidente la necesi-
dad de un sistema para la creacin de
interfaces grficos. Pudieron hacer lo
mismo que en Java y crear su propio
sistema (AWT y Swing), pero en lugar
de eso reutilizaron uno ya existente:
Tcl/Tk.
Tcl/Tk
Tcl/Tk son unas siglas extraas, pueden
recordarnos a TCP/IP y la verdad es que
algo comparten con ellas. Tanto Tcl/Tk
como TCP/IP hacen referencia a 2 tec-
nologas que trabajan juntas. En el caso
de Tcl/Tk estas tecnologas son el
lenguaje script Tcl y el sistema de inter-
faz grfico de usuario Tk. Tk fue creado
despus que Tcl, y est realizado como
una extensin de Tcl.
Tcl fue creado por el profesor John K.
Ousterhout con el objetivo de disponer
de un lenguaje script que fuese sencillo
Figura 2: Pgina del diccionario de la RAE.
haber sido otro. Podramos haber incor-
porado otro botn antes de ejecutar el
tk.mainloop():
>>> def escribe():
... print "Hola mundo"
...
>>>
>>> boton2 = Tkinter.ButtonU
(panel, text="Escribe",U
command= escribe )
>>> boton2.pack(side=BOTTOM)
Habra otro botn, debajo de el botn
Salir, que al pulsarlo escribira por la sa-
lida estndar (normalmente la consola)
el texto Hola mundo.
Diseo de la aplicacin
Tk tiene todos los widgets que existen en
el resto de GUIs. Tenemos etiquetas,
botones, paneles, imgenes, combos y
dems. Nosotros lo que necesitamos es:
Un panel
Una etiqueta Estado, un campo
de entrada de texto, un botn
Buscar y otro Salir.
Un widget de texto con mlti-
ples lneas para la respuesta,
con una barra de desplaza-
miento asociada.
Deberamos tambin darle un
ttulo a la ventana.
Barras de desplazamiento +
Campos de texto = algo muy
til
Un widget de texto es un widget que nos
permite mostrar una gran cantidad de
texto. Posee infinidad de opciones, sien-
do posible implementar con ellas hasta
un intrprete de HTML o crear texto
enriquecido.
Vamos a usar un widget de texto para
contener la respuesta del servidor de la
R.A.E.. Tenemos que solucionar el pro-
blema de que la respuesta de la R.A.E.
sea mayor que el contenido de nuestro
campo. Nuestro widget de texto no va
ser redimensionable y puede que haya
ms texto del que quepa en el rea que
vemos del widget de texto.
Para solucionar este problema, se
inventaron las barras de desplazamiento,
que damos por sentadas, pero que
fueron toda una innovacin en su da. La
idea es crear una barra de desplazamien-
to y vincular su movimiento y tamao al
texto mostrado en el widget de texto que
tendr asociada.
En Tk el tamao no es posible vincu-
larlo, pero podemos vincular el
movimiento. Algunos widgets, aquellos
propensos a usar una barra de desplaza-
miento, poseen un evento llamado
yscrollcommand, que toma un valor de
una funcin y lo usa para posicionar el
texto dentro del widget. El widget tiene
un elemento llamado viewport, que es la
ventana dentro de todo lo que tiene el
widget que puede ver el usuario. El wid-
get puede tener, aprovechando la coyun-
tura, El Quijote pero en el viewport
solo se ven unos cuantos prrafos de la
obra de Cervantes. Cuando vinculamos
una barra de desplazamiento con un
widget de texto en realidad lo que hace-
mos es que vinculamos el valor de inicio
del viewport con el de la barra de
desplazamiento.
Ensamblaje Final
Y ahora llega el momento que estbamos
esperando, cuando todas estas tcnicas e
ideas se ponen juntas y aparece algo til.
Bsicamente lo que hace nuestra apli-
cacin es crear un objeto GUI. ste se
encarga de crear y vincular la acciones
que los widget requieren. Una vez
creadas, es necesario invocar el mtodo
arranca() que ejecuta el bucle principal
de Tk. Este bucle se dedica a repintar la
ventana y gestionar los eventos.
El encargado de buscar en la R.A.E.
una palabra a travs del botn Buscar
es el mtodo busca_palabra, ejecuta
lynx con las opciones necesarias y con
el contenido del campo de entrada. Lo
hace a tras de popen2. Cuando est listo
el texto, borra el contenido del widget de
texto e inserta en l el texto devuelto por
el servidor HTTP de la R.A.E..
Cada vez que se hace esto, la apli-
cacin queda bloqueada como resultado
de la invocacin a popen2, que bloquea
a nuestra aplicacin hasta que termine
de ejecutarse lynx. Para evitar este
problema se deben emplear hebras,
pero eso est fuera del alcance de ste
artculo.
Cuando se pulsa el botn Salir la
aplicacin acaba. I
53 www.linuxmagazine.com.es Nmero 03
DESARROLLO Python
[1] W3C http://www.w3c.org
[2] Pgina de xdrae http://xinfo.sourceforge.
net/xdrae.html
RECURSOS
Jos Mara Ruiz actualmente est
realizando el Proyecto Fin de Carrera
de Ingeniera Tcnica en Informtica
de Sistemas. Lleva 7 aos usando y
desarrollando software libre y, desde
hace dos, se est especializando en
FreeBSD. Pedro Orantes est cursando
3 de Ingeniera Tcnica en Infor-
mtica de Sistemas.
L
O
S

A
U
T
O
R
E
S
Figura 3: Buscador desde la lnea de comandos.
Figura 4:
Hola
Mundode
Tcl/Tk.
54 Nmero 03 www.linuxmagazine.com.es
Charly ADMI NISTRACIN
sta difiere de la anterior con un nmero
de pixeles configurable. El siguiente
comando es el nico que necesit usar
para utilizar esta funcin:
motion -t /home/charly/motion
El parmetro -t indica a Motion donde
debe almacenar las imgenes. Ahora,
cuando paso delante de la cmara Web,
los altavoces del PC emiten un sonido de
alerta. Motion ha detectado el cambio en
la imagen. Si preferimos omitir el sonido
de alerta debemos aadir -Q al comando.
Si queremos que Motion se ejecute en
modo demonio aadiendo el parmetro
-D, el sonido esta deshabilitado por
defecto.
Cuando las Pelculas
Aprenden a Contar
Si necesitamos ajustar a medida Motion
debemos tocar el archivo opcional de
configuracin. El archivo puede residir
bajo /usr/local/etc/ o en nuestro directo-
rio raz. El archivo de configuracin nos
permite ajustar la sensibilidad de la fun-
cin de deteccin de la imagen. La
entrada
threshold 1500
Estipula que al menos 1500 pixeles deben
cambiar de una imagen a otra antes de
que Motion detecte el cambio. Mis peces
de pelea Siameses son muy valientes
pero muy pequeos, por lo que dej el
valor en la mitad. Esperando y contem-
plando, Motion reacciona cada vez que
un pequeo pez de 3 centmetros o ms
nada delante de la cmara Web. Si nues-
tra distribucin Linux dispone de
codificador MPEG podemos incluso
hacer que Motion nos genere una
pelcula a partir de una serie de imgenes
fijas (por ejemplo, ffmpeg proporciona
soporte directo para esta aplicacin).
Motion.cgi [2] hace que el uso de Motion
sea incluso ms sencillo. El paquete
opcional incluye un interfaz para comen-
zar, detener y grabar con Motion. Incluso
nos permite picotear en el flujo de datos
en cualquier momento para ver una ima-
gen real en vivo como la que aparece en
la figura 1, que muestra los habitantes de
mi pecera.
Debemos saber que la cmara que use-
mos puede ser determinante en los
resultados que Motion nos d. Mi vieja
cmara Web fue til mientras la
habitacin tuvo luz suficiente, pero intil
en la oscuridad. Como no creo que los
ladrones entren en la tienda de Olli y
Melanie para encender la luz y sonrer a
la cmara, parece lgico que mis amigas
inviertan en una nueva cmara Web. I
Los sistemas comerciales del vigilancia son caros y normalmente involucran
acuerdos de mantenimiento. Yo creo que debe haber una alternativa de bajo
coste. POR CHARLY KHNAST
Vigilancia con movimiento
Gente Pez
Autopsy............................................55
En esta segunda parte dedicada a las audi-
toras de seguridad, vemos como
diseccionar un equipo cuya seguridad ha
sido comprometida con el paquete Autopsy.
Suspend..........................................59
Vemos como poner un equipo en modo
hibernacin, volcando el contenido de la
memoria al swap con el paquete Software
Suspend.
SYSADMIN
Charly Khnast es un
gestor de sistemas Unix
en el centro de datos
Moers cerca del Rhin, el
famoso ro alemn. Sus
tareas incluyen la
seguridad y disponibili-
dad del cortafuegos y
ocuparse del DMZ (zona desmilita-
rizada).
E
L

A
U
T
O
R
[1] Motion:http: //www.lavrsen.dk/twiki/
bin/view/Motion/WebHome
[2] Motion.cgi: http://www.lavrsen.dk/twiki/
bin/view/Motion/MotionCGI
[3] A fish: http://www.fishbase.org/Country/
CountrySpeciesSummary.
cfm?Country=Malaysia&Genus=Betta&S
pecies=splendens
INFO
Figura 1: una pez de pelea Siams [3] nadando
felizmente en la imagen de la cmara Web de
Charly. Recogido por Motion.cgi.
O
lli y Melanie, que son dos buenas
amigas mas, tienen tres tiendas.
Una de las tiendas ha sido
robada muchas veces. Por supuesto que
hay seguros para cubrir los robos. sin
embargo ellos estaban preocupados
porque nadie haba sido capaz de detener
a los culpables. Se preguntaban si un sis-
tema de vigilancia poda ayudar.
Por supuesto que los sistemas de vigi-
lancia llave en mano son caros, por lo
que me han preguntado si un viejo PC y
una cmara Web pueden ser una alterna-
tiva. Actualmente yo tengo una cmara
Web, pero slo la he usado para grabar el
acuario que tengo en mi saln. No tengo
ninguna experiencia con aplicaciones de
vigilancia. Pero menos mal que existen
los motores de bsqueda, verdad? Tras
una breve investigacin encontr rpida-
mente una aplicacin muy til llamada
Motion [1].
Motion es fcil de instalar. En mi
mquina de ensayos Debian, elegida sim-
plemente porque tena una cmara Web
instalada, solo fue necesario escribir
apt-get install motion
Los usuarios con otras distribuciones
pueden usar RPM o archivos tar. Motion
accede a dispositivos V4l o V4L2, en este
caso mi cmara Web, comparando la
imagen actual con la imagen previa. El
programa almacena la imagen actual si
S
leuthkit busca en los sistemas de
ficheros de Microsoft y Unix
ficheros borrados y reconstruye los
hechos para localizar una intrusin.
Autopsy Forensic Browser [1] no es slo
fcil de usar, sino que tambin propor-
ciona funciones avanzadas: este interfaz
basado en web de Sleuthkit facilita y doc-
umenta el proceso de anlisis forense.
Nuevos Casos
Basaremos nuestros ejemplos en el sis-
tema de ficheros Forensic Challenge [3].
El tarball contiene la particin individual
como aparece descrita en la Tabla 1.
Antes de empezar la investigacin con
Autopsy y Sleuthkit, los investigadores
forenses tienen que abrir un nuevo caso.
Para hacerlo, simplemente hay que hacer
clic en el botn New
Case al pie de
la pgina
de bien-
veni-
da de Autopsy. Hacindolo, se abre la
pgina de entrada para el nuevo caso
(vase la Figura 2).
Una vez que se hayan rellenado todos
los campos y pulsado New Case, Autopsy
crear el directorio del caso
(/var/morgue/forensi c_chal l enge/)
y el fichero de configuracin
(/var/morgue/forensic_challenge/case.au
t), adems de aadir al investigador. La
herramienta muestra los resultados en
otra pgina Web y le pide que lo con-
firme pulsando OK.
En la siguiente ventana (Case Gallery,
Figura 3), Autopsy presenta una lista de
casos seleccionables; incluso se puede
acceder a esta pgina desde la pgina de
bienvenida pulsando el enlace Open
Case. El caso forensic_challenge est
seleccionado por defecto; despus de
hacer clic en OK para confirmar la
seleccin, es el momento de aadir las
mquinas que se desean investigar en
este caso.
Bajo la lupa
Para aadir un nuevo host hay que
especificar el nombre de la mquina y
opcionalmente se puede aadir una
descripcin, adicionalmente se puede
indicar el huso horario y la
desviacin del reloj del ordenador
con respecto al tiempo real, si fuera
necesario. Tambin se puede
especificar, si se tiene, una base de
datos hash de ficheros benignos o
malignos. A continuacin hay que
pulsar Add Host y Autopsy
mostrar de nuevo una pgina de
confirmacin. Plsese OK para
aceptar.
A continuacin se muestra la Host
Gallery, permitiendo seleccionar los
hosts que van a ser procesados; otra vez
hacemos click en OK para confirmar
antes de continuar aadiendo las im-
genes de disco. Para ello, hay que selec-
cionar Add Image y teclear el nombre del
fichero (vase la Figura 4).
Este formulario se utiliza tambin para
especificar si Autopsy debe aadir un
enlace simblico para el fichero original
en el directorio morgue o si la imagen
debe ser copiada o movida. Tambin hay
que especificar el punto de montaje
original, el tipo de sistema de ficheros y
las opciones MD5. Autopsy calcula la
suma de verificacin MD5 en cada caso;
si ya conoce cual debera ser dicho valor,
se puede introducir aqu, para que
Autopsy lo verifique con el valor de real.
Registro del 7 de Noviembre
de 2000
Ahora se puede continuar con la investi-
gacin de la escala temporal de las modifi-
caciones del sistema de ficheros seleccio-
nando el elemento del men File Activity
Time Lines. Hacindolo se cambia la
apariencia de la aplicacin Web, dividien-
do la ventana en dos marcos. El marco
55 www.linuxmagazine.com.es Nmero 03
ADMI NISTRACIN Autopsy / Sleuthkit
Para determinar si un sistema est expuesto, el administrador tiene que buscar
seales reveladoras y pruebas seguras, el administrador se convierte en un
cientfico forense. Sleuthkit y Autopsy pueden ayudar con esta complicada
tarea haciendo uso de una prctica interfaz Web para buscar archivos borrados
y descubrir la pista de los intrusos. POR RALF SPENNEBERG
Autopsy y Sleuthkit, Kit de Herramientas para el Forense Digital
Tras la Pista del Zorro
Partition Filesystem
/dev/hda8 /
/dev/hda1 /boot
/dev/hda6 /home
/dev/hda5 /usr
/dev/hda7 /var
/dev/hda9 swap
Tabla 1: Particiones de
Challenge
Autopsy no slo realiza anlisis, sino que
tambin ayuda al investigador a realizar las
tareas de papeleo que el anlisis
forense conlleva, organizando las tareas
en casos y asignndole un directorio a
cada uno. Es una buena idea crear un
directorio padre para los directorios de
los casos antes de empezar con el pro-
ceso de instalacin: /var/morgue es un
buen nombre para el almacn de prue-
bas.
La instalacin de Autopsy es algo
extraa. Despus de ejecutar make, hay
que contestar una o dos preguntas. El
script de instalacin comprueba si una
versin de Sleuthkit est instalada
antes de crear los ficheros de insta-
lacin.
Cuando se lanza la herramienta, te-
cleando ./autopsy en el directorio
fuente, el Autopsy Forensic Browser se activa
mostrando su nmero de versin, una URL y
un mensaje indicando que se debe dejar este
proceso ejecutndose durante la fase de
anlisis y que hay que pararlo cuando
termine dicha fase pulsando [Crtl]+[C].
A continuacin, con cualquier navega-
dor Web, se puede acceder a Autopsy.
Tan slo hay que introducir la URL
mostrada anteriormente en el cuadro
de texto de la barra de direcciones del
navegador Web. Tambin se pueden
usar opciones de la lnea de comandos
para indicarle a Autopsy que se ejecute
en otro puerto y direccin IP: ./autopsy
<nmero de puerto> <direccin IP>.
Si se prefiere usar los paquetes RPM
del autor [2] para instalar Autopsy, en
vez de usar los fuentes, se dar cuenta
que autopsy se incluye en el path por
defecto. Este paquete usa /var/morgue
como almacn de pruebas.
A continuacin
Autopsy crea la
lnea temporal
basada en el
fichero body. El
elemento del
men Create Timeline indica con pru-
dencia que se restrinja la ventana de
tiempo que se va a investigar.
La descripcin de Forensic Challenges
indica que el 7 de Noviembre del 2000 es la
fecha ms probable de la intrusin. Para
este ejemplo, el investigador querr
restringir la ventana del tiempo para deta-
llar de forma ms precisa las investiga-
ciones en el perodo entre el 7 y el 9 de
Noviembre de 2000. Para permitir a
Autopsy reemplazar el UID y el GID con los
nombres correspondientes cuando se cree
la lnea temporal, hay que establecer la
imagen del sistema de ficheros que con-
tenga los ficheros /etc/passwd y /etc/group.
La lnea temporal muestra que el
fichero /etc/hosts.deny ha sido modifica-
do, reduciendo su tamao a 0 bytes.
Unos pocos minutos despus, un fichero
tarball fue instalado en el directorio
/usr/man/.Ci/ (vase la Figura 6). Este
es el directorio en el que el investigador
forense querr concentrarse despus.
Unos pocos segundos antes de que esta
instalacin tuviera lugar, el inodo 8 133
en hda8 fue borrado. El tamao del
fichero era de 2.129.920 bytes, y
perteneca a un usuario llamado drosen.
Un fichero en el rootkit fue borrado
despus, el fichero en el inodo 109.801
con un tamao de 1.153 bytes.
La lnea temporal tambin muestra los
accesos de lectura a las bibliotecas de
superior muestra los pasos tpicos como
los elementos del men y el marco inferior
se usa para las entradas y las salidas.
La Figura 5 muestra como crear el lla-
mado fichero de body usando el ele-
mento del men Create Data File. Este
proceso puede tardar un poco, ya que
Autopsy tiene que invocar los coman-
dos fls e ils de Sleuthkit. Despus de
completarse estos pasos, Autopsy
automticamente calcula las sumas de
comprobacin MD5 que se utilizan
para comprobar la integridad de los
ficheros.
56 Nmero 03 www.linuxmagazine.com.es
Autopsy / Sleuthkit ADMI NISTRACIN
Figura 2: Hay que especificar el nombre del nuevo caso (forensic_challenge en
nuestro ejemplo) y aadirle un login para el investigador responsable para
este caso (ralf).
Figura 3: Autopsy organiza las investigaciones forenses en casos. Esto per-
mite cambiar de caso sin tener que reiniciar la GUI.
Instalacin y ejecucin de Autopsy
Figura 1: Tecleando make se compila e instala Autopsy, pero hay
que estar preparado para contestar algunas preguntas. Tiene
sentido crear el directorio morgue antes de empezar la insta-
lacin.
funciones. Este hecho indica que el
intruso compil una o varias aplica-
ciones.
Ningn Punto para Encubrir
Pistas
Despus de completar la instalacin el
intruso borr una enorme cantidad de
ficheros. Parece que estos ficheros
fueron creados como parte del proceso
de compilacin. Tras borrar los ficheros
superfluos, el intruso
parece que instal una
distribucin SSH (vase
el Listado 1).
La lnea temporal tam-
bin indica que el intruso
us scripts de instalacin
para tomar el control e
instalar software. Dicha
lnea contiene un nmero
de entradas que indican
el borrado de ficheros
que nos hace man-
t ener esta hiptesis:
install-sshd1 y parecidos
(vase el Listado 2).
Los ficheros mostra-
dos aqu no son las ni-
cas entradas sospe-
chosas de la lnea tem-
poral. A lo largo
del curso del
ataque, parece
que el intruso
dej una copia
del cliente Bitch X IRC y eggdrop en
el disco.
Ahora la tarea del administrador-
detective consiste en descubrir la natu-
raleza y el propsito de los ficheros
instalados. Los scripts de instalacin son
siempre un buen punto de partida. El
intruso los ha borrado, pero Autopsy no
tiene ningn problema en recuperarlos.
Para recuperarlos, primero hay que
cerrar la lnea temporal (arriba a la
derecha Close) y seleccionar la particin
/usr. Tras confirmar pulsando OK se
muestra una nueva vista, donde hay que
seleccionar File Analysis. Este es el sitio
donde se pueden mostrar los ficheros
individuales, como el llamado
/usr/man/.Ci/install (vase la Figura 7).
Procesos Ocultos
Afortunadamente, Autopsy tambin
permite el visionado de otros tipos
de ficheros. Por ejemplo,
/usr/man/.Ci/addps contiene un script
que obviamente ha sido usado para ocul-
tar procesos que normalmente se mues-
tran con los comandos ps o top para de
57 www.linuxmagazine.com.es Nmero 03
ADMI NISTRACIN Autopsy / Sleuthkit
Figura 4: Antes de investigar una imagen del sistema de ficheros, el investi-
gador ha de aadir la imagen al caso, especificando la suma de control MD5
para asegurarse que la imagen no est daada.
Figura 5: Autopsy crea un fichero bodypara almacenar la lnea temporal
para las operaciones sobre el sistema de ficheros de la imagen. El bodyse
puede aplicar tanto a los ficheros borrados como a los existentes.
01 537 m.c -/-rw------- root root 26570 /etc/ssh_host_key
02 880 .a. -/-rw-r--r-- root root 26579 /etc/ssh_config
03 512 m.c -/-rw------- root root 2048 /root/.ssh/random_seed
04 341 mac -/-rw-r--r-- root root 26578 /etc/ssh_host_key.pub
05 ...
06 604938 mac -/-rws--x--x root root 109999 /usr/local/bin/ssh1
Listado 1: Instalacin de SSH
01 1153 ..c -/-rwxr-xr-x 1010 users 109801 /usr/man/.Ci/install-sshd1 (deleted)
02 1076 ..c -/-rwxr-xr-x 1010 users 109802 /usr/man/.Ci/install-sshd (deleted)
03 80 .a. -/-rwxr-xr-x 1010 users 109803 /usr/man/.Ci/install-named (deleted)
04 71 ..c -/-rwxr-xr-x 1010 users 109867 /usr/man/.Ci/install-wu (deleted)
05 106 ..c -/-rwxr-xr-x 1010 users 109864 /usr/man/.Ci/install-statd (deleted)
06 ...
Listado 2: Scripts de Instalacin
tarios. Un investigador tiene que ser
extremadamente disciplinado para con-
seguir esta funcionalidad solamente
haciendo uso de la lnea de comandos.
Los desarrolladores de Autopsy estn
actualmente trabajando en rutinas de
bsqueda indexadas para la caracters-
tica de bsqueda de palabras claves.
Tan slo hay que crear una vez un
archivo ndice, para acelerar cualquier
bsqueda. Una bsqueda que tarda 168
segundos actualmente, tardara tan slo
2 segundos con el uso de la nueva tc-
nica.
Conclusin
La combinacin de Sleuthkit con
Autopsy Forensic Browser proporciona
un conjunto de herramientas bastante
potentes para la realizacin de anlisis
forenses. Sus caractersticas y servicios
son comparables con las herramientas
comerciales. El hecho de que sea de
cdigo abierto permite a los investi-
gadores seguir el rastro de los progresos
de la herramienta en detalle. I
este modo evitar ser detectados. El ata-
cante parece que ha reemplazado los
comandos estndar del rootkit por vari-
antes. El contenido del fichero es el si-
guiente:
#!/bin/sh
HIDE=$1
echo "hiding $HIDE from ps/top"
/bin/echo "2 $HIDE" >>/dev/ptyp
Los comandos ps y top modificados leen
/dev/ptyp con el objetivo de ocultar estos
procesos. El fichero contiene las si-
guientes entradas:
2 slice2
2 snif
2 pscan
2 imp
3 qd
...
El anlisis del comando ps con strings o
con la interfaz Autopsy, muestra que este
comando contiene la cadena /dev/ptyp.
Esto demuestra nuestra hiptesis previa,
ya que la versin original del comando
ps no lee este archivo.
Troyanos
El servidor SSH instalado por el ata-
cante es otro fichero interesante.
/usr/local/sbin/sshd contiene una refe-
rencia a /usr/tmp/nap. La referencia es
fcil de localizar. Tan slo hay que mirar
al carcter separador /. /usr/tmp es un
enlace simblico a /var/tmp. El fichero
/var/tmp/nap contiene la siguiente infor-
macin:
username: root password: U
tw1Lightz0ne hostname: U
c871553-b.jffsn1.mo.home.com
En otras palabras, el servidor SSH insta-
lado por el intruso almacena cualquier
contrasea que recibe en formato texto.
Funciones Avanzadas
Autopsy proporciona un nmero adi-
cional de funciones, tales como
bsquedas de palabras claves, clasifi-
cacin de ficheros por tipo y acceso
directo al contenido de los ficheros. Una
de las mayores ventajas de usar Autopsy
es la posibilidad de calcular las sumas de
control MD5 al vuelo y de aadir comen-
58 Nmero 03 www.linuxmagazine.com.es
Autopsy / Sleuthkit ADMI NISTRACIN
[1] Autopsy Forensic Browser: http://autopsy.
sf.net
[2] Paquetes RPM Autopsy y Sleuthkit: http://
www.spenneberg.org/Forensics/
[3] Ficheros del Desafo Forense: http://
project.honeynet.org/challenge/images.
html
RECURSOS
Figura 7: El mdulo de anlisis de ficheros de Autopsy permite mostrar cualquier fichero del sistema de
ficheros, incluso los borrados (resaltados en rojo). El panel inferior de la derecha muestra el contenido
del fichero borrado install-named
Figura 6: Reconstruccin de Autopsy de un rootkit. Las columnas contienen las fechas y horas, tamaos,
acciones (a para access, mpara modify), privilegios, UID, GID, nmero de inodos y nombres de los
ficheros en cuestin.
L
a teora sobre Software Suspend es
sencilla: Linux escribe el contenido
de la memoria y otros buffers, como
la memoria grfica, a la particin de
swap y luego apaga la mquina. La pr-
xima vez que se encienda el ordenador,
Linux comprueba la particin de swap,
detecta que el sistema operativo fue apa-
gado, pero de forma diferente a como se
apaga normalmente, que se detuvo por
Software Suspend y restaura la memoria
desde los archivos existentes. Esta forma
de actuar ignora la BIOS y su sistema de
control de energa, as que no hay por
qu preocuparse por los errores de la
BIOS. Esto es una buena noticia para los
usuarios cuyos ordenadores no soportan
la suspensin interna APM o ACPI.
En un mundo perfecto, Software
Suspend funcionara perfectamente no
sera maravilloso que la vida fuera as de
simple? El gran obstculo para el sistema
operativo es la captura de los datos de la
memoria. Para hacerlo, Linux tiene que
lanzar un nuevo proceso que cambia el
contenido actual de la memoria. En otras
palabras, el sistema tiene que estar en un
estado tan estable como sea posible
antes de ponerlo a dormir. Y hay algunos
drivers que se niegan a cooperar (por
ejemplo, los adaptadores grficos de
NVidia y ATI).
Tres sistemas diferentes
En el momento de escribir este artculo,
hay disponible tres soluciones diferentes
de Software Suspend. Todas ellas origi-
nadas por el mismo proyecto y basadas
las tres en el mismo principio.
Software Suspend (Swsusp), la origi-
nal, est implementada en el kernel 2.6,
que elimina la necesidad de instalarlo.
Como inconveniente, necesita de una
BIOS ACPI compatible.
El proyecto PMDisk fue una de las
ramas en las que se dividi swsusp para
aadirle unas pocas mejoras. PMDisk
est tambin en el kernel 2.6. La ventaja
que PMDisk ofrece es que no necesita
ACPI. El equipo del kernel mezcl los
avances realizados por los dos proyectos
bajo el nombre original Swsusp [1].
Software Suspend 2 (Swsusp2) [2] es
otra mejora a la versin Swsusp. Como
PMDisk, no necesita una BIOS con el sis-
tema de control de energa y tiene algu-
nas caractersticas extra. Por ejemplo,
ahorra espacio comprimiendo el archivo
de memoria. En vez de usar la particin
de swap, puede usar un archivo de swap
en la particin de datos. Adems,
Swsusp2 funciona con sistemas multi-
procesadores. El reverso de la moneda es
que Swsusp2 no est incluido en el ker-
nel y por lo tanto hay que parchearlo y
recompilarlo manualmente.
La pregunta es: Cul de estos tres sis-
temas de Software Suspend es la eleccin
correcta para usted? Las integradas en el
kernel son sin duda las opciones ms sen-
cillas, ya que eliminan las tareas de par-
chear y recompilar. Sin embargo, como
ninguno de los tres sistemas est real-
mente maduro, podra darse el caso que el
que ms le guste de los tres no soporte su
hardware; as que el proceso entero impli-
ca seguir el proceso de la prueba y error.
Los tres sistemas de Software Suspend
suponen que su particin de swap es lo
bastante grande. Dos veces la cantidad
de memoria RAM proporcionar un mar-
gen suficiente de seguridad.
Afortunadamente, el ordenador no se
colgar si se queda sin espacio, sino que
simplemente debera salir del proceso de
suspensin.
Sofware Suspend, el original
El kernel 2.6 incluye swsusp por defecto,
pero no todas las distribuciones tienen
habilitada la opcin en el kernel que sumi-
nistran. Suse y Mandrake habilitan
swsusp, mientras que los usuarios de
Debian y Fedora tendrn que empezar a
preparar sus compiladores. Hay que habi-
litar la opcin CONFIG_SOFTWARE_SUS-
PEND bajo Power management options
(ACPI, APM) y recompilar el kernel.
Ntese que swsusp necesita ACPI.
Tambin es necesario aadir un
parmetro al cargador del sistema.
Suponiendo que se tenga instalado grub,
que es el cargador estndar actual para
Suse y la mayora de las distribuciones,
se necesita editar el archivo
/boot/grub/menu.lst. Localizar la lnea
del kernel que est utilizando y aadir
resume=/dev/hdaX sustituyendo
/dev/hdaX por la particin de swap, por
ejemplo /dev/hda6. Puede teclear fdisk -l
/dev/hda | grep swap para identificar la
particin swap de su sistema.
Para no cometer errores y curarse en
salud, copie la entrada completa y cree
una entrada nueva en la lista del men
de arranque. Asgnele un nombre dife-
rente a esta entrada, por ejemplo,
ponindole noresume en la lnea ttulo.
Ahora borre el parmetro resume en la
lnea kernel de la nueva entrada y aada
pmdisk=off noresume noresume2. Esta
entrada le permitir reiniciar la mquina
si falla el arranque tras haber entrado en
59 www.linuxmagazine.com.es Nmero 03
ADMI NISTRACIN Software Suspend
Casi todas las placas bases tienen la caracterstica de control de energa, dise-
ada para apagar el ordenador y ponerlo en modo suspendido. En la vida real,
esta caracterstica no siempre funciona. Linux tiene varias alternativas para
tratar de solucionar el problema.
POR SIMON RUTISHAUSER
Trabajando con Software Suspend
Sueo Profundo
usuarios de Debian tendrn que usar init
2; hay que parar manualmente el servi-
cio de login grfico tecleando
/etc/init.d/kdm stop, suponiendo que se
est usando KDM.
Si este test tambin funciona, teclee init
5 y repita el proceso con el GUI; los usua-
rios de Debian pueden lanzar el servicio
de login tecleando /etc/init.d/kdm start.
Si est usando el GUI sin aplicaciones
que consuman mucha memoria, el orde-
nador debera tardar entre 10 o 20 segun-
dos en suspenderse y entre 30 y 40
segundos en volver a activarse. Estos
tiempos pueden variar dependiendo de
la velocidad del ordenador y de cuanta
memoria est usando en el momento de
entrar en el modo de suspensin.
PMDisk
Como swsusp, PMDisk fue presentado
en la versin 2.6 del kernel. La diferencia
ms importante entre el proyecto
PMDisk y swsusp es que PMDisk no
necesita ACPI, lo que es una buena noti-
cia para los ordenadores que usen APM.
PMDisk tabin funciona a veces en
mquinas que tienen ACPI pero no
entran en modo de suspensin usando
swsusp.
Como PMDisk es un pariente cercano
de swsusp, apenas hay diferencias en la
forma de usar los programas. La mayora
de las distribuciones del kernel tienen la
opcin requerida activada por defecto.
En Debian, hay que habilitar
CONFIG_PM_DISK y recompilar el ker-
nel.
Luego, hay que editar el archivo del
gestor de arranque, /boot/grub/menu.lst,
igual que se hizo para swsusp, pero
usando pmdisk=/dev/hdaX en vez de la
opcin resume:
title SuSE Linux
kernel (hd0,1)/boot/U
vmlinuz root=U
/dev/hda2 vga=U
791 pmdisk=U
/dev/hda6
initrd (hd0,1) U
/boot/initrd
Aadsele por seguridad pmdisk=off tal
y como se describi en la seccin de
swsusp.
Ahora se puede teclear sync && echo
-n "disk2 > /sys/power/state para habili-
tar PMDisk. El comando sync se incluye
por razones de seguridad; almacena los
datos en un archivo temporal del sis-
tema, por si el ordenador se cuelga cuan-
do se habilite PMDisk.
Software Suspend 2
Software Suspend 2 [2] est tambin
basado en el Software Suspend original,
aunque tiene nuevas caractersticas. En
vez de escribir en la particin de la
swap, Software Suspend 2 puede alma-
cenar los datos de memoria en el sistema
de ficheros; comprime los datos antes de
almacenarlos y soporta sistemas con
mltiples CPU y con ms de 1 Gigabyte
de RAM. Swsusp2 puede manejar inclu-
so particiones swap encriptadas.
Software Suspend 2 incluye algunas
caractersticas avanzadas bajo el ala. Por
ejemplo, swsusp2 usa los llamados
freezers, que soportan una ejecucin
mejorada del proceso de hibernacin.
Adems, el programa elimina los datos
superfluos de la memoria cach para
ahorrar espacio en la particin swap.
Desafortunadamente, Software
Suspend 2 no ha sido incluido en el ker-
nel oficial 2.6. Para usar swsusp2, se
necesita aplicar un parche al cdigo
fuente del kernel y recompilarlo.
Parcheando el kernel
Los parches del kernel para Software
Suspend 2 estn disponibles en el sitio
web [2]. All se encontrarn las ltimas
versiones, adems de las antiguas.
Las distribuciones que usan kernels
modificados pueden presentar algunos
problemas, ya que las distribuciones
especficas a menudo entran en conflicto
con el parche swsusp2, as que ser
mejor que se pruebe en un kernel sin
alterar. La siguiente descripcin se basa
en la versin 2.6.8.1 del kernel.
Conectados como root, hay que entrar
en el directorio /usr/src y descomprimir
el kernel tecleando tar xjf
linux-2.6.8.1.tar.bz2. Luego hay que
introducir tar xjf sotware-sus-
pend-2.0.0.105.tar.bz2 para descompri-
mir el parche swsusp2.
Ahora es el momento de aplicarle el
parche al kernel. Para ello, hay que
entrar en el directorio
/usr/src/linux-2.6.8.1/ y teclear ../soft-
ware-suspend-2.0.0.105-for-2.6.8.1/apply
. El script da la opcin de aadir algunos
modo suspendido. Despus de completar
los cambios, el contenido de
/boot/grub/men.lst debe ser como el
mostrado en el Listado 1.
La primera entrada es la que necesita-
mos cuando rearrancamos (esta es la
entrada del Linux SuSE de nuestro labo-
ratorio). La entrada arranca el ordenador
de forma normal y lo reanuda despus
de haber sido suspendido. La segunda
entrada, SuSE Linux noresume, es nues-
tro salvavidas en caso de que algo vaya
mal. Swsusp no necesita en realidad las
opciones pmdisk=off y noresume2;
hacen lo mismo que noresume para los
otros dos sistemas de Software Suspend.
En Suse, el programa powersave mane-
jar el ahorro de energa por defecto, y
no swsusp. Para cambiarlo, hay que
localizar el archivo /etc/powersave.conf y
cambiar la entrada POWERSAVED_DIS-
ABLE_USER_SUSPEND de yes a no.
Slo en el caso de que las cosas vayan
mal, tiene sentido entrar en el modo
monousuario; as que habr que intro-
ducir init 1. Ahora tan slo hay que
teclear la clave del root para poner la
mquina en modo suspendido. En Suse
hay que teclear /etc/init.d/powersaved
start para lanzar el servicio powersave y
luego escribir powersave --suspend. En
otras distribuciones slo con teclear el
comando: sync && echo 4 >
/proc/acpi/sleep es suficiente.
Si esta prueba funciona, habr que
probar los runlevels, empezando con el
modo multiusuario sin GUI (init 3). Los
60 Nmero 03 www.linuxmagazine.com.es
Software Suspend ADMI NISTRACIN
01 title SuSE Linux
02 kernel (hd0,1)/boot/
03 vmlinuz root=/dev/hda2
vga=791
04 resume=/dev/hda6
05 initrd
06 (hd0,1)/boot/initrd
07
08 title SuSE Linux
09 noresume
10 kernel
11 (hd0,1)/boot/vmlinuz
12 root=/dev/hda2 vga=791
13 pmdisk=off noresume
noresume2
14 initrd
15 (hd0,1)/boot/initrd
Listado 1: Grub Menu List
extras. La mayora de estos extras son
innecesarios, por lo que tpicamente se
acepta la configuracin por defecto pre-
sionando [Enter]. Si todo ha ido bien la
salida mostrada debera ser similar a la
que aparece en el listado 2.
El siguiente paso es configurar el
nuevo kernel. Para usar las opciones
actuales, hay que copiar el fichero de
configuracin del kernel actual al direc-
torio del nuevo kernel escribiendo cp
/boot/config-X
/usr/src/linux-2.6.8.1/.config. Hay que
asegurarse de reemplazar la X por el
nombre de la versin actual del kernel.
Despus hay que continuar modifican-
do la configuracin de manera que se
ajuste a sus necesidades. Si se tienen
instalados los paquetes ncurses-devel o
ncurses-dev, tecleando make menuconfig
se mostrar un sistema de configuracin
basados en men en modo texto. Hay
que usar las flechas del teclado y la tecla
[Enter] para navegar por los elementos.
Se selecciona la entrada de men Power
management options (ACPI, APM) y se
desabilita Software Suspend (EXPERI-
MENTAL) y las entradas Suspend-to-
Disk Support presionando la tecla [n];
estas entradas son para el otro sistema de
suspensin software.
Bajo estas entradas, debera verse el
men Software Suspend 2. Hay que pre-
sionar [y] en las entradas Software
Suspend 2, Swap Writer, LZF image com-
presion, Text mode console support y
Compile in debugging output para habili-
tarlas. La ltima de estas opciones pro-
porciona mensajes de depuracin ms
detallados (Cuadro 1) y puede ser til en
situaciones en las que se presenten pro-
blemas. Suponiendo que no se desee
modificar nada ms, hay que presionar
tres veces [Alt+e] para salir del configu-
rador del kernel.
Para recompilar el kernel recin con-
figurado hay que introducir make
bzImage && make modules modules
_install. Dependiendo de la velocidad
del microprocesador y la configuracin,
esto puede tardar unas cuantas horas.
Cuando haya concluido, hay que copiar
el nuevo kernel al directorio de arranque
/boot/: cp arch/i386/boot/bzImage
/boot/vmlinuz-suspend2.
A continuacin teclee mkinitrd para
crear un disco ram inicial para el nuevo
kernel; es decir, a menos que haya
recompilado todos los drivers que se
necesitan para leer el sistema de ficheros
raz en el nuevo kernel.
Se necesita introducir una nueva entra-
da en el gestor de arranque para que
arranque el nuevo kernel; si se est usan-
do grub, adase las siguientes lneas a
/boot/grub/menu.lst, asegurndose que
se modifica la particin de modo que
refleje la configuracin de su sistema:
title SuSE Linux - U
SoftwareSuspendU
2.0.0.105
kernel (hd0,1)/boot/ U
vmlinuz- U
suspend2 root= U
/dev/hda2
vga=791 U
resume2=swap: U
/dev/hda6
initrd (hd0,1)/boot/ U
initrd-suspend2
Nuestro ejemplo usa la particin
/dev/hda2 como el sistema de ficheros
raz. En la jerga de grub, est particin se
referencia como hd0,1, donde hd0 es el
primer disco duro, es decir, hda, y el 1
que le sigue a la coma se refiere a la
segunda particin, es decir, hda2. La par-
ticin swap est ubicada en /dev/hda6.
Se est usando la convencin de Suse
para los nombres de las entradas del
men, aunque se puede escribir lo que
se quiera en la lnea del ttulo (title). Si
se sigue el ejemplo, se debera tener una
entrada denominada Suse Linux -
Software Suspend 2.0.0.105 en el men
de arranque cuando se inicie el nuevo
kernel.
Configuracin del Script
Hibernate
El sitio web de Software Suspend [2]
tambin proporciona el paquete
Hibernate. Hibernate contiene los
ficheros de configuracin y el script
hibernate, que inicia el modo de suspen-
sin. Entrando como root, teclese rpm
-Uvh hibernate-0.98-1.i386.rpm para
instalarlo; en Debian hay que teclear
dpkg -i hibernate-0.98-1_all.deb.
Se necesita echar un vistazo al script
de configuracin de Hibernate en
/etc/hibernate/hibernate.conf para ase-
gurarse que Software Suspend 2 fun-
cionar tal y como se espera que fun-
cione. En la mayora de los casos se
puede dejar la configuracin por defecto.
Pero podra ser necesario aadir las si-
guientes lneas:
RestartServices hotplug
StopServices alsasound
StartServices aumix
LeaveXBeforeSuspend yes
La lnea RestartServices hotplug le dice al
script que pare el servicio hotplug antes
de suspenderse y que lo reinicie despus
de que se despierte; esto asegura que los
61 www.linuxmagazine.com.es Nmero 03
ADMI NISTRACIN Software Suspend
Figura 2: Configuracin del kernel para Software
Suspend 2.
01 /usr/src/linux-2.6.8.1 #
../software-suspend-2.0.0.105-
for-2.6.8.1/apply
02 Apply KDB patches (for serious
debugging capabilities) [yN]?
03 Apply Bootsplash patches
(includes bootsplash.org
patch) [yN]?
04 Apply Win4Lin support patches
[yN]?
05 Applying
20-software-suspend-linux-2.6.
8.1-rev1-whole ...
06 Applying
21-software-suspend-linux-2.6.
8.1-rev2-incremental ...
07 Applying
21-software-suspend-linux-2.6.
8.1-rev3-incremental ...
08 Applying
30-software-suspend-core-2.0.0
.104-whole ...
09 Applying
31-software-suspend-core-2.0.0
.105-incremental ...
10 All happy!
Listado 2: Salida del script
Software Suspend 2
bar que funciona, hay que seguir los pasos
indicados anteriormente para lanzar hiber-
nate en modo multiusuario sin la GUI y
finalmente con la GUI.
Habilitando Hibernate para
los usuarios sin privilegios
Se necesitan los privilegios de root
para pasar a modo suspendido,
aunque los usuarios sin estos privile-
gios podran beneficiarse tambin de
esta caracterstica. Para permitir que
los usuarios sin privilegios puedan
usar las capacidades de suspensin,
hay que instalar primero el paquete
sudo, si lo necesita (la mayora de las
distribuciones incluyen sudo por
defecto). Como root, modifquese el
fichero de configuracin /etc/sudoers
como sigue:
User_Alias USERS = U
simon, whoever
Cmnd_Alias HIBERNATE = U
/usr/sbin/hibernate
USERS ALL=NOPASSWD: U
HIBERNATE
Este cambio permite a los usuarios
simon y whoever lanzar
/usr/sbin/hibernate invocando sudo
/usr/sbin/hibernate sin tener que intro-
ducir la contrasea. I
dispositivos tales como ratones USB y
teclados funcionarn bien una vez des-
pertados. Las siguientes dos lneas
detienen el sistema de sonido antes de
suspenderse y restaura el nivel de volu-
men despus de despertarse. Por ltimo,
LeaveXBeforeSuspend le indica al sis-
tema que se pase a una consola en modo
texto antes de suspenderse y que entre
de nuevo en la GUI despus de desper-
tarse. Sin estas opciones, se experimen-
tarn una serie de anomalas en el sis-
tema de ventanas y el teclado.
Una vez realizados estos pasos, es el
momento de lanzar el test. Hay que teclear
init 1 para entrar en el modo monousuario.
Entonces introduciendo hibernate se pasa
a modo suspendido. Si todo ha salido bien,
el sistema volver al mismo estado una
vez que se haya despertado. Tras compro-
62 Nmero 03 www.linuxmagazine.com.es
Software Suspend ADMI NISTRACIN
Diversas razones pueden impedir que
Software Suspend funcione y la mayora de
ellas no son especficas del sistema.
Si el proceso suspend se sale sin terminar o la
mquina se cuelga, teclee free para compro-
bar si se tiene espacio suficiente en la parti-
cin de swap; ser necesario reiniciar para
realizarlo. Si el espacio en swap no es el pro-
blema, habr que comprobar los parmetros
de arranque para ver si se entra en la parti-
cin correcta cuando se despierte.
Si la mquina falla a la hora de despertarse el
resultado puede ser una particin de swap
incorrecta, en este caso la particin no
mostrar como free. Para formatearla y acti-
varla de nuevo hay que introducir mkswap
/dev/hdaX, seguido de swapon /dev/hdaX.
Otra posible fuente potencial de errores son
los mdulos de bajo nivel del kernel. Para
comprobar si ste es el caso, teclese init 1
para entrar en modo monousuario. Luego
habr que introducir lsmode para mostrar la
lista de mdulos activos y eliminar tantos
como sea posible con el comando modprobe
-r. Los sospechosos habituales son los mdu-
los del sonido, USB y AGP.
La salida de dmesg despus de una suspen-
sin fallida a menudo indica la causa del
fallo.
Si Software Suspend 2 provoca el cuelgue
despus de mostrar la barra de progreso en
la pantalla, pulsando [Esc] normalmente
cancelar el proceso y devolver al sistema
al estado actual. En caso de que dmesg no
proporcionara la informacin necesaria
para determinar la causa del fallo, habr
que habilitar la funcin de informacin de
depuracin integrada como sigue:
thinkpad:~# cd
/proc/software_suspend
thinkpad:/proc/software_suspend#
echo 3 > default_console_level
thinkpad:/proc/software_suspend#
echo 1 > log_everything
thinkpad:/proc/software_suspend#
echo 7 > debug_sections
thinkpad:/proc/software_suspend#e
echo 1 > pause_between_steps
Luego habr que introducir el siguiente coman-
do para lanzar el proceso de suspensin:
sync && echo 1 >
/proc/software_suspend/do_suspend
Esto proporciona una pantalla repleta de
informacin, donde habr que pulsar la
tecla de espacio para confirmar cada paso.
Armado con estos mensajes individuales,
habr que navegar por la pgina web de
swsusp2 [2] y comprobar el FAQ, el Wiki, la
lista de correo y la documentacin restante
en busca de respuestas.
Si Software Suspend funciona en modo
monousuario, pero no en el runlevel nor-
mal, habr que intentar averiguar qu ser-
vicio es el causante del fallo. Para localizar
al culpable, habr que parar cualquier servi-
cio sospechoso, por ejemplo, tecleando
/etc/init.d/alsa stop si se sospecha de alsa.
Si este primer intento no funciona, siga
parando individualmente los servicios y
relance el modo suspendido hasta que se
encuentre al culpable.
Desde luego, puede darse la circunstancia de
que no se identifique el servicio que est cau-
sando el fallo; en este caso, algn mdulo del
kernel puede ser el culpable. Con lsmode lis-
tando los mdulos activos, y como root,
empiece a eliminarlos uno a uno con rmmod
<nombredelmdulo>.
Si algn elemento hardware, como la tarjeta
de sonido o algn dispositivo USB, es el cau-
sante del fallo, se puede parar dicho elemen-
to antes de entrar en el modo de suspensin.
Como root, detngase el servicio y elimnese
el mdulo correspondiente del kernel.
Despus de despertar al sistema habr que
lanzar el servicio y cargar el mdulo usando
modprobe. Si resultara imposible cargar el
mdulo una vez que se haya despertado el
sistema, se puede probar a recompilar el
mdulo dentro del kernel.
En el caso de Software Suspend 2, bajar a una
versin anterior podra ayudar, ya que el
proyecto est an en desarrollo. La versin
2.0.0.93, en particular, present cambios
importantes en comparacin con las ver-
siones anteriores. Algunos equipos porttiles
funcionan mejor despus del cambio, pero su
hardware podra funcionar mejor con ver-
siones anteriores.
Si los problemas persisten a pesar de todas
estas pruebas, puede ser que tenga mejor
suerte con algunas de las otras implementa-
ciones de Software Suspend: en caso con-
trario, pruebe a escribir en alguna de las listas
de correo.
Cuadro 1:Problemas con Software Suspend
[1] El futuro de Swsusp y PMDisk: http://
kerneltrap.org/node/view/3485
[2] Software Suspend 2: http://
softwaresuspend.berlios.de
RECURSOS
Bienvenidos a Linux User
sta es la seccin dedicada a la presentacin de software interesante y til que nos ayuda
en nuestro quehacer diario con el escritorio Linux. Aqu aprenderemos a utilizar
software estndar de una manera ms eficiente, adquiriremos valiosos
conocimientos y descubriremos apasionantes nuevas aplicaciones.
Herramientas: KHotKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
Los gestos con el ratn y los atajos con el teclado aaden velocidad y simplicidad a las
operaciones con el PC. Los gestos de ratn solan ser coto privado de los usuarios de
Opera y de Mozilla, pero KHotKeys nos los ofrece ahora para Konqueror para usuarios
de KDE 3.2 o superior.
Desktopia: KRecipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
No es necesario hacer malabarismos con libros de cocina simplemente para hacer
felices a esos amigos que hemos invitado a comer. Krecipes permite a los chefs afi-
cionados a gestionar sus recetas e incluso crear la lista de la compra. Adems nos
puede ayudar con una dieta si lo necesitamos.
Aplicaciones: KDM/GDM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
Tanto KDE como GNOME disponen de gestores de pantallas. Veremos las caractersti-
cas ofrecidas por KDM y GDM y examinaremos como configurar un gestor de pantalla
en nuestro sistema Linux.
Programacin Bsica: XUL (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76
En los primeros captulos de nuestra serie de XUL hemos estado principalmente
mirando los conceptos bsicos del lenguaje. A medida que nuestro viaje ha continu-
ado hemos explorado botones, etiquetas y gestin de geometras, comenzando el mes
pasado a conectar funcionalidad a nuestro interfaz.
Educacin: WIMS (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81
Con este artculo cerramos la serie que hemos dedicado al servidor de recursos educa-
tivos WIMS, recapitulamos su uso en una clase y hacemos lo que creemos que es un
interesante y necesario balance pedaggico de la aplicacin.
Linea de Comandos: su y sudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
Para ms seguridad, aunque tenga privilegios de root para un sistema, tiene sentido
utilizarlos solo temporalmente para prevenir daos accidentales. su y sudo le per-
miten cambiar la identidad rpidamente desde la lnea de ordenes.
Iniciacin a LaTeX (III) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87
En esta nueva entrega sobre el procesador de textos LaTeX, vemos como crear tablas y
frmulas matemticas con LaTeX, siendo esta ltima funcionalidad una de las ms
espectaculares del compilador tipogrfico y uno de los motivos por el cual es tan popu-
lar en crculos acadmicos.
64 Nmero 03 www.linuxmagazine.com.es
KTools LI NUX USER
vez nos acostumbremos a Khotkeys
aparecern nuestras propias ideas de
teclas rpidas y gestos que incremen-
tarn la efectividad de nuestro escritorio.
Gestos de Ratn
La ventana del programa est dividida en
dos paneles. El panel izquierdo tiene
unos ejemplos y un gesto de ratn de
Konqueror. El panel derecho contiene los
ajustes de acciones individuales que
estn distribuidas en una serie de pes-
taas. Por defecto KDE habilita los atajos
de KHotKeys y Konqueror entiende los
gestos del ratn.
Si los gestos de ratn no funcionan
con nuestra distribucin, debemos com-
probar la pantalla de bienvenida del cen-
tro de control de KDE para ver si real-
mente tenemos la versin 3.2 o superior.
Luego abrimos Global shortcuts (Atajos
Generales) en la parte derecha del panel
de Khotkeys y quitamos la marca de la
casilla Disable KHotKeys daemon
(Deshabilitar el demonio KhotKeys. Ver
Figura 1) si es necesario. Confirmamos
pulsando Apply (Aplicar) y luego
cambiamos a la pestaa Gestures Set-
tings. Quitamos la marca de la casilla
Disable mouse gestures globally (Desha-
bilitar los Gestos de Ratn en General) y
confirmamos pulsando Apply.
Los gestos pueden ser habilitados o
deshabilitados individualmente. Pulsan-
do en el signo de suma a la izquierda de
Konqueror Gestures (Gestos de Kon-
queror) en el panel de la izquierda revela
una lista de gestos comunes que
podemos habilitar o deshabilitar segn
deseemos. Para deshabilitar un gesto de
la lista pulsamos sobre el y marcamos la
casilla Disable en el panel de la derecha.
El panel de la derecha contiene
comentarios sobre los gestos existentes.
Un comentario describe el movimiento
asociado con el gesto. No obstante
podemos editar el comentario si no esta-
mos contentos con ellos. Guardamos
nuestros cambios pulsando Apply y con-
tinuamos probando los gestos del ratn
con Konqueror.
Creando nuestros propios
gestos
KHotKeys nos permite reemplazar gestos
existentes o aadir nuestros propios
K
DE es un sistema extremada-
mente flexible. Los mens contex-
tuales que se despliegan cuando
los usuarios presionan en el botn dere-
cho del ratn son tan aplicables como el
men K o los iconos de inicio rpido. Y
escondido en las profundidades del cen-
tro de control de KDE hay otro intere-
sante programa que permite un uso ms
flexible de KDE: KHotKeys. Con
KhotKeys, el usuario puede asignar com-
binaciones de teclado a aplicaciones.
Incluso podemos usar gestos de ratn
para controlar Konqueror (ver cuadro 1).
Para lanzar KhotKeys debemos pre-
sionar [Alt-F2] e introducir khotkeys o
abrir el centro de control y abrir la sec-
cin Regional & Accessibility (Regiones y
Accesibilidad). Cuando lanzamos
KhotKeys aparece un mensaje de adver-
tencia informando de que los cambios
realizados pueden ser peligrosos. Este
artculo nos proporciona una introduc-
cin a algunos simples pero efectivos
ajustes con la aplicacin KhotKeys.
Siempre ayuda ser precavido, pero ten-
dremos pocos temores acerca de estos
cambios incluso si somos nuevos. Una
Gestos de ratn y atajos de teclado con KHotKeys
Charada
Los gestos con el ratn y los atajos
con el teclado aaden velocidad y
simplicidad a las operaciones con el
PC. Los gestos de ratn solan ser coto
privado de los usuarios de Opera y de
Mozilla, pero KHotKeys las ofrece
ahora a Konqueror para usuarios de
KDE 3.2 o superior. Incluso podemos
lanzar programas no-KDE con
KHotKeys.
POR KALLE GERWIEN
65 www.linuxmagazine.com.es Nmero 03
LI NUX USER KTools
accin: en nuestro ejemplo de Gesture
-> Keyboard input (simple). Esto indica
a KHotKeys que debe convertir el gesto
realizado en un atajo de teclado. Por
ejemplo podemos especificar que nues-
tro gesto sea interpretado como
[Ctrl]+[U] para mostrar el cdigo fuente
en un documento HTML Tiene sentido
decir que aspecto tiene el gesto como
parte del comentario.
Ahora cambiamos a la pestaa Ges-
tures, pulsamos Edit y dibujamos el
nuevo gesto. Tras completar y este pro-
cedimiento pulsamos en la pestaa Key-
board input settings. En la caja Keyboard
input especificamos las teclas que
deseamos emular. Comprobaremos los
atajos del teclado de Konqueror. El ele-
mento View Document Source (ver docu-
mento fuente) est localizado en el
men View. Tenemos que escribir el
atajo de teclado mostrado para este ele-
mento en la caja Keyboard input. En este
caso la entrada correcta es Ctrl+U.
Acabamos la programacin del nuevo
gesto pulsando Apply. El gesto est
ahora habilitado y puede ser usado en
Konqueror. Podemos seguir el mismo
procedimiento para aadir gestos de
ratn para todas las funciones que nece-
sitemos. Debemos evitar gestos
extremadamente extravagantes, puesto
que cuanto ms difcil sea el gesto de
ejecutar ms tiempo necesitamos para
ejecutar la funcin.
Atajos de Teclado
Como sugiere su nombre, KHotKeys no
solo soporta la programacin de gestos
de ratn, si no que tambin puede usar
atajos de teclado para lanzar programas
o escribir lneas de texto en un editor.
Tiene sentido ajustar un grupo de
acciones separado para esto. Para hacer
esto seleccionamos General Settings y
luego pulsamos sobre New Group.
Escribimos un nombre para el grupo en
la pestaa General. Ahora seleccionamos
el recin creado grupo y pulsamos New
Action. Queremos que la nueva accin
use una tecla rpida para lanzar el pro-
grama Kmail.
Launch Kmail (lanzar Kmail) es un
buen nombre y muy descriptivo. Si
usamos un programa de correo dife-
rente elegiremos otro nombre distinto
acorde con el mismo. Como tipo de
accin, seleccionaremos Keyboard short-
cut -> Command/URL simple. Ahora
pulsaremos en la pestaa Keyboard
gestos. KHotKeys tiene tres gestos posi-
bles para cada accin. Seleccionamos el
gestos requerido en el panel Actions y
pulsamos en la pestaa Gestures en el
panel de la derecha. El panel nos mues-
tra tres campos para tres posibles gestos,
si bien normalmente solo el primer
campo esta completo.
Si pulsamos el botn Edit para los tres
primeros campos, KHotKeys abre una
nueva ventana. Entonces podemos
insertar un nuevo gesto. Debemos ase-
gurarnos de mantener pulsado el botn
de la izquierda al arrastrar el gesto,
puesto que el botn central est reser-
vado para ejecutar los gestos. Para ase-
gurarnos de que nuestro gesto es nico
tenemos que realizarlo dos veces. Si los
dos gestos son muy poco similares el
programa no acepta el gesto y nos
solicita repetir el procedimiento. Tras
insertar los tres gestos al nivel exigido
por KhotKey podemos pulsar OK para
almacenar los gestos. El nuevo gesto
entonces aparecer en la segunda ven-
tana con un ID nico.
Nuevas funciones
Si necesitamos programar una funcin
Konqueror pero no podemos encontrar
un ejemplo en el que basarnos, selec-
cionamos Konqueror Gestures y luego
pulsamos New Action (Nueva accin).
Esto crea una nueva entrada con ese
nombre. En el panel de la derecha
escribimos un nombre descriptivo para
la accin en Action name (Nombre de la
accin). Ahora seleccionamos el tipo de
Figura 2: Gestos de ratn comunes.
Opera Software introdujo los gestos de ratn en el buscador de Internet Opera. Opera simple-
mente buscaba una solucin que permitiera a los usuarios realizar las acciones ms comunes en
un buscador, como Atrs, Adelante o Actualizar sin tener que navegar a travs de los mens con el
ratn. El resultado fue la introduccin de gestos de ratn que no haban sido introducidos por los
desarrolladores de Mozilla y Konqueror. Debido a que Konqueror es tambin un gestor de archivos,
los gestos de ratn tambin pueden ser utilizados para navegar por directorios locales.
Los gestos de ratn son tremendamente simples y pasan a ser movimientos naturales tras un
breve periodo de tiempo de aprendizaje. Presionamos el botn central del ratn, ejecutamos el
gesto con el ratn y soltamos el botn del ratn. Por ejemplo, para volver atrs una pgina en un
buscador (Browser back), gesticulamos una lnea desde la derecha a la izquierda (ver figura 2). El
gesto es interpretado por Konqueror y el resultado es la accin deseada.
Cuadro 1: Gestos de ratn
Figura 1: KHotKeys no
interpretar los
gestos del ratn si el
demonio Disable
KhotKeys est mar-
cado.
Figura 3: Repetire-
mos el gesto de
ratn tres veces en
esta ventana.
66 Nmero 03 www.linuxmagazine.com.es
KTools LI NUX USER
short-cut. Deberemos ver un botn lla-
mado None (Ninguno). Pulsamos el
botn con nuestro ratn e introducimos
el atajo de teclado de nuestra eleccin,
por ejemplo [Ctrl]+[K]. Si nuestra elec-
cin de tecla rpida ya est siendo
usada nos lo indicar KhotKeys. Si no es
as el programa simplemente acepta y
muestra la entrada en una lista. Ahora
nos movemos a la pestaa
Command/URL Settings y escribimos el
programa que deseamos que se lance
con KhotKeys. Para Kmail escribimos
kmail. Para lanzar Kmail podamos
haber seleccionado K-Menu Entry (sim-
ple) en su lugar. Esto escribe entradas
de acceso en el men K.
Saludos Cordiales
Keyboard Shortcut -> Keyboard Input
(simple) es un tipo de accin interesante.
Nos permite simular pulsaciones de
teclas. Usaremos la frase With kind
regards, Joe Public (Saludos cordiales,
Joe Public) como ejemplo. Es una despe-
dida tpica para una carta en un proce-
sador de texto, programa de correo, lec-
tor de noticias o editor de texto.
KHotKeys nos proporciona la posibilidad
de introducir esta frase automticamente
independientemente de la aplicacin que
estemos usando.
Primero creamos una nueva entrada
en el grupo de atajos del teclado pulsan-
do en New Action. Podemos llamar a la
entrada wkr. Seleccionamos Keyboard
Shortcut -> Keyboard Input (simple)
como el tipo de accin. Escribimos
Writes "With kind
regards" plus
name como el
comentario. Ahora
cambiamos a la
pestaa Keyboard
shortcut y elegi-
mos una tecla r-
pida, por ejemplo
[Ctrl]+[Y].
Entonces nos
movemos a Key-
board input set-
tings y escribimos
todas las teclas
que necesitemos
presionar como si
furamos a
escribir la frase
completa. Debe-
mos asegurarnos de separar las pulsa-
ciones individuales de teclas con dos
puntos (:). La frase que deseamos intro-
ducir, With kind regards, Joe Public, ten-
dr la siguiente apariencia en la caja de
datos:
Shift+W:i:t:h:space:k:i:n:dU
::space:r:e:g:a:r:d:s:,:spaceU
::return:Shift+J:o:e:U
:space:Shift+P:u:b:l:i:c:
Tenemos que aadir la palabra clave
Shift+ para las maysculas. La tabla 1
muestra ms informacin respecto a
teclas de control.
Control de Mens
En este ejemplo hemos aprendido como
simular pulsaciones de teclas y como
usarlas para escribir simples bloques de
texto. Es igual de simple simular el acce-
so a mens en programas. Algunos
caractersticas de programas estn ocul-
tas en submens, lo que puede ser
molesto si las necesitamos habitual-
mente. Por ejemplo, para acceder a View
/ View mode / Multicolumn view pul-
saramos [Alt+A] / [Cursor right] /
[Cursor down] / [Cursor down] /
[Enter]. Podemos dejar que KHotKeys
simule estas teclas para acceder a la vista
multicolumna con un gesto del ratn o
utilizando un simple atajo de teclado.
Para hacer esto primero creamos otra
entrada Keyboard shortcut -> Keyboard
input (simple), le asignamos un atajo de
teclado y escribimos un nombre descrip-
tivo. Como input del teclado escribimos
alt+a:right:down:down:return. Esto nos
permite navegar por mens incluso si las
funciones no estn disponibles va sim-
ples presiones de teclas.
Ms tipos de acciones
El tipo de accin General nos permite
combinar gestos y atajos de teclado. Por
ejemplo podemos usar un gesto de ratn
para lanzar un programa o una tecla de
acceso rpido para apuntar a una tecla
de acceso rpido definida por nosotros
mismos. Para hacerlo primero creamos
una nueva entrada y pulsamos New en la
pestaa Trigger para especificar el tipo de
activacin que deseamos: un atajo, un
gesto o una ventana. Entonces especifi-
camos que queremos que ocurra en la
pestaa Actions. Podemos elegir entre
Command/URL, K-Menu Entry, DCOP
Call, Keyboard input y Activate Window.
La pestaa Conditions nos permite
especificar cuando debe ocurrir esta
accin.
Restringiendo Funciones
Si hemos aadido muchas funciones
propias puede que notemos algunos
efectos desagradables. Por ejemplo
puede que otro programa use una de
nuestras teclas rpidas para otro men
completamente distinto. En este caso
debemos habilitar la opcin Send to spe-
cific window (Enviar a una ventana
especfica) en la pestaa Keyboard input
settings. Aadimos un comentario
descriptivo y seleccionamos New | Sim-
ple Window. En el siguiente dialogo
debemos especificar la ventana del pro-
grama. Tpicamente esto simplemente
implica aadir el nombre del programa
como ttulo de la ventana (Konqueror en
nuestro ejemplo). I
Funcin Comando
Cursor Arriba up
Cursor Abajo down
Cursor Izquierda left
Cursor Derecha right
Espacio space
Maysculas shift
Alt Alt
Intro return
Punto Shift+;
Tabla 1: Teclas de control
Figura 4: Separamos cada pulsacin del teclado con dos puntos.
67 www.linuxmagazine.com.es Nmero 03
LI NUX USER Krecipes
madores para ofrecer su ayuda, estos
estarn encantados de contar con ella.
La Despensa
Krecipes almacena las recetas en una
base de datos, pudiendo elegirse actual-
mente entre MySQL [2] y SQLite [3].
PostgreSQL se aadir ms adelante,
probablemente conjuntamente con la
versin 1.0. El soporte para MySQL y
SQLite es correcto, pero qu base de
datos es mejor?
MySQL es extremadamente complejo
y tiene su propio servidor de bases de
datos, el cual debe estar ejecutndose
para arrancar Krecipes. Si ya
disponemos de un servidor de MySQL
en nuestro ordenador podemos asignar
el gestor de recetas a ste. Si no es as,
probablemente prefiramos usar
SQLite.
Para usar MySQL necesitamos insta-
lar el paquete mysql, el Qt dev(el) y
qt3-mysql de los discos de nuestra dis-
tribucin. Si el paquete qt3-mysql no
est disponible, nuestra nica opcin
es compilar Qt, que crear un plug-in
de MySQL para la librera (ver Cuadro
1). No seremos capaces de ejecutar
Krecipes con MySQL sin completar
estos pasos.
Las cosas son ms simples si optamos
por SQLite, debido a que Krecipes imple-
menta las funcionalidades requeridas
por s mismo. Descargamos el paquete
SQLite de Internet [3]. Luego descom-
primimos el paquete SQLite, cambiamos
el directorio fuente y arrancamos la ruti-
na de configuracin:
tar xvzf sqlite-2.8.12.tar.gz
cd sqlite
./configure
Si esto funciona correctamente,
podemos continuar con los pasos de
S
olo tiene un ao pero dispone de
un gran nmero de ingredientes: el
programa de gestin de recetas
Krecipes [1] convierte nuestro ordenador
Linux en una til herramienta para la
cocina. El ltimo paquete del programa
fue pre-arrancado justo antes de la Navi-
dades del 2003 en la versin 0.4.1. Los
tres desarrolladores que trabajan en el
proyecto han estado cocinando de ver-
dad desde entonces, esperando arrancar
prximamente la versin 0.5.
El mdulo kdenonbeta CVS, almace-
nado en los servidores KDE, dispone de
un snapshot descragable. Krecipes es
poco usual para ser un programa kde-
nonbeta en el sentido en que ha sido
capaz de entenderse con seis idiomas
desde la versin 0.4.1. Algunas de las
traducciones a estos idiomas no estn
completas puesto que en algunos casos
falta la ayuda en lnea, por lo que si el
lector desear contactar a los progra-
Gestin de recetas con Krecipes
La Cocina de Cada Da
No es necesario hacer malabarismos con
libros de cocina simplemente para hacer
felices a esos amigos que hemos invitado a
comer. Krecipes permite a los chefs aficiona-
dos a gestionar sus recetas e incluso crear la
lista de la compra. Adems nos puede ayudar
con una dieta si lo necesitamos.
POR FRAUKE OSTER
68 Nmero 03 www.linuxmagazine.com.es
Krecipes LI NUX USER
cd krecipes
./configure -with-qt-dir=
/directory
Para instalar escribimos los comandos
make y make install.
Si optamos por usar MySQL, nece-
sitaremos arrancar el servidor de bases
de datos. Deberamos ser capaces de
arrancar el servidor MySQL o de ajustar
el servidor de forma que se ejecute
automticamente cuando encedamos
nuestra mquina.
La primera vez que ejecutemos nues-
tra herramienta de gestin de recetas
escribiendo krecipes & en la consola o
compilacin e instalacin. Podemos
instalar el sistema SQLite introduciendo
make install. Esto requiere privilegios
de administrador:
make
su -c "make install"
Gestor de Recetas
Tras configurar la base de datos, los
usuarios menos aventureros pueden
descargar el cdigo fuente del Krecipes
de la pgina Web del proyecto. Cualquier
otra persona puede arriesgarse a acudir a
la versin de desarrollo KDE a travs de
CVS.
Sin importar la versin de Krecipes
elegida, debemos asegurarnos de que el
paquete dev(el) kdelibs est instalado en
nuestro sistema. Si no es as, debemos
instalar el paquete apropiado
(kdelibs3-devel-version.rpm o similar) de
nuestro distribucin. sta es la nica
forma de construir programas KDE a par-
tir de sus fuentes.
Si estamos usando las fuentes de
Krecipes debemos primero descomprimir
el archivo tar:
tar xvjf krecipes.tar.bz2
Ahora debemos cambiar al directorio
krecipes creado y arrancar la herramienta
de configuracin. La herramienta necesi-
ta la ruta al directorio raz Qt:
Para compilar Qt necesitamos las fuentes de Qt que estn disponibles bien en los discos de nues-
tra distribucin o desde el fabricante de Qt, Trolltech [4].
Tras descomprimir el archivo debemos cambiar al directorio con el cdigo fuente de Qt. Usaremos
la opcin - plugin-sql-mysql para configurar las opciones de las libreras para aadir soporte
MySQL a Qt:
cd qt-directory
./configure -system-zlib -qt-gif
-system-libpng -system-libjpeg -
plugin-imgfmt-mng -thread -noexceptions
-plugin-sql-mysql
La opcin de la configuracin -system-zlib habilita el uso de la librera de compresin zlib en nues-
tra mquina y las libreras para los formatos de imgenes PNG y jpeg. En lugar de usar una librera
para el formato de imagen GIF deberamos usar la funcin de Qt -qt -gif, necesitando Qt un com-
plemento para el formato de imagen MNG (Multiple-Image Network Graphics).
La opcin -thread habilita el hilado mltiple de ejecucin en programas basados en Qt. La opcin
de configuracin final que necesitamos habilitar por defecto es -no-exceptions, que significa que
no debemos esperar control de las excepciones segn estn definidas por los autores del progra-
ma. Como nos muestra el ejemplo, podemos aadir ms opciones cuando llamemos el comando.
Tras finalizar con los pasos de la configuracin debemos continuar con la construccin de la libre-
ra Qt y algunas herramientas necesarias para Qt y KDE:
make sub-src sub-tools
Puede que esto tarde un poco, pero no obstante no hay necesidad de instalar QT tras finalizar.
Cuadro 1: Compilancin de Qt para Aadir
Soporte MySQL
Figura 1: MySQL insiste en configurar un usuario de base de datos. Figura 2: Una configuracin de MySQL necesita credenciales de usuario.
69 www.linuxmagazine.com.es Nmero 03
LI NUX USER Krecipes
usuario tiene los
privilegios
requeridos para
la base de datos
o si hemos dis-
puesto un
administrador
de sistema para
la base de datos
(ver figura 1). Si
no selec-
cionamos ningu-
na de estas
opciones y en su
lugar pulsamos
Next >, el
siguiente dilo-
go mostrar
nuestro actual
nombre de
usuario en
Linux sin la contrasea. Debemos
introducir la contrasea. Si no,
Krecipes no se ejecutar por falta de
credenciales del usuario, incluso si
hemos completado el resto de los pasos
del asistente. El cuadro 2 nos indica
como crear un usuario para la bases de
datos MySQL. En el ltima cuadro de
dilogo, que aparece inmediatamente,
si hemos seleccionado SQLite, el asis-
tente nos pregunta si queremos poner
las recetas de ejemplo en la base de
datos. No hay que esperar mucho,
puesto que actualmente solo hay cuatro
recetas. Debemos cerrar este dilogo
para arrancar Krecipes en la tpica vista
"Find/Edit Recipes" (ver figura 3).
La Receta Adecuada
Cada vista del programa tiene una barra
de navegacin a la izquierda. El resto del
rea de la ventana es una lista de recetas
donde buscarlas. Si estamos buscando
un plato especfico, puede que prefi-
ramos usar la funcin de bsqueda,
especialmente a medida que la base de
datos crezca.
Para hacer esto debemos introducir el
nombre de la receta en el campo Search:
y presionar [Intro] para confirmar. Esto
indica a Krecipes que debe mostrar la
receta o una lista de todas las recetas
posibles. La lista muestra la categora, el
ttulo de la receta y el nmero de indexa-
do asignado a sta cuando se cre.
Podemos pulsar en los encabezados de
las columnas para ordenar la lista por
cada uno de los criterios.
El men desplegable a la derecha del
campo Search: nos permite restringir la
bsqueda a categoras especficas. Las
categoras se asignan al introducir las
recetas. Un solo plato puede ser asigna-
do a mltiples categoras.
Tras encontrar y seleccionar la receta
deseada en la lista podemos usar
cualquiera de los dos largos botones
bajo la lista para abrir o editar
la receta. El botn Delete borra
las recetas motivo de desen-
gaos culinarios de la base de
datos.
Por supuesto que necesita-
mos crear unas pocas recetas
antes de poder empezar a
borrarlas. El botn New de la
barra de herramientas se ocupa
de esto. Un fallo provoca un
error en la forma de mostrar la
caja de dilogo si tenemos Qt
3.3 (ver figura 4). Para quitar
este error debemos cambiar el
tamao de la ventana arrastran-
do la esquina inferior derecha
de la ventana.
Nouvelle Cuisine
Hay tres pestaas disponibles
para introducir los datos de
nuestras recetas. La primera
pestaa, Recipe, es para el
va el men K, aparecer un asistente
que nos guiar con los ajustes iniciales.
Los usuarios de MySQL tienen dos pasos
adicionales respecto a los usuarios de
SQLite debido a que MySQL necesita un
usuario de base de datos.
Comienzo rpido
Inmediatamente despus de que
aparezca la pantalla de bienvenida el
asistente nos preguntar por la base de
datos que deseamos usar. Si optamos
por MySQL, podremos especificar si el
Figura 3: Uso de la vista Find/Edit Recipe(Encontrar/Editar Recetas).
Figura 4: Necesitamos introducir las recetas.
ttulo de la receta, el nombre del
autor y el nmero de comensales
indicado para la misma. El botn +
cerca de los campos Authors y Cate-
gories abren una caja de dilogo
donde podemos seleccionar un autor
o categora.
La segunda pestaa es para introducir
los ingredientes y las cantidades. Una
lista de conocidos ingredientes hace las
cosas ms fciles.
Si disponemos de todos los detalles
necesarios para los ingredientes pul-
samos Add ingredient para almacenarlo.
Podemos usar las teclas de flecha
para mover los ingredientes por la
lista. Esto nos permite intro-
ducir los ingredientes en el
orden en el que los necesita-
mos para nuestra receta. Debe-
mos pulsar el botn con la
cruz para eliminar ingre-
dientes incorrectos.
La tercera pestaa tiene una
larga caja de texto para las
instrucciones de cocina.
Podemos pulsar en el botn
bajo la caja de texto para com-
probar la ortografa del texto
introducido.
Hay numerosos botones bajo
las pestaas que nos permiten
salvar la receta (smbolo del
disquete), cerrar el dilogo
(crculo con una x), muestra la
receta (lupa) o aadirla a nues-
tra lista de la compra (icono de
carro de la compra como el la
figura 4). Adicionalmente, la
funcin Scale recipe (es el
botn con la flecha azul) nos permite
cambiar el nmero de comensales para
una receta y calcula automticamente
las cantidades adicionales de ingre-
dientes.
70 Nmero 03 www.linuxmagazine.com.es
Krecipes LI NUX USER
Para asignar los privilegios de lectura y escritura requeridos al usuario de la base de datos MySQL,
debemos convertirnos en el administrador de la base de datos root en la lnea de comandos Linux
y abrir el interfaz MySQL. Debemos prestar atencin y no confundir el administrador de la base de
datos root con el administrador de sistemas de Linux root.
Si es la primera vez que usamos la cuenta del administrador de la base de datos root, no ten-
dremos asignada contrasea. Esto no significa que el usuario no exista, sino que la cuenta esta
desprotegida. En este caso no necesitamos introducir una contrasea para acceder a MySQL:
mysql -user=root mysql
Para asignar privilegios de lectura y escritura a nuestra base de datos de recetas a nuestra propia
cuenta no privilegiadadebemos escribir el siguiente comando en el cursor. Esto asigna los privi-
legios de seleccin, insercin, actualizacin y borrado de la base de datos:
GRANT SELECT, INSERT, UPDATE,
DELETE ON Krecipes.* TO
'username'@'hostname' IDENTIFIED
BY 'password' ;
La base de datos que Krecipes crea automticamente se llama Krecipes. Reemplazaremos user-
name, hostname y password (nombre de usuario, nombre de host y contrasea) con los creden-
ciales del usuario de la base de datos, la contrasea y el nombre del host. Si estamos ejecutando el
servidor MySQL en nuestra mquina local debemos usar localhost como nombre para el host.
Alternativamente debemos reemplazar Hostname con el nombre del servidor remoto de bases de
datos (por ejemplo un servidor dedicado en nuestra red local).
Ahora le podemos decir al asistente de Krecipes que tenemos los privilegios adecuados (ver figura
1). En la siguiente caja de dilogo (ver figura 2) introducimos los credenciales de usuario y con-
trasea que acabamos de asignar.
Cuadro 2: Configuracin de un usuario de
bases de datos MySQL
Figura 5: Cambiando de vista.
Figura 6: Creacin de la lista de la compra
automticamente.
71 www.linuxmagazine.com.es Nmero 03
LI NUX USER Krecipes
crear planes de dieta con gran detalle
(ver figura 7).
Lucha Contra los Michelines
Antes de todo debemos especificar cuan-
to tiempo pretendemos estar a dieta,
cuantas comidas haremos al da y el
nmero de platos que compondrn cada
comida. Si hay ms de un plato por
comida podemos usar los botones Pre-
vious Dish (Plato Previo) y Next Dish
(Siguiente Plato) para cambiar entre
platos.
Si marcamos Enable Category Filte-
ring (Filtro por Categora Habilitado),
Krecipes solo mostrar las recetas de
las categoras seleccionadas. Esto, por
ejemplo, nos permite evitar platos
para el desayuno como la pizza o un
filete.
En la parte inferior derecha podemos
seleccionar los niveles de hidratos de
carbono, vitaminas, protenas o grasa.
Krecipes nos ofrecer una seleccin limi-
tada de recetas que corresponden a
nuestras preferencias. Cuando pulsamos
Create the diet (Crear una Dieta),
Krecipes no solo compila un plan de
dieta para nosotros para el periodo
especificado, si no que tambin nos lo
muestra.
Alguna vez has abierto el frigorfico y
no has sabido que hacer de comer con
los ingredientes de dentro? La opcin de
Ingredient check (Comprobador de ingre-
dientes) en la barra del navegador nos
Si la vista receta (ver figura
5) no es de nuestro agrado y
preferimos tener los ingre-
dientes en un lugar diferente,
por qu no cambiar las pre-
ferencias en Settings | Page
preferences...? Podemos arras-
trar los elementos individual-
mente, por ejemplo la lista de
categoras o de ingredientes,
con nuestro ratn para reor-
denarlas (ver figura 5). Ahora
debemos pulsar Save and
Close para guardar los cam-
bios.
El Carro de la Compra
Tras decidir nuestro men, la
funcin de Krecipes Shopping
List, localizada en la barra de
navegacin de la izquierda de la
ventana nos puede ayudar con
la tortura de la compra.
Como se muestra en la figu-
ra 6, podemos seleccionar una o ms
recetas de la lista de recetas existentes
y usar el botn con la flecha hacia la
derecha para aadirlas a la lista de la
compra (Shopping list). Pulsando la
flecha hacia la izquierda elimina las
recetas de la lista y pulsando Clear
eliminamos toda la lista.
El botn OK muestra nuestra lista de la
compra (ver figura 6). Podemos pulsar
Print para crear una copia para nuestro
prximo viaje al supermercado. Pulsare-
mos OK para cerrar la ventana.
En la parte inferior izquierda de la
ventana de la lista de la compra hay otro
botn que llama a la funcin Diet Wiz-
ard en la barra del navegador. Esta herra-
mienta realmente nos puede ayudar a
Figura 7: El asistente de recetas de Krecipes para comensales sanos.
CVS: El sistema de versionado concurrente proporciona un sistema de gestin de versiones para archivos. El cdigo fuente se almacena en un servidor
donde los desarrolladores pueden aadir parches o nuevas funciones. Podemos usar este sistema para descargar el cdigo a nuestro equipo, lo que al
final nos permite construir una versin ejecutable.
kdenonbeta: Los programas de kdenonbeta esta normalmente en fases de desarrollo muy iniciales y no son parte oficial de la versin KDE comercial.
Esto significa que no se ven afectadas por planes de arrancamiento o de paralizacin. Como contrapartida, los programas de esta rama no suelen estar
disponibles como RPMs o paquetes Debian. El soporte tambin esta restringido.
MySQL: Base de datos que soporta la formulacin de consultas en el lenguaje de bases de datos SQL (Lenguaje de consultas estructuradas). Los datos
son almacenados en tablas. Podemos usar el cliente de la lnea de comandos comentado ms adelante en este artculo para gestionar bases de datos
MySQL. La aplicacin PhpMyAdmin, escrita en el lenguaje PHP, es un cliente alternativo popular. PhpMyAdmin dispone de GUI y soporta el acceso va
Web. No obstante, para usar PhpMyAdmin necesitamos un servidor Apache funcionando, lo que implica algo de trabajo de instalacin adicional.
SQLite: Librera C con software de servidor de base de datos integrada. Si enlazamos Krecipes con SQLite permitimos que el programa aceda a bases de
datos SQL sin necesidad de ejecutar un servidor de bases de datos adicional. La librera SQlite lee y escribe la base de datos directamente desde o hacia el
disco.
GLOSARIO
puede ayudar. Simplemente debemos
seleccionar los ingredientes que tenemos
en casa de la lista y pulsamos sobre el
icono Find matching recipe (Buscar rece-
ta coincidente). Esperemos que encon-
tremos una buena receta en la lista y
podamos marcharnos a la cocina con
una misin que cumplir.
Ingredientes
Si estamos en la seccin "Fighting the
Flab" y nos preguntamos si realmente
Krecipes realmente sabe el valor nutri-
cional de algunas comidas poco usuales
como panceta o espinacas de agua,
debemos comprobar el elemento Data
(Datos) en la barra de navegacin para
averiguarlo. Estos nos lleva a ms
entradas de navegacin usadas para edi-
tar nuestra coleccin de datos.
Por ejemplo, el elemento Ingredients en
la figura 8 nos lleva a una lista de elemen-
tos de todos los ingredientes en la base de
datos. Podemos aadir elementos que fal-
ten aqu, como algo que no haya sido
usado hasta ahora en una receta, por si
acaso. Para aadir un ingrediente debe-
mos pulsar el botn con el smbolo +.
Para eliminar un ingrediente pulsaremos
el botn con el smbolo -. Ambos botones
funcionan de forma similar en otras listas.
Podemos asignar la unidad apropiada
y por supuesto definir la protena, grasa
u otros valores nutricionales de cada
ingrediente. Cargar los datos USDA
(Load USDA data) hace esto ms sen-
cillo, pero esta funcionalidad no est
acabada del todo.
Ahora mismo lo que hace es cargar los
datos de una lista de ingredientes y sus
valores nutricionales de una base de
datos del departamento de agricultura de
los Estados Unidos [5], pero no es capaz
de aadir los datos a la base de datos de
Krecipes. Los desarrolladores estn traba-
jando duro para resolver este problema.
Properties nos lleva a una muestra ge-
neral de los valores nutricionales intro-
ducidos hasta ahora. Podemos introducir
elementos usando los smbolos ms y
menos como describimos antes.
Units nos muestra una lista de todas la
unidades que conoce la base de datos
incluyendo una tabla de conversin de
julios a caloras. Podemos aadir ms
tablas de conversin. Seguiremos los
pasos indicados ms abajo para
aadir nuevas conversiones.
Categories gestiona las cate-
goras de la recetas y Authors es
el lugar donde aadir y editar
los nombres de los proveedores
de recetas.
Importar
Puede que tengamos muchos
datos que aadir y no deseemos
reescribir todas las recetas que
ya habamos introducido en
nuestro PC. Verdad que sera
bonito poder aadir todas esas
recetas que hemos descubierto
en Internet a nuestra base de
datos sin tener que escribirlas?
Para facilitar esto, al menos en
la mayora de los casos, Krecipes
soporta Recipeml (Lenguaje de
marcas de recetas) [6], un
lenguaje basado en XML espe-
cialmente diseado para mostrar
datos de recetas. Krecipes no tiene ningn
problema para abrir las recetas en este
formato. Puede importar formatos de re-
cetas desde programas como Master Cook
o Meal Master a la base de datos me-
diante el men File usando el comando
Import.
El dilogo de configuracin del progra-
ma bajo Settings | Krecipes preferences
(ver figura 9) es el lugar donde jugar con
las facilidades de importacin de las re-
cetas. Tambin podemos cambiar el
nombre de usuario y contrasea de la
base de datos MySQL. Numbers modifica
el modo en que los nmeros se muestran
para las cantidades.
Todas estas funciones funcionan bien
al margen de que el desarrollo est en
fase de desarrollo. Esto hace a Krecipes
adecuado para un uso diario y le augura
un buen futuro. I
72 Nmero 03 www.linuxmagazine.com.es
Krecipes LI NUX USER
Figura 8: Podemos acceder al elemento Datapara aadir entradas en la base de datos.
Figura 9: El dilogo Krecipes preferencesnos
permite configurar Krecipes.
[1] Krecipes: http://krecipes.sf.net/
[2] MySQL: http://www.mysql.com/
[3] SQLite: http://www.sqlite.org/
[4] Descraga de Qt: http://www.trolltech.
com/download/qt/x11.html
[5] Departamento de Agricultura de los
Estados Unidos: http://www.usda.gov/
[6] Ms informacin en Recipeml: http://
www.formatdata.com/recipeml/
INFO
73 www.linuxmagazine.com.es Nmero 03
LI NUX USER KDM/ GDM
E
n muchos sistemas, el gestor de
ventanas o de acceso es el primer
programa del GUI que ve el
usuario. La mayora de las ms impor-
tantes distribuciones arrancan automti-
camente el sistema X Windows. Los
usuarios escriben sus nombres y con-
traseas para acceder y seleccionar el
entorno. Habitualmente pueden selec-
cionar otras opciones, como apagar el
equipo o reiniciarlo.
KDM, del proyecto KDM y su homlo-
go Gnome, GDM, son los ms populares
gestores de pantallas, si bien hay una
serie de alternativas, como los gestores
del legado de XDM o el compacto WDM.
El gestor de acceso no influye en la man-
era en la que se ejecuta el escritorio.
Incluso los mayores fans de KDE podran
seguir usando GDM para acceder al sis-
tema y arrancar su entorno favorito. La
nica desventaja es que instalar GDM
incluye muchas libreras de Gnome en
nuestro disco duro ocupando un valioso
espacio de almacenaje. Este artculo
explica como cambiar el gestor de pan-
talla en Fedora Core 2, Suse
Linux 9.1 y Mandrake Linux
10.0 y como podemos aadir
gestores de ventanas a la lista
desplegable.
Lo Bsico
La mayora de las distribuciones
instalan un gestor de ventanas
cuando instalan Linux. Suse y
Mandrake usan KDM por defec-
to (figura 1) y Fedora usa GDM
(figura 2). Si deseamos probar
un gestor alternativo lo primero
que debemos hacer es aadirlo
a nuestra lista de instalacin.
GDM se encuentra en el paquete
gdm bajo Fedora Core 2, Suse y Man-
drake Linux, mientras KDM puede
encontrarse en varios paquetes RPM. En
Suse el paquete se llama kdebase3-kdm,
Mandrake Linux lo llama kdebase-kdm y
Fedora lo llama kde-base.
En Mandrake y en Suse Linux puede
que incluso no obtengamos un gestor de
ventanas si elegimos el acceso automti-
co al instalar el sistema. Esto puede ser
vlido para usuarios individuales porque
el usuario solo necesita un escritorio,
pero hay una serie de desventajas. Para
empezar es muy complicado cambiar a
un escritorio alternativo y luego
cualquiera puede acceder a nuestros
datos simplemente encendiendo el
equipo.
Para deshabilitar el acceso automtico
en Suse Linux debemos arrancar YaST y
seleccionar etc/sysconfig/Editor en Sys-
tem. Debemos editar la entrada Desktop
| Display manager | DISPLAYMANAG-
ER_AUTOLOGIN eliminando el nombre
del usuario del campo a la derecha de la
ventana.
Mandrake Linux usa drakconf como
herramienta de configuracin. Selec-
cionamos Autologin en Boot y cam-
biamos la seleccin a No, I don't want
autologin. Debemos asegurarnos de que
no deshabilitamos la casilla Launch the
graphical environment when
your system starts por error.
Este ajuste evita arrancar el GUI
al inicializar el sistema forzn-
donos a acceder en una consola
basada en texto primero y luego
debiendo escribir startx para
acceder al escritorio KDE.
Cambio entre GDM y
KDM
Para cambiar el gestor de ven-
tanas por defecto debemos
realizar algunos cambios ma-
nuales a Mandrake Linux y a
Fedora Core 2. Ambas distribu-
ciones usan el archivo
Configurando KDM y GDM
La primera pantalla
Tanto KDE como GNOME disponen de gestores de pantallas. Veremos las carac-
tersticas ofrecidas por KDM y GDM y examinaremos como configurar un
gestor de pantalla en nuestro sistema Linux. POR HAGEN HPFNER
Figura 1: La pantalla de inicio de sesin KDM en Suse Linux.
74 Nmero 03 www.linuxmagazine.com.es
KDM/ GDM LI NUX USER
ranque del servidor X y apagar el sis-
tema (Shutdown).
Mandrake Linux espera que el usuario
primero seleccione un nombre de
usuario y luego muestra un dialogo de
contrasea (figura 3) donde el usuario
puede especificar el escritorio que desea
arrancar. EL KDM de Fedora es muy sim-
ple en comparacin, pero se comporta
exactamente como KDM bajo Suse
Linux.
Las tres variantes permiten al usuario
acceder, pero al menos hay una buena
razn para cambiar la opcin por defec-
to. La seleccin del tipo de sesin est
basada en gestores de ventanas preins-
taladas y escritorios de entornos. Si
instalamos un gestor de ventanas adi-
cional, el gestor de acceso no mostrar
una entrada para el nuevo gestor de
ventanas al menos que la distribucin
tenga una macro de sein a juego.
Tanto KDM como GDM ignoran los
gestores de ventanas sin una macro a
juego. El gestor qlwm es un ejemplo de
esto.
Para indicar a KDM que aada qlwm
necesitamos crear un nuevo tipo de
sesin. KDE sola tener un Centro de
Control para gestionar esto, pero esta
opcin ha desaparecido en KDE 3.2. En
su lugar necesitamos acceder como raz
y crear un archivo de comandos de
sesin para la nueva entrada. Un archivo
de comandos de sesin es un archivo de
texto que contiene parmetros para el
gestor de ventanas. Suse Linux almacena
los archivos de comandos de sesin en
/opt/kde3/share/apps/kdm/sessions/.
Mandrake Linux y Fedora Core 2
buscan estas entradas bajo
/usr/share/apps/kdm/sessions/. Escribi-
mos el nombre del archivo - qlwm.desk-
top en nuestro ejemplo (podemos elegir
cualquier nombre, pero la extensin es
obligatoria) y luego aadimos lo sigu-
iente:
[Desktop Entry]
Encoding=UTF-8
Type=XSession
Exec=/usr/local/bin/qlwm
TryExec=/usr/local/bin/qlwm
Name=QLWM
Hemos acabado! La prxima vez que
accedamos KDM tendr un inicio de
sesin del tipo QLWM entre sus
opciones. El nombre del tipo de inicio de
sesin se define en la lnea Name=,
QLWM en nuestro caso. Esto supone que
hay un archivo llamado
/usr/local/bin/qlwm y que el archivo es
ejecutable (TryExec). Si ahora selec-
cionamos QLWM como el tipo de inicio
de sesin para acceder, KDM debe ejecu-
tar el programa especificado en la lnea
que comienza con Exec. KDM ordena el
tipo de sesin en el men desplegable
alfabticamente por el nombre del cdi-
go de la sesin. Si deseamos que QLWM
sea el primero de la lista podemos cam-
biar el nombre qlwm.desktop creado en
el paso previo por 00qlwm.desktop.
Ms Bonito
Si estamos descontentos con la aparien-
cia y aspecto de KDM, debemos repasar
/etc/X11/prefdm para arrancar el progra-
ma de acceso. prefdm lee los ajustes del
gestor de acceso de una variable llamada
DISPLAYMANAGER, que viene descrita
en /etc/sysconfig/desktop. La lnea que
describe el gestor contendr o DISPLAY-
MANAGER="kdm" o DISPLAYMANAG-
ER="gdm". Al arrancar el GUI, se inicia-
r el gestor de acceso seleccionado.
Mandrake ofrece dos variantes a KDM:
una versin especfica de Mandrake
usada por defecto (figura 3) y la versin
simple de KDM. Si ajustamos la variable
DISPLAYMANAGER a kdm se muestra el
KDM original al arrancar el GUI. La ver-
sin Mandrake del gestor de acceso se
muestra si cambiamos la variable a DIS-
PLAYMANAGER="KDE" en /etc/syscon-
fig/desktop.
Los usuarios de Suse Linux necesitan
/etc/sysconfig/Editor en YaST. Esta herra-
mienta es una portal que proporciona a
los usuarios un acceso conveniente al
directorio /etc/sysconfig/. Si preferimos
un editor de texto a YaST, simplemente
debemos editar la variable DISPLAY-
MANAGER en /etc/sysconfig/display-
manager para Suse Linux.
Control de KDM
Cada distribucin tiene una configu-
racin por defecto que definen la apa-
riencia de KDM. Bajo Suse, KDE incita
al usuario a introducir su Username
(nombre de usuario) y Password (con-
trasea), disponiendo adicionalmente
de una Menu (figura 4) que permite al
usuario seleccionar el tipo de sesin
(Session type) y funciones para el rear-
Figura 2: GDM da la bienvenida a los usuarios en Fedora Core 2. Figura 3: KDM en Mandrake Linux paso a paso.
75 www.linuxmagazine.com.es Nmero 03
LI NUX USER KDM/ GDM
usuario una lista de gestores de ven-
tanas y entornos de escritorio selec-
cionables y System (Sistema) dispone
de opciones para apagar y reiniciar el
equipo junto a una opcin para confi-
gurar XDMCP. Tambin hay una entra-
da para arrancar el programa de confi-
guracin de GDM. GDM en Mandrake
Linux es exactamente igual con la
excepcin del men System, que se
llama Actions (Acciones). Fedora, que
usa GDM por defecto, no dispone de un
men para apagar o reiniciar el equipo.
Fedora tampoco tiene ninguna opcin
para arrancar la herramienta de confi-
guracin de KDE. No obstante el
usuario root puede ejecutar el comando
gdmsetup tras iniciar la sesin para
acceder a estas caractersticas.
En la pestaa Security (Seguridad)
podemos especificar si deseamos per-
mitir el acceso al dilogo de configu-
racin desde la ventana de acceso. No
obstante, aunque marquemos la casilla
Allow configuration from the login
screen (Permitir configuracin desde la
pantalla de inicio de sesin) en Fedora
Core 2, no veremos el botn de gdmset-
up al acceder. Los theme (Temas) de l
GDM de Fedora Core 2 tienen la culpa.
Si elegimos un tema diferente en la pes-
taa Graphical greeter (Saludo grfico),
Fedora GDM nos mostrar sin ningn
problema la herramienta de configu-
racin. Debido a que la seleccin de
temas preinstalada es limitada, puede
que queramos echar un vistazo a [3]
para elegir un nuevo tema. De nuevo
tendremos que ejecutar gdmsetup para
instalar cualquier tema descargado de
Internet.
Es muy simple indicar a GDM que
muestre una seleccin de tipos de
sesin en cualquier gestor de ventanas
que instalemos, de hecho tan simple
como hacerlo en KDM. La nica dife-
rencia entre las dos configuraciones es
la ruta al cdigo de la sesin. GDM en
Suse Linux espera encontrar el cdigo
en /opt/gnome/share/xsessions. La ruta
en Mandrake Linux y Fedora Core 2 es
/usr/share/xsessions/. Si buscamos ms
informacin respecto a como configu-
rar GDM debemos ver el manual de re-
ferencia en [4]. I
su herramienta de configuracin. La
herramienta est localizada en el Cen-
tro de Control de KDE bajo System
administration | Login manager (figura
5). Aparte de pestaas para una config-
uracin refinada de la apariencia del
gestor de acceso (Appearance, Font,
Background- Apariencia, Fuente,
Fondo), hay tres pestaas de opciones
generales. La pestaa Shutdown (Apa-
gar) permite especificar los usuarios
que tienen permiso para apagar y reini-
ciar el equipo. La pestaa Users (Usuar-
ios) nos permite seleccionar las cuentas
de usuario que muestra KDM.
Debemos repasar el manual de usuario
de KDE en [1] para obtener ms informa-
cin sobre la configuracin. Desafortu-
nadamente el manual no est actualiza-
do en todos los aspectos, si bien se
supone que cubre hasta KDE 3.3.
Inicio de Sesin con Gnome
Al igual que ocurre con KDM, la
apariencia de GDM es especfica para
cada distribucin. Suse Linux dispone
de una caracterstica para ajustar el
lenguaje del procedimiento de acceso
(Language). Session (Sesiones) ofrece al
[1] Manual KDM: http://docs.kde.org/en/
HEAD/kdebase/kdm/
[2] Linux XDMCP HOWTO: http://www.tldp.
org/HOWTO/XDMCP-HOWTO/
[3] Temas GDM: http://art.gnome.org/
themes/gdm_greeter/
[4] Manual de referencia de GDM: http://
www.jirka.org/gdm-documentation/t1.
ht
INFO
Theme(Tema): Un tema es una coleccin de elementos que proporcionan a aplicaciones de base
GUI una apariencia predeterminada. Alparte de la mayora de los gestores de ventanas, aplica-
ciones como Mozilla o XMMS soportan temas.
XDMCP: Protocolo de Control de Gestor de Pantalla X [2] fue desarrollado para permitir el acceso a
sesiones X a travs de la red. Los usuarios remotos pueden trabajar como si tuvieran acceso direc-
to al equipo desde remotamente y se les permite hasta ejecutar aplicaciones basadas en GUI en el
servidor X. Por motivos de seguridad y para reducir la carga de la red, SHH es preferible a XDMCP.
GLOSARIO
Figura 4: Suse Linux ofrece a los usuarios un amplio rengo de opciones de
KDM a la vez. Figura 5: Modificando el aspecto y apariencia de KDM.
76 Nmero 03 www.linuxmagazine.com.es
XUL LI NUX USER
E
ste mes vamos a repasar con
mucha atencin qu mens se uti-
lizan y para qu y como crearlos.
Una vez hecho esto juntaremos toda la
informacin de los ltimos nmeros para
crear un interfaz XUL completo. Si bien
este interfaz no incluir toda la fun-
cionalidad de una aplicacin completa,
s nos permitir asentar nuestros
conocimientos de XUL mediante la
creacin de un interfaz completo y prc-
tico.
Los mens proporcionan una forma
de ocultar funcionalidad mantenin-
dola accesible de forma sencilla para el
usuario. El modo de funcionar de los
mens es muy ingeniosa. Si necesitse-
mos mostrar un botn para cada fun-
cin de una aplicacin acabaramos
con un interfaz completamente abarro-
tado.
Los mens disponen de una serie de
partes distintas. La primera es la barra de
herramientas. ste es el espacio en la
parte superior de la ventana de la apli-
cacin que agrupa los distintos mens.
Dentro de este espacio tenemos distintos
objetos que se refieren a distintas cate-
goras de opciones. Finalmente,
podemos pulsar dentro de esas cate-
goras y podemos mostrar el men emer-
gente completo con una serie de
opciones que estn relacionadas con ese
men.
Si pulsamos en el men Archivo de un
programa normalmente nos encon-
tramos con opciones como Nuevo, Abrir,
Cerrar, Guardar o Guardar como entre
otros. Mientras que los usuarios sepan el
tipo de funcin que necesitan deben de
ser capaces de seleccionar el men ade-
cuado y acceder a la opcin deseada.
Siempre debemos tener una idea clara
respecto al tipo de funcionalidad que
debe ir en cada categora del men y ase-
gurarnos de que nuestros mens son lo
suficientemente intuitivos como para
persuadir al usuario de pulsar en el
men correcto para acceder a la opcin
deseada.
La organizacin de mens cada vez
tiene manos en cuenta su uso y la conse-
cuencia directa de esto es la convivencia
de opciones no relacionadas en el mismo
Programando con Mozilla Xul
Clics
Bonitos
En los primeros captulos de nuestra
serie de XUL hemos estado principal-
mente mirando los conceptos bsicos
del lenguaje. A medida que nuestro
viaje ha continuado hemos explo-
rado botones, etiquetas y gestin de
geometras, comenzando el mes
pasada conectar funcionalidad a
nuestro interfaz.
POR JONO BACON
77 www.linuxmagazine.com.es Nmero 03
LI NUX USER XUL
ahora (se usa normalmente en barras de
herramientas).
Lo siguiente que debemos hacer es
crear una barra de men en las que
poner las entradas de nuestro men. Nos
referimos a la tpica zona gris sobre la
que se superponen los componentes de
los mens. Podemos aadir esta zona
usando la etiqueta menubar (barra de
men):
<menubar id="menubar">
Hemos especificado una identidad a esta
barra de men, prctica comn cuando
manejamos mens y botones en XUL.
Ahora estamos listos para agregar
componentes a nuestro men. Con este
fin utilizamos la etiqueta menu
(men) con su correspondiente identi-
dad para el atributo y nombre con la eti-
queta del atributo:
<menu id="filemenu"U
label="Archivo">
Ahora necesitamos llenar el men con
componentes. Para hacer esto necesita-
mos aadir el primer men especial
emergente usando la etiqueta
<menupopup>:
<menupopup id="filepopup">
con nuestro men emergente aadido
procedemos a insertar objetos usando la
etiqueta <menuitem> (elemento de
men) para cada uno de los distintos
objetos:
<menuitem label="Nuevo"/>
<menuitem label="Abrir"/>
<menuitem label="Guardar"/>
Puede que hayas notado que no hay un
atributo de identificacin para cada
men. Esto es debido a que vamos a
usar un mtodo diferente para gestionar
que elemento del men se pulsa que
veremos ms adelante.
Cuando estemos creando nuestros
mens puede que deseemos separarlos
en diferentes secciones. Podemos hacer-
lo usando separadores de mens con la
etiqueta <menuseparator> (Separador
de mens):
<menuseparator/>
El elemento final puede ser la tpica
opcin de cerrar tras el separador:
<menuitem label="Salir"/>
Para finalizar aadiremos todas la eti-
quetas de cierre que completan la estruc-
tura de nuestro men:
</menupopup>
</menu>
</menubar>
</toolbox>
</window>
Nuestro archivo completo hasta ahora se
muestra en el listado 2 y en la figura 1
vemos la estructura completada.
Ms Funcionalidades de
men
Una de las funcionalidades ms habi-
tuales en un men es un sub-men. Este
tipo de mens especiales aparece cuando
movemos el cursos sobre un compo-
nente del men principal.
Para crear un sub-men debemos edi-
tar parte del cdigo existente y aadir
otra estructura para el mismo. Aadire-
mos un sub-men al elemento Nuevo de
nuestro men, necesitando cambiar la
siguiente lnea:
<menuitem label="Nuevo"/>
Cuando aadimos un sub-men emer-
gente debemos cambiar el elemento
padre del sub-men, modificando la eti-
queta original <menuitem>, por la eti-
queta <menu>:
<menu id="newmenu"U
label="Nuevo">
men. Un ejemplo puede ser la opcin
Work Offline (Trabajar desconectado) en
el men Archivo del programa Mozilla
Firefox.
Otro ejemplo en Microsoft Windows es
la aparicin de la opcin de apagado en
el men de Inicio. Alguno de vosotros no
estaris de acuerdo con estos ejemplo,
pero todos debemos prestar atencin al
uso por parte del usuario de los mens al
crearlos.
Creacin de Nuestro Primer
Men
Para comenzar con nuestro primer men
necesitaremos crear el cdigo base nor-
mal que aparece en casi todos los
archivos XUL. Usaremos el cdigo que
aparece en el listado 1.
Ahora podemos crear la estructura de
nuestro men. El primer elemento que
necesitamos crear es el que posiciona
nuestro men en la parte superior de la
pantalla. Esto es llamado caja de herra-
mientas y lo aadimos con la etiqueta
<toolbox> (caja de herramientas):
<toolbox>
Como otros contenedores de gestin de
geometra, la etiqueta toolbox posi-
ciona el cdigo en una parte especfica
de la pantalla. Otra opcin es la de
poder aadir el control especial agarra-
dera de la barra de herramientas de
forma que pueda ser separada de la
ventana y ser movida en una ventana
separada sobrepuesta. No usaremos
esta opcin para nuestros mens por
Una de las mayores preguntas que se realiza
al mirar a XUL es si hay otros lenguajes
disponibles para escribir cdigo XUL. Actual-
mente el nico lenguaje soportado es
Javascript, si bien se est pensando en la
inclusin de otros lenguajes en versiones
futuras de Mozilla. Entre estos lenguajes
puede que estn incluidos Python o C#.
Muchas de de las discusiones entre los
desarrolladores se giran alrededor de la
creacin de un nuevo nivel de funcionalidad
de la aplicacin Mozilla: la mquina virtual
de Mozilla. Podemos encontrar ms infor-
macin al respecto del progreso del proyecto
Mozilla en las Webs Mozillazine (http://
www.mozillazine.org/) y en Planet Mozilla
(http://planet.mozilla.org/).
Otros lenguajes y XUL
01 <?xml version="1.0"?>
02 <xml-stylesheet
href="chrome://global/skin/"
type="text/css"?>
03 <window
04 id="test-window"
05 title="Test Program"
06
xmlns="http://www.mozilla.org/
keymaster/gatekeeper/there.is.
only.xul">
Listado 1: first.xul
78 Nmero 03 www.linuxmagazine.com.es
XUL LI NUX USER
deberamos asegurarnos de que la eti-
queta con la que especificamos el cdi-
go JavaScript es la primera etiqueta
dentro de la etiqueta bloque <win-
dow>.
La primera parte de nuestro interfaz a
crear es la estructura del men. Especi-
ficaremos la etiqueta <toolbox> (caja
de herramientas) para indicar que nues-
tro men est posicionado en la parte
superior de nuestra ventana. Esto nos
asegura que nuestros mens y barras de
herramientas (las veremos ms ade-
lante) se agrupan de forma conjunta en
la caja de herramientas:
<toolbox>
Ahora podemos crear nuestra barra de
men principal y poner un men y un
sub-men. Debemos recordar que cada
men se especifica con una etiqueta
<menu> (esta etiqueta realmente
aade el nombre del men a la barra de
mens), pero tambin debemos crear el
men emergente propiamente dicho (el
men que aparece cuando pulsamos
sobre un elemento). ste es el cdigo:
<menubar id="samplemenubar">
<menu id="filemenu"U
label="File">
<menupopup id="filepopup">
En este punto no tenemos ningn ele-
mento en el men emergente. El primer
elemento, Nuevo, es un poco diferente
porque es en s un men emergente.
Para aadir este sub-men creamos
nuestras etiquetas <menu> y <sub-
menu> y luego aadimos las etiquetas
<menuitem> (elementos del men). Es
importante saber que si bien las otras
entradas del men Archivo se
aaden con la etiqueta <menu-
item>, el objeto Nuevo es aadido
con la etiqueta <menu> al ser un
sub-menu:
<menu id="newmenu"U
label="Nuevo">
<menupopup
id="secondpopup">
<menuitem
label="Plantilla"/>
<menuitem
label="Fichero"/>
</menupopup>
</menu>
Tras completar el men Nuevo y su sub-
men podemos proceder a aadir el
resto de nuestro componentes al men
Archivo. Hacemos esto con una serie de
etiquetas <menuitem>, usando la eti-
queta <menuseparator> para crear
una lnea entre las entradas de los ele-
mentos:
<menuitem label="Abrir"/>
<menuitem label="Guardar"/>
Ya hemos creado una estructura
nueva. Ahora estamos listos para
aadir el sub-men emergente:
<menupopup id="secondpopup">
<menuitem
label="Plantilla"/>
<menuitem label="Fichero"/>
</menupopup>
Debemos recordar aadir las etique-
tas de cierre:
</menu>
Ahora debemos ver algo similar a lo que
se muestra en la figura 2.
Construccin de un Interfaz
Completo
XUL nos muestra su potencial real cuan-
do comenzamos a unir diferentes com-
ponentes hasta completar un interfaz.
Vamos a crear un interfaz completo
con XUL que puede utilizarse como base
de futuras interfaces. Construiremos este
interfaz desde el principio como si de
una herramienta de gestin de informa-
cin se tratase. Esto involucrar la dedi-
cacin de determinadas partes de la pan-
talla a diferentes funciones y usos. Si
bien no escribiremos la funcionalidad
del interfaz, s lo usaremos como base
para escribir una aplicacin completa en
XUL.
Para hacer que sea ms fcil de enten-
der repasaremos cada lnea del cdigo
individualmente y luego presentaremos
el listado del cdigo completo al final del
artculo.
Comenzaremos aadiendo el cdigo
base XUL del listado 1.
Este cdigo simplemente especifica a
Mozilla que se trata de XUL y luego usa
la etiqueta <window> (ventana) para
crear la ventana padre. Una vez comple-
tado este cdigo debemos especificar el
archivo que contiene el Javascript que
proporciona funcionalidad a nuestra
interfaz:
<script src="code.js"/>
En nuestra interfaz ejemplo no estamos
realmente escribiendo ningn cdigo en
JavaScript y solo nos concentraremos
en XUL. Si estuvisemos escribiendo
una aplicacin XUL funcional
01 <?xml version="1.0"?>
02 <?xml-stylesheet
href="chrome://global/skin/"
type="text/css"?>
03 <window
04 id="test-window"
05 title="Test Program"
06
xmlns="http://www.mozilla.org/
keymaster/gatekeeper/there.is.
only.xul">
07 <toolbox>
08 <menubar id="menubar">
09 <menu id="filemenu"
label="Fichero">
10 <menupopup id="filepopup">
11 <menuitem label="Nuevo"/>
12 <menuitem label="Abrir"/>
13 <menuitem label="Guardar"/>
14 <menuseparator/>
15 <menuitem label="Salir"/>
16 </menupopup>
17 </menu>
18 </menubar>
19 </toolbox>
20 </window>
Listado 2: second.xul
Figura 1: Un simple men
Archivo con una lnea de
separacin incluida.
Figura 2: Aadir un sub-men
al men principal en XUL es
simple.
79 www.linuxmagazine.com.es Nmero 03
LI NUX USER XUL
<menuseparator/>
<menuitem label="Salir"/>
</menupopup>
</menu>
Ahora procedemos a aadir el segundo
men a la barra de herramientas. ste
ser el men de edicin(Edit), usando de
nuevo las etiquetas <menu>,
<menupopup>, y <menuitem>:
<menu id="editmenu"U
label="Edit">
<menupopup id="editpopup">
<menuitem label="Deshacer"/>
<menuitem label="Rehacer"/>
</menupopup>
</menu>
Para finalizar nuestra estructura, necesi-
tamos aadir las etiquetas de cierre
<menubar> y <toolbox>:
</menubar>
</toolbox>
La parte principal de nuestra interfaz va
ha estar compuesta, a la izquierda, por
una combinacin de una caja combo,
una caja de listado y una barra de
divisin reajustable, y a la derecha el
rea principal de texto y algunos otros
botones. Con esto en mente debemos
tener algunos componentes encima de
otros (la caja combo est encima de la
caja de listado, por ejemplo) y algunos
otros componentes al lado de otros (por
ejemplo botones). Esto implica la combi-
nacin de la etiquetas <hbox> y
<vbox> con el fin de agrupar compo-
nentes de determinadas formas.
Comenzaremos usando la etiqueta
<box> (caja) para indicar que esta-
mos usando un diseo tipo caja para
todos nuestros componentes, y luego
creamos la etiqueta <vbox> para
disponer la caja combo y la caja de lis-
tado una encima de la otra. Cada uno
de los componentes usa <flex=1>
para extender el propio componente y
ocupar todo el espacio disponible. Esta
coletilla se utiliza a lo largo de todo el
cdigo.
<box flex="1">
<vbox flex="1">
Nuestro primeros componentes van ha
ser una etiqueta y una caja combo, los
cuales van ha estar agrupados por la eti-
queta <hbox> para que se coloquen
uno al lado del otro. Primero creamos la
etiqueta <label> con el modo texto y
luego creamos la caja combo (es como se
denomina en XUL una lista de men)
con la etiqueta <menulist>. Dentro de
esta etiqueta creamos una serie de
entradas <menuitem> para cada objeto
en la caja. Tambin hemos dispuesto el
atributo editable como falso para la lista
de nuestro men con la intencin de que
los usuarios no puedan cambiar los con-
tenidos de la caja:
@LI<hbox> <label value=Mode/
> <menulist editable=false
flex=1> <menupopup> <menu-
01 <?xml version="1.0"?>
02 <?xml-stylesheet
href="chrome://global/skin/"
type="text/css"?>
03 <window
04 id="testwindow"
05 title="XUL Interface"
06
xmlns="http://www.mozilla.org/
keymaster/gatekeeper/there.is.
only.xul">
07 <script src="code.js"/>
08 <toolbox>
09 <menubar id="samplemenubar">
10 <menu id="filemenu"
label="Fichero">
11 <menupopup id="filepopup">
12 <menu id="newmenu"
label="Nuevo">
13 <menupopup id="secondpopup">
14 <menuitem
label="Plantilla"/>
15 <menuitem label="Fichero"/>
16 </menupopup>
17
18 </menu>
19 <menuitem label="Abrir"/>
20 <menuitem label="Guardar"/>
21 <menuseparator/>
22 <menuitem label="Salir"/>
23 </menupopup>
24 </menu>
25 <menu id="editmenu"
label="Editar">
26 <menupopup id="editpopup">
27 <menuitem label="Deshacer"/>
28 <menuitem label="Rehacer"/>
29 </menupopup>
30 </menu>
31 </menubar>
32 </toolbox>
33 <box flex="1">
34 <vbox flex="1">
35 <hbox>
36 <label value="Mode"/>
37 <menulist editable="false"
flex="1">
38 <menupopup>
39 <menuitem label="Simple"/>
40 <menuitem label="Avanzado"/>
41 <menuitem label="Experto"/>
42 </menupopup>
43 </menulist>
44 </hbox>
45 <listbox>
46 <listitem label="Facturas"/>
47 <listitem label="Gastos"/>
48 <listitem label="Pequeos
Gastos"/>
49 <listitem label="Otro"/>
50 </listbox>
51 </vbox>
52 <splitter collapse="before">
53 <grippy/>
54 </splitter>
55 <vbox flex="1">
56 <hbox>
57
58 <button id="addbutton"
label="Aadir"/>
59 <button id="deletebutton"
label="Eliminar"/>
60 <button id="editbutton"
label="Editar"/>
61 </hbox>
62 <textbox id="posttext"
multiline="true" flex="1"/>
63 <hbox>
64 <button id="findbutton"
label="Previsualizar"
default="true"/>
65 <button id="cancelbutton"
label="Publicar"/>
66 </hbox>
67 </vbox>
68 </box>
69 </window>
Listado 3: third.xul Completo
80 Nmero 03 www.linuxmagazine.com.es
XUL LI NUX USER
item label= Simple/> <menuitem
label= Avanzado/> <menuitem
label= Experto/> </menupopup>
</menulist> </hbox>
El componente que falta por aadir es
la caja de listado. Para crearlo usamos la
etiqueta <listbox> y aadimos cada
objeto a la etiqueta <listitem>:
<listbox>
<listitem label= "Factura"/>
<listitem label= "Gastos"/>
<listitem label= "PequeosU
Gastos"/>
<listitem label= "Otros"/>
</listbox>
Con anterioridad abrimos la etiqueta
<vbox> en el cdigo para disponer las
cajas combo y de listado una encima de
la otra. Ahora debemos cerrar esta eti-
queta usando la etiqueta de cierre
<vbox>:
</vbox>
Hasta ahora hemos credo componentes
que aparecen en la parte izquierda de
nuestro interfaz. En casos en los que
claramente separemos un lado del inter-
faz del otro debemos usar la etiqueta
<splitter> para tener un separador
ajustable entre las dos zonas. Una de las
posibilidades de esta etiqueta es que
podemos colapsar un lado y especifi-
camos el atributo <collapse> (colap-
sar) para especificar los componentes
antes de la etiqueta en el cdigo (nuestra
caja combo y listado). Tambin hemos
aadido la etiqueta <grippy> (agarra-
dera) para proporcionar una manera de
mover el separador:
<splitter collapse="before">
<grippy/>
</splitter>
Para componentes situados a la derecha
del separador vamos a agrupar grupos de
componentes unos encima de otros.
Primero creamos la etiqueta <vbox>:
<vbox flex="1">
Nuestro primer grupo de componentes
esta formado por los tres botones que
aparecen cerca del marco superior de la
ventana. Creamos la etiqueta hbox
para disponerlos unos al lado de los
otros y luego aadimos la etiqueta but-
ton:
<hbox>
<button id="addbutton"U
label="Aadir"/>
<button id="deletebutton"U
label="Eliminar"/>
<button id="editbutton"U
label="Editar"/>
</hbox>
El siguiente componente es un compo-
nente de entrada de datos de mucho
texto. ste es el tipo de componente que
se utilizara para introducir texto en un
editor de textos, por lo que nos debemos
asegurar de que el componente es capaz
de soportar ms de una lnea de texto.
Podemos hacer esto con el atributo mul-
tilnea:
<textbox id="posttext"U
multiline="true" flex="1"/>
Nuestro conjunto final de componentes
es una coleccin de botones que funcio-
nan de la misma forma que los botones
Aadir, Eliminar y Editar que hemos
creado con anterioridad:
<hbox>
<button id="findbutton" label=U
"Previsualizacin"U
default="true"/>
<button id="cancelbutton" U
label="Publicar"/>
</hbox>
Para completar nuestro cdigo ahora
debemos aadir la etiquetas de cierre
<vbox>, <box> y <window>:
</vbox>
</box>
</window>
El listado 3 es el cdigo completo. Cuan-
do ejecutemos este cdigo debemos ver
algo parecido a lo que se muestra en la
figura 3.
El Siguiente Paso
En este nmero hemos agrupado
todos nuestro conocimientos actuales
de construccin de interfaces en
XUL. A medida que continuemos
explorando XUL veremos las fun-
cionalidades de aplicaciones XUL en
ms detalle, incluyendo el uso de
PHP para conseguir archivos XUL
ms dinmicos.
Hasta que continuemos el prximo
mes debemos seguir jugando con las
diferentes etiquetas de interfaz de XUL
y experimentando con distintas combi-
naciones de componentes. Cuantas
ms experiencia tengamos mejor
vamos a ser capaces de resolver pro-
blemas. I
Figura 3: Un interfaz XUL completo.
81 www.linuxmagazine.com.es Nmero 03
LI NUX USER Educacin
dremos de paquetes wims con la mayo-
ra de los mdulos y de las ayudas tra-
ducidas al castellano. En ese momento
ser muy fcil instalar el servidor en una
mquina de nuestro centro, y aprovechar
la agilidad que proporciona una red local
y por otro lado el control sobre accesos,
incorporacin de actividades, etc. que
permite ser nuestros propios adminis-
tradores. Slo ser necesario instalar
WIMS en un ordenador: los dems
usuarios se conectarn a travs del nave-
gador web desde cualquier sistema ope-
rativo. Por otro lado el tema de los per-
misos tambin queda resuelto: dejando
aparte la administracin pura y dura del
servidor, las cuentas son las del profesor-
supervisor de las hojas de ejercicios, y
las de los alumnos, a los que los profe-
sores proporcionan la contrasea para
participar en las clases virtuales (otras
cuentas mencionables son las de los
administradores propiamente dichos del
servidor WIMS y las de los desarrolla-
dores de mdulos).
Plantemonos el caso de un centro
educativo de varios niveles donde se
dispone de un servidor WIMS. Varios pro-
fesores crean clases virtuales, como
vimos en la segunda parte de esta serie, y
se encargan de que los alumnos se
inscriban en la clase; hasta que no se par-
ticipa de una clase virtual no se habilita el
sistema de registro y seguimiento de la
evolucin de los alumnos. Seguidamente
el profesor crea varias hojas de ejercicios,
de distintos niveles de dificultad en la
seleccin de los ejercicios y en el grado de
dificultad que los mdulos individuales
permiten configurar. Para crear las hojas
dispone de todos los mdulos y activi-
dades instalados en el servidor, y a su vez
puede crear o adaptar de forma interacti-
va actividades mediante dos lenguajes
integrados en el sistema: uno ms senci-
llo, el OEF de Createxo, que fue el que
mostramos en su momento, y otro, Mod-
tool, que utiliza la verdadera potencia de
WIMS pero que escapa de las posibili-
dades expositivas de una introduccin
que se est haciendo demasiado larga y
que por supuesto est documentado en el
E
l servidor WIMS tambin calcula la
calidad de los puntos y la muestra
cuando acaba el ejercicio. El profe-
sor puede servirse de estas dos cate-
goras de datos (el nmero de puntos
obtenidos y la calidad de los mismos)
para controlar el progreso de los alum-
nos. Los alumnos pueden tambin com-
parar su puntuacin con la puntuacin
media de la clase.
Releo el prrafo anterior. Lo encuentro
abstracto, quizs necesario, pero no con-
vincente. La forma de captar la utilidad
de la aplicacin es con ejemplos prcti-
cos en una situacin real, a esto dedi-
caremos el resto del artculo.
WIMS en la prctica
Aunque en este tiempo de plurilingis-
mo no hay mucha excusa para no uti-
lizarlo ya, dentro de poco tiempo dispon-
En los artculos anteriores hemos aprendido a generar y a
configurar los ejercicios interactivos y las hojas de trabajo
asignando a cada actividad un peso en puntos. La expli-
cacin era que la realizacin de una tarea va acompaada del
registro de los puntos correspondientes hasta que el nmero
de puntos que se obtiene llegue al nmero requerido para
dar el ejercicio por superado con xito.
POR JUAN RAFAEL FERNNDEZ
El servidor interactivo multipropsito de actividades WIMS
Ejemplo Prctico con
WIMS
Lo que anuncibamos como una primicia se va poco a poco convirtiendo en una realidad: a inicia-
tiva de la Junta de Extremadura y dirigidos por Antonio Ulln, un equipo de traductores formado
por Pepe Grimaldos, Javier Snchez, Jos Rafael Rodrguez, Carlos Entrena, Antonio Saorn y en el
que tengo el honor de colaborar estamos procediendo a la traduccin de los mdulos y de la inter-
faz de usuario de WIMS. Esperemos que para cuando este artculo llegue a los kioskos el proceso
est terminado o prximo a su conclusin; algunas de las capturas de pantalla que acompaan a
este artculo son verdaderos estrenos.
Cuadro 1: Traduccin de WIMS
82 Nmero 03 www.linuxmagazine.com.es
Educacin LI NUX USER
propio servidor (enlace mdulos a
toda potencia). El resultado sera
algo similar a la figura 1.
Como sera una sesin? Los
alumnos se conectan al servidor, y
trabajan individualmente o por
equipos en la hoja asignada.
Recordemos que las hojas pueden
incluir lecciones y apuntes, que el
profesor puede configurar en qu
momento comienzan a registrarse
los resultados de los ejercicios y
puede habilitar un tiempo de
ensayo previo, y que puede
decidirse el tiempo que va a dedi-
carse a la realizacin de cada ejer-
cicio o grupo de ejercicios. Un
detalle importante es que los pro-
cesos de consulta, razonamiento,
borradores y desarrollos de clcu-
los, discusin entre alumnos sobre
la solucin o la forma de alcan-
zarla son provocados por el sis-
tema pero no se realizan necesaria-
mente en l. Los alumnos trabajan
con los medios habituales, papel,
libretas, pizarra, calculadoras, su
propio cerebro. Nuestro alumno
Pepe Pruebas vera la clase virtual
como en la figura 2. Cuando la
repeticin (recordemos, no reitera-
tiva) lleva a un grado de confianza
suficiente el alumno realiza un
examen (figura 3), nunca igual que
el alumno de al lado.
Balance pedaggico en
diez puntos
Parto en esta seccin del balance
que del uso para la enseanza de
matemticas del servidor WIMS se
ha efectuado en el sitio http://
www.poitou-charentes.iufm.fr/
wims/cd/bilan/bilan.htm.
1. Un servidor WIMS permite
individualizar la enseanza. Como
el resto de las herramientas infor-
mticas, WIMS colabora a la aten-
cin a la diversidad. Adems la
gran riqueza de actividades y la
generacin aleatoria de parmetros
conllevan que cada alumno realice
un recorrido propio o un ritmo
individualizado por el entorno
WIMS. Por otro lado esta variacin per-
mite que la repeticin de los ejercicios
hasta la comprensin de las nociones en
juego no se haga frustrante.
2. Un servidor WIMS es una herra-
mienta para trabajar sobre determinados
tipos de ejercicios. A pesar de su gran
potencia, no es la panacea, ni puede
esperarse que sta exista. WIMS
necesita una determinada codifi-
cacin de las tareas; por otro lado
su modularidad hace que puedan
desarrollarse nuevas herramientas
(programas satlite les llama
Georges Khaznadar) que permitan
su aplicacin a nuevos campos.
Un campo en especial donde debe
progresar es en el lingstico, en el
que los mdulos dedicados y las
herramientas aplicadas son insufi-
cientes.
Independientemente de lo ante-
rior la usabilidad por los usuarios
finales es alta, y la creacin de
recursos con Createxo es relativa-
mente fcil, aunque la herramien-
ta es mejorable en su intuitividad.
Tambin sera deseable un mdulo
de importacin de actividades de
generacin externa (pienso espe-
cialmente en cdigo html y
javascript) ms sofisticado que el
mero cortar y pegar.
3. Un servidor WIMS constituye
una interfaz muy potente y unifi-
cada para el uso de numerosos pro-
gramas, en especial matemticos y
cientficos, que de otro modo son
difciles de utilizar. Adems el
hecho de que pueda utilizarse
desde cualquier navegador implica
que las actualizaciones no conlle-
van ninguna modificacin en los
clientes y benefician automtica-
mente a todos los usuarios.
4. WIMS es un programa seguro y
ligero para los usuarios. A diferencia
de los programas realizados en java,
flash o javascript, que exigen la
presencia de plugins y de potencia
de clculo en los ordenadores de los
usuarios, las actividades WIMS se
ejecutan en el servidor. Slo es
necesario un navegador con
javascript habilitado para conec-
tarse a un servidor WIMS, que ser
el que realice los clculos o genere
los grficos. Por supuesto la
mquina que haga de servidor s
debe ser potente y tener instalados
los programas que van a utilizarse.
5. Una sesin de trabajo con un
servidor WIMS no elimina el trabajo de
clculo, razonamiento, etc. del alumno.
Esto contradice uno de los temores ms
comunes de los detractores del uso de
Figura 1: Una clase virtual vista por el profesor.
Figura 2: La clase vista por el alumno.
Figura 3: El examen.
83 www.linuxmagazine.com.es Nmero 03
LI NUX USER Educacin
(http://adullact.net/projects/
epistemon/), mediante la creacin de
una interfaz entre la plataforma y el
servidor WIMS, puesta en prctica en la
Universidad del Litoral francs (ver la
figura 4). Los alumnos pueden trabajar
en un ejercicio WIMS dentro de una
sesin de epistemon (figura 5); cuando
cierran la ventana de WIMS todos los
datos del ejercicio son enviados al LMS
para que los procese.
10. WIMS es esencialmente obra de
una sola persona; este carcter personal
tiene consecuencias positivas y negati-
vas. En este sentido es una aplicacin
muy creativa y original, diseada expre-
samente para integrar mltiples
aportaciones (interfaz a otros eje-
cutables, creacin interactiva de
actividades); pretende dar
respuesta a casi todas las exigen-
cias de la enseanza realizada con
ayuda del ordenador: generar
actividades, clasificarlas y presen-
tarlas al alumno, controlar acceso
a clases, evaluar y seguir la evolu-
cin de los estudiantes. Tareas tan
distintas admitiran, en la tradi-
cin Unix (pequeos programas
que hacen una sola cosa pero la
hacen bien y que son compatibles
y complementarios), una solucin
ms modular y fiel a estndares.
Por poner unos ejemplos la tra-
duccin de los mdulos es innece-
sariamente complicada porque los
mensajes no estn separados del
cdigo de ninguna manera identi-
ficable: es necesario comparar las
versiones inglesa y francesa para
averiguar qu fragmentos hay que
traducir y cules no. Las activi-
dades estn escritas en un lengua-
je de alto nivel de creacin propia
y sintaxis similar a la de LaTeX
pero totalmente independiente de
todo lo conocido. Por otro lado es
difcil plantearse una comparacin
o un acercamiento a los estn-
dares educativos IMS o SCORM.
Esperamos que esta no tan breve intro-
duccin a WIMS haya sido interesante y
til. En el prximo nmero vamos a
tratar un tema cada vez ms urgente en
nuestras escuelas: cmo escribir otras
lenguas y alfabetos? Antes era una pre-
gunta que slo hacan los profesores de
griego y los traductores, ahora es una
exigencia de la integracin de nuestros
nuevos alumnos chinos, rabes,
eslavos I
los ordenadores en clase: se ha
observado que en una sesin
WIMS los alumnos dedican ms
tiempo a pensar y al papel que al
ordenador propiamente dicho.
6. Me voy a inventar la termi-
nologa: WIMS es agnstico a la
presencia. Dicho en un idioma terr-
queo algo pedago-retrico, el sistema
de clases virtuales facilita el trabajo
tanto a distancia como presencial y
permite un uso flexible de los recur-
sos, los espacios y los tiempos.
7. El enseante que utiliza un
servidor WIMS puede trabajar con
el gran nmero de ejercicios y
mdulos libres disponibles (varios
cientos), modificarlos, o escribir l
mismo o solicitar la creacin de
cdigo que se adapte a sus obje-
tivos pedaggicos. Hay una comu-
nidad internacional creciente de
usuarios y desarrolladores de
mdulos WIMS.
8. El seguimiento completo de los
alumnos de una clase virtual per-
mite al profesor conocer fcilmente
los progresos y dificultades de un
alumno. WIMS proporciona estads-
ticas sobre el nivel de dificultad, el
grado de xito y el tiempo dedicado
a la resolucin de los ejercicios.
9. El servidor WIMS puede hacer
funciones de un pequeo gestor de
contenidos educativos, permitir la comu-
nicacin entre alumnos en un foro, subir
documentos, etc. Tambin es posible
integrarlo en una plataforma educativa
(lo que en ingls se llama un Learning
Management System, LMS); mediante un
modo que permite la colaboracin con
una de estas plataformas: lo que Xiao
llama el protocolo para la conexin
directa de WIMS con otros servidores
web (http://localhost/wims/wims.
cgi?lang=es&+module=adm/
raw&job=help).
Nos informa Khaznadar (en correo
personal) de que se est trabajando en
la compatibilidad con epistemon
Figura 4: La plataforma educativa epistemon.
Figura 5: WIMS integrado con epistemon.
Aquellos profesores de mentalidad prctica y que se atrevan directamente con el francs disponen
en http://wims.auto.u-psud.fr/wims/faq/fr/program.html de programaciones de Secundaria y
Bachillerato (recordatorio: Sixime corresponde a nuestro Sexto de Primaria, y es el primer curso de
Secundaria en el sistema francs; la cuenta de cursos es descendente, sixime, cinquime).
Cuadro 2: Programaciones en WIMS
Juan Rafael Fernndez Garca es pro-
fesor de educacin secundaria y
tiene una larga experiencia en la tra-
duccin y documentacin del soft-
ware libre. De hecho est colaboran-
do en la traduccin de los mdulos y
la interfaz de WIMS. Ha sido coordi-
nador de uno de los Centros que par-
ticipan en la experiencia andaluza de
integrar las TIC en la educacin y
actualmente trabaja como asesor de
formacin del profesorado.
E
L

A
U
T
O
R
84 Nmero 03 www.linuxmagazine.com.es
su, sudo LI NUX USER
L
os privilegios de root son necesarios
para tareas administrativas, pero no
tiene sentido ser el superusuario
todo el tiempo. Es preferible convertirse
en root para una tarea administrativa y
luego volver a ser un usuario normal.
Dos ordenes , su y sudo, le permiten
cambiar de identidad.
su
La orden su (substitute user) le per-
mite cambiar su ID en la lnea de
ordenes. La orden lanza un nuevo intr-
prete de ordenes en segundo plano usan-
do nuevos IDs de usuario (UID) y de
grupo (GID). Cuando teclee su para con-
vertirse en superusuario, u otro usuario
con privilegios, deber conocer la con-
trasea para la cuenta de ese usuario.
La sintaxis bsica del comando es su
[-] [nombredeusuario]; pero hay una
sutil diferencia, dependiendo de si
teclea el signo menos o no . El signo
menos (o alternativamente el parmetro
-l o su forma larga --login) se asegura de
que realmente entra en el sistema, fijan-
do as las variables de entorno apropia-
das y el intrprete de ordenes y cam-
biando al directorio de trabajo de ese
usuario (su directorio home). Las
variables de entorno no cambiaran si
omite el signo menos y esto podra sig-
nificar que el nuevo usuario no tiene
ningn privilegio para el directorio
actual (Vase la Figura 1).
Si no suministra un nombre, se supon-
dr root, la cuenta del superusuario. Esto
tambin es lo qu conduce a la falsa idea
que su es realmente una abreviatura de
superuser. Por omisin la orden su no
permite al nuevo usuario lanzar aplica-
ciones X. Los usuarios externos primero
deben tener permiso para utilizar el
servidor de X para salida y esto significa
editar el archivo .Xauthority en el direc-
torio de trabajo adecuado (vase tam-
bin man xauth). Para permitir al
usuario root lanzar un programa X en un
su, sudo
Identidad
Para ms seguridad, aunque tenga privilegios de
root para un sistema, tiene sentido utilizarlos solo
temporalmente para prevenir daos accidentales.
su y sudo le permiten cambiar la identidad rpida-
mente desde la lnea de ordenes.
POR HEIKE JURZIK
85 www.linuxmagazine.com.es Nmero 03
LI NUX USER su, sudo
que el nombre sugiere: sudo es la
abreviatura de substitute user, do
(sustituye el usuario, haz) y facilita a
usuarios individuales o grupos los privi-
legios administrativos por un perodo
limitado y limitndose a una tarea
especifica. Un usuario puede entonces
simplemente teclear su propia con-
trasea para lanzar una orden privilegia-
da.
El usuario admin necesita crear una
lista de usuario autorizados a ejecutar
ordenes especificas privilegiadas en el
archivo /etc/sudoers. Mientras trabaja
como root, edite el archivo con la orden
visudo. este programa ofrece las carac-
tersticas habituales del editor vi con
algunas funciones adicionales. visudo
bloquea el fichero /etc/sudoers para
evitar que sea editado por multiples
usuarios a la vez. Adems visudo com-
prueba la sintaxis del fichero al terminar
y le informa de cualquier error si lo
encuentra:
>>> sudoers file: syntaxU
error, line 20 <<<
What now?
Dispone de tres alternativas: pulsar e
para editar el fichero de nuevo, x para
cancelar los cambios y salir del editor o
Q para salvar los cambios a pesar del
error.
Hay una entrada predeterminada para
root ALL=(ALL) ALL en /etc/sudoers.
Esto permite hacer todo al usuario root,
pero por supuesto root tambin
puede hacerlo sin sudo. Si necesita
conceder a otro usuario privilegios de
root sin restricciones en una
mquina, simplemente copie esta
lnea y sustituya root por el nombre
de ese usuario. Despus de salvar el
archivo, este usuario podr ejecutar
rdenes de administracin mediante
sudo, por ejemplo:
huhn@asteroid:~$ sudoU
/sbin/shutdown
Password:
Si no se permite al usuario usar sudo,
aparecer un mensaje como este: sudo:
huhn is not in the sudoers file. This inci-
dent will be reported. (sudo: huhn no
est en el archivo sudoers. Se informar
de este suceso). La medida predetermina-
da, que puede ser cambiada en
/etc/sudoers, es enviar un correo alertan-
do al administrador con los detalles del
usuario que ha intentado lanzar sudo
(vase la Figura 2). Para estar seguros,
los usuarios sin privilegios pueden
teclear sudo -l para mostrar una lista de
las ordenes permitidas.
Control Minucioso
La seccin Host alias specification de
/etc/sudoers le permite especificar las
mquinas donde las ordenes especfi-
cas de sudo deben aplicarse. Podemos
utilizar el Host_Alias para crear un
grupo de ordenadores mediante la
especificacin de sus nombre o
definiendo un rango de direcciones IP.
Esta caracterstica solamente tiene
sentido si aplicamos una configu-
racin centralizada de sudo en mlti-
ples ordenadores.
La seccin User_Alias le permite crear
grupos que necesiten los mismos privile-
gios. Primero definimos el tipo de alias
(p. e. User_Alias), despus un nombre
de alias (que puede contener mayscu-
las, subrayados y nmeros), un mapeo
indicado por el signo = y finalmente
los nombres de usuario separados por
comas. Vamos agregar los usuarios huhn
y petronella a un grupo que se le permite
parar la mquina:
# User alias specification
User_Alias SHUTTERSDOWN=U
petronella,huhn
Xterm que pertenezca al usuario
petronella, necesita extraer una clave
desde .Xauthority, aadirla al .Xau-
thority del administrador y entonces
redefinir la variable DISPLAY (vase
el Listado 1).
su tambin le permite usar otra
cuenta para lanzar una sola orden.
Para hacer esto, indique la opcin -c
(--command):
huhn@asteroid:~$ su -c"lessU
/var/log/messages"
Password:
El uso de la orden su se anota en la bit-
cora (log). En funcin de la distribucin
que use, esas entradas de bitcora se
localizaran en /var/log/auth.log (p. e. en
Debian) o en /var/log/messages (p. e. en
Suse Linux). Los intentos invlidos son
fcilmente localizados, permitiendo al
usuario admin ver rpidamente quien ha
intentado apropiarse indebidamente de
los privilegios de root
Dec 22 14:50:50 asteroidU
PAM_unix[2108]: authenticationU
failure;
(uid=500) -> root for su service
Dec 22 14:50:52 asteroidU
su[2108]: pam_authenticate:U
Authentication failure
Dec 22 14:50:52 asteroidU
su[2108]: - pts/8 huhn-root
Si es el usuario admin, no necesita intro-
ducir una contrasea despus de teclear
la orden su. Usted puede asumir
cualquier identidad para probar rpida-
mente una modificacin desde la pers-
pectiva de otro usuario.
sudo
La orden sudo le permite evitar dar a
conocer la contrasea de root de una
mquina, lo cual es comprensible por
motivos de seguridad. La orden realiza lo
Figura 1: Sin el apropiado ingreso en el sistema, no tiene
ningn privilegio.
UID: Cada usuario se identifica mediante un UID (User IDentification number), que lo mapea de
manera nica a la cuenta del usuario. Puede encontrar fcilmente su propio ID tecleando echo
$UID
GID: Adems del UID, los usuarios tienen un GID (Group IDentification number) que indica su
pertenencia a un grupo. Los miembros de un grupo pueden compartir privilegios. La orden id
indica su UID y su GID actual.
GLOSARIO
que el archivo se analiza desde arriba
hacia abajo. Esto le permitir mantener
el grupo SHUTTERSDOWN, al cul se le
puede permitir ejecutar otras ordenes,
mientras que al mismo tiempo se
restringe a petronella el permiso para
apagar la mquina. Si petronella intenta
ejecutar la orden, simplemente le
mostrar un mensaje como el siguiente:
Sorry, user petronella is not allowed to
execute /usr/sbin/visudo as root on
asteroid.linux-magazine.com. (Lo sien-
to, el usuario petronella no tiene per-
miso para ejecutar /usr/sbin/visudo
como root en asteroid.linux-
magazine.com).
Si quiere eliminar el indicador
(prompt) de contrasea para una o
varias ordenes, simplemente active el
indicador NOPASSWD:
SHUTTERSDOWN ALL=NOPASSWD:DOWN
En vez de reducir el nivel de la seguri-
dad que sudo proporciona, puede incre-
mentarlo, obligando al usuario que
introduzca la contrasea cada vez que
ejecute sudo. Por omisin sudo ejecuta
una especie de sistema de boletos con
un intervalo que asegura, por ejemplo,
que no pueda abrirse en la mquina una
consola del intrprete de ordenes con
privilegios de root que pueda compro-
meter todo el sistema sin excepcin. La
validez predeterminada para el boleto
para la mayora de las distros es de 15
minutos. Pero se puede configurar a 0
minutos aadiendo la siguiente lnea a
/etc/sudoers:
Defaults timestamp_timeout = 0
Opcional
sudotambin tiene algunos parmetros
de lnea de ordenes. Probablemente el
ms importante de ellos sea -s, que le
permite lanzar un intrprete de ordenes
como root. No es necesario configurar
accesos al servidor X, solamente teclear
sudo -s ser suficiente para que el
administrador lance programas sobre el
servidor grfico.
El conmutador -L lista todas las
opciones en el archivo /etc/sudoers. Si
quiere extender su boleto sin ejecutar
una orden, solo tiene que introducir sudo
-v. Si el intervalo se ha agotado, se le
indicara que teclee la contrasea. Tam-
bin puede dar de baja un boleto
tecleando sudo -k. El indicador -b le per-
mite ejecutar una orden en segundo
plano; sin embargo, no podr moverlo
de nuevo al primer plano con la orden
normal de control de trabajos del intr-
prete de ordenes, fg. I
El prximo paso es definir un alias para la
orden shutdown en la seccin Cmnd alias
specification. Para hacer esto, introduzca
la ruta absoluta al programa requerido:
# Cmnd alias specification
Cmnd_Alias DOWN = /sbin/shutdown
Para decirle a sudo que los SHUTTERS-
DOWN estan autorizados a ejecutar esta
orden, necesitamos otra entrada debajo
de User privilege specification:
SHUTTERSDOWN ALL = DOWN
Los usuarios del grupo SHUTTERS-
DOWN ahora pueden apagar la mquina
tecleando sudo /sbin/shutdown. Pero
hay una forma ms fcil de otorgar a un
solo usuario permiso para ejecutar una
sola orden. Por ejemplo, la entrada:
huhn ALL = /usr/sbin/visudo
otorga al usuario huhns permiso para
editar el archivo /etc/sudoers usando la
orden sudo /usr/sbin/visudo.
Libre o Restringido?
Una simple entrada en /etc/sudoers le
permite restar privilegios a un usuario
individual. La sintaxis para hacer esto es
como sigue:
SHUTTERSDOWN ALL = DOWN
petronella ALL = !DOWN
Es importante especificar la excepcin
inmediatamente despus de la regla, ya
86 Nmero 03 www.linuxmagazine.com.es
su sudo LI NUX USER
Figura 3: Se recomienda editar el fichero /etc/sudoers solamente con el
programa /usr/sbin/visudo. Figura 2: La seguridad es muy valiosa; sudo informa de los accesos ilegtimos.
01 petronella@asteroid:~$ xauth
02 extract key $DISPLAY
03 huhn@asteroid:~$ su -
04 Password:
05 asteroid:~# xauth merge
06 home/huhn/key
07 asteroid:~# export
DISPLAY=:0.0
Listado 1: Display
E
n esta penltima entrega vamos a
abordar en primer lugar la creacin
de tablas con LaTeX. Despus
trataremos la escritura matemtica,
donde podremos comprobar que LaTeX
es infinitamente mejor y ms potente
que cualquier editor cientfico del tipo
WYSIWYG. Posteriormente, en el prxi-
mo nmero, terminaremos nuestra serie
sobre LaTeX viendo cmo incluir la
bibliografa en nuestro documento (bien
directamente o crendonos nuestra
propia base de datos) y terminaremos
con un ejemplo de un proyecto donde se
usan todos los conceptos que hemos
tratado en esta serie de artculos.
Cmo construir tablas con
LaTeX?
Las tablas son construcciones alineadas
que aunque no son demasiado fciles de
construir con LaTeX, sin embargo ste
permite una enorme flexibilidad en su
construccin y manipulacin. Como
siempre lo mejor ser que vayamos
aprendiendo viendo un ejemplo:
%Sintaxis de una tabla bsica
\begin{tabular}[<I>Posicin<I>]U
{<I>FormatoColumnas<I>}
Fila1_Columna1 & Fila1_Columna2U
& \dots & Fila1_ColumnaN \\
Fila2_Columna1 & Fila2_Columna2U
& \dots & Fila2_ColumnaN \\
\dots & \dots & \dots & \dots \\
FilaM_Columna1 & FilaM_Columna2U
& \dots & FilaM_ColumnaN
\end{tabular}
Como se puede comprobar, el entorno
que LaTeX usa para construir tablas es
el entorno tabular con determinados
argumentos obligatorios y opcionales
que vamos a ir viendo. La Posicin es
un argumento opcional e indica la posi-
cin vertical de la tabla respecto de la
lnea en la que se ha incluido. Puede
tomar uno de los tres valores si-
guientes:
t: la lnea inferior de la tabla se
alinea con la lnea base de la lnea actu-
al.
b: la lnea superior de la tabla
se alinea con la lnea base de la lnea
actual.
c: es la opcin que se toma por
defecto y alinea la tabla de manera cen-
trada respecto de la lnea base.
El argumento FormatoColumnas se
refiere a la alineacin de las columnas.
Siempre debe aparecer una entrada por
cada columna de la tabla. Se pueden
incluir ciertos elementos opcionales
(separadores para delimitar los bordes
entre cada columna -los veremos en el
siguiente ejemplo-). Las posibilidades
son:
l: alineacin a la izquierda.
r: alineacin a la derecha.
c: alineacin centrada de la
columna.
p{ancho}: crea una columna de
anchura ancho. El texto que se coloque
dentro se trata como un prrafo (sin san-
gra inicial) con la lnea superior alinea-
da con las otras columnas.
Los Separadores son elementos
opcionales. Pueden tomarse entre los
siguientes:
|: introduce una lnea vertical.
||: introduce dos lneas verti-
cales.
@{texto}: elimina el espacio
entre columnas e inserta el texto seala-
do entre las columnas especificadas.
Una vez vistos todos los argumentos del
entorno tabular es el momento de pasar
Con este artculo continuamos nuestro paseo por el mundo de la
escritura con LaTeX. En las dos entregas anteriores hemos apren-
dido que LaTeX es un sistema de escritura profesional en el que, a
pesar de no ser de tipo WYSIWYG, se obtienen resultados de cali-
dad brillante con poco esfuerzo y donde fundamentalmente el
escritor se dedica a contar en su documento lo que le interesa sin
preocuparse del formato, que para eso LaTeX se ocupa de todo.
POR JOSE MANUEL GONZLEZ VIDA
LaTeX en Linux (3 Parte)
La Tabla de Multiplicar
(y otras)
87 www.linuxmagazine.com.es Nmero 03
LI NUX USER LaTeX
hemos construido. Con el smbolo &
separamos las distintas columnas en una
fila. Podemos dejar una casilla vaca
colocando dos && o bien dejando un
espacio en blanco entre ellos. Con las
dos barras \\ indicamos a LaTeX que
comienza una nueva fila.
Para separadores horizontales tenemos
el comando \hline que dibuja una lnea
horizontal entre fila y fila. Debe aparecer
justo antes de la primera fila o justo
despus de \\ si est entre dos filas. Dos
comandos \hline seguidos dibujan dos
lneas horizontales con un pequeo
espacio entre ellas. \cline{n - m} dibuja
una lnea horizontal entre las columnas
n y m. Si retocamos el ejemplo anterior
cambiando la tabla usando el siguiente
cdigo:
\begin{tabular}{|l|c|c|r|}
\hline
{\bf Nombre} & {\bf Apellidos}U
& {\bf DNI} & {\bfU
Calificacin} \\
\hline \hline
Juan & Lpez & 43434322L &U
5.3 \\ Emilio & Prez &U
45989845K & 7.2 \\
Gema & Gutirrez &U
21388383A & 8.1 \\
\hline
\end{tabular}
a la prctica escribiendo en nuestro edi-
tor de texto el siguiente ejemplo:
01 \documentclass[a4paper,12pt]
{article}
02 \usepackage[latin1]{inputenc}
03 \usepackage[T1]{fontenc}
04 \usepackage[spanish]{babel}
05 \begin{document}
06 \begin{tabular}{|l|c|c|r|}
07 {\bf Nombre} & {\bf
Apellidos}
& {\bf DNI} & {\bf
Calificacin} \\
08 Juan & Lpez & 43434322L &
5.3 \\
09 Emilio & Prez & 45989845K &
7.2 \\
10 Gema & Gutirrez & 21388383A
& 8.1
11 \end{tabular}
12 \end{document}
El resultado de compilar el ejemplo ante-
rior lo tenemos en la Figura 1. Podemos
observar en el listado de nuestro ejemplo
que no hemos usado los argumentos
opcionales y que en el formato de las
columnas hemos escogido separadores
simples para las columnas verticales.
Otro detalle importante que conviene
observar es la utilizacin de los smbolos
& y \\ en las distintas filas de la tabla que
88 Nmero 03 www.linuxmagazine.com.es
LaTeX LI NUX USER
Figura 1: Un primer ejemplo de una tabla. Figura 2: Una tabla con una multicolumna.
Instruccin Uso
_{subndice} Texto en subndice
^{superndice} Texto en superndice
\sqrt[n]{radicando} Raz ensima del radicando
\frac{numerador}{denominador} Cociente entre el numerador y el denominador
Tabla 1. Algunas frmulas matemticas sencillas
Obtenemos una tabla. Ahora me gustara
que probaseis a sustituir la tabla de
nuestro ejemplo por la siguiente
\begin{tabular}{|l|c|c|r|}
\hline
{\bf Nombre} & {\bfU
Apellidos} & {\bf DNI}U
& {\bf Calificacin} \\
\hline
Juan & Lpez & 43434322LU
& 5.3 \\
Emilio & Prez & 45989845KU
& 7.2 \\
Gema & Gutirez &U
\multicolumn{2}U
{c|}{Dos celdas unidas} \\
\hline
\end{tabular}
El resultado, como podemos observar en
la Figura 2, difiere del anterior en que
hemos empleado el comando \multico-
lumn que se usa para unir varias colum-
nas de una misma fila. \multicolumn usa
como argumentos el nmero de colum-
nas a unir, la alineacin del texto a
incluir en la multicolumna y, por lti-
mo, el texto que deseamos incluir. Por
ltimo probad a sustituir la tabla anterior
por la siguiente:
\begin{tabular}{|@{\bfU
Captulo: } r@{\qquadU
Temas: }c@{ - }c|}
\hline
1 & 1 & 5 \\
2 & 6 & 9 \\
3 & 10 & 14 \\
\hline
\end{tabular}
Fijaros en que en este ejemplo los sepa-
radores de las columnas son las palabras
que hemos incluido en los argumentos
del entorno tabular.
Tablas como objetos
flotantes
Recordareis que en el artculo del
nmero anterior explicbamos el con-
cepto de objeto flotante basndonos en la
idea de que las figuras son objetos indi-
visibles y por tanto pueden flotar y ser
reubicadas en nuestro documento (den-
tro de unas determinadas pautas) con el
fin de que el aspecto global del docu-
mento cumpla nuestras expectativas. En
este sentido las tablas no deberan
(aunque hay excepciones) ser separadas
en ms de una pgina, por tanto su ubi-
cacin debe ser determinada por el com-
pilador. Para tratar las tablas como obje-
tos flotantes disponemos del entorno
table. Su sintaxis es:
%Sintaxis del entorno table
\begin{table}
Entorno tabular
\caption{Pie de la tabla}
\label{Etiqueta}
\end{table}
Las tablas, al igual que las figuras,
pueden llevar su etiqueta con el fin de
referenciarlas en nuestro documento y
tambin su pie, que nos servir tambin
para crear el ndice de tablas.
Modo Texto y Modo
Matemtico
Bsicamente LaTeX distingue el texto
matemtico segn se introduzca a lo
largo del prrafo que se est
escribiendo o en prrafos separados.
El texto de tipo matemtico intro-
ducido en la misma lnea de escritura
(modo texto) ha de ser introducido
entre los smbolos $ y $. Para intro-
ducir el texto matemtico en lneas
separadas se suele hacer encerrndo-
lo entre los smbolos $$ y $$ o bien
entre los smbolos \[ y \].
Introducimos el siguiente ejemplo
dentro de un documento LaTeX con
las cabeceras estndares que estamos
usando y lo compilamos.
Sean $x$, $y$ y $z$U
funciones de $u$ y $v$,
continuas en un dominioU
$D$ del plano $u,v$.
El conjunto de puntosU
dados por:
$$
\vec{r}(u,v)=(x(u,v),yU
(u,v),z(u)),
$$
se llama superficieU
paramtrica.
El resultado debe ser parecido al que
mostramos en la Figura 2. Observemos
que los caracteres que usa LaTeX para
la escritura en modo matemtico son
distintos a los hemos visto hasta
ahora. Se trata de letras ligeramente
cursivas y se emplea una fuente ms
redondeada.
El Entorno Equation
Es frecuente, cuando se escriben textos
cientficos, hacer referencias a determi-
nadas frmulas que aparecen en el texto.
Para ello en LaTeX emplearemos el
entorno equation. La sintaxis que tiene
este entorno es:
%Sintaxis del entorno equation
\begin{equation}
\label{Etiqueta}
Frmula
\end{equation}
Este entorno numera automticamente
las ecuaciones utilizando el contador
denominado equation. De este modo
podemos hacer referencia a las distintas
frmulas con los comandos
\ref{Etiqueta} y \pageref{Etiqueta}.
Adems tambin disponemos del
comando \eqref{Etiqueta} que, a
diferencia de los anteriores, encierra el
nmero asignado a la ecuacin entre
parntesis.
A diferencia del modo texto, en modo
matemtico LaTeX presenta un compor-
tamiento distinto, es decir, adems de
usar una fuente distinta y con letras de
tipo itlico, no respeta los espacios entre
palabras, slo deja espacios cuando lo
considera necesario. No se permite
escribir vocales acentuadas ni la en
el modo matemtico. LaTeX se ocupa de
modo automtico de elegir los tamaos
adecuados de letra adecuados a diversas
circunstancias (fracciones, superndices
o subndices, etc.).
Algunas Frmulas Sencillas
En la Tabla 1 mostramos la forma de
escribir super y subndices, races desde
cuadradas a cualquier orden, fracciones,
etc. Una vez que veamos la sintaxis a
usar en esta tabla, podemos escribir el
89 www.linuxmagazine.com.es Nmero 03
Figura 3: Un ejemplo de escritura en modo texto y en modo matemtico. Figura 4: Un ejemplo de escritura matemtica con frmulas sencillas.
matemtico. Los podemos encontrar en
la Tabla 2.
Construcciones Especiales en
Modo Matemtico
Como estaris comprobando el modo
matemtico da mucho de s en LaTeX. En
este apartado vamos a aprender a cons-
truir matrices y lo que se denominan fun-
ciones definidas a trozos. Si imaginamos
una matriz en matemticas podemos pen-
sar que para escribirla con LaTeX hay que
usar el entorno tabular que vimos antes
pero este entorno es vlido slo en modo
texto. El entorno equivalente en modo
matemtico es array. Su sintaxis es pareci-
da a la del entorno tabular. Lo vemos en el
siguiente ejemplo:
01 \documentclass[a4paper,
12pt]{article}
02 \usepackage[latin1]{inputenc}
03 \usepackage[T1]{fontenc}
04 \usepackage[spanish]{babel}
05 \usepackage{amsmath}
06 \begin{document}
07 $$
08 \left(
09 \begin{array}{ccc}
10 1 & 2 & 3 \\
11 4 & 5 & 6 \\
12 7 & 8 & 9
13 \end{array}
14 \right)
15 $$
16 \end{document}
El resultado obtenido al compilar, hablan-
do slo en trminos de formato, es una
tabla (como las del entorno tabular) pre-
cedida y terminada por unos parntesis
que se adaptan al tamao de la misma.
Pues bien, el entorno array permite ir pre-
cedido por el comando comandos \left y
terminado por \right. Observemos que en
nuestro ejemplo hemos escrito el smbolo
( justo despus del comando \left y ) justo
despus del comando \right. Son estos
comandos los que hacen que el smbolo
que colocamos justo despus adapte el
tamao del array. Adems permiten
estructuran un poco ms especiales.
Escribid el siguiente cdigo en el cuerpo
del ejemplo anterior:
$$
f(x)=
\left\{
\begin{array}{ll}
1 & \mbox{ si $x>1$} \\
0 & \mbox{ en el resto deU
los casos}
\end{array}
\right.
$$
El resultado de compilar el ejemplo ante-
rior lo tenemos en la Figura 5. Se trata de
una funcin definida a trozos, que de
hecho, no es ms que un array de dos
columnas que va precedido de un smbo-
lo de llave ({) y que no se cierra con otra
llave (fijaros que para no cerrar el array
con un smbolo usamos \right.). Adems
hemos usado otro nuevo comando
\mbox que nos sirve al igual que el \text
para poder escribir texto dentro del
modo matemtico.
Simbologa Matemtica
La simbologa matemtica en LaTeX es
increblemente extensa y abarca varios
siguiente ejemplo en el cuerpo de nues-
tro documento:
Sea $p(x)=a_0+a_1x+a_2x^2+U
\cdots +a_nx^n$.
Sea $p(x)=\sqrt{a_0}+\sqrt[3]U
{a_1}x+\sqrt{a_2}x^2+ \cdotsU
+a_nx^n$.
Sea $p(x)=\frac{a_0}{a_n}+\sqrtU
[3]{a_1}x+\sqrt{a_2}x^2+ \cdotsU
+a_nx^n$.
Lo compilamos y visualizamos el resul-
tado, que debe ser parecido al que
mostramos en la Figura 4.
El paquete amsmath
El paquete amsmath es una extensin
para LaTeX que proporciona nuevas
caractersticas para facilitar la escritura
de frmulas matemticas y mejorar la
calidad tipogrfica del documento final.
Como regla general incluiremos siempre
este paquete en nuestros documentos
cuando stos contengan frmulas y no
distinguiremos en esta seccin los
comandos propios de LaTeX de los que
nos proporciona el paquete amsmath.
Hemos visto antes que cuando escribi-
mos texto en modo matemtico LaTeX
no respeta los espacios, y entonces
cmo incluir texto en nuestras frmu-
las? La respuesta se halla en el comando
\text{texto a incluir}. El texto que
incluyamos dentro de este comando ser
tratado exactamente como los textos que
hemos visto hasta ahora.
Tambin tenemos en LaTeX otra serie
de comandos que nos proporcionan la
posibilidad de dejar espacios de distinto
tamao en nuestras frmulas en modo
90 Nmero 03 www.linuxmagazine.com.es
LaTeX LI NUX USER
Figura 5: Una funcin definida a trozos. Figura 6: Uso de estructuras de tipo teorema.
miles de smbolos que van desde las
clsicas letras griegas, todo tipo de fle-
chas, operadores binarios, funciones
matemticas y un largo etctera que
por razones de espacio no podemos
incluir aqu pero que podemos encon-
trar en el libro Una Descripcin de
LaTeX2e realizado por Toms Bautista,
sobre el trabajo inicial de Hubert Partl,
Irene Hyna, Elisabeth Schlegl y Tobias
Oetiker y del que hemos puesto un
enlace a una versin en PDF en el
punto [3] de la bibliografa de este
artculo. Adems, a modo de ejemplo,
os he incluido en la Figura 7cmo se
escriben todas las letras clsicas griegas
con LaTeX.
Teoremas y Demostraciones
Otros elementos comunes dentro de
artculos de investigacin y libros de
contenido matemtico son los teoremas
y demostraciones. Atendiendo al sis-
tema de numeracin llamaremos
entornos de tipo teorema a estructuras
de tipo teorema, proposicin, lema,
corolario, definicin, conjetura, etc. En
LaTeX tenemos el comando \newtheo-
rem que nos permitir definir en nues-
tro documento tantos entornos de tipo
teorema como necesitemos. Como siem-
pre, lo mejor es comprender su manejo
con un ejemplo:
01 \documentclass[a4paper,12pt]
{article}
02 \usepackage[latin1]{inputenc}
03 \usepackage[T1]{fontenc}
04 \usepackage[spanish]{babel}
05 \begin{document}
06 \newtheorem{teorema}{Teorema}
07
\newtheorem{lema}{Lema}[section]
08 \begin{teorema}
09 Aqu tenemos un teorema\dots
10 \end{teorema}
11 \begin{teorema}
12 Y aqu otro.
13 \end{teorema}
14 \begin{lema}[Lema de
fulanito]
15 Esto es una lema
16 \end{lema}
17 \end{document}
El resultado de compilar el texto anterior
lo mostramos en la Figura 6. Qu hemos
conseguido? Pues mediante el comando
\newthorem hemos creado nuestros pro-
pios entornos y les hemos asignado un
nombre de entorno y un contador pro-
pio. Me explico, mediante la lnea
\newtheorem{teorema}{Teorema} esta-
mos creando un nuevo entorno que se
llama teorema de tal manera que cada
vez que usamos un entorno de este tipo
actualizamos un contador que va desde
el 1,2, y creamos un texto que comien-
za con Teorema x seguido del enunciado
que queremos escribir dentro de este
entorno (fijaros en el ejemplo anterior).
Pero a veces nos puede gustar ms que
el contador de un entorno de este tipo
vaya ligado a la seccin donde se
encuentra, con el fin de que, al referen-
ciarlo, el lector sepa en qu seccin tiene
que buscarlo. Cmo se hace? Pues muy
fcil, en el ejemplo anterior hemos crea-
do un entorno con nombre lema y cuyo
contador est referenciado a las sec-
ciones (mirad en el ejemplo cmo ha
resultado). El contador resultante lleva
en primer lugar el nmero de la seccin
actual y separado con un punto el conta-
dor propio del entorno que hemos crea-
do.
Para las demostraciones podemos usar
el paquete amsmath que contiene el
entorno proof. Este entorno produce un
encabezamiento con la palabra Proof. y
produce un smbolo en forma de cuadra-
dito al final. Para redefinir el encabeza-
miento ejecutaremos el siguiente cdigo
dentro de nuestro documento (da igual si
se hace en el prembulo o en el cuerpo
del mismo):
\renewcommand*{\proofname}U
{Demostracin}
En el siguiente ejemplo os muestro cmo
se usa.
01 \documentclass[a4paper,
12pt]{article}
02 \usepackage[latin1]{inputenc}
03 \usepackage[T1]{fontenc}
04 \usepackage[spanish]{babel}
05 \begin{document}
06 \renewcommand*{\proofname}
{Demostracin}
07 \begin{proof}
08 Prueba del resultado\dots
09 \end{proof}
10 \end{document}
Conclusin
Con lo visto hasta ahora sois ya unos
casi LaTeXpertos, pero remataremos
nuestros conocimientos en la prxima
entrega donde podremos ver a LaTeX en
todo su esplendor, creando un proyecto
con captulos, ndices, figuras, tablas,
bibliografa y todo de manera automti-
ca! Adems os pondremos en nuestra
pgina http://www.linux-magazine.com.
es los listados de este proyecto para que
los tengis de referencia para vuestros
propios trabajos. I
91 www.linuxmagazine.com.es Nmero 03
LI NUX USER LaTeX
Comando Abreviatura Espacio proporcionado
\thinspace \, pequeo
\medspace \: mediano
\thickspace \; grande
\negthinspace \! espacio negativo pequeo
\negmedspace espacio negativo mediano
\negthickspace espacio negativo grande
Tabla 2. Espaciados en Modo Matemtico
[1] El libro de LaTeX. B. Cascales y otros. Ed.
Prentice Hall. 2003.
[2] LaTeX, a document preparation system. L.
Lamport. 2 Ed. Ed. Addison-Wesley. 1994.
[3] Una Descripcin de LaTeX2e. Toms
Bautista. http://www.iuma.ulpgc.es/
users/bautista/other/tex/ldesc2e/misc/
ldesc2e.pdf
RECURSOS
Figura 7: Las letras griegas con LaTeX.
Humor LI NUX MAGAZI NE
S
egn la CCCP (Cooperativa de
Corporaciones de Comunicacin y
Produccin), debida a la laguna
legal abierta por licencias tipo Creative
Commons y creciente nmero de denun-
cias infundadas de algunos autores por
los abusos practicados por parte de cier-
tas empresas del sector de las comunica-
ciones con sus obras, existe la necesidad
de un tipo de licencia intermedia, que
tanto proteja los derechos de las corpora-
ciones como defina los deberes de los
autores para con las corporaciones de la
comunicacin y que exima a stas lti-
mas de responsabilidades legales
derivadas de la mala fe y ambiguas inter-
pretaciones que hacen los autores de las
condiciones descritas en las licencias
actuales.
Para los autores, la CCCP propone el
GULAG (Granted Users License And
Guarantee - Licencia y Garanta de
Cesin a Usuarios), un texto que servir
como alternativa a las licencias CC habi-
tuales y que prevalecer sobre stas en
caso de conflicto. Jos Estalln, presi-
dente de la CCCP, nos comenta: No hay
diferencias sustanciales entre los trmi-
nos de una licencia CC actual y un
GULAG. La nica diferencia es la seguri-
dad jurdica que otorga nuestra licencia.
Como muestra, un botn:
Reproducimos a continuacin la lista de
restricciones del texto del GULAG, para
que los autores y autoras se convenzan
de de la buena fe para llegar a un
entendimiento que posee la CCCP:
. . . Restricciones
a.- Usted puede reproducir, distribuir o
comunicar pblicamente la obra sola-
mente bajo trminos de esta licencia y
debe incluir una copia de la misma, o su
Identificador Uniforme de Recurso (URI),
con cada copia o grabacin de la obra
que usted reproduzca, distribuya o comu-
nique pblicamente. Usted no puede ofre-
cer o imponer ningn trmino sobre la
obra que altere o restrinja los trminos de
esta licencia o el ejercicio de sus derechos
por parte de los cesionarios de la misma.
Usted no puede sublicenciar la obra.
Usted debe mantener intactos todos los
avisos que se refieran a esta licencia y a
la ausencia de garantas. Usted no puede
reproducir, distribuir o comunicar pbli-
camente la obra con medidas tecnolgi-
cas que controlen el acceso o uso de la
obra de una manera contraria a los tr-
minos de esta licencia.
b.- Bueno, je, en lo que se refiere a lo
anterior, vaaaale, yo a usted s le dejo
reproducir, distribuir o comunicar pbli-
camente la obra bajo trminos de esta
licencia o cualquier otra que se le ocurra.
Despus de todo quien va a saber ms de
esto? Yo no quiero ir de nada.
c.- Y en cuanto a lo de que debe
incluir una copia de la licencia, pues
mire, siempre y cuando le parezca a usted
bien, porque no veas el precio al que se
han puesto las fotocopias con la subida
de los hidrocarburos. Y si la obra le llega
en formato electrnico, mucho peor: Yo
tampoco consigo acordarme nunca de
como se copia y pega.
d.- Tampoco quisiera abusar con lo de
que no puede ofrecer o imponer ningn
trmino sobre la obra que altere o restrin-
ja los trminos de esta licencia. Vamos,
que si cree que algo se puede mejorar,
pues usted sabr. Adelante. Podra usted
avisarme cuando? Bueno, mejor me
callo que ya han hablado con mi jefe y de
momento me puedo ir despidiendo de la
cesta de Navidad con el chopped y el
Delapierre Glas.
f.- En lo que se refiere a lo de no poder
sublicenciar la obra, bueno, eso es una
errata. Se me fue el dedo y lo que debera
decir es no quiero que presionen a mi
banco para que me embarguen el piso
por ponerme demasiado pesado con lo de
mis derechos.
g.- Qu si lo de la reproduccin? S,
claro hombre: tache, tache. Ya se sabe,
eso se pone por poner. Vena escrito de
serie y yo ni me haba fijado. Oiga, si yo
firmo esto conseguirn que vuelvan a
admitir a mi padre en la lista de can-
didatos para un trasplante de corazn?
h.- Muy bien, muy bien, hagan lo que
quieran con mi obra: modifquenla,
maniplenla, distribyanla, tergivrsen-
la, saquen mis palabras de contexto o
hagan que diga justo lo contrario de lo
que dije en el original, con mi consen-
timiento expreso o sin l, citndome como
el autor o a su sobrino el de Cuenca, me
da igual. Pero por favor, por favor, por
favor, devulvanme a mi familia. . . .
No hay nada que temer.
(Dedicado a Merc Molist y a Bill
Gates. A la primera desendole lo mejor
en su lucha para que prevalezcan sus
derechos - ver http://barrapunto.com/
article.pl?sid=04/11/12/1522255 -. Al
segundo por mi ra con qu nos
sal e ahora: http://news.com.com/
Gates+taking+a+seat+in+your+de
n/2008-1041_3-5514121.
html?tag=nefd.ac.) I
92 Nmero 03 www.linuxmagazine.com.es
Nuevas licencia, nuevos retos
Autores al Gulag
95 www.linuxmagazine.com.es Nmero 03
COMUNI DAD Proyectos
FlightGear rpidamente se convirti en
un proyecto con ambiciones globales.
Innumerables programadores de todo el
mundo trabajan ahora en este simulador
de vuelo.
Descarga Gigantesca
El paquete FlightGear bsico, con varios
modelos de aviones y un pequeo mapa
de San Francisco (Figura 1), pesa ms de
90 Mbytes. Y se necesitan mas mapas
digitales FlightGear para el resto del
mundo. Si la descarga es demasiado para
tu conexin a Internet, puedes pedir el
paquete completo de FlightGear en la
pgina de inicio de FlightGear [1]. El
paquete viene con tres DVDs u once
CDs, conteniendo un total de 12 Gbytes
de datos. A pesar de ello, los diferentes
sectores del mundo pueden descargarse
por separado.
Despus de completar la instalacin,
los usuarios simplemente pueden teclear
fgfs para arrancar Flightgear. Arrancar el
programa sin ninguna opcin nos coloca
en un Cessna en la mencionada zona de
vuelo de San Francisco. Un joystick es
V
olar un sueo para los
humanos desde la antigedad.
Grandes genios han dedicado su
tiempo e inteligencia a intentar construir
aparatos voladores. Curiosamente, hoy
en da, cuando el coste de volar con
compaas comerciales est al alcance
de todo el mundo, existe un creciente
nmero de programas, que permiten sur-
car los aires desde el saln de tu casa.
Despegue con FlightGear
Microsoft introdujo un simulador de
vuelo ya hace tiempo, pero este producto
no corre en Linux. Sin embargo, como
bien sabemos, la comunidad del cdigo
abierto es autosuficente: FlightGear trae
la experiencia de sentarse a los mandos
de un avin a tu escritorio favorito. Y
aterriza con licencia GPL.
Los desarrolladores de FlightGear
dicen que el programa es el resultado de
su disconformidad con simuladores de
vuelo comerciales; el hecho de que el
cdigo de MS fuera cerrado impeda que
se aadieran extensiones y mejoras de
terceros.
El software libre incluyes un abanico
tan amplio de aplicaciones que
puede ser difcil encontrar la herra-
mienta perfecta. En esta seccin,
escogemos lo mejor de la cosecha.
Este mes probamos FlightGear, un
fabuloso simulador de vuelo, y
Amarok, un reproductor musical de
nueva generacin.
POR MARTIN LOSCHWITZ
Software Libre y sus Creadores
Proyectos en Marcha
perfecto para el control de un avin,
pero tambin se puede utilizar un ratn.
En el modo estndar, el ratn se utiliza
para operar la instrumentacin de la car-
linga y acceder a los programas de los
mens. Al hacer clic con el botn dere-
cho, se cambia a modo joystick. Otro clic
derecho y se cambia la perspectiva. Se
puede ver el avin desde fuera (a ambos
lados, vista frontal o vista de pjaro),
pero los jugadores preferirn la vista
desde el asiento del pilot.
Si el Cessna nos sabe a poco, simple-
mente hemos de seleccionar un nuevo
avin. Disponemos de una gran variedad
de aviones, desde un Boeing 747 hasta
un Antonov (ver Figura 2), as como dos
cazas: el F16 y el prototipo de un
Northrop/McDonell Douglas. Para los
apasionados de la historia de la aviacin,
existe hasta un modelo del primer avin
creado por los hermanos Wright, el
Wright Flyer. Existen muchos otros mo-
delos en Internet, desarrollados por los
aficionados a FlightGear.
A diferencia de simuladores de vuelo
comerciales, FlightGear es bastante fru-
R
o
n
a
l
d

R
a
e
f
l
e
,
v
i
s
i
p
i
x
.
c
o
m
de reproduccin sencillas,
almacenando los caminos
a los ficheros de audio
consecutivamente en un fichero
de texto.
Ya hace algn tiempo que Amarok [3]
entr en escena como nuevo reproductor
de audio con la intencin de resolver
ambos problemas. Amarok est pensado
principalmente para usuarios de KDE y
esto se hace patente al no disponer de un
plugin para el acceso directo al mdulo
Alsa del kernel, sino que hace uso de sis-
tema de sonido Arts de KDE, aunque
existen extensiones para los motores
GStreamer y Xine.
El GUI de Amarok muestra un lista de
reproduccin completa con abundante
informacin sobre la pista actual, el
artista y otras listas de reproduccin. Si
se requiere, el reproductor puede
mostrar una ventana separada de repro-
duccin al estilo de Xmms para
visualizar la salida msical. Existe un
creciente nmero de plugins para exten-
der las caractersticas estndar.
Al igual que otros programas, Amarok
cuenta con una lista de reproduccin que
permite ver cual es la siguiente pista, sin
embargo, el programa permite al usuario
compilar listas de reproduccin flexible-
mente a partir de varias colecciones.
Para hacer esto, los usuarios definen uno
o ms directorios fuentes de ficheros de
sonido donde Amarok buscar. A conti-
nuacin, la aplicacin muestra un lista
desplegable de artistas, la que permite al
usuario seleccionar pistas o artistas indi-
viduales y aadir pistas a la lista de
reproduccin.
La vista contextual muestra a los
usuarios detalles sobre la pista en repro-
duccin. Aparte del ttulo y el nombre
del artista, incluye estadsticas sobre la
frecuencia con el que se ha reproducido
la cancin, cuando se reprodujo por
primera vez, y cuando fue la
ltima vez
que se
escuch. Debajo de esta
informacin, el programa muestra otras
pistas del mismo lbum y las pistas
mejor puntuadas del mismo artista, pun-
tuacin sta basada en el ranking
Amarok.
Por que Amarok clasifica cada cancin
segn tus gustos personales, s, subiendo
una pista en el ranking basndose en las
veces que se reproduce y bajndolo si no
se escucha tan menudo o se reproduce
mal. Este sistema permite a Amarok
crear gradualmente una lista con las pis-
tas favoritas de cada usuario.
En lo que se refiere a skins, Amarok no
tiene mucho que ofrecer: los usuarios
pueden cambiar los colores de fondo y
del panel a su gusto y el aspecto se
adapta los temas por defecto de Qt.
A pesar de lo anterior, la potencia de
Amarok en lo que se refiere a la
administracin de listas de reproduc-
cin, lo convierten en un serio
competidor para el resto de los repro-
ductores de msica. I
gal en lo que se refiere a sus exigencias
de hardware. Necesitaremos un adapta-
dor de grficos bastante reciente con
soporte para aceleracin 3D OpenGL. Sin
embargo, es bastante difcil dominar el
mundo del pilotaje virtual y el manual
en la pgina de inicio de FlightGear nos
da un rpido repaso de los instrumentos
y teclas ms importantes.
Amar a Amarok
A medida que Linux ha invadido los
escritorios, el nmero de aplicaciones de
entretenimiento ha ido en aumento,
entre ellas, los reproductores de msica
MP3 y Ogg. A pesar de que los puristas
puedan preferir la herramienta de la
lnea de comandos mpg123 [2], los
usuarios de GUIs estn bastante con-
tentos con el clon Winamp, Xmms, o la
herramienta estndar de KDE, Noatun.
Ambos programas tienen sus desven-
tajas. Por un lado, ambos tienen
interfaces bastante estticos. Xmms
puede utilizar skins de Winamp, siempre
y cuando sean para la versin 2 del pro-
grama de Windows, ya que los
desarrolladores de Winamp disearon
un nuevo sistema de skins por que
crean que la anterior versin era muy
aburrida. Noatun cambia segn el tema
que se aplique a KDE, sin ningn extra.
La segunda desventaja es que ninguno
de los dos ayuda al usuario a administrar
una gran coleccin de msica. Tanto
Xmms como Noatun trabajan con listas
96 Nmero 03 www.linuxmagazine.com.es
Proyectos COMUNI DAD
[1] FlightGear: http://www.flightgear.org
[2] Mpg123: http://www.mpg123.de
[3] Amarok: http://amarok.kde.org/
RECURSOS
97 www.linuxmagazine.com.es Nmero 03
LI NUX MAGAZI NE Eventos
LinuxPark CeBIT 2005
Fecha: 10-16 Marzo
Ciudad: Hannover, Alemania
Sitio Web:
www.cebit.de/
homepage_e
LinuxWorld Expo
Fecha: 1417 Febrero
Ciudad: Boston, MA, EE.UU.
Sitio Web:
www.linuxworld
expo.com
FOSDEM 2005
Fecha: 2627 Febrero
Ciudad: Bruselas, Blgica
Sitio Web:
www.fosdem.org
Eventos Seleccionados
Informacin de Contacto
Director
Paul C. Brown
Coolaboradores
Paul C. Brown, Jose Manuel Gonzlez Vida, Juan
Rafael Fernndez, Pedro Orantes, Jos Mara Ruz
Traductores
Paqui Martn Vergara, Paul C. Brown, Jess Reyes
Delgado, Antonio Rueda.
Maquetacin
Sergio Hardasmal
Diseo de Portada
Paul C. Brown, Pinball
(info@pinball-werbeagentur.de)
Publicidad
www.linuxmagazine.com.es/pub/
Para Espaa
Paul C. Brown
pbrown@linuxmagazine.com.es
pbrown@linuxnewmedia.es
Tel.: (+ 34) 951 010 556
Mvil.: (+ 34) 655 036 836
Fax.: (+ 34) 951 010 516
Sergio Hardasmal
anuncios@linuxmagazine.com.es
Tel.: (+ 34) 951 010 556
Para Alemania, Austria y Suiza
Osmund Schmidt
anzeigen@linux-magazine.com
Tel.: (+49) 6335 9110
Fax.: (+49) 6335 7779
Para el Resto del Mundo
Brian Osborn
ads@linux-magazine.com
Tel.: (+49) 6509 910 495
Fax.: (+49) 6509 910 497
Director Editorial
Paul C. Brown
Director de Produccin
Sergio Hardasmal
anuncios@linux-magazine.com
Subscripciones: www.linuxmagazine.com.es/
magazine/subs
Precios Subscripcin
(12 nmeros + 1 DVD cada 3 nmeros)
Espaa: 49,50
Europa: 59,90
Resto del Mundo - Euros: 79,90
Resto del Mundo - Dlares U.S.A.: $94,90
Tel.: (+34) 951 010 556
Fax.: (+34) 951 010 516
subs@linuxmagazine.com.es
Linux Magazine
Linux New Media Spain, S.L.
Avda. Juan Lpez Pealver, 21
29590 - Campanillas Mlaga
ESPAA
info@linuxnewmedia.es
Tel.: (+34) 951 010 556
Fax.: (+34) 951 010 516
www.linuxmagazine.com.es - Espaa
www.linux-magazine.com- Mundo
www.linux-magazine.de - Alemania
Si bien se toman todas las medidas posibles para
garantizar la precisin del contenido de los artculos
publicados en Linux Magazine, la editorial no se
hace responsable de imprecisiones aparecidas en la
revista. Asimismo, Linux Magazine no comparte
necesariamente las opiniones vertidas por sus
colaboradores en sus artculos. 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 New
Media Spain, S.L. Linux New Media Spain S.L. prohbe
la reproduccin total o parcial de los contenidos de
Linux Magazine sin su permiso previo y por escrito.
Linux es una Marca Registrada de Linus Torvalds.
Impreso en Alemania
Impresin: Dierichs Druck + Media GmBH
Distribucin: SGEL
Calendario de Eventos
Evento Fecha Ciudad Sitio Web
CodeCon 4.0 11-13 Febrero San Francisco, CA, EE.UU. www.codecon.org/2005
Southern California Linux Expo 12 Febrero Los Angeles, CA, EE.UU. www.socallinuxexpo.org
LinuxWorld Conference & Expo 14-17 Febrero Boston, MA, EE.UU. www.linuxworldexpo.com
UKUUG LISA/Winter Conference 24-25 Febrero Birmingham, R.U. www.ukuug.org/events/winter2005
FOSDEM 2005 26-27 Febrero Bruselas, Blgica www.fosdem.org
Solutions Linux 01-03 Marzo Pars, Francia www.solutionslinux.fr
Linux Park CeBIT 2005 10-16 Marzo Hannover, Alemania www.cebit.de/homepage_e
OReilly Emerging Technology Conference 14-17 Marzo San Diego, CA, EE.UU. conferences.oreillynet.com/etech
Novell BrainShare 2005 20-25 Marzo Salt Lake City, UT, EE.UU. www.novell.com/brainshare
YAPC::Taipei 2005 26-27 Marzo Taipei, Taiwan taipei.pm.org
Festival Latinoamericano de Instalacin de 2 de Abril Venezuela, Argentina http://ingenieria.ean.edu.co/~azul/
Software Libre y Colombia svnwiki.cgi/colibri/fisl
LinuxWorld Conference & Expo, Canada 18-20 Abril Toronto, Canad www.linuxworldcanada.com
MySQL Users Conference & Expo 2005 18-21 Abril Santa Clara, CA, EE.UU. www.mysql.com/news-and-events/users-
conference
linux.conf.au 18-23 Abril Canberra, Australia conf.linux.org.au/
3rd International Linux Audio Conference 21-24 Abril Karlsruhe, Alemania www.zkm.de:81/lac
GUADEC 2005 29-31 Mayo Stuttgart, Alemania http://2005.guadec.org
I Congreso de Tecnologas del Software Libre 7-8 Julio A Corua http://congreso.gpul.org
98 Nmero 03 www.linuxmagazine.com.es
A LA VENTA MARZO 2005
Nmero 3 PRXIMO NMERO
Boletn Linux Magazine
El Boletn de Linux Magazine te da la oportunidad de ver lo que se avecina en el
siguiente nmero de Linux Magazine e incluye enlaces a artculos que aparecen
en nuestro sitio web antes de que la versin impresa llegue a los quioscos.
Suscrbete en www.linuxmagazine.com.es/boletin.
Las redes inalmbricas son geniales si
consigues configurarlas. Sin
embargo, la gran variedad de dispo-
sitivos (no siempre compatibles) y el
problema de integrar el hardware
con el sistema de software, a
menudo intimidan hasta el admi-
nistrador ms experimentado. El
mes que viene
Especial Wireless
mostramos como configurar Linux en
una red wireless.
Nuestros especialistas en LANs
inalmbricas abordarn una amplio
espectro de temas relacionados:
Primero veremos los fundamentos de
redes wireless, para despus estudiar
dispositivos enrutadores DSL WLAN.
Asimismo, veremos como configurar
una red privada utilizando OpenVPN
en una red inalmbrica.
Finalmente, veremos como
mejorar la seguridad con la
ayuda de la deteccin de redes
desprotegidas utilizando un
aparato ideal para estos me-
nesteres: un Sharp Zaurus cargado
con Linux.
Prctico
Inauguramos seccin: Linux Prctico, dedicada al uso de Linux en mbitos
profesionales. En el nmero del mes que viene empezaremos a ver como utilizar una
mquina Linux como estacin de trabajo para la autoedicin con uno de los paquetes
de maquetacin ms interesantes existentes: Scribus. Asimismo veremos como
montar fotos panormicos utilizando Hugin y aprenderemos a actualizar nuestra
instalacin Fedora de manera automtica y regular con Yum.
Desarrollo
En nuestra seccin dedicada a la
programacin, veremos como crear un
lector de flujos RSS con Perl, crearemos
una araa buscadora web con Ruby y
daremos buenos consejos sobre como
montar un portal de contenidos
utilizando PHPNuke
SysAdmins
En la seccin dedicada a los
administradores de sistemas tendremos
ms tiles consejos de Charly,
hablaremos de metodologas de
seguridad para aplicaciones web y
desentraaremos los misterios de los
servidores de correo IMAP.
Linux User
En nuestra seccin de educacin,
veremos como representar grafas no
occidentales para la enseanza de
idiomas. Finalizamos nuestro curso de
LaTeX con un caso prctico que nos
servir de plantilla para futuros
documentos. Seguiremos conociendo la
lnea de comandos para que todos
puedan aprovechar la potencia de las
instrucciones del shell.
Abril 2005: Nmero 4
Prximo Nmero
... Y Adems
El DVD de
Linux Mandrake 10.1
Official al completo.

También podría gustarte