domingo, 25 de abril de 2010

Dandole caña a VIM

Venga va, una de VIM. Como todo el mundo conocerá, VIM es uno de los grades editores de texto modo consola que existen. En todas las máquina UNIX viene instalado VI por defecto, que es su versión little ( de hecho VIM es la versión ampliada ). Bien, hay un montón de manuales sobre VIM en internet, muchísimos. Pero una buena herramienta para aprender a usar el vim es el vimtutor. Es un comando que ejecutas en la consola y se te va a abrir un manual/tutorial para que vayas siguiendo. Muy útil.
Instalar el VIM:
$ sudo aptitude install vim

Bien, este post es una recopilación de comandos que uso en Normal mode, que me ayudan a trabajar mucho mas rápido. Es de nivel medio-avanzado. Si nunca has usado VIM, ejecuta "vimtutor" en un terminal y peléate con el durante un par de días, mejor.

Para empezar vamos a ver los típicos de borrar:
dd = Borra la línea actual
d = Borra desde donde estás hasta el fin de la línea
d3 Borra la línea actual más las tres líneas inferiores a la actual

Estos mismos comandos se pueden hacer con solo copia, y no borrado:
yy = Copia la línea actual.
Y = Lo mismo que "yy"
y = Copia hasta el final
y3 = Copia la línea actual más las tres de arriba.

Pero para hacer el copiado de una manera mas humana tenemos el modo VISUAL. Este se activa pulsando la tecla "v". Con el modo VISUAL activado podemos, desde nuestra posición actual, mover las flechas de dirección y ir seleccionando un texto deseado. Veamos un ejemplo:
vy = Esto nos pone vim en modo VISUAL, seleccionamos hasta el final de la línea y vamos marcando las tres líneas de abajo para ser copiadas. Finalizamos con "y" para copiar. Si pulsásemos "d" en vez de "y", borraríamos el texto seleccionado.
Y si queremos copiar todo un párrafo? Pues muy simple. Para movernos al inicio del párrafo, en normal mode ( Pulsar Esc ) pulsamos "{". De este modo estaremos situados al inicio del párrafo. Ahora, para seleccionarlo debemos ponernos en modo visual y pulsar la tecla "}". Y el comando "y". Quedaría algo como lo siguiente:
{v}y
Esto se puede simplificar y ahorrarnos ponernos en modo visual, haciendo uso de "y" primero. Seria algo así:
{y} = Nos situamos al inicio del párrafo, le damos a copiar y le decimos hasta donde. Con "}" estamos diciendo que queremos copiar hasta el final de párrafo actual. La misma manera de hacer una cosa, pero de dos modos distintos.

Si queremos copiar desde un sitio, digamos A, hasta un sitio B, tenemos un par de comandos muy buenos.
Para empezar nos situamos en A, y lo "marcamos" con el siguiente comando:
ma
ahora, para nos movemos hasta B y pulsamos, para copiar o para borrar los comandos:
d'a = borrar
y'a = copiar
Osea, marcamos el inicio y después borramos o copiamos desde el final.

Otra cosa que puede parecer una tontería pero que va bastante bien es lo siguiente. En Normal mode pulsar
:10 = Esto nos mueve la línea número 10
:+15 = Esto nos mueve 15 lineas adelante de la línea actual.

Mas comandos interesantes. Para moverte por un texto, si el cursor se encuentra en la parte de arriba y tu quieres bajar tiene que "recorrerte" toda la pantalla ya visible con el cursor para "empujar" la pantalla por la parte de abajo, esto se soluciona con los siguientes comandos:
Control + e = Para bajar
Control + y = Para subir

Y ahora los mas simples, pero que se usan mucho.
o: inserta una línea nueva justo por debajo de la línea actual
O: inserta una línea nueva justo por encima de la línea actual
p: pega justo por debajo de la línea actual
P: pega por encima de la línea actual

Para salir y guardar del documento actual se tiene que pulsar ":wq". Un modo mas simple para hacer esto mismo es pulsando ZZ. Hace lo mismo. Para guardar, cada vez tenemos que pulsar:
:w
para ahorrarnos esto, podemos hacer uso del comando nmap:
:nmap ññ :w
"" se tiene que escribir también. Ahora, cuando pulsemos ññ en el teclado, se va a ejecutar el comando ":w". Bonito, verdad? Si queremos hacer que esta opción esté siempre disponible al inicio del vim, tenemos que ediar el fichero ~/.vimrc y añadir la linea mencionada anteriormente.

Me tomo la libertad de darte un consejo: No intentes memorizar un comando. Apúntate en un papelito un par de comandos que encuentres útiles y tenlo cerca de modo que cuando quieras usarlo sepas que lo tienes ahí. En una semana te sabrás todos los comandos que te resultan más útiles de memoria, los otros seguramente no merezca la pena aprendérselos, ya que los usas mucho menos. Y cada semana, busca algún comando nuevo. Y practica mucho, mucho!

Y ahora te pregunto: cuales son tus atajos/trucos que usas? Deja tu comentario. Saludos!

sábado, 17 de abril de 2010

OpenBox: Gestor de ventanas rápido y ligero

Bueno, hoy os quiero hablar un poquito de algo que estoy probando. Un nuevo gestor de ventanas: Open Box. Ya sabéis lo que es un gestor de ventanas: los típicos ejemplos pueden ser GNOME y KDE.

Por que cambiar a algo nuevo y diferente? Bueno, el cambio es bueno. En el curro hay un compañero que lo usa y me ha picado la curiosidad. Aviso: no es algo que te instales y esté todo funcionando y perfecto. No. Se tiene que personalizar de modo que tu crees una interface entre el PC y tu de modo que te sientas cómodo para trabajar. Pero se puede personalizar hasta limites insospechados. Por ejemplo, puedes configurar hasta que cuando hagas una combinación de teclas determinada ( keybindings ) te abra tus 4 programas preferidos ( firefox, thunderbird, rythmbox y givm ) en un escritorio virtual determinado, con una resolución que tu especifiques y una disposición a tu gusto.

El estilo es muy austero, se deja de cosas visuales bonitas, pero por otra parte es muy muy rápido. Se nota mucho el cambio de GNOME a OpenBox, desde luego. El cambio de escritorio o cambiar de aplicación mediante Alt+Tab van volados. Al ser altamente personalizable, puedes ir puliendo tu escritorio de modo que cada vez te mueves más rápido en el.

Bueno, cuando instalas OpenBox, de buenas a primeras, lo único que tienes es un fondo de pantalla. Nada mas. Ni un menú, ni icono, ni barras, ni nada. Tu puntero de ratón y un fondo de pantalla. Punto. La única acción obvia que acabas probando es haciendo clic en algún espacio vació de la pantalla ( literalmente: le puedes dar en cualquier sitio ) con el botón derecho y ahí si sale un menú con un par de opciones. La verdad que a la gente que le guste experimentar ( y que tenga tiempo libre para dedicarle ) le recomiendo que lo pruebe. Que le de una oportunidad. La instalación es extremadamente simple y lo mejor es que uno no tiene que desinstalar GNOME o KDE, sino que puedes elegir el gestor de ventanas que quieres utilizar cuando haces login en tu sistema. Que te cansas o que no sabes hacer alguna cosa con OpenBox? Sales de la sesión y cargas tu gestor de ventanas habitual. Así de fácil.

Bueno, les voy a recomendar que si quieren probar OpenBox y no frustrarse al principio, le hechen una leída al siguiente manual, que es muy muy bueno ( y en inglés ):
Urukrama OpenBox Guide

Para configurar OpenBox lo único que se tiene que hacer es modificar ficheros .XML de un modo muy simple y claro. También hay algunas aplicaciones con GUI que se encargan de reducir las modificaciones de ficheros de texto, aunque la verdadera potencia de todo esto es que tu puedes modificar y adaptar los ficheros XML a tu gusto.

Links de interés:
[1]: Debian OpenBox
[2]: Urukrama OpenBox Keybindings

domingo, 11 de abril de 2010

Thunderbird - HOWTO configurar mal tu contraseña maestra

Pues hoy me he quedado bastante sorprendido, la verdad.
He instalado la versión 3.0 de Thunderbird y cuando la he ejecutado, me ha pedido mi contraseña maestra. Ni idea. Típico de mi. Pruebo un par y no va. Bueno, no importa. Las restablezco y no ha pasado nada.
Google. Buscar "reestablecer thunderbird contraseña maestra". De los primeros resultados encuentro lo que busco:
openDialog("chrome://pippki/content/resetpassword.xul")
Abro el Thunderbird 2.0, para borrar la clave maestra. Herramientras>Consola de errores y donde hay un espacio en blanco, pego la orden que hay justo aquí arriba. "Desea restablecer blablala...?". Si.

Y nada, que se ha quitado la contraseña maestra. Peeero, lo que no se han borrado han sido mis contraseñas de los diferentes correos :S. Le doy a "ver contraseñas" y, si, si, son las mías.
Pues se trataba de un mala configuración, claro. El error en cuestión es el siguiente:
En Editar>Preferencias>Privacidad>Contraseñas la opción "Usar una contraseña maestra para cifrar las contraseñas guardadas" tiene que estar marcada. Si no tus claves están desprotegidas.
Al realizar el mismo ejercicio con esta opción marcada, al borrar la clave maestra también se borran las password que protege. Realmente no se para que puede servir poner una contraseña maestra si no protege tus contraseñas, y con una sola orden se pueden conseguir. Bueno señores, revisen sus configuraciones y saludos!

viernes, 9 de abril de 2010

CUDA [II] Instalación de toolkit y SDK para CUDA

Buenooo. Ahora nos dejamos ya de palabras y empezamos haciendo algo interesante. Pero antes quiero hacer un par de notitas:
  1. Vamos a instalar drivers nuevos. Lo más fácil es que los drivers nuevos no funcionarán a la primera o vete a saber tu qué. Entiendase que se puede liar la cosa.
  2. Hay gente que ha conseguido instalar todo el SDK y todo en Ubuntu 9.10. Yo no puede/supe. Lo he probado en Ubuntu 9.04 y ha funcionado perfectamente. El soporte de nVidia llega hasta 9.04.
  3. AVISO. El material que voy a poner aqui, en su mayoría van a ser cópido de otras páginas. Como podeis imaginar hay mucha gente que ha hablado hasta ahora del proceso de instalación, lo que la información está un poco "separada". Yo os pondré lo que me ha funcionado a mi, a modo de recopilación/traducción. No dejen de visitar las fuentes originales.
  4. Comprueben que sus tarjetas sean compatibles con CUDA.
Dados estos avisos, empezemos.

[INSTALANDO 9.04]
Tuve muchos problemas en Ubuntu 9.10. Como nVidia da soporte a Ubuntu 9.04 me dije, pues instalalo. Y esto hice. He creado una partición en mi disco y he instalado 9.04. Os recomiendo que hagais igual, si os quereis ahorrar problemas. Además, así podeis hacer las pruebas que querais sin miedo a perder datos ni nada. La instalación tiene que ser nativa! No virtualizeis!

[INSTALANDO DRIVERS][1]
Una vez tenemos nuestro 9.04 funcionando y operativo, debemos instalar los últimos drivers de nVidia, los 195. Para ello seguiremos estos pasos:
$ sudo su
$ echo DRIVERS NVIDIA 195 >> /etc/apt/sources.list
$ echo deb http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main >> /etc/apt/sources.list
$ echo deb-src http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main >> /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CEC06767
$ aptitude update
$ aptitude install nvidia-195-modaliases nvidia-glx-195

[DESCARGANDO PAQUETES]
Tenemos que ir a la pagina web de CUDA, a descargas. Los paquetes que necesitamos son:
  • CUDA Toolkit for Ubuntu Linux 9.04
  • GPU Computing SDK code samples and more
La versión 32bits o 64 bits. Como corresponda. Los descargamos en el escritorio.

[INSTALANDO TOOLKIT] [2]
Para ello damos permisos de ejecución con el comando:
$ chmod +x ~/Escritorio/cudatoolkit_3.0_linux_32_ubuntu9.04.run

Y ahora lo instalaremos. Pero resulta que al instalarlo, si tenemos GDM iniciado, da un error. Para esto utilizaremos una consola tty1. Apunta los pasos ya que cerraremos GDM y te vas a quedar sin gestor de ventanas. Será solo un momento.
  • Pulsamos Control+Alt+F1
  • Entramos con un usuarios que tenga privilegios administrativos
  • $ sudo service gdm stop
  • $ cd /home/nombre_del_usuario/Escritorio
  • $ sudo ./cudatoolkit_3.0_linux_32_ubuntu9.04.run
  • $ sudo service gdm start
  • Pulsamos Control+Alt+F7, iniciamos sesion normalmente y seguimos el proceso
Ahora tenemos que añadir los directorios de nvidia a PATH. Abrimos un terminal:
  • $ sudo vim /etc/bash.bash.rc #Si no sabes usar vim, pon "gedit" en lugar de "vim"
  • Al final del fichero incluiremos dos líneas:
export PATH=${PATH}:/usr/local/cuda/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64

Si tenemos un sistema de 32 bits, cambiamos "lib64" por "lib". Guardamos el fichero y Toolkit instalado.

[INSTALANDO EL SDK][2]
Hacemos el fichero ejecutable con:
$ chmod +x ~/Escritorio/gpucomputingsdk_3.0_linux.run
No hace falta que se instale con privilegios de ROOT. Instalar con el usuario que va a usar el SDK.
$ ./gpucomputingsdk_3.0_linux.run
Las preguntas que nos hace las contestamos con un "enter". El default ya nos sirve. Una vez instalado entramos en la carpeta del SDK:
$ cd ~/NVIDIA_GPU_Computing_SDK/C
Instalamos dependencias:
$ sudo aptitude install freeglut3 freeglut3-dev libx11-dev mesa-common-dev libxmu6 libxi-dev libxmu-dev
Y compilamos los codigos:
$ make

[EJECUTANDO EJEMPLOS][2]
Si todo ha funcionado correctamente, ahora podremos ejecutar los siguientes comandos:
$ cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/released
$ ./deviceQuery
$ ./fluidsGL
$ ./smokeParticles
$ ./particles

[POSIBLES PROBLEMAS]
  • El compilador gcc tiene que ser verión 4.3 ( en mi caso 4.3.3 ). El compilador 4.4 no funciona directamente. Diríganse a [2] para ver como se puede "arreglar" el problema.
  • Es muy importante tener instalado ( y funcionando ) los últimos drivers de nVidia. El SDK funciona solo con los drivers más nuevos.
  • Links dónde encontré respuestas que ayudaron a aclararme: [3] [4]
  • De dependencias. Pero siguiendo los pasos anteriores deberían quedar todas cubiertas.

[1] Via: dame-linux. Un post simple, fácil y para toda la familia. No dejen de hecharle un vistazo.
[2] Vía stealthcopter Fué el mejor post que encontré. Lo instalan en 9.10, pero a mi no me llegó a funcionar. Yo lo he traducido y adaptado a 9.04, pero es una copia de este post.
[3] Foro de nVidia. Problemas a la ejecución de algunas demos.
[4] Foro de nVidia. Error con ficheros gl.h glu.h

CUDA [I] Introducción sobre tarjetas gráficas

[Sobre que me voy a enrollar hoy]
Hace tiempo ya, me picó el gusanillo de la programación de GPU's [1]. Es por todos conocido que las tarjetas gráficas tienen una alta capacidad de procesamiento y que se necesitan para jugar a los juegos de nueva generación. Pero, por que son tan potentes?

[Explicación]
Resulta que este tipo de hardware ha sido pensado para trabajar con mucha paralelización, es decir, muchos cálculos hechos al mismo tiempo.
Para ello, las tarjetas gráficas tienen un reloj relativamente bajo como 500MHz, o 1GHz. Y vosotros me direis: "Si ya! Pero mi PC tiene un procesador de 2.5GHz, esto es más rapido!" Y es cierto, la única diferencia es que lo más seguro es que tu procesador solo tenga un core. Y en el mejor de los casos va a tener dos o cuatro cores.

La diferencia fundamental es que las tarjetas gráficas tienen 64, 128, 256 o incluso 480 cores! Esto significa que cada uno de los 64 cores, por ejemplo, tiene una velocidad de 500MHz. Lo que una simple multiplicación (0.5GHz por 64 cores ) nos da una asombrosa velocidad de reloj de 32GHz. Eso, señores, es bastante mas que 2.5GHz. Se pueden imaginar las últimas tarjetas gráficas como la GTX 480: 480 cores a 1,401GHz = 672 GHz!!

Bien, pero no nos dejemos engañar por las cifras. 672GHz es la capacidad que puede desarrollar una tarjeta haciendo CÁLCULOS PARALELIZABLES! Osea, esto incluye toda una metodología de programación diferente a la "programación tradicional", y no todos los cálculos són paralelizables, claro! Por este motivo tenemos un procesador y una tarjeta gráfica. El procesador se encarga de los programas "unicore" ( no es una afirmación del todo cierta, ahora os lo cuento) y tiene una velociad de reloj relativamente alta, por otra parte la tarjeta gráfica se encarga de ejecutar aplicaciones que pueden ser altamente paralelizables como, [surprise surpriseee], la renderización de imágenes que es lo que se usa en los juegos. Para ello usa velocidades de reloj bajas, pero muchos cores.

Aprovechando que hablo del tema: los procesadores convencionales, a su vez, también disponen de varios cores, osea que realmente también podemos echar las mismas cuentas: Si el procesador es de 2.5GHz y tenemos 4 cores, el procesador tendrá una potencia de 10GHz para procesos paralelizables. Muy importante destacar esto último. La mayoría de programas no utilizan los diferentes cores de un procesador. Por lo que los programas pensados del modo "tradicional" trabajarían a una velocidad de reloj de 2.5GHz, mientras que los que han sido pensados para ser paralelizados trabajarían a una velocidad de 10GHz como máximo ( insisto en esto ).

[Ejemplo serializable]
Vamos a poner un ejemplo: Imaginemos que tenemos 128 números ( vamos a hacer números "redondos" 2^7 ) y queremos comprobar si son números primos o no. Nosotros programamos en un lenguaje convencional como C, por ejemplo, una función de es_primo(numero). Esta función recibe un número determinado, y devuelve verdadero o falso dependiendo si es primo o no. Bien. Pues si tenemos 128 números a comprobar lo que hará el programa será algo así:
Procesador1:
  • es_primo(1)
  • es_primo(2)
  • es_primo(3)
  • es_primo(...)
  • es_primo(127)
  • es_primo(128)
Bien! Entonces, cada llamada a la función es_primo() tardará 1 unidad de tiempo ( es un ejemplo ). Con lo que si llamamos 128 veces a la función tardaremos 128 unidades de tiempo. ok?

Imaginamos que hemos hecho el programa de modo que nosotros utilizamos una tarjeta gráfica que *casualmente* tiene 128 cores. Lo que podemos hacer es asignar a cada uno de los cores un trabajo concreto. Solo le asignamos el trabajo, todavía no lo ejecutamos! Vean:
  • Core1: es_primo(1)
  • Core2: es_primo(2)
  • Core3: es_primo(3)
  • CoreN: es_primo(N)
  • Core128: es_primo(128)
Y ahora, una vez le hemos asignado el trabajo a cada uno de los cores, les decimos a cada uno de ellos: ejecutad. Y todos, a la vez, van a hacer el cálculo. A la vez. Lo que significa que vamos a estar 1 unidad de tiempo para hacer todos los cálculos. Asombroso, verdad? Pero claro, ahora estaréis pensando. Justamente has hecho un ejemplo donde el número de cores són iguales a los números que queremos comprobar!! Vaaaale. Cierto, veamos un último ejemplo. Imaginemos que tenemos una gráfica con solo 64 cores. Seguimos queriendo calcular 128 números. Entonces asignamos dos números a cada core, de modo que queda algo así:
  • Core1: es_primo(1) es_primo(2)
  • Core2: es_primo(3) es_primo(4)
  • Core3: es_primo(5) es_primo(5)
  • CoreN: es_primo(n) es_primo(n+1)
  • Core128: es_primo(127) es_primo(128)
De este modo, cuando el Core1 acabe de ejecutar "es_primo(1)", empezará a ejecutar "es_primo(2)". Cuando demos la orden a todos los cores de que empiezen su trabajo, tardarán 2 unidades de tiempo en realizar el trabajo, ya que cada uno tiene que hacer dos cálculos, pero todos harán sus dos cálculos a la vez. Interesante, verdad?

**Nota: en el ejemplo se considera que el coste de comprobar es_primo(1) es igual a es_primo(128), aunque en realidad no tiene el mismo coste computacional. Es solo para que el ejemplo se entienda.

[Ejemplo no serializable]
Calcular los decimales del número PI. PI no puede calcularse en "partes". No le puedo decir al Core1, cálculame los decimales de PI de 1 a 100 y al Core2 que me calcule los decimales de 101 hasta 200 ya que para calcular los decimales de 101 al 200 se necesita haber encontrado los decimales de 1 a 100. Este cálculo lo hará mejor el procesador, ya que trabaja a una velocidad de reloj más alta.

[Tecnología]
Pues al tener una gráfica de nvidia ( 9600GT ), me ha apetecido probar de programarla. Para ello hay un lenguaje de programación, CUDA. Este lenguaje, que es muy parecido a C, nos permite programar y compilar los programas para que se ejecuten el la/las gráficas que tengamos instaladas. Para ello usaré ubuntu 9.04 ( ya explicaré por qué ) los drivers 195 de nVidia y el SDK que dan en su pagina web.

[Resumiendo...]
CUDA mola. Aprendamos a programar. En la próxima entrega os explico como instalar todo el SDK para programar en CUDA (ardua tarea). Espero no haberles aburrido mucho!