PC Frikis

Beta, como Goooogle

Archive for the ‘Internet’ Category

Escritorio remoto con VNC

Actualmente es bastante frecuente dejar un PC casero encendido las 24h, descargando cosas,  haciendo de servidor http o incluso, para utilizarlo desde cualquier parte del mundo como si estuvieras en tu casa, gracias a VNC.

Hay básicamente dos formas de utilizar un escritorio remoto, de forma compartida (almenos en linux) o de forma dedicada. Es decir, podemos hacer que nuestra sesión de X (o de Windows) sea compartida y otros usuarios puedan conectar a ella o podemos iniciar un escritorio al que únicamente se podrá acceder via vnc (hasta dónde yo sé esto sólo es posible en linux).

Para el primer caso, si queremos compartir nuestro actual escritorio, podemos utilizar x11vnc (apt-get install x11vnc en linux). Iniciamos el entorno gráfico (el que sea, kde, gnome, xfce, fluxbox … ) y abrimos una consola, para escribir:

x11vnc -storepasswd

Nos preguntará por una contraseña y nos dirá si la queremos guardar, introduciremos una contraseña y diremos que sí a guardar. Por defecto la guardará en ~/.vnc/passwd así que usaremos ese archivo en el siguiente comando:

x11vnc -rfbauth ~/.vnc/passwd

¡Ya está! ¡Así de fácil! Tenemos el entorno X actual disponible para acceder desde cualquier PC conectado a internet (eso sí, procura tener mapeado el puerto 5900 en tu router). Ahora sólo necesitas el visor, que puedes encontrar en la web oficial de vnc o puedes instalarlo via tu sistema de paquetes favorito (en debian apt-get install xvncviewer).

Ahora sólo te queda ejecutar el xvncviewer e indicar la ip y el escritorio, que por defecto es el 0. Si el PC donde está compartido el escritorio tiene la ip 192.168.0.4 pues pondrás en el xvncviewer 192.168.0.4:0

Si lo que quieres es crear un nuevo entorno gráfico dedicado a vnc entonces tendrás que instalar vnc4server (apt-get install vnc4server) y hacer lo siguiente:

vncpasswd

vnc4server -depth 16 -geometry 1024×768

Con el parámetro depth indicas la profundiad de color y con geometry la resolución del nuevo escritorio. Al ejecutar este comando verás algo parecido a esto:

New ‘hostname:2 (usuario)’ desktop is hostname:2

El “:2″ es el número de escritorio, es lo que tendrás que utilizar cuando lances el xvncviewer y además, mapear el puerto 5900+2 en el router, es decir, el 5902.

Para cerrar un servidor vnc sólo tienes que hacer vnc4server -kill :2 (o el número que sea).

Sí, es cierto, lo acabo de descubrir, y luego explicaré los detalles, pero antes quiero contar qué es lo que me ha llevado a afirmar esto.

La semana pasada me tocó analizar junto a un compañero un código JavaScript que no funcionaba correctamente, utilizaba arrays asociativos para almacenar distintas categorías, por ejemplo:

var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;

Hasta aquí, todo parece normal, es un array asociativo, como clave guardo el código del país y como valor el nombre, igual que lo haría en PHP por ejemplo. Pero luego, al intentar ordenarlo con opciones.sort(); que supuestamente ordena el array, no funcionaba, ni siquiera pasándole como parámetro una función personalizada para la ordenación (Especificación del método sort)
Supusimos que el método sort() no soportaba arrays asociativos e implementamos la solución utilizando arrays normales y corrientes, con claves numéricas, a la vez que nos preguntábamos cómo podía ser que JavaScript tuviese esa falta tan grave.

Hoy me disponía a comentar este error y buscar una nueva implementación de sort que soportara arrays asociativos (o incluso hacerla yo mismo si no hubiese encontrado ninguna) cuando sin quererlo me he encontrado con que JavaScript no tiene arrays asociativos, no existen. Entonces, ¿Cómo es que el ejemplo anterior funciona? (Sin contar el método sort)

Funciona porque lo que estamos haciendo es añadirle propiedades al objeto de tipo Array. En JavaScript, cuando hacemos variable['nombre'] lo que ocurre es que añadimos una nueva propiedad con el nombre “nombre” al objeto “variable”. Por eso, si hacemos:

var paises = new Array();
paises['es'] = ‘España’;
paises['pt'] = ‘Portugal’;
paises['us'] = ‘Estados Unidos’;
paises['uk'] = ‘Reino Unido’;
alert(paises.length);

Si existiesen los arrays asociativos debería aparecer una ventanita con un 4 ¿verdad? Pues como no existen, sale un 0, porque no le estamos añadiendo valores al array, si no propiedades al objeto.

Otros hechos que hacen sospechar de que JavaScript no tiene soporte para arrays asociativos es que no hay forma de definir un array asociativo ni con el constructor del objeto Array ni con la sintaxis para crear un array de forma literal.

Me he sorprendido mucho al leer esto en http://www.andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ , pues llevo años viendo como en muchos tutoriales explican equívocamente cómo utilizar arrays asociativos en JavaScript, tal y como yo lo he hecho.