Archivos para 29 septiembre 2008

Richard Stallman critica el cloud computing

Bueno, sintiéndolo mucho, y por culpa de que el trabajo me tiene demasiado ocupado, tengo que intercalar un post de opinión (yo prefiero los posts con código, los posts prácticos) antes de publicar la versión 1.1 del img2xhtml, una pena.

El caso es que según leo en meneame, Richard Stallman advierte que el Cloud Computing es una trampa.

Se conoce como cloud computing, dicho de una forma generalizada, al hecho de que la computación reside en internet, en algún sitio externo a la organización, y se consume en forma de servicio, ejemplos de esto lo tenemos en Amazon EC2, pero como mis dotes explicativas acerca de estos términos tan modernos y cools, son muy limitadas, si no sabéis lo que es cloud computing, os recomiendo este artículo y este otro.

Pero volviendo al tema de que Stallman crítica el cloud computing, y lo tacha de trampa, la verdad es que no me extraña demasiado, se veía venir de lejos.

El Cloud computing está atacando de lleno al software libre, como muchas otras cosas entorno a la web 2.0, y que nadie se escandalice cuando digo esto.

Si bien mucha gente desarrolla cosas entorno a la filosofía o estilo (o moda) de la web 2.0, y además lo hace usando software libre, y compartiendo luego sus desarrollos con la comunidad, existen muchos otros casos, como fresqui, en el cual, alguien coge un drupal (software libre), lo modifica, crea un nuevo producto en base a un producto libre, pero nunca comparte los cambios, ni enriquece a la comunidad: recibe, pero no devuelve nada.

Si bien la licencia de drupal (tristemente) permite hacer esto, es éticamente reprochable, y la realidad, es que no es raro que en la web 2.0 exista mucha gente que sigue esa tendencia: la mayoría de webs 2.0, incluso usando software libre, no son libres, estás obligado a consumirlas como servicio.

Y el cloud computing no es mas que la máxima expresión de todo esto, en lo que todo es un servicio, en el que el usuario va viendo recortado no solo su libertad, sino también su control sobre los datos que maneja.

Pero bueno, es solo una opinión, esto también depende mucho de lo que pase en los proximos años, y de muchos otros factores, aunque así de entrada, el cloud computing no me inspira confianza, y comparto la idea de Richard Stallman.

Por cierto, como ejemplo de webs 2.0 que comparten la filosofía del software libre, para demostrar que no es algo contradictorio, pondría a meneame, sin lugar a dudas, y a eyeOS.

Ambos son servicios que todos sus competidores son software privativo, salvo ellos.

Convierte imagenes JPEG en XHTML

Si, se que el título es un poco raro, pero es la forma mas rápida de describir el último lío en el que me he metido.

La historia comienza hace un año mas o menos, cuando alguien me propuso como se podría crear un captcha en PHP sin usar GD ni Imagemagick o similares, y como por aquel entonces yo ya estaba trabajando en eyeOS, tenía muy presente el tema del DHTML, y de jugar con elementos DIV con posición absoluta por todas partes, etc, por lo que pensé, que si una imagen es un conjunto de pixels, se podría pintar una imagen, con un conjunto de divs con width:1px y height:1px, y posicionándolos todos con position absolute, en su sitio.

Me di cuenta enseguida de que era viable, pero nunca me puse a hacerlo (tenía demasiado trabajo en eyeOS por aquel entonces), el caso es que hace 2 días, tras el artículo que hice sobre un programa que habíamos hecho mi novia y yo, para romper el viejo captcha de meneame, y como tenía tan reciente el uso de libjpeg, decidí empezar un nuevo mini-proyecto con ella…y ahí nació img2xhtml.

La idea es sencilla, img2xhtml es un programa que usando libjpeg, lee una imagen jpeg linea a linea, y genera un archivo xhtml de salida, que pinta exactamente la misma imagen, pero utilizando anchors (<a>) de un pixel de alto por un pixel de ancho, con el mismo background-color que tenía el pixel en la imagen original, y position absolute en el sitio que le pertoca.

Dicho así, suena muy simple, pero ya me imaginaba que no iba a ser tan fácil, nunca lo es.

En primer lugar, hay una linea que se va a repetir dentro del xhtml muchísimas veces: el pixel, por lo que si podemos reducir esa linea en 1 caracter, reduciremos considerablemente el peso total del archivo html resultante, por ello se usan anchors (<a>) en lugar de div (<div>) por que los primeros se escriben con 2 letras menos. Veamos un pixel:

<a class=w style=top:74px;left:62px;background:rgb(52,52,52) />

Un pixel como vemos, es un anchor (<a>) un poco guarro para pesar lo mínimo, que omite las comillas en los atributos html por que no contienen espacios, etc.

w es una clase css, tal como:

.w{position:absolute;height:1px;width:1px;}

De esta forma, todo lo que no es variable en un pixel, está en la clase CSS, lo que nos ahorra tamaño por pixel.

Vale, con todo esto en mente, hicimos el programa, el cual funciona bastante bien, por ejemplo, esta imagen:

Se puede ver pasada a xhtml aquí.

Lo cual, al menos en mi Firefox3, se renderiza así:

El resultado es bastante bueno, sin embargo, uno enseguida se da cuenta de que esta imagen debe tener MUCHOS elementos xhtml para pintarse así, pesa 277k, frente al original, que pesa 2,8k, además, dentro tiene:

jcarlosn@linux-wnp3:~/img2xhtml> cat tux.html | sed “s/<a/\n/g” | wc -l
4343
jcarlosn@linux-wnp3:~/img2xhtml>

4343 anchors (<a>).

Además, el problema que surge es que la CPU se dispara al abrir imágenes medianamente grandes.

Con el problema de la cpu y del tamaño en mente, estaba claro que teníamos que empezar a trabajar en ideas para reducir los elementos xhtml, le conté la idea a SirKeldon,y me picó un poco para que siguiese reduciendo el tamaño de los pixeles al mínimo, pero eso no servia para intentar reducir el número de elementos xhtml que disparan la cpu.

El segundo paso fue un poco mas complejo, hablando con mi novia, enseguida nos dimos cuenta de que había una manera fácil de reducir el número de <a> en pantalla: uniendo horizontalmente los pixels contiguos del mismo color, en un mismo elemento xhtml, alargado.

Tras hacerlo, obtuvimos una mejora considerable, sin embargo, no era suficiente para imágenes grandes, por lo que decidimos agregar un nuevo concepto: tolerancia.

La tolerancia es el tope de diferencia entre dos colores RGB, para considerarlos “iguales” y unirlos bajo un mismo elemento xhtml, de esta forma, cuanta mas tolerancia, menor calidad y mayor velocidad. Vamos a hacer una prueba con tolerancia 15: (R+-15, G+-15, B+-15):

img2xhtml -f tux.jpg -t 15 > tux_15.html

Lo cual genera esto.

Como vemos, la calidad ha bajado un poco, en mi firefox3 se renderiza así:

Vale, no es perfecto, pero, ahora el tamaño es de 89k, y la cantidad de elementos xhtml es de:

jcarlosn@linux-wnp3:~/img2xhtml> cat tux_15.html | sed “s/<a/\n/g” | wc -l
1313
jcarlosn@linux-wnp3:~/img2xhtml>

Con solo 1313 elementos xhtml, se dibuja esa imagen, si la analizamos un poco, veremos que está hecha con elementos xhtml alargados, no con pixels sueltos.

Lo mejor, es que lo probéis vosotros mismos, y jugueis un poco, no os recomiendo probar con imagenes mayores de 250×250. El programa lo podéis bajar de aquí:

Descargar img2xhtml

Compilarlo e instalarlo es como siempre, primero lo extraemos y ejecutamos ./configure:

jcarlosn@linux-wnp3:~/downloads> tar -xzf img2xhtml-1.0.tar.gz
jcarlosn@linux-wnp3:~/downloads> cd img2xhtml-1.0/
jcarlosn@linux-wnp3:~/downloads/img2xhtml-1.0> ./configure
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes
checking for a thread-safe mkdir -p… /bin/mkdir -p
checking for gawk… gawk
checking whether make sets $(MAKE)… yes
checking for gcc… gcc
checking for C compiler default output file name… a.out
checking whether the C compiler works… yes
checking whether we are cross compiling… no
checking for suffix of executables…
checking for suffix of object files… o
checking whether we are using the GNU C compiler… yes
checking whether gcc accepts -g… yes
checking for gcc option to accept ISO C89… none needed
checking for style of include used by make… GNU
checking dependency style of gcc… gcc3
checking for a BSD-compatible install… /usr/bin/install -c
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
checking for jpeg_start_compress in -ljpeg… yes
checking for zlibVersion in -lz… yes

Y luego lo compilamos:

jcarlosn@linux-wnp3:~/downloads/img2xhtml-1.0> make
make all-am
make[1]: se ingresa al directorio `/home/jcarlosn/downloads/img2xhtml-1.0′
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT libjpg.o -MD -MP -MF .deps/libjpg.Tpo -c -o libjpg.o libjpg.c
mv -f .deps/libjpg.Tpo .deps/libjpg.Po
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT libhtml.o -MD -MP -MF .deps/libhtml.Tpo -c -o libhtml.o libhtml.c
mv -f .deps/libhtml.Tpo .deps/libhtml.Po
gcc -g -O2 -o img2xhtml main.o libjpg.o libhtml.o -ljpeg
make[1]: se sale del directorio `/home/jcarlosn/downloads/img2xhtml-1.0′

Finalmente lo instalamos con:

sudo make install

Ahora para ver la ayuda del programa:

jcarlosn@linux-wnp3:~> img2xhtml -h
img2xhtml -f file [-m maxLine] [-t color tolerance]
Convert images to xhtml files

-f FILENAME Filename to convert to xhtml
-m MAXLINE Maximum number of pixels to join with tolerance
-t TOLERANCE Color tolerance to join two pixels with similar colors
into a single xhtml element (between 0-127)

img2xhtml Copyright (C) 2008 Noemi Blazquez & Jose Carlos Norte
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.

Please send bugs to jose@eyeos.org

El parametro -m (maxline) especifica el máximo largo que puede tomar un pixel estirado tragandose a su pixel de al lado, sirve para jugar con tolerancias altas sin obtener imagenes que parecen códigos de barras.

Si alguien me pregunta para que sirve todo esto, la verdad es que no lo tengo muy claro, pero…¿y lo bien que se lo pasa uno haciendo el friki y programando en C estas extravagancias?

La dirección del proyecto en sourceforge es:

http://sourceforge.net/projects/img2xhtml/

Pero aún no nos ha dado tiempo de subir los paquetes y todo eso.

Rompiendo el antiguo captcha de meneame!

Hoy para variar, hago un post un poco mas práctico que los anteriores.

El caso es que estoy ayudando a mi novia a entender C/C++, sistemas y todo eso, así que decidí que hoy programaría algo con ella (algo simple,para empezar) y como no se me ocurría nada mas ameno, pensé en programar un programa en C, que usando libjpeg, fuese capaz de leer una imagen del viejo captcha clásico de meneame (como el que usan en enchilame para el registro) y sacar los números que hay en la imagen.

Nada mas empezar, nos dimos cuenta de que los números de ese captcha, siempre salen en la misma posición, tamaño y medida, además del mismo color y misma fuente, solo varía un poco el fondo, pero poco.

Para localizar los pixeles que pertenecen a un dígito y no al fondo, basta con comprobar si su nivel de azul (colores RGB) es mayor que 100.

El programa básicamente lo que hace es leer la imagen, linea a linea (linea de pixeles) y comprobar que pixeles están con azul mayor que 100, en la linea 20, lo cual es suficiente para distinguir todo los números.

El programa junto con una imagen de ejemplo, lo podéis bajar de aquí:

Enlace

Se compila con:

gcc -ljpeg image.c -o image

Y tiene como dependencia libjpeg (y libjpeg-dev para sistemas basados en debian)

Al ejecutarlo, lee el archivo image.jpeg de su mismo directorio, y muestra por la salida estandar, los números contenidos dentro de la imagen.

Con este pequeño programa y un script en bash bastante sencillo, uno puede dar de alta cuantas cuentas como quiera, de forma automatizada en páginas que usen las versión de meneame sin recaptcha.

Prueba con el programa compilado y la imagen que viene el .tar.gz:

jcarlosn@linux-wnp3:~/captcha> ./image
724160
jcarlosn@linux-wnp3:~/captcha>

Tiene en principio, un 100% de efectividad.

Trucos y misterios de meneame

He decidido hacer un paréntesis en el tipo de entradas que agrego al blog, de carácter técnico y dirigidas a un público muy concreto, para hacer una entrada que llevo tiempo queriendo hacer (desde mucho antes de abrir este blog).

Para los despistados, una de mis aficiones es colaborar con el meneame de una forma un tanto friki (si es que todo lo que toco, lo convierto en friki) que consiste en auditar su código y comunicar los errores de seguridad que encuentro, a Ricardo, para que los arregle.

Pese a que el meneame está muy bien programado, en contra de lo que dicen algunos sujetos, es cierto que ha tenido ciertos problemas de seguridad durante su historia, desde que colaboro, he encontrado varios problemas y de gravedad variada, sin embargo, el número total de problemas de seguridad, ha sido mucho menor que en otros sites populares y con mas tiempo, y el tiempo de reacción ante estos problemas, ha sido de minutos, por lo que considero a meneame, un site muy seguro y una demostración irrefutable de que el software libre es beneficioso cara a la seguridad.

Dejando de lado las presentaciones y la explicación de mi relación con meneame, este post trata sobre algo que llevo tiempo queriendo escribir…y es que auditando meneame continuamente, he aprendido mucho de su código y sus secretos, el como funciona, etc…y hay algunas cosas que siempre he querido documentar, pero nunca he encontrado el momento.

Antes de empezar, podemos ver el código de meneame, navegando por la carpeta www/ de su repositorio svn:

http://svn.meneame.net/index.cgi/branches/version3/www/

El primer directorio que vemos, es admin/, del cual nos llama la atención que no tiene index.php, por lo que si hacemos:

http://meneame.net/admin/

Veremos un forbidden, que nos impide listar el contenido del directorio, el único archivo que hay en ese directorio, es el archivo bans.php:

http://svn.meneame.net/index.cgi/branches/version3/www/admin/bans.php?rev=1372&view=markup

El cual, nada mas empezar hace una comprobación:

if ($current_user->user_level==”god” || $current_user->user_level==”admin”) {

Esto nos lleva a nuestra primera deducción: en meneame hay dos tipos de administradores, unos conocidos como admin, y otros conocidos como god, como si fuesen dos niveles distintos de acceso.

La primera pregunta que se nos viene a la cabeza es: vale, ¿Pero que es eso de $current_user? $current_user es una instancia de la clase User, que se encuentra en:

http://svn.meneame.net/index.cgi/*checkout*/branches/version3/www/libs/user.php?content-type=text%2Fplain&rev=1547

Esta clase, como vemos, es una clase que representa a un usuario del meneame, y maneja su información, tanto su karma, como su nivel de acceso, etc.

Todo el meneame funciona con clases como esta, que representan cosas en meneame, están todas en:

http://svn.meneame.net/index.cgi/branches/version3/www/libs/

Otro ejemplo de clase como user, pero que representa links, es Link:

http://svn.meneame.net/index.cgi/*checkout*/branches/version3/www/libs/link.php?content-type=text%2Fplain&rev=1550

Para los javeros, estas clases podríamos decir que son una mezcla entre DAO y TO (Transfer Object), pero todo junto en una misma clase.

Aparte de este mecanismo de clases que representan cosas en meneame, existe otro mecanismo interesante usado en el meneame: el de los backend.

En meneame, en muchos sitios, pasamos el ratón por encima y sale un cartelito con información, por ejemplo, cuando alguien cita otro comentario en una noticia, usando #X, si pasamos el ratón por encima del #, veremos el comentario número X en una cajita amarilla, que sigue al ratón.

Esto lo consigue con unos pequeños php, que están en:

http://svn.meneame.net/index.cgi/branches/version3/www/backend/

Y que reciben un argumento, por ejemplo, el numero de comentario, y devuelven un pequeño código html, que es el que va dentro del cuadro amarillo.

Ademas de los cuadros amarillos (que también van por ajax), el backend se utiliza en realidad para recibir las peticiones Ajax de toda la web, y procesarlas, así está todo bien ordenado.

Un ejemplo de esto es el backend get_user_api_key, que está en:

http://svn.meneame.net/index.cgi/branches/version3/www/backend/get_user_api_key.php?rev=1431&view=markup

Que es quien atiende a la llamada Ajax que se produce, cuando en tu perfil, haces click sobre ver tu clave api, como vemos en su código:

if ($id != $current_user->user_id && $current_user->user_level != ‘god’ ) {

Cada usuario puede ver solo su API key, excepto los gods, que pueden ver las de todos, sin embargo, los admins no pueden.

Esto aclara un poco lo de los dos distintos niveles de acceso, admin y god.

Aparte de todo esto, tenemos otra carpeta interesante en el svn:

http://svn.meneame.net/index.cgi/branches/version3/www/api/?rev=1550

Api, que es donde se alojan los archivos php que atienden las llamadas a la API pública del meneame, una API que podemos usar, para comunicar nuestros blogs, webs o aplicaciones de terceros con meneame, vamos a ver alguna interesante:

http://meneame.net/api/url.php?url=http://www.adn.es&all=1

Con esto obtenemos todos los enlaces en meneame hacia el site http://www.adn.es.

Existen algunas otras API en el meneame, todas en esa carpeta, sin embargo hay un archivo muy curioso ahí:

http://svn.meneame.net/index.cgi/branches/version3/www/api/check_url_test.php?rev=1340&view=markup

Que como se puede ver, es alguna especie de prueba, pero que está en el svn desde hace mucho tiempo, y ahí sigue…misterios del código.

Aparte de todo esto, en el código de meneame hay algunas otras curiosidades, por ejemplo, un site accesible llamado mueveme, aquí:

http://meneame.net/mueveme/

El cual parece algo para acceder desde el mobil, o algo así, ni idea, no navego con el mobil.

Otra versión alternativa accesible de meneame, es la versión para nintendo DS:

http://meneame.net/nds/

Y por si la nintendo DS fuese poco, también hay para la WII:

http://meneame.net/wii/

Otra curiosidad que no acabo de entender (aunque seguro que ha sido dicha en el blog de meneame…), es por que hay un icono en el svn con nombre: apple-touch-icon.png:

http://meneame.net/apple-touch-icon.png

Supongo que sera para cuando entras con el iphone, a saber, ya lo buscaré por el código.

Como conclusión, decir que si eres informático, el código de meneame tiene muchas cosas interesantes y muchos ejemplos de como hacer cosas…como hacer un portal para la WII, para la NDS, etc etc.

Normalmente la gente no suele mirarse el código de meneame (me refiero a la gente que lo podría entender,a los desarrolladores), incluso si deciden bajarlo y usarlo en su site, no suelen estudiarlo ni un poco, y si lo hacen, no suelen compartir sus cambios con meneame.net.

Yo soy uno de los talibanes que sigue pensando que una web como meneame, donde el modelo de negocio es la publicidad, puede ser compatible con tener una comunidad a su alrededor, sin embargo, el caso de meneame me ha demostrado que muchos “webmasters” (como llamarlos?) solo buscan aprovecharse de que meneame comparte su código, y no buscan ni ayudar, ni colaborar, ni enriquecer nada mas que sus bolsillos.

Se que es una conclusión un tanto rara para un artículo como este, pero tenía que decirlo :)

Como montar un terminal Kiosk con debian y firefox

No suelo escribir sobre mi trabajo…pero esta semana como caso excepcional, he estado haciendo tareas de administrador de sistemas, en lugar de programar…y he tenido que enfrentarme a un problema bastante complejo, que pensaba que estaría mas documentado, pero no….

El problema es como modificar un debian, para que nada mas encenderlo autoconfigure la wifi (esto es fácil), muestre una pantalla visual con el logo de la empresa o organización mientras carga el sistema, y cuando acabe, ejecutar un firefox a pantalla completa, del que no se pueda salir para nada, y tampoco de cerrar las X, es decir, el terminal se convierte en un firefox en pantalla completa. A esto se le llama terminal kiosk.

Este artículo no cubre la parte de configurar las X o la red en debian, ya que se supone que si intentas montar un kiosk con debian, entiendes mas o menos como configurar el sistema básico usando esta distro linux.

Existen varios documentos acerca de como conseguir esto en debian, sin embargo se complican demasiado, están desactualizados o son erróneos en mayor o menor medida, así que he decidido documentar como lo he hecho yo, ya que me ha quedado bastante bien, y no requiere mucho trabajo.

El primer paso es instalar debian, etch o lenny, con el cd normal de instalación que podemos descargar de la web, al escoger los conjuntos de paquetes a instalar, solo dejamos marcado sistema base y equipo portátil si es un ordenador portátil.

Al terminar la instalación, tendremos un sistema que inicia y muestra un login en consola, y al hacer login obtenemos una consola, nada mas.

Configuramos la red según las necesidades, antes de continuar, y despues de configurar la red…

El primer paso es modificar el fichero /etc/apt/sources.list que contiene los repositorios de paquetes que utilizará aptitude para instalar software, lo dejamos así:

deb http://http.us.debian.org/debian etch main contrib non-free

Si estamos usando etch, o bien:

deb http://http.us.debian.org/debian lenny main contrib non-free

Si estamos utilizando lenny.

Ahora actualizamos la lista de paquetes:

apt-get update

Ahora ya tenemos la lista de paquetes actualizados, instalamos:

apt-get install xserver-xorg mingetty iceweasel

Esto instala las X y firefox, además de mingetty que ahora veremos que hace, y firefox, que en debian se llama iceweasel, por problemas de licencias.

Una vez instalados, creamos un nuevo usuario, lo llamamos kiosk por ejemplo, hacemos:

su kiosk

Para pasarnos a su cuenta, y creamos dos archivos en su home, uno llamado .bash_profile, que contenga:

while true
do
startx
done

Eso es un bucle en bash que ejecuta las X infinitamente, por lo que si por algún las X se cerrasen, volverían a lanzarse automaticamente.

El archivo .bash_profile contiene comandos a ejecutar cuando el usuario kisok inicia sesión (solo si su consola es bash, como es el caso en debian)

Ahora que ya hemos configurado que cuando “kiosk” haga login se ejecuten las X, vamos a configurar que es es lo que se ejecutará encima de las X, es decir, ni gnome, ni kde, sino que editamos el archivo /home/kiosk/.xinitrc e introducimos:

iceweasel

Esto hará que el usuario obtenga un iceweasel inmediatamente encima de las X.

Navegamos con ese firefox e instalamos la extensión r-kiosk, la cual pone el modo pantalla por defecto, del cual no se podrá salir, no permite descargar archivos y no permite salir del firefox de ninguna manera.

Ahora ya tenemos que cada vez que kiosk haga login, se ejecutarán las X, se ejecutará un firefox encima, y se pondrá a pantalla completa, sin que se pueda salir de el, solo nos falta hacer que kiosk haga login automáticamente nada mas arrancar el sistema, para ello editamos el fichero /etc/inittab y modificamos:

1:23:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Cambiandolo por:

1:23:respawn:/sbin/mingetty –autologin kiosk tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6

Esto hará que nada mas iniciar debian, sea el usuario kiosk quien inicie sesión, sin que lleguemos a ver la pantalla de login.

Ahora solo nos falta instalar splashy, lo cual solo es posible si hemos hecho todo lo anterior con lenny, por que en etch no hay paquete de splashy en aptitude:

apt-get install splashy

Splashy lo que hace es situar una pantalla gráfica que se muestra con una barra de progreso, mientras inicia debian, en luga de mostrar texto en el arranque.

Si queremos modificar la imagen que mostrará splashy al iniciar el sistema, solo hay que sustituir:

/etc/splashy/themes/default/background.png

Por un png nuestro, que debe ser de 1024×768, una vez sustituido debemos regenerar initram, con:

update-initramfs -u -t

Para que splashy funcione, hay que modificar nuestro /boot/grub/menu.lst y agregar: vga=791 splash al final de los parametros pasados al kernel en el arranque, es decir, cambiar algo similar a esto:

kernel        /boot/vmlinuz-2.6.24-19-generic [...]

Por:

kernel        /boot/vmlinuz-2.6.24-19-generic [...] vga=791 splash

Ahora ya tenemos nuestro splashy listo.

Si queremos deshabilitar el ctrl+alt+backspace que detiene las X, solo hemos de agregar:

SectionServerFlags
Option “DontZap
EndSection

A nuestro /etc/X11/xorg.conf, pero en realidad no hace falta, por que ejecutamos startx dentro de un bucle :)

También podría ser interesante que configuréis grub para pedir password antes de editar ningún parámetro de inicialización, pero eso ya entra dentro de temas específicos de las necesidades de cada uno.

Como vemos, montar un kiosk con debian es muy fácil, son las bondades del software libre.

Como leer un feed RSS desde C

Esta semana estoy muy liado en el trabajo, no tengo mucho tiempo para mantener la calidad del blog, así que tendré que meter algún artículo de relleno, lo siento :D

Bromas aparte, en realidad este es un artículo que quería escribir hace días, pero no encontraba el momento.

Para entrar al tema y no dar los rodeos que acostumbro a dar, existe una librería para C, llamada libmrss, la cual proporciona un conjunto de funciones y estructuras de datos para leer de un feeds rss.

Dicha librería, utiliza libcurl para obtener los feeds y nxml para parsearlos, son sus únicas dependencias.

Para instalar la librería en ubuntu/debian basta con hacer:

apt-get install libmrss0-dev libmrss0

El paquete -dev es el que proporciona los .h para utilizarlos desde nuestro programa, el paquete normal, proporciona los .so, de la librería.

Una vez con la librería instalada, los pasos son sencillos, en primer lugar, incluimos mrss.h desde nuestro código:

#include <mrss.h>

Esto nos define las estructuras de datos y las funciones de la librería, para que las usemos en nuestro programa, en realidad, solo usaremos una función y 2 structs, la función es:

mrss_parse_url

Y las estructuras son el struct mrss_t y mrss_item_t, el primero representa a la información de un feed, y el segundo a los elementos del feed.

Lo interesante de esta librería, es lo sencilla que es de usar, vamos a ver un ejemplo:

#include <mrss.h>
#include <stdio.h>

int main() {
mrss_t *data=NULL;
mrss_error_t ret;
mrss_item_t *item;
ret=mrss_parse_url(“http://rooibo.wordpress.com/feed/&#8221;, &data);
if(ret != MRSS_OK || data == NULL) {
return 0;
}
item=data->item;
while (item) {
printf(“%s\n——————————-\n”,item->title);
item = item->next;
}
return 0;
}

Este miniejemplo hecho en un segundo,  lee las entradas del rss de este blog, y las printea por pantalla, se puede compilar así:

gcc -lmrss ejemplo.c -o ejemplo

Y se ejecuta sin argumentos. Como veis, es muy sencillo utilizar libmrss, la función mrss_parse_url rellena un puntero de tipo data, que dentro contiene un puntero a un struct de tipo mrss_item_t, en el cual tenemos el titulo de la noticia, descripción, etc y un puntero al siguiente elemento de tipo mrss_item_t, con los datos de la siguiente entrada del feed.

Para ver que contiene mrss_item_t aparte de title, podemos consultar la web de mrss, aqui.

Leer feds desde C sirve para muchas cosas, desde extender tu aplicación con soporte para algún tipo de feed, como para hacerse programas que hagan acciones con RSS en dispositivos empotrados, como la fonera.

Lo único negativo de esta librería es que no existe documentación alguna para ella, yo aprendí a usarla leyendo el mrss.h.



Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.