Amassando ideas

Aquí publico un comentario de una cita que escribí para una asignatura en la Universidad. Defiende la idea de que las necesidades en el ser humano no son necesariamente ilimitadas y que el deseo de maximizar las propias riquezas no es hegemónico en todas las culturas.

Cita a comentar

“Deberá dependerse siempre del principio de acción cuya influencia sea la más poderosa, constante, uniforme, permanente y más generalizada entre la humanidad. Ese principio es el interés personal [egoísmo o maximización]; el sistema de economía que se construya sobre cualquier otra base, se edifica sobre una base falsa” Jeremy Bentham, filósofo utilitarista La psicología del hombre económico

Introducción

La cita a comentar fue escrita por Jeremy Bentham, un filósofo importante en la formulación del utilitarismo, corriente filosófica cuyo principio fundamental es que la medida del bien y del mal es la máxima felicidad del máximo número de personas (Cortina, 1994, p. 29-30). Desde esta perspectiva, en la cita se plantea que los sistemas económicos deben basarse en el interés personal de quienes lo componen, es decir, suponer que todas las personas buscan maximizar su propia felicidad sin tomar en cuenta la del prójimo (Bentham, 1786). No obstante, es legítimo preguntarse si el interés personal es el motor principal de la conducta humana en todas las culturas. En el presente comentario se intentará dar respuesta a la problemática anterior, explorando las necesidades humanas, la moral imperante en algunas sociedades que existieron en el pasado, y las causas y consecuencias de la ayuda mutua y cómo éstas están relacionadas con el altruismo y con el propio bienestar.

Desarrollo

En primer lugar, los seres humanos estamos programados por naturaleza para buscar nuestra propia supervivencia. En la Pirámide de Maslow, el primer peldaño está reservado para las necesidades relacionadas con la supervivencia, tales como la alimentación y el sueño (Maslow, 1943). Claramente la satisfacción de dichas necesidades contribuyen al propio bienestar personal del individuo, pero no son ilimitadas ya que existe un máximo nivel en el que éstas pueden satisfacerse. Por ejemplo, uno no puede comer ilimitadamente, sólo hasta la saciedad, y tampoco es necesario ingerir una cantidad infinita de alimento para vivir. De hecho, en su tratado sobre la política, Aristóteles asevera que los recursos necesarios para vivir “parecen constituir la verdadera riqueza, pues la propiedad de esta índole que basta para vivir no es ilimitada” (Aristóteles, Siglo IV a. C).

Por otra parte, la subsistencia no es la única necesidad del ser humano. Recordemos que las personas, en general, también necesitan recibir afecto, atención, respeto, y tener una sensación de libertad y seguridad (Maslow, 1943). Según los aristotélicos, “Los hombres tienden necesariamente a la felicidad” (Cortina, 1994, p. 29). Lo anterior podría hacernos pensar que Sin embargo, la felicidad, entendida como el estado de mayor satisfacción física y espiritual, y a la vez el fin último del ser humano, no se consigue con las riquezas naturales (que según San Tomás de Aquino, son las necesarias para vivir, “para subsanar las debilidades de la naturaleza”), pues “se las busca en orden a otra cosa; para sustentar la naturaleza del hombre y, por eso, no pueden ser el fin último del hombre, sino que se ordenan a él como a su fin.” (de Aquino, Siglo XIII), ni tampoco con riquezas artificiales, como el dinero, porque este tipo de riquezas se creó como un medio para conseguir riquezas naturales mediante el intercambio, tal como explica Aristóteles en el primer libro de su tratado sobre Política: cuando se dependió más del exterior para importar lo necesario y exportar lo que se tenía en abundancia, la necesidad hizo que se ideara la utilización del dinero por no ser fáciles de transportar todos los productos naturalmente necesarios. Por eso convinieron en dar y recibir recíprocamente en sus cambios algo que, siendo útil en sí mismo, fuera además de fácil manejo para la vida, como el hierro, la plata o algo semejante. (Aristóteles, Siglo IV a.C.)

Además, la satisfacción de ciertas necesidades como el afecto y el respeto, deben cumplirse de manera recíproca entre dos personas, por lo que su satisfacción requiere de un comportamiento no egoísta, pues se debe tener en consideración el bienestar del prójimo. De este modo, el ser humano no necesita maximizar sus riquezas ni ser completamente egoísta para alcanzar la felicidad.

Sumado a lo anterior, el comportamiento humano está sujeto a las expectativas culturales del entorno, y en distintas sociedades se han creado mecanismos, ya sea de manera consciente o inconsciente, para ayudar al prójimo y otros para evitar una excesiva acumulación de riqueza. A continuación estudiaremos algunos ejemplos de estos mecanismos en sociedades antiguas y medievales.

Un ejemplo de estos pueblos es el judío, cuyos integrantes no actúan basándose en el interés personal, o al menos no principalmente, sino de la voluntad y las normas marcadas por su dios, Yahvé. Por ejemplo, en el Deuteronomio se le impera a los fieles apartar la décima parte de su cosecha anual cada tres años para que el levita, los extranjeros, los huérfanos y las viudas que viven en su ciudad puedan alimentarse. También les ordena perdonar las deudas de sus deudores en el año sabático, es decir, cada siete años, y el párrafo siguiente apela a los fieles a ser caritativo y ayudar a los pobres: “Si hay junto a ti algún pobre de entre tus hermanos, en alguna de las ciudades de tu tierra que Yahvé tu Dios te va a dar, no endurezcas tu corazón ni cierres tu mano a tu hermano pobre; antes bien, le abrirás tu mano y le prestarás lo que necesite para remediar lo que le falta.”. A pesar de lo anterior, un contra-argumento en defensa del principio del egoísmo podría ser que los fieles no actúan de forma caritativa como un fin en si mismo, sino como un medio para conseguir la bendición de Yahvé, bendición que se menciona en el mismo libro. No obstante, ello no es a costa del prójimo sino que en su auyda.

En las ciudades medievales en Europa imperaba una jurisdicción propia y una organización autónoma dentro de las mismas, y ésta tenía en consideración el bienestar general de su población. Por ejemplo, todos los productos de primera necesidad debían llegar al mercado de la ciudad para que todos los habitantes pudieran abastecerse antes de que un comerciante pudiera adquirir los productos que sobraban, “y aún así su ganancia tenía que ser nada más una «ganancia honesta»” (Kropotkin, 1902). Sobre la Grecia Arcaica, Finley comenta que En el comercio o en cualquiera otra relación, había que acogerse al principio de igualdad y beneficio mutuo. La ganancia a expensas de otro pertenecía a un terreno diferente, al de la guerra y de la incursión, donde se obtenía por realización (o amenaza) de proezas, no por manipulaciones y regateos. (Finley, 1954)

Las normas mencionadas anteriormente no están basadas en la maximización, sino en el bien común y una limitación razonable de las ganancias que un comerciante podía obtener, o bien en el principio de beneficio mutuo en el caso de la Grecia Antigua, donde el lucro a expensas de otro griego iba contra la moral de dicha sociedad.

No obstante, el concepto de maximización no estaba ausente en la totalidad de civilizaciones antiguas. Aristóteles escribió sobre dos tipos de crematística: una natural, cuyo fin era “el vivir bien”, y otra antinatural, cuya finalidad era maximizar las riquezas como un fin en sí mismo. Sobre la antinatural, el filósofo comenta: “aquella crematística es comercial y productiva de dinero, no en general, sino mediante el cambio. Esta crematística comercial parece tener por objeto el dinero, ya que el dinero es el elemento y el término del cambio, y la riqueza resultante de esta crematística es ilimitada. (…) Por un lado, pues, resulta claro que toda riqueza debe tener un límite, pero de hecho vemos [18] que ocurre lo contrario, pues todos los que trafican aumentan su caudal indefinidamente.” (Aristóteles, Siglo IV a.C.). Este tipo de crematística surgió años después del período estudiado por Finley en “El mundo de Odiseo”, pero de todas formas el filósofo griego mantiene una actitud crítica respecto de ella y de quienes la practican.

Conclusiones

El ser humano busca satisfacer sus necesidades, pero la cantidad de recursos necesarios para dicho fin no es infinita, por lo que no es siempre necesario adquirir la máxima cantidad de dichos bienes. Además, varias de las sociedades históricas que estudiamos han confeccionado y aplicado un sistema de normas que fomenta la cooperación, incluso entre individuos que no forman parte del mismo núcleo familiar. Y aunque de todas formas existían personas que buscaban maximizar sus riquezas, constituían sólo una fracción de su respectiva sociedad y eran mal vistas por ésta. Lo anterior nos permite concluir que el deseo de maximizar bienes que proporcionan placer o felicidad no es universal en todos los seres humanos, ni en todas las culturas. No obstante, las personas que componen los sistemas estudiados se benefician de dichos sistemas, por lo que el presente comentario no demuestra que el interés en uno mismo o una misma no es un universal cultural. Una reflexión en profundidad sobre la última problemática mencionada, desde un punto de vista antropológico, podría involucrar el estudio de sociedades cuyos individuos sean ajenos a sí mismos, en caso de que existan.

Bibliografía

Aristóteles (Siglo IV a.C.) POLÍTICA: La economía: propiedad y crematística

Bentham, J. (1786) La psicología del hombre económico

Cortina, A. (1994) Ética de la empresa: claves para una nueva cultura empresarial. Trotta, Madrid

Tomás de Aquino (Siglo XIII) Suma Teológica

Finley, M. (1954) El mundo de Odiseo

Kropotkin, P. (1902). Capítulo 5: Ayuda mutua en la ciudad medieval. En La ayuda mutua

En el mundo de la programación competitiva, es muy común practicar resolviendo problemas de concursos anteriores en un juez en línea al que se le envía el código fuente de la solución para que éste entregue el veredicto. Pero a pesar de que esta sea la forma de entrenar a la que estamos acostumbrad@s, y considerando esencial para la libertad el que podamos controlar las herramientas que ocupamos, es sensato preguntarse si los jueces en línea como los conocemos implican la renuncia por parte de l@s usuari@s al control de sus actividades informáticas por constituir un servicio que aparentemente podría ser fácilmente reemplazado por un programa libre en nuestro computador. En este artículo responderé a la interrogante ponderando cómo se beneficia y cómo se perjudica el usuari@ por el uso de un juez en línea en lugar de un juez local.

Conceptos previos

Para poder ejercer el control efectivo sobre nuestras actividades informáticas, es necesario que los programas que usamos vengan con al menos cuatro libertades:

  1. La libertad de ejecutar el programa para cualquier propósito
  2. La libertad de estudiar el código fuente del programa y modificarlo
  3. La libertad de distribuir copias exactas del programa
  4. La libertad de distribuir versiones modificadas del programa

Los programas que cumplen con las cuatro libertades se conocen como software libre. En artículos anteriores expuse sobre el tema y expliqué cómo afectan a las libertades de l@s usuari@s. Cuando una de las libertades es insuficiente, es una injusticia porque se le priva al usuari@ de una libertad que merece. Los programas sin las cuatro libertades se conocen como software privativo.

Otra forma de hacer que la gente ceda el control de sus actividades informáticas consiste en los servicios que sustituyen al software, servicios que consisten en programas que se ejecutan en el computador del proveedor del servicio cuando perfectamente l@s usuari@s podrían tener una copia de un programa libre que hiciese la misma tarea. En este caso l@s usuari@s dependen del proveedor del servicio para realizar la actividad, y sólo pueden hacerla de la forma en que el proveedor quiera. El proveedor también puede abusar de su poder para espiar a l@s usuari@s.

Al grano

En primer lugar, hay que dejar claro que los jueces en línea son servicios, por lo que debemos determinar si reemplazan un potencial programa libre que corra en el computador del usuari@. Para que un juez local pudiera hacer su trabajo, debería contar con los casos de prueba y scripts de evaluación de cada problema. Esta información debe ser sacada de internet (es posible generar los casos de prueba localmente, pero en ese caso el generador tendría que ser descargado de internet de todas formas). El caso es distinto al de un traductor o un editor de imágenes, en el que el usuari@ debe proveer todos los datos de entrada. Además, en los concursos es necesario estar conectad@ a internet para que nuestras soluciones puedan ser auditadas y así poder evitar y detectar a la gente que hace trampa.

Además de lo anterior, la delegación de la actividad de juzgar a un servicio puede parecer que reporta ciertas ventajas prácticas, aunque después explicaremos cómo se pueden incorporar en un potencial juez local:

  • Se puede acceder desde cualquier computador, pues basta con conectarse al servidor del juez en línea
  • Puede tardar menos tiempo en juzgar, dependiendo del poder de procesamiento de nuestro computador
  • Menos tiempo en descargar datos del problema, porque la mayoría están en el juez
  • Participar en la elaboración de estadísticas y en ciertos concursos, como el Coder del mes de OmegaUp (aunque esto no es necesariamente bueno)
  • Almacenar las soluciones y sus veredictos en un servidor remoto.

Por otra parte, el hecho de que los jueces en línea sean servicios genera cierta dependencia que se podría evitar con un juez local:

  • Es necesario que los servidores estén funcionando para poder resolver el problema, pues no todos los jueces tienen todos los problemas.
  • No siempre se puede saber como funciona, y en los casos en los que sí no se puede cambiar el funcionamiento del programa.
  • El proveedor del servicio puede espiar los hábitos de entrenamiento y las soluciones de l@s usuari@s, y a veces esos datos son visibles para todo el mundo. Esto es así porque l@s usuari@s están obligad@s a compartir cierta información que quizá no quieren compartir para poder resolver ciertos problemas, pues es poco práctico crear una cuenta distinta para cada solución que se desee enviar.

Reemplazar los jueces en línea por un juez local traería más independencia a l@s usuari@s, que podrían modificar el juez para tener ventajas prácticas respecto de los jueces en línea, tales como:

  • Nuevos lenguajes de programación
  • Menor tiempo en juzgar, al evitar las colas de subidas de soluciones
  • Tiempo límite diferenciado para lenguajes de programación más lentos, como Python
  • Mayor variedad en la naturaleza de los problemas de programación competitiva, en vez de únicamente problemas algorítmicos.

¿La solución?

Lo ideal sería dejar los jueces en línea sólo para los concursos porque requieren que l@s participantes estén conectad@s a internet, y para las otras cosas tener un juez local extensible que se ejecutara en la máquina del o la participante, que incorporara las ventajas prácticas de los jueces en línea a la vez que garantizara la independencia de l@s usuari@s. En particular, tendría las siguientes características:

Repositorios

Podrían crearse repositorios con conjuntos de problemas para que sean descargados por el juez local. La gente podría crear y subir problemas fácilmente con herramientas que automaticen parcialmente el proceso.

Descarga de problemas

El juez tendría facilidades para visualizar y descargar conjuntos de problemas desde repositorios destinados a ello. Los problemas vendrían en un formato especial para que el juez los detectara y procesara fácilmente.

Descarga rápida de casos de prueba

Al abrir un problema se descargaría primero el enunciado y el resto se descargaría mientras el usuari@ esté leyéndolo. El juez tendría la opción de eliminar los datos a petición del usuari@.

Estadísticas

El juez contaría con un generador y visor de estadísticas sobre los problemas resueltos y el rendimiento del usuari@. También podría recomendar problemas a resolver en base a estas estadísticas.

Sincronización con NextCloud

El juez contaría con la opción de enviar los códigos fuente de las soluciones de manera cifrada a un servidor con NextCloud (que es como Google Drive o Dropbox), para ser consultados y publicados según las necesidades de l@s usuari@s. Después de juzgar el problema, l@s usuari@s podrían decidir si quieren enviarlo o no.

Complementos

Actualmente existen servicios web y programas que sirven de suplemento para los jueces en línea más populares como Codeforces, que aportan funcionalidades como recomendaciones personalizadas de problemas a resolver. Lo ideal es que el juez sea fácil de extender con funcionalidades parecidas a la de estos servicios y programas.

Conclusiones

La mayor parte de las funciones de los jueces en línea podrían realizarse de forma local, pero aún así pueden existir algunas que no, por lo que los jueces en línea no son enteramente SaaSS (sería completamente SaaSS si, por ejemplo, el usuario o usuaria tuviese que enviar los checkers y los casos de prueba para los problemas que quisiera resolver, pero solamente se debe enviar el código de la solución). No obstante, un juez local otorgaría a l@s usuari@s un mayor control sobre las evaluaciones y sobre sus datos personales, aunque también es posible que los jueces permitan juzgar soluciones de manera anónima, sin registrarse.

Por tanto, los jueces en línea deberían tener la opción de descargar los enunciados, casos de prueba y soluciones de los problemas en un buen formato para poder entrenar de forma local, y al mismo tiempo habría que desarrollar un juez local extensible fácil y cómodo de usar, de modo que l@s usuari@s que no quieran ceder sus datos sobre su entrenamiento a un servicio o bien deseen usar sus propias herramientas en lugar de un juez online no sufran desventajas al no poder resolver ciertos problemas. Así se mejoraría la comunidad de programación competitiva.

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.