SUOP, un operador móvil colaborativo

Hoy me he encontrado con esta empresa, SUOP, que es un operador móvil colaborativo. La idea en la que se basa es sencilla: tener una comunidad de usuarios que sea la base de la empresa, que decidan qué servicios quieren que se les ofrezca y que colaboren entre ellos y con la empresa para que todos ganen.

La verdad es que me ha costado un poco entender el concepto, porque es algo que no había visto nunca aplicado en una empresa como un operador de telecomunicaciones. En otros ámbitos sí lo he visto y sé que funciona muy bien, siendo el mejor ejemplo el sistema operativo GNU / Linux. Cuando no sé cómo hacer algo busco en Internet y encuentro foros donde alguien que sabe más que yo me ayuda y me explica cómo hacerlo. Si necesito un programa que haga algo busco a ver si alguien ya lo ha hecho y, si no existe y puedo hacerlo yo, lo hago y lo pongo a disposición de los demás usuarios.

Bien, pues este concepto de comunidad y de colaboración es lo que esta gente ha tomado como base de su empresa. En lugar de gastar dinero en, por ejemplo, un servicio de atención al cliente (que además en el 99% de los casos suele ser de calidad bastante mediocre, o al menos es la sensación que he tenido yo cuando he tenido que llamar a cualquier servicio técnico) en SUOP ese servicio técnico lo dan otros usuarios de la empresa con conocimientos técnicos. A cambio de este servicio se van acumulando puntos que luego se canjean por dinero. Este dinero se puede cobrar, cambiarlo por saldo o donarlo a una ONG. Pongo aquí un pequeño video en el que explican en qué consiste su empresa:

 

En fin, que la idea me gusta, me he registrado con ellos  y estoy seguro de que va a ser un éxito, igual que lo ha sido GNU / Linux. ¿Una operadora de telecomunicaciones, que son probablemente los mayores exponentes de “empresas tiburón” que hay en el mundo, que se rige por una filosofía Ubuntu (soy porque nosotros somos)? Sí, por favor, muchas gracias.

Descargar la Wikipedia al disco duro

Tenía por casa un portátil DELL Inspiron 7000 del año 99 y no sabía bien qué hacer con él cuando me acordé de que mi padre siempre se queda pasmado con la Wikipedia cuando la ve en mi ordenador, le asombra la cantidad de información que tiene. Me sonaba que se podía descargar al disco duro, así que investigué un poco y efectivamente se puede y además es muy sencillo. Así el portátil podrá ser útil durante unos años más como Wikipedia offline.

Lo primero que haremos será descargarnos Kiwix, que es un programa para visualizar textos de wikis en formato ZIM. Una vez instalado necesitaremos descargarnos el contenido de la Wikipedia en este formato ZIM, para ello podemos hacerlo desde la página de descargas de kiwix.org o a través de este torrent. Yo usé el torrent y hay muchas fuentes, se descargó muy rápido (ojo, son 10GB y eso que no incluye las imágenes). El fichero .zim contiene un volcado de Wikipedia de marzo de 2012.

Una vez tengamos instalado Kiwix simplemente abrimos el fichero .zim y ya tenemos la Wikipedia a nuestra disposición.

iotop: ver procesos que acceden al disco duro

Hay veces que uno está con el ordenador ganándose las lentejas y no está haciendo nada del otro mundo pero se escucha al disco duro “rascando” continuamente. Para saber qué procesos están accediendo al disco existe un programa que se llama iotop. Si lo ejecutamos podremos ver exactamente quién es el responsable de la actividad del disco.

Aquí una pantalla de ejemplo, ejecutando iotop con el parámetro -a (que va guardando el histórico de accesos desde que se inició iotop).

iotop

Para instalarlo, basta con ejecutar

sudo apt-get install iotop

Y luego ejecutarlo como root:

sudo iotop -a

CKEditor: forzar pegado como texto plano

El CKEditor es el editor de textos WYSIWYG para web que más me gusta, funciona estupendamente y tiene una API muy intuitiva.

Lo uso siempre que en un gestor de contenidos hay que poder editar texto dando un cierto formato, metiendo imágenes, tablas, etc… El problema suele venir cuando los clientes, al usarlo, copian y pegan de programas como Word, que mete su propio código HTML y cambia fuentes, tamaños de letra, espacios. Al final el contenido acaba quedando horroroso.

Pero nos podemos evitar estos dolores de cabeza con una opción de configuración muy sencilla:

config.forcePasteAsPlainText = true;

Simplemente añadiendo esta línea cualquier texto que se pegue se pegará como texto plano, librándonos de cualquier formato que pudiera tener el texto original y respetando el estilo de nuestra página.

Diodon: un histórico para el portapapeles

Hoy quiero hablar de uno de esos pequeños programas que cuando se usan por primera vez se pregunta uno dónde han estado toda nuestra vida. Es el equivalente en software de ver por primera vez a Anna Torv o a Claudia Longarte.

Esta joya se llama Diodon, y básicamente lo que hace es ir guardando en un buffer todo lo que copiamos al portapapeles, hasta un máximo de 100 entradas (tanto de texto como de imágenes). Cuando pulsemos la combinación de teclas que le hayamos asignado nos mostrará un menú contextual con todas esas entradas y con el cursor podremos movernos por ellas; al pulsar Enter sobre cualquiera nos la pega en el documento.

Yo lo tengo configurado para 25 entradas, es más que de sobra, y como combinación de teclas CTRL-SHIFT-Z. Ahorra mucho tiempo, porque permite por ejemplo seleccionar varios textos de un documento uno por uno y pegarlos después rápidamente en otro documento, sin tener que andar cambiando de uno a otro.

Además el icono que pone al lado del reloj es de una especie de pez globo inflado muy gracioso.

¿Cómo instalarlo en Ubuntu? Con tres líneas lo tendremos:

sudo add-apt-repository ppa:diodon-team/stable
sudo apt-get update
sudo apt-get install diodon

Actualización del 18/01/2015: he instalado Linux Mint y por algún motivo Diodon no funciona, no aparece el menú con el histórico del portapapeles al pulsar la combinación de teclas. He instalado una alternativa que se llama clipit y que funciona estupendamente.

Bookmarlet para probar el responsive design

Después de probar muchas extensiones al final lo mejor que he encontrado para hacer pruebas de responsive design es este bookmarlet.

Tiene tamaños predeterminados para móviles y tabletas, aparte de permitirte cambiar el tamaño manualmente.

Aquí se puede ver una captura de pantalla del bookmarlet con la estupenda página Ponles Nota, que permite calificar a los profesores de universidades y centros de estudios y saber cuáles son los mejores en cada uno de ellos. ¡De obligada visita si estudias o tienes pensado estudiar en cualquier centro de España!

screenshot

(Atentos al detalle de la foto de la Unhelpful High School Teacher con el bocadillo de ¿Me has calificado ya? xDDDD)

Usar Ubuntu como auricular / micrófono del móvil

Hoy he estado enredando con el bluetooth del móvil, y he encontrado un programa para responder al móvil desde el PC en plan manos libres. No creo que lo vaya a usar porque es mucho más sencillo usar los cascos del móvil, pero dejo puesto aquí cómo se hace por si a alguien le sirve.

El programa se llama HFP y estos son los pasos para instalarlo (he seguido esta guía con algunos cambios):

– Descargamos las fuentes:

svn co https://nohands.svn.sourceforge.net/svnroot/nohands/trunk

– Instalamos ciertos paquetes que hacen falta:

sudo apt-get install automake libtool libbluetooth-dev libasound2-dev libspeexdsp-dev

– Entramos en la carpeta de las fuentes y hacemos los siguientes cambios, encontrados aquí, si no no compilará:

  • En el fichero libhfp/Makefile.am añadimos -fpermissive en la línea AM_CXXFLAGS
  • En el fichero include/libhfp/events.h sustituimos todas las llamadas a Invoke() por this->Invoke() y RegisterDirect() por this->RegisterDirect
  • En el fichero test/Makefile añadimos -pthread en la línea libhfp_LIBS

– Ejecutamos

./autogen.sh
./configure
make
sudo make install

– Lanzamos el programa con el comando hfconsole y ya solo hay que emparejar el móvil con el ordenador.

Autobombo: Linux Caller Id

Me voy a permitir un post de autobombo, pero es que (y es horrendo que lo diga yo, ya lo sé) este programita que hice es una maravilla.

Linux Caller Id es un programa que se conecta a un módem que tengamos enchufado a nuestra línea fija y extrae el número que está llamando; si el número lo hemos marcado anteriormente como bloqueado descuelga y cuelga automáticamente, cortando la llamada. Ya está, no tiene nada de misterio, pero gracias a él cada vez pierdo menos tiempo contestando al teléfono de los spammers (sobre todo compañías de telecomunicaciones y bancos, los dos colectivos más cansinos).

Tiene la ventaja añadida de que no solamente se pueden registrar números de spammers, podemos añadir los de amigos y familia y que no los bloquee, y así cuando nos llamen saber quién es sin tener que coger el teléfono para ver quién llama.

Por lo general, a la tercera o cuarta vez que un spammer ve que la llamada se corta se piensa que el número está dado de baja o algo parecido y dejan de llamar. En un futuro, cuando tenga tiempo para investigar cómo reproducir ficheros de sonido a través del módem, lo pienso ampliar para que suene una locución si llama un spammer. Así podría coger la locución clásica de “El número al que llama no se encuentra operativo” y conseguir que los spammers borren mi número de la base de datos antes.

El programa está hecho con Qt/C++ y es libre y gratuito. Hoy a las 11:30 ya me había librado de dos pesaos. 🙂

Screenshot

REPLACE y foreign keys en MySQL

MySQL tiene una extensión al lenguaje SQL muy útil, REPLACE, que es una combinación de INSERT y UPDATE: si en la tabla existe una fila con la misma primary key que la que vamos a insertar, MySQL actualiza la fila con los nuevos datos; si no existe, la introduce. Es muy útil porque así no tenemos que tener una sentencia diferente para insertar un nuevo registro (INSERT) o modificar uno existente (UPDATE), y esto hace que el código sea más sencillo y limpio.

Pero tiene truco. Como dicen en la documentación:

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

 

MySQL lo que hace es insertar la fila si no existe esa primary key, pero si existe borra la fila existente y a continuación la inserta.

Esto no es un problema hasta que utilizamos foreign keys: si hacemos REPLACE en una tabla A y hay otra tabla B que tiene una foreign key con ON DELETE CASCADE en A.id, como MySQL elimina la fila de A automáticamente se eliminan todas las filas de B que hacen referencia a ese A.id, y eso es algo que no queremos.

La solución para esto es desactivar la comprobación de foreign keys antes de hacer el REPLACE, y activarlo una vez hecho:

SET FOREIGN_KEY_CHECKS = 0;
REPLACE INTO tabla_A (campo1, campo2, ... campoN) VALUES (valor1, valor2, ... valorN);
SET FOREIGN_KEY_CHECKS = 1;

De esta forma mantenemos el comportamiento habitual de las foreign keys para borrado de filas y actualización de índices pero lo anulamos cuando queramos usar  REPLACE.

Problema: lighttpd cachea ficheros en VirtualBox cuando no debería

He estado un buen rato fruteado con esto, y por suerte he encontrado la solución en ServerFault, la copio aquí por si me vuelve a pasar en el futuro.

Tengo una máquina virtual con VirtualBox que tiene Ubuntu Server 12.04, para simular el entorno donde se instalará una web que estoy haciendo. El servidor web es lighttpd, y me estaba haciendo unas cosas rarísimas: yo modificaba un fichero JS y al lighttpd no le daba la gana de actualizarlo, seguía sirviendo la versión antigua pero no solo eso, además solamente enviaba tantos bytes de la versión antigua como bytes tuviera la nueva versión del fichero. Vamos, un WTF en toda regla.

Al parecer esto se debe al VirtualBox, y la forma de solucionarlo es añadiendo esta línea al fichero lighttpd.conf

server.network-backend = "writev"

Y con esto el problema está solucionado. La verdad es que no sé por qué así funciona, pero después del mal rato que me ha hecho pasar ya no me quedan muchas ganas de investigarlo.

Aprovecho para copiar aquí también las reglas de redirección que he utlizado para que cualquier URL que no lleve a un fichero existente se envíe al fichero index.php:

url.rewrite-final = (
"^/([^.?]*)\?(.*)$" => "/index.php?__q__=$1&$2",
"^/([^.?]*)$" => "/index.php?__q__=$1"
)