Receta: Integrar R y MySQL

Vamos a por una receta rápida que permite ejecutar desde el entorno R sentencias SQL contra una BD MySQL remota (así te ahorras tener que ejecutar las sentencias en MySQL, exportar el resultado e importarlo luego en R)

Primero, asumo que la BD es remota y no hay acceso directo (el puerto 3306 está filtrado) PERO sí tenemos acceso vía SSH. Así que construyo un túnel SSH contra MySQL (en un extremo del túnel tenemos localhost, escuchando en el puerto 3307. En el otro extremo, MySQL en su servidor, escuchando en el puerto habitual, 3306)

$ ssh -L 3307:localhost:3306  usuario@IP_SERVIDOR

Ok, ahora vamos a instalar la magia: el paquete r-cran-rmysql permite lanzar sentencias SQL contra una BD MySQL remota. Y lo tenemos paquetizado en Ubuntu 🙂

$ sudo apt-get install r-cran-rmysql

Para que las conexiones a MySQL desde R no requieran que tengamos que acordarnos continuamente del login, pass, db, etc. las apuntamos en my.cnf

$ sudo vi /etc/mysql/my.cnf
[nombreGrupo]
user            = usuario
password        = password
host            = 127.0.0.1
port            = 3307
database        = nombre_de_bbdd

¡Listo! Que empiece la fiesta:

$ R
> library(RMySQL)
Loading required package: DBI
> con <- dbConnect(MySQL(), group="nombreGrupo")
> dbListTables(con)

La primera línea carga el entorno R. La segunda carga la biblioteca RMySQL. La tercera lista las tablas de la BD.

¿Más ejemplos?

> rs <- dbSendQuery(con, "select * from tabla");
> dbHasCompleted(rs)
> data <- fetch(rs, n=50);
> data[1,]

La primera línea lanza una consulta SQL. La segunda recoge los resultados (50 tuplas para empezar). La tercera muestra la primera fila de esos resultados. Para recoger TODOS los resultados/tuplas, podríamos haber hecho:

> data <- fetch(rs, n=-1);

Las consultas también pueden lanzarse y visualizarse directamente así:

> dbGetQuery(con, "show tables");

Finalmente, si no quieres crear un fichero /etc/mysql/my.cnf, también puedes pasar los datos directamente desde la línea de comandos:

> library(RMySQL)
> drv <- dbDriver("MySQL")
> con <- dbConnect(drv, user="usuario", password="contraseña", dbname="nombreDB", host="127.0.0.1", port=3307)

Para más detalles, RTFM 😉

Bonus: R insiste en mostrar los resultados sólo a 80 columnas. Si tienes una pantalla grande, igual te interesa saber que a R se le puede indicar que hay espacio de sobra 🙂 así :

> options(width=150)

Indicator bug: conoce al instante los bugs de tu aplicación

Mi amigo Oier Mees nos habla de su nueva creación:

Indicator-Bug es un indicador para Ubuntu 11.04 y 11.10 que muestra y actualiza regularmente una lista de bugs para un determinado proyecto de Launchpad. También avisa cuando haya nuevos bugs, cambiando el color del icono, que cumplan los criterios de búsqueda especificados. Además, haciendo click en la entrada un bug, se abre la página correspondiente de Launchpad en el navegador.
El usuario puede especificar qué tipo de bugs le interesan, por ejemplo, que aparezcan bugs que contengan ciertos tags, bugs marcados como críticos etc. Para evitar llenar la pantalla de listas interminables, sólo se muestran las primeras 8 entradas y por otro lado, también se acorta el titulo en caso de que sea demasiado largo.

La idea surgió porque buscaba una forma de estar informado en cuanto se dieran nuevos bugs en Ubuntu dentro de la categoría «bitesize», que significa que son relativamente fáciles resolver, y no quería estar haciendo búsquedas en la web de Launchpad cada x tiempo. Por otra parte, también me inspiré en Jono Bacon, que publicó un post en el que describía una aplicación parecida. Finalmente, era una buena oportunidad para conocer mejor el ciclo de desarrollo en Ubuntu y sus herramientas y poner en práctica lo aprendido sobre Python.

La aplicación está escrita en Python y usa GTK. Como sistema de control de versiones usa bzr, ya que es el que mejor integrado está con Launchpad. Mencionar también que actualmente la aplicación está traducida a media docena de idiomas, aunque por el momento falta el castellano 😉

Si tenéis ganas de probar Indicator-Bug tengo un PPA dónde se publican paquetes diarios con las últimas mejoras y ahora estoy intentando que lo acepten en el repositorio universe de Ubuntu para que los usuarios de Oneiric puedan instalarlo sin tener que añadir el PPA.

Para instalar Indicator-Bug:

$ sudo apt-add-repository ppa:oier/indicator-bug
$ sudo apt-get update & sudo apt-get install indicator-bug

Agradecería mucho que lo probéis y me mandéis sugerencias, mejoras o incluso un bug-report si descubrís errores. Para lo último, como hace uso de Apport, os debería de dar la opción de mandar un informe de fallos automáticamente si la aplicación deja de funcionar repentinamente.

Una china en el autocompletamiento Bash

No una china en el zapato… sino en el autocompletamiento Bash. Los usuarios de la línea de comandos solemos «volar» literalmente mientras escribimos comandos en terminal. Pero usamos un truco: el autocompletamiento Bash. Si quieres ver el contenido del directorio /tmp/algo/muy/largo basta con teclear (donde TAB es el tabulador):

ls /t<TAB>a<TAB>m<TAB>l<TAB>

y Bash lo autocompletará así:

ls /tmp/algo/muy/largo

Sin embargo, desde la versión de Bash que nos trajo Natty (Ubuntu 11.04), al teclear

ls /t<TAB>_

el autocompletamiento añadía un espacio en blanco a la derecha del TAB y por tanto se rompía la magia (no es posible seguir tecleando y pulsando TAB a partir de ese espacio)

En este hilo de discusión al respecto de este bug, el usuario Silas da con la clave para arreglar este comportamiento tan errático: basta con editar el fichero /etc/bash_completion, línea 1587 y donde pone -o default poner- o filenames. Guardamos los cambios y a partir de la siguiente terminal que abramos, el problema estará solucionado.

Google Cloud Print: imprimiendo en la nube


Problema: estás en el autobús de camino al trabajo con el móvil Android y quieres imprimir el PDF que estás viendo en pantalla para que nada más llegar, puedas recoger el taco de papeles impresos y hacer uso de ellos. No es algo traído de los pelos, en el mundo estresado en el que vivimos me ha ocurrido varias veces («ojalá pudiera enviar a imprimir este documento para que sea llegar al despacho y recoger el trabajo para entrar directo a clase…»). Lo sé, podía haberlo hecho antes O:-)

Bueno, el caso es que la espera terminó. Ya es posible hacerlo con una tecnología que salió hace meses para Windows y MacOSX (siendo los usuarios del pingüino otra vez ciudadanos de segunda clase) de la mano de Google. Se llama Google Cloud Print y en resumidas cuentas, lo que permite es enlazar a la nube de Google cualquier impresora a la que tengas acceso desde un ordenador de sobremesa ejecutando el navegador Chrome. De esta forma, cualquier otro dispositivo que tengas (smartphone Android, otro PC con Chrome, una tablet…) conectado y con permisos recibirá la opción de imprimir en esas impresoras. Realmente es como compartir una impresora local a través del navegador… para todo el que tú desees, esté donde esté.

¿Cómo se hace? Abre Chrome (¡ojo! ¡versión 12 como mínimo!). Teclea about:flags. Activa Google Cloud Print. Ahora, cierra y vuelve a abrir Chrome. Desde ele menú de opciones, preferencias, «Under the Hood», haz login en Google Cloud Print (te pedirá que te identifiques con una cuenta Google). Selecciona las impresoras que quieres compartir. ¡Listo! Los dispositivos Android desde los que quieras poder imprimir recibirán la notificación de que tienen impresora disponible sin que tengas que hacer nada más. Los navegadores Chrome de otros PCs tendrás que configurarlos.

Tip: grabar sonido interno en recordMyDesktop

Problema: quieres grabar con recordMyDesktop lo que estás viendo en pantalla y *también* quieres grabar el sonido de lo que oyes *pero* no el sonido ambiente, sólo el que sale de las aplicaciones actualmente en ejecución. Por ejemplo, supongamos que quieres grabar con recordMyDesktop lo que acontece en un videojuego que tienes en pantalla. El videojuego emite audio y quieres que este audio también quede grabado, pero evitando el ruido ambiente exterior (te llaman por teléfono, se abre la puerta, estornudas…).

Solución:
1) Arranca recordMyDesktop y pónlo a grabar
2) Arranca pavucontrol (control de audio de Pulse Audio)
3) En la pestaña «Recording» verás que por defecto estará grabando de «Internal Audio». Pulsa sobre ese botón y elige «Monitor of Internal Audio» (ver imagen adjunta).
4) Tómate un café como recompensa 🙂

Realmente este truco no tiene por qué limitarse a recordMyDesktop, funciona con cualquier aplicación que grabe audio.
Nota técnica: al parecer lo que conseguimos con este truco es grabar en «stereo mix mode»