WordPress!?

Así es, he sido seducido por el lado oscuro y ahora estoy usando WordPress.

Y qué pasó con los motores hechos en casa? Bueno, llegué a la conclusión que la mayoría de los features que quería implementar para mi blog eran features existentes de WordPress. Adicionalmente a esto, la falta de tiempo me hizo migrar del todo.

Así que ahora soy parte del club y estoy seguro que empezaré a recibir Comments Spam dentro de poco. Ya veré cómo puedo combatir contra eso, pero ayuda no me va a faltar. :)

Tengo un par de ideas para unos plugins, sobre todo para automatizar mis Journal Comics, pero por ahora esto es suficiente. Vamos a terminar de configurar esta cosa y subirlo a mi website.
Los links antiguos que Google indexó se van a perder, lastimosamente. No tengo ganas de dejar atrás un script que devuelva 302s a las nuevas URLs.

El link a mi feed RSS es ahora: http://jgwong.org/blog/?feed=rss2

Oh bueno, y espero postear un poco más seguido.

Procesando mails con procmail y PHP

Este año quiero poner cosas más, um, edificantes en mi blog. Así que empezaré comentando esto que picó mi interés hace (muchas) semanas atrás.

Nestor Sertzen nos cuenta su forma de procesar mails usando procmail y PHP (y bash) aquí y aquí, sin embargo la forma cómo lo hace es un tanto ineficiente.

Su flujo básicamente es:

  • Recibir el correo con procmail
  • Pasarle el correo a un script en bash
  • El script en bash crea un fichero temporal con las últimas 5 líneas
  • El script en bash llama al script PHP con el nombre del fichero temporal
  • El script en PHP procesa la información y escribe a STDOUT, que está redireccionado a «/home/nestor/proceso»
  • El control regresa al script de bash, quien envía por mail el contenido de «/home/nestor/proceso»
  • Las ineficiencias principales son las siguientes:

    1) Usar bash para recortar las últimas 5 líneas del correo. Esto lo podemos hacer en el mismo script de PHP ya que de todas formas vamos a tener que recibir todo el mensaje.
    2) Usar un fichero temporal para pasarle las líneas a PHP. Bueno, esto no tiene mucho de malo, pero podemos evitar esto recibiendo de frente el mensaje con PHP.
    3) Esta falla si es grave: la redirección de la salida del script de PHP a «/home/nestor/proceso». Si dos procesos PHP coinciden, uno puede chancar el fichero del otro. No hay una diferenciación por nombre como sí se hace previamente con el fichero temporal.
    4) El script de bash envía el resultado usando el comando «mail». Esto también lo podemos hacer en el mismo PHP, con lo cual nos evitamos el posible conflicto descrito en el punto 3.

    Entonces, lo podemos mejorar de la siguiente forma:

  • Recibir el correo con procmail
  • Procesarlo todo con PHP
  • Profit!
  • El siguiente ejemplo está basado en un script mío llamado littlesister-getaddress.php. Lo que hace es recopilar el «From:» de todos los mails que me llegan.
    Mi script también es hackish, pero sirve de ejemplo. :)

    Llamamos al script de PHP directamente desde procmail:

    :0:
    * ^Subject.*(Numera)
    | /home/jgwong/bin/littlesister-getaddress.php
    

    Y en el script de PHP leemos todo el correo para procesarlo:

    #!/usr/bin/php
    <?php
    // Little Sister GetAddress 1.0
    // written by jaime g. wong <jaguar@paperclip.com.pe>
    
    $address_file = "/home/jgwong/.little-sister";
    
    $list = file ($address_file);
    
    $f = fopen ("php://stdin", "r");
    
    while ($line = fgets ($f)) {
        echo $line;
        
        if (preg_match ("/^From: (.+?)\$/", $line, $match)) {
            $email = trim ($match[1]);
            
            // ignore rules
            if (in_array ($email . "\n", $list) || strpos ($email, "orkut")) {
    //            echo "X-LittleSister: Found " . $email . "\n";
            }
            else {
                $e = fopen ($address_file, "a");
                fputs ($e, $email . "\n");
                fclose ($e);
            }
        }
    }
    
    ?>
    

    Lo importante del script es cómo se lee el contenido del mail desde procmail, que viene por STDIN y luego se procesa. No hay ficheros temporales intermedios, lo cual nos evita posibles conflictos. Escribimos en STDOUT el contenido recibido para que procmail siga con su flujo. Fíjense que hay un código comentado donde añadía una cabecera más al cuerpo del mail.

    Me quedé sin tiempo, mas espero que les sea útil. Si descargamos alguna librería para parsear mails (seguro hay alguna en PEAR) podemos hacer un poderoso script para procesar nuestros mails.

    Una idea que tengo para reducir mis distracciones en el trabajo es un filtro por importancia. Mi idea es retener mensajes no importantes por cierto tiempo e inyectarlos en mi buzón de entrada. Así los mensajes importantes (los del jefe, los de clientes VIP o cuentas especiales de notificación) sí pasan inmediatamente.

    Enero 06, 2006

    <drmad> Simba, mi hermana y su cuerpo de ropero

    jc

    Así es, fui a verla.

    Oliver me pasó el dato que también la estrenaban aquí en Ica (sorpresa de sorpresas). No puedo comentar mucho porque mañana tengo muchas metas qué cumplir en el trabajo y debo acostarme temprano.
    Les recomiendo altamente que vayan a verla. Hubieron pocos cambios, pero lo importante está allí, intacto.

    «Aslan… is on the move.»

    Enero 03, 2006

    Square One, otra vez
    Y arrancamos un nuevo año. Lamento no tener tiempo para hacer un resumen de metas logradas y no logradas como el año pasado, por dos motivos fundamentales: el primero es que no tengo mucho tiempo, jeje. Estoy aprovechando el tiempo muerto mientras subo unos avances para que el cliente los pueda ver. El segundo motivo fundamental es que, contra todos mis pronósticos, mi vida dió un giro revuelto todo el año pasado — de tal modo que todos mis planes quedaron desbaratados.

    Así que iniciamos el 2006 con la lección aprendida: sé flexible — muy flexible — en tus planes. No contaba con viajar a Lima durante tanto tiempo (casi ocho meses), ni comprarme una laptop (y una tableta Wacom, y un controlador MIDI, y…), ni abandonar tantas metas y cumplir otras que fueron apareciendo al instante. Fue todo un año lleno de entresijos e incertidumbre.

    Con esto no quiero decir que ha sido un mal año. Ha sido un muy buen año, fabuloso, excitante, deprimente, frustrante, doloroso y prometedor. Ha sido un año de revelaciones y de fuerzas que no sé de dónde salieron.

    Estoy contento de verme a mí mismo y saber que he cambiado, he crecido, he madurado y aprendido muchas, muchas cosas durante todo este tiempo — no sólo de mi carrera sino también de mi vida personal, emocional y espiritual.

    Aquí vamos, 2006! Me pregunto qué sorpresas nos traerá este año… ha sido un 2005 fascinante y presiento que este año será fascinante también.

    Diciembre 18, 2005

    ¿El último post de este año?
    Así de raudo como me fui a Lima, estoy nuevamente en Ica, tan velozmente que me cuesta creer que ya estoy de vuelta. Estoy escribiendo esto desde mi oficina en mi casa, mientras miro el cronograma del trabajo pendiente y planeo ciertos avances para el día de hoy.

    ¿Hoy? ¿Domingo? ¿Trabajando? A decir verdad, me quedé dormido viendo el video del concierto de Jean-Michel Jarre en Moscú y luego me puse a tocar algunos sketches musicales como para calentar motores. Ya se me pasó toda la tarde y estoy revisando los puntos pendientes para un proyecto importante en el trabajo.

    El 2 de Enero tenemos que presentar este proyecto y estoy demasiado ajustado de tiempo. Voy a tener que hacer muchas horas extras, y frecuentemente bromeo a quienes les cuento esto, actuando la escena de Navidad:

    – ¡Feliz Navidad!
    (tecleando como maniático) – Ajá, sí, dame un minutito…

    Por eso quizás este sea el último post del año, ya que voy a estar apretujado de tiempo como no se imaginan. Lamento mucho si no les hago caso durante todas estas fiestas, pero hay prioridades y responsabilidades qué cumplir. Este proyecto es importante para la empresa y para mí también. Es como un Jurado Nacional de Elecciones Part Deux, sólo que esta vez en casa y con el cuidado de no repetir errores pasados.

    Ya estoy de vuelta en Ica, y tengo esa sensación otra vez de piezas que se mueven, que encajan entre sí, como un Gran Juego de ajedrez Divino. Tenía un evento importante este Sábado pasado y, oh coincidencia, cumplí finalmente las condiciones requeridas para poder regresar y estar aquí. Es reconfortante saber que lo que está sucediendo ya está ordenado y se mueve de acuerdo a Su plan. Es como un gran indicador, un visto bueno diciéndote «todo está bajo control.»
    Jill me dijo «estoy segura que todo irá bien,» y, pese a todo mi acumulado pesimismo, estuvo en lo cierto.

    Pancho me dijo ayer «Qué bueno que ya decidiste volver,» y eso me molestó y me dió risa al mismo tiempo. Los chicos en Peruserver saben de sobra lo deseoso que he estado de volver a Ica desde hace muchos meses atrás. Hay personas de las que tristemente ya espero que me critiquen inmediatamente después de saludarme (o a veces, la crítica es el saludo), pero viniendo de Pancho me hizo recordar que toda esta parte de mi mundo que se me viene a la mente al decir «Ica» no es perfecto, nunca lo ha sido y nunca lo será — es sólo que he estado pensando más en las cosas que extrañaba y anhelaba que aquellas que me incomodan e irritan. Fue un gracioso «Bienvenido a casa.»

    Ya estoy de vuelta, quizás no voy a disfrutarlo del todo por ahora, pero ya estoy de vuelta.

    «I am standing here in my ravine
    Once again I see a piece of the sky
    And my joy will never be denied
    Cause I was meant to be here
    The only place on earth
    Where you are near»

    Diciembre 08, 2005

    Whom?
    Acabo de leer el tremendo post de Nat y un poco más de la mitad hay una foto que dice: «Me, a Peruvian girl, and Gonzalo.» ¿Alguien la conoce? ¿Sabe quién es?


    La Peruvian girl



    Quisiera poder quejarme (si es que es queja) como el de tantos viajes y frío. Lo único de lo que puedo quejarme ahorita (si es que es queja) es que son las 23:55, es feriado y estoy trabajando solito en la oficina.

    Um, ahora que lo pienso, tengo trabajo.

    Perdón por la rudeza, mejor me callo.

    Noviembre 29, 2005

    Crea aplicaciones nativas de Windows con PHP (!!!)
    Acabo de encontrar esto: Winbinder, una extensión open source para PHP que te permite crear aplicaciones Windows nativas en PHP. «Nativo» quiere decir que usa los mismos botones, cajas, ventanas y elementos propios de Windows. Esto contrasta con PHP-GTK que usa los elementos de GTK, todos distintos de Windows.

    Esto es una ventaja enorme si desarrollas aplicaciones web y una aplicación desktop de complemento, ya que ambas aplicaciones pueden estar desarrolladas en PHP y usan la misma librería de funciones para, por ejemplo, acceder a la base de datos. Esto reduce el tiempo de desarrollo, evita la duplicidad de código y minimiza el riesgo en gran manera.

    Aún está en alpha, pero por los ejemplos se ve bastante usable. Esto podría ser una pieza clave para un proyecto personal que tengo en mente.

    Otra cosa más para agregar a mi larga lista de cosas por probar. :)