Posts Tagged ‘Programación’

¿Por qué GPL y no otra licencia?

domingo, julio 13th, 2025

Desde hace bastante tiempo, todo software que escribo no sea trivial y que quiera compartir online incluyendo el código porque no lo vaya a explotar comercialmente (o incluso algunos que sí pretendo explotar comercialmente pero no de forma tan obvia), lo publico con licencias como GPL, LGPL y AGPL. La principal razón por la que hago esto es para protegerme a mí y a mis proyectos mediante las cláusulas de viralidad que tiene la familia de licencias *GPL.

Cuando publicas software con licencias como BSD o MIT, estás usando las licencias más permisivas que hay para publicar software dentro de lo mainstream, dándole permiso a cualquier persona a construir a partir de lo que has hecho. Sin embargo, con los años ha quedado evidente que quienes más te van a invitar a publicar bajo esta licencia son también las mayores sanguijuelas del mundo, y es de eso precisamente de lo que me trato de defender.

Al publicar bibliotecas o código con alguna de estas licencias, cualquier persona o empresa puede emplear el código que has hecho como base para crear otras cosas, o usarla como dependencia. No existe ningún tipo de fricción más allá de las pocas cosas que pide la licencia: que no uses el nombre del autor y del proyecto original para implicar apoyo (razón por la que Sony es discreta para decir que el sistema operativo de la PlayStation existe gracias a FreeBSD), y que conserves el texto de la licencia original en el producto final en el que lo usas (esta es la razón por la que tantos programas y aplicaciones móviles hoy día tienen un menú que lista todas las dependencias del mismo y sus licencias).

Pantallazo de la web de licencias de Discord, mostrando partes de las licencias de algunas bibliotecas de software.
Discord no enumera todo lo que tiene en su package.json por gusto, sino porque tiene la obligación de hacerlo.

No existen muchas limitaciones con respecto a lo que se puede hacer con ese código al tomarlo prestado. Puedes escribir el código de una biblioteca JavaScript para crear gráficas SVG, y esa biblioteca puede acabar siendo usada en la pantalla de a bordo de un transbordador espacial, o en la versión web de TikTok o de Instagram.

Cuanto más abierto, más ojos

Eric Raymond con el paso de los años ha tenido el honor de enseñarnos que es un hijo de la grandísima puta, pero cuando escribió originalmente La Catedral y el Bazar después de fundar el concepto «código abierto», acertó con bastantes de las ideas originales que tenía en mente, incluso pese a que, con el paso de las décadas, la manera en la que la sociedad ha acabado usando el código abierto no se ha alineado con lo que originalmente propuso.

Una de esas ideas que nació como una cosa pero que ha acabado convertido en otra completamente diferente es la de que cuanto más abierto y visible sea el desarrollo de un código, más ojos habrá para encontrar los defectos.

Como tal, esto sigue siendo cierto si hay voluntad. Una de las cosas que más feliz me hacen cuando estoy programando con bibliotecas ajenas es tener la oportunidad de depurar un bug, ver que la causa está en una biblioteca ajena, arreglar un archivo que no es mío, y luego enviar la corrección al proyecto original. Y en general esto a pequeña escala sigue siendo frecuente, sobre todo, por parte de personas que tengan menos experiencia.

Sin embargo, no todo el mundo es así. No está de más recordar aquella vez que Microsoft publicó un ticket en el tracker de voluntarios de FFmpeg prácticamente diciendo «lo quiero para ayer» porque la biblioteca falla en una función usada por uno de sus productos estrella. (Siendo justos, FFmpeg está publicado con licencia dual GPL+LGPL, no es una licencia permisiva como la que estoy describiendo aquí.)

Cuando fueron pillados por esto, Microsoft ofreció un simbólico pago de una vez de varios miles de euros por el soporte con este bug. Un bug que, insisto, ocurre en Microsoft Teams. Un programa que a día de hoy mueve el mundo con la energía recíproca con la que miles de trabajadores mueven el ratón cada pocos minutos para que Teams no les marque como ausentes.

Tampoco está de más recordar aquella vez que log4j, una dependencia discreta de Java que normalmente está oculta sin hacer ruido en el fondo de una aplicación, saltó a la fama por una vulnerabilidad que afectaba a demasiadas aplicaciones y que podía reproducirse en productos de Microsoft, Apple, Twitter…

log4j prácticamente por entonces se desarrollaba gratis. Las personas que lo mantenían no habían visto apenas compensación por el trabajo que aportaban a la comunidad, ni siquiera por parte de empresas que habían hecho millones gracias en parte a ese trabajo. Por ponerlo en contexto, uno de los programas donde se usaba log4j era Minecraft, cuyo estudio fue comprado años atrás por Microsoft por 2500 millones de dólares.

log4j ha recibido en los últimos años financiación por parte del STA. Al menos 596.000 €. Su situación sin duda, ha mejorado. Pero es la prueba de que existe mucho software integrado en lo más profundo de la industria, que de desaparecer podría devolvernos atrás varios años, pero que sin embargo no obtiene el reconcimiento que se merece hasta que no es demasiado tarde.

log4j durante un tiempo dio mucho que hablar, y hubo gente que se preocupó por la situación económica y el bienestar de la gente que lo crea, pero con el tiempo volvió a olvidarse el tema. Algo parecido a lo que pasó en 2024 cuando se destapó el backdoor de xz.

Why I GPL

Un artículo antiguo que guardo en mis marcadores como enlace a Web Archive porque ha desaparecido de internet es Why I (A/L)GPL (2011), el cual realmente es bastante parecido a este artículo que estoy escribiendo. En él, se cuenta la historia de Mongrel, uno de los primeros servidores HTTP para Ruby. Las primeras versiones de Ruby on Rails lo usaban, hasta que su creador cambió de stack y el proyecto quedó abandonado y reemplazado por otros servidores HTTP.

Uno de los problemas que su creador se encontró fue que, pese a que Mongrel se volvió durante años en el servidor HTTP de referencia para Ruby on Rails, y pese a ser un stack que durante el boom de la web 2.0 de finales de la década de los 2000s y principios de 2010s creó multimillonarios, no sólo nunca obtuvo reconocimiento, sino que recibió cierto desprecio.

I wrote Mongrel and then gave it away, on the hopes that it would help a bunch of other people, and that giving it away would come back to me in some way. Maybe a job, or some respect, or hell maybe my own company doing more software like it.

Mongrel was a wild success, and lots and lots of companies are making lots and lots of money off it. It not only powered Rails, but nearly every Ruby web framework, other Ruby web servers, and was even ported to other languages. Mongrel is and was a super project and I’m really proud of it.

[…] Sadly, none of Mongrel’s success mattered for me. Even though everyone was using my software, the vast majority of firms using Mongrel were startups. The last thing a startup wants to admit is that they don’t own their intellectual property. They want everyone, especially the VCs and investors, to believe that they’re all geniuses who “innovated” everything they run.

[…] Everyone is using it, and at the same time saying I can’t code.

El resto del artículo es una genialidad y esa es la razón por la que lo he enlazado arriba, para que no se olvide nunca, incluso aunque la copia ya solo esté accesible desde el Web Archive.

El caso de SQLite

SQLite es posiblemente la base de datos más usada en todo el planeta. Es lo suficientemente pequeña como para que no sea una aplicación de red, sino que se integre directamente en las tripas del software donde se usa. En otras palabras: no es una base de datos a la que te conectas, sino que es una dependencia que agregas a tu programa y que usas llamando a funciones, como cualquier otra biblioteca dinámica de programación.

SQLite está publicada en dominio público. Su código se puede usar y tomar para cualquier otro producto, abierto o cerrado, y exprimir comercialmente todo lo que se pueda. (Tangencialmente, SQLite también es ese proyecto que se metió en un drama hace varios años porque su código de conducta estaba prácticamente basado en Los 10 mandamientos, e incluso a día de hoy sigue teniendo un código ético cuya primera regla es «amarás a Dios»; sin embargo, no parece haber razón religiosa detrás del hecho por la que es dominio público.)

Que sea tan permisivo y que no tenga ningún tipo de limitaciones en cuanto a su uso y distribución ha atraído en los últimos años a muchas empresas a derivar el código y crear nuevos motores de bases de datos a partir del SQLite original y tratar de comercializarlos como la nueva idea revolucionaria que merece recibir millones de dólares de capital. DuckDB, Deno KV, Tulso… llámalo como quieras.

Lo venden como «La nueva base de datos ultra ligera para la computación moderna». Y luego resulta que lo que han hecho es «SQLite pero te conectas a través de un puerto TCP», que es justo quitar la única ventaja que tiene SQLite frente a cualquier otra base de datos del mercado. Pero pueden hacerlo porque saben que tienen permiso para hacerlo. Y no tienen miedo de, en el camino, intentar despreciar al producto original cuyo código están desguazando para beneficiarse de él, con frases como «mejor que SQLite» o «hora de dejar atrás SQLite».

La viralidad de la GPL como arma

Frente a esto, la familia de licencias GPL tiene una condición muy importante que es la viralidad. Si derivas un código GPL para transformarlo en otra cosa, eso que hagas también tiene que estar publicado bajo la GPL, salvo que ya esté publicado con una licencia compatible. Si copias un fragmento de código GPL en tu programa de internet sin prestar atención, tu programa automáticamente se vuelve GPL o está inclumpliendo la licencia.

Y esta es la razón también por la que prácticamente cualquier gran empresa no quiere saber nada de ninguna biblioteca publicada como GPL. En el momento en el que un programa se enlaza dinámicamente a nivel sistema operativo con una biblioteca GPL, o en el momento que uno de los empleados copia de internet un fragmento de código GPL y lo inserta en lo que está escribiendo, conforman una única unidad, por lo que todo el producto también se vuelve GPL.

Esto es algo que solo afecta a trozos de código copiados sin contexto y a bibliotecas. Usar un programa GPL de forma separada e independiente no va a volver el programa principal GPL. Esa es la razón por la que, por ejemplo, Apple tradicionalmente ha distribuido Bash y otros componentes GPL con su sistema operativo. Mientras estén sueltos y no combinados, no son peligrosos.

Usar una aplicación GPL en tu empresa para depurar la API del servicio HTTP que estás desarrollando no va a volver lo que estás programando como GPL. Sin embargo, algunos abogados y departamentos de informática tienen estrés postraumático y se ven obligados a prohibir cualquier traza de GPL en una empresa.

No quiero perras, sólo quiero un uso justo y honestidad

¿Estoy dando a entender que no publico con licencias permisivas porque quiero dinero? No necesariamente. He compartido estos ejemplos para probar que lo que nació como un movimiento de «creación de software en comunidad de forma abierta» se ha convertido en un método de extracción de esfuerzo donde algunas empresas poderosas, y otras personas no tan poderosas pero sí con un MBA en su pared, se aprovechan de manera sofisticada del trabajo comunitario de otras personas evitando tomar responsabilidad en las acciones que cometen.

Sobre todo cuando se trata de tomar la dependencia escrita por un programador junior y publicada con licencia permisiva e integrarla en productos de software de lo más variados. Quieren la parte positiva del código abierto (ahorrarse costes de desarrollo), sin pensar en la parte negativa (que es que, tal como dicen tanto la licencia BSD como la MIT, que ese código no tiene ninguna garantía y se ofrece tal cual, o sea, AS IS). ¡Dios mío! El código que he tomado de internet no funciona. ¡Que alguien haga algo!

De forma parecida a lo que mencionaba con SQLite, cuando publico software como GPL, lo estoy haciendo para protegerme precisamente de este tipo de casos. No tengo problema en que haya gente que modifique el código y agregue cosas en las que no había pensado. Precisamente por eso comparto el código. Sin embargo, si alguien pretende derivar el software para compartir de forma pública su versión alterada, debe publicar el código fuente para asegurarme de que actúa de forma honesta y justa.

Conclusión

Para código trivial, implementaciones de bibliotecas que ya existen y que son dificiles de superar, o para bibliotecas de 5 líneas con algoritmos que sean fáciles de replicar, no veo problema en publicar código con licencias permisivas.

Sin embargo, para cualquier otra cosa donde el código que estoy compartiendo realmente valga la pena o haga algo único y especial, no veo a día de hoy razón para usar algo que no sea la GPL. De este modo se comparte de forma mucho más justa el código de manera que nadie intente explotar a nadie, solo mejoremos a la vez de forma colectiva.

GTK, nociones de programación básicas

martes, marzo 26th, 2024

GTK es una biblioteca de componentes usada para hacer aplicaciones gráficas, es decir, aplicaciones de ordenador con ventanas, botones, etiquetas y esas cosas. La gente joven tal vez no sepa esto, pero antes las aplicaciones de ordenador (como los reproductores de música, las aplicaciones de chat o los organizadores de imágenes) no se programaban en HTML, sino que se hacían mediante programas que había que instalar en el ordenador (como cuando instalas Instagram en el móvil).

GTK es una de las bibliotecas predominantes en el mundo del software libre, ya que proyectos como el entorno de escritorio GNOME o el entorno de escritorio Xfce lo utilizan como base para muchas de las aplicaciones y herramientas que se instalan con el entorno de escritorio. Sin embargo, GTK es multiplataforma y se pueden compilar aplicaciones para Microsoft Windows y macOS que también utilicen esta biblioteca de componentes gráficos.

(más…)

Mi primer prototipo con gtk-rs (ahora sí)

jueves, marzo 21st, 2024

En el stream de ayer hice la primera compilación del cURL gráfico que he empezado a desarrollar. Por ahora no quiero que sea muy sofisticado y vamos a empezar suavemente. La aplicación por ahora debería mostrar un campo de texto para poner la URL, un dropdown para elegir el verbo HTTP de la petición (por ejemplo, POST o GET), una tabla para introducir las cabeceras HTTP de la petición, un campo de texto para el cuerpo de la petición HTTP, un botón para tirar la petición HTTP y un campo de texto donde ver la respuesta de la petición HTTP.

Aunque acabará ocurriendo, el reto por ahora va a ser ver hasta cuánto puedo avanzar en el desarrollo sin instalar GNOME Builder ni crear un proyecto auténtico al estilo GNOME moderno, con su meson.build y su parafernalia. Por el momento he creado un proyecto a mano usando cargo new y luego he agregado gtk4 como dependencia usando cargo add gtk4.

Para meter el cuerpo de la petición, me interesa usar un GtkSourceView, porque quiero que se pueda colorear en caso de que se utilice XML o JSON, así que también lo meteré.

(más…)

Primeros pasos creando blueprints con GNOME Workbench (resumen del stream de ayer)

jueves, marzo 21st, 2024

Este post forma parte de la saga dedicada a la creación de una alternativa verdaderamente libre (o sea, GNU GPL) a Postman, Insomnia y Bruno. A su vez, esto es un resumen de texto de lo que hice en un stream de livecoding anterior. Así si te lo perdiste, es fácil de leer. Principalmente, lo que voy a contar aquí es cómo utilizar Blueprint y el lenguaje de diseño. Es un post que sirve como referencia y que estaré enlazando más adelante.

En el stream de ayer, después de contar la razón por la que quiero empezar a crear una aplicación de este estilo, empecé a fabricar el prototipo de una interfaz de usuario con GNOME Workbench. Esta aplicación permite diseñar una ventana y verla en tiempo real, para poder iterar más rápido y sin tener que recompilar código.

(más…)

Nice to haves y funciones aptas para un MVP

jueves, marzo 21st, 2024

Por último, voy a describir algunas funciones que estaría bien ponerle a mi cliente HTTP, y cuáles vale la pena implementar al principio y cuáles para más adelante. O incluso cuales puede que nunca implemente.

Por el momento me interesa que mi cliente haga lo mínimo esencial para por lo menos empujar el proyecto para adelante. Es decir, me interesa:

  • Que se pueda introducir la URL a la que tirar la petición.
  • Que se pueda seleccionar el método HTTP a utilizar (GET, POST…)
  • Que se pueda ponerle un body a las peticiones web (para enviar datos).
  • Que se puedan elegir las cabeceras HTTP a utilizar.
  • Que se pueda visualizar la respuesta y las cabeceras de la misma.
(más…)

Análisis técnico de mi cliente HTTP

jueves, marzo 21st, 2024

Como dije en el post anterior (que he partido únicamente para poder enlazarlo aparte), quiero crear un cliente HTTP gráfico. «Como Postman, pero libre. Como ThunderClient, pero sin exigirme abrir un editor de textos para usar el plugin».

En primer lugar, voy a evaluar y determinar el stack tecnológico con el que voy a trabajar, y luego las características que quiero que tenga. Spoiler: GTK y Rust. Sin embargo, en este post voy a intentar justificar el por qué de estas decisiones.

(más…)

Server-Sent Events con ExpressJS

jueves, febrero 22nd, 2024

Recientemente tuve una excusa para jugar con la API de Server-Sent Events en el navegador web, y utilizar un microservicio ExpressJS como proveedor de eventos en tiempo real.

Server-Sent Events es una API que permite a una página web incorporar eventos push enviados desde un servidor. A diferencia de un websocket, Server-Sent Events sólo permite comunicación unidireccional enviada desde el servidor al cliente, pero el cliente no tiene la posibilidad de comunicarle nada al servidor. Sin embargo, en casos donde solamente queremos que el servidor nos pueda mandar mensajes en tiempo real y reaccionar a ellos, puede ser más que suficiente.

Además, a diferencia de WebSocket, que normalmente requiere una biblioteca específica para hacer el ugprade a websocket y la gestión de eventos, el protocolo SSE es lo suficientemente simple como para poder usarlo con casi cualquier lenguaje de programación, porque por fuera es una petición HTTP regular. Yo lo voy a usar con ExpressJS, pero en MDN hay un ejemplo para conectarlo desde PHP. Ojo, no Symfony, Laravel o algo, sino puro archivo events.php sin framework. En frontend, el cliente de SSE es compatible con todos los navegadores, y además lleva disponible desde hace años: Chrome 6 y Firefox 6 ya lo soportaban.

(más…)

Generar AppImages con AppImageKit

viernes, enero 12th, 2024

Para un proyecto estoy generando ejecutables para GNU/Linux, y el compilador me produce una carpeta con una distribución de archivos. Carpeta bin/ con el ejecutable, carpeta lib/ con las .so… Podría empaquetar eso en un .zip, podría aprender a generar un .deb o un .rpm… o podría aprovechar la ocasión para aprender a crear archivos AppImage.

AppImage es un formato ejecutable autocontenido para GNU/Linux. Es decir, el ejecutable y todas las dependencias (imágenes, bibliotecas dinámicas…) van dentro del propio archivo. La ventaja de esto es que acabas con el conflicto de versiones de bibliotecas dinámicas (la típica de que en GNU/Linux dos programas no se llevan bien porque uno espera que /usr/lib/libwhatever.so sea la versión 1.2.3 y otro espera que /usr/lib/libwhatever.so sea la versión 2.5.8). Al final tienes un único archivo, que haces ejecutable con chmod +x, y que cuando ejecutas funciona normal en cualquier distribución GNU/Linux. Como lo que también buscan conseguir Flatpak y Snap, vaya.

Para crear AppImages, utilicé AppImageKit. Es una herramienta que convierte un directorio en formato AppDir (es decir, con el esqueleto de la aplicación), en un archivo ejecutable de tipo AppImage. Aunque es muy flexible, a la vez es muy sencillo de empezar a usar.

(más…)

let, apply y similares en Kotlin

viernes, diciembre 15th, 2023

De mis características favoritas de Kotlin, una de las más top es que todos los tipos tengan como funciones de extensión una serie de métodos auxiliares: let, apply, also… Son una forma limpia de encadenar código y hasta de transformarlo. El problema es que nunca recuerdo qué diferencia hay entre ellos, así que voy a dejarlo por aquí escrito para la próxima.

Su nombre correcto es scope functions y aceptan como parámetro una lambda con el código que queremos que se evalúe a consecuencia de invocar esa scope function. Su principal gracia, como muestro ahora, es que desde dentro de la lambda se puede referenciar al objeto cuyo método de extensión es invocado. Bajo mi punto de vista, esto está muy bien porque permite no escribir tanto código cuando se usan expresiones largas.

Por ejemplo, supongamos que hay que llamar a varios métodos del objeto accesible desde context.server.settings. Tendríamos que escribir varias veces todo el chorizo de clases. Me invento el código:

context.server.settings.port = 8080
context.server.settings.protocol = Protocols.HTTPS
context.server.settings.resetLogger()

Para no cansarnos de escribir tanto context.server.settings, las opciones serían, o crear una variable local con val sett = context.server.settings para luego hacer sett.port y sett.protocol, o… usar las scope functions y que la variable se declare implícitamente.

(más…)

Cómo importar un paquete de Go usando un dominio propio

viernes, febrero 17th, 2023

La idea final es explicar cómo se puede hacer para importar un paquete de Go usando una construcción como import "example.com/package/foobar/lib" y que funcione bien, en el sentido de que la ruta que se le pone en el import es una ruta que resuelve y desde la que se puede descargar el paquete correspondiente, pero sin tener que poner explícitamente github.com o gitlab.com en la ruta del import.

(más…)