Suse 10.0
INTEL 9.0 GRAMPS Edición en Evaluamos su Busca tus
LINUX MAGAZINE
nuevo compilador
Castellano
raíces
Sistema de escritorio completo
NÚMERO 12
Aplicaciones multimedia Administrador gráfico
NÚMERO 12 • P.V.P 5,95 €
Todas las herramientas de los expertos
Diseño Web
osCommerce
DISEÑO WEB
CSS
Web con GIMP
osCommerce: Una tienda de código abierto p14 Desata el poder de los CSS en tus páginas p19 Webs gráficos con the GIMP p24 Animaciones Flash con software libre p28
FCKEditor
AOLServer
Diseño web simplificado p44
GRAMPS
FTP Automatiza tus descargas p62
PDF Toolkit
Flash con Linux
AOLServer Un servidor web de altas prestaciones p70
GCompris
Filtrado web
Filtros Web
Mantén a raya anuncios, errores y Javascript p40
WWW.LINUX- MAGAZINE.ES
Editores HTML Escoge la herramienta perfecta
p32
PDF Toolkit PDFs desde la línea de comandos
p80
EDITORIAL
LA LLAMADA Estimado Lector de Linux Magazine e llama una señora un poco irritada y me dice que “nuestro” sistema operativo no funciona porque no le permite conectarse a Internet. Pienso que se refiere a algún DVD de la revista que ha comprado y que tras instalarlo está teniendo problemas de configuración. Después de un diálogo de besugos que provocan este tipo de equívocos, resulta que no, que lo que le pasa es que le viene preinstalado el Guadalinex en un ordenador que acaba de adquirir. La máquina en cuestión vale una pasta, 1.200 euros, nada menos, y la buena mujer lo quiere para conectarse a la red, hecho que repite varias veces. Ésta es condición sine qua non para hacerse con el artefacto. Cuando su modem (uno de esos horrorosos Thompson SpeedTouch 330 que cuestan sudor, sangre y lágrimas configurar) no fue reconocido y mucho menos habilitado para su uso de manera automática, la buena señora llamó a la primera empresa que tenía Linux en su nombre. La nuestra. Una vez aclarado el malentendido, nos ponemos manos a la obra a ver qué podemos hacer para ayudarla. Resulta que ella ha hecho sus deberes y antes de llamar a Linux Magazine, se ha puesto en contacto con su operadora (ONO) que, por supuesto, le dijo que no da soporte para Linux. Ya estamos. (En realidad, no importa el nombre de la operadora, puesto que ninguna se digna a ofrecernos servicio, pero a ver si citándolos, se pican y se mueven un poco). Descartado ONO, le digo que se dirija a la tienda donde adquirió el aparato. Lo compró en un banco. Obviamente, Pepe, el de caja, bastante tiene con lidiar con la pensión de la señora Paquita como para ponerse a investigar cómo configurar los ordena-
M
Nos sentimos orgullosos de nuestros orígenes como publicación, que se remonta a los primero días de la revolución Linux. Nuestra revista hermana, la publicación alemana Linux Magazin, fundada en 1994, fue la primera revista dedicada a Linux en Europa. Desde aquellas tempranas fechas hasta hoy, nuestra red y experiencia han crecido y se han expandido a la par que la comunidad Linux a lo ancho y largo del mundo. Como lector de Linux Magazine, te unes a una red de información dedicada a la distribución del conocimiento y experiencia técnica. No nos limitamos a informar sobre el movimiento Linux y de Software Libre, sino que somos parte integral de él.
dores que venden a sus clientes. A ver si hay algún LUG cercano… ¿De dónde me llama? Sanlúcar de Barrameda. En Sanlúcar no hay nada. Lo más cercano que se me ocurre es Cádiz, donde tienen a GULCA (http://gulca.org), pero por supuesto que no hay ningún teléfono a mano y no tengo ni idea dónde tendrán el IRC, puesto que gran parte de su sitio parece estar caído. Claro está que no conseguimos gran cosa por teléfono y me vi recomendando que se cambiase el modem por un router. A la señora, después de haberse gastado 1200 mortadelos, esta solución no le pareció agradar mucho, aunque era demasiado educada como para decirlo. La otra solución (sí, ESA OTRA solución) tampoco pareció hacerle mucha gracia. Bendita sea. Agotados todos los recursos, ¿sinceramente habremos de creer que a día de hoy, dos semanas después, la máquina en cuestión sigue teniendo Linux instalado? No me hagáis reír. La tercera vía, la innombrable, la que supone no sólo claudicar, sino hacerlo de manera ilegal, se habrá impuesto sobre la filosofía y la libertad. Y éste es el problema con la política de la Junta (e imagino que con otras juntas, gobiernos autonómicos y forales). Que sí, que muy bien, que eso de intentar popularizar el software libre es genial. Independencia tecnológica y tal. Pero un gran poder (el de sacar tu propia distribución… y comercializarla) conlleva una gran responsabilidad (el de soportarla), que una cosa es independencia, y otra muy diferente el más absoluto de los desvalimientos. Sin soporte, no sólo se tienta (o incluso, se fuerza) a que el usuario final se desinstale Linux y opte por software propietario, normalmente pirata, sino que se difunde una pobre impresión del software libre entre la población, obte-
WWW.LINUX- MAGAZINE.ES
niendo exactamente el efecto contrario del que se pretende conseguir, a saber: el desprestigio global del código abierto. Entiendo que para las administraciones sea difícil ofrecer un soporte al estilo de las empresas privadas, más que nada porque su clientela es toda la población de la región donde gobiernan. Esto es impracticable incluso para la empresa más poderosa. Pero, según creo, se podría delegar este soporte, exigiendo, por ejemplo, que las operadoras sí lo ofreciesen para, en este caso, Guadalinex. ¿Qué le costaría a Ono? ¿Un par de páginas más en el manual del operador del call center de turno? A cambio, se le ofrece la inclusión en un listado impreso en un folleto que se entrega a todo aquel que compre un ordenador con Guadalinex preinstalado. “Empresa avalada por la Junta de Andalucía/Extremadura/Comunidad de Madrid/Táchese lo que no proceda. Llámeles y le solucionarán su problema”. ¿Qué mejor publicidad puede haber?
Paul C. Brown Director
Número 12
3
CONTENIDOS • Linux Magazine nº 12
PORTADA 14 osCommerce Si necesita una solución conjunta entre una base de datos y un carrito para su tienda online, sólo tiene que que echar mano de osCommerce.
PRÁCTICO 28 Flash Flash y Linux son mundos que siempre han colisionado. Vemos en este artículo el estado actual de las soluciones de código abierto para Flash.
44 FckEditor FCKeditor libera al webmaster de la tediosa tarea de mantener una web actualizada dejando que el usuario se encargue.
EVALUACIÓN 32 Editores Un buen editor HTML tiene que ahorrarle tiempo y problemas al desarrollador. Vamos a ver en este artículo los mejores editores gratuitos para Linux.
DESARROLLO 48 Perl: ¡Busca! Este mes mostramos un script en Perl que crea una base de datos MySQL para encontrar archivos en el disco duro al instante.
19 CSS Los Cascading Style Sheets (CSS) nos ayudan a embellecer nuestras páginas web sin tener que hacer un complicado curso de programación
24 GIMP El programa libre de manipulación de imágenes más versátil, GIMP, puede ayudarnos a crear páginas vistosas de manera sencilla.
LINUX MAGAZINE 3 6 8 10 12 94 94 95 97 98
4
Editorial DVD Linux Magazine Inseguridades Negocios Noticias Eventos Información de Contacto Subscripciones Linux Local Próximo Número
Número 12
37 Intel 9.0 Intel presentó la versión 9.0 de su compilador de C++ para procesadores Intel en Junio, elevando el listón del código altamente optimizado.
PRÁCTICO 40 Webcleaner Los filtros de contenido protegen la privacidad de los usuarios web y se encargan de eliminar toda la publicidad no deseada.
54 Python AJAX es la palabra de moda, Google usa AJAX, Yahoo usa AJAX… todo el mundo quiere usar AJAX pero ¿qué demonios es AJAX?
ADMINISTRACIÓN 61 La Columna de Charly 62 FTP Si ejecuta siempre los mismos pasos en FTP, puede ahorrar tiempo y esfuerzo con una pequeña automatización.
WWW.LINUX- MAGAZINE.ES
ADMINISTRACIÓN 66 DNS El resolvedor es la ventana de su equipo al sistema global DNS. Simplemente con teclear una URL tiene un enlace a todos los equipos del mundo
LINUX USER 80 PDF Toolkit Vemos una herramienta especial que puede ayudar a los usuarios con el trabajo administrativo electrónico: pdftk, el juego de herramientas PDF.
83 Educación GCompris es un conjunto de juegos educativos para niños de dos a ocho años. Los profesores puedan gestionar perfiles y configurar qué juegos se les presentan a los distintos alumnos.
SUSE 10.0 ■
Configuración asistida con Yast2
■
Kernel 2.6.13
■
Suite ofimático OpenOffice 2.0
■
Voz sobre IP
70 AOLServer AOLServer es un servidor web antiguo en desarrollo y muy actual en prestaciones y potencia. En este artículo aprenderemos a configurarlo.
Más información en la página 6.
LINUX USER 74 Desktopía Una nueva imagen de fondo es la manera más rápida de hacer más atractivo tu escritorio. Zufall y genbg cambian el fondo de escritorio automáticamente.
76 GRAMPS Si quieres construir tu árbol genealógico, necesitas administrar grandes cantidades de datos. Así que ¿por qué no usar Linux para este duro trabajo?
87 Línea de Comandos Trabajar con un editor de texto puede ser problemático si necesitas manejar con frecuencia tareas recurrentes o múltiples ficheros. sed puede evitarte muchos tecleos
90 Eventos: OSWC 2005 El primer tramo de la segunda edición de la Open Source World Conference se celebró los días 25 y 26 de octubre en Mérida. Linux Magazine estuvo allí.
WWW.LINUX- MAGAZINE.ES
Número 12
5
DVD LINUX MAGAZINE
Y en el DVD de Linux Magazine…
SUSE 10.0
1994, para pasar a crear su propia distribución con sus específicas prestaciones en 1996. Novell adquirió Suse en 2004 y desde entonces no ha parado de promocionar la distribución, primero abriendo el sistema de administración de Suse, Yast2, bajo licencia GPL en 2004, y después, siguiendo los ejemplos de Red Hat y Mandriva, con la fundación en 2005 de la comunidad OpenSuse [1], lo que permite a miembros de la comunidad ajena a la compañía influenciar y asistir en el desarrollo del sistema.
Novedades
al vez uno de las historias de éxito más evidentes entre todas las historias de éxito del software libre sea la de Suse. Fundada en Alemania en 1992, Suse ha sido desde siempre pionera en el desarrollo y comercialización de distros Linux. Fue una de las primeras empresas, junto con Red Hat, en distribuir comercialmente una versión de Linux basada en Slackware en soporte CD en
La versión 10.0 viene con numerosos y sustanciales cambios con respecto a versiones anteriores. No sólo es especial por ser la primera derivada de la recién estrenada comunidad abierta OpenSuse, sino que se han realizado muchas y variadas incorporaciones al repositorio de paquetes. Por ejemplo, por primera vez se incorporan programas con licencia GPL para realizar llamadas Voz-sobre-IP. Se ha optado por Twinkle y kcall en este apartado Otra novedad es la inclusión de software para la descarga a través de torrents y para ello se ha dispuesto BitTorrent y Ktorrent en la lista de aplicaciones disponibles. Este paso es lógico, ya que desde la apertura de OpenSuse, se puede optar por descargar versiones de Suse tanto de su repositorio FTP de toda la vida, o bien con una descarga distribuida P2P tipo torrent. Para llevar el control de los quehaceres, citas y tareas pendientes, Suse
Figura 2: Gwenview permite clasificar y visualizar todas las imágenes de tu disco duro desde Konqueror.
Figura 3: Yast2 es el centro de control de Suse que permite administrar la instalación de software, hardware, etc.
T
Figura 1: Con Firefox podremos navegar de manera segura por la web con un interfaz cómodo.
6
Número 12
WWW.LINUX- MAGAZINE.ES
DVD LINUX MAGAZINE
Suse 10-0 incluye además todos los paquetes que hemos llegado a esperar de cualquier distribución que se precie: OpenOffice, la última versión estable del kernel (2.6.13), programas para la producción y reproducción de multimedia, copiado y grabación de medios y un largo etcétera.
¡Ínstalalo ya! Figura 4: Con OpenOffice 2.0 podremos editar textos, utilizar hojas de cálculo y crear bases de datos.
10.0 incluye por primera vez el calendario Sunbird del proyecto Mozilla. Con Sunbird podrás mantener un control exhaustivo sobre todo lo que se refiere a tu día a día, tanto en el plano personal, como en el profesional.
Suse es y será durante mucho tiempo una de las distros con mayor proyección, perteneciendo a la élite de las 10 distribuciones más utilizadas y descargadas de todos los tiempos. Es ideal para el usuario novel a la vez que para el programador o administrador experimentado, al combinar la facilidad de instalación y uso, con la flexibilidad y potencia de Linux.
Además, con su apertura hacia las contribuciones de la comunidad con OpenSuse, se garantiza la continuidad y actualización constante del sistema, lo que, combinado con su sólido trasfondo comercial y soporte, lo convierte en el sistema idóneo tanto para el usuario corporativo como doméstico. Instálalo y verás cómo Suse 10.0 es todo lo que necesitas de un sistema ope■ rativo y algo más.
RECURSOS [1] Comunidad OpenSuse: http://www. opensuse.org/ [2] Mirrors del repositorio no oficial de Packman: ftp://packman.links2linux. de/pub/packman/MIRRORS
Más allá del DVD Suse es un sistema operativo completo y más. No sólo contiene todos los elementos básicos para que un ordenador funcione, sino que, siguiendo la tradición de las distros Linux, incorpora todo lo necesario para que el usuario también “funcione” desde el primer momento. Suites ofimáticos de última generación para la creación de textos y hojas de cálculo, PIMs (Personal Information Managers) para la administración de agendas, direcciones y correos, aplicaciones de retoque fotográfico y grabadores de CDs y DVDs… todos este software se puede encontrar en el DVD de Suse 10.0 incluido con el número de Linux Magazine de este mes.
Para ello habremos de incluir los repositorios en Yast2 para que podamos utilizar el administrador de software gráfico de Suse a la hora de instalar estos nuevos paquetes. Abrimos Yast desde el menú de Inicio > Sistema > Yast y seleccionamos Cambiar Fuente de Instalación. Una vez se abra el diálogo, pulsamos en Añadir y escogemos, por ejemplo, FTP. En el diálogo de configuración, en el campo Nombre de Servidor, introducimos el nombre del servidor, sin el protocolo. Por ejemplo, si deseamos utilizar el repositorio en la red Iris, escribiríamos lo siguiente: ftp.rediris.es
Sin embargo, a pesar del enorme volumen de programas incorporadas a Suse, siempre hay algún paquete que un usuario echa de menos. A menudo se debe a restricciones de espacio, otras a problemas con licencias. Este segundo caso es típico de los codecs de reproducción de vídeo, que, o son propietarios con licencias que prohíben su distribución por parte de terceros, o han sido creados por la comunidad e infringen patentes en terceros países (que no en Europa).
en este cuadro.
Para acceder a todo este universo de software que no puede incluirse en el DVD por un motivo u otro, y una vez que tengamos nuestro acceso a Internet configurado y en funcionamiento, podemos utilizar los llamados repositorios de software, tanto los oficiales de Suse, como los creados por terceros, y que suelen contener software especializado o problemático en lo que se refiere a lo legal.
ftp://packman.inode.at/
A continuación, hemos de decirle a Yast dónde debe encontrar en el servidor el repositorio propiamente dicho. En la red Iris, las versiones de 32 bits de los paquetes se hallan bajo el directorio /pub/linux/distributions/suse/pub/U suse/i386/10.0/U SUSE-Linux10.0-GM-Extra/suse/i586/ Para el repositorio de paquetes no oficiales de Packman, el servidor es
(aunque hay más mirrors en [2]) y el directorio es /suse/10.0/i686/ Una vez configuradas todas las direcciones de repositorios, Yast actualiza la base de datos y podremos instalar paquetes indistintamente desde cualquiera de las fuentes.
WWW.LINUX- MAGAZINE.ES
Los repositorios mencionados también contienen versiones 64 bits de la mayoría de los paquetes. Utiliza la dirección adecuada para tu arquitectura. Sin embargo, si tenemos una arquitectura un poco exótica (64 bits, ppc, etc.) puede que no encontremos el paquete adecuado para nuestro sistema. En este caso es trivial crear nuestro propio RPM optimizado para nuestro procesador a partir de un RPM que contiene las fuentes. Digamos que deseamos reproducir DVDs de vídeo comerciales en nuestra máquina AMD64. Para ello necesitamos la librería libdvdcss. Esta librería infringe muchas patentes en Estados Unidos y, por tanto, no se encuentra en el repositorio oficial de Suse ni tampoco se encuentra compilada para x86-64. La solución es fácil: nos bajamos el RPM fuente de http://download.videolan.org/pub/Ul ibdvdcss/1.2.9/rpm/U libdvdcss-1.2.9-1.src.rpm y lo guardamos en algún lugar seguro. A continuación compilamos el paquete desde la línea de comandos con la instrucción: rpmbuild --rebuild --target=x86_64U libdvdcss-1.2.9-1.src.rpm Esto generará un fichero rpm compilado para nuestra arquitectura preparado para instalarse. La instrucción rpm -ihv U libdvdcss2-1.2.9-1.x86_64.rpm instalará el RPM creado en el sistema.
Número 12
7
LINUX USER INSEGURIDADES Schlagwort sollte hier stehen
INSEGURIDADES ■ APACHE El servidor HTTP Apache es un servidor Web popular y libremente disponible. Se descubrió un error en el manejo de mod_ssl de la instrucción del “SSLVerifyClient. Este defecto ocurre si un host virtual es configurado usando “SSLVerifyClient optional” y se establece una instrucción “SSLVerifyClient required” para un lugar específico. Para servidores configurados de este modo, un atacante podría tener acceso a recursos que deberían estar protegidos de otra manera mediante el no suminis-
tro a un cliente certificado cuando se conecta. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado a este problema el nombre CAN-2005-2700. Se descubrió un defecto en httpd Apache donde el filtro de rango de byte metía en guardaba ciertas respuestas en la memoria. Si un servidor tiene un recurso tal como un script CGI o un script PHP que genera una gran cantidad de datos, un atacante podría enviar peti-
POLITICAS DE SEGURIDAD DE LAS DISTRIBUCIONES MAYORITARIAS Distribuidor
Fuente Seguridad
Debian
Info:http://www.debian.org/security/ Lista:http://www.debian.org/debian-security-announce/ Referencia:DSA-…1)
Gentoo
Mandrake
Red Hat
Slackware
Suse
Comentario
Los avisos de seguridad actuales se incluyen en la página de inicio. Los avisos se proveen como páginas HTML con enlaces a los parches. Los avisos también incluyen una referencia a la lista de correo. Info:http://www.gentoo.org/security/en/index.xml Los avisos de seguridad actuales para Foro:http://forums.gentoo.org/ la lista Gentoo en el sitio web de Lista:http://www.gentoo.org/main/en/lists.xml seguridad de Gentoo enlazan desde la Referencia:GLSA:… 1) página principal. Los avisos se presentan en HTML con códigos para fusionar las versiones corregidas. Info:http://www.mandrakesecure.net Mandrakesoft posee su propios sitio web Lista:http://www.mandrakesecure.net/en/mlist.php que versa sobre temas relacionados con Referencia:MDKSA:… 1) la seguridad. Entre otras cosas,incluye avisos seguridad y referencias a las listas de correo. Los avisos son páginas HTML,pero no contienen enlaces a los parches. Info:http://www.redhat.com/errata/ Red Hat archiva los fallos de seguridad Lista:http://www.redhat.com/mailman/listinfo/ bajo lo que denominan erratas. A Referencia:RHSA-… 1) continuación los problemas para cada versión de Red Hat se agrupan. Los avisos de seguridad se proveen como una página HTML con enlaces a los parches. Info:http://www.slackware.com/security La página de inicio contiene enlaces al Lista:http://www.slackware.com/lists/(slackware-security) archivo de seguridad de la lista de correo. Referencia:[slackware-security]… 1) No existe información adicional sobre seguridad en Slackware. Info:http://www.suse.de/en/private/support/ Ya no existe un enlace a la página de security/index.html seguridad tras un remodelado en el sitio Parches:http://www.suse.de/en/private/ web de SuSE. Existe información en la download/updates Lista:suse-security-announce lista de correos y los avisos. Los parches de Referencia:SUSE-SA… 1) seguridad para versiones individuales de SuSE Linux se muestran de color rojo en el sitio de actualizaciones generales. Contiene una corta descripción de la vulnerabilidad que soluciona el parche.
1) Todos los distribuidores muestran correos de seguridad en el campo Subject.
8
Número 12
WWW.LINUX- MAGAZINE.ES
ciones cuidadosamente manipuladas con la intención de consumir recursos, potencialmente llevando a una Denegación de Servicio. (CAN-2005■ 2728) -Referencia Debian: DSA-805-1apache2 -Referencia Gentoo:GLSA 200508-15/ apache -Referencia Mandriva:MDKSA-2005:161 -Referencia Red Hat:RHSA-2005:608-7
■ VIM VIM (Visual editor iMproved) es una versión del editor vi. Se encontró un defecto en el modo en el que VIM procesa las líneas de modo. Si un usuario con las modelines habilitadas abre un fichero de texto con una modeline cuidadosamente manipulada, permitiría a un atacante ejecutar comandos arbitrarios. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado a este problema el nombre ■ CAN-2005-2368. -Referencia Mandriva:MDKSA-2005:148 -Referencia Red Hat:RHSA-2005:745-10
■ KISMET Han sido descubiertos algunos problemas relacionados con la seguridad en Kismet, una herramienta de monitorización inalámbrica 802.11b. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado el nombre CAN-2005-2626 para el problema de manipulación insegura de caracteres imprimibles en el SSID. Se ha asignado el número CAN-20052627 a un problema en el que múltiples integradores de subdesbordamientos permitiría a atacantes remotos ejecutar códi■ go arbitrario. -Referencia Debian: DSA-788-1 -Referencia Gentoo:GLSA 200508-10/ kismet
INSEGURIDADES
■ bluez-utils
■ kdegraphics
bluez-utils son las utilidades usadas con la implementación BlueZ del estándar inalámbrico de Bluetooth para Linux. El nombre de un dispositivo Bluetooth es validado de manera impropia por la utilidad hcid cuando un dispositivo remoto intenta acoplarse con un ordenador. Un atacante podría crear un dispositivo malicioso en un dispositivo Bluetooth produciendo comandos arbitrarios que podrían ser ejecutados como root cuando se intenta acoplar el dispositivo con el ordenador. No existe ninguna solución conocida para este problema en este momento. Todos los usuarios de utilidades bluez deberían actualizarse a la última ver■ sión: -Referencia Debian: DSA-782 bluez-utils -Referencia Gentoo:GLSA 200508-09/ bluez-utils -Referencia Mandriva: MDKSA2005:150
Los paquetes kdegraphics contienen aplicaciones para el entorno de escritorio K, incluyendo kpdf, un visualizador de ficheros PDF. Se descubrió un defecto en kpdf. Un atacante podría construir un fichero PDF cuidadosamente manipulado que podría hacer que kpdf consuma todo el espacio disponible en disco en /tmp cuando se abriese. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre. org) ha asignado a este problema el ■ nombre CAN-2005-2097. -Referencia Debian: DSA-780 kdgraphics -Referencia Mandriva: MDKSA2005:143 -Referencia Red Hat: RHSA-2005:671-03
■ PHP PHP es un lenguaje de programación embebido en HTML usado comúnmente con el servidor Web HTTP de Apache.
WWW.LINUX- MAGAZINE.ES
Se descubrió un defecto en el paquete Server PEAR XML-RPC incluido con el lenguaje de programación PHP. Si un usuario intenta ejecutar un programa PHP que implementa un servidor XML-RPC usando el paquete PEAR XMLRPC, es posible que un atacante remoto malicioso creara una petición XML-RPC la cual podría hacer que PHP ejecutara comandos PHP arbitrarios como el usuario Apache. El Proyecto de Vulnerabilidades y Exposiciones Comunes (Common Vulnerabilities and Exposures o CVE – http://cve.mitre.org) ha asignado el nombre CAN-2005-2498 a este problema con el paquete del Servidor PEAR ■ XML-RPC. -Referencia Debian: DSA-789-1 PHO4 -Referencia Gentoo: GLSA 200507-01 -Referencia Mandriva: MDKSA-2005:146 -Referencia Red Hat: RHSA-2005: 748-05 -Referencia Slackware: SSA: 2005-251-04 -Referencia Suse: SUSE-SA:2005:049
Número 12
9
LINUX USER NEGOCIOS
Schlagwort sollte hier stehen
NEGOCIOS XARA CÓDIGO ABIERTO Xara Xtreme es uno de los suites de diseño gráfico más versátiles y potentes del mercado. Ahora, la empresa que lo produce, Xara, quiere que sea de código abierto. Siguiendo la estela de otros productos que han puesto código a disposición del público con el fin de incrementar su cuota de mercado, Xara pretende liberar sus productos de diseño vectorial para competir ventajosamente con Adobe y su producto Illustrator y el recién llegado Expression de Microsoft. En un FAQ lleno de sinceridad y de aparente (bueno, no es que yo lo dude) buen rollo, los de Xara exponen clara-
mente sus preocupaciones con la entrada de Microsoft en el mercado del diseño gráfico y explican sus planes para portar
sus aplicaciones a otras plataformas como Linux y Mac (hasta ahora Xara sólo funcionaba en Windows). Según el citado documento, pretenden utilizar el potencial de la comunidad
para lograr un estándar de facto en este mercado, aun a costa de perder cierto grado de control sobre sus productos. Su plan de negocio pasa por vender versiones comerciales de Xara que incluyan plugins, fuentes y pantoneras propietarias, la venta de versiones preempaquetadas junto con manuales y, ah, sí: soporte. En fin, otra compañía más que decide “sacrificar” su producto para decantarse por adentrarse en las procelosas aguas del mercado de servicios. ¿A nadie se le ocurre un modelo de negocio más original, por favor? ■ http://www.xaraxtreme.org/
VMWARE GRATIS (QUE NO LIBRE) VMWare, la aplicación comercial líder que permite emular una máquina virtual dentro de un sistema Windows o Linux, acaba de poner a disposición de los usuarios una versión gratuita de uno de sus emuladores. El producto en cuestión es el VMPlayer, un emulador, que según la literatura de VMWare, es capaz de correr máquinas virtuales tanto en Linux como en Windows, ideal para departamentos de soporte, pruebas de configuraciones o ejecución de aplicaciones que podrían suponer un riesgo para un sistema. ¿Donde está la trampa? Pues que el VMPlayer tiene las misma relación con respecto al resto de la suite de VM al que tiene Flashplayer con el resto de las aplicaciones de Macromedia. Es decir, sirve para ver, pero no se puede tocar. Para poder emular un sistema, se ha de disponer de una imagen del sis-
10
Número 12
tema a emular, y para poder fabricar una imagen, se necesitan otros programas de la suite, tales como VMware Workstation, GSX Server or ESX Server, siendo todos ellos de pago.
Desktop 9), pero en el caso de que quieras utilizar VMPlayer para cualquiera de las funciones que según la publicidad va tan bien (por ejemplo, para el departamento de soporte corriendo
Sí, existen imágenes por ahí de sistemas completos, como los de Red Hat (Enterprise Server versiones 3 y 4) o Novell (Enterprise Server 9 y Novell Linux
una máquina virtual idéntica a la de un cliente – lo que supondría una máquina virtual personalizada), se ha de pasar necesariamente por caja para adquirir alguno de
WWW.LINUX- MAGAZINE.ES
los productos hermanos de la suite. Así puestas las cosas, VMWare Player parece devolvernos a los malos viejos tiempos donde se mutilaba premeditada e artificialmente las funcionalidades de una aplicación con el fin de obligar al usuario o a pagar un rescate para liberar las funciones secuestradas… o a ir en busca de un crack. Por supuesto que no hay nada de malo en querer ganar dinero produciendo software, pero volver a las demos a estas alturas de siglo, como que no. Puede que VMWare le esté viendo las orejas al lobo de QEMU, que con su módulo Accelerator (la única parte propietaria – pero gratuita – de todo el paquete) es capaz de obtener velocidades casi nativas de la máquina anfitriona y, por tanto, supone un serio competidor a VMWare. http://www.vmware.com/ http://fabrice.bellard.free.fr/ ■ qemu/
NOTICIAS
NOTICIAS COSECHA DE NI-SE-SABE-CUANDO Después de doce años de un cuidadoso proceso de fermentación, se trasvasa WINE desde las cubas del fase alfa a las barricas de las fase beta. Buen añada donde las hubiera la de 1993 sin duda, pero ya era hora. El proyecto ha pasado más de diez años en estado alfa y sólo recientemente y tal como reza una nota de prensa, “se encuentran disponibles […] las herramientas y librerías funcionalmente completas y lis-
tas para su comprobación y optimización comercial”. Muchos críticos del proyecto atribuyen su lento desarrollo al hecho de que algunos programadores han explotado los conocimientos adquiridos en los primeros años de programación con Wine para crear versiones comerciales del no-emulador. Una vez establecidos en el mercado, ya no tendrían interés en seguir contribuyendo a un competidor de código
abierto que pudiera fastidiarles el negocio y, por tanto, retirarían su apoyo al proyecto y se concentrarían en vender sus productos. Recientemente, sin embargo, algunas de las actitudes de estos supuestos arribistas han cambiado y ya es posible, por ejemplo, bajarse las versiones de desarrollo de Cedega desde la cvs de la empresa y compilárselo uno mismo sin la necesidad de pasar por caja.
Y ahora, con esta nuevas fase de maduración en marcha, es de esperar que pronto podamos paladear el maravilloso bouquet del Wine más puro y no tengamos que soportar el avinagrado sabor de tener que rearrancar Windows cada vez que haya que correr ese programa que tan imprescindible es pero que sólo corre en XP o 98. ¡Salud! http://www.winehq.com/ ■
LINUX.ES ESPAÑOL Después de una lucha con la administración de más de un año y medio, Esnic ha aprobado por fin el uso del dominio de linux.es. El dominio ha ido a parar a la asociación “Linux Español”, organización sin ánimo de lucro que produce LinEspa, una metadistro íntegramente en castellano y de bajo peso, ideal para máquinas poco potentes. Julian Coccia, presidente de la asociación ha declarado a Linux Magazine que no se va a realizar ninguna explotación comercial del dominio. Todo lo contrario, la intención de la asociación es poner
linux.es al servicio de tantas organizaciones y empresas que quieran utilizar subdominios asociados al dominio raíz. Los responsables de linux.es ya han adoptado una postura proactiva en este sentido y proyectan firmar asociaciones con varios portales españoles y hispanoamericanos, con el fin de aunar esfuerzos, foros y usuarios para mejor difundir el uso del software libre. De momento, la rama española de la FSF (Free Software Foundation) ya ha registrado el dominio gnu.linux.es, que enlaza directamente con la página en castellano de Gnu.org.
Según Coccia, ésta no es más que la primera de una serie de asociaciones con organizaciones y esperan poder servir a la comunidad del software libre con su oferta de subdominios gratis. Por tanto, la junta directiva de linux.es invita a todos los grupo de usuarios que se hagan con un subdominio linux.es con el fin de popularizar sus sitios y actividades y así contribuir a la popularización de Linux en el ámbito español y hispanoamericano. http://linux.es http://www.linuxespanol. ■ com http://gnu.linux.es
GPL 3 MÁS CERCA La versión 3 de la licencia más emblemática del software libre, la GPL, entra en la fase final de revisiones y modificaciones y pronto estará listo para su aplicación a programas y demás productos de software. A pesar de raras excepciones (véase el caso de WINE), normalmente el desarrollo de software libre es muy rápido, sin embargo, la versión 2 del GPL hace casi 15 años que no se toca. Por ello, las cabezas pensantes de la Free Software Foundation (entre ellos su fundador, Richard Stallman, y el principal consejero legal, Eben Moglen) llevan varios meses
12
Número 12
redactando el documento que regirá la mayor parte del software libre en el futuro. Según Moglen, la versión definitiva del GPL 3 estará disponible en noviembre, por tanto, para cuando leas esto, la nueva GPL probablemente ya esté disponible y incorporará importantes novedades y una redacción más clara. La primera revisión de la GPL, realizada en 1991, tuvo relativamente poco impacto en la industria, debido a la ínfima penetración en el mercado informático del software libre. Sin embargo, hoy en día, las cosas son bien distintas. Según
Con Zymaris, CEO de Cybersource Pty. Ltd., una empresa especializada en soluciones de código abierto de Melbourne, Australia, “… la GPL es hoy en día y sin lugar a dudas el instrumento legal de mayor importancia no sólo en el mundo del software libre, sino en muchas más áreas. Ha precipitado una marea de cambios en nuestra manera de entender la filosofía de la propiedad intelectual. Es debido a esto que la próxima versión de la licencia ha de ser la mejor implementación de los deseos y las necesidades de la comunidad del software libre”.
WWW.LINUX- MAGAZINE.ES
En este orden de cosas, los autores del documento intentan eliminar las ambigüedades y actualizar las condiciones para adaptarse al mercado del desarrollo actual, permitiendo, entre otras cosas, establecer las políticas con respecto a patentes, uso de software en red y computación “de confianza” tipo DRM. Por supuesto que aquellos desarrolladores que se sienten más cómodos utilizando la versión 2 del documento, seguirán pudiendo hacerlo y la FSF seguirá apoyándola legalmente. ■ http://www.fsf.org/
HTML• PORTADA
Diseño Web para todo el mundo
MÁS ALLÁ DEL HTML a tarea de configurar una página Web es cada vez más sencilla. Si somos usuarios de Linux, podemos elegir entre una amplia variedad de herramientas de edición HTML. Pero una vez hayamos preparado las cabeceras, formateado el texto y colocado alguna que otra imagen, puede que queramos dirigir nuestras creaciones Web hacia una dirección nueva. En este número veremos herramientas útiles para llevar a nuestros diseños Web más allá del HTML corriente. Para los lectores preparados a dar un gran paso en el mundo del diseño profesional, el primer artículo del tema de portada muestra cómo podemos poner en marcha nuestra propia tienda online utilizando la aplicación de código abierto
L
osCommerce. Más adelante veremos cómo podemos ampliar y simplificar nuestras páginas Web usando para ello Cascading Style Sheets (CSS). Las CSS dan a nuestras páginas un toque profesional sin necesidad de que seamos programadores o gurús de la Web para conseguir una apariencia inmejorable. En el siguiente artículo, “Diseño de Páginas Web con The GIMP”, se describe una técnica para diseñar vistosas páginas Web con el editor de imágenes The GIMP y convertir el resultado a HTML. En nuestro artículo final, “Flash en Linux”, abordamos las herramientas Linux para añadir animaciones Flash a nuestras páginas Web. Los lectores interesados en la Web
podrán disfrutar con “Tejiendo la Web: una vuelta por los editores HTML”, y también con “Apaño Rápido”, un artículo que explica cómo permitir a usuarios noveles editar páginas Web a través del editor de texto online FCKEditor. Si estamos buscando herramientas que den poderío y lustre nuestros diseños Web, no te pierdas el tema de portada de este mes.■
TEMA DE PORTADA osCommerce...................................... 14 Cascading Style Sheets..................... 19 Diseño Web con GIMP........................24 Opciones Flash en Linux....................28
WWW.LINUX- MAGAZINE.ES
Número 12
13
PORTADA • osCommerce
Empezando con osCommerce
TIENDA VIRTUAL ¿Con vistas a montar una tienda online para un cliente o para usted mismo? Si está pensando en obtener una solución conjunta entre una base de datos y un carrito de la compra casero, no se moleste: sólo tiene que echar mano de osCommerce. POR RIC SHREVES
o
sCommerce es un sistema basado en un catálogo y un carrito de la compra, con licencia Open Source, que viene cargado con un amplio abanico de características. El sistema osCommerce sobresale del resto de soluciones análogas en términos de funcionalidad y opciones. A menudo es laureado no simplemente por ser un producto de código abierto excelente, sino por ser un producto de comercio electrónico, ecommerce, magnífico. El sistema aporta una gran flexibilidad, pero como cualquier aplicación compleja, también tiene sus limitaciones y peculiaridades. A lo largo de este artí-
14
Número 12
culo se mostrará cómo instalar y ejecutar osCommerce.
Los Primeros Pasos Con muy poquitos conocimientos técnicos se puede conseguir montar un comercio online con osCommerce en unos 30 minutos. Sin embargo, si se desea personalizar o modificar el paquete por defecto, le hará falta tener (o conocer a alguien que los tenga) conocimientos de PHP. Téngase en cuenta que osCommerce no es fácil de personalizar, pero las buenas noticias son que se puede hacer, y por una fracción de lo que cuesta una solución propietaria. Antes de empezar hay que cumplir dos requisitos. El primero es crear una base de datos MySQL en el servidor web. Para la mayoría de la gente esto implicará acceder a phpMyAdmin para crear una base de datos nueva. Hay que anotar el nombre que se le da a la base de datos así como el nombre de usuario y la con-
WWW.LINUX-MAGAZINE.ES
traseña, ya que se necesitarán más adelante en el proceso de instalación. El segundo requisito es obtener el archivo que contiene los ficheros de osCommerce, extraerlos y moverlos al servidor. Para conseguir los ficheros, hay que darse una vuelta por el sitio web de osCommerce [1] o por la página web de osCommerce en SourceForge [2]. Los archivos vienen como un fichero tar de un tamaño de 871k. Los ficheros pueden descomprimirse usando cualquier aplicación que entienda este formato. Una vez que estén descomprimidos, verá que la estructura por defecto de osCommerce es la siguiente: /oscommerce-2.2ms2 /catalog /extras
Tras establecer la estructura de directorios que se desee en el servidor, tan sólo hay que subir vía FTP los ficheros a éste. Si se tiene acceso shell al servidor, se puede ahorrar algo de tiempo copiando el archivo directamente a él y descomprimiéndolo allí directamente. Aunque el resultado final es exactamente el mismo con los dos métodos, la descompresión de los ficheros en el servidor le ahorrará algo de tiempo con las transferencias FTP y con los posibles problemas que pudieran surgir en la transferencia de los mismos. La configuración más sencilla y probablemente la más común de la estructura de ficheros consiste en colocar los fichero del directorio /oscommerce-2.2ms2 en el directorio raíz del servidor web. Los directorios extras no son necesarios para la instalación. El directorio admin, dentro del directorio catalog, contiene el acceso del administrador al catálogo. Una vez que se tienen los ficheros en el servidor, usando el navegador web hay que acceder a http://servidor/
osCommerce • PORTADA
catalog. Si la descompresión tuvo éxito, aparecerá una pantalla de bienvenida de la utilidad de instalación. Hay que hacer clic en Install a New Online Store y listo…. La siguiente pantalla le pedirá la información referente a la base de datos que anteriormente anotó, es decir, el nombre de la base de datos, el nombre de usuario y la contraseña. También hará falta el nombre del servidor o la IP (en la gran mayoría de casos, la respuesta correcta a esta pregunta es localhost, pero lo puede comprobar, en caso de duda, en el servidor). Si todo es correcto, el sistema confirmará que la instalación inicial ha sido correcta y le avisará antes de realizar la instalación de los datos SQL. Una vez que se haya completado, casi se habrá concluido. La siguiente pantalla muestra algunos datos importantes del sistema de los que habría que tomar nota, incluidos la URL completa del catálogo que se acaba de instalar, el directorio raíz del servidor web, el dominio del cookie HTTP y la ruta donde se almacena el cookie. No debería modificar ninguno de estos datos a menos que se tenga una buena razón para ello y que realmente se sepa lo que se está haciendo. Nótese que esta página también contiene otro elemento de importancia, como, por ejemplo, una casilla de verificación que permite activar SSL. Le recomiendo que seleccione esta opción, ya que proporciona un mínimo de seguridad al servidor. Hay que asegurarse de que el soporte de esta característica depende de si el servidor web proporciona SSL por su cuenta. Una vez que se haya anotado esta información para referencias futuras y se haya tomado una decisión con respecto al uso de SSL, hay que hacer clic en Continue. La siguiente pantalla repite la información de la base de datos para que se tenga una referencia (pero ya lo teníamos anotado de un paso anterior). Se vuelve a pulsar en Continue. En este momento se le avisará de que los permisos de ciertos ficheros no están establecidos tal y como osCommerce lo requiere. Para ello, puede ser que necesite el programa de FTP para cambiarle los permisos a los directorios con CHMOD. Una vez que se hayan efectuado los cambios se pulsa el botón Retry. Si todo está en orden, aparecerá un mensaje de confirmación indicando que la instalación se
ha completado. (En caso contrario, compruébese de nuevo la información y realícese otra vez el comando CHMOD necesario). La rutina de instalación de osCommerce es fácil de utilizar y generalmente no presenta probleFigura 1: Pantalla principal de osCommerce tras su instalación. mas. Hay una tarea que omite, sin embargo, y para limitar los permisos de estos directorios remediarlo hará falta volver a usar el proy ficheros antes de ejecutar el sistema, grama de FTP una vez más. Tras acceder como se muestra en la Tabla 1. al sitio vía FTP hay que crear un directorio Tercero, para curarse en salud, nordenominado backups dentro de /catalog/ malmente se inserta un fichero admin. Este directorio no se crea en el index.html en blanco en todos los direcproceso de instalación y es necesario para torios que no se deseen que sean mostrarealizar las copias de seguridad de la base dos. El fichero index.html hace que a de datos, por medio de la función de baccualquiera que entre en esos directorios kup, en el sistema admin. Nótese que hay le aparezca una página en blanco e impique establecer los permisos de este direcde que pueda ver el contenido del directorio a 777 para que la función de backup torio. Es una solución sencilla para evitar de osCommerce funcione correctamente. que los extraños puedan ver la estructura Esperemos que en la próxima versión este de directorios. inconveniente se haya resuelto. Finalmente, la instalación por defecto Esto es todo. Compruebe el nuevo de osCommerce no incluye, para la seccatálogo y la sección admin para asegución de administración, una protección rarse que todo está funcionando correcpor medio de contraseña. Esto es un agutamente. jero de seguridad bastante importante que tendremos que solucionar por nosotros Proporcionando Seguridad mismos. Esperemos que se corrija en una al Sitio futura versión, pero hasta entonces, habrá que seguir una serie de pasos para evitar Una vez que se haya asegurado de que la que se produzca. La solución más común instalación se ha realizado correctamenimplica, o bien usar el panel de control del te, tendrá que realizar un par de pasos servidor para proteger ese directorio por sencillos para proporcionar un mínimo medio de una contraseña, o bien modifide seguridad e impedir el acceso a los car el fichero .htaccess para añadirle una visitantes no deseados. Primero, usando el programa de FTP se renombra o se borra el directorio /insTabla 1: Niveles de tallation. Esto es imprescindible para Permisos de Ficheros evitar que alguien vuelva a ejecutar la Recomendados rutina de instalación y de este modo, se sobrescriban los ficheros del sitio o bien /Directory/file Nivel de que se obtenga acceso al mismo. permiso Segundo: hay que limitar los permisos /admin/includes chmod 755 a los directorios críticos. Durante la ins/catalog/includes chmod 755 talación y la personalización del sitio, es /catalog/images chmod 777 fácil que se queden los directorios y los /admin/includes/configure.php chmod 644 ficheros con los permisos en 777, pero /catalog/includes/configure.php chmod 644 no hay que olvidar usar CHMOD para
WWW.LINUX-MAGAZINE.ES
Número 12
15
PORTADA • osCommerce
contraseña. No importa realmente la opción que se elija, tan sólo hay que decidirse por una y ponerla en acción, porque, de lo contrario, cualquiera podría acceder al panel de control del administrador y esto si que no lo deseamos.
cionar una idea de lo que se puede hacer con el sistema. De ninguna forma limita lo que uno puede escoger en el proceso de configuración y personalización.
Directo al Comprador
Un Primer Vistazo al Interfaz Cuando se accede por primera vez al sitio, uno se da cuenta de que hay una serie de características que se han activado y se muestran Figura 2: El carrito de la compra de osCommerce. algunos ejemplos (véase la Figura 1). También se pueden observar establezca los permisos deU algunas notas explicativas que ocupan la usuario adecuados. posición central de la página principal Tal como indica la nota anterior, lo más del catálogo. Hay que tomarse algunos probable es que desee solucionar este minutos en leer esta información. Una problema lo antes posible, pero hasta de las notas aparece en la parte de arriba entonces, este aviso aparecerá en cada con fondo rosa. Esta es la zona donde el página que visite. sistema muestra los mensajes principales En un primer vistazo, la pantalla inicial de aviso. La primera vez que se muestra podría parecer algo caótica: mucha inforel sitio aparece un mensaje de aviso en la mación, muchos módulos, un montón de parte de arriba de la página: productos, etc. No se desaliente. La inforAviso: Soy capazU mación se puede ocultar, los módulos se de escribir en el ficheroU pueden personalizar y los productos se pueden borrar y reemplazar por otros con de configuración: [su ruta]U sus propias categorías e información. Lo /includes/configure.php.U que se puede ver al principio es el intento Esto es un riesgo potencialU por parte de los desarrolladores de proporde seguridad. Por favor,U
Antes de empezar con lo que se puede hacer o con lo que se desea cambiar o añadir en el sistema, echémosle un vistazo a lo que osCommerce puede hacer nada más desempaquetarlo.
La Configuración Por Defecto Un gran número de características están activadas por defecto. Los visitantes del sitio disponen de una función de búsqueda, la posibilidad de ordenar por fabricante, la posibilidad de leer, o bien escribir comentarios sobre los productos, además de características útiles de marketing como una función Novedades y una opción para Ofertas Especiales. Los usuarios incluso pueden suscribirse a notificaciones por email de los productos e incluso se le permite informar a algún amigo por correo electrónico sobre la información de los productos. El sistema puede soportar una gran cantidad de información sobre cada producto, incluido el fabricante, el peso, precios netos y con IVA, opciones (que se pueden ligar a
Limpieza Bueno, si todo lo visto hasta ahora no le parece desafiante, tiene razón. Si se quieren modificar los colores o algún gráfico, pues no hay problemas. Que se quiere mover o borrar algunos cuadros y tener un encabezado y un pie de página personalizado, pues también es fácil de hacer. Pero ahora digamos que no le gusta cómo está diseñada la maquetación de la página. Esta clase de personalización es lo que hace a osCommerce realmente divertido y donde los desarrolladores ganan su dinero, al mismo tiempo que consumen grandes cantidades de cafeína y hace que se devanen los sesos. En cuanto a que la estructura de ficheros que trae por defecto osCommerce, a pesar del gran número de includes y llamadas a bases de datos, el sistema básicamente usa diferentes ficheros para cada página, lo
16
Número 12
que conlleva a que si se desea hacer un cambio haya que recorrer todas y cada una de las páginas para modificar y volver a modificar lo mismo (todo el tiempo probando y volviendo a probar para asegurarnos de que no estamos introduciendo pequeños errores fatales). Las buenas noticias son que al menos se pueden usar las etiquetas de comentario como ayuda. Desafortunadamente, las etiquetas de comentario de osCommerce están esencialmente limitadas al encabezado, al pie, al cuerpo principal, al navegador izquierdo y al navegador derecho, lo que significa que, para todos los cientos de líneas que quedan de tablas anidadas, el sistema apenas ofrece algún comentario interesante. Está bien, mientras se está intentando modificar este código se puede probar a
WWW.LINUX-MAGAZINE.ES
eliminar este lío de tablas anidadas. Se puede desechar el 20% del contenido simplemente eliminando la redundancia y haciendo uso de una solución más eficaz de los CSS. ¿Por qué no se elimina todo esto de una vez y se opta por una solución basada en CSS? Esta parte es un terreno peligroso. Cuando esté tentado en eliminar toda la estructura, le sugiero que piense detenidamente y que medite sobre las palabras de alguien que ya estuvo allí anteriormente: osCommerce es un sistema complejo y es probable que encuentre que la solución de eliminar lo que parece caótico tenga un efecto negativo difícil de observar a simple vista. Así que, cuando le asalte el deseo de hacerlo, resístase. Busque otra solución menos destructiva para conseguir su objetivo.
osCommerce • PORTADA
los precios como variaentrar en el sistema y bles), fotos reales y en consultar el estado de miniatura, además de un sus pedidos. espacio amplio para introosCommerce también ducir el texto que se desee produce una gran variepara explicar el producto. dad de informes básicos En este punto probablede los pedidos y sus mente sea una buena idea históricos, permitiendo pasar un rato navegando a los gestores identificar por el sitio para explorar a los clientes más los ejemplos que trae por importantes y a los prodefecto. Nótese que la disductos más populares. posición por defecto no Escaparatismo resulta muy atrayente, Básico pero descuide, más adelante se verá cómo se osCommerce viene con puede mejorar la aparienuna única plantilla. La cia. instalación predetermiEl carrito de la comFigura 3: osCommerce hace un seguimiento de la información de los productos nada, aunque incluye pra de osCommerce para cada elemento de la tienda. todas las características (Figura 2) es un buen que uno pueda necesielemento. Es concreto y fácil de usar, tar para tener el sistema ejecutándose en imágenes y referencias del modelo con soporte para carritos temporales; es el menor tiempo posible, no tiene para (Figura 3). Se pueden incluir precios, decir, los visitantes pueden añadir elenada un aspecto atractivo ni flexible. tanto netos como con IVA, y seleccionar mentos al carrito sin tener que estar Parece como si el equipo de varias clases de tasas. Nótese que en la registrados. Si un visitante posteriormenosCommerce estuviera más cómodo con Figura 3 se han incluido etiquetas HTML te decide proceder con la compra y realilos aspectos referentes a la funcionalidad dentro de la descripción del cuadro de zarla, el sistema le solicitará que se idendel proyecto y dejara olvidado el diseño texto de la descripción del producto, tifique (o que se registre en el caso de de la interfaz. Cuando se habla de disepudiéndose alcanzar un mayor nivel de que no sea un usuario registrado). Por ño, nos estamos refiriendo tanto al “look presentación de forma individual por defecto, el sistema está configurado para & feel” como a la facilidad de uso. Parte producto. que calcule la tasa de envío, y que acepdel problema es que el interfaz fue diseUna de las características más avanzate el pago mediante tarjeta de crédito o ñado hace unos cuantos años y no ha das soportadas por osCommerce es el contra reembolso. Estas opciones, y las envejecido nada bien. Simplemente seguimiento del inventario. El sistema mencionadas anteriormente, se pueden parece anticuado. permite introducir el número de unidacambiar fácilmente por medio de la conSi nos fijamos cómo ha evolucionado des en stock, y una vez que se hayan sola del administrador. En la instalación la construcción de las páginas se observa introducido en los pedidos, se encarga de por defecto están soportadas las formas un cúmulo de capas sobre capas de actualizar el stock automáticamente. Se de pago más habituales así como los tablas anidadas. El sistema está absolupueden introducir recordatorios automámétodos de envío y muchas otras se puetamente colapsado de tablas. No se usa ticos en las cantidades del stock, de den añadir al sistema instalando diversas CSS de manera eficiente e incluso las modo que se disparen cuando se sobresoluciones de terceros. páginas más básicas tienen cientos de pasen determinados niveles. Si no se Los usuarios registrados se pueden líneas de código. Por ello, la personalizanecesita esta característica, tan sólo hay beneficiar de diversas características, ción de la apariencia de la interfaz hace que dejar en blanco dicho campo. incluyendo la posibilidad de almacenar que sea una tarea larga. Los pedidos pueden seguirse por el sisvarias direcciones de envío y mantener Pero volvamos atrás un momento. tema por los gestores del catálogo a traun historial de pedidos. Como se había comentado, no estamos vés del interfaz del administrador. El sisinsatisfechos con la instalación por tema genera facturas básicas y albaranes Jugando a las Tiendas defecto. En vez de realizar un cambio de pedidos y según progresen las peticiototal, tan sólo se desean cambiar algunos osCommerce incluye varias herramientas nes por él, se pueden consultar los pedicolores y mejorar la apariencia con algude gestión útiles para administrar los dos y enviar a los clientes información nos gráficos mejorados. Si sus ambiciocatálogos y manejar los pedidos. La calipor email referente al estado del pedido. nes son limitadas, esto se puede hacer dad de las herramientas de gestión es Fíjese que la pantalla Order Admin fácilmente con uno de los trucos más una de las mejores razones para escoger (Figura 4) está configurada como un antiguos y simples: sobrescribiendo los osCommerce. espacio de trabajo del gestor del catáloficheros existentes con nuestros propios Los listados de productos incorporan go. Se puede actualizar el estado de los ficheros. toda la información necesaria para propedidos e incluso añadir una nota al Las imágenes de osCommerce se cesar los pedidos, incluyendo los nomusuario que posteriormente recibirá vía almacenan en dos localizaciones prinbres de productos, descripciones, pesos, email. Sus clientes también podrán
WWW.LINUX-MAGAZINE.ES
Número 12
17
PORTADA • osCommerce
cipales. El directorio de Las contribuciones imágenes contiene un harán que nuestra vida gran número de iconos sea mucho más fácil con genéricos e imágenes osCommerce, pero dichas referentes al producto. En contribuciones no son el subdirectorio infobox obra del equipo de desse almacenan las esquiarrollo del núcleo de nas redondeadas que se osCommerce, y por ello a pueden ver en los cuamenudo emplean soluciodros de las columnas nes no estándar. Mientras izquierda y derecha de la que cualquier contribupágina principal del sitio. ción funcionará con el Se pueden sobrescribir núcleo de osCommerce, estos ficheros con nuespuede ser que no funciotras propias versiones. nen junto con otras contriTambién se puede reembuciones. Si tiene pensado plazar el logotipo de hacer uso de las contribuosCommerce con el logociones, planéelo cuidadotipo de nuestra empresa. Figura 4: El Administrador de Pedidos proporciona información de los cliensamente y pruébelo antes Si aún se quiere ir más tes con un resumen de los productos del pedido. de instalar la aplicación en lejos y rehacer los botoel servidor. nes gráficos del sitio, habrá que esforEl encabezado y el pie de página lo Una de las contribuciones más potente zarse un poco más. Los botones que encontramos en los ficheros denominay popular es la llamada STS o Simple incluyen textos están ubicados en dos header.php y footer.php respectivaTemplate System (Sistema Simple de includes/languages/english/images/bu mente, que se encuentran en el directoPlantillas). Permite construir diseños de ttons. Para acceder a los botones de rio includes. La modificación de estos páginas HTML y, colocando ciertas marlos otros dos idiomas que vienen por ficheros es bastante sencilla y no deja cas, se añaden diferentes funciones de defecto tan sólo hay que reemplazar la mucho que hacer. osCommerce dentro del diseño. STS realpalabra english de la ruta por el idioLas columnas de la izquierda y de la mente abre el interfaz de osCommerce y ma que se desee. Una vez más, sobresderecha son algo más complicadas. hace posible que se pueda personalizar cribiendo estos ficheros con los fichePrimero, las columnas en sí mismas sin tener que estar modificando el código ros que contengan nuestros propios son los ficheros column_left.php y PHP que trae la aplicación por defecto. botones se consigue fácilmente persocolumn_right.php, que también se Otra de mis favoritas es la denominada nalizar el aspecto a nuestro gusto, encuentran en el directorio includes. Easy Populate. Me encanta porque me suponiendo que se desee conservar el No está nada mal. Sin embargo, parece permite insertar y extraer grandes catálodiseño de la maquetación por defecto. que el contenido de las columnas se gos de productos del sistema con tan encuentra por entero dentro de unas sólo unos clics de ratón. Profundizando unidades que osCommerce denomina Las contribuciones permiten que “boxes”, y estas unidades son ficheros Supongamos que no se desee conserosCommerce pueda soportar una gran diferentes. var el diseño de la maquetación por variedad de idiomas, definir estructuras Si lo que se desea es eliminar una de defecto y se quieran tener dos columde precios y descuentos y crear caracteestas unidades de una de las columnas, nas en vez de tres, o que se quiera rísticas de catálogos. La página de contrise accede al fichero de la columna apromover un cuadro de un sitio a otro de buciones del sitio de osCommerce lista piado, se busca la línea que hace referenla página. El siguiente nivel requiere más de 2000, que van desde las triviales ■ cia a esta unidad, se comenta la línea que se tengan conocimientos de PHP a las espléndidas. include o bien se borra. Incluso se puepara poder manipular el código fuente den mover estas unidades de una columde los ficheros. Se encontrará más RECURSOS na a otra cortando y pegando. cómodo trabajando a nivel de código [1] Sitio Principal de osCommerce: www. fuente, ya que un editor WYSIWYG Extensión de la oscommerce.com tiene poco que hacer con osCommerce. Funcionalidad con Así que vayamos calentando nuestro [2] osCommerce en SourceForge: sourContribuciones ceforge.net/projects/tep editor favorito y echémosle un vistazo a cuatro ficheros clave. osCommerce cuenta con una gran comu[3] Información: www.oscommerce.info osCommerce utiliza ampliamente los nidad y dispone de multitud de recursos [4] Foros de osCommerce: forums. ficheros include como una forma de reuque cubren la carencia de ciertas caracteoscommerce.com tilización de bloques de código. Como rísticas necesarias y útiles proporcionan[5] Contribuciones de la Comunidad: resultado, si se sabe dónde hay que do sus propias soluciones. osCommerce http://www.oscommerce.com/ tocar, se conseguirá el resultado esperallama a las soluciones ofrecidas por tercommunity/contributions do. ceros “contribuciones” [5].
18
Número 12
WWW.LINUX-MAGAZINE.ES
CSS • PORTADA
El mejor HTML con Cascading Style Sheets
MAGIA CSS
Las hojas de estilo en cascada (Cascading Style Sheets, CSS) nos ayudan a sacar brillo a nuestras páginas Web sin tener que hacer un complicado curso de programación. POR KRISTIAN KISSLING
A
principios de los 90, lo único que se esperaba del HTML era que renderizara texto y proporcionara enlaces. Las funcionalidades de diseño llegaron más tarde debido a los lobbies de la industria. La consecuencia es lo que tenemos hoy en día: tablas con columnas increíblemente largas y definiciones de tipos de letra chapuceras. El diseño para un texto de 100 caracteres puede requerir el doble de código HTML.
Listado 1: Ejemplo de HTML 01 <p> 02 <b>Red</b> is a beautiful color. <a href="http://www.example.org"> Sentences like this</a> are 03 <br> often used by Web Designers to demonstrate their layouts.<br> The content should be pointless 04 <b>pointless</b>, to avoid distracting the observer <br> from the layout. 05 </p> 06 These b-Tags are <b>outside</b> the p-Tags.
Para resolver el problema, el World Wide Web Consortium (W3C)[1] aprobó en 1996 la primera versión de las hojas de estilo en cascada (CSS). Las CSS proporcionan un medio flexible para definir elementos de estilo. Podemos usar CSS para conseguir un control más granular y eficiente de nuestros diseños Web. Nos permiten definir un diseño para cada elemento HTML, incluso para una sola letra. Podemos cambiar el tamaño de cada elemento, crear un marco y añadir espacio. En este artículo daremos un repaso de la versión actual de CSS, la Version 2.1. Necesitaremos un cierto conocimiento de HTML para seguir este artículo.
Ahorra Esfuerzo, Ahorra Tiempo Para escribir hojas de estilo en cascada, todo lo que realmente necesitamos es un editor de textos estándar. El editor de KDE, Kate, verifica automáticamente nuestra sintaxis. Aunque la verificación de ésta puede no ser estrictamente necesaria, es magnífico tenerla, teniendo en cuenta que CSS, en contraste con HTML, no funcionará si la sintáxis es errónea.
WWW.LINUX-MAGAZINE.ES
No tenemos que ser programadores para trabajar con CSS. Supongamos que tenemos una página HTML y que hemos definido un color para el enlace de texto en una etiqueta <body>. <body link="#000000" U alink="#CCCCCC" U vlink="#666666">
Debido a que no podemos cambiar el color de un único enlace usando HTML, todos nuestros enlaces se mostrarán de ese color. Con CSS podemos, sin embargo, manipular los enlaces individualmente de manera sencilla: <a href=U "http://www.linuxmagazine.com"U style="color: white; U text-decoration: none;">
El elemento style contiene las propiedades de diseño para el enlace. Éste ahora será blanco (color: white;) y sin subrayado (text-decoration: none). Veamos otro ejemplo. Imaginemos que tenemos varias páginas de texto llenas
Número 12
19
PORTADA • CSS
para apreciar el poder de CSS 2.1. La tabla en [3] nos indica qué navegadores soportan las propiedades de las CSS.
¿Dentro o Fuera? Existen tres métodos para añadir definiciones de estilos a nuestro propio HTML. Ya conocemos uno de ellos: podemos añadir las definiciones a las etiquetas del código fuente HTML.
Figura 1: Los parámetros de anchura y altura fijan el tamaño y anchura del elemento en sí mismo. Para calcular la anchura y altura del cuadro completo, añadimos los valores de relleno, bordes y margen, y los duplicamos.
de citas textuales (blockquote), y queremos cambiar el tipo de letra para resaltar las citas. Para ello, normalmente abriríamos todas nuestras páginas HTML y usaríamos la herramienta de búsqueda y reemplazamiento para hacer los cambios. Por supuesto, este método no es muy eficiente. Con CSS, sólo tendríamos que modificar una sola línea en el archivo central de CSS. blockquote U {font-family: Arial, U Helvetica, Courier;}
Todos los archivos HTML que usen la hoja de estilo central pasan a usar uno de los tres tipos de letra especificados para las citas textuales. CSS puede ahorrarnos un montón de codificación manual. Al mismo tiempo, nos ofrece una herramienta para definir y modificar la apariencia de elementos recurrentes de manera centralizada. Podemos incluso crear una hoja de estilo alternativa que optimice nuestro HTML a la hora de imprimir. Si un usuario quisiera entonces imprimir una página, se habilita una hoja de estilo que elimina los menús y las imágenes del texto, escala los tipos de letra o los cambia. Csszengarden [2] nos ofrece una buena idea de qué es lo que podemos hacer con una sosa página HTML. Los visitantes pueden diseñar sus propias hojas de estilo para tener un completo documento HTML. Los asombrosos resultados demuestran la capacidad gráfica de CSS. Dicho esto, necesitaremos un navegador bastante reciente
20
Número 12
$A href=U "www.linuxmagazine.com" U style="color: #FFFFFF; U text- decoration: none;"U This is a link $/A
El elemento style introduce el código CSS que sigue. Tenemos que poner las propiedades entre comillas y separarlas con signos de punto y coma. Un segundo método consiste en definir el diseño de la página en una etiqueta $style dentro de la cabecera de la página, de la manera siguiente: <head> <title> My webpage </title> <style type="text/css"> h1 {color: red;} </style> </head>
Un tercer método es poner las hojas de estilo en un archivo separado. Esto nos ofrece la ventaja de integrar las hojas de estilo usando un solo enlace en la cabecera de la página HTML. En otras palabras, todas nuestras páginas HTML toman su diseño de un único archivo llamado sheet1.css. <head> <link rel="stylesheet" U type="text/css" U href="sheet1. css" U title="test" media="screen"> </head>
No es necesario abrir cada archivo HTML para modificar la apariencia de la página Web. En su lugar, sólo tenemos que modificar el archivo CSS al que hace referencia la página.
La Vida en un Cuadro ¿Qué ocurre cuando aplicamos CSS a un único elemento de HTML? Por ejemplo,
WWW.LINUX-MAGAZINE.ES
Figura 2: Usamos un editor de textos como Kate, para componer rápidamente una página HTML estándar. Un enlace en la cabecera integra un archivo de hojas de estilo externo. El “body” es simple texto de muestra.
un trozo de texto, una imagen o incluso una sola letra. CSS crea un cuadro (véase la Figura 1) que comprende el contenido, el relleno interno, el borde y los márgenes exteriores. El borde en sí mismo tiene un efecto en el ancho total. El margen es la distancia entre el borde y el cuadro vecino. Podemos modificar el relleno, el margen y el borde de casi cualquier elemento. El cálculo del ancho total de un cuadro requiere algo de matemáticas. Dado un elemento con un ancho de 12 píxeles, 3 de relleno, 1 de borde y 4 de margen, el ancho total del elemento serían 28 píxeles: 12 (contenido) + 6 píxeles (relleno izquierdo y derecho) + 2 píxeles (bordes izquierdo y derecho) + 8 (márgenes izquierdo y derecho) lo que nos da 28 píxeles en total. Con CSS, al contrario que con HTML, nosotros definimos los bordes, relleno y márgenes de manera individual para cada página. Para añadir un marco por encima de un elemento podríamos introducir border-top: 1px solid black;. padding-right: 10px; lo cual modificaría el relleno del elemento a su derecha. CSS distingue así mismo entre elementos de bloque e incrustados. Los elementos de bloque crean párrafos, mientras que los elementos incrustados pueden ser parte de un elemento de bloque, pero no crean un párrafo. La etiqueta $b es un elemento incrustado típico. La etiqueta display:
Listado 2: Constructor de Contenedores 01 02 03 04 05 06 07 08 09 10 11
div.container_central { position: fixed; top: 0%; left: 30%; background: #CCCCCC; width: 400px; height: 600px; color: red; border: 1px solid black; padding: 20px; overflow: scroll; }
CSS • PORTADA
Figura 3: Página común y corriente. Sin una hoja de estilo o etiquetas de diseño HTML tendremos letras negras con los remarques en negrita. Los enlaces se subrayan en azul, tal y como se define en las preferencias.
block; puede convertir un elemento incrustado en uno de bloque. display: inline; hace justamente lo contrario.
Poner Bonito Nuestro HTML Como las páginas Web básicamente transportan información en texto formateado, enfoquémonos en el diseño del texto sin CSS. Dejamos a elección del lector la decisión de guardar las instrucciones en CSS en un archivo separado o bien usar alguno de los otros métodos comentados. Nosotros hemos elegido un archivo externo para el siguiente ejem-
Figura 4: Unas pocas instrucciones cambian la página por completo. Las secciones con las etiquetas b se muestran en rojo y con un tamaño de letra diferente.
plo. En primer lugar creamos un archivo HTML con las típicas etiquetas como <html>, <head> y <body>, y las guardamos como index.html (véase la Figura 2). Ahora tecleamos el breve texto del Listado 1 como el <body> del archivo, incluyendo todas las etiquetas. Abrimos un nuevo archivo con Kate y lo guardamos como sheet1.css en el mismo directorio. Podemos integrar la hoja de estilo usando un enlace a la cabecera de index.html: <head> <link rel="stylesheet" U
Figura 5: El diseño puede no llegar a los estándares de los diseñadores Web profesionales, pero es suficientemente bueno para demostrar cómo se puede modificar el tipo de letra.
type="text/css" U href="sheet1.css" U title="sheet1"> </head>
Sin la información del diseño, el navegador mostraría el texto de index.html con letras grandes y negras, con los fragmentos etiquetados con < b > en negrita y los enlaces subrayados en azul (véase la Figura 3). Para modificar el tipo de letra, color y tamaño, debemos editar ahora el archivo sheet1.css: 01 b { 02 font-family: Arial, Helvetica,Courier;
PORTADA • CSS
Figura 6: Bananas. La imagen está flotando en la zona superior izquierda. La distancia de 20 píxeles hasta el texto es cortesía del “margin-right”.
03 font-size: 130%; 04 color: red; 05 font-weight: bold; 06 font-style: italic; 07 } 08 09 p { 10 font-size: 16px; 11 }
Ahora, cuando abramos el archivo index.html en nuestro navegador, veremos la diferencia en las instrucciones del diseño que ha realizado la hoja de estilo (véase Figura 4). Podemos usar font-family para especificar qué fuente elegirá nuestro navegador para mostrar el texto. Los navegadores bajo Windows probablemente elegirán Arial, mientras que los de Mac usarán Helvetica y los Linux Courier. Si el navegador no tiene ninguno de estos tipos de letra instalados, el tipo de letra será el predeterminado. La propiedad font-size nos permite fijar el tamaño del tipo de letra. El navegador generalmente adopta un font-size del 100% del tipo de letra prefijado. Sin embargo, el código HTML tiene una etiqueta <p> con un tamaño de tipo de letra de 16 píxeles a continuación de la etiqueta < b >. El tamaño de tipo de letra se basa en el tamaño del elemento padre. Por lo tanto, si los 16 píxeles de la etiqueta <p> suponen el 100% para la etiqueta < b >, un font-size del 130% suponen 20.8 píxeles. Los colores se cambian justamente igual que con HTML. Podemos especificarlos tanto con un nombre de color como con un valor hexadecimal como #FFFFFF para la propiedad color. La propiedad font-weight nos ayuda a habilitar un tipo de letra en negrita. Podemos seleccionar un valor para bolder, lighter o normal. La opciones font-style son italic, normal u oblique. Ahora añadimos cuatro líneas adicionales dentro de las llaves para la etiqueta p:
22
Número 12
Figura 7: Pedimos disculpas a los diseñadores gráficos por esto, pero al menos demuestra el método. Podemos asignar imágenes de fondo a la mayoría de los elementos HTML.
letter-spacing: 2px; line-height: 25px; text-align: center; vertical-align: top;
El texto en el interior de la etiqueta <p> cambia apreciablemente (véase Figura 5). letter-spacing cambia el espacio entre letras y line-height cambia el espacio entre líneas. Las siguientes dos propiedades alinean el texto, text-align selecciona la posición horizontal del texto, que puede ser center, right, left o justify. Por su parte, vertical-align se encarga de la posición vertical. En nuestro ejemplo, el texto ajusta con top encima del bloque vecino. Las otras posiciones pueden ser middle y bottom.
Para Enmarcar El punto más interesante acerca de CSS es que podemos diseñar cada elemento de manera individual. Por ejemplo, podemos añadir border: 1px solid #000000; al elemento b en nuestra hoja de estilo. Todo lo que etiquetemos con < b > se rodeará por un marco negro con una línea continua de un solo píxel. Podemos modificar el marco, por supuesto, cambiando el tipo de línea con puntos o rayas. Si sólo necesitamos un marco para una sola página, podemos especificar border-left: 1px dashed red; o border-bottom: 1px dotted green;. La propiedad float nos ayuda con la posición de las imágenes. Creamos una imagen llamada testfig.jpg y la guardamos en el mismo directorio que nuestro archivo index.html. Podemos añadir ahora la imagen al archivo HTML con la etiqueta <p>: <img src="testfig.jpg">
Para usar el efecto, en primer lugar justificamos el texto. Luego nos vamos a la hoja de estilo y borramos la propiedad text-align: center; para el elemento p sin
WWW.LINUX-MAGAZINE.ES
olvidarnos de añadir una definición para manipular las imágenes: img { width:50px; height:50px; float: left; margin-right: 20px; margin-bottom:0px; }
float: left; posiciona la imagen a la izquierda. Los valores width y height escalan la imagen al tamaño requerido, y margin-right: 20px; añade un margen entre el borde derecho de la imagen y el texto (véase la Figura 6). Los diseños más atractivos dependen a menudo de las imágenes de fondo. Creamos una imagen llamada bgimage.jpg en el directorio principal y modificamos las propiedades del elemento p en la hoja de estilo. background-image: U url(bgimage.jpg); U background-position: center; U background-position: top; background-repeat: no-repeat; U background-attachment: fixed;
Aparece una imagen de fondo detrás del texto (véase la Figura 7). Debido al parámetro background-repeat: no-repeat; la imagen sólo se muestra una vez. Las propiedades background-position: center; y background-position: top; centran el gráfico y lo ajustan al borde superior del elemento vecino, al mismo tiempo que lo mantiene visible. Con background-attachment: fixed; conseguimos que la imagen se quede clavada pase lo que pase. CSS nos permite añadir imágenes de fondo a una gran variedad de elementos, incluyendo enlaces. Podemos cambiar el color de fondo para el enlace, eliminar los adornos del mismo
CSS • PORTADA
o asignarle un marco simplemente con modificar la hoja de estilo principal: a:link { color: white; U background-color: #CCCCCC; U text-decoration:none; } a:hover { color: white; U background-color: red; U text-decoration:none; } a:active { color: orange; U text-decoration:none; } a:visited { color: grey; U background-color: red; U text-decoration:none; }
Los enlaces sin usar aparecen ahora en blanco con fondo gris. Si posicionamos el ratón sobre un enlace, el fondo se vuelve rojo, y el texto naranja. Los enlaces que hayamos visitado cambian su color a gris con fondo blanco. ¿Qué pasa si necesitamos aún algunos enlaces en azul y negro? ¡Y definitivamente no queremos todas nuestras imágenes clavadas a la izquierda de la página! En este caso, podemos recurrir al poder de la herencia.
¡Ojo a los Crios! Un elemento padre precede al elemento hijo que lo rodea. La etiqueta < b > en el archivo index.html es el elemento hijo de <p> que en definitiva es el elemento hijo de <body>. La etiqueta <body> es el ancestro del elemento <img>, o dicho de otra forma: el elemento <img> es el descendiente de <body> (pero no su hijo). Los elementos hermanos están al mismo nivel, como el elemento <p> y el tercer elemento < b > de la imagen (véase Figura 8). Lo interesante de la herencia es que los elementos hijos generalmente heredan las propiedades de sus padres. Por ejemplo, una imagen no necesita usualmente más espacio que la tabla o celda en la que esté ubicada. El elemento hijo < b > hereda el tamaño de tipo de letra de <p>. La herencia puede darnos una gran ventaja, ya que permite pasar propiedades a través de las secciones. Existen varios métodos para esto: p b { color:green; } p > b { color:blue; } p + b { color:orange; }
Figura 8: Esquema del árbol de jerarquía en el código HTML, mostrando los elementos hermanos, padre e hijo.
* { color:violet; }
Podemos añadir estos cuatro secciones alternativamente a nuestra hoja de estilo, activando diferentes efectos. El selector de contexto de la primera línea muestra cualquier etiqueta dentro de las etiquetas <p> en verde. El selector de hijos de la segunda línea colorea el elemento de azul si es un hijo directo, en contraposición de si es un simple descendiente de <p>. El signo + de la tercera línea aplica el formateo a los elementos siguientes a <p> y descendiendo desde el mismo elemento padre. En nuestro ejemplo, el elemento de la línea 2 cumple estas condiciones. Sigue a <p> y tiene el mismo elemento padre, la etiqueta <body>, por lo que el texto dentro de las etiquetas se muestran en naranja. La cuarta línea colorea cualquier elemento que no tenga asignación específica de color.
¡Un Trabajo Con Clase! Los selectores de clase, o simplemente clases para abreviar, nos ofrecen la capacidad de dirigir cada hoja de estilo individualmente. Para ello, añadimos la siguiente línea a la hoja de estilo: *.word {color: blue;}
Ahora abrimos el archivo index.html y cambiamos el texto así:
etiquetas pertenecen a la clase .word, de nuevo en el archivo index.html. Cualquier etiqueta que especifiquemos como class="worr" asumirá automáticamente los valores de la clase .word, es decir, se volverá azul. Podemos diseñar también nuestras propias etiquetas con CSS. Para ello, en primer lugar definimos la nuestra propia en la hoja de estilo, por ejemplo redletter {color: red;}. Añadiendo <redletter> cualquier texto </redletter> a nuestro archivo HTML colorearemos el texto entre las etiquetas rojas.
Amor de Contenedor Si decidimos construir un sitio completo usando hojas de estilo, definitivamente tiene sentido construir containers. Para ello, dividimos nuestra página Web en sectores fijos usando la propiedad position, etiquetas <div> y clases. Añadimos las líneas del Listado 2 a nuestra hoja de estilo. Luego ponemos las etiquetas <div> alrededor del contenido de la etiqueta <body> en el archivo index.html: <body> <div class="container_central"> ... </div> </body>
El contenido de la página está dentro del contenedor <div>. Esto significa que podemos definir tantos contenedores como queramos y ahorrar marcos y tablas. Como la propiedad position contiene el valor de fixed, el contenedor se ajusta a una posición fija, al 0% del borde superior y al 30% del borde izquierdo de la pantalla. width y height nos permiten definir el área. Podemos fijar el color del tipo de letra a rojo y aplicar 20 píxeles de padding para asegurarnos de que tenemos suficiente espacio entre el contenido ■ y el borde.
RECURSOS ... as <b class="word">U non-descript</b> U as possible ...
En primer lugar, creamos un valor {color: blue;}, que se asignará a todas las etiquetas (*) pertenecientes a la clase .wort. El segundo paso es establecer qué
WWW.LINUX-MAGAZINE.ES
[1] Páginas CSS de la W3C: http://www. w3.org/Style/CSS/ [2] CSS al máximo: csszengarden.com/
http://www.
[3] Verificación de compatibilidad del navegador: http://www.css4you.de/ browsercomp.html
Número 12
23
PORTADA • GIMP
Maquetación Maquetaciónde depáginas páginasweb webcon conGIMP GIMP
UNA WEB DE COLORES
Un buen diseño de una página web depende de su maquetación. Algunas veces la mejor opción es usar un programa gráfico para diseñar la página y convertir luego el resultado a código HTML. El programa libre de manipulación de imágenes más versátil, GIMP, puede ayudarnos. POR PETER KREUSEL
A
lgunos puristas piensan que deben editar el código HTML línea a línea en un procesador de textos para obtener un resultado limpio, pero otros desarrolladores piensan en utilizar ocasionalmente otras alternativas. Una de las mejores es la que ofrece la opción de crear un fichero gráfico con GIMP y luego convertir el fichero directamente a HTML. La versión 2 de GIMP (www.gimp. org) o posterior incluye el plug-in Py-Slice, que convierte la imagen en una colección de trozos y luego crea una tabla HTML que organiza los trozos que la hacen coincidir con la imagen original. Los resultados pueden usarse fácilmente en páginas con atractivos gráficos, como el ejemplo que se muestra en la Figura 1.
24
Número 12
La mayoría de las distribuciones actuales proporcionan la versión 2.2 de GIMP y es la que usaremos en el resto del artículo. Después se ejecuta GIMP y se selecciona la creación de una imagen nueva (File|New). Se escoge la plantilla 800x600 en el desplegable Templates. Ésta es la resolución que se va a usar para el sitio web. Se introduce un nombre para el fichero, luego se almacenará bajo este nombre. Hay que asegurarse de que se usa el formato nativo de GIMP .xcf para poder tener acceso a todas sus características.
El Proyecto de Ejemplo GIMP hace uso de las llamadas capas. Se puede comparar el sistema de capas de
WWW.LINUX-MAGAZINE.ES
GIMP como una pila de transparencias (acetatos) fotográficas. Las capas deben verse juntas para visualizar la imagen completa pero se pueden editar por separado. Dialogs | Layers o [CTRL+L] abrirá el cuadro de diálogo Layers. Pulsando New Layer se crea una capa nueva. En el cuadro de diálogo, hay que habilitar Transparency bajo Layer Fill Type y confirmarlo pulsando OK para crear la nueva capa. Todos los elementos que se añadan a partir de ahora en la imagen, se ubicarán en esta capa. Pulsando [CTRL+A] se selecciona la imagen completa. La línea punteada que rodea la imagen muestra los límites de la selección. Ahora se selecciona Rounded
GIMP • PORTADA
Figura 2: Usamos una sombra y un difuminado, y movemos uno de los dos objetos de tipo texto para crear un efecto 3D.
plano en la paleta de la caja de herramientas; es decir, hay que establecer los valores rojo, verde y azul a 255. Hay que hacer clic en el área seleccionada con la herramienta de relleno para colorear la selección con el color blanco. Tras pulsar [CTRL + A] se deshabilita la selección.
Efectos Atractivos
Figura 1: Un sitio web con efectos 3D tras unos pocos clics con GIMP.
Rectangle en el menú Select; se establece el valor para el radio en cinco por ciento en Radius. De este modo se obtiene una selección con las esquinas redondeadas, como se muestra en la Figura 1. Se rellena la selección con el color rojo. Para ello, se selecciona en la caja de herramientas el color de primer plano y se establecen los valores para el rojo, verde y azul en 190, 0 y 0 respectivamente, para usar un tono de rojo oscuro. Se elige la herramienta Fill whole selection en Affected Area. Luego se hace clic en la selección para aplicar el color de relleno. Para el siguiente paso hacen falta algunas guías. Para dibujar una guía, se pulsa en Image | New Guide, se selecciona la dirección horizontal y se escoge la posición 100. Se repiten los pasos para crear otra guía horizontal, usando esta vez un valor de 525 y dos verticales en las posiciones 125 y 725. Las intersecciones de las líneas marcan las esquinas del rectángulo blanco en el centro de la imagen. Hay que asegurarse que se tiene activado la opción Snap to Guides en el menú View. A continuación se selecciona la herramienta de escalado de la caja de herramientas y se hace clic en Transform selection bajo Affects en la ventana principal de GIMP. Cuando pulsamos en el dibujo aparece el cuadro de diálogo Scaling information. Podemos
arrastrar las pequeñas cajas en las esquinas del rectángulo punteado de selección a las intersecciones de las guías para que la selección coincida con el área blanca vacía. Las guías atraerán automáticamente el puntero del ratón para mejorar la precisión de la posición. Luego tras seleccionar Scale se completa el procedimiento. Para rellenar la selección con el color blanco, hay que añadir otra capa a través del cuadro de diálogo de capas. Se selecciona la entrada superior y se pulsa New Layer, de nuevo haciendo el fondo transparente. Después se establece a blanco el color de primer
WWW.LINUX-MAGAZINE.ES
Los efectos 3D vienen por cortesía de Drop Shadow en el menú Script-Fu | Shadow. En el cuadro de diálogo capas, se selecciona la capa que se acaba de crear y luego se aplica la sombra. GIMP dispone automáticamente el espacio necesario para añadir la sombra a la imagen. Sin embargo, el fondo blanco no crece para ajustarse. Después de seleccionar la capa del fondo en el cuadro de diálogo de las capas, se hace clic en Layer | Layer to image size para solucionar esto. Las etiquetas 3D no existen aún. Para empezar se añade texto normal con la herramienta de texto. En nuestro ejemplo hemos usado la fuente Sans Bold Italic y con un color ligeramente más claro que el fondo, con los valores 250, 225 y 225 para el rojo, verde y azul respectivamente. Haciendo clic con la herramienta de texto en el área en blanco se
Número 12
25
PORTADA • GIMP
Figura 3: El plugin Py-Slice de GIMP crea una tabla HTML a partir de una imagen. Las guías se usan para separar las filas y las columnas.
abre la ventana de diálogo donde se puede escribir Created. Seleccione Sans u otra fuente no-itálica para el texto y reduzca el tamaño. Haciendo clic con la herramienta de texto debajo del texto que se ha añadido creará un nuevo bloque de texto. Ambos textos aparecen como capas diferentes en el cuadro de diálogo de las capas. Hay que seleccionar uno de los bloques y, en la caja de herramientas, se hace clic en el botón Create path from text, que aparece cuando se selecciona un texto. Tenemos que repetir este segundo paso para el segundo bloque de texto. Una ruta (path) tiene una funcionalidad similar a una guía; sin embargo, es de hecho un grafico vectorial inmerso con una forma arbitraria. No aparecerá en una impresión y no se puede exportar a un formato de imagen como JPEG o PNG. Sin embargo, no se puede convertir la forma descrita por la ruta a una selección. Después de crear una ruta a partir del texto, hay que seleccionar Paths en el menú Dialogs. Debe de haber dos objetos ruta en la lista de rutas de este ejemplo. La barra de botones en la parte inferior permite convertirla en una selección. Hay que aplicar esta función a la primera ruta. La selección es la base para las llamadas máscaras de capas. Hay que selec-
26
Número 12
cionar la entrada Created en la paleta de capas -el nombre reflejará el texto que se ha tecleado- y duplicar la entrada. Cuando se hace clic en el texto con la herramienta de texto, se puede cambiar el color en la ventana principal. El cuadro de diálogo de selección de colores muestra los dos últimos colores que se han usado; seleccione el rojo oscuro para el fondo. Ahora hay que abrir un cuadro de diálogo vía Layer | Mask | Add Layer Mask, se habilita Selection y se pulsa OK para confirmar. Luego será necesario hacer clic en Move to en la ventana principal y mover el texto rojo oscuro usando las teclas cursores; presionando la “flecha abajo” dos veces y la “flecha derecha” una vez, se consiguen los resultados obtenidos en la Figura 2. Recuérdese que son importantes los Affects: campo que hay que establecer para la capa que contiene el objeto que se desea mover. Seguidamente vamos a aplicar el filtro. Para ello, se selecciona Filter | Blur | Gaussian Blur (horizontal y vertical: 5 px) y se aplica el texto a los textos rojos, tanto a los claros como a los oscuros (seleccionando las capas y luego aplicando el filtro). Estamos tan sólo a un paso de conseguir el efecto 3D. Seleccionamos la capa del texto más claro y añadimos una sombra a la imagen (Script-Fu | Drop Shadow). Esto proporciona la segunda
WWW.LINUX-MAGAZINE.ES
línea en el cuadro del logotipo del ejemplo. A continuación se alinean los textos para que estén justificados a la izquierda y uno debajo del otro, tras ello se mueven a la posición deseada. Para hacerlo así, haga clic en las seis capas de texto en la capa de diálogo (dos para los textos y las copias, además de la capa Drop Shadow) en el espacio vacío a la derecha del símbolo del ojo. Esta configuración enlaza la capa seleccionada por lo que puede moverlas juntas a la posición final arrastrando el ratón. Todo lo que necesitamos en este momento es un cuadro blanco con la etiqueta. Para crearlo, dibuje una selección rectangular alrededor del texto, cree una nueva capa y rellene la selección de blanco. Utilice la misma forma de dibujar la barra blanca. Para conseguir el efecto de sombra mostrado en el ejemplo, hay que añadirle una sombra a los dos cuadros blancos. En el citado ejemplo, la barra de menú en la izquierda se usará para navegar por el sitio web. Para ello, primero se crea el cuadro superior dibujando otra selección rectangular, creando una capa nueva con la selección y rellenándola con el color blanco. Luego se duplica la capa nueva y se mueve hacia abajo la duplicada. Hay que repetir este paso hasta que se obtenga una para cada elemento del menú. Luego se aplican los efectos para darle el aspecto 3D, el difuminado y la sombra, a todas las capas. Por último, se usa la herramienta de texto para etiquetar los botones.
Pasando de GIMP a HTML Vamos a usar una tabla para convertir la imagen bitmap en HTML. Los elementos individuales del menú serán las celdas de la tabla; pueden ser asignadas a enlaces que cambiarán el contenido en área principal del centro. GIMP usa las guías para dividir la imagen. Hay que establecer las guías como aparecen en la Figura 3 haciendo clic en una de las reglas, manteniendo pulsado el botón del ratón y arrastrándolo a la posición deseada. Además, tan sólo se puede exportar una única capa. Como la información de las capas se perderá cuando se combine la imagen, será conveniente guardar una copia de seguridad de la imagen con un nombre nuevo antes de proseguir. Después haciendo clic con el botón dere-
GIMP • PORTADA
documento. Aunque la mayoría de los navegadores actuales mostrarán el código HTML de Py-Slice correctamente sin este segmento, hay que recordar que el estándar HTML requiere que se incluyan las siguientes líneas al comienzo de esta clase de ficheros:
cho del ratón en la paleta de capas se selecciona Flatten image. Ya no hay nada que nos pare. Seleccionando: Filter | Web | Py-Slice se invocará a la herramienta que nos hace falta para terminar. En la configuración, se selecciona png en The format of the images. Este formato es el más adecuado con respecto a las otras dos alternativas: JPEG usa lo que se conoce como compresión con pérdidas, lo que puede provocar que algunas líneas se difuminen. Las imágenes GIF no tienen esta desventaja, pero están limitadas a 256 colores. Lo que afectaría a los gradientes de colores del ejemplo del artículo. El formato PNG soporta hasta 16.7 millones de colores, usa compresión sin pérdidas y casi todos los navegadores pueden mostrarla. Hay que habilitar la opción Use separate directory for images? para almacenar las imágenes individuales cortadas de la imagen principal en un directorio independiente. A continuación se confirma pulsando OK; después se podrán ver los resultados en el navegador cargando el fichero ubicado en la ruta que se le haya especificado a Py-Slice.
Dentro del Código Fuente Si se carga el fichero HTML en un editor, se puede observar que GIMP ha creado una tabla codificada en HTML. Las celdas de la tabla contienen las secciones de la imagen tal y como se definieron con las líneas guía en GIMP. La Figura 4 muestra la relación entre el código HTML y la imagen; cada columna comprende tres filas de celdas. En el ejemplo, se deseaba que el área central en blanco fuera un bloque uniforme. Tan sólo hacía falta la estructura de celdas, como ha realizado GIMP, para los elementos del menú. Para ello, vamos a cambiar la parte correspondiente a la celda central en la segunda línea, es decir, la celda (1,1), de la novena línea
de código HTML a <td rowspan="7" valingn="top">. Además hay que borrar la sección <img alt=" " src="images/pyslice-1-1.png" width="582" height="48">. Esto deja el área totalmente libre para poder añadir nuestro propio código. Cualquier cosa que se añada en esta posición del código fuente, texto, imágenes u otros elementos HTML, aparecerán en esta zona. Se pueden borrar las siguientes seis celdas centrales (es decir, desde la (2,1) hasta la (6,1) que aparecen en las líneas 14, 19, 24, 29, 34 y 39 del código fuente HTML), ya que simplemente representan las secciones individuales de la zona central de la página. La Figura 5 da una idea del resultado. Para asegurarse de que la barra del menú realmente proporciona las funciones de un menú, habrá ahora que añadir a mano individualmente los enlaces. En las líneas de código para las celdas (1,0) hasta la (6,0) (Figura 4), hay que añadirle el código HTML para el enlace inmediatamente después de <td>, es decir: <a href="ruta/fichero">. Hay que cerrar la etiqueta al final de la línea añadiendo </a> antes de la etiqueta </td>. A continuación se necesita un segmento de código HTML para completar el
Figura 5: La tabla HTML generada a partir de la imagen, con algunas modificaciones manuales, sigue este patrón.
WWW.LINUX-MAGAZINE.ES
<HTML> <HEAD> <TITLE>[El título deU la página]</TITLE> <META HTTP-EQUIV= U "Content-Type" U CONTENT="text/html; charset= U iso-8859-1"> </HEAD> <BODY BGCOLOR=#FFFFFF> <div align="center">
y al final del fichero HTML: </div> </BODY> </HTML>
La etiqueta <div> alinea la página entera en el centro de la pantalla para asegurarse de que se posicionará correctamente en los navegadores que estén en alta resolución. El resto no es más que el comienzo y el final que todo fichero HTML debe contener. Para más detalles sobre la creación de páginas webs elegantes y eficientes, léase el artículo sobre Hojas de Estilo en Cascadas (CSS) de este mismo número.
Conclusiones La posibilidad que nos brinda GIMP de convertir imágenes en código HTML puede simplificar realmente la tarea de creación de una página de plantilla para nuestro sitio web. La técnica descrita en este artículo puede que no sea la mejor opción para cada proyecto web, pero muchos diseñadores recomiendan esta solución como una alternativa eficiente para la creación de páginas web atracti■ vas.
EL AUTOR
Figura 4: Las relaciones entre la imagen original de GIMP y el código HTML creado por Py-Slice.
Peter Kreussel estudió Alemán, Inglés y filosofía. Actualmente, es director de una publicación digital e impresa. Peter ha tenido un ordenador desde los días del C64.
Número 12
27
PORTADA • Flash
Un vistazo vistazo aa las las herramientas herramientas Flash Flash para para entornos entornos Linux Linux Un
FLASH EN LINUX Flash es la aplicación más usada para contenidos Web animados e interactivos. Pero como sabemos, Flash y Linux son mundos que siempre han colisionado. Veremos en este artículo el estado actual de las soluciones de código abierto para Flash. POR JENS FRANKE
F
lash comenzó en 1995, cuando FutureWeb presentó un precursor llamado FutureSplashAnimator. Un año más tarde, Macromedia compró FutureWave, publicando la primera versión de Flash en 1997. La mayoría de las animaciones Flash se crean con el entorno de creación Macromedia Flash. El formato usado en las animaciones se denomina Small Web Format (SWF). El reproductor Macromedia Flash Player [1] tiene un monopolio de facto en la reproducción de archivos SWF. De acuerdo con Macromedia, la cifra es cercana al 98%. Por supuesto, estas cifras pueden variar en función del tipo de usuario al que se
28
Número 12
pregunte. No existe una verdadera alternativa a Macromedia Player de momento. La única esperanza de cambiar esto recae sobre la alternativa libre GPLFlashPlayer, que va actualmente por la Version 2.
Flash Hoy Flash ha continuado avanzando durante ocho años, y se le reconoce el liderazgo en el mercado actual de la creación multimedia. Para muchos, Flash todavía es la herramienta con la que se hacen molestas intros, destellantes banners y poco más. Lo cual es una pena, ya que ha alcanzado la mayoría de edad. Grandes nombres del panorama de las
WWW.LINUX-MAGAZINE.ES
TIs están implementando herramientas para crear interfaces de usuario basadas en Flash, como la próxima versión de NetWeaver [2] de SAP. E IBM lo ha elegido como el formato de salida estándar para mostrar el contenido de las llamadas Rich Internet Applications en su plataforma de código abierto OpenLaszlo. Puede que nos preguntemos acerca de algunos de los problemas asociados con Flash, como los señalados por el gurú de la usabilidad Jakob Nielsen en su artículo en [3]. Mucha gente desconoce que Macromedia y Nielsen firmaron una alianza estratégica para acabar con los continuos problemas de usabilidad con las aplicaciones Flash.
Flash • PORTADA
(véase Figura 2), con paletas móviles para color, pinceles, escenas y el esquema de láminas. El esquema de láminas (véase Figura 3) se muestra en el módulo de ilustraciones y sigue el principio de las capas de papel de cebolla. En función de si hemos seleccionado el anterior o siguiente cuadro, veremos una versión ligeramente Figura 1: El entorno de desarrollo más extendido para Flash de transparente de los momento es Macromedia Flash MX 2004 Professional. elementos, lo cual es una gran ayuda a la En el cuadro titulado “Problemas inihora de crear animaciones fotograma a ciales con Flash” encontraremos un resufotograma. El módulo de animación (véase Figura men de algunos problemas relacionados 4) tiene una línea de tiempo en lugar del con él y enlaces a descripciones más esquema de láminas, que al igual que el detalladas. Pasamos ya a comentar algude Macromedia Flash, nos debe resultar nas de las herramientas Flash disponifamiliar. También encontramos un cuables para usuarios Linux. dro de herramientas, sin olvidar el área Herramientas de Animación para dibujar en sí mismo. Los apartados KToon del menú incluyen una barra con iconos KToon[4] es un conjunto de herramienpara las funciones multi-módulo, tales tas para la animación desarrollado por como abrir y guardar archivos. La segunToonka Films. Se lanzó bajo licencia GPL da parte de la barra cambia para reflejar y en la actualidad va por la versión 0.7 el módulo en uso. Beta. El programa requiere QT 3.3.2 [5], la infraestructura C++ multiplataforma de los desarrolladores noruegos Trolltech. KToon tiene el ambicioso objetivo de combinar las técnicas de animación tradicionales y digitales en una única herramienta. Si preferimos un método tradicional, nos sentiremos más cómodos trabajando con el módulo de ilustraciones. Para aquellos que prefieran trabajar en un entorno digital, deberán elegir el módulo de animación. Al ejecutar KToon, apreciaremos que es un programa orientado a paletas de color Figura 2: La interfaz de KToon usa un buen número de paletas.
WWW.LINUX-MAGAZINE.ES
El Futuro de Flash Macromedia ha firmado un memorando de compromiso con Adobe que constituirá la base de la venta de Macromedia a finales de año. No hay riesgo de que el acuerdo no se consolide, e igualmente tampoco de que la plataforma Flash desaparezca. Flash es, definitivamente, una de las principales razones del interés de Adobe en Macromedia. Las versiones ocho del entorno de creación y del reproductor se esperan para final de año. Macromedia tiene también en estos momentos la ambigua meta de establecerse en el mercado de los dispositivos móviles. Se han llegado a acuerdos para la implementación del reproductor Flash Lite con Samsung y Nokia esta primavera, con las miras puestas en la promoción y expansión de la tecnología Flash.
La interfaz da una buena impresión, excepto por el hecho de que algunos iconos parecen recargados, y porque puede ser difícil imaginar las funciones que esconden a primera vista. Afortunadamente KToon, para ayudarnos, tiene información emergente al pasar el ratón por encima. La versión 0.7 nos permite elegir la interfaz en español, francés o inglés. Si se atreve a proporcionar una versión en otro idioma, los desarrolladores le
Número 12
29
PORTADA • Flash
estarán profundamente agrapo montado alrededor de decidos. Podemos encontrar Özkan Pakdil se fijó la meta una plantilla de idioma de programar una herra(archivo con la extensión .ts) mienta de animación, algo en la página Web de KToon. parecido a Macromedia La plantilla no es más que Flash de Windows, pero un archivo XML que podepara Linux. Llegaron a la mos editar. Aunque no podefinal del concurso tras tres mos integrar el archivo edimeses de desarrollo. Pero tado por nosotros, podemos desde entonces, las cosas enviarlo al equipo de KToon han ido muy despacio para para que lo incluyan en la F4L [6]. Dicho lo cual, los próxima versión. análisis y estudios publicaKToon es bastante rudidos recientemente tienen mentario de momento. Por una pinta realmente promeejemplo, la capacidad de Figura 3: El cuadro de tedora. La interfaz se parece crear vectorizaciones comláminas de KToon nos más a la de Flash que la de plejas, una de los puntos ofrece un claro resuKToon y es más intuitiva fuertes de Flash, es muy men de las capas y desde el punto de vista del limitada. A pesar de sus pasos en la animación. usuario. limitaciones, KToon puede Desafortunadamente, la exportar en el lenguaje de programación única publicación hasta ahora ha sido de Flash, Actionscript. una Beta versión 0.02. Está bastante Aunque puede guardar archivos en forlejos de poder ponerlo en producción y mato SWF, el programa exporta en realino soporta la creación de fotogramas dad la animación en formato bitmap fotoclave ni exporta a formato SWF. Por lo grama a fotograma, lo cual tiene un efecto tanto, es difícil considerarlo una alternadevastador en el tamaño final de los architiva a KToon de momento, aunque los vos. El equipo de KToon ha prometido comienzos parecen prometedores. muchas mejoras para la siguiente versión. FAME: Sólo para Expertos Entre otras cosas, el objetivo es añadirle un módulo de efectos para mejorar la El software libre es un tema bastante capacidad de trabajar con vectores. traído y llevado entre los desarrolladores de Flash en estos momentos. En muchos F4L: Flash para Linux blogs, el acrónimo FAME [7] conduce a información relativa a una plataforma En 2003 IBM lanzó un concurso de proindependiente para el desarrollo en gramación para Linux. Un pequeño equi-
FLASH. FAME viene de los siguientes componentes: Flashout + ASDT + MTASC + Eclipse. Muchos usuarios habrán oído hablar de Eclipse, una plataforma abierta de desarrollo configurable usando plug-ins. ADST es el Actionscript Development Tool para Eclipse. Actionscript, el lenguaje de programación del entorno de desarrollo Macromedia Flash, se basa en el estándar ECMA 4. MTASC es el acrónimo de Motion Twin Actionscript 2 Compiler, el primer compilador de Actionscript basado en software libre. MTASC ofrece beneficios, como son una extremadamente rápida compilación de las clases Actionscript y la generación
Problemas Iniciales con Flash Devolver al botón “atrás” su función habitual: http://www.actionscripts.org/ tutorials/intermediate/ Enabling_a_back_button_within_flash/ index.shtml http://weblogs.macromedia. com/cantrell/archives/2005/06/ deep_linking_in.cfm#more Sorporte para la rueda del ratón: http:// www.communitymx.com/content/ article.cfm?cid=E81CE Menú del botón derecho: http://www. metamorphozis.com/tutorials/ flash_customized_right_click_menu_in_f lash_mx_2004_tutorial.shtml Mostrar nuestro código a la comunidad del software libre: http://weblogs. macromedia.com/mesh/archives/2005/ 04/adding_a_view_s.cfm Motor de búsqueda orientado a páginas Flash: http://codeazur.com.br/stuff/ fugsp/ Accesibilidad en Flash, apuntando en la dirección correcta: http:// www. macromedia.com/macromedia/ accessibility/features/flash/ Flash y soporte CSS, un comienzo prometedor: http://www.actionscript.org/ tutorials/beginner/css_in_flash/index. shtml Integración de archivos SWF para compatibilidad W3C: http://www.alistapart. com/articles/flashsatay/ Impresión de páginas Flash: http://www. actionscript.org/tutorials/beginner/ the_printjob_class/index.shtml Cambio del tamaño de la letra de una aplicación: http://www.asual.com/ enflash/demos.html
Figura 4: Usamos el módulo de animación para organizar el flujo de animaciones.
30
Número 12
WWW.LINUX-MAGAZINE.ES
Flash • PORTADA
directa de archivos SWF la experiencia del usuasin necesidad de rio. Hoy día, Internet es Macromedia Flash. El cuartanto una fuente de teto se completa con información como una Flashout. El plugin para plataforma de presentaEclipse Flashout soporta el ciones. visionado de SWFs compiIndependientemente de lados en la plataforma si aprobamos este deEclipse. Además, el plugin sarrollo, hay señales de Flashout proporciona más que no hay vuelta atrás, opciones de depuración debido a que Internet que el que podemos ofrece a los fabricantes, encontrar en el entorno de mediante esta vía, una Macromedia. nueva y rápida manera El entorno de desarrollo de publicitar sus producFAME ya soporta la creación tos. de aplicaciones Web a nivel Por supuesto, debeprofesional. Muchos desFigura 5: Una operación virtual de rodilla con Edheads (www.edheads.org/ mos señalar que Flash arrolladores Flash usan el activities/knee/), que demuestra el potencial de interacción de Flash. no es la clave para alcanpaquete FAME como suplezar el éxito con nuestra mento o alternativa a los productos de Linux. Esto nos proporciona un remedio, página Web. Si únicamente usamos Macromedia. Sin embargo, el entorno ya que al menos ejecutará Macromedia Flash para diseñar la página, sin nada FAME de momento no es adecuado para Flash MX con una cierta fiabilidad. Hasta que respalde la presentación, es prodiseñadores gráficos o usuarios noveles. No que las soluciones nativas Linux con bable que enfademos a nuestros visiexiste aún un plugin de interfaz gráfica KToon o F4L no estén a punto, tantes. Pero Flash es tan rico en funpara ayudar a los no programadores, por lo CrossOver Office puede ser la única cionalidades que hacer un uso adeque debemos acercarnos a FAME bajo alternativa de verdad para los usuarios cuado del mismo ya es cosa de creanuestro propio riesgo. Sin embargo, gracias Linux sin dominio de la programación dores de conceptos, diseñadores gráfial aumento de su fama, es sólo cuestión de que quieran crear animaciones Flash con cos y desarrolladores. tiempo hasta que esté disponible un adecierta entidad. Con la excepción de FAME, Linux carecuado front-end para el entorno FAME. ce de una herramienta Flash madura y Conclusiones los usuarios no programadores van a Alternativas: CrossOver La actual versión 7 de Flash Player pasar un rato complicado si abordan la Office puede combinar texto, sonido, imágecreación de Flash bajo Linux. Al igual CrossOver Office [8] de CodeWeavers nes y video de manera impresionante que otros muchos proyectos de software ejecuta programas de Windows en para alcanzar niveles nunca vistos en libre, KToon y F4L necesitan ayuda ambiciosa e instruida para conducir el ■ desarrollo a buen puerto.
RECURSOS [1] Flash Player: http://www.macromedia. com/go/getflashplayer [2] SAP: http://www.sap.com//company/ press/press.epx?PressID=4519 [3] Flash: 99% Bad: http://www.useit.com/ alertbox/20001029.html [4] KToon: http://ktoon.toonka.com [5] QT: http://www.trolltech.com/ products/qt/index.html [6] Flash para Linux: http://f4l. sourceforge.net [7] FAME: http://www.osflash.org/doku. php?id=fame [8] CrossOver Office: http://www. codeweavers.com/products/cxoffice/ Figura 6: El Top11 de AOL (http://music.channel.aol.com/top11/main.adp) usa Flash para combinar video, información y elementos interactivos.
WWW.LINUX-MAGAZINE.ES
[9] Flash-Plattform: http://www. macromedia.com/platform/
Número 12
31
EVALUACIÓN • Editores HTML
Un paseo por los editores HTML de Linux
TEJIENDO LA WEB
Un buen editor HTML tiene que ahorrarle tiempo y problemas al desarrollador. Vamos a ver en este artículo los mejores editores gratuitos para Linux. POR TIM SCHÜRMANN
S
i se está familiarizado con los comandos HTML, se puede usar un editor de texto sencillo como Emacs, Vi o Kwrite para diseñar un sitio web. La mayoría de los editores de texto reconocen los comandos HTML y resaltan la sintaxis de las etiquetas. Si se tienen pocas páginas, esta solución podría parecer útil, pero en proyectos a gran escala estos editores no parecen ser los más idóneos dada la facilidad con la que le perderemos el hilo. Afortunadamente, existen multitud de herramientas que proporcionan características adicionales para estos proyectos de gran envergadura. Los editores de HTML basados en texto, es decir editores de texto especializados en HTML, requieren que los usuarios tengan los conocimientos suficientes de HTML. Por
32
Número 12
el contrario, los generadores web permiten la creación de páginas de un modo visual. Después de terminar con el diseño, la herramienta genera la página web. Los resultados en el navegador pueden ser completamente diferentes a los vistos en el generador web debido a las restricciones que impone HTML. Los denominados editores WYSIWYG (What You See Is What You Get) proporcionan una buena solución. De nuevo, se crea la página de forma visual con unos cuantos clics de ratón, pero el editor tiene en cuenta las limitaciones del HTML y se atiene a ello. El número de aplicaciones Linux en ambas categorías es bastante escaso. Tan sólo hay unos cuantos editores WYSIWYG y aún no he encontrado un verdadero generador web. Las cifras refe-
WWW.LINUX- MAGAZINE.ES
rentes a editores basados en texto son mejores. En este artículo, se mostrarán algunos de los editores HTML para Linux.
August El editor HTML August [1] (Figura 1) es el más antiguo y no es precisamente de los representantes más famosos de su especie. La última versión, 0.63b, data de finales del 2001, pero aún lleva a cabo su tarea perfectamente. August simplemente requiere para funcionar un sistema operativo TCL/TK , algo que actualmente proporcionan la mayoría de las distribuciones. La documentación recomienda además el uso de las herramientas externas Image Magick y Weblint. Utiliza la primera para comprobar las proporciones de la imagen y
Editores HTML • EVALUACIÓN
Weblint para verificar la maquetación. Después de descomprimir August, se teclea ./august en el recién creado directorio august0.63.src para ejecutar el editor. El GUI se parece a la mayoría de los editores de texto normales con resaltado de sintaxis. August dispone de cuadros de entrada para algunas etiquetas, lo que permite al usuario hacer clic para especificar los parámetros requeridos, como nombres de enlaces de ficheros, por ejemplo, o el aspecto Figura 1: Haciendo clic en los botones de la GUI para una imagen. August se añaden etiquetas HTML al documento. August puede guardar cadenas de texto arbitrarias con objeto de usarlas El menú Dialogs contiene un surtido como plantillas para formar una base de asistentes para el manejo de elemenpara la creación de nuevos documentos. tos HTML críticos. El asistente Quick La plantilla por defecto, Basic Structure, Start proporciona una selección de metacrea un documento HTML versión 3.2 etiquetas que rellenan la sección de aunque August también maneja HTML cabecera del fichero HTML con detalles 4.0 y CSS. sobre el autor o la fecha de creación. August puede ejecutar una selección de Bluefish también cuenta con un asistente navegadores web para previsualizar los que ayuda a publicar colecciones de resultados. Entre ellos se encuentran fotografías. El asistente toma como Netscape, Konqueror, KDE help y el naveentrada un conjunto de ficheros de imágador basado en texto Lynx. Los usuarios genes y proporciona una página web con pueden ampliar la lista. Seleccionando los thumbnails como salida. Ninguno de Tools | Weblint Check se le indica a August los otros candidatos de este artículo que verifique un fichero, pero carece de posee una característica parecida. un analizador sintáctico. La ayuda tan Otros detalles reducen la carga de disesólo proporciona un breve resumen de las ño de la página web. Por ejemplo, la funcaracterísticas del programa. ción extendida Replace convierte automáticamente los caracteres no estándar Bluefish en código HTML. El cuadro de diálogo El editor HTML Bluefish [2] (Figura 2) reemplazará las expresiones en cualquier tiene un interfaz GTK que se adapta fichero abierto en caso necesario; es una perfectamente a los entornos Gnome y herramienta útil en el caso de que se posee un impresionante conjunto de necesite modificar a la vez en todas las características que lo han hecho muy páginas subordinadas de un proyecto. popular entre los usuarios del escritorio Aunque Bluefish fue diseñado para Gnome. Se dice que la ingente cantidad de opciones puede resultar complicada para los nuevos usuarios. En el lado positivo, Bluefish se puede personalizar, permitiendo a los autores web asignar las funciones frecuentemente utilizadas a la caja de herramientas rápida. El programa también cuenta con utilidades para la gestión de proyectos y un gestor de hojas de estilo. Bluefish no posee un modo de previsualización integrado y hay que utilizar un navegador Figura 2: Editando HTML con Bluefish. externo.
WWW.LINUX- MAGAZINE.ES
usarse con HTML, también puede manejar otros formatos. El resaltado de sintaxis admite XML y Javascript, además de los lenguajes de programación C y Python. Suponiendo que se tenga instalado Ispell, Bluefish también detectará las faltas de ortografía de los documentos. Para validar el código hace uso de los programas externos Weblint o Tidy. Para evitar descuidos, los autores web pueden habilitar diversas ayudas para la entrada de de código. Por ejemplo, Bluefish cerrará cualquier etiqueta que se deje abierta o convertirá las etiquetas en minúsculas. No dispone de ayuda en línea, pero se puede encontrar un excelente manual en el sitio web del proyecto.
Erwin Como August, el editor Erwin [3] se centra principalmente en el rendimiento y en la claridad (Figura 3). El proyecto se fundó en 1999, aunque el ritmo de desarrollo es bastante lento. El editor se parece mucho a Bluefish sin llegar a disponer de la misma clase de funcionalidad. Por ejemplo, Erwin dispone de un asistente denominado Quick Start y de unas cuantas herramientas rudimentarias para los elementos estándar, como tablas e integración de imágenes. Como August, Erwin usa iconos o elementos del menú para añadir instrucciones formateadas. Presionando [CtrlP] se cierra la etiqueta actual, pero sin comprobar si realmente es necesario. Erwin también carece de una rutina de validación de documentos HTML, pero al menos dispone de una previsualización integrada.
(X)HTML-Format El editor que responde al nombre de (X)HTML-Format [4] está basado en el lenguaje de programación multiplataforma Java y por ello requiere de un entorno operativo Java. El programa es gratuito, pero el autor no proporciona los ficheros fuente. Las características disponibles en (X)HTML-Format son comparables a las proporcionadas por Bluefish. La herramienta puede sustituir cadenas
Número 12
33
EVALUACIÓN • Editores HTML
de texto en múltiples ficheros y conCuando se pulsa sobre el icono vierte automáticamente los caractepárrafo, (X)HTML-Format inserta res no estándar en código HTML; una etiqueta de apertura <p>. Los (X)HTML-Format también dispone usuarios deben cerrar la etiqueta de un gestor de proyectos y de un manualmente o bien seleccionar un previsualizador interno, aunque no elemento redundante del menú muestra correctamente ni la más denominado Edit | <p> | </p>. simple de las páginas. Aunque, La ayuda online es adecuada y siempre se puede optar por un naveproporciona una introducción basagador externo como herramienta de da en Internet al pulsar el botón. previsualización. Quanta+ El menú Tools contiene una colección de programas útiles y de enlaLa contrapartida de KDE a Bluefish ces, incluido el registro, en los motose llama Quanta+ [5] (Figura 4). res de búsqueda. La mayoría de los Quanta+ está basado en una verelementos del menú y muchas de las sión gratuita del editor comercial funciones del programa simplemenQuanta Gold, aunque el desarrollo te son enlaces a los sitios webs de ya no seguirá estando relacionado los desarrolladores. La opción Edit | con el producto comercial y contiFormat es una excepción muy útil, Figura 3: Erwin proporciona pocas opciones, pero apenuará con la licencia gratuita. En el toma un trozo de código sin formato nas consume recursos. KDEWebdev, Quanta forma ahora el y devuelve un resultado muy agranúcleo del módulo de desarrollo rística denominada Quick Document crea la dable de leer. web de KDE. Como todas las distribucioestructura de un documento nuevo, propor(X)HTML-Format almacena las estructuras nes importantes proporcionan Quanta+; cionando meta-etiquetas, aunque carece de habituales en los llamados Code Snippets. se podrá usar el gestor de instalaciones la definición DOCTYPE que estipula el estánAdemás, (X)HTML-Format proporciona asisde la distribución para instalarlo. dar HTML. Por otro lado, (X)HTML-Format tentes en forma de simples cuadros de diáloQuanta+ tiene más opciones que su tiene un editor CSS. go para los elementos comunes. La caractecontrapartida, Gnome Bluefish.
Tabla 1: Resumen de Editores HTML Amaya 0.91
August 0.63b
Bluefish 1.0
Erwin 0.8
Licencia
propia(W3C)
GPL
GPL
GPL
Firefox 1.0.x cuneAform 0.3.1 MPL
Idioma Resaltado de la sintaxis Creación de una plantilla esqueleto Corrector Ortográfico Previsualización
Inglés
Inglés
Inglés/Multi
Inglés
-
si
si
Auto
Plantilla
si si
Lenguaje estándar Mapas de imágenes Validación de Código Validación de Enlaces Link Checker) Gestión de Proyectos Transferencias FTP
34
Mozilla NVU 1.0 Composer 3.4 1.7.8 MPL MPL
GPL
Inglés
(X)HTML Format 8R85a propia (freeware) Inglés/Multi
Multi
Multi
Multi/Inglés
si
-
si
-
si
si
Asistente
Asistente
Auto
Asistente
Auto
Auto
Asistente
externa
si(ispell) externa
interna
interna
si interna
si interna
XHTML
HTML3.2
HTML4
HTML4
HTML4
interna/ externa HTML4
HTML4
-
-
-
-
-
-
-
HTML4/ XHTML -
si interna/ externa HTML4
si
externa
externa
-
-
externa
-
si
externa
-
-
-
-
-
-
-
-
si(plugin
-
-
si
-
-
si
-
si
si
-
-
-
-
-
-
si
si
si
Número 12
WWW.LINUX- MAGAZINE.ES
Quanta+
si (plugin KImage Mapeditor)
Editores HTML • EVALUACIÓN
Desafortunadamente, la gran cantidad de características hacen que resulte difícil de manejar y de aprender. El interfaz a menudo muestra múltiples ventanas dentro de la ventana principal. Por ejemplo, siempre se tiene la estructura de documentos, la referencia online y las explicaciones para todos los comandos HTML, PHP y Javascript a la vista. El manual sirve de poco y principalmente describe la insFigura 4: Quanta+ es la contrapartida de KDE a Bluefish. talación. El programa proporciona toda la funducen los comandos y Quanta+ no los cionalidad que se podría esperar de él. defraudará. Por ejemplo, Quanta+ es capaz de Quanta+ aún no ha eliminado com“subir” las páginas al servidor directapletamente uno de sus mayores inconvemente. Además de la validación de la nientes que afectaba a las versiones sintaxis, proporcionada por la herraanteriores. En el pasado, el programa mienta externa Tidy, también tiene un solía colgarse habitualmente; ya no lo comprobador de enlaces que comprueba hace tan a menudo, pero de vez en cuanla validez de los enlaces del documento. do sucede. Así que hay que asegurarse Además integra una herramienta de gesde guardar los cambios con regularidad. tión de versiones CVS basada en Todas las herramientas que hemos Cervesia, haciéndola ideal para los provisto suponen que el usuario debe tener yectos de grupos. conocimientos de HTML. Pero si prefiere Quanta+ soporta modificaciones evitar tener que tratar con el código visuales en el llamado editor VPL. Para fuente, probablemente prefiera un editor ello, los usuarios pueden hacer clic sobre WYSIWYG. los elementos requeridos para juntarlos, Firefox con cuneAform aunque la entrada de texto no está soportada en este modo. Como esta Firefox fue diseñado básicamente como parte aún está en desarrollo, lo mejor un navegador simple pero eficaz, y por será que se experimente con copias de ello viene sin un editor HTML integrado. los documentos originales. cuneAform [6] es un plugin que le proLos asistentes ayudan a configurar los porciona esta funcionalidad. Para instaelementos comunes. Por ejemplo, el asislarlo, en Firefox se selecciona Tools | tente quickstart puede manipular varias Extensions | Get more extensions. Esto meta-etiquetas DTDs (Document Type abre una página web que tiene un enlace Definitions). El editor CSS es fácil de al plugin de cuneAform. Luego se pulsa usar, permitiendo a los usuarios poner en Install now para que se realice la insuna hoja de estilo a partir de una paleta talación. de opciones usando tan sólo unos cuancuneAform se controla por medio de tos clics de ratón. iconos. Al tiempo de escribir este artícuQuanta proporciona rutinas automálo, el editor sólo soportaba los elementos ticas para asegurarse la compatibilidad HTML más básicos. En muchas formas, con el estándar HTML, como la modificuneAform es una reminiscencia del cación de la etiqueta de apertura cuanMozilla Composer. do el autor cambia la etiqueta de cierre. Mozilla Composer Esta característica permite a los autores cambiar el texto en negritas por cursiLa suite de Internet Mozilla incluye el vas con tan solo modificar una de las editor de HTML Composer [7]. etiquetas. Los programadores acostumDesafortunadamente, el futuro del editor brados a trabajar con entornos de deses incierto. La Fundación Mozilla ha arrollo integrados esperarán encontrar anunciado que se separará de la rama de la auto-completación mientras se introdesarrollo de Mozilla. La versión actual
WWW.LINUX- MAGAZINE.ES
1.7 aún es mantenida y Composer continua realizando bien su trabajo si se le compara con otros editores HTML. Después de instalar la suite Mozilla, en el menú Window se encuentra el editor. El interfaz de Composer tiene cuatro modos de vista, que se habilitan por medio de solapas en la ventana. La primera solapa, nos lleva a la vista del editor basado en GUI, que permite añadir guías y cuadros a las tablas, permitiendo a los autores escalar estos elementos haciendo uso del ratón. La solapa HTML Tags también muestra la página en la forma anterior, pero le añade las etiquetas oportunas. HTML Source nos proporciona un rudimentario editor de texto que ni siquiera soporta el resaltado de la sintaxis. Y por último, la solapa Preview muestra el resultado en el navegador Mozilla. Todos los elementos y las tablas permanecen editables en las cuatro vistas y cualquier cambio efectuado inmediatamente se refleja en las otras solapas. Trabajar con Composer es como usar un procesador de textos sencillo; cualquiera que tenga experiencia usando esta clase de aplicaciones rápidamente se sentirá como pez en el agua. Como inconveniente, el editor WYSIWYG no soporta la composición de páginas más complejas. Composer proporciona algunos asistentes útiles y herramientas de entrada para la mayoría de los elementos HTML. Siempre es inevitable editar alguna parte del código si se está usando algún otro lenguaje, como Javascript, aunque está disponible una extensión opcional para CSS. El problema es que la edición manual no se refleja en los contenidos de las tablas generadas automáticamente. Composer no tiene características para la gestión de proyectos y hace que los que son grandes resulten complicados. De nuevo, como nota positiva, el programa soporta la “subida” automática de ficheros al servidor FTP.
NVU El distribuidor de Linux Linspire desarrolló el editor de HTML NVU [8] (Figura 5), versión 1.0, que fue publicada recien-
Número 12
35
EVALUACIÓN • Editores HTML
temente basándose en Composer. Con tan sólo mirar a la ventana principal se puede observar la estrecha relación con Mozilla Composer. Por ejemplo, NVU usa las cuatro vistas que ya se comentaron de Composer. Digamos que las vistas han aprendido nuevos trucos: por ejemplo, el editor de código de NVU ahora soporta el resaltado de la sintaxis y las otras vistas muestran las dimensiones de la ventana. Los desarrolladores de NVU también han ampliado la mayoría de los cuadros de diálogo y han rediseñado completamente algunos de ellos. Por ejemplo, los usuarios añaden actualmente una tabla dibujando un cuadro con el ratón. El editor CSS, una extensión opcional de Composer, es una característica estándar de NVU. NVU no sólo valida el código fuente, sino que lo limpia. Esto incluye la eliminación de saltos de líneas redundantes que se provocan cuando el autor compone una página en el editor WYSIWYG. Esta función es útil para aplicar los retoques finales a la página que ya se ha completado. Como el navegador Firefox, NVU también soporta extensiones y temas. Desde la página http://nvuext.mozdev.org, se pueden seleccionar nuevas opciones. Estas extensiones incluyen diccionarios adicionales para el analizador ortográfico integrado. La ayuda es comprensible e indiscutiblemente una de las mejores que hemos tenido oportunidad de evaluar entre las aplicaciones analizadas.
procesar estándares más antiguos y versiones de HTML. Amaya no se incluye con ninguna versión de Linux, pero se puede obtener una copia desde W3C. Al contrario que los otros candidatos de nuestras pruebas, Amaya cumple perfectamente con los estándares W3C, aunque el interfaz es bastante raro a veces. Por ejemplo, Amaya abre una ventana nueva para cada vista. Figura 5: NVU está basado en Mozilla Composer. Además del modo WYSIWYG, dispone de vistas para el HTML usando caracteres no estándar código fuente, para la jerarquía de págicomo las umlauts alemanas, otros editonas (Figura 6), un previsualizador res puede que no sean capaces de maneinterno y un listado con todos los enlajar los resultados debido a que no soporces. No actualiza las vistas automáticaten UTF-8. mente; de hecho, hay que pulsar (X)HTML-Format nos deja con sentiSynchronise para sincronizar el contenimientos contradictorios. Algunas funciodo de la ventana actual con las otras nes parecen inmaduras y esto ensombrevistas. ce la parte positiva. Como elemento a su Amaya convierte los documentos al favor, hay que decir que la aplicación estándar XHTML con un clic de ratón, funcionará en cualquier sistema operatimodificando la sintaxis automáticamenvo sin tener que reinventar la rueda. te, al mismo tiempo. Otra ventaja que Con respecto a los editores WYSIWYG, ofrece si lo comparamos con las otras la extensión cuneAform de Firefox pierde aplicaciones es que permite añadir anoante sus competidores. Está bien para taciones a las páginas. Estas anotaciones arreglar una página sencilla, pero para son elementos de comentarios que el otra cosa es preferible usar o bien navegador web sólo mostrará si fuera Composer o NVU. El editor de Mozilla es necesario. útil para páginas pequeñas, pero el código que genera tiende a desordenarse y a Conclusiones incluir etiquetas redundantes. Los extras Amaya La elección del editor HTML perfecto no de NVU lo convierten en el ganador. ■ El Consorcio World Wide Web desarrolló es una tarea fácil. Bluefish y Quanta+ el editor HTML Amaya [9]. La versión sobresalen sobre el resto de los editores RECURSOS actual tiene como objetivo XML y basados en texto descritos en este artícuXHTML, aunque también es capaz de lo, aunque su riqueza de opciones [1] August: http://www.bostream.nu/ aumenta la complejidad de johanb/august sus controles. [2] Bluefish: http://bluefish.openoffice.nl Los usuarios con hardwa[3] Erwin: http://lisas.de/erwin re antiguo, o los fanáticos [4] (X)HTML-Format: http://www. del TCL, podrían preferir homepagehelper.de/software/ August debido a su escaso html-format uso de recursos. Erwin tam[5] Quanta+: http://quanta.kdewebdev. poco consume muchos org recursos, pero ni August ni Erwin proporcionan la clase [6] cuneAform: http://cuneaform.mozdev. org de funcionalidad que se podría esperar de un editor [7] Mozilla Composer: http://www. moderno. Pueden resultar mozilla.org/editor dificiles si hay que codificar [8] NVU: http://www.nvu.com/ Figura 6: Amaya está desarrollado y distribuido por el caracteres no estándar: si se [9] Amaya: http://www.w3.org/Amaya Consorcio World Wide Web. violan≠ las convenciones de
36
Número 12
WWW.LINUX- MAGAZINE.ES
Compilador Intel 9.0 • EVALUACIÓN
Un Un vistazo vistazo al al al al compilador compilador C/C++ C/C++ 9.0 9.0 de de Intel Intel
CARRERA DE COMPILADORES Intel presentó la versión 9.0 de su compilador de C++ para procesadores Intel en Junio, elevando el listón del código altamente optimizado. POR RENÉ REBE
L
a versión provisional 8.1 del compilador Intel C++ Compiler (ICC) [1] introdujo el soporte para la arquitectura AMD64/x86-64 (EM64T para Intel). La versión 9 es una revisión completa llena de extensiones y optimizaciones [2]. Al igual que en versiones anteriores, el compilador soporta las arquitecturas IA-32, x86-64 e Intel Itanium. El debugger propio de Intel, una herramienta de cobertura del código y el entorno de desarrollo Eclipse completan el paquete. Un ensamblador está disponible adicionalmente para la CPU Itanium, aunque no vamos a tratar el ensamblador en este artículo. Los desarrolladores de Itanium no se han beneficiado de la integración de Eclipse hasta ahora.
El modelo de licencia es similar a la versión anterior. Existe una licencia no comercial gratuita, sin soporte, para proyectos de código abierto. Los binarios creados con esta versión no pueden ser vendidos. Para el desarrollo comercial necesitamos una licencia. En función del tamaño de la instalación, podemos especificar un número de serie o bien un archivo de licencia. El compilador puede también usar el administrador de licencias en red Flex. El compilador Intel C++ cuesta unos 300 Euros en distribuidores o unos 400 dólares si lo compramos directamente a Intel.
SSP El Software-based Speculative PreComputation (SSP),activado con la
WWW.LINUX- MAGAZINE.ES
opción -ssp, es una característica fuertemente debatida con anterioridad al lanzamiento. Esta funcionalidad implica que el compilador añade un cierto número de hilos auxiliares al programa que pre-computan ciertas instrucciones contenidas en el mismo para rellenar la
Tabla 1: Bucles Vectorizados ICC -O2 Botan Bzip2 GnuPG Gzip Lame Libmad OpenSSL Tramp-3D
-O2 -ip (171)36 0 132 48 118 24 148 (30)8
GCC 0 58 192 62 112 24 170 0
Número 12
2 6 6 2 22 4 30 2
37
EVALUACIÓN • Compilador Intel 9.0
caché de instrucciones de la CPU con datos. Este método parece ser particularmente eficaz con el hyper-threading. El SSP es sólo una de las llamadas optimizaciones guiadas por perfiles de ejecución (POGO). Para habilitar las POGO, el desarrollador primero tiene que compilar el programa con un instrumento especial (-prof-gen-sampling) y luego ejecutarlo con un conjunto representativo de datos de entrada, usando profrun. Finalmente, debe recompilar el programa completo una vez más, haciendo referencia a los datos obtenidos en los procesos previos [3]. En constraste con las versiones anteriores, -O2 o superior habilita ahora varias optimizaciones inter-procedurales, y el compilador optimiza más bucles. ICC ofrece al desarrollador incluso más feedback: los reportes referentes a bucles optimizados y otros warnings son actualmente más detallados. Así, al compilar múltiples archivos, el compilador ofrece más opciones de optimización. Adicionalmente, la opción -ipo en la nueva versión ya soporta archivos objeto individuales al compilar múltiples archivos.
Instalación con RPM La versión 8 del Intel Compiler ocupaba unos 65 MBytes, pero la versión actual pulveriza esa cifra, al no bajar de los 192 MBytes. El tarball comprende varios paquetes RPM para I-386, EM64T y IA64. Incluye también la plataforma Eclipse completa con el C Development Toolkit (CDT) en sus versiones para GTK y Motif. Un script se encarga de la instalación de los paquetes, pero se han reportado algunos problemas con distribuciones diferentes de Red Hat y Suse (ambas
basadas en RPM) que tienen soporte oficial de Intel. En algunos sistemas el script simplemente señala que no ha reconocido el tipo de máquina, glibc y el kernel. Por el contrario, se instaló sin ningún problema en la distribución basada en Debian, Ubuntu. Tengamos la distribución que tengamos, tendremos que usar el comando rpm para descomprimir el archivo RPM. Con todo, el compilador no es tan fácil de manejar como GCC, que integra perfectamente en el sistema. ICC no mirará en los directorios de librerías y cabeceras por defecto de nuestra instalación, lo que significa que tenemos que configurar -I/opt/intel/cc/9.0/include y posiblemente -I/opt/intel/cc/9.0/include/c++, en la mayoría de los casos. Como los programas se suelen enlazar con las librerías de ICC en tiempo de ejecución, probablemente tengamos que fijar la variable de entorno LD_LIBRARY_PATH a /opt/intel/cc/9.0/lib al ejecutar ICC. Esto lo hace normalmente source/opt/intel/cc/9.0/bin/iccvars.sh, ya sea añadiéndolo a .profile o bien tecleándolo en una consola. Para hacer las cosas más fáciles, esta configuración, por defecto, puede guardarse en los archivos de configuración .../bin/icc.cfg y .../bin/icpc.cfg. Configurando LD_LIBRARY_PATH guardaremos una entrada en /etc/ld.so.conf. Por defecto, ICC usa la librería del sistema de C++, aunque proporciona su propia implementación. Las opciones -cxxlib-icc y -cxxlib-gcc soportan la conmutación explícita. ICC versión 8.1 (o anterior) admitía las opciones del compilador GNU -march y -mcpu. Sin embargo, por algún motivo, Intel usa una notación críptica,
Listado 1: Ejemplo OpenMP 01 #include <omp.h> 02 03 main () 04 05 { 06 const int N = 10000; 07 int i; 08 float a[N], b[N], c[N]; 09 const int chunk = 100; 10 11 #pragma omp parallel shared(a,b,c,chunk) private(i) 12 13 { 14 15 #pragma omp for schedule(dynamic,chunk) nowait 16 for (i=0; i < N; i++) 17 c[i] = a[i] + b[i]; 18 } /* Fin de bloque paralelo */ 19 }
-x{K|W|N|B|P}, basada en los códigos internos de Intel. K indica Pentium III (Katmai), B para Pentium M (Banias), etc. -ax posibilita más de una CPU, permitiendo a ICC que traduzca trozos de código múltiples veces, uno para cada CPU, sin importar si sale rentable. Cuando se ejecuta el programa, los bloques optimizados se habilitan para ajustarse al tipo de procesador.
Cooperar con GCC En principio, es posible compilar archivos objeto mezclados para un único programa usando ICC y GCC. Por ejemplo, si ICC rechaza compilar un archivo o si GCC produce código mucho mejor. Si usamos icc para el proceso de linkado, el linker enlazará las librerías de ejecución
Cuadro 1:OpenMP OpenMP[4] es un estándar ampliamente reconocido que añade extensiones a los lenguajes C, C++ y Fortran para indicar explícitamente al compilador cómo distribuir los programas en hilos paralelos. Los elementos centrales son las directivas #pragma, que proporcionan instrucciones de cómo debería dividir el compilador el código en fragmentos concurrentes. Por ejemplo, #pragma omp parallel etiqueta un bloque para la
38
Número 12
ejecución en paralelo. shared() especifica variables comunes a todos los hilos, mientras que private() especifica variables restringidas en exclusiva a un proceso. La directiva #pragma omp for schedule especifica la distribución en los hilos. Las directivas #pragma por tanto etiquetan un bucle para su ejecución en paralelo. Los hilos comparten las variables a, b, c y chunk. La variable de iteración i es privada en cada hilo. La expresión indi-
WWW.LINUX- MAGAZINE.ES
ca al compilador que ejecute en paralelo para el bucle for y que divida el espacio de iteración en bloques de tamaño chunk. OpenMP define más instrucciones para especificar paralelización. Sin embargo, estas instrucciones se implementan en la actualidad sólo en compiladores especiales, usualmente en aplicaciones de clustering. En Listado 1 muestra un pequeño ejemplo de cómo usar OpenMP.
Compilador Intel 9.0 • EVALUACIÓN
de Intel necesarias sin necesidad de indicárselo explícitamente:
nada el trabajo en comparación con la consola. El debugger de la interfaz no ofrece nada en el sentido de mejor visualización. En comparación con GDB, IDB no soporta auto-completar con el tabulador. Pero podemos fijar puntos de interrupción a la hora de crear instancias de plantillas C++, siempre que no lleven etiquetado interno por el compilador. GDB puede que acepte estos puntos de interrupción, pero no interrumpirá la ejecución del programa llegado el momento.
icc -o prog main.o math.o
Sin embargo, si queremos enlazar archivos con gcc, tendremos que indicar las librerías auxiliares explícitamente. GCC necesita también parámetros de enlace adicionales: -L/opt/intel/cc/9.0/lib/ -lirc
Tras los bastidores, el compilador de Intel para IA-32 usa las GNU Binutils, de todas formas.
Paralelización Manual y Automática
Conclusiones Hemos comparado ICC 9.0 con GCC 3.4 y 4.0 compilando algunas programas de software libre (como OpenSSL, Libmad, Bzip2 y Gzip), y hemos encontrado que las últimas versiones de GCC han reducido enormemente o eliminado las diferencias en rendimiento que una vez tuvo ICC. Nuestras pruebas no han incluido específicamente el hardware de muy alta gama o el software optimizado para cierto hardware a veces asociado con ICC. ICC 9.0 tiene aún ventaja en el caso de vectorización automática y demuestra claramente lo bien distribuido que puede estar el código compilado de C y C++ a lo largo de las unidades SIMD (Single Instruction, Multiple Data). Aspectos como el soporte para OpenMP o la paralelización automática son beneficiosos para la computación de alto rendimiento. Y los generosos warnings del compilador de Intel permiten al desarrollador detectar problemas potenciales en la fase de desarrollo, antes de llegar a la fase de depura■ ción.
Figura 1: El front-end del compilador de Intel es funcional pero no precisamente moderno.
El grupo de trabajo OpenMP [4] elabora especificaciones para proporcionar ayuda a la paralelización en compiladores de C, C++ o Fortran. La opción -openmp indica al compilador de Intel que genere programas que paralelicen fragmentos con fuerte carga de CPU (como bucles) en sistemas Unix. Una vez se lanza el programa, el binario usa la librería Pthread para crear múltiples hilos que procesan esos fragmentos en paralelo. Así hacemos un mejor uso de los sistemas multiprocesador (véase el cuadro “OpenMP”). ICC 9 detecta segmentos de código en los cuales, hilos individuales pueden paralelizarse sin ayuda de OpenMP. La opción -parallel habilita la paralelización automática. Esto significa que los usuarios que quieran soporte para mútiples CPUs o múltiples núcleos, sin modificar el código fuente, verán ahora acelerados sus programas. La Tabla 1 muestra el número de bucles que vectoriza el compilador por
Listado 2: Warning ICC Detallado 01 lib/__dtostr.c(47): remark #1572: floating-point \ 02 03 equality and inequality comparisons are unreliable 04 05 if (d==0.0) { 06 07 ^
benchmark. Los valores entre paréntesis son las expresiones causadas por el código de la librería C++ STL.
Consejos para la Depuración Los detallados warnings mostrados por el compilador de Intel son otra enorme ayuda para los desarrolladores. En algunos casos dicen mucho más que los warnings mostrados por el compilador GNU, especialmente en el caso de expresiones constantes, uso temporal de objetos, comparación entre números en punto flotante o pérdida de precisión de cálculos y asignaciones. Al igual que en versiones anteriores, el compilador de Intel cita el código fuente y etiqueta el carácter en el punto donde ocurrió el warning. Es una utilísima ayuda para la depuración (véase Listado 2, líneas 3 y 4). El debugger incluido en el paquete ICC funciona con una interfaz en modo texto, al igual que su homólogo GDB, pero tiene también un pequeño front-end gráfico. El debugger IDB normalmente se ejecuta en modo DBX, en el cual espera una entrada con una sintaxis definida por Intel. Si lo ejecutamos con la opción -gdb, proporciona compatibilidad con GDB (versión 6.1 o superior).
Interfaz Espartana Si ejecutamos IDB con la opción -gui, aparecerá una interfaz gráfica de usuario con una pinta bastante antigua (véase Figura 1). Desafortunadamente, la interfaz proporciona muy poco soporte para automatizar procesos y no simplifica casi
WWW.LINUX- MAGAZINE.ES
RECURSOS [1] Intel C++ Compiler http://www.intel. com/software/products/compilers/clin [2] Resumen de las optimizaciones de ICC: http://www.intel.com/software/ products/compilers/docs/qr_guide. htm [3] Ingo A. Kubbilun, Kernel Tuning: Compiling the Linux kernel with the Intel compiler: http://www. linux-magazine.com/issue/45/ Intel_C_Compiler.pdf [4] OpenMP: http://www.openmp.org
Número 12
39
PRÁCTICO • Filtros Web
Los Los filtros filtros de de contenido contenido Privoxy Privoxy yy Webcleaner Webcleaner
LOS GUARDIANES
Los filtros de contenido protegen la privacidad de los usuarios web y se encargan de eliminar toda la publicidad no deseada. Vamos a ver en este artículo un par de filtros de contenido de Código Abierto que han ganado popularidad últimamente. POR THOMAS LEICHTENSTERN
L
os filtros de contenido son útiles para bloquear el tráfico no deseado entre los navegadores y los servidores web. Un buen filtro de contenido tan sólo permitirá el tráfico que el usuario realmente desea, manteniendo al navegador libre de publicidad, errores web, cookies y código Javascript. Algunos filtros pueden incluso manejar el tráfico saliente. Un filtro de contenido configurado adecuadamente puede hasta protegernos de los agujeros de seguridad de los navegadores que, desafortunadamente, son bastante comunes. Este artículo investiga los filtros de contenido Privoxy [1] y Webcleaner [2]. Ambas herramientas proporcionan filtrado de contenido, pero mientras que Privoxy se centra en el contenido web, Webcleaner posee una variedad de características adicionales, como un antivirus y un compresor de imágenes.
Redirigiendo el Tráfico Los filtros de contenido funcionan como los servidores proxy, es decir, como un sistema intercalado entre el navegador y el servidor web. Para usar un filtro de contenido, hay que redirigir el acceso del
40
Número 12
navegador web a la dirección del filtro de contenido cambiando la configuración de la conexión de modo que apunte a la dirección IP y al puerto del filtro. Si el filtro está ejecutándose en la máquina local, la dirección será 127.0.0.1 (localhost).
Privoxy Privoxy (Junkbuster Privacy Enhanching Proxy) es un filtro de contenido sencillo que no presta el servicio de caché. Al contrario que un simple filtro de URL, el programa comprueba el sitio web completo basándose en unas reglas predefinidas de contenido.
La Instalación Privoxy está disponible para la mayoría de las distribuciones, así que no se debería tener problemas para conseguir los paquetes RPM o DEB. Los usuarios de Debian pueden habilitar el repositorio Universe e instalar Privoxy con sólo teclear apt-get install privoxy. En Suse 9.3, se ejecuta Yast para configurar el programa desde el soporte de instalación. Hay que tener en cuenta que Yast instala el programa en una “celda”
WWW.LINUX-MAGAZINE.ES
chroot. La ruta de los ficheros de configuración y registro es /var/lib/privoxy/.
La Configuración Por defecto, Privoxy se ligará al localhost (127.0.0.1). Si se quiere que el filtro de contenido esté disponible para otras máquinas, hay que cambiar el valor por defecto en el fichero de configuración /etc/privoxy/config de listen-address 127.0.0.1:8118 a la dirección de la tarjeta LAN, 192.168.0.1, por ejemplo. Si se deja la dirección IP sola, el servicio se ligará a todos los interfaces de red, lo que no es recomendable, especialmente para los ordenadores sin acceso directo a Internet. El interfaz web permite configurar las reglas de filtrado; se puede mostrar en privoxy.org/config. Pero antes de ello, hay que establecer a Privoxy como un proxy en el navegador web. Para los sistemas Debian, hay que habilitar primero esta opción. Para ello, hay que mirar las entradas enable-remote-toggle y enable-edit-actions en el fichero de configuración /etc/privoxy/config y establecer ambos valores en 1. Después de completar los cambios hay que reiniciar el
Filtros Web• PRÁCTICO
programa con /etc/init.d/privoxy restart. Como privoxy no soporta la autenticación de usuarios, cualquier usuario que pueda acceder al filtro de contenidos podrá modificar la configuración de los filtros.
en patrones de URL como ad*. o *banner*., por poner un ejemplo. La configuración global por defecto está principalmente restringida a seleccionar una de las políticas por defecto. Las reglas definidas por los usuarios se crean en la sección Filtros user.action. Si Privoxy está bloPrivoxy distingue entre filtros y queando el contenido de su página ficheros de acciones. Los filtros favorita, se puede hacer uso del incluyen reglas, como una regla enlace http://config.privoxy.org/ para eliminar banners de más de show-url-info para averiguar qué cierto tamaño. Los ficheros de filtro es el responsable. Se puede acciones asocian reglas a direcciopulsar en el botón Insert a new nes. Estas pueden ser desde URLs a Section at top en la sección comodines que representen fragFigura 1: La ventana principal de Privoxy ofrece un menú user.action y luego, tras pulsar mentos de direcciones perteneciencon enlaces a varias funciones. Add, se añade la URL de la página. tes a páginas de anuncios. Edit muestra un listado de las Y… ¡Acción! ad*.ejemplo.com correspondería a todos reglas de default.action que se aplica en los subdominios en el dominio La más severa de las reglas no servirá de este caso específico. La configuración ejemplo.com que comenzaran por ad y le nada si no se tiene un objetivo. Y esto es por defecto para estas reglas es No siguiera cualquier cadena arbitraria de lo que los ficheros de acciones proporChange. Cualquier configuración realizacaracteres. cionan. Los ficheros user.action y da aquí tiene prioridad sobre las políticas default.action son ficheros de acciones y por defecto. Sayonara, Baby ambos son editables por la GUI web de En Progreso El fichero de filtro por defecto (/etc/priPrivoxy, a la que se puede acceder con voxy/default.filter) viene con una gran Privoxy es bastante discreto en el uso config.privoxy/show-status. Aunque colección de reglas. No se debería intendiario y apenas afecta a los tiempos de ambos ficheros poseen una estructura tar modificar nada en el fichero de filtro carga, incluso para las páginas grandes. idéntica, se usan para propósitos diferena menos que se tengan conocimientos Desde luego, hay que asegurarse de que tes. default.action especifica comportasobre el manejo de expresiones regulael hardware donde se va a ejecutar no mientos globales y user.action maneja res. Como Privoxy no proporciona una sea muy antiguo. Una CPU a 500Mhz y aplicaciones específicas. interfaz para editar los ficheros de filtro, 256Mb de RAM es el equipo mínimo. El fichero default.action incluye reglas se puede usar cualquier editor de textos El programa mostrará la mayoría de por defecto que se aplican cuando ningupara realizar los cambios. Los siguientes los sitios web correctamente, incluso si na de las otras reglas son aplicables. ejemplos muestran cómo son las reglas Privoxy tiene tres políticas definidas para se aplica la configuración de filtro de filtrado: los nuevos usuarios; de hecho, se puede Cautious. Si no, se puede ejecutar el hacer clic para establecer el comportacomprobador de URL que indica que miento del filtro desde Cautious a reglas se aplican a la página actual. FILTER: LinuxMagazine U Adventuresome. Desafortunadamente, el comprobador s/rain(?!.com)/sun/ig La siguiente sección contiene políticas carece de una estructura clara, dejando para gestionar direcciones y fragmentos al usuario con el problema de encontrar FILTER: define una clase nueva y va de direcciones, describiendo una solula regla responsable de bloquear su vista. seguido del nombre del filtro ción para manejar los anuncios basados Si un sitio se bloquea completamente, (LinuxMagazine) y de una descripción Privoxy dispone de una vía (Ejemplo de regla de filtro). de escape consistente en un El GUI web de Privoxy muesenlace denominado go there tra esta información sobre el anyway (adelante de todos filtro. La segunda línea conmodos). El enlace deshabilita tiene la regla. En este caso, temporalmente el filtro de reemplaza rain en cadenas contenido para la página con sun. Una clase puede actual. El programa proporcontener cualquier número ciona los denominados marde reglas, que se pueden cadores para habilitar y deshabilitar con tan solo hacer habilitar rápidamente los filclic con el ratón en la intertros. Se pueden abrir los marfaz web. En Internet [4] hay cadores en el enlace Privoxy listas de filtros que se pueToggle Privoxy de la página Figura 2: Privoxy muestra las reglas en el interfaz web. den descargar.
WWW.LINUX-MAGAZINE.ES
Número 12
41
PRÁCTICO • Filtros Web
llo instalarlo en los sistemas basados en Debian, como Ubuntu. Es decir, el programa se puede instalar en otras distribuciones, aunque en ellas Privoxy: suponga un mayor esfuerzo, Conclusiones especialmente en el caso de La mayoría de los elogios a Suse Linux. los programadores se deben a Webcleaner requiere runit la extensa documentación y la versión 2.4 del intérprete basada en ejemplos que desde Python, incluido el paquecribe todas las características te de desarrollo. Para compidel programa en detalle. La lar Webcleaner desde el códicombinación de filtros y fichego fuente, además se necesita ros de acciones podrían pareun compilador de C como cer confusos a primera vista, gcc. pero si se miran con deteniHay que instalar los miento, resulta que son una Figura 3: Una vez que hemos entendido los conceptos principales, siguientes programas y idea muy buena. podemos crear fácilmente nuestras propias acciones. bibliotecas si se quiere que Privoxy es una herramienta Webcleaner use todas tus madura. Se ejecutó en nuestros laboratoterísticas inimaginable. Además del filtro capacidades: • PIL (Python Image Libraries) – rios sin ningún problema y completó las de contenidos, los desarrolladores lo han para la compresión y escalado tareas asignadas de eliminar la publicidotado con capacidades tales como comde imágenes. dad y de proteger la privacidad del usuapresión y escalado de imágenes, antivi• Open-SSL y Python-openssl – rio sin la necesidad de usar la configurarus y detección y corrección de errores para poder aplicar el filtrado de ción por defecto. HTML conocidos. contenido a las páginas web Webcleaner Instalación encriptadas por SSL. Nuestro segundo candidato es Como Webcleaner fue desarrollado princi• Clamav (clamd) – para usar el Webcleaner, que tiene una lista de caracpalmente para Debian, es bastante senciantivirus. La extensión de Python psyco se puede Mecanismos de Filtrado instalar como un extra opcional. Según los desarrolladores, psyco mejora el renalgún criterio. El alcance depende de la Las herramientas para el filtrado pertedimiento a la hora de compilar los elección del programa. Filtros pop-up, necen a una de las siguientes categoríscripts de Python en un factor de 2 a 100, filtros de cookies y bloqueadores de as: banners son los más comunes. aunque consume mucha memoria. 1. Filtros URL Algunos programas realmente inteliLos usuarios de Debian pueden ejecuLos filtros URL simplemente comparan gentes como DansGuardian, http:// tar apt-get o la interfaz de Synaptic para la URL introducida en el navegador con dansguardian.org validan los sitios instalar los paquetes necesarios. Si se una lista negra o blanca almacenada web basándose en un sistema de tiene Suse 9.3 habrá que configurar localmente. La dirección puede compesos. Si un término de la página excerunit, psyco y PIL manualmente, aunque prender un dominio completo y un nomde un valor preestablecido, se aplica la bre de host o simplemente fragmentos el resto de los paquetes debería de estar regla que se tenga prevista. de la URL. Los filtros URL se usan princien el soporte de la distribución.
principal http://config.privoxy. org. Este enlace muestra un popup donde se puede habilitar y deshabilitar Privoxy.
palmente para controlar el acceso de los usuarios. Squidguard es uno de los mejores de esta categoría: http://www. squidguard.org. Ventajas: • Usan pocos recursos • Se ejecutan rápidamente • Son fáciles de configurar Desventajas: • Carecen de protección de privacidad • No comprueban el contenido de las páginas 2. Filtros de Contenido Esta solución comprueba el contenido de cualquier página basándose en
42
Número 12
Ventajas:
• Control granular del contenido mostrado • Alto nivel de seguridad Inconvenientes: • Dependiendo de la configuración, los tiempos de carga pueden ser largos. • Falsos positivos (contenidos legítimos pueden ser filtrados) • Configuración compleja 3. Casos Especiales Algunos filtros de contenido, como Webcleaner, poseen mecanismos adicionales, incluyendo compresión de imágenes y de páginas webs, además de incorporar software antivirus.
WWW.LINUX-MAGAZINE.ES
La Instalación Tecleando tar xfvz webcleaner-2.29.tar.gz se descomprime el paquete. Se entra en el directorio creado y se realiza la compilación ejecutando ./configure && make. Puede ser que el script no concluya debido a que falte alguna biblioteca (/lib/cpp), especialmente en Debian. Si sucede esto, entonces hay que instalar el paquete openC++ y repetir el comando anterior. Cuando se haya terminado, se compilan los ficheros Python tecleando python setup.py build. Con python setup.py install se instala la aplicación en la máquina.
Filtros Web• PRÁCTICO
Si se intenta usar el filtro proxy de Webcleaner con páginas encriptadas, además habrá que instalar los certificados requeridos. Se pueden instalar con webcleaner-certificates install. Por último, con make installservice se configura el servicio Webcleaner, que está monitorizado por runit y se ejecuta inmediatamente después de introducir el comando. Los usuarios con sistemas Suse tendrán que crear primero el directorio /var/service y luego ya podrán ejecutar el script.
Webcleaner aceptó esporádicamente entradas en esta sección.
Bajo el Microscopio
La Configuración Se puede acceder a Figura 4:El comando HQ de Webcleaner. Webcleaner a través de Squid o directamente como un proxy. La ruta tra los filtros disponibles, los más imporde la conexión va desde el navegador a tantes son: Webcleaner a través de Squid y desde • blocker – filtro URL aquí a Internet. Para hacer uso de esta • compress – transmisión de opción, hay que indicarle al navegador ficheros comprimidos que utilice el puerto de proxy 3128. Si • header – cambios, modificaciose desea que otras máquinas también nes y borrado de encabezados puedan hacer uso de este servicio, http habrá que añadir las siguientes líneas • image reducer – compresión de a la configuración: imágenes usando el formato JPEG en baja resolución y bajo .... volumen. 060 acl localnet src U • rewriter – analiza y reescribe 192.168.0.0/255.255.0.0 código HTML y Javascript. .... Al pie de la ventana, bajo Allowed Hosts, 097 http_access allow localnet se pueden especificar las máquinas a las .... que se les permite registrase en el proxy. Hay que introducir todas aquellas Si se quiere acceder directamente a máquinas a las que se les desee permitir Webcleaner el puerto a usar será el 8080, recibir contenido sin filtrar en Don’t filter que también habrá que configurar en el Hosts. navegador. Webcleaner se configura a La sección Filter configurations través de su interfaz web en http://127.0. incluye las reglas para los ficheros. Las 01:8080. Antes de ejecutar Webcleaner entradas en la columna de la izquierda por primera vez, habrá que añadir la representan los directorios, y las reglas contraseña que Webcleaner genera en para estos directorios se muestran en los ficheros de configuración. Para ello, la columna central cuando se pulsa un se copia la contraseña MD5 al script de directorio. Si se pulsa en una regla configuración existente se abre un menú de configu/usr/share/webcleaner/config/webclearación en la columna del lado derecho. ner.config, ubicándola tras adminpass=, Para crear una regla nueva, se pulsa y reiniciando Webcleaner con kill -HUP New Rule, abriéndose un menú de conID-del_proceso. Luego se entra como figuración del desplegable de la dereadmin y se reescribe el texto que aparece cha, dependiendo de la entrada selecmostrado bajo la contraseña MD5 en la cionada, en el que se puede introducir página web. la acción deseada. Proxy Configuration proporciona acceLa sección Content rating se puede so a la configuración básica del prograusar para especificar cómo puntuar las ma. El cuadro Proxy filter modules muespáginas web. En nuestro laboratorio
WWW.LINUX-MAGAZINE.ES
Con las pruebas realizadas en el laboratorio, Webcleaner mostró algunos fallos importantes. Después de que se habilitara el antivirus, algunas descargas no funcionaron. Cuando se abrió un sitio web, que de antemano se sabía que tenía un exploit, la máquina del laboratorio se colgó. La puerta de enlace SSL no llegó a funcionar en nuestras pruebas. Cuando se intentó acceder a una URL encriptada, el navegador mostró una página vacía. El interfaz web aceptaba algunas entradas arbitrarias y rechazaba otras. La documentación de Webcleaner no sirve de ayuda para solucionar estos problemas, ya que no proporciona ninguna información sobre cómo funciona realmente el programa. Junto con la configuración, tan poco intuitiva, de los filtros, el uso del programa es complicado. Nuestros intentos de hablar con el promotor del proyecto sobre estos temas fueron en balde, ya que no recibimos ninguna respuesta. Una ventaja obvia de Webcleaner sobre Privoxy es que soporta autenticación, tanto para el acceso al módulo de configuración como al proxy.
Webcleaner: Conclusiones Aunque Webcleaner promete mucho, la gran cantidad de errores que presenta, hacen difícil su explotación. La gran ventaja que Webcleaner aporta en comparación con sus competidores es el antivirus que lleva incorporado (que no funciona cuando se arranca) y otras características como el compresor de imágenes, pero que no tienen un gran impacto a la hora ■ de la verdad.
RECURSOS [1] Privoxy: http://www.privoxy.org [2] Webcleaner: http://webcleaner. sourceforge.net [3] Junkbuster: http://internet.junkbuster. com/ [4] Reglas para Privoxy: http://www. neilvandyke.org/privoxy-rules/
Número 12
43
PRÁCTICO • FCKEditor
Edición de páginas Web con FCKeditor
FÁCIL ARREGLO Las páginas Web modestas suelen tener información desactualizada debido a la falta de tiempo del webmaster para mantener todas las páginas al día. Incluso algo tan sencillo como una corrección ortográfica puede llevar días. FCKeditor libera al webmaster dejando que el usuario se encargue. POR JAMES MOHR
A
demás de mantener páginas Web personales, también soy webmaster voluntario de un club deportivo local. Una queja común en el club es que nadie se toma su tiempo en proporcionar información actualizada. Algunas de las secciones de la página no proporcionan ninguna información en absoluto, simplemente porque nadie ha tenido tiempo de mantener las páginas actualizadas. Aún teniendo el conocimiento técnico para mantener las páginas, simplemente no disponía de tiempo material para mantener cada una de ellas. Necesitaba una manera de que a los miembros
44
Número 12
del club les resultase sencillo poner la información online ellos mismos. La manera más sencilla para que un novato mantenga una página Web es escribir el texto con algún editor de textos y entonces subir los archivos con un cliente de FTP. Desafortunadamente, la mayor parte de la gente de nuestro club tenía problemas incluso con esto. Por tanto, para conseguir que el mayor número de personas proporcionase información actualizada, se requería un mecanismo lo más sencillo posible para actualizarla. Se creó una base de datos para noticias y eventos, permitiendo a los usuarios añadir información en formularios basados en Web. Sin embargo, no encontraba una solución fácil para permitir a los usuarios modificar el contenido de las páginas. Hasta que encontré FCKeditor. FCKeditor es un editor de texto que reside en el servidor y es accesible a través de un navegador Web convencional. Al integrar FCKeditor en la página Web, se crean los medios adecuados para que los usuarios editen sus propias páginas Web. Incluso los usuarios más inexpertos se sintieron cómodos al trabajar con el editor de texto, por lo que FCKeditor proporcionó la solución que era incluso más sencilla que un entorno de edición basado en Zope o en Wiki. El reto, por supuesto, era entender cómo integrar FCKeditor en una página Web. En este artículo, des-
WWW.LINUX- MAGAZINE.ES
cribimos cómo FCKeditor.
editar
online
con
Editor Completo FCKeditor (véase Figura 1) tiene todas las funcionalidades que la mayoría de la gente necesita en un procesador de textos, incluyendo una completa barra de herramientas. Bajo esta barra encontramos el área de texto WYSIWYG. FCKEditor funciona con casi todos los navegadores en cualquier entorno. En el servidor, FCKEditor proporciona soporte para los lenguajes de desarrollo Web más comunes, como PHP, Perl, ColdFusion, Java e incluso ASP.Net. Esto permite una integración perfecta con nuestra página ya existente. FCKEditor está disponible en una docena de idiomas. Por defecto, el idioma se detecta a través de la configuración de nuestro navegador, aunque es fácil configurar un idioma específico en el archivo de configuración. La mayor desventaja de FCKEditor es la falta de documentación. Lo poco que existe hace repetidas referencias a los ejemplos proporcionados (véase el cuadro “Archivos de Ejemplo”). Aunque los ejemplos nos ayudan a ver lo que hace el programa, este método de documentar requerirá que buceemos a través de demasiado código para descubrir cómo personalizar el programa.
Instalación Podemos encontrar la última versión de FCKEditor en su página Web [1]. En el momento de escribir estas líneas, la última versión disponible era la Version 2 Release Candidate 2. Deberíamos conseguir sin duda la RC2 si estamos ejecutando un servidor Apache bajo Linux, pues existían algunos problemas con la RC1. Una vez hayamos obtenido el paquete de instalación, creamos en primer lugar un directorio FCKEditor bajo la raíz de documentos de nuestro servidor Web y
FCKEditor • PRÁCTICO
descomprimimos el paquete dentro de este directorio. Es posible cambiar la ubicación, pero si lo hacemos, tendremos que realizar demasiados cambios a los archivos de configuración (véase el cuadro titulado “Fijando la Ubicación”). Cada uno de los cuatro ejemplos de PHP proporcionados en el paquete (véase el cuadro titulado “Archivos de Ejemplo”) muestran los diferentes aspectos del editor. Por ejemplo, uno de estos ejemplos nos permite elegir la barra de herramientas, otro el idioma, etc. Cada uno de los componentes puede añadirse a cualquier página, de manera que podemos construir un editor personalizado que nos permita seleccionar cualquiera de las opciones. Hemos elegido uno de los archivos de muestra y lo hemos utilizado como punto de arranque para nuestra configuración. El ejemplo que hemos elegido parece ser el de más sencilla adaptación de la configuración. En nuestro caso, no vamos a querer que los usuarios puedan toquetear en la configuración del editor ya que tratamos de mantener el sistema lo más sencillo posible. Por tanto, hemos eliminado todo el código extra relacionado con la configuración del editor. También hemos deshabilitado la autodetección del idioma. Si la página está en español, fijaremos el lenguaje por defecto a español: $oFCKeditor->Config U ['AutoDetectLanguage'] =U false ; $oFCKeditor->Config U ['DefaultLanguage'] = 'es' ;
Si usted está configurando FCKEditor para su propio entorno, elija un archivo de ejemplo que se adapte a su situación y adapte la configuración a sus necesidades.
Carga de Textos en el Editor El primer paso para integrar FCKEditor en una página Web existente es definir un medio para cargar el texto en el editor. El atributo Value contiene el texto que aparezca en la ventana del editor en ese momento. Podemos definir el texto a aparecer en la ventana del editor simplemente con configurar el atributo Value: $oFCKeditor->Value = U 'Tu texto' ;
Podemos fijar este valor como cadena vacía para empezar con el navegador vacío, pero una de las mejores características de FCKEditor es la capacidad de editar páginas ya existentes. Por lo tanto, necesitamos averiguar cómo conseguir introducir el contenido de un archivo existente en el editor. La manera más senciFigura 1: Ventana principal de FCKeditor. lla es usar la función de PHP function file_get_conmucho más que simplemente cargar un tents(): archivo en nuestra página web. Por ejemplo, un usuario malicioso podría especifi$oFCKeditor->Value = U car el archivo .htaccess o cualquier otro file_get_contentsU archivo sensible de nuestro sistema. Por ("ruta_a_fichero") ; lo tanto, deberíamos verificar siempre que el valor escrito en $filename es válido Advertencia: file_get_contents() puede y lógico antes de cargar el archivo. cargar una URL o fichero directamente. La URL puede contener includes por el lado Acceso al Editor del servidor, marcos o cualquier otro tipo de cosas. Por lo tanto, el archivo que terA menudo, tener usuarios tecleando una mine en nuestro navegador puede no ser cadena de consulta a mano es demasiado el que realmente queremos editar. El trabajoso, por lo que necesitamos una método más seguro, en nuestra opinión, manera más fácil de pasar el archivo. De es evitar URLs. Antes de pasar el nombre cómo lo hagamos depende cómo se genede archivo a file_get_contents(), verificarará la página, quién está autorizado a mos que estamos cargando un archivo editarla, etc. En la página que yo adminislocal. tro, las páginas se generan usando PHP, Incluso usando este método, los contenidos son bastante estáticos. Necesitamos Archivos de Ejemplo una manera de pasar dinámicamente el Encontraremos unos cuantos ejemplos nombre de archivo para poder cargarlo. para cada lenguaje de desarrollo en el Podemos hacer esto de manera sencilla directorio _samples. Nosotros hemos pasando el nombre de archivo como parte usado PHP, por lo que hemos utilizado de una consulta: http://linux.local/FCKeditorU /jimmoedit.php?filename=U index.html
Ahora, dentro del script del editor (jimmoedit.php en este ejemplo), leemos la variable de nombre de archivo: $filename = U $_GET['filename'];
Debemos tener cuidado aquí, ya que es posible crear una consulta que haga
WWW.LINUX- MAGAZINE.ES
los archivos del directorio php y hemos copiado uno de los archivos de ejemplo desde _samples/php hasta el directorio raíz de FCKEditor. Luego hemos copiado los archivos sampleposteddata.php y samples/sample.css. En nuestro caso, hemos usado sample2.php y le hemos llamado jimmoedit.php (por motivos de simplicidad). Este es el archivo que necesitamos cargar, y donde tenemos que empezar a hacer los primeros cambios. También hemos renombrado el archivo css como jimmo.css y hemos cambiado el archivo jimmoedit.php consecuentemente.
Número 12
45
PRÁCTICO • FCKEditor
por lo que puedo verificar si el usuario está conectado o no. Si lo está, el enlace “Edite esta página” contendrá la URL completa del editor, incluyendo la ruta relativa hasta el archivo adecuado. En otra página en la que no se usa PHP ni otros lenguajes de script, las cosas se tornan un poco más complejas, ya que no hay manera directa de ver si el usuario está conectado. La solución es poner el editor en un directorio protegido con una contraseña en el servidor usando la autenticación básica estándar de Apache. Podemos determinar el nombre del usuario conectado así: $current_user = U $_SERVER["PHP_AUTH_USER"];
Tras verificar que el usuario está conectado, podemos determinar el grupo al que pertenece el usuario. Esto es necesario debido a que el sistema determina los archivos que puede editar el usuario basándose en las filiaciones a grupos del usuario. Por ejemplo, una persona en el grupo voleibol podrá editar únicamente páginas dentro del directorio voleibol. Como los nombres de directorio son los mismos que los nombres de grupo, es sencillo averiguar el directorio correcto. Podemos entonces usar varias funciones de PHP para buscar el directorio y crear una lista HTML de archivos disponibles, generando los enlaces correspondientes que pasan los nombres de los archivos a editar. Una ventaja clave de este método es que podemos filtrar cualquier archivo al que los usuarios no deban tener acceso o que no deban editar.
Uso del Editor El editor en sí se comporta de la misma manera que cualquier otro editor. Por ejemplo, seleccionando texto y pulsando el botón adecuado, podemos cambiar el texto a negrita o cursiva, cambiar el tamaño de fuente y demás. Esto no sólo aplica las etiquetas estándar. FCKEditor inserta distintos estilos en la etiqueta. El editor incluso proporciona un modo de código fuente, que nos permite editar el código HTML directamente. Una característica que realmente impresiona es el editor de tablas. Cuando pulsamos sobre el botón, aparece la ventana emergente mostrada en la Figura 2. Como en otros editores de HTML, podemos definir las dimensiones de la tabla
46
Número 12
(tanto número de celdas como píxeles), bordes, relleno de las celdas, etc. Una vez que se inserta la tabla, podemos cambiar un buen número de propiedades. Si seleccionamos la tabla pulsando con el botón izquierdo, podemos arrastrar los lados o las esquinas para cambiar el tamaño. Pulsando con el botón derecho del ratón, podremos insertar o eliminar filas, columnas e incluso celdas. Podemos también dividir filas o columnas, e incluso cambiar las propiedades de la tabla entera. Otras funcionalidades nos permiten crear listas, añadir enlaces e imágenes o cambiar los colores de fondo.
quitar la marca de comentario al conector PHP. Por defecto FCKEditor busca los archivos en diferentes directorios en función de su tipo. Por ejemplo, podríamos querer un directorio especial para archivos y otro para imágenes. Para que la ruta no dependa del tipo de recurso, tendremos que cambiar el archivo connectors/php/io.php. Primero, en la función GetUrlFromPath() cambiamos la línea:
Navegación por el Servidor
por lo siguiente
FCKEditor proporciona un mecanismo de navegación por los archivos de servidor. Esta exploración se complementa con el uso de “conectores” para varios lenguajes. Por ejemplo, el conector y el código para el editor de PHP se sitúan en editor/filemanager/browser/default/connectors/php. Definimos qué conector debe usar el navegador en el archivo fckconfig.js. Existen dos variables en el archivo fckconfig.js que tendremos que fijar: FCKConfig.LinkBrowserURL y FCKConfig.ImageBrowserURL. Por defecto, estas variables apuntan al conector ASP, por lo que también tendremos que
return $GLOBALSU ["UserFilesPath"] U . $resourceType . $folderPath ;
return $GLOBALSU ["UserFilesPath"] U . $folderPath ;
Luego, en la función ServerMapFolder() cambiamos la línea $sResourceTypePath = U $GLOBALS["UserFilesDirectory"]U . $resourceType . '/' ;
por lo siguiente $sResourceTypePath = U $GLOBALSU
Fijando la Ubicación Aunque las instrucciones señalan que descomprimamos el paquete en el directorio FCKEditor bajo la raíz de archivos de nuestro servidor Web, en principio podemos situar el paquete en cualquier lugar. Para cambiar la ubicación, tendremos que configurar la propiedad BasePath del objeto editor. Por ejemplo, en el archivo jimmoedit.php encontraremos una entrada como la siguiente: $oFCKeditor->BasePath = U "/FCKeditor/"; Nótese que antes de esta entrada, ya hemos creado una nueva instancia del editor. Por tanto aquí estamos especificando el atributo BasePath para esa instancia (desde el momento en que $oFCKeditor es la instancia actual del objeto editor). Si echamos un vistazo a los comentarios del ejemplo, veremos que BasePath se determina con base en el directorio _samples. Tanto si fijamos la propiedad aquí o dentro del archivo, esto crea la
WWW.LINUX- MAGAZINE.ES
clase editor. Para PHP, esto sería el archivo fckeditor.php. (Además de crear el objeto FCKEditor, el archivo fckeditor.php es también responsable de crear el HTML que define el marco que es el editor en sí mismo, además del código necesario para crear la barra de herramientas, y todo lo demás). Dentro de la función constructora para la clase editor, fijaremos el atributo BasePath (así como otros atributos útiles). En este ejemplo, al estar la ruta incrustada en el constructor, deberíamos comentar o eliminar el código extra dentro del archivo jimmoedit.php. A continuación, tenemos que cambiar la ruta hasta el editor real. Esta ubicación se incluye al principio del archivo jimmoedit.php usando la ruta relativa: include("../../fckeditor.php") ; Al estar el archivo editor ahora en el directorio raíz de FCKEditor (el mismo que el archivo fckeditor.php), tendremos que eliminar la ruta relativa.
FCKEditor • PRÁCTICO
nismo para guardar el archivo. En el script de ejemplo, todas las barras invertidas añadidas en el formulario se eliminan y el código HTML se convierte en entidades HTML con la siguiente línea: $postedValue = U htmlspecialcharsU ( stripslashes( $value ) ) ; Figura 2: Configuración de tablas HTML.
["UserFilesDirectory"] . '/' ;
A continuación tendremos que cambiar la ruta de los archivos de usuario. Esto se hace en el archivo connector.php. Cerca del comienzo del archivo, encontraremos una referencia que tiene una pinta tal que: $GLOBALS["UserFilesPath"] = U '/UserFiles/' ;
Cambiamos la ubicación a un directorio de nuestra elección pariente a la raíz de documentos de nuestro servidor.
Guardado del Archivo Editado Una vez hayamos terminado de editar el archivo, pulsamos en el botón Submit, con el que enviamos el texto a la acción definida (igual que cualquier formulario Web). Por defecto es sampleposteddata.php, que nosotros hemos renombrado como posteddata.php. Si observamos el archivo de ejemplo de envío, todo lo que está haciendo es tomar el contenido del área de entrada del formulario y mostrarlo. Sin embargo, no hay referencia al archivo original, simplemente porque los ejemplos no se escribieron para leer el contenido de los archivos. Para permitir al script que guarde el archivo, debemos pasarle el nombre del archivo. Podemos hacer esto fijando una variable oculta de la siguiente forma: <input type="hidden" name=U "filename" value=U "<?=$filename?>">
Ahora sabemos en la página de envío qué archivo ha sido editado. Una cosa a reseñar es que todo lo que hace el script de ejemplo de envío es proporcionar un marco de trabajo para que nosotros creemos nuestro propio meca-
Esto significa que todas nuestras etiquetas pierden su significado especial. Por ejemplo, el signo menor que (<) se convierte a &lt;. Esto se hace de manera que podemos ver el código HTML generado. De otra manera, el código se interpreta por nuestro navegador. Aunque esto es bueno como demostración y como prueba, no encontramos especial valor en mostrar el código HTML, particularmente si nuestros usuarios no van a ser entendidos en la materia. En su lugar, podemos proporcionar el código del editor como vista previa. Podemos crear un formulario bajo la vista previa con un simple botón que guarde el archivo. Téngase en cuenta que una vez hayamos guardado el archivo, la versión antigua ya no estará disponible. Para evitar daños irreparables al original, hemos creado un subdirectorio archive en cada directorio. Antes de guardar el archivo, copiamos el archivo al directorio archive, añadiendo la información de fecha y hora al nombre del archivo. De esta manera, si alguien destruye el archivo, el original se puede recuperar con facilidad. Del mismo modo, debemos tener en cuenta el entorno en el cual se va a mostrar el archivo. Si el archivo se carga directamente, alguien podría añadir un include de la parte servidor o algún código PHP para obtener permisos indebidos. Por tanto deberíamos revisar el código antes de guardarlo. Guardar el archivo llegados a este punto es muy sencillo. Tenemos el nombre del archivo en la variable $filename y el contenido en $FCKeditor1. Usamos la función apropiada de PHP para guardar el archivo.
Configurar el Editor Podemos configurar la apariencia y funcionalidad del editor para adaptarlo a nuestra página Web específica. Por ejemplo, podemos usar nuestro propia hoja de estilo para cambiar la apariencia. Por
WWW.LINUX- MAGAZINE.ES
defecto, el editor usa la hoja de estilo _samples/sample.css a la que se accede en los archivos de ejemplo a través de la ruta relativa ../sample.css. En nuestro caso, concluimos que la barra de herramientas por defecto con todas sus maravillosas funcionalidades era demasiado para nuestros usuarios. El objetivo era proporcionar una manera sencilla de editar los archivos online, por lo que necesitábamos una manera de limitar lo que estaba disponible. Por defecto, FCKEditor proporciona dos conjuntos diferentes de herramientas: Default y Basic. El conjunto Basic sólo proporciona media docena de opciones, lo que era realmente demasiado poco. Necesitábamos algo intermedio. Afortunadamente, FCKEditor proporciona una manera muy fácil de cambiar las herramientas que están disponibles. En el archivo fckconfig.js, encontraremos que las barras se definen del siguiente modo: FCKConfig.ToolbarSetsU ["Basic"] = [ ... ];
La manera más fácil de crear nuestra propia barra de herramientas es copiar una barra existente, renombrarla adecuadamente y añadir o eliminar herramientas según nuestro parecer. Dentro de los corchetes, observaremos las funcionalidades que se proporcionan con esta barra de herramientas específica. Si incluimos un nuevo conjunto de corchetes, insertamos un separador entre los conjuntos de herramientas (no debemos olvidar la coma entre los conjuntos de herramientas). Al incluir ‘-‘ dentro de un conjunto de herramientas, se inserta un separador que, por algún motivo, es más pequeño.
Conclusión Aunque FCKEditor proporciona muchas funcionalidades, este artículo debería proporcionar suficientes conocimientos básicos para empezar. Investigando a través de los diferentes archivos de configuración, encontraremos muchas opciones más para cambiar FCKEditor para que se ■ adapte a nuestras necesidades.
RECURSOS [1] Página de FCKEditor: www.fckeditor. net
Número 12
47
DESARROLLO • Perl: Búsquedas
Búsqueda Búsqueda de de escritorio escritorio en en Perl Perl
¡VE A POR ÉL!
En un escritorio enorme y lleno de iconos es muy fácil terminar perdiendo archivos. Este mes mostramos un script en Perl que crea una base de datos MySQL para encontrar archivos en un instante. POR MICHAEL SCHILLI
B
ueno, y ahora ¿dónde guardé ese script que usé ayer? ¿Cuáles son los archivos nuevos que ocupan la mayor parte del disco, y cuáles no se han tocado en años? ¿Dónde está ese archivo que escribí la semana pasada que contenía las palabras “Michael” y “aumento”? Por supuesto, no hay nada que nos impida explorar el disco nivel por nivel y recopilar la información que necesitemos. Los baratos y enormes discos duros de hoy día hacen que los usuarios no se preocupen de ordenar sus directorios en años. find y otras utilidades tienen que explorar ahora decenas e incluso centenares de miles de archivos antes de
48
Número 12
encontrar sus frutos. Eso lleva mucho tiempo, tiempo que es un lujo del que mucha gente no dispone. Utilidades com slocate escalan por el árbol del sistema de archivos durante la noche ayudando a los usuarios a encontrar archivos por su ruta al día siguiente. Los programas Google desktop [2] y Spotlight en MacOS X dan un paso más allá, pues crean un meta-índice y ayudan al usuario a encontrar los archivos en función de una variedad de propiedades. El script que veremos en este artículo, rummage, implementa una búsqueda de escritorio basada en Perl. No sólo tiene en cuenta los nombres de los archivos, sino que también registra las fechas de
WWW.LINUX- MAGAZINE.ES
creación y última modificación. Añade varios fragmentos de meta-información para cada archivo en una base de datos MySQL (véase Figura 1) y crea un índice con el texto de los archivos de texto, permitiendo que los usuarios exploren su contenido más tarde mediante una búsqueda basada en palabra clave.
Texto llevado al Máximo La versión 3.23.23 de MySQL introdujo la opción FULLTEXT, que puede ser usada para etiquetar columnas en tablas y poder realizar búsquedas de texto en su contenido más tarde. En la versión 4.0.1 se añadieron los operadores booleanos para la búsqueda de palabras clave. Los usuarios pueden incluso crear listas de exclusión para evitar palabras comunes e inútiles de cara a indexarlas. La base de datos también soporta expansión de consultas. Es decir, recupera
Perl: Búsquedas • DESARROLLO
bytes, la hora y que probablemente será de la noche fecha de creaanterior. rummage es incapaz de controción en el sistelar cualquier cosa que haya pasado a ma de ficheros, partir de ese momento. la del último Puede que tengamos que modificar la acceso y la de la primera parte del listado de rummage última modifipara ajustarlo a nuestro propio entorno. cación. La constante $MAX_SIZE define la longiUn archivo tud máxima del contenido indexado para denominado un archivo de texto. Si el operador T de call.sgml empoPerl en SWISH::API::Common identifica Figura 1: Esquema de la tabla ‘file’, en la que ‘rummage’ guarda los trado en alguna un archivo de log de 100Mbyte como meta-datos de los archivos del sistema. parte en las proarchivo de texto, probablemente no quefundidades de ramos indexarlo entero. Un valor de la jerarquía indexada puede encontrarse documentos que contienen palabras del 100_000 especifica que sólo los primeros ejecutando rummage -p call.sgml. Tras documento encontrado en una consulta. 100Kbytes serán indexados. los bastidores, rummage convierte En las pruebas, sin embargo, su velociUna línea más abajo, el módulo DBIcall.sgml al patrón SQL %call.sgml% y dad fue mucho más lenta de lo deseado. Class Data Source Name $DSN especifica hace la consulta a la tabla file con Y como cada documento de texto acaba el controlador de base de datos (mysql, WHERE ruta LIKE "%call.sgml%". Las en la base de datos, ésta se vuelve prones decir DBD::mysql) y el nombre de la rutas relativas, como examples/call.sgml, to poco manejable. base de datos (dts). Por último, @DIRS también funcionarán, pero en este caso, El módulo de Perl es un array de nombres de directorio que rummage sólo encontrará el archivo si DBIx::FullTextSearch, que define un índirummage recorre recursivamente. Si se está guardado bajo el subdirectorio ce de sí mismo usando MySQL como usan enlaces simbólicos en lugar de examples. back-end, tiene algunas particularidades. directorios, la línea 24 resuelve los enlarummage -n 20 busca los últimos 20 El indexado es un proceso lento, que se ces. Si nos lleva demasiado tiempo indearchivos que hayan sido modificados. Si convierte en más lento aún cuando tenexar el directorio de usuario completo, no indicamos un número, el comando mos que indexar 30.000 archivos. podemos restringir del indexado uno o muestra por defecto los diez últimos Esta es la razón por la cual rummage varios subdirectorios, como la zona de archivos modificados. rummage -m "7 usa el probado indexador SWISH-E, que trabajo CVS local. day" nos muestra todos los archivos indexa y busca a una velocidad increíble. La línea 27 declara la función psearch, modificados la última semana. Para ello, Soporta palabras clave y frases en la búsque mostrará más tarde los resultados de genera una consulta MySQL que tiene queda y escala realmente bien. El módula búsqueda de las distintas consultas. una forma parecida a: lo SWISH::API::Common de CPAN faciliLa función usa un prototipo para hacer ta la comunicación con SWISH-E cenesto, especificando que psearch espera trándose en los aspectos más usados. SELECT * FROM archivo un escalar como único parámetro. Esto Dicho esto, hemos de señalar que WHERE DATE_SUB(NOW(), es importante ya que la salida de los SWISH-E no puede borrar archivos de un INTERVAL 7 DAY) <= mtime métodos DBI::Class search() o índice una vez creados. Esto significa search_like() hasta psearch tiene que ser que hay que reindexar diariamente para la cual indica a MySQL que calcule si la un escalar, pues es la única manera de mantenerlo actualizado. Un cron ejecufecha de modificación de cada registro que devuelvan un iterador que psearch tándose por la noche puede indexar un tiene más de una semana. En caso necepueda evaluar. par de cientos de miles de archivos, lo sario, podemos reemplazar el número de Sin el prototipo, el método search() en que debería ser suficiente para un uso días en la expresión con algo como 3 la expresión psearch ($db->search(...)) normal. month o 18 hour. Por supuesto, no estará en un contexto de array, y esto sighacen referencia al tiempo real, sino a la nifica que el método search() de Métodos última actualización de la base de datos, DBI::Class devolverá una lista de coinciDespués del indexado inicial con rummage -u (de update), el usuario puede Comandos Rummage finalmente acceder a los meta-datos y al rummage -u -v Refresca o crea la base de datos; -v para el status de saíndice con todo el texto. El comando lida detallada en el fichero de log rummage -k clave busca texto que conrummage -k ‘linux’ Búsqueda por palabra clave “linux” tenga la palabra clave. El cuadro 1 muesrummage -k ‘“mike schilli”‘ Búsqueda por frase tra algunos ejemplos de diferentes búsrummage -k ‘foo AND (bar OR baz)‘ Documentos con “foo” y “bar” o con “foo” y “baz” quedas y consultas para diferentes metarummage -k ‘torvald*‘ Búsqueda con comodines datos. rummage -p ruta Búsqueda de archivo por nombre o ruta Como muestra el esquema de la Figura rummage -n 20 Muestra los últimos 20 archivos modificados 1, la base de datos MySQL guarda la ruta rummage -m ‘7 day’ Todos los archivos modificados la última semana completa de cada archivo, su tamaño en
WWW.LINUX- MAGAZINE.ES
Número 12
49
DESARROLLO • Perl: Búsquedas
dencias por definición más que un iterador. getopts() analiza los parámetros que se le pasan. La opción de actualización de la base de datos (-u) habilita el entorno de trabajo de Log4perl. Si el usuario especifica salida detallada (-v), el nivel se fija en $DEBUG. Por defecto es $INFO, que guarda únicamente mensajes de información en el archivo log. El archivo log se sobrescribe cada vez para evitar que se llene el disco duro. Un
método alternativo podría utilizar una configuración de Log4perl con Log::Dispatch::FileRotate. En la línea 41, db_init() llama a la función con este nombre en 186. La función inicializa la base de datos con la tabla file, si no se ha creado antes. La función define además un índice en la columna path para permitir a rummage que verifique rápidamente si existe un registro para un archivo, y si la información de fecha/hora ha cambiado. Estas caracte-
rísticas extras significan que la búsqueda inicial de rummage tras la instalación pueden llevar un buen rato. Pero no nos preocupemos, las actualizaciones serán mucho más rápidas. Class::DBI::Loader conecta con la base de datos en la línea 44 para generar la representación orientada a objetos de la base de datos para Class::DBI. Según esto, el acceso orientado a objetos a la tabla file se hace usando la clase Rummage::File. Si alguna de las llamadas
Listado 1: rummage 001 #!/usr/bin/perl -w 002 ############################# 003 # rummage - Índices y búsquedas 004 # en el directorio home 005 # Mike Schilli, 2005 006 # <m@perlmeister.com> 007 ############################# 008 use strict; 009 010 use Getopt::Std; 011 use File::Find; 012 use DBI; 013 use Class::DBI::Loader; 014 use Log::Log4perl qw(:easy); 015 use SWISH::API::Common; 016 use Time::Piece::MySQL; 017 018 my $MAX_SIZE = 100_000; 019 my $DSN = "dbi:mysql:dts"; 020 my @DIRS = ("$ENV{HOME}"); 021 my $COUNTER = 0; 022 023 @DIRS = map { 024 -l $_ ? readlink $_ : $_ 025 } @DIRS; 026 027 sub psearch($); 028 getopts( "un:m:k:p:v", 029 \my %opts ); 030 031 if ( $opts{u} ) { 032 Log::Log4perl->easy_init( { 033 level => 034 $opts{v} ? $DEBUG : 035 $INFO, 036 file => 037 ">/tmp/rummage.log", 038 }); 039 } 040 041 db_init($DSN); 042 043 my $loader =
50
Número 12
044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087
Class::DBI::Loader->new( dsn => $DSN, user => "root", namespace => "Rummage", ); my $filedb = $loader->find_class("file"); my $swish = SWISH::API::Common->new( file_len_max => $MAX_SIZE, atime_preserve => 1, ); # Búsqueda por palabra clave if ( $opts{k} ) { my @docs = $swish->search( $opts{k} ); print $_->path(), "\n" for @docs; # Búsqueda por mtime } elsif ( $opts{m} ) { $filedb->set_sql( modified => qq{ SELECT __ESSENTIAL__ FROM __TABLE__ WHERE DATE_SUB(NOW(), INTERVAL $opts{m}) <= mtime }); psearch( $filedb->search_modified() ); # Búsqueda por ruta } elsif ( $opts{p} ) { psearch( $filedb->search_like( path => "%$opts{p}%" ) ); # Búsqueda de los más nuevo
WWW.LINUX- MAGAZINE.ES
088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
} elsif ( exists $opts{n} ) { $opts{n} = 10 unless $opts{n}; $filedb->set_sql( newest => qq{ SELECT __ESSENTIAL__ FROM __TABLE__ ORDER BY mtime DESC LIMIT $opts{n} }); psearch( $filedb->search_newest() ); # Indexa directorio Home } elsif ( $opts{u} ) { # Desmarca todos $filedb->set_sql( "uncheck_all", qq{ UPDATE __TABLE__ SET checked=0 }); $filedb->sql_uncheck_all() ->execute(); find( \&wanted, @DIRS ); # Actualiza palabras clave $swish->index_remove(); $swish->index(@DIRS); # Borrar documentos muertos # en B de D $filedb->set_sql( "delete_dead", qq{ DELETE FROM __TABLE__ WHERE checked=0 }); $filedb->sql_delete_dead() ->execute(); } else {
Perl: Búsquedas • DESARROLLO
proporciona el método mysql_datetime para convertir el valor devuelto por la función time() de Perl al formato de MySQL. La función mysqltime definida en la línea 238 de rummage acorta la llamada.
Devoradores de Basura y Espacio en Disco
Figura 2: Consulta MySQL para localizar los mayores devoradores de espacio en disco.
search() devuelve un iterador, se muestra vía psearch(), que simplemente hace la llamada ->next() hasta que el iterador no devuelva ningún resultado más. El método objeto path() resultante recupera la ruta del archivo para cada coincidencia, mientras que el método mtime() recupera la hora de última modificación para ese registro. No todas las consultas pueden realizarse con facilidad usando una abstracción de Class::DBI. Cuando las cosas se vuelven más complicadas, podemos bajar a nivel SQL con la Class:DBI. El método set_sql nos permite definir consultas, como newest de la línea 2, que desde ese momento estará disponible en la abstracción de Class:DBI como search_newest().
Al Día Cuando rummage advierte el parámetro -u en línea de comandos, buscará en el sistema de archivos usando File::Find, y añadirá la última meta-información a la base de datos. Para empezar, el comando UPDATE definido en la línea 107 y ejecutado en la 112, fija el valor de la columna checked para todas las entradas a 0. Si la función de búsqueda encuentra una entrada en el sistema de archivos, se etiqueta como verificada poniendo su valor de la columna checked a 1. Toda entrada que siga con el valor checked=0 después de completar la búsqueda, obviamente ha desaparecido del sistema de archivos desde la última búsqueda. Estas entradas deben ser borradas de la base de datos y eliminadas del índice todo-texto.
La línea 115 ejecuta la función find, que comienza la búsqueda en los directorios especificados y rastrea toda la estructura del sistema de archivos. La función wanted definida en la línea 140 es llamada cada vez que se encuentra una entrada. La línea 142 descarta inmediatamente cualquier cosa que no parezca un archivo. El comando stat de la línea 150 averigua el tamaño de archivo en bytes, junto con su fecha de última lectura y escritura. Si se encuentra una entrada en la base de datos que coincide con la ruta, la línea 160 verifica si su última modificación es igual al valor guardado en la base de datos. Si no son iguales, las líneas 165 a 167 actualizan la meta-información. (mtime, atime, size) para la entrada. Si el fichero no está aún en la base de datos, el método create de la línea 170 crea una nueva entrada. La llamada a checked() en la línea 180 fija el campo checked a 1, seguido de update() que es quién realmente realiza la transacción de actualización.
El usuario puede juguetear con los metadatos de los archivos que rummage ha procesado con el cliente de mysql antes de añadirle más inteligencia con las consultas basadas en DBI::Class. El shell DBI dbish de CPAN se conecta con cualquier base de datos soportada por DBI, y admite consultas SQL. Se instala con el módulo DBI::Shell de CPAN. La siguiente llamada es para una base de datos MySQL: dbish dbi:mysql:<TABLE> user password. La Figura 2 muestra el shell en acción: una consulta SQL para los diez mayores devoradores de espacio en disco: SELECT path, size FROM file ORDER BY size DESC LIMIT 10;
mostrará a los culpables implorando clemencia. La siguiente expresión SQL busca los diez archivos más antiguos que no se han tocado en años: SELECT path, atime FROM file ORDER BY atime ASC LIMIT 10;
Los archivos de texto se procesan cada día. A menos que montemos el sistema de ficheros con la opción noatime, la última
Conversión del Formato de Fecha MySQL aguarda un formato “YYYY-MM-DD HH:MM:SS” para los campos DATETIME, pero el comando stat devuelve la fecha y hora de Unix en segundos. El módulo Time::Piece::MySQL
WWW.LINUX- MAGAZINE.ES
Número 12
51
DESARROLLO • Perl: Búsquedas
Listado 1: rummage (cont.)
52
LOGDIE "usage: $0 [-u] ", "[-v] [-n [N]] ", "[-p pathlike] ", "[-k keyword] ", "[-m interval]"; } ############################# sub wanted { ############################# return unless -f; my $fn = $File::Find::name; DEBUG ++$COUNTER, " $fn"; my ( $size, $atime, $mtime ) = ( stat($_) )[ 7, 8, 9 ]; $atime = mysqltime($atime); $mtime = mysqltime($mtime); my $entry; if ( ($entry) = $filedb->search( path => $fn)) { if ( $entry->mtime() eq $mtime ) { DEBUG "$fn unchanged"; } else { INFO "$fn changed"; $entry->mtime($mtime); $entry->size($size); $entry->atime($atime); } } else { $entry = $filedb->create( { path => $fn, mtime => $mtime, atime => $atime, size => $size, first_seen => mysqltime(time()), }); } $entry->checked(1); $entry->update(); return; } ############################# sub db_init { ############################# my ($dsn) = @_;
Número 12
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
Instalación my $dbh = DBI->connect( $dsn, "root", "", { PrintError => 0 } ); LOGDIE "DB conn failed: ", DBI::errstr unless $dbh; if ( !$dbh->do( q{select * from file limit 1} )) { $dbh->do( q{ CREATE TABLE file ( fileid INTEGER PRIMARY KEY AUTO_INCREMENT, path VARCHAR(255), size INTEGER, mtime DATETIME, atime DATETIME, first_seen DATETIME, type VARCHAR(255), checked INTEGER )}) or LOGDIE "Cannot create table"; $dbh->do( q{ CREATE INDEX file_idx ON file (path) }); } } ############################# sub psearch($) { ############################# my ($it) = @_; while ( my $doc = $it->next() ) { print $doc->path(), " (", $doc->mtime(), ")", "\n"; } } ############################# sub mysqltime { ############################# my ($time) = @_; return Time::Piece->new( $time)->mysql_datetime(); }
WWW.LINUX- MAGAZINE.ES
El shell CPAN debería guiarnos en el proceso de instalación de los módulos Perl necesarios. La herramienta mysqladmin nos ayudará a crear la base de datos dts en MySQL: mysqladmin --user=root create dts.rummage se encarga de las tablas de la base de datos automáticamente. Un cron hace la llamada a rummage diariamente a las 3:05 AM: 03 * * * LD_LIBRARY_PATH=/usr/ local/lib /home/mschilli/bin/rummage -u -v >/dev/null 2>&1 La base de datos MySQL se incluye en la mayoría de las distribuciones Linux. También podemos descargarla de mysql.com. El indexador swish-e y el módulo SWISH::API están disponibles en swishe.org. SWISH::API::Common de CPAN intenta instalarse automáticamente. Si esto no funciona, puede que prefiramos descargar swish-e 2.4.3 o superior, y luego ejecutar ./configure; make install para instalarlo. El módulo SWISH::API se incluye en la distribución. Los siguientes comandos cd perl LD_RUN_PATH=U /usr/local/lib perl Makefile.PL make install
se encargan ■AUTOR
de
la
instalación.
RECURSOS [1] Listados de este artículo: http://www. linux-magazine.es/Magazine/ Downloads/11/ [2] Google Desktop Search: http:// desktop.google.com
EL AUTOR
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
fecha de acceso no será nunca de más de un día de antiguedad.
Michael Schilli trabaja como desarrollador 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 página está en http:// perlmeister.com
Python • DESARROLLO
La nueva tecnología web.
AJAX
AJAX es la palabra de moda, Google usa AJAX, Yahoo usa AJAX… todo el mundo quiere usar AJAX pero ¿lo usas tú? y más importante aún ¿qué demonios es AJAX? POR JOSÉ MARÍA RUIZ Y PEDRO ORANTES
A
Brave New World” (“Un Mundo Feliz”) es el nombre de la famosa novela de Aldous Huxley, en ella nos muestra un mundo distinto y aterrador pero que parecía, y parece, cada vez más cercano. Nosotros no tenemos una visión tan pesimista del mundo, pero es probable que ese título (que se podría traducir literalmente por «un nuevo y desafiante mundo») explique todo el revuelo que está levantando AJAX. El término fue acuñado por Jesse James Garrett en el artículo [1] de la tabla Referencias. Durante mucho tiempo las GUIs, las Interfaces Gráficas de Usuario, han dominado la informática. La gente que trabajaba en la Web siempre estaba intentando convencer a todo el mundo de que para la mayoría de los programas, un interfaz web bastaba. Pero los usuarios estaban acostumbrados a ciertas características, como el auto-completado
de campos o el arrastrar y soltar, que eran imposibles en la Web. Conforme avanzaba el tiempo numerosas empresas y personas proponían soluciones. La lista es interminable: JavaScript, Java Applets, ActiveX, Tcl, VBScript, Macromedia Flash… Pero todas fallaban de uno u otra manera. En el caso de Java, para ejecutar el Applet necesitabas tener instalado el Java Runtime Environment, y la mayoría de los usuarios no sabían ni qué era aquello que se le pedía. Lo mismo ocurría con Macromedia Flash. Lo peor era que cuando estaba solucionado el tema de la instalación del software adecuado, los desarrolladores creaban, y crean, páginas horribles llenas de cosas moviéndose que distraen e irritan. Se sentían impulsados a usar hasta la última capacidad de las nuevas herramientas y acababan generando monstruosidades.
WWW.LINUX- MAGAZINE.ES
Esta fase ya casi ha pasado y ahora se busca la sencillez, y en el momento justo surgió AJAX. Para más información ver url [2] de la tabla Referencias.
Los problemas con IE Internet Explorer, a pesar de ser el primero que introdujo XMLHTTPRequest, es el que más problemas da en su uso. El código aquí mostrado ni siquiera funciona en IE debido a que en él se hace uso de un componente ActiveX para establecer la conexión. Existen numerosas técnicas para permitir la compatibilidad entre navegadores, pero debido a la extensión del artículo y a su complejidad no las hemos mostrado. El lector interesado en la compatibilidad puede estudiar el código de sistemas de código libre que implementan AJAX como puede ser Sarissa. Vea la referencia [3] en la tabla Recursos.
Número 12
53
DESARROLLO • Python
¿Pero qué es AJAX? Muy buena pregunta. Lo cierto es que AJAX ha estado delante de nuestras narices todo el tiempo, esperando a que alguna mente despierta lo redescubriese. El acrónimo «AJAX» se compone de las palabras «Asynchronous JavaScript and XML», término acuñado por Jesse James Garrett, y curiosamente su existencia se debe a una de esas famosas violaciones de los estándares que suele realizar Microsoft con sus productos. Allá por 1998, Microsoft introdujo dentro de sus productos una librería que le permitía hacer consultas usando el protocolo HTTP de manera autónoma y asíncrona. Cuando tu navegador accede a una página y esta contiene código Javascript, este código a su vez puede traer información de esa u otras páginas de manera independiente. Si además se hace que este código permanezca en ejecución respondiendo a eventos tenemos entre manos la
posibilidad de traer información al navegador sin recargar la página. Esto es útil para algunas tareas pero no demasiado, ya que a nuestro puzzle le faltan piezas. La primera pieza es la adopción de esta librería por casi todos los navegadores, por lo tanto el código pasa a ser de aplicación universal. Además resulta que podemos modificar el contenido de la página en tiempo real usando el denominado árbol DOM. Y por si fuese poco, cuando AJAX fue definido, los programadores comenzaron a usar protocolos XML para comunicarse con los servidores. ¿Qué quiere decir esto? Pues que ahora, con AJAX, podemos cargar una página y, sin tener que recargarla, traernos información, modificar la página en tiempo real, e interactuar con servidores remotos usando protocolos XML. Básicamente, una vez cargada la página web tenemos entre manos todas las posibilidades de programación de un GUI tradicional. Y todo esto sin necesidad de plugins ni instalaciones, toda esta tecnología está en nuestros navegadores esperando ser usada.
¿Cómo encaja Python? Pues vamos a realizar un pequeño servidor de contenidos en Python que pueda
ser consultado usando AJAX. Crearemos una web con algo de código Javascript que a intervalos accederá a nuestro servidor Python y modificará el aspecto de la página web.
Los 5 Ingredientes Los cinco ingredientes necesarios para elaborar nuestro producto son CSS, Javascript, HTML, XML y Python, como aparecen en la figura 1, y cada uno tiene su función en esta obra. HTML es la base sobre la que vamos a trabajar, definimos una página web en la que todo ocurrirá. De hecho, con el paso del tiempo el propio HTML ha acabado convirtiéndose en una especie de plantilla donde campan a sus anchas CSS y Javascript. CSS nos permite otorgar propiedades visuales a los elementos de HTML. Javascript es el encargado de actuar en la máquina cliente, en el navegador, y puede modificar tanto el HTML como las propiedades visuales que CSS define. Con la llamada XMLHttpResponse sus atribuciones se han disparado. Ahora se ve como un lenguaje de programación de pleno derecho. En los próximos años puede que adquiera mucha más importancia de la que ha tenido hasta ahora.
Listado 1: fichero server.py 01 02 03 04 05 06 07
08 09 10 11 12 13 14 15
#!/usr/local/bin/python
19
import BaseHTTPServer import os import cgi
20 21
class AJAXHTTPRequestHandler (BaseHTTPServer.BaseHTTPReques tHandler): """ Responde a peticiones HTTP """ def do_GET(self): "Gestiona los GET"
acciones = { "/" : ["envia_fichero","index.html"] , 16 "/ps.xml" : ["envia_comando", "ps afx"], 17 "/df.xml": ["envia_comando", "df"], 18 "/who.xml": ["envia_comando","who"],
54
Número 12
"/uname.xml": ["envia_comando","uname -a"]}
if self.path in acciones.keys(): 22 accion = acciones[self.path] 23 (getattr(self,accion[0]))(self .path,accion[1]) 24 else: 25 if (self.path[-3:] == ".js" or 26 self.path[-4:] == ".css"): 27 self.envia_fichero("",self.pat h[1:]) 28 29 else: 30 self.envia_fichero("","404.htm l") 31 32 def
WWW.LINUX- MAGAZINE.ES
envia_fichero(self,ruta,fichero): 33 # No usamos ruta, pero así simplificamos el código 34 p = Pagina(fichero) 35 self.enviar_respuesta(p.tipo(), p.contenido()) 36 37 def envia_comando(self,ruta,comando): 38 c = Comando(comando) 39 self.enviar_respuesta(c.tipo(), c.contenido()) 40 41 def enviar_respuesta(self, tipo, contenido): 42 self.enviar_cabecera(tipo) 43 self.wfile.write(contenido) 44 45 def enviar_cabecera(self, tipo): 46 self.send_respon-
DESARROLLO • Python
XML es el nuevo lenguaje estándar de intercambio de información. Prácticamente cualquier lenguaje dispone ya de librerías para generar y analizar documentos XML. Dentro del mundillo AJAX se ha convertido en el estándar para el intercambio de información con el servidor y para la serialización de objetos con protocolos como JSON. Y, como no, Python. En nuestro caso se va a encargar tanto de realizar las tareas de servidor HTTP como de recolectar información importante y confeccionar con ella ficheros XML. Tenemos que compenetrar todos estos elementos para realizar nuestro proyecto. El objetivo es que los componentes HTML, Javascript, CSS y XML sean tan estáticos como sea posible, debido a que todos ellos interactúan con el usuario. Es en el servidor Python donde debemos aportar la flexibilidad necesaria como para añadir nuevas características sin tener que cambiar ninguno de los otros elementos.
La parte de Python: BaseHTTPRequest Python dispone en sus librerías estándar de muchos «esqueletos» para distintos tipos de servidores. Entre ellos encontra-
Figura 1: Esquema de nuestra aplicación AJAX con todos sus compenentes.
mos BaseHttpRequest. Esta clase nos permite construir servidores HTTP sin excesivo esfuerzo, así que la emplearemos. Pero no debemos usarla directamente, sino a través de la clase BaseHttpRequestHandler, que es la encargada de gestionar los eventos que se suceden en el servidor. Por tanto heredaremos de ella y crearemos una clase llamada AJAXHttpRequestHandler, ver Listado 1 (todos los listados de este artículo pueden descargarse de [4]). Un servidor HTTP recibe distintos tipos de comandos, pero el que nos inte-
resa es el comando GET. Es el usado para solicitar información al servidor. Cada vez que se realice una petición GET se invocará el método do_GET de BaseHTTPRequestHandler así que lo vamos a redefinir en nuestra clase. Cuando se invoque do_GET, en la variable de instancia self.path se encuentra la ruta solicitada por el cliente. Nosotros contrastaremos esta ruta contra las que aceptamos. Si no se encuentra entre ellas, devolveremos la célebre página 404, indicando que la página solicitada no existe. La información se devuelve
Listado 1: fichero server.py (cont.) se(200) 47 self.send_header("Content-type ","text/" + tipo) 48 self.end_headers() 49 50 class Pagina: 51 def __init__(self,nombre): 52 self.nombre = nombre 53 self.texto = "" 54 fichero = file(self.nombre) 55 self.texto = fichero.read() 56 fichero.close() 57 58 def contenido(self): 59 return self.texto 60 61 def tipo(self): 62 tipo = "html" 63 ext = self.nombre[-4:] 64 if (ext == "html"): 65 tipo = "html" 66 elif (ext == ".xml"):
56
Número 12
67 tipo = "xml" 68 elif (ext == ".css"): 69 tipo = "css" 70 return tipo 71 72 class Comando: 73 def __init__(self,comando): 74 self.tuberia = os.popen(comando) 75 self.xml = "" 76 77 def contenido(self): 78 # fichero XML 79 if not self.xml: 80 self.xml = "<?xml version=\"1.0\" ?>" 81 self.xml += "<salida>" 82 linea = self.tuberia.readline()[:-1] # para quitar el \n 83 while linea: 84 self.xml += "<linea>" + cgi.escape(linea)
WWW.LINUX- MAGAZINE.ES
+ "</linea>" 85
linea = self.tuberia.readline()[:-1] 86 self.xml += "</salida>" 87 return self.xml 88 89 def tipo(self): 90 return "xml" 91 92 def test(HandlerClass = AJAXHTTPRequestHandler, 93 ServerClass = BaseHTTPServer.HTTPServer): 94 BaseHTTPServer.test(HandlerCla ss, ServerClass) 95 96 if __name__ == '__main__': 97 test()
Python • DESARROLLO
usando el método self.wfile.write(), lo que en él escribamos, será devuelto al cliente que realizó la petición. Además del fichero index.html, ofreceremos una serie de servicios en forma de ficheros XML. Estos servicios consistirán en la ejecución de un comando de sistema, y la conversión de su salida en un fichero XML. El formato del fichero será muy sencillo:
Listado 2: fichero index.html 01 <html> 02 <head> 03 <title>Pruebas con AJAX</title> 04 <link rel="stylesheet" href="estilo.css" type="text/css" /> 05 <script language="Javascript" 06 src="ajax.js"> 07 </script> 08 </head> 09 <body> 10 <div id="documento"> 11 <h3 id="titulo">Información del sistema</h3> 12 <input type="button" name="button" value="Procesos" 13 onclick="javascript:hazPeticio n('ps.xml');" /> 14 <input type="button" name="button" value="Disco" 15 onclick="javascript:hazPeticio n('df.xml');" /> 16 <input type="button" name="button" value="Usuarios" 17 onclick="javascript:hazPeticio n('who.xml');" /> 18 <input type="button" name="button" value="Máquina" 19 onclick="javascript:hazPeticio n('uname.xml');" /> 20 <div id="contenedor"> 21 <div id="datos"></div> 22 </div> 23 </div> 24 </body> 25 </html>
Figura 2: La clase BaseHTTPRequest genera una entrada por comando.
<?xml version="1.0"?> <salida> <linea>linea de salida</linea> ... <linea>linea de salida</linea> ... <linea>linea de salida</linea> </salida>
Por lo que generaremos el fichero XML «a mano», sin hacer uso de librerías. De esta manera, cuando el cliente solicite el fichero ps.xml, nuestro servidor ejecutará el comando ps afx, creará el fichero ps.xml con la salida del comando y se lo enviará al cliente.
Definición de servicios Para permitir que la definición de servicios sea lo más simple posible, basta con introducir una nueva entrada en el diccionario acciones de la clase AJAXHTTPRequestHandler con la siguiente estructura:
desde envia_respuesta antes de enviar el fichero en sí. Es de esta manera como el navegador determina el tipo de fichero que recibe y sus características. Cuando arranquemos el servidor, veremos que van apareciendo mensajes correspondientes a los distintos comandos que se le mandan. La clase BaseHTTPRequest genera una entrada por cada una. Ver figura 2.
Gestores de servicios Para gestionar los servicios se han creado las clases Pagina y Comando, que responden a los mismos métodos. La primera, Pagina, se encarga de las peticiones de ficheros de texto, que en nuestro programa se reducen al fichero index.html y sus ficheros supletorios, fichero Javascript y CSS. Básicamente los carga en una variable y, mediante el método contenido, las demás clases tienen accesos a los mismos. En este caso, el parámetro ruta no afecta a esta clase, pero se ha definido para que guarde compatibilidad con la clase Comando. La clase Comando ejecuta el comando especificado y permite el acceso al texto devuelto por él mismo mediante el mismo método que la clase Pagina. De esta manera son intercambiables. Ambas clases poseen un método tipo() que devuelve el tipo de fichero que almacenan. En el caso de Comando, siempre será un fichero XML, pero Pagina debe «adivinar» el tipo de los ficheros que
<ruta> : [<método_a_invocar>,U <comando_a_ejecutar>],
Cuando se gestiona el comando HTTP GET, se busca en este diccionario la ruta. En caso de que esté presente, se ejecutará el método almacenado usando como parámetros la ruta y el comando. Esto nos da gran flexibilidad, añadir un nuevo servicio consiste en introducir una nueva linea de código. Existe un detalle importante, todo fichero devuelto usando HTTP debe tener una cabecera con una serie de líneas con formato llave: valor que dan información al cliente, el navegador, sobre el fichero devuelto. Debido a problemas de espacio hemos decidido devolver sólo el formato del fichero. Para ello se invoca el método envia_cabecera
WWW.LINUX- MAGAZINE.ES
Número 12
57
DESARROLLO • Python
devuelve. Para ello se comprueba la extensión de los mismos. En aras de la simplicidad, sólo consideraremos tres extensiones. Cuando un comando es ejecutado por Comando, se tiene especial cuidado en utilizar la función cgi.escape sobre cada linea. Esta función realiza algunas conversiones dentro del texto que se le pasa para que pueda ser correctamente visualizado por un navegador web. El problema radica en que ciertos caracteres, como pueden ser «<» or «”» son especiales y si no se «escapan», si no se preceden de un «\», causarán problemas. Y con esto, hemos definido un servidor web básico. Python nos permite realizar complejas tareas con poco código y
este es uno de esos casos. Vayamos ahora a por AJAX para comprenderlo.
HTML Quizá éste sea uno de los artículos donde Python tenga menor protagonismo, pero con cinco actores suele ser complicado. Veamos el HTML. La página index.html se puede ver en el Listado 2. Básicamente carga un fichero Javascript, un fichero CSS y muestra un título junto a unos cuantos botones. Estos botones invocan acciones en Javascript. Debemos fijarnos especialmente en el uso del atributo id en numerosas etiquetas HTML. Gracias a estos ids podremos manipularlas mediante Javascript.
Javascript, desde otra perspectiva Mucha gente ha tenido extraños encuentros con este lenguaje de programación. Es raro y, hasta hace no demasiado, no muy útil. Te permitía modificar colores en páginas web o poner insidiosos banners. Por no hablar de las famosas ventanas emergentes. Esto ha hecho que se haya ganado una fama muy mala, tal es así que casi todos tenemos restricciones en nuestro navegador en torno a qué acciones puede o no realizar Javascript. Lo más normal es que tengamos uno de esos famosos bloqueadores de popups. Pero Javascript se ha reinsertado en la sociedad de los programadores por la puerta grande gracias a un solo objeto.
Listado 3: fichero ajax.js. 01 // GLOBALES 02 var http_request = false; 03 04 function hazPeticion(url) { 05 http_request = false; 06 http_request= new XMLHttpRequest(); 07 if (http_request.overrideMimeType ) { 08 http_request.overrideMimeType( 'text/xml'); 09 } 10 11 if (!http_request) { 12 alert('Error al crear la instancia de XMLHttpRequest.'); 13 return false; 14 } 15 16 // Esto es un callback, que se dispara al terminar de 17 // descargar el fichero xml. 18 http_request.onreadystatechange = modificaContenido; 19 http_request.open('GET', url, true); 20 http_request.send(null); 21 } 22 // Elimina todo elemento con id "linea" 23 function vaciaContenido(){ 24 var d = document.getElementById("contenedor");
58
Número 12
25
47 while(document.getElementById( "linea0") ||
26
27
28 29
30 31
document.getElementById("linea 1")){ nodo = document.getElementById("linea 0"); if (! nodo){ nodo = document.getElementById("linea 1"); } var nodo_basura = d.removeChild(nodo); } }
32 33 34 35 // Carga el resultado del XML 36 function modificaContenido() { 37 if (http_request.readyState == 4) { 38 if (http_request.status == 200) { 39 vaciaContenido(); 40 41 var xmldoc = http_request.responseXML; 42 var root = xmldoc.getElementsByTagName('s alida').item(0); 43 44 var fondo = 0; 45 46 for(var i = 0; i < root.childNodes.length; i++){
WWW.LINUX- MAGAZINE.ES
48 49
var nodo = root.childNodes.item(i);
var contenedor = document.getElementById("contenedor"); 50 var p = document.createElement("p"); 51 52 // Truco para los colores ;) 53 if (fondo == 0) { 54 p.setAttribute("id","linea0"); } 55 else { 56 p.setAttribute("id","linea1"); 57 } 58 fondo = 1 - fondo; 59 60 var titulo = document.getElementById("datos"); 61 p.textContent = nodo.firstChild.data; 62 63 contenedor.insertBefore(p,titu lo); 64 } 65 66 } else { 67 alert('Hubo un problema con la petición.'); 68 } 69 } 70 }
DESARROLLO • Python
mente nada que ver, aparte del nombre. En nuestro ejemplo vemos tres funciones: • hazPeticion() • modificaContenido() • vaciaContenido() Javascript, además de muchas de las características presentes Figura 3: Nuestra página devolverá los resultados de en otros lenguajes (y algunas la consulta sin recargar. ausentes) dispone de una colección de objetos que le permiten Nos referimos al ahora famoso realizar operaciones. A día de hoy los XMLHttpRequest. más importantes: Si vemos el código del Listado 3, vere• Manipulación DOM mos un lenguaje que quizá nos recuerda • Manipulación XML a Java. En realidad no tienen absoluta• XMLHTTP DOM permite a Javascript manipular, en Listado 4: fichero estilo.css tiempo real, el contenido de la página web. Puede añadir, modificar o quitar etiquetas y atributos, por lo que pode01 #documento{ mos operar sobre el documento de cual02 margin-left: quier forma posible. Javascript puede 100px; manipular un fichero XML de igual 03 } forma que hace DOM. 04 Y la gran novedad, Javascript puede 05 realizar conexiones ASÍNCRONAS con el 06 #titulo{ servidor. Y resalto en mayúscula la pala07 text-decoration: bra ASÍNCRONAS porque ahí está la underline; clave. 08 } Esto significa que podemos hace cone09 xiones, traernos documentos XML del 10 servidor y realizar operaciones DOM o 11 de cualquier otro tipo, ¡cuando quera12 #linea0 { mos! 13 margin: 0px; El usuario carga su página web, y una 14 padding-left: 20px; vez cargada, sin necesidad de recargarla, 15 background: #e0e0e0; podemos modificarla a nuestro antojo en 16 font-family: monosbase a información que podemos pedir pace; al servidor en cualquier momento. 17 } Volviendo a nuestras funciones, la fun18 ción hazPeticion() recibe una url, crea el 19 #linea1 { objeto XMLHttpRequest y después de 20 margin: 0px; algunas comprobaciones, asigna una 21 padding-left: 20px; función para que sea invocada cuando el 22 font-family: monosfichero que esa url especifica sea compace; pletamente descargado. 23 } Esto significa que mientras leemos 24 nuestra web, Javascript estará bajando 25 #contenedor{ un fichero y, cuando finalice, llamará a 26 border-style: la función modificaContenido. dashed; ¿Y qué hace esta función? Comprueba 27 border-width: el estado de la petición, (el estado 200 el 1px; de «todo correcto» y el de 404 el de «lo 28 width: 600px; sentimos mucho, pero el fichero solicita29 border-color: do no está disponible») y entonces obtieblack; ne el documento XML del objeto que 30 } gestionaba la conexión.
60
Número 12
WWW.LINUX- MAGAZINE.ES
Pero antes invoca a vaciaContenido(), que localiza toda etiqueta con las ids «linea0» o «linea1» y las elimina de la página. Hacemos esto porque a continuación las volvemos a introducir en la página, pero esta vez con los datos frescos del servidor. No queremos entrar en los detalles, ya que, en teoría, esto es un artículo sobre Python no Javascript, pero básicamente esto es lo que hace el fichero ajax.js. El fichero estilo.c, que aparece en el listado 4, simplemente configura los colores y características de algunas de las etiquetas, para que el aspecto mejore. Y se acabó, aquí tenemos nuestra aplicación AJAX. El resultado final será el que vemos en la figura 3. Cuando pulsemos cualquiera de los botones, se cargará la salida de texto de la ejecución asociada a cada uno de ellos en pantalla, pero sin recargar la página. Si queremos añadir un nuevo comando sólo tenemos que introducir la línea correspondiente en acciones en server.py y añadir un nuevo botón como los que ya existen en index.html.
Conclusión ¿Es tan complicado eso de AJAX? ¡Por supuesto que no! Lo que ocurre es que es una palabra que se está convirtiendo en un mito, pero no deja de ser una astuta combinación de programación en el servidor y cliente además del uso intensivo de XMLHttpRequest. Poco a poco AJAX está poblando todas las páginas webs y la mayoría de los currículos vitae. Quien sabe, lo mismo dentro de dos años esa palabra tenga tanto poder como otra palabra de cuatro ■ letras: J2EE.
La Columna de Charly • ADMINISTRACIÓN
El día a día del Administrador de Sistemas: Leafnode
TERAPIA DE GRUPO Leafnode es un servidor Usenet para sitios pequeños donde unos cuantos usuarios necesitan acceder a un gran número de grupos. El servidor de Leafnode está diseñado para recuperarse de errores de manera autónoma y sin la necesidad de que le prestemos mucha atención. POR CHARLY KÜHNAST
S
i se enfrenta a la tarea de montar un servidor de noticias, podría descubrir INN en su paquete de herramientas. El servicio INN es potente y flexible. Pero, por otro lado, dependiendo de la configuración, consume muchos recursos y mirándolo detenidamente, el mantenimiento no es trivial. De hecho, INN es excesivo para grupos pequeños y aquí es donde Leafnode interviene. Aunque Leafnode sea formalmente un servidor NNTP, podría también describirse como un proxy de noticias. Para ahorrar recursos, este servidor no intenta almacenar cada artículo en cada grupo de discusión. Si un usuario se suscribe a un grupo de discusión, Leafnode le dirá que las noticias para el grupo no están disponibles y ofrece traérselas de un servidor de noticias real. Mientras el grupo de discusión sea leído con cierta regularidad, Leafnode lo mantendrá actualizado. Si un grupo permanece sin leer durante un período configurable de tiempo, Leafnode cancela la suscripción a dicho grupo. El sistema Leafnode es perfecto para via-
SYSADMIN TFP Automático………..……..…....62 ¿Podría colocar comandos FTP repetitivos en un script?. El Taller del Administrador: Resolvers………..………..………….66 Resolver es un enlace cliente al sistema global DNS. Un sustituto de Apache: AOLServer………..………..………..70 AOLServer es un potente y estable servidor web con interesantes prestaciones.
jes. Además juega un papel importante en mi ordenador portátil. Cuando estoy de aquí para allá y sólo tengo acceso mediante una línea de teléfono cara en mi cuarto del hotel, solamente digo a Leafnode que se traiga las últimas noticias y luego cierro la conexión. Entonces puedo echarle un vistazo a mis noticias favoritas en modo offline.
Zona Libre de Servicios Cualquier distribución de Linux debería tener Leafnode, por lo que no será necesario compilar el paquete. Pero si prefiere hacerlo, puede mirar la página web del proyecto en [1], la cual le proporciona un enlace desde donde descargar el código fuente. El servicio Leafnode no se ejecuta de forma permanente pero se lanza vía Inetd, Xinetd o Tcpserver. La configuración de Xinetd podría ser de la siguiente forma, por ejemplo: service nntp { socket_type = stream protocol = tcp wait = no user = news server U = /usr/sbin/leafnode }
También necesitará decirle dónde encontrar su fuente de datos: el servidor de noticias genuino. Tiene que añadir el nombre de este servidor o la dirección IP al archivo de configuración de Leafnode, normalmente a /etc/leafnode/config y al /etc/nntpserver. Finalmente, usted necesita un cronjob para la cuenta news que
WWW.LINUX-MAGAZINE.ES
elimina artículos anticuados de la colección: 0 4 * * * /usr/local/ U sbin/texpire
Fetchnews recoge nuevos mensajes para los grupos suscritos desde el servidor maestro y los coloca en la cola de Leafnode. Este instrumento forma parte del paquete. Si tiene un acceso a Internet permanente, puede añadir una llamada a Fetchnews en el crontab. Los usuarios de una línea telefónica (como en un hotel) pueden preferir añadir Fetchnews a los scripts ip-up o ejecutar el comando a mano. Sólo unas palabras sobre las características de seguridad de Leafnode: “ “. Exactamente: ¡Leafnode no tiene ninguna seguridad! Si usted quiere evitar que los spammers secuestren su proxy de news, asegúrese de que el puerto 119 esté bloqueado contra el acceso a través de Internet. ¡De otra manera necesitará ■ terapia de grupo… de noticias!
RECURSOS [1] Leafnode: http://leafnode.sourceforge. net
Número 12
61
ADMINISTRACIÓN • Auto-FTP
Realización de Scripts para la Automatización de FTP
Anna María López López
ENTREGA INMEDIATA
Si ejecuta siempre los mismos pasos en FTP, puede ahorrar tiempo y esfuerzo con una pequeña automatización. POR DAVID TANSLEY
E
l Protocolo de Transferencia de Ficheros (FTP) es un estándar de facto para la transferencia de ficheros sobre redes TCP/IP. El protocolo básico FTP está entre nosotros desde hace años y aunque no sea del todo seguro, seguirá estando muchos años más debido a sus muchas características y a su base bien establecida. Este artículo examina algunas técnicas para automatizar FTP mediante scripts. No me centraré en los diferentes tipos de servidores de FTP como el wu-ftp o vs-ftp, sino que me posicionaré en cambio, en el lado del cliente. Le mostraré cómo puede usar un script para unirse a un servidor de FTP y recuperar los archivos.
62
Número 12
Parte de este artículo cubrirá aspectos relacionados con la seguridad de la conexión, pero debe tener en cuenta que el nivel de seguridad que usted necesitará
para su propia red dependerá de la política de su organización. Es posible, por ejemplo, usar el FTP con un túnel del estilo VPN seguro. Puede encontrar ver-
Listado 1: Fichero .netrc
Listado 2: ftp1
01 02 03 04 05 06 07 08 09
machine ftp.emea.ibm.com login anonymous password david. tansley@btinternet.com machine uk01lx6001 login dxtans password lOopy machine uk04lx6003 login dxtans password mas123
WWW.LINUX-MAGAZINE.ES
01 02 03 04 05 06 07 08 09 10
#!/bin/bash # ftp1 ftp -i -v <<mayday open uk01lx6001 ascii lcd /tmp cd /etc get hosts quit mayday
Auto-FTP • ADMINISTRACIÓN
Listado 3: Salida de ftp1 01 $ ftp1 02 Connected to uk01lx6001 (168.14.2.4). 03 0 uk01lx6001 FTP server (Version 4.1 Wed Mar 26 16:45:44 CST 2003) ready. 04 1 Password required for dxtans. 05 0-Last unsuccessful login: Tue Jan 18 12:18:34 GMT 2005 on /dev/pts/0 06 0-Last login: Tue Mar 29 18:40:33 BST 2005 on ftp from ::ffff:168.14.2.9 07 0 User dxtans logged in. 08 Remote system type is UNIX. 09 Using binary mode to transfer files. 10 0 Type set to A; form set to N. 11 Local directory now /tmp 12 0 CWD command successful. 13 local: hosts remote: hosts 14 7 Entering Passive Mode (162,14,2,4,209,161) 15 0 Opening data connection for hosts (2370 bytes). 16 6 Transfer complete. 17 bytes received in 0.00135 secs (1.8e+03 Kbytes/sec) 18 1 Goodbye.
siones seguras que ofrecen encriptación en las comunicaciones. Dejaré los detalles propios de su red y me dedicaré a la transferencia automática de ficheros.
Utilizando .netrc Si está manejando FTP en modo batch o en modo interactivo, es mejor tener un
mecanismo que le permita registrarse automáticamente desde un sitio remoto. Antes de empezar con los detalles de la automatización de FTP, comenzaremos echándole un vistazo al registro automático. Un fichero especial denominado .netrc, que está localizado en su directorio $HOME, le permite automatizar el login en FTP. Los permisos del fichero .netrc deberían establecerse a lectura/escritura sólo para el propietario: chmod 600. El fichero puede contener múltiples entradas para sitios remotos. Cuando un fichero .netrc se localiza, si el nombre de la máquina proporcionada en el comando FTP coincide con el nombre de una máquina en .netrc, FTP utilizará el login y la contraseña asociada a la entrada en el fichero .netrc. El formato del fichero .netrc viene de dos formas. Yo prefiero el que sigue: machine <remote_host> U login <login> U password <password> U password <account_password>
Cada host remoto tiene una única entrada en el fichero. La password es la contraseña que necesita para conectarse al equipo remoto. La contraseña de la cuenta sólo es útil si el equipo remoto requiere otro proceso de autenticación. Normalmente, sólo son necesarias las primeras tres entradas.
El Listado 1 es un fichero .netrc con tres entradas. La primera es un servidor web público. El registro de anonymous normalmente significa que los ficheros pueden ser subidos o descargados desde una carpeta pública accesible. Aunque se considera una buena forma acompañar el registro anonymous con su dirección de correo electrónico como contraseña, esta regla no se cumple. La otra entrada en el Listado 1 son los hosts en la red interna. Para conectar al host uk01lx6001, necesitará teclear lo siguiente: $ ftp uk01lx6001
Como dijimos antes, cuando FTP arranca, mira el fichero .netrc. En este caso, cuando me conecto al host uk01lx6001, el cliente buscará .netrc para el host llamado uk01lx6001. Luego utilizará el login y la contrase-
ADMINISTRACIÓN • Auto-FTP
ña para conectarse al servidor remoto.
Bajarse un Fichero Ahora vamos a poner un script sencillo de FTP que se conecta a un host remoto y graba el fichero /etc/hosts (ver Listado 2). Tenga en cuenta que FTP se invoca con el modo interactivo apagado y con el modo verbose activado. Utilizando la solución here document mostrada por el símbolo < <, especificamos que cualquier cosa entre la primera y la segunda ocurrencia de la palabra mayday será tomada como lectura para la entrada estándar. Primero abrimos una conexión al host uk01lxe6001; informamos al FTP que estamos utilizando ascii para la transferencia, luego cambiamos el directorio en el lado local a /tmp y cambiamos el directorio remoto a /etc. A continuación, cogemos el fichero hosts, que colocaremos en /tmp. Salimos de FTP. La segunda ocurrencia de la palabra mayday finaliza nuestra entrada estándar y no hay más líneas de código, el script terminará. Ejecutando el código del Listado 2 proporciona la salida mostrada en el Listado 3. Nótese que, por defecto, FTP intentará realizar la transferencia en binario. Puede cambiar esta característica utilizando el comando ascii. También tenga en cuenta que en la salida iniciamos el FTP en modo pasivo.
Ficheros en la Lista Puede usar un documento para analizar una lista de ficheros a transferir, sin embargo, utilizado este
método significa que tiene que conectarse y terminar para cada transferencia. El Listado 4 muestra esta técnica. Debería pensar en poner un bucle for dentro del bloque de código de FTP, pero no puede, así estará conectado al host remoto por FTP, no en la shell.
Trucos para .netrc En algunos casos, le gustaría comprobar los ficheros .netrc antes de iniciar una sesión FTP. Por ejemplo, le gustaría que el script siguiera una forma de autenticación si .netrc existe, y realizar de manera diferente la autenticación si .netrc se ha perdido. Tenga en cuenta que es una buena idea el utilizar el .netrc cada vez que pueda. No depende de la autenticación interactiva si no lo tiene, y por el amor de Dios, ni se le ocurra escribir la contraseña dentro del script FTP. El Listado 5 contiene un bloque de comprobación simple que busca si el fichero .netrc está presente y legible por el script; si el test revela que el fichero .netrc se encuentra, el script muestra el fichero en la salida estándar. Si quiere ofrecer la opción de permitir a un usuario utilizar una de las entradas del fichero .netrc, a veces es conveniente mostrar el contenido del fichero al usuario, lo que él puede seleccionar con la entrada de registro a usar. Una forma de presentarle el fichero .netrc al usuario es hacer un cat y mostrarlo en la pantalla usando la opción -n, que numerará cada línea. El Listado 6 presenta un marco de trabajo que muestra una solución utilizando la opción -n que se podría conseguir. Primero comprobamos que el .netrc es legible y se encuentra en el sistema. Podemos determinar cómo varios registros estan en el fichero .netrc utilizando el siguiente comando: max_recs=`cat U $netrc_file | awk U 'END{print NR}'`
Puede que esté asombrado porque
64
Número 12
WWW.LINUX-MAGAZINE.ES
Listado 4: ftp2 01 #!/bin/bash 02 # ftp2 03 list="hosts hosts.allow hosts.deny" 04 for files in $list 05 do 06 ftp -i -v <<mayday 07 open uk01lx6001 08 ascii 09 lcd /tmp 10 cd /etc 11 get $files 12 quit 13 mayday 14 done
no hemos utilizado el comando wc -l, pero esta solución alternativa necesita menos procesamiento. Desafortunadamente, si usamos el comando wc -l, rellenaría la sustitución de las variables por espacios, lo que no le daría un aspecto agradable cuando se muestre en pantalla. Si utiliza el comando cat, todas las entradas del registro se muestran en la salida estándar, pero solo aparecerán los campos de host y login de cada registro. El Listado 7 muestra la salida de este código. En el siguiente prompt el usuario introducirá un número que representa el registro que deseamos usar, utilizando la variable $max_recs, que tendrá el número total de registros, como límite superior. Una vez seleccionado, el número de entrada se usará para sacar los campos requeridos desde el registro utilizando la función awk. Siguiendo esto, el resultado se mostrará en la salida estándar.
Listado 5: ftp4 01 02 03 04 05 06
#!/bin/bash # ftp4 netrc_file=$HOME/.netrc if [ -r "$netrc_file" ] then cat $netrc_file | awk '{print $2,$4}' 07 else 08 echo "$netrc_file not present" 09 fi
Auto-FTP • ADMINISTRACIÓN
Listado 6: ftp5 01 02 03 04 05 06
#!/bin/bash # ftp5 netrc_file=$HOME/.netrc if [ -r "$netrc_file" ] then max_recs=`cat $netrc_file | awk 'END{print NR}'` 07 cat -n $netrc_file | awk '{print $1,": connect to [",$3,"] as user[",$5,"]"}' 08 09 echo -n " Select record to use [ 1 .. $max_recs ] :" 10 read ans 11 if [$ans -ge 1 ] && [ $ans -le $max_recs ] 12 then 13 host=`cat $netrc_file | awk "NR==$ans"|awk '{print $2}'` 14 user=`cat $netrc_file | awk "NR==$ans"|awk '{print $4}'` 15 password=`cat $netrc_file | awk "NR==$ans"|awk '{print $6}'` 16 else 17 echo "invalid choice, needs to be [ 1 .. $max_recs ]" 18 exit 1 19 fi # $ans in numeric range 20 echo -e "selected info is:\nhost [$host]\nuser [$user]\npassword [$password]" 21 else 22 echo " Sorry cannot read $netrc_file" 23 fi # netrc present
El Listado 6 presenta una forma de usar un menú mediante una interfaz. No he puesto ningún control de errores serio en el código, aparte de una comprobación numérica del rango, ya que quería mostrar que utilizar una solución basada en menús no lleva demasiado código.
Buscando Errores Quería comprobar los errores al final del script FTP. FTP proporciona unos cuantos códigos de error. La Tabla 1 muestra algunos códigos comunes que pueden ser considerados como avisos o errores. Una forma de chequear errores es ejecutar egrep al final del script, como se muestra en el Listado 7. Lo primero que necesitamos hacer es redireccionar toda la salida del FTP a un fichero de logs, como sigue:
ftp -i -v >> $log 2>&1 <<mayday
FTP redireccionará toda la salida incluyendo errors desde la sesión FTP al fichero de log cuyo valor contenga la variable $log. Una vez que la sesión FTP ha terminado, simplemente utilizaremos egrep para incluir una lista de códigos o palabras que nos gustaría encontrar, con cada modelo separado por la barra |. Cuando utilice cualquier comando grep sin un script, siempre será buena idea redireccionar la salida de las coincidencias a /dev/null; esto desvía mensajes no deseados de la salida estándar: if egrep U "202|421|426" U $log > /dev/null 2>&1
Si egrep devuelve true con cualquier coincidencia, simplemente se sale con
Listado 7: ftp7 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29
#!/bin/bash # ftp7 log=ftp.log >$log list="hosts telnet.conf" host="uk01lx6001" echo "Script name [ `basename $0` ]" >>$log for files in $list do ftp -i -v >> $log 2>&1<<mayday open $host ascii lcd /tmp cd /etc get $files quit mayday done if egrep "202|421|426|450|500|501|503|5 50|553|666|777|999" \ $log > /dev/null 2>&1 then echo "Errors" | tee -a $log exit 1 else echo "OK" | tee -a $log exit 0 fi
WWW.LINUX-MAGAZINE.ES
Tabla 1: Códigos de Retorno de FTP 202 Comando no implementado 421 Servicio no disponible 426 Transferencia abortada 450 Fichero no disponible 500 Error de sintaxis 501 Error de sintaxis en los argumentos 503 Usuario no registrado 550 Fichero no disponible 553 Nombre ilegal de fichero 666 Fichero o directorio no existe 777 Host desconocido 999 Comando invalido
un 1 y muestra un mensaje en la salida estándar y el fichero de registro; Si egrep no devuelve true, se sale con un estado 0. Si va a estar ejecutando scripts en modo batch, en vez de hacerlo interactivamente desde la línea de comandos, debería programar el script de modo que no escribiese nada en la salida estándar. Si está ejecutando scripts en modo batch, debería limitarse simplemente a escribir directamente en un fichero de registro. Si este es su caso, debiera usar lo siguiente en caso de error: echo "Errors" >> $log
y por el contrario, para un mensaje de éxito, se haría como sigue: echo "OK" >> $log
Conclusión Si se encuentra repitiendo siempre los mismos comandos FTP una y otra vez para una tarea recurrente de envío de ficheros, se beneficiaría escribiendo un script que automatizara la transferencia de ficheros. El FTP automatizado es muy sencillo y productivo para la transferencia de ficheros entre dos hosts. No tenga reticencia en crear diferentes scripts de FTP que cubran sus necesidades de administración. Los scripts son fáciles de escribir y de adaptar. Sea cual sea el propósito del script, le sugiero que use el fichero .netrc en vez de incluir las credenciales en el ■ fichero de script.
Número 12
65
ADMINISTRACIÓN • Admin Workshop
Resolviendo Resolviendo Nombres Nombres con con DNS DNS
EL JUEGO DE LOS NOMBRES
El resolvedor es la ventana de su equipo al sistema global DNS. Simplemente con teclear una URL tiene un enlace a todos los equipos del mundo. POR MARC ANDRÉ SELIG
L
os virtuosos de memoria pueden llegar a memorizar una lista de más de 300 números, en cambio, otros podemos encontrar difícil el recordar los cuatro números que constituyen una dirección de IP. La mayoría estamos de acuerdo en que un nombre es más fácil de recordar que un número. La ventaja de aso-
66
Número 12
ciar un objeto con un nombre alfanumérico es la verdadera razón de la existencia del Sistema de Nombres de Dominio (DNS) distribuido a escala mundial, un sistema que une nombres y direcciones de ordenador en el mundo entero. El sistema DNS ha sido objeto de incontables artículos y libros, la mayor
WWW.LINUX-MAGAZINE.ES
parte de ellos enfocaron el sistema de nombramiento a sí mismo o sobre servidores DNS como el Berkeley Internet Name Domain (BIND). Pero al otro lado de la conexión lo que hay es una aplicación en un ordenador de escritorio que necesita el medio de ponerse en contacto con el servidor para averiguar el nombre de una dirección IP.
Admin Workshop• ADMINISTRACIÓN
El Resolvedor Vamos a llamar resolvedor al interfaz que proporciona a una aplicación el acceso a los servicios de resolución de nombres. Una estrategia para integrar la resolución de nombres con su uso en Linux es por las funciones de la Biblioteca GNU C (glibc). Las funciones más comunes son gethostbyname (), que traduce un nombre a una dirección de IP y gethostbyaddr () que hace lo contrario. Este interfaz y sus funciones auxiliares están siendo sustituidos por una versión más flexible que utiliza getaddrinfo () para traducir nombres de host en direcciones de IP, y getnameinfo () para lo contrario. La mayoría de los lenguajes de scripts proporcionan funciones parecidas; por ejemplo, Perl tiene gethostbyname () y gethostbyaddr (). Las variantes más recientes no están disponibles. En el caso de Perl, forman parte de un módulo separado que proporciona compatibilidad con IPv6. Existen herramientas adicionales de los resolvedores que se encuentran disponibles en la shell, tales como el desfasado nslookup, o las más actuales host y dig. Lo complicado en el manejo de nombres y direcciones es el hecho de que
Listado 1: /etc/hosts 01 127.0.0.1 localhost.localdomain localhost ishi 02 03 # The following lines are desirable for IPv6 capable hosts 04 ::1 localhost.localdomain localhost ip6-localhost ip6-loopback 05 fe00::0 ip6-localnet 06 ff00::0 ip6-mcastprefix 07 ff02::1 ip6-allnodes 08 ff02::2 ip6-allrouters 09 ff02::3 ip6-allhosts 10 11 172.16.45.1 natrouter 12 216.92.94.3 sedacon.pair.com
Listado 2: /etc/resolv.con 01 nameserver 172.16.45.2 02 nameserver 172.16.45.3 03 options rotate
actualmente no todos los programas utilizan funciones de librerías. Algunos de ellos lo hacen a su manera. La idea es evitar los tipos de bloqueos que pueden ocurrir utilizando las funciones de glibc. Muchas herramientas de la shell fueron diseñadas como herramientas de depuración y proporcionan el acceso directo a la red. Y para otras cosas, muchas de estas herramientas se compilan de forma estática, lo que significa que las rutinas del resolvedor utilizan versiones de librerías específicas (y a menudo obsoletas).
Configuración El resolvedor puede usar varias fuentes de datos. La fuente de datos más simple es el archivo /etc/hosts (Listado 1), que contiene una lista de direcciones numéricas con sus nombres correspondientes. A cada dirección le puede corresponder de a uno o varios nombres. Los registros en el fichero hosts consisten en una dirección y uno o varios nombres, así como líneas en blanco y comentarios. El listado tiene varios tipos de entradas: la entrada localhost 127.0.0.1 es común a todos los ficheros /etc/hosts, ya que se requiere para comunicaciones locales entre procesos. El segundo bloque de dirección contiene direcciones de IPV6 importantes. El tercer bloque muestra cómo las direcciones en la red local pueden añadirse a la base de datos local, ofreciendo una manera simple de manejar nombres de dominio fuera del dominio local. Si el resolvedor falla en encontrar el hostname solicitado en /etc/hosts, puede ponerse en contacto con un servicio de DNS basado en red como BIND. El cliente puede dirigirse a su archivo /etc/resolv.conf (Listado 2) para obtener la dirección del servidor de nombres; el archivo puede ser creado a mano o bien por el cliente DHCP. Normalmente se permiten hasta tres entradas de servidores de nombres distintas. La segunda y la tercera entrada sólo se utilizan si los servidores de nombres con entradas cuyos rangos son los más altos no responden. Las entradas options rotate en el Listado 2 cambian este comportamiento para la LAN, proporcionando una forma de distribuir la carga a través de múltiples máquinas.
Fuentes El resolvedor tiene que conocer cuál de estas bases de datos están disponibles en
WWW.LINUX-MAGAZINE.ES
el sistema Linux y en qué orden deberían ser utilizadas. Esta información se almacena en varios ficheros de configuración. Por este motivo el archivo de configuración original era /etc/host.conf. El fichero podría parecerse a esto: order hosts.bind multi on
Aquí la clave más importante es order, seguida por el orden en el que los métodos deben aplicarse. hosts representa la lista de direcciones locales en el fichero /etc/hosts y bind se refiere a la forma de acceso al sistema DNS. La entrada multi on mostrada significa que /etc/hosts puede tener múltiples entradas para un mismo nombre. El fichero le dice al resolvedor que compruebe en primer lugar el /etc/hosts, para ver si el nombre solicitado o la dirección están listadas aquí. Si la búsqueda no obtiene el resultado esperado, se utiliza el servicio DNS; en este caso, el resolvedor utiliza la configuración de /etc/resolv.conf. Host.conf es anterior a glibc 2.x; esto es, se corresponde a libc.so.5 o anterior. Las versiones actuales de glibc utilizan el servicio de nombres tomado de Solaris 2 y tienen una configuración flexible para la mejora de servicios arbitrarios en un orden libremente configurable. El servicio de nombres mostrado se configura en /etc/nsswitch.conf (Listado 3). El fichero contiene una lista de servicios y fuentes de datos, así como una descripción del comportamiento deseado. El servicio hosts es importante para la resolución de nombres; la estrategia indicada aquí, files dns, está por defecto y quiere decir que /etc/hosts debería utilizarse primero, seguido por una petición de DNS. Hay más ficheros de configuración. Sendmail es sólo un ejemplo de un programa que tiene su propia biblioteca de resolución. La configuración es parecida
Listado 3: Ejemplo de /etc/ nsswitch.conf 01 02 03 04 05 06
passwd: compat group: compat shadow: compat hosts: files dns networks: files
Número 12
67
ADMINISTRACIĂ&#x201C;N â&#x20AC;˘ Admin Workshop
al servicio switch de glibc, pero no idĂŠntica. El fichero de configuraciĂłn privado para sendmail se denomina /etc/mail/service.switch. SĂłlo soporta los servicios passwd, hosts y aliases. Sendmail no utiliza puntos para separar los nombres de los servicios, pero ademĂĄs, /etc/mail/service.switch es muy parecido a /etc/nsswitch.conf.
Sin Red En algunas ocasiones las peticiones de red pueden ser indeseables. Por ejemplo, si tiene un mĂłdem o DSL y se tarifica por hora, permitir consultas DNS puede ahorrarle bastante dinero. Los administradores pueden borrar el bind de /etc/host.conf y el dns de
/etc/nsswitch.conf para detener el revolvedor glibc para acceder a la red. Sin embargo, esto tambiĂŠn detendrĂĄ al cliente para llamar al servidor de nombres de la LAN. Si necesita utilizar un tĂşnel -como una VPN- para trabajo confidencial, tendrĂĄ que evitar preguntas de DNS o bien los dirigirĂĄ por el tĂşnel. En muchos casos, todo lo que usted tiene que hacer es configurar el sistema para enviar el correo electrĂłnico mediante direcciones de IP o aĂąadir el nombre de dominio al /etc/hosts. Esto deja al navegador como el usuario mĂĄs comĂşn de las consultas de DNS. Un proxy Socks4a, como privoxy por ejemplo, le servirĂĄ bien en este caso, porque le permite
desviar consultas DNS al otro lado del tĂşnel. Considerando la variedad de potencial de los resolvedores, las mejores prĂĄcticas de seguridad aconsejan usar reglas de cortafuegos para prevenir preguntas de DNS indeseables.
Manteniendo la LĂnea Todos los mecanismos de los que hemos hablado son la puesta en prĂĄctica especĂfica. Aunque cada variedad de Unix tenga su propio resolvedor por defecto, los detalles de las implementaciones se diferenciarĂĄn. Por ejemplo, BSD usa un formato de host.conf diferente y Solaris tiene /etc/netconfig, un mĂŠtodo que sustituye el servicio â&#x2013; switch por una biblioteca privada.
CĂłmo Funciona DNS El futuro no se presenta prometedor. Con el nĂşmero de usuarios en auge, los procedimientos que habĂan servido a ARPANET, el antecesor de Internet, de forma apropiada en los aĂąos setenta, hoy en dĂa estĂĄn colapsados. Y uno de estos procedimientos era el proceso para trazar un mapa de nombres a direcciones. Los administradores de la red tan sĂłlo habĂan mantenido un archivo de gran tamaĂąo para este propĂłsito y cada uno en la red tendrĂa que usar el FTP para descargar una copia. Alguien que quisiera aĂąadir un nuevo equipo simplemente tendrĂa que notificarla al Centro de InformaciĂłn de Red (NIC) por correo electrĂłnico y NIC actualizarĂa el fichero central de hosts y listo. El aumento del nĂşmero de hosts llevĂł a mĂĄs trĂĄfico debido a la necesidad de descargar el archivo de hosts. El tamaĂąo de la red tambiĂŠn planteĂł un problema aparentemente irresoluble para los administradores de la red: aunque fuera posible asignar direcciones Ăşnicas, no habĂa ningĂşn modo de evitar conflictos de nombres. Lamentablemente, los nombres duplicados tambiĂŠn pueden causar serias interrupciones haciendo a su doble, posiblemente mĂĄs importante, inalcanzable. AdemĂĄs, la informaciĂłn tenĂa una tendencia a volverse obsoleta en el trayecto desde el NIC al resto de los enlaces externos de la red, lo que significa que no habĂa forma de que asegurase la consistencia. La investigaciĂłn en busca de una soluciĂłn condujo finalmente a un sistema que, despuĂŠs de unas correcciones y mejoras, se ha mantenido firme ante el boom de Internet, el Sistema de Nombre
68
NĂşmero 12
de Dominio (DNS). La receta para el ĂŠxito de los DNS ha sido la descentralizaciĂłn. En vez de una autoridad sola para un inimaginable nĂşmero de ordenadores conectados a una red, el sistema tiene una especie de jefe de grupo, donde una entidad es responsable de un grupo de ordenadores conocidos como un dominio y los propios dominios pueden ser subdivididos en subdominios. El grĂĄfico que representa los grupos y subgrupos es un ĂĄrbol muy similar al ĂĄrbol de directorios en un sistema de archivos. Para dirigirse a un host especĂfico tiene que introducir su nombre y dominio ademĂĄs de cualquier dominio superior hasta la raĂz del ĂĄrbol. Esta cadena se menciona como un nombre de dominio totalmente calificado (FQDN). Un servidor de nombres maneja la lista de nombres y las direcciones que ma-
pean para un dominio. El servidor de nombres puede asignar responsabilidades para los subdominios a otros servidores de nombres. Si un cliente estĂĄ interesado en saber la direcciĂłn para un nombre en concreto, se pone en contacto con el servidor de nombres de su propio dominio. Si este servidor no tiene la respuesta en su base de datos o su cachĂŠ, se pone en contacto con el servidor de nombres que se considera mĂĄs cercano al objetivo o al menos pasa el nombre de este servidor sobre el cliente. De este modo, la peticiĂłn navega por la jerarquĂa de dominio de un modo ordenado, hasta que esto alcance a un servidor de nombres que tenga la respuesta o la direcciĂłn catalogada y pueda responder al cliente o solicitar una llamada al servidor (Figura 1).
Figura 1: La resoluciĂłn de nombres a menudo requiere una cadena de varias peticiones y respuestas. í˘ą el cliente envĂa una peticiĂłn al servidor de nombres A. í˘˛ El servidor de nombres B recibe una peticiĂłn de A. í˘ł El servidor B responde con una referencia a C. í˘´ El servidor C recibe la peticiĂłn desde A. í˘ľ El servidor C responde con una referencia a D. í˘ś A consulta a D. í˘ˇ El servidor D responde con una direcciĂłn. í˘¸ El servidor A responde al cliente.
WWW.LINUX-MAGAZINE.ES
ADMINISTRACIÓN • AOL Server
Una Una alternativa alternativa aa Apache… Apache…
AOLSERVER
Pocos servidores web realmente estables y robustos hay en el mercado y pocas posibilidades de elección, pero posiblemente no nos habíamos percatado de la existencia del AOLserver, un servidor antiguo en desarrollo y muy actual en prestaciones y potencia. POR PIETRO ZUCO
A
OLserver es un proyecto liderado por AOL (America Online) en Source Forge. Actualmente se utiliza como servidor Web de importantes portales con una gran carga de usuarios, desde la propia Web de AOL hasta la de Netscape o Creative Commons. AOLserver es multihilo, soporta TCL, es altamente escalable y está particularmente optimizado para sitios web dinámicos de gran envergadura. Quizás algunos se puedan preguntar ¿Por qué un servidor Web tan potente y peculiar no ha llegado a alcanzar la fama de otros, como por ejemplo Apache? La respuesta es a la vez simple y sorprendente: falló el Marketing. Vamos a ver en este artículo
70
Número 12
cómo instalarlo, configurarlo y poder sacarle partido desde el primer momento y veremos que no nos dejará nada que desear.
¿Soporta TCL? Quizás esto pueda sonar un poco extraño para los que están acostumbrados a Apache o servidores similares, dado que dependen de un fichero de configuración propio con una sintaxis determinada, pero este no es el caso de AOLserver. TCL lo es todo en este servidor, desde su fichero de configuración hasta el lenguaje utilizado en el API de programación que incorpora. Tanto es así que algunos le definen no sólo como un servidor Web
WWW.LINUX-MAGAZINE.ES
sino también como un servidor de aplicaciones. AOLserver puede mostrar un típico contenido estático, así como páginas ADP (AOLserver Dynamic Pages) para contenido dinámico, basadas en la incrustación de código TCL en HTML. La ejecución del código en TCL la realiza directamente sin pasarla por ninguna interfaz CGI.
Instalación La principal forma de descargar la fuente e instalarlo es a través del repositorio CVS. De todas formas existen paquetes DEB o RPM que se mantienen relativamente actualizados. En este artículo abordare-
AOL Server • ADMINISTRACIÓN
mos la instalación en considerablemente una Debian Sarge. amplia que aporta La distribución mejoras y documenprincipal contiene tación, por lo tanto no una serie de módulos nos veremos desammínimos, aunque Figura 1: Uno de los cuadros de conparados a la hora de podemos instalar más figuración en el momento de la instanecesitar información de 70 módulos, desde lación. y ayuda. el soporte de bases de Instalaremos primedatos como PostgreSQL u Oracle hasta ro el core del servidor y luego un módulo un modulo para Aspell de corrección para el soporte de PostgreSQL. ortográfica. El desarrollo de módulos es Nos hacemos root e instalamos el bastante activo y hay una comunidad paquete del repositorio:
Listado 1: prueba1.adp 01 02 03 04 05 06 07 08
<HTML> <HTML> <HEAD> <TITLE>Prueba de ADP (1)</TITLE> </HEAD> <BODY> <H1>Una prueba de ADP (1)</H1> <p> ADP es como usar TCL embebido en HTML </p>
09 10 11 <FORM ACTION="prueba1.adp" METHOD="POST"> 12 Introducir valor para contar:<br><INPUT TYPE="text" NAME="valor" VALUE="10"> 13 <INPUT TYPE=submit VALUE="Contar"> 14 </FORM> 15 16 <% 17 set r [ns_conn form $conn] 18 set valor [ns_set get $r valor] 19 %> 20 <b> Contamos hasta <%= $valor%>: </b><br> 21 <table border="1"> 22 <tr> 23 <% 24 for {set i 1} {$i <= $valor} {incr i} { 25 ns_puts "<td>$i</td>" 26 } 27 %> 28 </tr> 29 </table> 30 <br> 31 </BODY> 32 </HTML>
apt-get install aolserver4
En la fase de configuración automática del paquete se nos presentarán varias pantallas solicitando información que se incluirá en el fichero de configuración. La información mínima requerida es el número de puerto, el nombre del usuario con el que se va a lanzar el servidor y la IP de nuestra máquina. Todos estos parámetros se pueden pasar directamente al ejecutable, que en el caso de Debian es/usr/ sbin/aolserver4-nsd. De todas formas, no es necesario preocuparse de responder correctamente en esta fase, dado que toda la información que se solicita puede ser modificada en el fichero de configuración. Ver figura 1. Finalizada la configuración inicial, instalaremos el módulo para poder conectar con postgreSQL: apt-get installU aolserver4-nspostgres
Llegados a este punto ya podemos utilizar nuestro nuevo servidor Web. En la carpeta/etc/init.d/ debemos de tener el script aolserver4 que lanzará el servidor en el arranque. Este script además de contener los parámetros que introducimos en los cuadros de dialogo, ha sido ejecutado automáticamente en la fase de instalación, por lo tanto, si todo ha ido bien el servidor debe estar funcionando. Para comprobarlo apuntemos con el navegador a http://localhost ver figura 2. Hay que tener en cuenta que si estamos ejecutando un Apache escuchando por el puerto 80, la configuración por defecto del AOLserver nos dará problemas. Por lo tanto hay que detener el Apache antes de instalar el AOLserver o cambiar el número del puerto.
WWW.LINUX-MAGAZINE.ES
La configuración Como otros servidores Web, AOLserver utiliza un fichero de configuración, que para el caso de Debian es /etc/aolserver4/aolserver4.tcl Este fichero tiene algo en particular que lo diferencia de otros servidores Web y que a primera vista puede sonar un poco extraño: Se trata de un script en TCL. Como decíamos antes, AOLserver tiene un API muy completa en TCL y esto nos da la posibilidad de incluir código dentro del fichero de configuración y forzar al AOLserver para que en cierta manera se autoconfigure antes de arrancar. Algunas de las opciones más comunes que se pueden pasar al ejecutable son: • -u Ejecutarse como usuario <usuario> * -g Ejecutarse con grupo <grupo> * -b Dirección IP y puerto <dirección:puerto> * -s nombre del servidor <servidor> en el fichero de configuración * -t Fichero de configuración <file> (REQUERIDO) Por defecto, la configuración que trae en el paquete para Debian es: Usuario: www-data Grupo: www-data IP: 127.0.0.1 Puerto: 80 Fichero de configuración:U /etc/aolserver4/aolserver4.tcl
Estos datos son los que vamos a usar a título de ejemplo y se encuentran en el script de arranque que se crea tras la instalación, que se ubica en: /etc/init.d/aolserver4
El fichero de configuración En el fichero de configuración de AOLserver /etc/aolserver4/aolserver4.tcl vemos que los parámetros que se pasan al ejecutable pueden ser configurados directamente en el propio fichero. Las partes más importantes a destacar son : set httpport
80
Para indicar el puerto en el que va a escuchar. set hostname localhost
Número 12
71
ADMINISTRACIÓN • AOL Server
set address
127.0.0.1
Estos parámetros deberán ser cambiados en función de la configuración que tengamos en nuestra máquina. El primero es el nombre de nuestro equipo y el segundo es nuestra IP. set servername main
Nombre que le daremos al servidor. Estas variables que creamos las podemos usar en el resto de la configuración y este es un ejemplo que muestra la versatilidad del AOLserver.
Por ejemplo, si tenemos una base de datos llamada “prueba”, podemos dar como nombre al servidor “prueba”, usando luego esta variable para establecer el nombre de la base de datos, más adelante en el mismo fichero: set db_name $server
Figura 2: Web por defecto del AOLserver.
Listado 2: prueba2.adp 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
19 20 21 22
23 24
72
<HTML> <HTML> <HEAD> <TITLE>Prueba de ADP (2)</TITLE> </HEAD> <BODY> <H1>Una prueba de ADP (2)</H1> <p> Datos de configuración del servidor </p> <% set config_file [ns_info config] set home_dir [ns_info home] set nombre_host [ns_info hostname] set paginas [ns_info pageroot] set plataforma [ns_info platform] set tiempo [ns_info uptime] %> <b>Fichero de configuración </b><%= $config_file%><br> <b>Carpeta de instalación de AOLserver </b><%= $home_dir%><br> <b>Nombre de la máquina </b><%= $nombre_host%><br> <b>Carpeta que contiene la Web </b><%= $paginas%><br> <b>Plataforma </b><%= $plataforma%><br> <b>Tiempo en segundos de encendido </b><%= $tiempo%><br> </BODY> </HTML>
Número 12
Aquí aprovechamos la potencia de TCL para poder usar variables y funciones dentro del fichero de configuración. Otro ejemplo sería determinar el nombre de nuestra máquina sin necesidad de pasarlo explícitamente al fichero de configuración. Esto se consigue cambiando la línea anterior: set hostname localhost
por esta: set hostname [ns_info hostname]
Aquí llamamos a una función del API de AOLserver ns_info hostname que nos devuelve el nombre de nuestra máquina. El hecho de que casi todas las llamadas al API del AOLserver y de que los módulos empiecen por “ns”, se debe a que el nombre original de AOLserver fue Navy Server, dado que fue desarrollado por una pequeña empresa llamada NaviSoft que fue comprada por AOL. Por último, la carpeta que contendrá los ficheros HTML o ADP se configura con la variable pageroot: set pageroot /var/www
El lenguaje ADP ADP (AOLserver Dynamic Pages) es un lenguaje que puede ser embebido en HTML y es básicamente un TCL reducido que hace uso de las funciones del API del AOLserver. Como ejemplo, el listado 1 muestra un fichero con extensión adp que básicamente es un HTML con partes de código en ADP. Implementa un simple
WWW.LINUX-MAGAZINE.ES
formulario que nos pide un valor para contar. Luego genera una tabla en la que cada columna contiene uno de los valores contados. Este código muestra cómo se puede usar la potencia de TCL en la creación de funciones que pueden ser llamadas como si de un CGI se tratara. El listado 2 muestra cómo obtener información relativa al servidor donde está corriendo el AOLserver. Con estos simples ejemplos nos podemos hacer una idea de las posibilidades que nos brinda ADP, similares a otros lenguajes como PHP o scripts en CGI. Es importante notar que el códio ADP se debe encerrar entre los símbolos <% %>
Conclusión AOLserver puede ser una alternativa perfectamente viable respecto a Apache u otros servidores Web. Es especialmente adecuado en entornos con una gran carga de usuarios y de transacciones contra base de datos. Su flexibilidad en la configuración lo hace especialmente adecuado en entornos extremos donde otros servidores Web no podrían adaptarse. Animémonos a explorar sus posibilidades, seguramen■ te no nos defraudará.
RECURSOS [1] Página principal de AOLserver http:// www.aolserver.com [2] Documentación extensa (wiki) http:// panoptic.com/wiki/aolserver/ AOLserver_Wiki [3] OpenACS comunidad virtual desarrollada sore AOLserver http://www. openacs.org
Bienvenidos a Linux User Ésta es la sección dedicada a la presentación de software interesante y útil que nos ayuda en nuestro quehacer diario con el escritorio Linux. Aquí aprenderemos a utilizar software estándar de una manera más eficiente, adquiriremos valiosos conocimientos y descubriremos nuevas y apasionantes aplicaciones.
Desktopía
74
Una nueva imagen de fondo es la manera más rápida de hacer más atractivo tu escritorio. Herramientas como Zufall y genbg te ayudan a cambiar tu fondo de escritorio automáticamente.
GRAMPS
76
Si quieres construir tu árbol genealógico, será mejor que estés preparado para administrar grandes cantidades de datos. Así que ¿por qué no usar Linux para este duro trabajo?
PDF Toolkit
80
Una herramienta especial puede ayudar a los usuarios a interesarse por el trabajo administrativo electrónico: pdftk, el juego de herramientas PDF.
Educación
83
GCompris es un conjunto de juegos educativos para niños de dos a ocho años. Los profesores puedan gestionar perfiles y configurar qué juegos se les presentan a los distintos alumnos. Y el número de actividades no hace más que crecer.
Línea de comandos
87
Trabajar con un editor de texto puede ser problemático si necesitas manejar con frecuencia tareas recurrentes o múltiples ficheros. sed puede evitarte muchos tecleos.
WWW.LINUX- MAGAZINE.COM
ISSUE 52 MARCH 2005
73
LINUX USER • DestTOPia
Fondos Fondosaleatorios aleatoriospara parael elescritorio escritorio
CUADROS CAMBIANTES Una nueva imagen de fondo es la manera más rápida de hacer más atractivo tu escritorio. Herramientas como Zufall y genbg te ayudan a cambiar tu fondo de escritorio automáticamente. POR ANDREA MÜLLER
A
la mayoría de la gente no le gusta comer cada día su comida favorita y, por la misma razón, muchos usuarios no desean estar mirando siempre al mismo fondo de escritorio. Si prefieres cambiarlo a intervalos regulares, puedes hacerlo con una tarea cron, pero programas tales como Zufall [1] y genbg [2] te evitan este paso mediante el cambio automático de una imagen de fondo de escritorio. Zufall cambia el fondo de escritorio en intervalos predefinidos y genbg lo cambia cada vez que arranca el servidor X.
Trabajar con Zufall
JPEG,PNG,BMP,GIF,XPM y TIFF. Para evitar sobrecargar la memoria de tu máquina, deberías restringir la selección a formatos comprimidos JPEG y PNG. La manera más sencilla de correr Zufall es con el siguiente comando: zufall /ruta/a/U directorio_gráfico
Cuando se arranca de este modo, carga un fichero de imagen desde el directorio /ruta/a/directorio_gráfico cada 10 minutos y coloca el fichero como una imagen de fondo. El programa no está restringido a nivel raíz del directorio, sino que también busca en subdirectorios para ficheros de imágenes. Si diriges Zufall hacia un directorio con una gran colección de fotos y quisieras conocer el nombre del fichero de la imagen actual, échale un vistazo a la ventana del terminal donde arranca la aplicación. Cada vez
que Zufall renueva la imagen de fondo, imprime so ein zufall! (¡qué coincidencia!) seguido por la ruta absoluta a la imagen en el terminal. Si tus imágenes favoritas están distribuidas a lo largo y ancho de un número de carpetas, no te preocupes. puedes pasar múltiples directorios a Zufall como parámetros de líneas de comando, como en: zufall /ruta/a/U directorio_gráfico /ruta/a/U directorio_gráfico2
El parámetro -d (para demora) seguido Zufall, escrito por Moritz Orbach, tiene por un valor en segundos especifica el disponible el proyecto en su página de intervalo entre los cambios de fondo de inicio. Para compilar la herramienta, escritorio. Por ejemplo, llamando zufall necesitas la librería gráfica imlib2 y el -d 3600, cambiaría la imagen una vez paquete con los ficheros de cabecera. por hora. Si el tiempo de presentación es Hay que seguir el procedimiento estándemasiado largo o no te gusta la imagen dar, configure, make e install. Puedes actual, puedes enviar una señal HUP a evitarte el paso último si lo delos procesos que activan el proseas. Una vez completados los grama para decirle que modifidos primeros, deberías poder que el fondo de escritorio inmecorrer Zufall directamente desde diatamente. el directorio del código fuente. killall -HUP zufall Zufall soporta un amplio abanico de formatos de ficheros de Figura 1:Envía la señal “USR1“al proceso Zufall y la herramienta te dará un fondo de escritorio imagen y no presenta problemas te dirá el tiempo que se tardará en cambiar a la próxima imagen. nuevo. manipulando ficheros
74
Número 12
WWW.LINUX- MAGAZINE.ES
DeskTOPia • LINUX USER
directorio del código fuente está desfasado. README le dice a los usuarios que editen src/ main.c en el caso de que deseen reemplazar wmsetbg por otra aplicación. Sin embargo, el autor del programa hace tiempo que ha trasladado la definición al fichero src/tools. Ya es posible pasarle el intercambiador de fondos deseado, tal y como Esetroot Figura 2:Si la imagen es más pequeña que la resolución actual, [3], a la compilación de Zufall dibuja un marco con una marca de color alrededor de la genbg a través del ficheimagen de fondo. ro de configuración ~/ .genbgrc. Zufall también reacciona a la señal Si prefieres cambiar el valor predeterTERM, con la cual sale del programa. minado en el código fuente, simplemenTambién puedes decirle que te presente te hemos de buscar cada instancia de un estado donde te diga cuánto tiempo wmsetbg en el fichero src/tools.c, y sustitardará en salir la próxima imagen: tuirlo con el nombre de la aplicación killall -USR1 zufall hace esto para ti. deseada. Después de haber hecho esto, Nótese que la salida va a la ventana tercrea un nuevo programa configure minal donde arrancas Zufall y no a la corriendo ./autogen.sh en el directorio ventana donde introdujiste el comando fuente. Luego escribe ./configure, make y (Figura 1). make install para compilar e instalar Si una de las imágenes es más pequegenbg. ña que la resolución que tienes estableciPara asegurarte de que el programa da, la herramienta dibuja un marco alreautomáticamente hace lo que esperas, dedor del gráfico. El color del marco está deberías crear primero el fichero ~/ basado en el valor medio de los colores .genbgrc escribiendo genbg-config. La en dos esquinas de la imagen. En la herramienta te pregunta en primer lugar mayoría de los casos el color resultante por la ruta a los directorios con imágeenmarca la imagen de fondo bastante nes. Introduce cada carpeta y presiona bien (ver Figura 2). [Enter] para confirmar cuando has acabado. Las dos cuestiones siguientes te Introducción a genbg piden que decidas si correr genbg en Si prefieres que la imagen de fondo no se modo debug; de nuevo puedes presionar cambie a intervalos fijos y lo único que [Enter] para aceptar el valor predetermiquieres es un nuevo fondo cada vez que nado. Lo siguiente que el programa arrancas el servidor X, gengb es una desea conocer es el tipo de formatos grábuena elección. gengb no establece la ficos que debería usar para jugar a la imagen de fondo él mismo, en su lugar ruleta con los fondos de pantalla. El preutiliza wmsetbg, un componente determinado es .jpg, el cual es una WindowMaker. El fichero README en el buena elección para fotos. Claro que puedes introducir .png si tus imágenes se encuentran en este formato. genbg te pregunta luego qué herramienta debería usar para cargar la imagen de fondo. Puedes pulsar [Enter] Figura 3:Cuando arrancas con la opción --config, genbg te pide de nuevo para aceptar algunos detalles y luego genera un fichero de configuración. el predeterminado, o
WWW.LINUX- MAGAZINE.ES
bien puedes introducir el nombre de otra aplicación. El siguiente paso te da la opción de establecer parámetros en la línea de comandos para la herramienta externa. Esta opción tiene sentido si deseas que el programa titule las imágenes o las escale para llenar la pantalla. genbg adquiere la información necesaria y completa la configuración (Figura 3). Para darle al selector aleatorio nuevos directorios de búsqueda, arranca la herramienta una vez más con la opción --config, o simplemente añade un nuevo directorio al fichero ~/genbgrc. Todo lo que tienes que hacer ahora es asegurarte de que genbg arranca automáticamente siempre y cuando arranques X. Si te conectas en modo texto, la manera más fácil de hacer esto es añadir una línea que llama al programa desde tu ~/.xinitrc. Como alternativa, podrías modificar la opción de autoarranque de tu administrador de ventanas. Si, por ejemplo, tienes WindowMaker, podrías añadir una llamada a genbg a tu fichero ~/GNUstep/Library/WindowMaker/ autostart.
Vedado a escritorios mayoritarios Aunque Zufall y genbg son muy flexibles, ambos disponen de la misma restricción: no puedes usar intercambiadores de imagen de fondo en medios que utilicen KDE o GNOME. Ambos entornos de escritorios mayoritarios cubren la ventana raíz con su propia ventana. KDE utiliza un proceso Kdesktop y GNOME manipula el fondo de Nautilus. Por consiguiente, tanto KDE como GNOME esconden cualquier cosa que Zufall o genbg tengan para ofrecer. Sin embargo, para aquellos que tengan administradores de ventanas más sencillos, no hay duda de que apreciarán el modo en el que ambos programas realzan el aspecto ■ de sus escritorios.
RECURSOS [1] Zufall:http://apfelboymchen. homeunix.net/gnu/C/zufall [2] genbg:http://pcpool.mathematik. uni-freiburg.de/~pabloy/genbg [3] Artículo Esetroot: Andrea Müller, “Background View”, Edición en inglés de Linux Magazine #53/ April 2005, p.80. http://www. linux-magazine.com/issue/53
Número 12
75
LINUX USER • GRAMPS
Administración de tu árbol genealógico con GRAMPS
LAZOS DE SANGRE Si quieres construir tu árbol genealógico, será mejor que estés preparado para administrar grandes cantidades de datos. Así que ¿por qué no usar Linux para este duro trabajo? POR STEFAN LAGOTZKI
S
i estás planeando construir el árbol genealógico de tu familia, lo primero que necesitarás es hacerte con información relevante, cuestión que no siempre resulta tarea fácil. Posteriormente tendrás que guardar esta información en un formato que te permita obtener todo cuanto necesitas de ella. A este respecto, los usuarios de Linux están de suerte, ya que disponen ahora de una aplicación que reúne todos los requisitos necesarios que le permiten investigar la historia familiar. Genealogical Research and Analisys Managemente Programming System (GRAMPS) es una herramienta ejectuble bajo sistemas Linux y Unix que te ayuda a seguir la trayectoria de tu historia familiar. En este artículo, probaré GRAMPS [1] para un árbol familiar de unos 530 miembros, el cual originalmente había sido construido en uno de “esos otros Sistemas Operativos”.
Instalación La versión más accesible de GRAMPS es la 1.0.11, así que este artículo se centrará en la misma. (La versión actual 2.0.3. requiere los paquetes más recientes de pythongnome. Ver el cuadro: GRAMPS v2). Richard Bos ha construido rpms de GRAMPS 1.0.11 para SUSE 9.2 que se encuentra disponible via apt4rpm
76
Número 12
[2]. rpms de Mandriva y Fedora están disponibles en el sitio de GRAMPS.
Añadiendo Individuos La primera vez que arranques GRAMPS el programa te solicitará información inicial y luego te preguntará si deseas abrir una base de datos de tu historia familiar. Si no dispones de esta base de datos aún, selecciona Create a new database y haz clic en OK (Figura 1). Dirígete a la carpeta que estarás usando para la construcción del árbol genealógico, escribe en ella el nombre de tu base de datos (por ejemplo, mifamilia), y pulsa OK. Se abrirá entonces el área de trabajo de GRAMPS, donde encontrarás una barra de menús que te permite elegir entre distintas vistas de tus datos (Figura 2). Ahora puedes comenzar a añadir información acerca de tu fami-
Figura 1: Creación de una base de datos para tu proyecto genealógico.
lia. Haz clic en el icono Add situado en la barra de iconos, y se abrirá la caja de diálogo Edit Person (Figura 3). La etiqueta General es para información básica. Otras etiquetas distintas te permiten introducir información más detallada. Las etiquetas Names y Addresses hacen posible que cargues varios nombres y direcciones para una misma persona. La etiqueta Notes es una área de texto libre para la anotación de hechos relevantes, mientras que la etiqueta Sources está configurada para introducir referencias a otra información de esta misma persona. Estas fuentes deberían incluir grabaciones escritas oficiales (tales como registros de nacimiento y bautismo, certificados de defunción, documentación relativa al servicio militar, etc.)
Figura 2: Área de trabajo de GRAMPS.
WWW.LINUX- MAGAZINE.ES
GRAMPS • LINUX USER
duciendo información sobre tu familia manualmente. Pero si has estado coleccionando material anteriormente, esto significa que ya has usado un ordenador para almacenar todo los datos de tu árbol genealógico. En este caso, Figura 3: El cuadro de diálogo Edit Person permite introducir información no querrás sobre un pariente específico. tener que volver a reintroademás de otras grabaciones orales no ofiducirlos simplemente porque te hayas ciales (tales como anécdotas familiares o cambiado a un sistema operativo supereminiscencias de amigos), las cuales sirrior. Todo cuanto necesitas hacer es ven para reflejar hechos básicos. conseguir exportar los datos de tu viejo La capacidad de clasificar la informaprograma genealógico al formato de ción mediante un simple clic en la columfichero de texto estándar GEDCOM na del encabezamiento es muy útil. Otra (GEnealogical Data COMmunication), y funcionalidad a distinguir es el hecho de dejar que GRAMPS los importe. Las que la etiqueta name se encuentre resaltaaplicaciones personales tienden a usar da en negrita cuando contiene información. Una característica ausente y que sería muy bien acogida es la posibilidad de envolver palabras con textos largos. Si la columna Description en la etiqueta Events contiene una entrada larga, necesitas desplazarte a la derecha para poder ver las columnas Date y Place. La etiqueta Gallery te permite asociar medios (fotografías, vídeos, sonidos, etc.) a la persona. Haciendo clic en el botón Add from file se abre el Figura 4: Añadiendo medios al registro de una perdiálogo Select a media object, donde sona. podrás seleccionar el objeto relevante su propia “versión” de GEDCOM (es un (Figura 4). poco lo que ocurre con SQL), pero Por defecto, el objeto se copia en tu GRAMPS puede importar los ficheros carpeta de genealogía, pero puedes pulGEDCOM desde Brother Keeper, Family sar en Do not make a local copy para Origins, Family Tree Maker, Ftree dejarlo en su lugar actual y solamente GeneWeb, Legacy, Personal Ancestral insertarle un enlace. Pueden añadirse File, Pro-Gen, Reunion y Visual múltiples objetos a la etiqueta Gallery. Genealogic. La primera imagen en el grupo será la El fichero de pruebas que vamos a imagen predeterminada mostrada en la importar para el propósito de este artícuetiqueta General. lo fue reunido durante años por Arthur Sutton usando Family Tree Maker sobre Importación de información Windows 98. El fichero dispone de detapreexistente lles de 530 de sus parientes, además de Si esta es la primera aventura en tu hisantecedentes e historial, tales como toria familiar, tendrás que seguir intronotas, fuentes, etc. Ninguno de los obje-
WWW.LINUX- MAGAZINE.ES
tos de medios asociados (mayormente fotos) estaban incluidos en el fichero GEDCOM exportado. Para importar el fichero selecciona Files|Import|Import from GEDCOM… y haz clic en OK. Espera unos segundos hasta que GRAMPS lo importe, luego deberías ver los datos en el área de trabajo hábilmente listados por orden alfabético, con una fila de etiquetas a lo largo del fondo para saltar a cada letra del abecedario. Para ver el listado de personas con el mismo apellido, haz clic en la flecha junto al nombre para abrir la lista.
Explorando los datos Ahora que disponemos de los datos con los que trabajar, podemos explorar algunas otras características de GRAMPS. Quizás lo primero que hay que decir es que la importación fue (en todo lo que pude ver) impecable. El material secundario, por ejemplo, se asignó apropiadamente a los individuos. La habilidad para transferir toda la información sin que se produjeran incidentes es de la mayor importancia si estás planteando trasladar toda tu historia familiar a Linux. Haciendo doble clic sobre cualquier persona se abrirá el cuadro de edición que aparece en al Figura 3. Seleccionando una persona y pulsando luego sobre la vista Family se abrirá un cuadro de diálogo con información sobre la familia inmediata de los individuos (esposa, padres, hijos). Con un doble clic en cualquiera de las áreas de texto se abrirá un cuadro de diálogo en el cual puedes editar los detalles relevantes (por ejemplo, el tipo de relación). Este cuadro también ofrece una serie de inteligentes maneras para moverte en la base de datos (Figura 5). El botón (1) cambia entre el individuo y su esposa como individuo activo. El botón (2) y el (3) convierten a los padres de los individuos o a los padres de los esposos (respectivamente) a los individuos activos. El botón + te permite añadir un nuevo juego de padres (por ejemplo, en el caso de padres adoptivos). Seleccionando uno de los hijos y haciendo clic sobre el botón (4) establece a dicho hijo como el individuo activo. También se encuentran disponibles otras opciones pulsando sobre el
Número 12
77
LINUX USER • GRAMPS
botón derecho en diferentes SVG, OpenOffice y formatos áreas. GraphViz para informes gráSi haces clic sobre ficos que contengan esquePedigree podrás visualizar mas y diagramas. las relaciones en el formato El informe más extenso es habitual de árbol (Figura 6). probablemente el informe El formato predeterminado Book 8 (Books|Book Report), es de izquierda a derecha, el cual combina varios de pero puedes seleccionar de ellos en un gran fichero arriba a abajo en OpenOffice.org. Una vez tenEdit|Preferences gas seleccionado lo que quie|Display|General. Los botores, te pregunta por el nomnes pequeños de flecha de bre del fichero para el inforPedigree permiten moverte me (el formato predetermihacia atrás y hacia adelante Figura 5: GRAMPS permite navegar fácilmente a través de los pariennado es OpenOffice Writer). a través de generaciones. A tes. La mayoría de los otros la izquierda y presionando el informes usan el mismo sistebotón, te presenta una lista de hijos (si individuo activo y cualquier otro indivima para guardar en un fichero externo. los hubiera), con aquellos que tuvieduo en el árbol genealógico. Algunos de los informes no son tan útiles ron hijos propios, marcados en letra como pudiera parecer. Por ejemplo el De la pantalla al papel cursiva y negrita. informe Ahnentafel no anota la relación Otra vista ofrece una lista combinada En algunos casos podrías necesitar un generacional de los individuos listados al de todas las fuentes y lugares mencionainforme escrito de la información dispoindividuo activo, haciendo que uno se dos en el fichero, con detalles de todos nible en tu PC. GRAMPS es insuperable pueda perder fácilmente. También debería los medios incluidos. en este sentido, ya que ofrece un amplio ayudar a dar una descripción mejor y más Haciendo clic sobre el icono Tools, tenabanico de informes. También tienes la detallada de los diferentes informes. Hay drás acceso a un abanico de utilidades posibilidad de editar informes ya consbastante espacio en el cuadro de diálogo que van desde tareas para reparar la base truidos o de escribir otros nuevos desde Reports para ello. de datos hasta aquellas otras que permicero (si conoces Python). Quizás el informe más excitante es ten encontrar entradas duplicadas Los informes se encuentran disponiaquel que te permite exportar tu fiche(Figura 7). bles en una gran variedad de formatos: ro a una serie de páginas web. Tras La ventana Tools también incluye una HTML, PDF, AbiWord; KWord, LaTeX, seleccionar Web Page|Generate Web útil calculadora de relaciones (Figura 8), RTF y formatos OpenOffice.org para Site, introduce un lugar para las págila cual determina la relación entre el informes de texto, y PostScript, PDF, nas HTML. Luego puedes elegir entre un número de plantillas o usar una plantilla de usuario definida, y puedes GRAMPS v2 modificar aspectos particulares de una lista los distintos paquetes requeridos La versión 2 de GRAMPS se publicó en página de composición a través de un (alrededor de 68 MB). Mayo después de más de un año de deseditor de estilo. Así mismo puedes arrollo, la mayor parte del cual se dedicó Sobre todo, la aplicación es muy semeseleccionar cuánto quieres exportar del a mejorar los interiores. Los cambios jante a la versión 1.0.11, pero el cambio árbol genealógico. Este informe, si se incluyen: una Base de Datos Berkeley de más obvio es el movimiento para ofrecer fondo (lo que significa que los cambios coloca en un sitio web protegido con una importante lista de nombres en la se escriben en el disco inmediatamente); contraseña, podría ser una valiosa People view, en lugar de desplegar los la habilidad de editar de manera nativa herramienta para compartir los resultanombres sobre etiquetas alfabéticas. los ficheros GEDCOM (aunque debido a Arthur prefirió esto (¡Aunque yo no!). dos de tu investigación con otros las variaciones en el modo en el que se Una nueva entrada de menú (Edit/ miembros de la familia. implementa GEDCOM, existe riesgo de Column Editor) te permite elegir aqueUn informe que no está incluido es una pérdida de datos); y un nuevo formato llos elementos de información que apa“investigación diaria” (a efectos prácticos, de fichero. recerán en la People view. Por ejemplo, una lista quehaceres). Dicho informe te El último GRAMPS en esta serie es puedes elegir listar la esposa, así como permitiría introducir la fecha, el área a 2.0.3. y requiere los paquetes pythonlas fechas del nacimiento y muerte. Otro investigar, la fuente (si las hubiera) y algugnome más recientes. Los usuarios de cambio en la Pedigree view es la intronas notas. Si estuvieras planeando ir al SUSE 9.3 y distros similares no debeducción de un menú contextual que apaArchivo Nacional u oficinas donde se rían encontrar dificultades aquí rece con un clic derecho que da acceso a encuentran las grabaciones del Censo para (Richard Bos ha hecho de nuevo un rpm parientes inmediatos de la persona, consultarlas o para la verificación oficial 2.0.3 [3]), pero los usuarios de antiguas incluyendo hermanos. La otra innovadistros necesitan instalar paquetes ción es un cuadernillo de apuntes que te de los testamentos, por ejemplo, podrías GNOME adicionales. El wiki SUSE, por permite bajar retazos de información en hacer una llamada a todos los individuos ejemplo, tiene una página de instalalugar de tener que completar de nuevo cuyos detalles deseas comprobar en las ción de 2.0.3 en SUSE 9.2 [4], la cual la información. Ver el tutorial en [5]. mencionadas oficinas.
78
Número 12
WWW.LINUX- MAGAZINE.ES
GRAMPS • LINUX USER
Figura 7: La ventana Tools da acceso a un amplio rango de utilidades.
los hermanos. Un método mejor debería ser disponer de una línea temporal en la parte baja de la pantalla, permitiendo al usuario trasladarse hacia adelante y hacia atrás a través de la “línea” individual. Entonces podrías hacer clic sobre cualquier individuo de esta línea para hacerlo activo, en este momento los hermanos de ese individuo también deberían mostrarse. Otro ejemplo de un área a mejorar es la distribución de la vista de la Family. La presentación de los dos juegos de padres para el individuo activo y su esposa fue muy bien acogida, pero se habría hecho mejor uso del espacio de la pantalla para completarla con información de la etiqueta General del individuo activo. Este diseño permitiría ofrecer información “de un vistazo” acerca del individuo activo. En la misma pantalla, el lugar de nacimiento debería ser más útil para la entrada de los niños que su estado (tipo de relación de los padres). Quizás la mayor diferencia entre GRAMPS y FHM es que en el primero, casi todos los informes se escriben a un nuevo fichero. Aunque aquí existen beneficios en términos de fácil exportación de partes de la historia, la desventaja es que algunas aplicaciones necesitan estar abiertas y esto es un problema si quieres hacer mejoras incrementales de los informes, ya que necesitan ser exportados y abiertos repetidamente. Algunos tipos de funciones de impresión en GRAMPS deberían ser tratados con este punto. En suma, GRAMPS ha madurado considerablemente en los últimos 18
Figura 6: Haciendo clic sobre Pedigree podrás visualizar las relaciones en formato árbol.
¿Está GRAMPS a la altura? ¿Está GRAMPS por encima de otras aplicaciones tales como Family Tree Maker (FTM)? Según Arthur, un experto genealogista que me ayudó en la redacción de este artículo, la respuesta es un rotundo “sí”. Una vez que se acostumbró a la un poco diferente interfaz, GRAMPS le entusiasmó y sintió que probablemente ofrece más funcionalidad que la versión de FTM que había estado usando hasta el momento. Sin embargo, encontró unas cuantas áreas que creía deberían ser mejoradas. La primera de ellas es la conectividad entre las distintas “islas” de información. Por ejemplo, la vista Pedigree se reduce a un individuo en la parte izquierda, lo cual significa que es dificultoso ver a este individuo en el contexto. Por ejemplo, no se visualizan a
Figura 8: Usa la calculadora de relaciones para determinar la relación entre un individuo con otros en el árbol familiar.
WWW.LINUX- MAGAZINE.ES
meses. Es fantástico que una aplicación tan poderosa y atractiva se encuentre actualmente disponible para usuarios Linux interesados en la creación de un árbol genealógico. El hecho de que GRAMPS hiciera posible manejar un gran fichero de datos del mundo real, como el que utilizamos en este artículo, de manera impecable y permita a un usuario novel sentirse a gusto con él en menos de una hora, nos muestra el gran trabajo que han llevado a cabo los desarrolladores y demuestra lo próximo que está el escritorio Linux al uso del ■ consumidor.
RECURSOS [1] Página web de GRAMPS: http://www. grampss-project.org [2] rpm GRAMPS 1.0.11 para SUSE 9.2: ftp://ftp.gwdg.de/pub/linux/suse/apt/ SuSE/9.2-i386/RPMS.suser-rbos [3] rpm GRAMPS 2.0.3 SuSE: ftp://ftp. gwdg.de/pub/linux/suse/apt/SuSE/9. 3-i386/RPMS.suser-rbos [4] Instalación de GRAMPS 2.0.3. en SuSE: http://www.susewiki.org/index. php?title=Gramps [5] Grabación de información del censo del Reino Unido con GRAMPS: http// gramps-project.org/index. php?module=pagemaster&PAGE_us er_op=view_page&PAGE_id=13
AGRADECIMIENTO Me gustaría agradecer a Arthur Sutton por permitirme acceder a su historia familiar y por compartir conmigo sus impresiones sobre GRAMPS.
Número 12
79
LINUX USER • PDFTk
Herramienta Multifuncional para ficheros PDF
PDF A TOPE Para organizar la montaña de papeles que se cruzan cada día en nuestro mesa necesitamos organizar,recuperar, copiar, imprimir, buscar y clasificar documentos. Una herramienta especial puede ayudar a los usuarios a interesarse por el trabajo administrativo electrónico: pdftk, el juego de herramientas PDF. POR STEFAN LAGOTZKI
U
tilidades PDF nativas de Linux, tales como GhostScript, son muy útiles si estás dispuesto a navegar a través de los menús. Pero si estás buscando algo más rápido, o si lo que prefieres es automatizar alguna tarea recurrente, prueba con pdftk, el juego de herramientas PDF. pdftk es un programa de la línea de comandos muy apropiado para procesar ficheros PDF. Según su creador, Sid Steward, “Si PDF es papel electrónico, entonces pdftk es desgrapadora electrónica, taladrador, encuadernador y gafas de rayos X electrónica.
Instalación y Uso Puedes descargar la última versión del juego de herramientas de una de las páginas web de Sid Steward [1]. El programa GPL se encuentra disponible para Linux, Mac OS X (Panther), FreeBSD, Solaris y Windows. La instalación resultó ser bastante simple sobre las plataformas que probamos (Debian y SuSE Linux). Tras completar la instalación puedes correr pdftk desde la shell. El comando de -help de pdftk ofrece una lista de comandos y opciones con textos de ayuda cortos. La tabla 1 lista y explica las operaciones más importantes. La sin-
80
Número 12
taxis genérica para el procesamiento de ficheros PDF con el programa es: pdftk fichero_entrada U operación [opción] U output fichero_salida U [contraseñas] [permisos_usuarios]
Los ficheros de entrada han de estar en formato PDF. Además, la herramienta necesita ficheros de texto en un formato especial para algunas operaciones. pdftk da como salida uno o más ficheros PDF así como ficheros de texto en algunos casos especiales. En las secciones que siguen he dispuesto unos cuantos ejemplos que demuestran un poco los usos más interesantes de pdftk. Estos ejemplos no hacen más que rayar la superficie de las posibilidades de este complejo programa.
Adjuntos en ficheros PDF Se puede añadir un adjunto a un fichero PDF del mismo modo que puedes añadirlo a un correo electrónico. Adobe Reader (versión 6 o superior) almacena los adjuntos en el recipiente. pdftk permite a sus usuarios adjuntar ficheros a documentos PDF y también guardarlos.
WWW.LINUX- MAGAZINE.ES
Antes de la publicación de Adobe Reader 7, era la única manera de que los usuarios Linux pudieran guardar adjuntos. Los adjuntos pueden ser usados para añadir código fuente o extractos de base de datos literarias a ficheros PDF. El siguiente ejemplo muestra cómo enviar un fichero PDF y el código fuente acompañante. Para añadir un fichero de código fuente a un documento PDF
Listado 1: Ejemplo de Fichero PDF 01 %FDF-1.2 02
1 0 obj <<
03
/FDF << /Fields [
04
<< /V (Dresden)/T (city) >>
05
<< /V (Stefan Lagotzki)/T
06
(author)>>
07
]/F (form.pdf) >>
08
>>
09
endobj
10
trailer
11
<<
12
/Root 1 0 R
13
>>
14
%%EOF
PDFTk • LINUX USER
usando pdftk, escribe los siguientes comandos: pdftk fichero.pdf attach_files U fichero.text output nuevo.pdf
Alternativamente, podrías usar pdfLaTeX y un fichero adjunto para añadir el código fuente al fichero PDF acabado. El destinatario usaría luego pdftk para desempaquetar el fichero código fuente y otros adjuntos usados en cualquier directorio: pdftk exejemplo_adjunto.pdf U unpack_files output Fuente
En este ejemplo, guarda los adjuntos en un directorio llamado Fuente. Añadir el nombre del directorio siempre tiene sentido si estás manejando múltiples adjuntos.
Marcas de Agua y Colores pdftk utiliza un método similar al paquete LaTeX eso-pic para añadir una marca de agua a un documento. La opción background es la que maneja esto, además de permitir al usuario asignar un color a la imagen de fondo PDF. La imagen que uses como marca de agua deberá ser un fichero PDF. Podrías crear una imagen con una herramienta de gráficos vectorial o bien escribir un programa PostScript. Si la marca de agua no es del mismo tamaño que el documento, pdftk escalará la marca de agua. Asigna a lo que quieres imprimir la palabra “DRAFT” en un documento. El primer paso sería crear un PDF con el tamaño de la página adecuado antes de llamar a pdftk como sigue:
closepath fill showpage
Es fácil cambiar el color de la imagen de fondo en el código EPS. Puedes entonces convertir el fichero EPS a PDF usando epstopdf y correr luego pdftk para usar el fichero como una imagen de fondo: pdftk ejemplo.pdf background U Fondo.pdf output eg_color.pdf
Dividiendo y Uniendo Ficheros PDF La operación burst te permite dividir un fichero PDF en sus páginas individuales. Para hacerlo, necesitas suministrar un nombre genérico para las páginas y especificar el formato numérico: pdftk ejemplo.pdf burst U output Pagina%03d.pdf pdftk ejemplo.pdf burst U output ./Paginas/Paigna%03d.pdf
En ambos ejemplos, un número de página de tres dígitos se añadirá a los nombres de la página. En el segundo ejemplo, pdftk almacenará los ficheros PDF en un subdirectorio existente. La operación cat le dice a pdftk que concatene múltiples ficheros PDF para crear un nuevo documento. Puedes usar comodines para especificar los nombres de ficheros de los ficheros fuente individuales. pdftk ejemplo.pdf otro.pdf U adjunto.pdf U cat output ejemplo_concat.pdf pdftk D=cubierta.pdf U
pdftk ejemplo.pdf background U borrador.pdf output borrador1.pdf
La marca de agua se asemeja a un sello en cualquier parte del documento sin contenido. Puedes crear un pequeño fichero EPS con un color de imagen de fondo a tu elección. Los comandos PostScript para una página de tamaño A4 se parecen a: %!PS-Adobe-2.0 %%BoundingBox: 0.95 0.95 0.90 0 0 moveto 595 rlineto -595 0
0 0 595 842 setrgbcolor 0 rlineto 0 842 U rlineto
B=ejemplo.pdf U cat D B1-4 output U ejemplo_cubierta.pdf
Tal y como demuestra el segundo ejemplo, puedes usar cat para reordenar documentos mediante la unión de las partes de un fichero PDF con partes de otro fichero PDF para crear un nuevo documento.
Consulta y Actualización de Meta-Información La mayoría de los ficheros PDF contienen meta-información con detalles del autor, el tema o el software usado para crear el documento. pdftk te permite enviar estos datos a una salida estándar o redireccionarlos a un fichero: pdftk ejemplo.pdf U dump_data output info.txt
Este comando salva la información desde un documento PDF a un fichero titulado info.txt. La información incluye un campo clave y su valor. Antes de enviar o de archivar documentos PDF, a menudo tiene sentido actualizar los meta-datos. Pdftk te permite hacerlo sin tener que recrear o trasladar el fichero PDF. Para actualizar la meta-información, crea primero un fichero de texto con los meta-datos. El fichero debería ser similar a algo como lo que sigue (resumido por aquello de la brevedad): InfoKey: Creador InfoValue: TeX InfoKey: Corporación InfoValue: Ejemplo e Hijos
Tabla 1:Operaciones pdftk Operación attach_files background burst cat dump_data dump_data_fields fill_form unpack_files update_info
Explicación Añade ficheros como adjuntos a un documento PDF. Esto permite añadir un fichero de archivo a un fichero PDF. Añade una marca de agua a cada página para un documento PDF. También permite añadir un sello electrónico a espacios vacíos. Divide un documento PDF en páginas individuales. Concatena un nuevo fichero PDF a partir de ficheros múltiples o páginas desde documentos PDF distintos. Salida de información sobre un fichero PDF o salida stándard. Salidas de información sobre los campos de formularios en un fichero PDF o salida stándard. Llena los formularios PDF o datos en forma de enlaces con el documento. Desempaqueta los adjuntos de un documento PDF en un directorio. Actualiza la meta-información (por ej. autor, título, tema) en un fichero PDF.
WWW.LINUX- MAGAZINE.ES
Número 12
81
LINUX USER • PDFTk
Tabla 2: Permisos PDF Opción Printing DegradedPrinting ModifyContents Assembly CopyContents ModifyAnnotations FillIn AllFeatures
Explicación El documento puede ser impreso en la mejor calidad. El documento a imprimir será de calidad limitada. El documento que contiene puede ser modificado. El documento PDF puede ser concatenado con otros documentos PDF. Texto e imágenes pueden ser copiadas desde el fichero. Comentarios y anotaciones pueden cambiarse. Formularios en el fichero PDF pueden ser completados. El usuario tiene todos los privilegios especificados.
No necesita contener toda la información que un fichero PDF puede almacenar. Los campos que ya contienen valores no se tocan en la actualización si el fichero de texto no lo especifica. Puedes incluso añadir nuevos campos clave (Corporación en nuestro ejemplo) y asignarles valores. La siguiente llamada actualiza la información: pdftk ejemplo.pdf U update_info info.txt U output eg_meta.pdf
Los ficheros de entrada y salida no tienen permitido usar el mismo nombre. En otras palabras, necesitas renombrar manualmente el fichero de salida o usar un script de la shell para hacerlo.
Cumplimentado de Formularios PDF Los ficheros PDF pueden contener formularios con campos de formulario conocidos. Adobe desarrolló el formato FDF, que es propietario pero abierto, para datos en formulario PDF. El Listado 1 muestra un ejemplo de un fichero FDF resumido. En el Listado 2 , T es el título, y V es el valor del campo del formulario. Ahora puedes unir el fichero PDF con el FDF y decidir si los datos del formulario permanecerán editables o estarán unidos indeleblemente con el documento: pdftk form.pdf fill_form U eg.fdf output edit.pdf pdftk form.pdf fill_form U eg.fdf output end.pdf flatten
El primer ejemplo ofrece los resultados editables. Sin embargo, la opción flatten en el segundo fichero indica que los campos del formulario deberían estar unidos indeleblemente con el fichero PDF. Las características del formulario te permiten usar pdftk para crear formula-
82
Número 12
rios PDF completados sobre un servidor Intranet o Internet. El usuario completa los campos del formulario en su navegador. Luego un script PHP o Perl corriendo de fondo crea un fichero FDF. Finalmente, pdftk combina ambas partes. El fichero PDF completado puede ser enviado por correo luego.
Contraseñas y Permisos de Usuario en PDFs Los ficheros PDF pueden estar protegidos mediante el permiso de usuario y contraseñas. pdftk permite establecer para un fichero PDF tanto las contraseñas como los permisos. El siguiente ejemplo establece ambas contraseñas: pdftk fichero.pdf output U nuevo.pdf owner_pw U Lie5quai user_pw phupaefu
En este ejemplo las contraseñas fueron generadas usando la herramienta pwgen. Deberías usar distintas para las contraseñas y permisos. El propietario de un fichero PDF puede asignar permisos específicos. La Tabla 2 presenta una lista de permisos que pueden establecerse con pdftk. El siguiente ejemplo crea primero un fichero PDF que solamente puede imprimirse. La segunda línea crea un fichero PDF que además de imprimirse puede ser también copiado. pdftk ejemplo.pdf output U nuevo.pdf owner_pw U Lie5quai user_pw phupaefu U allow printing pdftk ejemplo.pdf output U nuevo.pdf owner_pw U Lie5quai user_pw phupaefu U allow printing CopyContents
Los ficheros PDF pueden ser encriptados con diferentes niveles de encriptación. Para encriptar un fichero con pdftk hay
WWW.LINUX- MAGAZINE.ES
que añadir como opción final encrypt_40bit o encrypt_128bit. También puedes necesitar sustituir una contraseña por un fichero PDF protegido con contraseña. Si estás procesando múltiples ficheros, puedes imponer variables a los nombres de ficheros y luego asignar una contraseña a cada fichero. En el ejemplo siguiente, solamente el fichero A tiene protegida la contraseña: pdftk A=nuevo.pdf U B=eg_color.pdf input_pw U A=Lie5quai cat output U egl_pw.pdf user_pw Abraxas
Como en el ejemplo anterior no te permite concatenar el fichero PDF por nuevo.pdf, necesitas sustituir la contraseña del propietario.
Conclusiones Si estás buscando una herramienta simple, rápida y eficiente para editar ficheros PDF desde la línea de comandos, prueba con el Toolkit PDF. pdftk es una herramienta de manipulación PDF versátil y multifuncional sin el peso de un GUI. Si quieres hurgar profundamente en la manipulación de ficheros PDF, échale un vistazo al libro de Sid Steward sobre Hacks de PDF [2]. pdftk está escrito en C++ y basado en la librería iText [3], escrita en Java. El programa completo fue compilado y linkado con herramientas libres como el GNU Compiler Collection [4]. Esto hace a pdftk fácilmente portable y extensible. La website de pdftk tiene enlaces a portes. El trabajo de desarrollo sobre el programa pdftk aún continua. Su autor, Sid Steward responderá a todas las cuestiones sobre pdftk y correos sobre programación PDF en el grupo de noticias comp.text.pdf y en su propio foro PDF ■ [1].
RECURSOS [1] Sid Steward: pdftk; Versión 1.12 (Nov. 2004):http://www.accesspdf.com/ pdftk/ [2] Sid Steward, PDF Hacks, O’Reilly, 2004. [3] Bruno Lowagie, Paulo Soares: iTextLibrary; Version 1.1 (Nov. 2004): http:// itext.sourceforge.net [4] GNU Compiler Collection, Version 3.4.3 (Nov. 2004):http://gcc.gnu.org
Educación • LINUX USER
Madura un clásico educativo
GCOMPRIS: JUGAR PARA APRENDER En un momento del par de artículos que dedicamos a ATNAG (concretamente era el número octavo) María Dolores Almansa y yo hicimos la siguiente crítica: «Gcompris (…) es un programa demasiado global que abarca un abanico de edades muy amplio y dispar(…) Está bien como entretenimiento en casa tal y como está (pero se corre el riesgo de que unos hijos lo encuentren excesivo y otros se aburran una vez aprendido el juego), pero su aplicación a la escuela requiere adaptaciones.» POR JUAN RAFAEL FERNÁNDEZ GARCÍA.
P
ues bien, la nueva versión de la aplicación (ver el cuadro) viene a acallar nuestra crítica e introduce un módulo de administración para que los profesores puedan gestionar perfiles y configurar qué juegos se les presentan a los distintos alumnos. Y el número de actividades crece. ¿Qué podemos decir ahora? Simplificando demasiado: GCompris es un conjunto de juegos educativos para niños de dos a ocho años. Pero no era ese el objetivo de Bruno Coudoin cuando lideró la creación de gcompris en el año 2000. Partía de la base de que las herramientas educativas disponibles eran escasas, estaban dispersas y obligaban a los profesores a aprender a manejar interfaces y aplicaciones diferentes para cada actividad. Su intención era -escrear una interfaz unificada para hacer fácil usar juegos educativos; los juegos se integrarían como «tableros» (boards) en un entorno de presentación unificado. Y el objetivo es que sea sumamente fácil
añadir nuevos tableros o modificar los existentes. Jugar para comprender, un buen punto de partida para un proyecto. No sé si comprenden el doble sentido del nombre: como numerosas aplicaciones creadas para el proyecto Gnome comenzaban con la «g» (de GNU), se jugó con la equivalencia de sonido en francés con «j’ai» (nuestro «he»), lo que genera un «he comprendido» muy educativo, ¿no es cierto?
Figura 1: Interfaz inicial de GCompris.
WWW.LINUX- MAGAZINE.ES
¿Cuál es el estatus y la posición de gcompris en relación con el resto de aplicaciones similares (recordemos brevemente la lista: ATNAG de los números 8 y 9, childsplay, Abuledu-LeTerrier)? Como escribe Yves Combe en correo privado, sus mismos autores consideran GCompris como «parte de un conjunto de utilidades de software libre que constituyen una excelente solución para su uso en una escuela. Pueden añadirse, al menos, tuxpaint y gtans en ese conjunto. De hecho tuxpaint tiene un lanzador en GCompris ahora mismo, y gtans debería integrarse como un tablero de GCompris cuanto antes». Al haber sido creada con las bibliotecas y bajo el paraguas de la estructura Gnome, es la aplicación más difundida, y se encuentra incluida en todas las distribuciones generales y educativas. GCompris está dirigida a alumnos de dos a ocho años. Según Coudoin, está diseñado buscando la máxima simplicidad y usabilidad. Nació con un par de
Número 12
83
LINUX USER • Educación
Figura 2: Práctica de la doble pulsación del ratón.
actividades, actualmente incluye cerca de 80. El progreso es evidente, así como su utilidad para que niños de Infantil den sus primeros pasos informáticos, y los alumnos de Primaria jueguen con números o se diviertan con la lectura. ¿Me acompañan y lo comprobamos juntos?
Una interfaz unificada La ventana inicial de GCompris es la de la figura 1. Si la instalación ha sido
correcta además nos saludará con un «Bienvenidos a GCompris» en el idioma que hayamos elegido y un fondo musical. Como vemos, la ventana (que puede ocupar toda la pantalla o tener el tamaño que definamos) se divide en tres secciones: una fila superior con una lista de iconos que representan categorías de actividades (simbolizadas por la flecha), un espacio para la descripción de cada categoría o actividad (que se activa cuando se mueve el ratón sobre los iconos) y una barra de control siempre presente, con iconos contextuales (no aparecen los que no tienen sentido en una determinada circunstancia). Aprendamos a interpretarlos: • Monitor con estrellas y luna – Sale de gcompris • Casa – Vuelve al menú previo • Pulgar – Confirmar respuesta • Dado – Muestra el nivel actual. Pulsar para cambiar de nivel • Nota musical – Repetir la pregunta
Figura 3: El juego Masticador de números.
• •
Flotador – Ayuda Llave inglesa – El menú de configuración (donde hemos definido el idioma, el tamaño de la ventana…) • Avión de Tux – La ventana «Acerca de» del juego Las estrellas que tienen los iconos de las actividades al lado indican su dificultad: • 1, 2 o 3 estrellas simples – de 2 a 6 años, dificultad creciente
Cuadro 1: Instalación de gcompris Como los pacientes lectores sabrán, utilizo habitualmente distribuciones basadas en Debian y su sistema de paquetes. Pero como para estos artículos debo examinar las novedades y las últimas versiones de las aplicaciones, no es excepcional que tenga que compilar o adaptar paquetes de otras distribuciones o bien utilizar líneas experimentales en mi fichero sources.list. Creo que es útil para cualquier usuario profundizar un poco en el manejo de las dependencias y de la instalación cuando el clásico aptitude update; aptitude upgrade falla o no es suficiente. Los paquetes disponibles en Debian Testing de gcompris son los correspondientes a la versión 6.5.3, preparados por Yann Dirson. Sin embargo Bruno ha publicado la nueva versión, la 7.0.3, como un paquete .rpm para Mandriva. ¿Qué podemos hacer, estamos atascados? No necesariamente, pero sí tenemos que saber desenvolvernos. En primer lugar instalaremos los paquetes Debian estándar; ya sabemos cómo, y utilizaremos las interfaces synaptic o aptitude si nos resulta más cómodo. También vamos a instalar algunos de los paquetes que nos recomienda gcompris, los paquetes de mensajes en los idiomas que pueden utilizarse en la clase, por ejemplo gcompris-sound-es, gcomprissound-en y gcompris-sound-fr. Bien, ya
84
Número 12
tenemos la versión antigua, ¿y ahora? Disponemos de un conversor de sistemas de empaquetado: alien. Procederemos a ejecutar como usuario normal fakeroot alien gcompris-7.0.3-1.i586.rpm La orden fakeroot sirve para actuar como si fuéramos el administrador, y en este caso se utiliza para que como autor del paquete .deb no aparezca root@mi_maquina (es una regla de oro que hay que trabajar como root sólo cuando sea estrictamente necesario). El resultado es el paquete gcompris_7.0.32_i386.deb. Lo instalamos (claro, como root). Gracias a nuestras precuaciones el contenido del fichero changelog.Debian.gz es gcompris (7.0.3-2) experimental; urgency=low
* Converted from .rpm format to .deb by alien version 8.56
-- usuario <usuario@mi_maquina> Fri, 14 Oct 2005 18:19:15 +0200 Pero alien -como ningún otro proceso automático, por otra parte- no hace mila-
WWW.LINUX- MAGAZINE.ES
gros. En primer lugar ha sido incapaz de detectar la versión depython que necesita gcompris. Esto se debe a que la versión estándar de python en Debian actualmente es la 2.3; de hecho los paquetes de nombre python-algo apuntan a python2.3-algo. En cambio la nueva gcompris utiliza paquetes de la versión 2.4: deberemos instalar manualmente si no están instalados en nuestro sistema python2.4, python2.4-gtk2, python2.4-gnome2, python2.4-pyorbit, python2.4-psyco, python2.4-xml y python2.4-pysqlite2. Otro detalle técnico curioso: alien también falla con el fichero .info incluido. El rpm instala /usr/share/info/gcompris.info.bz2, y alien lo que hace es volverlo a comprimir con gzip, con lo que nos queda el fichero inutilizable gcompris.info.bz2.gz. Para arreglarlo bastará con descomprimirlo primero con gunzip y después con bunzip2 y una vez que tenemos el fichero info normal volverlo a comprimir únicamente con gzip (el formato que comprende el gestor de ficheros .info de Debian es el .gz). Para aquellos a los que este párrafo les haya resultado esotérico, explicaré que estamos hablando de dos programas distintos de compresión, equivalentes a pkzip o rar y que lo que había hecho alien es comprimir un fichero ya comprimido.
Educación • LINUX USER
Figura 4: Un ejemplo de la ayuda.
Figura 5: Aprendizaje de idiomas con GCompris.
Figura 6: Practicando vocabulario.
•
zas, puzzles a partir de cuadros célebres y ¡Sudoku! • Actividades de ciencias de la experiencia: música (se repite una melodía con pulsaciones del ratón), se opera una esclusa, se calcula la trayectoria con que cae un paracaídas, se juega con el ciclo del agua (ver la ayuda en la figura 4)… • Actividades de lectura: ejercicios de reconocimiento y escritura de letras al dictado y en lectura, asociación de imágenes con palabras, identificación de una palabra entre un grupo… Apabullante, ¿no? Pues aún no hemos visto nada. Jacques Bon ha publicado en octubre de 2005 un excepcional «GCompris. Pistas para su utilización en Educación Infantil» que podemos encontrar en http://people.ofset.org/~jbon/ gcompris/gcompris-integrale.pdf. Aconsejo vivamente a cualquiera que se defienda con el francés la consulta de este documento de 122 páginas. Tiene su origen en un encargo de OFSET: la creación no de un manual de GCompris (que ya existe), sino de un documento de acompañamiento destinado a los enseñantes. Siguiendo la práctica pedagógica francesa común, el autor identifica en tablas, que se extienden por varias páginas, las competencias que se pueden trabajar con la ayuda de GCompris. Finalmente propone con todo detalle varias actividades que pueden llevarse a cabo utilizando la aplicación. Según Bon la experiencia de clase muestra que los alumnos se adaptan fácilmente a los distintos módulos de la aplicación con un mínimo de explicaciones del profesor o profesora. No obstante lo integra en una perspectiva pedagógica integral, como un medio y no como un fin, y con un enfoque basado en la manipulación real de objetos antes de pasar a la manipulación virtual. Y hasta aquí puedo leer.
Pero puedo escribir. Por motivos laborales tengo bastante en cuenta la utilización de las herramientas informáticas en ambientes de inmersión en segundas lenguas. Y no puedo dejar de pensar que las posibilidades multilingua de Gnu Linux y de GCompris son extraordinarias. Ya vimos en los artículos sobre internacionalización (los artículos cuarto y quinto de esta serie sobre educación) que cambiar el idioma de la interfaz es trivial si el locale no ha sido borrado. ¿Qué ocurre si ejecutamos la siguiente orden en una terminal?
1, 2 o 3 estrellas complejas – a partir de 7 años Como habrá profesores entre los lectores deberemos explicar cómo se juega (los niños actuales nacen sabiendo y encuentran todos los detalles por ensayo y error). Pulsamos en la categoría «Descubre la computadora» y seguidamente en «Tableros de manipulación del ratón». Seleccionaremos por ejemplo la actividad «Pulsa dos veces con el ratón» para (figura 2) practicar la difícil doble pulsación del botón izquierdo del ratón. Cada pulsación doble correcta irá descubriendo un fragmento de la fotografía. Ante cualquier duda se pulsa en el icono de ayuda.
Utilidad pedagógica ¿Qué categorías principales hay? • Actividades recreativas: actividades de coloreado (e identificación de los nombres de los colores) y dibujo (bitmap con Tuxpaint y vectorial), incluso pequeñas animaciones, pero también de orientación temporal y espacial (mano derecha e izquierda), aprendizaje de la hora, simetrías axiales y geografía (identificación de países en un mapa) • Actividades matemáticas: operaciones de suma, resta y multiplicación; masticadores de números (figura 3, para comerse las igualdades que correspondan al número definido), sean igualdades o inigualdades, múltiplos, primos o factores; varias formas de contar e identificar los números; varias actividades para familiarizarse con las monedas y los billetes actuales • Actividades basadas en el tablero: varias actividades para el aprendizaje del ajedrez, juegos de memoria y rompecabe-
WWW.LINUX- MAGAZINE.ES
LC_ALL=fr_FR gcompris &
La figura 5, donde debemos completar la palabra «chien» (perro), nos muestra que estamos haciendo los mismos ejercicios de antes esta vez en francés. Y podríamos hacerlo en inglés o alemán siguiendo el mismo procedimiento. Y el de la figura 6 es un excelente ejemplo de ejercicio de práctica de vocabulario, como lo son todas las actividades que recaen en la categoría de lectura y escritura. Por lo demás, la nueva posibilidad de fijar la interfaz en un idioma determinado conlleva, a otro nivel, que las instrucciones y ayudas también puedan aparecer en la lengua que aprendemos. Es el momento de examinar el módulo de administración.
El módulo de administración En la versión 7.0 Coudoin y Combe introdujeron un módulo totalmente nuevo (aunque con antecedentes en el editor de tableros, que nunca había funcionado como se quería originalmente, como una herramienta que pudieran utilizar los profesores). La figura 7 nos muestra el módulo. Se lanza ejecutando gcompris -a. El objetivo ya lo hemos visto: el número de actividades es ya grande, las posibles circunstancias de uso varían, y se hace necesario un filtro que permita configurar las
Número 12
85
LINUX USER • Educación
zación por los profesores. La figura 9 nos muestra que la interfaz avanza en su internacionalización; se han añadido asignaturas y materias de Primaria y Secundaria y multitud de palabras clave e ítems del currículum. Una visita cada poco tiempo a http://gnuedu.ofset.org no está nada de más. Y echar una mano tampoco.
Esbozo de evaluación Figura 7: El módulo de administración.
actividades que se les presentan a un alumno o a una clase determinados. El autor del configurador de usuarios y grupos es Bruno Coudoin. Su utiliza para la creación de usuarios y grupos. La estrategia básica es la creación de perfiles, con conjuntos diferenciados de usuarios y actividades asignadas; posteriormente es posible ejecutar gcompris -p un_perfil (donde un_perfil es el nombre de un perfil que hayamos creado previamente). El nuevo módulo permite también realizar un ajuste fino de cada tablero. Yves Combe es el autor del configurador de tableros y actividades y de la estructura general del módulo y de las bases de datos integradas. De acuerdo con esta función se puede decidir, por ejemplo, que un determinado grupo de alumnos va a realizar la actividad de descubrimiento de los colores con los mensajes orales en francés o inglés (los autores informan de que en una versión futura será posible incluso configurar los elementos, listas de palabras, letras… que utiliza GCompris en cada actividad). En tercer lugar se incorporará un módulo de informes, para que el profesor o la profesora pueda analizar la marcha de cada alumno (de hecho hace tiempo que GCompris guarda un registro de la actuación de cada usuario en ~/.gcompris/gcompris.log).
Integración con GnuEdu Saben ya que tenemos querencia a entrar en la cocina a espiar cómo se preparan las nuevas delicatessen. Pues bien, la aplicación que presentábamos en el número décimo, GnuEdu, está sufriendo un desarrollo acelerado y fascinante. En primer lugar se trabaja en la integración entre GnuEdu y GCompris: se está realizando (figura 8, una captura de http://gnuedu. ofset.org/gcompris.php) el análisis detallado de los recursos aportados por GCompris para que el motor de búsquedas especializado GnuEdu facilite su utili-
86
Número 12
En el entorno que conozco de primera mano una versión antigua y mal configurada arrastra una mala fama puede que injusta desde su inclusión en la primera versión de la distribución regional; recuerdo que se habían cometido errores como no distinguir los grupos de edad de los destinatarios en la configuración de la distribución (¿se corregirá esto?) o no informar suficientemente a los usuarios de los múltiples modos de cerrar limpiamente una aplicación. Bien, dejando aparte lo que no deja de ser una anécdota (aunque cuánta verdad hay en el dicho, las primeras impresiones…), es el momento de mojarse y hacer un breve esbozo de evaluación. En primer lugar, y justificado como consecuencia del esfuerzo por la máxima simplicidad y usabilidad, los autores se separan de los estándares de Gnome de manejo del programa: no es posible usarlo sin ratón, por ejemplo. Esto, que en determinadas circunstancias facilita el juego de determinados niños, impide por completo su uso a los alumnos que por algún motivo no pueden utilizar este apuntador. El módulo de administración era una necesidad evidente que comienza a estar cubierta. Lo que no tengo claro es si cada aplicación (aunque GCompris tiene vocación de lanzador e interfaz de aplciaciones, más bien) debe encargarse de la administración de usuarios, grupos y resultados. Pienso, por el contrario, que esta es tarea de una plataforma educativa, y que las aplicaciones deben tomar
Figura 8: GnuEdu y GCompris integrados.
WWW.LINUX- MAGAZINE.ES
Figura 9: GnuEdu muestra un recurso de GCompris.
los permisos de la plataforma y devolverle los resultados del trabajo. Pero claro, este nivel de integración no existe, y la necesidad de que se realicen las tareas administrativas sí. GCompris compite con otras aplicaciones similares. Pero en el software libre, en el que la competencia no tiene como objetivo dejar fuera del mercado al competidor, el siguiente paso debería ser definir la serie de características que debería cumplir una actividad (un tablero) para poder ser lanzado con GCompris o con ATNAG. Este nivel de integración no existe, e incluso la vocación de interfaz de GCompris se limita (es curioso que coincida con ATNAG) a ejecutar tuxpaint. No voy a juzgar cuál de las aplicaciones centradas en juegos educativos es mejor, entre otras cosas porque sería un juicio innecesario y sujeto a arbitrariedad: pueden convivir y cada una proporciona actividades y posibilidades muy distintas. Como me contestaba Yves Combe, «¿la mejor herramienta? No, sino parte de un conjunto de utilidades de software libre que constituyen una solución realmente excelente para el uso en una escuela». Eso buscábamos, ¿no?
Y en el próximo número… Siguiendo un orden que puede parecer errático pero que va buscando el máximo de variedad y servir a todo tipo de profesores y de niveles educativos, volvemos al comienzo y vamos a interesarnos por una aplicación de servidor como habíamos hecho al escribir sobre WIMS. Pocas cosas hay más útiles para un centro que una plataforma educativa; vamos a presentar las posibilidades que ofrece una herramienta con tanto éxito y actualidad como moodle. Nos vemos el mes ■ que viene.
Línea de Comandos • LINUX USER
El editor editor de de textos textos no no interactivo interactivo sed sed El
PLANTILLAS DE TEXTO
Trabajar con un editor de texto puede ser problemático si necesitas manejar con frecuencia tareas recurrentes o múltiples ficheros. sed puede evitarte muchos tecleos. POR HEIKE JURZIK
E
l Streamline Editor es un popular editor de texto para sistemas Linux y Unix. A diferencia de otros editores como Vi o Emacs, sed no es interactivo. En lugar de eso, los usuarios definen el texto a borrar, modificar o a añadir en la línea de comandos. También te permite programar comandos sed y correrlos como un simple trabajo en lotes. Si necesitas modificar un número de caracteres en uno o en múltiples ficheros, sed te evita tener que escribirlos a mano hasta que te sangren los dedos. sed normalmente lee textos para procesarlos desde la entrada estándar (stdin), sin embargo, alternativamnete, puedes especificar uno o múltiples ficheros. sed aplicará los comandos específicos a cada línea, escribiéndolos en un búfer. La salida del búfer será enviada a la salida estándar (stdout), a menos que cambies la opción predeterminada. La sintaxis de comando genérico es como sigue: sed [opciones] U 'comando(s)' fichero(s)
Para evitar que la shell modifique el comando, colócalo entre comillas simples. Los comandos pueden referirse a líneas simples, partes de líneas, a una serie o a ficheros completos. La definición de las líneas a editar se denomina address (dirección). La Tabla 1 presenta una definición de los principales comandos de sed y ejemplos de direcciones.
Salida Única Como se ha mencionado previamente, los comandos de sed se aplican a las llamadas direcciones (líneas específicas o secciones de un fichero). Puedes combinar direcciones con expresiones regulares para definiciones extremadamente precisas. Las siguientes secciones y ejemplos examinan las opciones de direccionamiento para varios comandos sed. Puedes usar dichas opciones con cualquiera de los comandos del editor. El comando p es para una salida única. Para presentar la segunda línea, por ejemplo, inserta la cifra 2 antes del comando: $ fichero sed '2p' Esta es la primera línea.
WWW.LINUX- MAGAZINE.ES
La segunda línea. La segunda línea. Esta es la línea 3. ...
Puede que la salida no sea la que tú esperabas: en vez de imprimir sólo la segunda línea, se imprime el fichero completo sobre la pantalla, y la segunda línea se imprime dos veces. Para eliminar las salidas no deseadas, añade la opción -n: $ sed -n '2p' fichero La segunda línea
Borrar El comando delete (d) en su forma más simple, espera el número de línea a procesar. Por ejemplo, el siguiente comando sed '1d' fichero
elimina la primera línea en fichero. Para eliminar múltiples líneas de una sola vez, especifica la primera y la última línea que deseas que sean eliminadas y
Número 12
87
LINUX USER • Línea de Comandos
añade una coma para separar los números. Por ejemplo, el comando siguiente sed '2,4d' fichero
borrará las líneas de la dos 2 a la 4. Es igual de sencillo borrar enésimas líneas. El siguiente comando sed '1~3d' fichero
elimina cada tercera línea empezando por la primera. Si quieres cambiar el contenido del fichero desde la línea quinta al final del fichero, no necesitas contar primero el número de líneas y darle a sed los números exactos. En su lugar, puedes usar una expresión regular. El comando sed '5,$d' ejemplo.txt
cambia todas las líneas desde la quinta hasta el final del fichero, definida con el signo dólar. El comando delete es realmente útil si necesitas eliminar de ficheros de configuración multitud de comentarios como, los que se encuentran en el directorio /etc. sed te permite eliminar cualquier línea que empieza con una almohadilla: sed '/^#.*/d' /etc/inetd.conf
La dirección para el comando d es la expresión regular entre las dos barras, la cual referencia a cualquier línea que comienza con una almohadilla y sigue con algún carácter o no. Sin embargo, esto sigue dando como salida cualquier línea en blanco en el fichero de configuración en tu pantalla. Para evitarlo, deberías usar otras expresiones regulares diferentes (^[^#].*) para imprimir (comando p) cualquier línea que no comience con una almohadilla (Figura 1).
en un fichero con la palabra “fila”, deberás aplicar el siguiente comando: $ fichero sed 's/línea/fila/' Esta es la primera fila. La segunda fila, pero este U es el final de la línea. ...
Como habras notado, sed sustituye sólo la primera incidencia de la clave de búsqueda en cada línea. Especifica el comando g para cambiar todas las incidencias: sed 's/línea/fila/g' fichero
Si el carácter barra, el cual fue usado como un separador en este ejemplo, ocurre en la clave de búsqueda, puedes optar por un carácter de separación distinto, tales como el carácter tubería (|) o almohadilla (#): sed 's#http://U www.huhnix.net#http://U www.huhnix.org#g' url.html
La sustitución del comando no está restringida a procesar el fichero completo, por supuesto. Puedes referirte a líneas individuales utilizando direcciones. El siguiente comando: sed '1s/línea/fila/g'
busca y sustituye en la primera línea solamente. De nuevo g es importante en
88
Número 12
Comandos Múltiples Para realizar múltiples tareas con una simple llamada a sed, inserta -e antes del comando individual. Por ejemplo, podrías usar el siguiente comando para borrar desde la quinta línea hasta el final del fichero y correr una búsqueda y realizar una tarea de sustitución en el texto que queda: sed -e '5,$d' U -e 's/KDE/Gnome/g' fichero
Como alternativa, puedes usar punto y coma para separar los comandos y colocarlos entre llaves ({}). Podrías escribir el comando previo como sigue: sed '{5,$d;s/KDE/Gnome/g}'U fichero
Lectura y Escritura sed también tiene comandos para leer y escribir. Si quieres insertar un fichero titulado extras después de la línea tres, prueba el siguiente comando: sed '3r extras' fichero
El comando w hace que sea igualmente sencillo extraer y escribir contenido: sed '1,4w 1bis4.txt' fichero
escribe las primeras cuatro líneas de fichero a un nuevo fichero llamado 1bis4.txt.
Tabla 1: Instrucciones sed Instrucción p
Descripción Salidas de líneas en la pantalla.
d
Elimina el área especificada.
s
Sustitución de cadenas.
a
Adjunta texto a la línea especificada (útil en scripts). Inserta texto en la línea especificada(útil en scripts). Sustituye líneas o parte de ellas (útil en scripts). Analiza el contenido de los ficheros y los adjunta a la dirección especificada. Escribe las líneas especificadas o secciones a un nuevo fichero.
Sustituciones El comando s te permite sustituir cadenas. Se encuentra seguido por un carácter de separación, la llave de búsqueda, otro carácter de separación, el carácter que quieres insertar y finalmente otro carácter de separación. Básicamente, no existen restricciones de uso en lo que se refiere al empleo de caracteres de separación, éste último no puede hallarse incluída en la cadena de búsqueda. Para sustituir cada caso de la palabra “línea”
el caso de que existan múltiples incidencias de la clave de búsqueda.
i c r
w
WWW.LINUX- MAGAZINE.ES
Ejemplo sed -n '1,10p' fichero – solamente presenta las primeras diez líneas del fichero. sed '3d' fichero – elimina la tercera línea del fichero. sed 's/KDE/Gnome/' fichero – sustituye todas las veces que aparece “KDE” por “GNOME” en el todo el fichero. 1a\-EOL- Esta es una nueva líneas – adjunta el texto a la primera línea. 1i\-EOL- Esta es una nueva línea. --inserta texto delante de la primera línea. 2c\-EOL- Esta es una línea diferente. – sustituye la segunda línea con el texto que sigue. sed '2r nuevo.txt' fichero – adjunta el contenido de nuevo.txt a la 2ª línea
sed '5,$w nuevo.txt' – almacena desde la quinta línea hasta la última línea en nuevo.txt
Línea de Comandos • LINUX USER
El Poder de los Comandos
En este caso usarías un programa para almacenar las reglas de sustitución para sed, como sigue:
Si deseas automatizar algunas tareas, puedes agrupar cualquier número de comandos sed en un programa, al cual, más tarde, puedes volver a perderlo en los ficheros blanco usando la opción -f. Por ejemplo, para eliminar la segunda línea en un fichero y añadir una línea después de la línea cuatro, escribe los siguientes comandos en líneas separadas:
s/ /_/g s/-/_/g
Por supuesto que podrías combinar las dos líneas para formar una expresión regular simple, s/[ -]/_/g -, pero esto no tiene nada que hacer con nuestro ejemplo. Corre el programa contra los ficheros pri2d mero, para chequear que 4a\ las sustituciones funcionaAñadir esto despuésU Figura 1:sed te ofrece la opción de obtener los ficheros de configurarán cuando hagas la sustide la línea cuatro. ción sin comentarios. tución de verdad. Como sed puede leer desde una El comando a necesita que el usurio sed -f script ficheroU entrada estándar, fácilmente puedes inserte una barra invertida y un carácter > nuevofichero dirigir la salida del directorio de de nueva línea después del mismo comando ls al comando sed: comando (4a). La nueva línea de texto Si necesitas modificar el fichero original que quieres insertar tiene que ser en una sin crear uno nuevo, sed dispone del $ ls -1 *.mp3 | sed -f skript línea sola. Si necesitas insertar múltiples parámetro -i para este menester. El 01_Saor_Free_News_U líneas de texto, necesitarás acabar cada comando siguiente from_Nowhere.mp3 una de esas líneas (aparte de la última) 02_Whirl_Y_Reel.mp3 con un barras invertidas: sed -i -f tareas fichero Si todo parece funcionar correcta4a\ le dice a sed que sobreescriba el fichero mente, puedes añadir luego el con sus cambios. El parámetro creará comando mv para renombrar los Añadir esto despuésU una copia de seguridad si quieres: pueficheros. También modificaré el de la línea cuatro.\ des especificar una extensión de un comando para incluir un bucle for Y esto.\ fichero para el fichero de respaldo como que permitirá a sed acceder a todos Y un poco más:) sigue: los ficheros directamente: Para insertar el texto antes que el adjunto, sustituye a por i: sed -i.bak -f tareas fichero $ for i in *.mp3; do mv -v "$i"U 1i\ Esto es algo nuevo...
Luego almacena el fichero de comandos (podrías llamarlo script), pásalo a sed y aplícalo a uno o más ficheros: sed -f script fichero
Modificación Directa de Ficheros Como mencioné previamente, sed no cambia el original por defecto. En su lugar envía salidas a stdout. Después de asegurarte de que realmente quieres guardar los cambios, puedes redirigir la salida. El operador > envía los resultados a un fichero, por ejemplo:
Además de salvar el fichero con los cambios, este comando también guarda una copia del fichero original como fichero.bak en el mismo directorio.
Combinaciones sed es realmente útil en combinación con otros programas de la línea de comandos. Imaginémonos que tienes un número de ficheros con blancos y guiones en sus nombres de ficheros y quieres convertirlos ambos caracteres, blancos y guiones, a guiones bajos: $ ls -1 *.mp3 01 Saor_Free_News from U Nowhere.mp3 02 Whirl-Y-Reel.mp3 ...
WWW.LINUX- MAGAZINE.ES
`echo $i | sed -f script`; done `01 Saor_Free_News from U Nowhere.mp3' -> U `01_Saor_Free_News_from_U Nowhere.mp3' `02 Whirl-Y-Reel.mp3' -> U `02_Whirl_Y_Reel.mp3'
Traducido a un Inglés llano, esta colección de comandos dice: para todos los ficheros con extensión *.mp3, traslada los ficheros visiblemente al resultado de la operación sed. Como los nombres de ficheros originales incluyen blancos, necesitas poner $i entre comillas. Una vez que te familiarices con el editor no interactivo sed, estoy seguro de que encontrarás cientos de utilidades ■ para aplicarlo.
Número 12
89
EVENTOS • OSWC
Conocimiento Libre en Mérida
OSWC 2005 (I)
El primer tramo de la segunda edición de la Open Source World Conference [1] se celebró los días 25 y 26 de octubre en Mérida. Jon “Maddog” Hall, Dario Rapisardi y Jesús González Barahona, entre otros, expusieron sus puntos de vista sobre la tecnología y el conocimiento libre. Linux Magazine estuvo allí.
E
l tono principal del evento fue el de una reunión con tintes más filosóficos, sociales y políticos que técnicos y comerciales, haciéndose hincapié en el uso del software libre en la administración y como instrumento para el avance de la implantación social de las tecnologías de la información, más que en su impacto en el ámbito de la industria privada. El hecho es que entre los ponentes de la mesa inaugural nos encontramos sobre todo a políticos, incluyendo a Juan Carlos Rodríguez Ibarra, presidente de la Junta de Extremadura y Luis Millán Vázquez de Miguel, Consejero de Infraestruturas y Desarrollo Tecnológico de la Junta de Extremadura y principal responsable tras la adopción de Gnu/Linux como motor de desarrollo de las TI de la región. Una vez los políticos hubieron expuesto lo suyo, dio comienzo el ciclo de conferencias, mesas redondas y
90
Número 12
encuentros, cuya inaguración corrió a cargo de Miguel Ángel Marquina, del Departamento de Tecnología de la información de la CERN. Marquina nos habló de la contribución de ésta en la difusión libre del conocimiento, nos recordó el lugar de nacimiento de la web,la CERN, y de como este invento había ayudado a la difusión del conocimiento. Sin duda, aunque olvidó mencionar el detalle de que uno de los componentes más influyentes del movimiento del software libre, el kernel de Linux, no nació en la web, sino en Usenet.
Iberoamérica toma nota Al evento acudió una nutrida delegación de representantes hispanoamericanos, muy interesados en aprender de la experiencia Extremeña. Asistieron los delegados tecnológicos de países como Panamá, Costa Rica y Perú, responsables de fundaciones pro-alfabetización tecnológicas de Colombia y Argentina, que ven en el software libre la llave hacia la incorporación en la sociedad de la información, además de otros cargos representativos de entidades con intereses en Linux, los cuales se reunieron con colegas y colaboradores para intercambiar información y consolidar alianzas. A primera hora de la tarde del primer día, nos dirigimos al auditorio principal dispuestos a digerir la comida mientras
WWW.LINUX- MAGAZINE.ES
escuchábamos a Branden Robinson, líder del proyecto Debian, que iba a presentar una ponencia titulada “La libertad de usar Debian GNU/Linux”. Pero Robinson había perdido su avión, así que fue sustituido de urgencia por Javier Bustamente (nada que ver con David), Profesor de Filosofía del Derecho, Moral y Política del Universidad Complutense de Madrid. Pese a la decepción inicial, la ponencia de Bustamante fue muy bien acogida y su aplicación de la teoría de juegos al movimiento del software libre fue particularmente interesante. Especialmente revelador fue su hipótesis de por qué funciona el sistema meritocrático de la comunidad del software libre aplicando el “dilema del prisionero”. Durante el segundo día Jon “Maddog” Hall, de Linux International, y uno de los gurús de Linux desde sus primeros días, explicó en una interesante ponencia la historia del movimiento del software libre y cómo afectaba la actual situación. Merece la pena destacar la sección dedicada a “marketing”, donde explicaba qué decir y qué evitar mencionar a la hora de convencer a tus clientes/jefes de que se decanten por soluciones libres.
Guadalinex se renueva El equipo de desarrollo de Guadalinex presentó sus novedades para la versión 2005 (nombre clave: “Flamenco” – por el pája-
OSWC • EVENTOS
Caso Real Los ponentes de la Junta de Extremadura mostraron casos reales de la aplicación de tecnologías libres en su administración. A este respecto, y especialmente impresionante, fue la ponencia de José Luis Fernández, Jefe de Servicios de Sistemas de Información, sobre el proyecto “Jara”, un sistema implementado en la red de ordenadores del Servicio Extremeño de Salud, que permite controlar todos y cada uno de los puestos informáticos de todos los centros de salud, clínicas y hospitales de toda la región extremeña. En una presentación repleta de ejemplos prácticos y casos reales, Fernández demostró cómo un administrador podía instalar, desinstalar o actualizar software en uno a varios ordenadores simultáneamente, revisar la configuración del hardware, diagnosticar problemas o controlar el uso (o abuso) que del equipo se hace, todo ello remotamente con un interfaz gráfico sencillo e intuitivo del tipo “point & click”.
comercial. Ya en la edición del 2004 hubo falta de espacio en la zona de exposición del palacio de congresos y feria, en consecuencia, si la organización está al tanto, lo lógico es que se explote la demanda y, aparte de libertad, se hable de negocio, tema en el que andamos.
Conclusión
Sebastian Kugler
ro, no por el baile) de la distribución andaluza. Aparte de la confirmación de que estará basado en Ubuntu, rompiendo con la anterior base de código de Linex y Debian puro, se va a desarrollar un nuevo instalador gráfico que se volcará de vuelta a Ubuntu. Rafael Martín de Agar, uno de los desarrolladores responsables del proyecto, apuntó algunas características de la nueva versión: el escritorio por defecto sería Gnome 2.12 y se contaría con un kernel 2.6.12. Se planeaba empezar a liberar el código beta para las pruebas en noviembre, pero a la hora de escribir este artículo, no existe ningún fichero en el repositorio de [2] dedicado a la nueva versión.
Según Fernández, el sistema, que se instala a partir de su propia distribución Linux especializada, ha permitido unificar todas las instalaciones de sistemas operativos en la red sanitaria, lo que ha simplificado y hecho más eficiente su administración, cosa vital cuando se trata de un servicio tan crítico como la entidad al cargo de la salud pública. El mismo hecho de que la Junta de Extremadura confíe un servicio tan sensible a aplicaciones de software libre indica la confianza que tienen los responsables de la administración extre-
meña en estas tecnologías. Contrasta agradablemente con la tibieza de otras administraciones que deberían tomar ejemplo.
Empresas Ausentes Se echó en falta una mayor presencia empresarial. A pesar de habilitarse una zona para que las empresas expusieran sus productos e hicieran sus mercadeos, sólo unos pocos acudieron al encuentro y la zona estuvo más o menos muerta desde la inauguración hasta la clausura. Es de esperar que en Málaga haya más interés
WWW.LINUX- MAGAZINE.ES
Las jornadas de Conocimiento Libre fueron muy provechosas para todos los asistentes y permitieron a las instituciones explicar cuales eran las medidas concretas de aplicación del software libre. A este respecto, hay que señalar que los progresos hechos por la Junta de Extremadura parecen superar a los de la Junta de Andalucía, el otro organismo impulsor del evento. Asimismo esperemos que otras administraciones autonómicas, la mayoría de los cuales andan incluso más rezagadas que la andaluza, tomen nota y aprendan del excelente resultado que le está dando el software libre a la que antaño era una de las comunidades menos influyentes del país, pero que gracias a una política tecnológica inteligente y a la afortunada elección de software libre, le han hecho referente ineludible en lo que se refiere a tecnología de la información y progreso. ■
RECURSOS [1] Open Source World Conference II – Mérida: http://www. opensourceworldconference.com/ merida05/es/modules/news/ [2] Repositorio de Guadalinex 2005 “Flamenco”: http://www. juntadeandalucia.es/repositorio/ projects/guadalinex2005/
Número 12
91
¡Hazte con tus ejemplares atrasados! #1
¡pídelos ya!
#2
#5
#8
¡pídelos ya!
#3
#6
o d a t o g a
#9
¡pídelos ya!
#4
#7
#10
W W W. L I N U X - M A G A Z I N E . E S
ยกNo esperes a que se agoten!
#11
el REPOSITORIO de conocimientos LINUX mรกs COMPLETO
atrasados@linux-magazine.es
EVENTOS
OSWC 2005 Fecha: 15-17 Febrero
Encuentro Andaluz de Universidades y Software Libre
Fecha: 10-23 Abril
Ciudad: Málaga, España
Fecha: 12-13 Diciembre
Ciudad: Málaga, España
Sitio Web: http://www.opensourceworldconference.com
Calendario de Eventos Evento FOSS.IN / Linux Bangalore 22nd Chaos Communication Congress linux.conf.au 2006 Southern California Linux Expo LinuxWorld Conference & Expo México OSWC 2005 PyCon 2006 O'Reilly Emerging Technology Conference UKUUG Spring Conference 2006 LinuxWorld Conference & Expo Australia LinuxWorld Conference & Expo Boston 7º Fórum Internacional Software Libre LinuxWorld & NetworkWorld Canada LinuxWorld Conference & Expo Italy LinuxWorld Conference & Expo SA LinuxWorld Conference & Expo Brazil LinuxWorld Conference & Expo Japan 6º Fórum Internacional Software Livre LinuxWorld Conference & Expo
Ciudad: Mollina, Málaga Sitio Web: http://encuentro.iniciativafocus.org
Fecha 29 Noviembre - 2 Dic. 27-30 Diciembre 05 23-28 Enero 06 11-12 Febrero 06 14-17 Febrero 06 15-17 Febrero 06 24-26 Febrero 06 06-06 Marzo 06 22-23 Marzo 06 28-30 Marzo 06 3-6 Abril 06 19-22 Abril 06 24-26 Abril 06 9-10 Mayo 06 16-19 Mayo 06 23-25 Mayo 06 31 Mayo - 6 Junio 06 4-6 Junio 06 5-7 Junio 06
Ciudad Bangalore, India Berlín, Alemania Dunedin, Nueva Zelanda Los Angeles, CA, EE.UU Ciudad de México, M. Málaga, España Addison,Texas, EE.UU. San Diego, CA, EE.UU. Durham, Reino Unido Sydney, Australia Boston, MA, EE.UU Porto Alegre, Brasil Toronto, Canada Milan, Italia ohanesburgo, S. África Sao Paulo, Brasil Tokio, Japón Porto Alegre, Brazil Korea Seúl, Korea
Festival Digital de Andalucía
Sitio Web: http://www.festivaldigital.org
Sitio Web http://foss.in/2005 www.ccc.de/congress/2005 http://lca2006.linux.org.au www.socallinuxexpo.org www.linuxworldexpo.com. www.opensourceworldconference.com www.python.org/pycon/2006 http://conferences.oreillynet.com/etech www.ukuug.org/events/spring2006 www.linuxworldexpo.com.au www.linuxworldexpo.com http://fisl.softwarelivre.org www.lwnwexpo.plumcom.ca www.linuxworldexpo.it www.linuxworldexpo.co.za www.linuxworldexpo.com www.linuxworldexpo.com http://fisl.softwarelivre.org www.linuxworldkorea.com
Información de Contacto Director Paul C. Brown
Director Editorial Paul C. Brown
Coolaboradores Paul C. Brown, Jose Manuel González Vida, Juan Rafael Fernández, Pedro Orantes, José María Ruíz, Alberto Planas, Jose A. García, Ana Mª Ferreiro
Director de Producción Sergio Hardasmal anuncios@linux-magazine.es
Traductores Paqui Martín Vergara, Paul C. Brown, Antonio Rueda, Víctor Tienda.
Subscripciones: www.linux-magazine.es/ magazine/subs
Maquetación Sergio Hardasmal Diseño de Portada Pinball info@pinball-werbeagentur.de Publicidad www.linux-magazine.es/pub/ Para España Expresando Comunicaciones info@exprecom.com Tel.: (+ 34) 952 216 406 Fax.: (+ 34) 952 217 115 Paul C. Brown pbrown@linux-magazine.es Tel.: (+ 34) 951 010 556 Fax.: (+ 34) 951 010 516 Para el Resto del Mundo Brian Osborn ads@linux-magazine.com Tel.: (+49) 6509 910 495 Fax.: (+49) 6509 910 497
94
Número 12
Precios Subscripción España: Europa: Resto del Mundo - Euros: Resto del Mundo - Dólares U.S.A.:
49,50 € 59,90 € 79,90 € $ 94,90
Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516 subs@linux-magazine.es Linux Magazine Linux New Media Spain, S.L. Avda. Juan López Peñalver, 21 29590 - Campanillas Málaga ESPAÑA info@linuxnewmedia.es Tel.: (+34) 951 010 556 Fax.: (+34) 951 010 516
www.linux-magazine.es - España www.linux-magazine.com - Mundo www.linux-magazine.de - Alemania
WWW.LINUX- MAGAZINE.ES
Si bien se toman todas las medidas posibles para garantizar la precisión del contenido de los artículos publicados en Linux Magazine, la editorial no se hace responsable de imprecisiones aparecidas en la revista. Asimismo, Linux Magazine no comparte necesariamente las opiniones vertidas por sus colaboradores en sus artículos. El riesgo derivado del uso del DVD y el material que contiene corren por cuenta del lector. El DVD es estudiado escrupulosamente para confirmar que está libre de virus y errores. Copyright y Marcas Registradas © 2004 Linux New Media Spain, S.L. Linux New Media Spain S.L. prohíbe la reproducción total o parcial de los contenidos de Linux Magazine sin su permiso previo y por escrito. Linux es una Marca Registrada de Linus Torvalds. Impreso en Alemania Impresión: Dierichs Druck + Media GmbH Distribución: SGEL Depósito Legal: MA-116-2005 ISSN edición impresa: 1576-4079 ISSN edición online: 1699-2237
Más del 30% de descuento respecto al precio de portada: Consigue 12 números por 54’90 Euros y todos los DVDs ¡Gratis!
A diferencia de otras publicaciones, Linux Magazine no llenará tu buzón de recordatorios para que renueves tu subscripción. Ésta se renovará automáticamente cada año. Recibirás una confirmación aproximadamente 30 días antes del final de tu periodo de subscripción, pero no se requiere que hagas nada para seguir suscrito.
¡No te pierdas Linux Magazine nunca más! La subscripción te asegura que recibas los conocimientos Linux de más alta calidad en tu domicilio cada mes.
Si por cualquier motivo decides dejar de leer Linux Magazine, puedes cancelar tu subscripción en cualquier momento. Te abonaremos el precio de todos los números que no hayas recibido. Sin preguntas, sin fechas de cancelación, sin problemas.
Linux Magazine es algo más que una revista de Linux. Patrocinamos grupos, congresos, proyectos y eventos relacionados con el Software Libre. Suscribiéndote a Linux Magazine garantizas que podamos seguir apoyando al Software Libre allá donde haga falta.
LINUX LOCAL
LINUX LOCAL Leyenda inux Local es tu directorio de servicios y empresas de Linux cerca de ti. ¿Necesitas soporte, hardware, formación? Consulta Linux Local y encuentra quién ofrece qué y dónde. El directorio se divide en regiones autónomas para ayudarte a localizar las empresas que ofrecen servicios cerca de ti. Utiliza la leyenda de la derecha para encontrar la empresa que ofrece el servicio que precises. Linux Local es tu guía de servicios Linux.
L
1.- Hardware 2.- Software / Desarollo 3.- Formación 4.- Soporte / Consultoría 5.- Servidores 6.- Redes 7.- Migración 8.- Hospedaje
Andalucía Logo
Empresa
Correo-e
Web
1
2 3 4 5 6
Gesinfo
info@gesinfoweb.com
www.gesinfoweb.com
BitRock
info@bitrock.com
bitrock.com
Properly Software
info@properly.es
www.properly.es/site
Empresa
Correo-e
Web
IWS
iws@iws.es
www.iws.es
Empresa
Correo-e
Web
Mono::labs
contacte@monolabs.com
www.monolabs.com
Datum
info@datum.ws
www.datum.ws
7 8
Cataluña Logo
1
2 3 4 5 6
7 8
Madrid Logo
1
2 3 4 5 6
7 8
¿Por qué no está su empresa en este directorio? LINUX MAGAZINE llega a miles de empresas, profesionales y usuarios cada mes. Si tiene servicios o productos Linux que ofrecer ¡Llámenos! Tlf.: +34 951 010 556 Fax: +34 951 010 516 info@linux-magazine.es
WWW.LINUX- MAGAZINE.ES
Número 12
97
PRÓXIMO NÚMERO
Febrero 2006: Número 13
PRÓXIMO NÚMERO ESPECIAL JUEGOS No es exagerado afirmar que el éxito de Linux en el escritorio depende de su capacidad para correr juegos, ya que esta capacidad no sólo determina la idoneidad de un sistema como plataforma de entretenimiento, sino, debido a las exigencias de los programas lúdicos actuales, determina su capacidad gráfica, su capacidad de reproducción de sonido y su rendimiento en el área de aplicaciones multimedia. Con esta excelente excusa, el equipo de Linux Magazine se ha puesto manos a la obra y ha preparado un dossier exclusivo con una serie de artículos que nos permitirá ponernos al día en lo que se refiere al muy serio mundo de los juegos. Primero veremos la nueva generación de juegos libres desarrollados para Linux, tanto tácticos (BZFlag) o estratégicos (Simutrans, Widelands y Freeciv), como los de rol (Crossfire) y contaremos como sacarles el máximo partido, configurándolos para torneos en red o creando mundos a medida. También contaremos con un artículo en de los creadores de WorldForge donde nos explicarán como se crea un mundo virtual, como poblarlo y como sobrevivir en él. Para terminar, echaremos un vistazo a los juegos comerciales que existen en el mercado para determinar si Linux ya está maduro para este competitivo mundo (y, si no lo está, cuanto le falta).
KNOPPIX Tendremos una interesantísimo doble artículo dedicado a la metadistro favorita de la comunidad Linux: Knoppix. En “Trucos Knoppix” el mismísimo Klaus Knopper, creador de Knoppix, nos revela algunos de los mejores secretos para aprovechar al máximo su creación. A continuación tendremos una entrevista con Klaus donde nos revelará
como empezó todo, su posición en lo que se refiere al panorama del software libre actual y su manera de trabajar.
PRÁCTICO En la sección práctica de Linux Magazine hacemos hincapié en la seguridad de los datos personales con un artículo de como prevenir el robo de identidad a través del phishing y de como preservar tu intimidad cuando nave-
gas por la red con Java Anonymous Proxy. Y ya que de proxies hablamos, veremos un clásico de esto programas bajo Linux: Squid y os enseñaremos a configurarlo para mejorar la seguridad y la navegabilidad de la red interna. En otro orden de cosas, Mirko Dölle, nuestro hombre del hardware, nos revela una serie de scripts bash que permiten optimizar la identificación del hardware en tu equipo.
A LA VENTA: ENERO 2005 98
Número 12
WWW.LINUX- MAGAZINE.ES
¿Esperabas colonia estas Navidades?
Linux Magazine te regala la caja de Suse Linux 10.0 Participar es muy Sencillo:
Qué lleva:
Desde el 15 al 24 de diciembre (ambos inclusive) de 2005, Linux Magazine regalará una caja por día de Suse Linux 10.0 a un nuevo suscriptor que se suscriba por un año a Linux Magazine.
La caja de Suse 10.0 contiene la versión oficial y soportada del sistema operativo Suse Linux 10.0 de Novell.
■
■ La caja irá a la primera suscripción anual recibida en el día (a partir de las 12 de la noche).
Sólo serán válidas las suscripciones recibidas a través del formulario localizado en
■
https://www.linux-magazine.es/CustomerService/Subscribe o en la página de Hispalinux en http://www.hispalinux.net/tienda/linux_magazine.html. Se remitirá el premio una vez confirmados todos los datos del titular del remitente y se haya tramitado con éxito el proceso de pago de la suscripción.
■
Que tu abuela te regale la colonia.
No sólo contiene todo lo que se espera de un sistema Linux en el área de ofimática (OpenOffice 2.0), diseño (the GIMP 2.2.8), comunicaciones (Kontact 1.1.2) y multimedia (AmaroK 1.3.1, Kaffeine 0.7.1, etc.), sino que también contiene una gran cantidad de software comercial que por razones de licencia o precio no se pueden incluir en versiones gratuitas del sistema. Realplayer, drivers propietarios de dispositivos, fuentes de letras propietarias, etc., son algunos de los paquetes que se incluyen de serie. Además, Suse Linux 10.0 trae versiones para máquinas tanto de 32 como de 64 bits en 1 DVD ó 5 CDs, un completísimo manual y soporte técnico de 90 días. El valor en el mercado de la caja de Suse Linux 10.0 es de 51,68 € y ¡te lo vamos a regalar!