Meta-Press.es

Moteur de recherche décentralisé & revue de presse automatisée

Version 1.8.15 : maintenance des sources, correction de bogues et gros exports

Cette nouvelle version ne contient presqu’aucune amélioration visible, mais elle a pourtant nécessité énormément de travail. Ce qui a changé, c’est par exemple la façon dont Meta-Press.es détermine si une URL est valide ou non, son organisation interne, comment les dates sont créées (avec des fuseaux horaires) ou encore comment les fichiers sont importés… du gros œuvre dans le code donc, mais pour ne s’attaquer (en apparence) qu’à quelques bogues.

1. Maintenance des sources

Après le gros travail mené sur les sources pour la précédent version, il est apparu que certaines sources n’étaient pas aussi précises qu’espérées. Aussi, 200 d’entre elles sont à nouveau étiquetées "approx" pour approximatives.

J’ai longtemps espéré pouvoir utiliser une échelle unique de précision pour qualifier les sources :

  • approx

  • un mot

  • plusieurs mots

Pour les sources donnant des résultats approximatifs, précis pour un mot ou pour plusieurs. Mais cette approche mélange en fait deux concepts : exact / approx et un mot / plusieurs mots. Le premier critère correspond à la capacité de la source à donner des résultats exacts ou approchés, et le deuxième à la capacité de la source de s’assurer qu’au moins un des mots recherché par l’utilisateur est présent dans ses résultats, oubien tous à la fois (applique-t-elle un ET-logique entre les termes de recherche ou un OU-logique). Ces deux problématiques sont orthogonales et certaines sources devront pouvoir être étiquetées "approx" et "plusieurs mots".

Ce faisant, des sources furent encore ajoutées pour atteindre un total de 988 avec cette version 1.8.15 (et 1.8.15.1) réparties en 75 pays et 75 langues.

1.1. 800 lignes ajoutées dans les définitions de sources

Année

# lignes

2019

593

2020

881

2021

3066

2022

6970

2023

8759

2024

3984

Pour un total de 24 253 lignes (+535).

2. Correction de bogues

Un total de 12 problèmes furent résolus pour cette nouvelle version. En voici les principaux.

2.1. #80 [1.8.14] Échec au re-import d’un fichier RSS

Une grosse recherche peut télécharger des milliers de résultats, et je profite de ces cas là pour tester les fonctionnalités d’export et de re-import des résultats. Généralement ça marche, mais là je suis tombé sur un os. Quelques heures de recherche permirent d’identifier ce que l’analyseur de fichier XML dénonçait comme caractères XML illégaux dans les fichiers RSS générés par Meta-Press.es. Ce qui enduisait l’interpréteur d’erreur était l’absence d’un caractère qui aurait permis de fermer un motif qu’il était bien le seul à voir, et le message d’erreur pointait donc au milieu d’un texte parfaitement valide si on ne commençait à regarder le fichier qu’à partir de l’erreur rapportée. Ces mystérieux caractères illégaux étaient donc cachés un peu plus tôt dans les URL des illustrations de certains articles, par exemple les URL à destination du vigneteur interactif de https://www.journal-ipns.org (PHP Thumbnailer).

Il s’agissait tout simplement de plusieurs éperluètes "nues" dans ces URL, or le seul usage autorisé des '&' dans un fichier XML est celui d’annoncer le début d’une entité XML (c’est à dire de la description d’un caractère à remplacer lors du décodage du fichier). Une éperluète peut par exemple être remplacé l’entité XML & # 2 6 ; (sans les espaces) mais si on fait ça, c’est le vigneteur en face qui ne s’y retrouve plus.

Il fallut donc remplacer les '&' de ces URL par des & amp ; pour que tout le monde soit content.

2.2. #73 [1.8.14] Les recherche dans la liste des sources interprêtent les signes '-'

Ici le problème était que chercher journal-ipns.org dans la liste complète des sources ne donnait aucun résultat. C’était dû au fait que la bibliothèque de fonction ListJS que Meta-Press.es utilise pour paginer cette liste (et qui fourni également une fonctionnalité de recherche) interprétait les schémas du type -untexte comme une négation : ne pas chercher ce qui contient untexte.

Puisque ListJS n’est plus maintenu, Meta-Press.es est désormais équipé de la version Lovasoa de cette bibliothèque, nommée de part le pseudo du mainteneur qui a entre autre corrigé ce bogue.

2.3. #66 [1.8.12] Impossible de programmer une nouvelle recherche : Failed to parse next run date Invalid Date

Lorsqu’aucun fuseau horaire n’était explicitement choisi par un utilisateur (et donc que le fuseau horaire par défaut du navigateur était utilisé), les utilisateurs français ne pouvaient plus programmer de nouvelles recherches automatique durant la période des heures d’été.

Quelques sérieux ajustements dans la fonction qui crée des dates avec fuseau horaire pour Meta-Press.es ont permis de corriger ce problème (il était question de savoir gérer plus de situations, notamment des fuseaux horaires exprimés en heure, en heure avec minutes, ou juste en minutes comme : -120…).

2.4. #64 [1.8.11] Le filtre par date est remis à zéro une fois les derniers résultats arrivés

Celui-ci était un bogue (très bien) signalé par un utilisateur. Typique du genre des petits bugs qui n’ont l’air de rien mais qui se mettent complètement en travers du flot d’exécution mis en place pour accueillir les résultats. On aurait pas dû avoir à s’éloigner du simple : ré-applique les filtres à chaque fois que ajoute des résultats sur la page. Mais pour le coup, je m’en suis occupé en même temps que la ré-organisation MVC du code (dont je parle plus bas) et ça a passablement compliqué les choses (et la correction du bug suivant), tout en mettant bien en évidence le besoin de réorganisation.

2.5. #79 [1.8.14] Investigate JSON export failure for 10448 results

Pour faire une grosse recherche, c’est facile, il suffit de chercher "europe" dans toutes les sources connues. C’est à peu prêt comme ça que les sources sont testées et ça ramène plus de 10 000 résultats. Meta-Press.es était alors capable d’exporter ces résultats en RSS, en CSV, mais pas en JSON !? Et sans le moindre message d’erreur.

Il semble en effet que Meta-Press.es se heurtait à une limite sur la taille des fichiers générables (via data: URL) fixée à 20MO (ça devrait être 32MO a priori). Dans notre cas, les fichiers RSS et CVS étaient plus petits que leur homologue JSON car ils embarquent moins d’information, perdant notamment le nombre de résultats revendiqués par chaque source.

En diminuant le nombre de caractères de présentation utilisés dans le JSON produit, l’export JSON passait à 19,9MO et avait bien lieu. Ces limites existent et varient au cours du temps et au gré des navigateurs. Une meilleur solution devrait être trouvée rapidement.

Cela pourrait être une fonctionnalité d’export découpé en plusieurs fichiers de 20MO chacun, et une amélioration de l’import, pour être capable de ré-importer une série de fichiers (et pourquoi pas de deviner le type d’un fichier importé en fonction de son extension).

Tant qu’à se pencher sur les exports et les imports, leur code a été globalement amélioré pour fournir plus de réactivité aux utilisateurs et mitiger d’un facteur 15x la perte de performance due à la ré-organisation du code (qui impactait les imports JSON). Il s’agissait là tout simplement de ne ré-ordonner les résultats qu’une fois toutes les 15 sources, et pas à chaque source, car on a pas de temps à perdre quand on import un gros fichier JSON, c’est pas comme si on passait son temps à attendre les résultats de la prochaine source… (comme c’est habituellement le cas)

3. Ré-organisation MVC du code et client NodeJS

MVC, ça veut dire modèle-vue-controleur. C’est un type d’architecture logicielle qui facilite la maintenance du code en séparant clairement les données du code, puis le code "métier" du code d’interface.

Meta-Press.es a été codé comme une simple page web au départ (une architecture ou le contraire est possible, tout dans le même fichier : l’interface (HTML, CSS), le code (JavaScript) et les données. Cette page a été embarquée dans une WebExtension et a pas mal grossi depuis, atteignant 8000 lignes de code aujourd’hui.

En utilisant la commande cloc on peut constater que le code était ventilé en 19 fichiers et 7586 lignes à la mi-mai 2023.

Il est désormais réparti en 32 fichiers pour 8073 lignes en cette mi-mai 2024.

Les fonctionnalités "métier" ont été isolées dans un dossier js/core et seront utilisables par par un client NodeJS en ligne de commande en plus de la WebExtension. Ce travail a permis de distinguer et d’isoler les dépendances requises au fonctionnement de Meta-Press.es et que le client NodeJS va devoir fournir (comme les fonctions DOM_parser, XPath_evaluator, HTML_decode_entities…).

De plus, les fonctions génériques étendant le langage JavaScript codée au fil du développement de Meta-Press.es ont été séparées dans un ensemble de fichiers rangés dans js/lib/js :

  • array.js

  • date.js (dont timezoned_date() qui permet de créer des dates dans un fuseau horaire choisi)

  • math.js

  • object.js

  • text.js

  • types.js

  • URL.js (dont is_valid_HTTP_URL() qui vérifie la validité d’une URL, et rassemble des idées de 5 sources différentes)

  • UUID.js

  • XML.js (dont encode_XML() qui permit de corriger le problème #80)

Il s’agit seulement de 211 lignes de JavaScript, principalement composées de raccourcis évidents qui me rendent le JavaScript plus agréable, mais si des volontaires se manifestent pour en faire une bibliothèque de fonction indépendante je serai là pour aider.

4. v1.8.15.2 : Retrait de deux sources

Deux sources ralentissaient considérablement les recherches, l’une d’elle les bloquant dans une situation sans fin.

Une réparation rapide consiste à les marquer comme cassées. Une meilleur approche consistera à réparer le mécanisme de coupure automatique des recherches trop longues (actuellement basé sur l’API AbortController).