Instalar soporte yaml-dev en PHP para OSX

Receta rápida para instalar soporte YAML en PHP 5.6 para OSX Sierra.

Añadir tap de php a brew:

$ brew tap homebrew/homebrew-php

Instalar librería dinámica yaml.so

$ brew install php56-yaml

Comprobar ruta de instalación:

$ ls -l /usr/local/opt/php56-yaml
/usr/local/opt/php56-yaml -> ../Cellar/php56-yaml/1.3.0

Crear php.ini para poder editarlo e indicar que active la carga de yaml.so:

$ sudo cp /etc/php.ini.default /etc/php.ini

Activar extensión en php.ini:

$ sudo vi /etc/php.ini
extension=/usr/local/Cellar/php56-yaml/1.3.0/yaml.so

Comprobar que ha cargado (reiniciar Apache si el soporte YAML se quiere para el servidor web… en mi caso no hacía falta, dado que el soporte se requería para línea de comandos):

$ php -i "(command-line 'phpinfo()')" | grep -i yaml
LibYAML Support => enabled
LibYAML Version => 0.1.7

Generar una presentación a partir de un directorio de imágenes

Llevo tiempo pensando que debía compartir un pequeño script en PHP que creé para crear un ODP (presentación Impress) a partir de un directorio de imágenes. Es interesante, por ejemplo, cuando has capturado multitud de imágenes de pantalla para explicar a alguien cómo realizar cierta función en una aplicación web o en una aplicación de escritorio. Esas imágenes no hace falta que sean preciosas, editadas, ni nada por el estilo. Son simples pantallazos que te gustaría poner uno detrás de otro en una presentación (una captura en cada diapositiva) para luego poder anotarlas rápidamente.

Hasta tener este script tenía que ir imagen por imagen, pulsando en Insertar / Imagen, seleccionar la que quería, y ponerla en la diapositiva. Generar nueva diapositiva, volver a Insertar / Imagen, elegir la siguiente, etc. Cuando había 2 o 3, no problem, pero cuando tenía más de 10 pantallazos siempre acababa diciendo, «esto hay que automatizarlo…» . Pues bien, el script, programado en PHP, lo he dejado en GitHub por si le interesa a alguien más.

Una vez clonado, el funcionamiento del script es muy sencillo:

 
php -q slideck.php directorio_de_imagenes

Donde directorio_de_imagenes es la ruta a la carpeta donde tengas las capturas de pantalla.
El script generará en el mismo directorio desde el que se ejecute un archivo slideck.odp, es decir, una presentación Impress, con una diapositiva por cada imagen de la carpeta.

Enjoy it!

Visualizando un grafo de dependencias en PHP

Receta rápida para visualizar un grafo de dependencias en PHP, como el que acompaña a este post (pincha sobre la imagen para hacer zoom sobre ella). Se trata del grafo de dependencias PHP de la aplicación Babelium Project, pero piensa que el objetivo es aprender a generar un grafo como éste de cualquier aplicación que te interese.

En concreto, queremos ver gráficamente qué ficheros incluyen a qué otros (con include, require o require_once). Para ello, haremos uso de la extensión «inclued» (sí, al parecer es un juego con las letras de include).

$ sudo pear install inclued-beta

Configuramos a continuación el fichero php.ini para activar la extensión, añadiendo esta línea

extension=inclued.so

y en la parte inferior del mismo fichero, una variable de configuración:

[inclued]
inclued.enabled = On

Ahora reiniciamos Apache para que coja los cambios:

$ sudo /etc/init.d/apache2 restart

Editamos la página inicial (index.php o similar) de la aplicación de la queremos obtener el grafo, y añadimos al final lo siguiente:

// File to store the inclued information
$fp = fopen('/tmp/wp.ser', 'w');
if ($fp) {
    $clue = inclued_get_data();
    if ($clue) {
        fwrite($fp, serialize($clue));
    }
    fclose($fp);
}

Esto generará un fichero /tmp/wp.ser con información serializada de los includes y requires que carga index.php y sus ficheros dependientes (es decir, el análisis se hace de forma recursiva)

Sólo falta un paso: usar graphviz para generar un fichero .dot que luego podremos convertir a .png con la utilidad dot.

# creamos el dot
$ php graphviz.php -i /tmp/wp.ser -o wp.dot
# lo convertimos a png
$ dot -Tpng -o inclued.png wp.dot

Actualizar Twitter y Facebook con curl

Artículo enviado por A. Cuartango:

A veces resulta interesante poder actualizar la página de Twitter o la de Facebook desde la línea de comandos. Para ello podemos hacer uso de curl, la navaja suiza de la automatización de tareas Web. Veamos cómo:

«Twitter es más sencillo, ya que su API permite usar curl sin ninguna dificultad (el API está documentado siguiendo el enlace de la página principal de Twitter):

curl -u   USUARIO:PASSWORD   -d status="Hola desde curl. MENSAJE AQUI" http://api.twitter.com/1/statuses/update.json

En facebook hay que usar un script (Gracias Alste):

<?php
//
// change Facebook status with curl
// Thanks to Alste (curl stuff inspired by nexdot.net/blog)
 
function setFacebookStatus($status, $login_email, $login_pass) {
echo "Entra";
   $debug = false;
   //CURL stuff
   //This executes the login procedure
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, 'https://login.facebook.com/login.php?m&amp;next=http%3A%2F%2Fm.facebook.com%2Fhome.php');
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'email=' . urlencode($login_email) . '&pass=' . urlencode($login_pass) . '&login=' . urlencode("Log in"));
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
   curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   //make sure you put a popular web browser here (signature for your web browser can be retrieved with 'echo $_SERVER['HTTP_USER_AGENT'];'
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12");
   curl_exec($ch);
 
   //This executes the status update
   curl_setopt($ch, CURLOPT_POST, 0);
   curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com/home.php');
   $page = curl_exec($ch);
 
   curl_setopt($ch, CURLOPT_POST, 1);
   //this gets the post_form_id value
   preg_match("/input type="hidden" name="post_form_id" value="(.*?)"/", $page, $form_id);
   //we'll also need the exact name of the form processor page
   preg_match("/form action="(.*?)"/", $page, $form_num);
 
   curl_setopt($ch, CURLOPT_POSTFIELDS, 'post_form_id=' . $form_id[1] . '&status=' . urlencode($status) . '&update=' . urlencode("Update status"));
   //set url to form processor page
   curl_setopt($ch, CURLOPT_URL, 'http://m.facebook.com' . $form_num[1]);
   curl_exec($ch);
 
   if ($debug) {
       //show information regarding the request
       print_r(curl_getinfo($ch));
       echo curl_errno($ch) . '-' . curl_error($ch);
       echo "<br><br>Your Facebook status seems to have been updated.";
   }
   //close the connection
   curl_close($ch);
}
 
setFacebookStatus("Esto es una prueba de publicacion automática desde línea de comandos", "CUENTA_FACEBOOK","CLAVE_FACEBOOK" );

Con esto y un poco de scripting podremos publicar lo que queramos en una cuenta de facebook y twitter.

La UPV/EHU migra de Exchange a Horde

Abandono mi silencio auto-impuesto para dar una buena noticia para los usuarios de Software Libre de la UPV/EHU. Vicegerencia TIC, tras una largo periodo de evaluación, ha decidido migrar de Microsoft Exchange a Horde (realmente Horde es un framework libre escrito en PHP sobre el que están construidos módulos -también libres- para webmail, tareas, calendario, gestión de bookmarks, etc. que es lo que realmente se ha instalado). Una muy buena noticia, que nos libera de un yugo -MS- y no nos unce a otro -Google-, al que por cierto, demasiado enganchado estoy ya.

La noticia completa, procedimiento que se llevará a cabo para la migración, tips&tricks, FAQ y otros detalles en la web de Vicegerencia. También merece la pena leer el comunicado oficial.