FABTUS (Fablab + Motus) est une adaptation Web du jeu Motus de France 2, appliqué au vocabulaire technique du fablab.
Vous avez 6 essais pour deviner le mot du jour, de 6 à 10 lettres, issu de l’univers des fablabs, des makers, et de l’ingénierie mécatronique et logicielle.
Le mot change chaque jour à minuit.
Pour jouer, rdv chaque jour sur :
🎮 fabtus.eirlab.net
Pour ne pas divulgâcher le résultat aux autres joueurs, le jeu intègre une fonction de partage des résultats sur les réseaux sociaux, sous forme d’émojis colorés. Vous pouvez partager votre résultat sur notre canal Discord dédié #mot-du-jour
Les résultats partagés contiennent le numéro du fabtus joué (ici, celui du 12ème jour), le nombre de coups joués (ici, 5 coups sur 6), et un aperçu des 5 étapes de jeu selon si les lettres sont correctes, mal placées dans le mot, ou non présentes dans le mot.
#FABTUS #12 5/6
Comment ça marche ?
Il a suffit de quelques heures pour adapter le code d’un projet opensource existant et l’adapter au vocabulaire des fablabs. Le code original est écrit par JonathanMM en NodeJS, et ne nécessite pas de base de données.
La vérification de la licence du jeu est importante pour connaitre nos possibilités de s’en servir : le fichier LICENSE indique une licence MIT. Celle-ci autorise effectivement la modification et la redistribution du code, à des fins personnelles ou commerciales.
🗩 Le code original utilise des noms de variables et noms de fichiers en français, mais l’auteur de cet article vous recommande de prioriser l’anglais au maximum dans tout projet pour faciliter sa réappropriation par d’autres développeurs non-francophones.
Pour mettre en route le projet localement, il faut d’abord récupérer le code du projet via git. Le paramètre -b
permet de ne récupérer que la branche dédiée la version fablab :
git clone -b fablab --single-branch https://framagit.org/myoan/sutom/
Générer le vocabulaire adapté au jeu
Le dossier data
comporte l’ensemble du vocabulaire utilisé par le jeu. Il y a non seulement les mots à trouver sur le thème du fablab, mais le jeu serait bien trop difficile d’il fallait taper exclusivement des mots liés au fablab à chaque essai. Le jeu doit connaitre aussi beaucoup d’autres mots de la langue française, que l’utilisateur pourra saisir. Il y a donc deux dictionnaires de mots :
motsNettoyes.txt
: l’ensemble des mots enter 6 et 10 lettres de la langue française, exception faite des mots dont la première lettre est rare comme K, Q ou Z.motsATrouver.txt
: l’ensemble des mots du jour qu’il faudra deviner.
Pour générer ces dictionnaires de mots adaptés, le code original fournit un dictionnaire de mots français mots.txt
qu’il faut nettoyer pour éliminer les lettres difficiles ou les mots de longueur différente de 6 à 10 lettres. Le dossier utils
contient divers scripts utilitaires pour réaliser le nettoyage préalable des mots.
La commande wc -l
(word count, avec le paramètre --lines
pour compter le nombre de lignes, abrégé en -l
) permet de donner le nombre total de lignes d’un fichier. Nous obtenons 212570 mots reconnus par le jeu, incluant des noms au singulier mais aussi des noms au pluriel, des verbes conjugués à toutes les personnes et à tous les temps, à l’infinitif, etc :
$ wc -l motsNettoyes.txt
212570 motsNettoyes.txt
Quid du vocabulaire spécifique du fablab ? Dans le jeu original, les mots à trouver sont un sous-ensemble du dictionnaire nettoyé, avec une étape de sélection manuelle mot-par-mot où un script utilitaire demande s’il faut inclure ou non ce mot dans la liste des mots à deviner. Pas besoin de répondre à cette question pour les 212570 mots, car 365 mots sont déjà suffisants pour tenir une année complète. En tout cas, ce sont des mots français de n’importe quel domaine, aussi bien TRIBUNAL que MAGICIENNE ou PRAIRIE.
Pour adapter le vocabulaire à celui du fablab, il suffit d’utiliser l’IA générative, qui est très efficace pour la génération de mots étant donné un contexte (ici, le contexte du fablab). En demandant à Mistral ou ChatGPT de générer une liste de 100 mots du fablab, puis une liste de 100 sur la mécanique, puis 100 sur le bricolage, puis 100 sur l’électronique, puis 100 sur le développement logiciel, on a déjà 500 mots à concaténer dans un fichier motsDuFablab.txt
Il risque d’y avoir des doublons, qu’on peut éliminer en triant les mots par ordre alphabétique avec sort
et en éliminant les doubles avec uniq
. Le tri est requis car uniq
n’élimine les doublons que s’ils sont à la suite les uns des autres :
$ sort motsDuFablab.txt | uniq > motsDuFablabATrouver.txt
Il faut maintenant s’assurer que chacun des mots du fablab à deviner sont présents dans le dictionnaire nettoyé, sans quoi le jeu ne sera pas jouable : le mot à deviner serait refusé puisque non accepté comme un mot valide. Pour ce faire, un script Python genererMotATrouver.py
effectue une opération d’INTERSECTION sur les ensemble de mots des deux fichiers, générant ainsi le vocabulaire final à deviner dans motsATrouver.txt
.
Une vingtaine de mots ont été éliminés par cette opération, cela concerne en particulier les mots trop techniques, anglophones, ou les marques, qui ne sont pas présents dans le dictionnaire générique de 212570 mots. Par exemple ARDUINO, ETHERNET ou MODBUS ont été éliminés.
$ wc -l motsATrouver.txt
479 motsATrouver.txt
On dispose alors de 479 mots à deviner, ce qui devrait faire l’affaire pendant 479 jours !
Le jeu original fait ensuite appel au compilateur TypeScript (tsc
) pour créer les fichiers JavaScript dans lesquels tout ce vocabulaire va être codé, en vue de leur utilisation par les navigateurs clients.
Pour tester le jeu en local, il faudrait installer NodeJS. Mais nous allons plutôt ici le mettre en ligne publiquement.
Mise en ligne du jeu
Le dossier peut être déplacé sur un serveur de production, en incluant aussi les fichiers précédemment compilés. Une machine virtuelle (VM) Ubuntu Server sur Eirlab Cloud fera l’affaire. Mais l’exécution va être conteneurisée (isolée) grâce à Docker, ce qui permet d’héberger plusieurs programmes serveurs (tel que ce jeu ou d’autres serveurs n’ayant rien à voir) sur la même machine virtuelle afin d’économiser les ressources.
Un conteneur Docker se créé avec un fichier Dockerfile
présent à la racine du projet. Il indique comment construire ce conteneur et le mettre en route :
Le Dockerfile ci-contre indique qu’il faut partir d’une image de NodeJS version 16 Alpine. Nous disposons ainsi d’un environnement Node fonctionnel grâce à Docker sans avoir à l’installer nous-même dans le conteneur ni sur la VM.
L’environnement est configuré avec ENV et CMD en mode de production, ce qui est important car l’autre mode est réservé au développement. Cela influencera fortement les performances.
Les commandes indiquent avec COPY quels fichiers et dossiers copier à l’intérieur du conteneur. La clause EXPOSE indique que le port 4000 doit être exposé à l’extérieur du conteneur, permettant aux clients de s’y connecter.
Puis CMD indique la commande à exécuter pour démarrer le conteneur. Ici, il s’agit de démarrer le serveur de prod NodeJS.
FROM node:16-alpine
ARG MODE=production
ENV NODE_ENV=$MODE
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN ./node_modules/.bin/
tsc
EXPOSE 4000
CMD ["npm", "run", "start:prod"]
A ce stade, le jeu est théoriquement déjà jouable en ligne en chargeant l’adresse IP via le protocole HTTP sur le port 4000, par exemple en chargeant http://192.168.1.51:4000 dans Mozilla Firefox, où l’adresse IP est à remplacer par celle du serveur.
Toutefois, il reste encore quelques étapes pour que le jeu soit utilisable par tout le monde :
- Configuration du DNS : le rôle du DNS est de faire correspondre le nom fabtus.eirlab.net à une adresse IP
- Configuration d’un reverse proxy : Les ports Web par défaut sont 80 pour HTTP et 443 pour HTTPS, donc le port 4000 sera bloqué par le pare-feu. Le reverse proxy est le destinataire unique du trafic HTTP et HTTPS sur les ports 80 et 443 arrivant sur cette VM. C’est lui qui dispatche ensuite le trafic vers les bons conteneurs Docker sur leur port interne (ici, le port 4000) selon le nom de domaine entrant. Par exemple on pourrait héberger un autre jeu mecatus.eirlab.net dans un conteneur Docker différent, en écoute sur le port interne 4001 mais sur la même VM, permettant de deviner uniquement du vocabulaire mécanique.
- Activation d’un pare-feu : ce pare-feu bloque les ports autres que 80 et 443 pour éviter à des éventuels programmes malveillants de passer par les autres ports pour communiquer avec l’extérieur. SSH étant par défaut sur le port 22, il sera bloqué par défaut ou bien il faut ajouter une règle d’autorisation du port 22.
- Obtention d’un certificat SSL : le certificat SSL est celui qui garantit que, d’une part, le trafic est chiffré entre le navigateur et le serveur, d’autre part que le serveur que vous pensez consulter sur fabtus.eirlab.net est bel-et-bien sous la responsabilité du propriétaire de eirlab.net et non un usurpateur. Pour assurer ces 2 garanties, un certificat est délivré par une autorité de certification (CA) extérieure permettant au navigateur de les vérifier. La plupart des entreprises faisant office de CA délivrent des certificats à titre payant. Toutefois le service Let’s Encrypt est une association délivrant des certificats gratuits, qui expirent au bout de 6 mois et qu’il faut donc renouveler de manière périodique, de façon manuelle ou automatisée.
- Tâches automatisées avec crontab : il est nécessaire de générer chaque jour un nouveau mot à deviner. Chaque jour à minuit, un script automatisé avec l’outil crontab intégré à Linux génère le mot du jour et appelle le compilateur TypeScript afin de mettre à jour les fichiers JavaScript codant le nouveau mot. Une autre tâche doit être automatisée : le renouvèlement du certificat SSL tous les 6 mois.
Une fois ces quelques étapes réalisées, le jeu est disponible publiquement, sécurisé par un certificat SSL émis par Let’s Encrypt, ce que le navigateur peut attester en cliquant sur le cadenas à gauche de l’URL :
🎮 Pour jouer, rendez-vous chaque jour sur fabtus.eirlab.net
Partagez vos résultats quotidiens sans spoil avec le copier/coller de partage intégré au jeu.