Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
commit e22f3e62ca510d9ed4077231bb9bb6cb201ba688 parent 917b5cddcd0842f21970cf848b60fe49a3da0be1 Auteurice: Arthur Pons <arthur.pons@unistra.fr> Date: Sat, 10 May 2025 21:37:43 +0200 Fin rédaction article scrabble Todo : relire et gérer ce truc des fichiers binaires dl Diffstat:
M | contents/scrabble-valide/index.sh | | | 145 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- |
1 file changed, 143 insertions(+), 2 deletions(-)
diff --git a/contents/scrabble-valide/index.sh b/contents/scrabble-valide/index.sh @@ -6,6 +6,8 @@ publication: 2025-05-10 section: main +Article pas relu + ## Si vous voulez simplement l'utiliser La liste complète par taille et ordre alphabétique des mots valides au scrabble @@ -17,14 +19,16 @@ Pour le dezipper faire `gunzip mots-valides-scrabble.gz`. Pour vérifier si un mot est valide en ligne accédez au lien suivant en modifier le mot recherché : http://bebou.netlib.re/scrabble/mot -Si vous avez le fichier en local pour vérifier si un mot existe vous pouvez lancer la commande : +Si vous avez le fichier en local pour vérifier si un mot existe vous pouvez +lancer la commande : < mots-valides-scrabble grep "^mot$" ## Introduction [Timothée](https://timothee.goguely.com/) a récemment joué au scrabble et s'est -plaint des sites depuis lesquels on peut vérifier si un mot est valide. J'en fais donc ma mission de trouver un moyen de rendre cela plus facile. +plaint des sites depuis lesquels on peut vérifier si un mot est valide. J'en +fais donc ma mission de trouver un moyen de rendre cela plus facile. ## Trouver la liste des mots @@ -42,5 +46,142 @@ m'a permis de confirmer que le jeux de donnée que j'ai constitué est bien à jour entre autre parce qu'il ne contient plus certaines insultes homophobes, raciste et sexistes. La FISF, ces dangereux wokistes. +J'ai cherché sur le site de la FISF si le dictionnaire était disponible sans +succès. Il y a bien des applications mobiles qui fonctionnent sans internet et +qui donc contiennent la base d donnée en locale [un peu à la manière du +DES](/crisco-des/) mais ne connaissant rien en appli mobile j'ai évité. + +## Le vérificateur de de mots de la FFS + +En cherchant sur le site de la Fédération Française de Scrabble j'ai trouvé +leur [vérificateur de mot](https://www.ffscrabble.fr/verificateur-de-mots/). Ce +vérificateur fonctionne en récupérant ce qui est inscrit dans la boite de +dialogue et en appelant une api REST que l'on peut appeler de la sorte et qui +nous renvoie de l'HTML : + + $ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \ + -H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \ + --data-raw 'action=verifier_mot&mot=manger' + + <span class="answer right-answer"> + Le mot <b>"manger"</b> est valide + <img class="valid-invalid" src="https://www.ffscrabble.fr/wp-content/uploads/2024/02/check_circled_button_background.png" /> + <br> + Le joueur qui a contesté reçoit une pénalité de 5 points + </span> + +Super. Sauf que pour avoir la liste des mots valides il faudrait tester tous +les mots existants auprès de cet API. Ce n'est pas raisonnable. J'ai eu +l'intuition qu'il devait exister une "action" du type "recuperer_mot" qui +permette d'obtenir une liste. J'ai utilisé le débogueur des outils de +développement de Firefox pour lire le JS fourni avec le site. J'ai cherché +la chaîne "action:" puis je suis tombé sur [ce +fichier](https://www.ffscrabble.fr/wp-content/plugins/ffsc-jeux-mots/js/jeu-mots.js) +contenant une action `get_mots` très prometteuse : + + + $ curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \ + -H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \ + --data-raw 'action=get_mots&longueur=2&nombre=2' + + <div class="mot-item"> + <span class="mot-affiche" data-mot="PU">PU</span> + <input type="text" class="mot-saisi"> + </div> + <div class="mot-item"> + <span class="mot-affiche" data-mot="IL">IL</span> + <input type="text" class="mot-saisi"> + </div> + +## Le vol + +### Collection + +Ce script permet de successivement demander 1 millions de mots des +longueurs de 2 à 15 : + + for i in $(seq 2 15); do + curl -Ls 'https://www.ffscrabble.fr/wp-admin/admin-ajax.php' \ + -H 'referer: https://www.ffscrabble.fr/verificateur-de-mots/' \ + --data-raw "action=get_mots&longueur=${i}&nombre=1000000" > "$i" + done + +### Le nettoyage + +On se retrouve avec 14 fichiers numérotés de 2 à 15. remplis d'HTML. On peut +les parser de la sorte : + + for i in $(seq 2 15);do + < "$i" sed -E 's/<[^>]+>/\n/g' | #on retire l'html + grep . > "$i.parsed" # et les lignes vides + done + +Et constituer un fichier global en faisant : + + for i in $(seq 2 15);do + < "$i.parsed" sort #on trie par ordre alpha + done | + sed -E 's/.*/\L&/' > res #et on met tout en minuscule + +## Le service + +Maintenant à notre tour d'imaginer un service équivalent. En local si nos mots +sont dans le fichier `res` le plus simple reste de faire : + + $ < res grep "^mot$" + mot + +Si la commande renvoie quelque chose c'est bon, sinon c'est pas bon. +On peu éventuellement le rendre un peu plus explicite en faisant : + + < res grep -q "^mot$" && echo "valide" || echo "non valide" + +Habituellement j'aurais mis ça derrière un CGI ou un service 2222 ou les deux +mais je voulais tester autre chose. Et si l'on s'amusait à créer un fichier +texte par mot valide. On pourrait ensuite tenter d'accèder à une url. Si on a +une 404 le mot n'est pas valide, si on a un retour le mot l'est. + +Pour créer les fichiers on peut faire : + + $ sed 's/^/echo "oui" > /g' res | sh + +Cela va créer pour chaque ligne (mot) une commande : + + $ echo "oui" > mot + +Attention, cela génère +400 mille mots dans le dossier courant. Sur des +systèmes modernes ce n'est pas un souci, et même étonnament rapide, mais sur +des systèmes plus vieux ou avec un disque lent je suppose que cela est une +assez mauvaise idée. + +Reste que l'on aimerait y accéder en faisant `site.com/scrabble/mot` et que par +défaut en absence d'extension le navigateur va nous faire télécharger le +fichier plutôt que d'afficher "oui" à l'écran. J'en suis resté là, j'ai un peu +la flemme de modifier la conf du serveur pour lui faire dire que dans ce +dossier spécifiquement les fichier sans extension sont à traiter comme des +fichiers texte. Si vuos savez comment le faire sous nginx je suis preneur. + +## Discussion + +Si j'aime bien cette solution puisqu'elle n'implique aucun code (ça c'est du +vrai no code) je pense qu'elle n'est pas possible avec du matériel et/ou des OS +et/ou des systèmes de fichier assez vieux ayant mal optimisé la création de +fichier. Sur le serveur il y a 3,7 millions d'inodes dont 600 milles utilisés +après avoir créé nos 400 milles fichiers : + + Sys. de fichiers Inœuds IUtil. ILibre IUti% Monté sur + /dev/mmcblk0p2 3786960 599438 3187522 16% / + [...] + +Autrement dit l'existance de ce service sous cette forme occupe un peu plus de +10% de la totalité des fichiers disponibles sur le rasp et 66% des fichiers +existants. +Question performance le serveur web n'a aucun mal, le fait que le dossier soit +blindé de fichiers n'est pas un souci pour trouver le bon. +Pour vérifier si effectivement le luxe de ne pas avoir besoin de code n'est +abordable que dans la mesure où l'on a une carte sd relativement grosse et +performante, un système de fichier et un os moderne il faudrait tenter +d'héberger le même service sur un OS ancien. Peut-être un article pour une +prochaine fois.