Archivo para febrero de 2012

El discurso trasnochado de un dinosaurio de la cultura un negocio caduco

¿Habéis visto ayer la gala de los Premios Goya? Yo tampoco.

El caso es que haciendo un poco de zapeo en todos los canales de la TDT sin ni siquiera ver ninguno, me encontré con que Enrique González Macho, el presidente de la Academia de Cine, iba a dar su discurso. Muy entretenido, por cierto.

A lo que voy: lo que vino a decir fue que Internet no forma parte del cine, ni en cuanto a distribución ni en cuanto a producción. Insistió en la palabra “desgraciadamente” y en que el futuro de Internet “todavía no ha llegado”.

Lo segundo fue un grande y sonoro “¿qué hay de lo nuestro?” dirigido al ministro José Ignacio Wert sobre las subvenciones. Vamos, se les vio el plumero. Algo así como que sin subvenciones no podremos mantener nuestra mansión.

Y, ahora, mi respuesta para el señor Macho: diría que está usted ciego. Pero no. La realidad es que no quiere ver, y ya sabe lo que dice el refrán.

Internet, como dijo el año pasado Alex de la Iglesia, no es el futuro, es el presente del cine. Y no sólo eso, es el presente del cine, la música y la literatura. Y, si me apura, de todo lo demás relacionado con la economía.

Usted, señor Macho, dice que no Internet es un futuro de distribución que todavía no hay llegado. Entonces ¿qué hace toda esa gente que se baja películas de Internet? ¿No existen? Eso es lo que ustedes quisieran…

Además, tampoco quiere ver que tecnología hay más que suficiente para distribuir películas, cobrando, a través de Internet. ¿Hay oído hablar usted de Netflix? Supongo que no, aunque se autocalifique de internauta. Para la música, ya que estamos, ¿hay oído hablar de Spotify? Y, para literatura, ¿ha oído hablar de 24symbols? ¿O del novísimo Booquo?

¿Ve, señor Macho? Ya hay empresas privadas que están haciendo lo que usted dice que es imposible. Empresas privadas, empresas cuyo único fin es ganar dinero. Y lo ganan. Vaya si lo ganan. ¿Y usted nos está vendiendo la moto de que Internet no sirve para ganar dinero vendiendo películas? ¡Ah!, claro. Para lo que no sirve es para seguir manteniendo los abusivos precios de las salas de cine, ni los mismos abusivos precios de los derechos de autor, ni para los caprichosos artistas del “trabajo un día y cobro siempre”.

Su negocio está caducado. Cuanto antes lo admitan, antes volverán a estar arriba. Alex de la Iglesia os lo dijo el año pasado. Tuvisteis un año para dar algún paso donde mostrar actitud y, no sólo no lo hicisteis, sino que seguís defendiendo algo muerto a capa y espada a costa del dinero de todos los españoles.

Ustedes deberían estar preocupados por esa testarudez. Los internautas, las personas, estamos muy tranquilas, porque todos sabemos que el tiempo suele poner a cada uno en su sitio.

Generar diccionarios de palabras en texto plano

Un diccionario, en la jerga informática, es un archivo de palabras en texto plano —es decir, sin formato— donde generalmente hay una palabra por línea. Este tipo de diccionarios tiene muchos usos, entre ellos la de actuar como base de correctores ortográficos como, por ejemplo, el diccionario de Mozilla Firefox.

En Linux existe un paquete de software llamado Aspell que es la base de la mayoría de correctores ortográficos que se usan en este sistema operativo. Y, Aspell, obviamente, también tiene muchas palabras de diferentes idiomas que usa para su cometido, sólo que los tiene en su formato interno.

Pero, ¿qué pasa cuando queremos obtener un diccionario para nuestros propios fines? Por ejemplo, para instalarlo como corrector ortográfico de Eclipse. Pues para ello, haremos uso, en Linux, del nombrado paquete Aspell en su forma de comando de consola. El famoso comando, que luego explicaré, es este:

$ aspell --lang=es dump master | aspell --lang=es expand | tr ‘ ‘ ‘\n’ > spanish-dict.txt

Este gran comando, en realidad son cuatro (separados por ‘|’ y el último por ‘>’):

  1. aspell --lang=es dump master: Vuelca todas las palabras del diccionario interno de Aspell a formato de texto plano y una por línea, con la salvedad de que dichas palabras tienen códigos específicos para poder expandirlas (por ejemplo, poder expandir el infinitivo de un verbo en todas sus formas).
  2. aspell --lang=es expand: Dada una entrada (que en el comando es la salida del comando anterior), expande cada palabra de cada línea en todas las que puede generar. Por ejemplo, lo que he comentado antes, un verbo en todas sus formas. Esta expansión se hace en la misma línea, es decir, todas las formas verbales, por ejemplo, aparecerán en la misma línea separadas por espacios.
  3. tr ' ' '\n': La entrada de este comando es la salida del anterior, transformando todos los espacios en retornos de carro. Con esto se consigue que, ahora sí, cada palabra esté en una línea.
  4. > spanish-dict.txt: Finalmente, la salida del comando anterior se redirige a un archivo cuyo nombre es “spanish-dict.txt”.

Ahora, en el archivo spanish-dict.txt tenemos 1 250 789 palabras, una por línea, que podremos usar para lo que queramos.

P.D.: Llegados a este punto, os podéis preguntar para qué sirven, además, estos diccionarios, porque sólo como corrector ortográfico podría parecer poco, ¿no? Pues lleváis razón. Una de las cosas donde más se utilizan estos diccionarios, a parte de corregirnos las faltas, es para crackear contraseñas. El método se llama ataque de diccionario y consiste en coger cada una de las palabras del archivo e ir probando si coinciden con la contraseña. Y, como la mayoría de las contraseñas que usamos son débiles, pues suele ser bastante rápido el descifrado.

Fe

Fe significa no querer saber la verdad.

Friedrich Nietzsche (1844 – 1900), filósofo, poeta, músico y filólogo alemán, considerado uno de los pensadores modernos más influyentes del siglo XIX.

De ortografía (o por qué es más importante expresar bien las ideas)

El otro día, leyendo los comentarios de las noticias de Menéame, me quejo de que cada día menos tildes se ponen y más faltas se cometen. Que, ojo, todos las cometemos y no tiene mayor problema que el de corregirlas. Pero de ahí a jactarse de ello hay mucho. Otros argumentan, simplemente, que se centran en las ideas, no en la forma.

Pero los que se escudan en esa idea, de que si es mejor el contenido que la forma, tendrían razón si no fuera porque, a veces, con eso de no preocuparse de la forma, no se entiende el contenido.

Y esto, precisamente, me lo recordó esta entrada de DesEquiLIBROS donde la viñeta pone un ejemplo bastante claro.

Aún así, otra entrada de este blog, ¿Realmente son pocos los inconvenientes que provoca la ausencia de tildes? Me dispongo a comprobarlo, lo ilustra muchísimo mejor. Vemos unos pequeños ejemplo:

El diccionario era amplio, pero él lo amplió aún más como ahora lo amplío yo.

El editor asesino de tildes barrió el barrio hasta que alguien le pisó el callo y calló.

Habla tú ahora: bebe a la salud de su bebé y pregúntate si sin tildes cabrá la cabra.

Antes de que alguien le cascara la cáscara de lector, catalogó la novela sin tildes en el catálogo de lo nefasto y me pidió que no celebre que llegue a ser célebre (y no lo celebré).

La escritura sin tildes contrarió al contrario tal como yo le contrarío ahora.

La moraleja de la historia es bien sencilla: cuida la ortografía igual que las ideas, no vaya a ser que digas lo que no quieres decir por ahorrare un par de tildes.

En resumen, como dicen en el blog: “Las tildes sólo1 molestan a quienes no saben dónde ponerlas”.

P.D.: Una de las mejores cosas para tomar consciencia de qué es lo que habéis escrito ahorrándoos esas tildes es poner vuestro texto en un lector de pantalla. Vamos, que sea el ordenador quien lea. Y también los tenéis on-line.

P.D.2: Los lectores de pantalla son más importantes de lo que la gente piensa en general, ya que las personas con deficiencias visuales también navegan por Internet, y el lector de pantalla es una de las formas que tienen de saber lo que hay escrito. ¿Habéis pensado alguna vez cómo una persona ciega lee vuestros comentarios? Imaginaos, ahora, si contienen faltas de ortografía.

1 Actualización 2012-02-22: Ese “sólo” no llevaba tilde en su forma inicial, como recomienda la RAE, pero yo, presonalmente, prefiero cometer esa falta de ortografía pos si hay ambigüedad, como en la frase “esta tarde estaré solo comiendo”. ¿Estaré solo, sin acompañamiento, o estaré solamente comiendo? :grin:

6 años ya

Hoy hace 6 años que empecé con el blog. ¡6, ya! No me lo creo ni yo. Y, bueno, sigo manteniendo a la caterva de lectores… unos 100 diarios :grin: .

Como siempre, gracias a todos por leer y, sobre todo, gracias por comentar (a los que comentan).

Esperemos que, aunque la afluencia de entradas se ha visto disminuida con el tiempo —será cosa de la edad…—, la cosa no decaiga y sigamos así.

Gracias ;) .

Envidia

La envidia es una declaración de inferioridad.

Napoleón Bonaparte (1769 – 1821), militar y gobernante francés, artífice del golpe de Estado del 18 de Brumario que le convirtió en Primer Cónsul de la República.

Super 8

Carátula de 'Super 8'

Super 8 (2011) es una película de ciencia ficción escrita y dirigida por J. J. Abrams y producida por Steven Spielberg.

La historia trata de un grupo de amigos que están grabando un película casera con una cámara super 8 y, durante el rodaje de la misma, graban el descarrilamiento de un tren en el Área 51. Cuando revelan la película ven algo que no imaginaban… y hasta aquí puedo leer escribir.

La película dura una hora y cincuenta y un minutos. Una hora cincuenta y uno de sopor y aburrimiento. Una película que pretende ser de aventuras para niños (si la calificación por edades es mayor no lo entiendo) con algún pequeño susto, pero nada más. No hay aliciente. No hay aventuras. Muchos efectos especiales pero no hay historia.

Los Goonies, a la que se quiere parecer pero sin éxito —en la forma, personajes… hasta en algunos escenarios; pero no en el contenido, obviamente—, sí es una película de aventuras que te engancha. ¡Y es de 1985!

En definitiva, con una nota en MPSO de un 3, yo no la recomiendo, y mucho menos cuando se han centrado en darle el mayor bombo y platillo porque la dirige el infame J. J. Abrams.

Y digo infame porque desde el final de Perdidos, todo lo que huela a que este hombre mete la nariz, para mi queda automáticamente descargado.

P.D.: Hablando de Perdidos, si queréis ver una buena explicación del final de Lost, en el blog de pjorge tenéis una excelente. Eso sí, no esperéis que mejore la cosa. Sólo es una opinión que, por otra parte, a mi me parece totalmente coherente aunque no satisfactoria.

Actualización del firmware del Papyre 6.1

Hace tiempo que me regalaron el lector de libros electrónicos Papyre 6.1, pero hasta hoy no me había planteado siquiera actualizarlo. Digamos que es un dispositivo que no requiere mucha atención de mantenimiento. Aún así, hoy tocó.

Papyre 6.1

Para la actualización, lo primero es bajarse el nuevo firmware (esta es la edición 1; edición 2; mucho ojo con confundirlas porque haréis de vuestro dispositivo un ladrillo caro) de la Web oficial de Grammata.

Pero vamos por partes: lo primero, necesitas una tarjeta SD de al menos un GB formateada en FAT16. Sí, curioso, pero no queda otra.

Luego copias el contenido archivo descargado (si el archivo descargado está comprimido, necesitas descomprimirlo antes ya que el archivo necesario es el *.bin que hay dentro) en el directorio raíz de la tarjeta SD. Ten en cuenta que para la edición 1 del Papyre el archivo de llama V3update.bin y para la edición 2 se llama v3asetup.bin.

Una vez descargado y copiado en la tarjeta, se apaga el dispositivo, se inserta la tarjeta y se vuelve a encender con la tecla de subir volumen presionada.

En el inicio mostrará un mensaje en pantalla indicando qué está haciendo y luego, si todas las comprobaciones han sido correctas, pedirá que presiones “ok” para iniciar la actualización. En unos cinco minutos tendrás tu nuevo Papyre reluciente. O eso, o un ladrillo muy caro.

De todas formas, a poco que se busque en Internet encuentras soluciones para “desenladrillar” este dispositivo.

Después de la actualización, lo que he notado ha sido… nada. Supongo que serán cosas internas. Pero bueno, funciona, que es lo importante.

Sesión remota gráfica en Linux

Cuando accedemos a un ordenador, generalmente lo hacemos en modo consola, es decir, estamos delante de la pantalla, el teclado y el ratón y todo lo que hagamos mediante la interfaz lo hacemos en la máquina que tenemos delante.

Pero ¿qué pasa cuando queremos trabajar en otro ordenador pero sin movernos del nuestro? Bien porque está lejos, bien porque somos unos vagos… :grin:

En Windows es de sobra conocido el Protocolo de Escritorio Remoto, donde nos conectamos a cualquier ordenador con Windows cuyo equipo esté compartido (que acepte conexiones remotas) y tenemos, en una ventana o en pantalla completa, el escritorio completo del ordenador remoto con el que podemos trabajar como si estuviéramos delante.

Y, en Linux, ¿podemos hacer algo similar? La respuesta corta es: por supuesto. La respuesta larga incluye la siguiente explicación:

El sistema operativo GNU/Linux cuenta con un servidor gráfico (la aplicación que gestiona la interfaz gráfica de usuario) llamado X.org, que es una implementación del sistema X Window System. Este servidor es el programa encargado de gestionar las pantallas, las ventanas y, también, las conexiones remotas a otros equipos para tener interfaz gráfica remota. El protocolo usado para estas conexiones remotas, que es lo que nos interesa, se llama XDMCP.

Este servidor gráfico se apoya en otra aplicación, llamada Display Manager, encargada de iniciar dicho servidor gráfico a la vez que muestra la pantalla de acceso, es decir, donde se pone el usuario y la contraseña. Y seguro que los usuarios de Linux conocéis más de un gestor de pantalla: xdm, gdm, kdm, lightdm

A partir de este punto donde ya sabemos, más o menos, cómo funciona esto de la gestión de la interfaz gráfica, lo que nos queda para habilitar el acceso remoto en Linux es configurar el gestor de pantalla (display manager) del ordenador remoto al que queremos acceder para que tenga activado el protocolo XDMCP.

Hay que tener en cuenta que cada gestor usado (como hemos dicho: gdm, kdm, lightdm…) tiene su propia configuración, pero para el más moderno y usado en la última versión de Ubuntu, lightdm, la configuración está en el archivo /etc/lightdm/lightdm.conf (para el resto se puede ver su configuración usando el manual o, en una consola, con el comando man <dm>). En este archivo de configuración hay que activar el protocolo XDMCP añadiendo las siguientes líneas en dicho archivo:

[XDMCPServer]
enable=true

Y luego reiniciar el servidor lightdm —teniendo en cuenta que se cerrarán todas las sesiones— con el comando:

$ sudo service lightdm restart

Ya tenemos nuestro servidor funcionando y aceptando conexiones remotas. Y, ahora, para acceder a él, lo podemos hacer de dos formas:

La primera es usando el programa Xnest que se instala escribiendo el comando sudo apt-get install xnest. Luego, para lanzar la sesión remota hay que lanzar el comando:

$ Xnest :1 -query remote.server

En el caso de que tengáis en vuestro equipo más de una sesión gráfica iniciada, hay que cambiar el :1 por un número de pantalla que no está usado. Además, remote.server puede ser tanto el nombre de un servidor como su IP.

Con este comando se nos abrirá una ventana donde aparecerá la pantalla de acceso a nuestro servidor remoto como si estuviéramos delante de él.

Ventana de Xnest

La segunda opción es lanzar directamente las X (otra instancia del servidor X.org) desde un terminal mediante el comando:

$ X :1 -query remote.server

Hay que tener en cuenta lo mismo sobre el número de pantalla (:1) y el nombre del servidor que con Xnest.

Con este comando, en lugar de abrir una ventana, lo que hará será cambiar de terminal virtual (VT) —de forma similar a cuando cambiamos entre la interfaz gráfica y una consola con las teclas Ctrl+Alt+F1/F7— a, generalmente, el número 8 (Ctrl+Alt+F8) mostrándonos la pantalla de acceso al sistema remoto.

Con el segundo método realmente parece que estamos delante de la máquina remota ya que no hay ventanas de por medio que aparenten estar en un sistema virtualizado. Además, con las combinaciones de teclas Ctrl+Alt+Fx bastará para cambiar entre equipos de forma muy cómoda y muy rápida, teniendo tanto la sesión local como la sesión remota totalmente activas y funcionales.

Y realmente es muy cómodo no tener que desplazarse para trabajar en otros equipos cuando necesitas la interfaz gráfica. Aunque, bueno, ya sabéis que para administrar sistemas no hay nada mejor ni más rápido que una consola en modo texto, por supuesto :grin: .

Implementación de la clase de sincronización Semaphore con la librería boost (y alguna cosa más)

Una de las primitivas clásicas de la sincronización de procesos e hilos —hablando de informática— es el semáforo. La diferencia entre este y el mutex es que el semáforo se puede bloquear y liberar desde diferentes hilos/procesos mientras que el mutex no; es para proteger una zona de código (el acceso a variables por un sólo hilo).

La librería boost —una de las mejores librerías generalistas para C++ que hay, por no decir la mejor— no hay un semáforo de este tipo propiamente dicho, sino que se usan variables de condición para implementarlo; o semáforos con nombre, aunque estos son más específicos para sincronización entre procesos en lugar de entre hilos. Esta implementación se basa mucho en el estándar POSIX de hilos (pthreads) pero orientándolo a objetos.

Es por esto que, para no tener que usar un variable de condición, un mutex y un contador cada vez que se quiere implementar un semáforo, se puede usar esta clase:

#include <boost/thread.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/mutex.hpp>

class Semaphore {
	private:
    	mutable boost::mutex fMutex;
	    boost::condition_variable fCondVar;
    	unsigned long fCounter;
    	
	public:
    	Semaphore(unsigned long counter)
          : fMutex(),
            fCondVar(),
            fCounter(counter)
        {
    	}

	    void post() {
    	    boost::mutex::scoped_lock lock(fMutex);
    	    ++fCounter;
    	    fCondVar.notify_one();
	    }

    	void wait() {
    	    boost::mutex::scoped_lock lock(fMutex);
    	    while(fCounter <= 0)
    	        fCondVar.wait(lock);
    	    --fCounter;
    	}
    	
    	bool isLocked() const {
    		return fCounter == 0;
    	}
};

Un buen ejemplo de uso de un semáforo es implementar una cola de datos usada para el famoso problema del productor/consumidor, es decir, tenemos dos procesos, uno que produce datos y los mete en la cola, y otro que los consume sacándolos de dicha cola teniendo en cuenta que, cuando la cola está vacía, el consumidor está bloqueado esperando a que haya más valores.

Para ello, la implementación de la cola podría ser la siguiente:

#include <deque.hpp>

using std::deque;

template <typename T>
class Queue {
	private:
		deque<T> fQueue;
		mutable boost::mutex fAccessLock;
		mutable Semaphore fSem;
		
	public:
		Queue() : fQueue(), fAccessLock(), fSem(0) {}
		
		virtual ~Queue() {}
		
		virtual void push(T elem) {
			fSem.post();
			boost::mutex::scoped_lock lock(fAccessLock);
			fQueue.push_front(elem);
		}
		
		virtual T pop() {
			fSem.wait();
			boost::mutex::scoped_lock lock(fAccessLock);
			T elem = fQueue.back();
			fQueue.pop_back();
			return elem;
		}
};

Y el programa de prueba implementando dos funciones, una el productor y otra el consumidor, y usando hilos de boost sería:

#include <boost/ref.hpp>
#include <boost/date_time.hpp>
#include <iostream>

template <typename T>
void
producer(Queue<T>& q) {
	int counter = 0;
	int times = 5;
	while(!boost::this_thread::interruption_requested() && times-- > 0) {
		for(int i = 0; i < 5; i++) {
			cout << "producer: inserting " << counter << endl;
			q.push(counter++);
		}
		sleep(4);
	}
}

template <typename T>
void
consumer(Queue<T>& q) {
	while(!boost::this_thread::interruption_requested()) {
		cout << "consumer: extracting " << q.pop() << endl;
		boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	}
}

int
main() {
	Queue<int> q(7);
	
	boost::thread p(producer,boost::ref(q));
	sleep(1);
	boost::thread c(consumer,boost::ref(q));
	
	p.join();
	c.join();

	return 0;
}

En este ejemplo, el hilo productor inserta cinco números cada 4 segundos (a ráfagas) mientras que el productor saca un número cada 100 milisegundos. Cuando la cola está vacía, gracias al semáforo el hilo consumidor espera hasta que el productor inserte más números, y así sucesivamente.

Pues sí, pues vale, muy bonito, pero ¿para qué se usa esta cola y el productor/consumidor? Pues, en informática, en multitud de software. Por ejemplo, en el reproductor multimedia que usáis todos los días. El hilo productor es el que hilo que lee del disco duro la música insertando los datos leídos en un buffer (en la cola), y el consumidor es el hilo que saca los datos de ese buffer, los decodifica y los envía a la tarjeta de sonido. Y con el vídeo funciona igual (aparte, claro, de los mecanismos de sincronización entre sonido y vídeo).

Pero en esta implementación hay una cosa que falta: el productor debería parar de insertar elementos cuando la cola esta llena hasta que el consumidor saque algún elemento. Pero esa implementación será para el próximo programa ;) .