domingo, 16 de mayo de 2010

Instalando Apache2, para dummies [I]

[Disclaimer]
Hace nade que dije que dejaba el blog, porque no tenía cosas interesantes que contar y falta de tiempo. Dije que escribiría esporádicamente. Pues este fin de semana he tenido algo de tiempo libre y ha salido algo así:

[Introducción]
Esto quiere ser un pequeño manualillo, sobre la instalación Apache. Me gusta empezar con lo básico y después ir subiendo el nivel. (si tengo tiempo)
Bueno, como introducción diremos que Apache es un servidor web que se encarga de servir contenido web, ya sea estático o dinámico. Hay muchos servidores web, pero Apache es uno de los más usados en el mundo, ya sea para webs modestas o para webs con mucho tráfico. Al final el manualillo debes ser capaz de empezar a aprender HTML, PHP, JavaScript o CSS ( o todos a la vez! ).

[Instalación]

Para empezar tenemos que instalar Apache ( y PHP, ya que estamos ):

$ sudo aptitude install apache2 php5 libapache2-mod-php5

Para ver si la instalación ha ido bien abrimos nuestro navegador por defecto y entramos en:
http://localhost

Debería salir una de mis frases preferidas en informática: "It works"

[Configuración y gestión]

Bien, con apache instalado vamos a aprender unas comandas básicas para gestionarlo, antes de ponernos a jugar con el.
Si queremos [apagar/encender/reiniciar] el servicio Apache 2 podemos hacer:
$ sudo service apache2 stop
$ sudo service apache2 start
$ sudo service apache2 restart

Cuando iniciamos el servidor apache, éste carga todas las configuraciones a memória, lo que significa que si hacemos un cambio en los ficheros de configuración ( que se encuentran en /etc/apache2 ), los cambios no tendrán efecto hasta el próximo reinicio de Apache. Es importante acordarse de reiniciar el servicio después de cada modificación! Para no tener que hacer un restart ( que realmente hace un "stop" y para luego hacer un "start" ) tenemos el comando siguiente:
$ sudo service apache2 reload

Este nos cargará los nuevos ficheros de configuración a memória si todo ha ido bien.

Es bastante típico encontrarse con un error tal que así: Editamos el fichero "/etc/apache2/apache2.conf" ( podría ser cualquier otro ) y ponemos una línea nuevo con "ErrorrrLevel debug", que está mal escrito a propósito. Si ahora reiniciamos apache nos da un mensajito, nada amistoso a mi parecer, que reza algo así:

inedit@wally:/etc/apache2$ sudo service apache2 reload
Syntax error on line 110 of /etc/apache2/apache2.conf:
Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration
...fail!

Bueno, realmente el servicio sigue corriendo con la configuración antigua, no se ha roto nada. Para comprobar si todos los ficheros de configuración són correctos podemos ejecutar el comando:
$ apache2ctl configtest
El error sería exactamente el mismo que hemos visto antes haciendo un "reload":

inedit@wally:/etc/apache2$ apache2ctl configtest
Syntax error on line 110 of /etc/apache2/apache2.conf:
Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration

Es una buena práctica ejecutar este comando para ver si todo se ha configurado correctamente.

Que pasa si hacemos un "sudo service apache2 restart" en un servidor que está en producción? Osea, en un servidor que puede estar teniendo conexiones en el mismo momento que reiniciamos? Pues facil, que los clientes van a recibir un precioso error en su navegador. Y claro, no queremos que esto ocurra. Para ello usa siempre que puedas (es la manera educada de decir que lo uses SIEMPRE) "reload". Pero aún así hay un comando que nos garantiza que no van a perderse las conexiones activas con el servidor. Este comando es:
$ sudo apache2ctl graceful

[Creación de contenido y URL's]
Visitante: "Si, pero yo he entrado en esta página esperando hacer cosas chulas con Apache, y tu solo me hablas de configuracioneees".
inEdit00: "Ya lo seee, impacienteee! Vamos a hacer un brake:"

En la carpeta "/var/www" es donde se almacena el contenido de tu página web. Esto significa que si haces un:
http://localhost/index.html estás accediendo a /var/www/index.html
del mismo modo que si pones:
http://localhost/foo.html estás accediendo a /var/www/foo.html
o que si pones:
http://127.0.0.1/imagenes/foo.jpg estás accediendo a /var/www/imagenes/foo.jpg

Pillas la idea? Es evidente que estos ejemplos no van a funcionar si no tienes los ficheros "index.html", "foo.html" o la carpeta "imágenes" con una foto dentro!

Visitante: "Por que has puesto "localhost" y después '127.0.0.1'? Me confunde."
inEdit00: "127.0.0.1" designa tu ordenador, esto se llama loopback ( prueba a hacer "ifconfig lo" ). Osea, es una IP que "apunta" al mismo equipo. Todos los equipos tienen esta configuración. Como tu tienes instalado el servidor web de Apache en tu equipo, necesitas conectarte a el. Si tienes Apache instalado en un PC fijo y quieres acceder al servidor desde un portátil de tu misma red puedes hacer algo tal que así: deberás buscar tu dirección IP ( ejecuta "ifconfig" para saber que IP local tienes ) que será algo así: 192.168.1.96 ( por ejemplo ). Entonces desde el portátil tienes que poner en el navegador "http://192.168.1.96" y deberías ver "IT WORKS", o lo que contenga el fichero "/var/www/index.html" . Capito?

Visitante: "...o sea, que si en mi portátil pongo la IP del PC fijo puedo ver lo que sirve Apache... interesante"
inEdit00: "Claro, siempre que Apache esté funcionando! A partir de ahora se va a ejecutar como demonio ( en segundo plano ) cada vez que inicies el PC fijo"
Visitante: "Ei! Esto no funciona! He hecho un 'http://localhost' en el portátil y no tira!"
inEdit00: "Claro, alma de cántaro. 'localhost' designa el mismo ordenador. Si pones esto en el portátil, él intenta conectarse a si mismo, y como no tienes ningún servidor web instalado, no funciona! Usa la IP del PC fijo, que para esto están"
Visitante: "..ah, si... tiene sentido."
Visitante: "entiendo. Entonces localhost es parecido a '127.0.0.1'?"
inEdit00: "Acertaste! De hecho quiero que veas esto. Ejecuta el siguiente comando:"
$ cat /etc/hosts
inedit@wally:~/hola$ cat /etc/hosts
127.0.0.1 localhost
127.0.0.1 linuxjan.ib
127.0.0.1 js.com
192.168.1.36 ofelia

Bueno, a ti te deberían salir menos entradas que a mi. Qué es esto? Pues es una relación clave-valor (IP-nombre). A la izquierda se encuentran las IP's y a la derecha los nombres de dominio. Osea, si te fijas tengo asignados diferentes nombres para "127.0.0.1": "localhost, linuxjan.ib, js.com". Lo que significa que si pongo "linuxjan.ib" en mi navegador, se dirige a '127.0.0.1' igual que si pongo 'localhost'. Esto sirve para no tener que recordar IP's, sino nombres de dominio. Puedes ver que el último elemento de la lista es diferente del resto. Lo que yo hago aqui es decirle que la dirección IP "192.168.1.36" se llama "ofelia", para no tener que acordarme de su IP.

inEdit: "Que te parece?"
Visitante: "osea que si modifico localhost..."
inEdit: "yo no haría esto! Mucho programas usan localhost como referencia a la misma máquina, mejor deja la entrada donde está"
Visitante: "pero puedo añadir elementos a la lista? Como por ejemplo: '127.0.0.1 www.paginapersonaldeprueba.com' ?"
inEdit: "claro. Pruebalo. Cuando accedas a la URL que hayas elegido, deberías ver lo de 'It works!'"
Visitante: "y también puedo añadir '127.0.0.1 www.google.com'?"
inEdit: 'si pero...
Visitante: "Pues voy a probarlo! Mola. Pero... ostia! El google ha dejado de funcionar!!!!"
inEdit: "... pero si pones un nombre de dominio que ya exista, este se resolverá primero con las entradas de tu fichero "/etc/hosts" y si allí no se encuentra, se intentará resolver por DNS. Puedes arreglarlo quitando la línea del fichero."
Visitante: "No, la dejo! Y ahora voy a putear a mi hermana quitándole el google"
inEdit: ".... ¬¬"
(dos minutos después)
Visitante: "No lo entiendo, a mi no me funciona pero a ella si!"
inEdit: "claro, macho! Porque el fichero /etc/hosts está en tu PC, y no en el suyo. Esto solo son cambios locales, si tu pones una entrada así: '127.0.0.1 srv.com' esto solo funcionará en tu PC. Ok?"
Visitante: "Vale, lo entiendo. Los cambios solo son locales."
inEdit. "Exacto. Sigamos:"

A partir de ahora ya puedes empezar a crear tus páginas creando ficheros dentro de "/var/www". También puedes ( debes! ) crear carpetas para distinguir las imágenes de las hojas de estilos ( CSS ) del JavaScript! Si haces esto:
$ sudo mkdir /var/www/sub-folder
Y después creas el fichero "index.html" dentro así:
$ sudo gedit /var/www/sub-folder/index.html
Y pones como contenido algo así:
<>
<>
<>Estamos en sub folder!< /p>
< /body>
< /html>

Nota: he puesto dos espacios antes de cada "tag" para que blogger no lo interprete. Se debe escribir sin doble espaciado.
Para acceder a este contenido puedes hacerlo así ( en tu navegador ):
http://localhost/sub-folder
http://localhost/sub-folder/index.html

Apache se encarga de cargar el fichero "index.html" ( si existe! ) si como nombre de la ruta se le especifica una carpeta.

[Despedida]
Bueno, y esto es todo por hoy. Ahora puedes buscar por internet cualquier manual sobre:
  • HTML: para contenido estático.
  • CSS: para estilo ( colores, formatos, dimensiones, efectos, etc... )
  • JavaScript: para validaciones, para hacer peticiones asíncronas al servidor, modificación/creación de objetos del DOM en tiempo real..etc ( muy recomendado usar MooTools )
  • PHP: lenguaje de programación muy asequible para empezar ( por dificultad ) y muy fácil coger malas costumbres. Las birrias funcionan, aún siendo birrias. Pero bueno, por algo se tiene que empezar.

martes, 11 de mayo de 2010

Me preguntaba...

...hasta cuando duraría la broma. Muy señores mios: todo se acaba.

Empezar con el blog fue algo divertido, compartía lo que iba haciendo y que encontraba que podía ser de interés para otros. Yo he disfrutado mucho haciendo esto. Pero desgraciadamente ya no puedo llevarlo con el ritmo de antes. Ahora estoy currando ( en prácticas ) y aprendiendo un montón. Me encantaría poder compartir mis conocimientos y todo lo que estoy aprendiendo ahora con todos vosotros, pero me temo que no tengo tiempo para dedicarme, y todo va muy deprisa.

Es por esto que digo oficialmente que el blog queda en estado de hibernación. No es un adiós, es un "hasta luego". No quiere decir que haga un post ocasional, pero seguro que será algo extraordinario. Y volveré! Con mas cosas nuevas para compartir con todos ustedes. Gracias por estar aquí.

¡¡Saludos!!!


P.D::
Siempre que un blogger al que seguía ha dicho que no publicaría más, me sabe mal. Pero se entiende que la gente tenga vida también. Yo seguro que no soy muy leído, pero aquí os dejo una lista de los blogs que sigo y que mas me gustan para que me podáis reemplazar y no lloréis tanto mi pérdida ( xD ). Ahí van:
[INFORMÁTICA]
[TECNOLOGÍA]
[SISTEMAS]
[FUN]
EnlaceEnlaceEnlace

domingo, 2 de mayo de 2010

Androide Libre, sorteo de Nexus One

Muy señores mios, hoy he visto que sortean en www.elandroidelibre.com un Nexus One, ni mas ni menos!

La verdad sea dicha, normalmente no participo en estos sorteos, pero la verdad que un Nexus One es un buen filón. Lo mejor de todo? Que tiene Android. En el trabajo hemos estado jugando con Android y la verdad que se puede hacer de todo! Ya viene con Python instalado por defecto con todas sus librerías preparadas para ser usadas. También incluye la típica consola, lo que convierte al SO en un buen candidado para administrar un sistema de manera remota, en caso de urgencia ( ver los, reiniciar servicios, etc... ).
Aparte de todos los sensores, como el acelerometro, que supongo que dan mucho juego cuando programas aplicaciones visuales.

Bueno, que si me toca un Nexus One ya haré un par de posts sobre como es el sistema y que tal se puede programar en el.
Saludos!

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!