martes, 3 de junio de 2008

Enlaces Dinámicos

Aunque hablar en otro idioma o programar en lenguajes de ordenador puede ser frustrante. Toda forma de comunicación me parece interesante.

Se me da bién programar en PHP, y aunque en Blogger no hay un modo sencillo de integrar scripts PHP; cuando el blog está alojado en un site propio no me resulta difícil meter el código que yo quiera gracias a técnicas de web interactiva AJAX (Javascript, CSS y PHP); Como las que usan Google Maps, GMail, y otras webs dinámicas.

Desde que inicié el Blog quise que los enlaces de interés de amigos y allegados se ordenasen de modo inteligente por sí solos.
De manera que cuando una página enlazada sea actualizada suba puestos en el orden de aparición de los enlaces. De ese modo basta con visitar mi página para ver si los demás han hecho algún cambio.

El primero que le encuentra utilidad soy yo. Aunque para obtener novedades via RSS lo que más uso es el programa de correo Mozilla Thunderbird.

Confío que este "ranking" anime a mis amigos enlazados a "competir". Aunque algunos ya llevan velocidad de vértigo a la hora de públicar nuevas entradas y no hay quién les alcance.

La rutina que he programado no la he encontrado hecha pero sabía que podía hacerse y es un placer tener la cabeza lo suficientemente despejada como para lograr lo que quieres aunque lleve un par de días o tres de eliminación de errores y perfeccionamiento.

El PHP es bastante potente, por ejemplo a la hora de convertir las fechas de publicación de los feeds RSS, a un formato comprensible incluso teniendo en cuenta la hora GMT, que algunos Bloggers ni se molestan en configurar bien.

Las horas aparecen correctamente aunque no es mérito de ninguna compleja rútina mía sino simplemente de una funcion, strtotime(); y date() que sirve para dar forma a la fecha con la estructura deseada.

Una ventaja es que todos los enlaces que he incluido tienen feed RSS qué es bastante sencillo de procesar con lenguajes lógicos.

Para evitar que se visiten las páginas web de la lista de enlaces todas las veces que visitamos MeGaPéuTiCo, he hecho uso de una base de datos que se actualizará una sola vez cada doce horas, siempre que se visite pasado ese tiempo. Además las visitas de mi página no se tendrán en cuenta en la mayoría de contadores de las webs ya que la rutina solo lee una mínima parte de información del feed RSS (unos 4 KB), sin cargar imágenes que suelen incluir los contadores de terceros.

El resultado de mi rutina aparece una vez cargados todos los elementos del blog en la barra lateral en la sección "ENLACES DINÁMICOS".

¿Qué te parece?



Mi rutina tiene 278 líneas, incluyendo datos de enlaces, y ocupa unos siete KB, más un enlace externo que usa la plantilla Blogger a otro código de otros 7 KB con funciones Javascript que ponen en marcha la magia del AJAX.

Si a alguien le interesa el source code, podría tratar de adaptarlo para su uso por terceros.


Básicamente mi programa hace ésto (leételo solo si tienes la cabeza receptiva):

- Almacena en distintas matrices de variables lo siguiente:
- - enlaces de feeds
- - enlaces finales que son mostrados en vez de lo que se procesan
- - titulo del enlace
- - Tipo de enlace (pensaba que para cada página necesitaría una rutina distinta para encontrar la fecha, pero ha sido suficiente con un solo tipo: RSS)

- guarda una variable con el timestamp, o la fecha/hora unix, actual.

- se define una función que hace comprobaciones de cada enlace de feed en busca de los primeros 3500 bytes del archivo xml, localizando la primera vez que aparecen las cadenas '<pubDate>' y '</pubDate>', extrayendo la fecha y convirtiendola a unix para finalmente devolver la fecha en formato final.

- Se define una función que comprueba cada enlace proporcionado para ver en los metadatos de la página la fecha de modificación de la página. Esto era para otros tipos de página web y finalmente he decidido no usar este tipo de página porque se tenian en cuenta comentarios u otros cambios que realmente no afectan a la actualización real de la página.

- Se definen funciones para conexión a la base de datos.

- Se define función para desconexión de la base de datos.

- Se define función para obtener fecha-hora de la base de datos que indica cuando se miraron las páginas web enlazadas por última vez.

- Se define función para actualizar fecha-hora en la base de datos cuando se miran las páginas web enlazadas.

- Se define función que llama a la función pertiente para obtener la fecha de cada enlace web teniendo en cuenta el tipo de página.

- - La función se asegura también de actualizar la base de datos con cada fecha obtenida.

- Se define función que mira la fecha-hora del enlace en la base de datos pero si no se encuentra llama a la función anterior para obtenerla de la web.

* Ahora comienza el programa :)

- Se crea un pointer de conexión a la base de datos.

- Se obtiene en una variable la fecha-hora que indica cuando se miraron las páginas web mediante la función definida.

- Se calcula la diferencia entre la fecha/hora actual y la fecha-hora en que se actualizó la base de datos.

- Se cuentan el número de valores en la matriz de enlaces de feeds.

- Se inicializa una variable que tendrá en cuenta si se han visitado páginas web nuevas para actualizar su fecha.

- Comienza un bucle con el número de enlaces de la matriz.

- Si han pasado más de 43199 segundos (12 horas o más)

- - Se mira efectivamente cada enlace de la matriz en sus webs respectivas con la función correspondiente.

- - La variable inicializada pasa a ser de valor 1 para actualizar cuando salgamos del bucle la fecha-hora de actualización de la base de datos.

- Si han pasado 431999 segundo o menos...

- - Se mira la fecha-hora guardada para cada enlace en base de datos

- Como soy un poco pavico a la hora de programar y he formateado los meses sin ceros a la izquierda y no me he querido molestar en convertirlo dos veces, ahora me aseguro que si el quinto carácter de la fecha es un guión '-', una variable haga de sumando cero, pero si no es un guión significa que el enlace devuelve los meses 10, 11 ó 12 y por tanto le doy a la variable un valor a sumar de 1.

- En las siguientes líneas de código con ayuda de la variable anterior obtengo la hora, minuto, segundo, día, mes y año de la fecha para finalmente crear una matriz asociada a cada enlace con el timestamp unix, qué es más fácil de ordenar...

...Esta rutina entonces creo que dejará de funcionar en unos 30 años cuando llegue el fatídico Bug de la fecha unix en 2038.

Estas dos últimas cosas (que son 12 líneas de código las podía haber resuelto con strtotime(), pero como aprendo sobre la marcha ya está hecho. Qué le vamos a hacer.


- A continuación se ordena en orden inverso la matriz según su valor timestamp, sin desordenar la clave en que fue definida.

- VISUALIZACIÓN: Se emplean todas las claves de la matriz en el nuevo orden para mostrar las matrices de enlace, título y fecha en formato legible, con sus correspondientes retornos de carro.

- Tras todo esto se mira si la variable inicializada indica que se debe actualizar la fecha-hora en que la base de datos ha obtenido cambios.

- - Si se cumple se llama a la función correspondiente.

- Se llama a la función de desconexión de la base de datos.

Y FIN.


¿Cuántos cineastas hacen falta para programar un PHP?
A ver quién acaba el chiste.

No hay comentarios:

Publicar un comentario

Comentarios de humanos, bienvenidos.