Aprovechando la potencia de GNU Common Lisp (GCL)

Quien más quien menos ha oído hablar alguna vez de Lisp y del paradigma de la programación funcional. Lisp es un lenguaje de programación que no suele encontrarse fuera del mundo universitario y normalmente suele estar asociado a la Inteligencia Artificial (IA), aunque en realidad Lisp puede usarse para cualquier cosa e incluso puedo decir que hay problemas de complicada resolución con otros lenguajes de programación que en Lisp pueden ser bastante triviales. Aún así los programadores de Lisp no abundan en el mundo, y aquí en Castellón estoy bastante convencido de que me sobra una mano para contarlos.

No voy a hablar sobre los pros y los contras de programar en Lisp, pero si te gusta Lisp o te ha picado el gusanillo con mi breve introducción o quieres conocer algo más que lenguajes de programación imperativa, te recomiendo que leas alguno de los ensayos sobre Lisp de Paul Graham o alguna de las entradas de Slava Akhmechet en defmacro.

GNU Common Lisp, de ahora en adelante GCL, es la implementación oficial de Lisp usada en el proyecto GNU. Existen otras implementaciones libres de Lisp que tienen más utilidades que GCL, como librerías de sockets, multithreading, etc, pero el hecho de que GCL fuera la preferida por los de GNU me animó a jugar un poco con ella y he de reconocer que no me siento decepcionado.

Al contrario que con los compiladores de otros lenguajes, que compilan los programas a bytecode para despues ejecutarlos con una máquina virtual o compilarlos a lenguaje máquina, GCL compila a C para realizar una segunda compilación mediante gcc o el compilador de C que tengamos en nuestro sistema. Gracias a esta integración entre Lisp y C es posible programar con GCL usando C para bajo nivel (acceso a registros, memória, punteros, etc) y Lisp para alto nivel (gestión de listas, árboles, operaciones con funciones, macros, etc). Resumiendo, tenemos toda la potencia de C, lo que significa que podemos crear nuestras propias funciones de multithreading por ejemplo, y la potencia de un lenguaje de alto nivel como Lisp.

Para lograrlo necesitamos solamente tres macros de GCL: clines, defentry y defcfun. Eso e instalar GCL, claro.

Probaremos a hacer una prueba sencilla en la que definiremos una función en C que sume dos enteros y devuelva el resultado y usaremos esa función desde Lisp. Primero crearemos el fichero “misuma.lsp” con estas dos lneas:

(clines "int misuma (int x, int y) { return x + y; }")
(defentry mi-suma (int int) (int "misuma"))

Con clines podemos introducir cadenas de texto directamente en el código C resultado de la compilación del programa. En este caso declaramos la función misuma. Y con defentry declaramos la función mi-suma en Lisp, que recibe dos enteros como parámetros y devuelve otro entero desde la función C misuma.

Ahora ya podemos entrar en el intérprete de Lisp y compilar nuestro pequeño programa. Cuando se programa en Lisp no es necesario compilar ya que es un lenguaje interpretado (se suele compilar cuando el programa ya está acabado para ganar velocidad) pero debemos hacerlo si queremos integrar Lisp y C.

Compilamos con (compile-file "misuma.lsp") y cargamos el código objeto que hemos generado con (load "misuma.o"). Ahora ya tenemos nuestra nueva función C disponible en Lisp. Si ejecutamos (mi-suma 3 2) obtendremos 5. ¿Impresionante, verdad? ¿No? Bueno, puede que no lo parezca pero esto es la punta del iceberg, una punta muy pequeña, ya que lo mismo que hemos hecho con la suma podemos hacerlo con la librería matemática de C, o con las librerías GTK, o con Qt, etc.

Estoy realizando un proyecto en el que he integrado SDL con Lisp consiguiendo resultados bastante espectaculares, pero de eso hablaremos otro día.

Me he dejado lo mejor para el final. ¿Es posible hacer una función en la que se mezclen instrucciones de C con instrucciones de Lisp? Pues podemos hacerlo gracias a defcfun. Vamos a verlo.

Volvemos a editar “misuma.lsp” y añadimos las siguientes líneas:

(defcfun "static object otrasuma (int x, int y)" 0
"object z;"
"int s = x + y;"
('+ z)
((list z (int x) (int y)) z)
((cons z (int s)) z)
"return z;")

(defentry otra-suma (int int) (object "otrasuma"))

Si volvemos a compilar y ejecutamos (otra-suma 10 7) obtendremos la lista ((+ 10 7) . 17). Veamos cómo lo hace.

En primer lugar indicamos la cabecera de la función con su nombre y argumentos. El código en C se escribe usando cadenas de texto. Declaramos una variable z que contendrá la lista resultado y un entero s con el resultado de la suma.

La macro defcfun usa una sintaxis especial de Lisp que no voy a explicar (que para eso está la documentación) de forma que ('+ z) es lo mismo que hacer (setq z '+) desde el intérprete. Ahora ya tenemos que z contiene (+).

Con la siguiente instrucción creamos la lista que representa la operación, con lo que z pasa a contener (+ 10 7). Y finalmente hacemos el cons con el resultado de la suma que teníamos en s, con lo que nos queda la lista que hemos obtenido al ejecutar la función.

¿Y si ejecutamos (= (eval (car (otra-suma 10 7))) (cdr (otra-suma 10 7)))? Por la salud mental de todos espero que nos devuelva T ;-)

Fight DRM, Join the Free Software Foundation

El software libre sí crea mercado

Alexey Leonidovich Pazhitnov, creador del juego Tetris, en una entrevista publicada en Consumer afirma que “eso [el software libre] nunca debería haber existido y a día de hoy no debería existir. Y le diré por qué: el software libre destruye mercado. Allí donde con el esfuerzo de grupos de personas se construyen posibilidades de mercado, de riqueza y de prosperidad, llega gente irresponsable y crea desarrollos alternativos que hunden a las empresas. Y eso no es bueno para el desarrollo de la tecnología; el software libre no tiene proyección de mercado, no crea riqueza, sólo es una muestra de rebeldía estéril.”

Como ya he dicho muchas veces no voy a entrar en si desarrollar software libre puede ser fuente de riqueza. Es un hecho. RedHat y Canonical con distribuciones, MySQL (ahora Sun) con bases de datos, Sun con suites ofimáticas, Menéame o Wordpress con aplicaciones web, etc, etc. Nadie puede negar que con el software libre se puede ganar dinero porque mucha gente lo está haciendo ahora mismo.

El problema para las empresas de desarrollo de software privativo no reside en si el código es accesible o no, o en que se puedan copiar los programas. El verdadero problema para ellos es que el software libre cambia las reglas del juego, les quita fuerza a los monopolios e incrementa la competencia. Pero estas empresas están tan acostumbradas a su dominio del mercado que son incapaces de competir.

Pongamos el ejemplo típico. Para Microsoft, Debian o gNewSense representan la competencia, una competencia fiera en el sector de los sistemas operativos. Pero también son competencia para RedHat o para Fedora. Y no digamos para Canonical ya que Ubuntu está basada en Debian. Sin embargo para estas empresas las distribuciones sostenidas por organizaciones no representan un problema tan serio. Claro, estas empresas están preparadas para moverse en un mercado más dinámico y competitivo, saben hacerlo bién y sacar dinero de ello.

Es evidente que el software libre no se pensó como una forma de ganar dinero. Ni tampoco la pintura o la música. Normalmente un pintor empieza a pintar cuadros porque le gusta, y si puede venderlos pues mejor. Si se hace famoso y llega a ganar mucho dinero podremos decir que se ha hecho rico gracias a la pintura. Pero no podremos decir que se hizo pintor pensando en hacerse rico (o por lo menos no lo pensaba en serio).

De la misma forma las características del software libre no se pensaron para hacer negocio, pero sin embargo puede hacerse. Nadie puede decir que no, porque es un hecho.

Un canon para promocionar la cultura

Ahora que se ha puesto tan de moda hablar sobre el canon, sociedades de gestión, etc, no quiero ser menos y también voy a contribuir con algo más de morralla blogosférica o blogocósica o como se llame.

Siempre me he posicionado en contra del canon, incluso cuando solamente se aplicaba en fotocopiadoras, cintas de video y otros medios más tradicionales, es decir, cuando nadie sabía qué era eso del canon (cuando era un chaval, vaya). Pero ahora me encuentro en una posición incómoda; desde que hablar en contra del canon se ha convertido en sinónimo de música gratis (olvidando el resto de artes como si no fueran cultura) ya no defiendo mis posiciones con la misma vehemencia. Y como me gusta llevar la contraria y crear polémica, pues alla voy: Sí al canon. Toma ya, con un par.

Tranquilos, no se me escandalicen ustedes. Los que me conocen bien ya se imaginarán que aquí hay trampa. ;-) En efecto, mi apoyo al canon va condicionado a una serie de requisitos que ahora mismo están muy lejos de darse. Veamos. Por un lado tenemos el derecho de copia privada, algo que debe garantizarse y potenciarse, y si me dejan incluso me atrevo a decir que lo mismo debería hacerse con los derechos de difusión y de distribución. No me cabe en la cabeza que un particular no pueda crear sus propios discos recopilatorios y ponerlos a la venta, por poner un ejemplo, siempre y cuando se respete la autoría de las canciones. Y por otro lado tenemos la necesidad de promocionar (pagar) para que la actividad de creación cultural no se vea perjudicada. Pero claro, eso hay que aclararlo y mucho.

Para empezar, el canon que tengo en mente debería ser gestionado de forma pública. Nada de sociedades privadas a las que nadie controla (excepto los que sacan tajada, claro) sino una gestión similar a las que se realizan con el I.R.P.F., la Seguridad Social, el IVA y demás impuestos. Las sociedades de gestión sobran, o como mucho su existencia tendría sentido si se comportaran de forma similar a como lo hacen los colegios oficiales. Pero nada de manejar dinero público, que lo es, no se sabe cómo, ni para qué, ni por quiénes.

Ese dinero se debe usar para promocionar la cultura. Aquí no hace falta ser muy listo para comprender que gente como Bisbal o como Boris o como Luis Cobos no necesitan el dinero del canon para seguir “creando”. Todo lo contrario, el canon debería pagar ayudas para esos jóvenes que trabajan de camareros o en la obra y por la noche tocan por cuatro duros en algún pub. O para esa señora que escribe después de acostar a sus hijos tras una jornada de once horas. O para las bibliotecas públicas (¿en qué cabeza cabe que las bibliotecas deban pagar?). O para ese señor que intenta vender sus cuadros en el mercadillo y que nadie conoce porque le falta un buen padrino.

Yo, como todo hijo de vecino, pago a la seguridad social y no lo hago para recibir atención médica, ni para mis familiares, ni para mis amigos. Si lo hago es por esos niños con cáncer que me rompen el corazón, por esos abuelitos con alzheimer, por toda esa gente que sufre y que gracias a ese dinero que pagamos pueden luchar por conseguir una vida normal sin que por ello se tengan que arruinar sus padres o sus hijos.

Y por eso quiero pagar el canon. No para que Ramoncín siga viviendo de la sopa boba (que seguro que sin canon puede hacerlo igual de bien) sino para que el colegio de mi barrio, o del tuyo, o del tuyo, pueda dar clases de piano a esos jóvenes talentos que se desperdician un día sí y otro también porque ni ellos mismos han tenido la oportunidad de darse cuenta.

Pequeña guía de la GPLv3

El FSF Compliance Lab ha preparado una pequeña guía de la GPLv3 para desarrolladores, explicando de forma fácilmente comprensible los cambios más importantes de la nueva licencia.

La GPLv3 es muy similar a su antecesora; el espíritu es el mismo, usar las leyes de copyright para preservar la libertad de los usuarios, al contrario de lo que ocurre con el software privativo.

Haciendo un poco de memoria, decimos que un programa es libre si un usuario puede:

  • Usar el programa para cualquier propósito.
  • Compartir el programa con otras personas.
  • Modificar el programa para adaptarlo a sus necesidades.
  • Compartir las modificaciones efectuadas en el programa.

Si ese programa se encuentra protegido además por una licencia como la GPL sabemos que ese programa seguirá siendo libre independientemente del soporte en el que se encuentre o de quién sea su distribuidor, lo que se conoce como “copyleft”.

La GPLv3, al igual que sus antecesoras, nos proporciona esta seguridad aunque con un texto más claro y fácil de leer, más internacional (se han tenido en cuenta las peculiaridades jurídicas de distintos países) y más adaptada a las nuevas formas tecnológicas de restringir la libertad de los usuarios.

Es en este último punto dónde más ha avanzado la nueva versión de la GPL.

Los programas con GPLv3 están a salvo de la “tivoización”, la posibilidad de impedir de forma física (mediante contraseñas, criptografía u otras formas de protección) que los usuarios puedan estudiar y/o modificar los programas, incluso aunque sean GPL. Con la nueva versión no se prohiben estas formas de protección, pero se obliga a que el usuario pueda acceder a los programas (conociendo las contraseñas, con claves criptográficas propias, etc.) de forma que sus libertades no se vean cohartadas.

A estas alturas todo el mundo conoce o a oído hablar del DRM. Existen leyes a nivel europeo que prohiben el desarrollo de programas para saltarse las protecciones DRM (juicio contra DVD Jon). La GPLv3 permite usar código GPL para implementar sistemas DRM pero la sección 3 indica que estos sistemas no serán considerados como medida efectiva de “protección” tecnológica, por lo que es posible escribir programas que rompan el sistema de protección y distribuirlos sin infringir ninguna ley.

Los programas protegidos mediante la GPLv3 también proporcionan a sus usarios la seguridad de que no podrán ser demandados por infracción de patentes de software, ya que tienen la obligación de venir acompañados de las apropiadas licencias de uso de patentes. Este tema no nos preocupa demasiado en Europa, al menos de momento, pero siempre es de agradecer.

La GPLv3 protege de forma más efectiva la libertad de los usuarios y también permite una mayor cooperación entre la comunidad del software libre. Existen otras licencias para software libre, cierto, pero no encontrarás a nadie más preocupado por la libertad y la ética que la gente que ha trabajado para que esta nueva versión de la GPL sea una realidad.

Jugando con FVWM-Crystal

Siempre me han fascinado los programas que respetan el “medio ambiente virtual”, es decir, que no machacan tu ordenador con un excesivo consumo de recursos que en la mayoría de los casos no está justificado.

Por eso cuando todo el mundo se maravillaba con Gnome, KDE, transparencias, etc, yo prefería trabajar con Window Maker y no tener que oír cómo rascaba mi disco duro (no, no quiero ampliar memoria para poder ver más dibujitos).

Hasta que conocí FVWM-Crystal, basado en FVWM y que conjuga un aspecto más que aceptable con una excelente optimización de recursos. Hasta funciona de forma decente en mi portátil Pentium III con 64 MB.

Hoy, para desestresarme un poco ;-) , he estado explorando sus posibilidades algo más a fondo. Es curiosa la forma que tiene de construir los menús, y a la vez elegantemente sencilla, con una estructura de ficheros y directorios para crear las entradas y las secciones y subsecciones en /usr/share/fvwm-crystal/fvwm/Applications/ y unos scripts que recogen esa estructura y construyen el menú.

Esos scripts pueden ser ejecutados como usuario, con lo que puedes conseguir que tus programas hagan maravillas con el gestor de ventanas :-)

Lo que aún no tengo claro es cómo ejecutar aplicaciones en segundo plano que muestren información en la barra de tareas, pero tiempo al tiempo.

Descubriendo bogofilter

Aunque es un programa que ya lleva años por el mundo no había oído hablar de él, y ahora me pregunto cómo he podido vivir sin él. Bogofilter es un programa para filtrar spam desarrollado en sus inicios por Eric Raymond y que a diferencia del spamassassin no usa reglas bayesianas sino que utiliza una base de datos de palabras para calcular la probabilidad de que un mensaje sea o no sea spam.

Hay un artículo muy bueno sobre el tema en Bulma, Bogofilter mata mejor, en el que aparte de explicar en qué consiste el algoritmo que usa el programa también explica cómo instalarlo y configurarlo.

Mi experiencia es que bogofilter da mejores resultados que spamassassin sin necesidad de un entrenamiento tan concienzudo, además de poder integrarlo fácilmente en cualquier sistema de correo mediante procmail. Si no lo conoces pruébalo y te sorprenderás.

Extremadura a la cabeza de España

Estos días estoy en la iParty9 de Aditel, con tiempo para programar, leer, pensar e intercambiar ideas con gente que sabe un montón. Sin ir más lejos el jueves estuvimos debatiendo sobre la problemática del DRM (por cierto, tengo que buscar los enlaces que me pidió glo) y sobre cómo la gente no es consciente, o no quiere serlo, de que las grandes compañías productoras de obras digitales (música, cine, programas, etc) están vulnerando de forma sistemática sus derechos.

Por otro lado hoy me encuentro con el interesante artículo Extremadura: Punta de flecha que como muchos otros nos explica el gran avance tecnológico que se está llevando a cabo en Extremadura a lomos del software libre. Casos similares se están dando en los países hispanoamericanos y en algunos países asiáticos. O el caso de Baleares, donde muchas empresas están haciéndose un nicho en el mercado del software gracias a los programas libres.

¿Acaso hay que ser pobre o hay que tener recursos limitados para ver con claridad? Si estos casos como el de Extremadura están triunfando de la forma que lo están haciendo, ¿qué podrían hacer países, estados o comunidades con muchos más recursos? Es una pena que el dinero público, es decir, nuestro dinero, se gaste en empresas que atacan los derechos de nuestros ciudadanos cuando invirtiendo en software libre ese dinero se transformaría realmente en algo bueno para la sociedad.

Lotb, un sistema multiblog GPL

Lotb LogoLord of the Blogs (Lotb) es un sistema multiblog en el que llevo trabajando unos meses. En si mismo no es un blog, pero permite centralizar la gestión de distintos blogs desde un único sitio. Su particularidad es que los blogs pueden encontrarse en distintos servidores, usar distintas bases de datos e incluso distinto software. Por ejemplo, con Lotb podríamos usar un blog con Wordpress y otro con Textpattern en un servidor distinto, usando siempre el mismo software de gestión.

Una utilidad bastante evidente para Lotb es usarlo para implementar granjas de blogs, aunque también puede ser usado por una sola persona para mantener sus distintos blogs. Al permitir blogs desde distintos servidores el sistema es fácilmente escalable sin que ello repercuta en el rendimiento global.

El proyecto se encuentra todavía en fase pre-alfa, pero el esqueleto de todo el sistema ya está desarrollado y las pruebas realizadas hasta el momento son suficientemente satisfactorias como para continuar adelante. De momento no existe una versión descargable y solamente se puede acceder al código fuente en PHP usando CVS. La licencia actual es GPLv2 aunque se pasará a la GPLv3 en cuanto sea oficial.

El proyecto se encuentra ubicado en Savannah. Se puede acceder a la web oficial de Lotb o a la web de Lotb en Savannah para más información.

Leer más »

Ya se debate el tercer borrador de la GPLv3

La licencia GPL en su tercera versión está cada vez más cerca de ser oficial. La intención es que esté lista para este año. De momento ya va por su tercer borrador, que incluye las ideas aportadas por la comunidad, por los comités de discusión oficiales y por las conferencias internacionales de India y Japón.

Los cambios más relevantes son:

  • Los que infrinjan la licencia por primera vez podrán recuperar su licencia de forma automática si solucionan el problema en el plazo de 30 días.
  • Se han simplificado los términos de compatibilidad de licencia, por lo que ahora son más fáciles de entender y administrar.
  • Los fabricantes que incluyan software GPLv3 en sus productos deberán proporcionar también manuales de instalación junto con las fuentes de los programas usados.
  • Se han añadido nuevas limitaciones sobre el uso de patentes de software orientadas a prevenir intentos de protección discriminatoria a los distribuidores por parte de titulares de patentes, como en el caso del pacto Microsoft-Novell.

Estos cambios, al igual que los demás términos de la licencia, están pensados para permitir que los programas del proyecto GNU y todos los programas registrados bajo la GPL sigan siendo libres, es decir, se puedan usar, copiar, modificar y distribuir modificados, a pesar de las nuevas medidas tecnológicas que intentan impedirlo.

GNU/Stallmans - The Free Software Song

Porque no todo es programar en la comunidad del software libre…