Tunel inverso en SSH

Hoy he tenido que buscar información en Internet porque tenía la necesidad de realizar un tunel inverso en shh para redirigir uno de los puertos del servidor a mi máquina local. Buscando por Internet he visto que se hacía con la opción -R pero tras varias pruebas he visto que no funcionaba:

ssh -R 80:localhost:80 username@servidor.com

Aparentemente todo funcionaba correctamente pero el puerto no recibía conexiones. Al final he buscado por Internet y la solución ha sido editar en el servidor el fichero /etc/ssh/sshd_config y añadir las siguientes líneas:

Match User username
   GatewayPorts yes

Tras reiniciar el servicio todo ha funcionado correctamente.

Migrar de Google Maps 2 a Google Maps 3

Si quieres migrar de Google Maps 2 a Google Maps 3 tienes que cambiar bastates cosas de tú código actual. Lo primero que debes haces es cambira la clásica cabecera de Google Maps 2:

<script src="http://maps.google.com/maps?file=api&v=2.x&key=$KEY&sensor=false"/>

Por esta:

<script type="text/javascript" src="https://maps.google.com/maps/api/js?key=$KEY&sensor=false"/>

Después hay que ir cambiando el código línea a línea. En la versión 2 había muchos objectos que se llamaban Gxxx (la G de Google seguida del nombre de la clase. Ahora los objetos están en el epacioa de nombres google.maps que habrá que incluir al crear un objeto.

Por ejemplo, el mapa que antes se llamaba GMap2, y ahora se llama google.maps.Map. Para crear un mapa antes:

map = new GMap2(document.getElementById("map_canvas"));

Ahora hay que hacer un:

map = new google.maps.Map(document.getElementById("map_canvas"));

Crear una capa de KML y cargarla en el mapa se hacía en la versión 2 como:

kml = new GGeoXml($KML_URL);
map.addOverlay(kml);

En la versión 3:

kml = new google.maps.KmlLayer($KML_URL);
kml.setMap(map);

Las clases GCopyrightCollection y GCopyright han desaparecido. Para intruducir ahora un copyright hay que hacer lo siguiente:

copyrightNode = document.createElement('div'); 
copyrightNode.id = 'copyright-control'; 
copyrightNode.style.fontSize = '11px'; 
copyrightNode.style.fontFamily = 'Arial, sans-serif'; 
copyrightNode.style.margin = '0 2px 2px 0'; 
copyrightNode.style.whitespace = 'nowrap'; 
copyrightNode.innerHTML = 'My Copyrigth'; 
copyrightNode.index = 0; 
map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(copyrightNode);

Para más información, consultar el API de Google Maps 3

java.net.UnknownHostException con Serviio

Al arrancar el Serviio aparecía una excepción en el log:

java.net.UnknownHostException: =: =
  at java.net.InetAddress.getLocalHost(InetAddress.java:1360)
  etc

He comprobado el fichero /etc/hosts y todo parecía correcto. Así que he ejecutado el comando hostname

$ hostname
=

¡Mi equipo se llama =! No sé cómo ha podido ocurrir esto pero para solucionarlo simpremente he ejecutado el comando hostname con el parámetro nombre del host y luego Serviio ha arrancado sin problemas.

Monitorización de discos

Los discos duros fallan en determinadas ocasiones y en bueno que los monitorizemos constantemente para detectar el fallo lo antes posible. La mejor solución que he encontrado para monitorizar los discos ha sido Smartmontools.

La instalación es muy sencilla:

sudo apt-get install smartmontools

Para asegurarse de que los discos lo soportan, hay que ejecutar el comando smartctl con el parámetro -i. Por ejemplo:

sudo smartctl -i /dev/sda 
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

Para ejecutar un demonio que compruebe el estado de los discos, hay que editar el fichero /etc/default/smartmontools y descomentar la línea que dice start_smartd=yes.

Ahora hay que editar el fichero /etc/smartd.conf para decidir cuándo y qué se va a monitorizar. En concreto, buscamos la línea DEVICESCAN y escribimos lo siguiente:

DEVICESCAN -S on -o on -a -m me@example.com -s (S/../.././04|L/../../6/04) -M daily -M exec /usr/share/smartmontools/smartd-runner

Lo importante aquí son la opción -m, que indica la dirección de correo dónde se tienen que enviar los posibles errores. -s, que indica cuándo se tiene que hacer el análisis. En el ejemplo se hace un análisis sencillo todos los días a las 4 de la mañana y un análisis largo los Sábados a las 4 de la mañana. El resto de opciones se pueden comprobar en la web de la herramienta.

Y ya sólo faltaría iniciar el demonio con:

/etc/init.d/smartmontools restart

Convertir un PDF a una imagen

Hoy he tenido la necesidad de convertir un pdf a una imagen y tras googlear un poco he encontrado la solución en la herramienta convert:

convert documento.pdf document.jpg

Y ya está lista la imagen para poder usarse.

error: possibly undefined macro: AC_CHECK_FT2

Hoy estaba compilando mod_tile en Ubuntu 12.04 y al ejecutar el autogen.sh obtenía el error:

configure.ac:35: error: possibly undefined macro: AC_CHECK_FT2
     If this token and others are legitimate, please use m4_pattern_allow.
     See the Autoconf documentation.

He estabo buscando la macro por Internet y al final la he encontrado en la librería freetype2. Para poder compilar he ejecutado:

sudo apt-get install libfreetype6-dev

Y ya es posible compilar e instalar mod_tile en el sistema

Terminar la sesión y dejar un comando en ejecución

Otra vez me ha pasado lo de siempre: es tarde, me quiero ir a mi casa y llevo una hora esperando a que termine un comando que olvidé ejecutar con nohup. Sé que si cierro la sesión, se les enviará a todos los procesos una señal que hará que se detenga su ejecución. ¿Qué puedo hacer?

La respuesta la he encontrado en el comando disown cuya sintaxis es disown [jobid]. Así, primero se suspende el proceso en ejecución con CTRL Z, a continuación se pone en background con bg. Después ejecutamos el comando jobs para ver los trabajos en ejecución en la terminal y a continuación ejecutamos disown. Ya podemos cerrar la terminal e irnos a casa que el comano seguirá ejecutándose en el servidor.

$ ./myscript.sh CTRL+Z
[1]  + suspended  ./myscript.sh
$ bg
[1]  + continued  ./myscript.sh
$ jobs
[1]+  Running ./myscript.sh
$ disown %1

Skype y el Google Chrome

La semana pasada se anunció la compra de Skype por parte de Microsoft por tropecientos mil millones de euros. Acabo de instalar una actualización de Skype que el terminar me ha preguntado si quería descargar el Google Chrome y si quería que fuera mi navegador predefinido. ¿Alguien se apuesta una cerveza a que este comportamiento desaparece en menos de tres días ;-)?

Compra de Novell por Attachmate

Esta mañana me he enterado que la compañía Attachmate ha comprado Novell por unos cuantos millones de dólares. ¿Qué quién ha comprado a Novell? La verdad es que nunca había oído hablar de esa empresa, pero estoy seguro que a partir de ahora y sobre todo durante estas semanas vamos a oir hablar de ella muchísimo. Y además parece ser que Microsoft está detrás de este tremendo negocio.

Hace unos pocos meses se anunció la compra de Sun por parte de Oracle y las comparaciones son inevitables. En el primer caso se adquirió a la empresa responsable del desarrollo de Java/MySQL/OpenOffice. En el segundo, nada más y nada menos que SUSE/Mono (¡y algunas patentes de Unix!)

Supongo que todavía es pronto para saber si la nueva empresa va a hacer algún cambio importante en alguno de los proyectos que acaba de adquirir. Yo sólo sé que ya me he instalado el LibreOffice.

Instalar Android 2.1 en Motorola Dext

La semana pasada adquirí un Motorla Dext de Movistar. El problema es que el teléfono viene de serie con el Android 1.6 y no puede ser actualizado a la versión 2.x (al menos, no de momento). En la página de Motorla dicen que están trabajando en ello, pero de momento no hay nada de nada.

Buscando por Internet he encontrado éste tutorial y tras seguir los pasos al pie de la letra, he conseguido en unos pocos minutos tener el Android actualizado a la versión 2.1. De momento no he observado los efectos secundarios que se comentan en el tutorial, y lo único que he comprobado es que ya tengo acceso a todas las aplicaciones del Market compatibles con la versión 2.1, que son bastantes más que las que eran compatibles para la versión 1.6.

WordPress Themes