Marmotte, nouveau client Gopher en Rust !

14 December 2019

Dans un précédent article, j'ai présenté le protocole Gopher en perspective de pouvoir communiquer en consommant moins de ressources. Depuis, j'ai développé Marmotte, mon propre client Gopher avec le langage Rust dans le but d'apprendre ce nouveau langage et pour comprendre davantage Gopher.

Pourquoi avoir développé Marmotte ?

Compte-tenu des enjeux écologiques, je souhaite progressivement orienter mon travail vers des technologies de plus en plus basses, vers les « low tech ». Aujourd'hui, je suis devops et je travaille notamment avec le « cloud computing » (« informatique en nuage » en français). Avant de travailler vraiment sur des technologies très basses à base de matériaux comme le bois ou la pierre, je me prépare à descendre progressivement les marches de la « haute technologie ». Pour cela j’essaye de réduire mon usage de l'informatique en nuage et de réduire la consommation de ressources des logiciels que j'utilise.

Dans mes recherches sur les technologies alternatives, Gopher me semble être intéressant pour sa légèreté, sa simplicité et sa rusticité. J'ai décidé de développer Marmotte pour plusieurs raisons personnelles : tout d'abord, j'avais envie de sentir de la satisfaction à développer un petit projet que je me sens capable de mener à bien ; ensuite, je n'avais encore jusque maintenant jamais fait l'exercice de développer un logiciel suffisamment précis pour devoir lire des spécifications écrites, les comprendre et les implémenter ; enfin, j'avais déjà tenté d'apprendre le langage Rust en 2016 mais je n'avais pas réussi à accrocher ; ce petit projet était donc aussi l'occasion de retenter de l'apprendre.

Le choix du langage Rust

J'ai choisi le langage Rust car les arguments mis en avant par ses développeurs me semblent correspondre à ce que je recherche : un langage compilé performant ; plus économe en ressources ; fiable et stable. En effet, dans le précédent article j'expliquais que j'avais commencé à développer un client Gopher minimaliste en Ruby. Cependant j'ai constaté que quand bien même le script ne faisait quasiment rien de plus que le logiciel curl, il consommait déjà 106 Mo de RAM ! En comparaison, le client VF-1 en Python consommait 37 Mo, le navigateur Lynx en C 18 Mo, le client Stubb en Lua 6 Mo et mon client Marmotte en Rust 4 Mo (pour tester, j’ai fait charger la page gopherpedia.com [lien Gopher] et mesuré la VmSize du processus de chaque logiciel). J'apprécie Ruby pour la productivité que permet ce langage mais il n'est clairement pas sobre en ressources.

Pour développer Marmotte, j'ai commencé à apprendre Rust depuis les bases. J'ai lu consciencieusement les premiers chapitres du livre et pris le temps de bien assimiler les concepts. C'était un exercice assez long, mais comme je souhaitais réaliser un projet de qualité, j'ai réussi à rester patient. Il semblerait que Rust soit un langage long à assimiler mais qui permet de produire des logiciels de bonne qualité et plutôt vite une fois qu'on le maîtrise bien. Et en effet, aujourd'hui, alors que Marmotte n'est qu'à sa toute première version v0.1.0, et que je suis un développeur Rust débutant, j'estime que le client est prêt pour un usage quotidien sans bogue important. J'ai pris tellement de temps à gérer des cas d'erreurs que je me sens confiant à publier Marmotte.

Présentation de Marmotte

En développant Marmotte, j'ai souhaité qu'il soit un logiciel simple, minimaliste et fiable. Marmotte est donc un client Gopher pour le terminal en ligne de commandes. Je me suis notamment inspiré de VF-1 pour les fonctionnalités et l'ergonomie mais Marmotte proposera moins de fonctionnalités.

Marmotte doit me permettre de consulter des document textes et effectuer des recherches sur le Gopherspace. Ce sont ses seules fonctionnalités. Presque. Avec mes réflexions sur la réduction de notre consommation de ressources, j'aimerais implémenter dans Marmotte un système de cache de sorte à ce qu'il soit possible de naviguer à travers le Gopherspace sans avoir besoin de connexion Internet dès lors que l'on a déjà chargé la ressource auparavant. Il faut cependant penser à une manière d'invalider ce cache afin de récupérer une version plus récente des pages. Pour cela, j'envisage de permettre à l'utilisateur de forcer le rafraîchissement de la page lorsqu'il le souhaite.

Exemple d'utilisation de marque-pages dans Marmotte

J'ai conçu Marmotte comme un logiciel « low tech », assez simple, sans magie. L'utilisateur a le contrôle sur son comportement et toutes les informations sont affichées en cas d'erreur. Par exemple, j'ai constaté que certains documents Gopher pouvaient avoir des erreurs de syntaxe. Dans VF-1, le menu Gopher s'était affiché de manière altérée sans message particulier. Dans marmotte, j'ai choisi d'afficher un message d'erreur ainsi que la ligne d'origine de sorte à ce que l'utilisateur soit au courant qu'il y a un souci, mais lui laisse la possibilité de connaître cette ligne.

Illustration : dans VF-1 ce menu Gopher [lien Gopher] s'affiche comme ceci à la fin :

Thanks to everyone that has taken the time to try out
Bombadillo, installed it on their server, submitted issues,
or taken the time to contribute in other way. false

Dans marmotte, j'ai choisi de l'afficher comme ça :

		Thanks to everyone that has taken the time to try out
		Bombadillo, installed it on their server, submitted issues,
ERR		marmotte: Problem parsing line 112: Could not parse port in: "ior taken the time to contribute in other way. false	null.host	1"

Ça peut être un peu moins lisible dans Marmotte par rapport à VF-1 (peut-être aussi qu'il y a un meilleur moyen de rédiger le message), mais au moins on ne s'étonne pas de lire un false à la fin du texte. Ainsi j'espère qu'un utilisateur qui consulte son site Gopher via Marmotte va vouloir corriger la syntaxe de ses documents.

La liste des commandes possibles avec Marmotte

Une autre fonctionnalité que j'aimerais implémenter dans Marmotte serait le chiffrement de la connexion au serveur. Aujourd'hui le HTTPS est très répandu et tend à être la norme, mais dans Gopher il n'existe pas de spécification officielle équivalente. Je n'ai pas de bonnes connaissances en SSL/TLS, donc j'appréhende de devoir investiguer avant de pouvoir permettre la sécurisation de la connexion. De plus, VF-1 permet la connexion en SSL/TLS, mais peu de serveurs offrent cette option et si l'option SSL/TLS est activée par défaut, elle ralentit la navigation car il faut attendre l'échec de la tentative de connexion sécurisée avant de retenter via une connexion en clair.

Aussi, je me demande s'il ne serait pas plus simple de permettre la sécurisation de la connexion avec SSH qui me semble plus simple que SSL/TLS. J'estime que le principe des certificats dans SSL/TLS, même s'il permet la possibilité d'authentifier, est très complexe et fait partie de cette barrière à la compréhension de toutes la mécanique de HTTPS.

Conclusion

Je suis satisfait du travail accompli sur Marmotte car je considère que l'utilisation du langage Rust m'a permis de développer un logiciel de qualité. Même s’il est sûrement perfectible, avec 1000 lignes de code dont 300 de tests, Marmotte me semble être stable et prêt pour un usage quotidien.

Souhaitez-vous essayer Marmotte ? Il est sous licence libre CeCILL et installable soit avec les sources, soit directement avec le binaire depuis sa page Github.

Mots-clés : Open source, Gopher, Marmotte, Rust

Un commentaire ?

Vous avez repéré une erreur dans l'article ? Un point d'amélioration ? Vous pouvez envoyer vos commentaires par email à « blog arobase killiankemps.fr » avec pour objet « [Comment][fr][Marmotte, nouveau client Gopher en Rust !] ».
(Le « @ » a été remplacé par « arobase » afin que des robots malveillants ne puissent pas récupérer l'adresse email)

Envoyer un commentaire par email