domingo, 25 de julio de 2010

Mi dia a dia... o.... dentro de poco vuelvo.... o ... hecho en falta publicar un post...

Hace ya bastante que no digo nada. La verdad que me gustaría retomar el blog y seguir posteando cosas, a mi parecer, interesantes. Tengo que decir que estoy muy muy liado, ahora mismo. Tengo muchas cosas en marcha y una lista demasiada larga de "thinks to do".

Todavía me esperaré un poquito a volver a retomar el blog, al menos hasta que las cosas se calmen un poco y tenga mas cosas para publicar. Pero para ir haciendo boca os cuento en que ando metido:

Me compré un juguetito: un minibarebone. Es una chulada. Pequeño, silencioso, y de prestaciones moderadas. Cuando tenga tiempo ya os lo presentaré. El caso es que le he instalado un debian y lo tengo como servidor expuesto a internet. Es una gozada. Estoy instalando los servicios más basicos ( ssh, vsftpd, bind9, postfix y dovecot, apache + ssl ) y simulo que se trata de un servidor real que está a producción y que tiene bastantes accesos, osea que no me permito el hecho de reiniciar la máquina a menos que tenga que tocar algo de hardware, o cosas así. Una disfrute, vaya.

Por otra parte, al tener un servidor web propio, tengo que poner algo detrás, aparte de la página estática de saludo, y he pensado en varias cosas. Todas ellas para uso personal, pero van a ser públicas para quien quiera verlo.
  • La primera y como ejercicio puramente académico, un acortador de urls. Lo estoy haciendo usando pylons y mongo por detrás. De esto haré un pequeño manualillo para quien quiera iniciarse en esto de los sistemas model-view-controller y las bases de datos no relacionales.
  • El segundo, y para satisfacer una necesidad personal, estoy haciendo una web ( en pylons también ) que sirve para guardar tus ficheros de configuración de tu PC ( .vimrc, .bashrc, etc..) de modo que tu puedas administrar tus ficheros de configuración, y descargarlos en donde quieras que estés o simplemente para tener un backup. Este proyectito todavía se está gestando, pero cuando tenga algo os lo enseño, lo prometo. Tengo idea de publicarlo bajo una licencia libre, por si alguien quiere usarlo también en su servidor=)
  • Y la novedad, en lo que todavía no me he puesto pero no estaré mucho es con los Arduinos. Arduino es una plataforma de hardware libre, donde se puede programar microcontroladores para que hagan determinadas tareas. Desde robots que siguen líneas, apagado y encendido de luces en función de la luz exterior, controles para peceras, o hasta helicópteros a radio control. Una pasada. Todo es software libre y hay una comunidad enorme detrás. Están por llegar, y dentro de poco podré empezar a jugar con ellos. Prometo contar cosas también!
Bueno, con estas cosas que os he comentado, el curro, otras casillas ( como por ejemplo estudiar mates, para ir preparándome para la carrera ), más estas cosas molestas y tontas que tenemos que hacer los humanos como comer, dormir o tener relaciones sociales, estoy ocupado unas treinta horas al día. Y todavía quedan cosas por hacer! Pero lo disfrutando todo al máximo, todo sea dicho.

Bueno, siento haber vomitado todo esto, pero la verdad que me apetecía escribir algo en el blog, y como es mío...

Saludos y, hasta.... pronto?

domingo, 16 de mayo de 2010

Virtual Hosts en Apache2, para dummies

[Problema]
Visitante: "Escucha inEdit00!"
inEdit00: "Si, dime!"
Visitante: "Si, mira, que seguí tu manualillo sobre como poner arriba un servidor Apache y he estado haciendo mis cosillas. Ahora ya se HTML y CSS y he empezado a programar en PHP"
inEdit00: "Muy bien. Y cual es el problema?"
Visitante: "Pues mira, te cuento: ahora tengo dos páginas www.mipaginapersonal.com y www.lawebdemicurro.com, y, así como tu me enseñastes en el otro manual, he creado dos entradas en el fichero '/etc/hosts' así:"
127.0.0.1 www.lawebdemicurro.com
127.0.0.1 www.mipaginapersonal.com
Visitante: "Pero claro... estas dos URL's, apuntan hacia el directorio principal del servidor ( /var/www ) y puedo cargar un dominio, o el otro, pero no las dos a la vez!!"
inEdit00: "Bien, este problema que tienes se resuelve con lo que se llaman VirtualHosts. Te explico:"

[Explicación]
Cuando tu entras en una página web con tu navegador, haces una petición al servidor por REST ( órdenes del protocolo HTTP ), por ejemplo, si accedes a la URL: "http://localhost/index.html" realmente estás haciendo una petición al servidor tal que así:

GET /index.html
Host: localhost

Esto puedes verlo con programas como Wireshark, que se encargan de analizar los paquetes que viajan por la red, a bajo nivel. Bien, que significa esto?
Pues que del host "localhost" quieres el fichero "/index.html", así de simple.

Si haces una petición a la web "http://www.mipaginapersonal.com", haces una petición que sería así:

GET /
Host: www.mipaginapersonal.com

"GET" singnifica "dame", la barra ("/") significa el directorio principal ( que sería lo mismo que "/index.html" ) y el "Host" es la página que quieres cargar. En este caso, si tienes configurado el fichero "/etc/hosts" como tu me has dicho, te debería dar el contenido del fichero de "/var/www/index.html".

Otro ejemplo: Si vamos a la página web "http://www.lawebdemicurro.com" pasa lo mismo:

GET /
Host: www.lawebdemicurro.com

Dame el fichero "/" ( que Apache entiende como "/index.html" ) del Host "www.lawebdemicurro.com", y esto devuelve el fichero de "/var/www/index.html". Que es el mismo de antes!

Claro, así no puedes conseguir lo que te propones. Ya que los dos nombres de HOST distintos, apuntan al mismo sitio ( "/var/www" ).

Vale, ahora vamos a crear dos carpetas en el servidor, algo así:

$ sudo mkdir /var/www/mipaginapersonal.com
$ sudo mkdir /var/www/lawebdemicurro.com

Si te fijas, no he puesto las www. Es solo una preferencia personal. Pero son nombres de carpetas, les puedes poner los nombres que quieras. Bien, y ahora lo que haremos será crear un VirtualHost. Que me propongo? Algo así:
Cuando abramos www.mipaginapersonal.com abra la ruta /var/www/mipaginapersonal.com
Cuando abaramos www.laewebdemicurro.com abra la ruta /var/www/lawebdemicurro.com

inEdit00: "Te parece?"
Visitante: "Si, esto es jutsto lo que yo quiero!! Como se hace?"
inEdit00: "Bien, antes hagamos lo siguiente:"

$ sudo gedit /var/www/mipaginapersonal.com
Y añadimos aqui el siguiente texto "Bienvenido a mi página personal!!!". Guardamos y salimos.
$ sudo gedit /var/www/lawebdemicurro.com
Y añadimos aqui el siguiente texto "Bienvenido a la web de mi curro!!!". Guardamos y salimos.


[Virtual Hosts]
Bien, al lío, a por los virtual Hosts. Vamos a crear el siguiente fichero:
$ sudo gedit /etc/apache2/sites-aviable/lawebdemicurro.com

Y en este fichero añadiremos algo tal que así:


<VirtualHost *:80>
ServerName www.lawebdemicurro.com
ServerAlias www.lawebdemicurro.com
DocumentRoot /var/www/lawebdemicurro.com

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

</VirtualHost>



Visitante: "Vale, que significa cada línea?"
inEdit00: Bueno, con esto "" decimos que estamos creando un virtual host que "escuchará" cualquier IP de origen "*" y escucha en el puerto 80.
"ServerName" y "ServerAlias" sirven para especificar el nombre del Host. Este debe ser exactamente el que tu quieras. Y el mismo que hayas puesto en el fichero /etc/hosts, ok?
Y aquí viene la importante "DocumentRoot /var/www/lawebdemicurro.com". Te imaginas lo que es, verdad? Aqui le decimos en que carpeta tiene que buscar cuando intren en el nombre de dominio seleccionado. Capito?
Visitante: "Si, ya veo!"
inEdit00: "Lo demás es un tema de permisos y no me he mirado con profundiad y no acabo de entender bien, la verdad. Tu dejalo igual y debería funcionar perfecto".
Visitante: "Bien, voy a probar!"
inEdit00 Piensa que tienes que hacer lo mismo con tu dominio "www.mipaginapersonal.com", eh?"
Visitante: "Haber, pone como sería la configuración..."
inEdit00: "Justo así"

$ sudo gedit /etc/apache2/sites-aviable/mipaginapersonal.com

<VirtualHost *:80>
ServerName www.mipaginapersonal.com
ServerAlias www.mipaginapersonal.com
DocumentRoot /var/www/mipaginapersonal.com

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

</VirtualHost>



[Puesta apunto]
Visitante: "Bien, he reiniciado el apache como me dijistes ( primero con reload y después con restart ) y no funciona!"
inEdit00: "Yaaaa, prisas! Tate un momento, todavía falta algo. Ejecuta lo siguiente:"
$ cd /etc/apache2/sites-aviable
$ sudo a2ensite mipaginapersonal.com
$ sudo a2ensite lawebdemicurro.com
$ sudo service apache2 reload"

[Final]
inEdit00: "Y ya debería funcionar! Ahora si entras en 'www.lawebdemicurro.com' debería salirte el mensaje:
Bienvenido a la web de mi curro!!!
inEdit00: "Y si entras en 'www.mipaginapersonal.com' te debería mostrar:
Bienvenido a mi página personal!!!

inEdit00: "Bueno, ahora solo hace falta que te copies tus paginas con todos sus directorios dentros de las carpetas correspondientes de '/var/www' y ya está."
Visitante: "Gracias! Es justo lo que quería!"

inEdit00: "Un último detalle! Es muy importante que tengas una entrada en el fichero /etc/hosts para cada domino, de otro modo, si intentas entrar en: 'http://www.mipaginapersonal.com' y no está en el fichero hosts, no se encontrará, y la irá a buscar por DNS a ver si está en Internet (que no está, y si está no es la tuya seguro), ok?"
inEdit00: Fíjate en esto, Si accedes a :"
http://localhost/index.html estás pidiendo /var/www
http://www.lawebdemicurro.com/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html
http://index.html/lawebdemicurro/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html

inEdit00: "Lo entiendes?"
Visitante: "Si, si, claro. Como localhost es el directorio raíz y dentro hay carpetas, yo puedo acceder desde las dos rutas! Pero si quiero acceder desde un ordenador remoto deberé poner la URL completa y no localhost, porque sinó no funcionaría, verdad"
inEdit00: "Exactamente! Ala , hasta la próxima!"



Nota: Recuerta, TÚ eres el visitante, si tienes dudas o necesitas ayuda, no dudes en dejar comentarios!

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!

viernes, 26 de marzo de 2010

Insertar codigo funente en Blogger

En el post anterior me he encontrado con el problemilla: quería insertar un código C en blogger y no me dejaba. Solución: VIM

Los pasos que he seguido han sido estos:
[MODO FIKI]
1) Abrir con vim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).
2) Lo transformamos a HTML con VIM pulsando lo siguiente:
:TOhtml
3) Guardamos el nuevo documento en un fichero con el siguiente comando (opcional)
:w nombre_de_fichero.html
4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos[1***]:
:1,$ s/<>//g
5 ) Seleccionamos todo el documento con el comando (nótese que no se han puesto ":" al inicio )
ggVG
6) Copiamos con el comando
"+y
7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.

[MODO MENOS FRIKI]
1) Abrir con GVim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).
2) Lo transformamos a HTML con GVim pulsando lo siguiente:
:TOhtml
3) Guardamos el nuevo documento en un fichero (opcional)
Archivo>Guardar
4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos:
Edición>Buscar y reemplazar
y buscamos "<>"[1***] y lo reemplazamos por "" (osea, nada. dejamos el campo vacío)
5 ) Seleccionamos todo el documento:
Editar>Select All
6) Copiamos:
Editar>Copiar
7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.

[1***] Nótese que he escrito cada vez "<>". Así no está bien. Se tiene que escribir SIN espacios, ok?

Bueno! Y esto es todo por hoy! Saludos!

Pregunta: Como lo haces tú? Deja tu comentario! Gracias.

Criba de Eratóstenes

[Estoy de vacaciones.... y claro, me aburro. Lo mío es ir haciendo cositas, y ahora me encuentro con demasiadas horas por delante vacías]

Bueno, hoy quiero hablar de la Criba de Eratóstenes. Más información en su wiki. De manera resumida es algo así:
Explicación
La criba de Eratóstenes consiste en calcular los números primos menores que N. Este algoritmo es muy eficiente para calcular números primos pequeños ( menores de 10M ).
Para ello utilizaremos un vector de booleanos. Si una celda vale 1, es primo, si vale cero, no lo es. Bien. Al principio ponemos a 1 todos el vector, de modo que, en todos los números sean "primos". Ahora empezamos con el 2 ( ya que todos los números son divisibles entre 1 ). Por cada numero divisible entre 2 menor que N, lo tachamos (4, 6, 8, 10, .... ). Después hacemos lo mismo con el número 3 (6, 9 12...) . Cuando llegamos al número 4, vemos que está tachado ya que es múltiplo de 2, entonces lo ignoramos. Llegamos al 5, y tachamos todos los múltiplos de 5 menores que N. Y así... si llegamos a un número tachado, pasamos al siguiente. Si llegamos a un número que no está tachado, vamos tachando todos sus múltiplos. Al final, los números NO tachados ( con un 1 ), son los números primos. Vean su wiki para ver la representación visual.

Qué he hecho
Bien, pues he hecho un código en C ( estoy aprendiendo a programar ) para calcular los números primos entre 2 y N, siendo N=10.000.000 y que guarda los resultados en un fichero. En mi PC tarda aproximadamente 1.45 segundos. Me he complicado un poco la vida y lo he que uno pueda . Al final he conseguido poner el valor de N tan grande como quiera ( en realidad no es así, ya que estamos limitados por la memória RAM del sistema )calcular los números primos entre 2 y 450.000.000. El fichero resultante pesa unos 400MB.

Compilación
Para compilar el código fuente, lo grabamos en un fichero "criba.c" y lo compilamos así:
$ gcc criba.c -o criba -lm
Y para ejecutar el código tan solo tenemos que escribir:
$ ./criba
Esto nos creará un ficherito "primos.txt" con los resultados.

Configuración
Pues básicamente jugaremos con las constantes N y M. N es el tamaño del bloque y M en número de bloques. Osea, que se van a calcular los números primos que vayan desde 2 hasta N*M. En mi PC N=1M funciona, pero en otro PC igual podría dar fallo. Disminuyese esta cantidad y auméntese en numero de iteraciones ( M ). Recuerden que el algoritmo se vuelve ineficiente a partir de 10M!


Codigo

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// Each size block
#define N 1000000
// Iterations
#define M 10
//Memory that will be used for store all primes( must be aviable )
#define memory_size M*N*sizeof(long int)*0.08

// Put all values to zero
void initialization(unsigned long int * primes_numbers[]){
int i;
for (i=0;i<memory_size;i++)
(*primes_numbers)[i] = 0;
}

// Save all primes calculated in a file
void save_in_file(unsigned long int * primes_numbers[]){
FILE * fp;
unsigned long long int i;
fp = fopen("primos.txt", "w");
for (i=0;(*primes_numbers)[i];i++)
fprintf(fp, "%ld\n", (*primes_numbers)[i]);
fclose(fp);
}

// Count all the primes calculated
void count(unsigned long int * primes_numbers[]){
unsigned long long int i,j;
j = 0;
for (i=0;(* primes_numbers)[i];i++)
j++;

printf("Total primos encontrados: %lld\n", j);

}

// Check that in the list of prime numbers all are primes
// alert: very slow in very large amount of numbers
void check(unsigned long int * primes_numbers[]){
unsigned long long int i;
for (i=1; (*primes_numbers)[i] != 0; i++){
if ( is_prime((*primes_numbers)[i]) != 1)
printf("FUckkk! %ld\n", (*primes_numbers)[i] );
}
}

// Print all primes calculated
void imprime(unsigned long int * datos[]){
unsigned long long int i;
printf("Llistat:\n");
for (i=0;(*datos)[i]!=0;i++)
printf("%ld\n", (*datos)[i]);
}



int sieve_of_eratosthenes(unsigned long int * primes[], long long int * last_prime_inserted){
char list[N];
unsigned long long int i, j, max;
list[0] = 0;
for (i=2;i<N;i++)
list[i] = 1;

max = sqrt(N)+1;

for (i=2;i<max;i++){
if (list[i])
for (j=2; i*j<N;j++)
list[i*j] = 0;
}
j = 0;
for (i=0;i<N;i++)
if (list[i]){
(*primes)[j] = i;
j++;
}
*last_prime_inserted = j - 1;
return 0;
}

// Calculate the next block of primes
int next(unsigned long int * prime[], unsigned long long int block_number, long long int * last_prime_inserted){
char list[N];
unsigned long long int i, j, min, max;
min = (block_number-1)*N;
max = block_number*N;

//Set all numbers as primes
for (i=0;i<N;i++)
list[i] = 1;
list[0] = 0;

// Mark all numbers alredy calculated
for (i=0;(*prime)[i];i++){
for (j=min/(*prime)[i]; (*prime)[i]*j<max; j++){
if ((*prime)[i]*j>min){
list[((*prime)[i]*j)%N] = 0;
}
}
}

j = *last_prime_inserted;
// Save the new primes
for (i=0;i<N;i++){
if (list[i]){
// printf("%ld j:%ld\n", i+min, j);
(*prime)[j] = i+min;
j++;
}
}
*last_prime_inserted = j - 1;
}

// Calculate all the primes
int calc(int n){
unsigned long long int position_last_prime;
unsigned long int * primes_numbers;
primes_numbers = malloc(memory_size * sizeof(unsigned long int));
initialization(&primes_numbers);
sieve_of_eratosthenes(&primes_numbers, &position_last_prime);
int j;
for (j=2; j<=n; j++){
printf("Calculando %d...\n", j);
next(&primes_numbers, j, &position_last_prime);
}
//imprime(numeros_primos);
printf("Guardando...\n");
save_in_file(&primes_numbers);
//check(&numeros_primos);
count(&primes_numbers);
printf("Done!\n");
free(primes_numbers);
return 0;
}

int main(void){
calc(M);
return 0;
}

int is_prime(int n){
int i, j, prime;
prime = 1;
for (j=2; j<n/2; j++)
if (n % j == 0){
prime = 0;
break;
}
return prime;
}

Fin Codigo

Pues esto es todo, señores. Espero no haberles aburrido demasiado.

lunes, 22 de marzo de 2010

Jugando con MongoDB y Python

Bien, siguiendo el post anterior, vamos a cargar de GeoNames todos los datos sobre España en una base de datos MongoDB. Aqui no se va a explicar como instalar un servidor de Mongo. Se pueden encontrar todas las indicaciones en su pagina web oficial si no sabes que es Mongo, visita esta página. No es nada complicado. Bien, al lío.

Primero tenemos que ir a GeoNames ir a la parte de "descargas" y bajarnos algún país. En mi caso me he descargado ES.txt, documento que contiene todos los todos sobre España. Descomprimido, el fichero pesa unos 6.8MiB. Bien, ahora tenemos que "meterlo" en la base de datos. Lo podemos hacer así:


#! /usr/bin/env python
# -*- coding: utf-8 -*-
#Filename: buscar.py
#Filename: cargar_datos.py
from pymongo.connection import Connection
#Abrimos una conexión con la BBDD de mongo y creamos una colección llamada ES.
connection = Connection()
db = connection.ES
collection = db.ES
#Estos son los campos que contiene el fichero
fields = [
"geonameid",
"name",
"asciiname",
"alternatenames",
"latitude",
"longitude",
"feature_class",
"feature_code",
"country_code",
"cc2",
"admin1_code",
"admin2_code",
"admin3_code",
"admin4_code",
"population",
"elevation",
"gtopo30",
"timezone",
"modification_date"
]

#Abrimos el fichero de datos
file = open('ES.txt', 'r')
#Insertamos todos los datos en la BBDD. Simple y llanamente.
for data in file:
collection.insert(dict(zip(fields, data.split('\t'))))
print 'Done! =)'
#Cerramos el fichero y la conexión.
file.close()
connection.disconnect()

Bien, señores. Ahora solo queda ejecutar el comando con un simple "python cargar_datos.py". En mi ordenador, el proceso tarda unos 25 segundos, aproximadamente. Carga 58.317 registros ( llamados documentos, en la jerga de Mongo ).
Y ya tenemos todos los datos en la BBDD!!

Pero claro, ahora con todos estos datos que hacemos? Pues vamos a crear un pequeño codigo para hacer consultas:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import pymongo

import re
import sys
#Nos conectamos a la BBDD, a la colección ES
db = pymongo.Connection().ES
collection = db.ES

#Cogemos el primer argumentos que nos han pasado como parámetro
busca = sys.argv[1]
#Compilamos una expresión regular para la búsqueda
regex = re.compile(busca)
#Buscamos en la base de datos la expresión regular en el campo "alternatenames". Los resultados los guardamos en una lista.
resultados = [ n for n in collection.find({"alternatenames":regex})]
#Por cada elemento de la lista pintamos los siguientes datos.
for tupla in resultados:
print ">Nombre:",tupla["name"]
print "Nombres comunes:",tupla["alternatenames"]
print "Coordenadas [Longitud][Latitud]:", tupla["latitude"], tupla["longitude"]
print "Link:", "http://maps.google.com/?ie=UTF8&ll=" + str(tupla["latitude"]) + "," + str(tupla["longitude"]) + "&spn=0.047113,0.109863&t=h&z=12"
print "Resultados encontrados:", len(resultados)
print ""


Como funciona el programa? Muy simple:
$ python buscar.py Pollença
Y esto nos va a dar los resultados. Si usamos una terminal Bash, podemos hacer clic con Control pulsado sobre el link y automáticamente se abrirá en Google Maps el la posición exacta del lugar buscado. Espero que se haya entendido algo =). No dejen de postear sus dudas/mejoras. Gracias!

Base de datos GeoNames

Muy señores míos. Siento que haya estado un tiempo sin poner ningún post de interés. La semana pasada estuve de exámenes finales y ahora ya he terminado. Espero poder volver a coger un poquito la rueda.

Bien, dejémonos de historias. Que tengo para vosotros hoy? Pues os quiero presentar la página de GeoNames. Es una pagina web donde recopila información sobre: nombres de ciudades, de lagos, de pueblos, montañas, sobre municipios/provincias. Y contiene información, muuucha información. Entre otras la coordenadas del lugar que se busca, altitud, la población, el país, nombres similares que recibe este mismo sitio, wiki, etc...
Todos los datos del mundo en cleartext pesa unos 800MB aproximadamente. Bien. Pero me direis "si, ya, esto ya existe. Se llama Google Maps". Y lo cierto es que se parece, pero no es exactamente lo mismo. Las bases de datos de GeoNames se pueden descargar libremente. Es tan fácil como entrar en la página, ir a "Download server" y elegir el país que te quieres descargar.

Mas exactamente la información información que guardan es la siguiente:
The main 'geoname' table has the following fields :
---------------------------------------------------
geonameid : integer id of record in geonames database
name : name of geographical point (utf8) varchar(200)
asciiname : name of geographical point in plain ascii characters, varchar(200)
alternatenames : alternatenames, comma separated varchar(5000)
latitude : latitude in decimal degrees (wgs84)
longitude : longitude in decimal degrees (wgs84)
feature class : see http://www.geonames.org/export/codes.html, char(1)
feature code : see http://www.geonames.org/export/codes.html, varchar(10)
country code : ISO-3166 2-letter country code, 2 characters
cc2 : alternate country codes, comma separated, ISO-3166 2-letter country code, 60 characters
admin1 code : fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code; varchar(20)
admin2 code : code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80)
admin3 code : code for third level administrative division, varchar(20)
admin4 code : code for fourth level administrative division, varchar(20)
population : bigint (4 byte int)
elevation : in meters, integer
gtopo30 : average elevation of 30'x30' (ca 900mx900m) area in meters, integer
timezone : the timezone id (see file timeZone.txt)
modification date : date of last modification in yyyy-MM-dd format
Bueno, en el siguiente post os muestro como volcar todos estos datos en una BBDD como MongoDB.
Saludos!

jueves, 18 de marzo de 2010

Sobre la facilidad de criticar el trabajo de otros O como tu opinión no le importa a nadie....

[molesto]
Vía Ubuntizando el Planeta, en su post "Esto no es una democracia" me entero que Mark Suttleworth ha dado una respuesta contundente a la pregunta si Canonical es, o no, una democracia. Y la respuesta ha sido que no.



Faltaría mas. A mi modo de ver las cosas CREO que la gente que se queja ahora por una nimidad como la posición de unos botones y que por otra parte casi seguro que no ha hecho "nada" [1] para mejorar Ubuntu, son unos desagradecidos.

Osea, estas usando una distribución que mejora cada día. Cada 6 meses tienes una versión nueva. Los chicos de Canonical están haciendo un trabajo extraordinario [2]. Y las decisiones que toman ( como muy bien explica Mark ) las toman por algo, jefes de proyecto y decisiones que se toman conjuntamente con los equipos de trabajo que solo se dedican a esto, a tomar decisiones y a implementarlas. Y nosotros, evidentemente, podemos OPINAR. Y nada mas!

Hay quien piensa que todo el mundo tiene derecho a opinión y a voto. Esto es falso[3]. Y me explico:

Opinión siempre la puedes tener sobre un tema determinado. Faltaría mas! Pero no quiere decir que el hecho de que tú tengas opinión, vaya a interesarle a nadie. Yo soy de los que creo que las opiniones son validas, o no, dependiendo de la persona que las divulga. Si yo mismo empiezo a dar opinión sobre le mundillo de la física [ que no tengo absolutamente ni idea ] por un artículo que he leído o por algo que he visto en la televisión entiendo que mi opinión no tenga ninguna validez para un físico con 20 años de experiencia. Del mismo modo que no tiene validez para mi la opinión que pueda tener mi abuelo sobre el Software Libre por UN artículo que ha leído en el periódico esta mañana. Esto es así, señores. Opinar ( y querer ser tomado en serio ) es muy fácil, pero uno se tiene que ganar el derecho a ello.

Derecho a voto? Si. Si te preguntan. Si Canonical hace una encuestra. Si en Ubuntu sale un popup pidendo tu opinión/voto sobre algo. Adelante. Contesta. Ayuda. Te están pidiendo tu opinión. Ahora es tu oportunidad. Pero esto no significa que tu, cuando te apetezca y sobre el tema que te apetezca, puedas ir "reclamando" a Canonical el porqué lo han hecho así, y porque no lo cambian a tu gusto. Una gran mayoría de los usuarios consideran que el [polemico] alineamiento de los botones puede ser un problema muy grande a la hora de usar Ubuntul, algo crucial para el desarrollo del SO.... se puede cambiar. Un comando en la consola. UNO!! Y aún así nos seguimos quejando. Por favoooooor! Es normal ( si, si, he dicho normal ) que Canonical no nos tome enserio. Que un tema sin tan poca imprtáncia haya generado tanta polémica. Esto si, sobre la última versión del kernel no he leído ninguna queja, la verdad. Significa que esté bien al 100%? Pues seguramente no, lo que pasa es que el publico en general:
1) No está interesado en saber que maldita mejora se ha hecho en el kernel
2) Solo quieren que funcione
3) Las mejoras no parecen nada evidente, que resalte a la vista y por tanto la gente no se pude general una "opinión" de manera facil, sencilla y que no le cueste esfuerzo
4) No está interesado en estudiar y aprender la programación necesaria para poder efectuar juicios sobre el tema. Que por eso ya tenemos a los chicos de Canonical que ya saben, no?
5) Se están quejando de los botoncitos

Un post duro. Si.
Estoy de acuerdo con Mark? Completamente.
Me gusta el cambio de los botones? Pues todavía no los he probado. A primera vista suponen un cambio de lo "habitual" y el cambio me genera rechazo. Les daré una oportunidad de varias semanas. Sino yo se que con UN COMANDO lo dejo como antes. No problemo. Al menos no para mi.
Porque he escrito esto? Pues porque lo que me molesta es la hipocresía de la gente, que hace un par de semanas parece que todo el mundo quiere opinar/votar/cambiar una decisión tomada por otros, y que seguramente esta gente no se preocupa lo mas mínimo por temas mas importantes y menos populares ( a mi parecer, claro ) como podrían ser el rendimiento, la seguridad o la estabilidad del sistema. No he visto a NADIE que proponga poner un botón en Sistema>Preferencias>Apariencia para elegir la posición de los botones. A NADIE. Es una pena.
[/molesto]

Esta, Señores mios, es mi humilde opinión.

[1] Me refiero nada importante como desarrollar una apliación para Ubuntu, o hacer de betatester, o simplemente empezar a picar códio de algun proyecto. Lo digo porque es muy facil criticar desde fuera. Si realmente viesen el esfuerzo que se ha hecho y que se está haciendo, creo que se tomarían las cosas con mas calma. Por otra parte es muy posible que hayan hecho reportes de errores y consideren que esto es una colaboración muy importante ( que lo es). Pero esto es dar a siguiente>siguiente>explicación>finalizar. No son meses de trabajo, vaya.
[2] Tienen como competencia a empresas de la talla Microsoft o Apple.
[3] En el entorno del que estamos hablando, claro. Nuestro país es un país democrático y el derecho al voto y a la libertad de expresión son derechos fundamentales.

domingo, 14 de marzo de 2010

Siguiendo una meme que (creo) se inició en Ubuntizando el Planeta y siendo invitado por Clase Linux, me he dirigido a la pagina web para calcular el grafico inverso del nombre de mi blog ( sea lo que sea que signifique grafico inverso =) )
El resultado final ha sido algo así:


Saludos!

domingo, 7 de marzo de 2010

POR ALGO ERES INFORMÁTICO

Traducción comentada de una conversación con una amiga:

(16:43:12) Amiga: xurrrii #Emezamos mal, a mi no me llaman nunca xurri. Esto significa, "hola, quiero algo de tí y no te va a gustar"
(16:43:43) Jan> : hola guapisima # yo, como siempre tan cortés :P
(16:44:21) Amiga: mm # Duda, todavía no lo tiene claro, sería mejor que se retirara ahora....
(16:44:24) Amiga: quería hablar contigo #... y no. Se lanza... esto le va a doler.
(16:44:32) Jan> : :)
(16:44:36) Jan> : muy bien
(16:44:38) Jan> : dispara
(16:44:42) Amiga: jajaja
(16:44:48) Amiga: quiero que me hagas un regalo de cumpleaños # Buen intento, encanto
(16:44:49) Amiga: pero te pagar # Urooo, y encima es algo ilegal
(16:44:55) Amiga: pagaré*( no te asustes)
(16:45:19) Jan> : que no me asuste? ya tiemblo
(16:45:24) Amiga: jajajaja
(16:45:35) Amiga: alomejor me dices que no # Mierda, ya no es una noche de lujuria, sexo y pasión... una pena
(16:45:35) Jan> : osea, que te tengo que hacer un regalo de cumpleaños que tu me pagarás? ( no se si lo acabo de entender )
(16:45:40) Amiga: jaja # Es una risa, pero risa tonta... sabe que va a decir algo gordo y no sabe como
(16:45:43) Jan> : esto no puede acabar nunca bien :)
(16:45:49) Amiga: quiero que me hagas un DNI pero me han dicho que vale dinero #podeis imaginar que tiene menos de 18 años, la amiguita
(16:45:54) Amiga: pero me han dicho que tu sabes hacer #Fuck... alguien va a recibir una patada voladora...
(16:46:15) Jan> : que qué?!:|
(16:46:19) Amiga: un DNI
(16:46:21) Amiga: falso # soy tontito, pero ya había entendido que no quería una fotocopia por las dos caras del DNI...
(16:46:24) Jan> : quien te ha dicho esta tontería?
(16:46:27) Amiga: [nombre de mi mejor amigo]
(16:46:32) Amiga: bueno
(16:46:33) Amiga: igualmente
(16:46:38) Amiga: tu sabes hacer estas cosas
(16:46:41) Amiga: POR ALGO ERES INFORMÁTICO

unreadahead-other main process terminated with status 2 [SOLUCIONADO]

En el visor del sistemas se estaban consumiendo entre 40-60% de CPU sin hacer nada. He ido al registro del sistema y en "daemon.log" me he encontrado que cada segundo añadía unas 10 líneas con el texto del título del post. Esto se soluciona tan fácil como:
  • Abrir /etc/fstab con privilegios de superusuario
  • Borrar las entradas que se han añadido manualmente
  • Reiniciar le equipo
Y problema resuleto.

sábado, 6 de marzo de 2010

Envío y recepción de correos firmados o/y cifrados HOWTO

Descripción de la práctica.

Queremos reproducir cómo conseguir configurar un cliente de correo como el Thunderbid para recibir correos cifrados/firmados de manera transparente por parte del usuario.

Utilidad:

  • Los correos firmados nos aseguran que el correo procede de una persona en concreto, y es imposible falsificar esta firma.

  • Los correos cifrados nos permiten asegurar que el receptor será el único que podrá abrir la información enviada.

  • Si combinamos las dos características anteriores, podemos enviar correos de manera segura y con la seguridad que lo recibimos del remitente correcto.

Herramientas:

  • Utilizaremos nuestra distribución preferida ( en mi caso Ubuntu 9.10 )

  • Necesitamos tener instalado un cliente de correo que permita enviar/recibir correos cifrados. En mi caso usaré Thunderbird 2.0.0.23 ( alguien probó de hacer lo mismo en Evolution y no le funcionó, seguro que tiene arreglo, pero se deberá buscar )

  • Navegador web, en mi caso utilizaré Firefox 3.5.8

  • Autoridad certificadora. Usarem CACert en nuetro caso, ya que nos proporciona certificados gratuitos con tan solo especificar nuestro correo.

Descripción general del proceso:

Vamos a registrarnos en una página que nos permita generar certificados firmados para una dirección de correo determinada. Una vez tenemos el certificado lo importaremos a Thunderbird y configuraremos todos los parámetros para una cuenta de correo determinada. Hecho esto podremos empezar a enviar y recibir correos firmados/cifrados a otras personas.

Inconvenientes:

Quiero hacer saber los problemas que puede plantear usar este sistema antes de que tengas que deducirlo vosotros leyendo el manual.

  • CACert es una autoridad certificadora gratuita, pero algunos navegadores no la incluyen como “segura” por defecto ( ya se verá como se configura de manera manual ). Las alternativas son de pago, y que te tienes que autentificar en algún sitio con tu DNI, elegimos CACert por comodidad pero este manual se podría adaptar a cualquier otra Autoridad Certificadora.

  • Tanto el emisor como el remitente tienen que tener configurada una cuenta como aquí se detalla, de otro modo no podrán abrir los correos (esto siempre es así).


1. CACert

Lo primeros es crear un certificado en CACert. Para ello nos difigimos a www.cacert.org, tenemos que ir a “Root Certificate” del menú de la derecha. Después instalar el certificado de Cacert. Para instalar el certificado es sifuciente hacher click en “Root Certificate (PEM Format)”.




Nos tiene que aparecer un mensaje conforme la operación se ha realizado con éxito. Es posible que el certificado ya se encontrara instalado en nuestro navegador y que nos informe de esto mismo.

Bien, porque hemos hecho esto? Pues hemos configurado nuestro navegador de modo que confíe en la página de Cacert. Ahora vamos a proceder a registrarnos en la página. Ara ello vamos hacemos clic en “Join” del menú de la derecha.

No nos estamos registrando en una página web de contactos, esto es una pagina web para crear certificados, o sea que tenemos que dar información verídica del mismo modo que tenemos que poner una contraseña segura para que no puedan acceder a nuestra cuenta. Pensad que si alguien puede copiar un certificado que hayamos creado, se podría hacer pasar por nosotros igual como si tuviese nuestro DNI. Remarco la importancia de elegir contraseñas seguras para los certificados ( que en definitiva es tu identidad digital ).

Marca la casilla de “I AGREE” y dale a “Next”. De este modo creamos la cuenta. Ahora tienes la oportunidad de repetir las preguntas-respuestas secretas o password si habías sido perezoso y apuntado cualquier cosa. Tienes que hacerlo a conciencia! Piensa que es para tu seguridad!

Bien, una vez tenemos nuestra cuenta creada y validada ( mediante el proceso de abrir un mail que tenemos esperando en nuestra bandeja de entrada especificada ) nos logueamos en la pagina web mediante el botón “Password Login”.

Para crear un nuevo certificado vamos a “Client certificates” y marcamos la casilla con nuestro correo deseado:


En la nueva pestaña nos pide el tamaño de la clave que queremos generar, pudiendo elegir entre “alto” y “medio”. Eligir por elegir, le damos en “alto”, porque es el propuesto por defecto y porque es gratis ;)

Le damos al botón “Create Certificate Request” y nos tendremos que esperar un rato a que se genere el nuevo certificado. Porque tarda tanto? Porque está generando un par de claves RSA, por lo que tiene que buscar números primos realmente grandes. Bien, ya ha creado nuestro certificado. Ahora nos da la opción de “Click here to install your certificate.” Y volià! Ya tenemos nuestro certificado! Bien, como muy bien nos indica la misma página, deberíamos hacer una cópia del certificado digital, y esto es exactamente lo que haremos ahora.

  1. En el Firefox vamos a: Editar>Preferencias

  2. Hacemos clic en la última pestaña, la que pone AVANZADO

  3. Hacemos clic en el botón “Ver certificados”

  4. Nos quedamos en la pestaña “Sus certificados”, marcamos el certificado que acabamos de crear y le damos a “Hacer copia...”

  5. Elegimos un sitio seguro donde guardar el certificado y ponemos un nombre descriptivo y con la extensión que acabe con .p12 ( es solo para tener bien organizados nustros certificados, puedes poner la extensión que te parezca más conveniente )

  6. Nos pedirá un password. Es muy importante poner una contraseña segura. Recordemos ( una vez mas ) que se trata de nuestra identidad digital, esto es el tipo de información que buscaría un hacker.

  7. Repetimos el password y le damos a OK.

  8. Ya tenemos el backup hecho.

Ahora tenemos que hacer una copia del certificado de Cacert para instalarlo en Thunderbird. Lo mas simple es:

  1. En el Firefox vamos a: Editar>Preferencias

  2. Hacemos clic en la última pestaña, la que pone AVANZADO

  3. Hacemos clic en el botón “Ver certificados”

  4. Vamos a la pestaña “Autoridades” y buscamos “Root CA”

  5. Hacemos clic en “CA Cert Signing Authority”

  6. Clic en exportar y guardamos en el sitio donde guardamos nuestros certificados. Nombre de ejemplo: cacert.pem

  7. Hecho!

Nota: Es muy imporante que todos los pasos de “1. CAcert” los hagas en el mismo ordenador y con el mismo navegador, de otro modo no funcionará.


2. Thunderbird

Muy bien. Hasta ahora hemos creado nuestros certificados, ahora debemos configurar el cliente de mensajería deseado. En nuestro caso usaremos Thunderbird.

El primer paso que tenemos que hacer es instalar la Autoritdad Certificadora Cacacert:

  1. Abrimos Thunderbird

  2. Vamos a Editar>Preferencias>Avanzadas>Ver certificados

  3. Abrimos la pestaña “Autoridades” y le damos al botón “Importar”

  4. Elegimos nuestro ficherito “cacert.pem” ( o con el nombe que le pusistes en el paso anterior ) y le damos “Aceptar”

  5. Nos dice que ha instalado el certificado de manera correcta!

  6. Ahora buscamos en la lista “Root CA”

  1. Hacemos clic en “CA Cert Signing Authority”

  2. Vamos a “Editar” y marcamos todas las casillas ( tansolo haría falta la casilla referente al correo, pero para evitar problemas, mejor ). Aceptamos.

  3. Ahora vamos a la pestaña “Mis certificados”

  4. Le damos a “Importar” y buscamos nuestro certificado (el que acaba con “.p12”)

  5. Nos pide una contraseña con la que Thunderbird va a proteger el fichero ( poner una segura ) y después no pide la contraseña con la que está protegido ya el fichero ( lo que pusimos en el paso anterior )

  6. Damos a aceptar y ya tenemos nuestro certificado instalado!

Ahora nos queda configurar una cuenta de correo en Thunderbird para poder enviar y recibir correos de manera segura. AVISO: No voy a explicar aquí como se configura una cuenta POP3 o SMTP en Thunderbird ya que internet está repleta de manuales que lo explican perfectamente, daré por supuesto que se tiene una cuenta creada, con la que podemos mandar correos ya y podemos recibir. La cuenta configurada, evidentemente, tiene que ser la misma para la que hemos creado el certificado.

Para configurar el certificado para que funcione con una cuenta simplemente tenemos que ir a:

  1. Editar>Configuración de cuentas

  2. Abrir la casilla “Seguridad” de la cuenta que se quiera configurar ( como se ve en la imagen siguiente )

  3. Tanto en la casilla de firma digital como cifrado, seleccionar el certificado que hemos instalado anteriormente.

  4. Se recomienda mantener la opción de “Nunca usar cifrado” y desactivar la opción “firmar digitalmente”

Una vez hecho esto ya tenemos a Thunderbird preparado para enviar/recibir correos firmados o cifrados!! No ha sido tan difícil, verdad?


3. Prueba de concepto

Bien, ahora está ya todo configurado. Como funciona? Pues muy fácil.

Abrimos Thunderbird si lo habíamos cerrado. Vamos a REDACTAR y ponemos lo habitual: destino ( que para hacer una prueba podemos poner nuestro mismo mail) asunto, mensaje, etc... y en botón “SEGURIDAD”, le damos a la flechita que apunta hacia abajo y marcamos la opción “Firmar digitalmente este mensaje”.

Le damos a “ENVIAR” y el correo se ha mandado a nuestra misma dirección. Si abrimos el correo veremos todo como siempre, pero un un detalle: Ahora aparece un sobre con un punto amarillo que nos indica que este correo está firmado. En caso de recibir un correo firmado y cifrado aparecerá un candado con un sobre con punto rojo.

Porque no puedo mandarle un correo CIFRADO a un amigo mio? Bien, porque antes necesitas su clave pública. Para tener su clave publica puedes hacer dos cosas:

  • Que te mande un fichero “.pem” con su clave pública y la importas en el Thunderbird

  • O que te mande un correo firmado, que en él ya se incluye automáticamente la clave pública de tu amigo

A partir del momento que recibes un correo FIRMADO de alguien, ya puedes mandarle correos CIFRADOS cuando quieras. Lo mismo a la inversa. Si quieres que alguien te mande un correo CIFRADO, antes tienes que mandarle un correo a el FIRMADO, para que tenga tu clave pública y pueda cifrar los e-mails.

Espero que esto ayude a entender un poco como funciona el sistema de envío de datos seguros por SMIME, con certificados y un cliente.

Me ofrezco voluntario para recibir correos firmados/cifrados a mi cuenta de correo habitual, y a responder ( en la medida de lo posible ) estos mismos correos para comprobar que las configuraciones se han hecho correctamente y que el sistema funciona bien. El e-mail de contacto es inedit00@gmail.com

Dudas, sugerencias o aclaraciones, en los comentarios

Saludos!