Desde que trabajo de manera independiente he tenido que ser más paciente e incisivo sobre las preferencias de los clientes, sobre todo cuando hay diseño gráfico involucrado, la mayoría de las veces no saben por cual muestra decidirse o escogen la que menos me gusta, irónico pero cierto. Aveces llega lo que defino como “clientes celestiales” estos ya saben lo que quieren, tienen bastante tiempo con el concepto en su cabeza y son muy decididos, la mayoría del tiempo ya poseen algunas muestras de lo que quieren o intentos hechos por otros freelancers que han fallado en completar el proyecto.

Hace semanas me contactaron para diseñar/desarrollar un sitio web completo, lastimosamente no puedo divulgar mucho sobre la finalidad del mismo, solo puedo decir que si todo va bien podría ser Trend Topic en twitter muy pronto, lo curioso es que fue uno de esos “clientes celestiales”, decidido y bien centrado en lo que quiere, tan atento que me proporciono algunas plantillas a modo de inspiración, estas plantillas para WordPress las había descargado de un sitio famoso, lo mejor de todo es que como el refirió, la plantilla “es gratis”.

Luego de examinar la plantilla en cuestión, me encontré con una linea bastante “diferente”, check this out:

La linea que me llamo la atención
Linea malvada!


WTF!, eso no parece un código común de una plantilla de WordPress, luego de decodificar varias veces esa linea me encuentro con esto:

Código Verdadero
Lo que escondia la linea en base64


Examinando el código observamos que no es tan grave, no están tratando de explotar una vulnerabilidad o algo parecido, solo están colocando publicidad, pero creo que a mi cliente no le hubiese gustado tener esa publicidad en su sitio. Moraleja… no todo lo gratis es bueno, siempre debemos al menos pasarle un antivirus al contenido que descargamos por la web, saludos.

Como veo que los artículos en los que he publicado los parches para el driver de este dispositivo TDT están teniendo seguimiento en este blog y harto de compilar a mano un montón de cosas en cada actualización del kernel ayer dediqué un ratillo a preparar un paquete más automático usando DKMS. DKMS  es un sistema que compila módulos del kernel en varios eventos (actualización del kernel, nuevo kernel, actualización de drivers, etc...) sin intervención del usuario. Muchos paquetes de Debian y Ubuntu lo usan (drivers de NVIDIA/ATI, VirtualBox, etc...) ¿Porqué no tenerlo para el driver AF9035? He dado de alta un  PPA en Launchpad ,  que contiene  el paquete fuente y el .deb generado  listo para instalar en cualquier distribución . El paquete sólo depende de dkms por lo que debería funcionar en i386/amd64 y desde versiones cuyo kernel sea 2.6.26 o superior (en el 3.0.0 de Debian Unstable funciona sin problemas) El paquete compila 6 módulos: af9033, dvb-core, dvb-usb-af9035, dvb-usb, mxl5007t, tua9001 que se instalan en /lib/modules/`uname -r`/updates/dkms por lo que tienen preferencia sobre los módulos instalados. Puede que rompa otros drivers de TDT pero normalmente no se suelen tener varios modelos funcionando a la vez. El paquete se ha generado partiendo del código fuente de dvb-usb-af9035, cabeceras y fuentes de la rama v4l e incluye el firmware  /lib/firmware/dvb-usb-af9035-01.fw  necesario.

la propiedad timeout en puppet

Este post que va corto me sirve mas como una nota para un futuro. Lo hago publico porque puede ayudar a algunos con problemas de tiempo de ejecución de comandos con puppet.

Primero aclaremos que es puppet y svn, Puppet es un sistema para automatizar tareas, escalable y libre, permite simplificar la mayoría de las tareas técnicas que los administradores de sistema hacemos diariamente. Lo mejor de todo es que las clases, templates y demás archivos de puppet pueden ser compartidos como cualquier otro código.

El segundo tema que quería aclarar era el de svn (Subversion) que es un sistema de control de versiones el cual automatiza las tareas de guardar, recuperar, registrar, identificar y manejar archivos. Muy útil para archivos que son modificados frecuentemente.

El problema que tenia era con una clase de puppet muy similar a esta:
exec {
  "templates-listo": path => "/bin:/usr/bin:/usr/sbin:/usr/local/bin",
  command => "svn co --non-interactive http://svn.orvtech.com/cms/templates /var/www/cms/templates/",
  onlyif => "/usr/bin/test -d /var/www/cms/",
  unless => "/usr/bin/test -f /tmp/templates.chkout",
}

Esta clase se ejecuta sin problemas pero no hace el checkout completo del repositorio, siempre quedan pendientes algunos directorios que no son copiados.

La solución a este problema en mi caso fue el de agregar timeout => 0, y así permitirle a subversion que termine de hacer la copia. La clase final queda muy parecida a:

exec {
  "templates-listo": path => "/bin:/usr/bin:/usr/sbin:/usr/local/bin",
  command => "svn co --non-interactive http://svn.orvtech.com/cms/templates /var/www/cms/templates/",
  timeout => 0,
  onlyif => "/usr/bin/test -d /var/www/cms/",
  unless => "/usr/bin/test -f /tmp/templates.chkout",
}

El archivo /tmp/templates.chkout es creado por otra clase que verifica si el checkout se realizo sin problemas.


Foto de Aluminio en la Portatil
El destructor!
A las 9:34 PM llega la visita inesperada, un amigo del edificio donde vivo, en sus manos trae una Compaq Presario F754LA que al parecer no encendía y el AC Adapter desprendia un olor a achicharrado, usualmente hago servicio técnico para la familia y amigos cercanos, “casos dificiles”, casos que ninguno de los técnicos de las N tiendas en Cumaná quiera tomar. Despues de conversar acerca de la falla y de donde provenia el equipo, termine aceptando y no es sino hasta hoy que logre recuperar mis herramientas de electrónica que pude revisar el equipo.

La primera incognita es que el cargador aunque huele a quemado funciona bien, la pista más obvia fue el led verde localizado en la carcasa del ac adapter, pero el equipo seguia sin encender, usando un milivoltimetro comprove la salida correcta de 19,38 voltios, la otra pista fue que al conectar el jack del adapter al equipo este emitia un sonido casi como un tick y el led parpadeaba. Luego de una busqueda rapida en google, acuñe la idea de que la tarjeta madre estaba en corto, pero según me cuenta mi amigo la máquina no estuvo conectada desde hace un tiempo, por lo que me decidi a desarmar para obtener un mejor angulo del asunto.

Mi sorpresa fue encontrar ese pedazo de papel de aluminio comun y corriente, de esos que usamos para envolver cosas en el interior del equipo, pero mi teoria es que el equipo fue colocado en la mesa del comedor (en realidad pudo ser en cualquier lugar) y el pedazo de papel aluminio fue absorvido por el fan cooler y estuvo dando vueltas adentro hasta que toco alguna parte vital y provoco el deceso. Esta hipotesis tiene que ser al menos corrovorada con lo que diga el dueño del equipo una vez que lo contacte el Lunes, pero estoy seguro que no le gustara recibir esa mala noticia.

De todas formas podemos aprender algo de esto, al menos tratar de verificar la superficie donde colocamos nuestros equipos para que cosas como estas no nos arruinen el día y un equipo perfectamente funcional, sin pensar en el gasto economico en el que puede repercutir.

La manera más facil y efectiva de manejar las fechas cuando estas desarrollando una aplicación (en este caso usando PHP) es usar fechas en formato “UNIX timestamp“. Podemos definir a las fechas en formato UNIX timestamp como la cantidad de segundos que han pasado desde 1 Enero, 1970 a las 00:00:00 GMT, lo que nos permite facilmente ejecutar calculos para transformar valores de fecha y tiempo.

Pero este formato no es perfecto, tiene características que pueden afectar tanto su uso como el funcionamiento, una de ellas es que no es leible por humanos normales (a menos de que seas Sheldon Cooper), por ejemplo si me preguntaras ¿Qué día es hoy? y te respondo 1309666385 ¿Estarías en capacidad de interpretar el numero y obtener la fecha en que necesitas?, seriamente lo dudo.

El otro inconveniente es que este formato solo puede usarse en un rango limitado dependiendo del Sistema Operativo. En sistemas basados en GNU/Linux puedes retroceder hasta el año 1902 y avanzar hasta el año 2037. En Windows el limite menor es “Enero 1, 1970” debido al tamaño del numero en UNIX timestamp. Cualquier Sistema Operativo puede manejar enteros hasta un tamaño especifico (2 levado a la 32, o 4.249.967.296 para 32 bits) despues de esta cifra se necesita más trabajo para manejar numeros grandes. Por materia de eficiencia este “maximo” es impuesto para valores importantes como horas y fechas. Linux permite tener valores negativos para ambos y por ende puedes obtener fechas anteriores al limite menor. Algunos se preocupan por estos limites, inclusive acuñan al problema como un segundo Y2K, yo tengo la confianza de que para el 2038 ya todos los Sistemas Operativos de 32 bits habran sido reemplazados y no esto no será un problema.

Lo anterior deberia preocuparte si estas pensando desarrollar una aplicación que necesite planificar tanto para el futuro como para el pasado o que simplemente permita el registro de personas donde uno de sus campos sea la fecha de nacimiento, pero para todo existe una solución. Existe otra razón para estar pendientes y es debido a la presentación de las fechas en numeros enteros, por ejemplo si tenemos la fecha Enero 2, 1970 en formato UNIX sera mucho mas corta en digitos que Mayo 13, 2009. Si vas a almacenar fechas o horas en formato UNIX timestamp en una base de datos asegúrate de que el campo tenga una longitud de 10 digitos y eso bastara para almacenar fechas lo suficientemente largas para mantener tu sistema ejecutandose unos cuantos años.

MySQL tiene su propio formato de timestamps y es mas sencillo de usar, su formato es “YYYY-MM-DD HH:MM:SS” y normalmente es almacenado en su propio tipo de columna llamado “datetime”. Si necesitamos usar comparaciones y ordenamiento simple este formato funciona muy bien usando las funciones internas del RDBMS; adicionalmente tienen la ventaja de ser legible por humanos y su longitud es predecible lo que lo hace más fácil para validar, pero si necesitamos que nuestra aplicación sea flexible a la hora de cambiar de manejador de base de datos y no dependa tanto de funciones internas de MySQL es preferible usar UNIX timestamps.

A la hora de hacer operaciones complicadas relacionadas con fechas u horas terminaras convirtiendo todo a UNIX timestamps, haciendo tantas conversiones manejando grandes porciones de datos probablemente caigas en el uso excesivo de recursos de Hardware altamente valiosos que pueden aminorar la velocidad de tu aplicación. Yo era estricto al usar MySQL timestamps y casi todas mis aplicaciones “viejas” las usan pero luego de estudiar más el tema comprendí la ventaja de usar UNIX timestamps.

La epifania llega al momento de hacer operaciones con intervalos de tiempo, es mucho mas facil usar UNIX timestamps a la hora de hacer ordenamiento, adiciones, substraciones y comparaciones entre dos fechas, ayuda a mantener consultas mas simples y a no comprometer la compatibilidad de tu aplicación si Oracle decide cambiar alguna funcionalidad de MySQL. En PHP tal facilidad viene de mano de la función “mktime()” que nos permite construir Unix timestamps usando segundos, minutos, horas, meses, dias y años de la fecha/hora necesaria. Imaginandonos que tenemos un sistema con millones de usuarios (Facebook, twitter, etc.) y donde cada bit de información es importante yo seguiria usando UNIX timestamps dado a que los campos “date” y “datetime” ocupan más espacio que uno “INT(10)”, quizas les paresca descabellado pero cuando tenemos 500 millones de usuarios cada bit (termina acumulandose y formando petabytes) de información que se almacena o se transmite a traves de DataCenters localizados en distintas partes del mundo es muy importante que esa data sea la más depurada y liviana posible, tal principio parece innecesario para una pequeña aplicación, pero su uso ahora puede ser un salvavidas mañana.

Finalmente es tema de opinion, MySQL también ha incluido funciones internas que hacen el manejo de UNIX timestamps más sencillo y flexible, eres libre de estudiar el tema y opinar al respecto en la sección de comentarios. Saludos.