URL: https://linuxfr.org/forums/general-general/posts/robert-un-logiciel-de-stockage-en-ram Title: Robert, un logiciel de stockage en RAM Authors: JulienG Date: 2020年04月19日T20:02:45+02:00 License: CC By-SA Tags: robert, redis, développement, rust, base_de_données, libreoffice et firefox Score: 8 Bonjour à tous, J'ai le plaisir pour ce premier message sur le forum, afin de vous annoncer un nouveau projet de stockage clé/valeur en RAM : [https://github.com/JGarderon/Robert](https://github.com/JGarderon/Robert) "Encore un" vous dire-vous ? certes. Voyons si j'arrive à vous convaincre. **(*) Présentation de 'Robert', votre nouvel ami** Le projet se nomme ainsi pour plusieurs raisons : - c'est un projet entièrement francophone (j'y reviendrai), - son fonctionnement s'apparente à celui d'un "Redis-like" (stockage de valeurs, mécanique de souscription et publication, exportation / importation vers des fichiers, scripting sur la base), - il est écrit en Rust, ce qui lui garantit une qualité minimale (sans être exempt de bugs). Le (pré)nom "Robert" me semblait donc tout indiqué... Je suis à l'origine de ce projet, à la suite d'[une thèse pro sur le modèle RDF appliqué aux organisations et à l'information](https://www.slideshare.net/nothus1/penser-son-systme-dinformation-apprhender-ses-volutions) en décembre dernier. Robert se veut être un logiciel utilisable par le plus grand nombre (du moins via _telnet_), de qualité, fiable et léger mais surtout maintenable facilement, même avec peu de connaissances (je ne suis pas développeur pro et j'ai toujours appris le développement seul). Les professionnels ou personnes averties qui parcourront le code, trouveront probablement des imperfections (ouvert à tous les tickets / propositions). J'invite à la clémence, c'est ma contribution à la communauté... :) **(*) Documentation et informations techniques** Le dépôt contient la documentation produite à partir du code source, que j'ai laissé sur GitHub. Une fois le dépôt cloné, vous trouverez les informations dans "./target/doc/projet_robert/index.html". Il peut être mis à jour depuis la commande "cargo doc" à la racine. Le projet ne dépend d'aucune "caisse" (module) externe. C'est voulue, afin d'éviter le serpent des dépendances, qui rend complexe la maintenance (car une dépendance peut en entraîner une autre...). Robert veut en faire moins, mais essayer de faire bien ce qu'il tente de faire ! A terme, il me semble tout de même difficile de faire sans les expressions régulières, notamment pour la gestion du texte (mais ce serait là une rare exception confirmant la règle). **(*) Développement et licence** Ce projet est entièrement écrit en Rust (Version 1.39.0), depuis Cargo. Lorsque vous avez cloné localement le dépôt, une simple commande "cargo run --release" à la racine compilera et lancera le programme (testé sous Windows 10 et Linux/Ubuntu). Celui-ci est accessible par défaut sur le port 8080 en local. La licence est naturellement ouverte et permissive (Apache 2). L'usage de Robert est donc gratuit (et je n'ai pas de structure pour le support actuellement). **(*) Intérêts et fonctionnement** Les clients peuvent se connecter via un socket TCP et envoyer des commandes. Chaque commande se termine par un saut de ligne (\n) et est composée d'une fonction à appeler, puis de zéro, un ou n arguments. Chaque argument est séparé par un espace. Si votre argument contient un espace, il doit être entre guillemets ("). Les fonctions sont découpées en modules (voir la documentation). Toutes les commandes, les messages renvoyés comme l'ensemble de la documentation et du développement sont en français. La base se constitue de "canaux", qui autorisent à émettre et à souscrire aux messages émis. Dès le lancement, il y a toujours un canal, nommé "défaut", qui ne peut être supprimé et reccueille les clients nouvellement arrivés. Les autres canaux peuvent être créés, édités et supprimés librement. Chaque client ne peut être connecté qu'à un canal à la fois, mais peut changer de canal au cours de la connexion. Certaines opérations sont restreintes aux clients identifiés (il existe une fonction d'authentification, basée sur un fichier CSV ; par défaut "test" / "test"). Dans chaque canal, il existe une arborescence identique : à l'origine de chaque canal, vous pouvez définir des paires clé/valeur. Une valeur peut être un texte ; un entier positif ou négatif ; un flottant ; un booléen ou un objet qui lui même est un dictionnaire de paires clé/valeur. Il est donc possible de faire des "chemins" amenant à une valeur particulière dans l'arbre du canal (appelé la "liste"). Concernant la diffusion de messages entre clients connectés à un même canal, il s'agit d'une suite binaire quelconque. Il est possible de "capturer" un canal pour soi-même (avec aucune possibilité pour les autres d'y accéder) afin d'avoir son propre espace de stockage de valeurs, comme de restreindre un canal existant aux clients qui y sont (déréférencement). Exemple de commande (à exécuter dans l'ordre, avec "entrée" à chaque ligne) : définir mavar 1 obtenir mavar altérer mavar relatif obtenir mavar numérique:incrémenter mavar 2 obtenir mavar définir obj ~ objet définir obj/mavar 5 flottant obtenir obj/mavar _(il y a quelques dizaines de commandes de disponible au total, couvrant le spectre essentiel des opérations)_ Les lignes en retour commencent toujours ainsi : - **[+]** : commande terminée et positive ; - **[-]** : commande terminée et négative ; - **[@]** : commande toujours en cours, message à destination du client ; - **[!]** : commande toujours en cours, une erreur est survenue. Facile à parser donc. **(*) Travaux en cours** Le programme est opérationnel, fonctionnel, sauf pour la partie script (mais cela n'interfère pas avec le reste). J'ai commencé voilà plusieurs mois ce travail, et puis quelques semaines le développement actif. Actuellement j’intègre un outil de script qui ressemble beaucoup aux commandes fournies par les clients : Cerise (et l'implémentation s'appelle Tomate, parce que "tomate-cerise"... #honte). C'est un DSL que je dirais "hybride", moitié API, moitié DSL classique. En somme il y a un arbre à résoudre, mais ce dernier est TRÈS restreint (volontairement). Le but est de rapprocher l'outil de script dans l'esprit des filtres d'IndexedDB dans Firefox : un même script, rapide et qui n'échoue pas, qui sera exécuté pour chaque valeur dans une partie de l'arbre du canal. Chaque ligne du script commence par un opérateur "+" (positif), "-" (négatif), "ø" (inconditionnel). Cet opérateur permet au moteur de se baser sur un état pour savoir si la ligne sera exécutée ou non. Cet état est à l'origine à "vrai" et si une ligne échoue ou modifie l'état, la suivante se basera sur celui-ci pour sa propre exécution. Il est possiblement de "diverger" un bloc d'instructions avec une condition d'état, puis de faire "converger" de manière conditionnelle ce bloc vers son parent immédiat qui continue alors son exécution. A terme, il sera possible d'avoir des scripts qui seront appelés durant l'exécution, ce qui permettrait des boucles ainsi que de la définition de fonctions. Rappel : un script dans ce contexte, ne gère que la valeur de la base qui lui est soumis, et ses enfants s'il y en a. Cela ressemble à ça : ``` + type:texte ø état:sauvegarder ø afficher ø état:recharger + afficher "c'est bien un texte" - afficher "c'est autre chose" - ràz ø diverger + afficher "je ne sais à rien" ø converger ø afficher "stop" ``` Sur la filiation de ce DSL, je dirais qu'il se situe entre plusieurs choses que j'aime bien: le café du matin, les bouquins sur (Common) LISP, le lambda-calcul, ma douche... et TCL. Les experts classeront mieux que moi :) **(*) Super, ravi(e) mais à quoi ça sert _vraiment_ ?** Redis sert pour du stockage (très) rapide car sur la RAM (VoltDB est son équivalent en SQL). Robert s'en inspire : stockage de sessions pour un site Web, de calculs provisoires... peu importe. L'outil ne fait pas le métier (mais l'inverse si). Ma finalité personnelle était de supporter la récursivité (pour avoir un classement pointu) et surtout l'aspect facile de l'interrogation, afin d'avoir constamment sous la main un petit outil pour injecter un peu de tout, qui communique avec d'autres personnes ou des applicatifs, et ne prenne ni place, ni ressources excessive. La partie francophone me tient à cœur car beaucoup d'utilisateurs ne sont pas à l'aise avec la langue anglaise. C'est un frein à l'usage d'un outil et à l'informatique de manière générale. Ce n'est pas être particulièrement chauvin (même si je peux l'être parfois), mais apporter une petite pierre à la communauté du libre qui m'a gâté jusque là (Firefox, Ubuntu, LibreOffice et tant d'autres qui sont mon lot quotidien). --- Pour ceux qui ont tenu jusque là : félicitations ! J'espère qu'il vous servira. Si vous y trouverez votre intérêt, forkez, partagez, commentez, utilisez... ! Julien.