Amassando ideas

“Libertad: Falta de sujeción y subordinación” ~ Definición de la Real Academia Española

El software libre es aquel que respeta nuestra libertad como usuari@s otorgándonos cuatro libertades sobre el programa: Usar el programa para cualquier propósito, estudiar el código fuente del programa y cambiarlo como queramos, distribuir copias exactas del programa y distribuir versiones cambiadas del programa. Estas libertades permiten a l@s usuari@s controlar sus actividades informáticas mediante lo que hacen sus computadores, y fomentan la cooperación y la ayuda a la comunidad.

Un programa que no viene con alguna de las cuatro libertades mencionadas se llama privativo, porque priva de la libertad a sus usuari@s, respecto de ese programa. El software privativo impide formas importantes de cooperación y de empoderamiento, además de obstaculizar el desarrollo de nuevas tecnologías. Por eso, mucha gente lo considera anti-ético. Sin embargo, puede ser difícil de entender cómo el software privativo afecta negativamente a nuestras vidas, sobretodo si no sabemos ni nos interesa aprender a manipular código. En este artículo ahondaremos en los principales perjuicios a la sociedad provocados por distribuir software sin las cuatro libertades, y determinaremos si deberíamos rechazar el uso de programas que no son libres.

El perjuicio del privativo

Muchas veces, aunque no siempre, podemos elegir si aceptar el uso de un programa privativo, pero si aceptáramos estaríamos cediendo parte del control de nuestras actividades informáticas. No podríamos saber exactamente qué hace nuestro computador (ni consultar con otras personas ajenas al desarrollador sobre su funcionamiento, porque no tendrían acceso al código fuente), ni usarlo para lo que queramos. Si algo no nos gusta del programa no podríamos cambiarlo ni acudir a otras personas para que lo hagan por nosotros. El único control que podemos tener sobre un programa privativo es decidir si usarlo o no, pero hay veces en las que estamos obligad@s a usar software privativo para poder comunicarnos con alguien (ejemplo: Whatsapp), por el trabajo o la escuela, en esas ocasiones nos sentimos presionad@s a usar software privativo, por lo que no es fácil decir que no.

No obstante, aunque en teoría no tengamos estas libertades, es posible pensar que su ausencia no afecta al usuario promedio porque supuestamente lo único que le interesa es que el programa funcione para lo que él quiere y aunque hayan cosas que le disgustan del programa, es probable que el desarrollador las arregle o bien el usuario no quiera molestarse en hacer los cambios correspondientes. A continuación responderemos a algunas objeciones posibles a la idea de que el software privativo afecta a l@s usuari@s de computadores, es decir, a tod@s nosotr@s, para luego responder a la interrogante: ¿Deberíamos rechazar el uso de software privativo, por nuestra libertad? Examinaremos el impacto de cada una de las libertades del software libre, y la ausencia de éstas, y luego revisaremos algunas consecuencias de la aceptación y rechazo del software privativo, para finalmente obtener una conclusión.

Libertad 0

En primer lugar, es importante poder usar nuestras herramientas informáticas según nuestros propósitos. Sin la libertad 0, parte de nuestros programas que ocupamos sólo pueden ser usados para los fines estipulados por el desarrollador (como el frecuente caso de las licencias de software para uso no comercial, al comprar objetos materiales esta restricción no suele existir), y sólo mientras éste nos permita usar el programa. Por ejemplo, hay licencias de software que expiran a voluntad del desarrollador, o por órdenes de gobiernos extranjeros. El que nuestras herramientas informáticas tengan restricciones de uso es como que los autos vengan con una prohibición de usarlos en ciertas ciudades, tijeras que por una licencia de uso no puedan ser usadas para hacer manualidades, o salsa que por decisión de l@s productores no pueda ser usada en determinadas comidas porque eso afectaría a sus intereses.

Por otra parte, si con el fin de que todos nuestros programas instalados tengan la libertad 0 rechazamos los que no nos den dicha libertad, puede ser que tampoco podamos usar nuestro computador para algo que esté prohibido por la licencia de los programas a rechazar, y además nos perdamos de las características útiles de tales programas. Por tanto, aunque en proporción perdamos soberanía sobre nuestra informática al instalar software privativo, en cantidad podríamos hacer más. Esto sólo sería cierto si es que no existiesen programas libres que tengan las mismas funcionalidades esenciales del programa privativo, pero actualmente existe mucho software libre y existen reemplazos libres para los principales programas privativos existentes. En AlternativeTo se pueden encontrar varias opciones libres bajo la etiqueta open source.

Otra posible objeción a la idea de la necesidad de la libertad 0 es que si queremos hacer X actividad prohibida por la licencia del programa simplemente podemos instalar otro programa que sí lo permita. Pero cambiarse de programa no siempre es fácil. A veces habrá que pagar por otra licencia de uso o aprender a usar otra herramienta desde 0. Por ejemplo, una crítica común a GIMP es que su interfaz es muy distinta a la de Photoshop y tiene un soporte mediocre para los archivos PSD que son nativos de Photoshop. También esa posible que nos volvamos dependientes de un programa que no podremos reemplazar en caso de que lo necesitemos. Si valoramos nuestra libertad, escogeremos siempre el software libre.

Libertad 1

Sumado a lo anterior, el código fuente del software privativo no suele estar disponible, por lo que no se puede aprender de él ni cambiarlo para que nuestro programa haga lo que queramos. Necesitamos poder averiguar cómo funcionan los programas que ocupamos para tener el control efectivo sobre ellos. Esto podría parecer irrelevante para la gente que no sabe programar, pero el problema se puede ilustrar mejor con una analogía.

Cuando compramos alimentos, éstos suelen venir con la lista de ingredientes que fueron usados en su preparación. Esto nos permite saber qué vamos a introducir en nuestro cuerpo, si tiene los nutrientes que necesitamos, si tiene ingredientes malos por nuestra salud, entre otras cosas. Si no sabemos sobre nutrición, podemos investigar en internet (desde fuentes confiables) sobre el tema, o acudir a otras personas ajenas al fabricante para que nos asesoren. Por ejemplo, mucha gente tiene contra-indicaciones médicas que no les permiten ingerir determinados componentes, puede que queramos reducir nuestro consumo de azúcar (es mi caso), o podemos estar siguiendo una dieta estricta.

Volviendo al software, el código fuente de un programa es como una receta que le dice a nuestro computador las instrucciones que debe seguir para ejecutar el programa. Tener el código fuente nos permite acudir a otras personas para saber qué es lo que realmente hace el programa, aunque no sepamos programar. Esto es especialmente importante para encontrar vulnerabilidades de seguridad en nuestro computador, y también para detectar malware introducido a propósito por el desarrollador para dañar al usuario con el fin de seguir sus propios intereses.

Una objeción posible es que por nosotr@s mism@s no podemos auditar todos los programas que ocupamos por lo que dependemos de otr@s informátic@s para poder saber sobre errores y malware, por lo que al depender de alguien más no seríamos libres realmente. Con el software privativo la situación es peor, porque es necesario confiar en el desarrollador pues es el único que tiene el código fuente, y él podría mentir. Por ejemplo, Zoom le mintió a sus usuari@s con que el programa ofrecía cifrado de extremo a extremo. Según la Federal Trade Commission, Zoom ofrecía cifrado P2P de 256 bits cuando en realidad la seguridad del programa era muy inferior (el cifrado usado era de 128 bits) y las claves privadas que sirven para ver el contenido de las comunicaciones se guardaban en los servidores de Zoom, por lo que la empresa podía espiar las conversaciones de l@s usuari@s. Eso no es cifrado de extremo a extremo real.

Sabemos que Zoom mintió en algunas de sus afirmaciones porque el CPO de Zoom reconoció que el programa era incapaz de hacer cifrado de extremo a extremo (traducción mía desde la versión original en inglés sacada del reclamo de la FTC):

“A la luz del reciente interés en nuestras prácticas de cifrado, queremos empezar disculpándonos por la confusión que hemos causado sugiriendo incorrectamente que las reuniones vía Zoom eran capaces de usar cifrado de extremo a extremo. Zoom siempre ha tratado de usar cifrado para proteger el contenido en la mayor cantidad de escenarios posible, y en ese espíritu, usamos el término 'cifrado de extremo a extremo'. Mientras que nunca intentamos engañar a nuestr@s clientes, reconocemos que hay una discrepancia entre la definición aceptada de 'cifrado de extremo a extremo' y cómo lo estábamos utilizando. Este blog busca rectificar esa discrepancia y clarificar exactamente cómo ciframos el contenido que se mueve a través de nuestra red

Desde hace años (al menos desde el 2016) que Zoom promete cifrado de extremo a extremo, pero recién se implementa una versión preliminar de éste a fines del 2020. En el artículo al que se acaba de enlazar admite que antes, las claves privadas pasaban por los servidores de la empresa.

Lamentablemente no podemos asegurarnos de que tod@s l@s desarrolladores de software privativo reconozcan sus mentiras o equivocaciones. Si alguien miente diciendo que encontró malware en un programa libre, o que el programa implementa seguridad que en realidad no tiene, el resto de la comunidad de usuari@s podría desmentirl@. Con el software libre es mucho más fácil encontrar vulnerabilidades de seguridad, lo que los hace más seguros, mientras que es más probable que las vulnerabilidades de seguridad del software privativo pasen desapercibidas. Relacionado con lo anterior tenemos el proyecto FOSSA de la Unión Europea que ofreció recompensas por hallar errores de seguridad en determinados proyectos de software libre. Al parecer el proyecto fue exitoso, pues a inicios del 2021 la Comisión Europea lanzó nuevos Bug Bounties.

A pesar de las muestras de mayor seguridad en el software libre, alguien podría querer que la gente no pueda ver el código de los programas que ejecuta, ya sea por temor a ciber ataques o cualquier otro motivo. Esto se puede solucionar mediante la descarga anónima de programas, así no se sabría el código que el computador de esta persona está ejecutando. Sin embargo, si él o ella comparte que está usando determinado programa y ese programa es libre entonces se conocería parte del código que ejecuta su computador, pero volver privativo al programa no arreglaría totalmente el problema pues el desarrollador sigue teniendo el código fuente.

Libertad 2

Debemos poder ayudar al resto. Gracias a la cooperación tenemos muchas cosas buenas como sociedad. Si usamos un programa útil, éste podría ser útil para otras personas también, por lo que para ayudar a l@s demás deberíamos poder compartir copias de éste. Una licencia de uso que prohíbe esta forma de cooperación es anti-social, y priva al programa del enorme beneficio potencial que tiene.

La práctica de compartir herramientas útiles es muy antigua. En el caso del software esto es mucho más fácil ya que es abundante por naturaleza, producir copias adicionales de éste tiene un coste marginal prácticamente nulo. Es por eso que cualquiera con un computador (la mayoría de celulares también son computadores), memoria suficiente y un medio para compartir información (como internet) puede crear y compartir una copia exacta del programa, lo que hace al software libre mucho más accesible y beneficioso para un mayor número de personas, a diferencia del software privativo que para conseguir una copia sólo se puede acudir al desarrollador.

A pesar de este beneficioso poder de la tecnología informática, la propaganda impulsada por los medios y grandes empresas titulares de la mayoría de obras sujetas al derecho de autor (que es el medio por el que se suelen restringir las libertades del software), ocupan términos como “piratería” y “robo” para criminalizar la práctica de compartir copias de varios tipos de obras, entre ellos el software. Argumentan que compartir una copia entre A y B es robarle al desarrollador C que merece un pago por su trabajo. No obstante, el que A le pase a B una copia de un programa desarrollado por C afecta a B directamente y a C sólo indirectamente, ya que C no pierde su copia original ni pierde dinero, sólo no obtiene el dinero que obtendría si B le hubiera comprado a C, pero decidir no comprar un producto de un distribuidor en vez de otro no es robar. Es distinto a robar algo en una tienda, pues l@s dueñ@s de ésta perderían la posesión que quieren vender. Además, existen otras formas de financiar el desarrollo de software y de darle una vida digna a l@s desarrolladores.

Ahora bien, esto le puede parecer irrelevante a una persona egoísta que no tiene ninguna intención de ayudar a l@s demás. También se puede objetar argumentando que el programa privativo no se puede compartir independiente de si se rechazara su uso, o que el programa en cuestión es gratis y cualquiera lo puede descargar. No obstante, aunque la pérdida de libertad 2 no aparente tener un impacto directo sobre el usuari@, el software privativo hace que éste dependa de los medios de distribución autorizados por el desarrollador. Un ejemplo del perjuicio provocado por esta dependencia es la eliminación de los juegos clásicos de Angry Birds de las grandes tiendas de aplicaciones. Éstos ya no se pueden descargar desde la Play Store ni la App Store, sólo en sitios de APKs de dudosa seguridad. Podemos comprobar esto buscando algún juego clásico como Angry Birds Seasons o Angry Birds Space en alguna de estas tiendas.

Libertad 3

La libertad 3 consiste en distribuir versiones modificadas del programa. Para l@s que no saben programar esta libertad puede parecer inútil, pero es la que nos permite usar versiones modificadas desarrolladas por otras personas.

Al utilizar un programa libre, si algo del programa no nos gusta, no dependemos del desarrollador original para cambiarlo, sino que podemos acudir a cualquier programador para que haga los cambios por nosotros. Si sale demasiado caro, varias personas pueden reunir fondos para la contratación. Existen varios intentos exitosos de levantamiento de fondos para el desarrollo de software libre, y se pueden crear plataformas en la que l@s usuari@s voten por la inclusión de determinadas características en programas libres.

Si no queremos o no podemos invertir dinero o tiempo en participar de una comunidad, de todas formas nos beneficiamos de las libertades del software libre. Muchos programas populares son versiones modificadas de otros. A continuación algunos ejemplos:

  • MATE, una interfaz gráfica, nació como una versión modificada de GNOME 2, una interfaz gráfica que era muy popular. Sin embargo, su nueva versión GNOME 3 tuvo una mala recepción, lo que hizo que un usuario argentino continuara con la base de GNOME 2, creando MATE.

  • LibreOffice es una suite ofimática muy usada que viene en la mayoría de distribuciones de GNU+Linux. Fue creada a partir de OpenOffice, algún tiempo después de que Oracle adquiriera Sun Microsystems, la empresa que más financiaba OpenOffice. Oracle había tenido una actitud hostil hacia muchos proyectos de software libre dirigidos o auspiciados por Sun, así que por preocupación a que algo parecido ocurriese con OpenOffice, much@s desarrolladores se unieron para crear una versión modificada llamada LibreOffice.

  • SuperTuxKart es un juego libre de karts parecido a Mario Kart. Está basado en el antiguo TuxKart, proyecto que terminó abandonado luego de disputas entre los desarrolladores. Con el objeto de arreglar el juego y devolverle algo a la comunidad del software libre, Joerg “Hiker” Henrichs revivió el proyecto. Actualmente el juego está completo (su última versión a la fecha es la 1.3): cuenta con muchos personajes y pistas, tiene varios modos de juegos, y hasta se puede jugar en línea.

Por otra parte, en el software privativo sólo se puede usar la versión escrita por el desarrollador, ya que no se pueden distribuir versiones modificadas. Esto le confiere un poder al desarrollador sobre l@s usuari@s y es usual que abusen de él. Take-Two, la empresa detrás de Rockstar, que desarrolla los juegos de GTA, ordenó la eliminación de varios mods luego de actualizar su política de mods dictando que los no deben añadir nuevo contenido, lo que perjudicó a la comunidad de GTA. Obviamente no tod@s l@s jugadores de GTA desarrollan mods, pero hay muchos que son usuari@s de éstos. Las licencias de software libre no expiran y no ponen restricciones sobre el tipo de cambios que se le pueden hacer al programa, por lo que si los juegos de GTA fuesen libres, Take-Two no habría podido hacer lo que hizo.

El problema no termina ahí. El poder que l@s desarrolladores tiene sobre l@s usuari@s hacen que introduzcan malware sobre los programas y l@s usuari@s no puedan hacer nada al respecto. Si el programa con malware fuese libre podría ser modificado y l@s usuari@s podrían usar la versión modificada sin el malware. Un ejemplo de esto es Firefox con su alto nivel de spyware y una versión modificada llamada LibreWolf, que mejora la privacidad del navegador. Con el software privativo quedaría desarrollar un nuevo programa desde el comienzo, y no puede ser muy parecido al anterior porque violaría las leyes de derecho de autor.

Ahora bien, a pesar de los perjuicios provocados por el software privativo que aquí se exponen, no parece necesario rechazar un programa privativo para usar una versión modificada de un programa libre, y que si se descubre malware en un programa privativo es posible cambiarse a un programa libre sin el malware. Aparte de recordar que el costo de cambiarse de programa puede mayor que el de mudarse a una versión modificada de un programa al que ya nos acostumbramos, las libertades 2 y 3 consisten en derechos a ayudar al resto por lo que el beneficio a nivel individual reside mayormente en su ejercicio por parte de terceros.

Disponibilidad de software

Al leer este artículo, puede que pensemos que el beneficio potencial de un programa de libre redistribución y por tanto accesible a muchas personas se opaque por la disminución de programas disponibles producto de la reducción de programadores debido a que supuestamente la industria del desarrollo de software generaría menos dinero. A esto respondo que el que mucha gente no tenga que pagar para conseguir los programas ya es un beneficio que deriva de la libertad del software, y sumado a lo discutido anteriormente y lo que discutiremos posteriormente, podemos concluir que l@s usuari@s sí hacen uso, aunque indirectamente, de su libertad. Y respecto de la cantidad de programas, gracias a la libertad 3 se pueden crear nuevos programas a partir de los ya existentes, lo que disminuye el costo de desarrollo de estos nuevos programas.

Aún con lo planteado anteriormente pueden haber dudas sobre el perjuicio del software privativo sobre el desarrollo de software. Podríamos hacer un estudio más exhaustivo comparando datos de costos de desarrollo, presupuestos, proporción de código fuente sacado de otros programas, entre otros. No obstante, este estudio debe considerar que el software privativo es mucho más usado en muchas áreas, y sobretodo, que los beneficios a nivel práctico no son tan importantes como la libertad y la cooperación. No obstante, realizar esta investigación haría que este artículo fuese demasiado largo.

Premiar al desarrollador

El uso del software privativo genera otra injusticia: premia al desarrollador con popularidad, dinero, datos personales, etc, instándolo a desarrollar más software privativo que daña la libertad de sus usuari@s y priva al software de sus beneficios potenciales. Si queremos una sociedad digital libre, en la que tengamos las libertades de usar, compartir y mejorar la tecnología informática para lo que queramos, debemos desalentar el desarrollo de tecnología que no nos garantice estas libertades, y fomentar el uso de tecnología que sí lo haga.

Presión social

Para determinar si deberíamos aceptar el uso del software privativo, hay que tener en cuenta que no siempre será fácil elegir. Existen muchos casos en los que estaremos presionados a ceder nuestra libertad de software. Esto sirve como contra-argumento a la idea de que el software privativo es legítimo porque nadie obliga a la gente a usarlo, pero la verdad es que hay veces en que el costo de negarse a usar un programa privativo puede ser demasiado alto.

Muchas páginas requiren ejecutar programas dentro del navegador escritos en JavaScript, programas que suelen ser privativos. Esto incluye archivos subidos a Google Drive o Mega, o sitios de vídeos como YouTube o Netflix. Afortunadamente existen formas de acceder al material sin ejecutar JavaScript privativo, pero no siempre es así.

Usar cierto hardware

Muchos dispositivos, como escáneres, impresoras o tarjetas de Wifi, requieren que se instale software privativo para que puedan funcionar. Existen varios dispositivos que funcionan usando solamente software libre, pero no siempre es el caso, y puede que no podamos o no valga la pena gastar dinero en hardware nuevo, además de que aumentaría nuestro impacto en el medio ambiente.

Comunicación

En la actualidad mucha gente depende de las tecnologías digitales para comunicarse con ciertas personas. Puede que tengamos seres queridos con los que nos comunicamos usando programas como Whatsapp o Zoom y no queremos perder el contacto. Esto es súper comprensible. Si es gente que nos valora, podemos pedirles usar un programa libre para la comunicación, explicando brevemente los motivos por los que rechazamos el software privativo.

Exigencias de la escuela, el trabajo, etc.

También hay ocasiones en las que nos presionan a usar software privativo por parte de nuestro colegio o universidad, empleador(a), banco, etc. Podemos intentar dialogar para evitar el software privativo, pero el dialogo no siempre resultará.

Un caso extremo de esta exigencia en Chile es el proceso de solicitud de permisos para salir de casa en la Comisaría Virtual, dentro de las comunas en fase 1. Para solicitar un permiso era necesario completar un reCaptcha de Google, que no sólo requiere ejecutar software privativo sino que también espía y explota a sus usuari@s. Esto plantea un dilema: no poder salir de casa, salir y arriesgarse a ser detenid@, o ceder libertad.

Entonces, ¿qué hacer?

Anteriormente expusimos que la aceptación de software privativo hace que renunciemos a parte del control de nuestras actividades informáticas, subordinando nuestra máquina a los intereses del desarrollador y quitándonos nuestro derecho a saber qué código ejecuta, derecho que puede ser ejercido directamente o gracias a terceros. El software privativo también prohíbe formas importantes de cooperación como la redistribución de copias, ya sea con o sin cambios. Además, dependiendo del caso estaríamos premiando al desarrollador por restringir a l@s usuari@s.

Por otro lado, rechazar el software privativo puede hacer que no podamos hacer ciertas cosas que normalmente podríamos hacer si es que accediéramos a su uso, y puede costarnos el trabajo o nuestra carrera en el peor de los casos.

Mi respuesta a la interrogante del título de este artículo es que es muy importante preservar y promover la libertad en el mundo digital, que cada vez es más importante en nuestras vidas. Hay que tener claro para qué queremos usar el software privativo. Si existe un programa libre que hace lo que queremos hacer, aunque sea un poco más difícil de usar, no hay motivo para escoger el programa privativo. Podemos escoger el programa libre y donar parte del dinero que nos ahorraríamos al no comprar o rentar una licencia de uso del programa privativo, para contribuir a la mejora del programa.

Si no existe un programa libre con las funcionalidades relevantes del programa privativo que se quiere utilizar, tendríamos que preguntarnos qué tan importante es hacer lo que queremos hacer con el programa privativo y qué efecto tendrá sobre nuestro proyecto de vida. Si es absolutamente necesario ejecutar software privativo para llevarlo a cabo o si fuese demasiado difícil hacerlo sin él, entonces quizá valga la pena sacrificar libertad por algo que puede ser más importante: nuestro propósito de vida.

También nos podemos permitir el uso de software privativo ocasionalmente en el computador de otra persona, porque normalmente no tenemos ni deberíamos tener el control sobre dicho computador.

Por otra parte, nuestras decisiones sobre qué programas usar pueden afectar al resto. En algunos casos usar ciertos programas privativos como Zoom o Whatsapp presionan a otras personas a ceder el control de sus actividades informáticas (porque la “calidad” de estos programas viene principalmente de la gente que los ocupa). Si queremos conversar con alguien o crear un evento por videoconferencia, busquemos hacerlo con un programa libre, o por lo menos aceptar alternativas cuando una de las personas involucradas nos comunique que no quiere usar un programa privativo. Si queremos subir un archivo a internet, no lo hagamos por Google Drive (porque para visualizarlo el navegador descarga y ejecuta software privativo), mejor por una plataforma como NextCloud. Debemos elegir de modo que nadie se vea presionad@ a usar software privativo debido a nuestras decisiones.

Ahora bien, puede que no podamos usar ciertos componentes de hardware sin instalar controladores privativos. Lo ideal sería comprar componentes nuevos que sean compatibles con software libre, pero si no podemos permitirnos gastar dinero en nuevo hardware, podríamos usar los controladores privativos temporalmente hasta que podamos comprar hardware nuevo.

Otro posible impacto del uso de software privativo es la recompensa para el desarrollador, ya sea en forma de dinero, datos, popularidad, etc. Vimos que desarrollar software privativo daña a la comunidad de usuari@s, por lo que no debe ser premiado, y si bien hay muchas injusticias en el mundo eso no significa que debamos aceptar esta. Si vamos a usar software privativo, lo mejor será obtenerlo de segunda mano o de forma gratuita, y usarlo en computadores sin conexión a internet o cerrando el puerto de red que este programa ocupa. Tampoco debemos fomentar su uso.

En resumen, sugiero rechazar el software privativo siempre que sea posible, a menos que sea necesario para un propósito mayor a la libertad de software, como salvar vidas o alcanzar nuestro objetivo en la vida. Y si es necesario usar software privativo, que sea procurando recompensar lo menos posible al desarrollador.

A pesar de todo lo mencionado, existen usuari@s que no quieren ni necesitan usar un programa determinado para un fin que esté prohibido (por la licencia o cualquier otro medio). En otras palabras, “el programa funciona para lo que yo quiero”. Lo único que puedo responder a esto es que la cuestión del software libre es ética y no pragmática. El software libre nace para darle libertad a l@s usuari@s, no para conseguir X ventaja práctica. Si valoramos nuestra libertad, en este caso de usar nuestras herramientas con los fines que queramos, deberíamos estar dispuestos a sacrificar algo por ella, aunque sea un poco.

Aún así, no soy nadie para obligarte a hacer algo que no quieres. Siéntete libre de vivir tu vida como quieras, pero ten en cuenta cómo el software privativo dificulta que hagas eso en el mundo digital, que es parte del mundo real.

Esta es la iniciativa popular de norma relativa al derecho a la privacidad, sobretodo en internet. Pone algo de énfasis en el cifrado de las comunicaciones, para evitar que en nuestro país pase lo que pasó en otros lugares del mundo.

Problema a solucionar

La privacidad es esencial para la protección de la autonomía y dignidad humana, sirviendo como base sobre la cual otros derechos humanos son construidos.

Las tecnologías digitales han transformado favorablemente la forma en la que vivimos, sin embargo una parte importante de estas contiene componentes de vigilancia, los cuales pueden producir abusos por parte del Estado o privados a partir del seguimiento de nuestras preferencias, interacciones y movimientos, como la facilitación de la estafa, la persecución a periodistas o activistas disidentes, e incluso la manipulación de elecciones, socavando nuestra intimidad, dignidad, las libertades de expresión, prensa y asociación, y nuestra democracia.

Dado lo anterior, para garantizar que el desarrollo de la tecnología sea positivo para la población, es preciso consagrar el derecho a la privacidad en la nueva carta fundamental, lo que incluye el derecho a encriptar las comunicaciones por medios electrónicos, de modo que las leyes respeten y protejan la privacidad como un derecho humano.

Situación ideal

Lo ideal es que el Estado garantice la privacidad de sus ciudadanos, de modo que se les permita elegir cómo y con quién compartir sus datos personales, tales como su ubicación, comunicaciones, datos biométricos, preferencias políticas, sociales o religiosas; a menos que sea estrictamente necesario para poder proteger otros derechos fundamentales.

Qué debe contemplar la nueva constitución

La nueva constitución debe tener en cuenta el derecho humano a la privacidad. La ley no debe exigir ni permitir la injerencia arbitraria sobre la vida privada ni la correspondencia de las personas, a menos que sea con el fin de llevar a cabo una investigación judicial. Lo que contempla el derecho a la confidencialidad de las comunicaciones privadas de las personas, y que a día de hoy incluye el derecho al cifrado.

¿Con qué argumentos tú o tu organización respaldan esta propuesta?

La privacidad consiste en decidir si revelar datos personales de forma consensuada y con expectativas sobre el contexto y el alcance de la divulgación.

Parte sustancial de la vida social y política en la actualidad se lleva cabo en internet, donde expresamos nuestras opiniones, conocemos gente y nos manifestamos contra las injusticias. Movimientos sociales enteros comienzan en internet.

El aumento de la vigilancia gracias a internet hace que sea mucho más fácil que se conozca información sensible. La capacidad de identificación, la vinculación de los datos y la extracción de grandes cantidades de información agregada erosionan la capacidad del individuo para gestionar la divulgación, el contexto y el alcance. Que el Estado u otras personas sin consentimiento informado y explícito sepan quién tiene cierta opinión, creencia o gusto, a qué información está accediendo, o su ubicación, propicia una situación de vulnerabilidad en la que la persona puede ser discriminada o acosada. Nadie debe ser obligado a asumir esos riesgos por el solo hecho de acceder a las comunicaciones.

Proteger nuestros datos en internet es importante por las mismas razones que protegemos nuestra privacidad fuera de internet. Usamos llaves y cortinas, cerramos las ventanas, y confiamos nuestra intimidad solo a quienes estimamos apropiado por la percepción de los peligros potenciales que conlleva el no hacerlo. Lamentablemente la vigilancia masiva actual hace que no baste con acción a nivel individual, por lo que necesitamos políticas públicas que garanticen nuestros derechos.

El cifrado de las comunicaciones tiene como objetivo que éstas sólo puedan ser recibidas por las personas que el emisor o emisora quiere que reciban, y permite a la gente expresarse libremente sin temor a ser molestada por terceros.

Durante el año 2018 la ONU adoptó una resolución que reafirma la protección de los derechos humanos y libertades fundamentales en internet de la misma manera que fuera de este, observando la importancia de la privacidad.

Leyes modernas sobre privacidad de los datos ya existen en California, Canadá, Brasil, India y la Unión Europea, las cuales en mayor o menor medida incluyen el derecho a saber qué información ha sido coleccionada, la exclusión en la acumulación y venta de datos, el borrado de datos personales y el derecho al cifrado de las comunicaciones.

Propuesta de articulado

Se propone añadir párrafos como los siguientes en el artículo de derechos fundamentales:

Es deber del Estado la protección del derecho a la privacidad de todos los habitantes, tanto en su domicilio como en la vía pública y espacios virtuales, preservando así la dignidad, intimidad y autonomía de los individuos y colectivos, así como las libertades de consciencia, expresión y asociación. Dicha protección debe contemplar tanto los abusos del Estado como los de organizaciones privadas y particulares.

El Estado es garante de la libertad de expresión y asociación, así como de la privacidad de sus ciudadanos y ciudadanas, para poder ejercerlas sin temor a perjuicio. Por tanto velará por el derecho de todos los ciudadanos y ciudadanas a cifrar sus comunicaciones y que éstas no sean interceptadas por terceros con el fin de revelar su contenido.

Solo si es con fin de proteger otros derechos fundamentales se podrá acceder a la intromisión en la privacidad de los individuos, siempre mediante orden judicial individualizada en los casos que especifique la ley.

Breve reseña sobre quién o quiénes proponen y la historia de la elaboración de la iniciativa

Cabildo del software, la cultura y el conocimiento libre

El cabildo del software, la cultura y conocimiento libre reunió a diversos entusiastas, activistas y organizaciones que cooperan para promover y difundir el software, la cultura y el conocimiento libres en Chile, el cual se autoconvocó el domingo 10 de noviembre de 2019 en torno a varias mesas temáticas.

Históricamente, como organizaciones participantes, hemos realizado múltiples actividades de capacitación, transferencia de conocimientos y eventos cada año, como el FLISoL y el Día del Software Libre en instituciones públicas y privadas.

Consideramos que todos los programas informáticos que ocupamos deben respetar nuestro derecho de usarlos, estudiarlos, modificarlos y compartirlos con quienes queramos, y que en el mundo digital nuestros derechos deben respetarse de igual o mejor forma que en el mundo analógico.

  • Comunidad Nacional de Software Libre y Cultura Libre
  • Tecnocomunes
  • Comunidad Cuatro Libertades Chile
  • Escuela de técnica y cultura hacker

Bibliografía

Vigilancia

Privacidad

Leyes de privacidad de los datos

Hay varias herramientas en línea para hacer esta tarea. Lamentablemente, son SaaS, por lo que no respetan nuestra libertad de ejercer el control sobre nuestra actividad informática. Por tanto, aquí presentaré el uso básico de Pandoc, una programa libre para convertir documentos de un formato a otro. En su página web oficial se listan los formatos soportados, pero aquí nos limitaremos a la conversión de un documento en formato Markdown a PDF.

Instalación

En distribuciones de basadas en Ubuntu (como Trisquel), basta con introducir en la terminal:

sudo apt install pandoc

En distribuciones basadas en Debian pero no en Ubuntu, puede que no funcione el sudo. Por tanto, hay que cambiarse al usuario root primero:

su root

y luego:

apt install pandoc

Con eso Pandoc ya debería estar instalado.

Conversión: de Markdown a PDF

Lo primero que debemos hacer es abrir la terminal en la carpeta en la que se encuentra nuestro documento Markdown. Luego escribimos:

pandoc -f markdown -t latex -o ARCHIVO_DE_SALIDA.pdf ARCHIVO_DE_ENTRADA

Notar que ARCHIVO_DE_ENTRADA es el nombre del archivo que queremos convertir mientras que ARCHIVO_DE_SALIDA es el nombre que queremos para el archivo resultante.

El -f markdown significa que queremos convertir desde Markdown, y el -t latex significa que queremos convertir hacia un archivo LaTeX, que es la forma en la que Pandoc convierte hacia PDF. Es necesario poner .pdf justo después del archivo de salida para que Pandoc convierta a PDF y no a otra cosa, en este caso el código en LaTeX del documento en el que estamos trabajando.

Hace algunos días mi papá nos invitó a mi hermano y a mí a comer helado fuera de casa. Yo me había comprometido a comer menos azúcar refinada por los efectos negativos del azúcar en nuestro organismo, pero acepté porque me tenté por la idea del helado y porque quería pasar algo de tiempo de calidad con mi familia. Fue un error el haber hecho eso. Aquí comparto una pequeña reflexión sobre qué se podría hacer en esta clase de situaciones.

Primero, pienso sobre las motivaciones que tenía mi papá al hacer esa invitación. Intuyo que el objetivo no era comer helado, sino pasar algo de tiempo con nosotros. Si ese es el caso podríamos compartir otro tipo de actividad, como jugar videojuegos (libres), o hacer algunas tareas domésticas juntos. En este caso se cumpliría el objetivo sin tener que comer insalubremente.

No obstante, también puede ser que mi papá haya querido salir a comer helado u otra golosina. En ese caso puede ser mejor ir una heladería donde vendan helado sin azúcar o que este cerca de un lugar en el que vendan comida más saludable. Si no hay, también es posible llevar comida desde la casa o simplemente no comer nada, aunque pueda parecer raro.

Muchas veces es fácil dejarse llevar por la presión social, incluso en casos como este en los que el familiar no tiene malas intenciones. Si queremos conseguir nuestros objetivos hay que dejar de ponerse excusas y encontrar soluciones a los problemas que se nos pongan enfrente, aunque aparentemente no tengan solución, porque muchas veces la tienen.

Les comparto este pequeño script en Python para achicar el tamaño de todos los documentos PDF en una carpeta sin tener que ejecutar manualmente el comando que menciono aquí demasiadas veces. Requiere de Python y Ghostscript, pero probablemente ya los tengas instalados.

#!/bin/bash/python3
import os
for file in os.listdir():
    if file.endswith('.pdf'):
            os.system("gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -sOutputFile={}.pdf {}".format(file[0 : -4] + '_light', file))
            os.system("rm {}".format(file))

Observar que el script borra el archivo original y deja a los nuevos con el sufijo _light.pdf

El programa lo hice rápido así que hay varias mejoras que se le pueden hacer, como achicar a todos los PDFs de los subdirectorios de la carpeta, achicar otra clase de documentos, poder especificar la carpeta en la que se quiere operar desde la línea de comandos, añadir una funcionalidad para descargar documentos y achicarlos de manera local, entre otras.

En el marco de la redacción de una nueva constitución para nuestro país, se abrió la posibilidad de presentar propuestas ciudadanas a l@s convencionales para ser agregadas en la potencial próxima carta fundamental (potencial porque aún falta el plebiscito de salida), además de la opción de hacer un lobby tradicional para hablar directamente con algun@s. Es por eso que en la comunidad cuatrolibertades nos hemos propuesto redactar algunos artículos sobre la cultura libre y el software libre para presentarlos en la convención constitucional. En este artículo ahondaremos en las consideraciones necesarias para proponer esta clase de contenido en la nueva constitución, los principios que la fundamentan, las propuestas de artículos y finalmente una breve discusión sobre cómo hacer llegar las propuestas a la convención.

Notar que aquí me limitaré a propuestas directamente relacionadas con el software y la cultura, pues el artículo sería demasiado extenso en caso de abordar otros derechos fundamentales en el mundo digital, aunque éstos sean temas muy importantes también.

Algunas consideraciones

¿Qué se coloca en la constitución?

La constitución es la ley más importante del país. Es la que establece, entre otras cosas, nuestros principios como sociedad, los derechos fundamentales que debe respetar y promover el estado, la organización político administrativa del país y algunas instituciones importantes. En este texto no se detallan sobre la aplicación de nuestros principios ni la protección de nuestros derechos, pues esos detalles son asuntos de las leyes y no de la constitución. Además, el colocar demasiados detalles en la constitución podría hacer que fuesen difíciles de corregir en caso de que tengan errores.

Por lo tanto, lo que debemos aspirar a colocar en la nueva carta fundamental son los valores y derechos cuya protección en nuestra sociedad actual y futura dependen de la libertad de software, de la cultura libre, y/o del acceso abierto. Por ejemplo, no debemos sugerir un artículo tipo “Todos deben ocupar únicamente software libre de aquí al 2025” sino tipo “El estado debe tener como objetivo el aseguramiento y el incremento de su autonomía tecnológica. Una ley detallará los protocolos y las normas que el estado debe seguir para alcanzar dicho objetivo”.

Aceptación entre l@s polític@s

No obstante, hay que considerar la posibilidad de que nuestr@s supuest@s representantes no estén de acuerdo con nuestras propuestas. Mucha gente en el mundo de la informática y parte del público general creen que el movimiento del software libre es extremista y que l@s desarrolladores tienen derecho a privar de la libertad a sus usari@s, si es que ést@s están dispuest@s a ceder. También hay que recordar que en el pasado, hubieron intentos fallidos de introducir el software libre en la legislación, de los que escribiré más abajo.

Entonces, los artículos que propongamos para la nueva constitución deben ser cosas que parezcan obvias y presentadas de una forma que parezca que todo el mundo está de acuerdo. También podemos estudiar un poco los programas políticos de l@s convencionales elect@s para apelar a sus valores y planes para la constitución.

Tratados internacionales

Pero también es posible que incluso si logramos convencer a l@s convencionales, nuestra propuesta no se pueda plasmar. La ley 21.200, nacida después del famoso “Acuerdo por la paz”, contiene varias normas que regulan el proceso constituyente. Al final del artículo 135, dicha ley señala que la nueva constitución debe respetar todos los tratados internacionales actualmente vigentes y ratificados por Chile. Para efectos de la cultura libre, Chile está suscrito al Convenio de Berna que establece que la duración del “derecho de autor” no puede ser inferior a cincuenta años después de la muerte del titular, ademas de otorgar al autor o autora de la obra el “derecho” a autorizar la distribución y modificación de la misma. El TPP11, en caso de aprobarse en el Senado (lo que puede ocurrir pues JAK está a favor de esta unión, por lo que podría darle urgencia al proyecto si es que gana las elecciones), también limitaría considerablemente el contenido sobre la materia.

Principios y valores detrás de la cultura libre

Como escribí anteriormente, podemos proponer algo concreto pero que no cubra detalles sobre los temas que queremos introducir, pues los detalles son asuntos de leyes y reglamentos. A continuación algunas creencias y principios qué fundamentan la cultura libre y el software libre que pueden ser plasmadas en una constitución.

Soberanía informática

El estado debe tener el control de las actividades informáticas críticas para cumplir sus deberes con el pueblo. Ceder el control al software privativo, haciendo que el desarrollador de éste sea quien decida por el estado de acuerdo con sus propios intereses qué se puede hacer con el programa y quien puede arreglarlo (entre otros aspectos), implica renunciar a parte de la soberanía nacional (en este caso parte de la infraestructura del estado) a favor de intereses privados, que constituye una falta de probidad.

¿Neutralidad tecnológica?

Los detractores de políticas para reemplazar el software privativo por software libre en la administración pública aluden al principio de neutralidad tecnológica, que sostiene la no discriminación arbitraria entre distintas tecnologías por parte de las organizaciones públicas, que deben escoger la mejor técnicamente.

El error de aplicar este principio para oponerse a la migración al software libre es obviar el hecho de que el software libre es una tecnología superior ética y socialmente por varias razones, entre las cuales se encuentra lo expuesto arriba. Además, ¿debería el estado ser neutral en cuanto a las libertades individuales y colectivas, y a la soberanía nacional?

Puede interesarte este reportaje, donde se cuenta sobre el lobby de Microsoft en contra de un proyecto de ley promotor del reemplazar el software privativo por software libre en las instituciones del estado.

Libertades colectivas

Existen cosas que deberíamos poder hacer pero para llevarlas a cabo necesitamos ayuda de otras personas. En el caso del software libre, la mayoría de la gente no sabe programar, por lo que no ejercería directamente las libertades 1 y 3 del software libre en caso de tenerlas. Sin embargo, tienen la libertad de cooperar con otr@s que sí sepan programar para poder hacer los cambios que deseen a los programas que ocupan. Además, muchos programas libres populares son versiones modificadas de otros, y tod@s l@s usari@s, sepan programar o no, salen beneficiad@s. Por tanto, las libertades del software libre, en la práctica, deben ejercerse de forma colectiva.

La libertad no es una mercancía

Un argumento en defensa del software privativo es que su uso es voluntario y las restricciones sobre éste son legítimas mientras sean informadas oportunamente. Esto parte del supuesto de que la libertad de software es algo que podemos y deberíamos poder intercambiar “a voluntad” como una mercancía (algo como “cede parte de tu libertad de software y te daré una copia de mi programa”). La nueva constitución debe indicar que es deber del estado proteger a las personas de contratos abusivos, aunque su suscripción sea voluntaria.

Concepción alternativa de la propiedad intelectual

Actualmente se considera que las obras cubiertas por el derecho de autor son y deben ser propiedad del autor, y éste debe determinar quién copia o modifica una copia de su obra, producto de una analogía simplona entre los bienes intangibles y los productos materiales. Sin embargo, en los movimientos del software y la cultura libre tienen concepciones distintas a la presentada sobre la producción de obras con valor intangible.

Por una parte, en el movimiento del software libre se considera que es el usuario o usuaria de la copia del programa es quien debe decidir con quién compartir su copia o qué modificaciones hacerle, y que el desarrollador del programa no merece ejercer un poder injusto sobre l@s usari@s.

Por otra parte, el movimiento de cultura libre sostiene que la propiedad sobre las obras artísticas y científicas implica un control sobre la creatividad y el acceso a la cultura, haciendo que sólo los que puedan cumplir con las exigencias de la empresa editorial (quien es la que tiene los “derechos” sobre las obras en la práctica) puedan acceder a obras culturales e impidiendo la creatividad a partir de obras ya existentes como ha sido una tradición desde hace siglos, por lo que el derecho de autor no debe abusarse para controlar la creatividad.

De lo anterior extraemos que la propiedad intelectual debe tener como fines el reconocimiento de la autoría de las obras y el avance científico, artístico y tecnológico, y la ley debe proteger las obras sólo cuando la protección a establecer tiende a dichos fines. Éstos son parecidos a los mencionados en la Constitución de Estados Unidos.

Acceso al conocimiento

Considerando que tod@s tenemos derecho a la educación, a la información y a gozar del progreso científico y tecnológico, y que la transmisión de conocimientos es un pilar fundamental de la educación, el estado debe garantizar dichos derechos mediante, entre otras formas, el libre acceso al conocimiento. El que los nuevos informes y divulgaciones de avance científico y tecnológico tengan un propietario que generalmente impone un muro de pago dificulta el acceso a estos avances.

Ahora bien, la masividad de la propiedad y muros de pago detrás de las creaciones no tangibles haría que tuviésemos menos acceso a la cultura en caso de que se aplicara una ley que obligue a todas las obras a ser libres, pues simplemente podrían no llegar al país. No obstante, un buen comienzo es que las obras normalmente cubiertas por la propiedad intelectual en nuestro país deban ser liberadas (libre acceso, distribución y modificación) en caso de ser financiadas con dinero público.

Propuestas concretas para la Nueva Constitución

Después de considerar lo expuesto anteriormente y sobretodo después de entender lo que motiva la filosofía del software libre y la de la cultura libre, a continuación dejo mis propuestas para la nueva constitución. Están clasificadas por las categorías del sitio oficial de iniciativas ciudadanas.

El lector o lectora tiene que tener en cuenta que no soy ni abogado, ni profesor de derecho, ni técnico jurídico. Para este contexto soy un ciudadano de a pie que tiene buenas intenciones y ha investigado para contribuir a la nueva carta fundamental de nuestro país, por lo que sugiero no confiar ciegamente en lo que expondré a continuación:

Derechos fundamentales

Toda persona tiene derecho a la libertad, pero también hay que proteger a la población de los contratos abusivos. En el artículo de derechos fundamentales propongo añadir un párrafo como el que sigue:

Toda persona merece protección por parte del Estado contra contratos que atenten contra sus derechos humanos fundamentales, incluso si la persona puede elegir libremente si firmar dichos contratos

Sobre el acceso al conocimiento:

Todas las creaciones artísticas y científicas financiadas total o parcialmente por el Estado deben ser de libre acceso y distribución con o sin cambios, para todos los habitantes del territorio.

Un miembro de 4lib propuso un articulo que encontré muy bueno, respecto del derecho a la vida privada y las libertades de expresión y asociación:

El estado es garante de la libertad de expresión y asociación, así como de la privacidad de sus ciudadanos para poder ejercerlas sin temor a perjuicio, por tanto velará por el derecho al cifrado de las comunicaciones de todos los ciudadanos, en especial entre quienes ejercen posiciones que requieren de privacidad, como en el caso de periodistas, abogados y activistas de causas sociales.

Además de lo anterior, yo tenía una propuesta respecto del derecho de autor, pero dadas las imposiciones del Convenio de Berna no serviría de mucho. De todos modos aquí la presento:

Toda persona tiene el derecho a la protección por parte del Estado de los intereses morales que le correspondan por las obras artísticas y científicas de las que sea autora.

Con el único propósito de promover el progreso científico, tecnológico y artístico, el Estado puede otorgar a los autores de obras científicas y literarias el derecho a la protección de los intereses patrimoniales que les correspondan, solamente contra la explotación comercial de dichas obras. Dicha protección de los intereses patrimoniales debe tener una duración inferior a X años después de la fecha de publicación original, o en su defecto la duración mínima establecida por los tratados internacionales ratificados por Chile y que se encuentren vigentes. (X puede ser cualquier num. de años, no especifiqué porque no estoy seguro de la duración ideal).

Manos a la obra

En el conversatorio, la conductora presentó dos formas distintas de hacer llegar una propuesta a la convención:

La primera consiste en dialogar directamente con algun@s convencionales mediante la Ley de Lobby. Las ventajas que se me ocurren es que nuestr@ representante podrá responder las dudas de l@s polític@s y no habrá necesidad de conseguir las 15.000 firmas, pero puede que nos pidan que creemos la norma constitucional, ya sea porque es el medio que se estableció para esta clase de propuesta o porque quieren ver que la propuesta tiene apoyo popular.

Por otra parte, podemos presentar una norma constitucional mediante el portal establecido por la convención. Esto permitiría mostrar la iniciativa a más gente y probar que es aceptada por una parte importante de la ciudadanía en caso de conseguir más de 15.000 firmas, lo que hará que estén obligad@s a discutir el tema. Personalmente me encantaría escuchar la discusión sobre nuestras propuestas acerca del software y la cultura libre.

Sumado a lo anterior, podemos aliarnos con iniciativas u organizaciones afines, como Derechos Digitales.

Si noto que este artículo tiene más popularidad que el promedio escribiré una segunda parte con los avances de la comunidad en este proyecto.

Actualmente existe una gran cantidad de software libre de alta calidad. No obstante, sigue habiendo gente que cree que no es posible vivir desarrollando software libre y que es necesario privar a l@s usuari@s de su libertad para financiar el desarrollo de los programas. Afortunadamente, esto no es verdad, y en este artículo detallaré cómo se financian algunos proyectos de software libre.

Trisquel

Trisquel es una distribucion 100% libre de GNU+Linux basada en Ubuntu y que es muy fácil de usar. La última versión consiguió más de diez mil descargas en un mes, y es la que uso actualmente y con la que estoy escribiendo este artículo.

El proyecto Trisquel se sostiene exclusivamente mediante donaciones por parte de sus usuari@s, pero también existen organizaciones que donan parte de su dinero al proyecto. Por ejemplo, Technoethical, una tienda de laptops con Trisquel pre-instalado, dona una parte de sus ganancias a Trisquel. El año 2018, el proyecto Handshake, que busca desarrollar una alternativa al sistema centralizado de certificados de seguridad de los dominios de internet, donó 100.000 dólares sin compromiso alguno. Además, Zazzle, una tienda de regalos, vende artículos relacionados con Trisquel (como poleras y tazones) y también dona una parte de las ganancias de estos productos.

El dinero obtenido permite mantener a dos desarrolladores a tiempo completo, uno es el desarrollador principal y otro es el webmaster. También hay desarrolladores voluntarios que podemos encontrar en la página de desarrollo (de Gitlab) del proyecto.

Fuentes

  • Sitio oficial de Trisquel
  • Correspondencia personal con Rubén Rodriguez, líder del proyecto

LibreOffice

LibreOffice es la suite ofimática libre más popular, y según AlternativeTo, la principal alternativa a Microsoft Office. Está basada en OpenOffice.org, que fue abandonada hace años, y reemplaza a la mayoría de programas de Office.

LibreOffice está respaldada por una enorme comunidad de desarrolladores y organizaciones, y auspiciada por la Document Foundation, organización no gubernamental alemana dedicada a LibreOffice y formatos libres. Según el último reporte anual de la fundación, el del año 2020, recibió más de un millón de euros en ingresos, provenientes principalmente de donaciones vía PayPal y tarjeta de crédito, además de comisiones por parte de organizaciones socias de consejo asesor. El dinero obtenido se gasta en pagarle a emplead@s y freelanceers, mantener la infraestructura, organizar eventos comunitarios o de difusión, financiamiento del desarrollo de formatos libres que LibreOffice ocupa, entre otros.

Pero no todo es cuestión de dinero. La Document Foundation tiene miles de miembr@s con distintos motivos para participar. En el blog de LibreOffice podemos leer sobre vari@s de ell@s. Por ejemplo, José Gatica es un desarrollador front-end y músico chileno que se dedica a migrar computadores desde MS Office a LibreOffice en Chile, y se interesó por la fundación porque lo necesitaba para sus contribuciones en ParrotSec, una distribución de GNU+Linux centrada en Pentesters y hackers étic@s.

Otro caso interesante es el de Bayram Çiçek, recién egresado de la carrera de ciencias de la computación. En el artículo cuenta que empezó a contribuir al desarrollo de software libre por un ramo en la universidad, y escogió LibreOffice en particular porque lo usaba desde hace años y quería ser más que un simple usuario. En el Google Summer of Code, iniciativa de Google para animar a estudiantes de pregrado a contribuir con código a proyectos de software libre, encontró que contribuir al proyecto era tanto divertido como desafiante, por lo que decidió volverse miembro de la Document Foundation.

Fuentes

SuperTuxKart

SuperTuxKart (STK) es un videojuego libre de carreras de go karts, parecido a Mario Kart, pero con toques únicos que lo hace especial. Está basado en TuxKart, y el 2019 fue lanzada la versión 1.0. Cuenta con decenas de pistas y corredores, algunos campeonatos, varios modos de juegos, logros y hasta juego en línea.

El proyecto se financia exclusivamente mediante donaciones de l@s jugadores. Según su política de donaciones, el dinero se usa principalmente para pagar el alojamiento de los sitios web y el alquiler del dominio, y ocasionalmente se compra hardware relacionado con el producto y se contrata a gente para que realice algunas tareas específicas. Algo que puede llamar la atención es que no se hace mención a salarios para l@s desarrolladores.

Como es probable que a l@s desarrolladores no se les pague directamente por el trabajo en el proyecto, es legítimo preguntarse cual es su motivación para contribuir por tantos años a STK. L@s principales desarrolladores a cargo son Auria y samuncle (fuente), y en la fuente aparecen decenas de personas que han cooperado de alguna forma. El primer desarrollador afirma en una entrevista realizada por la Fundación de Software Libre que la comunidad hacía tantos aportes que l@s desarrlladores principales implementaron un servidor dedicado para los aportes, dónde l@s jugadores los pudieran descargar fácilmente.

Respondiendo a la inquietud anterior, en esta entrevista realizada el año 2012 se le preguntó a l@s cuatro desarrolladores principales del momento sobre sus motivaciones para involucrarse en el desarrollo del juego. Auria y samuncle querían ayudar a mejorar los gráficos y la primera señala más tarde que le gusta programar y le gustan los juegos de go karts, y el segundo que es divertido jugar un juego al que contribuyes. Joerg Henrichs (aka Hiker) empezó el proyecto en base al código de una versión mejorada del TuxKart original como una forma de devolver a la comunidad de software libre lo que ésta le había ayudado.

Fuentes

Conclusiones

Existen distintas motivaciones para escribir software libre, aparte de una retribución económica. En este artículo examinamos solo algunas, pero existen miles de desarrolladores de software libre y la naturaleza humana es muy diversa, por lo que pueden haber múltiples causas para realizar actividades similares. En las partes siguientes expondré otros proyectos de software libre con distintos modelos de negocio, y estudiaremos brevemente la motivación inicial detrás de estos y como es que salen adelante en la actualidad.

Esta vez no haré un resumen del eununciado porque ya es muy corto y asumo que sabes inglés si pretendes resolver problemas en CSES. También es necesario conocer lo básico de análisis de complejidad de algoritmos, la STL de C++, y el Segment Tree.

Importante: Los índices de los vectores y otras estructuras de datos están en base $0$.

Solución ingenua

Para cada rango, se itera sobre cada uno de los otros y se comprueba si el otro rango contiene al primer rango o viceversa. Como hay $n$ rangos, por cada rango habrá que iterar sobre otros $n-1$ rangos, por lo que la complejidad temporal de esta solución es de $O(n^2)$.

Para comprobar que la solución no es lo suficientemente eficiente hay que considerar que $n$ puede ser hasta $2 \times 10^5$ y en ese caso nuestro programa debe hacer al menos $n^2 = 4 \times 10^10$ iteraciones, lo que es demasiado para que un procesador común y corriente no se demore más que el tiempo límite. Por tanto, habrá que buscar una solución más eficiente.

Pongamos orden

Probemos a ordenar los rangos de menor a mayor valor del límite izquierdo y luego el límite derecho de cada rango (es decir, si dos rangos tienen el mismo límite izquierdo, entonces el que tiene menor límite derecho va primero). Es una técnica muy común para resolver problemas de este tipo. Gracias a ordenar los datos de entrada, sabemos que al iterar por la lista ordenada de rangos, ninguno de los rangos por lo que ya hayamos iterado estará contenido dentro del rango de la iteración actual (llamémoslo rango $i$, porque está en el índice $i$ del vector ordenado).

Para ejemplificar lo anterior, usemos el caso de prueba de ejemplo pero ordenado:

1 6 2 4 3 6 4 8

Cuando se procese el rango (3, 6), es claro que los rangos (1, 6) y (2, 4) no estarán contenidos en éste.

Entonces, la idea de la solución es iterar por cada uno de los rangos (ahora ordenados) y para cada uno calcular tanto el número de rangos que contiene y el número de rangos que lo contienen.

Ahora sería tentador pensar que para cada rango basta con una búsqueda binaria que nos diga cuántos rangos empiezan entre el $x$ y el $y$ del rango $i$. Pero es mucho más complicado pues varios de esos rangos pueden terminar después del $y$. Por eso necesitamos una solución más ingeniosa.

Inclusión-Exclusión

El problema puede hacerse mucho más sencillo si a $n$, el número total de rangos, le restamos el número de rangos no contenidos por el rango $i$, es decir, que empiezan antes del $x$ o terminan después del $y$, que a su vez es lo mismo que:

  1. el número de rangos que empiezan antes del $x$, más
  2. el número de rangos que terminan después del $y$, menos
  3. el número de rangos que empiezan antes del $x$ y después del $y$.

Lo anterior es una aplicación del Principio de Inclusión-Exclusión, que dados dos conjuntos $A$ y $B$, se tiene que $|A \cup B| = |A| + |B| – |A \cap B|$. En este caso $A$ es el conjunto de los rangos que empiezan antes del $x$ y $B$ es el conjunto de los rangos que terminan después del $y$.

A continuación veremos cómo calcular cada uno de los tres números.

Calculemos el 1ero

Gracias al ordenamiento hecho al principio, ya casi tenemos el número de rangos que empiezan antes del $x$. El problema es que hay rangos ya procesados que empiezan justo en $x$. Una forma de solucionar este problema es guardar un entero $j$ con el primer índice tal que el rango correspondiente a dicho índice en el vector ordenado empiece en $x$. Así el número de rangos que empiezan antes del $x$ del rango $i$ es $j+1$.

Calculemos el 2do

Después de leer la entrada, creamos otro vector que contenga los límites de los rangos pero de forma invertida, el $y$ como primer elemento y el $x$ como el segundo. También hay que ordenar este vector comparando sus elementos de la misma forma que con el vector original, de modo que cuando procesemos el rango $i$ del vector original ordenado para calcular la respuesta, hagamos una búsqueda binaria por este nuevo vector para calcular el 2do número buscado, que es igual a $n$ menos la posición retornada por lower_bound al colocar un rango que comienza con $y+1$.

Calculemos el 3ero

¿Recuerdas que todos los elementos antes del $j$-ésimo empiezan antes que el rango $i$? Podemos aprovechar esa peculiaridad para tener un conteo de los límites derechos que llevamos hasta el momento.

Una idea aparentemente útil consiste en crear un vector que sirva como histograma tal que en el índice $k$ del vector indique cuántos rangos procesados antes que el $i$-ésimo terminan con $k$. Al procesar un rango, el 3er número buscado es la suma de todos los elementos del vector desde el índice $y+1$ hasta el $10^9$, y luego de procesar el rango se actualiza el vector con el $y$ del rango.

Lamentablemente, el intento de solución anterior tiene dos problemas: por cada rango habría que iterar por aproximadamente $10^9$ elementos en el peor caso, y hay que mantener un vector de $10^9$ elementos, que consumiría más de 1GB de memoria. Un Segment Tree de sumas arreglaría el problema de las iteraciones para sumar los elementos, pero aún así el vector a crear sería gigantesco debido al rango de valores necesario. Pero aún hay esperanza, pues aunque el rango al que pertenecen los límites de los rangos es enorme, no hay más de $2 \times 2 \times 10^5 = 4 \times 10^5$ números distintos en la entrada, lo que nos permite usar una técnica llamada compresión de coordenadas.

Compresión de coordenadas

La compresión de coordenadas consiste en asignar un número distinto a cada número de la entrada para que el rango al que pertenecen los números a manejar sea más reducido. Como hay a lo más $4 \times 10^5$ números que describen los rangos, entonces ese será el límite de los números que usaremos en el Segment Tree, y no $10^9$.

La idea es que el orden relativo de los números se mantenga. Por ejemplo, no queremos asignarle un $2$ a un $100$ y al mismo tiempo asignarle un $5$ a un $40$. Para esto hay varias formas de implementar la compresión de coordenadas, pero yo presentaré una distinta a la del otro blog.

Creamos un set al que le insertamos los valores de los rangos a medida que se ingresan por la entrada, un map que contenga las asociaciones de números, y un contador con el número de elementos distintos que llevamos. Después iteramos por cada elemento del set, primero aumentamos el contador en $1$ y luego actualizamos el map asociando el elemento a procesar del set con el contador. Finalmente se modifican los vectores con los rangos (tanto el original como el que tiene los rangos invertidos) reemplazando cada número por el que tiene asociado en el map.

El proceso anterior se realiza antes de ordenar los vectores, para no gastar tiempo de más.

Ahora la cantidad de memoria consumida por la solución será muchísimo menor a lo que se tenía pensado originalmente. Un problema que parecía imposible se solucionó con un truco sencillo ;)

Aún falta algo

Nos falta calcular el número de rangos que contienen al rango $i$, para cada $i$ entre $0$ y $n-1$. La forma de hacerlo es parecida a la del 3er valor pero con algunas diferencias. Hay que considerar los rangos que empiezan con el mismo $x$ que el rango $i$ pero que tienen un $y$ superior. Además, la consulta al Segment Tree debe ser ligeramente distinta. La implementación de la solución descrita aquí queda como ejercicio para el lector o la lectora.

En el sub-mundo de la programación competitiva, lo más habitual es que las soluciones de l@s participantes a los problemas de un concurso se envíen a un juez en línea para que éste determine si la solución es correcta o no. Estos jueces también son muy usados para practicar resolviendo problemas de competencias anteriores, y es una de las herramientas principales empleadas en el entrenamiento de l@s aficionad@s.

Un tipo particular de concursos de programación es la Olimpíada de Informática, dónde el formato de las competencias tiene varias diferencias con otras clases de concursos (como la ICPC, Codeforces, etc). El principal sistema usado para gestionar estas Olimpíadas es el Contest Management System (CMS, no confundir con Content Management System), diseñado para soportar el formato de Olimpíada. Con el objetivo de desarrollar un juez local que el/la usuari@ pueda usar para entrenar sin depender de un servidor, he estado estudiando el código fuente de la última versión estable de CMS. En este artículo mostraré un vistazo general al funcionamiento de la función de evaluación del mismo, y en las otras partes profundizaré en otros aspectos relevantes para el desarrollo de un juez local.

Para que puedas entender el contenido del artículo, espero que sepas programación en Python (incluyendo creación y uso de módulos, programación orientada a objetos en un nivel intermedio) y conceptos básicos de sistemas de bases de datos.

Generalidades: ¿Cómo rayos funciona CMS?

Lo primero a tener en cuenta es que CMS no es únicamente un juez, es un sistema muy complejo para gestionar Olimpíadas de Informática. Entre otras funcionalidades, permite gestionar cuentas, pedir y dar aclaraciones sobre los enunciados de los problemas, generar una tabla de puntuación, ejecutar pruebas personalizadas, configurar concursos y meta datos de los problemas, mandar archivos para imprimir. Por eso es que CMS está organizado de forma modular, de modo que los módulos (en el código fuente y en la documentación oficial le llaman servicios) puedan ejecutarse en distintos servidores y de de forma distribuida.

A pesar de que CMS tenga un diseño modular, para el desarrollo de un juez local evitaré el uso de los servicios que se encuentran en el directorio cms/service y todo lo que tenga que ver con gestión de servidores, incluyendo cms/io y cms/server.

Toda la información relacionada a una competencia se guarda en una base de datos PostgreSQL, un sistema de gestión de base de datos relacional con características de un sistema orientado a objetos. Todos los servicios de CMS dependen de esta base de datos, lo que tiene sentido pues así no es necesario que cada módulo maneje sus propios datos de manera separada.

Respecto de los lenguajes de programación y tecnologías empleadas, el backend de CMS está principalmente escrito en Python y hace uso de SQLAlchemy, un conjunto de herramientas para manejar bases de datos y asociar clases a las relaciones de la base de datos (dichas clases están definidas en el código de CMS). SQLAlchemy también crea objetos en Python para trabajar con los tipos de datos de PostgreSQL.

Los archivos que importan

Los principales archivos que se usan para juzgar una solución enviada al sistema están en la carpeta cms/grading. A continuación una breve descripción del contenido de la carpeta:

-init.py: Instrucciones que se ejecutan al importar grading como módulo (de Python, no los servicios de CMS). Establece qué clases y funciones se pueden usar para el usuario del módulo.

-language.py: Contiene dos clases base para el manejo de los lenguajes soportados por CMS, que definen propiedades y métodos abstractos que las clases específicas para cada lenguaje implementan.

-languages: Directorio con los archivos para cada lenguaje soportado, dónde están las clases que implementan las propiedades y métodos abstractos definidos en language.py

-languagemanager.py: Algunas funcionalidades para trabajar con las clases de los lenguajes de programación presentes en languages.

-scoring.py: Varias funciones para computar el puntaje obtenido por un(a) participante en un problema, con distintos métodos que han sido usados en la IOI.

-scoretypes: Directorio con clases para distintas formas de asignar una puntuación a una solución. En la documentación oficial (en inglés) se detalla cómo es que funcionan.

-steps: Los archivos de este directorio contienen las clases y funciones que efectúan las distintas fases de evaluación de una solución: la compilación, la evaluación (ejecución frente a casos de prueba, una evaluación corresponde a un caso distinto), comparación con la salida “correcta” (es con la que cuenta el juez, pero no necesariamente es correcta, pues el autor (o autora) de la solución oficial también puede cometer errores), generación de mensajes para el/la participante.

-Job.py: Un Job es una unidad básica de trabajo realizada por un Worker, que es el servicio que se dedica a procesar los envíos. Para prescindir de los servicios voy a remover las funciones que dependan de algún servicio. La clase Job tiene métodos para crear trabajos de compilación y evaluación a partir de un envío.

-tasktypes: Directorio con los distintos tipos de problemas. En la documentación oficial (en inglés) se detallan sus características distintivas. Aquí se definen los métodos para compilar y evaluar una solución a partir de un trabajo (Job) de compilación y evaluación, respectivamente.

-Sandbox.py: Pequeña máquina virtual dónde se ejecutan las soluciones en un entorno aislado del sistema operativo para evitar que la solución haga uso de una función prohibida (por ejemplo, conectarse a internet o manipular ficheros).

Conclusiones

Muchas de las clases dentro de la carpeta tienen funcionalidades para trabajar con los servicios de CMS. Para un juez local, lo más sencillo sería recortar dichas funciones para facilitar el desarrollo. Afortunadamente no son demasiadas y al parecer es razonable hacer recortes y conservar el funcionamiento básico de las clases y funciones. También voy a estudiar conceptos de bases de datos, además del uso de SQLAlchemy y PostgreSQL, porque el código de cms/grading si hace uso de la base de datos, y es necesaria para muchas funciones importantes, como la creación de trabajos y la compilación y evaluación de soluciones.

En un próximo post resumiré el modelo de datos y qué partes son las más importantes para juzgar una solución.

Nota: Por defecto, los intervalos de números que aparecen en este artículo son cerrados.

Este problema apareció en uno de los concursos abiertos que organiza la Olimpíada Informática de Croacia. Escogí hacer un pequeño tutorial de este problema porque para hallar la solución se requiere hacer uso de la misma propiedad de las sumas necesaria para demostrar nuestra solución a Two Sets.

Resumen del enunciado

Dadas $N \leq 1000000$ columnas de alturas $1$, $2$, \ldots, $N$, hay que formar un histograma con ellas tal que la cantidad máxima de agua que se puede verter dentro sin que el agua rebalse del histograma (es decir, su capacidad) sea exactamente $X \leq 10^{15}$.

Por ejemplo, si $N = 3$, tenemos las columnas de altura $1$, $2$ y $3$ y el histograma “$2$ $1$ $3$” tiene una capacidad de $1$.

¿Es posible crear el histograma?

Dado un histograma, si agarramos un sub-histograma cualquiera, se crea una especie de pozo de agua entre las dos columnas más altas (si no me crees, mira la imagen de arriba). Entonces el histograma con el pozo más grande que podemos hacer tiene las columnas de alturas $N$ y $N-1$ en los bordes y el resto en medio. Su capacidad es exactamente $(N-1)-1 + (N-1)-2 + \ldots + (N-1)–(N-2) = 1 + 2 + \ldots + (N-2) = \frac{(N-2)(N-1)}{2}$. Por lo tanto, si $X$ excede dicho valor, la respuesta es $-1$ porque no podemos crear un histograma con capacidad $X$ con las $N$ columnas que tenemos.

¿Y si $X \leq \frac{(N-2)(N-1)}{2}$?

En ese caso sí podemos construir el histograma muy fácilmente. Hay que crear un pozo con las columnas de alturas $N$ y $N-1$ en los bordes, y en medio las columnas que vamos a usar para conseguir una capacidad de $X$. Las que no ocupemos pueden ir en el borde izquierdo en orden ascendente para que no creen ningún pozo.

¿Qué columnas irán dentro del pozo?

Si elegimos una columna de altura $h$, la capacidad del pozo aumentará en $(N-1)-h$. Como la altura mínima de las columnas restantes es $1$ (que aumenta la capacidad en $N-2$) y la máxima es $N-2$ (que aumenta la capacidad en $1$), y además existe exactamente una columna disponible para cada altura entre $1$ y $N-2$, tenemos que elegir un subconjunto de ${1, \ldots, N-2}$ tales que la suma de sus elementos sea igual que $X$.

El subconjunto a elegir siempre existe pues para cualquier $M \in \mathbb{N}$ y $S \leq \frac{M(M+1)}{2}$ (fracción que corresponde a la suma de todos los números naturales desde el $1$ hasta el $M$), siempre existe un subconjunto de ${1, \ldots, M}$ tal que la suma de sus elementos sea $S$. En el tutorial de Two Sets demuestro una propiedad muy parecida.

Dado lo anterior, podemos declarar una variable $S$ y asignarle el valor $0$, variable que nos servirá para saber cuánta capacidad llevamos. Iteramos con $k$ desde $N-2$ hasta $1$ (inclusive). Si $S + k \leq X$ significa que debemos añadir la columna de altura $(N-1)-k$ al pozo, y en caso contrario debemos colocarla fuera. Una vez terminadas todas las iteraciones, se imprimen en orden ascendente las columnas no ocupadas para almacenar agua (las que llamamos “del pozo”), la de altura $N-1$ (o $N$), las columnas que sí ocupamos para hacer que la capacidad del histograma sea $X$, y finalmente la columna de altura $N$ (o $N-1$).

¿Me darías más detalles?

Si ocupamos un vector de booleanos (en C++) para indicar si una columna debe ser del pozo o debe quedarse al margen, la complejidad tanto espacial como temporal de la solución es de $O(N)$, suficiente para los límites de tiempo y memoria RAM del problema.

No me gusta dar detalles sobre la implementación a pesar de tener el código de la solución que podría publicar, porque considero que el lector o lectora objetivo ya domina las bases de la programación en cierto lenguaje y debe ser capaz de diseñar una implementación de las soluciones por su cuenta.