Autor: Valentín Barros Puertas

Historial de cambios:

8.6.9 [05/02/13 01:46]

He añadido botones de Flattr en los artículos —incluído el feed RSS.

8.6.8 [03/06/12 17:38]

Además de solucionar un par de errores sin importancia en las categorías de fotos, esta actualización añade ciertas mejoras relativas al formato del feed RSS del blog:

  • Ahora aparece el autor de cada post.
  • Los correos del administrador y editor aparecen también con el nombre.
  • El archivo generado se envía con la cabecera Content-type: application/rss+xml.
  • Añadida la etiqueta atom:link con la dirección del feed.

Y ahora además del feed general con los artículos del blog, se puede obtener un feed por cada etiqueta —basta con añadir a la URL /blog/RSS/ el nombre de la etiqueta. Por ejemplo para la etiqueta Google Summer of Code sería /blog/RSS/Google Summer of Code/.

8.6.7 [29/05/12 11:19]

Varios cambios hechos durante más de un año. Poco significativos a nivel de interfaz, desde luego, solo han sido pruebas para ir viendo cosas que me interesaban en su momento.

En resumen: Adaptaciones al framework que utiliza la web, el cual ya hace muchísimo que tiene su desarrollo congelado, pero durante el último año alguna cosilla he cambiado. También se han hecho un montón de refactorizaciones inconclusas —para adaptarse un poco al patrón MVC, aunque la verdad es que la web ahora mismo internamente creo que está hecha un asco—, y algunas correcciones de errores y tal.

8.6.6 [21/10/10 10:43]

Se han vuelto a introducir mejoras en el tratamiento de la codificación de los nombres de las fotos y sus carpetas contenedoras, ya que seguían produciéndose errores cuando la carpeta tenía una codificación y alguna de las imágenes que contenía tenía otra. Se han mejorado las comprobaciones en el script getThumbs.php y se ha introducido un nuevo script, getPhoto.php, para acceder a una foto —para evitar el acceso mediante la URI de la misma, la cual siempre está codificada como UTF-8. Ahora debería ser posible que se junten carpetas y archivos con diferentes codificaciones (UTF-8 o ASCII) sin problemas —realmente toda la información de la web está en UTF-8, pero quedan cientos de fotos antiguas con sus nombres de archivo codificados con ASCII, por subirlos desde programas de Windows, que creaban problemas.

8.6.5 [20/10/10 16:34]

El acceso a las categorías con muchas fotos era terríblemente lento —alrededor de un minuto de espera para entrar en At Night, con 1500 fotos. Esto ocurría porque la categoría de fotos se diseñó de tal forma que un script PHP generaba un archivo XML cada vez que alguien entraba en una categoría, con los datos de todas las fotos —nombre, fecha y dimensiones. Ahora estos datos hay que generarlos al subir fotos a la web, creando mediante un script PHP un archivo slots.xml en cada categoría de fotos, que es lo que utilizará la página para mostrar las fotos en las categorías (eliminando el uso de slots.php) y el visor (eliminando el uso de slots_old.php).

8.6.4 [07/10/10 14:17]

Debido a que las fotos están almacenadas utilizando solo el sistema de archivos del servidor, es decir, sin utilizar una base de datos con sus posibles atributos (cuando creé la sección de fotos, hace ya cosa de 4 años, no sabía utilizar ningún sistema gestor de bases de datos) las mismas se almacenan con su título, el cual claro está puede contener caracteres no-ASCII. Esto hace que dependiendo del tipo de configuración utilizada para los nombres de los archivos en el sistema del servidor se produjesen errores de codificación. Toda la web funcionaba, pero en el servidor local donde realizo las pruebas los títulos de las fotos se mostraban con errores de codificación, y debido a ello diferentes partes del código presentaban un aire de fragilidad que ya me tenía algo harto. Ahora la web está preparada para soportar ASCII o UTF-8 en la codificación de los archivos de fotos y en sus carpetas (categorías de fotos).

Continúa el desarrollo del framework, con las nuevas clases NavigationManager y NavigationLevel, con las cuales se ha integrado toda la web

NavigationManager y NavigationLevel

NavigationManager sirve de contenedor para objetos NavigationLevel, los cuales son simples objetos con una propiedad title. Estas dos clases en conjunto se utilizan para crear una secuencia añadiendo diferentes títulos según el usuario vaya desplazándose por los niveles de la aplicación. De esta forma luego en las plantillas se puede componer el título de la misma a través de la concatenación de estos objetos NavigationLevel —o cualquier otra operación. Esto tiene dos ventajas: No es necesario escribir el título de la aplicación (el title HTML) por todo el código (evitando la necesidad de cambiarlo por todo el código si debe ser cambiado) y actúa de envoltura fácilmente extensible para cuando sea necesario añadir nuevas funcionalidades —por ejemplo, se podría añadir a NavigationLevel una segunda propiedad, url, con las URLs correspondientes a cada nivel, de esta forma en las plantillas se podría crear una barra de navegación con la jerarquía de niveles hasta el actual, como se hace en muchas aplicaciones web.

8.6.3 [29/09/10 21:31]

Hasta ahora el visor de fotos se mostraba en su propia página, Visor.php, siendo un SWF a pantalla completa. Hace años, cuando el visor fue diseñado, al hacer click en una miniatura de una foto el mismo se abría en una ventana nueva, pero al adoptar el estándar XHTML este comportamiento se suprimió. De esta forma el visor se abriría en una ventana nueva sólo si el usuario lo especificaba —con el menú contextual del enlace, haciendo click central, etc. Esto generaba el problema de que era un incordio volver a la página web al entrar en el visor y ver varias fotos, ya que era necesario navegar por un montón de pasos en el historial del navegador mediante el botón Atrás. Ahora el visor se carga en una capa por delante del contenido normal de la web, mostrando un botón de cerrar en la esquina superior derecha que retiraría dicha capa. Además, ahora al hacer click con el botón central lo que se abre en una nueva ventana es la foto, no el visor —lo que también pasará si el sistema no tiene la versión 10 o superior de Flash instalada, es decir, ahora se pueden ver las fotos de la web sin necesidad de Flash, aunque de una forma un tanto tosca. También hace posible el descargar las fotos sin la dirección de la página impresa y sin recurrir a artimañas, para quien se de cuenta de este sencillo detalle.

  • También he aprovechado para refactorizar el archivo viewer.js y, lógicamente, el archivo viewer.css ha cambiado bastante, aunque lo cierto es que ahora ha quedado bastante más simple.

Continúa el desarrollo del framework, con la nueva clase Session, con la cual se ha integrado toda la web

Session

Es una simple envoltura para el sistema nativo de sesiones de PHP pero orientándolo a objetos y ofreciendo una forma fácil para ampliarlo o reemplazarlo de ser necesario por algún motivo.

Hereda de la clase Process para automatizar el envío de los datos de sesión a la vista de la aplicación.

  • Process se ha mejorado añadiendo el método getName —el cual se ha retirado de FormData, haciendo que todos los procesos deban tener un nombre— y los métodos getGlobalVars y setGlobalVars, los cuales sirven para obtener o definir la variable globalVars de los procesos. Esta variable indica si se deben definir las variables de un proceso de forma global en la vista (true) o como claves de un array, siendo el identificador del mismo el nombre del proceso (false, opción por defecto y lo que se hacía hasta ahora con el único proceso, FormData).
  • Implementado lo relativo a globalVars en Controller, el cual además gana un nuevo método, setSession, el cual además de indicar al controlador cual es su objeto Session comprueba si existe en el mismo la clave __refresh —la cual indicaría que la vista ya está calculada por una petición anterior que se ha recargado, en cuyo caso la imprimiría y saldría.
  • History se ha integrado con Session.
8.6.2 [21/09/10 16:21]

Se ha refactorizado buena parte del código de la web, entre otras cosas mejorando la legibilidad del mismo, corrigiendo pequeños errores e integrando partes viejas de la aplicación con el estilo general del flujo del código de la web. También se han traducido nombres de archivos/carpetas con errores o que aún estaban en español. Se han cambiado un par de tablas de las bases de datos, pero solo en los nombres de sus atributos —que han pasado de estar en español a inglés.

  • Mención especial a la integración de varias secciones viejas de código de la sección de fotos con el nuevo estilo de la web, incluído el uso de ficheros XML para sacar el código SQL de los archivos PHP, y el uso de DAO_PDO en lugar de las funciones de conexión con MySQL.
  • Se han borrado secciones de código viejas que no se utilizaban —funciones definidas pero que ya no se usaban, y paso de argumentos a la vista que luego no eran utilizados por esta.
  • El la última actualización los requisitos de versión del Flash Player para el widget del tiempo y el visor de fotos han pasado de la 8 a la 9 y 10, respectivamente. Pero mediante JavaScript se seguía comprobando como requisito para intentar instanciar el widget la versión 8. En esta actualización se ha corregido.
  • SWFObject actualizado de la versión 2.0 a la 2.2.

También se ha refactorizado el visor de fotos.

  • Se ha separado el archivo principal Visor.hx en múltiples ficheros, cada uno con solo una clase y los imports que le corresponden.
  • Se han cambiado algunos objetos Sprite por Shape.
  • Ya no se utiliza la clase Utils para comprobar el formato del e-mail, en su lugar se utiliza una expresión regular.
  • Se ha mejorado la forma de crear/eliminar comentarios en el visor, ya no se utilizan un par de vectores —uno con una clase destinada a almacenar los datos de un comentario y otro con otra con referencias a los objetos visuales que componen el comentario, para luego poder quitarlos— sino uno con todos los comentarios —ahora la clase Comment tiene los datos del comentario y es un Sprite que inserta en sí mismo los anteriores objetos visuales, de esta forma es mucho más simple su eliminación.
  • Traducción de todos los identificadores al inglés.
  • Se han realizado pequeñas mejoras, por ejemplo eliminando funciones no utilizadas.
8.6.1 [09/09/10 12:30]
  • Widget del tiempo traducido de AS2 a HaXe. Su apariencia y funcionalidad sigue siendo exactamente la misma.
  • Visor de fotos traducido de AS2 a HaXe. Con el cambio se han corregido varios errores —y se ha introducido alguno nuevo. La apariencia de la aplicación, eso sí, es exactamente la misma.

    Errores corregidos:

    Extraño fallo a causa de un elemento dibujado fuera de los límites del Flash Player. Ocurría muy rara vez.

    En Opera, algunas veces los elementos del visor se descuadraban completame al pasar una foto.

    Errores introducidos:

    En Opera no se cargan los tiradores entre las miniaturas de la barra de miniaturas, por lo que no puede moverse manualmente.

    El archivo SWF pasa de ocupar 41.4KB a 426.7KB. Esto se debe a que al traducir a HaXe el componente checkbox del formulario de escribir un comentario ha pasado de ser un componente de Flex a ser un componente de la biblioteca AsWing y, como HaXe aún no puede importar solo los elementos que se usan de un SWC a la hora de compilar, es necesario enlazar el SWF (correspondiente a la biblioteca SWC de AsWing) entero, aunque solo se utilice un checkbox. He decidido dejarlo así porque creo que con la velocidad de las conexiones actuales y el poco uso que se le da a sanva.net, no será un gran problema.

  • Añadidos poco importantes y pequeños errores corregidos en DAO, DAO_PDO, FormData y View.
8.6.0 [07/07/10 13:00]

Continúa la evolución del framework iniciado con la actualización 8.5.0:

DAO y DAO_PDO

DAO es la clase abstracta de la cual deben heredar las distintas clases candidatas a ocupar el puesto de capa de persistencia en una aplicación. Todas esas clases deben ser intercambiables.

DAO_PDO es la primera clase que hereda de DAO, utilizando PDO para manejar la conexión con distintos gestores de bases de datos.

Aún siendo lo más simple del mundo, la utilización de este sistema de abstracción a la capa de persistencia tiene las siguientes ventajas:

  • Permite unificar en un mismo lugar del código las funciones de persistencia, permitiendo por ejemplo cambiar fácilmente el sistema gestor de bases de datos utilizado —o incluso pasar a no utilizar un gestor de bases de datos e implementar una capa de persistencia basada en ficheros XML, por poner un ejemplo.
  • Facilita el mantenimiento del código.
  • Permite crear una capa de abstracción más entre DAO y las funciones de conexión a la base de datos —e. g. DAO_PDO utiliza PDO (capa de abstracción a la base de datos que soporta múltiples sistemas gestores de bases de datos), y sería fácil crear una nueva DAO_MDB2 (por ejemplo) que utilizase internamente MDB2 (por no estar disponible PDO por alguna razón) pero con la misma interfaz que DAO_PDO, siendo ambas intercambiables.
  • Mantener el código PHP libre de código SQL, ya que DAO utiliza ficheros XML externos con una estructura específica conteniendo las sentencias SQL y sus parámetros, las cuales son llamadas a través del código PHP mediante un string con su nombre pasado como argumento a los métodos read o write de un objeto de una subclase de DAO. Dichos parámetros deberán ser tratados automáticamente por las subclases de DAO para evitar problemas con la base de datos —e. g. un entero deberá ser efectivamente un entero, una cadena deberá escaparse para evitar inyecciones SQL, etc.
  • Características de optimización implícitas. Por ejemplo, DAO_PDO utiliza automáticamente la característica ofrecida por PDO de preparar primero las sentencias SQL y luego utilizarlas, de tal manera que si en un bucle se utiliza repetidamente la misma sentencia SQL, esta solo será procesada una vez por el SGBD —esto está sujeto a las capacidades del SGBD. Otra característica de optimización es el hecho de que la conexión al SGBD solo se produce cuando es necesario por primera vez, no cuando se crea el objeto DAO_PDO.
History

History es una clase básica para mantener los pasos que va dando el usuario por el sitio web. Permite añadir los datos que se requieran en cada paso o petición al servidor (como por ejemplo el título de la página actual o su URL) y luego recuperarlos de distintas formas: Según la posición (por ejemplo la primera visitada de las que siguen en memoria, o la penúltima a la que se ha accedido) o según cadenas contenidas en los datos guardados, con una sintaxis muy simple (por ejemplo, con Blog in title devuelve la última página visitada que contenga la cadena Blog en el campo title y con -/user/ or /login/ in URL devolvería el último paso que no contenga ni la cadena /user/ ni la cadena /login/ en su campo URL).

Mail

Mail es la clase encargada de enviar los e-mails, utilizando la función mail de PHP para ello, pero encargándose de ofrecer un manejo más cómodo de las cabeceras y sus respectivos formatos y codificaciones.

Options

Esta clase sirve para mantener en un mismo objeto todas las opciones de la aplicación. Realmente es una envoltura tanto para el método de carga de las opciones como para sus fuentes.

Su funcionamiento actual es muy básico: Su constructor (y el método add) permiten especificar un número variable de archivos, los cuales son procesados por parse_ini_file, y los arrays resultantes se unen mediante un array_merge. Además es posible recuperar múltiples secciones para su uso fuera de la clase Options.

Además se han implementado mejoras y se han corregido errores en las demás clases del framework.

En lo que respecta al resto de la web:

  • Ya es posible restablecer la contraseña en caso de olvido, como en casi todas las webs con registro de usuarios.
  • Redifusión RSS 2.0 para los artículos del blog.
  • Unificadas las tablas de autores y usuarios: ahora cualquier usuario registrado en la página podría publicar artículos en el blog si tiene privilegios de administración.
  • Implementada la opción de publicar artículos con una fecha futura.
  • Ya es posible modificar y borrar artículos desde el panel de control —realmente no se borran, solo se ocultan.
  • Ya es posible borrar comentarios de los artículos del blog —realmente no se borran, solo se ocultan.
  • Quitada la restricción en el panel de control de que fuese necesario un título para guardar los artículos como borradores.
  • Se han incluido dos botones nuevos para añadir formato a los artículos en el editor del panel de control, los correspondientes a las etiquetas sub y sup de XHTML, además de un botón para añadir la marca que indica dónde termina la parte del artículo que se muestra en el flujo de artículos en la portada del blog (i. e., dónde colocar el Leer Más) y otro para limpiar el formato del texto seleccionado.
  • Ahora es opcional añadir etiquetas a los artículos, y las mismas, en caso de haberlas, se utilizan como keywords del documento —i.e. se muestran en la etiqueta meta keywords.
  • Toda la aplicación es XHTML 1.0 Strict y CSS válidos.
  • jQuery actualizado desde la versión 1.2.6 a la versión 1.4.2.
  • jQueryUI actualizado desde la versión 1.5 beta a la versión 1.8.2.
  • Smarty actualizado desde la versión 2.6.18 a la versión 2.6.26.
  • Actualizado el código de Google Analytics a la última versión.
  • Pequeñas mejoras de usabilidad.
  • Correcciones de pequeños errores en el panel de control del blog.
  • Otras pequeñas mejoras y refactorizaciones del código.
8.5.2 [06/08/09 15:55]
  • Bug 0025 corregido: Aunque la parte de las fotos de Sanva.net va a ser reescrita completamente y por ello he decidido ya hace tiempo no hacer ninguna mejora en su código —la reescritura completa es totalmente necesaria ya que cuando hace ya años escribí esa aplicación no sabía utilizar bases de datos y la misma toma la información directamente del sistema de archivos y, aunque ya hice alguna pequeña mejora al respecto, ese sistema es burdo y totalmente insostenible—, lo he revisado y he detectado errores que podrían permitir a un atacante realizar inyecciones SQL, así que los he corregido.
  • Bug 0026 corregido: Una actualización anterior había deshabilitado los comentarios en las fotos al cambiar por error el nombre del usuario de la base de datos —esto es lo que suele pasar cuando la aplicación mezcla lógica de negocio y configuraciones... más motivos para descontinuar esta parte, ya muy vieja, de la web.
8.5.1 [25/06/09 21:30]
  • Bug 0024 corregido: Una de las nuevas características introducidas en la última actualización introdujo un error que impedía crear nuevas categorías —realmente lo que hacía era bloquear el programa que actualiza el índice de categorías y últimas fotos cada vez que subo nuevas fotos a la web. Al parecer es un error bastante común, y lo he solucionado en un momento gracias a How do I get password-protected directories (with .htaccess) to co-exist with textpattern?.
8.5.0 [10/04/09 21:00]

Revisión general del código de la web.

Gracias a la programación orientada a objetos es relativamente fácil crear módulos —clases— que trabajen en una única tarea y que por consiguiente sean reutilizables en múltiples aplicaciones. Un ejemplo de ello es el ya obsoleto XHTMLFilter, mencionado varias veces en este archivo de historial. Últimamente he trabajado en varios desarrollos web de pequeña escala y he encontrado grandes similitudes en cuanto a las necesidades de estas clases y, además, he encontrado también similitudes en la estructura del código de estas aplicaciones. Las aplicaciones web se ajustan —con cierta flexibilidad— al patrón de diseño de software MVC. De hecho, ya existen muchos frameworks enfocados al desarrollo web que siguen este modelo. Y yo, como soy estudiante, y como Sanva.net es por encima de todo un proyecto de estudio, he decidido crear clases que relacionen a las anteriormente citadas dando lugar a un rudimentario framework.

Así pues, la mayor novedad de esta importante versión de Sanva.net es la reescritura del código de la aplicación para adaptarlo al nuevo framework y a las clases que el mismo provee. Es la primera web en implementarlo, y espero que dé buenos resultados. A día de hoy estas son las principales clases que componen el framework:

Controller

Clase estática que pretende sincronizar a las demás. Sus métodos sirven para registrar o desregistrar procesos y la propia vista de la aplicación. Mediante esta clase se finaliza siempre la ejecución de la aplicación, siendo también la manejadora de excepciones.

iView

Interfaz que debe implementar una clase cantidata a ser la vista de la aplicación.

View

Clase vista de la aplicación. Cumpliendo las exigencias de iView, esta clase provee de métodos para enviar el código al navegador, ofreciendo además posibilidades de ser utilizada con técnicas que requieran fragmentación de las plantillas, como por ejemplo AJAX, o simplemente devolver el código a la aplicación para utilizarlo, por ejemplo, como cuerpo de un correo electrónico.

Process

Clase abstracta, base para los procesos. Se consideran procesos aquellos objetos que manejan información que puede requerir un determinado tratamiento. Los mismos son registrados por el controlador de la aplicación para impedir que debido a una posible excepción que altere el flujo normal del código dicha información pueda perderse —es decir, esto es una forma de automatizar las situaciones en las que sea necesario devolver los datos a los formularios de la vista de la aplicación. Probablemente en posteriores versiones los procesos también podrán implementar otras características relativas a la automatización de tareas —por ejemplo, un proceso manejador de las conexiones a la base de datos estaría registrado para cerrar dicha conexión siempre que termine la ejecución de la aplicación.

FormData

Clase proceso encargada de obtener y comprobar los datos enviados por el usuario. Facilita muchísimo el tratamiendo de los datos de formulario, ya que utiliza un array a modo de descripción de los campos que deben estar presentes y sus tipos, formatos, etc —por ejemplo, un campo marcado como notNull y con un maxlength de 40 provocará una excepción si el usuario lo ha dejado en blanco o si ha indroducido un texto mayor de 40 caracteres. Es muy útil ya que evita el engorro de comprobar todos los datos introducidos por el usuario: dándole la descripción de los mismos esta clase ya se ocupa de comprobar que todo está en orden. Además, al ser un proceso hace fácil el evitar que dichos datos se pierdan, ya que él mismo se registra en el controlador de la aplicación y devolverá siempre los datos a la vista a no ser que sea desregistrado manualmente.

FormattedText

Basada en Tidy, esta clase reemplaza a la ya obsoleta e inadecuada XHTMLFilter. Básicamente hace lo mismo, se ocupa de filtrar el texto XHTML introducido por el usuario para evitar posibles ataques XSS además de, simplemente, controlar qué etiquetas se pueden utilizar y cuales no. Pero lo hace mucho mejor: Es más eficiente, eficaz, completa, segura, robusta y escalable. Además de esto, se puede configurar mediante un archivo de configuración externo, el cual puede ser distinto para cada objeto FormattedText. Básicamente esta clase es una envoltura para la función de filtrado de texto XHTML de la biblioteca Tidy, pero con una configuración específica y con varias adaptaciones antes y después de la intervención de Tidy con objeto de mejorar dicho filtrado. Es especialmente útil en conjunto con un editor WYSIWYM, ya que con una configuración adecuada evita que el usuario pueda añadir formato gráfico al texto, dejándole simplemente añadir significado —de tal forma que el formato gráfico dependerá del estilo previsto por el sitio web. FormattedText está capacitada, además, para tratar adecuadamente texto pegado desde MicroSoft Office u OpenOffice.org —de nuevo, preservando el significado y no la apariencia.

Este framework, si es que se le puede llamar así, es aún un proyecto dentro de Sanva.net y por no tener no tiene ni nombre propio. El código está indocumentado y no existe manual alguno de usuario, pero el mismo será utilizado por mí en cercanos proyectos comerciales y si cumple las espectativas es probable que evolucione y llegue a convertirse en un proyecto con identidad propia, documentado y posiblemente libre.

Además de lo anterior, esta versión incluye las siguientes novedades:

  • Se han corregido errores ortográficos en los mensajes de error de la aplicación y se han realizado pequeñas modificaciones en los textos de la web.
  • Ahora el proyecto utiliza un sistema de control de versiones: Git.
  • Bug 0022 corregido: Se ha eliminado la compatibilidad con ASCII. Anteriormente la aplicación trabajaba internamente con los datos de texto en formato ASCII, básicamente porque la función estándar para contar los caracteres de una cadena de texto en PHP no devuelve el resultado correcto si ese texto contiene caracteres anchos. Pero como debido a la funcionalidad requerida de convertir el texto entrante —del usuario— o saliente —hacia el navegador o la base de datos— entre UTF-8 y ASCII se producían errores —pérdida del texto a partir de un caracter no existente en una determinada versión del ASCII extendido— esta funcionalidad ha sido eliminada. Ahora, simplemte, los caracteres anchos en UTF-8 serán contados como dos caracteres —es decir, para la aplicación el texto Valentín tiene 9 caracteres.
  • Bug 0023 corregido: Un error bestial de seguridad habría permitido a un usuario conocer la contraseña de las bases de datos, únicamente conociendo la URL del archivo de configuración del panel de control del blog —se ha comprobado que nadie accedió a dicho archivo, ya sería muy mala suerte que de cuatro gatos que visitan esta web uno supiese y decidiese hacer algún test de seguridad...
8.2.3 [07/04/09 23:55]
  • Actualizada la política de privacidad del sitio con información acerca de la cookie de seguimiento de intereses de Google AdSense.
8.2.2 [12/08/08 16:00]
  • Actualizada la clase Items y el script items para permitir insertar imágenes en los artículos (ya se podía, pero sólo al inicio del mismo, ahora se pueden insertar en cualquier lugar).
8.2.1 [04/07/08 15:35]
  • Actualizada la biblioteca jQuery desde la versión 1.2.1 a la 1.2.6, solucionando con ello un problema de incompatibilidad del editor con Firefox 3.
8.2.0 [04/07/08 13:00]
  • Si un artículo tiene una fecha futura, el mismo no es mostrado hasta dicha fecha.
  • Publicidad en la raíz del blog.
  • Leer Más implementado.
  • Si un artículo es modificado, cambia su ordenación en la raíz del blog, y se muestra la fecha original y la última de modificación.
  • Corregidos pequeños errores en el código XHTML y CSS de la web.
  • Ahora la web utiliza el SWFObject 2.0, en detrimento del antiguo SWFObject 1.5 utilizado hasta ahora, para incrustar el contenido en Flash.
  • Implementada nueva forma para insertar contenidos Flash (previamente registrados en la tabla de items y conociendo su id en la misma) en los artículos desde el editor. Esta forma respeta el estándar XHTML.
  • La clase XHTMLFilter ha sido reescrita completamente. Ahora produce un código más acorde con el estándar XHTML 1.0 Strict (trata mejor elementos antes conflictivos, como blockquote, aunque aún hay que mejorar esto pues hay casos en los que el código resultante del filtrado no es correcto; y se comporta corréctamente ante diversos casos de aparición del símbolo &), es mucho más eficiente y muchísimo más estable y seguro.
  • Ahora el editor utiliza una ventana de tipo pop-in cuando requiere datos por parte del usuario (título y dirección de un enlace, por ejemplo), en lugar del molesto prompt de JavaScript, el cual mantenía bloqueado el navegador impidiendo acceder a otras pestañas del mismo para copiar los datos necesarios (la dirección y el título de una web que se quiere incluir en el artículo y está abierta en otra pestaña de la misma ventana del navegador, por ejemplo).
  • Incluido el elemento blockquote en el editor.
  • Pequeñas mejoras en la usabilidad del sitio.
  • Bug 0018 corregido: Los archivos adjuntos a un artículo no aparecían para su descarga.
  • Bug 0019 corregido: Las comillas simples (o apóstrofe: ') aparecían escapadas en el texto del artículo ('Valentín' aparecía como \'Valentín\').
  • Bug 0020 corregido: Un grave fallo en la implementación de la clase XHTMLFilter podría permitir a un usuario insertar código ejetutable en el cliente (JavaScript, VBScript, etc.) en los comentarios de los artículos del blog.
  • Bug 0021 corregido: Al escribir ciertos símbolos ( y , por ejemplo) en el formulario de escribir un artículo o en el de escribir un comentario, los mismos eran convertidos al símbolo ? al guardar los datos en la base de datos o al devolverlos a la vista de la aplicación.
8.1.2 [24/05/08 20:05]
  • Actualizados los scripts que procesaban datos de The Weather Channel para que sean compatibles con un pequeño cambio en la forma de pedir los datos al servidor.
8.1.1 [24/03/08 12:40]
  • Bug 0017 corregido: Un pequeño fallo en la clase XHTMLFilter permitía que se colasen etiquetas vacías (como por ejemplo <p></p>).
8.1.0 [22/03/08 16:45]

Ahora el blog cuenta con un panel de control, el cual aún en un estado Alpha de desarrollo facilitará muchísimo la tarea de escribir nuevos artículos.

Dicho panel de control permite escribir artículos con un burdo editor WYSIWYG, añadir tags de forma automática, y tiene una función de autoguardado de borradores por si el sistema se cae mientras se está escribiendo uno.

  • Añadida la Política de Privacidad de la página.
  • Añadida la posibilidad de bloquear cuentas de usuario.
  • Bug 0015 corregido: La web sólo mantenía la Cookie de sesión durante unos minutos después de la última iteracción del usuario. Ahora, marcando la opción de recordar los datos del usuario al loguearse en la web, estos se mantienen durante un mes, que era la intención inicial.
  • Bug 0016 corregido: La web permitía iniciar sesión a usuarios sin autentificar.
8.0.2 [03/01/08 15:45]
  • Bug 0014 corregido: Las fechas de las fotos se mostraban una hora adelantadas (en el Visor no).
8.0.1 [10/12/07 17:40]
  • Aumentada la clase Items hasta su versión 1.0.1, la cual implementa la nueva funcionalidad de poder poner un archivo JPEG para su descarga.
8.0.0 [04/12/07 15:00]

Reescritura completa del código de la web. Se mantiene la sección Fotos, pero todas las demás han dejado de existir (Vídeos probablemente de forma permanente a largo plazo, pero Staff y Contacto se volverán a integrar), y se ha creado una nueva: Blog. El blog ha sido creado con tecnología propia (no es un WordPress o similar), y tanto él como el resto de la web están en una fase muy temprana de desarrollo (La versión 8.0.0 ha vuelto a ser una versión inicial, como ya ocurrió con la 7.0.0). La web ahora está pensada como un conglomerado de secciones semi-independientes entre sí, de tal modo que sea un proyecto escalable, ya que cada sección es en cierta medida independiente de las demás a nivel de código y archivos (por ejemplo, la sección Fotos reutiliza una gran parte del código de la rama 7 de la web, algo que debe cambiar, mietras que el blog es totalmente nuevo) y agregar nuevas secciones es en cierta medida fácil (realmente muchísimo más fácil que en la rama 7, cuya estructuración era un caos).

Principales características:

General

La infraestructura básica de la web ofrece un soporte para que todas las secciones aparezcan uniformes (estilos mediante CSS, por ejemplo, y compartición de bibliotecas tanto propias como de terceros). Además, los usuarios que se registren en la web posteriormente tendrán su propio panel de control (para poder subir un avatar, por ejemplo, que actualmente todos tienen el avatar de no-avatar), y utilizarán su cuenta para diversas acciones como comentar en los posts o en las fotos (actualmente los comentarios en las fotos siguen siendo anónimos, pues se usa el mismo código que en la anterior versión)

Portada

En una fase tosca de desarrollo, la portada sólo muestra un texto de presentación, un banner de publicidad y el antiguo módulo de información meteorolóogica

Blog

La sección más trabajada. Aunque aún le queda mucho por implementar, ofrece ya una funcionalidad decente para el lector (para el escritor no, pues aún no tiene un panel de control y los posts han de ser escritos directamente en la base de datos, así como la información relativa a las fotos de estos y a sus tags). Los posts se pueden comentar por los usuarios registrados

Fotos

Es la parte de la web más tosca. Utiliza código de la rama 7, pero es que la evolución de esta sección es muy ambiciosa como para implementarla por entero en estos momentos, por lo que por el momento brinda la misma funcionalidad que la de la rama 7 (el Visor de fotos es exáctamente el mismo, por ejemplo, y los scripts del lado del servidor son casi los mismos también)

Tecnología:

  • XHTML para la estructuración de contenidos. Este XHTML es producido mediante plantillas Smarty
  • CSS para la maquetación y los estilos
  • JavaScript se utilizará para la programación del lado del servidor de manera no intrusiva (actualmente apenas se utiliza)
  • ActionScript 3.0 será utilizado para aplicaciones, aunque será de manera no intrusiva (dichas aplicaciones tendrán un equivalente funcional en XHTML, de ser posible y factible)
  • PHP5 como lenguaje del lado del servidor
  • SQL para acceder a las bases de datos (MySQL)
7.5.1 [31/10/07 14:55]
  • Bug 0013 corregido: Un problema con los permisos para el binario de PHP en el servidor, junto con fallos en la programación de uno de los scripts de la web, propiciaban que la vista de la aplicación mostrase un número de fotos "undefined" en la lista de fotos de una categoría, si dicha categoría tenía fotos sin información Exif
7.5.0 [29/10/07 15:05]
  • La forma de presentar las categorías de fotos de la web ha sido modificada. Ahora ya no se muestran en una lista vertical ordenada alfabéticamente, sino en una lista organizada en páginas (sólo con 6 ítems por página) y ordenada por la fecha de la última foto en cada categoría (de esta manera aparecerán antes las categorías cuya última foto sea más reciente)
  • Ahora la web está estructurada en XHTML 1.0 Strict (Hasta ahora la web estaba estructurada en HTML no válido) (Esto referente a la estructura externa a la aplicación Flash)
  • Este historial de cambios se ha reescrito en XHTML 1.0 Strict y CSS (antes era un archivo de texto plano) y se ha puesto a disposición del público mediante un enlace en la sección Staff de la web
7.4.2 [30/09/07 23:55]
  • Bug 0012 corregido: Problema crítico sólo con Internet Explorer. Una vez dentro de alguna de las categorías de fotos, no era posible pasar de página pues al cambiarla se volvía a cargar la primera otra vez. Esto era provocado por una mala implementación en el historyManager
7.4.1 [19/09/07 18:30]
  • Bug 0011 corregido: Debido a un cambio en los comentarios HTML en una de las más recientes versiones de la web, los anuncios de Google AdSense no se mostraban en Firefox (el código JavaScript quedó comentado por error, aunque navegadores como IE sí mostraban los anuncios, pues no implementan del mismo modo al 100% la forma de interpretar los comentarios HTML)
7.4.0 [17/09/07 10:03]
  • La velocidad de reproducción del index.swf a pasado a ser de 24 fps (antes era de 12 fps)
  • Revisado el comportamiento de los botones atrás y adelante en los navegadores: Una vez implementada la API de manejo de la aplicación mediante el hash del navegador (Ver 7.2.0), se consiguió habilitar al mismo tiempo dichos botones (que en las aplicaciones Flash o en las webs AJAX no funcionan por defecto). No obstante, estos botones sólo funcionaban aceptablemente con Mozilla Firefox (y similares), ya que en IE permanecían deshabilitados (por deshabilitados se entiende que al pulsar el botón atrás del navegador este conduce la web anterior a esta, y no a anteriores secciones de esta, como debiera ser), en Safari funcionaban mal y en Opera producían un error crítico (al pulsar el botón atrás la web pasaba a la sección anterior pero recargándose y no mostrando ningún tipo de dato al usuario, se quedaba en blanco). A partir de la actual versión, los susodichos botones funcionan perfectamente en Safari y aceptablemente en Firefox (se aprecian ocasionalmente algunos fallos tolerables). En IE la función ya está habilitada y es funcional (me he basado en lo explicado en http://www.streampad.com/blog/?p=110 para implementarlo), pero presenta algunos fallos. Opera sigue como estaba, y se abandonan los intentos de corrección para las versiones actuales, ya que a partir de la siguiente versión (9.5, actualmente en Alpha) el motor interno del navegador cambiará, y el nuevo parece ser más compatible con lo ya implementado en la web.
  • Bug 0009 corregido: Una mala implementación de una función en JavaScript hacía que apareciese con más o menos frecuencia el mensaje de error "Elemento dibujado fuera del rango permitido" en el visor
  • Bug 0010 corregido: Si se accedía al visor con su URL (http://www.sanva.net/Visor.php) desde Safari, la aplicación mostraba su interface totalmente operativa pero sin fotos (se podía incluso comentar una pseudofoto de nombre "undefined" y en la categoría "undefined"). La corrección del error está en la modificación del archivo Slots.php y del propio visor para que errores de este tipo sean filtrados y avisados al inicio de la aplicación (este error, no obstante, no era un error de seguridad)
7.3.0 [10/09/07 21:44]
  • Ahora el visor utiliza el nombre de la imagen actual en la URL (antes utilizada una referencia a su posición una vez ordenadas las imágenes), lo que posibilita que la URL de una imagen sea guardada en marcadores y pueda ser accedida de nuevo en el futuro (antes se accedía a una imagen distinta si en la categoría en cuestión habían sido incluidas imágenes nuevas) [Funcionalidad sugerida por Luismi]
  • Ahora el botón "Atrás" del navegador funciona correctamente (pero esta funcionalidad no es compatible con Internet Explorer; y producirá un error crítico a nivel de vista en Opera)
  • Implementada una guía de navegación que permite en todo momento conocer dónde se está dentro de la web y volver a una categoría superior (incluso al inicio de la web) sin modificar la URL o tocar los botones del navegador
  • La biblioteca SWFObject ha sido actualizada a la versión 1.5 (desde la 1.4.4). Más información: http://blog.deconcept.com/2007/02/28/swfobject-1-5-released/
  • Se deja de usar el Xenon Layout, por resultar innecesario
  • Solucionados los "temblores" casi inapreciables que se producían en el visor, a causa de una incompatibilidad con Internet Explorer (versiones anteriores a la 7), al pulsar botones que requiriesen una redimensión del espacio de la aplicación
  • Las fotos del visor se redimensionarán y todos los objetos se recolocarán si el usuario cambia el tamaño del navegador
  • Ahora la web es compatible con el navegador Safari (aunque no la funcionalidad de cargar una foto en el visor a partir de su URL automáticamente: si el nombre de la foto incluye un carácter "extraño", se mostrará la primera foto de la categoría)
  • Ahora el subtítulo que aparece al entrar en la categoría Fotos mostrando el número de fotos y categorías total de la web tiene la nueva funcionalidad de mostrar cuantas fotos hay en la categoría de fotos seleccionada
  • La velocidad de reproducción del visor ha pasado a ser de 24 fps (antes era de 12 fps)
  • Bug 0008 corregido: Los nombres de fotos y vídeos demasiado largos se salen del espacio disponible (al mostrarlos junto a sus iconos en las secciones Fotos y Vídeos, respectivamente)
7.2.0 [06/07/07 19:20]
  • Quitados los scripts de ClickTale (Ver 7.1.2). Como era de esperar ClickTale no puede ver la interacción de los usuarios con la aplicación Flash
  • Mejorada la seguridad en el script encargado de enviar el e-mail desde el formulario de contacto Flash
  • Inclusión del código de Google Analytics también en el visor de fotos
  • Implementada versión alternativa de la web en formato HTML. Las personas que no tengan el plugin Flash instalado en su navegador verán esta versión. La versión alternativa no es utilizable y sólo muestra algunos de los textos de la web y su disposición en categorías. Esta versión está creada con propósitos SEO y de accesibilidad
  • Implementada API de manejo de la aplicación Flash desde el hash de la URL del navegador. De esta forma un usuario podrá guardar en favoritos o compartir con otro usuario lo que esté viendo en ese momento en la web, ya que la web cambiará el hash del navegador según la categoría en la que se encuentre, y del mismo modo será capaz de recibir información de dicha parte de la URL al iniciarse.
7.1.3 [15/06/07 15:10]
  • Bug 0007 corregido: Otra excepción en la información Exif de una foto. Esta vez al parecer el error se produce porque algún programa de edición podría no respetar del todo el estándar Exif. En este caso alguna de las funciones del archivo Slots.php imprimiría un warning que desestructuraría el XML que debiera resultar de la llamada a este archivo. La corrección de este bug radica en la revisión del archivo Slots.php para prevenir que se produzcan errores similares en el futuro.
7.1.2 [10/06/07 16:30]
  • Eliminada la marca de Unicode (BOM) de algunos archivos de la web
  • Scripts de ClickTale.net incluidos en el código de la web. El servicio ClickTale grabará mediante estos scripts las acciones de algunos usuarios de la web: Con esto se pretende poder mejorar la usabilidad del sitio, así como estudiar qué secciones son más llamativas, cuales están obsoletas, etc... Esto se hace a modo de prueba, ya que intuyo que ClickTale no podrá grabar la web pues esta usa tecnología Flash, y la grabación sólo se producirá en el index, ya que el visor de fotos presenta un pequeño fallo al intentar utilizar dichos scripts.
  • Web asociada con mi usuario de OpenID
7.1.1 [20/05/07 19:00]
  • Bug 0006 corregido: Se ha encontrado una excepción en la regla implementada para procesar la información de fecha almacenada en el Exif de una foto (DateTimeOriginal). Mientras lo normal es que el campo de fecha sea del tipo "aaaa:mm:dd hh:mm:ss" (para lo que se usaba la expresión regular '/ |:/' con el fin de dividir sus componentes), a aparecido uno del tipo "aaaa.mm.dd hh.mm.ss". La corrección del bug no estriba tanto en la inclusión de este nuevo tipo (mediante el cambio a la expresión '/ |:|\./', perfectamente válida), pues hasta Windows (nótese que el "hasta" no es un cumplido a dicho S.O.) falla en la deducción de la fecha correcta en esa foto, sino en la supresión de un fallo de diseño en la web al tener la foto una información de fecha "corrupta" (se mostraban 6 miniaturas de foto sin la foto propiamente dicha y con todos sus datos como undefined). En lo sucesivo una foto con información de fecha corrupta mostrará su fecha como undefined, pero el resto de la web no se verá en absoluto afectada.
7.1.0 [28/02/07 21:10]
  • Añadida la funcionalidad de mostrar los datos meteorológicos para la ciudad de Vigo y alrededores (Datos ofrecidos por The Weather Channel)
  • Reducido el espacio publicitario de AdSense
  • Ahora los botones del menú (y submenú) se pueden pulsar desde que aparecen (antes estaban inactivos hasta que acababa su animación, algo muy molesto)
  • Las fotos que se descarguen llevarán impreso "http://www.sanva.net" en la esquina inferior derecha
  • Mejoras en el diseño de la página (Transiciones al cambiar de imagen en el visor, Fade In en la carga de las miniaturas, etc...)
  • Bug 0005 corregido: Al acceder a las fotos de una categoría cuyo nombre contenga un carácter "especial" (léase carácteres acentuados, la Ñ, etc...) desde el enlace "Añade un comentario a esta foto" se produce un error que no permite que las fotos sean cargadas en el visor
7.0.3 [28/01/07 23:00]
  • Ahora el formulario de comentar las fotos recuerda los datos del usuario (opción que se puede deshabilitar mediante un CheckBox en el propio formulario)
  • Bug 0004 corregido: Fallo en la carga de imágenes (miniaturas o no) cuando una foto o una carpeta de categoría contiene un carácter como &, %, etc.
7.0.2 [11/01/07 16:00]
  • Añadida la funcionalidad de obviar ciertos campos en la base de datos que estén marcados en la misma como borrados
  • Ligera optimización en el código PHP
  • Ligero cambio en la estructura de los archivos PHP
  • Si el contenido insertado en el campo de texto "Página web" del formulario de comentar las fotos no comienza por "http://", es añadido automáticamente al insertarlo en la base de datos
  • El formulario de contacto ahora enviará la IP de los remitentes
  • Bug 0003 corregido: Los nombres de los autores de los comentarios de las fotos se seguían mostrando incluso al cambiar de foto
7.0.1 [09/01/07 16:45]
  • Añadido favicon a la web
  • El logo ahora está capacitado para mostrar el número de versión de la web (antes era una imagen estática)
  • Ahora el texto del inicio soporta ciertas características HTML
  • Bug 0001 corregido: Los campos del formulario de comentar las imágenes eran susceptibles de una alteración mediante código HTML (se podría, por ejemplo, mostrar una imagen que "descuadrase" la web, escribir un comentario que apareciese sin nombre, etc...)
  • Bug 0002 corregido: Las miniaturas de comentarios del inicio no llevaban a la foto correspondiente (por eso esa característica se suprimió de la versión original pocas horas despues de ser lanzada)
7.0.0 [29/12/06 16:00]

Rediseño total, escrito desde cero, de la web Redondela en Foto. La principal novedad, además del diseño, es la posibilidad de añadir comentarios a todas las fotos, y los vídeos se ven sin ser preciso descargarlos, a través del Flash Player. Por falta de tiempo la web tiene algunos fallos de diseño y el código no está nada optimizado, pero por lo general cumple su cometido.

Principales características:

  • Categorías de fotos infinitas (sólo limitadas por el bug del límite de altura del Player). Las categorías se crean creando una carpeta en /Fotos
  • Número de fotos sólo limitado por el espacio en el servidor. Ya no es preciso una nomenclatura especial para las fotos, llega con meterlas en la carpeta /Fotos/nombre_de_la_categoría/ (Son soportadas imágenes JPEG, pero sólo con la extensión "jpg")
  • Al inicio se carga un texto de un archivo XML externo y una lista con los cinco últimos comentarios a las fotos (sin repetir foto), a no ser que no haya comentarios en ninguna
  • Al cargar la sección "Fotos" se muestra una imagen, más o menos aleatoria, de todas las que hay en la web; además del submenú para elegir cada categoría de fotos
  • Con el nuevo visor, que se ejecuta en una ventana nueva y no en un PopUp como hasta ahora, se puede acceder a todas las fotos de la categoría mediante una barra de miniaturas, se pueden comentar y descargar las fotos y cada una de ellas tiene una URL propia (pero no es un permalink, ya que cambiará si varía el número de fotos en la categoría. Serviría, por ejemplo, para mostrar a otro usuario una determinada foto en un momento dado)
  • Los vídeos se ven con un reproductor en la propia web, no es preciso descargarlos (al más puro estilo YouTube)
  • Toda la información del apartado "Staff" se carga desde un XML externo
  • La web incluye un formulario para contactar conmigo

Tecnología:

La web está escrita principalmente en ActionScript 2.0, utiliza JavaScript para funciones relacionadas con el navegador y PHP como lenguaje del lado del servidor. Se usa HTML para el marcado del documento en el navegador y CSS para situar las capas. Como base de datos utiliza MySQL, y para modelar la información, XML

Valid XHTML 1.0 Strict - Valid CSS