Servidor de Chat con Raspberry Pi

Un amigo me ha dejado una Raspberry Pi y ando dando vueltas a experimentos varios. Esta mañana, hablando con un compañero de curso, este me comentó de un proyecto libre para convertir equipos en centros multimedia basado en software de XBOX de Microsoft (XBMC), si bien llegamos a la conclusión de que el pequeño miniordenador educativo tal vez no era lo más idóneo si quieres reproducir películas en HD (ojo, que hay una versión para Raspberry Pi de dicho software). Pero con todo esto del PRISM y el espionaje descarado de la NSA tal vez un servidor de chat pueda interesar a alguien.

Raspberry Pi de 2011
La Raspberry Pi del experimento

En este caso vamos a usar Prosody, y vamos a suponer que estáis usando la versión adaptada de Debian para la Raspberry Pi. Lo primero, como no, instalar Prosody:

sudo apt-get install prosody

Ok, ya está instalado. Con esto, el archivo de configuración básico y un par de usuarios creados ya podrías operar, pero vamos a configurar un poco la historia. Lo primero vamos a meter las librerías para encriptación, compresión y soporte de base de datos:

sudo apt-get install luasec lua-zlib luadbi

Con esto ya tenemos las librerías necesarias. Ahora toca irse al archivo de configuración y activar ciertos módulos. Dichos módulos, por defecto, vienen desactivados ya que las líneas en el archivo de configuración están comentadas con dos guiones al principio de la línea. Para descomentarlas simplemente borra esos guiones.

Para entrar a editar el archivo de configuración:

sudo gedit /etc/prosody/prosody.cfg.lua

Allí elegís ya los módulos a activar. Yo en el mío he activado estos:

                "privacy"; -- Support privacy lists
                "compression"; -- Stream compression
                "groups"; --Shared roster support
                "roster"; -- Allow users to have a roster. Recommended 
                "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
                "tls"; -- Add support for secure TLS on c2s/s2s connections
                "disco"; -- Service discovery
                "private"; -- Private XML storage (for room bookmarks, etc.)
                "vcard"; -- Allow users to set vCards                
                "version"; -- Replies to server version requests
                "uptime"; -- Report how long server has been running
                "time"; -- Let others know the time here on this server
                "ping"; -- Replies to XMPP pings with pongs
                "adhoc"; -- Support for "ad-hoc commands" that can be executed with an XMPP client
                "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands

Vosotros configurad como queráis. Ahora sí que vamos con un punto importante: ¿queremos que la gente pueda registrarse o queremos sólo poder crear usuarios nosotros para tener un mayor control del acceso? Ya que hablamos de seguridad y privacidad es un punto importante. Por defecto el módulo de registro y la opción de permitir el registro están desactivados, así que si queremos activarlo toca descomentar el módulo «register» y la línea que pone allow_registration=true. Es de suponer que no tendréis una ip fija, al menos en España lo normal es tenerla dinámica y la fija implica un sobrecargo en la factura, por lo que será cosa buena haceros con un dominio (podéis conseguir uno gratis en noip.com). Luego buscáis en la configuracion una línea que pone VirtualHost «example.com» y la cambiáis por vuestro dominio. Debajo habrá una línea que pone enabled = false, la comentáis o borráis y estará activado vuestro dominio.

Bueno, con esto ya tendrías el servidor de chat furrulando cosa buena. Pero como no queremos que un pajillero del FBI lea lo que escribimos casi mejor vamos a encriptar, que para algo metimos antes el módulo (aunque si leemos entre líneas la declaración de Snowden, es probable que la NSA ya sea capaz de romper la seguridad SSL). En todo caso lo primero es irnos a la carpeta de certificados de Prosody y desde allí trabajar:

cd /etc/prosody/certs/
sudo openssl req -new -x509 -days 365 -nodes -out "prosody.cert" -keyout "prosody.key"

Tras esto te pedirá una serie de datos que, excepto uno, no son muy relevantes. La excepción es Common Name (e.g. server FQDN or YOUR name) []:, donde tenéis que poner el nombre de dominio conseguido antes, el resto si queréis los podéis ignorar. Una vez acabado este proceso se crearán dos archivos: prosody.cert y prosody.key. Con ellos creados os toca volver a abrir para editar el archivo de configuración principal.

Ahí tenéis que copiar lo siguiente dos veces:

ssl = {
key = “/etc/prosody/certs/prosody.key”;
certificate = “/etc/prosody/certs/prosody.cert”;
}

La primera vez lo ponéis sobre las rutas ssl por defecto y ponéis exactamente lo mismo justo debajo de la línea de VirtualHost «elnombrededominioquetengáis».

Yo no me voy a meter a configurar base de datos, aunque instalara antes la librería, porque en una Raspeberry Pi no es que vayamos sobrados de recursos. Si queréis hacerlo tenéis un excelente tutorial en español aquí (fue uno de los varios que utilicé como documentación mientras hacía las pruebas).

Bueno, una vez acabado esto ya sólo nos queda lanzar Prosody:

sudo /etc/init.d/prosody start

Podéis modificar el sistema para que arranque al a vez que el sistema operativo, si lo véis necesario. Ahora con cualquier cliente de XMPP o Jabber, como Pidgin, podéis acceder a él. Cuando entréis por primera vez os pedirá que creéis una cuenta en el servidor. Bueno, si habéis habilitado el registro de usuarios bien, ¿y si no? Ya lo comentamos arriba, puedes no permitir el registro y crear tú los usuarios, si quieres un servidor de chat para un pequeño grupo de trabajo/amigos no es mala idea. Bueno, los usuarios se crean con la sintaxis sudo prosodyctl adduser nombredeusuario@eldominioquepillaras. Por ejemplo, supongamos que tu dominio es fucknsa.cc y el usuario que quieres crear se va a llamar, no sé, un nombre aleatorio, por ejemplo assange:

sudo prosodyctl adduser assange@fucknsa.cc

Por cierto, que si quieres montar el servidor de chat en una red local no necesitarás el dominio.

Bueno, ya tienes tu cacharrito con servidor de chat. A divertirse tocan.

Usar Bit.ly en WordPress para acortar URL’s

Existen dos formas de usar el acortador de URL Bit.ly en WordPress. ¿Por qué usar Bit.ly para acortar url’s y no usar, por ejemplo, perce.be? Bueno, depende del uso que le queráis dar, claro. Un site como perce.be os permite acortar la URL, cumple su función. Pero Bit.ly además de permitirnos  acortar un link también nos dará estadísticas sobre cuántas veces se ha hecho click, desde donde… en fin, tiene un completo sistema de estadísticas. (Si no queréis generarlas entonces os será más cómodo un servicio más directo, como perce.be).

Bueno, ya os he comentado que hay dos formas de usar Bit.ly en WP. La primera y la más sencilla es instalar un plugin para Bit.ly, de los que ya hay varios disponibles, pero el más recomendable es WP-bitly, ya que otros de las más populares llevan tiempo sin actualizaciones.

Pero si no quieres depdender de un plugin externo siempre puedes meterle mano al código (recordad que hablamos de instalaciones de WordPress en vuestros propios servidores, no de los WP gratuitos de wordpress.com, como este). Lo primero es que os hagáis una cuenta para acceder al API de Bit.ly, y tras esto le metéis mano a functions.php:

function bitly()
{
  //información del login
  $url = get_permalink(); //genera el permalink de wordpress
  $login = 'tulogin'; //aquí mete tu nombre de usuario de Bit.ly
  $apikey = 'R_churro_de_letras_y_números'; //tu API key de Bit.ly
  $format = 'json'; //puedes elegir json o xml, en este caso json
  $version = '2.0.1';

  //creando la url
  $bitly = 'http://api.bit.ly/shorten?version='.$version.'&longUrl='.urlencode($url).'&login='.$login.'&apiKey='.$apikey.'&format='.$format;

  //obtener la url
  //también podría usarse cURL
  $response = file_get_contents($bitly);

  //ahora toca parsear según el formato
  //vamos a usar las dos posibilidades aunque arriba haya elegido json
  if(strtolower($format) == 'json')
  {
    $json = @json_decode($response,true); //descodificamos el json
    echo $json['results'][$url]['shortUrl']; //imprimimos datos
  }
  else //xml
  {
    $xml = simplexml_load_string($response); //cargamos el xml
    echo 'http://bit.ly/'.$xml->results->nodeKeyVal->hash; //imprimimos lo buscado
  }
}

Y con esto tenemos ya la función. Ahora nos queda añadirla a nuestro código. En single.php, debajo de la llamada a the_content() es el lugar ideal para meter tu llamada a bitly(). Y listo, ya estás generando tu url acortada con Bit.ly.

Deshabilitar cambio de Theme en WordPress

A veces, cuando montas un Wodpress para un cliente, no te interesa que este pueda cambiar el theme. No es por limitar la libertad del cliente, es por el riesgo de que trasteando lo cambie, luego no sea capaz de volver a ponerlo y tengas que ir a hacer mantenimiento (que siempre le puedes cobrar, pero si te está pagando una tarifa fijo por mantenimiento, que es lo normal,  eso acaba en «más trabajo por el mismo precio«). Tranquilo, basta con añadir unas pocas líneas a functions.php y evitaremos que esto ocurra, bloqueando la posibilidad de cambiar el theme del usuario.

add_action('admin_init', 'que_cambie_el_theme_tu_abuela');
function que_cambie_el_theme_tu_abuela() {
  global $submenu, $userdata;
  get_currentuserinfo();
  if ($userdata->ID != 1) {
    unset($submenu['themes.php'][5]);
    unset($submenu['themes.php'][15]);
  }
}

Y point ball (oseáse, punto pelota). Bueno, mejor no le llaméis «que_cambie_el_theme_tu_abuela» a la función, por cosas de profesionalidad, ponedle algo como «bloquear_cambio_theme«, «bloquear_theme«, etc.

Deshabilitar trackbacks en WordPress hacia tus artículos cuando los autorreferencias

Como sabéis todos los que tenéis un blog, los trackbacks son un sistema que os avisa cuando un bloguero ha hecho una referencia a uno de vuestros artículos en el suyo. Pero claro, si tú haces una referencia a uno de tus propios artículos en otro (tipo «Como ya comenté en el artículo X…») el trackback también se envía. Como generalmente no queremos comentarios de nuestros propios trackbacks en nuestros artículos os voy a enseñar un pequeño fragmento de código que, añadido a functions.php deshabilitará el auto-trackback:

function deshabilitar_autoping(&$links){
    foreach ($links as $l=>$link){
      if(0===strpos($link, get_option('home')))
         unset($links[$l]);
    }
}
add_action('pre_ping'; 'deshabilitar_autoping');

Una simple función que os ahorrará tener que estar borrando cada dos por tres vuestros propios trackbacks.

Funciones lógicas en LibreOffice Calc

En fin, ya que ando empantanado preparando temario para dar clases de LibreOffice y, a la vez, recibiendo clases de Microsoft Office creo que os van a tocar varias entradas sobre el tema en este blog.

Hoy vamos a hablar sobre las funciones lógicas en LibreOffice Calc, la hoja de cálculo de LibreOffice. Si estáis acostumbrados a Microsoft Office… son prácticamente iguales.

¿Qué son las funciones lógicas? Son funciones que trabajan con valores booleanos, es decir: verdadero o falso. En las hojas de cálculo nos permiten crear condicionales más o menos complejos. Primero vamos con la teoría «gorda» y luego en un par de ejemplos os queda más claro. Como os podéis imaginar la potencia de estas funciones no es pasarles a mano un valor VERDADERO o FALSO sino una expresión que pueda devolver ese valor (generalmente mediante una comparación).

En LibreOffice Calc tenemos las siguientes: Y, FALSO, SI, SIERROR, SIND, NO, O, VERDADERO y XOR. Vamos a verlas una por una:

Funciones de Libre Office Calc
Funciones de Calc (en gallego)

Y: Su sintaxis sería Y(valorLógico1; valorLógico2… valorLógico30). Esta función devuelve VERDADERO si todos sus argumentos son verdaderos, en caso de que alguno no lo sea devolverá FALSO. Requiere como mínimo un valor y hasta un máximo de 30.

FALSO: Esta función no evalúa ni recibe ningún parámetro, simplemente devuelve un valor FALSO.

SI: Esta función requiere tres parámetros que son una prueba lógica, un valor a devolver si se cumple y un valor a devolver si no, aunque sólo es obligatoria la prueba lógica. Más abajo os explicaré como anidar varios. La sintaxis básica es SI(prueba lógica; valor si se cumple; valor si no).

SI.ERROR: Esta función recibe dos valores y devuelve el primero si es válido. Pero si este devuelve un error entonces devuelve el segundo. La sintaxis es SIERROR(valor; valor alternativo).

SI.ND: Similar a la anterior, en este caso devuelve el valor sacando que sea #ND, en ese caso devuelve el segundo valor.

NO: Devuelve lo contrario al valor que recibe. Es decir, si recibe un VERDADERO devuelve FALSO y viceversa (vamos, que «niega» o complementa lo que tiene dentro).

O: Similar a Y en sintaxis, que es O(valorLógico1; valorLógico2… valorLógico30). En este caso la función devuelve VERDADERO si alguno de sus valores es verdadero.

VERDADERO: Como en el caso de FALSO, no recibe ni evalúa nada y, en este caso, devuelve VERDADERO.

XOR: El más complejo de explicar, se trata de una puerta lógica OR exclusiva (de ahí XOR). Dicho así acojona, pero es más facil de lo que parece. La sintaxis es como en el caso de Y y O, vamos XOR(valorLógico1; valorLógico2… valorLógico30) y el caso es que devuelve VERDADERO si un número impar de los valores que se le han proporcionado son VERDADEROS.

Ahora tomemos un conjunto de datos aleatorios:

Manolo 30 años Madrid

Pedro 60 años Barcelona

Juanki 45 años Zaragoza

Toño 18 años Buenos Aires

Derrick 23 años La Habana

Juampi 36 años Cedeira

Macael 22 años Medellín

Ok, supongamos que los tienes esto en una tabla, empezando en A2, como la de la foto.

Tabla con datos del Ejemplo
La tabla de ejemplo

Ahora imagina que después hay un campo donde quieres meter un dato, en este caso vamos a decir que un porcentaje que tienen que pagar. Pero hay condiciones: Los que sean de Cedeira y tengan menos de 40 años (ambas) tendrán que pagar 100$; los que sean de La Habana o tengan 45 años o más (una de las dos) pagarán sólo 75$. El resto pagarán 120$. ¿Cual sería la fórmula? Bueno, pues sería la que puedes ver en la imagen (supongamos que me he situado para escribir la fórmula en la primera fila de datos, lo que sería justo a la derecha de Barcelona, con la idea de hacer la fórmula, calcular y arrastrar hacia abajo para que se aplique al resto):

Fórmula para solucionar el ejemplo

Como tengo el LibreOffice en gallego igual te despista así que te traduzco la fórmula:
=SI(Y(C2=»Cedeira»;B2<40);100;SI(O(C2=»La Habana»;B2>=45);75;120))

Explicación de la fórmula: Abrimos un SI y como prueba lógica le decimos que compruebe las dos primeras condiciones (ser de Cedeira y menor de 40) que por tener que cumplirse ambas van dentro de un Y. En caso de que sea correcto devuelve 100, en caso de de que no anidamos otro SI, que en este caso comienza comprobando que se de alguna (por eso usamos el O) de las otras condiciones, que son ser de La Habana o tener 45 años o más. En caso de que se cumpla devolverá 75 y en caso de que no, es decir que el registro no ha cumplido ni las condiciones del primer chequeo ni las del segundo, en ese caso devuelve 120. Ves, no era tan difícil, todo es ir pensando cómo hay que anidar las cuestiones. El resultado sería este:

Tabla del ejemplo con los resultados
Resultados

Y en el caso del XOR, como os decía antes, tenéis que pensar que sólo devuelve verdadero si el número de elementos que recibe que dan verdadero son impares. Pensad en aquellas tablas de lógica aristotélica del instituto: En un XOR VERDADERO+FALSO=VERDADERO, FALSO+FALSO=FALSO, FALSO+VERDADERO=VERDADERO, VERDADERO+VERDADERO=FALSO. Parece coñazo pero es simple.

En fin, os dejo con esto. En el futuro más funciones.

El uso de la etiqueta meta viewport

En el mundo de la web móvil la etiqueta meta viewport se ha convertido en un elemento esencial, básico en los últimos tiempos. Inicialmente introducida por Apple en su navegador Safari para iPhone, rápidamente fue adoptada por otros navegadores hasta hacerse habitual en todos los OS móviles. Esta etiqueta busca dar una serie de directrices a los navegadores para que rendericen adecuadamente la web.

Hay que ponerse un poco en situación: cuando aparecieron los primeros smartphones no había webs adaptadas para dispositivos móviles, y pasó tiempo hasta que las hubo (a día de hoy todavía hay muchas páginas que no se visualizan correctamente). ¿Solución? Que el teléfono «emule» una pantalla más grande y la web original se redimensione a ese tamaño. La idea es buena ¿El problema? Bueno, que era una solución temporal para aquel momento, pero que en la actualidad se queda coja. Este sistema que nos muestra una pantalla reducida hace que si hemos hecho una maquetación responsiva con media queries la cosa no acabe de funcionar. Para eso está meta viewport, para establecer el ancho, el alto o el zoom de la página.

La meta viewport utiliza una serie de pares de claves=valores para definir diversos comportamientos del navegador a la hora de renderizar la web:

<meta name="viewport" content="
	width = [tamaño en pixels | device-width ],
	height = [tamaño en pixels | device-height],
	initial-scale = float mayor que 0.1,
	minimum-scale = float mayor que 0.1,
	maximum-scale = float mayor que 0.1,
	user-scalable = [yes | no]
">

<!--Un ejemplillo real tras la teoría-->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

Muy bien ¿y para qué vale cada una?:

Bueno, width lógicamente para definir el ancho de la pantalla. Podéis definir un ancho fijo, lo cual en términos generales viene a ser un epic fail. En cambio si usáis device-width esta ya se adaptará directamente al dispositivo.

Sobre heigth lo mismo, sólo que en este caso se define el alto. En la práctica no se me ocurre quién querría definir un alto estático, pero existir existe.

Para regular qué zoom tendrá por defecto la página está initial-scale, a la cual le tienes que dar un valor a partir de 0.1, siendo el valor 1 el equivalente a no tener zoom (es decir, menos de uno reduce y más de 1 amplía).

La pareja maximum-scale y minimum-scale nos permiten definir cual será el zoom máximo y el mínimo que pueda aplicar el usuario. Como arriba, 1 es igual a que se vea tal cual, sin zoom.

Finalmente user-scalable lo que nos permite es definir si queremos que el usario pueda hacer zoom o no. Lo mejor es dejarlo en yes, ya que no es buena idea poner limitaciones al user, y mucho menos en el caso del zoom, ya que podría tratarse de alguien con problemas de visión que necesite ampliar la página para poder leerla. Con el maximum y el minimum scale tres cuartos de lo mismo, piensa bien qué hace si vas a poner límites.

En fin, con esto ya tienes otro paso para mejorar tus diseños web adaptados a dispositivos móviles.

Hashes de passwords en PHP 5.5

Uno de los problemas de los algoritmos criptográficos, como le explicaba el otro día a mi madre, es que al ser susceptibles de poder ser rotos por fuerza bruta cada X tiempo tienen que renovarse, dado que la mayor capacidad de procesamiento de los equipos (y más con la posibilidad de hacer computación distribuida) los hace vulnerables con el paso de los años. Decía un profesor mío, y un gran profesor por cierto, «por fuerza bruta todo se rompe, sólo hace falta tiempo«.

La hasta ahora última versión de PHP nos ofrece nuevas funciones a la hora de trabajar con hashes de passwords. Antes era tradicional utilizar funciones como md5(), sha1(), crypt() o hash(). El problema de usar md5() o sha1() es que usan algoritmos muy directos y ligeros. Es decir, que hacen la encriptación y resumen muy rápido, lo cual aunque beneficia el rendimiento en caso de un ataque (lo más habitual con md5() es el llamado «ataque de cumpleaños» que en lugar de intentar encontrar tu contraseña intenta encontrar simplemente una que de el mismo resultado como resumen) facilita la labor del atacante. En cambio hash() y crypt() son algoritmos más complejos, más lentos, tardan más en devolver el resultado. Algo que para el usuario es un imperceptible segundo de espera, pero que en caso de un ataque que tiene que probar millones de combinaciones se convierte en un poderoso impedimento.

En todo caso PHP 5.5 nos provee de nuevas funciones para trabajar con hashes de passwords:

  • password_get_info
  • password_hash
  • password_needs_rehash
  • password_verify

Las más importantes, en el uso normal que podemos hacer de estas funciones son la segunda y la cuarta. Empecemos entonces por password_hash():

Como su nombre indica, la función genera un hash de tu contraseña. Lógicamente tiene que recibir dicha contraseña como primer parámetro. Como segundo debe recibir una constante con el algoritmo a usar (las opciones son PASSWORD_DEFAULT, que es el que usa por defecto PHP, y PASSWORD_BCRYPT, que nos permite definir varias opciones), y si eliges PASSWORD_BCRYPT puedes pasarle como tercer parámetro una serie de opciones. Las más habituales son cost, que es el «coste de computación» o «número de vueltas» que dará el algoritmo y cuanto más alto sea este número menos rendimiento y más seguridad, y salt, que nos permite «salar» el password (añadirle una cadena para hacer más complejo el asalto a la contraseñas). Un ejemplo con las dos opciones, sacado de la web de php.net


<?php
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT)."\n";

$options = [
    'cost' => 7,
    'salt' => 'BCryptRequires22Chrcts',
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>

Como podéis ver se hacen dos hashes. El primero con los parámetros por defecto y el segundo usando PASSWORD_BCRYPT con un menor coste para el sistema (el cost en el algoritmo por defecto sería 10) pero con un salt definido. Por lo que he leído el algoritmo por defecto siempre mete un salt aunque no lo definas e incluso se recomienda que mejor dejar a PHP hacerlo antes que meter una cadena estática.

En el caso de password_verify() la cosa es más facililla. La función recibe la contraseña en texto plano y el hash, encriptado con la función password_hash(). Si conciden nos devuelve TRUE y si no coinciden nos devuelve FALSE.

De nuevo me remito al ejemplo del php.net para esto:


<?php
// Ver el ejemplo de password_hash() arriba para ver de dónde viene este hash.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo '¡La contraseña es válida!';
} else {
    echo 'La contraseña no es válida.';
}
?>

Con estas dos funciones podéis hacer de manera muy simple un sistema de login en PHP, con apoyo de una base de datos.

MAT: Limpiando metadatos en Ubuntu

Capítulo 3 del tema de metadatos y software libre. Ya los limpiamos de LibreOffice y de los JPG, pero ahora toca el capítulo final. ¿Si te digo que hay un toolkit que los limpia de casi todos los formatos? Ok, podría haber empezado por ahí… pero así me ha dado para tres artículos.

¿Qué es MAT? Es Metadata Anonymisation Toolkit, una serie de herramientas que borrarán los metadatos de vuestros archivos en Ubuntu: ofimáticos, imágentes, pdf, torrents… No soporta todos los formatos del mundo, pero sí muchos de los más habituales.

Aunque si vamos a ser sinceros, este no es un software de Ubuntu sino de Debian, pero al ser una aplicación el Python bastan con unas cuántas dependencias instaladas y la cosa irá como la seda.

Lo primero, a instalar las dependencias:

sudo apt-get install python-hachoir-core python-hachoir-parser python-pdfrw python-cairo python-poppler python-mutagen libimage-exiftool-perl libimage-info-perl

Con esto instalado basta bajarse el archivo comprimido con el programa desde su sitio oficial. Una vez descargado lo descomprimís y le otorgáis permisos de ejecución. Podéis hacerlo desde el entorno gráfico con un click derecho en Propiedades->Permisos->Permitir ejecutar el archivo como un programa sobre el archivo mat-gui; pero si preferís también podéis hacerlo desde comandos:

sudo chmod  +x mat-gui

Llegados a este punto deberíais tener el programa instalado y funcionando. Para su uso tendrás un entorno gráfico extremadamente simple: Un botón para agregar archivos, otro para limpiarlos, un botón para buscar qué ficheros tienen metadatos y un botón de cierre/apagado de la aplicación. Todos con iconos muy intuitivos. En su menú de Preferencias (se accede a través del menú Edit) podrás definir opciones como si quieres que genere una copia limpia de metadatos o si prefieres que directamente sobreescriba el original (la opción Backup), y algunas más menos interesante.

En fin, con esto ya podéis vivir más tranquilos en cuanto al tema de ir dejando vuestra información por la red.

Eliminar metadatos de fotos en Ubuntu

Si hablábamos el otro día de metadatos en OpenOffice/LibreOffice hoy vamos a ver cómo borrar los metadatos de las fotos, en este caso sólo del formato jpg. Muchas veces subimos fotografías desde el móvil, lo cual lleva un montón de metadatos inscrustados, los llamados EXIF.

Y es que si una cámara ya va proporcionar la fecha y la hora en la que fue tomado y el modelo (y en caso, por ejemplo, de mi cárama Olympus un montón de datos técnicos, como el modo de flash, el perfil de color…) un móvil puede traer hasta las coordenadas geográficas del lugar donde se ha tomado la foto.

Ya sea por respeto a nuestra intimidad, paranoia o simplemente que hayamos puesto una excusa y esa foto nos la pueda joder («-Cariño estaba trabajando» «-Pues según esta foto a esa hora estabas en el bar») en Ubuntu/Mint/Debian tenemos una herramienta que permite que nuestros jpg se queden limpitos de ellos: jhead.

Se trata de una herramienta de línea de comandos, por lo que lo primero es instalarlo:

sudo apt-get install jhead

Luego la orden para eliminar los datos tampoco tiene mucha ciencia:

jhead -purejpg /ruta/imagen.jpg

Basta con pasarle la ruta de la imagen que queremos dejar sin metadatos y punto. Pero lo verdaderamente útil, como en todo el software de consola, viene cuando queremos trabajar con muchos archivos:

jhead -purejpg /ruta/*.jpg

Podemos usar comodines para afectar a todos los archivos de una carpeta concreta, ahorrándonos el trabajo de ir uno a uno.

Como ya dije arriba, este software sólo trabaja con jpg y sus derivaciones: jpeg, JPEG y JPG. En cualquier caso es el formato más habitual en cámaras y móviles, pero de todas formas en el futuro hablaremos de más opciones para trabajar con imágenes.

Quitar barra de Hola Search

Ayer la gente de Questionarity me comentó que podría ser interesante hablar de otro adware, Hola Search, que según parece se está extendiendo bastante entre equipos con Windows, metiéndose en Chrome, Safari, Explorer o Firefox. Se trata de otro de esos browser hijackers (secuestrador de navegadores) que se instalan a traición como un programa legítimo al descargar software de ciertas fuentes (teóricamente legítimas), te redirige las búsquedas a una página fraudulenta, te cambia la página de inicio y te bombardea con publicidad . Yo como siempre insistiré en que si queréis instalar algo lo hagáis siempre desde la web del fabricante, que los terceros suelen colar estas cosas. Tranquilo, ya nos hemos ocupado de cosas así antes y lo bueno de este tipo de malware es que es muy evidente su infección, por su propia naturaleza, no es silencioso.

He de reconocer que en este  caso todavía no me las he visto con este cabroncete, pero hice una simulación con una máquina virtual, forzando la infección en un Windows Server 2k3.

En fin, la prevención está bien para el futuro, pero seguro que lo que te interesa ahora mismo es ver cómo te cargas esto. En fin, casi todo el Adware se elimina de la misma forma, y este Hola Search no es una excepción. Todo es cuestión de bajarse una serie de programas para liquidarlo (luego vendrán los comentarios «Pues yo lo desinstalé y ya va»… vale bonito, ya verás qué risa cuando reinicies) y ejecutarlos. Lo primerito, para evitar conflictos: desactiva tu antivirus habitual. Ya lo pondrás a rular después.

Primero los colegas de Infospyware nos proporcionan AT-Destroyer, lo descargas, instalas, ejecutas, le das a Search and Destroy y esperas. Cuando acabe os pedirá reiniciar. Obedeced.

Todavía no está acabada la cosa. Comprobad que no se ha reactivado el antivirus en el reinicio, y si lo ha hecho lo desactiváis otra vez. Ahora toca descargar Adwcleaner. El procedimiento es como antes: descargáis, instaláis, ejecutáis y pulsáis Delete. Cuando acabe, otra vez a reiniciar.

Ahora lo mejor es que paséis un antivirus en la nube, probad en este caso con Panda Cloud, aunque si tenéis otro preferido también valdrá. El caso es comprobar que no haya nada raro por el equipo.

Y para finalizar, como siempre desinstaláis todo lo que habéis necesitado para la limpieza, descargáis CCleaner y lo usáis para limpiar coockies y basurillas varias, y de paso ponéis un poco en orden el registro.

Y con todo esto ya deberíais tener vuestro navegador (sea Chrome, Firefox o Explorer) y vuestro equipo limpito de Hola Search (y puede que de otra cosa más disimulada que estuviera también espiándoos)