Compare commits

..

1 commit

Author SHA1 Message Date
e18736feee
astroabe vibes 2023-07-01 12:00:51 +02:00
33 changed files with 239 additions and 346 deletions

View file

@ -6,7 +6,7 @@
\firstname{Quentin}
\familyname{Dufour}
\title{\large Freelance system developer}
\title{\large System developer at Astrolabe CAE}
\address{27 La Sauvageais}{35580 Goven}
%\mobile{+33 6 76 79 99 88}
\email{quentin@dufour.io}
@ -35,14 +35,19 @@
%\cventry{June 2012}{High School Diploma}{Lycée René Descartes}{Cournon d'Auvergne}{France}{Scientific High School Diploma with distinction.}
\section{Experience}
\cventry{Now\\Jan. 2020}{Deuxfleurs}{Association}{Rennes}{France}{
\underline{2023} NLnet / NGI Assure Grant - Working on Aerogramme, an encrypted IMAP-compatible MDA.
\newline{}
\underline{2022} NGI Pointer Grant - Working on Garage, a geo-distributed S3-compatible object store.
\cventry{Now\\Oct. 2022}{Astrolabe CAE}{Cooperative}{Rennes}{France}{
NLnet / NGI Assure Grant - Working on Aerogramme, an encrypted IMAP-compatible MDA.
}
\cventry{Now\\Oct. 2022}{Rapsodie}{Startup}{Paris}{France}{
Designing and developping the cloud infrastructure (Kubernetes, Python, FastAPI, Apache Beam, GCP).
}
\cventry{Sep. 2022\\Sep. 2021}{Deuxfleurs}{Association}{Rennes}{France}{
NGI Pointer Grant - Working on Garage, a geo-distributed S3-compatible object store.
}
\cventry{Aug. 2017\\Feb. 2017}{French National Cybersecurity Agency (ANSSI)}{Internship}{Paris}{France}{
Migration and improvement of hardened Linux containers (LXC).
}

View file

@ -2,7 +2,7 @@
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>{{ page.title | default: "Accueil" }} | {{ site.name }}</title>
<title>{{ site.name }}</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="author" content="{{ site.author }}">
<meta name="description" content="{{ site.name }}. {{ site.description }}">

View file

@ -3,7 +3,7 @@ layout: post
slug: online-upgrade-fedora
status: published
sitemap: true
title: Online Fedora Upgrade
title: Upgrade Fedora online
description: How to efficiently destroy your distribution
disqus: false
category: operation

View file

@ -1,131 +0,0 @@
---
layout: post
title: Réflexions suite au FOSDEM 2024
date: 2024-02-06
status: published
sitemap: true
category: divers
description: Notes du FOSDEM 2024
---
Le 3 et 4 février 2024 j'étais à Bruxelles pour le FOSDEM, une conférence
pour les développeur-euses de logiciel libre. Ouverte à tout le monde,
la conférence est monstrueuse : plus de 800 présentations, sur plus de 80 *tracks*,
avec plusieurs dizaines de milliers de participant-es.
Cette année je présentais [Aerogramme](https://aerogramme.deuxfleurs.fr/), un serveur IMAP développé au sein de Deuxfleurs.
La présentation était axée sur les fonctionnalités de robustesse aux pannes dudit logiciel.
Vous pouvez retrouver toutes les informations sur cette présentation sur la page dédiée de la conférence,
dont une captation vidéo : [[Servers] Aerogramme, a multi-region IMAP server](https://fosdem.org/2024/schedule/event/fosdem-2024-2642--servers-aerogramme-a-multi-region-imap-server/). Plutôt que de vous présenter ce que j'ai vu, je vais plutôt me focaliser sur les réflexions que ça a généré.
Je commence par les emails, mais le gros du billet est autour de la conception de système d'exploitation distribués.
## Emails
Ça faisait 10 ans qu'il n'y avait pas eu de track email au FOSDEM. D'où le nom "modern email" cette année, comme pour lancer un nouvel élan.
C'était une expérimentation qui a été très fructueuse : les développeur-euses ont répondu présent.
La journée a commencé par la dimension "protocole" des emails : pourquoi il faut abandonner STARTTLS, les subtilités d'IMAP, et l'intégration d'Unicode dans les emails. Globalement, c'est très convaincant qu'il ne faut *vraiment* pas utiliser STARTTLS, et encore moins l'implémenter, c'est un nid à problème. Rien de nouveau lors de la présentation sur IMAP, deux points qui m'ont bien plu : on peut pas lexer IMAP, *knowledge is disappearing* et la subtilité des literals dans IMAP.
C'est emersion (Simon) qui a d'abord essayé d'écrire un lexer+parser pour IMAP, et ça ne marche pas. Les lexer+parser, c'est vraiment la façon élégante, qu'on t'apprend quand tu fais de la théorie des langages, mais ça oblige de concevoir ton langage avec des contraintes, pour pas qu'il soit ambigu. IMAP a été conçu de façon très organique, et ne répond pas à ces critères. Du coup c'est moins élégant, moins efficace, mais on utilise un parser combinator. D'ailleurs j'en étais venu à la même conclusion pour les emails (c'est à dire IMF/MIME).
En effet les savoirs disparaissent. On a pu voir ça sur Cobol, on a le cas pour les emails. Ça vient heurter des croyances, du progrès linéaire sur tous les aspects,
y compris sur les savoirs. Cette critique n'est pas nouvelle, mais elle est toujours bonne à rappeler : les connaissances, le savoir, ça s'entretient.
Ensuite, dans IMAP, il y a cette idée qu'il y a besoin de coordination entre client et serveur. C'est à dire qu'en tant que client, j'ai besoin de surveiller ce que le serveur m'envoie, pour savoir dans quel état je suis. Et donc un des exemples, c'est la gestion des literals.
Et puis sur la question d'unicode, le speaker était fier de dire que c'était la première RFC qui simplifiait les protocoles plutôt que de les complexifier.
En effet, plein de trucs qui étaient compliqués car demandait des encodings spéciaux, disparaissent dès lors que tu supportes UTF-8 : tu annonces ton support,
et tu envoies de l'UTF-8 brut. Le présentateur revenait souvent sur cette importance de la simplification : plutôt que d'essayer de gérer les erreurs silencieusement, de réécrire les messages, etc. il a été choisi de simplement refuser l'envoi si un email UTF-8 tentait d'être délivré à un serveur qui ne le supporte pas, en vu de simplifier le debug, et avec l'idée que c'est toujours plus simple d'implémenter ce support que de coder des workarounds.
S'en est suivi un ensemble de présentation sur JMAP, d'abord par Fastmail, qui sont ceux qui l'ont proposé et le poussent. Ils expliquent à quel point le protocol est formidable comparé à IMAP. Mais aujourd'hui, il n'y a aucun client de référence pour pousser l'adoption de JMAP. Fastmail a bien un très bon client, mais ne veulent pas le rendre open source / libre. Soit disant JMAP est simple, mais en réalité en terme de fonctionnalités, il correspond à un IMAP avec un très grand nombre d'extensions : je ne pense donc pas tenter d'implémentation avant d'avoir toutes les extensions dans IMAP. Et une fois ces extensions dans IMAP, la différence en terme d'expérience n'est probablement pas si grande. Pire, ils se comparent toujours à IMAP, mais leur vrai concurrent c'est EAS (Exchange Active Sync), le protocole de Microsoft, présent dans tous les iPhone et Android depuis le début. Lui aussi est basé sur HTTPS, lui aussi supporte d'un seul tenant réception + envoi d'email, calendrier + contact. Sauf que lui possède plein d'excellents clients et des intégrations natives partout.
Il y a cependant quelques travaux sur JMAP. D'abord le client Android ltt.rs qui semble faire référence, des gens aussi qui développent des bibliothèques pour porter d'anciens protocoles vers JMAP, et puis Apache James semble supporter JMAP également. D'ailleurs Apache James, pur produit de l'écosystème Java, semble être un acteur assez sérieux dans le monde de l'email, je ne serais pas surpris qu'on en entende d'avantage parler dans les années à venir. Linagora semble avoir des déploiements importants, particulièrement dans le système de santé français. Impressionant. Pour revenir à JMAP, je pense donc définitivement qu'il va falloir à un moment qu'il se positionne face à Exchange Active Sync, d'ailleurs il y avait une présentation de [Grommunio](https://grommunio.com/) sur une intégration complète d'Exchange dans leur groupware C++ / PHP, qui démontrait bien encore la pertinence de EAS. Si JMAP a bien un argument en sa faveur, c'est l'absence de brevets logiciels, brevets qui plannent au dessus de Exchange, mais [brevets logiciels qui ne semblent pas avoir droit de cité en France](https://www.lemonde.fr/planete/article/2005/02/17/michel-rocard-ferraille-contre-le-brevet-logiciel_398497_3244.html), d'où [VLC](https://www.videolan.org/) d'ailleurs...
Je n'ai pas assisté à toutes les présentations de la room email, je pense potentiellement les rattraper en VOD plus tard.
Pas de révélations sensationnelles, content de voir que les emails intéressent des gens, je pense toujours que EAS est plus pertinent que JMAP, et qu'une bonne implémentation d'IMAP c'est un bon point de départ...
## Système
La session sur les microkernel+unikernel commençait par un *positioning talk* d'[Alex](https://adnab.me/).
Alex s'intéresse à l'infrastructure logiciel de [Deuxfleurs](https://deuxfleurs.fr/), et ce talk avait entre autre
pour objectif de collecter des retours, des idées, et stimuler les discussions pour dépasser des problèmes qu'on rencontre. Nous y voilà donc...
Le corps de sa proposition, selon moi, c'est qu'il note une inadéquation entre, d'une part,
le modèle mental qu'on se fait des différents composants de notre infrastructure,
et d'autre part, les interfaces qui sont à nos dispositions qui ne sont pas adaptées.
L'enjeu est donc de définir les concepts mobilisés par notre modèle mental, et les problèmes que nous posent les interfaces actuelles.
Alex note que notre modèle ressemble beaucoup au design des microkernels : des processus indépendants qui communiquent entre eux via des *IPC* (InterProcessus Communication).
*Selon moi, on peut très bien envisager aussi notre modèle comme le modèle d'acteur d'Erlang aussi. Et aussi l'écosystème microservice actuel. En fait, chaque approche va focaliser sur un aspect différent du problème. L'approche microkernel ne s'est pas intéressée au réseau, mais elle a beaucoup travaillé la question des permissions et de la sécurité à travers ce système de processus échangeant par messages. Je pense par exemple à [l'object-capability model](https://en.wikipedia.org/wiki/Object-capability_model) de [sel4](https://sel4.systems/). Elle a essaimé aussi dans des OS traditionnels, je pense par exemple à [Capsicum](https://www.cl.cam.ac.uk/research/security/capsicum/papers/2010usenix-login-capsicum.pdf) dans FreeBSD. L'approche d'Erlang s'intéresse quant à elle au réseau et à la robustesse : elle est nativement distribuée et les processus sont sans état. Quant à la robustesse, Erlang a toute une réflexion sur "laisser les processus crasher plutôt que de récupérer les erreurs", avec un système de surveillance et redémarrage, dont les vertus sont expliqués dans [The Zen of Erlang](https://ferd.ca/the-zen-of-erlang.html). Enfin l'écosystème microservice s'est intéressée au chemin de migration, comment graduellement aller vers ce modèle processus/messages, comment l'intégrer à des workflow de développement.*
Sur la question des problèmes des interfaces actuelles, Alex note qu'il y a conflit pour accéder à des ressources partagées.
Par exemple, le système, le daemon docker, et d'autres daemons se "battent" pour accéder à netfilter. Bien sûr, ils ont chacun leur table,
mais un rechargement complet de ce dernier peut arriver, et c'est là qu'on voit que la gestion réseau n'a pas été pensée pour plusieurs processus.
De la même manière, on a ce problème pour le système de fichier : par défaut, et malgré les permissions, c'est un seul espace de nom qui est partagé avec tout le monde.
Et puis enfin, les interfaces sont conçues pour la façon de faire de l'ordinateur des années 1980 : un seul ordinateur, avec un seul processeur, des bandes magnétiques pour le stockage, etc. Tout ça n'est, d'une part, pas forcément la meilleure façon d'utiliser le matériel actuellement, et d'autre part, empêche de considérer certains usages à travers le réseau. Typiquement, la norme POSIX, d'ailleurs sur certains aspects très dure à implémenter et à utiliser correctement, a tendance a sédimenter l'écosystème.
*De cette inadéquation "modèle mental" et "interfaces disponibles", j'en tire deux problèmes : 1) un mauvais usage des ressources à disposition surtout dans le cas d'un cluster, et 2) des problèmes de correctness, c'est à dire que c'est très difficile de raisonner correctement sur un système, et donc de ne pas avoir de bugs.*
Alex propose donc une architecture qui soit composée d'un orchestrateur microkernel qui schedulerait seulement des machines virtuelles, d'abord des machines Linux embarquant un seul processus pour la rétro-compatibilité avec un schéma Docker, et pour le futur, des machines virtuelles unikernel, où le logiciel étant mélangé au système d'exploitation, seul les fonctionnalités du système d'exploitation utilisée par le logiciel sont embarquées. Chaque processus (linux VM ou unikernel) communiqueraient ensemble alors via des API bas niveaux comme de l'IP ou le protocole VirtIO du noyau Linux. Je pense qu'une idée très forte qu'on trouve dans la présentation de Alex, c'est l'isolation des ressources : c'est la critique qu'il fait aux conteneur Linux, de mal isoler. Et je pense que le choix d'un hyperviseur avec des machines virtuelles est motivée dans cette optique d'isolation des ressources.
*La question de l'isolation des ressources est également abordée par Lennart Poettering dans son billet [systemd for Administrators, Part XVIII](https://0pointer.net/blog/projects/resources.html) :*
> An important facet of modern computing is resource management: if you run more than one program on a single machine you want to assign the available resources to them enforcing particular policies. This is particularly crucial [...] for large installations such as cloud setups, where resources are plenty, but the number of programs/services/containers on a single node is drastically higher.
> Traditionally, on Linux only one policy was really available: all processes got about the same CPU time, or IO bandwith, modulated a bit via the process nice value. This approach is very simple and covered the various uses for Linux quite well for a long time. However, it has drawbacks: not all all processes deserve to be even, and services involving lots of processes (think: Apache with a lot of CGI workers) this way would get more resources than services whith very few (think: syslog).
*Je pense que c'est important de mentionner ça, parce que dans un monde où on est matrixé par la sécurité, l'isolation des ressources est aussi très désirable
en terme de stabilité des performances et pour éviter des bugs.*
Alex conclut son talk en se demande comment mobiliser l'existant pour aboutir vers une infrastructures dont les interfaces seraient plus
en adéquation avec notre modèle mental, que ce soit du côté des microkernels, des entrées/sorties, ou encore des frameworks & OS existants.
Lors de la session question/réponse, il y a une intervention qui m'a bien plus : "comment pensez-vous gérer la network transparency?". Alex a répondu que toutes nos applications communiquent déjà à travers le réseau.
*J'ai le sentiment que la question n'était pas exactement là, mais plus comment on connecte des processus entre eux, bref, une question de bus, de service discovery, de service mesh. Par exemple dans [la documentation de Erlang](https://www.erlang.org/doc/reference_manual/distributed.html), on peut lire :*
> A distributed Erlang system consists of a number of Erlang runtime systems communicating with each other. Each such runtime system is called a node. Message passing between processes at different nodes, as well as links and monitors, are transparent when pids are used. Registered names, however, are local to each node. This means that the node must be specified as well when sending messages, and so on, using registered names. The distribution mechanism is implemented using TCP/IP sockets. How to implement an alternative carrier is described in the ERTS User's Guide.
*Il me semble important aussi de lire les réflexions qui ont eu lieu dans le monde du microservice : que ce soit [istio](https://istio.io/), [Consul Connect](https://developer.hashicorp.com/consul/docs/connect), ou le [Dapr](https://dapr.io/) de Microsoft. Actuellement, Deuxfleurs utilise un modèle basé sur le service discovery via DNS. Il a plusieurs faiblesses : pas de contrôle de permission, pas de gestion correcte des crashs - les services ne refont pas toujours de résolution quand un service crash et gardent une IP obsolète, pas de gestion du chiffrement, etc. L'article [Microservices: The Journey So Far and Challenges Ahead](https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8354433) remet bien ces problèmes et explique pourquoi l'industrie s'est déplacée vers les Service Mesh. Et puis, il me semble important d'aller creuser un peu plus loin aussi : du côté de [dbus](https://fr.wikipedia.org/wiki/D-Bus), du côté de [Greybus](https://lwn.net/Articles/715955/), ou même du côté de [Binder](https://elinux.org/Android_Binder) dans Android. Et puis de pousser encore un peu plus loin, et d'aller voir les [Enterprise Service Bus](https://fr.wikipedia.org/wiki/Enterprise_service_bus) et les [Message Brokers](https://en.wikipedia.org/wiki/Message_broker). Ainsi on couvre - à ma connaissance - l'ensemble des approches pour échanger des messages.*
## Discussion
Voilà, c'est la fin de mes notes commentées du talk, maintenant j'arrête d'écrire en italique pour donner mon avis. Je trouve le sujet d'interroger notre modèle mental au regard des interfaces utilisés très pertinent, je pense que penser l'isolation des ressources à travers un système de processus qui communiquent entre eux est très fécond.En fait ça vient construire toute une réflexion sur 1) comment on gère ces processus et 2) comment on gère ces communications. Et quant on regarde ce qu'on fait à travers cette analyse, ça sent toujours la bidouille, on est toujours en train de "lutter contre le système".
Par contre, pour moi la solution n'est pas "un microkernel", un "unikernel" ou un "hyperviseur". Aujourd'hui, quand on pense aux microkernels, on pense surtout à isoler les drivers, des composants bas niveau du système, etc. Soit des choses aujourd'hui qui ne nous posent pas de problème : Linux juste marche dans notre cas. N'en faisons pas un faux problème juste parce qu'on trouve son design peu élégant : il compense ça par une énorme communauté de gens très compétents et des processus de développements qui fonctionnent. De toute manière, quand il s'agit de tourner sur des vrais ordinateurs, l'enjeu ce sont les drivers, et ils n'existent pas sur les microkernels actuels. Enfin, c'est un monstre d'I/O et de performances, avec des gens qui ont étudié ses différents schedulers (processus, I/O, etc), qui a de nombreux outils de debug, d'observation, qui n'ont pas d'égale ailleurs.
Selon moi, dans le débat, on confond le noyau Linux, avec la Linux Programming Interface, et plus particulièrement POSIX ou les [Single UNIX Specification](https://fr.wikipedia.org/wiki/Single_UNIX_Specification). On a cette idée que Linux isole mal parce qu'il expose une surface d'attaque trop grande à travers ses appels systèmes (pour POSIX/SUS). Il faudrait donc un hyperviseur avec des machines virtuelles, ou la version optimisée : un unikernel, qui expose une surface beaucoup plus petite et plus simple, pour résoudre ce problème. Mais pourquoi ? Si le problème c'est l'interface, c'est cette interface qu'il faut réduire ! Et c'est super facile, ça s'appelle [seccomp](https://fr.wikipedia.org/wiki/Seccomp). Dans sa version originelle, seccomp ne permet que `read`, `write`, `exit` et `sigreturn` sur des descripteurs de fichier déjà ouvert. In fine, c'est une surface d'attaque bien moins grande, qui essaient d'émuler [des périphériques obscures](https://www.pandasecurity.com/en/mediacenter/venom-the-security-vulnerability-in-your-floppy-drive/). Et puis quand bien même on trouverait ça encore trop, pourquoi ne pas envisager de patcher Linux pour enlever ce qui ne convient pas ? Ça me semble bien moins ambitieux que de repartir sur un système complètement différent.
Alors, on pourrait toujours avancer que des outils comme [Firecraker](https://firecracker-microvm.github.io/) ne gardent que le strict minimum, et que donc, il ne s'agit plus que de choisir si notre interface est [VirtIO](https://fr.wikipedia.org/wiki/Virtio) ou un stream sur [un file descriptor](https://en.wikipedia.org/wiki/File_descriptor) Linux. Que c'est bonnet blanc et blanc bonnet. Mais ce que j'observe, c'est que dans le monde des hyperviseurs, on fait surtout des boites noires. Alors on rationalise : on déploie plein de boites noires qu'on gère de manière identique, mais on a déplacé beaucoup des problèmes dans ces boites noires. Avec VirtIO, on a du réseau et du stockage, mais on n'a toujours pas de bus de communication. Notre boite noire devient un seul processus, mais à l'intérieur, il y a plusieurs processus en réalité. On a donc dupliqué plein de choses : des schedulers de processus, mais aussi des scheduler d'I/O. Et puis un scheduler ça observe son environnement, ça fait des suppositions, et ça prend des décisions. Quid des interférences entre ces schedulers ? Je sais d'expérience que ça arrive. Et puis on a une API de bas-niveau, certe simple, mais qui embarque avec elle très peu d'informations sur le contexte, elle est très peu descriptive, on perd en expressivité. Et donc on donne moins de latitude au scheduler bas-niveau.
Un exemple : Linux utilise la RAM de deux façons, directement pour les applications, et pour du cache. Certaines applications utilisent astucieusement cette capacité de cache, comme LMDB. Mais du point de vue de l'hyperviseur, il n'y a pas de différence entre le cache - récupérable - et la mémoire vraiment utilisée. On peut donc se retrouver à prendre des décisions sous-optimales. Et puis, enfin, en faisant des silos, on se prive de la mutualisation de certaines tâches. Pour provoquer : pourquoi on a un problème avec Electron (le fait de faire tourner un moteur Javascript par application) mais pas avec les unikernel ?
Enfin, il me semble nécessaire de faire une critique des unikernels du point de vue de [la "loi de Conway"](https://en.wikipedia.org/wiki/Conway%27s_law) : les logiciels reflètent l'organisation sociale des gens qui l'ont produit. Et les interfaces logicielles sont la représentation des frontières entre les groupes. Quand on fait de l'unikernel, l'interface correspond à ce qu'on appelle de l'[IaaS](https://fr.wikipedia.org/wiki/Infrastructure_as_a_service). Or il ressort lors de mes échanges que le bon niveau est plutôt du côté de ce qu'on appelle [PaaS](https://fr.wikipedia.org/wiki/Platform_as_a_service) / [Serverless](https://fr.wikipedia.org/wiki/Informatique_sans_serveur). C'est d'ailleurs ce qu'ont confirmé les deux sessions suivantes : [Genezio](https://genezio.com/) utilise des unikernels mais ne les expose pas à ses clients directement, elle leur propose du PaaS. [Bunny](https://fosdem.org/2024/schedule/event/fosdem-2024-3456-a-modular-approach-to-effortless-and-dependency-aware-unikernel-building/) est un builder sur le modèle de Docker pour packager des applications Unikernel, mais en réalité la plupart des gens veulent surtout faire un `git push` et que leur code se déploie seul.
Autrement dit, les technologies changent (de PHP au Serverless Typescript), mais il semble se dégager une constante : il est avisé de placer la frontière, l'interface, entre les développeur-euses qui encodent un métier dans leur langage de programmation d'une part, et ceux qui encodent une abstraction du matériel d'autre part. Cette abstraction doit permettre aux premiers d'exprimer leurs intentions, et au second d'y ajouter des contraintes qui permettent une utilisation efficiente du matériel. L'API S3 est un bon exemple : on peut stocker un fichier binaire de taille arbitraire, faire plein de choses avec, il très facile à servir, et en même temps, les contraintes sur l'API nous permettent de faire du géo-distribué ce que ne permet pas POSIX. A mon sens, ce modèle fonctionne très bien avec la philosophie microkernel : par défaut on n'a pas confiance dans le processus et on a un système standardisé avec une vérification systématique des permissions, avec une granularité aussi fine que voulu, pour accéder aux ressources.
Certaines personnes lors de la présentation envisageaient les unikernels comme des "libOS". Et c'est peut-être là, selon moi, que se trouve une issue intéressante au concept : on pourrait enlever/désactiver certains composants de Linux, et faire nos propres composants microkernel à partir d'une libOS. Par exemple, tirer une stack QUIC d'une libOS, la wrap dans notre propre système de permission, et l'intégrer à notre système microkernel like.
## Proposition
Mon système idéal pourrait se résumer à : un Linux, dont on ne garderait que les descripteurs de fichier, qui formeraient la base d'un système de capability systématique.
Plus spécifiquement un noyau Linux qu'on aurait potentiellement compilé, placé dans une partition EFI, potentiellement sans initramfs, ni système de fichier, avec un système d'initialisation qui soit un binaire de notre cru. Il serait en charge de lancer un ensemble hardcodé de process (possiblement en se forkant) : un daemon de membership pour s'interconnecter avec les autres serveurs de la grappe, connaitre leur adresse réseau et leurs services, un daemon de message bus - aussi appelé service mesh - qui se chargerait du routage des messages, des contrôles de permission, du chiffrement, etc., un daemon d'orchestration, qui serait en charge de démarrer les processus sur le noeud local avec les paramètres d'isolation seccomp et cgroup (à minima), et de passer les descripteurs de fichier dans le process et enfin un daemon de debug avec un ssh qui permette de se connecter et inspecter le système.
Tout le système serait construit sur les descripteurs de fichier, un processus n'aurait pas accès à l'interface de programmation de Linux (hormis les quelques appels systèmes pour manipuler des descripteurs de fichier déjà ouverts, grâce à seccomp toujours). Si un processus veut accéder à l'heure, à un timer, ou tout autre chose, il doit récupérer un descripteur de fichier. Je pense que ce système est particulièrement efficace : avec `poll`, puis `epoll`, et maintenant `io_uring`, de nombreuses ressources sont exposables via un descripteur de fichier maintenant. Ça veut aussi dire, que dans plein de cas, on peut éviter d'ajouter des surcouches : un daemon peut setup une connexion TLS avec [kTLS](https://docs.kernel.org/networking/tls.html) et passer le descripteur au process, qui alors fait du TLS sans s'en rendre compte, et de manière bien plus efficiente que notre système de reverse proxy actuel. Pour des cas spécifiques qui ne sont pas directement supportés par le noyau Linux, alors le descripteur de fichier serait une unix domain socket ou un pipe vers le daemon parent qui se chargerait du travail et des vérifications. Certains processus plus privilégiés pourraient donc avoir accès à quelques syscalls du domaine qu'ils gèreraient. On aurait par exemple un processus qui aurait accès aux syscalls de netfilter, avec qui ont communiquerait à l'aide de UNIX Sockets, pour demander des configurations. Il vérifierait alors les permissions, serait conçu pour gérer correctement cet objet partagé, et appliquerait les modifications.
Quelques précisions : quand on `fork` + `exec` avec Linux, les file descriptors ouverts sont passés au processus enfant. Mais se pose la question quand le processus est démarré : comment peut-il obtenir de nouveaux descripteurs ? À travers un appel système comme [pidfd_getfd](https://man7.org/linux/man-pages/man2/pidfd_getfd.2.html) ou via [SCM_RIGHTS](https://man7.org/linux/man-pages/man7/unix.7.html). Maintenant on peut imaginer que l'init crée un canal de communication entre notre daemon de message et notre orchestrateur au démarrage. Lorsque l'orchestrateur veut démarrer un nouveau processus, il demande - en suivant la description du service - au message bus les descripteurs de fichiers demandés - comme écouter sur un port, ouvrir une connexion TCP, etc. Le message bus les renvoie à l'orchestrateur, qui démarre le service en passant ces descripteurs de fichier. Dans le cas où le service enfant veut intéragir directement avec le message bus, par exemple parce qu'il est amené à ouvrir des connexions dans son cycle de vie, l'orchestrateur peut demander au message bus d'ouvrir une paire de descripteur de fichier vers lui-même avec des restrictions de permissions indiquées par l'orchestrateur, et passer ce descripteur à l'enfant.
La rétro-compatibilité peut alors s'envisager avec des outils comme [gVisor](https://gvisor.dev/). Le système de fichier pourrait être émulé, ainsi que beaucoup d'autres aspects. Ce dont on aurait vraiment besoin, comme le réseau par exemple, serait alors intercepté, et les appels convertit pour intéragir avec le message bus. Mais de manière générale, tout ce qui permet d'intercepter les syscalls est envisageable. Ainsi un `LD_PRELOAD` avant une libc est envisageable aussi, voire une libc spécifique, possiblement il y a des choses à creuser du côté de emscripten.
On pourrait alors imaginer un service de serverless/lambda function sur ce modèle. En gros le principe d'un système de ce genre, c'est de charger le code de l'utilisateur qu'en cas de besoin. C'est un peu la version cloud de [inetd](https://fr.wikipedia.org/wiki/Inetd) si vous préférez. Donc on aurait un daemon web qui écouterait. Lors de la réception d'une requête HTTP, il scannerait le champs Host de la requête et son URL. En fonction de cette dernière, il demanderait à l'orchestrateur de démarrer le service adéquat, et de connecter ses descripteurs de fichier pour gérer la requête/réponse. Là encore, si l'utilisateur veut que son service puisse accéder à des ressources autres, il devra les déclarer au moment de publier son code, et ne pourra pas outrepasser ce qui lui est permis.
L'idée que je présente est partiellement discutée dans un papier intitulé [A capability inspired low level security model based on modern Linux kernels](http://arkanis.de/projects/2013-01%20Capabilities/A%20capability%20inspired%20low%20level%20security%20model%20based%20on%20modern%20Linux%20kernels.pdf). Ma proposition se différencie dans le sens où, pour contourner certaines limitations des descripteurs de fichier, j'envisage des daemons en espace utilisateur qui se chargeraient de réduire le scope. Il est bon de noter, en plus de Capsicum, le cas de [Cloud ABI](https://lwn.net/Articles/674770/). Pour moi, Capsicum, à vouloir moduler ce que fait le descripteur de fichier se trompe : ça doit rester un stream simple, l'important c'est qui il y a au bout. Le projet que j'envisage est justement de définir ces composants (orchestrateur, message bus, etc.) dans un monde où on a que des descripteurs de fichier. CloudABI se concentre uniquement sur la rétro-compatibilité : comment s'assurer que les processus existants, supposant un POSIX/interface de programmation Linux vont bien se comporter et ne vont pas crasher/silencieusement downgrade vers des comportements indésirables (par exemple pour la cryptographie et la génération d'aléatoire). C'est intéressant mais orthogonal.
## Conclusion
J'ai vu deux trois autres choses au FOSDEM. En vrac : j'ai bien aimé [la présentation de Garage](https://fosdem.org/2024/schedule/event/fosdem-2024-3009-advances-in-garage-the-low-tech-storage-platform-for-geo-distributed-clusters/) par Alex, j'ai beaucoup apprécié aussi le lightning talk de Emily Omier [Project websites that don't suck](https://fosdem.org/2024/schedule/event/fosdem-2024-3154-project-websites-that-don-t-suck/) : très pertinent, très bien exécuté. Plein de monde, de food trucks, de stands, de présentations, je n'ai pas essayé de tout faire : j'ai essayé de me focaliser seulement sur ces deux points. Si vous avez un billet de blog sur votre FOSDEM, je peux le référencer en bas de celui-ci.

View file

@ -1,57 +0,0 @@
---
layout: post
title: Quelle est la capacité de Deuxfleurs ?
date: 2024-04-27
status: published
sitemap: true
category: operation
description: Évaluer la capacité d'hébergement de sites webs statiques de Deuxfleurs.
---
De part son côté atypique (de vieux PC de bureau reconvertis en serveurs derrière des connexions FTTH grands publics avec beaucoup de logiciels maisons - tricot, garage, etc.), les usager-es de Deuxfleurs ne savent pas trop quoi attendre en terme de performance. De mon point de vue d'opérateur, c'est dur également d'évaluer les capacités de Deuxfleurs, à part en disant qu'on a pensé notre solution pour mutualiser les usages, et donc que peu de machines puissent servir à beaucoup de monde.
Commençons par quelques faits : au 27 avril 2024, Deuxfleurs a 8 serveurs (3 à Orsay, 2 à Lilles, 3 à Bruxelles).
Il n'y a que 2 serveurs / 8 qui reçoivent les requetes : en effet, notre configuration IPv4 ne permet pas d'avoir plus d'un répartiteur de charge HTTP par zone géographique, et notre zone géographique belge est encore en chantier. Chaque serveur est connecté en ethernet 1Gb/sec et on a 300Mbps+ entre Proximus et Free (en gros c'est une approximation de notre bande passante sur Internet, même si ça varie en fonction des destinations et du moment observé bien entendu...). Avec 2 répartiteurs de charge, on estime donc à 600Mb/s notre bande passante sur le réseau (2x 300Mb/s), bien entendu après il faut du logiciel qui puisse gérer ça.
Chaque serveur est à peu prêt identique : un ordinateur de bureau milieu de gamme de 2013. Typiquement, en terme de processeur on a du [Intel(R) Pentium(R) CPU G3420](https://ark.intel.com/content/www/fr/fr/ark/products/77775/intel-pentium-processor-g3420-3m-cache-3-20-ghz.html) et entre 8Go et 16Go de RAM par serveur.
Au total, Nomad, un de nos outils de gestion, rapporte un total de 78Go de RAM et 16 CPU (répartis en 8 machines physiques donc).
En terme de stockage, on a 4To de stockage à Lille, 1.5To à Bruxelles, 3To à Orsay. Ça fait seulement 1.5To utilisable par Garage, car on requiert une duplication sur 3 sites pour la robustesse, et Bruxelles n'a que 1.5To (c'est normal, c'est la "zone" en chantier aujourd'hui).
Avec notre politique de 200Mo/site max, ça fait quand même déjà une capacité de 7 500 sites webs. On monte à 30 000 sites webs si on considère 50Mo (la taille réservée à la création du site, avant l'augmentation du quota). Si on passe à Bruxelles à 3To pour "rattraper" les autres sites, on double le nombre de sites web hébergeables. De plus, aujourd'hui on trouve des disques durs 2.5" à 4To, ce qui veut dire qu'on pourrait passer entre 8To et 15To par zone géographique sans changer radicalement notre infrastructure (même boitier, meme enveloppe de consommation electrique, etc.). Dans ce cas hypothétique, on dépasse les 100 000 sites webs hébergeables. Bien sûr à chaque fois, c'est en supposant qu'on héberge que des sites webs : mais on peut diviser par 2 les chiffres, et se dire qu'on alloue le reste aux autres services, et ça reste étourdissant !
Se pose maintenant la question de la montée en charge, combien de requêtes/secondes on peut traiter. Aujourd'hui on a un ~10 req/sec continu (majoritairement du à Matrix et Sogo, des protocoles de chat & email respectivement au dessus de HTTP qui font du polling, c'est très en dessous côté hébergement web garage) qui n'ébranle pas franchement nos serveurs. On va donc faire du *scalability testing* pour voir jusqu'où on peut monter. Il faut savoir que le pire cas pour nous, c'est quand un site web devient populaire d'un seul coup, et que tout le monde s'y connecte en même temps avec un cache froid, par exemple parce qu'un tweet devient viral ou des notifications push sur mobile envoyés par une application. On va donc prendre ce cas pour notre test.
*Notez que pour les notifications mobiles, plutôt que de déployer d'avantages de serveurs pour gérer le pic de trafic, il est plus avisé d'échelonner leur envoi auprès des utilisateurs. C'est à dire envoyer un premier lot de notifications à 10% des utilisateurs, attendre 20 minutes, envoyer le 2nd lot, etc. Et oui, c'est aussi bête que ça parfois...*
Notre cobaye sera ce propre blog, et plus exactement sa page d'accueil et ses 8 ressources à charger. J'utilise l'outil [k6](https://k6.io/) pour ce test qui n'a pas vocation à être exhaustif, pour info voici le script de test :
```js
import http from 'k6/http';
export default function () {
http.get('https://quentin.dufour.io');
http.get('https://quentin.dufour.io/assets/css/style.css');
http.get('https://quentin.dufour.io/assets/css/typo.css');
http.get('https://quentin.dufour.io/assets/images/favicon.ico');
http.get('https://quentin.dufour.io/assets/fonts/MerriweatherRegularLatin.woff2');
http.get('https://quentin.dufour.io/assets/fonts/MerriweatherBoldLatin.woff2');
http.get('https://quentin.dufour.io/assets/fonts/MerriweatherItalicLatin.woff2');
http.get('https://quentin.dufour.io/assets/fonts/Symbola.ornements.woff2');
}
```
[→ Accéder au rapport complet ←](https://quentin.dufour.io/k6/qdu-100vu.html)
Je n'ai volontairement pas poussé l'infrastructure au maximum, mais on tient sans problème 100 utilisateurs en instantané, ce qui fait ~800req/sec et 8Mo/sec de transfert de données. Sur 1 minute, ça fait 6 000 utilisateurs. Quand on était en page d'accueil sur Hacker News, on a vu que les visites s'étalaient en réalité plutot sur 1h ou 2h, meme si le trafic n'était pas réparti de manière homogene, mais plus sous la forme d'une gaussienne. Sans faire les calculs, je dirais qu'en cas de "coup de projecteur", on peut tenir les ~10 000 utilisateurs sans trop de soucis. En informatique, on pense souvent en terme d'ordres de grandeurs. À mon avis, l'ordre de grandeur suivant, un burst de ~100 000 utilisateurs est imaginables sans remettre en question notre architecture mais avec des améliorations à différents endroits. Par contre l'ordre de grandeur suivant, 1 million, nous forcerait à repenser en profondeur notre système. Toute cette réflexion reste encadrée pour moi par deux articles très importants, [C10K](http://www.kegel.com/c10k.html) et [C10M](https://highscalability.com/the-secret-to-10-million-concurrent-connections-the-kernel-i/). Le premier date de 2003, et constate que les serveurs industriels ont la capacité de supporter 10 000 connexions simultanés, et réfléchit à comment concevoir du logiciel qui permette d'exploiter ces capacités. On pourrait dire que C10M, c'est le même constat entre 10 et 20 ans plus tard, mais que cette fois-ci on est passé à 10 millions de connexions, là encore en remettant encore à plat le logiciel qu'on conçoit. Alors bien sûr, ici on parle de connexions qui ne font pas grand chose, mais quand même, c'est pertinent de savoir où on se situe, surtout en 2024 où on écrit encore des logiciels qui ont du mal à gérer 4 ou 5 connexions simultanées...
Jusqu'ici je parle de trafic soudain, mais pour de nombreux sites, c'est un flux continu. Dans ce cas, les visites sont beaucoup plus espacées dans le temps. Mettons un site web qui s'adresse aux particuliers, d'expérience il verra une large partie de ses visites se faire entre 7h et 9h le matin, lors de la pause méridienne, disons entre 12h et 14h puis surtout le soir, de 18h à 22h, soit au total quand même 8 heures. À 6 000 utilisateurs par minutes parfaitement répartis, ça nous fait 2.9 millions de visiteurs par jours (on suppose que consulter les pages suivantes est négligeable passé la première requête). Bien sûr, mon modèle est très naïf là, et trop imprécis pour affirmer quelque chose de définitif. Mais disons que, dès lors que le trafic se lisse sur la journée, on a pas trop de mal à gérer 1 million d'utilisateurs par jour. Bon, il ne faut pas perdre de vu que ce budget de 1 million par jour, il est à partager entre tout le monde ! Mais là encore, on a les statistiques de notre côté : des abonnements Twitch aux marchandises sur Amazon en passant par la taille des instances Mastodon, on va avoir une [longue traîne](https://fr.wikipedia.org/wiki/Longue_tra%C3%AEne) : un ou quelques sites webs avec beaucoup de visites, et très rapidement toute une myriade de petits sites avec très peu de visites par jour, qui se fondent dans l'épaisseur du trait. On peut donc dimensionner pour quelques gros sites et le reste suivra.
*Jusqu'ici je n'ai pas évoqué le cas d'utilisateurs malveillants, qui auraient pour objectif de réaliser une attaque par déni de service. Il existe différents types d'attaque par déni de service, certaines sont du "brute force" : un concours de celui qui aura le plus de ressources. De par l'approche de Deuxfleurs, c'est évidemment un concours que l'association n'a pas vocation à mener, et donc les attaques par déni de service sont un risque à prendre en compte. À noter que parfois, dans certaines limites, les fournisseurs d'accès internet peuvent agir pour bloquer le trafic malveillant seulement - ou tout le trafic - pendant l'attaque.*
Mon test n'est pas du tout exhaustif ou représentatif de tout le web statique - mais c'est le mieux qu'on ait et on devra s'en contenter pour le moment. Par exemple, un site qui serait beaucou plus lourd (image, audio) pourrait avoir un comportement différent (on atteindrait peut-être une limite de bande passante - à tester), et c'est juste un exemple parmis des milliers de situations possibles (HTTP 2 vs HTTP 1.1 ? Versions & Cipher de TLS ? etc.).
À noter aussi qu'on n'a pas passé beaucoup de temps à penser l'optimisation des ressources de Deuxfleurs, on pourrait probablement avoir des gains avec de petites modifications. Par exemple en utilisant les spécificités d'IPv6 qui permettent de mettre plusieurs load balancers par zones géographique, ou en favorisant le chiffrement ChaCha20-Poly1305 qui est plus rapide que AES sur les CPU qui n'ont pas d'accélération matérielle comme certains de nos serveurs. Côté matériel, on pourrait s'assurer qu'on a du lien gigabit partout (et donc faire la chasse au 100Mb qui trainerait). En réalité je n'ai pas vraiment réfléchi plus que ça au sujet, je suis sûr qu'en se creusant les méninges, on trouverait des choses.
Et pour terminer, une conclusion provocante : avec 10 req/sec, rarement plus de 5Mb/s de trafic sortant, et 250 sites webs hébergés, c'est respectivement 1% du budget requête, 2% de la bande passante, et 3% du budget stockage qui est actuellement utilisé sur Deuxfleurs.

View file

@ -62,5 +62,5 @@
@font-face {
font-family: 'Symbola';
font-display: swap;
src: local('Symbola'), url(/assets/fonts/Symbola.ornements.woff2) format('woff2');
src: local('Symbola'), url(/assets/fonts/Symbola.ttf) format('truetype');
}

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 880 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

25
cours/index.md Normal file
View file

@ -0,0 +1,25 @@
---
title: Cours
profile: false
---
### Développement logiciel pour le Cloud (TLC)
Slides:
* [Slides 1: Introduction to cloud computing](tlc-course-1.pdf)
* [Slides 2: Microservices](tlc-course-2.pdf)
* [Slides 3: Analytics](tlc-course-3.pdf)
* [Slides 4: Data Management](tlc-course-4.pdf)
* [Slide 4.1 : DHT (Pastry)](tlc-course-4.1.pdf)
* [Slide 4.2 : NoSQL (Dynamo DB)](tlc-course-4.2.pdf)
Travaux dirigés :
* [TD1 : Base de données NoSQL : Google Datastore](td-datastore.pdf)
Lab:
* [Lab 1: Découverte d'un PaaS : Google AppEngine](tlc-tp1.pdf)
* [Lab 2: Découverte d'un orchestrateur de conteneurs : Kubernetes](tlc-tp2.pdf)
* [Lab 3: Découverte d'un IaaS : AWS EC2](tlc-tp3.pdf)

BIN
cours/td-datastore.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-1.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-2.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-3.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-4.1.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-4.2.pdf Normal file

Binary file not shown.

BIN
cours/tlc-course-4.pdf Normal file

Binary file not shown.

BIN
cours/tlc-tp1.pdf Normal file

Binary file not shown.

BIN
cours/tlc-tp2.pdf Normal file

Binary file not shown.

BIN
cours/tlc-tp3.pdf Normal file

Binary file not shown.

50
demo/edit/index.html Normal file
View file

@ -0,0 +1,50 @@
<!doctype html>
<html>
<head>
<title>Small web IDE</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>Small web IDE</h1>
<script src="https://unpkg.com/aws4-tiny@1.0.0/dist/aws4.js"></script>
<script>
let aki = localStorage.getItem('accessKeyId');
if (aki === null) {
aki = window.prompt("What is your Garage Access Key ID?");
localStorage.setItem('accessKeyId', aki);
}
let sak = localStorage.getItem('secretAccessKey');
if (sak === null) {
sak = window.prompt("What is you Garage Secret Access Key?");
localStorage.setItem("secretAccessKey", sak);
}
const credentials = {
accessKeyId: aki,
secretAccessKey: sak,
};
const opts = {
region: 'garage',
service: 's3',
host: 'garage.deuxfleurs.fr',
path: '/quentin.dufour.io/?list-type=2',
headers: {
'x-amz-content-sha256': 'UNSIGNED-PAYLOAD',
},
};
const req = aws4.sign(opts, credentials);
console.log(req)
async function ListObjectsV2() {
const res = await fetch('https://garage.deuxfleurs.fr/quentin.dufour.io/?list-type=2', req);
const body = await res.text()
console.log("body raw", body)
const objList = new window.DOMParser().parseFromString(body, "text/xml")
console.log("parsed body", objList)
}
ListObjectsV2()
</script>
</body>
</html>

29
demo/podcast/feed.xml Normal file
View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="./feed.xsl" type="text/xsl"?>
<!-- https://support.google.com/podcast-publishers/answer/9889544?hl=fr -->
<rss version="2.0"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
<channel>
<itunes:owner>
<itunes:email>thomas.gauledoin@deuxfleurs.fr</itunes:email>
</itunes:owner>
<itunes:author>Tom Goldoin</itunes:author>
<title>Un bout du net</title>
<description>
Internet : réseau créé pour des militaires, des chercheurs ou des hippies ?
Dès ses origines, Internet a été porté par la vision des individus qui le façonnait.
Et si on revenait sur ces temps forts ?
</description>
<language>fr-fr</language>
<item>
<title>La naissance du cloud</title>
<description>Le cloud est partout aujourd'hui mais toujours aussi incompréhensible. Pour y voir plus clair, remontons à ses origines chez Amazon en 2003.</description>
<pubDate>Thu, 24 Nov 2022 12:00:00 GMT</pubDate>
<enclosure url="https://quentin.dufour.io/podcast/origine-cloud.mp3" type="audio/mpeg" length=""/>
<itunes:duration>4:59</itunes:duration>
<guid isPermalink="false">origine-cloud</guid>
</item>
</channel>
</rss>

37
demo/podcast/feed.xsl Normal file
View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://natclark.com/tutorials/xslt-style-rss-feed/ -->
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><xsl:value-of select="/rss/channel/title"/></title>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="IE=edge,chrome=1" />
<link rel="stylesheet" href="https://unpkg.com/mvp.css@1.12/mvp.css" />
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no" />
</head>
<body>
<header>
<h1><xsl:value-of select="/rss/channel/title"/></h1>
<p><em><xsl:value-of select="/rss/channel/description"/></em></p>
</header>
<main>
<xsl:for-each select="/rss/channel/item">
<article>
<h3><xsl:value-of select="title"/></h3>
<p><xsl:value-of select="description"/></p>
<audio controls="1" >
<xsl:attribute name="src">
<xsl:value-of select="enclosure/@url"/>
</xsl:attribute>
</audio>
</article>
</xsl:for-each>
</main>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Binary file not shown.

View file

@ -0,0 +1,3 @@
https://thinkproduct.org/2022/10/09/aws-story-internets-os/
https://mediatemple.net/blog/cloud-hosting/brief-history-aws/

View file

@ -10,16 +10,11 @@ layout: default
<section id="who-am-i">
<h2>Qui suis-je ?</h2>
<p>
Je suis <a href="https://www.astrolabe.coop/members/quentin-dufour/">dévelopeur logiciel indépendant</a>, j'ai une formation <a href="https://www.insa-rennes.fr/info.html">d'ingénieur en informatique généraliste</a> &amp; une <a href="https://team.inria.fr/wide/team/quentin-dufour/">thèse en systèmes distribués</a>.
</p>
<p>
J'ai participé à la conception et développement d'une <a href="https://garagehq.deuxfleurs.fr/">alternative à Amazon S3</a>, <a href="https://aerogramme.deuxfleurs.fr/">un serveur email</a>, ou encore <a href="https://rapsodie.co/">d'un moteur de jeu de carte à la Magic</a>.
</p>
</p>
Je peux vous aider à concevoir ou améliorer vos services existants : contactez-moi
pour me faire part de votre projet. Et dans tous les cas, bonne lecture !
Je suis ingénieur en informatique et libriste.
J'ai travaillé sur <a href="https://www.torproject.org/">Tor</a> pendant <a href="https://theses.fr/s204646">ma thèse</a>.
Je suis membre de <a href="https://deuxfleurs.fr">Deuxfleurs</a>, un hébergeur associatif expérimental.
Nous développons des logiciels libres comme <a href="https://garagehq.deuxfleurs.fr/">Garage</a> pour un monde plus résilient et souverain.
Le reste du temps, je suis disponible pour vous accompagner sur vos projet informatiques en <em>freelance</em>, écrivez-moi !
</p>
<nav class="list">
@ -34,19 +29,13 @@ layout: default
<a href="/cv.pdf">CV</a>
</li>
<li>
<a href="mailto:quentin@dufour.io">Email</a> (<a href="/pgp.pem">PGP</a>)
<a href="mailto:quentin+web@dufour.io">Email</a> (<a href="/pgp.pem">PGP</a>)
</li>
<li>
<a href="https://matrix.to/#/@quentin:deuxfleurs.fr">Matrix</a>
</li>
</ul>
</nav>
<p style="font-family: monospace">
#linux #raft #gossip #s3 #dynamo #email #cloud #ops #rust #scheme #fp #sre #availability #types #architecture #http #k8s #python #mypy #js #rescript #golang
#c10k #async #hashistack #nixos #ci #otel
</p>
</section>
<section id="posts">

76
portfolio/mic.md Normal file
View file

@ -0,0 +1,76 @@
---
title: Mic
permalink: portfolio/mic/
profile: false
---
# Mic - import de fichiers audio
Mic est un petit logiciel **qui ne nécessite pas d'installation** pour faciliter l'import de fichiers
depuis des supports USB comme les Micro-enregistreurs [Easi-Speak](https://www.amazon.fr/Micro-enregistreur-Jaune-Easi-Speak/dp/B002UP5QB6).
## Captures d'écrans
![Import des fichiers](/assets/images/pages/mic01.png)
![Visualisation des fichiers importés](/assets/images/pages/mic02.png)
![Fichiers dans l'explorateur Windows](/assets/images/pages/mic03.png)
## Fonctionnement
Lors de l'import, il est possible d'assigner le fichier à un élève et un exercice.
Pour chaque exercice, un dossier est créé. Le fichier importé est renommé
pour contenir dans son nom :
* le nom de l'élève
* la date et l'heure de l'import
* le nom du fichier original
<br/>
Les fichiers sont importés dans un dossier nommé **import** à l'endroit où se trouve
le programme.
## Pré-Requis
Vous pouvez directement utiliser Mic avec les versions de Windows suivantes :
* Windows 7 SP1 (si votre Windows 7 est à jour, vous avez la SP1)
* Windows 8 et Windows 8.1
* Windows 10
<br/>
Vous devez préalablement télécharger & installer [Microsoft .NET Framework 4](https://www.microsoft.com/fr-fr/download/details.aspx?id=17851) si vous utilisez :
* Windows XP
* Windows Vista
* Windows 7 sans la SP1 (si vous avez désactivé les mises à jour sur Windows 7)
<br/>
Ce logiciel ne fonctionne pas (pour le moment) sous Linux ou MacOS.
## Téléchargement et installation
Voici les étapes à suivre :
1. [Cliquez ici pour télécharger Mic](https://ci.deuxfleurs.fr/job/Mic/job/master/lastSuccessfulBuild/artifact/Mic/bin/Release/mic-windows-portable.zip)
2. Décompressez le fichier .zip sur votre clé USB, dans votre espace réseau, dans "Documents" ou n'importe où ailleurs !
3. Double-cliquez sur Mic.exe (ou juste Mic)
4. C'est tout ! Il n'y a pas d'installation !
<br/>
Une fenêtre d'import va s'ouvrir quand vous brancherez un microphone
## Fonctionnalités manquantes
Les actions suivantes ne peuvent pas être réalisées depuis le logiciel :
1. Il n'est pas possible de changer l'élève assigné à un fichier après son import
2. Il n'est pas possible de changer l'exercice assigné à un fichier après son import
3. Il n'est pas possible de supprimer un fichier importé
4. Le bouton "Vider le micro" ne fonctionne pas
<br/>
Ces actions peuvent cependant être réalisées depuis l'explorateur de fichier Windows,
après tout ce ne sont que des dossiers et des fichiers !
Si vous trouvez un bug ou que vous souhaitez que ces fonctionnalités ou que d'autres fonctionnalités soient ajoutées, merci de me contacter par email : [quentin@dufour.io](mailto:quentin@dufour.io).

View file

@ -1,133 +0,0 @@
---
layout: post
title: Votre site web autour d'un café
date: 2023-10-28T00:00:00.000+02:00
sitemap: false
---
<!--*Cette page est à destination des personnes qui ont un projet de site web
amateur que je prévois d'accompagner bénévolement en vue de les héberger chez [Deuxfleurs](https://deuxfleurs.fr). Bonne lecture.*-->
Vous voulez mettre un site web en ligne pour votre projet et vous cherchez *un geek* qui sache faire ? Halte là ! Je peux vous aider, mais ça va être un brin plus complexe.
Un site web n'est pas qu'un défi technique : c'est avant tout du contenu, souvent textuel, parfois multimédia. Il y a donc un travail intellectuel préliminaire : il faut réfléchir à sa cible, ce qu'on veut lui transmettre, et prendre sa plus belle plume...
Le document qui suit vise à vous accompagner dans cette tâche. Une fois votre contenu prêt, nous pouvons nous retrouver un après-midi autour d'un café pour la mise en ligne.
## Avant propos
![Ville de Vesoul, image d'illustration](/assets/images/pages/vesoul.jpg)
Avant de nous lancer, se pose la question de savoir si je suis le bon interlocuteur.
D'abord sur la finalité : aujourd'hui un site web peut être un ensemble de documents (comme ce site) ou une application (comme GMail, Zoom, Facebook, etc.). Si les deux sont souvent appelés "sites web" et sont utilisés au sein d'un même logiciel, le navigateur (Firefox, Chrome, Edge, etc.), je parle bien ici d'un ensemble de documents et non d'une application.
Ensuite, je suis très attaché à la dimension amateure et communautaire du web, qui n'est pas du tout synonyme d'amateurisme. D'abord parce que j'aime l'idée que tout le monde soit autorisé à s'exprimer sur Internet. Mais aussi parce que cela génère souvent des démarches plus altruistes, qui produisent du contenu plus pertinent et original. Il existe même des [moteurs de](https://wiby.me/) [recherche](https://search.marginalia.nu/) dédiés à cette niche.
Si je suis [ingénieur en informatique](/cv.pdf), concevoir des sites web n'est pas mon métier (c'est d'ailleurs plusieurs métiers très différents : [Designer Graphique](https://www.onisep.fr/ressources/Univers-Metier/Metiers/designer-graphique), [Intégrateur Web](https://www.onisep.fr/ressources/Univers-Metier/Metiers/integrateur-integratrice-web), [Rédacteur Web](https://www.onisep.fr/ressources/Univers-Metier/Metiers/redacteur-redactrice-on-line), etc.) - je prétends juste avoir une bonne compréhension des aspects techniques. Si vous cherchez une prestation professionnelle, il vaut mieux prévoir un budget et vous adresser à une agence web.
Vous êtes encore là ? Bien ! En plus de la conception de votre site web, se pose la question de sa "mise en ligne". L'association [Deuxfleurs](https://deuxfleurs) dont je fais parti se chargera de cette partie. Son slogan "Fabriquer un Internet convivial" s'inscrit dans la continuité de notre démarche amateure. À travers [son blog](https://plume.deuxfleurs.fr/~/Deuxfleurs) et ses choix techniques, l'association interroge aussi la place qu'on veut accorder au numérique dans notre société.
## L'apparence
![Image d'illustration. Les artistes du jardin des plantes en 1902](/assets/images/pages/peintres.jpg)
Après cette introduction sur *le web amateur*, vous ne savez peut-être pas à quoi vous attendre. Pour vous faire une idée, le site web de l'association [Envie Appart'Agée](https://www.envieappartagee.fr/) est un exemple de ce qu'on peut créer avec [un outil facile](https://getpublii.com/) à prendre en main.
Si vous voulez pousser plus loin, certaines personnes ont aussi décidé d'apprendre [à coder des sites webs](https://openclassrooms.com/fr/courses/1603881-creez-votre-site-web-avec-html5-et-css3) (c'est beaucoup plus facile que ça en a l'air), ce qui permet de personnaliser le rendu comme on le souhaite. Ça peut être [très sobre](https://giraud.eu/), [très original](https://anneprudhomoz.fr/accueil.html), ou encore [très maitrisé](https://colineaubert.com/).
L'apparence de votre site web va influencer sa réception bien entendu, mais il n'a pas besoin d'être *beau*. En utilisant des [typographiques](https://fr.wikipedia.org/wiki/Typographie) avec [empatements](https://fr.wikipedia.org/wiki/Empattement_(typographie)), des [lettrines](https://fr.wikipedia.org/wiki/Lettrine), des [ornements](https://fr.wikipedia.org/wiki/Ornement_(typographie)), peu d'image, et une mise en page sobre, vous allez [signifier](https://visualdsgn.fr/semiologie-saussure-pierce-barthes/) que le contenu se rapporte à l'écriture, et par extension, à la sphère intellectuelle. Au contraire, si vous mettez des grandes images artificielles, des animations et autres procédés tape à l'œil, vous allez d'avantage signifier une vitrine de magasin.
Aujourd'hui, les sites commerciaux étant dominants, c'est souvent eux qui définissent la norme de "ce à quoi devrait ressembler votre site web". Mais en réalité si vous êtes une association, ou que vous souhaitez partager un loisir, ça envoie des signaux contradictoires de ressembler à une vitrine...
On ne va donc pas trop se concentrer sur les normes esthétiques, mais on va faire attention aux signes qu'on mobilise.
## La motivation
![Image d'illustration. Gravure d'une femme assise à son bureau réfléchissant](/assets/images/pages/think.jpg)
Souvent la question du site web commence par une évidence : de nos jours, il faudrait être sur Internet ou risquer [une fracture numérique](https://books.openedition.org/pressesenssib/1940). C'est un mauvais point de départ selon moi car 1) tout n'a pas besoin d'être informatisé et 2) une [approche mimétique](https://fr.wikipedia.org/wiki/Culte_du_cargo) vise à reproduire quelque chose sans que ce soit nécessairement pertinent.
Un meilleur point de départ est de se demander ce que vous voulez dire, faire connaître et à qui. Et peut-être que vous n'aurez rien à dire (pour le moment), ou à des gens dont Internet n'est pas le média privilégié. Ce n'est pas grave, investissez votre énergie là où ça compte à la place. Autrement dit, votre site web doit faire partie d'une stratégie plus large de votre part : de communication, d'apprentissage, d'expression artistique, etc.
<!--Il est fort probable qu'une part de votre public ait un smartphone ou un ordinateur. Et que vous ayez besoin de communiquer des informations basiques, comme une adresse, des évènements, des comptes sur les réseaux sociaux, etc. Et donc un site web pourrait faire partie de votre stratégie pour permettre aux gens de garder le contact avec vous et se tenir au courant de ce que vous faites. Vous pourriez aussi simplement vouloir partager vos recettes de cuisine avec votre entourage. Ou partager des connaissances sur la permaculture avec vos paires maraîchers. Tout est possible, mais votre objectif final n'est pas le site web.-->
C'est donc bien de préciser votre objectif, car ça guidera vos choix d'une part, et d'autre part comment je vous aiderai. Si c'est une fin en soi, comme pour apprendre ou une démarche artistique, alors mieux vaut que vous fassiez un maximum par vous même, et que vous exploriez. Si c'est un moyen pour communiquer, alors mieux vaut s'assurer que vous êtes sur les bons rails. La suite de cette page prend le parti que votre site web est un support pour communiquer.
## La cible
![Image d'illustration. Une gravure de foule](/assets/images/pages/foule.jpg)
Avant de réfléchir à ce qu'on va écrire, on va réfléchir à votre cible : qui est t'elle et que cherche t'elle ? L'enjeu pour vous c'est de comprendre *dans quels contextes* les gens vont intéragir avec vous et/ou votre projet. Il y a souvent plusieurs contextes, et donc plusieurs cibles.
Prenons l'exemple d'une autrice. Elle peut vouloir adresser son site web à son lectorat. Mais elle pourrait aussi vouloir l'adresser à des maisons d'édition, à la presse, etc. Et elle pourrait vouloir aussi partager des conseils d'écriture : dans ce cas, la cible sont d'autres auteurs. Il vous revient donc de 1) recenser les différentes cibles et 2) identifier les informations pertinentes.
Pour certaines cibles, Internet ne sera pas pertinent du tout : soit parce qu'elles ne sont pas à l'aise avec cet outil, soit parce que consulter le web pour obtenir cette information précise n'est pas une évidence. Il est tout à fait possible de vouloir adresser son site web à une seule de ses cibles : c'est plus simple. Quand on a plusieurs cibles, c'est une stratégie de faire une page par cible (comme certains sites webs découpés en "pour les particuliers", "pour les entreprises", etc.).
## Le format
![Image d'illustration. Gravure d'une imprimerie](/assets/images/pages/imprimerie.jpg)
Si un site web peut être une page blanche sur laquelle votre [créativité](https://anaissiere.club1.fr/nuit/) [peut](https://estherbouquet.com/) [s'exprimer](https://anaissiere.club1.fr/amour/) [sans fin](https://melvynpharaon.club1.fr/myel/), avoir des point de référence pour commencer facilite le processus. Je vous propose 4 métaphores par ordre de difficulté pour expliquer les différentes directions que peut prendre votre site web : la *carte de visite*, la *brochure*, le *catalogue* et le *livre*.
La *carte de visite* est l'incarnation la plus simple d'un site web : une seule page qui donne des informations de contact traditionnelles (numéro de téléphone, adresse physique, adresse email) et/ou redirige vers vos réseaux sociaux. Elle s'adresse à des gens qui *vous connaissent déjà* et qui *savent déjà ce que vous faites* mais qui veulent retrouver des informations sur vous. Pour faire une carte de visite, vous n'avez besoin que de rassembler les informations de contact & de comptes de réseaux sociaux que vous voulez partager. Facile !
La *brochure* (ou portfolio), en plus des informations de contact, va donner des informations sur ce que vous faites et ou proposez. Elle peut donc s'adresser à des gens qui ont *entendu parler de vous*, *qui connaissent votre domaine* mais qui ne *savent pas exactement ce que vous faites*. Il faut donc lister vos activités : prestations, évènements, livres, formations, ateliers, œuvres, etc.
<!--Si vous organisez des évènements, ou que vous avez une actualité, vous pouvez penser une place à cette dernière - tout en gardant en tête que c'est une charge de travail conséquente de garder un site web à jour. Là aussi une seule page web suffit, par contre, par rapport à la carte de visite, elle demande un travail de production de contenu (rédaction de textes, photos, etc.).-->
Le *catalogue*, par rappport à la brochure, vise un nouveau public : *des gens qui ne vous connaissent pas* mais qui *connaissent votre domaine*. Ces gens vont donc chercher par mots clés, via un moteur de recherche (Google, Qwant, Lilo, etc.), des personnes comme vous. Pour être indexé dans le moteur de recherche, vous ne pouvez plus vous contenter de lister vos activités, il va falloir les décrire. Par exemple, si vous faites des formations sur le tricot, à qui ça s'adresse (débutants ?), ce qu'on va y apprendre (le point mousse ? le point jersey ?), ce qu'on va faire (tricoter une écharpe ?), etc.
Le *livre* est la forme la plus aboutie : c'est un site web qui contient des ressources qui se suffisent à elles-mêmes : des tutoriels, des guides pratiques, des fiches références, de l'actualité de votre domaine, etc. Il peut toucher des *gens qui ne vous connaissent pas* et *ne connaissent pas (encore) votre domaine*. Ça peut permettre de créer une communauté de gens qui suivent votre travail, un très fort engagement vis-à-vis de ce que vous faites, et vous placez en tant que référence dans votre domaine. Attention, ça demande *vraiment* beaucoup de travail, et le résultat n'est pas garanti : si vous tentez, faites le pour vous (motivation intrinsèque) et non parce que vous attendez des retombées (motivation extrinsèque).
Ces métaphores fonctionnent bien comme des poupées russes : la plupart des site webs ont une section contact, une large majorité parle de ce que la personne ou le collectif fait, un peu moins décrivent en détail ce qui est fait, et très peu fournissent des ressources clés en main en accès libre. Je vous recommande donc de commencer petit, et de jauger ce que vous étendez au fur et à mesure des retours, des envies et de votre temps. N'hésitez pas à réfléchir et à explorer d'autres métaphores physiques pour réfléchir au contenu que vous voulez partager.
Pour commencer, je vous recommande de partir des informations que l'on vous demande déjà souvent : vous savez qu'il y a déjà un intérêt pour ces dernières.
## Exister
![Image d'illustration. Une gravure de crieur](/assets/images/pages/crieur.jpg)
Contrairement aux réseaux sociaux qui ont des algorithmes de recommendation qui permettent de faire découvrir votre contenu sans action de votre part, ce n'est pas vraiment le cas des sites web. Une fois votre site web créé ce n'est donc pas terminé : il faut encore en assurer la promotion, du moins le faire connaître.
Pour faire connaître votre site web, il va falloir partager son adresse (ou URL).
L'adresse de mon site est `https://quentin.dufour.io`. Sur les navigateurs modernes, on peut n'entrer qu'une partie de l'URL, le nom de domaine : `quentin.dufour.io` (notez la disparition de `https://`), ce qui est plus simple à écrire et retenir. Beaucoup de personnes ne maîtrisent pas ces concepts et ont tout le temps recourt à la recherche par mots-clés dans un moteur de recherche (Google, Lilo, etc.), par exemple : `Quentin Dufour Informatique`. Il va falloir composer avec ces contraintes.
*Vous vous demandez peut-être comment obtenir un nom de domaine à votre identité et combien ça coûte ? Il faut compter environ 15 euros/an pour un .fr et il faut s'adresser à [un bureau d'enregistrement](https://www.afnic.fr/lexique/#bureaux-enregistrement) comme [Gandi](https://www.gandi.net/fr/domain). Ça fait partie de la technique qu'on peut faire ensemble.*
Sur vos documents écrits ou à l'oral, je vous conseille donc de prévoir d'indiquer votre nom de domaine (comme `quentin.dufour.io`). Si vous avez des raisons de penser que la personne va avoir du mal à vous trouver comme ça, il est bon de connaître les quelques mots-clés qui vont vous permettre de vous trouver à coup sûr dans un moteur de recherche mais...
...ça n'est pas si simple d'être référencé (indexé) dans un moteur de recherche. Il y a 2 choses principales à savoir : 1) ça prend du temps et 2) c'est une boite noire. Si tout se passe bien, votre site commencera a être référencé 1 mois après sa publication. Mais parfois, pour des raisons obscures, il peut ne pas être référencé du tout : il faut alors tatonner pour comprendre pourquoi. La compétition au référencement a créé [des métiers du référencement](https://www.onisep.fr/ressources/Univers-Metier/Metiers/charge-chargee-de-referencement-web) qui prétendent connaître les arcanes des moteurs de recherche et vous promettent monts et merveilles. Selon moi, plutôt que d'essayer de tromper le système, il est préférable de suivre les recommendations : 1) avoir d'autres sites web qui font des liens vers le votre, 2) publier du contenu original et de qualité et 3) publier régulièrement du contenu.
Diffuser l'existence de votre site web ne suffit, il faut aussi faire revenir votre public quand vous avez publié quelque chose de nouveau : des nouveaux évènements, une nouvelle actualité, de nouvelles informations, etc. Si vous êtes sur les réseaux sociaux (Instagram, Facebook, etc.), vous pouvez annoncer cette mise à jour par ce biais, en mettant un lien. Si les groupes What's App, Signal, Telegram, ou autres sont populaires parmi vos cercles, ça peut être un autre moyen d'atteindre votre public. Aujourd'hui [les newsletters](https://www.radiofrance.fr/franceinter/podcasts/net-plus-ultra/net-plus-ultra-du-vendredi-22-septembre-2023-3758867) font aussi leur grand retour : l'email est loin d'être mort. Si vous faites parti de réseaux, vous pouvez essayer de compter sur eux pour relayer vos informations (office de tourisme, fédérations en tout genre, etc.) à travers leurs propres canaux de communication.
Dans un premier temps, il n'est pas forcément nécessaire d'aller aussi loin : simplement mentionner à vos interlocuteurs que vous avez un site web est un bon début, et le reste sera du bonus !
## On se lance ?
![Image d'illustration. Une gravure de Montgolfière](/assets/images/pages/aerostat.jpg)
Vous avez maintenant toutes les cartes en main. Il ne vous reste plus qu'à prendre votre cahier ou [votre logiciel de traitement de texte](https://fr.wikipedia.org/wiki/Logiciel_de_traitement_de_texte) préféré,
et coucher vos idées sur la papier (ou sur l'écran).
Voici un récapitulatif des éléments auxquels vous devez réfléchir - quelques lignes peuvent suffire :
- Dans quelle stratégie s'inscrit votre projet de site web ?
- Quel est votre cible (ou quelles sont vos cibles) et que cherchent t'elles selon vous ?
- Quel format souhaitez-vous adopter pour votre contenu (carte de visite, brochure, catalogue, etc.) ?
- En fonction du format que vous voulez, écrire les blocs de texte qui apparaitront
- Rassembler des images si nécessaire qui serviront à illustrer votre site
- Si vous avez déjà des supports de communication, les rassembler aussi : on pourra les réutiliser pour créer du contenu.
- Notez quelques idées sur comment vous allez faire connaître votre site web
- Réfléchissez au nom de domaine que vous voudriez
Je suis conscient que ça fait beaucoup de choses, mais elles me semblent essentielles pour la réussite de votre projet. Rien ne presse : si vous n'avez pas le temps maintenant, ça peut être plus tard.
Une fois tout ces éléments réunis, on peut planifier une demi-journée ensemble, en physique, pour mettre en place la partie technique. Et au besoin, vous pouvez trouver mes informations de contact sur [ma page d'accueil](https://quentin.dufour.io).