Amassando ideas

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.

Resumen del enunciado

Dado un entero $n$ entre $1$ y $10^6$, determinar si es posible partir el conjunto ${1, 2, \ldots, n}$ en dos tal que la suma de los elementos de cada parte sea la misma, y si es posible, imprimir los conjuntos.

No todo es posible

La suma de todos los elementos es $1 + 2 + \ldots + n = \sum_{i=1}^n = \frac{n(n+1)}{2}$ (click aquí si no me crees), por lo que los elementos de cada una de las dos partes deben sumar $\frac{n(n+1)}{4}$. Para eso podemos calcular $n(n+1)$ y verificar si es múltiplo de $4$. Si no lo es imprimimos “NO” y detenemos el programa. En caso contrario imprimimos “YES” y seguimos con la generación de los conjuntos.

¡Acumula lo que puedas!

La estrategia consiste en mantener un contador $S$ inicializándolo en $0$ y recorrer con un bucle todos los enteros desde el $n$ hasta el $1$. En cada iteración, verificamos si $S$ más el índice $k$ supera $\frac{n(n+1)}{4}$, la mitad de la suma total de los elementos. Si no lo hace, entonces añadimos $k$ a $S$ y agregamos $k$ a uno de los conjuntos. En caso contrario, lo agregamos a la otra.

Notar que con este método $S$ nunca supera la suma deseada, porque sólo se suma en $k$ cuando $S+k$ es menor o igual que dicha suma. ¿Pero es posible que $S$ sea menor que $\frac{n(n+1)}{4}$ después de ejecutar el bucle?

Para demostrar que $S$ siempre será igual que $\frac{n(n+1)}{4}$, observemos que siempre existe una iteración con el índice $k$ tal que $S + k$ sea mayor que $\frac{n(n+1)}{4}$, porque si no fuese así podríamos sumar todos los números a $S$ y $S$ terminaría siendo igual que $\frac{n(n+1)}{2}$ que claramente es mayor que $\frac{n(n+1)}{4}$. En dicha iteración, se tiene que $k > \frac{n(n+1)}{4} – S$, por lo que existe un número $l \in [0,k)$ tal que $S + l = \frac{n(n+1)}{4}$.

¿Por qué no al revés?

Imagina el caso $n = 7$. La suma total es de $\frac{n(n+1)}{2} = 28$ por lo que recorrer los números desde el menor haría que $S = 6$ después de $3$ iteraciones y por tanto $\frac{n(n+1)}{4} – S = 8$, lo que no es posible porque $n = 7$ y entre $4$ y $7$ no existen dos enteros distintos tales que su suma sea menor o igual que $8$. Después de $4$ iteraciones $S = 10$ por lo que $\frac{n(n+1)}{4} – S = 4$ y todos los números que podríamos sumarle a $S$ son mayores que $4$.