URL: https://linuxfr.org/news/robert-un-logiciel-de-stockage-en-memoire-vive Title: Robert, un logiciel de stockage en mĂ©moire vive Authors: JulienG Ysabeau đŸ§¶, claudex, bubarđŸŠ„, palm123, BenoĂźt Sibaud et Davy Defaud Date: 2020ćčŽ04月20æ—„T02:06:30+02:00 License: CC By-SA Tags: rust, base_de_donnĂ©es, robert, redis, libreoffice et firefox Score: 31 Bonjour tout le monde, J’ai le plaisir, pour ce premier message sur _LinuxFr.org_, de vous annoncer un nouveau projet de stockage clé‐valeur en mĂ©moire vive. « Encore un » vous direz‐vous ? Certes. Voyons si j’arrive Ă  vous convaincre. _N. D. M. : Ă  ne pas confondre avec le protocole ROBERT (ROBust and privacy‐presERving proximity Tracing) qui vient d’ĂȘtre publiĂ© par l’INRIA et la Fraunhofer AISEC pour le suivi de contacts dans le cadre de la pandĂ©mie de Covid‐19._ ---- [Robert sur GitHub](https://github.com/JGarderon/Robert) ---- # 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 et importation vers des fichiers, scripting sur la base) ; - il est Ă©crit en Rust, ce qui lui garantit une qualitĂ© minimale (sans ĂȘtre exempt de bogues). Le (prĂ©)nom « Robert » me semblait donc tout indiquĂ©... Je suis Ă  l’origine de ce projet, Ă  la suite d’une [thĂšse professionnelle sur le modĂšle RDF appliquĂ© aux organisations et Ă  l’information](https://www.slideshare.net/nothus1/penser-son-systme-dinformation-apprhender-ses-volutions), soutenue en [dĂ©cembre dernier](https://www.slideshare.net/nothus1/penser-son-systme-dinformation-apprhender-ses-volutions-230728506). 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 un dĂ©veloppeur professionnel 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`. La documentation peut ĂȘtre mise Ă  jour localement depuis la commande `cargo doc` Ă  la racine. Le projet ne dĂ©pend d’aucune « caisse » (module) externe, volontairement, 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 ! À terme, il me semble tout de mĂȘme difficile de faire sans les expressions rationnelles, 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 (prĂ©cision utile : les accents sont pris en compte !). 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 est constituĂ©e 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 recueille 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 commandes (Ă  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 disponibles 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 Ă  analyser 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 depuis 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](https://fr.wikipedia.org/wiki/Langage_d%C3%A9di%C3%A9) 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. À terme, il sera possible d’avoir des scripts qui seront appelĂ©s durant l’exĂ©cution, ce qui permettrait des boucles ainsi que la dĂ©finition de fonctions. Rappel : un script dans ce contexte, ne gĂšre que la valeur de la base qui lui est soumise, 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 sers Ă  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 en mĂ©moire vive (VoltDB est son Ă©quivalent en SQL). Robert s’en inspire : stockage de sessions pour un site Web, de calculs provisoires, etc., 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 trouvez votre intĂ©rĂȘt, « forkez », partagez, commentez, utilisez !... Julien.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /