votocr.org

01-24-2016

Para las elecciones presidenciales de 2010, el Tribunal Supremo de Elecciones tenía un servicio en línea donde uno podía consultar el lugar en el que uno estaba inscrito para votar. El Tribunal lo actualizó para las elecciones del 2014 y las de este año. El sitio sirve su cometido, pues proporciona la dirección del centro de votación y la mesa en la que uno vota, además un mapa para facilitarle a uno encontrar el recinto.

El único problema que tiene es que en el 2010 colapsó bajo la carga de las consultas del día de las elecciones. Seis años atrás parece un planeta completamente diferente: los celulares inteligentes no eran cosa de todos los días ni de todas partes, y las conexiones de Internet eran más lentas que las de hoy en día. Y aún así, el sitio tuvo problemas. Para las elecciones del 2014 parece que le echaron plata al asunto, pues se comportó mejor.

Por otro lado, el Tribunal ha venido publicando, si uno sabe dónde buscar, desde hace muchos años, información parcial del padrón electoral. Específicamente publica la totalidad de entradas en el padrón, indicando número de cédula, nombre y la junta receptora de votos donde debe emitir el voto cada persona. Es posible que si se le pregunta, el TSE responda que esa es la totalidad de la información que constituye el padrón.

¿Qué falta entonces? En principio el TSE publica suficiente información como para uno poder recrear el sitio web de consultas. Por ahí de mediados del 2013 me entró la curiosidad de ver si efectivamente era posible hacer tal cosa. Esta no era mi primera experiencia con estos datos, por lo tanto ya me conocía bastante bien el formato que ellos prefieren utilizar para los mismos, y ya sé que es lo que ha cambiado y que no conforme han pasado los años.

¿Se puede replicar el sitio de consultas?

La respuesta corta es no, a menos que uno sea muy obstinado.

El TSE publica esto: nombre y apellidos de la persona; cédula, con su fecha de vencimiento; “código electoral” donde la persona está registrada y la junta receptora de votos donde debe votar. Adicionalmente publica los códigos que usa para identificar la provincia, cantón, distrito administrativo y distrito electoral. También publica listados de las juntas receptoras de votos y los centros de votación que han sido ratificados, con una correspondencia entre juntas y centros de votación.

Lo que el TSE no publica, que sí aparece en el sitio web de consultas, es la dirección del centro de votación y la ubicación geográfica del mismo. Tampoco publica un identificador para el centro de votación y el “número de elector” que aparece cuando uno realiza la consulta. Más importante, el padrón y la información sobre los centros de votación no se publican ni simultáneamente ni en los mismos formatos.

Parte del motivo para lo anterior es que el TSE no piensa como uno. El TSE piensa como un abogado: el padrón electoral es el conjunto de personas que votarán en la elección, y se publica varios meses antes de la misma. Las asignaciones de persona a junta son estáticas, es decir, entre el momento que se publica el padrón y la elección no cambian. Para cada elección el TSE decide cuánta gente asignar a cada junta, y los números son muy similares a lo largo del país. Para esta elección la enorme mayoría de juntas tienen 700 electores (casi 1900 juntas) y en las que mayor cantidad hay, hay 900 electores. ¿Cómo deciden eso? Ni idea, el TSE no lo dice. Seguramente hay alguna resolución en alguna parte, pero si es así, no lo sé.

La asignación de juntas a centros no ocurre sino hasta meses después de publicado el padrón electoral. No estoy seguro qué tiene que ocurrir primero, pero esa información no aparece sino hasta un par de meses después del padrón como tal. Luego viene la confirmación de los centros, que pasa más bien cerca de la fecha de las elecciones. Por ejemplo, en el 2014, muchos centros de votación no fueron confirmados sino hasta un par de días antes de la elección.

Estas dos cosas (la asignación de juntas a centros y la confirmación de los centros) el TSE las publica en su sitio web, en una parte diferente a donde publica el padrón electoral. En el pasado esa publicación se ha hecho como un PDF y una hoja de cálculo de Excel. Este año inicialmente publicaron dos archivos XLSX, y luego de una actualización uno de ellos mutó a XLS. A petición mía, volvieron a publicar el XLSX (más sobre el por qué la petición luego).

Si uno ignora el detalle de las direcciones y ubicaciones de los centros de votación, el sitio web es replicable.

Creando una base de datos

Luego de escarbar y buscar y reclamar, me convencí de que algo es mejor que nada y me puse a construir la base de datos con la información disponible. A pesar de que no es demasiado compleja, la forma en la que se publican los datos hace que procesar los múltiples archivos requiera más código del estrictamente necesario.

El padrón de este año incluye a más de tres millones de personas y require casi 400 MB de almacenamiento cuando se descomprimen los archivos. El TSE publica una serie de archivos ZIP, cada uno con tres archivos: el padrón propiamente, la lista de todos los distritos electorales del país y un archivo explicando el formato de los otros dos archivos, que exceptuando por un par de detalles, es bastante evidente.

En el padrón propiamente solo se indica un código para el “distrito electoral” de cada persona. En el otro archivo aparece la correspondencia entre eso y el nombre de la provincia, el cantón y el distrito electoral. Por ejemplo, el código 101001 corresponde a “San José, Central, Hospital”. Una vez que uno ve suficientes de éstas cosas, se da cuenta que el formato del código es PCCDDD, donde P es la provincia, CC es el cantón y DDD es el distrito.

Un hecho curioso es que el TSE no provee en el padrón una correspondencia entre el “distrito administrativo” y el “distrito electoral”. Hay 2068 distritos electorales para 481 distritos administrativos. El distrito administrativo que más tiene, San Isidro del General, tiene 27 distritos electorales. Si uno examina con cuidado, se da cuenta que el “distrito electoral” casi corresponde a un centro de votación, pero esto es algo que no se encuentra documentado en ninguna parte del sitio web del TSE. El “casi” se debe a que un puñado de distritos electorales tienen más de un centro de votación. Por ejemplo, el distrito de Rincón Grande tiene dos: las escuelas de Rincón Grande y Lomas del Río. Entre estos dos hay 29 juntas receptoras de votos para 20097 personas.

Como indiqué antes, el TSE publica una relación entre juntas receptoras de votos y los centros de votación (el lugar físico donde está la junta). Específicamente lo que dice es “este centro de votación incluye todas estas juntas”. También publica la relación entre centros de votación y distritos administrativos. De aquí es posible derivar para cada persona su provincia, cantón y distritos en los cuales está inscrito.

Para poder ensamblar todo esto y crear una sola base de datos es necesario procesar un archivo ZIP, para extraer el archivo TXT con columnas de ancho fijo. Además es necesario procesar un archivo XLSX, donde la presentación visual es más importante que la información, y cuyo formato ha sido históricamente cualquier cosa menos fijo. Dado que para hacer esto no voy a ponerme a cortar y pegar más de cinco mil datos, en algún momento hice una serie de programas capaces de realizar esa tarea. Si uno tiene una conexión de Internet y algo de paciencia, de inicio a fin todo el proceso requiere menos de media hora. De todos ellos, el más frágil es el que procesa los archivos XLSX. Este proceso es incidentalmente también la razón por la cual solicité que usaran XLSX: hay múltiples implementaciones abiertas que leen (y escriben) ese formato. Para estar claros, el formato tiene múltiples problemas y es redundante, pero si el TSE insiste en publicar datos en formatos que no son complemtanete abiertos, es mucho más fácil implementar un lector para este que para la otra cosa que Excel produce (XLS).

Completando la base de datos

Honestamente llegando aquí todavía no estaba contento. En principio decirle a alguien “usted vota en la Escuela Pilar Jiménez” debería ser suficiente, pero sería realmente agradable poder decirle “y la dirección es esta”. Examinando el servidor del TSE, me di cuenta que hay algo medio parecido a un API que trabaja sobre JSON. Obviamente este API no está documentado, y está sujeto a cambiar en cualquier momento, pero es suficiente para poder conseguir los datos que faltan.

¿Cómo lograr eso? El API require que uno provea un número de cédula y retorna el nombre de la persona junto con toda la información del sitio de votación, incluyendo la dirección del centro de votación y el URL de Google Maps. No parece tener ningún otro punto de entrada. Se puede usar por ejemplo así:

curl -s \
	'http://www.consulta.tse.go.cr/DondeVotarM/prRemoto.aspx/ObtenerDondeVotar' \
	-H 'Content-Type: application/json; charset=UTF-8' \
	--data-binary '{"numeroCedula":"000000000"}'

La solución al problema de obtener los datos faltantes es relativamente fácil: para cada centro de votación, seleccione una junta de ese centro, y en esa junta, seleccione una persona que vote allí; haga la consulta para esa persona con su número de cédula. El servidor responde con toda la información requerida. Haga esto un par de miles de veces y está listo.

Asumiendo que no hará lo anterior a mano, acá aparece otro problema adicional: a pesar de que el servidor en realidad no pone límites a las consultas que se pueden hacer, en primer lugar es increíblemente lento, y en segundo lugar es increíblemente frágil. El par de miles de consultas que es necesario realizar se pueden completar, teóricamente, en un par de segundos. En la práctica lo que sucede es que el servidor después de un par de segundos comienza a retornar errores (de esos que quieren decir “me estoy muriendo por dentro”).

La consecuencia práctica de esto es que el programa que hace esto tiene que ser extremadamente cuidadoso en no producirle dolor de estómago al servidor. A ese servidor que, en teoría, debería ser capaz de contestar más de tres millones de consultas en menos de 12 horas, que equivalen a aproximadamente 100 consultas por segundo en promedio, y muchas más en el pico de la actividad. Lo triste es que aún siendo extremadamente cuidadoso, ocasionalmente el servidor reporta errores, errores de los feos. Al final de todo esto, lo que debería poder correr en menos de veinte segundos, toma sus buenos diez minutos en ejecutarse.

Si esto parece poca cosa, el comportamiento del servidor también es bastante errático: hay días en los que nada le incomoda, uno puede hacer todas las consultas que quiera, responde como 500 peticiones por segundo sin mayor cosa (sí, lo he probado), y todo funciona perfecto. Hay otros días en los que es imposible: produce “errores internos”, responde lentamente, etc.

Y sí, yo estoy consciente que otro, en mi lugar, hubiese escrito la carta al TSE solicitando copia de la información requerida, hubiese ido al TSE a dejarla, hubiese esperado la semana que hay que esperar, y hubiese ido otra vez al TSE a retirar los datos. Eso no solo me parece troglodita, sino también impensable, especialmente tomando en cuenta que estamos hablando de algo que cabe en un disquette de los años 80, y sobra espacio.

Ahora sí, votocr.org

Habiendo hecho todo eso, tenía una copia de la base de datos del TSE en mi disco duro. ¿Ahora qué?

Podría decir que el deber cívico y la democracia y todo eso, pero la verdad es otra…

Por ahí de enero de 2014, con la perspectiva de que Johnny Araya pudiese quedar presidente y teniendo claro que eso era más probable mientras menos gente fuese a votar, decidí tratar de proveer un mecanismo para que, quién quisiera, no tuviese que depender de la disponibilidad del sitio web del TSE.

Registré el dominio y me puse a montar la página web que permitiera hacer las consultas. Desde el inicio el objetivo era claro: tener una interface sencilla de usar, que respondiera tan rápidamente como sea posible.

Con lo anterior en mente, la página de inicio contiene lo mínimo necesario para que esto funcione: una caja de búsqueda y un espacio para poner los resultados. Con en fin de hacer que esto sea útil para gente ayudando a otra gente a encontrar su mesa de votación, al ingresar a la página lo único que hay que hacer es digitar el número de cédula y presionar enter.

A pesar de que las indicaciones dicen que se deben ingresar los nueve dígitos de la cédula, eso no es cierto. Antes de enviar la petición al servidor, del lado del navegador se intenta transformar el texto digitado por el usuario en algo que parezca una cédula. Por ejemplo, muchas personas todavía piensan en su cédula como “algo guión algo gión algo”. Puede intentar ingresar eso, se dará cuenta que funciona. Lo mismo es cierto para los ceros que la gente nunca dice: en lugar de 100230456 la gente dice algo como “uno, cero veintitrés, cuatrocientos cincuenta y seis”. Dentro de lo razonable, eso también funciona.

También importante, estamos en el 2016, la gente usa estas cosas desde un teléfono celular, no desde un escritorio. Las páginas web ya no se pueden dar el lujo de no ser usables en un dispositivo móvil. Cuando se utiliza una pantalla pequeña, el sitio que monté trata de eliminar todas las cosas superfluas:

votocr.org y el TSE

Recientemente el TSE decidió implementar algo inspirado en un CAPTCHA, quizás con la finalidad de evitar algo como lo que yo describía antes, donde un programa viene y baja la totalidad de los datos. En primer lugar, no sé por qué, los datos que el sitio web presenta son públicos. En segundo lugar, es posible obtenerlos de la página web del TSE, como expliqué antes (y en ese sentido lo que el TSE debería hacer es llenar los huecos que tiene la información que presentan, no tratar de implementar mecanismos para evitar que sea descargada). Pero más importante que todo esto, lo que el TSE hizo hace que el sitio web sea bastante difícil de usar, que va en contra de la intención de tener un sitio web de este tipo en primer lugar.

Por detrás, el sitio web es bastante simple. Es una aplicación escrita en Go en menos de 250 líneas de código, en la que la mayoría están dedicadas a sacar los datos de una base de datos. ¿Por qué Go y no otra cosa más tradicional en este espacio? Porque, nuevamente, en esta aplicación importa la velocidad, la estabilidad y la escalabilidad. La base de datos no es nada complejo, pues la tarea que este sitio hace tampoco es compleja: SQLite. La razón para usar una base de datos relacional para algo que desde el punto de vista práctico no lo es, es porque tengo otros programas y usos en los cuales la naturaleza relacional no solo tiene sentido sino que es importante.

Contrario al del TSE, el sitio web corre en máquinas hospedadas fuera de Costa Rica. Para la operación básica esta cosa no necesita nada más complicado que una máquina de US$5 al mes de Digital Ocean. El sitio nunca lo saco de servicio en el tiempo que no hay elecciones. Cuando hay elecciones lo único que hago es agregar un par más de servidores operando bajo el mismo nombre de forma que se distribuyan la carga entre ellos. De ser necesario, el servicio puede correr en máquinas más grandes, pues el código escala automáticamente en esa dirección.

Y también contrario al del TSE, a partir de este año, el sitio web solo sirve información por medio de conexiones encriptadas, gracias a la existencia del proyecto Let’s Encrypt de Linux Foundation. ¿Por qué es importante esto? Porque su voto es su voto, y ni a su proveedor de servicio ni a nadie más le debería importar si usted consulta o no consulta dónde debe votar. Esto tiene un impacto en la cantidad de consultas que el servidor puede atender, pero me parece que es más importante la privacidad de los usuarios que la velocidad de las consultas (y, como dije antes, si eso se convierte en un problema, hay solución). En la misma línea, el servidor no mantiene registros de las consultas, más allá de cuántas se hacen, pues no quiero construir subrepticiamente una lista de la gente que parece estar interesada en saber dónde votar.

¿De aquí para dónde?

El gobierno de Luis Guillermo Solís prometió más transparencia y comunicación en su gestión, y como parte de eso se montó en la ola de “Gobierno Abierto”. Hasta ahora ha sido mucho ruido y pocas nueces (y mucha plata gastada por todas partes). Que prácticamente sea necesario rogarle al Tribunal Supremo de Elecciones para obtener datos que son parte del proceso electoral es, en el mejor caso, de risa. Que el Tribunal no publique los resultados de las elecciones en una forma que facilite la corroboración independiente es simplemente triste. Y que el mismo Tribunal de acceso preferente a esa información a corporaciones está simplemente mal.

A punta de presionar en Twitter, logré que el Tribunal eliminara el requisito de que la solicitud de información viniese de una persona jurídica. El año pasado llevé una solicitud al Tribunal para obtener una copia de lo que llama “padrón maestro” y una semana después me informaron que podía pasar a retirarla. Mi intención era comenzar haciendo algo muy simple, pero al revisarla mi sorpresa fue que la información recibida está incompleta, groseramente incompleta, pues aproximadamente dos tercios de los registros no contienen una serie específica de campos. Dudo mucho que medie malicia en esto, pero no puedo ignorar el hecho que el Tribunal no es capaz de entregar información que demostrablemente tiene.

En ese mismo eje, es un poco decepcionante que no sea el gobierno del PAC sino una alianza de partidos en busca de llegar a la alcaldía de Montes de Oca la que esté tomando seriamente el tema de montar una plataforma de participación ciudadana. No talleres, no convivios, no encuentros, no encerronas, no capacitaciones… nada de esas cosas, sino una plataforma donde los administrados puedan presentar directamente propuestas para consideración de otros administrados y del gobierno local.

El servicio operará hasta que deje de operar, pero el código estará siempre disponible. Si alguien quiere mejorarlo, bienvenido sea, solo pido que respeten la licencia. Si alguien quiere contribuir sus mejoras para incorporarlas al sitio web, también es bienvenido.



  « Anterior: Siguiente: »