Aller au contenu

FABTUS đŸŸ„đŸŸŠđŸŸĄ Le mot du jour du fablab

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

Capture d'écran d'une partie Fabtus terminée sur Mozilla Firefox. Le mot à deviner était MEULER.

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.