sábado, 2 de enero de 2010

Personalización del listado de directorios de Apache

mod_autoindex


Aunque para entornos de producción nunca es buena idea dejar disponible para el público el listado de directorios, para algunas tareas es una funcionalidad que viene bien. Por ejemplo, para un repositorio de paquetes para una distribución Linux. Y la pregunta que surge al ver cómo quedan esos listados tan elaborados es saber cómo se pueden hacer fácilmente.

La respuesta viene de la de mano del módulo autoindex para Apache. Pero antes de entrar en detalle en este módulo, recordemos cómo evitar la generación de estos listados automáticos en la configuración de Apache.

Nota: Todas las referencias a la configuración y funcionamiento de Apache se han hecho sobre la versión 2.2.14 para Win32, excepto las que se indiquen explícitamente.

Desactivación de los listados automáticos

Dentro de las directivas Location y Directory, la directiva Options se encarga de configurar las opciones disponibles para esa determinada ubicación. El modificador Indexes es el encargado de activar al módulo autoindex, por lo que para evitar esta funcionalidad, deberemos configurarlo más o menos así:
<Location />
Options -Indexes

</Location>

Otra opción más radical es comentar la línea de carga del módulo en el fichero httpd.conf. Pero si elegimos esta opción, deberemos revisar el resto de la configuración para quitar la opción Indexes de cualquier directiva Options en la que aparezca. En caso contrario, al reiniciar el servicio, Apache informará que se ha producido un error y no arrancará.

Creación de la configuración para autoindex


Si nos fijamos en el fichero de configuración global de Apache, la siguiente línea se encuentra comentada por defecto:
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf

Por lo que si tenemos activado el listado automático, veremos que el resultado es de lo más espartano.

Ejemplo de listado de directorio sin la configuración de mod_autoindex

En lugar de hacer modificaciones sobre el fichero httpd-autoindex.conf, vamos a crear uno nuevo, llamado custom_autoindex.conf, que situaremos en el mismo directorio donde se encuentre el archivo httpd.conf. De esta forma, sólo con incluir esta línea al final del fichero httpd.conf, se cargarán nuestras modificaciones:
# Añadir al final del fichero httpd.conf
Include conf/custom_autoindex.conf

Personalización de las directivas


En el manual oficial de Apache, se encuentran explicadas cada una de las directivas disponibles para el módulo autoindex. En el presente artículo sólo se muestran algunas de ellas, por lo que si alguien necesita alguna funcionalidad más de las aquí presentadas, recomiendo la lectura de la documentación oficial.
IndexOptions

Los modificadores de esta directiva se pueden agrupar todos dentro de la misma línea o bien se pueden ir agregando uno por línea, para que el fichero quede más claro y legible y para que sea más fácil jugar (comentar/descomentar) las diferentes opciones.

La primera opción en nombrar es, precisamente, la que permite activar otras opciones más avanzadas de los listados de directorios. Se llama FancyIndexing y, si está desactivada, el listado de archivos se presenta en forma de lista simple (tal y como se puede ver en la imagen del primer ejemplo).

La siguiente que vamos a presentar es FoldersFirst y, como su nombre indica, independientemente del orden que escoja el usuario (las columnas nombre, última modificación, tamaño, etc), siempre aparecerán primero los directorios y después los ficheros.

Otra opción relacionada con la ordenación es IgnoreCase. Si está activada, mayúsculas y minúsculas no importarán a la hora de ordenar los archivos.

Adicionalmente, también vamos a añadir la opción VersionSort para que, en el caso de mostrar varios ficheros con mismo nombre pero versión diferente, se ordenen perfectamente de acuerdo a la versión y no al orden ASCII: la versión 1.12 iría después de la 1.9, por ejemplo.

IconsAreLinks permite que los iconos asociados a cada fichero también sean un enlace a dicho archivo. Como las imágenes suelen ser zonas muy apetecibles para el ratón, dejaremos esta opción activada.

Para nuestro ejemplo, vamos a activar la opción SuppressDescription, para no mostrar la descripción de los tipos de archivo en el listado. Aunque en un entorno real, es una funcionalidad que puede ser interesante si se listan tipos de fichero poco usuales.

Para tener más control sobre la salida HTML generada por mod_autoindex, vamos a activar las opciones SuppressRules, SuppressHTMLPreamble y XHTML. De esta forma, obligamos a que el módulo saque el contenido del listado en formato XHTML (y no en HTML 3.2) y que se ocupe sólamente de generar dicho listado. El resto de la página la generaremos nosotros más adelante.

El fichero custom_autoindex.conf, con todo lo visto hasta ahora, comenzaría así:
IndexOptions FancyIndexing
IndexOptions FoldersFirst
IndexOptions IgnoreCase
IndexOptions VersionSort
IndexOptions IconsAreLinks
IndexOptions SuppressDescription
IndexOptions SuppressRules
IndexOptions SuppressHTMLPreamble
IndexOptions XHTML

Directorio de iconos

Los iconos por defecto que vienen distribuidos con Apache, aunque funcionales, se han quedado algo antiguos en cuanto a diseño. Por esa razón, vamos a cambiarlos por los que vienen en la colección hidroxygen.

Para ello, vamos a poner en un mismo directorio todos los iconos de esta colección de tamaño 32x32 píxeles. Conviene recordar que cualquier cambio en la asociación de ficheros, requiere reiniciar Apache.

La configuración de este directorio, quedaría así:
Alias /icons/ "D:/Apache2/conf/hidroxygen/"

<Directory "D:/Apache2/conf/hidroxygen">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Asociación de tipos de archivos

Hay varias directivas relacionadas con la asociación:

  • AddIconByEncoding: sirve para asociar un icono a una codificación MIME.

  • AddIconByType: asocia un icono a un tipo MIME.

  • AddIcon: asocia un icono a una extensión.


Para nuestro ejemplo, este sería el código:
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (IMG,/icons/image.png) image/*
AddIconByType (SND,/icons/sound.png) audio/*
AddIconByType (VID,/icons/video.png) video/*

AddIcon /icons/binary.png .bin .exe
AddIcon /icons/tar.png .tar
AddIcon /icons/zip.png .Z .z .tgz .gz .zip
AddIcon /icons/pdf.png .ps .ai .eps .pdf .dvi
AddIcon /icons/www.png .html .shtml .htm
AddIcon /icons/txt.png .txt
AddIcon /icons/text-x-csrc.png .c .h
AddIcon /icons/application-x-php.png .php
AddIcon /icons/application-x-perl.png .pl
AddIcon /icons/application-x-python.png .py
AddIcon /icons/text-x-script.png .conf .sh .shar .csh .ksh .tcl .cgi
AddIcon /icons/tex.png .tex
AddIcon /icons/rar.png .rar
AddIcon /icons/rpm.png .rpm
AddIcon /icons/text-css.png .css

AddIcon /icons/violet-go-up.png ..
AddIcon /icons/gnome-blog.png README
AddIcon /icons/oxyviolet-folder.png ^^DIRECTORY^^

Las últimas 3 líneas son especiales porque sirven para asociar al directorio anterior (..), los archivos README y los directorios, respectivamente.

La lista de asociación se puede hacer tan larga y específica como se quiera o necesite. Como podemos ver, puede ser genérica (usando AddIconByEncoding y AddIconByType) o más particular (con AddIcon y la lista de extensiones).

Hay una directiva más, DefaultIcon, que sirve para mostrar un icono por defecto para los tipos de archivo que no hayamos declarado explícitamente:
DefaultIcon /icons/unknown.png

Salida XHTML

Antes hemos dicho que del módulo autoindex sólo queríamos que generara los listados de archivos, porque el resto de la salida la personalizaríamos nosotros.

La directiva HeaderName sirve para indicar el fichero que se antepondrá al listado de mod_autoindex. Y la directiva ReadmeName, para indicar el archivo que se añadirá al final de listado generado. De esta forma, y con ayuda de la opción SuppressHTMLPreamble, tendremos control total sobre el HTML que enviaremos al navegador desde el servidor web.

Si se quisieran diferentes contenidos de cabecera y pie para cada directorio a mostrar, es posible hacerlo indicando una ruta relativa a los ficheros en estas directivas. Sin embargo, para este ejemplo, vamos a usar una ruta absoluta, que debe estar (esta sí) dentro del directorio de publicación de Apache.
ReadmeName "/autoindex/footer.shtml"
HeaderName "/autoindex/header.shtml"

IndexIgnore

Para acabar con la configuración de este ejemplo, conviene nombrar la directiva IndexIgnore. Sirve para ocultar del listado automático ciertos archivos. Por ejemplo, para evitar que se muestren las copias de seguridad (ficheros acabados en ~ en los sistemas Linux), los propios archivos usados para cabecera y pie de los listados, etcétera.
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.shtml

Contenido de los archivos HeaderName y ReadmeName


El contenido de estos ficheros debe generar HTML, por lo que o bien puede estar en HTML puro o puede estar programado en algún lenguaje interpretado como SSI, PHP, Python o Perl, por ejemplo. Esta opción es interesante para poder mostrar contenido variable y poder tener unos ficheros de cabecera globales. Dicho contenido variable nos lo proporciona el propio servidor a través de sus variables de entorno.

En nuestro ejemplo, vamos a hacer la programación en SSI, puesto que sólo vamos a mostrar algunas de estas variables de Apache. Para activar la interpretación de las instrucciones SSI en el directorio donde hemos puesto los archivos .shtml, debemos añadir a la configuración:
<Location "/autoindex">
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</Location>


En entornos Linux, los archivos .shtml deben tener el atributo de ejecución (además del de lectura para el usuario que ejecute Apache) para que puedan ser ejecutados por el servidor web.

Ejemplo completo



Como resultado de la configuración aplicada en este artículo, el contenido del directorio que hemos mostrado antes, ahora luciría de esta forma:

Ejemplo de listado de directorio empleando mod_autoindex

El contenido completo del fichero custom_autoindex.conf:
IndexOptions FancyIndexing
IndexOptions FoldersFirst
IndexOptions IgnoreCase
IndexOptions VersionSort
IndexOptions IconsAreLinks
IndexOptions SuppressDescription
IndexOptions SuppressRules
IndexOptions SuppressHTMLPreamble
IndexOptions XHTML

Alias /icons/ "D:/Apache2/conf/hidroxygen/"

<Directory "D:/Apache2/conf/hidroxygen">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (IMG,/icons/image.png) image/*
AddIconByType (SND,/icons/sound.png) audio/*
AddIconByType (VID,/icons/video.png) video/*

AddIcon /icons/binary.png .bin .exe
AddIcon /icons/tar.png .tar
AddIcon /icons/zip.png .Z .z .tgz .gz .zip
AddIcon /icons/pdf.png .ps .ai .eps .pdf .dvi
AddIcon /icons/www.png .html .shtml .htm
AddIcon /icons/txt.png .txt
AddIcon /icons/text-x-csrc.png .c .h
AddIcon /icons/application-x-php.png .php
AddIcon /icons/application-x-perl.png .pl
AddIcon /icons/application-x-python.png .py
AddIcon /icons/text-x-script.png .conf .sh .shar .csh .ksh .tcl .cgi
AddIcon /icons/tex.png .tex
AddIcon /icons/rar.png .rar
AddIcon /icons/rpm.png .rpm
AddIcon /icons/text-css.png .css

AddIcon /icons/violet-go-up.png ..
AddIcon /icons/gnome-blog.png README
AddIcon /icons/oxyviolet-folder.png ^^DIRECTORY^^

DefaultIcon /icons/unknown.png

ReadmeName "/autoindex/footer.shtml"
HeaderName "/autoindex/header.shtml"

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t *.shtml

<Location "/autoindex">
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</Location>

Contenido del fichero header.shtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><!--#echo var="SERVER_NAME" --><!--#echo var="REQUEST_URI" --></title>
<link rel="stylesheet" type="text/css" href="/autoindex/style.css" media="screen" />
</head>
<body>
<div id="header">
<h1><!--#echo var="SERVER_NAME" --><!--#echo var="REQUEST_URI" --></h1>
</div>
<div id="content">

Contenido de footer.shtml:
</div>
<div id="footer">
<address>Copyright © jact 2010</address>
<address><!--#echo var="SERVER_SOFTWARE" --> on <!--#echo var="SERVER_NAME" --></address>
</div>
</body>
</html>

Hoja de estilos (style.css):
body {
background: #F6F6F6;
font-family: "Trebuchet MS", sans-serif;
margin: 1.5em;
}

#header {
border-bottom: 1px solid #000;
}

#content pre {
font-family: "Lucida Console", monospace;
font-size: 120%;
}

#footer {
border-top: 1px solid #000;
padding-top: 1em;
}

a img {
border: none;
}

address {
font-style: normal;
font-size: 90%;
}

Referencias


viernes, 18 de diciembre de 2009

El falso proxy

A primera vista, un proxy falso (o mal configurado), lo único que puede provocar es que no naveguemos en absoluto por la red. Sin embargo, bien configurado, puede ser un sustituto casero para permitir el acceso a determinados sitios, y restringir el resto. Efectivamente, sería mejor montar una solución con Squid, pero ya he dicho que es un remedio casero, siempre y cuando, la lista de sitios permitidos no sea muy grande.

Un ejemplo válido sería un ordenador de consulta público, en modo quiosco, en el que sólo queremos que se pueda visitar la web de nuestra empresa.

El truco radica, básicamente, en configurar un proxy inexistente en el navegador web y poner como excepciones de ese proxy, la lista de sitios a los que se quiere dar acceso exclusivo. La gracia del truco está en que esta configuración no pueda ser cambiada por el usuario que tiene acceso al navegador.

A continuación, vamos a configurar adecuadamente el navegador Firefox para que sirva a nuestros propósitos. Los parámetros a configurar son:

  • network.proxy.type: Deberá tener valor 1 para hacer la configuración manual del proxy.

  • network.proxy.http: Este es el lugar donde indicaremos el nombre del falso proxy.

  • network.proxy.http_port: Indica el puerto de escucha del proxy. Como en nuestro caso no existe, pondremos un valor comprendido entre 1024 y 65535.

  • network.proxy.share_proxy_settings: Al poner a true esta clave, la configuración para el protocolo HTTP valdrá también para el resto de protocolos (SSL, FTP, ...).

  • network.proxy.no_proxies_on: Como valor, separados por comas, pondremos la lista de sitios a los que sí se quiere tener acceso.


Ahora, lo que interesa es poner en el sitio adecuado los parámetros anteriores. Deberán estar en la configuración global del navegador (para que afecte a todos los usuarios de la máquina) y estarán bloqueados para que nadie los pueda modificar en su configuración local.

¿Cómo bloquear las preferencias? Para ello utilizaremos la directiva lockPref. El código resultante sería el siguiente:

// Opciones bloquedas
lockPref("network.proxy.type", 1);
lockPref("network.proxy.http", "falso.proxy.miempresa.com");
lockPref("network.proxy.http_port", 8888);
lockPref("network.proxy.share_proxy_settings", true);
lockPref("network.proxy.no_proxies_on", "miempresa.com,otrapagina.com");
lockPref("browser.startup.homepage", "http://miempresa.com");

Además, hemos incluido la opción browser.startup.homepage, para que la página de inicio del navegador sea una de la lista permitida (la principal). Aunque siempre es posible bloquear más opciones de configuración.

Para el final, hemos dejado la parte difícil: elegir el sitio donde poner el código. Como ya hemos dicho, no interesa poner esta configuración en el perfil del usuario de consulta, sino que es mejor que esté a nivel global y con permisos restringidos.

Llamaremos al archivo de configuración con los bloqueos lock.js. Este fichero lo tendremos que colocar dentro del directorio de instalación de Firefox. Para Windows sería %ProgramFiles%\Mozilla Firefox\ y para entornos Linux, algo parecido a esta ruta: /usr/lib/firefox/.

Por último, para que Firefox tenga en cuenta estos nuevos parámetros, habrá que añadir o modificar los siguientes parámetros:
  • pref("general.config.filename", "lock.js"); Así se indica un fichero adicional de configuración. No debe indicarse la ruta, sólo el nombre.

  • pref("general.config.obscure_value", 0); El valor 0 permite que el contenido del fichero lock.js vaya en texto claro. Por defecto, suele tener el valor 13, y eso significaría que el archivo debe estar codificado.


Dichos parámetros se encuentran dentro de los ficheros de configuración globales de la aplicación, y es en este punto donde hay alguna variación de la ruta, dependiendo de la versión de Firefox. Algunos ejemplos:
  • Para la versión 3.0 de Firefox para Windows, el fichero a modificar sería %ProgramFiles%\Mozilla Firefox\greprefs\all.js.

  • Para Fedora 12 y Firefox 3.5, el fichero sería /usr/lib/firefox-3.5.5/defaults/preferences/firefox.js.


Pero es conveniente avisar que, dependiendo de la distribución de Linux utilizada, estos parámetros pueden encontrarse en algún otro fichero que haya en ese directorio.

lunes, 12 de enero de 2009

Pidgin y el protocolo MSN

Hoy, como todos los días, he llegado a casa y he puesto en marcha mi cliente de mensajería instantánea multiplataforma, Pidgin. Pero hoy, una de las cuentas, la de MSN para más señas, no ha conectado al iniciar el programa. El mensaje que mostraba Pidgin era el siguiente:

Unable to retrieve MSN Address Book


Lo primero que he hecho, ha sido intentar entrar con mi cuenta passport en el sitio de Windows Live para verificar si estaba o no activa.

Como sí lo estaba, he empezado a buscar por Internet. Allí, he encontrado una noticia que señalaba que hoy (precisamente hoy), Microsoft había hecho un cambio en el protocolo y que era necesario instalar un nuevo plugin en Pidgin para solucionar el problema. O eso, o utilizar otro programa de mensajería.

De hecho, al probar con Kopete (el cliente por defecto del escritorio KDE), he entrado sin inconvenientes a la cuenta y he podido acceder a mis contactos. Otro programa que recomendaba la noticia era Empathy Instant Messenger. Aunque el programa es bastante más simple que Pidgin, también ha funcionado a la primera.

Pero el asunto es que quería solucionar el problema para Pidgin. Existe ya, desde hace unos meses, un paquete específico con el plugin para los usuarios de Ubuntu, que se puede descargar desde la web oficial del proyecto (msn-pecan, Alternative MSN protocol plugin for libpurple) y que también reside en los repositorios de la distribución.

En cambio, para Fedora, sólo parecían existir 2 opciones:
  • Compilar el fuente.
  • Esperar a que Pidgin (que ya comentan en su web el problema y que ya están trabajando en ello), sacara una actualización para el sistema.


Pero he encontrado una tercera opción. Edouard Bourguignon, ha compilado el código fuente y ha hecho un paquete específico para Fedora Core 10 y lo ha colgado en su página web. Gracias a él (otro héroe anónimo del software libre), el imprevisto con el protocolo MSN ha estado resuelto en menos de un día, preparado para miles de usuarios.

El último paso para volver a conectar con la red MSN en Pidgin, tras instalar el paquete, es reiniciarlo y cambiar el tipo de cuenta de MSN a WLM.

¿Qué sistema de pago hubiera hecho lo mismo, de forma gratuita, para sus clientes, en tan poco tiempo?

lunes, 5 de enero de 2009

Actualización de Fedora 7 a la versión 10

Un año y medio en informática es muchísimo tiempo y, más si cabe, si hablamos de la evolución de escritorio de las distribuciones Linux. Desde mediados del año 2007, en el que me instalé Fedora Core 7, tan sólo había renovado el sistema con las actualizaciones de seguridad de la versión. Por fin, estas navidades, aprovechando el tiempo libre, me decidí a hacer un upgrade de la distribución.

Primera desilusión

Fedora, que está basada en Red Hat, tiene yum como gestor de paquetes. Podríamos decir que yum es a Fedora como apt es a Debian: la herramienta que permite instalar lo que necesitas sin preocuparte por las (odiosas, en algunos casos) dependencias.

Una de las opciones que tiene yum, es actualizar el sistema entero a través del modificador upgrade. Al menos, eso era lo que creía. Siempre que ejecutaba el comando en cuestión, llegaba al mismo problema irresoluble de dependencias conflictivas. ¿No se suponía que esta herramienta era, precisamente, la indicada para no tratar nunca más con semejantes problemas? Pues no hubo manera, aún cuando, en un intento desesperado, le cambié las direcciones de los repositorios para apuntar a las versiones más modernas (e inestables) de dichos repositorios.

El único camino posible

La única alternativa viable era iniciar una instalación/actualización desde un CD de la nueva versión. Para ello, aprovechando la magnífica banda ancha de la que disponemos en España, me descargué la ISO más pequeña, que instala todos los componentes desde los repositorios de Internet.

Para que este método funcione, por precaución, siempre es conveniente seguir estas 2 normas:

  1. Tener los datos de los usuarios (/home) en una partición diferente a la del sistema. (Actualmente, casi todas las distribuciones Linux respetan esta norma y no hay que preocuparse por ello.)
  2. Hacer una copia de seguridad de los datos, en otro disco duro independiente al del sistema (o en un DVD, si cabe).


Primer arranque tras la instalación

Antes de comenzar con los problemillas que encontré tras la actualización de Fedora, un comentario sobre el proceso de instalación: el asistente de instalación a través de red es verdaderamente simple, pero casi demasiado escueto en información sobre el proceso (cada vez se parece más a la filosofía de Windows, ocultando el máximo de información...).

Ahora, empecemos con lo bueno. El proceso de arranque de esta versión 10 es muchísimo más simplista que el de la 7 (está visto que hay que parecerse al sistema de ventanas como sea...). Mi anterior sistema estaba preparado para entrar en modo gráfico tras el arranque, pero tras el upgrade... este último paso, falló. Al menos tenía acceso al sistema desde la consola de texto. También tenía acceso a Internet para buscar soluciones, pero... sin modo gráfico... ¿cómo continuar?

Había una alternativa de primeros auxilios, y otra un poco más... ¿cómo decirlo?, de chico con recursos. La primera consistía en instalar (en modo texto) un navegador en modo texto, como lynx o links. La segunda, por la que opté, era utilizar otro ordenador para conectarme a Internet en busca de información. Para ello, me agencié un Acer Aspire One con Linux preinstalado (una distro llamada Linpus que está basada en Fedora) y procedí a solventar mi contratiempo.

En uno de los foros donde recalé, indicaban que buscara más detalles sobre el problema en el fichero /var/log/Xorg.0.log. Editándolo, pude ver al final del mismo, estas líneas:

(EE) No devices detected
Fatal server error:
No screens found


Increible, pero cierto. Hasta hace unos minutos había tenido mi servidor X funcionando a la perfección, pero el proceso de actualización había sido incapaz de reconocer mi tarjeta gráfica (pese a que todo el procedimiento se había llevado a a cabo en modo gráfico).

Por suerte, existía una solución: ejecutar en modo root el siguiente comando (habiendo realizado antes una copia del fichero /etc/X11/xorg.conf, por si acaso):

# system-config-display


Tras reiniciar el equipo, la secuencia de arranque se completó hasta el final correctamente, pero... siguieron las sorpresas.

Nueva versión de KDE

Una especie de déjà vu recorrió mi mente la primera vez que vi arrancar el escritorio KDE. Parecía que estaba viendo el escritorio de XP: limpio como una patena, sin ningún icono ni documento a la vista. ¿Quién se había llevado mis lanzadores de aplicaciones y archivos?

Hasta entonces, KDE (versión 3.5), siempre me había parecido un entorno muy amigable (aunque tal vez, demasiado parecido al de Windows), pero la desaparición de iconos del escritorio (en esta versión 4.1) ya me parecía un toque de mimetismo demasiado... cruel. Así pues empecé a investigar por el nuevo sistema, por si era una opción de configuración (como en su alter ego). Después de un rato de no encontrar nada, pasé la búsqueda al ámbito de Internet. Tan sólo extraje como conclusiones que KDE reinventaba el escritorio y que la documentación oficial sobre Plasma (que así se llama ahora la aplicación que lo controla) está un poco verde todavía.

Lo que parecía claro, es que el directorio /home/mi_usuario/Escritorio no era lo que estaba viendo en pantalla y que, ahora, no se creaban lanzadores, sino applets (incluso se pueden utilizar los de Mac OS X), widgets y plasmoids.

¿Dónde estaba el explorador de archivos?

Eso es lo que me pregunté cuando intenté ver el contenido del disco duro. Ni rastro de Konqueror, ni de su sustituto en esta versión: Dolphin. Tampoco encontré el programa de terminal de KDE: Konsole. Ni siquiera estaba el editor de textos sencillo, el programa KWrite.

Una vez más, eché mano de Internet a través de mi flamante nueva versión de Firefox (¡por fin podía disfrutar de la versión 3!). Llegué a una página donde podía buscar programas de Fedora, y me devolvía información sobre el desarrollo (código fuente) de la herramienta. De esta forma, pude encontrar la clave de la cuestión: todos los programas que echaba en falta, estaban dentro de un paquete llamado kdebase. Cuando busqué ese paquete en mi sistema (rpm -qa | grep kdebase), comprobé que, efectivamente, no estaba... el de la versión 4. Sí que seguía estando el correspodiente paquete para la versión 3. Entonces, ¿por qué no se había actualizado?

La herramienta yum, cuando actualiza paquetes, se fija en el nombre de los mismos. El formato de los nombres de los paquetes es como sigue:

nombre-versión-release.arquitectura.rpm


Resumiendo, que si el nombre no coincide, yum no actualiza. Eso es lo que había pasado en mi caso. El paquete, para KDE 3.5, se llamaba kdebase3, y, para la versión 4, el nombre había cambiado a, simplemente, kdebase.

Instalando manualmente el paquete (yum install kdebase), tuve de nuevo todos mis programas.

Inconvenientes con las codificaciones de archivos

Ni la nueva versión de Konqueror, ni el nuevo Dolphin, entendían algunos de los nombres de mis antiguos archivos: aquellos que estaban en una codificación distinta a UTF-8. Ni siquiera me dejaban, ninguno de los 2 exploradores de archivos, renombrar los ficheros de la discordia. Solución: hacerlo manualmente desde la línea de comando.

Esto, en cuanto a nombres se refiere. Pero el contenido de mis archivos de texto (abiertos con KWrite), en codificación ISO-8859-1, tampoco se salvaba de la quema. Como ya he dicho, ahora todos los programas en Linux, trabajan con UTF-8 por defecto, y cada vez va siendo más complicado cambiar este comportamiento. En KWrite, versión para KDE 3.5, existía un menú de la aplicación, donde se podía cambiar fácilmente el modo de la codificación, pero en la nueva versión, está algo más escondido. Más exáctamente, está en: Settings, Configure editor..., Open/save, General, opción Encoding autodetection. Es necesario poner el valor western european para ver correctamente el contenido de los archivos generados en ISO Latin 1.

Los nombres de las opciones de la aplicación los pongo en inglés, porque el instalador no me puso el paquete de español para KDE. Tal vez pase algo parecido que en el caso del paquete kdebase, pero la verdad es que el cambio de idioma no me afecta tanto como el perder programas.

Conclusiones

Seguro que me dejo de comentar más pequeñas pegas pero, por el momento, tan sólo comentaré una más: el directorio /sbin ya no está en el PATH del usuario root. Aunque solucionarlo es sencillo (añadirlo en el archivo .bash_profile del usuario, por ejemplo), no dejó de resultarme curioso que antes estuviera y ahora no.

La pregunta que me hago es si los problemillas que me han surgido en la actualización, también hubieran ocurrido en una instalación limpia. Por lo demás, con la nueva versión, el ordenador ha mejorado en rendimiento y la respuesta al usuario de los programas es más ligera que antes. Así que, pese a todo, el cambio ha sido para mejor.

En todo cambio, mudanza, innovación... hay pérdidas. Unas veces reales y tangibles, otras veces en comodidad. Pero si hay una cosa que he aprendido en este año que termina es que si no te atreves a cambiar, no hay posibilidad de mejorar y de aprender cosas nuevas.

Actualización (2009-01-14):
Como me temía, que KDE 4 estuviera en inglés en lugar de en español, era debido al cambio de nombre del paquete de internacionalización. En la versión 3.5 se llama kde-i18n-Spanish y, en la versión 4.1, pasa a ser kde-l10n-Spanish. Instalando el nuevo paquete y configurando el idioma en las preferencias del sistema (Systems Settings, Country & Language), el tema queda solucionado.

domingo, 8 de junio de 2008

Si lo pago, lo uso

Soy linuxero de pro. Tengo actualmente una Debian testing en el sobremesa y una Arch linux en el portátil. Y me encanta. Lo que necesito, lo tiene. Navegar por internet, escuchar música, ver vídeos y dvd's, tareas ofimáticas, amuladores, juegos...

Pero he comprado un nuevo portátil. Un Sony VAIO VGN-FZ31E. Muy pero que muy bonito. Y claro, viene con un Windows Vista Home Premium. Así que me dije, vamos a ponerle un linux.

Pero para qué? Libertad, licencias, mejor seguridad... Si, me conozco todos los argumentos. Pero he pagado por un producto. Considero absurdo tirar algo que he pagado. Se actualiza solo, lleva software por un tubo ya instalado, bien propio de Sony o de terceros. Y si necesito de veras algo más, siempre puedo poner GIMP, OpenOffice, Pidgin, Firefox, Thunderbird. Y ahora con los futuros ports de kde podría incluso poner alguna de las utilidades que más me gustan. Como k3b, kopete, basket, amarok, kaffeine o dolphin. Aunque en este último caso creo que no hay nada mejor que Total Commander, aunque sea shareware ;)

Pero en general, para qué? El portátil viene ya con todo lo que necesito para mi trabajo habitual. Así que este portátil se va a quedar con su Windows Vista Home Premium y todas sus utilidades.

Al menos hasta que me harte de reinicios y de preguntas estúpidas. Preguntas, no llevo muchas la verdad, pero reinicios llevo ya 5 y no hace ni una hora que está en marcha.

No me lo quiero ni imaginar cuando le ponga la capturadora de DVB-T. Seguro que alcanzaré los 15 reinicios antes de que funcione del todo.

domingo, 16 de diciembre de 2007

Cómo instalar WAPP (II)

Los tiempos avanzan que es una barbaridad y ya ha pasado casi año y medio desde que escribí la primera parte de este artículo. En él explicaba cómo instalar 2 versiones de PHP (PHP4 y PHP5), sobre un mismo servidor Apache, en un sistema operativo Microsoft Windows. En esta segunda parte voy a intentar dar un giro de tuerca al asunto, instalando ambas versiones de PHP como módulos del mismo servidor Apache, pero corriendo en procesos (servicios) separados.

Con este proceso, podremos aprovechar la misma potencia que nos ofrece Apache para un intérprete y para el otro. Además, de esta forma, iremos renovando nuestra infraestructura para el día en que la versión 4 de PHP no se soporte más. Podremos tener nuestro servidor preparado por defecto para PHP5 y, a la vez, seguir manteniendo algún viejo script de PHP4.

Este método sólo tiene un problema: necesita de más memoria RAM en el servidor porque se estarán lanzando 2 servicios en lugar de uno.

Requisitos previos

  • Tener una máquina con Microsoft Windows (recomendado XP, pero también sirve 2003 Server).
  • Haber leído la primera parte de este artículo para tener instaladas ambas versiones de PHP en el ordenador. Actualmente, recomiendo instalar las últimas versiones disponibles: la 4.4.7 y la 5.2.5.


Desinstalación de Apache

Este apartado es opcional, pero es recomendable seguirlo si en nuestra máquina ya estamos ejecutando el servidor de Apache y queremos partir de cero para continuar con el resto de instrucciones que se mencionan más adelante.

La idea es dejar la máquina lo más limpia posible, para que nada de lo que haya anteriormente instalado, cause complicaciones con lo que instalaremos a continuación. Estos son los pasos a seguir:


  1. Parar el servicio de Apache. Para ello hay varias opciones:

    • Ejecutar desde una consola de comandos la orden:
      c:\> net stop nombre_del_servicio_apache

    • Ir a la consola de servicios del sistema (services.msc) y parar desde allí el servicio.

    • Utilizar Apache Monitor (el programa que se instala en la bandeja del sistema cuando instalamos Apache).

  2. Parar la ejecución de Apache Monitor, abriéndo la aplicación y pulsando el botón Exit.

  3. Desinstalar Apache desde Agregar/Quitar programas (en el Panel de Control).

  4. Borrar la carpeta de instalación de Apache desde el explorador de archivos. Antes de hacer esto, podemos hacer una copia de seguridad por si acaso luego quisiéramos restaurar alguna configuración especial.


Un Apache, 2 procesos

Vamos a instalar la versión 2.0.61 de Apache. La razón de no utilizar una versión 2.2.x es la misma que daba hace ya un tiempo: la librería de PHP4 que se carga como módulo de Apache no funciona con la versión 2.2.

Si alguien quiere probar con Windows Vista, será mejor que lea estas instrucciones para instalar Apache.

Haremos una instalación normal, hasta que lleguemos al paso en que pregunta si queremos instalar como servicio (utilizando el puerto 80) o sólo para el usuario actual (en el puerto 8080). Elegiremos esta última opción porque, posteriormente, ya nos encargaremos de instalar manualmente los servicios que necesitemos. Para el resto del artículo, consideraré que Apache se ha instalado en el directorio c:\apache\.

Una vez acabado el asistente de instalación, iremos al directorio de configuración de Apache (c:\apache\conf\) y haremos 2 copias del fichero httpd.conf: una se llamará php5_httpd.conf y la otra php4_httpd.conf.

Nuestro servidor "principal" (el que operará en el puerto 80), cargará como módulo PHP5. El otro servidor, que estará en el puerto 8080 (pero puede elegirse otro puerto), llevará el módulo de PHP4.

Edición del fichero php5_httpd.conf

Partiendo de la configuración base de Apache, estas son las líneas que deberemos modificar:


ScoreBoardFile logs/php5_apache_runtime_status
PidFile logs/php5_httpd.pid
Listen 80
ServerName localhost:80
ErrorLog logs/php5_error.log
CustomLog logs/php5_access.log common


Y estas líneas, las deberemos añadir (se considera que PHP5 está instalado en c:\php5\, si no es así, habrá que modificar la ruta):


LoadModule php5_module "c:/php5/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php5"


Edición del fichero php4_httpd.conf

Líneas a modificar:


ScoreBoardFile logs/php4_apache_runtime_status
PidFile logs/php4_httpd.pid
Listen 8080
ServerName localhost:8080
ErrorLog logs/php4_error.log
CustomLog logs/php4_access.log common


Líneas a añadir (se considera que PHP4 está instalado en c:\php4\, si no es así, habrá que modificar la ruta):


LoadModule php4_module "c:/php/sapi/php4apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"


Dos configuraciones, dos servicios

La idea es, viendo el contenido de ambos ficheros, mantener en archivos distintos la información de cada uno de los procesos que vamos a lanzar. Y como van a ser 2 los servicios ejecutados, tenemos que utilizar puertos de escucha diferentes.

El siguiente paso a seguir es instalar los 2 servicios. Desde una consola de comandos, iremos al directorio donde está el ejecutable de Apache y escribiremos:


c:\> cd c:\apache\bin
c:\apache\bin> apache -k install -n "Apache2PHP5" -f "c:\apache\conf\php5_httpd.conf"
c:\apache\bin> apache -k install -n "Apache2PHP4" -f "c:\apache\conf\php4_httpd.conf"


Y para lanzar los servicios:


c:\apache\bin> apache -k start -n "Apache2PHP5"
c:\apache\bin> apache -k start -n "Apache2PHP4"


Si todo ha ido bien, ya tenemos todo listo para invocar a ambos servicios por separado. Vamos a hacer una prueba rápida, escribiendo un script llamado prueba_php.php con este contenido:


<?php
/* fichero prueba_php.php */
phpinfo();
?>


El script lo colocaremos en el directorio DocumentRoot de ambos servidores (que debería ser c:\apache\htdocs\ si no hemos modificado la ruta por defecto). Ejecutando http://localhost/prueba_php.php y http://localhost:8080/prueba_php.php en el navegador, nos debería salir información diferente acerca de cada uno de los módulos de PHP.

Cómo testear la configuración de cada servicio

Por si necesitáramos añadir más prestaciones a alguno de los 2 servicios, voy a comentar como comprobar si el fichero de configuración tiene o no algún fallo. Desde una consola de comandos, tendríamos que escribir:


c:\> cd c:\apache\bin
c:\apache\bin> apache -t -f "c:\apache\conf\fichero_de_configuracion.conf"


Un puerto abierto, 2 servicios en puertos diferentes

Las siguientes instrucciones son totalmente opcionales pero pueden venir bien, en el caso de que queramos dejar solamente abierto un puerto en nuestro router para acceder a cualquiera de los 2 Apaches montados y tengamos acceso al DNS para montar más dominios.

Como último paso, podemos hacer que desde fuera del servidor, parezca que las todas las peticiones sean para un único servidor. Realmente, lo que ocurre es que las peticiones que no puede gestionar el primero, las redirige al segundo, sin que por ello cambie la URL que escribe el usuario. Para ello será necesario que podamos discriminar por nombre de dominio ambos servidores porque sólo disponemos de un puerto de salida para los dos.

Para el siguiente ejemplo, se considerará que el Apache con PHP5 es accesible a través de www.examplephp5.org y el otro Apache con PHP4, a través de www.examplephp4.org. Estas 2 entradas, en el DNS, apuntarán a la misma máquina física (serán 2 alias de esa máquina).

Podemos hacer las pruebas en la máquina local, añadiendo estas entradas en el fichero c:\windows\system32\drivers\etc\hosts:


127.0.0.1 www.examplephp5.org
127.0.0.1 www.examplephp4.org


¡Ojo!. Esta configuración del archivo hosts sólo sirve para la máquina local, no para un cliente exterior.

Una vez que ya tenemos nuestro entorno de prueba, veamos qué es lo que tenemos que configurar en el servicio principal (Apache2PHP5 que escucha en el puerto 80). En el fichero de configuración php5_httpd.conf debemos modificar estas líneas (descomentándolas):


NameVirtualHost *:80
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so


Y añadiremos estas:


<VirtualHost *:80>
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
ServerName www.examplephp4.org
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>


Tras reiniciar el servicio, podemos hacer la prueba, poniendo las URLs a nuestro fichero de prueba en el navegador web: http://www.examplephp5.org/prueba_php.php y http://www.examplephp4.org/prueba_php.php. Si todo ha ido bien, la información mostrada debe ser diferente. En el primer caso, el módulo cargado es el de PHP5 y, en el segundo, el de PHP4.

Referencias

martes, 6 de noviembre de 2007

Firefox & Proxy

A veces, cuando trabajas con un portátil lo tienes que enchufar a diferentes redes. Y estas a veces te proporcionan acceso a internet a través de un proxy. Y como cada red seguro que tiene su propio proxy definido, pues hay que hacer el cambio en las preferencias de firefox a mano.

Para evitarnos tener que hacer eso hay una extensión de firefox de lo más interesante. Se llama SwitchProxy y tiene un montón de características interesantes. Entre otras, la posibilidad de añadirle un listado de servidores proxy anónimos e ir pasando de uno a otro automáticamente cada x tiempo. Con lo que tu navegación será todo lo anónima que este sistema permite (para cosas más serias, mírese tor y téngase siempre en cuenta que todo pasa por la red del proveedor ;-) y que lo único verdaderamente seguro por ahora es el cifrado fuerte)

Como colofón a esta entrada, aquí van una serie de direcciones interesantes relacionadas con el tema.

sábado, 20 de octubre de 2007

Jornadas sobre la web móvil

Dentro de los simposios del CEDI 2007, que se celebró en Zaragoza del 11 al 14 de septiembre, hubo uno dedicado a la web móvil, organizado por la oficina del W3C de España, la fundación CTIC y el Ayuntamiento de Zaragoza. Las conferencias de estas jornadas tuvieron lugar los días 12 y 13. El programa y las ponencias están disponibles en la página del W3C.

El resumen que se presenta a continuación está basado en el contenido de las ponencias y en apuntes personales que tomé como asistente a las mismas.

Introducción

Como ocurre en la web de escritorio (para PCs), es muy difícil desarrollar un diseño que sirva para todos los dispositivos y navegadores de los móviles. El hardware es muy diverso y tiene inconvenientes frente al mundo del PC:

  • Poca capacidad de proceso y memoria.
  • Limitado tamaño de pantalla (resolución, orientación).
  • Escasos colores.
  • Dificultad a la hora de introducir datos.
  • Poco ancho de banda.
  • Excesivo precio de las tarifas de conexión.

Los navegadores (como siempre), tampoco ayudan a mejorar el panorama pues cada uno implementa un lenguaje de marcado distinto:


Y sólo algunos tienen características avanzadas como el soporte de CSS y de JavaScript. Por si fuera poco, el abanico de navegadores disponibles es incluso mayor que en el caso de los PCs. Sin embargo, el parque de móviles se renueva mucho más rápidamente que el de ordenadores de escritorio.

El concepto de movilidad

Toda la información disponible para cualquier persona, en cualquier lugar y en cualquier instante de tiempo.


Por primera vez en la historia de la tecnología, se está más cerca de conseguir este sueño, gracias a la utilización de dispositivos móviles. Gracias a su pequeño tamaño, y cada vez más prestaciones, pueden acercarnos a la información que necesitemos en cualquier momento (como la información de proximidad). Siempre que contemos con la cobertura necesaria y si se empiezan a desarrollar servicios que cubran la gran demanda de información que puede surgir.

Aún así, Internet a través del móvil nunca será como la Internet que vemos en los ordenadores de sobremesa:
  • Por las limitaciones de los dispositivos y del medio de acceso.
  • Por las ventajas que le otorga la movilidad.
  • Por la diferencia en el tipo de uso y la necesidad del usuario.


La web móvil requiere que la información sea breve, concisa y que se pueda acceder ágil y rápidamente a ella. Para ello hay que recordar a los generadores de contenidos para los dispositivos móviles que, más que en ningún otro medio de comunicación, la palabra la tienen los usuarios. Si no hay buenos (y útiles) servicios, los usuarios no los consumirán.

Otro reto que queda, para las empresas que ofrecen la cobertura, es disminuir los costes para que más gente pueda acceder a los servicios creados.

Esto con respecto a Internet, pero también hay claras ventajas que aporta la movilización en aplicaciones:

  • Gestión en tiempo real
    • Capacidad de procesar incidentes en tiempo real
    • Mejor información al cliente

  • Mejora de productividad (evitar el envío posterior de datos)
  • Mejora de calidad (evitar la perdida de datos, detalles)


Desarrollo móvil

Pero para tener esas ventajas es necesario producir aplicaciones para los dispositivos móviles. En este apartado comentaremos algunas herramientas disponibles para llevar a cabo la difícil tarea del desarrollo.

Identificación de dispositivos
En primer lugar es crucial conocer las características técnicas de los dispositivos de los potenciales usuarios. Al conjunto de capacidades del dispositivo (hardware y software) y preferencias de usuario se le denomina perfil de dispositivo. Hay diversos sistemas que podemos consultar para acceder a estos perfiles:

  • CC/PP: Para almacenar la información usa notación RDF.

  • UAProf: Promovido por la Open Mobile Alliance. También se basa en RDF. Pero no están todos los que son (los grandes ausentes son dispositivos con Windows Mobile) ni son todos los que están (parte de la información puede no corresponder con datos reales).

  • WURFL: A diferencia de los otros sistemas, la base de datos se va completando con datos aportados por usuarios de los dispositivos móviles (es una de las ventajas por ser software libre). Esto tiene el problema de que contiene información no autentificada por los fabricante. Sin embargo, tiene la ventaja de que se puede recoger información sobre todo tipo de dispositivos (incluso de los que no tienen perfil UAProf). Además, este sistema se complementa con APIs de consulta para la base de datos (que es un fichero XML) en diversos lenguajes de programación (Java, PHP, Perl, Ruby, Python, dotNet, ...). Por todo esto, es un sistema mucho más usado y fiable que UAProf.

  • DDR: Con el objetivo de solucionar los problemas de UAProf, el W3C está desarrollando este nuevo sistema. El apoyo por parte de los fabricantes de dispositivos será crucial para que esta iniciativa fructifique.


Por su parte, para el desarrollo de aplicaciones en Java ME, están disponibles estas herramientas:



Buenas prácticas en el desarrollo de la web móvil
Reconocer las capacidades que permite el dispositivo de un usuario es sólo el inicio del camino en el desarrollo de contenidos web. Aparte de seleccionar el lenguaje de marcado adecuado a cada situación, es preciso hacer un buen diseño de arquitectura de la información para mostrar tan sólo los datos justos y precisos en cada página mostrada.

Para no dejarnos solos en esta ardua tarea, el W3C ha escrito un manual donde se recogen las buenas prácticas que nunca debemos olvidar en el desarrollo de contenidos para la web móvil: Mobile Web Best Practice 1.0 Basic Guidelines.

Como resumen de la presentación de estas normas, veamos cuáles han puesto en práctica el Ayuntamiento de Zaragoza para adaptar su web a los dispositivos móviles:



Herramientas de desarrollo
Cuando sale un nuevo dispositivo, no siempre podremos acceder a la compra del mismo. Una buena alternativa (aunque no sea fiable al 100%), es usar emuladores. Todos los fabricantes importantes ponen a disposición de los desarrolladores emuladores de sus modelos más significativos.

Durante el proceso de diseño e implantación de la solución son herramientas esenciales, para las pruebas finales siempre sería recomendable usar los dispositivos reales, porque no siempre las emulaciones se van a corresponder con la realidad.

La otra gran herramienta que debemos tener siempre a mano es un validador de código para dispositivos móviles. Hay uno disponible en la web de TAW. Además de verificar que el código esté bien escrito, al igual que hacen con los tests de accesibilidad, nos dirá si nuestras páginas son MobileOK. Es decir, si cumplimos las buenas prácticas o no.

dotMobi

Con el fin de proporcionar un servicio de calidad a los usuarios móviles, ha nacido la iniciativa dotMobi. Estas son algunas de sus características:


  • dotMobi es un dominio específico para el móvil.


  • Cualquiera puede conseguir un dominio dotMobi, pero se compromete a cumplir esta máxima y respetar las guías de estilo obligatorias. Por ejemplo, en el caso de un site:

    • Accesible como dominio de segundo nivel (bmw.mobi) (sin www.).

    • Desarrollado conforme a W3C MWI.

    • No frames: Muchos móviles no soportan frames.

  • Si un servicio dotMobi no cumple las guías de estilo, mTLD (el organismo que desarrolla esta iniciativa) iniciará un proceso de apercibimiento que podría terminar con su desconexión del DNS.

  • Es muy intuitivo, fácil de publicitar y de recordar.

  • Las páginas dotMobi son una garantía de que el contenido estará bien distribuido, no tendrá grandes fotos, no habrá texto que no se pueda ver ni información fuera de contexto o que no pueda mostrar la pantalla del móvil, ...

  • dotMobi Mobile Web Developer Guide ofrece información extremadamente útil con reglas para los profesionales.

  • Ready.mobi es un analizador de conformidad para las páginas y sites dotMobi que, además de una clasificación, ofrece recomendaciones específicas para mejorar el código empleado.



Opinión personal sobre las conferencias

El nivel de las ponencias fue grande y me ayudaron a asentar los pocos conocimientos que hasta entonces tenía sobre los fundamentos de la web móvil.

Como nota negativa, no para el simposio, pero sí para la organización del congreso, decir que la publicidad que se hizo de un evento de estas características fue bastante pobre y escasa (sobre todo en Zaragoza). Personalmente, me enteré del evento a través del blog de Torres Burriel. Si se hubiera dado la cobertura necesaria, el congreso habría tenido incluso más éxito en participación (sobre todo local) que el que no dudo que obtuvo.

domingo, 7 de octubre de 2007

A la hora señalada

A veces, cuando la pila del ordenador está muy gastada o simplemente por un problema hardware, el reloj del ordenador se retrasa. Y no deja de ser incómodo el tener la hora que no toca en la esquina inferior derecha de la pantalla.

En M$ Windows existe desde su versión 2000 la posibilidad de ajustar la hora mediante un servidor de ntp. Aunque muchas veces, no se porqué no funciona del todo bien. Al final, la última vez que lidie con este problema tuve que buscar en el registro la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers y cambiar su contenido por alguno de los servidores que aparecen en alguno de los links que hay al final del todo de esta entrada.

En linux es como siempre mucho más fácil. Sólo se se necesita el programa ntpdate. Y el resto de la explicación en este link.

También está la opción de utilizar un demonio para ello, con lo que se puede tener un único ordenador de la red que tenga la hora bien establecida desde internet y los demás que la actualicen desde este. Con lo que se se reduce la carga de los servidores de ntp de internet.

Para más información, mirar aquí, aquí y aquí.

lunes, 27 de agosto de 2007

Formularios web (II): Agrupación de los campos con HTML

En el primer artículo de esta serie, vimos como se codificaba cada uno de los elementos del formulario de contacto en HTML. Aun siendo totalmente funcional el formulario resultante, no es muy usable porque todos los elementos están apelotonados, sin orden ni sentido. Hay que dotar de estructura y semántica al conjunto y para ello veremos varias opciones de distribución y agrupación.

Distribución libre

La primera forma de ordenar los elementos del formulario podría ser esta: form_free_layout_unstyled.html

Simplemente ponemos un retorno de carro después de cada campo y listo. Como primera aproximación, no está mal pero no es la más acertada. De hecho, recuerda mucho a como construyen algunos usuarios de un conocido procesador de textos los saltos de página: a base de retornos de carro hasta pasar de página. Pero ambos casos tienen el mismo problema: simplemente, no funcionan.

En el caso del procesador de textos, si aumentamos o disminuimos el tamaño de letra o quitamos o añadimos contenido, tendremos que cambiar el número de retornos de carro que sirven para alcanzar la siguiente página.

En el caso de nuestro formulario, la etiqueta <br /> no tiene significado alguno dentro de la enumeración de campos. Sólo tiene como objetivo mejorar la presentación. Pero la presentación no debería ser objeto de la codificación HTML, para eso ya están las hojas de estilo CSS. Mediante HTML debemos escribir el contenido de las páginas y dotarlo de significado a través de los diferentes elementos. Así pues, esta primera opción queda descartada.

Distribución basada en tabla

Es la forma más sencilla de disponer los elementos en la plantilla y la que más prestaciones de presentación ofrece, pero también es la que menos semántica aporta al contenido y la que más marcado HTML necesita.

Es sencilla si se domina la codificación de las tablas (que no es nada fácil de aprender) pero, lamentablemente, debido a un mal uso de este elemento, es fácil asumir que esta es una técnica muy conocida porque en multitud de páginas se usan para lo que no fueron hechas: para maquetar las páginas en lugar de usarlas para mostrar datos tabulados.

Ejemplo: form_table_layout_unstyled.html

Con este ejemplo se puede observar que:

  • Cada etiqueta queda alineada con su campo asociado.
  • Aunque no se aprecie, la tabla se ajusta al contenido. Es decir, no tiene un ancho del 100% de la página.


Estas ventajas que nos aporta el uso de tablas sólo tienen fines de presentación pero, hemos dicho que de la presentación ya se ocuparían las hojas de estilo, ¿no? De lo que se trata en HTML es de dotar de significado al contenido mediante el marcado. Sin embargo, lo que hemos conseguido es esto:

  • El título del formulario se ha convertido en un encabezado de tabla.
  • Hacer trabajar más a los lectores de pantalla porque hemos aumentado el marcado.
  • La estructura se ha convertido en algo sin sentido por utilizar las celdas de la tabla como contenedores de los campos (¿qué sentido tiene poner un botón dentro de la celda de una tabla?).


Ante estas terribles circunstancias, será mejor valorar otras opciones.

Distribución basada en lista

Para dotar de significado a la codificación del formulario, se podría pensar que los campos constituyen una enumeración (y poder utilizar entonces como contenedor el elemento ul), que puede incluso determinarse un orden en la importancia de los campos (para usar el elemento ol). Otra posible idea sería considerar que tenemos que rellenar la definición que se nos da en la etiqueta (entonces podríamos escribir una lista de definiciones con los elementos dl, dd y dt).

Ejemplo: form_list_layout_unstyled.html

Con cualquiera de estas formas se dota de estructura al contenido y de cierto significado, si alguna de las metáforas tuviera fundamento. Todas me parecen algo sacadas de contexto, sobre todo la de la lista de definiciones (aunque no me he podido resistir a ponerla en el ejemplo por ser la más rebuscada). De todas maneras, veamos si hemos ganado algo respecto al anterior punto:

  • Hemos conseguido la ordenación de los campos.
  • Hay menos marcado HTML.
  • Se consigue dotar de semántica al contenido (aunque no sea la más adecuada).


Distribución basada en párrafos

Antes de explicar la siguiente propuesta, vamos a hacer un pequeño paréntesis para explicar 2 elementos que dotarán de significado al formulario.

El elemento fieldset sirve para agrupar lógicamente un grupo de campos dentro de un formulario. Por ejemplo, podríamos agrupar dentro de un fieldset los datos personales (nombre y apellidos) y dentro de otro, los datos postales (dirección, código postal, etc.), todo ello dentro de un mismo formulario:


<form action="http://www.example.com/store_info.php" method="post">
<fieldset>
<legend>Datos personales</legend>

<label for="first_name">Nombre:</label> <input type="text" id="first_name" name="first_name" value="" />
<label for="surname">Apellidos:</label> <input type="text" id="surname" name="surname" value="" />
...
</fieldset>

<fieldset>
<legend>Datos postales</legend>

<label for="address">Dirección:</label> <input type="text" id="address" name="address" value="" />
<label for="city">Población:</label> <input type="text" id="city" name="city" value="" />
...
</fieldset>

<fieldset>
<input type="submit" name="send" value="Enviar" />
</fieldset>
</form>


Aunque con el ejemplo ya se puede intuir el uso del elemento legend, vamos a explicarlo un poco más en detalle. Con este elemento se etiqueta a un grupo de campos, se describe la función lógica de ese conjunto de datos.

Como hemos visto, sólo con el uso de estos elementos ya se dota de cierta estructura al contenido pero todavía es necesario utilizar elementos de bloque para dar estructura a cada uno de los campos. Para ello, vamos a ver como queda utilizando párrafos: form_paragraph_layout_unstyled.html

  • Hemos cambiado el encabezado h1 por el uso del elemento legend, con lo que hemos dotado de más semántica al título del formulario. De rebote, también hemos mejorado la accesibilidad ya que los lectores de pantalla podrán describir mejor los campos del formulario.
  • Hemos conseguido ordenar los campos para que sea más fácil rellenarlos.
  • El marcado HTML no puede ser más simple ni reducido y, a la vez, no puede tener más semántica.


¿Acaso ya hemos descubierto la forma más correcta de escribir el formulario en HTML? Pues, como casi todo, es relativo y dependerá de nuestras necesidades. Hay un pequeño inconveniente en esta distribución y por eso vamos a ver un ejemplo más.

Distribución basada en divisiones lógicas

El inconveniente tiene que ver con lo que puede ir dentro de un elemento p. Existe una limitación que, en algunos casos, puede ser importante: no podemos poner otros elementos de bloque dentro (sólo es posible insertar texto y algunos elementos en línea). Esta es la razón por la que, en lugar de utilizar el elemento p, utilizaremos el elemento div.

Ejemplo: form_div_layout_unstyled.html (este será el formulario que utilizaremos en el siguiente artículo de la serie para aplicarle estilos CSS y darle una apariencia más amigable).

  • La legibilidad se mantiene a la hora de rellenar el formulario.
  • El marcado HTML es casi tan mínimo como antes e igual de sencillo.
  • Podemos añadir elementos de bloque dentro de cada agrupación lógica de cada campo. Por ejemplo, si se quiere adjuntar una pequeña ayuda en línea para algún campo.



...
<fieldset>
<legend>Datos postales</legend>

<div>
<label for="address">Dirección:</label>
<input type="text" id="address" name="address" value="" />

<p>Ejemplo: calle, número, piso, letra</p>
</div>

...
</fieldset>
...


Bibliografía recomendada

domingo, 19 de agosto de 2007

Formularios web (I): Elementos básicos de HTML

Los formularios en las páginas web sirven para obtener datos de los usuarios. Igual que a nadie gusta rellenar largos e interminables formularios en papel, debemos tener esto, aún más en cuenta, a la hora de diseñar para la web. Para ello, podemos seguir estas sencillas reglas:

  • Nunca se deben pedir más datos de los estrictamente necesarios. De esta forma evitaremos pesadez al usuario y nos ahorraremos espacio en nuestro sistema de almacenamiento de datos. A este consejo habría que añadir esta recomendación: nunca pedir datos al usuario hasta que no sean necesarios para la acción que está realizando. En una tienda del mundo real, a nadie nos preguntan el número de la tarjeta de crédito hasta que no vamos a pagar en la caja.
  • Proporcionar valores por defecto siempre que sea posible (para rellenar menos campos y mejorar la satisfacción del usuario: cuanto menos tenga que teclear, mejor).
  • En los campos que necesiten información específica, es buena idea proporcionar ayuda en línea que explique cómo rellenarlo, mostrando ejemplos reales o determinando rangos de entrada.
  • Si hay errores en el formulario, mostrar claramente dónde se han producido y cómo resolverlos. Para los valores que sí estén correctos, habrá que recordarlos para evitar que el usuario los tenga que volver a rellenar.
  • Si el número de campos a completar es alto, habrá que mostrar la información en grupos lógicos que tengan relación para que sea más fácil localizarla. Incluso puede ser buena idea descomponer un formulario grande en varias páginas, simulando el funcionamiento de un asistente. Si optamos por esta opción, la navegación entre las distintas páginas debe ser clara para permitir al usuario moverse de una a otra sin perder ningún dato.
  • No hay nada más frustrante para el usuario que llegar al final de un formulario y equivocarse de botón (por ejemplo, pulsar el botón Cancelar y observar que todo lo que había escrito desaparece como por arte de magia). Hay que separar (o hacer más grande, o poner en una posición predominante, ...) la opción principal (que es enviar los datos) de otras secundarias (como la de restablecer los campos o volver a otra página anterior) para evitar esta situación.


Esta lista podría seguir hasta casi el infinito. El diablo está en los detalles y la diferencia entre un sitio amigable y con un buen número de visitantes puede estar en cómo, cuándo y cuánta información pide a los usuarios. Un buen estudio sobre estos y otros consejos para el diseño de formularios, podemos encontrarlo en Best Practices For Form Design.

El objetivo de esta serie de artículos es presentar un ejemplo sencillo de formulario web y ver los diferentes pasos que hay que hacer para integrarlo en una página web. Más concretamente, los objetivos de cada uno de los artículos son los siguientes:

  • Elementos básicos de HTML (el presente artículo): breve introducción a algunos de los elementos disponibles en HTML para la construcción de los campos.
  • Agrupación de los campos con HTML: hay diferentes formas de distribuir y presentar los campos de un formulario en HTML. Veremos algunas de ellas junto con sus ventajas e inconvenientes.
  • Diseño con CSS: una vez estructurado el contenido en HTML, llega el momento de mostrar al usuario de la forma más amigable posible el formulario.
  • Programación del lado del servidor: es buena idea crear una librería de código (para PHP) para construir formularios HTML puesto que es una tarea repetitiva en cualquier proyecto web.


El ejemplo que nos va a servir para ir viendo cada una de las partes (HTML, CSS y programación), es la creación de un sencillo formulario de contacto. Contendrá 3 campos: el nombre, el correo electrónico (para que podamos responder al visitante) y un campo de texto libre en el que irá el comentario que nos quieran escribir.

Campo de texto simple

En primer lugar vamos a ver como se codificaría en HTML el campo para el correo electrónico:


Correo electrónico:

Correo electrónico: <input type="text" name="email" size="35" value="">


En principio, esta sería la forma más básica (y totalmente funcional) de construir el campo de nuestro formulario:

  • El atributo type indica que es un campo de texto simple (que sólo puede contener una línea de texto).
  • El atributo name indica el nombre de la variable que contendrá el valor del formulario.
  • size indica el ancho del control en la visualización, en este caso, para que quepan 35 caracteres. Nada tiene que ver con el máximo número de caracteres que pueden introducirse en el control.
  • Por último, el atributo value sirve para indicar el contenido por defecto que mostrará el control.


Hemos visto la forma simple, pero vamos a introducir algunas mejoras en el marcado HTML:




<label for="email">Correo electrónico:</label> <input type="text" id="email" name="email" size="35" maxlength="35" value="" />


El elemento label sirve para relacionar un texto (que llamaremos etiqueta) con el campo al que hace referencia. Esto se hace en 2 fases: primero se marca en el atributo id del elemento input correspondiente el identificador del campo (que puede tener el mismo valor que el atributo name) y, después, indicar en el atributo for de label el identificador del campo al que se asocia. Con esta medida mejoramos el formulario en estos aspectos:

  • En semántica, porque dotamos de estructura lógica al texto que hace de etiqueta del campo.
  • En usabilidad, porque si se pulsa sobre el texto, el foco se situará sobre el control asociado.
  • En accesibilidad, al proporcionar la asociación implícita entre el texto y el campo. Alguien que ve el formulario en la pantalla asocia la etiqueta al campo por la cercanía de los elementos pero para quien no lo puede ver, esa pista, por sí sola, no es suficiente.


Hemos indicado, a través del atributo maxlength la cantidad máxima de caracteres que admitirá el campo. De esta forma, por más que lo intente, el usuario no podrá introducir más caracteres de los permitidos y se evita que luego halla efectos de truncado de la información (si hubiéramos permitido introducir más pero en la base de datos no caben, tendríamos que haber truncado los caracteres sobrantes).

Como último retoque, hemos cambiado la forma en la que se cierra el elemento input (<input ... />), añadiendo una barra al final. De esta forma conseguimos compatibilidad con XHTML si queremos usar un formato más riguroso, sin perder la compatibilidad con el HTML normal porque también acepta esta forma de cerrar los elementos vacíos. Por la misma razón, los elementos y atributos siempre deben ir en minúsculas y los valores de los atributos entre comillas.

Los valores de los atributos id y name no tienen por qué coincidir. Sólo hay que recordar que se puede repetir el mismo valor de name en un formulario pero no así el valor de id, que debe ser único para cada elemento en una misma página.

Otra posible forma de codificar el campo del correo electrónico en HTML sería esta:


<label>Correo electrónico: <input type="text" name="email" size="35" maxlength="35" value="" /></label>


Escribiendo el elemento input dentro del label no hace falta indicar explícitamente la relación entre ambos elementos (atributos id y for). Pero, aun siendo totalmente válida esta alternativa, no es recomendable usarla porque puede causar algún problema en ciertos navegadores y lectores de pantalla.

Campo de texto multilínea

Continuemos viendo como escribir el código del campo Comentario. La idea es que el visitante de nuestra página escriba todo lo que quiera sin problemas de espacio. Como hemos visto antes, el elemento input se nos queda un poco pequeño pues sólo permite una línea de texto. Existe otro elemento, llamado textarea, que se ajusta mucho mejor a nuestras necesidades: el usuario puede escribir en varias líneas y viendo más texto de vez, como si escribiera un correo.




<label for="comment">Comentario:</label> <textarea id="comment" name="comment" rows="4" cols="40"></textarea>


Hemos utilizado la asociación entre etiqueta y control a través de los atributos for e id, como en el caso anterior.

Los atributos rows y cols sirven para dar dimensiones gráficas al control dentro de la página (4 líneas de alto y 40 caracteres de ancho).

En este elemento, el valor por defecto que se mostraría al visitante, debemos escribirlo como contenido de la etiqueta textarea. Por ejemplo, si quisiéramos mostrar un texto de muestra, tendríamos que escribir algo como esto:




<label for="comment">Comentario:</label> <textarea id="comment" name="comment" rows="4" cols="40">Texto de ejemplo</textarea>


En cambio, si lo que queremos es que el campo esté completamente vacío, no debe haber ningún caracter extra (como un espacio o un retorno de carro) entre el cierre de <textarea ... > y el comienzo de </textarea>.

Botón de envío

Ahora necesitamos añadir un botón de envío para que el usuario pueda mandarnos sus datos a un lugar donde podamos almacenar la información.




<input type="submit" name="send" value="Enviar" />


Utilizando de nuevo el elemento input, cambiando el valor del atributo type por submit ya tenemos nuestro botón. Además, este valor indica que cuando se pulse el botón, se producirá el envío de los datos al lugar especificado por el atributo action del elemento form.

En este caso, el contenido del atributo value es lo que se mostrará como texto del botón, por lo que no es necesario añadir una etiqueta con el elemento label.

Elemento form

Todos los controles de formulario que hemos visto hasta ahora, tenemos que ponerlos dentro de otro elemento, denominado form, para indicar que todos los campos forman parte de la misma transacción de información y, también, para indicar el destino de esos datos.


<form action="http://www.example.com/store_info.php" method="post">
<label for="name">Nombre:</label> <input type="text" id="name" name="name" size="35" maxlength="35" value="" />
<label for="email">Correo electrónico:</label> <input type="text" id="email" name="email" size="35" maxlength="35" value="" />
<label for="comment">Comentario:</label> <textarea id="comment" name="comment" rows="4" cols="40"></textarea>
<input type="submit" name="send" value="Enviar" />
</form>


El atributo action establece el lugar a donde irán a parar los datos del formulario. Generalmente, indicaremos la dirección de un script donde recoger y procesar la información pero también se puede indicar una dirección de correo de destino para que los datos se envíen mediante correo electrónico. Sólo recomiendo esta opción si no se dispone de otra forma de envío de datos porque el funcionamiento depende mucho de los programas con los que cuente el usuario en su máquina para enviar el correo.

Según el método de codificación de datos indicado en el atributo method, la información tendrá que ser decodificada de forma diferente en el lado del servidor porque se enviará de distinta forma desde el navegador cliente. Para simplificar esta cuestión, diré que el método post es algo más seguro y permite enviar más datos en la transacción.

Antes de terminar, quisiera comentar el uso del atributo title dentro de los campos para simular una sencilla ayuda contextual para rellenar el control.




<label for="email">Correo electrónico:</label> <input type="text" id="email" name="email" size="35" maxlength="35" value="" title="Se requiere una dirección de correo válida" />


Aunque su uso no es totalmente eficaz, pues sólo aparece si nos posicionamos sobre el control y no es un buen sistema para textos largos, sin embargo puede servir si el mensaje no es muy largo, además de ser una solución accesible para los programas lectores de pantalla.

Para una información más detallada sobre otros elementos que se pueden agregar en los formularios (como listas despleglables o casillas de verificación), recomiendo la lectura de los siguientes enlaces:



Bibliografía recomendada

sábado, 14 de abril de 2007

Pruebas de una web

Hay muchas formas de probar una página (o un sitio) web. Disponemos de validadores automáticos que nos pueden dar una primera valoración del trabajo realizado y que también ayudan durante el proceso de desarrollo, para saber si vamos por el buen camino:

Pero estos validadores automáticos tienen algunas carencias, que sólo se pueden cubrir con otra serie de pruebas (manualmente en muchos casos). Dependerá de factores como el público al que está orientado nuestro sitio web, el realizar todas o algunas de las siguientes pruebas.

Navegadores

Las páginas web pueden verse en diferentes en muy distintos navegadores y en muchas posibles configuraciones. Como mínimo, será necesario probar en este subconjunto de navegadores:
Firefox
Este primer lugar en la lista no es por casualidad. Es un navegador en constante desarrollo, con un buen nivel de seguimiento de los estándares y que cuenta con una serie de herramientas (extensiones) que facilitan la realización de una página web.
MSIE
Es el más usado y con el que más cuidado habrá que tener, ya que sus diferentes versiones (5.5, 6.0, 7.0 entre otras) son muy diferentes entre sí. Dependerá de nuestro público objetivo el soportar más o menos versiones de este navegador. Seguramente, deberemos saltarnos algún estándar (CSS sobre todo) para adecuar nuestro trabajo a las particularidades de este cliente web. Esta es una de las razones por las que un validador automático no siempre es una buena medida de la situación.
Opera
Tiene menos seguidores que Firefox, pero tiene una mejor implantación de los estándares. Además, su versión para dispositivos móviles puede extenderse casi tanto como MSIE en los próximos años.
Safari
Es un navegador específico para Mac OS X. Esta en esta lista por 2 razones: porque cubre una parte importante de los usuarios de esta plataforma y (una razón más técnica) porque utiliza internamente otro motor de renderizado de páginas distinto de los anteriores, que también deberemos tener en cuenta (diferente motor => distintas reglas que pueden tener bugs y que tendremos que solventar).
Lynx
Es la nota exótica de esta lista. Pero no por ser exótica, está de más saltársela. Aunque su uso está relegado a unos cuantos geeks de sistemas Unix y Linux, tiene poderosas razones (prácticas) para estar aquí: nos da una buena aproximación a cómo se ve nuestra página en ausencia de CSS, imágenes, JavaScript y nos permite probar la navegación sin ratón entre los contenidos del sitio web.

Todas estas pruebas se pueden simular por separado con otras herramientas, pero con este navegador de sólo texto podemos llevar a cabo estas pruebas de una sóla tacada. Si no podemos acceder a una versión de este programa (y eso que la hay hasta para Windows), siempre podemos tener acceso a una simulación online.

Configuraciones de navegadores

Según la plataforma que utilice el usuario, el abanico de posibilidades de configuración de un mismo navegador puede ser extenso. Ante todo, para valorar el resultado de las siguientes pruebas, hay que ver si nuestra página se degrada elegantemente (graceful degradation). Es decir, como reacciona la página ante la pérdida de funcionalidad.
Sin imágenes
Si el cliente no dispone de una conexión rápida, puede que tenga desactivada la descarga de imágenes. Si es así, el contenido de nuestra página deber seguir siendo legible. Es una buena prueba para ver cómo se adaptan los textos alternativos de los elementos gráficos dentro del resto del contenido escrito.
Sin JavaScript
No es una situación tan extraña si recordamos que muchas personas, en su trabajo, por cuestiones de seguridad (que no pueden cambiar), tienen deshabilitado el soporte de JavaScript en sus navegadores. Así pues, ante esta circunstancia, la página debe seguir operativa, prescindiendo de la funcionalidad añadida que le daba JavaScript).

Esto, aunque ideal, no siempre puede cumplirse (sobre todo, en aplicaciones web). Por ello, al menos, se deberá mostrar un mensaje aclarando por qué la página no puede funcionar.
Sin cookies
Por las mismas razones que el apartado anterior, el soporte de cookies, por motivos de seguridad, no siempre está garantizado. Cómo reaccionar ante esto, dependerá del contexto de nuestro sitio web.
Sin plugin de Flash
Si gran parte de nuestro contenido se basa en el uso de Flash, puede que estemos en un grave problema si nuestros usuarios, o bien no tienen el plugin, o bien no tienen la versión adecuada. Habrá que verificar como de legible es nuestro contenido ante la ausencia de Flash.
Sin CSS
Aunque hoy en día esta circunstancia ya no es muy frecuente (hay muy pocas personas que todavía utilicen navegadores antiguos sin soporte para CSS), sí que es útil probar a leer y a navegar por el contenido sin estilo. De esta forma veremos si hemos utilizado correctamente los elementos HTML a la hora de construir la página (los encabezados, las listas, si no hemos utilizado tablas para maquetar, etc.).

Configuraciones de pantalla

Si diversos son los navegadores que nos pueden visitar, también son diferentes las propiedades de los monitores que usarán los visitantes.
Resolución
¿Qué resoluciones deberemos soportar: 800x600, 1024x768, 1280x1024, 1600x1200, ...? Y la lista sigue y sigue. Pero la respuesta es simple y a la vez complicada de resolver: todas ellas. O bien nuestra plantilla es lo suficientemente fluída como para adaptarse a las distintas resoluciones o bien cambiamos la plantilla dependiendo de la resolución (esto se puede hacer mediante JavaScript).

Sinceramente, creo que lo mejor y más pragmático es lo primero: hacer un diseño fluído que se adapte lo mejor posible a todas las resoluciones posibles. Con las demasiado pequeñas o las demasiado grandes tal vez el resultado no sea el más adecuado, pero para el resto de rangos, será óptimo (pero si no lo probamos, no lo sabremos).
Colores
Si difícil es hacer un diseño (en cuanto a disposición de los elementos), más difícil es aún conseguir una buena paleta de colores para ese diseño. Una buena paleta que consiga un buen contraste entre fondo y texto y que diferencie de un vistazo distintos elementos.

Una buena prueba para probar un contraste adecuado, es poner en escala de grises la página. Esto podemos conseguirlo cambiando nuestra configuración de escritorio o utilizando esta herramienta online para simular defectos de visión. Nos dará una buena medida de la accesibilidad de nuestra página (pensando en usuarios con problemas en la visión y para evitar que nuestros visitantes tengan estos problemas de visión).

También podemos hacer pruebas de otros problemas de visión (como el daltonismo), a través del servicio online de Vischeck.

Probar la página a 256 colores, hoy en día, no creo que sea necesario. Al igual que el número de usuarios con navegadores del siglo pasado, el número con configuraciones tan restrictivas, es muy pequeño. A no ser que sepamos, a ciencia cierta, que alguno de nuestros potenciales clientes pertenece a este reducido grupo, podemos prescindir de esta prueba.

Formato de impresión

¿Qué tal se imprimen nuestros contenidos? Aunque es más ecológico (y algunas veces más cómodo) guardar en formato electrónico una página web, en ocasiones, es interesante imprimir algunas páginas, o exportar a PDF.

Hay unas cuantas recomendaciones que conviene seguir para conseguir un buen formato de impresión, pero todas tienen un denominador común: la simplicidad. Se deberá prescindir de todos los elementos del diseño que no aporten nada al contenido principal de la página.

Sistemas operativos

Para cuidar el diseño de la página, habrá que elegir un conjunto de fuentes de letras adecuadas a los distintos sistemas operativos, porque no todas están en todos ellos. Habrá que probar estas elecciones en cada uno de los sistemas que hayamos optado por hacer nuestro desarrollo. Una forma de ahorrar en máquinas físicas (hardware), es hacer uso de máquinas virtuales.

Cada sistema operativo tiene sus propias herramientas de virtualización:

Otro aspecto a tener en cuenta en las diferentes plataformas, serán los plugins que tengan unas y otras. No todas soportan el uso de ActiveX (por ejemplo), o no todas poseen las mismas versiones de los plugins (como el de Flash).

Redes lentas

Puede que hayamos hecho un sitio demasiado recargado o que utilice demasiados ficheros. Una forma de probar si nuestro sitio es rápido (en cuanto a velocidad de descarga), es probándolo en una red lenta. Esto se puede conseguir utilizando un módem o un programa limitador de la red, como NetLimiter.

Dispositivos móviles

¿Está nuestra página preparada para ser vista desde un móvil? ¿Tiene que estarlo? La respuesta a estas preguntas, es un rotundo . Las ciencias adelantan que es una barbaridad y seguramente, dentro de poco tiempo (si no es ya mismo), la gran mayoría de nuestros visitantes lo harán a través de alguna clase de dispositivo móvil.

Debemos preparar nuestro sitio web para esta circunstancia y deberemos probarlo. La opción más económica es hacerlo a través de emuladores de dispositivos móviles. Cada fabricante suele tener disponibles en su web unos cuantos de los modelos que va sacando al mercado.

Lectores de pantalla

Otra forma de probar la accesibilidad de una página web, es leerla tal y como la leería un lector de pantalla para un usuario invidente.

Como estos dispositivos suelen ser bastante caros (como Jaws), la mejor forma de hacer nuestras pruebas será, una vez, a través de emuladores.

Uno de ellos se llama Fangs y es una extensión para Firefox.