¡Hola! Este es el primer post de una serie (larga, espero) de post en los que contaré qué he estado haciendo durante mi semana. La idea es contar mis experiencias delante del ordenador, no habrá demasiada salsa rosa en estos posts.

¿Por qué escribir este tipo de posts? Sobretodo para mí, para darme cuenta de que a veces, aunque me de la sensación de que no tengo tiempo para hacer ni la mitad de las cosas que me gustaría, realmente hago muchas cosas. Quizás el problema es que me gustaría hacer demasiadas cosas… También, el dejar esto por escrito me permitirá recordar mi plan de estudios (plan de estudios poco planeado, dicho sea de paso) que he ido siguiendo.

No podré hacer esto todas las semanas por mi elevado ritmo de viajes. La vida de nómada no siempre me lleva a sitios en los que puedo trabajar cómodamente en mi portátil. Otras veces, aunque tengas espacio para trabajar simplemente decides hacer otras cosas :) En relación a mis viajes, para amenizar un poco, añadiré una foto al inicio de los posts para mostrar algunos de los preciosos paisajes que mi móvil ha tenido el privilegio digitalizar.

Playa del Portío, Santander (España)
Playa del Portío, Santander (España)

Flashcards o tarjetas de repetición espaciada

Llevo todo este mes trabajando en un proyecto para generar tarjetas Anki de memorización a partir de ficheros de texto. Desde que las empecé a utilizar para aprender japonés me he enamorado del sistema de repetición espaciada y he decidido utilizarlas para crear mi propia base de conocimientos. ¡No quiero olvidar nada de lo que he aprendido! Y, en el caso de que lo olvide, quiero saber exactamente dónde tengo que buscar.

¿Cuál ha sido mi propuesta? No podría tratarse de ficheros perdidos en un disco duro externo o mal organizados dentro de mi ordenador, el conocimiento tiene que ser fácilmente accesible. GitHub y su nube es la solución perfecta: una herramienta que ya estoy muy acostumbrado a usar y que cumple perfectamente con los requisitos ( especialmente ahora que permite la creación de repositorios privados de forma gratuíta). El tener una base de conocimiento basada en ficheros de texto (nada de archivos comprimidos o ficheros de Word) ayuda mucho a hacer búsquedas entre todos los ficheros de una forma rápida y eficiente.

He creado una serie de repositorios en GitHub, uno para cada uno de los temas que estoy aprendiendo. Por ejemplo:

  • Japonés: tengo un repositorio llamado guiferviz/learning_japanese.
  • Programación: tengo un repositorio llamado guiferviz/learning_programming.
  • … Y tengo todos ellos clonados en mi ordenador en una ruta muy accesible. Por ejemplo, el repositorio de japonés se encuentra en ~/learning/japanese, el de programación en ~/learning/programming… De esta forma puedo abrir la terminal y en 2 segundos estar editando cualquiera de los ficheros desde VIM.

Así que la solución es…

Mnemocards logo, mi librería que facilita la creación de tarjetas Anki

El objetivo de Mnemocards es facilitarme la vida. Aunque Anki permite crear sus tarjetas con el editor integrado, no soy muy fan de las interfaces gráficas. Es cierto que también permiten importar ficheros de texto, pero Mnemocards hace eso y mucho más! Puedo usar Mnemocards para clonar todos mis repositorios con tarjetas Anki con un solo comando, generar las tarjetas, importarlas al programa Anki y mantener los repositorios siempre actualizados. Además, las tarjetas generadas pueden incluir audio extraído de Google Translator, muy útil para aprender idiomas. Cuando no se trata de idiomas, Mnemocards genera tarjetas a partir de unos ficheros con una sintaxis muy similar a Markdown.

Visita el repositorio de Mnemocards en GitHub.

Una vez casi cerrada la primera release de mi generador de tarjetas Anki, le dediqué un buen tiempo ha hacer uso de las tarjetas generadas :) Estuve aprendiendo y recordando muchas cosas interesantes que tenía apuntadas en mis ficheros de texto.

Pull request a Genanki

Una de las librerías en las que se basa Mnemocards es Genanki. Esta librería de Python te permite generar paquetes de Anki con una API muy fácil de utilizar. Una cosa que le faltaba a Genanki es el poder definir la configuración de las barajas (learning steps, initial ease factor…), así que le añadí esa opción. Tras realizar el cambio creé una pull request que, me atrevería a decir, se va a quedar ahí mucho tiempo sin que nadie le haga caso. Después de pelearme con setuptools fui capaz de añadir la branch de mi fork como requirement.

También, relacionado con este tema, mantuve una conversación con un desarrollador de Anki para alertarles de un error de su programa. Anki no importa las configuraciones de un paquete si no importa ninguna tarjeta nueva. Eso quiere decir que si yo genero un *.apkg con unas tarjetas, lo importo y después le añado una configuración al *.apkg y lo vuelvo a importar, la configuración no se importa. Tengo que añadir alguna tarjeta nueva para que se importe correctamente.

Competitive programming en CodeForces

Esta semana también me dio por participar por primera vez en una competición de programación. Fui un poco temerario al decidir programar en C++ cuando hacía 4 años casi que no lo usaba, pero bueno, aún así no fue tan mal. Perdí media hora buscando un error porque inicialicé un array mal, pero al menos me dio tiempo a terminar 2 problemas y el tercero lo entregué 2 segundos (literalmente 2 segundos) después del cierre :(

Creo que puedo mejorar mucho, me queda pillar la dinámica de la programación competitiva, refrescar mi conocimiento sobre técnicas algorítmicas y quitarle el óxido a mis conocimientos de C++. Y hablando de óxido… ¿debería probar Rust? Velocidad de C++, expresividad de Python y mensajes de error fácilmente interpretables. Lo último que quiero en una competición de programación es tardar 3 minutos en averiguar que mi error vienen porque olvidé un punto y coma…

La semana que viene más

Ya tengo algunos planes más para la siguiente semana, entre ellos está apuntarme a mi segunda competición en CodeForces. Otro planazo es empezar a desarrollar una librería de C++ en la pueda incluir una colección de algoritmos implementados y, a modo de extra, que pueda compilar en WebAssembly.

Posiblemente también aproveche el post de la semana que viene para hablar de algunos de los libros que llevo leyendo lentamente desde principios de año. Sí, son libros relacionados con la programación :)