Paco Zarabozo

Time::Anytime

Este es un proyecto personal en Perl, que deseo compartir con quien desee participar. Me agradaría mucho ver que algo como esto es tomado por manos hispanoparlantes y llevado de forma exitosa a CPAN como tal.

La idea es muy simple: extender el rango de fechas de las funciones nativas localtime y gmtime, así como el conocido módulo Time::Local.

Mi idea es lograr que las funciones en cuestión funcionen sin ninguna otra limitación que el tamaño de dígitos manejables por el propio Perl. Esto quiere decir que la idea es que sea posible pasar como argumentos a localtime y gmtime tiempos mayores a 2147483647  (fecha dentro del año 2038, máximo valor admitido por perl en sistemas de 32 bits), así como tiempos en números negativos que permitan utilizar fechas menores a 1970.

Actualmente, el módulo es funcional, pero tiene algunos raros bugs que no he tenido mucho tiempo de analizar totalmente a fondo. Básicamente, se equivoca en ciertos momentos de fecha, casi siempre con error por 1 día. Es el mínimo de los casos y sólo sucede con fechas más allá de lo normal (ejemplo: fechas en 1814 o en 3023, años fuera del rango normal). Esos errores ocasionales ocurren básicamente cuando es mal calculado el ISDST o se agrega antes de tiempo un día extra a un año bisiesto (por ejemplo, durante algún loop que agrega el día extra antes de pasar por febrero).

Actualmente funciona bien (excepto por los raros momentos de error mínimo de tiempo). Es capaz de dar fechas en millones de años adelante y atrás de 1970. Cuando una fecha baja del año 1 (año -1, no existe el año cero), scalar localtime deja el año positivo y agrega un BC  al final, refiriéndose a años antes de Cristo.

 

Explicando la idea

La idea realmente es muy simple y no debería costar tanto trabajo, sólo cálculos bien pensados.  Estas son las bases:

1) Sólo existen 14 años diferentes. Todos los años son iguales a uno de esos 14 años: 7 normales y 7 bisiestos, cada uno comenzando en un día distinto de la semana. Basándose en esto, el módulo comienza por definir 14 fechas distintas que representan el inicio de un año entendible por CORE::localtime y posteriormente copia sus características modificando únicamente el año solicitado.

2) Para poder decidir qué tipo de año es un año en cuestión, hace falta saber qué año es basado únicamente en segundos, sean positivos o negativos.

3) Para poder decidir qué tipo de año es (una vez encontrado el año), es necesario saber en qué día de la semana comienza ese año.

4) Deben tenerse en cuenta en todos los cálculos, los años que tienen 366 días (bisiestos) y el momento en el que se está procesando una fecha (antes o después del posible febrero 29).

5) Una vez determinado el año de acuerdo a los segundos, y el día de la semana en que comienza el año, basta con tomar la fecha predefinida que tiene un año del mismo tipo (ya está definido en las variables del módulo) y pasarlo ya sea por CORE::localtime o CORE::gmtime para posteriormente cambiar el año por el que se pidió en la función original.

6) Están implementadas dentro del mismo módulo las funciones timelocal y timegm del módulo Time::Local. Procesan los datos de forma similar, calculando el tiempo sobre el tipo de año similar predefinido y posteriormente agregando o restando al valor de tiempo que se devolverá, el tiempo correspondiente al año que realmente se solicitó.

Instalación

Puedes descargar el módulo aquí:  Time::Anytime

Cualquier comentario, será bien recibido. Si deseas sólo probar el módulo, basta con que lo copies en la carpeta de módulos de tu instalación de Perl (ejemplo: /usr/site/lib/Time/Anytime.pm).

No está documentado aún. Pero una vez instalado, basta con poner lo siguiente en cualquier script:

#!/usr/bin/perl
use Time::Anytime;print scalar localtime(time) . “\n”;

my @localtime = localtime(60 * 60 * 24 * 365 * 3000); # Obtiene el año 3000

# Desde aquí podrás hacer uso normal de localtime, gmtime, timelocal y timegm:

print localtime; 

# Para obtener localtime de sistema sin pasar por este módulo (tal vez para comparar la salida):

@localtime = CORE::localtime(time);

 

Altamente bienvenidos los testers. Sólo pido por favor me informen de cualquier bug encontrado.

Altamente bienvenidos los colaboradores. Hace falta cualquier programador de Perl con buena experiencia y buenas prácticas de código.

Sé que será difícil encontrar respuestas a este proyecto; pero no imposible. Yo continuaré trabajando en el módulo para desaparecer en lo posible los márgenes de error que pueda tener.

Saludos. 🙂

Instalación de WordPress

ApacheMysqlPHPWordpressLogosPor fin terminé de instalar WordPress. Famous 5-minute installation, mis pelotas. 😐

Bueno, probablemente funciona bien…  cuando las condiciones son adecuadas; pero no era mi caso. El setup de mi instalación de servicios es sobre Windows, utilizando Apache como servidor web y php como módulo. Dado que rara vez utilizo php (siempre trabajo con Perl y lo único que tengo en php son uno que otro proyecto al que le he visto algo de utilidad ocasional, como en el caso de phpMyAdmin y ahora WordPress, además del par de ocasiones en que mi trabajo ha estado basado en alterar proyectos hechos en php), nunca noté problemas con las versiones o la instalación en general. Mantengo actualizaciones razonablemente pero no fanáticamente, dado que los cambios que llego a hacer en estos y otros servicios, tarde o temprano se ven reflejados en un ambiente de producción (trabajo con repositorios y siempre paso por mis entornos de desarrollo y calidad primero). En esta ocasión, el archivo de configuración de WordPress causaba un error fatal en Apache (con ventanita de “Esta aplicación dejó de funcionar” y todo), claramente originado desde el módulo cargado de php.

Como es costumbre (y mi trabajo diario), comencé a analizar el código e intenté otras formas de echarlo a correr, comenzando por crear la configuración correcta manualmente, pero el problema persistió. Así que opté por actualizar nuevamente php, lo que me llevó a http://www.php.net y a enterarme de la salida de la versión 5.3 de php (con una aclamada lista de características nuevas que lo acercan cada día más a la muy esperada versión 6… y a lo que hacía Perl ya desde hace 10 años de forma mucho más estable ;-)).

Al analizar mis opciones de descarga, me encontré con que tienen compilaciones hechas en VC6 y VC9, recomendando esta última sólo para IIS dado que los binarios de www.apache.org para Windows están compilados con VC6. Me puse a investigar un poco al respecto y muchos aseguran que cuando Apache es compilado con VC9, tiene más estabilidad en condiciones de tráfico alto, así que le tomé interés. De esa forma terminé en otro sitio que no conocía: www.apachelounge.com – una iniciativa creada por alguien que intenta mantener paralelamente la última versión de cada Apache pero compilado con VC9. Me pareció interesante (aunque arriesgado, pensando en mi entorno de producción) el intentar esta nueva modalidad y de esa forma integrar php en su version VC9.

Después de hacer los cambios de versiones en mi setup, pasar un muy buen rato checando configuraciones e identificar las razones por las que en principio Apache no lograba arrancar, por fin las cosas trabajaron como debían. Así que, aproximadamente tres horas después de mi intento original por correr WordPress, logré hacer funcionar el Famous 5-minute installation script (que a esas alturas, por fin pudo cumplir con lo ofrecido).

No me queda más que ver cómo funciona todo y comenzar por fin (después de al menos 5 años con la idea), a probar la experiencia de tener un blog personal. Mi idea original es la de crear mi propio sistema de blog en Perl, exactamente como yo lo quiera y con la seguridad de que no hay recursos mal gastados; pero siempre es una actitud inteligente el primero conocer muy bien al menos uno de los sistemas más famosos que puedan existir para un fin, y ese será el papel de WordPress y este mi primer blog. 🙂