<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr-FR">
  <title>Thomas Parisot — Carnet Web</title>
  <subtitle>Écrits sous forme d'articles long et notes de journal.</subtitle>
  <icon>https://thom4.net/assets/favicon.svg</icon>
  <link href="https://thom4.net/feed/atom.xml" rel="self" />
  <link href="https://thom4.net/" />
  <updated>2026-08-17T12:00:00Z</updated>
  <id>https://thom4.net/</id>
  <author>
    <name>Thomas Parisot</name>
  </author>
  
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/08/17/backup/</id>
    <title>Sauvegarde de données</title>
    <link href="https://thom4.net/2026/08/17/backup/" hreflang="fr-FR" />
    <updated>2026-08-17T12:00:00Z</updated>
    <content type="html"><![CDATA[<p>J'arrivais au bout de ma sixième année d'utilisation d'[Arq Backup]<sup class="footnote-ref"><a href="https://thom4.net/2026/08/17/backup/#fn1" id="fnref1">[1]</a></sup>.
Avec l'arrivée de la notification de renouvellement de l'abonnement (60$ par an, pour le logiciel <em>et</em> 1 <abbr title="terraoctet">To</abbr> de stockage), je me suis posé la question de continuer.</p>
<p>Arq est compatible macOS et Windows <em>mais</em> pas Linux.
Or l'arrivée d'un serveur à la maison change la donne, car je tiens également à le sauvegarder. Donc la question du logiciel de sauvegarde. Donc la question du stockage.</p>
<p>J'aurais pu partager l'espace entre toutes les machines ? Probablement que ça aurait pu continuer ainsi.</p>
<p>Sur ma machine, j'aimerais :</p>
<ul>
<li>un truc qui tourne tout seul en tâche de fond — une fois configuré, y'a rien à penser ;</li>
<li>de la sauvegarde sur stockage compatible S3 ou Backblaze B2 ;</li>
<li>soit une interface graphique qui fait le job ;</li>
<li>soit un fichier de configuration qui décrit tout (destinations, conditions, fichiers à inclure/exclure).</li>
</ul>
<p>Idéalement, j'aimerais appliquer la même chose sur un deuxième ordinateur à la maison, sous Windows.</p>
<p>Le paysage a changé depuis cette dernière exploration — concomitante à celle d'<a href="https://n.survol.fr/2025/05/sauvegarde-photos-juin-2025" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Éric (ouvre un nouvel onglet)">Éric</a>. Alors je me suis relancé dans recherches et comparaisons.</p>
<h3 id="restic-profile" tabindex="-1"><a class="header-anchor" href="https://thom4.net/2026/08/17/backup/#restic-profile"><span>Restic(profile)</span></a></h3>
<p>Le serveur auto-hébergé utilise déjà <a href="https://restic.net/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="restic (ouvre un nouvel onglet)">restic</a>. C'était très facile à configurer avec Yunohost. Donc ça doit bien être la même chose ?</p>
<p>Sauf que par défaut, restic <em>sauvegarde</em> mais ne tourne pas en arrière-plan. Et il faut arriver à tout exprimer en une ligne de commande.</p>
<p><a href="https://creativeprojects.github.io/resticprofile/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="resticprofile (ouvre un nouvel onglet)">resticprofile</a> ajoute la dimension &quot;configurer avec un fichier&quot;. Ça aurait pu me plaire mais j'ai eu du mal à rentrer dans les concepts. Au final, j'ai crains de faire des erreurs, et donc à créer une sauvegarde qui fonctionne mais marche mal.</p>
<h3 id="borg-matic" tabindex="-1"><a class="header-anchor" href="https://thom4.net/2026/08/17/backup/#borg-matic"><span>Borg(matic)</span></a></h3>
<p>C'est surtout que j'avais testé <a href="https://torsion.org/borgmatic/reference/configuration/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Borgmatic (ouvre un nouvel onglet)">Borgmatic</a> juste avant. J'avais adoré sa syntaxe de configuration et la clarté de la documentation.</p>
<p>Mais pas <em>encore</em> de destination S3/B2 dans le logiciel bas-niveau, <a href="https://www.borgbackup.org/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Borg v1 (ouvre un nouvel onglet)">Borg v1</a>.
Dommage dommage !</p>
<h3 id="kopia-ou-duplicity" tabindex="-1"><a class="header-anchor" href="https://thom4.net/2026/08/17/backup/#kopia-ou-duplicity"><span>Kopia ou Duplicity ?</span></a></h3>
<p>Sans avoir à payer d'abonnement annuel ni triturer les entrailles, il ne me restait plus que <a href="https://kopia.io/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Kopia (ouvre un nouvel onglet)">Kopia</a> et [Duplicity]. Le gagnant a été le … premier onglet d'ouvert. Donc Kopia.</p>
<p><img src="https://thom4.net/images/2026/08/kopia.webp" alt="" title="Capture d'écran des règles de sauvegarde de Kopia"></p>
<p>La configuration des règles a été un peu laborieuse au début — à 2 heures du matin je n'y voyais plus très clair :</p>
<ul>
<li>puis j'ai compris que les <em lang="en">Policies</em> correspondaient aux règles de sauvegarde</li>
<li>et que les <em lang="en">snapshots</em> correspondaient aux artéfacts de sauvegarde de chaque règle.</li>
</ul>
<p>Ainsi en sauvegardant tous les jours à 13h00, je n'ai pas <em>une</em> sauvegarde mais autant que de règles.</p>
<p>Quand il a fallu recréer les règles pour paramétrer la sauvegarde sur un disque dur USB, frustration : il fallait tout recréer. S'il n'y avait rien dans l'interface, il y avait en revanche deux utilitaires (<code>kopia export</code> et <code>kopia import</code>) qui permettaient de dupliquer les règles d'une destination de sauvegarde à une autre.</p>
<hr>
<p>Au passage, ça m'a permis d'apprendre à combiner le trousseau de sécurité macOS (via le programme <code>security</code>) et <a href="https://keepassxc.org/docs/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="KeypassXC (ouvre un nouvel onglet)">KeypassXC</a>. Et que par exemple, on peut utiliser un mot de passe rattaché à sa session macOS pour obtenir une valeur contenue dans un autre gestionnaire de mots de passe :</p>
<pre class="language-bash"><code class="language-bash">security find-generic-password <span class="token parameter variable">-a</span> <span class="token string">'restic'</span> <span class="token parameter variable">-w</span> <span class="token operator">|</span> keepassxc-cli show <span class="token parameter variable">-sqa</span> password  ~/Library/CloudStorage/MountainDuck-nextcloud.maison.lan/keypass-sync/restic.kdbx sauvegarde</code></pre>
<p>Cette commande aide à extraire l'attribut <code>password</code> <sup class="footnote-ref"><a href="https://thom4.net/2026/08/17/backup/#fn2" id="fnref2">[2]</a></sup> de l'entrée <code>sauvegarde</code> dans la base de données Keepass <code>restic.kdbx</code>. La base est déverrouillée avec un mot de passe stockée dans le trousseau natif de macOS.</p>
<p><img src="https://thom4.net/images/2026/08/keepassxc.webp" alt="" title="Capture d'écran d'une entrée du gestionnaire de mots de passe KeepassXC"></p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>J'étais précédemment passé par <a href="https://www.crashplan.com/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Crashplan (ouvre un nouvel onglet)">Crashplan</a> puis <a href="https://www.backblaze.com/cloud-backup/personal" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Backblaze Backup (ouvre un nouvel onglet)">Backblaze Backup</a>, tous devenus trop chers pour mon usage. <a href="https://thom4.net/2026/08/17/backup/#fnref1" class="footnote-backref">↩︎</a></p>
</li>
<li id="fn2" class="footnote-item"><p>Mais ça aurait pu être un autre attribut personnalisé comme la clé d'API stockée dans le champ <code>applicationKey</code>. <a href="https://thom4.net/2026/08/17/backup/#fnref2" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Dégafamisation"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/08/04/immich/</id>
    <title>Immich</title>
    <link href="https://thom4.net/2026/08/04/immich/" hreflang="fr-FR" />
    <updated>2026-08-04T19:30:00Z</updated>
    <content type="html"><![CDATA[<p>Un <a href="https://thom4.net/2026/08/04/smartphone-grapheneos/">téléphone sans services Google</a> n'inclut pas tout un tas de services :</p>
<ul>
<li>pas de bon logiciel d'appareil photo</li>
<li>pas de logiciel de galerie photo (historisation, annotation, synchronisation partage, retouche légère type recadrage)</li>
</ul>
<p><a href="https://immich.app/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Immich (ouvre un nouvel onglet)">Immich</a> sort du lot avec exactement ça : synchronisation, interface mobile, interface sur ordinateur.</p>
<p>L'utilisation combinée de <a href="https://github.com/simulot/immich-go#2-basic-usage" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Immich Go (ouvre un nouvel onglet)">Immich Go</a> avec <a href="https://takeout.google.com" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Google Takeout (ouvre un nouvel onglet)">Google Takeout</a> et <a href="https://support.apple.com/fr-fr/118257" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="iCloud Takeout (ouvre un nouvel onglet)">iCloud Takeout</a> m'a permis de récupérer photos et albums hébergés chez Apple et Google.</p>
<p>Je gère la sauvegarde chez <a href="https://www.backblaze.com/cloud-storage/pricing" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Backblaze B2 Cloud Storage (ouvre un nouvel onglet)">Backblaze B2 Cloud Storage</a>. D'ici la fin de l'année, j'aimerais plutôt payer une fois le montant annuel (67€) dans un disque dur et offrir un <a href="https://garagehq.deuxfleurs.fr/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="nœud de stockage Garage (ouvre un nouvel onglet)">nœud de stockage Garage</a>. Comme ça on se fait du <span lang="en">backup</span> redondant en pair à pair.</p>
<p><img src="https://thom4.net/images/2026/08/immich.webp" alt="" title="Extrait d'une page d'accueil du gestionnaire de photos Immich"></p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Dégafamisation"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/08/04/smartphone-grapheneos/</id>
    <title>Un téléphone pour les 10 prochaines années</title>
    <link href="https://thom4.net/2026/08/04/smartphone-grapheneos/" hreflang="fr-FR" />
    <updated>2026-08-04T19:11:00Z</updated>
    <content type="html"><![CDATA[<p>L'an dernier j'ai fait le constat que vivre sans smartphone <em>à jour</em> était une contrainte avec de plus en plus de pression (identité numérique, maintenance des applications même si j'en utilise peu, extinction de la 2G). Soit.</p>
<p><a href="https://thom4.net/2021/deux-annees-en-2g/">Volte face sur ma configuration</a> : plutôt qu'un appareil 2G, un vieux smartphone déconnecté et un routeur 4G, j'ai voulu tout réunir en un.</p>
<p>Je me sens confronté à un choix de <em>soit</em> favoriser du matériel éthique (type Fairphone) <sup class="footnote-ref"><a href="https://thom4.net/2026/08/04/smartphone-grapheneos/#fn1" id="fnref1">[1]</a></sup> <em>soit</em> favoriser du logiciel sans espion.</p>
<p>J'aurais aimé choisir les deux <em>mais</em> j'ai opté pour le logiciel sans espion avec <a href="https://grapheneos.org/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="GrapheneOS (ouvre un nouvel onglet)">GrapheneOS</a>. Je me suis dit que la puissance des GAFAM dans le monde était plus terrible encore.</p>
<p>Alors pour le fun, je veux que ce téléphone dure 10 ans.<br>
Rendez-vous en 2036.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>C'est surtout &quot;moins pire&quot; parce que ça n'enlève pas la facture environnementale des minerais. Ça rend l'exploitation des minerais mieux encadrés. Un peu comme Oeko-Tex avec le textile — pas d'exploitation humaine et des revenus décents pour les personnes qui vont au fond des mines. <a href="https://thom4.net/2026/08/04/smartphone-grapheneos/#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Dégafamisation"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/05/20/belle-via-romans-grenoble/</id>
    <title>Trajet Romans-sur-Isère ↦ Grenoble</title>
    <link href="https://thom4.net/2026/05/20/belle-via-romans-grenoble/" hreflang="fr-FR" />
    <updated>2026-05-20T11:55:00Z</updated>
    <content type="html"><![CDATA[<p>Un trajet en voiture sur l'axe Valence / Grenoble m'avait fait réaliser l'existence d'une voie cyclable le long de la rivière Isère. C'est une invitation à randonner dans le Nord du Vercors qui a créé le prétexte à ce trajet en vélo.</p>
<p>C'est une lente remontée de rivière avec quelques colines, quelques traversées de villages et quelques passages plus sauvages.<br>
La section entre Saint-Gervais et Grenoble circulait davantage : on se salue peu, on se croise beaucoup … et c'est tout.</p>
<p><img src="https://thom4.net/images/2026/05/saint-gervais.webp" alt="" title="Enfourcher un vélo et enjamber l'Isère au port de Saint-Gervais"></p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Vélo"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/30/liens-externes/</id>
    <title>Liens externes accessibles</title>
    <link href="https://thom4.net/2026/04/30/liens-externes/" hreflang="fr-FR" />
    <updated>2026-04-30T13:25:00Z</updated>
    <content type="html"><![CDATA[<p>En recréant ce carnet de zéro, les liens s'ouvraient à même la page, sans créer de nouvel onglet/fenêtre.</p>
<p>Est-ce qu'ajouter un attribut <code>target=&quot;_blank&quot;</code> sur des liens hypertextes absolus suffit ? <em>Non</em>, l'exemple du module <a href="https://github.com/markdown-it/markdown-it-for-inline" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="markdown-it-for-inline (ouvre un nouvel onglet)"><code>markdown-it-for-inline</code></a> ne suffit pas.</p>
<p>J'aimerais :</p>
<ul>
<li><strong>gérer la sécurité avec l'onglet ouvert</strong>. Il pourrait être utilisé par des pisteurs, sur la page nouvellement ouverte, par des extensions web verrolées ;</li>
<li><strong>informer de la destination aux lecteurs d'écran</strong>. La destination étant &quot;un nouvel onglet&quot;. Ça correspond au <a href="https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/#6.1" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="critère 6.1.1 du RGAA (ouvre un nouvel onglet)">critère 6.1.1 du <abbr title="Référentiel Général d'Amélioration de l'Accessibilité">RGAA</abbr></a> ;</li>
<li><strong>distinguer visuellement les liens qui ouvrent un nouvel onglet</strong>. Même intention, visuelle cette fois.</li>
</ul>
<hr>
<p>La sécurité se gère à l'aide des valeurs <a href="https://developer.mozilla.org/fr/docs/Web/HTML/Reference/Attributes/rel/noopener" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="noopener (ouvre un nouvel onglet)"><code>noopener</code></a> et <a href="https://developer.mozilla.org/fr/docs/Web/HTML/Reference/Attributes/rel/noreferrer" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="noreferrer (ouvre un nouvel onglet)"><code>noreferrer</code></a> de l'<a href="https://developer.mozilla.org/fr/docs/Web/HTML/Reference/Attributes/rel" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="attribut rel (ouvre un nouvel onglet)">attribut <code>rel</code></a>.</p>
<p>Elles préviennent, respectivement, l'accès à la <a href="https://developer.mozilla.org/fr/docs/Web/API/Window/opener" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="propriété window.opener (ouvre un nouvel onglet)">propriété <code>window.opener</code></a> et à la diffusion de la provenance via l'<a href="https://developer.mozilla.org/fr/docs/Web/HTTP/Reference/Headers/Referer" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="entête HTTP Referrer (ouvre un nouvel onglet)">entête HTTP <code>Referrer</code></a>.</p>
<p>Ça aide à préserver notre vie privée numérique.</p>
<hr>
<p>On peut donner du contexte aux lecteurs d'écran dans un label <abbr title="Accessible Rich Internet Applications">ARIA</abbr> :</p>
<ol>
<li>qui repend l'intitulé du lien ;</li>
<li><em>et</em> qui spécifie l'ouverture dans un nouvel onglet.</li>
</ol>
<p>L'utilisation du <a href="https://support.apple.com/fr-fr/guide/voiceover/mchlp2719/mac" lang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="rotor VoiceOver (ouvre un nouvel onglet)">rotor VoiceOver</a> est un bon exemple de cette visibilisation :</p>
<p><img src="https://thom4.net/images/2026/04/rotor-liens.webp" alt="Capture d'écran de la navigation par hyperliens dans le rotor VoiceOver"></p>
<p>L'<a href="https://fr.wiktionary.org/wiki/ant%C3%A9p%C3%A9nulti%C3%A8me" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="antépénultième (ouvre un nouvel onglet)">antépénultième</a> lien de cette capture d'écran rend explicite l'ouverture dans un nouvel onglet. Ça correspondrait au code HTML suivant :</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>...<span class="token punctuation">"</span></span> <span class="token attr-name">aria-label</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>critère 6.1.1 du RGAA (ouvre une nouvelle fenêtre)<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  critère 6.1.1 du RGAA
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span></code></pre>
<hr>
<p>Quelques lignes de CSS suffisent à ajouter un symbole visuel à la suite du lien :</p>
<pre class="language-css"><code class="language-css"><span class="token selector">a[target="_blank"]::after</span> <span class="token punctuation">{</span>
  <span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">""</span><span class="token punctuation">;</span>
  <span class="token property">display</span><span class="token punctuation">:</span> inline-block<span class="token punctuation">;</span>
  <span class="token property">inline-size</span><span class="token punctuation">:</span> .8em<span class="token punctuation">;</span>
  <span class="token property">block-size</span><span class="token punctuation">:</span> .8em<span class="token punctuation">;</span>
  <span class="token comment">/* ... */</span>
  <span class="token property">background-color</span><span class="token punctuation">:</span> currentColor<span class="token punctuation">;</span>
  <span class="token property">mask-image</span><span class="token punctuation">:</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">"data:image/svg+xml;base64, …"</span><span class="token punctuation">)</span></span><span class="token punctuation">;</span>
  <span class="token property">mask-repeat</span><span class="token punctuation">:</span> no-repeat<span class="token punctuation">;</span>
  <span class="token property">mask-size</span><span class="token punctuation">:</span> contain<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>L'utilisation combinée des propriétés <code>background-color</code> et <code>mask-*</code> aident à respecter les proportions de l'image vectorielle <em>et</em> à la détourer aux couleurs du texte du lien.</p>
<p>L'image est encodée directement dans la feuille CSS pour éviter un temps de latence à l'affichage.</p>
<hr>
<p>C'est bon, nos liens externes sont désormais accessibles.
Le <a href="https://github.com/thom4parisot/thom4.net/blob/d1ff1b44ba0b28085478f4715175cc9427fe0f3e/config/markdown.js#L86-L106" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="code source des liens externes accessibles pour markdown-it (ouvre un nouvel onglet)">code source des liens externes accessibles pour <code>markdown-it</code></a> (intégré à <span lang="en">Build Awesome</span>) est consultable dans le dépôt de ce carnet.</p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Refonte 3.0"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/27/crest-saou-via-col-chaudiere/</id>
    <title>Trajet Crest ↦ Saou ↦ Crest (via le col de la Chaudière)</title>
    <link href="https://thom4.net/2026/04/27/crest-saou-via-col-chaudiere/" hreflang="fr-FR" />
    <updated>2026-04-27T11:16:00Z</updated>
    <content type="html"><![CDATA[<p>Le col de la Chaudière est emblématique : au pied des sommets de trois becs. Un phare paysager quand on est à Crest et dans la vallée de la Drôme.</p>
<p>C'est une ascension de onze kilomètres sur une route empruntée par des voitures mais sans trop. On a opté pour des chemins de traverses entre Bourdeaux et Saoû : en passant par les très beau villages du Poët-Célard et de Francillon-sur-Roubion. Ça rallongeait et rajoutait du dénivelé (presque quatre-cent mètres) mais ça vallait le détour en cette saison.</p>
<p>On craignait le trafic important entre Saoû et Crest après 17h.
On a alors opté pour un autre chemin de traverse, par la Répara-Auriple.</p>
<p>C'était la balade avec le plus de dénivelé en une journée.
Je suis content de voir que j'avais encore de l'énergie en fin de journée.
Et surtout, quel régal visuel tout au long du périple.</p>
<p><img src="https://thom4.net/images/2026/04/crest-saou-via-col-chaudiere.webp" alt="" title="Vue vers le pays de Bourdeaux depuis le col de la Chaudière."></p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Vélo"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/25/emojis/</id>
    <title>Émojis accessibles</title>
    <link href="https://thom4.net/2026/04/25/emojis/" hreflang="fr-FR" />
    <updated>2026-04-25T20:38:00Z</updated>
    <content type="html"><![CDATA[<p>Je savais déjà que l'utilisation d'émojis dans le texte n'était pas accessible.
C'est leur texte alternatif qui est lu au lecteur d'écran. Comme &quot;mains rassemblées&quot; ou <em lang="en">folded hands</em> pour l'émoji utilisées pour symboliser un &quot;merci&quot; <span class="emoji emoji--pray" aria-hidden="true">🙏</span>.</p>
<p>La lecture de l'article <a href="https://blog.pope.tech/2026/04/01/making-emojis-and-icons-screen-reader-accessible/" lang="en" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="making emojis and icons screen reader accessible (ouvre un nouvel onglet)">making emojis and icons screen reader accessible</a> m'a fait agir dessus sur ce blog avec l'extension <a href="https://github.com/markdown-it/markdown-it-emoji/" lang="en" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="markdown-it-emoji (ouvre un nouvel onglet)">markdown-it-emoji</a>.</p>
<hr>
<p>J'ai suivi la documentation pour rendre l'affichage accessible.</p>
<p>Ainsi, le raccourci textuel <code>:pray:</code> est converti en :</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>emoji emoji--pray<span class="token punctuation">"</span></span> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>🙏<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span></code></pre>
<hr>
<p>Il a fallu plonger dans les entrailles du fonctionnement de <code lang="en">markdown-it</code> pour que chaque émoji existante soit elle aussi, convertie dans un code similaire.</p>
<p>J'ai créé une règle qui est insérée <em>avant</em> l'extension émojis pour convertir chaque émoji (unicode) en raccourci textuel d'émoji :</p>
<ol>
<li>on parcourt chaque <a href="https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#token-stream" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="jeton markdown (ouvre un nouvel onglet)">jeton markdown</a> ;\</li>
</ol>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
  type<span class="token operator">:</span> 'inline'<span class="token punctuation">,</span>
  content<span class="token operator">:</span> 'Coucou 👋🏻'
<span class="token punctuation">}</span></code></pre>
<ol start="2">
<li>on vérifie la présence d'une émoji (via leur classe Unicode d'expression régulière) ;</li>
<li>on remplace chaque occurence par son raccourci textuel.\</li>
</ol>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
  type<span class="token operator">:</span> 'inline'<span class="token punctuation">,</span>
  content<span class="token operator">:</span> 'Coucou <span class="token operator">:</span>wave<span class="token operator">:</span>'
<span class="token punctuation">}</span></code></pre>
<ol start="4">
<li>qui a son tour rentre dans la moulinette expliquée précédemment\</li>
</ol>
<pre class="language-html"><code class="language-html">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Coucou <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>emoji emoji--wave<span class="token punctuation">"</span></span> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>👋🏻<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></code></pre>
<p><a href="https://github.com/thom4parisot/thom4.net/blob/d1ff1b44ba0b28085478f4715175cc9427fe0f3e/config/markdown.js#L15-L47" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="Le code complet est disponible sur GitHub (ouvre un nouvel onglet)">Le code complet est disponible sur GitHub</a>.</p>
<hr>
<p>Tout autre émoji <strong>décoratif</strong> (comme dans cette entrée de journal par exemple) est masquée aux lecteurs d'écran avec <code>aria-hidden=&quot;true&quot;</code> :</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post-title<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">aria-hidden</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>☕️<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
  Journal : Émojis accessibles
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></code></pre>
<hr>
<p>Je n'ai pas eu à reprendre les vingt années de contenus pour y arriver.
La lecture d'une <a href="https://github.com/markdown-it/markdown-it-emoji/issues/43" lang="en" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="issue GitHub (ouvre un nouvel onglet)">issue GitHub</a>, d'une <a href="https://github.com/markdown-it/markdown-it-emoji/pull/53/changes" lang="en" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="proposition de code (ouvre un nouvel onglet)">proposition de code</a> et le code d'autres extensions markdown m'ont aidé à mettre en place les mécanismes ci-dessus.</p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Refonte 3.0"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/20/valence-crest-via-col-cavalli/</id>
    <title>Trajet Valence ↦ Crest (via le col Cavalli)</title>
    <link href="https://thom4.net/2026/04/20/valence-crest-via-col-cavalli/" hreflang="fr-FR" />
    <updated>2026-04-20T12:30:00Z</updated>
    <content type="html"><![CDATA[<p>De retour de <a href="https://mixitconf.org/fr/2026" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="MiXiT 2026 (ouvre un nouvel onglet)">MiXiT 2026</a>, je ne voulais pas reprendre le <a href="https://thom4.net/2026/04/19/viarhona-valence-vienne/">même chemin qu'à l'aller</a>.</p>
<p>Un lieu m'intrigait depuis plusieurs années : le col Jérôme Cavalli. Je ne savais pas à quoi ressemblait le paysage d'un endroit dont je voyais la signalétique mais rien de plus.</p>
<p>Alors, c'est l'occasion d'un détour… et d'un bon et long dénivelé.</p>
<p>Le trajet était pastoral et fleuri depuis la sortie de Chabeuil par les petites routes. Avec des senteurs de glycines près des maisons et de bruyères dans la lente ascension.</p>
<p>La route était tranquille et peu fréquentée : j'y ai croisé davantage de cyclistes que de voitures.</p>
<p><img src="https://thom4.net/images/2026/04/combovin-col-cavalli.webp" alt="" title="Plus que 10 kilomètres de montée avant le sommet !"></p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Vélo"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/19/cartes-interactives/</id>
    <title>Cartes interatives</title>
    <link href="https://thom4.net/2026/04/19/cartes-interactives/" hreflang="fr-FR" />
    <updated>2026-04-19T11:30:00Z</updated>
    <content type="html"><![CDATA[<p>L'écriture du billet <a href="https://thom4.net/2026/04/19/viarhona-valence-vienne/">trajet Valence ↦ Vienne</a> m'a donné envie d'ajouter une carte interactive.</p>
<p>Et c'est une chose que j'adore avec cet apprentissage ouvert : on sait à peu près par où on commence, on a une petite idée d'où on veut aller mais le chemin est imprévisible.</p>
<p>Je tente un audit d'accessibilité après l'ajout d'une carte basée sur <a href="https://maplibre.org/projects/gl-js/" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="MapLibreGL (ouvre un nouvel onglet)">MapLibreGL</a> et :</p>
<ol>
<li>le titre par défaut du composant est en anglais : je souhaite le personnaliser en français ;</li>
<li><em>mais</em> il manque un <a href="https://developer.mozilla.org/fr/docs/Web/Accessibility/ARIA/Reference/Roles" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="rôle (ouvre un nouvel onglet)"><strong>rôle</strong></a> au composant (image, région ou application par exemple) ;</li>
<li><em>et</em> je découvre un <a href="https://github.com/maplibre/maplibre-gl-js/issues/53#issue-783551850" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="audit d'accessibilité daté de 2021 (ouvre un nouvel onglet)">audit d'accessibilité daté de 2021</a> qui révèle d'<em>autres</em> points d'amélioration (structure hiérarchique, alternative textuelle à des symboles, taille minimale des zones de clic).</li>
</ol>
<p>Je me suis proposé pour prendre en charge ces corrections.<br>
De manière égoïste parce que j'aimerais que les cartes de mon carnet web soient accessibles (<a href="https://thom4.net/2026/04/10/a11y-first/">une des intentions de la refonte 3.0</a>).<br>
Et aussi pour que les cartes interactives basées sur MapLibreGL le deviennent, accessibles, sans grand effort supplémentaire.</p>
<hr>
<p>J'envisage une <a href="https://developer.mozilla.org/fr/docs/Glossary/Progressive_Enhancement" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="amélioration progressive (ouvre un nouvel onglet)">amélioration progressive</a> de ce composant en expérimentant avec le composant <a href="https://www.11ty.dev/docs/plugins/is-land/" hreflang="en" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="&lt;is-land&gt; (ouvre un nouvel onglet)"><code>&lt;is-land&gt;</code></a> :</p>
<ul>
<li>utilisation d'une image légère, statique pour représenter la carte ;</li>
<li>un bouton d'activation d'interactivité qui charge deux à trois cent kilo-octets d'interactivité.</li>
</ul>
<hr>
<p>J'envisage aussi de donner accès au <strong>téléchargement des tracés</strong>, pour le récupérer sur un autre appareil. C'est un des bénéfices des <strong>données interopérables</strong>.
Et de leur attribuer une licence, pour rendre explicite leur source/origine/conditions de réutilisations.</p>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Refonte 3.0"/>
  </entry>
  <entry xml:lang="fr-FR">
    <id>https://thom4.net/2026/04/19/viarhona-valence-vienne/</id>
    <title>Trajet Valence ↦ Vienne</title>
    <link href="https://thom4.net/2026/04/19/viarhona-valence-vienne/" hreflang="fr-FR" />
    <updated>2026-04-19T11:13:00Z</updated>
    <content type="html"><![CDATA[<p>Le beau temps était au rendez-vous de <a href="https://mixitconf.org/fr/2026" class="external-link" rel="noopener noreferrer" target="_blank" aria-label="MiXiT 2026 (ouvre un nouvel onglet)">MiXiT 2026</a>.
J'en ai fait l'occasion/aventure de me rendre à Lyon en vélo.</p>
<p>J'en avais envie et besoin.<br>
Envie car ça faisait longtemps que je n'avais pas fait de vélo à la journée, sur une longue distance (cent kilomètres ça commence à faire long pour mon niveau).<br>
Besoin car il y a un genou à remuscler après une entorse en février.</p>
<p>J'aime bien les différents segments paysagers de ce parcours : des tunnels forestiers, de la loooooongue ligne droite en bord de Rhône (avec toutes ses infrastructures hydroélectriques — barrages et centrales nucléaires), des zones maraichères, des vis à vis industriels (pétrochimie, usines à papier, etc.).</p>
<p>Dans les deux sacoches :</p>
<ul>
<li>quelques vivres sucrées pour tenir la route ;</li>
<li>une poche à eau (vide) de trois litres ;</li>
<li>une gourde à eau de un litre ;</li>
<li>du rechange pour 4 jours (dans des cubes de rangement, comme ça c'est facile à sortir/ranger) ;</li>
<li>serviette de bain et trousse de toilette ;</li>
<li>un sac à dos léger de travail (ordinateur, pochettes à câbles, carnet, trousse) ;</li>
<li>de la place pour peut-être revenir avec quelques affaires en plus.</li>
</ul>
]]></content>
    <category term="Journal"/>
    <category term="Explorations"/>
    <category term="Vélo"/>
  </entry>
</feed>