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.