Monthly Archives: April 2009

Se acabó la Semana Santa del 2009

Que tristeza, se acabó la Semana Santa y tan agradable que estaba.  Disfruté mucho estando en mi casita mas o menos relajado.  El lunes fui a trabajar muy juicioso, el martes amanecí enfermo sin ganas de nada (día perdido), el miércoles estuve de viaje con una visita relámpago a Manizales para recoger a mi hermanita, del jueves al domingo fueron de descanso.  Inclusive estuve en misa acompañando un rato a mi señora madre.

Esta semana prometí que la iba a invertir en descansar, que en lo posible ni siquiera iba a encender a este equipo del mal, alias mi mejor amigo, y lo cumplí en gran medida.  Lo mas técnico que hice esta semana fue empezar el desarrollo de los Sismos recientes en Colombia y jugar todo el PS2 que tenía atrasado por andar ocupado.  Hace mucho tiempo descubrí que el descanso hace parte fundamental del trabajo.

Con respecto a los proyectos espero terminar de mejorar a SRC en el corto plazo y continuar con los muchos otros que tengo pensados, probablemente seguir con un proyecto relacionado con el clima y hermanito de este.  Estoy tratando de darle un poco mas de inercia a mis proyectos personales porque en realidad nunca me alcanza el tiempo para ellos y el próximo mes espero estar regresando a mis clases de la maestría en la UAM con lo que seguramente tendré aún menos tiempo disponible y las ideas se me están acumulando y se me están pegando las unas con las otras enrredándose entre mis dendritas.

Bueno, con esto doy por terminada una Semana Santa modelo 09 muy agradable y cumplido el objetivo de escribir un post personal que poco o nada tuviera que ver con algo técnico del desarrollo de software, me voy a dormir para amancer de buen genio y continuar con el montón de cosas interesantes que dejé continuando la semana pasada.

Presentación de Sismos recientes en Colombia

Sismos recientes en Colombia

Sismos recientes en Colombia

Sismos recientes en Colombia es una aplicación de agregación de contenido que permite visualizar de manera gráfica en la geografía Colombiana la ubicación de los sismos que han sucedido en el territorio nacional, tanto los [últimos diez] destacados por su intensidad como la actividad sísmica completa de la semana anterior.  Esta información se actualiza casi en tiempo real, con una diferencia de al rededor de 3o minutos después del suceso, gracias a los servicios de la Red Sismológica Nacional del Instituto Colombiano de Geología y Minería.

La base del proyecto fue desarrollado en una semana de descanso utilizando casi por completo Software Libre.  Se construyó utilizando PHP, HTML/CSS/Javascript/AJAX, jQuery, CodeIgniter, SwiftMailer, SQLiteEclipse PDT y Google Maps.  La aplicación aún se encuentra en progreso, alias beta, así que aún tengo pensando hacerle varias mejoras y complementos.

Actualmente el sitio web permite consultar la información de los sismos destacados y de los sismos diarios de la semana en curso, la información georreferenciada se despliega en el mapa gráficamente desde donde se puede acceder a la información disponible del sismo.  El último sismo destacado sucedido cuenta con un enlace a la RSNC donde se amplía su información.  Las fechas y horas hacen referencia al territorio colombiano, es decir, GMT-5.  Adicionalmente la aplicación cuenta con un sistema de caché que permite agilizar la presentación de información cuando esta se encuentra fresca en el sistema y de refrescarla en ciertos intervalos, disminuyendo la consulta a las fuentes de datos y el tiempo de generación del contenido.

He planeado realizar las siguientes mejoras a la aplicación sin ningún orden necesario.

  • Mejorar los colores de la presentación.  Los actuales son de prueba, estoy buscando a alguien que si sepa del tema para que me asesore.
  • Establecer tooltips informativos para facilitar la utilización del sitio.
  • Verificar la viabilidad de crear un mapa del sitio (sitemap) que facilite las búsquedas de contenido en el sitio.
  • Establecer un procedimiento cron que actualice la inforamción aún sin la consulta de visitantes.
  • Establecer la comunicación con otras aplicaciones como Twitter.
  • Establecer valores finales para la duración de los cachés de información.
  • Implementar un módulo de Contáctenos.
  • Crear una versión móvil que muestre la información resumida.
  • Implementar un indicador que le muestre al usuario en que sección del sistema se encuentra.
  • Verificar el cumplimiento [en lo posible] de XHTML.
  • Establecer la viabilidad de incluír información de sismos de otros lugares del mundo como valor agregado al sitio.

La aplicación, [con optimismo] al igual que las cosas buenas del mundo, se encuentra licenciado bajo CC NC-SA así que su código será liberado tan pronto como termine de implementar las principales mejoras y lo documente para dejarlo apto para el consumo humano.

Si alguien tiene alguna sugerencia acerca de como mejorar esta aplicación me gustaría mucho que lo compartiera conmigo.

Enlaces.

Cambiar de zona horaria una fecha/hora en PHP

Definir las zonas horarias de orígen ($sourceDate) y destino (a convertir) .

$sourceTimeZone = 'utc';
$targetTimeZone = 'America/Bogota';

Separar los componentes de la fecha de orígen que se encuentra en formato 'm/d/y h:m:s'.

list($month, $day, $year, $hours, $minutes, $seconds) = sscanf($sourceDate, "%d/%d/%d %d:%d:%f");

Construír el objeto DateTime indicándole la fecha y la zona horaria en la que se encuentra.

$datetime = new DateTime("{$year}-{$month}-{$day} {$hours}:{$minutes}:{$seconds}",
                         new DateTimeZone($sourceTimeZone));

Modificar la zona horaria del DateTime a la zona horaria destino.

$datetime -> setTimezone(new DateTimeZone($targetTimeZone));

Obtener los componentes de la nueva fecha con la zona horaria modificada.

list($month2, $day2, $year2, $hours2, $minutes2, $seconds2) =
    sscanf($datetime -> format('m/d/Y H:i:s'), "%d/%d/%d %d:%d:%f");

Muestra las fechas.

echo "En {$sourceTimeZone}: {$day}/{$month}/{$year} {$hours}:{$minutes}:{$seconds}<br/>";
echo "En {$targetTimeZone}: {$day2}/{$month2}/{$year2} {$hours2}:{$minutes2}:{$seconds2}<br/>";

Remover el index.php de las rutas de CodeIgniter

Para hacer esto se hace uso de las capacidades de sobreescritura de URLs de Apache.  Se debe agregar un archivo .htaccess en la raíz del sitio web con el siguiente contenido.

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

En servidores de Dreamhost he tenido un mejor éxito utilizando la siguiente versión.

RewriteEngine on
RewriteCond $1 !^(index\.php|public|user_guide|media|robots\.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]

Adicionalmente es necesario indicarle a CodeIgniter que ya no agregue artificialmente el archivo index.php a los URL de la siguiente manera.  Edite el archivo config/config.php y modifique la siguiente llave.

$config['index_page'] = "index.php";

De forma que quede de la siguiente manera.

$config['index_page'] = "";

Enlaces.

strptime, "This function is not implemented on Windows platforms".

Hoy mi querido PHP me jugó una mala pasada.  Estaba haciendo un despliegue preliminar de uno de mis proyectos en el servidor del cliente, un Windows 2K3 con PHP 5.2.3 cuando durante las pruebas,  la ejecución de las series falló con un mensaje de error inesperado para mi: This function is not implemented on Windows platforms.  La función strptime que siendo muy útil ella, recibe una fecha en formato texto, el formato en que viene representada dicha fecha y retorna un arreglo con las secciones de la fecha.  El problema: no funciona en Windows!

Hasta ahora no se me había ocurrido que pudiera pasar este hecho trivial, que algo de PHP corra en una plataforma y no en otra.  Bueno, que el symlink no funcione en Windows no me extrañaría, y eso que veo que ya funciona en Windows Vista/8 Server y superiores; pero que no funcionen las funciones de conversión de fechas del API estándar me parece triste.  Tendré que dejar de creer en el write it once & run it everywhere para agregarle un test it forever everyplace.

Por suerte para mi, -hasta ahora- la única función que ha presentado este problema fue la mencionada.  Por mucha mas suerte para mi, un amigo francés llamado Lionel Sauron publicó una versión de reemplazo de strptime para Windows que funciona perfectamente para mis necesidades.

Gracias a este código la solución fue muy sencilla y con un mínimo impacto en mi proyecto.  Creé un método estático en la librería Fecha llamado strptime2($cadena, $formato) cuya implementación corresponde con la propuesta por Lionel y para su invocación verificó si está o no disponible la versión estándar de la función y utilizo la mas conveniente.

$f = null;
if(function_exists("strptime") === true)
    $f = strptime($cadena, $formato);
else
    $f = Fecha::strptime2($cadena, $formato);

Enlaces.