<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>JL</title>
    <description>Je suis développeur. Ce &lt;abbr title=&quot;Blog Longuement Oublié en Gestation&quot;&gt;BLOG&lt;/abbr&gt; est la version &lt;em&gt;au propre&lt;/em&gt; de sujets variés ayant pour point commun de m&apos;avoir suffisamment occupés le cerveau pour justifier la rédaction d&apos;articles.
</description>
    <link>https://blog.jl.bzh/</link>
    <atom:link href="https://blog.jl.bzh/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 28 Mar 2025 16:42:36 +0000</pubDate>
    <lastBuildDate>Fri, 28 Mar 2025 16:42:36 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Auto-hébergement (1/n) – la machine 🖥️</title>
        <description>&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Récemment, le sujet de l&amp;#8217;auto-hébergement revient en force lors des
discussions à la machine à café.
La volonté de s&amp;#8217;émanciper de l&amp;#8217;emprise de Google et consort alliée à l&amp;#8217;envie de
« tester des trucs » motivent certains de mes collègues à gérer un petit
serveur domestique à la maison.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En ce qui me concerne, c&amp;#8217;est la découverte de l&amp;#8217;application de gestion de
photos et vidéos
&lt;a href=&quot;https://immich.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Immich&lt;/a&gt;,
grâce à un collègue, qui a servi de déclencheur pour rejoindre le mouvement.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
Ça marche sur ma machine !
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
&amp;#8212; N&amp;#8217;importe quel développeur&lt;br&gt;
&lt;cite&gt;au moins une fois dans sa vie.&lt;/cite&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Commence ainsi aujourd&amp;#8217;hui une série d&amp;#8217;article qui iront du choix de la machine
physique jusqu&amp;#8217;à l&amp;#8217;installation de la fameuse application
&lt;a href=&quot;https://immich.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Immich&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- toc disabled --&gt;
&lt;/div&gt;
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Sommaire&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#le-choix-de-la-machine&quot;&gt;Le choix de la machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#préparation-avant-installation&quot;&gt;Préparation avant installation&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#ajout-dun-second-ssd&quot;&gt;Ajout d&amp;#8217;un second SSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#mise-à-jour-du-firmware&quot;&gt;Mise à jour du firmware&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#prochainement&quot;&gt;Prochainement…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;le-choix-de-la-machine&quot;&gt;Le choix de la machine&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après échange rapide avec quelques personnes de mon entourage gérant déjà
un petit serveur domestique, j&amp;#8217;ai opté pour une solutions HP EliteDesk G4.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Quand bien même il s&amp;#8217;agit de matériel destiné théoriquement à de la bureautique,
ça reste du matériel professionnel, avec des caractéristiques techniques
séduisantes tout en restant très compact.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mais surtout, une machine de ce type est facilement trouvable
sur le marché de l&amp;#8217;occasion entre 100 et 400 € suivant le modèle ciblé.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/elitedesk-front-and-back.jpg&quot; alt=&quot;HP EliteDesk 800 G4 Mini&amp;#8201;&amp;#8212;&amp;#8201;faces avant et arrière&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. HP EliteDesk 800 G4 Mini&amp;#8201;&amp;#8212;&amp;#8201;faces avant et arrière&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour ma part, j&amp;#8217;ai opté pour une machine HP EliteDesk 800 G4 Mini, trouvée
à 200 € sur BackMarket.
Il présente les &lt;a href=&quot;https://support.hp.com/us-en/document/c06045012&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;caractéristiques&lt;/a&gt; suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;hdlist&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Dimensions
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;p&gt;160 × 117 × 18.5 mm&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Alimentation
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;p&gt;alimentation externe 65 W (19,5 V 3,33 A)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
CPU
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;p&gt;Intel Core i5-8500T @2,1 GHz (6 cœurs)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Mémoire
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;p&gt;16 Gio de RAM (2 × 8 Gio DDR4-2666 SODIMM, maximum supporté : 32 Gio)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Stockage
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;p&gt;1 SSD NVMe de 512 Gio&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Connectique
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;6 ports USB-A (2 en face avant, 4 à l&amp;#8217;arrière),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 port USB-C (en face avant),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3 ports DP,&lt;/p&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
suivant le modèle, un port HDMI, USB-C avec support du mode vidéo ou
même VGA peut remplacer le port DP central.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 ports audio JACK (1 casque et 1 casque+micro),&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 port RJ-45 Ethernet Gigabit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;hdlist1&quot;&gt;
Emplacements d&amp;#8217;extension
&lt;/td&gt;
&lt;td class=&quot;hdlist2&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2 emplacements M.2 PCIe ×4 2280/2230 (1 libre pour un second SSD NVMe, on y
reviendra plus tard)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 emplacement M.2 PCIe ×1 2230 pour éventuellement ajouter une carte Wi-Fi,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 baie pouvant accueillir un disque SATA 2.5”.&lt;/p&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je me suis rapidement rendu compte que la présence de la baie SATA était
difficilement compatible avec l&amp;#8217;ajout d&amp;#8217;un second SDD au format M.2 2280
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; dans l&amp;#8217;emplacement situé juste en
dessous.
Mécaniquement, ça passe, mais ça frotte.
J&amp;#8217;ai préféré retirer la baie pour mon usage.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/elitedesk-inside.jpg&quot; alt=&quot;HP EliteDesk 800 G4 Mini&amp;#8201;&amp;#8212;&amp;#8201;sous le capot&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. HP EliteDesk 800 G4 Mini&amp;#8201;&amp;#8212;&amp;#8201;sous le capot&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;préparation-avant-installation&quot;&gt;Préparation avant installation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;ajout-dun-second-ssd&quot;&gt;Ajout d&amp;#8217;un second SSD&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si je compte bien à terme mettre en place une solution de sauvegarde des
données contenues sur ce serveur, j&amp;#8217;aimerais disposer d&amp;#8217;un premier filet de
sécurité en cas de panne du support de stockage.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour cela, j&amp;#8217;ai décidé de profiter de la présence d&amp;#8217;un second connecteur
M.2 PCIe ×4 pour installer un SSD NVMe supplémentaire, de même capacité que
le premier, ceci afin de mettre en place une solution
&lt;a href=&quot;https://fr.wikipedia.org/wiki/RAID_(informatique)#RAID_1_:_Disques_en_miroir&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RAID1&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ainsi, si l&amp;#8217;un des disque vient à lâcher, suivant la panne j&amp;#8217;aurais de bonnes
chances de pouvoir revenir à un fonctionnement normal en remplaçant simplement
le disque défectueux, sans avoir à souffrir d&amp;#8217;une perte de données, et
donc sans avoir à recourir à la restauration d&amp;#8217;un &lt;em&gt;backup&lt;/em&gt;.
Mieux, je pourrais temporairement (ne jouons pas avec le feu) continuer
à faire fonctionner le serveur sur un seul disque de manière transparente.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;mise-à-jour-du-firmware&quot;&gt;Mise à jour du firmware&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après avoir trouvé la bonne touche de clavier sur laquelle appuyer pour accéder
à la configuration du &lt;em&gt;firmware&lt;/em&gt; (&lt;kbd&gt;F10&lt;/kbd&gt;), première bonne surprise :
il est possible de mettre à jour celui-ci directement depuis l&amp;#8217;interface de
configuration.
Évidemment, penser à fournir au préalable un accès Internet à la machine pour
que l&amp;#8217;utilitaire puisse aller chercher la dernière version du &lt;em&gt;firmware&lt;/em&gt; sur
les serveurs d&amp;#8217;HP.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
choix purement personnel, mais j&amp;#8217;ai aussi profiter d&amp;#8217;être dans la
configuration du &lt;em&gt;firmware&lt;/em&gt; pour désactiver le module
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Trusted_Platform_Module&quot; target=&quot;&lt;em&gt;blank&quot;&gt;TPM&lt;/a&gt;
de la machine, et l&amp;#8217;utilisation du
&lt;a href=&quot;https://fr.wikipedia.org/wiki/UEFI#Lancement_s%C3%A9curis%C3%A9&lt;/em&gt;(secure_boot)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;em&gt;secure boot&lt;/em&gt;&lt;/a&gt;.
Je n&amp;#8217;ai pas de temps à consacrer à ces sujets pour le moment, on verra
&lt;a href=&quot;https://www.tevora.com/threat-blog/configuring-secure-boot-tpm-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;plus tard&lt;/a&gt; éventuellement.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;prochainement&quot;&gt;Prochainement…&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le prochain article de cette série se concentrera sur l&amp;#8217;installation du
système d&amp;#8217;exploitation après configuration des deux disques dans une grappe
RAID 1.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. 22&lt;strong&gt;80&lt;/strong&gt; pour 80 mm de longueur
&lt;/div&gt;
&lt;/div&gt;</description>
        <pubDate>Tue, 23 Jan 2024 00:00:00 +0000</pubDate>
        <link>https://blog.jl.bzh/2024/01/23/auto-hebergement-1.html</link>
        <guid isPermaLink="true">https://blog.jl.bzh/2024/01/23/auto-hebergement-1.html</guid>
        
        <category>Auto-hébergement</category>
        
        <category>Hardware</category>
        
        
      </item>
    
      <item>
        <title>Chiffrement transparent des données utilisateurs avec LUKS/dm-crypt 🔐</title>
        <description>&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Jusqu&amp;#8217;à la version 17.10, Ubuntu proposait une option permettant de chiffrer
son répertoire utilisateur.
Très simple à mettre en œuvre, il suffisait de cocher une case lors d&amp;#8217;une
étape de l&amp;#8217;installation pour que les données de l&amp;#8217;utilisateur soient protégées,
par exemple en cas de vol de l&amp;#8217;ordinateur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette solution avait l&amp;#8217;avantage de proposer une solution de chiffrement des
données transparente pour l&amp;#8217;utilisateur, puisque le déchiffrement se faisait
automatiquement lors de l&amp;#8217;ouverture d&amp;#8217;une session utilisateur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
« Crypter » est à « décrypter » ce que « truire » est à « détruire » : ça ne
veut rien dire !
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
&amp;#8212; L&amp;#8217;auteur de ce blog&lt;br&gt;
&lt;cite&gt;Vous voulez &lt;a href=&quot;https://chiffrer.info/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;en savoir plus&lt;/a&gt; ?&lt;/cite&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette option n&amp;#8217;est plus proposée à l&amp;#8217;installation dans les versions récentes
d&amp;#8217;Ubuntu et eCryptfs est considéré comme déprécié, en faveur de l&amp;#8217;utilisation
du standard en terme de chiffrement dans le monde Linux,
&lt;a href=&quot;https://fr.wikipedia.org/wiki/LUKS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;LUKS&lt;/a&gt;
mis en œuvre à l&amp;#8217;aide de
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Dm-crypt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dm-crypt&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La seule option proposée lors de l&amp;#8217;installation d&amp;#8217;Ubuntu et reposant sur
LUKS/dm-crypt consiste à chiffrer totalement son système, pas uniquement le
répertoire utilisateur.
Ainsi, le démarrage nécessite la saisie d&amp;#8217;une &lt;em&gt;passphrase&lt;/em&gt;
pour déchiffrer le disque pour que le système puisse démarrer (je schématise).
Des données sécurisées, certes, mais une perte de confort d&amp;#8217;utilisation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans cet article nous allons voir comment installer la dernière version
d&amp;#8217;Ubuntu en date (20.04), en mettant en œuvre du chiffrement avec
LUKS/dm-crypt, tout en conservant (presque) le confort d&amp;#8217;utilisation que
procurait la solution eCryptfs.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- toc disabled --&gt;
&lt;/div&gt;
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Sommaire&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#préparatifs-avant-installation&quot;&gt;Préparatifs avant installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#installation-dubuntu-20-04&quot;&gt;Installation d&amp;#8217;Ubuntu 20.04&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#avant-de-redémarrer&quot;&gt;Avant de redémarrer !&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#démarrage&quot;&gt;Démarrage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#et-au-final-content&quot;&gt;Et au final, content ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#références&quot;&gt;Références&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;préparatifs-avant-installation&quot;&gt;Préparatifs avant installation&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avant de procéder à l&amp;#8217;installation, nous allons passer par la ligne de commandes
pour préparer le disque avant d&amp;#8217;utiliser le programme d&amp;#8217;installation d&amp;#8217;Ubuntu.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock caution&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-caution&quot; title=&quot;Caution&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Invites de commandes&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans les exemples de commandes shell de cet article :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;l&amp;#8217;invite &lt;code&gt;#&lt;/code&gt; indique que la commande doit être exécutée avec les privilèges
&lt;code&gt;root&lt;/code&gt;, soit directement en tant qu&amp;#8217;utilisateur &lt;code&gt;root&lt;/code&gt;, soit en utilisant la
commande &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L&amp;#8217;invite &lt;code&gt;$&lt;/code&gt; indique que la commande doit être exécutée sans privilège &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Démarrer une session &lt;em&gt;live&lt;/em&gt; à l&amp;#8217;aide d&amp;#8217;une clé USB d&amp;#8217;installation d&amp;#8217;Ubuntu,
puis ouvrir un terminal.&lt;/p&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
la session &lt;em&gt;live&lt;/em&gt; doit être lancée en mode UEFI.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Identifier le chemin du périphérique bloc
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;
correspondant au disque sur lequel dérouler l&amp;#8217;installation, à l&amp;#8217;aide de la
commande &lt;code&gt;lsblk&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Dans la suite de ce guide, nous utiliserons le disque &lt;code&gt;/dev/sda&lt;/code&gt; pour
illustrer les commandes à exécuter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ce guide part du principe que le disque &lt;code&gt;/dev/sda&lt;/code&gt; est vierge de tout volume
LVM.
Si tel n&amp;#8217;est pas le cas, supprimer toutes traces liées à LVM du disque
&lt;code&gt;/dev/sda&lt;/code&gt; avant de dérouler la suite du guide :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; vgremove &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ff&lt;/span&gt; &amp;lt;volume-group-name&amp;gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pvremove &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ff&lt;/span&gt; /dev/sda&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Supprime un groupe de volume.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Supprime tous les volumes physiques des partitions du disque &lt;code&gt;/dev/sda&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Réinitialiser le partitionnement du disque &lt;code&gt;/dev/sda&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sgdisk &lt;span class=&quot;nt&quot;&gt;--zap-all&lt;/span&gt; /dev/sda &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    &amp;amp;&amp;amp; partprobe&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Supprime les structures de données MBR et GPT du disque &lt;code&gt;/dev/sda&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Informe le système d&amp;#8217;exploitation des changements apportés aux tables de
partitions.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Partitionner le disque &lt;code&gt;/dev/sda&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;créer une partition système EFI :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sgdisk &lt;span class=&quot;nt&quot;&gt;-n1&lt;/span&gt;:0:+512M &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    -t1:EF00 \&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    -c1:esp \&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    /dev/sda&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Crée une nouvelle partition numérotée &lt;code&gt;1&lt;/code&gt;, de taille 512 Mio
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Spécifie le type de la partition &lt;code&gt;1&lt;/code&gt;. Ici &lt;code&gt;EF00&lt;/code&gt; désigne une partition
système EFI
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_3&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_3&quot; title=&quot;View footnote.&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné à la partition : « &lt;code&gt;esp&lt;/code&gt; », pour &lt;strong&gt;E&lt;/strong&gt;FI &lt;strong&gt;S&lt;/strong&gt;ystem &lt;strong&gt;P&lt;/strong&gt;artition.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;créer une partition destinée à être gérée par LVM :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sgdisk &lt;span class=&quot;nt&quot;&gt;-n2&lt;/span&gt;:0:0 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    -t2:8E00 \&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    -c2:main \&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    /dev/sda&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Crée une nouvelle partition numérotée &lt;code&gt;2&lt;/code&gt;, occupant tout l&amp;#8217;espace libre
restant du disque.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Spécifie que la partition &lt;code&gt;2&lt;/code&gt; est de type LVM.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nomme la partition « &lt;code&gt;main&lt;/code&gt; ».
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le système d&amp;#8217;exploitation utilise ce libellé pour définir un raccourci vers
cette partition dans le système de fichiers.
On pourra par la suite référencer cette partition à l&amp;#8217;aide du chemin
&lt;code&gt;/dev/disk/by-partlabel/main&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vérifier le partitionnement du disque &lt;code&gt;/dev/sda&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sgdisk &lt;span class=&quot;nt&quot;&gt;--print&lt;/span&gt; /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La commande doit retourner un résultat cohérent avec les options indiquées dans
les précédentes commandes.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;exampleblock&quot;&gt;
&lt;div class=&quot;title&quot;&gt;Exemple 1. résumé du partitionnement d&amp;#8217;un disque avec &lt;code&gt;sgdisk&lt;/code&gt;&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;sgdisk &lt;span class=&quot;nt&quot;&gt;--print&lt;/span&gt; /dev/sda
&lt;span class=&quot;c&quot;&gt;...
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;Number Start (sector) End (sector)  Size      Code  Name
     1           2048      1050623  512.0 MiB EF00  esp
     2        1050623    500118158  238.0 GiB 8E00  main&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formater la partition EFI :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mkfs.fat &lt;span class=&quot;nt&quot;&gt;-F32&lt;/span&gt; /dev/disk/by-partlabel/esp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initialiser la partition &lt;code&gt;main&lt;/code&gt; en tant que volume physique
pour LVM :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pvcreate /dev/disk/by-partlabel/main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un groupe de volumes LVM en y incluant la partition &lt;code&gt;main&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;vgcreate vgmain &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    /dev/disk/by-partlabel/main&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au groupe de volumes : « &lt;code&gt;vgmain&lt;/code&gt; » (🤷‍♂️).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Chemin des périphériques blocs à ajouter au groupe de volumes (ici, une
seule partition).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer des volumes logiques dans &lt;code&gt;vgmain&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;créer un premier volume logique pour la racine du système de fichiers :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lvcreate &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; root &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    --size 50G \&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    vgmain&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au volume logique : « &lt;code&gt;root&lt;/code&gt; ».&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Taille du volume logique : &lt;code&gt;50 Gio&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un deuxième volume logique pour un espace &lt;em&gt;swap&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lvcreate &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; swap &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    --size 2G \&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    vgmain&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au volume logique : « &lt;code&gt;swap&lt;/code&gt; ».&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Taille du volume logique : &lt;code&gt;2 Gio&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un dernier volume logique destiné à être chiffré :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;lvcreate &lt;span class=&quot;nt&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; crypt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    --extents 100%FREE \&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    vgmain&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au volume logique : « &lt;code&gt;crypt&lt;/code&gt; ».&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Le volume logique occupera 100% de l&amp;#8217;espace disponible.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a id=&quot;volume-encryption-init&quot;&gt;&lt;/a&gt; Chiffrer le volume logique &lt;code&gt;crypt&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;openblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cryptsetup luksFormat &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    /dev/mapper/vgmain-crypt&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Aucune option spécifiée, les options par défaut suivantes sont utilisées :
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--type luks&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Utilise la spécification de chiffrement de disque LUKS. Plus
précisément, c&amp;#8217;est LUKS2 qui est mis en œuvre depuis la version &lt;code&gt;2.1.0&lt;/code&gt; de
&lt;code&gt;cryptsetup&lt;/code&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--cipher aes-xts-plain64&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Algorithme de chiffrement.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--key-size 512&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Taille de la clé de chiffrement.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--hash sha256&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Algorithme de hachage utilisé pour la dérivation de clé
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_4&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_4&quot; title=&quot;View footnote.&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--iter-time 2000&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Nombre d&amp;#8217;itération de la fonction de dérivation de clé.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--use-urandom&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Utilise la source d&amp;#8217;entropie &lt;code&gt;/dev/urandom&lt;/code&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--verify-passphrase&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Demande confirmation de la phrase de passe.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Chemin du périphérique bloc à chiffrer.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La commande demande la saisie d&amp;#8217;une &lt;em&gt;passphrase&lt;/em&gt; pour chiffrer le périphérique
bloc, ainsi que la confirmation de cette &lt;em&gt;passphrase&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;objectif étant de déchiffrer automatiquement le répertoire utilisateur après
l&amp;#8217;authentification, le mot de passe du compte utilisateur qui sera créé pendant
l&amp;#8217;installation devra être identique à la &lt;em&gt;passphrase&lt;/em&gt; saisie ici.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock warning&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-warning&quot; title=&quot;Warning&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lors de mes tests dans une machine virtuelle avec seulement 2 Gio de mémoire,
la commande &lt;code&gt;cryptsetup luksFormat&lt;/code&gt; se terminait par un laconique
« Processus arrêté » affiché dans la sortie standard.
Ceci est lié à la fonction de dérivation de clé Argon2i
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_5&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_5&quot; title=&quot;View footnote.&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;
&lt;a href=&quot;https://gitlab.com/cryptsetup/cryptsetup/-/issues/372#note_65182941&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;très gourmande en mémoire&lt;/a&gt;.
Veiller donc à avoir suffisamment de mémoire sur la machine ou alors ajouter
l&amp;#8217;option &lt;code&gt;--pbkdf-memory &amp;lt;max-memory-in-kilobytes&amp;gt;&lt;/code&gt; à la ligne de commande pour
limiter la quantité de mémoire utilisée.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a id=&quot;open-crypt-volume&quot;&gt;&lt;/a&gt; Déverrouiller le volume chiffré :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cryptsetup open &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;luks &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    /dev/mapper/vgmain-crypt \&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
    home-jl&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Chemin du périphérique bloc chiffré à rendre accessible.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au périphérique bloc au travers duquel le contenu déchiffré sera
accessible.
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le périphérique bloc créé est à présent accessible avec le chemin
&lt;code&gt;/dev/mapper/home-jl&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formater le périphérique bloc :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mkfs &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; ext4 /dev/mapper/home-jl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Sans cette étape, le périphérique bloc n&amp;#8217;est pas visible pendant
l&amp;#8217;installation d&amp;#8217;Ubuntu.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;installation-dubuntu-20-04&quot;&gt;Installation d&amp;#8217;Ubuntu 20.04&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous allons dérouler normalement l&amp;#8217;installation d&amp;#8217;Ubuntu à l&amp;#8217;aide du programme
dédié.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Lancer le programme d&amp;#8217;installation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arrivé à l&amp;#8217;étape de sélection du type d&amp;#8217;installation, sélectionner
&lt;b class=&quot;button&quot;&gt;Autre chose&lt;/b&gt;, puis cliquer sur &lt;b class=&quot;button&quot;&gt;Continuer&lt;/b&gt;.&lt;/p&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-1.png&quot; alt=&quot;sélection du type d&amp;#8217;installation&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;sélection du type d&amp;#8217;installation&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dans l&amp;#8217;outil de partitionnement, définir &lt;code&gt;/dev/mapper/vgmain-root&lt;/code&gt; en tant
que racine du système de fichiers.&lt;/p&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-2.png&quot; alt=&quot;définition de la racine du système de fichiers&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;définition de la racine du système de fichiers&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sélectionner ensuite &lt;code&gt;/dev/mapper/home-jl&lt;/code&gt; pour le répertoire utilisateur.&lt;/p&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Bien faire attention à saisir &lt;code&gt;/home/jl&lt;/code&gt; en point de montage.
Nous verrons plus tard comment faire en sorte de déverrouiller puis monter le
volume après authentification de l&amp;#8217;utilisateur.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-3.png&quot; alt=&quot;sélection du volume pour le répertoire utilisateur&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;sélection du volume pour le répertoire utilisateur&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Indiquer &lt;code&gt;/dev/mapper/vgmain-swap&lt;/code&gt; comme espace d&amp;#8217;échange, puis cliquer sur
&lt;b class=&quot;button&quot;&gt;Installer maintenant&lt;/b&gt;&lt;/p&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-4.png&quot; alt=&quot;définition de l&amp;#8217;espace _swap_&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;définition de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Confirmer les changements à appliquer en cliquant sur &lt;b class=&quot;button&quot;&gt;Continuer&lt;/b&gt;.&lt;/p&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-5.png&quot; alt=&quot;confirmation du partitionnement&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;confirmation du partitionnement&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arrivé à l&amp;#8217;étape « Qui êtes-vous ? », saisir les informations du compte
utilisateur à créer, puis cliquer sur &lt;b class=&quot;button&quot;&gt;Continuer&lt;/b&gt; pour terminer
l&amp;#8217;installation.&lt;/p&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
pour faire en sorte de déchiffrer le volume du répertoire
utilisateur à la connexion de celui-ci, il est primordial de saisir un mot de
passe &lt;strong&gt;identique&lt;/strong&gt; à la &lt;em&gt;passphrase&lt;/em&gt; saisie lors du
&lt;a href=&quot;#volume-encryption-init&quot;&gt;chiffrement du volume&lt;/a&gt;.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/ubuntu-install-with-encrypted-home-6.png&quot; alt=&quot;création du compte utilisateur&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Installation d&amp;#8217;Ubuntu&amp;#8201;&amp;#8212;&amp;#8201;création du compte utilisateur&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
À la fin de l&amp;#8217;installation, &lt;strong&gt;ne pas&lt;/strong&gt; redémarrer l&amp;#8217;ordinateur.
Il nous reste des choses à faire.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;avant-de-redémarrer&quot;&gt;Avant de redémarrer !&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après l&amp;#8217;installation il nous reste à faire en sorte que l&amp;#8217;ouverture d&amp;#8217;une
session utilisateur entraîne le déchiffrement puis le montage de son volume
personnel.
Nous allons également prendre soin de chiffrer l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si par erreur un redémarrage a eu lieu à la fin de l&amp;#8217;installation, penser à
&lt;a href=&quot;#open-crypt-volume&quot;&gt;déverrouiller manuellement le volume chiffré&lt;/a&gt; avant de dérouler les instructions ci-dessous.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Configurer des points de montages pour faire un &lt;code&gt;chroot&lt;/code&gt; dans l&amp;#8217;environnement
installé :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount /dev/mapper/vgmain-root /mnt &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    &amp;amp;&amp;amp; mount /dev/disk/by-partlabel/esp /mnt/boot/efi \
    &amp;amp;&amp;amp; mount /dev/mapper/home-jl /mnt/home/jl
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--rbind&lt;/span&gt; /dev  /mnt/dev &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    &amp;amp;&amp;amp; mount --rbind /proc /mnt/proc \
    &amp;amp;&amp;amp; mount --rbind /sys  /mnt/sys
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; /etc/resolv.conf /mnt/etc/resolv.conf&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;chroot&lt;/span&gt; /mnt&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Monte les différents périphériques pour reproduire le système de fichiers
de la machine installée.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Monte des pseudo systèmes de fichiers de l&amp;#8217;hôte.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Copie le fichier de résolution des DNS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;change root&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copier des fichiers de configuration manquants dans le répertoire
utilisateur :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cp&lt;/span&gt; /etc/skel/.&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; /home/jl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un script de déverrouillage du volume logique chiffré
&lt;code&gt;/usr/local/bin/pam-crypt-open.sh&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;CRYPT_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;jl&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;MAPPER_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;home-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CRYPT_USER&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;MAPPER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/dev/mapper/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MAPPER_NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PAM_USER&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CRYPT_USER&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$MAPPER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;then
  &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;\0&apos;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;\n&apos;&lt;/span&gt; | /sbin/cryptsetup open &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;luks /dev/mapper/vgmain-crypt &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MAPPER_NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce script permet d&amp;#8217;utiliser le mot de passe saisi par l&amp;#8217;utilisateur lors de
l&amp;#8217;ouverture de session pour déchiffrer le volume &lt;code&gt;/dev/mapper/vgmain-crypt&lt;/code&gt;
(si l&amp;#8217;identifiant utilisateur est celui attendu et si le volume n&amp;#8217;est pas déjà
ouvert).&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attribuer les droits d&amp;#8217;exécution à ce script&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;chmod &lt;/span&gt;u+x /usr/local/bin/pam-crypt-open.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer &lt;code&gt;pam&lt;/code&gt; pour rendre accessible le contenu du volume chiffré lors
d&amp;#8217;une ouverture de session :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;auth    optional    pam_exec.so expose_authtok /usr/local/bin/pam-crypt-open.sh&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/pam.d/common-auth&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le module &lt;code&gt;pam_exec&lt;/code&gt; permet d&amp;#8217;appeler le script ajouté ci-dessus à l&amp;#8217;ouverture
d&amp;#8217;une session utilisateur.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Faire en sorte de monter le volume chiffré uniquement lorsque nécessaire
(à l&amp;#8217;ouverture de session, après déchiffrement) :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;home&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;jl&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s\+&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;ext4&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\s\+\)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;defaults/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;rw,suid,dev,exec,noauto,nouser,async/&quot;&lt;/span&gt; /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La commande ci-dessus modifie le fichier &lt;code&gt;/etc/fstab&lt;/code&gt; et remplace le paramètre
&lt;code&gt;defaults&lt;/code&gt; de montage du répertoire utilisateur (qui équivaut à
&lt;code&gt;rw,suid,dev,exec,auto,nouser,async&lt;/code&gt;) par la valeur
&lt;code&gt;rw,suid,dev,exec,&lt;strong&gt;noauto&lt;/strong&gt;,nouser,async&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer le chiffrement de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Définir la configuration de chiffrement de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;swap&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;/span&gt;&lt;span class=&quot;go&quot;&gt;    /dev/mapper/vgmain-swap\&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
    /dev/urandom\&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;(3)&lt;/b&gt;
    plain,swap,cipher=aes-xts-plain64,size=256&quot; \&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;(4)&lt;/b&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;    &amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;/etc/crypttab&lt;i class=&quot;conum&quot; data-value=&quot;5&quot;&gt;&lt;/i&gt;&lt;b&gt;(5)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;L&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; déchiffré sera accessible au travers du périphérique bloc
&lt;code&gt;/dev/mapper/swap&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Chemin du périphérique bloc à déchiffrer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;3&quot;&gt;&lt;/i&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;La clé de chiffrement est générée aléatoirement à chaque démarrage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;4&quot;&gt;&lt;/i&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Indique que le mode de chiffrement est &lt;code&gt;plain&lt;/code&gt;, puis spécifie l&amp;#8217;utilisation
en tant qu&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; ainsi que les options de chiffrement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;5&quot;&gt;&lt;/i&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Le fichier &lt;code&gt;/etc/crypttab&lt;/code&gt; décrit les périphériques blocs qui sont
déchiffrés au démarrage.
&lt;div class=&quot;admonitionblock important&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-important&quot; title=&quot;Important&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce mode de chiffrement de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; empêche son utilisation
pour de l&amp;#8217;hibernation (&lt;em&gt;suspend to disk&lt;/em&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mettre à jour le chemin de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; dans le fichier &lt;code&gt;/etc/fstab&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;mapper&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;vgmain-swap/&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;mapper&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;swap/&quot;&lt;/span&gt; /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Désactivier l&amp;#8217;utilisaton de l&amp;#8217;espace &lt;em&gt;swap&lt;/em&gt; pour l&amp;#8217;hibernation :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;RESUME=none&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /etc/initramfs-tools/conf.d/resume &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; update-initramfs &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quitter « l&amp;#8217;environnement » &lt;code&gt;chroot&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Démonter toute l&amp;#8217;arborescence &lt;code&gt;/mnt&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;mount | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; /mnt | &lt;span class=&quot;nb&quot;&gt;tac&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;/\/mnt/ {print $3}&apos;&lt;/span&gt; | xargs &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; umount &lt;span class=&quot;nt&quot;&gt;-lf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nous en avons terminé dans cette session &lt;em&gt;live&lt;/em&gt;. Nous pouvons redémarrer
l&amp;#8217;ordinateur.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;démarrage&quot;&gt;Démarrage&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;installation est terminée et l&amp;#8217;ordinateur est utilisable en l&amp;#8217;état.
Nous allons malgré tout renforcer la sécurité de cette installation en faisant
en sorte de démonter le répertoire personnel, puis verrouiller le volume chiffré
lorsque l&amp;#8217;utilisateur clôt sa session.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Ouvrir un terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer le démontage de &lt;code&gt;/home/jl&lt;/code&gt; lors de la fermeture de session&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Après fermeture d&amp;#8217;une session utilisateur, systemd arrête automatiquement le
service &lt;code&gt;user@1000.service&lt;/code&gt; (où &lt;code&gt;1000&lt;/code&gt; est le PID de l&amp;#8217;utilisateur &lt;code&gt;jl&lt;/code&gt;).
En spécifiant que le point de montage &lt;code&gt;/home/jl&lt;/code&gt; requiert le fonctionnement de
ce service, systemd le démontera automatiquement à l&amp;#8217;arrêt de celui-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Éditer le fichier de configuration systemd correspondant au point de
montage &lt;code&gt;/home/jl&lt;/code&gt; (&lt;em&gt;mount unit&lt;/em&gt;) :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemctl edit home-jl.mount&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Et ajouter une dépendance vers l&amp;#8217;unité &lt;code&gt;user@1000.service&lt;/code&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;systemd&quot;&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;Requires&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;user@1000.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Enregistrer puis quitter l&amp;#8217;éditeur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En procédant ainsi, on introduit une dépendance circulaire qu&amp;#8217;il faut résoudre
en modifiant la configuration du service &lt;code&gt;user@1000.service&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Éditer l&amp;#8217;unité de service &lt;code&gt;user@1000.service&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemctl edit user@1000.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Et ajouter les contraintes suivantes :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;systemd&quot;&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;Requires&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;home-jl.mount
&lt;span class=&quot;nt&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;home-jl.mount&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer le verrouillage du volume chiffré à la fermeture de session.&lt;/p&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour parvenir à cet objectif, nous allons définir un nouveau service qui démarre
au déverrouillage du volume chiffré et se termine au démontage du répertoire
&lt;code&gt;/home/jl&lt;/code&gt;, tout en déclenchant le verrouillage du volume.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Créer le service &lt;code&gt;cryptsetup-jl.service&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;openblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemctl edit &lt;span class=&quot;nt&quot;&gt;--full&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    cryptsetup-jl.service&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Combinaison d&amp;#8217;options à saisir pour créer un nouveau service :
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--full&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;spécifie d&amp;#8217;éditer le fichier de configuration complet.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;&lt;code&gt;--force&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;force la création du fichier s&amp;#8217;il n&amp;#8217;existe pas.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Nom donné au service.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avec la configuration suivante :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;systemd&quot;&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;DefaultDependencies&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;no
&lt;span class=&quot;nt&quot;&gt;BindsTo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;dev-mapper-vgmain\x2dcrypt.device
&lt;span class=&quot;nt&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;dev-mapper-vgmain\x2dcrypt.device
&lt;span class=&quot;nt&quot;&gt;BindsTo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;dev-mapper-home\x2djl.device
&lt;span class=&quot;nt&quot;&gt;Requires&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;home-jl.mount
&lt;span class=&quot;nt&quot;&gt;Before&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;home-jl.mount
&lt;span class=&quot;nt&quot;&gt;Conflicts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;umount.target
&lt;span class=&quot;nt&quot;&gt;Before&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;umount.target

&lt;span class=&quot;k&quot;&gt;[Service]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;oneshot
&lt;span class=&quot;nt&quot;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;yes
&lt;span class=&quot;nt&quot;&gt;TimeoutSec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;nt&quot;&gt;ExecStop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;/sbin/cryptsetup close home-jl

&lt;span class=&quot;k&quot;&gt;[Install]&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;RequiredBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;dev-mapper-home\x2djl.device&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;code&gt;dev-mapper-vgmain\x2dcrypt.device&lt;/code&gt; est le « fichier » de configuration systemd
désignant le périphérique bloc &lt;code&gt;/dev/mapper/vgmain-crypt&lt;/code&gt; (on parle de
&lt;em&gt;device unit configuration&lt;/em&gt;). Cette chaîne de caractère est obtenu à l&amp;#8217;aide de
la commande &lt;code&gt;systemd-escape&lt;/code&gt;:&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemd-escape &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
&lt;span class=&quot;go&quot;&gt;    /dev/mapper/vgmain-crypt &lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-p&lt;/code&gt; indique que la valeur qui suit est un chemin de fichier.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Chemin du périphérique bloc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activer le service &lt;code&gt;cryptsetup-jl.service&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;systemctl &lt;span class=&quot;nb&quot;&gt;enable &lt;/span&gt;cryptsetup-jl.service&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;et-au-final-content&quot;&gt;Et au final, content ?&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Éh bien oui, ça fonctionne très bien. Mon répertoire utilisateur est
déverrouillé lorsque j&amp;#8217;ouvre une session utilisateur et est automatiquement
reverouillé lorsque je la clos.
Dans l&amp;#8217;absolu on obtient un système moins sécurisé qu&amp;#8217;avec un disque totalement
chiffré, mais je pense que la facilité d&amp;#8217;utilisation est également à prendre en
compte.
Le fait d&amp;#8217;avoir un ordinateur sur lequel les données utilisateur&amp;#8201;&amp;#8212;&amp;#8201;les plus
critiques donc&amp;#8201;&amp;#8212;&amp;#8201;sont protégées de manière transparente facilite selon moi
l&amp;#8217;adoption du chiffrement.
Certains ergoteront qu&amp;#8217;utiliser le même mot de passe pour le compte utilisateur
et pour le chiffrement du volume présente un risque.
Le risque me paraît acceptable dès lors que j&amp;#8217;opte pour un mot de passe
suffisamment long et non-trivial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il reste néanmoins un petit bémol pour en faire une solution totalement aboutie.
Lorsque je serai amené à changer de mot de passe utilisateur, je devrai
prendre soin de modifier manuellement la &lt;em&gt;passphrase&lt;/em&gt; du volume chiffré pour les
garder identiques.
L&amp;#8217;intégration d&amp;#8217;eCryptfs à PAM était complète et prenait en charge ce cas
d&amp;#8217;utilisation.
Il existe un
&lt;a href=&quot;https://github.com/google/pam-cryptsetup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;projet&lt;/a&gt; poussant un
peu plus loin l&amp;#8217;intégration de &lt;code&gt;cryptsetup&lt;/code&gt; à PAM, mais je n&amp;#8217;ai pas pris le
temps de le tester.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Malgré cette réserve, j&amp;#8217;ai décidé de conserver cette configuration pour mon
usage quotidien.
Je ne change pas de mot de passe si souvent que ça et, le moment venu, ce sera
une bonne opportunité de me replonger dans cet article.
À mon moi du futur qui cherche comment changer la &lt;em&gt;passphrase&lt;/em&gt; du volume
chiffré, la réponse est là :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;cryptsetup luksChangeKey /dev/mapper/vgmain-crypt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dernier point positif que je découvre seulement à la conclusion de cet article :
même si ce n&amp;#8217;était pas l&amp;#8217;objectif recherché, peut-être ai-je gagné en confort
d&amp;#8217;utilisation au quotidien, tant LUKS/dm-crypt semble une solution
&lt;a href=&quot;https://www.phoronix.com/scan.php?page=article&amp;amp;item=ext4-crypto-418&amp;amp;num=3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;plus performante&lt;/a&gt;
qu&amp;#8217;eCryptfs.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;références&quot;&gt;Références&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;ulist bibliography&quot;&gt;
&lt;ul class=&quot;bibliography&quot;&gt;
&lt;li&gt;
&lt;p&gt;Encrypting disks on Ubuntu 19.04 : &lt;a href=&quot;https://medium.com/@chrishantha/encrypting-disks-on-ubuntu-19-04-b50bfc65182a&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://medium.com/@chrishantha/encrypting-disks-on-ubuntu-19-04-b50bfc65182a&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Full Disk Encryption Howto 2019 : &lt;a href=&quot;https://help.ubuntu.com/community/Full_Disk_Encryption_Howto_2019&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://help.ubuntu.com/community/Full_Disk_Encryption_Howto_2019&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Encrypting a non-root file system : &lt;a href=&quot;https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_a_non-root_file_system&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_a_non-root_file_system&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Encryption options for LUKS mode : &lt;a href=&quot;https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encryption_options_for_LUKS_mode&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption#Encryption_options_for_LUKS_mode&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mounting at login : &lt;a href=&quot;https://wiki.archlinux.org/index.php/Dm-crypt/Mounting_at_login&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiki.archlinux.org/index.php/Dm-crypt/Mounting_at_login&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Swap encryption : &lt;a href=&quot;https://wiki.archlinux.org/index.php/Dm-crypt/Swap_encryption&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiki.archlinux.org/index.php/Dm-crypt/Swap_encryption&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to Change Your LUKS Encryption Passphrase : &lt;a href=&quot;https://www.maketecheasier.com/change-luks-encryption-passphrase/&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.maketecheasier.com/change-luks-encryption-passphrase/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. &lt;em&gt;block device&lt;/em&gt; dans la langue de Shakespeare, mais j&amp;#8217;essaie d&amp;#8217;employer des termes français quand c&amp;#8217;est possible.
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. Mio pour « mébioctet ». 1 Mio = 2&lt;sup&gt;20&lt;/sup&gt; octets = 1 048 576 octets, alors que 1 Mo = 10&lt;sup&gt;6&lt;/sup&gt; octets = 1 000 000 octets. Voir &lt;a href=&quot;https://fr.wikipedia.org/wiki/Octet&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fr.wikipedia.org/wiki/Octet&lt;/a&gt;.
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_3&quot;&gt;
&lt;a href=&quot;#_footnoteref_3&quot;&gt;3&lt;/a&gt;. Voir les codes hexadécimaux des différents types de partitions : &lt;a href=&quot;https://askubuntu.com/questions/703443/gdisk-hex-codes&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://askubuntu.com/questions/703443/gdisk-hex-codes&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_4&quot;&gt;
&lt;a href=&quot;#_footnoteref_4&quot;&gt;4&lt;/a&gt;. Voir la description des métadonnées cryptographique : &lt;a href=&quot;https://wiki.archlinux.org/index.php/Data-at-rest_encryption#Cryptographic_metadata&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wiki.archlinux.org/index.php/Data-at-rest_encryption#Cryptographic_metadata&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_5&quot;&gt;
&lt;a href=&quot;#_footnoteref_5&quot;&gt;5&lt;/a&gt;. Voir article Wikipédia sur la fonction de dérivation de clé Argon2 : &lt;a href=&quot;https://fr.wikipedia.org/wiki/Argon2&quot; class=&quot;bare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fr.wikipedia.org/wiki/Argon2&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        <pubDate>Tue, 18 Aug 2020 00:00:00 +0000</pubDate>
        <link>https://blog.jl.bzh/2020/08/18/transparent-user-data-encryption-with-luks-dm-crypt.html</link>
        <guid isPermaLink="true">https://blog.jl.bzh/2020/08/18/transparent-user-data-encryption-with-luks-dm-crypt.html</guid>
        
        <category>Linux</category>
        
        <category>LUKS</category>
        
        <category>Ubuntu</category>
        
        <category>systemd</category>
        
        
      </item>
    
      <item>
        <title>Démarrer un projet basé sur Ruby 💎</title>
        <description>&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Sommaire&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#rvm-ruby-version-manager&quot;&gt;RVM (Ruby Version Manager)&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#installation&quot;&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#quelques-commandes-utiles&quot;&gt;Quelques commandes utiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#gestion-des-dépendances&quot;&gt;Gestion des dépendances&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#démarrer-un-nouveau-projet&quot;&gt;Démarrer un nouveau projet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
Tiens ! Si je jetais un œil à mon blog ? Mince, j&amp;#8217;ai changé de PC
depuis la dernière fois… Ah ! Il faut que j&amp;#8217;installe Ruby 💎🤔…
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
&amp;#8212; Bibi
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce blog utilise &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, générateur de site statique
en Ruby.
Ce n&amp;#8217;est pas un environnement technique que j&amp;#8217;utilise au quotidien et ce blog
est mis à jour suffisamment rarement pour que le &lt;em&gt;garbage collector&lt;/em&gt; de
ma mémoire ait malheureusement fait son office.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le temps passé à réinstaller toute la &lt;em&gt;stack&lt;/em&gt; justifie donc l&amp;#8217;écriture
d&amp;#8217;un article « pense-bête », une sorte de B-A, BA
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;
de l&amp;#8217;installation d&amp;#8217;une stack Ruby 💎 dans un environnement Linux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cet article est loin d&amp;#8217;être exhaustif sur l&amp;#8217;environnement Ruby.
Il ne fait qu&amp;#8217;aborder une infime partie des outils et commandes proposés
par la &lt;em&gt;stack&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le spectre d&amp;#8217;outils évoqué ici suffit pour un projet basé sur un &lt;em&gt;framework&lt;/em&gt;
nécessitant un environnement Ruby (Jekyll, Asciidoctor…), mais n&amp;#8217;est clairement
pas suffisant pour se lancer dans un réel développement en language Ruby.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;rvm-ruby-version-manager&quot;&gt;RVM (Ruby Version Manager)&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;J&amp;#8217;aurais pu me contenter d&amp;#8217;un &lt;code&gt;sudo apt install ruby&lt;/code&gt;, mais tout comme je suis
parfois amené à jongler entre plusieurs version de Node.js, je pourrais avoir à
gérer plusieurs versions de Ruby selon les projets dans lesquels je me lance.
C&amp;#8217;est là qu&amp;#8217;intervient &lt;a href=&quot;https://rvm.io/&quot;&gt;RVM&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://rvm.io/&quot;&gt;RVM&lt;/a&gt; est à Ruby ce que
&lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;NVM&lt;/a&gt; est à Node.js.
Il permet de gérer sur un même OS plusieurs environnements d&amp;#8217;exécution Ruby.
De multiples interpréteurs sont disponibles à l&amp;#8217;installation (Ruby MRI, JRuby…),
chacun disponible dans plusieurs versions.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;outil permet également d&amp;#8217;isoler les dépendances tierces des projets Ruby à
l&amp;#8217;aide de &lt;em&gt;gemsets&lt;/em&gt;, que je n&amp;#8217;aborderais pas ici, préférant gérer les
dépendances de chacun de mes projets au sein de ceux-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;installation se fait en une commande :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://get.rvm.io | bash &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; stable&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si comme moi vous n&amp;#8217;aimez pas qu&amp;#8217;on trifouille dans vos fichiers de
configuration (&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.profile&lt;/code&gt;, etc.), vous pouvez exécuter la commande
d&amp;#8217;installation avec l&amp;#8217;option &lt;code&gt;--ignore-dotfiles&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;curl &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://get.rvm.io | bash &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--ignore-dotfiles&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Mais charge à vous ensuite d&amp;#8217;ajouter comme il vous sied les
&lt;a href=&quot;https://gitlab.com/jljouannic/laptop-playbook/-/blob/master/files/30_rvm.bashrc&quot;&gt;instructions nécessaires&lt;/a&gt;
au bon fonctionnement de RVM&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;quelques-commandes-utiles&quot;&gt;Quelques commandes utiles&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La documentation de RVM est dense, très dense.
Voici donc, en synthèse, les quelques commandes que j&amp;#8217;utilise le plus
fréquemment :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Lister les versions de Ruby disponibles à l&amp;#8217;installation&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm list known&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Installer une version de Ruby&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &amp;lt;VERSION&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Sélectionner une version de Ruby par défaut&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm &lt;span class=&quot;nt&quot;&gt;--default&lt;/span&gt; use &amp;lt;VERSION&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Sélectionner une version de Ruby pour un projet&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm &lt;span class=&quot;nt&quot;&gt;--ruby-version&lt;/span&gt; use &amp;lt;VERSION&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;option &lt;code&gt;--ruby-version&lt;/code&gt;, optionnelle, permet de sauvegarder la version
spécifiée dans la commande dans un fichier &lt;code&gt;.ruby-version&lt;/code&gt; du répertoire courant.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ainsi inutile à l&amp;#8217;avenir de spécifier la version en paramètre. La commande
suivante, exécutée dans le répertoire projet, suffira à charger
l&amp;#8217;environnement :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm use&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Mettre à jour RVM&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm get stable&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Faire le ménage&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm cleanup all&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette commande se révèle particulièrement utile si votre répertoire &lt;code&gt;~/.rvm&lt;/code&gt;
prend de l&amp;#8217;embonpoint
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;
.&lt;/p&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;gestion-des-dépendances&quot;&gt;Gestion des dépendances&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En Ruby, les dépendances sont appelées des &lt;em&gt;gems&lt;/em&gt;, et l&amp;#8217;outil de prédilection
pour les gérer est &lt;a href=&quot;https://bundler.io/&quot;&gt;Bundler&lt;/a&gt;.
Pour continuer dans les analogies avec Node.js, Bundler est un peu le NPM de
Ruby.
Tout comme NPM avec Node.js, l&amp;#8217;outil est lui aussi disponible après
l&amp;#8217;installation d&amp;#8217;un environnement Ruby avec RVM.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les dépendances d&amp;#8217;un projet sont spécifiées dans un fichier &lt;code&gt;Gemfile&lt;/code&gt;
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_3&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_3&quot; title=&quot;View footnote.&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Voici une liste non-exhaustive des commandes proposées par Bundler :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;dlist&quot;&gt;
&lt;dl&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Installer les dépendances &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_4&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_4&quot; title=&quot;View footnote.&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cette commande interprète le contenu du fichier &lt;code&gt;Gemfile&lt;/code&gt; pour télécharger et
installer les dépendances qui y sont indiquées, ainsi que les dépendances
transitives.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Lors de la première exécution la commande génère un fichier &lt;code&gt;Gemfile.lock&lt;/code&gt; dans
lequel on retrouve la liste exhaustive des &lt;em&gt;gems&lt;/em&gt; installés ainsi que la
version précise de chacun.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Si un fichier &lt;code&gt;Gemfile.lock&lt;/code&gt; est présent lors de l&amp;#8217;exécution de la commande,
il n&amp;#8217;y a pas de résolution des dépendances. La commande installe simplement les
&lt;em&gt;gems&lt;/em&gt; indiqués dans le fichier.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme évoqué plus haut, j&amp;#8217;aime bien disposer des dépendances de mon projet
directement dans celui-ci (les habitudes de travailler avec Node.js 🤷‍♂️).
La commande &lt;code&gt;bundle&lt;/code&gt; supporte des paramètres qui permettent de répondre à ce
besoin :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    --path=.bundle/gems \&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;
    --binstubs=.bundle/.bin&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;(2)&lt;/b&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Indique à Bundler de télécharger les &lt;em&gt;gems&lt;/em&gt; dans le répertoire &lt;code&gt;.bundle/gems&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;2&quot;&gt;&lt;/i&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;les exécutables des &lt;em&gt;gems&lt;/em&gt; seront placés dans le répertoire &lt;code&gt;.bundle/.bin&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;les valeurs données à &lt;code&gt;path&lt;/code&gt; et &lt;code&gt;binstubs&lt;/code&gt; sont sauvegardées dans un fichier
&lt;code&gt;.bundle/config&lt;/code&gt;.
Inutile donc de spécifier ces options à chaque exécution de &lt;code&gt;bundle install&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;dt class=&quot;hdlist1&quot;&gt;Mettre à jour les dépendances &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_5&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_5&quot; title=&quot;View footnote.&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;&lt;/dt&gt;
&lt;dd&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle update &lt;span class=&quot;nt&quot;&gt;--all&lt;/span&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;i class=&quot;conum&quot; data-value=&quot;1&quot;&gt;&lt;/i&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;L&amp;#8217;option &lt;code&gt;--all&lt;/code&gt; force Bundler à résoudre les dépendances en ignorant les
&lt;em&gt;gems&lt;/em&gt; précédemennt installés, et à regénérer le &lt;code&gt;Gemfile.lock&lt;/code&gt;.
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La commande &lt;code&gt;bundle update&lt;/code&gt; respecte toujours les versions de &lt;em&gt;gems&lt;/em&gt; indiquées
dans le fichier &lt;code&gt;Gemfile&lt;/code&gt;.
Il faut donc modifier manuellement le fichier pour s&amp;#8217;assurer de télécharger
les versions souhaitées des dépendances.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour lister les &lt;em&gt;gems&lt;/em&gt; dont les versions pourraient être mises à jour dans le
fichier &lt;code&gt;Gemfile&lt;/code&gt;, utiliser la commande suivante
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_6&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_6&quot; title=&quot;View footnote.&quot;&gt;6&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle outdated | &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;requested&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;démarrer-un-nouveau-projet&quot;&gt;Démarrer un nouveau projet&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le moment est venu de mettre en œuvre les quelques commandes passées en revu
jusqu&amp;#8217;ici.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous prendrons comme exemple la création d&amp;#8217;un nouveau projet de documentation
utilisateur écrit en Asciidoc à l&amp;#8217;aide de la librairie
&lt;a href=&quot;https://asciidoctor.org/&quot;&gt;&lt;code&gt;asciidoctor&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;olist arabic&quot;&gt;
&lt;ol class=&quot;arabic&quot;&gt;
&lt;li&gt;
&lt;p&gt;Créer le répertoire projet&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;some-documentation-project &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;some-documentation-project&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Charger l&amp;#8217;environnement Ruby&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm &lt;span class=&quot;nt&quot;&gt;--ruby-version&lt;/span&gt; use 2.6&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La version de Ruby souhaitée doit évidemment avoir été installée au préalable
avec la commande suivante :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rvm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;2.6&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Initier un nouveau fichier &lt;code&gt;Gemfile&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle init&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ajouter la dépendance à &lt;code&gt;asciidoctor&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;gem &apos;asciidoctor&apos;, &apos;~&amp;gt; 2.0.10&apos;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; Gemfile&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La manière dont est spécifié la version du &lt;em&gt;gem&lt;/em&gt; &lt;code&gt;asciidoctor&lt;/code&gt; utilise
l&amp;#8217;opérateur pessimiste &lt;code&gt;~&amp;gt;&lt;/code&gt;, aussi appelé &lt;em&gt;twidlle waka&lt;/em&gt;
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_7&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_7&quot; title=&quot;View footnote.&quot;&gt;7&lt;/a&gt;]&lt;/sup&gt;.
Dans le cas présent celui-ci permet de spécifier qu&amp;#8217;on souhaite travailler avec
la version d&apos;&lt;code&gt;asciidoctor&lt;/code&gt; la plus haute dans la plage &lt;code&gt;≥ 2.0.10&lt;/code&gt; et &lt;code&gt;&amp;lt; 2.1&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Télécharger les dépendances du projet&lt;/p&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;rouge highlight&quot;&gt;&lt;code data-lang=&quot;terminal&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;.bundle/gems &lt;span class=&quot;nt&quot;&gt;--binstubs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;.bundle/.bin&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Travailler&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Profits
&lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_8&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_8&quot; title=&quot;View footnote.&quot;&gt;8&lt;/a&gt;]&lt;/sup&gt; !&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. Expression totalement désuète dont j&amp;#8217;ai découvert l&amp;#8217;étymologie lors de l&amp;#8217;écriture de ce post (voir &lt;a href=&quot;https://fr.wiktionary.org/wiki/b.a.-ba#fr&quot; class=&quot;bare&quot;&gt;https://fr.wiktionary.org/wiki/b.a.-ba#fr&lt;/a&gt;). Du coup je l&amp;#8217;ai conservée 😊.
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. Faire le ménage dans RVM : &lt;a href=&quot;https://coderwall.com/p/x3z2ag/cleanup-rvm&quot; class=&quot;bare&quot;&gt;https://coderwall.com/p/x3z2ag/cleanup-rvm&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_3&quot;&gt;
&lt;a href=&quot;#_footnoteref_3&quot;&gt;3&lt;/a&gt;. Description du fichier &lt;code&gt;Gemfile&lt;/code&gt; : &lt;a href=&quot;https://bundler.io/man/gemfile.5.html&quot; class=&quot;bare&quot;&gt;https://bundler.io/man/gemfile.5.html&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_4&quot;&gt;
&lt;a href=&quot;#_footnoteref_4&quot;&gt;4&lt;/a&gt;. Description de la commande &lt;code&gt;bundle install&lt;/code&gt; : &lt;a href=&quot;https://bundler.io/v2.0/man/bundle-install.1.html&quot; class=&quot;bare&quot;&gt;https://bundler.io/v2.0/man/bundle-install.1.html&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_5&quot;&gt;
&lt;a href=&quot;#_footnoteref_5&quot;&gt;5&lt;/a&gt;. Description de la commande &lt;code&gt;bundle update&lt;/code&gt; : &lt;a href=&quot;https://bundler.io/v2.0/man/bundle-update.1.html&quot; class=&quot;bare&quot;&gt;https://bundler.io/v2.0/man/bundle-update.1.html&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_6&quot;&gt;
&lt;a href=&quot;#_footnoteref_6&quot;&gt;6&lt;/a&gt;. A Guide to Update Gems with bundle update : &lt;a href=&quot;https://medium.com/cedarcode/reduce-fear-of-bundle-update-with-this-4-step-process-e021e8808c48&quot; class=&quot;bare&quot;&gt;https://medium.com/cedarcode/reduce-fear-of-bundle-update-with-this-4-step-process-e021e8808c48&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_7&quot;&gt;
&lt;a href=&quot;#_footnoteref_7&quot;&gt;7&lt;/a&gt;. Ruby&amp;#8217;s Pessimistic Operator : &lt;a href=&quot;https://thoughtbot.com/blog/rubys-pessimistic-operator&quot; class=&quot;bare&quot;&gt;https://thoughtbot.com/blog/rubys-pessimistic-operator&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_8&quot;&gt;
&lt;a href=&quot;#_footnoteref_8&quot;&gt;8&lt;/a&gt;. Voir l&amp;#8217;épisode S02E17 de South Park « Les Gnomes voleurs de slips » : &lt;a href=&quot;https://i.kym-cdn.com/entries/icons/original/000/000/248/profit.jpg&quot; class=&quot;bare&quot;&gt;https://i.kym-cdn.com/entries/icons/original/000/000/248/profit.jpg&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        <pubDate>Sat, 29 Feb 2020 00:00:00 +0000</pubDate>
        <link>https://blog.jl.bzh/2020/02/29/ruby-based-project-101.html</link>
        <guid isPermaLink="true">https://blog.jl.bzh/2020/02/29/ruby-based-project-101.html</guid>
        
        <category>RVM</category>
        
        <category>Ruby</category>
        
        <category>Tips</category>
        
        
      </item>
    
      <item>
        <title>Rétro-conception d&amp;#8217;un logo</title>
        <description>&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Suite à la refonte du logo du &lt;a href=&quot;http://www.breizhcamp.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BreizhCamp&lt;/a&gt;,
il y a un peu plus de deux ans, il m&amp;#8217;est venu l&amp;#8217;envie d&amp;#8217;en réaliser
une version générée de manière procédurale. Ne me demandez pas pourquoi.
Moi-même, je n&amp;#8217;en sais rien.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Peut-être son aspect très épuré m&amp;#8217;a-t-il laisser penser que la tâche
serait simple.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
Ça ne doit pas être bien compliqué à coder…
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
&amp;#8212; Moi&lt;br&gt;
&lt;cite&gt;un peu optimiste en ce début 2015&lt;/cite&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À l&amp;#8217;époque, j&amp;#8217;avais ainsi passé quelques soirées, d&amp;#8217;abord à reproduire
le logo sous la forme d&amp;#8217;un dessin technique, puis à en extraire
quelques formules de trigo avant de finalement implémenter tout ça à
la va-vite dans un
&lt;a href=&quot;http://plnkr.co/edit/gYvo7IAk4FCXgoipFAgt?p=preview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;plunk&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Aujourd&amp;#8217;hui, je saisis l&amp;#8217;opportunité de devoir alimenter ce tout
nouveau &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_1&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_1&quot; title=&quot;View footnote.&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; blog pour reprendre
ce travail au propre.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;toc&quot; class=&quot;toc&quot;&gt;
&lt;div id=&quot;toctitle&quot;&gt;Sommaire&lt;/div&gt;
&lt;ul class=&quot;sectlevel1&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#le-dessin-technique&quot;&gt;Le dessin technique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#un-peu-de-maths&quot;&gt;Un peu de maths…&lt;/a&gt;
&lt;ul class=&quot;sectlevel2&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#la-tête&quot;&gt;La &lt;em&gt;tête&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#le-dos&quot;&gt;Le &lt;em&gt;dos&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#le-ventre&quot;&gt;Le &lt;em&gt;ventre&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#les-points&quot;&gt;Les points&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;le-dessin-technique&quot;&gt;Le dessin technique&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Appelé aussi &lt;em&gt;dessin pour ceux qui aiment faire de jolies choses, mais ne
savent pas dessiner&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le logo du BreizhCamp est un
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Trisk%C3%A8le&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;triskell&lt;/a&gt; stylisé,
composé de trois &lt;em&gt;gouttes&lt;/em&gt; colorées.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp.svg&quot; alt=&quot;Logo du BreizhCamp&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 1. Le logo du BreizhCamp&amp;#8201;&amp;#8212;&amp;#8201;vue d&amp;#8217;artiste&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ça, c&amp;#8217;est la vision de l&amp;#8217;artiste. On devine quelques irrégularités
dans les arcs, les gouttes ne sont pas identiques, etc.
Et c&amp;#8217;est très bien comme ça !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je ne suis pas un artiste. Je vais adopter un point de vue plus
pragmatique pour la modélisation du logo. Ma version sera ainsi
constituée de trois &lt;em&gt;gouttes&lt;/em&gt; identiques, chacune composée de trois
portions de cercles : la &lt;em&gt;tête&lt;/em&gt;, le &lt;em&gt;dos&lt;/em&gt; et le &lt;em&gt;ventre&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-overview&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-overview.svg&quot; alt=&quot;Logo du BreizhCamp en DAO&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 2. Le logo du BreizhCamp&amp;#8201;&amp;#8212;&amp;#8201;vue d&amp;#8217;ingénieur&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La figure de base pour la réalisation du triskell est un triangle
équilatéral dont chaque sommet est le centre de l&amp;#8217;arc de cercle
constituant la &lt;em&gt;tête&lt;/em&gt; d&amp;#8217;une &lt;em&gt;goutte&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-full&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-full.svg&quot; alt=&quot;Logo du BreizhCamp en DAO&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 3. Modélisation du logo&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;un-peu-de-maths&quot;&gt;Un peu de maths…&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;objectif ici est de défricher le terrain avant de travailler sereinement sur
une implémentation. Nous allons passer en revue tous les éléments nécessaires
au tracé du triskell.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Première dimension à mettre en évidence : l&amp;#8217;écart entre les &lt;em&gt;gouttes&lt;/em&gt; du
triskell.
Il est représenté par le paramètre \(\Delta\).
Il représente concrètement la distance entre les sommets de deux triangles :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Le triangle &lt;em&gt;extérieur&lt;/em&gt; \(T_\Delta\), figure de base du triskell, connecte
les centres des 3 &lt;em&gt;têtes&lt;/em&gt; de &lt;em&gt;gouttes&lt;/em&gt;. Il a des côtés de longueur
\(2\left(r_1+\Delta\cos\left(\frac{\pi}{6}\right)\right)\).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le triangle &lt;em&gt;intérieur&lt;/em&gt; \(T_0\) est le cas particulier où \(\Delta=0\).
Dans cette configuration, il n&amp;#8217;y a pas d&amp;#8217;écart entre les &lt;em&gt;gouttes&lt;/em&gt;. Elles sont
tangentes. La longueur d&amp;#8217;un de ses
côtés est égale à \(2r_1\).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
Dans l&amp;#8217;implémentation, \(\Delta\) sera utilisé en tant que paramètre
      d&amp;#8217;entrée pour générer le triskell.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;L&amp;#8217;angle \(\theta\) sert à orienter la première &lt;em&gt;goutte&lt;/em&gt; du triskell, avant
de dessiner les suivantes, et définit ainsi l&amp;#8217;orientation globale du dessin.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
\(\theta\) pourra aussi être utilisé en tant que paramètre à la
génération du triskell.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les trois &lt;em&gt;gouttes&lt;/em&gt; constituant le triskell étant construites de
la même manière, seule l&amp;#8217;une d&amp;#8217;entre elles est annotée sur la
&lt;a href=&quot;#logo-breizhcamp-dao-full&quot;&gt;Figure 3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Regardons à présent comment est constituée cette &lt;em&gt;goutte&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;la-tête&quot;&gt;La &lt;em&gt;tête&lt;/em&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;La &lt;em&gt;tête&lt;/em&gt; de la &lt;em&gt;goutte&lt;/em&gt; est la portion du cercle \(C_1\), de centre
\(B\), entre les points \(A\) et \(C\). Le rayon de \(C_1\) est
\(r_1\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
\(r_1\) sera également utilisé en tant que paramètre d&amp;#8217;entrée.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;le-dos&quot;&gt;Le &lt;em&gt;dos&lt;/em&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le &lt;em&gt;dos&lt;/em&gt; de la &lt;em&gt;goutte&lt;/em&gt; est une portion du cercle \(C_2\), de centre \(O\)
et de rayon \(r_2\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;\(C_2\) est le cercle circonscrit au triskell, tangent aux trois &lt;em&gt;gouttes&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le &lt;em&gt;dos&lt;/em&gt; est la portion entre les points \(A\), jonction avec la &lt;em&gt;tête&lt;/em&gt;,
et le point \(E\), jonction avec le &lt;em&gt;ventre&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le rayon \(r_2\) peut être exprimé en fonction de paramètres déjà
établis. Il est égal au rayon \(r_1\) ajouté à la distance
\(\|\vec{OB}\|\). Ce qui donne :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[r_2=r_1+\Delta+\frac{r_1}{\cos\left(\frac{\pi}{6}\right)}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À ceux qui demanderaient d&amp;#8217;où ça sort, je répondrais :
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Trigonom%C3%A9trie#Trigonom.C3.A9trie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;em&gt;SOHCAHTOA&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;le-ventre&quot;&gt;Le &lt;em&gt;ventre&lt;/em&gt;&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le &lt;em&gt;dos&lt;/em&gt; de la &lt;em&gt;goutte&lt;/em&gt; est une portion du cercle \(C_3\), de centre
\(D\) et de rayon \(r_3\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;C&amp;#8217;est la portion entre le point \(C\), jonction avec la &lt;em&gt;tête&lt;/em&gt;, et le
point \(E\), jonction avec le &lt;em&gt;dos&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
\(r_3\) est la dernière valeur utilisée en paramètre d&amp;#8217;entrée dans
l&amp;#8217;implémentation.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Pour former la &lt;em&gt;goutte&lt;/em&gt;, le &lt;em&gt;ventre&lt;/em&gt; et la &lt;em&gt;tête&lt;/em&gt; doivent être tangents en
\(C\). Pour cela, le centre de \(C_3\), \(D\), doit être sur la droite
\((BC)\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le point \(E\) est un point d&amp;#8217;intersection entre les cercles \(C_2\) et
\(C_3\). Si \(C_2\) et \(C_3\) ne se croisent pas, c&amp;#8217;est-à-dire si le
rayon \(r_3\) est trop petit, impossible de terminer la figure.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;le-cas-r_3_min&quot;&gt;Le cas \(r_{3_{min}}\)&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Il existe un rayon minimum, \(r_{3_{min}}\) en deçà duquel le cercle
\(C_3\) est inclu dans le cercle \(C_2\) et ne croise donc pas celui-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Dans le cas particuler \(r_3=r_{3_{min}}\), le &lt;em&gt;ventre&lt;/em&gt; de la &lt;em&gt;goutte&lt;/em&gt; est
tangent à la &lt;em&gt;tête&lt;/em&gt;, mais aussi au &lt;em&gt;dos&lt;/em&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-r3min-overview&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-r3min-overview.svg&quot; alt=&quot;Logo du BreizhCamp r3min&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 4. Aperçu du logo avec \(r_3 = r_{3_{min}}\)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous allons essayer de déterminer \(r_{3_{min}}\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À première vue, \(r_{3_{min}}\) ne dépend que de \(r_1\) et
\(r_2\) (qui lui-même dépend de \(r_1\) et \(\Delta\)). Prenons cette
hypothèse et essayons de simplifier la résolution en nous plaçant dans le cas
particulier \(\theta = 0\).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-r3min-dao&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-r3min-theta-zero.svg&quot; alt=&quot;Modélisation pour trouver r3min&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 5. Modélisation pour déterminer \(r_{3_{min}}\)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le point \(E\) étant le point de tangence entre deux cercles, il se situe
sur la droite \((OD)\) passant par les centres des deux cercles.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Intéressons-nous au vecteur \(\vec{OE}\). Pour cela, introduisons l&amp;#8217;angle
\(\alpha\) entre \(\vec{OA}\) et \(\vec{OE}\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On peut définir \(\vec{OE}\) de la manière suivante :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\vec{OE}
\begin{pmatrix}
r_2\cos(\alpha) \\
r_2\sin(\alpha)
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a aussi :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\vec{OE}=\vec{OB}+\vec{BD}+\vec{DE}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avec :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\vec{OB}
\begin{pmatrix}
r_2-r_1 \\
O
\end{pmatrix} \\

\vec{BD}
\begin{pmatrix}
(r_1+r_{3_{min}})\cos\left(\frac{5\pi}{6}\right) \\
(r_1+r_{3_{min}})\sin\left(\frac{5\pi}{6}\right)
\end{pmatrix} \\

\vec{DE}
\begin{pmatrix}
r_{3_{min}}\cos(\alpha) \\
r_{3_{min}}\sin(\alpha)
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce qui donne :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\vec{OE}
\begin{pmatrix}
r_2-r_1+(r_1+r_{3_{min}})\cos\left(\frac{5\pi}{6}\right)
+r_{3_{min}}\cos(\alpha) \\
(r_1+r_{3_{min}})\sin\left(\frac{5\pi}{6}\right)+r_{3_{min}}\sin(\alpha)
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On peut alors poser le système d&amp;#8217;équations suivant, avec deux inconnues,
\(\alpha\) et \(r_{3_{min}}\) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\begin{cases}
r_2\cos(\alpha)=r_2-r_1+(r_1+r_{3_{min}})\cos\left(\frac{5\pi}{6}\right)
+r_{3_{min}}\cos(\alpha) \\
r_2\sin(\alpha)=(r_1+r_{3_{min}})\sin\left(\frac{5\pi}{6}\right)
+r_{3_{min}}\sin(\alpha)
\end{cases} \\

\Leftrightarrow
\begin{cases}
(r_2-r_{3_{min}})\cos(\alpha)=r_2-r_1-\frac{(r_1+r_{3_{min}})\sqrt{3}}{2} \\
(r_2-r_{3_{min}})\sin(\alpha)=\frac{r_1+r_{3_{min}}}{2}
\end{cases} \\

\Leftrightarrow
\begin{cases}
\left((r_2-r_{3_{min}})\cos(\alpha)\right)^2=\left(r_2-r_1
-\frac{(r_1+r_{3_{min}})\sqrt{3}}{2}\right)^2 \\
\left((r_2-r_{3_{min}})\sin(\alpha)\right)^2
=\left(\frac{r_1+r_{3_{min}}}{2}\right)^2
\end{cases}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En additionnant les deux équations, on obtient :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[(r_2-r_{3_{min}})^2\left(\cos^2(\alpha)+\sin^2(\alpha)\right)
= \left(r_2-r_1-\frac{(r_1+r_{3_{min}})\sqrt{3}}{2}\right)^2
+ \left(\frac{r_1+r_{3_{min}}}{2}\right)^2 \\

\Leftrightarrow
(r_2-r_{3_{min}})^2
= \left(r_2-r_1-\frac{(r_1+r_{3_{min}})\sqrt{3}}{2}\right)^2
+ \left(\frac{r_1+r_{3_{min}}}{2}\right)^2\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous sommes parvenu à éliminer \(\alpha\) de l&amp;#8217;équation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Avec &lt;a href=&quot;https://www.wolframalpha.com/input/?i=solve+(r2-r3)^2%3D(r2-r1-((r1%2Br3)*sqrt(3))%2F2)^2%2B((r1%2Br3)%2F2)^2+for+r3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;un peu d&amp;#8217;aide&lt;/a&gt;
pour la résolution, on obtient :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[r_{3_{min}}
=\frac{(2+\sqrt{3})r_1(r_2-r_1)}{(2+\sqrt{3})r_1+(2-\sqrt{3})r_2}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous sommes à présent en mesure d&amp;#8217;exprimer la contrainte \(r_{3_{min}}\)
en fonction des rayons \(r_1\) et \(r_2\).&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;les-points&quot;&gt;Les points&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À présent que nous avons définis les rayons des trois portions de cercles
constituant une &lt;em&gt;goutte&lt;/em&gt;, \(r_1\), \(r_2\)et \(r_3\),
nous allons déterminer les coordonnées des points nécessaires au tracé de
celle-ci.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous nous concentrerons ici sur la &lt;em&gt;goutte&lt;/em&gt; violette, telle qu&amp;#8217;annotée sur la
&lt;a href=&quot;#logo-breizhcamp-dao-full&quot;&gt;Figure 3&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;a&quot;&gt;A&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le point \(A\), départ de la &lt;em&gt;tête&lt;/em&gt; se définit simplement à l&amp;#8217;aide du rayon
\(r2\) et de l&amp;#8217;angle \(\theta\) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[A
\begin{pmatrix}
r_2\cos(\theta) \\
r_2\sin(\theta)
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;b&quot;&gt;B&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;De la même manière, \(B\), centre de l&amp;#8217;arc de cercle constituant la &lt;em&gt;tête&lt;/em&gt;,
se définit comme suit :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[B
\begin{pmatrix}
(r_2-r_1)\cos(\theta) \\
(r_2-r_1)\sin(\theta)
\end{pmatrix}

\Leftrightarrow
B
\begin{pmatrix}
x_B \\
y_B
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;c&quot;&gt;C&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Les coordonnées du point \(C\), fin de la &lt;em&gt;tête&lt;/em&gt; et départ du &lt;em&gt;ventre&lt;/em&gt;, sont
également les coordonnées du vecteur \(\vec{OC}\). En posant
\(\vec{OC}=\vec{OB}+\vec{BC}\), on obtient :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[C
\begin{pmatrix}
x_B+r_1\cos(\theta + \frac{5\pi}{6}) \\
y_B+r_1\sin(\theta + \frac{5\pi}{6})
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;d&quot;&gt;D&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On peut procéder de façon similaire pour le point \(D\), centre de l&amp;#8217;arc
de cercle constituant le &lt;em&gt;ventre&lt;/em&gt;. En posant \(\vec{OD}=\vec{OB}+\vec{BD}\)
on obtient :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[D
\begin{pmatrix}
x_B+(r_1+r_3)\cos(\theta + \frac{5\pi}{6}) \\
y_B+(r_1+r_3)\sin(\theta + \frac{5\pi}{6})
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;e&quot;&gt;E&lt;/h4&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Déterminer les coordonnées du point \(E\) s&amp;#8217;avère légèrement plus
complexe. Il s&amp;#8217;agit de trouver les coordonnées de l&amp;#8217;un des points
d&amp;#8217;intersections entre les cercles \(C_2\) et \(C_3\).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-intersection-full&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-intersection-full.svg&quot; alt=&quot;Calcul des coordonnées du point E&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 6. Calcul des coordonnées du point E&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;J&amp;#8217;ai choisi d&amp;#8217;introduire le cercle \(C_3&apos;\), symétrique du cercle \(C_3\)
par rapport à la droite \((EE&apos;)\), avec \(E\) et \(E&apos;\), points
d&amp;#8217;intersection entre les cercles \(C_2\) et \(C_3\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Le cercle \(C_3&apos;\) n&amp;#8217;est pas indispensable, mais il fournira un support
visuel plus accessible pour dérouler la résolution des coordonnées
du point \(E\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Soient &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_2&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_2&quot; title=&quot;View footnote.&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\begin{cases}
a = \overline{ID&apos;} = -\overline{ID} \\
b = \overline{OI} \\
h = \overline{IE} = -\overline{IE&apos;} \\
d = \overline{OD&apos;} = a + b
\end{cases}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;\(d\) est la distance entre les points \(O\) et \(D&apos;\),
respectivement centres des cercles \(C_2\) et \(C_3&apos;\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a donc :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[d = \sqrt{(x_D&apos;-x_O)^2+(y_D&apos;-y_O)^2}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock tip&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-tip&quot; title=&quot;Tip&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
\(O\) étant l&amp;#8217;origine de notre référentiel, nous sommes en réalité dans
le cas particulier où \(x_D&apos;-x_O = x_D&apos;\) et \(y_D&apos;-y_O = y_D&apos;\).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;\(OEI\)et \(D&apos;EI\) étant des triangles rectangles, grâce à ce bon vieux
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Pythagore&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pythagore&lt;/a&gt;
on peut poser :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\begin{cases}
a^2 + h^2 = r_3^2 \\
b^2 + h^2 = r_2^2
\end{cases}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En soustrayant les deux équations, on obtient :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[a^2 - b^2 = r_3^2 - r_2^2 \\

\Leftrightarrow
a^2 - (d-a)^2 = r_3^2 - r_2^2 \\

\Leftrightarrow
a^2 - d^2 +2ad -a^2 = r_3^2 - r_2^2 \\

\Leftrightarrow
a = \frac{r_3^2 - r_2^2 + d^2}{2d}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À présent que \(a\) est connu, reprenons la première équation du système
pour déterminer \(h\) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[h = \sqrt{r_3^2 - a^2}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Cherchons à présent à calculer les coordonnées du point \(I\).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;logo-breizhcamp-dao-intersection-zoom&quot; class=&quot;imageblock center text-center&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;img src=&quot;/assets/images/logo-breizhcamp-dao-intersection-zoom.svg&quot; alt=&quot;Application du théorème de Thalès&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;title&quot;&gt;Figure 7. Application du théorème de Thalès&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En invoquant cette fois notre vieux pote
&lt;a href=&quot;https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Thal%C3%A8s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Thalès&lt;/a&gt;,
on peut poser :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\frac{\overline{ID&apos;}}{\overline{OD&apos;}}
= \frac{\overline{QD&apos;}}{\overline{PD&apos;}}
= \frac{\overline{IQ}}{\overline{OP}} \\

\Leftrightarrow
\frac{a}{d} = \frac{x_D&apos; - x_I}{x_D&apos; - x_O} = \frac{y_D&apos; - y_I}{y_D&apos; - y_O} \\

\Leftrightarrow
\frac{a}{d} = \frac{x_D&apos; - x_I}{x_D&apos;-x_O} = \frac{y_D&apos; - y_I}{y_D&apos;-y_O}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Ce qui donne :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[I
\begin{pmatrix}
x_D&apos; - (x_D&apos;-x_O) \frac{a}{d} \\
y_D&apos; - (y_D&apos;-y_O) \frac{a}{d}
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On remarque sur la &lt;a href=&quot;#logo-breizhcamp-dao-intersection-zoom&quot;&gt;Figure 7&lt;/a&gt; que le triangle
\(IER\) est une version modèle réduit du triangle \(ID&apos;Q\), orientée
de -90° par rapport au point \(I\) (un mathématicien parlerait plutôt d&amp;#8217;une
combinaison de &lt;a href=&quot;https://fr.wikipedia.org/wiki/Rotation_plane&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rotation plane&lt;/a&gt;
et &lt;a href=&quot;https://fr.wikipedia.org/wiki/Homoth%C3%A9tie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;d&amp;#8217;homothétie&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Faisons à nouveau appel à Thalès et posons &lt;sup class=&quot;footnote&quot;&gt;[&lt;a id=&quot;_footnoteref_3&quot; class=&quot;footnote&quot; href=&quot;#_footnotedef_3&quot; title=&quot;View footnote.&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\frac{\overline{IE}}{\overline{ID&apos;}}
= \frac{\overline{RE}}{\overline{QD&apos;}}
= \frac{\overline{IR}}{\overline{IQ}} \\

\Leftrightarrow
\frac{h}{a}
= \frac{y_E - y_I}{x_D&apos; - x_I}
= \frac{x_E - x_I}{y_D&apos; - y_I}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On peut alors calculer les coordonnées du point \(E\) :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[E
\begin{pmatrix}
(y_D&apos; - y_I) \frac{h}{a} + x_I \\
(x_D&apos; - x_I) \frac{h}{a} + y_I
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;admonitionblock note&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td class=&quot;icon&quot;&gt;
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
&lt;/td&gt;
&lt;td class=&quot;content&quot;&gt;
il existe une méthode sans doute plus simple pour calculer les points
d&amp;#8217;intersection entre deux cercles, à partir des
&lt;a href=&quot;http://www.analyzemath.com/CircleEq/circle_intersection.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;équations de ceux-ci&lt;/a&gt;.
Mais la &lt;a href=&quot;http://paulbourke.net/geometry/circlesphere/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;méthode employée ici&lt;/a&gt; a
le mérite de permettre de calculer explicitement, et sans ambigüité les
coordonnées du seul point d&amp;#8217;intersection qui nous intéresse, le point \(E\).
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Comme évoqué plus tôt, le cercle \(C_3&apos;\) a été introduit uniquement pour
fournir un support visuel plus clair et ainsi simplifier la résolution du
problème. Toutes les équations établies pour calculer les coordonnées du point
\(E\) restent valables si on y substitue \(D\) à \(D&apos;\) en travaillant
directement avec le cercle \(C_3\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;En attendant de prouver ces dires au travers de l&amp;#8217;implémentation à venir,
avançons le résultat suivant :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[E
\begin{pmatrix}
(y_D - y_I) \frac{h}{a} + x_I \\
(x_D - x_I) \frac{h}{a} + y_I
\end{pmatrix}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;avec :&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stemblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
\[\begin{cases}
x_I = x_D - (x_D - x_O) \frac{a}{d} \\
y_I = y_D - (y_D - y_O) \frac{a}{d} \\
h = \sqrt{r_3^2 - a^2} \\
a = \frac{r_3^2 - r_2^2 + d^2}{2d} \\
d = \sqrt{(x_D-x_O)^2+(y_D-y_O)^2}
\end{cases}\]
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous avons à présent tous les éléments nécessaires au tracé d&amp;#8217;une première
&lt;em&gt;goutte&lt;/em&gt; du triskell. Pour tracer les autres, il suffit d&amp;#8217;appliquer les
même calculs, mais avec un angle \(\theta\) différent.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;On a un angle de 120° entre deux &lt;em&gt;gouttes&lt;/em&gt; du triskell. Si le tracé de la
première est calculé avec un angle \(\theta\), le tracé de la deuxième sera
calculé avec \(\theta + \frac{2\pi}{3}\) et enfin la troisième avec
\(\theta + \frac{4\pi}{3}\).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Nous verrons tout ceci dans un second article qui s&amp;#8217;attardera sur les
détails d&amp;#8217;implémentation avec &lt;a href=&quot;https://vuejs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vue.js&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot; async
  src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS_HTML&quot;&gt;
&lt;/script&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_1&quot;&gt;
&lt;a href=&quot;#_footnoteref_1&quot;&gt;1&lt;/a&gt;. nouveau dans le sens de &lt;em&gt;premier&lt;/em&gt;, et non &lt;em&gt;remplaçant d&amp;#8217;une précédente version&lt;/em&gt;.
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_2&quot;&gt;
&lt;a href=&quot;#_footnoteref_2&quot;&gt;2&lt;/a&gt;. Pour ceux qui, comme moi, l&amp;#8217;auraient oublié, la barre horizontale placée au dessus des couples de lettres désigne une &lt;a href=&quot;https://fr.wikipedia.org/wiki/Mesure_alg%C3%A9brique&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mesure algébrique&lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;footnote&quot; id=&quot;_footnotedef_3&quot;&gt;
&lt;a href=&quot;#_footnoteref_3&quot;&gt;3&lt;/a&gt;. On est d&amp;#8217;accord, ça manque d&amp;#8217;une démonstration sérieuse…
&lt;/div&gt;
&lt;/div&gt;</description>
        <pubDate>Tue, 19 Sep 2017 00:00:00 +0000</pubDate>
        <link>https://blog.jl.bzh/2017/09/19/retro-conception-d-un-logo.html</link>
        <guid isPermaLink="true">https://blog.jl.bzh/2017/09/19/retro-conception-d-un-logo.html</guid>
        
        <category>BreizhCamp</category>
        
        
      </item>
    
      <item>
        <title>Nouveau blog</title>
        <description>&lt;div class=&quot;quoteblock&quot;&gt;
&lt;blockquote&gt;
Si à 40 ans, tu n&amp;#8217;as pas ton blog, tu as raté ta vie…
&lt;/blockquote&gt;
&lt;div class=&quot;attribution&quot;&gt;
&amp;#8212; « bullshit artist » français bien connu&lt;br&gt;
&lt;cite&gt;(propos adaptés)&lt;/cite&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Même si j&amp;#8217;ai encore &lt;span class=&quot;line-through&quot;&gt;de nombreuses&lt;/span&gt; quelques années devant
moi avant d&amp;#8217;atteindre cet âge respectable, j&amp;#8217;ai ressenti le besoin de
rejoindre le mouvement entamé par de nombreux développeurs il y a déjà
un moment, mais qui semble profiter d&amp;#8217;un retour en grâce ces derniers
temps. Je dois bien aussi avouer que la procrastination — terrible fléau —
me fait démarrer après tout le monde.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Je ne sais pas qui lira ce blog… Ou plutôt si, je connais déjà très
bien au moins un de mes futurs lecteurs. J&amp;#8217;écris ce blog en partie pour
mon moi du futur qui me sera, j&amp;#8217;espère, très reconnaissant de retrouver
consigné ici quelques précieuses anecdotes techniques sur lesquels mon moi
du passé — ou d&amp;#8217;un futur moins futuriste — se sera arraché les cheveux.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bouletcorp.com/2010/11/08/schizophrenie-temporelle/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Schizophrénie temporelle&lt;/a&gt;
mise à part, ma démarche est clairement très égoïste. Ce blog est destiné
à recueillir, en vrac, de la documentation, des didacticiels ou de simples
tuyaux, le tout sur des sujets touchant essentiellement à la
programation ou au développement logiciel en général. Mais si le contenu
d&amp;#8217;une future publication trouve une utilité quelconque auprès d&amp;#8217;un lecteur
tiers passant par là, tant mieux !&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Évidemment, s&amp;#8217;agissant d&amp;#8217;un blog personnel, je n&amp;#8217;exclus pas d&amp;#8217;adapter selon
mon bon vouloir la &lt;em&gt;ligne éditoriale&lt;/em&gt;. Tout dépendra de l&amp;#8217;humeur de mon moi
rédacteur du futur.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;Bon allez ! C&amp;#8217;est pas tout ça. Je retourne à l&amp;#8217;écriture d&amp;#8217;un vrai premier
article intéressant (?).&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
&lt;p&gt;À bientôt !&lt;/p&gt;
&lt;/div&gt;</description>
        <pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate>
        <link>https://blog.jl.bzh/2017/08/23/nouveau-blog.html</link>
        <guid isPermaLink="true">https://blog.jl.bzh/2017/08/23/nouveau-blog.html</guid>
        
        
      </item>
    
  </channel>
</rss>
