Mnemosyne Project
À force de jouer avec Duolinguo, j’ai commencé à imaginer une application générique de flashcards qui me permettrait d’apprendre mes cours de maths basé sur des photos de mes flashcards.
Par acquis de conscience, j’ai cherché sur le PlayStore et je ne suis évidemment pas le premier à avoir eu l’idée. Il existe de nombreuses applications qui prétendent avoir un algorithme de spacing révolutionnaire que tous les CEO utilsent. Bref.
Au vu de l’offre, je me suis dit qu’il existe sûrement des applications open source. J’ai fini par tomber sur Mnemosyne Project qui est à la fois:
- une plateforme open-source de mémorisation (spaced flashcard, Desktop/Mobile sync, scripting, etc)
- un projet de recherche sur le fonctionnement de la mémoire à long terme
C’est donc l’outils que je vais utiliser pour mémoriser mes flashcards de maths.
Spaced learning, kecece ?
L’idée est de proposer un algorithme d’apprentissage qui s’appuie sur le principe de l'effet test
et de l'effet d'espacement
. Je vous invite à installer Duolingo et jouer 15 minutes avec. Vous allez vite comprendre sur de quoi je parle.
Ce qui nous intéresse ici, c’est que ces mécaniques de mémorisation sont valable pour la plupart des informations, et qu’elles sont assez simple à mettre en place.
Effet test
L’effet test: c’est le principe que l’apprentissage est plus efficace quand une partie du temps est dedié à retrouver l’information en mémoire plutôt que simplement relire.
Il y a deux technique facile à mettre en place pour utiliser cet effet:
- Les exercices: passer 1 minute à chercher la solution à un exercice puis lire le corrigé est plus efficace que relire plusieurs fois la source de connaissance
- Les flashcards: technique simple pour activer la remémoration, on fait un couple recto/verso de deux intitulés.
Effet d’espacement
L’effet d’espacement montre que la mémorisation est plus efficace quand les sessions de mémorisations sont de plus en plus espacés. Rapport au fait que les informations sont stocké de plus en plus profondément dans la mémoire à long terme, ce qui permet ensuite une meilleure maitrise donc un meilleur apprentissage.
Je précise ici qu’on parle de retenir des notions à long terme, pas simplement de bachoter un examen. Les techniques sont complètement différentes.
Installation de Mnemosyne
Installation de l’application mobile
Dans le PlayStore, facile.
Installation de l’application Windows
La page de download de Mnemosyne est ici
Installation du serveur Mnemosyne
On commence par installer les dépendences:
$ apt-get install python3-pip texlive
$ pip install --upgrade PyQt5 PyQtWebEngine matplotlib cheroot webob pillow googletrans gTTS dvipng
$ sudo python3 setup.py install
Ah, apparement il faut aussi argon2 sinon ça crash:
$ mnemosyne --sync-server
Warning: Could not import OpenGL. Might cause a black screen on some Linux distributions. Try installing python3-opengl in that case.
Log body:
An unexpected error has occurred.
Please forward the following info to the developers:
Traceback (innermost last):
File "/usr/local/bin/mnemosyne", line 4, in <module>
__import__('pkg_resources').run_script('Mnemosyne==2.9', 'mnemosyne')
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 656, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1453, in run_script
exec(code, namespace, namespace)
File "/usr/local/lib/python3.10/dist-packages/Mnemosyne-2.9-py3.10.egg/EGG-INFO/scripts/mnemosyne", line 115, in <module>
from mnemosyne.libmnemosyne.sync_server import SyncServerThread
File "/usr/local/lib/python3.10/dist-packages/Mnemosyne-2.9-py3.10.egg/mnemosyne/libmnemosyne/sync_server.py", line 9, in <module>
from argon2 import PasswordHasher
ModuleNotFoundError: No module named 'argon2'
An unexpected error has occurred.
Please forward the following info to the developers:
Traceback (innermost last):
File "/usr/local/bin/mnemosyne", line 4, in <module>
__import__('pkg_resources').run_script('Mnemosyne==2.9', 'mnemosyne')
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 656, in run_script
self.require(requires)[0].run_script(script_name, ns)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1453, in run_script
exec(code, namespace, namespace)
File "/usr/local/lib/python3.10/dist-packages/Mnemosyne-2.9-py3.10.egg/EGG-INFO/scripts/mnemosyne", line 115, in <module>
from mnemosyne.libmnemosyne.sync_server import SyncServerThread
File "/usr/local/lib/python3.10/dist-packages/Mnemosyne-2.9-py3.10.egg/mnemosyne/libmnemosyne/sync_server.py", line 9, in <module>
from argon2 import PasswordHasher
ModuleNotFoundError: No module named 'argon2'
An unexpected error has occurred.
Il faut donc installer argon2 (package argon2-cffi attention, ref)
pip3 install argon2-cffi
Ach so, on recommence:
$ mnemosyne --sync-server -d /home/mnemosyne/data
Warning: Could not import OpenGL. Might cause a black screen on some Linux distributions. Try installing python3-opengl in that case.
Error: Authorization not set up.
If on a headless server, you may use the following commands in the sqlite3 console on config.db to configure authorization:
update config set value="" where key = "remote_access_password_algo"
update config set value="'<username>'" where key = "remote_access_username";
update config set value="'<password>'" where key = "remote_access_password";
Ok faisons ça:
$ sqlite3 config.db
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> update config set value="" where key = "remote_access_password_algo";
sqlite> update config set value="ok" where key = "remote_access_username";
sqlite> update config set value="'okok'" where key = "remote_access_password";
sqlite>
on a maintenant:
$ mnemosyne --sync-server -d /home/mnemosyne/data
Warning: Could not import OpenGL. Might cause a black screen on some Linux distributions. Try installing python3-opengl in that case.
Sync server listening on XXX.XX.XX.XXX:8512
Bon, plus qu’à faire un service systemd:
$ cat /etc/systemd/system/mnemosyne.service
[Unit]
Description=Mnemosyne sync server
Requires=network.target
[Service]
Type=simple
WorkingDirectory=/home/mnemosyne/data
ExecStart=/usr/local/bin/mnemosyne --sync-server -d /home/mnemosyne/data
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=append:/var/log/mnemosyne.log
StandardError=append:/var/log/mnemosyne.log
User=mnemosyne
[Install]
WantedBy=default.target
$ systemctl daemon-reload
$ systemctl enable mnemosyne
$ systemctl start mnemosyne
$ systemctl status mnemosyne
● mnemosyne.service - Mnemosyne sync server
Loaded: loaded (/etc/systemd/system/mnemosyne.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-11-09 23:28:57 CET; 40s ago
Main PID: 652406 (mnemosyne)
Tasks: 4 (limit: 17518)
Memory: 28.5M
CPU: 797ms
CGroup: /system.slice/mnemosyne.service
└─652406 /usr/bin/python3 /usr/local/bin/mnemosyne --sync-server -d /home/mnemosyne/data
Nice!
Les autres applications bureau et mobile sont capables de sync avec le serveur.
Configuration LaTeX
J’ai modifié la conf latex dans le config.py
pour que ce soit plus simple et agréable à numériser:
# Latex preamble. Note that for the pre- and postamble you need to use double
# slashes instead of single slashes here, to have them escaped when Python
# reads them in.
latex_preamble = r"""
\documentclass[8pt]{article}
\usepackage{amsmath,centernot,amssymb}
\usepackage{systeme}
\pagestyle{empty}
\newcommand{\N}{\mathbb{N}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\Q}{\mathbb{Q}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\C}{\mathbb{C}}
\newcommand{\K}{\mathbb{K}}
\newcommand{\inter}{\cap}
\newcommand{\union}{\cup}
\begin{document}"""
# Latex postamble.
latex_postamble = r"""\end{document}"""
# Latex command.
latex = "latex -interaction=nonstopmode"
# Latex dvipng command.
dvipng = "dvipng -D 150 -T tight -Q 10 tmp.dvi"
Ce qui me permet d’écrire par exemple:
<latex>
Le noyau d'une matrice de taille $m \times n$ est constitué des vecteurs $x \in \R^{n}$ pour lesquels $Ax = 0$. \\
Ker(A) = {$x \in \R^{n} \mid Ax = 0$}.
</latex>
Il n’y a plus qu’à numériser 500 flashcards…