Archivo para marzo de 2008

Se me olvidó…

Vaya, con eso de que tengo un poco olvidado esto (ya estoy recuperándome) debido a cuestiones del mundo real, se me olvidó que el 15 de febrero pasado fue ¡¡mi segundo cumpleaños bloggero!!

Como pasa el tiempo…

Bueno, el caso es que, como he dicho, esto está un poco olvidado. Sólo hay que ver el número de entradas de los meses anteriores. Y, como casi siempre, es por la falta de tiempo. Que ahora sigo sin tener, pero que, por lo menos, el poco que me queda, voy a dedicarlo a seguir como al principio: poner más de mis proyectos, más cosas de informática y alguna que otra opinión. Y bueno, de todo un poco, que para eso es un blog.

A ver si el año que viene no se me olvida y lo celebro en condiciones.

Porque tenemos derecho

Nada es sagrado. Todo el mundo tiene derecho a criticar, a burlarse, a ridiculizar todas las religiones, todas las ideología, todos los sistemas conceptuales, todos los pensamientos. Tenemos derecho a poner a parir a todos los dioses, mesías, profetas, papas, popes, rabinos, imanes, bonzos, pastores, gurús, así como a los jefes de Estado, los reyes, los caudillos de todo tipo…

Raoul Vaneigem, escritor y filósofo belga.

Visto en Ecos del futuro y sacado de un interesante artículo de Savater en El País.

Reactivar modo DMA del disco duro si no quiere volver del modo PIO

Ya van dos veces que me sucede en Windows XP que, debido a un error de software (alguna instalación, algún driver,…), la configuración DMA de alguno de los discos duros se vuelve a modo PIO y no hay forma de reactivarle el modo DMA.

Principalmente este error supone que todos los accesos al disco duro sean síncronos mediante PIO y el procesador esté ocupado pasando los datos del disco duro a la memoria no dejándote hacer nada más en la máquina, mientras que con DMA, el procesador envía una orden al procesador DMA indicándole los datos que hay que pasar del disco a la memoria y es este último el encargado de realizar tal acción dejando al procesador principal descargado para poder ejecutar otras instrucciones.

La vez anterior que esto me sucedió (ya hace años) no me quedó otra que reinstalar el sistema. Pero esta vez busqué un poco más (que también me costó encontrarlo, por cierto) y he encontrado la solución.

Una forma es hacerlo a mano: hay que resetear la configuración del registro donde está la configuración de los discos duros para que en el próximo reinicio del sistema, se vuelvan a configurar correctamente los discos duros.

Para hacer esto, hay que ir al registro de Windows:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}

Dentro, las claves 0001 y 0002 suelen indicar el canal IDE principal y el canal IDE secundario (aunque esto puede cambiar según ciertas configuraciones de hardware).

Una vez dentro del dispositivo que falla, hay que borrar la clave MasterIdDataChecksum o la SlaveIdDataChecksum dependiendo de donde esté enchufado el disco que falla. Se reinicia el sistema y Windows detectará de nuevo la configuración de DMA.

Yo lo he hecho y me ha funcionado. Pero, como bien sabéis, esto método no tiene garantía ninguna.

La segunda forma, mucho más sencilla, es usar un pequeño script en VBS que resetea los canales DMA de forma automática, sin que tengas que navegar por el registro.

También lo he probado y también funciona, pero, como siempre, úsalo bajo tu propia responsabilidad (luego no quiero lloriqueos).

Así que, a partir de ahora, para este molesto problemilla ya tenemos solución.

Alguien nos escucha lee

A parte de la pequeña falta de espacios entre palabras, parece que al menos los periódicos sí que nos leen (a todos los bloggers que nos hemos hecho eco de la noticia de antes de ayer) y rectifican:

Ahora sólo falta que nos lean los responsables de esos maravillosos sueldos a ver si les entra en la cabeza…

Ale, a hacer más ruido.

Haiku ya tiene LiveCD

Parece que las buenas noticias vienen de dos en dos porque Haiku, del que hablábamos hace un par de días, ya tiene LiveCD.

Y como no, lo primero que he hecho ha sido tostarlo y probarlo en alguna de mis máquinas:

Logotipo de Haiku en mi ordenador portátil.

El problema es que según estaba arrancando…

Haiku arrancando en mi portátil.

…ha saltado la KDL dándonos la bienvenida:

Mensaje de bienvenida de la KDL (Kernel Debugging Land) de Haiku.

Pero esto no es una mala noticia, todo lo contrario, esto avanza.

Y no sólo tenemos el LiveCD sino que además se ha puesto de nuevo online el BeBook y las BeNewsletters, que principalmente es la documentación de la maravillosa API de BeOS y todos los artículos que Be Inc. ha escrito sobre él.

Qué bien que siguen las buenas noticias…

Actualización: Parece que según una discusión con desarrolladores, se ha quitado el CD de la página. A ver si lo vuelven a poner pronto, aunque yo, por suerte, ya lo había bajado y probado :P .

Baja el petróleo, las gasolinas no

Los barriles de petróleo son como las carracas de las eslingas, suben pero las gasolinas nunca bajan.Parece que por la incertidumbre económica en EE.UU. baja el petróleo. Pero yo no he visto que llenar el depósito de mi coche me cueste menos. ¿Para dónde va todo ese dinero? ¿Para el Estado o para el bolsillo de algún listo?

Esto de la relación de la subida del petróleo y las gasolinas es como la carraca de una eslinga, sólo va en un sentido. A ver si con un poco de suerte (digamos «energías renovables»), alguien le da al restorte para que se suelte la carraca.

Estadísticas y minifaldas

Las estadísticas son como las minifaldas: te dan algunas ideas pero esconden lo más importante.

Leído hace tiempo no-se-donde y luego buscando por «estadísticas+minifalda» apareció.
Esta cita es de Ebbe Skovdahl, entrenador de fútbol noruego.

Guardando datos en aplicaciones Web

Hoy toca un poco de desarrollo web, y como ejemplo voy a poner un listado (de lo que queráis) en una tabla con varias columnas y ordenable tomando como criterio cada una de ellas. Además, se pueden filtrar los datos de esta tabla.

La ordenación y las búsquedas no me preocupan. Para la ordenación se puede hacer bien en el cliente por JavaScript (con el problema de la paginación) o bien en el servidor (con tu lenguaje de progarmación favorito – en mi caso el PHP, que no es que sea mi favorito, es que es en el que programo). Para las búsquedas en el servidor (de momento nada de AJAX).

Mi duda es ¿dónde guardo los criterios de ordenación y búsqueda?, es decir ¿dónde guardo la columna por la que se ordena y si es orden ascendente o descendente y los valores de los campos de búsqueda para que entre cambios de página mantenga dicho orden y filtro?

Así, a priori, veo cuatro lugares donde guardarlo:

  • La URL: Añadir variables a la URL con la columna ordenada, si el orden es ascendente o descendente, y también añadir una variable por cada campo de búsqueda con su correspondiente valor. Este tiene el pequeño problema de que las URL crecen y crecen y, si usamos mod_rewrite de Apache (reescritura de URL’s) pues se vuelve un poco difícil de tratar.
  • En la cookie: Guardando en la cookie del navegador (o en varias cookies) todos los criterios de búsqueda y ordenación y cargarlos según la ventana que se cargue y guardarlos cada vez que haya una búsqueda u ordenación. El problema es que las cookies están limitadas (al menos en IE) y si se tiene una aplicación muy grande con varias personas trabajando sin que se preocupen los unos por las cookies de los otros, se pueden llegar a terminar y ya no funcionaría nuestro sistema.
  • En la sesión: Igual que en las cookies, se pueden guardar datos en la sesión con lo que los datos viajarán del cliente al servidor y viceversa contínuamente. El problema es que puede haber aplicaciones que no usen sesiones. Además, PHP no recomienda que guardes grandes cantidades de datos y el id de sesión también se propaga en una cookie o en la URL.
  • En la base de datos: En caso de que haya un usuario conectado al sistema y se mantengan los accesos por usuario (que viene siendo normal en aplicaciones web), se pueden guardar los criterios de ordenación y búsqueda en la base de datos, en el registro asociado a los datos del usuario actual. Esta quizás sea la mejor opción, ya que se puede guardar cualquier cantidad de datos, no hay URL grandes y sólo usa cookies para propagar el id de sesión. El problema es que quizás se sobrecargue más la base de datos (aunque ya está bastante cargada ahora :) ).

Probablemente en la próxima aplicación grande que desarrolle lo guarde en la base de datos (en la actual está en la URL y es bastante chungo gestionarlo sin una clase URL que lo gesione automáticamente).

El problema es que hay que gastar bastante tiempo en diseñar toda la arquitectura de seguridad, incluyendo usuarios y grupos, para poder tener un sistema robusto para guardar, no sólo esto, sino todos los datos asociados a los usuarios incluyendo la configuración y, sobre todo, los permisos.

De todas formas ¿alguien me recomienda otra solución? Yo siempre propongo muchas cosas, pero siempre estoy abierto a nuevas soluciones que, si son mejores que las mías (que suelen serlo), se adoptan sin problemas. Así que ya sabéis, a proponer.

¿Volvemos con lo mismo?

Pues sí, volvemos con lo mismo:

La falta de informáticos amenaza con dejar vacantes 900 empleos del sector tecnológico.
Las empresas asturianas prevén graves dificultades para cubrir sus expectativas de trabajo para los próximos 2 años.

Lo vuelvo a repetir porque esto es muy sencillo:

Pagad los sueldos de los ingenieros informáticos y veréis como lo que sobran son profesionales que quieran trabajar.

Todavía más friki (aunque pensaba que no podía serlo): «el javascripy»

Desde El Pito Doble (gracias Carlos por el aviso) veo la canción de Eurovisión con su nueva letra (¿es oficial? ¿ya es oficial? ¿sí? ¿en serio? …), al estilo del más friki de los informáticos:

¡¡¡Teclea, teclea!!!

El javascripy mola mogollón,
funciona en explorer y también en firefox.

Ponle javascripy a esa paginita,
que el javascripy la deja muy bonita.

Abre ventanas,
muestra mensajes,
valida formularios,
mi amol ya tu sabes!

Programan los seniors,
Programan los juniors,
Programa mi jefe con acentos en el function!

Y el javascripy se programa asi:
1 – el tag <script>
2 – el function vars
3 – el alert-confirm
4 – el return trú

Programa el javascripy,
Programa el javascripy,
programan los heavys también los frikis

Programan en la offis, programan en la uni,
Programan los fruittis y también los lunnis.

Programa Maradona esnifando una raya,
y Juan Carlos le dice: ¿Porque no usas ajax?

En el formulario de un triste portal,
pusieron javascripy y ya pudo validar

¡¡¡Validar!! ¡¡Validar, validarr, validarrr!!!

Y el javascripy se programa asi:
1 – el tag <script>
2 – el function vars
3 – el alert-confirm
4 – el return trú

¡¡Lo que me he podido reír con esto!!

Sus inventores: Xavier Carné & Alex García.

Por si alguien todavía no lo ha visto (¿en serio que todavía queda alguien?) aquí está el vídeo oficial con la nueva letra y la letra en varios idiomas.

Avances en el desarrollo de Haiku

Ya se empiezan a notar de forma periódica los avances que se van realizando sobre el sistema operativo basado en BeOS, Haiku. Y uno de ellos es su pantalla de inicio animada (al estilo de los sistemas operativos modernos, no íbamos a ser menos):

Pantalla de inicio del sistema operativo, basado en BeOS, Haiku

Pero claro, ahora se nos puede criticar porque hasta ahora no habíamos tenido una pantalla de inicio en condiciones… pero siempre hay que recordar que BeOS sí que tuvo una pantalla de inicio en condiciones cuando salió:

Pantalla de inicio del sistema operativo BeOS 5

El caso es que, después de este pequeño avance (sobre todo por cuestiones de marketing), hay que decir que esto parece que avanza de verdad. Sobre todo porque, por segundo año consecutivo, Haiku ha entrado en el Google Summer of Code, un evento donde se premia a estudiantes que realicen proyectos de software libre.

A ver si con un poco de suerte, Google se da cuenta de que Haiku es el mejor sistema operativo ever made (ya lo era BeOS) y le da un pequeño empujoncito.

TFileSystemWatcher

Hacía ya bastante tiempo que no programaba por placer, principalmente por la falta de eso mismo, de tiempo libre.

Pero hace poco, revisando lo que tenían por el disco duro, me encontré con una aplicación que había desarrollado hacía bastante y decidí que era un buen momento para retomar su desarrollo.

Esta aplicación está hecha en mi querido Delphi (¡lo que he aprendido yo gracias a él!) para plataformas Windows (creo que vale cualquiera aunque lo he probado en Windows XP) y lo que muestra son todos los cambios que se producen en los archivos de nuestro sistema de archivos indicando si lo que ha cambiado es un archivo o un directorio, el tipo de cambio (adición, modificación, borrado o renombrado) y la ruta donde se ha producido el cambio.

Pero en realidad esta aplicación patata es el test que sirve para desarrollar una clase de Delphi que monitoriza los cambios que se producen en la ruta indicada de nuestro sistema de archivos: TFileSystemWatcher.

File System Watcher en ejecución mostrando los cambios en el sistema de archivos

Como Delphi es un lenguaje de programación dirigida por eventos, cada vez que se produce un cambio en nuestros archivos o directorios, nuestra maravillosa clase, una vez arrancada, generará dos eventos: uno muy genérico dando información de qué ha pasado y otro más específico para poder realizar acciones propias de los cambios que queremos monitorizar.

Si se quiere ver como es por dentro la clase y los eventos que genera, se puede echar un vistazo a continuación:

{**
* @author Diego Lago <beosman@gmail.com>
* @version 0.1 20080318
* @license Creative Commons 2.5 – Reconocimiento – Compartir Igual
*
* @class TFileSystemWatcher
*
* Esta clase hereda de TThread y sirve para monitorizar los cambios en el sistema de
* archivos dada una ruta.
*
* Se pueden instanciar cuantas veces se quiera para monitorizar cualquier directorio.
* Los cambios que se pueden monitorizar son adiciones, borrados, modificaciones y
* renombraciones de archivos y directorios.
*
* Para cada acción se genera un evento genérico que siempre que hay una acción se activa,
* pero también hay eventos más específicos que se activan según el tipo de acción que
* ha ocurrido y según el tipo de archivo (si es archivo o directorio).
*
*}

type

{**
* Tipo de entrada, archivo o directorio, para el evento principal.
*}

TEntryType = (etDirectory,etFile);

{**
* Tipo de acción que se produce sobre el sistema de archivos.
*}

TFileSystemAction = (fsaNoAction,
fsaFileAdded,
fsaFileRemoved,
fsaFileModified,
fsaFileRenamedOldName,
fsaFileRenamedNewName);

{**
* Tipos de eventos producidos por esta clase.
*
* TFileSystemaChangeEvent: Evento genérico. Se produce siempre que hay un cambio en
* el sistema de archivos.
* TFileChangeEvent: Tipo de evento más específico. Se produce cuando hay un cambio en
* archivos o directorios de añadir, borrar y modificar.
* TFileRenamedEvent: Tipo de evento que se produce cuando se renombra un archivo o un
* directorio.
*
* Para más información ver los eventos declarados en la clase.
*}

TFileSystemChangeEvent = procedure(Sender: TObject; EntryType: TEntryType; Path: string; Action: TFileSystemAction) of object;
TFileChangeEvent = procedure(Sender: TObject; FilePath: string) of object;
TFileRenamedEvent = procedure(Sender: TObject; FileOldPath: string; FileNewPath: string) of object;

TFileSystemWatcher = class(TThread)
private

[...]

protected
procedure Execute(); override;

public
{**
* Constructor de la clase.
* @param string FileSystemEntryName Nombre del directorio a monitorizar.
* @param Boolean WatchSubTree Monitorizar también los subdirectorios.
*}

constructor Create(FileSystemEntryName: string; WatchSubTree: Boolean = True);
destructor Destroy(); reintroduce;

procedure Free();

{**
* Inicia la monitorización en un hilo separado.
*}

procedure Start();

{**
* Para la monitorización del directorio.
*}

procedure Stop();

{**
* @property string WatchedPath Directorio que se está monitorizando. Cada
* vez que se cambia se resetean todos los contadores, se para el hilo de ejecución
* y se vuelve a iniciar en caso de que estuviese activo.
*}

property WatchedPath: string read fFileSystemEntryName write setFileSystemEntryName;

property WatchSubtree: Boolean read fWatchSubtree write setWatchSubtree;

{**
* @property Cardinal ChangesCount Número de cambios en el sistema de archivos.
*}

property ChangesCount: Cardinal read fChangesCount;

{**
* @property TDateTime Fecha y hora del último cambio en el sistema de archivos.
*}

property LastChangeAt: TDateTime read fLastChangeAt;

{**
* @event TFileSystemChangeEvent OnFileSystemChange Evento que se produce cada
* vez que hay un cambio en el sistema de archivos.
*}

property OnFileSystemChange: TFileSystemChangeEvent read fFileSystemChangeEvent write fFileSystemChangeEvent;

{**
* Eventos que se producen cada vez que hay un cambio en el sistema de archivos
* sólo para archivos (no para directorios):
*
* @event TFileChangeEvent OnFileAdded Se lanza cuando se añade un archivo.
* @event TFileChangeEvent OnFileRemoved Se lanza cuando se borra un archivo.
* @event TFileChangeEvent OnFileModified Se lanza cuando se modifica un archivo.
* @event TFileRenamedEvent OnFileRenamed Se lanza cuando se renombra un archivo.
*}

property OnFileAdded: TFileChangeEvent read fFileAddedEvent write fFileAddedEvent;
property OnFileRemoved: TFileChangeEvent read fFileRemovedEvent write fFileRemovedEvent;
property OnFileModified: TFileChangeEvent read fFileModifiedEvent write fFileModifiedEvent;
property OnFileRenamed: TFileRenamedEvent read fFileRenamedEvent write fFileRenamedEvent;

{**
* Eventos que se producen cada vez que hay un cambio en el sistema de archivos
* sólo para directorios (no para archivos):
*
* @event TFileChangeEvent OnDirectoryAdded Se lanza cuando se añade un directorio.
* @event TFileChangeEvent OnDirectoryRemoved Se lanza cuando se borra un directorio.
* @event TFileChangeEvent OnDirectoryModified Se lanza cuando se modifica un directorio.
* @event TFileRenamedEvent OnDirectoryRenamed Se lanza cuando se renombra un directorio.
*}

property OnDirectoryAdded: TFileChangeEvent read fDirectoryAddedEvent write fDirectoryAddedEvent;
property OnDirectoryRemoved: TFileChangeEvent read fDirectoryRemovedEvent write fDirectoryRemovedEvent;
property OnDirectoryModified: TFileChangeEvent read fDirectoryModifiedEvent write fDirectoryModifiedEvent;
property OnDirectoryRenamed: TFileRenamedEvent read fDirectoryRenamedEvent write fDirectoryRenamedEvent;

end;

Como os habréis dado cuenta, este código está incompleto, faltan los datos privados, así que no copiéis y peguéis directamente. Lo mejor es bajarse el código fuente y la aplicación de ejemplo:

Descargar TFileSystemWatcher

Lo interesante de esta aplicación es que se puede sacar la clase TFileSystemWatcher del archivo FileSystemWatcher.pas y se puede incluir en cualquier proyecto que requiera monitorizar una o varias zonas del sistema de archivos. Por ejemplo, para hacer un buscador un poco más eficiente que el que trae el Windows.

La licencia de este software es Creative Commons 2.5 Reconocimiento – Compartir igual, así que esta clase se puede utilizar para lo que más os guste sin restricciones. Quizás en próximas versiones me pase a la GPL aunque todavía no la he estudiado lo suficiente (¿cuál es mejor, esta o la GPL?).

Y eso es todo, por el momento. Ahora intentaré continuar con otro proyecto que tengo en mente haciendo uso de esta clase (pues sí, ese buscador más eficiente que el que trae Windows al estilo Google Desktop… si, venga, vale, ya lo han hecho y funciona bien. Pero yo lo hago por aprender).

Y vosotros, si queréis, podéis probar el aparatín y me contáis ;) .

Dividiendo el mundo

El mundo se divide en dos clases de personas: los que dividen el mundo en dos clases de personas y los que no.

Parodiando a las innumerables divisiones del mundo en dos.

Oficinas de los grandes y de los no tan grandes

Ya van dos artículos que veo en Menéame acerca de las oficinas de las grandes empresas, en este caso Google, y de las no tan grandes, las startups españolas.

De Google… bueno, mejor verlo. Pero las que más me han gustado son estas:

Oficina de Google España
Oficina de Google España donde los trabajadores tiene «bastantes» recursos a disposición. Lo mejor, esas dos pedazo de pantallas y las pizarras del fondo (no sabéis lo útiles que son cuando trabajas con gente).

Área de descanso de la oficina de Google España
Área de descanso de la oficina de Google España donde hay peceras para relajarse. ¡Mmm! Cómo me gustan las peceras…

Esto, más que unas oficinas, en realidad parece un salón de descanso. Pero estoy seguro de que el rendimiento de sus trabajadores supera, y con creces, a cualquier otra empresa con unas oficinas más normalitas. Bueno, que lo supera se ve todos los días.

Y parece que las startups españolas toman buena nota de todo esto y también crean buenos ambientes de trabajo para sus empleados.

Entre las que más me han gustado están las de Genoom, por sus amplísimos ventanales y amplitud también en sus espacios, la de Salir.com porque, aunque parezca un agobio (que a veces lo es), se agradece tener a gente a tu alrededor para poder compartir opiniones en cuanto al trabajo; además, nunca te faltará gente para tomar café ;) , y la de 11870, por esos grandes espacios donde nunca te agobias (bueno, esto de que nunca te agobias es un decir, jejeje…).

Oficinas de la empresa 11870.
Oficina de la empresa 11870 amplia… muy amplia…

Además de que 11870 es una buena red social sobre lugares y servicios, en ella está trabajando un excompañero de trabajo. Vamos, el compañero que me inició y me enseñó bastante de esto del desarrollo Web (me enseño muchísimo para el poco tiempo que tuvimos) y que hizo que ahora sea tan tiquismiquis con los estándares y la usabilidad. Muchas gracias. Y seguro que sabes quién eres, además te reconocerás en estas fotos (que me ha costado verte):

Trabajadores de la empresa 11870 Trabajadores de la empresa 11870

Ahora, a ver si conseguimos que nuestro lugar de trabajo se parezca más a todo esto…

Corrección: Las dos últimas fotos no son de las oficinas de 11870 (aunque bien lo parecen) sino que son del piso de uno de sus trabajadores en una fiesta. Pero claro, ahí es donde sí que está mi compañero… de todas formas, si tienen derechos o el dueño no quiere que estén aquí (las encontré en Flickr) pues sólo tiene que decírmelo.

«Yes/No God»

Esto es de lo mío… YesNoGod, una encuesta que dice ser a nivel mundial para saber por países si se cree en Dios o no…

De momento, en España:

Creencia en Dios (España)
28%
No 72%

Y en el mundo:

Creencia en Dios (Mundial)
44%
No 56%

Lo más divertido, sin duda, es ver la proporción por países, aunque en algunos de ellos la muestra no es significativa (ha votado uno sólo).

Pero también me llama la atención otra cosa: En Estados Unidos alrededor del 80% de la población tiene creencias religiosas mientras que en esta encuesta sólo el 47% (con 6238 votos en total) marca el “sí”.

¿Y esto será que las estadísticas están mal? ¿O será que los internautas somos más ateos? ¿O por que la gente está pensando por sí misma?

En cualquier caso habrá que estar atentos a ver como evoluciona esto y si se puede sacar algún «estudio medianamente fiable», no sólo mis queridas críticas a todas las religiones.

Diseño Web efectivo

Volviendo al tema de los estándares y de la accesibilidad iniciado hace un par de días, veo en Estándares y Accesibilidad otro artículo donde se detallan 10 principio para un diseño Web efectivo.

Todos ellos son perfectamente válidos. De hecho, se deberían aplicar tanto en las páginas Web como en las aplicaciones Web, sobre todo el de la simplicidad, vamos, la metodología KISS (sí, con dos eses).

Pero el que más me ha llamado la atención, porque no se ve en demasiados sitios que hablan de usabilidad, es el de los espacios en blanco:

7. No le tengas miedo al espacio en blanco

Actualmente es difícil valorar la importancia de los espacios en blanco. No sólo ayudan a reducir la carga cognoscitiva, sino que también mejoran la percepción de la información. Cuando un visitante llega a una página lo primero que intenta hacer es examinar la página y dividirla en secciones y los espacios en blanco son esenciales en esta tarea.

Las estructuras complejas son más difíciles de leer, examinar, analizar y de trabajar con ellas. Las estructuras jerárquicas reducen la complejidad (Ley de Simon): entre mejor logres que tus usuarios encuentren un sentido de jerarquía, tu contenido será más fácilmente percibido.

Eso sí, cuando llegéis al final veréis la gracieta: «Prueba temprano, prueba a menudo: Este principio conocido como TETO (Test early, test often)…». Vamos, será que yo tengo la mente sucia, pero esto me suena a un juego muy divertido…

Aunque es cierto que se debería aplicar a todo proyecto probando y probando en todas sus fases y por todos los usuarios posibles. La verdad es que se intenta, pero no todos los usuarios quieren ser conejillos de indias ;) .