CINXE.COM

Nicolas Friedli

<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nicolas Friedli</title><link>https://nicolasfriedli.ch/</link><description>Recent content on Nicolas Friedli</description><generator>Hugo -- gohugo.io</generator><language>fr</language><managingEditor>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</managingEditor><webMaster>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</webMaster><copyright>Creative Commons BY-SA</copyright><lastBuildDate>Mon, 31 Mar 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://nicolasfriedli.ch/index.xml" rel="self" type="application/rss+xml"/><image><url>https://nicolasfriedli.ch/apple-touch-icon.png</url><title>Nicolas Friedli</title><link>https://nicolasfriedli.ch/</link></image><item><title>Liens</title><link>https://nicolasfriedli.ch/blogroll/</link><pubDate>Sun, 02 Feb 2025 18:38:04 +0100</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blogroll/</guid><description>&lt;p>Une sélection de sites personnels, disposant d’un flux RSS et avec des publications durant la dernière année. Ce sont des sites que je lis dans mon agrégateur. Dans l’Antiquité, on appelait une telle liste de liens un &lt;em>blogroll&lt;/em>.&lt;/p> &lt;h2 id="web-en-francais">Web (en français)&lt;/h2> &lt;ul class="grid"> &lt;li>&lt;a href="https://tcrouzet.com/">Thierry Crouzet&lt;/a>&lt;/li> &lt;li>&lt;a href="https://louisderrac.com/">Louis Derrac&lt;/a>&lt;/li> &lt;li>&lt;a href="https://ploum.net/">Lionel Dricot&lt;/a>&lt;/li> &lt;li>&lt;a href="https://affordance.framasoft.org/">Olivier Ertzscheid&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.quaternum.net/">Antoine Fauchié&lt;/a>&lt;/li> &lt;li>&lt;a href="https://bertrandkeller.info/">Bertrand Keller&lt;/a>&lt;/li> &lt;li>&lt;a href="https://larlet.fr/david/">David Larlet&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.standblog.org/blog/">Tristan Nitot&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.arthurperret.fr/">Arthur Perret&lt;/a>&lt;/li> &lt;li>&lt;a href="https://sebsauvage.net/links/">Sébastien Sauvage&lt;/a>&lt;/li> &lt;/ul> &lt;h2 id="web-en-anglais">Web (en anglais)&lt;/h2> &lt;ul class="grid"> &lt;li>&lt;a href="https://whitep4nth3r.com/">Salma Alam-Naylor&lt;/a>&lt;/li> &lt;li>&lt;a href="https://maggieappleton.com/">Maggie Appleton&lt;/a>&lt;/li> &lt;li>&lt;a href="https://css-irl.info/">Michelle Barker&lt;/a>&lt;/li> &lt;li>&lt;a href="https://set.studio/">Andy Bell&lt;/a>&lt;/li> &lt;li>&lt;a href="https://chriscoyier.net/">Chris Coyier&lt;/a>&lt;/li> &lt;li>&lt;a href="https://coryd.dev/">Cory Dransfeldt&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.cassie.codes/">Cassie Evans&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.lkhrs.com/">Luke Harris&lt;/a>&lt;/li> &lt;li>&lt;a href="https://amyhupe.co.uk/">Amy Hupe&lt;/a>&lt;/li> &lt;li>&lt;a href="https://adactio.com/">Jeremy Keith&lt;/a>&lt;/li> &lt;li>&lt;a href="https://una.im/">Una Kravets&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.zachleat.com/">Zach Leatherman&lt;/a>&lt;/li> &lt;li>&lt;a href="https://ethanmarcotte.com/">Ethan Marcotte&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.matuzo.at/">Manuel Matuzović&lt;/a>&lt;/li> &lt;li>&lt;a href="https://blog.jim-nielsen.com/">Jim Nielsen&lt;/a>&lt;/li> &lt;li>&lt;a href="https://matthiasott.com/">Matthias Ott&lt;/a>&lt;/li> &lt;li>&lt;a href="https://heydonworks.com/">Heydon Pickering&lt;/a>&lt;/li> &lt;li>&lt;a href="https://kevquirk.com/">Kev Quirk&lt;/a>&lt;/li> &lt;li>&lt;a href="https://csswizardry.com/">Harry Roberts&lt;/a>&lt;/li> &lt;li>&lt;a href="https://pimpmytype.com/">Olivier Schöndorfer&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.typewolf.com/">Jeremiah Shoaf&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.sarasoueidan.com/">Sara Soueidan&lt;/a>&lt;/li> &lt;li>&lt;a href="https://hidde.blog/">Hidde de Vries&lt;/a>&lt;/li> &lt;/ul> &lt;h2 id="blogs-protestants">Blogs protestants&lt;/h2> &lt;ul class="grid"> &lt;li>&lt;a href="https://olivierbauer.org/">Olivier Bauer&lt;/a>&lt;/li> &lt;li>&lt;a href="https://lauredevaux.ch/">Laure Devaux Allisson&lt;/a>&lt;/li> &lt;li>&lt;a href="https://dianefriedli.ch/">Diane Friedli&lt;/a>&lt;/li> &lt;li>&lt;a href="https://eliojaillet.ch/">Elio Jaillet&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.ethikos.ch/">Armin Kressmann&lt;/a>&lt;/li> &lt;li>&lt;a href="https://espritdeliberte.leswoody.net/">James Woody&lt;/a>&lt;/li> &lt;/ul> &lt;h2 id="remarque">Remarque&lt;/h2> &lt;p>Ces 3 catégories reprennent des titres des mes catégories de flux RSS. La liste complète des flux suivis est disponible sur demande au format OPML. Vous pourrez l’intégrer facilement à votre lecteur de flux habituel (Feedly, Inoreader, Feedbin, etc.).&lt;/p></description></item><item><title>Recherche</title><link>https://nicolasfriedli.ch/search/</link><pubDate>Mon, 10 Feb 2025 10:54:11 +0100</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/search/</guid><description>&lt;p>Trouver quelque chose sur ce site avec la recherche statique Pagefind.&lt;/p> &lt;link href="https://nicolasfriedli.ch/pagefind/pagefind-ui.css" rel="stylesheet"> &lt;script src="https://nicolasfriedli.ch/pagefind/pagefind-ui.js">&lt;/script> &lt;div id="search">&lt;/div> &lt;script> window.addEventListener("DOMContentLoaded", (event) => { new PagefindUI({ element: "#search", pageSize: 10, showSubResults: true, showImages: false, autofocus: true }); }); &lt;/script></description></item><item><title>Contact</title><link>https://nicolasfriedli.ch/contact/</link><pubDate>Tue, 21 Jan 2025 20:15:53 +0100</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/contact/</guid><description>&lt;p>Toutes les informations utiles pour me proposer un mandat, m’employer, me poser une question ou me faire part d’une remarque sur ce site.&lt;/p> &lt;h2 id="coordonnees">Coordonnées&lt;/h2> &lt;p>Nicolas Friedli&lt;br> Rue du Château 3&lt;br> 2013 Colombier (NE)&lt;br> Suisse&lt;/p> &lt;p>&lt;a href="mailto:hello+2025@nicolasfriedli.ch">hello+2025@nicolasfriedli.ch&lt;/a>&lt;br> &lt;a href="tel:+41328414874">+41 32 841 48 74&lt;/a> (urgences uniquement)&lt;br> &lt;a href="sms:+41793443382">+41 79 344 33 82&lt;/a> (Signal ou SMS)&lt;/p> &lt;p>IDE: CHE-469.715.163&lt;/p> &lt;p>&lt;strong>Merci de privilégier le mail.&lt;/strong> Je ne réponds pas aux prises de contact sur WhatsApp&lt;/p> &lt;p>Je ne suis pas présent sur les réseaux sociaux Bluesky, Instagram, LinkedIn, Mastodon ou Twitter (X). Et j’ai une présence passive sur Facebook pour administrer 2 pages. J’en dis quelques mots dans &lt;a href="https://nicolasfriedli.ch/blog/reseaux-sociaux-regles/">Mes règles d’utilisation des réseaux sociaux&lt;/a>.&lt;/p> &lt;p>Pour m’identifier, voici &lt;a href="https://nicolasfriedli.ch/images/nicolas-friedli.jpg" title="Portrait de Nicolas Friedli">mon portrait&lt;/a>.&lt;/p> &lt;h2 id="mengager">M’engager&lt;/h2> &lt;p>Je favorise les mandats de consultant de quelques jours (répartis sur quelques semaines). Tous mes travaux sont facturés au forfait.&lt;/p> &lt;p>Je souhaite recevoir la description d’un éventuel mandat &lt;em>avant&lt;/em> une première rencontre. Une demande précise a plus de chances de me convaincre de travailler pour vous.&lt;/p> &lt;p>Pour en savoir plus:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://nicolasfriedli.ch/bio/">quelques éléments biographiques&lt;/a> sur mon parcours&lt;/li> &lt;li>&lt;a href="https://nicolasfriedli.ch/about/">à propos&lt;/a> sur les choix techniques de ce site&lt;/li> &lt;/ul> &lt;p>C’est toujours Nicolas Friedli qui réalise le travail: pas d’employé·e, pas de stagiaire, pas de sous-traitance.&lt;/p></description></item><item><title>3 remarques avec l’arrivée d’AI Overviews en Suisse</title><link>https://nicolasfriedli.ch/blog/ai-overviews/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/ai-overviews/</guid><description>&lt;p>Google déploie ses AI Overviews en Suisse et l’impact sur la navigation en ligne sera majeur. C’est un machin qui s’affiche en haut des résultats de recherche, qui ne sert à rien (dans les exemples que j’ai subis), qui prend de la place, etc. En version courte, je dirais que c’est une belle étape dans la &lt;a href="https://ploum.net/2023-06-15-merdification.html">merdification&lt;/a> de Google.&lt;/p> &lt;p>Watson en parle dans &lt;a href="https://www.watson.ch/fr/suisse/google/619805212-google-lance-ai-overview-en-suisse-et-ca-inquiete-le-pays">Google a changé son moteur de recherche et ça inquiète déjà&lt;/a>, Le Temps en parle dans &lt;a href="https://www.letemps.ch/cyber/en-suisse-google-va-bouleverser-son-moteur-de-recherche-avec-les-ai-overviews-quatre-questions-pour-comprendre">En Suisse, Google va bouleverser son moteur de recherche avec les AI Overviews: quatre questions pour comprendre&lt;/a> et plein d’autres médias vont en parler prochainement.&lt;/p> &lt;p>J’en tire 3 conclusions provisoires: sur les liens, sur la navigation et sur la recherche.&lt;/p> &lt;h2 id="les-liens-restent-la-base-du-web-avec-le-contenu">Les liens restent la base du web (avec le contenu)&lt;/h2> &lt;p>Rien de neuf ici. Les contenus et leur mise en lien sont l’essence du web. L’arrivée de l’intelligence artificielle renforce leur importance (même si elle donne parfois l’impression de leur inutilité).&lt;/p> &lt;h3 id="precision-des-liens">Précision des liens&lt;/h3> &lt;p>Il est probable que moins d’internautes arriveront sur des pages précises de votre site. Si la réponse donnée par AI Overvieuws suffit, le clic n’est pas une évidence, hélas.&lt;/p> &lt;p>En conséquence, quand des internautes cliquent et son sur votre site, il me paraît important de leur donner du bon contenu. Le contenu «pur», mais aussi les liens internes et externes qui permettent de le mettre en relation avec d’autres contenus de valeur. Ainsi, il est possible de continuer sa navigation en approfondissant la thématique, plutôt qu’en la survolant par des réponses résumées.&lt;/p> &lt;p>Pour aller plus loin, je vous conseille le billet &lt;a href="https://paulstamatiou.com/browse-no-more">Browse No More&lt;/a>.&lt;/p> &lt;p>Touts les moyens sont bons pour proposer des liens précis, par exemple les QR codes. Le renvoi sur votre page d’accueil me semble bien peu pertinent, mais celui sur un contenu de qualité devient nécessaire. Je donne quelques conseils pratiques dans &lt;a href="https://nicolasfriedli.ch/blog/conseils-qr-code/">Conseils d’utilisation des QR codes&lt;/a>.&lt;/p> &lt;h3 id="navigation-et-architecture-dinformation">Navigation et architecture d’information&lt;/h3> &lt;p>Si les liens à l’interieur du contenu de la page sont toujours les plus forts, les autres outils de navigtations comptent aussi.&lt;/p> &lt;p>Les outils qui permettent de se repérer dans le site sont connus:&lt;/p> &lt;ul> &lt;li>fil d’Ariane (breadcrumb)&lt;/li> &lt;li>petits menus contextuels&lt;/li> &lt;li>pages reliées (related)&lt;/li> &lt;/ul> &lt;p>Les méga-menus sont mauvais pour le référencement (SEO), c’est connu de longue date. Mais ils sont aussi (et surtout) problématiques pour les internautes.&lt;/p> &lt;p>Lorsque j’arrive sur une page par un moteur de recherche, il est peu probable que je continue ma navigation sur le site en parcourant un menu immense. C’est plus simple de retourner d’où je viens: chez Google&amp;hellip;&lt;/p> &lt;p>Et avec une nouvelle réponse AI Overviews, il n’est vraiment pas certain que je revienne sur le site.&lt;/p> &lt;p>Pour aller plus loin, je vous conseille la conférence &lt;a href="https://www.writethedocs.org/videos/na/2017/building-navigation-for-your-doc-site-5-best-practices-tom-johnson/">Building navigation for your doc site: 5 best practices&lt;/a>.&lt;/p> &lt;h2 id="qualite-du-moteur-de-recherche-interne">Qualité du moteur de recherche interne&lt;/h2> &lt;p>Finalement, le retour systématique à la recherche Google après la lecture d’une page va encore s’amplifier. Ce qui change, c’est que la probabilité de revenir sur le site baissera encore.&lt;/p> &lt;p>Mais je ne vois pas le recours à la recherche d’un mauvaise œil. À condition que la recherche se fasse avec le moteur interne du site. Il existe plein de raisons de s’assurer d’obtenir des résultats d’un domaine précis plutôt que le &lt;a href="https://fr.wikipedia.org/wiki/Gloubi-boulga">gloubi-boulga&lt;/a> généré par des intelligences artificielles en compilant des sources.&lt;/p> &lt;p>On peut donc souhaiter des moteurs de recherches:&lt;/p> &lt;ul> &lt;li>rapides&lt;/li> &lt;li>précis&lt;/li> &lt;li>tolérants à la faut de frappe&lt;/li> &lt;li>bien visibles&lt;/li> &lt;li>etc.&lt;/li> &lt;/ul> &lt;p>Si j’ai plus de chance de trouver un contenu par un excellent moteur de recherche interne, peut-être que je ne retournerai pas chez Google pour bidouiller avec des &lt;a href="https://nicolasfriedli.ch/blog/recherche-google-avancee/">recherches avancées&lt;/a>.&lt;/p> &lt;p>Sur ce site, j’essaie &lt;a href="https://nicolasfriedli.ch/blog/recherche-statique-pagefind/">PageFind&lt;/a> en espérant qu’il donne satisfaction.&lt;/p> &lt;p>Finalement, je vous invite à consulter le site gouvernemental du &lt;a href="https://www.gov.uk/">GOV.UK&lt;/a>. Peut-être qu’une bonne recherche interne est la solution au délires de Google et autres géants du web.&lt;/p></description></item><item><title>Élements biographiques</title><link>https://nicolasfriedli.ch/bio/</link><pubDate>Thu, 13 Mar 2025 16:48:41 +0100</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/bio/</guid><description>&lt;p>Nicolas Friedli est titulaire d’un &lt;em>master&lt;/em> en théologie protestante de l’Université de Neuchâtel. Il est consultant web indépendant et salarié à 30% pour le web et les réseaux sociaux de l’EREN (Église réformée évangélique du canton de Neuchâtel).&lt;/p> &lt;p>Il apprécie les sites web simples, performants et pérennes. Il a travaillé ou travaille avec SPIP, DokuWiki et WordPress, 3 outils qu’il utilise toujours en production. Aujourd’hui, il privilégie les sites statiques et Hugo.&lt;/p> &lt;p>Durant les 15+ dernières années, il a travaillé pour les domaines:&lt;/p> &lt;ul> &lt;li>de la culture (musée, ensemble instrumental, festivals)&lt;/li> &lt;li>de l’écrit (agence de presse, maison d’édition, mensuel français)&lt;/li> &lt;li>de l’entreprise (finance, immobilier, industrie)&lt;/li> &lt;li>de la formation (promotion d’études universitaires, formation continue)&lt;/li> &lt;li>des institutions (sites romands, cantonaux et locaux)&lt;/li> &lt;li>des organisations (communes, ONG)&lt;/li> &lt;li>de la santé (cabinets, sites professionnels)&lt;/li> &lt;li>du sport (tournoi ATP de tennis, courses populaires, équipement)&lt;/li> &lt;/ul> &lt;p>Convaincu que les sites d’institutions et d’organisations ont un énorme potentiel d’amélioration, il se passionne pour l’architecture d’information, la performance web et le référencement local. Le contenu et les liens sont les briques essentielles pour proposer un site web utile.&lt;/p> &lt;p>Il s’est exprimé régulièrement dans des sessions de formation professionnelle et dans des interventions publiques.&lt;/p> &lt;p>Il est marié à &lt;a href="https://dianefriedli.ch/">Diane Friedli&lt;/a>, pasteure, et père de 2 enfants adolescents, Lucien et Clémence.&lt;/p></description></item><item><title>Notes sur SPIP en 2025</title><link>https://nicolasfriedli.ch/blog/spip/</link><pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/spip/</guid><description>&lt;p>SPIP est un magnifique système de publication né en 2001. Il a eu ses heures de gloire dans le monde francophone (et ailleurs). Il n’est plus aussi populaire mais qu’importe.&lt;/p> &lt;p>Pour des tests sur &lt;a href="https://theologique.ch/">theologique.ch&lt;/a>, j’ai réinstallé un SPIP tout frais. Même s’il est peu probable que je conserve ce site sous SPIP, je vous explique pourquoi il reste génial en 2025. &lt;strong>Le projet a été modifié et je ferai un site en &lt;a href="https://nicolasfriedli.ch/blog/falc-plain-ia/">langage simplifié&lt;/a> avec Hugo.&lt;/strong>&lt;/p> &lt;p>En fin de billet, je vous donnerai aussi quelques «problèmes» qui m’empêchent de l’utiliser plus souvent.&lt;/p> &lt;h2 id="amelioration-progressive">Amélioration progressive&lt;/h2> &lt;p>J’apprécie particulièrement la gestion très progressive des champs activables. SPIP a été conçu pour la publication éditoriale et ça se ressent. Au départ, un article, c’est un titre et un corps de texte.&lt;/p> &lt;p>Selon la demande, je peux activer, seulement quand c’est nécessaire:&lt;/p> &lt;ul> &lt;li>un sur-titre&lt;/li> &lt;li>un sous-titre&lt;/li> &lt;li>un descriptif (ou résumé)&lt;/li> &lt;li>un chapo (ou introduction)&lt;/li> &lt;li>un post-scriptum&lt;/li> &lt;/ul> &lt;p>Immense avantage de cette progressivité, rien d’inutile n’est affiché dans l’interface d’administration. Elle reste simple et légère. Elle se complexifie en fonction des nécessités avec le temps.&lt;/p> &lt;h2 id="attribution-des-auteurs">Attribution des auteurs&lt;/h2> &lt;p>Alors que beaucoup de systèmes de gestion de contenu (CMS) ont exactement un auteur ou une autrice par article, SPIP est beaucoup plus souple. Pour rappel, chez WordPress, c’est une personne pour les articles et pas de signature pour les pages.&lt;/p> &lt;p>Pour chaque page, il permet d’attribuer zéro, un ou plusieurs auteurs et autrices. Une fois qu’une personne se voit listée, elle devient responsable de la page et peut la modifier. Cela ouvre de belles perspectives pour un travail collaboratif.&lt;/p> &lt;h2 id="syntaxe-de-redaction-et-gestion-typographique">Syntaxe de rédaction et gestion typographique&lt;/h2> &lt;p>De son origine dans le monde de la presse, SPIP a gardé l’excellence de sa gestion typographique. Chaque page est rédigée avec une syntaxe particulière, en pur texte.&lt;/p> &lt;p>Ainsi, on évite les &lt;del>délires&lt;/del> variations de mises en pages. Les copier-coller ne produisent pas les horreurs possibles avec les systèmes visuels WYSIWYG (What you see is what you get). La logique de SPIP, c’est WYMISYG (What you mean is what you get): ce que vous voyez, c’est ce qui est conforme à votre pensée.&lt;/p> &lt;p>Les corrections typographiques permettent de ne pas se soucier des choix des personnes en charge de la rédaction. Il y a toujours une espace insécable avec les deux-points, les points-virgules, etc. Ici, je n’utilise pas d’espacement autour des ponctuations, mais je ne peux pas être certain qu’une autre personne le respectera. Avec SPIP, tout est uniformisé de force.&lt;/p> &lt;h2 id="gestion-des-url-et-maillage-interne">Gestion des URL et maillage interne&lt;/h2> &lt;p>C’est une des raisons pour lesquelles j’ai installé SPIP sur theologique.ch. J’ai activé les URL libres. Ce qui signifie que je peux choisir la chaîne de caractère de l’adresse de la page, toujours en minuscule et à la racine.&lt;/p> &lt;p>Si je déplace une page dans la hiérarchie, l’adresse ne change pas. Ainsi, je peux construire une structure au fil du temps, en conservant les adresses.&lt;/p> &lt;p>Mieux, comme les liens se font par raccourcis, du genre &lt;code>[-&amp;gt;art1]&lt;/code>, le titre et le lien seront toujours corrects. Même quand le titre change, même quand l’emplacement dans le site change.&lt;/p> &lt;p>Et si je décide de changer une URL, l’ancienne adresse reste valide, avec une redirection propre de type 301.&lt;/p> &lt;h2 id="notion-de-popularite">Notion de popularité&lt;/h2> &lt;p>SPIP mesure la &lt;a href="https://www.spip.net/fr_article1846.html">popularité des publications&lt;/a>. Ce qui permet de classer les articles par ordre décroissant de visites à un moment donné.&lt;/p> &lt;p>J’ai bien envie de construire, une fois, un site dont les classement seraient dynamiques, en favorisant le plus lu. C’est bien entendu peu imaginable avec un site statique (à moins de s’adosser à une plateforme de déploiement). C’est une bonne raison d’installer SPIP.&lt;/p> &lt;p>Évidemment, ce genre de choix est discutable. Mais le tester «en vrai» sur un site personnel m’intéresse.&lt;/p> &lt;h2 id="gestion-des-mots-cles">Gestion des mots clés&lt;/h2> &lt;p>Au départ, pas de mots-clés activés. L’interface reste minimale, comme déjà dit.&lt;/p> &lt;p>Mais quand j’ai besoin de taxonomies, je peux activer les mots-clés. Puis créer de groupes et des mots.&lt;/p> &lt;p>La gestion avancée permet des choses intéressantes comme:&lt;/p> &lt;ul> &lt;li>l’attribution par les personnes en charge de l’administration seulement (et non les rédacteurs et rédactrices)&lt;/li> &lt;li>l’incitation à choisir au moins un mot-clé d’un group&lt;/li> &lt;li>l’interdiction de choisir plus d’un mot-clé d’un groupe&lt;/li> &lt;/ul> &lt;p>C’est à la fois très simple et très malin.&lt;/p> &lt;h2 id="installation-et-optimisation">Installation et optimisation&lt;/h2> &lt;p>Dès son installation, SPIP propose tout le nécessaire (batteries included). Et l’installation, avec un base SQLite, et la configuration prennent à peine quelques minutes Pas besoin de se surcharger le tout de plugins et extensions pour avoir un «vrai» site.&lt;/p> &lt;p>L’optimisation est présente par défaut:&lt;/p> &lt;ul> &lt;li>concaténation et minimisation des CSS&lt;/li> &lt;li>concaténation et minimisation du JavaScript&lt;/li> &lt;li>système de cache pour un site rapide et fiable&lt;/li> &lt;/ul> &lt;p>Les statistiques internes sont déjà présente, la gestion des images aussi. Tout est beau dans le meilleur des monde. Mais&amp;hellip;&lt;/p> &lt;h2 id="les-problemes-de-spip">Les «problèmes» de SPIP&lt;/h2> &lt;p>Il n’est pas possible d’installer des thèmes comme avec WordPress. Ni de les configurer aussi simplement; SPIP n’est pas un cliquodrome. Son thème par défaut est un peu daté (mais très efficace). Et ce CMS ne dispose pas de tout l’écosystème de WordPress.&lt;/p> &lt;p>La syntaxe n’est pas Markdown, aujourd’hui la plus utilisée. Normal, elle est née avant! Mais elle peut dérouter et déplaire. Beaucoup de personnes restent réticentes au balisage léger. Elles préfèrent le «à la Word», même s’il est moins efficace dans la durée.&lt;/p> &lt;p>La documentation est médiocre. Certaines parties sont bonnes, mais elle contient un nombre impressionnant de vieilleries et de scories. Elle ne peut pas inspirer pas confiance à une personne qui découvre SPIP.&lt;/p> &lt;p>SPIP n’est pas produit pas une fondation ou une grande entreprise. Pour beaucoup, c’est problématique. Ce CMS est géré par des personnes, sans réel·le propriétaire. Quand on voit les conflits de gouvernance chez WordPress actuellement, on se dit que c’est peut-être une bonne idée&amp;hellip;&lt;/p> &lt;p>Finalement, SPIP n’a pas de marketing, pas de modèle économique, pas de vrai calendrier. Celles et ceux qui le créent sont idéalistes, libertaires, libristes, etc. La nouvelle version arrive «quand elle est prête». Beaucoup d’entreprises et d’organisations refusent de se fier à un tel fonctionnement (qui dure pourtant depuis très longtemps).&lt;/p> &lt;hr> &lt;p>Une personne qui &lt;a href="https://nicolasfriedli.ch/blog/blog-2025/">lance un blog en 2025&lt;/a> et qui ne souhaite pas un site statique devrait peut-être s’intéresser à SPIP.&lt;/p></description></item><item><title>Écologie et cohérence sur le web</title><link>https://nicolasfriedli.ch/blog/ecologie-coherence/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/ecologie-coherence/</guid><description>&lt;p>Depuis des mois, je teste tous les sites qui militent pour l’écologie quand je les visite. Ils sont politiques, institutionnels, associatifs ou personnels. Malheureusement, leur bilan carbone est souvent médiocre.&lt;/p> &lt;p>Cette situation m’interroge. J’essaie d’en comprendre les raisons, sans chercher à dénoncer les mauvais élèves.&lt;/p> &lt;h2 id="ne-pas-voir-limpact-du-numerique">Ne pas voir l’impact du numérique&lt;/h2> &lt;p>On pourrait penser que l’impact énergétique du numérique passe sous le radar. Pourtant, de nombreux sites écologistes sont les premiers à parler de 5G, d’intelligence artificielle et de cloud. Je ne peux donc pas légitimement estimer que le coût du numérique soit inconnu.&lt;/p> &lt;p>Peut-être que les responsables des organisations estiment que leur «petit» site est peu problématique. C’est une pente glissante. Avec le même type de raisonnement, je pourrais me demander pourquoi baisser mon chauffage de quelques degrés. Je ne vais pas sauver les glaciers.&lt;/p> &lt;p>Le principe de cohérence:&lt;/p> &lt;blockquote> &lt;p>Toutes les présences numériques ont des coûts énergétiques. Donc la présence numérique de notre organisation a aussi un coût, même minime.&lt;/p>&lt;/blockquote> &lt;h2 id="tests-faciles-et-competence-technique">Tests faciles et compétence technique&lt;/h2> &lt;p>Évidemment, c’est très facile de voir que ma consommation de chauffage diminue parce que j’ai décidé d’avoir froid. Mais je ne vois pas la facture énergétique de mon site.&lt;/p> &lt;p>Il n’est pas possible d’estimer que toute organisation a les compétences techniques en interne pour évaluer sérieusement son site web. Difficile, sans un profil technique, de voir si une image est mal dimensionnée, si le code Javascript est trop lourd, etc.&lt;/p> &lt;p>Je pourrais répondre qu’il existe des spécialistes dans ce domaine. Puisque j’ai pas de compétences en panneaux solaires, j’appelle un·e spécialiste. Pourquoi en serait-il autrement de mon site? La bonne nouvelle, c’est qu’il existe d’excellents outils pour évaluer un bilan carbone sans effort.&lt;/p> &lt;p>Il suffit de copier une adresse dans le &lt;a href="https://www.websitecarbon.com/">Website Carbon Calculator&lt;/a> pour obtenir une indication globale en quelques secondes.&lt;/p> &lt;p>On peut aller un peu plus loin avec &lt;a href="https://ecograder.com/">Ecograder&lt;/a> qui va détailler ses résultats. Ou on peut se rendre chez &lt;a href="https://pagespeed.web.dev/">PageSpeed Insights&lt;/a> et s’intéresser au bilan de performance. La performance n’est pas le bilan écologique, mais toutes les lourdeurs inutiles qui sont signalées sont intéressantes.&lt;/p> &lt;p>Le principe de cohérence:&lt;/p> &lt;blockquote> &lt;p>Notre organisation propose un site web (bien) meilleur que la moyenne du moment. Nous testons régulièrement notre bilan carbone.&lt;/p>&lt;/blockquote> &lt;h2 id="ce-qui-nest-pas-produit-ne-consomme-rien">Ce qui n’est pas produit ne consomme rien&lt;/h2> &lt;p>Ce qui m’interpelle le plus dans cette question de cohérence, c’est d’oublier des règles de base. Toute personne douée de raison se rend compte que ce qui est le plus léger, c’est ce qui n’est jamais produit.&lt;/p> &lt;p>Pas besoin non plus de compétences très pointues pour savoir que le texte est plus léger que les images et que les images sont plus légères que la vidéo.&lt;/p> &lt;p>La logique classique, c’est de supprimer ce qui est le moins important. C’est une sorte de détox numérique.&lt;/p> &lt;p>La bonne solution, c’est plutôt de se demander, toujours ce qui est nécessaire. Avant d’ajouter une fonctionnalité, puis d’évaluer son bilan carbone, il faut se demander s’il y a besoin d’elle.&lt;/p> &lt;p>Une image (même d’arbres verts) n’est pas forcément utile pour porter ses arguments. Plutôt que d’optimiser une image superflue, mieux vaut ne pas l’afficher du tout (et passer son texte en vert).&lt;/p> &lt;p>Le principe de cohérence:&lt;/p> &lt;blockquote> &lt;p>À chaque étape de conception de notre présence numérique, notre organisation se demande ce qui est nécessaire, utile ou superflu. Notre sobriété numérique, c’est de savoir fixer des priorités et de travailler sur l’essentiel.&lt;/p>&lt;/blockquote> &lt;h2 id="gouvernance--cahier-des-charges">Gouvernance &amp;amp; cahier des charges&lt;/h2> &lt;p>Le vrai problème des sites médiocres, c’est celui de la gouvernance de l’organisation. Ce n’est pas une question de web ou de technique, mais une question de gestion et d’objectifs.&lt;/p> &lt;p>Il est nécessaire de nommer une personne en charge des bonnes pratiques de l’institution elle-même. Elle se chargera d’analyser les pratiques de mobilité, de chauffage, de consommation, etc. internes.&lt;/p> &lt;p>Si ces personnes existaient, elles veilleraient à ce que le cahier des charges du site web mentionne au moins les éléments suivants:&lt;/p> &lt;ul> &lt;li>le site est hébergé par une entreprise écoresponsable&lt;/li> &lt;li>le site obtient un bilan A ou B (Website Carbon Calculator)&lt;/li> &lt;li>les &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/?tag=ecoconception">règles Opquast relatives à l’écoconception&lt;/a> sont respectées&lt;/li> &lt;/ul> &lt;p>Le principe de cohérence:&lt;/p> &lt;blockquote> &lt;p>La démarche d’écoconception fait partie de tous les projets de notre organisation. Une personne (une équipe) a pour tâche spécifique de veiller à son application à toutes les étapes de développement et d’utilisation.&lt;/p>&lt;/blockquote> &lt;h2 id="favoriser-la-surconsommation-par-sa-negligence">Favoriser la surconsommation par sa négligence&lt;/h2> &lt;p>Le principal problème des sites web peu performants, c’est qu’ils incitent à la surconsommation. Ils consomment trop de ressources par rapport à ce qu’ils proposent. C’est malheureux mais ce n’est pas le plus grave.&lt;/p> &lt;p>Quand un site est lourd et mal conçu, il s’affiche mal si le périphérique est ancien ou de gamme moyenne. Il demande plus de bande passante. Parfois, il n’est pas pleinement fonctionnel.&lt;/p> &lt;p>Au final, il convainc les internautes à changer de matériel pour obtenir une expérience de navigation décente.&lt;/p> &lt;p>Le principe de cohérence:&lt;/p> &lt;blockquote> &lt;p>Notre organisation propose un site léger et efficace. Elle veille à permettre une utilisation adéquate sur tout périphérique. Elle estime qu’elle doit améliorer sa présence sur le web pour ne pas imposer de nouveaux matériels.&lt;/p>&lt;/blockquote> &lt;h2 id="incoherence-et-faiblesse-du-discours">Incohérence et faiblesse du discours&lt;/h2> &lt;p>Comme j’ai un profil technique, j’ai tendance à passer un site à la moulinette et à émettre un jugement rapide. Il n’est pas écoconçu, incompatible avec les valeurs prônées par l’organisation. C’est tout le discours qui est décrédibilisé.&lt;/p> &lt;p>Heureusement pour les organisations à visée écologique, le monde semble moins tranché que moi. Pourtant, je suis convaincu que la cohérence entre discours et actes est essentiel pour faire passer un message.&lt;/p> &lt;p>Ignorer les efforts nécessaires et cacher les faiblesses sous le tapis est une stratégie risquée (et perdante).&lt;/p> &lt;hr> &lt;p>Je suis très réservé sur l’idée d’un badge (comme &lt;a href="https://www.websitecarbon.com/badge/">Website Carbon Badge&lt;/a>) pour afficher son bilan carbone. C’est discutable d’utiliser des ressources (mêmes minimes) pour prouver que l’on utilise peu de ressources. Mais peut-être qu’il est nécessaire de recourir à de tels artifices pour faire passer un message.&lt;/p> &lt;p>Pour mieux faire, on peut simplement ajouter un &lt;a href="https://www.websitecarbon.com/website/nicolasfriedli-ch-blog-ecologie-coherence/">lien vers le test de cette page&lt;/a>. Cliquez pour savoir si mon discours est crédible!&lt;/p></description></item><item><title>Métadiscours et sites personnels</title><link>https://nicolasfriedli.ch/blog/metadiscours/</link><pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/metadiscours/</guid><description>&lt;p>Un blog court toujours le risque de glisser vers le métadiscours. Autrement dit, de parler avant tout de lui-même. C’est particulièrement le cas pour tout site qui parle du web. Mais ce n’est pas un problème en soi.&lt;/p> &lt;p>Une brève définition du métadiscours selon la page de Wikipédia en anglais &lt;a href="https://en.wikipedia.org/wiki/Metadiscourse">metadiscourse&lt;/a> en dit un peu plus:&lt;/p> &lt;blockquote> &lt;p>Dans la philosophie du langage, le métadiscours est une discussion sur une discussion, par opposition à une simple discussion sur un sujet donné.&lt;/p>&lt;/blockquote> &lt;p>Le paradoxe suivant est posé. Si je ne parle que de mon blog sur mon blog, j’ai l’impression de tourner en rond. Mais, quand je lis de blogs techniques, j’observe que les billets qui parlent des coulisses du site sont ceux qui m’intéressent le plus. Un équilibre doit être possible.&lt;/p> &lt;h2 id="lexemple-de-la-page-now">L’exemple de la page &lt;code>/now&lt;/code>&lt;/h2> &lt;p>Il y a quelques années, Derek Sivers a proposé de publier de &lt;a href="https://nownownow.com/about">page &lt;code>/now&lt;/code>&lt;/a> sur nos sites. Elle a pour vocation de parler de ce sur quoi les blogueurs et blogueuse sont focalisés actuellement. Elle se distingue des pages à propos et contact qui donnent des informations pérennes.&lt;/p> &lt;p>Une petite phrase de &lt;a href="https://blog.professeurjoachim.com/billet/2024-01-14-ma-page-now-ou-plutot-en-ce-moment">Joachim Robert sur les pages &lt;code>/now&lt;/code>&lt;/a> m’a interpellé:&lt;/p> &lt;blockquote> &lt;p>Moins un blog est mis à jour, plus il y a de probabilité que ce qui y est publié a pour sujet les aspects techniques dudit blog.&lt;/p>&lt;/blockquote> &lt;p>Elle a été signalée dans le billet &lt;a href="https://larlet.fr/david/2024/01/08/">Liens&lt;/a> par David Larlet, qui ajoute:&lt;/p> &lt;blockquote> &lt;p>J’ai ri. Je n’ai jamais fait une telle page car je sais que je n’arriverais pas à la maintenir à jour.&lt;/p>&lt;/blockquote> &lt;p>Il a raison. Ce sur quoi une personne qui gère un site travaille actuellement devrait se voir par l’actualité de ses publications. Finalement, un blog vivant est déjà une pagee &lt;code>/now&lt;/code> en soi. C’est pourquoi, en l’état, je me limiterai à des nouveaux billets.&lt;/p> &lt;p>Rédiger une page dédiée, c’est tomber dans le métadiscours pour le métadiscours. Sauf quand une telle page est aboutie et dynamique comme la &lt;a href="https://www.coryd.dev/now">page &lt;code>/now&lt;/code> de Cory Dransfeldt&lt;/a>. Il a même proposé une vidéo sur le sujet: &lt;a href="https://www.youtube.com/watch?v=AzcFZJYEpnQ">Building a performant &lt;code>/now&lt;/code> page using 11ty&lt;/a>. C’est donc un métadiscours sur une page de métadiscours!&lt;/p> &lt;h2 id="contenus-utiles-et-contenus-reflexifs">Contenus utiles et contenus réflexifs&lt;/h2> &lt;p>De manière un peu caricaturale, il existe 2 types de contenus:&lt;/p> &lt;ul> &lt;li>les contenus utiles: la mise à disposition de ressources pratiques (articles techniques, documentation, guides, etc.)&lt;/li> &lt;li>les contenus réflexifs: la mise en récit de la construction du site lui-même (réflexions sur les choix éditoriaux, les évolutions techniques, etc.)&lt;/li> &lt;/ul> &lt;p>Mais qui s’intéresse un peu à la publications sur le web se rendra rapidement compte que c’est beaucoup plus compliqué. Il vaut la peine de relire [Enseignements du framework Diátaxis]/blog/diataxis-introduction/ et sortir de la caricature.&lt;/p> &lt;p>Très souvent, les contenus réflexifs sur des projets web permettent de beaucoup mieux choisir ses outils. Dans ce cas, j’ai besoin du métadiscours sur les choix opérés, le &lt;em>pourquoi&lt;/em>. Je ne cherche pas le «meilleur», mais le mieux adapté à mes besoins. Par exemple celui qui est presque aussi bon que le meilleur, mais beaucoup plus facile à utiliser. J’en parle dans &lt;a href="https://nicolasfriedli.ch/blog/optimisation-raisonnable/">Philosophie d’optimisation raisonnable&lt;/a>&lt;/p> &lt;h2 id="se-centrer-sur-soi-ou-elargir-le-propos">Se centrer sur soi ou élargir le propos&lt;/h2> &lt;p>En rédigeant &lt;a href="https://nicolasfriedli.ch/blog/blog-2025/">Lancer un blog en 2025(?)&lt;/a>, je me suis demandé si je parlais de ma présence en ligne ou de l’importance des sites personnels au sens large. Je parlais d’un blog, mais je parlais surtout d’une thématique plus large: la merdification des choses.&lt;/p> &lt;p>Dans &lt;a href="https://nicolasfriedli.ch/blog/garanti-sans-chatgpt/">Garanti sans ChatGPT (ou pas)&lt;/a>, je suis parti de mon site pour parler d’un sujet beaucoup plus général. La question de savoir s’il fallait ajouter une mention du type &lt;em>rédigé sans intelligence artificielle&lt;/em> n’était que le point de départ pour parler d’un sujet de société.&lt;/p> &lt;p>Quand le développeur Max Böck propose un système de changement de couleur du site dans &lt;a href="https://mxb.dev/blog/color-theme-switcher/">Color Theme Switcher&lt;/a>, difficile de dire s’il parle de son site ou de développement web.&lt;/p> &lt;p>Quand je propose le billet &lt;a href="https://nicolasfriedli.ch/blog/recherche-statique-pagefind/">Recherche statique performante avec PageFind&lt;/a>, est-ce que je parle de mon blog ou de recherche sur le web? Ou plutôt de l’importance des règles Opquast et de la veille technologique?&lt;/p> &lt;p>C’est tout l’intérêt d’un blog qui parle en «je» (explicitement ou implicitement). C’est justement ce que j’y cherche. C’est encore plus vrai quand la thématique principale d’un blog est le web.&lt;/p> &lt;h2 id="devoiler-les-coulisses">Dévoiler les coulisses&lt;/h2> &lt;p>Parfois, il existe assez de production de contenu pour ne pas avoir «besoin» de faire du métadiscours. C’est le cas du &lt;a href="https://dianefriedli.ch/">blog de ma femme Diane Friedli&lt;/a>. Elle y publie ses prédications, des contes de Noël, des recensions, etc. Elle n’aurait pas besoin de parler des coulisses&amp;hellip; et pourtant elle le fait.&lt;/p> &lt;p>Dans &lt;a href="https://dianefriedli.ch/poeme-acidule-ados/">Poème acidulé pour les ados&lt;/a>, elle rappelle le contexte de production et propose quelques lignes sur ses études en théologie. Elle aurait pu nous donner le texte seul; elle a choisi de le contextualiser.&lt;/p> &lt;p>Et dans &lt;a href="https://dianefriedli.ch/ce-blog-a-10-ans/">Ce blog a 10 ans&lt;/a>, est-ce qu’elle s’exprime vraiment au sujet de son blog? Ou est-ce qu’elle dit quelque chose sur sa vocation pastorale et sa manière de pratiquer son métier? Est-ce qu’elle tend une perche à ses collègues pour les inciter à bloguer aussi?&lt;/p> &lt;p>Ce genre de contenu, qui propose discours et métadiscours, est ce qui fait toute la richesse des blogs et des sites personnels. Au final, les internautes ne n’y trompent pas, il y a bien une personne derrière le texte. Si celles et ceux qui s’expriment publiquement ouvraient les portes du laboratoire, la question des IA (intelligences artificielles) serait abordée autrement. Il n’y a pas de honte à utiliser ChatGPT ou à reprendre de l’existant, à condition de dire quelque chose de sa démarche, de ses forces, de ses limites et de la pertinence du résultat.&lt;/p> &lt;h2 id="personnes-ou-organisations">Personnes ou organisations&lt;/h2> &lt;p>J’ai un attachement aux personnes beaucoup plus qu’aux organismes et aux institutions. C’est d’ailleurs pour cette raison que j’ai libellé ainsi tous les intitulés de ma page &lt;a href="https://nicolasfriedli.ch/blogroll/">liens&lt;/a>, même quand les sites ont un autre nom officiel. Quand les organisations ajoutent du métadiscours, c’est presque toujours &lt;del>du bullshit&lt;/del> pour se justifier (et c’est mortifère). Quand des blogueurs et blogueuses parlent de leur blog, c’est la vraie vie qui surgit.&lt;/p> &lt;h2 id="envoi">Envoi&lt;/h2> &lt;p>Est-il encore possible de toucher les internautes en se réfugiant derrière l’académisme du nous ou le verbiage des organisations? À quoi bon (essayer de) vulgariser s’il n’y a pas de présence humaine pour nous prendre par la main? Finalement, que signifie &lt;em>choisir la vie&lt;/em> dans nos modalités d’expression sur le web?&lt;/p> &lt;p>Nous en sommes à installer des extensions de navigateurs pour détecter les contenus générés par IA. Il faudrait profiter du même élan pour détecter les contenus vides.&lt;/p> &lt;p>Le métadiscours, malgré ses faiblesses et ses limites, est toujours ce qu’il y a de plus riche. Il révèle la personne derrière le texte. C’est précisément ce qui manque à tant de contenus aujourd’hui.&lt;/p> &lt;hr> &lt;p>Ce billet reprend une ancienne publication. J’ai essayé de fournir à ChatGPT cette archive et un liste de liens frais. Puis une trame rédactionnelle. J’ai obtenu un article correct mais complètement banal sur le métadiscours. Il était à l’exact opposé ce que que je prétends (et tente de faire) ici.&lt;/p></description></item><item><title>Recherche statique performante avec PageFind</title><link>https://nicolasfriedli.ch/blog/recherche-statique-pagefind/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/recherche-statique-pagefind/</guid><description>&lt;p>Un moteur de recherche peut améliorer l’expérience des internautes (UX) en offrant un accès rapide aux contenus d’un site. Pour les sites statiques, il faut soit coder une recherche côté client à la main, soit utiliser un service tiers comme Algolia. Ou alors on peut utiliser PageFind qui se distingue par sa facilité d’intégration et ses performances.&lt;/p> &lt;h2 id="qualite-web">Qualité web&lt;/h2> &lt;p>La règle &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/le-site-propose-un-moteur-de-recherche-interne">Opquast 163&lt;/a> est sans équivoque:&lt;/p> &lt;blockquote> &lt;p>&lt;strong>Le site propose un moteur de recherche interne.&lt;/strong> Le moteur de recherche est, avec le plan du site, les menus et le lien de retour à l’accueil, un des moyens fondamentaux de réorientation et d’accès à l’information. Rendez-le présent et facile d’accès.&lt;/p>&lt;/blockquote> &lt;p>Je signale que la règle &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/chaque-page-de-resultats-de-recherche-peut-etre-atteint-via-une-adresse-web">Opquast 164&lt;/a> ne sera pas respectée:&lt;/p> &lt;blockquote> &lt;p>Chaque page de résultats de recherche peut être atteinte via une adresse Web.&lt;/p>&lt;/blockquote> &lt;p>Alors que la règle &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/il-est-possible-de-relancer-une-recherche-depuis-sa-page-de-resultats">Opquast 165&lt;/a> le sera:&lt;/p> &lt;blockquote> &lt;p>Il est possible de relancer une recherche depuis sa page de résultats.&lt;/p>&lt;/blockquote> &lt;h2 id="presentation-de-pagefind">Présentation de PageFind&lt;/h2> &lt;p>&lt;a href="https://pagefind.app/">PageFind&lt;/a> est conçu pour ajouter une recherche interne aux sites statiques:&lt;/p> &lt;ul> &lt;li>il analyse toutes les pages générées (en local) pour créer un index&lt;/li> &lt;li>il génère le code nécessaire pour l’affichage et la recherche côté client&lt;/li> &lt;li>il est rapide à la compilation et léger à l’usage&lt;/li> &lt;li>il est utilisable sans configuration (et il est configurable)&lt;/li> &lt;li>il est très bien documenté&lt;/li> &lt;/ul> &lt;p>Je viens de parcourir l’ensemble de la documentation pour imaginer les possibles cet outil. Elle est très claire, bien structuré, ni trop longue, ni trop succincte.&lt;/p> &lt;p>Si le sujet vous intéresse, je vous conseille ces vidéos:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://www.youtube.com/watch?v=WgoBoX4qTk8">Static Search on Hugo: The Journey to Pagefind v1.0&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.youtube.com/watch?v=wb6tD2gDv2c">Workshop and Interview with Pagefind engineer Liam Bigelow&lt;/a>&lt;/li> &lt;/ul> &lt;p>Je conseille de toujours se renseigner sur les objectifs d’un projet avant de l’adopter ou non. PageFind vise à être &lt;strong>performant sur de grands sites&lt;/strong>, en utilisant &lt;strong>le moins de bande passante possible&lt;/strong> et &lt;strong>sans infrastructure particulière&lt;/strong> ou de service tiers. Je suis impressionné du resultat, avec des réponses souvent meilleures que la recherche de &lt;del>WordPress&lt;/del> des CMS classique.&lt;/p> &lt;h2 id="inclure-la-recherche-dans-hugo">Inclure la recherche dans Hugo&lt;/h2> &lt;p>Comme je ne souhaite pas la recherche sur toutes les pages, j’ai créé un shortcode Hugo que je peux placer où je le veux. Je pourrais très bien l’appeler ici avec un simple &lt;code>{{&amp;lt; search &amp;gt;}}&lt;/code>. Sur ce site, j’ai choisi de l’intégrer dans une page dédiée à la recherche.&lt;/p> &lt;p>Le code de &lt;code>layout/shortcodes/search.html&lt;/code> est une reprise la proposition de &lt;a href="https://pagefind.app/docs/">Getting Started with Pagefind&lt;/a> avec quelques &lt;a href="https://pagefind.app/docs/ui/">options de configuration&lt;/a>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;link href=&amp;#34;/pagefind/pagefind-ui.css&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt; &amp;lt;script src=&amp;#34;/pagefind/pagefind-ui.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;div id=&amp;#34;search&amp;#34;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;script&amp;gt; window.addEventListener(&amp;#34;DOMContentLoaded&amp;#34;, (event) =&amp;gt; { new PagefindUI({ element: &amp;#34;#search&amp;#34;, pageSize: 10, showSubResults: true, showImages: false, autofocus: true }); }); &amp;lt;/script&amp;gt; &lt;/code>&lt;/pre>&lt;p>Bien entendu, je lance PageFind entre la compilation avec Hugo et le déploiement sur le serveur.&lt;/p> &lt;h2 id="conclusion">Conclusion&lt;/h2> &lt;p>La promesse de PageFind est tenue. Il est très simple d’intégrer une bonne recherche à un site statique en quelques minutes. Le lien se trouve dans le menu principal.&lt;/p> &lt;p>Désormais, j’attends 2 informations pour faire un vrai bilan.&lt;/p> &lt;p>&lt;strong>Est-ce que la recherche est bonne?&lt;/strong> La pertinence des résultats, la rapidité de recherche et la qualité de l’affichage sont essentielles. Vos retours tant positifs que négatifs sont précieux.&lt;/p> &lt;p>&lt;strong>Est-ce qu’elle est utilisée?&lt;/strong> Les statistiques Plausible vont me donner quelques indices sur l’utilisation réelle de la page de recherche. Si elle n’est pas utilisée, je me poserai aussi la question d’inclure la recherche sur toutes les pages du site.&lt;/p> &lt;p>J’en profite pour créer un &lt;a href="https://nicolasfriedli.ch/blog/linkmail/">mail prérempli&lt;/a> pour les résultats: &lt;a href="mailto:hello+2025@nicolasfriedli.ch?subject=Test%20de%20PageFind&amp;amp;body=Hello%2C%0D%0A%0D%0AJe%20viens%20de%20tester%20un%20peu%20PageFind%20sur%20ton%20site%20et%20voici%20ce%20que%20je%20peux%20en%20dire.%0D%0A%0D%0AC%E2%80%99est%20globalement%3A%20excellent%20%2F%20bon%20%2F%20moyen%20%2F%20mauvais%20%2F%20non%20fonctionnel%0D%0A%0D%0AExemples%20de%20recherche%20qui%20fournissent%20de%20bons%20r%C3%A9sultats%3A%0D%0A%0D%0AExemples%20de%20recherche%20qui%20fournissent%20de%20mauvais%20r%C3%A9sultats%3A">Envoyer mes tests de recherche dans TestFind&lt;/a>. Merci!&lt;/p></description></item><item><title>Nom de domaine personnel: un atout pour vos QR codes, Mastodon &amp; Bluesky</title><link>https://nicolasfriedli.ch/blog/nom-domaine-personnel/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/nom-domaine-personnel/</guid><description>&lt;p>Notre présence en ligne est devenue une extension de notre identité personnelle et professionnelle. Réserver son propre nom de domaine est une solution simple et efficace pour reprendre le contrôle. Il permet d’assurer la pérennité de son identité numérique, d’être facilement identifiable et d’éviter les changements imposés par des plateformes.&lt;/p> &lt;p>Ce billet explore trois usages concrets d’un nom de domaine: QR codes, Mastodon et Bluesky.&lt;/p> &lt;p>Il ne revient pas sur des sujets rebattus comme la pérennité des adresses mail ou d’un &lt;a href="https://nicolasfriedli.ch/blog/blog-2025/">blog personnel en 2025&lt;/a>.&lt;/p> &lt;h2 id="utilisation-de-qrcodes">Utilisation de QR codes&lt;/h2> &lt;p>J’ai essayé de donner des &lt;a href="https://nicolasfriedli.ch/blog/conseils-qr-code/">conseils pour l’utilisation des QR code&lt;/a> dans un long billet. La question de son propre nom de domaine est centrale. Je n’y reviens pas ici.&lt;/p> &lt;p>J’ajoute simplement que le passage par un nom de domaine pérennise les choses. Avec un nom de domaine, vous pouvez investir dans des supports durables:&lt;/p> &lt;ul> &lt;li>gravure sur un pendentif (ou ma médaille du chien)&lt;/li> &lt;li>impression en grande taille pour la porte de la voiture&lt;/li> &lt;li>pyrogravure d’une plaquette professionnelle&lt;/li> &lt;li>tatouage sur l’avant-bras&lt;/li> &lt;/ul> &lt;p>&lt;strong>Évitez d’engager des frais pour tout code qui ne renvoie pas à votre nom de domaine personnel.&lt;/strong> En particulier pour le tatouage&amp;hellip;&lt;/p> &lt;h2 id="utilite-du-nom-de-domaine-personnel-chez-mastodon">Utilité du nom de domaine personnel chez Mastodon&lt;/h2> &lt;h3 id="validation-des-liens">Validation des liens&lt;/h3> &lt;p>Sur un profil Mastodon, qui remplace très bien Twitter (X), il est possible d’obtenir des validations.&lt;/p> &lt;p>Dans mon cas le compte &lt;a href="https://mastodon.social/@nicolasfriedli">@nicolasfriedli&lt;/a> propose 2 liens validés: GitHub et mon site personnel. Ces liens sont en vert.&lt;/p> &lt;p>Mieux encore, lors d’une recherche, le lien validé s’affiche en vert dans les résultats. Je peux donc vérifier instantanément que la personne que je vais suivre est bien celle qui possède le nom de domaine que je consulte régulièrement. &lt;strong>C’est un critère de validation fort, simple et efficace.&lt;/strong>&lt;/p> &lt;h3 id="attribution-dauteur-ou-dautrice">Attribution d’auteur ou d’autrice&lt;/h3> &lt;p>On peut aussi valider son nom sous ses publications (author attribution) pour une liste précise de sites. Lorsque je publie sur mon site personnel, il y a mon nom Mastodon sous la publication. C’est très plus utile lorsque d’autres personnes partagent mes publications (&lt;a href="https://mastodon.social/@nicolasfriedli/113973218633632714">exemple en action&lt;/a>).&lt;/p> &lt;h3 id="adresse-perenne-avec-webfinger">Adresse pérenne avec WebFinger&lt;/h3> &lt;p>Finalement chez Mastodon, en utilisant le &lt;a href="https://docs.joinmastodon.org/spec/webfinger/">protocole Webfinger&lt;/a>, il est possible de créer une adresse de raccourci indépendant de l’instance utilisée, donc pérenne.&lt;/p> &lt;p>Mon profil lié à un nom de domaine que je possède est @n@frdl.ch. C’est un alias, que je peux rediriger en tout temps vers une autre instance Mastodon.&lt;/p> &lt;h2 id="nom-de-compte-chez-bluesky">Nom de compte chez Bluesky&lt;/h2> &lt;p>Bluesky (ou bsky) est un autre remplaçant possible de Twitter (X). Il a choisi un système intéressant pour les noms de comptes.&lt;/p> &lt;p>En principe, les comptes se terminent en &lt;code>.bsky.social&lt;/code>. Le nom complet d’un compte pour moi pourrait être &lt;code>nicolasfriedli.bsky.social&lt;/code>.&lt;/p> &lt;p>Avec un nom de domaine, on peut se passer totalement du &lt;code>.bsky.social&lt;/code>. Je dispose désormais du compte @nicolasfriedli.ch.&lt;/p> &lt;p>Regardez l’adresse: &lt;a href="https://bsky.app/profile/nicolasfriedli.ch">bsky.app/profile/nicolasfriedli.ch&lt;/a>. Détail frappant: elle contient un &lt;code>.&lt;/code> (point) alors que ce n’est pas possible lors de l’inscription.&lt;/p> &lt;p>J’ai validé mon nom de compte par mon nom domaine.&lt;/p> &lt;p>&lt;strong>Le truc génial, c’est que si tu possèdes le nom de domaine &lt;code>monsieurmichu.ch&lt;/code>, personne ne pourra réserver le profil Bluesky à ta place.&lt;/strong> Autrement dit, même si tu ne crées pas de compte, il est «réservé». Bravo à Bluesky pour cette idée simple et brillante.&lt;/p> &lt;hr> &lt;p>Je conseille de réserver vos comptes chez &lt;a href="https://www.infomaniak.com/fr">Infomaniak&lt;/a>. Chaque compte donne droit à une adresse mail avec des alias et la &lt;a href="https://nicolasfriedli.ch/blog/mail-plus/">possibilité d’utiliser le signe +&lt;/a>. Et aussi à un petit hébergement qui peut être suffisant pour quelques pages de présentation.&lt;/p> &lt;p>Et dans le doute, c’est simplement &lt;code>prenomnom.ch&lt;/code>.&lt;/p> &lt;hr> &lt;p>Je ne compte pas utiliser les comptes Mastodon et Bluesky créés pour faire quelques tests.&lt;/p></description></item><item><title>Utiliser des liens mail préremplis sur son site web</title><link>https://nicolasfriedli.ch/blog/linkmail/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/linkmail/</guid><description>&lt;p>Les liens &lt;code>mailto&lt;/code> sont un moyen simple et efficace d’encourager les utilisateurs au contact direct par mail. Ils peuvent être enrichis pour inclure un sujet, un message prérempli et d’autres informations.&lt;/p> &lt;p>Nous verrons comment tirer parti des liens mailto préremplis, en comparant leurs avantages et leurs limites face aux formulaires de contact. Je vous propose une solution efficace pour les automatiser dans Hugo grâce à un shortcode.&lt;/p> &lt;h2 id="structure-des-liens">Structure des liens&lt;/h2> &lt;p>La syntaxe des liens HTML la plus simple pour un mail, c’est:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;a href=&amp;#34;mailto:hello+linkmail@nicolasfriedli.ch&amp;#34;&amp;gt;hello+linkmail@nicolasfriedli.ch&amp;lt;/a&amp;gt; &lt;/code>&lt;/pre>&lt;p>En Markdown, il est possible de le saisir avec:&lt;/p> &lt;pre tabindex="0">&lt;code>[hello+linkmail@nicolasfriedli.ch](mailto:hello+linkmail@nicolasfriedli.ch) &lt;/code>&lt;/pre>&lt;p>Et, parfois, les outils de rédaction ou les périphériques de lecture transforment du simple texte en lien cliquable:&lt;/p> &lt;pre tabindex="0">&lt;code>hello+linkmail@nicolasfriedli.ch &lt;/code>&lt;/pre>&lt;p>Mais ce qui est intéressant, c’est d’ajouter directement du contenu au lien lui-même. C’est facile avec &lt;a href="https://mailtolink.me/">mailtolink.me&lt;/a>.&lt;/p> &lt;p>Le résultat, c’est &lt;a href="mailto:hello+mailto@nicolasfriedli.ch?subject=Ton%20article%20sur%20LinkMail&amp;amp;body=Je%20viens%20de%20lire%20ton%20billet%20sur%20les%20liens%20mail%20et%20j%E2%80%99ai%20une%20question%20%2F%20une%20remarque%20%2F%20un%20compl%C3%A9ment%20%C3%A0%20apporter.">une réponse à ce billet&lt;/a>. Le sujet du message est déjà renseigné, tout comme mon adresse (logique) et quelques lignes de texte. Et si cela ne fonctionne pas bien, la suite vous explique pourquoi.&lt;/p> &lt;p>Dans votre CMS (probablement WordPress), il suffit de copier le code généré par mailtolink.me comme toute n’importe quelle cible de lien.&lt;/p> &lt;h2 id="avantages-des-liens-mail-preremplis">Avantages des liens mail préremplis&lt;/h2> &lt;p>Les liens &lt;code>mailto&lt;/code> enrichis offrent certains avantages:&lt;/p> &lt;ul> &lt;li>l’adresse d’envoi est fatalement valide&lt;/li> &lt;li>la personne qui envoie le mail possède toujours une copie dans sa boîte&lt;/li> &lt;li>les messages peuvent être complétés librement&lt;/li> &lt;li>il est possible d’ajouter des pièces jointes&lt;/li> &lt;/ul> &lt;p>La difficulté c’est qu’il faut utiliser l’&lt;a href="https://fr.wikipedia.org/wiki/Encodage-pourcent">encodage-pourcent&lt;/a>. C’est facile avec l’outil mailtolink.me, mais plus difficile (ou franchement pénible) à la main.&lt;/p> &lt;h2 id="pourquoi-les-formulaires-de-contact-posent-probleme">Pourquoi les formulaires de contact posent problème&lt;/h2> &lt;p>Je n’aime pas beaucoup les formulaires de contact. Ils créent potentiellement beaucoup de problèmes:&lt;/p> &lt;ul> &lt;li>si l’adresse d’envoi est fausse, il n’y a aucune vérification&lt;/li> &lt;li>ils permettent rarement l’envoie de pièces jointes (ou limitent leur nombre)&lt;/li> &lt;li>il demandent un nombre important de &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/?theme=formulaires">contrôles de qualité&lt;/a>&lt;/li> &lt;li>ils ne sont pas plus effiaces contre le spam que de filtres de messagerie&lt;/li> &lt;/ul> &lt;p>Le seul avantage est qu’ils permettent de bien structurer une demande, avec des champs distincts (qui peuvent recevoir des contraintes et validations). Je conseille &lt;a href="https://www.paris-web.fr/2022/conference/decouvrez-le-bon-html-et-economisez-du-js-et-du-css">Découvrez «le bon HTML» et économisez du JS et du CSS&lt;/a> pour en savoir plus.&lt;/p> &lt;h2 id="les-inconvenients-et-limites-des-liens-mailto">Les inconvénients et limites des liens &lt;code>mailto&lt;/code>&lt;/h2> &lt;p>J’ai vanté les mérites des liens `mailto, mais ils ne sont pas exempts de défauts. Mais je ne vous cache pas qu’ils posent aussi certains problèmes.&lt;/p> &lt;p>Amy Hupe et Adam Silver les ont documentés dans &lt;a href="https://adamsilver.io/blog/the-trouble-with-mailto-email-links-and-what-to-do-instead/">The trouble with mailto email links and what to do instead&lt;/a>.&lt;/p> &lt;p>En résumé, ces liens posent problème quand:&lt;/p> &lt;ul> &lt;li>une messagerie n’est pas configurée sur le périphérique&lt;/li> &lt;li>je souhaite avoir le choix de la messagerie au clic&lt;/li> &lt;li>je souhaite copier une adresse&lt;/li> &lt;/ul> &lt;p>Je m’inspire de leur approche dans le passage &lt;em>offering choice&lt;/em> et propose:&lt;/p> &lt;ul> &lt;li>un lien textuel avec le contenu du mail prérempli&lt;/li> &lt;li>l’affichage de l’adresse en pur texte à côté&lt;/li> &lt;/ul> &lt;p>Ainsi, toutes les options restent possibles en fonction des préférence de l’internaute.&lt;/p> &lt;h2 id="shortcode-dans-hugo">Shortcode dans Hugo&lt;/h2> &lt;p>C’est très facile à faire avec mailtolink.me, mais je souhaite automatiser la procédure dans Hugo.&lt;/p> &lt;p>Ainsi, je souhaite créer un lien prérempli quand je rédige en Markdown:&lt;/p> &lt;pre tabindex="0">&lt;code>{{&amp;lt; linkmail to=&amp;#34;hello+linkmail@nicolasfriedli.ch&amp;#34; subject=&amp;#34;Test de Link Mail&amp;#34; text=&amp;#34;Envoyer une proposition&amp;#34; &amp;gt;}} Exemple de texte qui préremplit le message. Avec un saut de ligne. {{&amp;lt; /linkmail &amp;gt;}} &lt;/code>&lt;/pre>&lt;p>Pour effectuer la transformation, je crée &lt;code>layouts/shortcodes/linkmail.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;a href=&amp;#34;mailto:{{- .Get &amp;#34;to&amp;#34; -}}?subject={{- .Get &amp;#34;subject&amp;#34; -}}&amp;amp;body={{- strings.TrimSpace .Inner -}}&amp;#34;&amp;gt; {{- .Get &amp;#34;text&amp;#34; -}} &amp;lt;/a&amp;gt; ({{ .Get &amp;#34;to&amp;#34; }}) &lt;/code>&lt;/pre>&lt;p>Et j’obtiens le résultat escompté:&lt;/p> &lt;a href="mailto:hello&amp;#43;linkmail@nicolasfriedli.ch?subject=Test%20de%20Link%20Mail&amp;body=Exemple%20de%20texte%20qui%20pr%c3%a9rempli%20le%20message.%0aAvec%20un%20saut%20de%20ligne.">Envoyer une proposition&lt;/a> (hello&amp;#43;linkmail@nicolasfriedli.ch) &lt;p>Attention, c’est une solution &lt;a href="https://fr.wikipedia.org/wiki/Quick-and-dirty">Quick-and-dirty&lt;/a>. Je ne fais aucune vérification dans le shortcode. Mais la transformation par Hugo se charge de l’encodage-pourcent et &lt;code>strings.TrimSpace&lt;/code> supprime des espaces inutiles. C’est l’essentiel.&lt;/p> &lt;p>Cette solution rapide fonctionne bien dans Hugo, mais elle pourrait être améliorée avec des vérifications supplémentaires. Il faudrait l’adapter aux cas spécifiques, affiner la mise en forme du lien et optimiser la syntaxe d’appel. Toutefois, c’est une approche intéressante pour systématiser l’usage des liens &lt;code>mailto&lt;/code> enrichis sans outil tiers.&lt;/p></description></item><item><title>Améliorer la typographie des nombres en CSS</title><link>https://nicolasfriedli.ch/blog/typographie-nombres-css/</link><pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/typographie-nombres-css/</guid><description>&lt;p>Avec quelques lignes de code, il est possible d’améliorer la présentation de sa page de manière discrète mais efficace. La propriété &lt;code>font-variant-numeric&lt;/code> permet une gestion typographique avancée des nombres.&lt;/p> &lt;h2 id="variantes-de-font-variant-numeric">Variantes de &lt;code>font-variant-numeric&lt;/code>&lt;/h2> &lt;p>Parmi toutes les propriétés (voir &lt;a href="https://developer.mozilla.org/fr/docs/Web/CSS/font-variant-numeric">font-variant-numeric&lt;/a> chez MDN), 5 sont bigrement utiles:&lt;/p> &lt;ul> &lt;li>2 agissent sur leur graphie: &lt;code>lining-nums&lt;/code>et &lt;code>oldstyle-nums&lt;/code>&lt;/li> &lt;li>2 agissent sur la largeur des chiffres: &lt;code>proportional-nums&lt;/code> et &lt;code>tabular-nums&lt;/code>&lt;/li> &lt;li>1 permet de modifier le zéro: &lt;code>slashed-zero&lt;/code>&lt;/li> &lt;/ul> &lt;p>&lt;code>lining-nums&lt;/code> propose des chiffres alignés sur le ligne de base du texte et de hauteur uniforme. Presque toutes les polices les utilisent par défaut.&lt;/p> &lt;p>Alors que &lt;code>oldsyles-nums&lt;/code> propose des chiffres «à l’ancienne», aussi appelés &lt;a href="https://fr.wikipedia.org/wiki/Chiffres_elz%C3%A9viriens">elzéviriens&lt;/a>. La police Georgia a la particularité de ne proposer que de tels chiffres.&lt;/p> &lt;p>&lt;code>proportional-nums&lt;/code> ne force pas la largeur des chiffres (donc 1 est généralement plus étroit que 0). C’est ce qui est courant dans le texte.&lt;/p> &lt;p>Alors que &lt;code>tabular-nums&lt;/code> impose une même largeur pour les 10 chiffres (à la manière d’une police à chasse fixe). C’est un vrai plus dans les tableaux (et dans le code).&lt;/p> &lt;p>&lt;code>slashed-zero&lt;/code> permet d’afficher un 0 barré ou pointé qui se distingue au mieux de la lettre O. C’est utile pour des raisons d’accessiblité, mais je ne l’utilise pas ici.&lt;/p> &lt;h2 id="mise-en-application-en-css">Mise en application en CSS&lt;/h2> &lt;p>On applique un comportement par défaut puis on précise les usages particuliers.&lt;/p> &lt;p>Pour toute la page, par défaut:&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-variant-numeric: oldstyle-nums proportional-nums; } &lt;/code>&lt;/pre>&lt;p>Pour les liens (et éventuellement pour la titraille):&lt;/p> &lt;pre tabindex="0">&lt;code>a /*, h1, h2, h3, h4 /* { font-variant-numeric: lining-nums proportional-nums; } &lt;/code>&lt;/pre>&lt;p>Pour les tableaux et le code:&lt;/p> &lt;pre tabindex="0">&lt;code>code, pre, table { font-variant-numeric: lining-nums tabular-nums; } &lt;/code>&lt;/pre>&lt;p>Je ne vois pas de raison d’utiliser la combinaison &lt;code>oldstyle-nums tabular-nums&lt;/code>.&lt;/p> &lt;p>&lt;strong>Si la police utilisée ne dispose pas de ces variations, elle s’affichera quand même parfaitement.&lt;/strong> C’est donc sans risque.&lt;/p> &lt;h2 id="le-probleme-de-google-fonts">Le problème de Google Fonts&lt;/h2> &lt;p>Pour visualiser tous les caractères et les variations d’une police, rien ne vaut &lt;a href="https://wakamaifondue.com/">Wakamai Fondue&lt;/a>. Je préfère sa version ancienne à la version beta disponible en bas de page.&lt;/p> &lt;p>Je télécharge &lt;a href="https://fonts.google.com/specimen/Roboto">Roboto&lt;/a> chez Google Fonts. Puis je passe le fichier &lt;code>Roboto-Regular.ttf&lt;/code> dans la moulinette. 922 caractères et 1321 glyphes pour 143Ko.&lt;/p> &lt;p>Mais dans la pratique, on essaie d’utiliser des versions limitées (ici à l’alphabet latin) pour alléger le fichier et dans un format plus optimal (woff2). J’effecture la transformation sur mon ordinateur:&lt;/p> &lt;pre tabindex="0">&lt;code>glyphhanger --formats=woff2 --subset=Roboto-Regular.ttf --LATIN &lt;/code>&lt;/pre>&lt;p>Et j’envoie &lt;code>Roboto-Regular-subset.woff2&lt;/code> chez Wakamai Fondue: 245 caractères, 409 glyphes pour 24Ko.&lt;/p> &lt;p>Dans la pratique, les développeurs et développeuses utilisent très souvent le génial &lt;a href="https://gwfh.mranftl.com/fonts">google-webfonts-helper&lt;/a> pour obtenir des polices déjà optimisées via Google Fonts.&lt;/p> &lt;p>Pour l’exemple présent, &lt;code>roboto-v47-latin-regular.woff2&lt;/code> que j’envoie aussi en cuisine. Dans la caquelon, je trouve 229 caractères, 363 glyphes pour 20Ko.&lt;/p> &lt;p>&lt;strong>Google Fonts supprime des options de la police de départ, dont les fameux chiffres elzéviriens.&lt;/strong> On peut considérer que c’est une très bonne optimisation ou que ça revient à dénaturer la typographie.&lt;/p> &lt;p>Le problème, c’est que, selon le &lt;a href="https://almanac.httparchive.org/en/2024/">Web Almanac 2024&lt;/a>, 85% des sites font appel à des polices web (webfonts). Et je parie que, quand elles ne font pas appel à Google Fonts, elles sont obtenues via google-webfonts-helper dans une grande majorité des cas.&lt;/p> &lt;p>Autant dire que vous risquez de ne jamais voir Roboto, Fira Sans et plein d’autres belles polices à leur juste valeur. Pour que les internautes les voient, il faut faire ses optimisations soi-même ou miser sur les polices locales.&lt;/p> &lt;hr> &lt;p>Si vous utilisez Android, vous devriez voir des chiffres elzéviriens. Ils s’affichent en Roboto locale (appelée par &lt;code>system-ui&lt;/code>) parce que je ne vous impose pas une police web.&lt;/p> &lt;p>Si vous utilisez un périphérique Apple, vous ne verrez logiquement pas de «old style nums» parce que San Francisco (appelée par &lt;code>ui-sans-serif&lt;/code>) n’en propose pas. Sauf si vous avez installé Roboto sur votre ordinateur.&lt;/p> &lt;p>Si vous utilisez Windows, vous verrez probablement cette page en police Segoe UI qui propose aussi la variation elzévirienne.&lt;/p> &lt;p>&lt;strong>Note.&lt;/strong> Ces indications sont valables au moment de la publication de cette page. Je changerai peut-être ma feuille de style sans les remettre à jour.&lt;/p></description></item><item><title>Travailler avec un budget de performance web</title><link>https://nicolasfriedli.ch/blog/budget-performance/</link><pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/budget-performance/</guid><description>&lt;p>Tester la performance d’un site avec Lighthouse, Web Page Test ou PageSpeed Insights est simple et rapide. Mais cela ne garantit pas une optimisation durable. Un budget de performance permet d’anticiper les contraintes, de cadrer les attentes et d’assurer un suivi continu.&lt;/p> &lt;h2 id="quest-ce-quun-budget-de-performance">Qu’est-ce qu’un budget de performance?&lt;/h2> &lt;p>La première visée d’un budget de performance est le contrôle suivi (monitoring) facilité de ses pages web. Un budget de performance fixe les contraintes d’affichage d’une page web en équilibrant:&lt;/p> &lt;ul> &lt;li>les ressources consommées (temps de chargement, poids et nombre de fichiers)&lt;/li> &lt;li>les attentes des internautes (rapidité perçue, fluidité de navigation)&lt;/li> &lt;li>les limites techniques (bande passante, capacité des appareils)&lt;/li> &lt;/ul> &lt;p>Il s’agit de bien utiliser ce qui est accordé (voire de «dépenser» moins) pour garantir une expérience optimale.&lt;/p> &lt;h2 id="exemple-pratique">Exemple pratique&lt;/h2> &lt;p>Concrètement, voici comment appliquer un budget de performance avec &lt;a href="https://developer.chrome.com/docs/lighthouse/overview/">Lighthouse&lt;/a>:&lt;/p> &lt;pre tabindex="0">&lt;code>npx lighthouse https://nicolasfriedli.ch/blog/budget-performance/ \ --budget-path=budget.json \ --view \ --only-categories=performance &lt;/code>&lt;/pre>&lt;p>Avec un budget défini dans un fichier JSON (mise en forme comptacte):&lt;/p> &lt;pre tabindex="0">&lt;code>[ { &amp;#34;timings&amp;#34;: [ {&amp;#34;metric&amp;#34;: &amp;#34;cumulative-layout-shift&amp;#34;, &amp;#34;budget&amp;#34;: 0}, {&amp;#34;metric&amp;#34;: &amp;#34;first-contentful-paint&amp;#34;, &amp;#34;budget&amp;#34;: 1800}, {&amp;#34;metric&amp;#34;: &amp;#34;interactive&amp;#34;, &amp;#34;budget&amp;#34;: 1000}, {&amp;#34;metric&amp;#34;: &amp;#34;largest-contentful-paint&amp;#34;, &amp;#34;budget&amp;#34;: 2500}, {&amp;#34;metric&amp;#34;: &amp;#34;speed-index&amp;#34;, &amp;#34;budget&amp;#34;: 1200}, {&amp;#34;metric&amp;#34;: &amp;#34;total-blocking-time&amp;#34;, &amp;#34;budget&amp;#34;: 0} ], &amp;#34;resourceSizes&amp;#34;: [ {&amp;#34;resourceType&amp;#34;: &amp;#34;total&amp;#34;, &amp;#34;budget&amp;#34;: 100}, {&amp;#34;resourceType&amp;#34;: &amp;#34;document&amp;#34;, &amp;#34;budget&amp;#34;: 50}, {&amp;#34;resourceType&amp;#34;: &amp;#34;font&amp;#34;, &amp;#34;budget&amp;#34;: 0}, {&amp;#34;resourceType&amp;#34;: &amp;#34;image&amp;#34;, &amp;#34;budget&amp;#34;: 200}, {&amp;#34;resourceType&amp;#34;: &amp;#34;media&amp;#34;, &amp;#34;budget&amp;#34;: 200}, {&amp;#34;resourceType&amp;#34;: &amp;#34;other&amp;#34;, &amp;#34;budget&amp;#34;: 200}, {&amp;#34;resourceType&amp;#34;: &amp;#34;script&amp;#34;, &amp;#34;budget&amp;#34;: 5}, {&amp;#34;resourceType&amp;#34;: &amp;#34;stylesheet&amp;#34;, &amp;#34;budget&amp;#34;: 5}, {&amp;#34;resourceType&amp;#34;: &amp;#34;third-party&amp;#34;, &amp;#34;budget&amp;#34;: 5} ], &amp;#34;resourceCounts&amp;#34;: [ {&amp;#34;resourceType&amp;#34;: &amp;#34;total&amp;#34;, &amp;#34;budget&amp;#34;: 10}, {&amp;#34;resourceType&amp;#34;: &amp;#34;font&amp;#34;, &amp;#34;budget&amp;#34;: 0}, {&amp;#34;resourceType&amp;#34;: &amp;#34;image&amp;#34;, &amp;#34;budget&amp;#34;: 10}, {&amp;#34;resourceType&amp;#34;: &amp;#34;media&amp;#34;, &amp;#34;budget&amp;#34;: 0}, {&amp;#34;resourceType&amp;#34;: &amp;#34;other&amp;#34;, &amp;#34;budget&amp;#34;: 2}, {&amp;#34;resourceType&amp;#34;: &amp;#34;script&amp;#34;, &amp;#34;budget&amp;#34;: 1}, {&amp;#34;resourceType&amp;#34;: &amp;#34;stylesheet&amp;#34;, &amp;#34;budget&amp;#34;: 0} ] } ] &lt;/code>&lt;/pre>&lt;p>Dans cet exemple, on souhaite par exemple:&lt;/p> &lt;ul> &lt;li>l’affichage complet de la page en 2.5 secondes&lt;/li> &lt;li>l’absence de mouvements parasites (Cumulative Layout Shift à 0)&lt;/li> &lt;li>100ko maximum pour l’ensemble des transferts&lt;/li> &lt;li>l’absence complètes de polices web (webfonts)&lt;/li> &lt;/ul> &lt;p>&lt;strong>C’est un budget très strict, adapté à ce site, mais trop restrictif dans bien des cas.&lt;/strong>&lt;/p> &lt;p>Comme la sources JSON le montre clairement, il y a 3 catégories de mesures:&lt;/p> &lt;ul> &lt;li>la vitesse pure (timings)&lt;/li> &lt;li>la taille des ressources (resourceSizes)&lt;/li> &lt;li>le nombre des ressources (resourceCounts)&lt;/li> &lt;/ul> &lt;p>Dans chaque catégorie, il est possible de spécifier une ou plusieurs valeurs.&lt;/p> &lt;h2 id="budget-pour-commencer">Budget pour commencer&lt;/h2> &lt;p>Il est possible de créer un budget JSON simplifié pour attaquer le sujet et faire ses premiers tests:&lt;/p> &lt;pre tabindex="0">&lt;code>[ { &amp;#34;timings&amp;#34;: [ { &amp;#34;metric&amp;#34;: &amp;#34;largest-contentful-paint&amp;#34;, &amp;#34;budget&amp;#34;: 3000 } ], &amp;#34;resourceSizes&amp;#34;: [ { &amp;#34;resourceType&amp;#34;: &amp;#34;total&amp;#34;, &amp;#34;budget&amp;#34;: 1000 } ], &amp;#34;resourceCounts&amp;#34;: [ { &amp;#34;resourceType&amp;#34;: &amp;#34;total&amp;#34;, &amp;#34;budget&amp;#34;: 100 } ] } ] &lt;/code>&lt;/pre>&lt;p>Dans ce cas, je vise:&lt;/p> &lt;ul> &lt;li>une page qui se charge en moins de 3 secondes&lt;/li> &lt;li>qui pèse au maximum 1Mo&lt;/li> &lt;li>qui n’appelle pas plus de 100 fichiers au total&lt;/li> &lt;/ul> &lt;p>Commencez par là et essayez de le respecter. Si c’est le cas, votre site sera déjà très bon.&lt;/p> &lt;h2 id="la-discussion-du-budget">La discussion du budget&lt;/h2> &lt;p>Je vois d’autres utilités que le monitoring à l’établissement d’un budget de performance.&lt;/p> &lt;p>En premier lieu, les débats dans l’équipe de développement lors de son établissement.&lt;/p> &lt;p>La conférence &lt;a href="https://www.youtube.com/watch?v=BmiVevOUvho">The Global Baseline, 2022&lt;/a> d’Alex Russell, par exemple, donne les résultats moyens que l’on est en droit d’attendre aujourd’hui. Le conférencier établit ses valeurs en fonction de réalités matérielles (capacité de calcul des téléphones) ou de réseau (bande passante). En version textuelle, une actualisation est disponible dans &lt;a href="https://infrequently.org/2024/01/performance-inequality-gap-2024/">The Performance Inequality Gap, 2024&lt;/a>.&lt;/p> &lt;p>La discussion du budget est une occasion formidable d’instaurer un débat sur ce qui est la «norme» du moment. Elle permet d’apporter la question de la performance dans les équipes web, de manière concrète et pragmatique.&lt;/p> &lt;h2 id="les-problematiques-internes">Les problématiques internes&lt;/h2> &lt;p>En deuxième lieu, un budget de performance est un outil de dialogue entre les équipes.&lt;/p> &lt;p>Dans la réalité des entreprises et organisations:&lt;/p> &lt;ul> &lt;li>les graphistes veulent des typographies spécifiques&lt;/li> &lt;li>le marketing a (soi-disant) besoin de trackers analytiques&lt;/li> &lt;li>la direction souhaite intégrer des widgets sociaux&lt;/li> &lt;li>les juristes veillent à la protection des données&lt;/li> &lt;/ul> &lt;p>L’objectif est de trouver un compromis réaliste et accessible. Un budget trop ambitieux sera ignoré, tandis qu’un budget trop permissif ne servira à rien.&lt;/p> &lt;p>Dans la durée, un fichier établi par consensus évite de devoir se justifier chaque nouvelle contrainte ou ordre venu d’un autre service. Il légitime les refus des équipes web ou permet de proposer des arbitrages concrets sur des bases solides.&lt;/p> &lt;h2 id="rapport-aux-prestataires-externes">Rapport aux prestataires externes&lt;/h2> &lt;p>Troisièmement, travailler avec un budget de performance facilite la relation avec une agence web.&lt;/p> &lt;p>Un simple fichier &lt;code>budget.json&lt;/code> permet:&lt;/p> &lt;ul> &lt;li>de fixer des attentes claires dès le début du projet&lt;/li> &lt;li>d’évaluer si l’agence maîtrise vraiment les enjeux techniques&lt;/li> &lt;li>d’arbitrer les demandes pour d’éviter les compromis nuisibles&lt;/li> &lt;li>de justifier d’éventuelles corrections ou d’exiger une réduction de la facture&lt;/li> &lt;/ul> &lt;p>Ces dernières années, j’ai vu de nombreux sites institutionnels qui sont entrés en production alors qu’ils n’étaient pas optimisés. Avec un budget de performance, il aurait été possible de refuser la livraison, d’exiger des améliorations tangibles ou de négocier un rabais.&lt;/p> &lt;h2 id="conclusion">Conclusion&lt;/h2> &lt;p>Adopter un budget de performance, c’est mettre toutes les chances de son côté pour obtenir un site rapide, fluide et optimisé, tout en facilitant les échanges entre équipes et prestataires. En définissant un cadre clair, on évite les dérives, on pacifie les choix techniques et on assure une expérience optimale aux internautes sur le long terme.&lt;/p> &lt;p>Celles et ceux qui créent des sites qui militent pour l’écologie devraient aussi s’intéresser aux budgets de performance. La question du temps de chargement ne sera pas forcément leur priorité. Mais le nombre de ressources et leur taille sont en lien direct avec la consommation du site. Et la performance suivra s’il est très léger.&lt;/p></description></item><item><title>Activer les polices Google Fonts à la demande</title><link>https://nicolasfriedli.ch/blog/google-fonts-demande/</link><pubDate>Wed, 05 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/google-fonts-demande/</guid><description>&lt;p>Google Fonts est un service qui fonctionne très bien. Mais je refuse d’envoyer des polices distantes sur votre périphérique sans votre autorisation. De plus, c’est souvent inutile si vous avez des polices correctes installées.&lt;/p> &lt;p>Ce billet fait suite aux difficultés de proposer une &lt;a href="https://nicolasfriedli.ch/blog/inter-variable-opsz/">police locale variable&lt;/a> correctement.&lt;/p> &lt;p>&lt;strong>Note.&lt;/strong> Cette proposition fonctionne sur cette page au moment de sa mise en ligne. Le code reste valable, mais il ne sera plus forcément actif sur ce site.&lt;/p> &lt;h2 id="la-solution-facile-et-rapide-google-fonts">La solution (facile et rapide) Google Fonts&lt;/h2> &lt;p>Je propose une solution toute simple pour celles et ceux souhaitent une police précise (qui ont des problèmes d’affichage).&lt;/p> &lt;p>J’active les Google Fonts si la variable &lt;code>googlefonts&lt;/code> a la valeur &lt;code>yes&lt;/code> sans le stockage web local (localStorage). &lt;strong>Cette solution n’est active que sur cette page&lt;/strong>, mais elle s’active sur tout le site en utilisant ce code sur chaque page.&lt;/p> &lt;pre tabindex="0">&lt;code>if (localStorage.getItem(&amp;#34;googlefonts&amp;#34;) === &amp;#34;yes&amp;#34;) { let link = document.createElement(&amp;#34;link&amp;#34;); link.rel = &amp;#34;stylesheet&amp;#34;; link.href = &amp;#34;https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&amp;amp;family=Roboto:ital,wght@0,100..900;1,100..900&amp;amp;display=swap&amp;#34;; document.head.appendChild(link); } &lt;/code>&lt;/pre>&lt;p>On pourrait d’arrêter là et dire aux internautes qui souhaitent des Google Fonts d’entrer la valeur &lt;code>yes&lt;/code> au bon endroit. Ce serait un peu rude (plus que leur conseiller d’installer &lt;a href="https://fonts.google.com/specimen/JetBrains+Mono">JetBrains Mono&lt;/a> et &lt;a href="https://fonts.google.com/specimen/Roboto">Roboto&lt;/a>).&lt;/p> &lt;p>Donc, on ajoute un bouton qui stocke la valeur et ajoute la feuille de style sans délai:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;button id=&amp;#34;googlefonts&amp;#34;&amp;gt;Activer les Google Fonts&amp;lt;/button&amp;gt; &amp;lt;script&amp;gt; document.getElementById(&amp;#34;googlefonts&amp;#34;).addEventListener(&amp;#34;click&amp;#34;, function() { localStorage.setItem(&amp;#34;googlefonts&amp;#34;, &amp;#34;yes&amp;#34;); let link = document.createElement(&amp;#34;link&amp;#34;); link.rel = &amp;#34;stylesheet&amp;#34;; link.href = &amp;#34;https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&amp;amp;family=Roboto:ital,wght@0,100..900;1,100..900&amp;amp;display=swap&amp;#34;; document.head.appendChild(link); }); &amp;lt;/script&amp;gt; &lt;/code>&lt;/pre>&lt;p>Il y a du code dupliqué (ce n’est pas très propre), mais comme je ne l’utilise que sur cette page, je m’en fiche un peu. On pourrait aussi ajouter seulement la valeur dans le localStorage et attendre le rechargement de la page pour agir.&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;button id=&amp;#34;googlefonts&amp;#34;&amp;gt;Activer les Google Fonts&amp;lt;/button&amp;gt; &amp;lt;script&amp;gt; document.getElementById(&amp;#34;googlefonts&amp;#34;).addEventListener(&amp;#34;click&amp;#34;, function() { localStorage.setItem(&amp;#34;googlefonts&amp;#34;, &amp;#34;yes&amp;#34;); }); &amp;lt;/script&amp;gt; &lt;/code>&lt;/pre>&lt;p>Le résultat, c’est ceci:&lt;/p> &lt;button id="googlefonts" class="plausible-event-name=Google+Fonts">Activer les Google Fonts&lt;/button> &lt;script> function applyGoogleFonts() { if (!document.getElementById("google-fonts-link")) { let link = document.createElement("link"); link.id = "google-fonts-link"; link.rel = "stylesheet"; link.href = "https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&amp;family=Roboto:ital,wght@0,100..900;1,100..900&amp;display=swap"; document.head.appendChild(link); } document.documentElement.style.fontFamily = "'Roboto', sans-serif"; document.querySelectorAll("pre, code").forEach(el => { el.style.fontFamily = "'JetBrains Mono', monospace"; }); } document.getElementById("googlefonts").addEventListener("click", function () { localStorage.setItem("googlefonts", "yes"); applyGoogleFonts(); }); if (localStorage.getItem("googlefonts") === "yes") { applyGoogleFonts(); } &lt;/script> &lt;p>Désormais, c’est mémorisé: ce périphérique chargera les Google Fonts. Pour toujours (à moins de modifier manuellement la valeur du localStorage ou de créer un bouton qui se charge de le faire). Si vous revenez sur cette page, ce sera toujours le cas sans cliquer à nouveau sur le bouton.&lt;/p> &lt;h2 id="la-solution-locale">La solution locale&lt;/h2> &lt;p>J’avais testé une solution complètement locale avec Inter:&lt;/p> &lt;ol> &lt;li>Conversion des polices variables en &lt;code>woff2&lt;/code> et limitation aux caractères latins (subsetting).&lt;/li> &lt;li>Ajout des &lt;code>@font-face&lt;/code> qui vont bien dans la feuille de style.&lt;/li> &lt;li>Quand les webfonts sont acceptés dans le localStorage (par un bouton), ajout d’une class sur &lt;code>html class=&amp;quot;webfonts&amp;quot;&lt;/code>.&lt;/li> &lt;li>Déclaration de &lt;code>font-family&lt;/code> spécifique à &lt;code>html.webfonts&lt;/code>.&lt;/li> &lt;li>Cacher le bouton d’activation s’il a le localStorage comprend déjà l’acceptation.&lt;/li> &lt;/ol> &lt;p>Tout est disponible dans le commit &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/commit/6f1fb29130cbbcd2907e01c2e7cb5da7f043631b">6f1fb29&lt;/a> sur GitHub.&lt;/p> &lt;h2 id="les-chantiers-inutiles">Les chantiers inutiles&lt;/h2> &lt;p>Ce titre est un hommage aux &lt;a href="https://fr.wikipedia.org/wiki/Grands_travaux_inutiles">grands travaux inutiles&lt;/a>.&lt;/p> &lt;p>Au fond, ces 2 propositions me paraissent inutiles, parce que mes choix de polices système suffisent. Mais j’avais envie de tester 2 choses.&lt;/p> &lt;p>D’une part, laisser le choix aux internautes concernant les polices Google Fonts. Cela peut se mettre en place en 5 minutes. Et il n’est pas besoin de faire clignoter des bannières de consentement et autres trucs. Un bouton; c’est tout!&lt;/p> &lt;p>D’autre part, tester le chargement conditionnel d’une police locale, pour imaginer une solution sans service tiers. C’est un peu plus pénible à maintenir, notamment pour réactualiser les polices quand nécessaire. C’est un peu plus compliqué à mettre en œuvre, notamment selon les jeux de caractères utilisés sur le site. Mais c’est possible.&lt;/p> &lt;p>À la suite de cet exercice avec des &lt;em>web fonts&lt;/em>, je suis encore plus convaincu des polices locales. Je proposerai désormais toujours de travailler avec &lt;em>font stacks&lt;/em> système. Puis permettre d’activer d’autres fontes par un bouton.&lt;/p> &lt;p>Je suis presque certain que personne ne cliquera.&lt;/p> &lt;hr> &lt;p>Ce page transfère environ 5ko de données pour le contenu (HTML et CSS). À l’activation des polices Google Fonts, ce sont un peu plus de 120ko qui sont téléchargés. C’est 24 fois plus. Rien à ajouter!&lt;/p></description></item><item><title>Inter variable avec taille optique</title><link>https://nicolasfriedli.ch/blog/inter-variable-opsz/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/inter-variable-opsz/</guid><description>&lt;p>Sur mon poste Linux, la police d’écriture Inter installé localement est variable (graisses de 100 à 900). Mais elle n’utilise pas les tailles optiques (&lt;code>opsz&lt;/code>). Cela (me) pose problème, car Inter est trop espacée en grande taille, pour les titres et les intertitres.&lt;/p> &lt;p>Si j’utilise Inter en webfont (fichier &lt;code>woff2&lt;/code>), tout va bien. La police est variable en graisse (&lt;code>wght&lt;/code>) comme en taille (&lt;code>opsz&lt;/code>)&lt;/p> &lt;p>Dans ma recherche pour proposer une &lt;em>font stack&lt;/em> (pile de polices) de qualité sans recourir à des envois de fichiers, je croyais avoir enfin trouvé la solution.&lt;/p> &lt;p>&lt;strong>Comme Chrome et Firefox ne sont pas d’accord sur la manière de nommer une police dans un &lt;code>font-face&lt;/code>, cette solution ne fonctionne pas toujours!&lt;/strong> Si vous souhaitez une solution qui marche partout en 2025, il faut passer par un webfont&amp;hellip;&lt;/p> &lt;h2 id="inter-avec-font-face">Inter avec &lt;code>font-face&lt;/code>&lt;/h2> &lt;p>Pour obtenir la variation tant souhaitée, je déclare la police avec &lt;code>font-face&lt;/code>, comme si c’était une police distante:&lt;/p> &lt;pre tabindex="0">&lt;code>:root { font-optical-sizing: auto; } @font-face { font-family: &amp;#34;Inter Variable&amp;#34;; /* sélection de la version variable */ font-style: normal; font-weight: 100 900; src: local(&amp;#34;Inter Variable&amp;#34;); /* nom local de la police */ } @font-face { font-family: &amp;#34;Inter Variable&amp;#34;; /* sélection de la version variable */ font-style: italic; font-weight: 100 900; src: local(&amp;#34;Inter Variable Italic&amp;#34;); /* nom local de la police */ } &lt;/code>&lt;/pre>&lt;p>&lt;strong>Cette déclaration ne fonctionne pas dans Chrome pour Windows.&lt;/strong>&lt;/p> &lt;h2 id="proposition-de-font-stack">Proposition de &lt;em>font stack&lt;/em>&lt;/h2> &lt;p>Désormais, je peux créer une &lt;em>font stack&lt;/em> optimale (les familles génériques n’ont pas de guillemets):&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-family: &amp;#34;Inter Variable&amp;#34;, /* Inter variable, déclarée précédemment, si installée */ ui-sans-serif, /* utilise San Francisco (variable) disponible sur iOS */ &amp;#34;Inter&amp;#34;, /* Inter en version statique (non variable), si installée */ &amp;#34;Roboto&amp;#34;, /* Roboto, si installée */ system-ui, /* Segoe UI sur Windows, Roboto sur Android, à choix sur Linux */ sans-serif; /* la police sans empattement de secours */ } &lt;/code>&lt;/pre>&lt;p>Avec une telle «pile d’écritures», je suis certain que vous aurez quelque chose de beau et de très lisible. Vous pouvez ajouter &lt;code>&amp;quot;Arial&amp;quot;&lt;/code> avant &lt;code>system-ui&lt;/code> si vous souhaitez éviter autant que possible Segoe UI dont l’apparence diffère nettement des autres.&lt;/p> &lt;p>Sans surprise, je vous invite à &lt;a href="https://rsms.me/inter/download/">installer Inter&lt;/a>. Soit en version variable, soit en version statique. La version statique est plus fiable et je vous conseiller d’installer les 18 fichiers.&lt;/p> &lt;p>Et sans surprise non plus, au vu des problèmes d’implémentation, ces propositions resteront un simple exercice de style.&lt;/p></description></item><item><title>Lancer un blog en 2025(?)</title><link>https://nicolasfriedli.ch/blog/blog-2025/</link><pubDate>Mon, 03 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/blog-2025/</guid><description>&lt;p>Le web de 2025 est en pleine mutation. L’intelligence artificielle est sur toutes les lèvres, pour de bonnes et de mauvaises raisons. Les moteurs de recherche vont changer drastiquement. Les réseaux sociaux partent en vrille et sont devenus infréquentables.&lt;/p> &lt;p>&lt;strong>La réponse est claire: un site personnel est plus que jamais d’actualité.&lt;/strong>&lt;/p> &lt;p>On me pose des questions sur le lancement d’un blog personnel aujourd’hui. Je propose une «réponse publique» qui pourra être utile à d’autres.&lt;/p> &lt;h2 id="merdification-generalisee">Merdification généralisée&lt;/h2> &lt;p>Nous vivons une période de &lt;a href="https://ploum.net/2023-06-15-merdification.html">merdification des choses&lt;/a>. Les grands réseaux que nous pensions pérennes font n’importe quoi, à défaut de disparaître. Il n’est plus possible de miser sur leur durée de vie.&lt;/p> &lt;p>La &lt;a href="https://ici.radio-canada.ca/nouvelle/2047650/merdification-enshittification-cory-doctorow-decrypteurs">merdification du web&lt;/a>, en particulier, peut nous inciter à trouver d’autres pistes. &lt;strong>Inventer un nouveau web correct passe probablement par le foisonnement de sites personnels.&lt;/strong> Peut-être des blogs. Peut-être des &lt;a href="https://maggieappleton.com/garden-history">jardins numériques&lt;/a>.&lt;/p> &lt;p>Ce qui est toujours le point de départ, c’est un nom de domaine personnel.&lt;/p> &lt;h2 id="importance-du-nom-de-domaine">Importance du nom de domaine&lt;/h2> &lt;p>Matthias Ott propose une magnifique lettre de nouvelles: &lt;a href="https://newsletter.ownyourweb.site/">Own Your Web&lt;/a>. Votre superpouvoir, dit-il, c’est votre site personnel avec votre propre nom de domaine. Il a raison.&lt;/p> &lt;p>Ce n’est pas très compliqué, même si vous n’avez pas encore un site sur le feu. &lt;strong>Rendez-vous chez Infomaniak et réservez un nom de domaine à votre nom.&lt;/strong> Le plus simple est souvent le meilleur. Dans mon cas: nicolasfriedli.ch; pour ma femme: &lt;a href="https://dianefriedli.ch/">dianefriedli.ch&lt;/a>.&lt;/p> &lt;p>Avec votre nom de domaine, vous pouvez &lt;strong>changer d’hébergeur ou de plateforme&lt;/strong>. Votre «chez vous» le restera tant que vous payez vos 10 francs par année.&lt;/p> &lt;p>Il y a plein de &lt;a href="https://nicolasfriedli.ch/blog/nom-domaine-personnel/">bonnes raisons de posséder un nom de domaine personnel&lt;/a>.&lt;/p> &lt;h2 id="wordpress-en-2025">Wordpress en 2025&lt;/h2> &lt;p>WordPress est en pleine crise. Ou plutôt Matt Mullenweg, son créateur, est en pleine crise. Il fait feu dans tous les sens et son entreprise &lt;a href="https://www.lemondeinformatique.fr/actualites/lire-automattic-reduit-sa-contribution-a-la-version-open-source-de-wordpress-95730.html">Automattic réduit sa contribution à la version open source de WordPress&lt;/a>.&lt;/p> &lt;p>Si WordPress ne représentait pas la moitié du web, ce ne serait pas très important. Mais là, c’est problématique.&lt;/p> &lt;p>D’un côté, c’est la solution idéale pour lancer un blog personnel sans compétences pointues. De l’autre, rien n’est certain pour sa santé à moyen terme.&lt;/p> &lt;p>S’il existe plein d’autres solutions, aucune n’a l’importance de WordPress. Une liste récente est disponible dans &lt;a href="https://manuelmoreale.com/a-better-list-of-blog-platforms">Blog Platforms&lt;/a>. Elle propose beaucoup de petites solutions pas forcément plus sûres.&lt;/p> &lt;p>&lt;strong>Malgré le &lt;em>WordPress Drama&lt;/em> du moment, WordPress est toujours un outil pertinent.&lt;/strong>&lt;/p> &lt;h2 id="conseil-pour-lancer-un-wordpress">Conseil pour lancer un WordPress&lt;/h2> &lt;p>Après l’achat d’un nom de domaine chez Infomaniak, je vois 2 solutions pour disposer d’un blog.&lt;/p> &lt;h3 id="plateforme-wordpresscom">Plateforme wordpress.com&lt;/h3> &lt;p>Pour 60 francs par année, je choisirais un &lt;a href="https://wordpress.com/pricing/">hébergement chez wordpress.com&lt;/a>. Le plan &lt;em>Personal&lt;/em> est amplement suffisant pour débuter.&lt;/p> &lt;p>J’ai la faiblesse de penser que, dans ces délires, Matt Mullenweg ne sabordera pas wordpress.com immédiatement.&lt;/p> &lt;p>&lt;strong>C’est la solution la plus simple&lt;/strong> (pas de configuration compliquée, mises à jour automatique). Et les exportations pour passer à un WordPress hébergé sont toujours possibles.&lt;/p> &lt;h3 id="wordpress-heberge">WordPress hébergé&lt;/h3> &lt;p>L’autre solution, c’est d’installer soi-même son WordPress. Sans surprise, je conseille Infomaniak. Avec la messagerie, vous vous en tirerai pour 200 francs par année.&lt;/p> &lt;p>Comme il est possible d’héberger 20 domaines, vous pouvez &lt;strong>mutualiser les frais avec une connaissance&lt;/strong>. Donc, si un·e ami·e a déjà un blog chez Infomaniak, il peut valoir la peine de demander le gîte.&lt;/p> &lt;p>Attention à ne pas installer n’importe quoi comme thèmes et comme extensions. Je conseille toujours de &lt;strong>viser des thèmes officiels&lt;/strong> et d’&lt;strong>éviter des constructeurs de pages&lt;/strong> qui sont des usines à gaz. Et n’installez que des &lt;strong>extensions qui ont fait leurs preuves&lt;/strong>, sans créer de dépendances vitales pour votre contenu. Vous pouvez n’en utiliser aucune et votre site personnel fonctionnera très bien!&lt;/p> &lt;p>Je n’aime pas l’installation automatique de WordPress qui est proposée. Mais je comprends sont intérêt pour sa simplicité.&lt;/p> &lt;h2 id="site-statique-ou-pas">Site statique (ou pas)&lt;/h2> &lt;p>&lt;strong>Je ne me verrais pas lancer un blog autrement que par un &lt;a href="https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/">site statique&lt;/a>. Sans surprise, Hugo a ma préférence.&lt;/strong> Mais &lt;a href="https://www.11ty.dev/">Eleventy&lt;/a> a des qualités à condition d’installer node.js et de parler couramment Javascript.&lt;/p> &lt;p>Avec un nom de domaine (réservé chez Infomaniak), une adresse mail (dans l’offre gratuite d’Infomaniak) et un hébergement gratuit sur un CDN, il est possible de bloguer pour presque rien. Netlify, CloudFlaire ou GitHub Pages offrent (au sens propre) des prestations suffisantes pour un site personnel.&lt;/p> &lt;h2 id="kirby">Kirby(?)&lt;/h2> &lt;p>Si je lançais un blog aujourd’hui, je passerais peut-être à &lt;a href="https://getkirby.com/">Kirby&lt;/a>. Ce CMS coûte 95 francs et il faut y ajouter un hébergement.&lt;/p> &lt;p>C’est une solution très souple, qui permet de sites complètement personnalisés et rapides.&lt;/p> &lt;p>&lt;strong>J’ai confiance dans le modèle économique proposé.&lt;/strong> Il est probablement moins sujet à la merdification que les grandes plateformes. Je n’aurais aucun souci s’il fallait le migrer vers un autre outil.&lt;/p> &lt;p>Toutefois, je ne peux le conseiller par manque d’expérience.&lt;/p> &lt;hr> &lt;p>&lt;strong>En résumé:&lt;/strong>&lt;/p> &lt;ul> &lt;li>nom de domaine chez Infomaniak&lt;/li> &lt;li>1 mail gratuit chez Infomaniak&lt;/li> &lt;li>solution &lt;em>Personal&lt;/em> de wordpress.com&lt;/li> &lt;/ul> &lt;hr> &lt;p>Après &lt;a href="https://nicolasfriedli.ch/blog/spip/">quelques tests avec SPIP&lt;/a> en 2025, je ne l’exluerais pas d’office.&lt;/p></description></item><item><title>Des polices d’écriture à installer sans hésiter</title><link>https://nicolasfriedli.ch/blog/polices-installer/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/polices-installer/</guid><description>&lt;p>&lt;strong>Cette page est en «rédaction publique»: pas aboutie mais déjà disponible.&lt;br> Commentaires et suggestions bienvenu·e·s!&lt;/strong>&lt;/p> &lt;p>Voici une sélection de polices d’écriture disponibles gratuitement. Si elles étaient plus souvent installées, il serait possible de limiter drastiquement les téléchargements pour des sites plus rapides et écologiques. Comme beaucoup de périphériques n’en disposent pas, on envoie des polices (web fonts) à chaque visite, au mépris de tout bon sens. Un choix aussi restreint que celui proposé ici serait suffisant pour peut-être 90% du web.&lt;/p> &lt;p>Je me suis déjà exprimé sur le sujet des &lt;a href="https://nicolasfriedli.ch/blog/polices-systeme/">polices système&lt;/a>. Je sais que je prêche dans le désert, mais vous conseille quand même de les installer pour en disposer en local.&lt;/p> &lt;p>Toutes les polices ci-dessous sont disponibles en téléchargement (non pas seulement comme polices web) chez &lt;a href="https://fonts.google.com/">Google Fonts&lt;/a>. Mais j’essaie de vous proposer des liens plus intéressant pour les découvrir.&lt;/p> &lt;h2 id="criteres-de-choix">Critères de choix&lt;/h2> &lt;p>Pour les polices sans et avec empattement, je souhaités au moins 4 versions pour disposer d’une police droite, de l’italique et du gras (700). Je ne me vois pas publier du texte sur le web sans ces variantes.&lt;/p> &lt;p>Les polices listées dans &lt;a href="https://modernfontstacks.com/">Modern Font Stack&lt;/a> sont signalées par 🧰 Les polices citées par &lt;a href="https://www.typewolf.com/google-fonts">The 40 Best Free Fonts Available on Google Fonts&lt;/a> sont signalées par ⭐.&lt;/p> &lt;h2 id="sans-empattement-sans-serif">Sans empattement (&lt;code>sans-serif&lt;/code>)&lt;/h2> &lt;h3 id="archivo">Archivo&lt;/h3> &lt;p>Archivo est une police d’apparence simple et classique (à première vue). Elle propose un bel italique, avec notamment un f bien différent de la police droite La lettre g est très particulière en version droite. Disponible en version variable pour la graisse et la largeur.&lt;/p> &lt;p>À tester chez Omnibus-Type: &lt;a href="https://www.omnibus-type.com/variable-fonts/#archivo">https://www.omnibus-type.com/variable-fonts/#archivo&lt;/a>&lt;/p> &lt;h3 id="asap">Asap&lt;/h3> &lt;p>Asap la particularité de ne pas varier en largeur quelle que soit la graisse utilisée. Mais c’est bien une police proportionnelle; le i est plus étroit que le m, contrairement aux chasses fixes. Disponible en version variable pour la graisse et la largeur.&lt;/p> &lt;p>C’est aussi une police d’Omnibus-Type: &lt;a href="https://www.omnibus-type.com/variable-fonts/#asap">https://www.omnibus-type.com/variable-fonts/#asap&lt;/a>&lt;/p> &lt;h3 id="fira-sans">Fira Sans ⭐&lt;/h3> &lt;p>Fira Sans est une des plus belles polices de ces 15 dernières années. Elle n’est pas variable, mais disponible en 9 grasses différentes. Des versions condensée et très condensée sont disponibles. L’italique est magnifique.&lt;/p> &lt;p>&lt;a href="https://bboxtype.com/typefaces/FiraSans/">https://bboxtype.com/typefaces/FiraSans/&lt;/a>&lt;/p> &lt;h3 id="ibm-plex-sans">IBM Plex Sans ⭐&lt;/h3> &lt;p>IBM Plex Sans fait partie de la grande famille IBM Plex, avec le version à empattement (IBM Plex Serif) et celle à chasse fixe (IBM Plex Mono). C’est un excellent choix pour qui souhaite un souhaite un ensemble typographique complet et cohérent. Plusieurs assemblages sont possibles, par exemple le code en mono, les titres et les citations en serif et le corps du text en sans sérif.&lt;/p> &lt;p>&lt;a href="https://www.ibm.com/plex/">https://www.ibm.com/plex/&lt;/a>&lt;/p> &lt;p>Autre famille complète intéressante: Source Sans 🧰, Source Serif &amp;amp; Source Code 🧰 par Adobe. Mais la logique des noms (numéro de version dans le nom, présence de «pro») les rend pénibles à utiliser dans une pile de polices.&lt;/p> &lt;h3 id="inter">Inter 🧰 ⭐&lt;/h3> &lt;p>Inter est une des polices à la mode, mais c’est amplement mérité. Elle est variable et dispose de la taille optique. C’est la police (gratuite) qui remplace le mieux San Francisco d’Apple. La version 4 propose un italique très (trop?) différent du droit.&lt;/p> &lt;p>Je vois de plus en plus de sites qui suggèrent Inter (et souvent Roboto) dans leur liste &lt;code>font-style&lt;/code>, mais sans envoyer de fichiers sur vous ne l’avez pas. Donc c’est une priorité de l’installer pour éviter de tomber sur Arial.&lt;/p> &lt;p>Pimp my Type propose une vidéo intéressante sur la version 4: &lt;a href="https://pimpmytype.com/inter-v4/">https://pimpmytype.com/inter-v4/&lt;/a>&lt;/p> &lt;p>La page du créateur Rasmus Andersson permet de visualiser toutes les possibilités (font features): &lt;a href="https://rsms.me/inter/">https://rsms.me/inter/&lt;/a>&lt;/p> &lt;h3 id="montserrat">Montserrat 🧰 ⭐&lt;/h3> &lt;p>J’aime assez peu cette police pour le corps du texte, mais la trouve excellent pour la titraille. Ou pour des texte courts en assez grande taille. Mais je serais heureux de la savoir installée sur beaucoup d’ordinateurs pour pouvoir l’appeler sans exiger un téléchargement. Comme c’est une des fontes les plus utilisés chez Google Fonts, ce serait une excellente nouvelle.&lt;/p> &lt;p>&lt;a href="https://github.com/JulietaUla/Montserrat">https://github.com/JulietaUla/Montserrat&lt;/a>&lt;/p> &lt;h3 id="noto-sans">Noto Sans 🧰&lt;/h3> &lt;p>Noto n’est pas seulement une police, mais un grand projet de Google. L’idée est de produire un ensemble qui permettent d’écrire toutes les langues. Noto Sans est une excellente police, sans grande originalité mais belle et efficace. Elle peut être accompagnée de Noto Serif, de Noto Sans Mono et même de jeux d’emojis colorés ou noir/blanc. À conseiller vivement si vous consultez des sites en alphabet non latin.&lt;/p> &lt;p>&lt;a href="https://fonts.google.com/noto">https://fonts.google.com/noto&lt;/a>&lt;/p> &lt;h3 id="poppins">Poppins ⭐&lt;/h3> &lt;p>Poppins est une police géométrique bien équilibrée, particulièrement appréciée pour son apparence moderne et lisible. Elle taille un peu grand et large pour des longs textes. Elle est parfaite pour la titraille.&lt;/p> &lt;p>&lt;a href="https://www.fontshare.com/fonts/poppins">https://www.fontshare.com/fonts/poppins&lt;/a>&lt;/p> &lt;h3 id="public-sans">Public Sans&lt;/h3> &lt;p>Public Sans est une police inspirée de Libre Franklin et développée par le gouvernement américain pour des usages institutionnels. Elle est neutre, moderne et fonctionne bien pour des interfaces web et du texte courant. C’est à mon avis un police sous-estimée (ou méconnue).&lt;/p> &lt;p>&lt;a href="https://public-sans.digital.gov/">https://public-sans.digital.gov/&lt;/a>&lt;/p> &lt;h3 id="roboto">Roboto 🧰 ⭐&lt;/h3> &lt;p>Roboto est la police &lt;a href="https://fonts.google.com/analytics">la plus utilisée de Gooogle Fonts&lt;/a> et la police par défaut d’Android. Autant dire qu’elle est partout. C’est un peu la nouvelle Arial. Je vois de plus en plus de sites qui suggèrent Roboto (et souvent Inter) dans leur liste &lt;code>font-style&lt;/code>, mais sans envoyer de fichiers sur vous ne l’avez pas. Donc c’est une priorité de l’installer pour éviter de tomber sur Arial. Elle est disponible en version variable et en version statique (avec 9 graisses) chez Google Fonts: &lt;a href="https://fonts.google.com/specimen/Roboto">https://fonts.google.com/specimen/Roboto&lt;/a>&lt;/p> &lt;p>Je déconseille Roboto Flex qui est beaucoup trop complexe d’utilisation.&lt;/p> &lt;h3 id="ubuntu">Ubuntu 🧰&lt;/h3> &lt;p>La police Ubuntu a été conçue pour le système d’exploitation Ubuntu. Elle est contemporaine et très lisible à l’écran. Je ne l’aime pas beaucoup&amp;hellip; mais elle est listée dans des fonts stacks de référence.&lt;/p> &lt;p>&lt;a href="https://design.ubuntu.com/font">https://design.ubuntu.com/font&lt;/a>&lt;/p> &lt;h2 id="avec-empattement-serif">Avec empattement (&lt;code>serif&lt;/code>)&lt;/h2> &lt;h3 id="alegreya">Alegreya ⭐&lt;/h3> &lt;p>Alegreya est des plus belles polices à empattement qui existe. Elle taille un peu petit, mais est très lisible avec une taille assez grande. L’italique est splendide et les ligatures fabuleuses.&lt;/p> &lt;p>&lt;a href="https://huertatipografica.com/en/fonts/alegreya-ht-pro">https://huertatipografica.com/en/fonts/alegreya-ht-pro&lt;/a>&lt;/p> &lt;h3 id="fraunces">Fraunces ⭐&lt;/h3> &lt;p>Fraunces est une police assez géniale. Elle se rapproche de Cooper Black, très à la mode pour la titraille. Mais elle est surtout étonnement efficace pour du texte. Une des premières polices à présenter un jeu de variations intéressant.&lt;/p> &lt;p>&lt;a href="https://fraunces.undercase.xyz/">https://fraunces.undercase.xyz/&lt;/a>&lt;/p> &lt;h3 id="gelasio">Gelasio&lt;/h3> &lt;p>Gelasio, créée par Eben Sorkin, remplace très bien Georgia dont elle reprend l’apparence générale et les métriques. Elle est surtout libre et gratuite, contrairement à l’excellente police de Matthew Carter. Elle a l’avantage de proposer plus de graisses différentes (et une version variable) ainsi que 2 jeux de nombres au lieu d’un seul. En version courte, toute séquence &lt;code>Georgia, serif&lt;/code> d’une feuille de style devrait devenir &lt;code>Gelasio, Georgia, serif&lt;/code>.&lt;/p> &lt;p>&lt;a href="https://pimpmytype.com/font/gelasio/">https://pimpmytype.com/font/gelasio/&lt;/a>&lt;/p> &lt;h3 id="literata">Literata&lt;/h3> &lt;p>Magnifique, point! Pas besoin d’en parler, il suffit de regarder &lt;a href="https://clagnut.com/blog/2422/">ce qu’en fait Richard Clagnut&lt;/a> pour l’adopter. Lisibilité exceptionnelle, avec des tailles optiques. Une des polices techniquement les plus complètes du moment. Pour compléter le passage sur Gelasio, j’aurais tendance à conseiller &lt;code>Literata, Gelasio, Georgia, serif&lt;/code> pour un site sans empattement.&lt;/p> &lt;p>&lt;a href="https://www.type-together.com/literata-font">https://www.type-together.com/literata-font&lt;/a>&lt;/p> &lt;h3 id="lora">Lora ⭐&lt;/h3> &lt;p>Lora est une police avec empattement particulièrement élégante. L’italique a une apparence calligraphique. Je la trouve parfois trop fine (ou trop petite) sur les sites web.&lt;/p> &lt;p>&lt;a href="https://www.cyreal.org/fonts/lora/">https://www.cyreal.org/fonts/lora/&lt;/a>&lt;/p> &lt;h3 id="merriweather">Merriweather ⭐&lt;/h3> &lt;p>Merriweather est une des polices à empattement les plus lisibles. Elle est disponible en version variable: graisse, largeur et taille optique. En version statique, elle taille grand et demande un interligne assez important (1.6 me semble le minimum).&lt;/p> &lt;p>La version variable n’est pas disponible sur Google Fonts. Elle se trouve chez le fondeur: &lt;a href="https://github.com/SorkinType/Merriweather">https://github.com/SorkinType/Merriweather&lt;/a>&lt;/p> &lt;h3 id="noto-serif">Noto Serif&lt;/h3> &lt;p>Noto Serif est l’équivalent avec empattement de Noto Sans. Elle fait partie de l’énorme projet Noto qui vise à couvrir toutes les langues et tous les caractères du monde. Je la trouve que c’est une des meilleures polices à empattement, moins banale que la variante sans.&lt;/p> &lt;p>&lt;a href="https://fonts.google.com/noto/specimen/Noto+Serif">https://fonts.google.com/noto/specimen/Noto+Serif&lt;/a>&lt;/p> &lt;h3 id="piazzolla">Piazzolla&lt;/h3> &lt;p>Piazzolla est une police étonnante. Elle semble cabossée de partout et reste pourtant très lisible pour du texte long. C’est en partie parce qu’elle dispose de taille optique. Je rêverais de la savoir installée souvent et de pouvoir jouer avec.&lt;/p> &lt;p>&lt;a href="https://piazzolla.huertatipografica.com/">https://piazzolla.huertatipografica.com/&lt;/a>&lt;/p> &lt;h2 id="pour-les-titres-et-intertitres">Pour les titres et intertitres&lt;/h2> &lt;p>Si ces quelques polices étaient installés sur beaucoup de périphériques, il serait facile de proposer des assemblages intéressants et conforme au contenu du site. La sélection est brève, mais j’ai l’impression que ce serait suffiant pour beaucoup de cas:&lt;/p> &lt;ul> &lt;li>Barlow Condensed&lt;/li> &lt;li>Bebas Neue&lt;/li> &lt;li>Bricolage Grotesque&lt;/li> &lt;li>Fraunces&lt;/li> &lt;li>Roboto Slab 🧰&lt;/li> &lt;li>Syne ⭐&lt;/li> &lt;/ul> &lt;p>Sans oublier que Merriweather ou Poppins vont très bien pour la titraille.&lt;/p> &lt;h2 id="polices-a-chasse-fixe-monospace">Polices à chasse fixe (&lt;code>monospace&lt;/code>)&lt;/h2> &lt;p>Ces polices sont normalement prévues pour du code. Certaines ont des fonctions particulières (ligatures).&lt;/p> &lt;h3 id="courier-prime">Courier Prime&lt;/h3> &lt;p>Courier Prime est prévue explicitement pour le texte, notamment l’écriture de scénarios. Elle est très lisible à l’écran et l’italique est de belle qualité.&lt;/p> &lt;p>&lt;a href="https://quoteunquoteapps.com/courierprime/">https://quoteunquoteapps.com/courierprime/&lt;/a>&lt;/p> &lt;h3 id="jetbrains-mono">JetBrains Mono&lt;/h3> &lt;p>JetBrains Mono est la police que j’utilise dans mon éditeur de texte. Elle est parfaitement optimisée pour la lecture du code. Je ne vois pas de raison de chercher plus loin.&lt;/p> &lt;p>Comme elle dispose d’un bel italique et de plusieurs graisses, elle peut être utilisée sans problème pour un site web (y compris le texte).&lt;/p> &lt;p>La page de présentation officielle est excellente: &lt;a href="https://www.jetbrains.com/fr-fr/lp/mono/">https://www.jetbrains.com/fr-fr/lp/mono/&lt;/a>&lt;/p> &lt;h3 id="autres-polices-a-chasse-fixe">Autres polices à chasse fixe&lt;/h3> &lt;ul> &lt;li>Fira Code ou Fira Mono&lt;/li> &lt;li>Hack&lt;/li> &lt;li>IBM Plex Mono&lt;/li> &lt;li>Roboto Mono&lt;/li> &lt;li>Source Code Pro 🧰&lt;/li> &lt;li>Ubuntu Mono&lt;/li> &lt;li>Victor Mono&lt;/li> &lt;/ul> &lt;p>Il y peu de raisons de les installer si vous ne lisez pas régulièrement du code.&lt;/p> &lt;p>Pour visualiser des polices dédiées à la programmation dans leur milieu naturel: &lt;a href="https://www.programmingfonts.org/">https://www.programmingfonts.org/&lt;/a>&lt;/p></description></item><item><title>À propos</title><link>https://nicolasfriedli.ch/about/</link><pubDate>Sat, 01 Feb 2025 16:27:52 +0100</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/about/</guid><description>&lt;p>Ce site est simple et efficace. Il fait la part belle au texte. Je ne suis pas opposé à l’utilisation d’images, à conditions qu’elles apportent des informations utiles. Pour le moment, il n’y en a pas.&lt;/p> &lt;p>nicolasfriedli.ch est créé avec l’excellent &lt;a href="https://gohugo.io/">Hugo&lt;/a>, un générateur de sites statique rapide. Le site actuellement en ligne a été compilé avec la version 0.145.0.&lt;/p> &lt;p>Ses sources sont disponibles dans un &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/">dépôt GitHub public&lt;/a>. Elles permettent de voir le contenu des pages avant compilation (Markdown), la configuration d’Hugo et de suivre l’ensemble des évolutions.&lt;/p> &lt;p>Son contenu est sous licence libre Creative Commons BY-SA. Vous pouvez utiliser des extraits de code sans me citer, à condition de ne pas faire de votre site une copie du mien.&lt;/p> &lt;p>Il est hébergé en Suisse, chez &lt;a href="https://www.infomaniak.com/">Infomaniak&lt;/a>, une entreprise écoresponsable. Même si je trouve les services comme Netlify ou CloudFlare performants et agréables, j’ai fait le choix de mon pays et de l’écologie.&lt;/p> &lt;p>Un &lt;a href="https://nicolasfriedli.ch/index.xml">flux RSS&lt;/a>, avec l’ensemble du contenu des pages, permet de s’abonner au site. Les flux RSS (ou ATOM) sont des outils qui changent la vie. Je n’envoie pas de lettre de nouvelles; je ne souhaite pas savoir qui me suit.&lt;/p> &lt;p>La vie privée compte à mes yeux, c’est pourquoi je ne vous traque pas. nicolasfriedli.ch utilise des statistiques propres (&lt;a href="https://plausible.io/privacy">Plausible Analytics Privacy Policy&lt;/a>) comme seule ressource externe.&lt;/p> &lt;p>Je teste régulièrement mon site pour m’assurer de toujours obtenir d’excellents résultats:&lt;/p> &lt;ul> &lt;li>scores verts dans &lt;a href="https://pagespeed.web.dev/">PageSpeed Insights&lt;/a>&lt;/li> &lt;li>A+ dans &lt;a href="https://www.websitecarbon.com/">Website Carbon Calculator&lt;/a>&lt;/li> &lt;li>aucune erreur d’accessibilité chez &lt;a href="https://wave.webaim.org/">WAVE Web Accessibility Evaluation Tools&lt;/a>&lt;/li> &lt;li>HTML valide selon le &lt;a href="https://validator.w3.org/">Markup Validation Service du W3C&lt;/a>&lt;/li> &lt;li>CSS valide selon le &lt;a href="https://jigsaw.w3.org/css-validator/">CSS Validation Service du W3C&lt;/a> (sauf propriété nouvelles&amp;hellip;)&lt;/li> &lt;li>RSS valide selon le &lt;a href="https://validator.w3.org/feed/">Feed Validation Service du W3C&lt;/a>&lt;/li> &lt;/ul> &lt;p>J’essaie de respecter toutes les &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/">règles Opquast&lt;/a> applicables.&lt;/p> &lt;p>Lorsque j’interviens sur des sites en tant que consultant, je recherche les mêmes standards de qualité.&lt;/p></description></item><item><title>Programme ou stratégie?</title><link>https://nicolasfriedli.ch/blog/programme-strategie/</link><pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/programme-strategie/</guid><description>&lt;p>Plutôt qu’un planning ou programme rigide souvent inefficace face aux imprévus, je propose de privilégier une stratégie web flexible et contextuelle, capable d’évoluer avec les réalités du moment et les attentes des utilisateurs. Elle est plus difficile à expliquer et à faire accepter, mais elle fait ses preuves dans la durée.&lt;/p> &lt;p>Il y a presque 10 ans, j’ai publié un premier billet général sur la stratégie web. Je l’avais complété par un second, plus concret. Les deux, à peine actualisés, sont réunis sur cette page.&lt;/p> &lt;h2 id="survivre-en-entreprise-ou-en-institution">Survivre en entreprise ou en institution&lt;/h2> &lt;p>Il faut un planning! Un programme de publication qui permet de prévoir tout ce qui va se passer sur votre site et vos réseaux sociaux durant la prochaine année. Grâce à lui, vous ne serez plus jamais en retard dans la rédaction de vos contenus, vous ne serez plus inquiet ce qui arrivera la semaine prochaine, votre supérieur saura exactement où vous allez et vos ventes vont augmenter.&lt;/p> &lt;p>Franchement, vous y croyez une seule seconde? Vous savez très bien que vous serez à la bourre pour rédiger vos contenus. Vous savez que vous découvrirez les échéances de la semaine le lundi matin. Vous savez que votre supérieur vous placera dans des situations de double contrainte. Quant à vos ventes, qui sait?&lt;/p> &lt;p>Et surtout, nous savons tous que ces fameux plannings ne servent qu’à rassurer un supérieur, un comité directeur, un conseil ou une assemblée. Même si le programme n’a pas été lu, la simple vue d’une grille et de quelques schémas produit son effet rassérénant et apaise les tensions. Mais tout cela ne sert à rien pour votre travail au quotidien.&lt;/p> &lt;p>Il vaut mieux penser stratégie, avec les mots d’Edgar Morin, dans &lt;em>Introduction à la pensée complexe&lt;/em>:&lt;/p> &lt;blockquote> &lt;p>La notion de stratégie s’oppose à celle de programme.&lt;/p> &lt;p>Un programme, c’est une séquence d’actions prédéterminées qui doit fonctionner dans des circonstances qui en permettent l’accomplissement. Si les circonstances extérieures ne sont pas favorables, le programme s’arrête ou échoue. […] la stratégie, elle, élabore un ou plusieurs scénarios. Dès le début, elle se prépare, s’il y a du nouveau et de l’inattendu, à l’intégrer pour modifier ou enrichir son action.&lt;/p>&lt;/blockquote> &lt;p>Des circonstances extérieures, il y en a toujours et partout. En voici quelques exemples:&lt;/p> &lt;ul> &lt;li>si vous êtes libraire: la qualité de la rentrée littéraire de l’année, l’implantation ou la faillite d’un concurrent, la politique de prix ou de renvois d’Amazon&lt;/li> &lt;li>si vous êtes garagiste: les nouveaux modèles de la marque que vous représentez, ceux des marques concurrentes, le prix de l’essence et les scandales façon Volkswagen&lt;/li> &lt;li>si vous gérez une piscine: la météo&lt;/li> &lt;li>si vous êtes webmaster, quel que soit votre domaine professionnel: l’arrivée de nouvelles technologies (p.ex. les smartphones), de nouvelles plateformes (p.ex. les réseaux sociaux), de nouveaux outils (p.ex. les applications)&lt;/li> &lt;/ul> &lt;p>Vous pouvez continuer à planifier pour faire plaisir à votre supérieur et gagner quelques jours de calme. Ou élaborer une véritable stratégie. La première étape pour passer au niveau stratégique, c’est de comprendre (et de faire comprendre) que, sur le web, la nouveauté et l’inattendu, c’est tous les jours.&lt;/p> &lt;p>Il faut prendre le temps nécessaire et suffisant pour l’expliquer à ses responsables. S’ils comprennent, vous n’aurez plus jamais à proposer de planning. Et s’ils ne comprennent pas, cherchez du travail ailleurs.&lt;/p> &lt;hr> &lt;h2 id="esquisses-de-strategie-web">Esquisses de stratégie web&lt;/h2> &lt;p>Après la publication de la première partie, j’avais reçu un message. Le contenu en résumé:&lt;/p> &lt;blockquote> &lt;p>Tu as raison de dire que les programmes ne marchent pas (ou pour une durée limitée seulement). Ils servent surtout à faire plaisir à un supérieur plutôt qu’à améliorer les résultats du travail. Mais tu ne dis rien sur la stratégie, sinon que plus rien ne peut être programmé.&lt;/p>&lt;/blockquote> &lt;p>Vous avez compris le paradoxe de l’histoire: une stratégie universelle et figée serait en quelque sorte un programme. La stratégie est donc toujours contextuelle: votre entreprise (ses moyens humains, techniques et financiers; ses objectifs), vous (vos compétences, votre cahier des charges) et l’extérieur (les concurrents, l’actualité).&lt;/p> &lt;p>Ce serait un peu simple de s’en tirer ainsi. Voici donc quelques éléments concrets de stratégie web.&lt;/p> &lt;h3 id="externaliser-ou-internaliser">Externaliser ou internaliser?&lt;/h3> &lt;p>Avez-vous déjà remarqué que la très grande majorité des entreprises, même les plus petites, se chargent de leur comptabilité en interne. Alors que beaucoup d’entreprises, pas forcément petites, font appel à des agences de communication externes pour la réalisation de leur site web, de leurs éléments graphiques, voire pour la rédaction de leurs contenus.&lt;/p> &lt;p>C’est facilement explicable. Depuis toujours, on tient ses comptes. La communication, au sens large du terme, est une histoire bien plus récente.&lt;/p> &lt;p>Mais est-ce une bonne idée? Au fond, la capacité de faire évoluer son site web, de produire ses documents et de rédiger ses textes en interne n’est-elle pas plus stratégique que des additions?&lt;/p> &lt;p>Internaliser de telles compétences est un choix stratégique, bien plus ambitieux que de programmer un budget de communication.&lt;/p> &lt;p>Ou alors, externaliser de telles compétences est un choix stratégique, à condition de ne pas agir simplement au cas par cas, mais dans une logique construite et continue.&lt;/p> &lt;h3 id="planification-financiere">Planification financière&lt;/h3> &lt;p>Avez-vous déjà remarqué que, bien souvent, les dépenses dans le domaine du web sont prévues de la même manière que l’on envisage l’industrie lourde ou l’immobilier? La première année, on investit 50000. Puis on prévoit 5000 pour les années suivantes. Soit 70000 sur 5 ans.&lt;/p> &lt;p>Nombreux sont celles et ceux qui n’ont pas vu venir le responsive design, les réseaux sociaux, les intelligences artificielles, etc. Et qui traînent durant des années des sites complètement dépassés. Ce n’est pas un jugement, juste une observation. Le plan a échoué rapidement, mais il n’y avait plus d’argent au programme pour des évolutions nécessaires.&lt;/p> &lt;p>Un choix stratégique, c’est d’être beaucoup plus évolutif dans la durée. On pourrait imaginer 20000 la 1re année, puis 5000 la 2e année, puis 15000 les années suivantes. Ainsi, on a un site raisonnablement à jour durant 5 ans, pour la même somme globale de 70000.&lt;/p> &lt;p>On peut parfaitement maintenir un site longtemps, comme l’expliquent très bien les Yellow Dolphins: &lt;a href="https://yellowdolphins.com/2024/02/site-web-garanti-10-ans/">Garanti 10 ans! Comment un site web résiste au temps?&lt;/a>&lt;/p> &lt;h3 id="evolutions-dun-projet">Évolutions d’un projet&lt;/h3> &lt;p>En analogie avec ce qui dit d’un point de vue financier ci-dessus, avez-vous déjà remarqué que bien des sites vous impressionnent beaucoup à leur sortie, mais semblent insuffisants quelques mois plus tard? C’est, hélas, logique. Peut-on vraiment imaginer que tout était correct dès la rédaction d’un cahier des charges? Que l’on avait pensé à tout?&lt;/p> &lt;p>Un choix plus stratégique consiste à travailler en différentes étapes, avec une contrainte forte. À la fin de chacune des étapes, le projet doit pouvoir être déployé en production, être parfaitement fonctionnel (quelque chose comme Scrum par exemple).&lt;/p> &lt;p>Au début, le projet sera moins impressionnant. Dans la durée, il répondra vraiment à la réalité du moment et aux attentes des utilisateurs.&lt;/p> &lt;h3 id="considerations-techniques">Considérations techniques&lt;/h3> &lt;p>Avez-vous déjà remarqué que des nouveautés sortent presque tous les jours sur le web? Certaines semblent inévitables, d’autres plus futiles. Il y a quelques années, il fallait absolument son application. On constate aujourd’hui qu’il y a bien peu de raisons d’en développer une.&lt;/p> &lt;p>Aujourd’hui, nous sommes en plein dans les questions d’intelligence artificielle. Qui l’aurait imaginé il y a quelques années? Une vision stratégique consiste à se fixer de grandes lignes: nous acceptons d’utiliser des technologies tierces si elles apportent un plus fort taux de lecture et nous gardons un site web comme base arrière solide et pérenne. Une vision programmatique demanderait plutôt la mise à jour de l’application qui avait coûté si cher et que l’on ne peut pas abandonner (mais que personne n’installe).&lt;/p> &lt;p>Nous avons enterré tant de choses. Le cimetière du web est saturé de «nouveautés nécessaires pour lesquelles il fallait investir». Une visite entre les tombes de &lt;a href="https://killedbygoogle.com/">Killed by Google&lt;/a> est édifiante.&lt;/p> &lt;h3 id="dependance-et-independance">Dépendance et indépendance&lt;/h3> &lt;p>Vos publications ont un certain succès, mais reposent entièrement sur un réseau social ou un média que vous ne contrôlez pas. Vous acceptez de dépendre à 100% de ces plateformes. Mais vous ne vous rendez plus compte que tout peut tomber d’un jour à l’autre. Ou que des services comme &lt;del>Twitter&lt;/del> X ou Facebook peuvent partir complètement en vrille.&lt;/p> &lt;p>Une vision stratégique demande de bien choisir un CMS ou un framework, de ne pas faire dépendre des fonctionnalités essentielles sur des outils non essentiels (le CRM qui repose sur le CMS&amp;hellip;). Quand on voit l’&lt;a href="https://siecledigital.fr/2025/01/07/suspension-des-services-de-wordpress-org-un-coup-dur-pour-la-communaute-open-source/">actualité dramatique de WordPress&lt;/a>, on se dit que le pire est toujours possible. Et de choisir des technologies ouvertes et pérennes. Dans votre programme, vous aviez prévu une application complexe, sans vous rendre compte que beaucoup de choses passent aujourd’hui par JSON et, pourquoi pas, des flux RSS.&lt;/p> &lt;p>Je n’ai pas de programme, mais je suis toujours là. Peut-être que ma stratégie est bonne&amp;hellip;&lt;/p></description></item><item><title>Google Analytics ou Search Console</title><link>https://nicolasfriedli.ch/blog/google-analytics-search-console/</link><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/google-analytics-search-console/</guid><description>&lt;p>Lorsqu’un site fonctionne bien, il est beaucoup plus intéressant de travailler un temps avec la Search Console de Google qu’avec des statistiques de fréquentation (Analytics chez Google). Évidemment, le recours à la Search Console n’exclut pas l’utilisation d’Analytics.&lt;/p> &lt;p>Aujourd’hui, je n’utilise plus que &lt;a href="https://plausible.io/">Plausible Analytics&lt;/a>, qui respectent la vie privée et la bande passante. Mais le raisonnement est le même que lors de la première publication de ce billet.&lt;/p> &lt;h2 id="les-statistiques-pour-un-site-qui-demarre">Les statistiques pour un site qui démarre&lt;/h2> &lt;p>Lors de la mise en ligne d’un site, le mandataire demande normalement l’installation d’un système de statistiques. Souvent (hélas), c’est l’outil de Google qui est choisi, par simplicité et par possibilité de comparaison. Dès lors, Analytics mesure l’activité sur le site.&lt;/p> &lt;p>Dans la pratique très concrète, les petits sites institutionnels ou les vitrines d’entreprise font peu usage des données récoltées. Combien de fois ai-je installé Analytics sans que personne ne demande accès aux résultats?&lt;/p> &lt;p>Je me rends tout de même régulièrement sur Analytics pour vérifier que tout se déroule comme prévu. Quelles pages reçoivent le plus de visites? D’où viennent-elles? Quels périphériques sont utilisés?&lt;/p> &lt;p>Les statistiques permettent un contrôle efficace. Une nouvelle publication a bien attiré son monde, le partage sur les réseaux sociaux a produit des résultats, un lien dans une lettre de nouvelles a suscité la confiance des internautes.&lt;/p> &lt;p>Tout cela reste bien léger au vu des possibilités d’un système de statistiques aussi complet que celui de Google. Une fois l’an, on me demande si le site fonctionne bien. Je donne un chiffre global&amp;hellip; et tout continue comme avant.&lt;/p> &lt;p>Lorsque la fréquentation du site et les effets produits sont vitaux pour l’institution ou l’entreprise, le recours aux données est très important. Mais dans les cas classiques de sites vitrines, c’est malheureusement un gadget de plus.&lt;/p> &lt;h2 id="la-console-de-recherche-pour-un-site-qui-fonctionne">La console de recherche pour un site qui fonctionne&lt;/h2> &lt;p>Dès qu’un site fonctionne bien, je préconise de passer par la &lt;a href="https://search.google.com/search-console/about">Search Console&lt;/a>. Un site qui fonctionne bien, dans l’acception que j’en fais ici, c’est un site qui attire une part importante des internautes par les moteurs de recherche.&lt;/p> &lt;p>La logique change alors du tout au tout. Je ne m’intéresse plus au site, au nombre d’internautes sur chaque page ou aux fluctuations quotidiennes. Je m’intéresse à ce qui se passe sur les moteurs de recherche. Quelles sont les requêtes pour lesquelles le site s’affiche? Quelles recherches précises produisent des clics?&lt;/p> &lt;p>Pour que cela soit intéressant, il faut un nombre d’affichages important. Et alors le taux de clic devient une valeur significative.&lt;/p> &lt;p>Un exemple: le site apparaît souvent dans les résultats pour une recherche donnée mais le taux de clic est très faible? Peut-être que le titre de la page (ou sa description affichée) est mauvais, peu signifiant, voire repoussant. Ou alors le site sort tellement bas dans la SERP (Search Engine Result Page ou page des résultats de recherche) que personne ne descend jusque-là.&lt;/p> &lt;p>Voilà des données intéressantes. Impossible d’imaginer à chaque fois qui cherchera quoi? Quelle page sortira pour quelle requête? Et dans quelle position?&lt;/p> &lt;p>Lors que l’on travaille dans le domaine des institutions et des PME (petites et moyennes entreprises), la consultation de la Search Console permet bien des découvertes. Et voilà que je découvre que la requête dont beaucoup s’amusaient est celle qui apporte le plus de visites bien réelles! Reste à analyser si cette recherche et ces visites sont pertinentes. Resteront-elles un phénomène marginal, qui s’estompera rapidement?&lt;/p> &lt;p>Ou alors je découvre que recherches insoupçonnées par leur formulation ou leur fréquence. Et voilà que naissent des idées pour des prochains articles, pour des pages à améliorer, pour des pistes à explorer.&lt;/p> &lt;h2 id="statistiques--search-console-dans-la-duree">Statistiques &amp;amp; Search Console dans la durée&lt;/h2> &lt;p>En principe, la découverte de recherches qui mènent fréquemment au site et un travail sérieux d’amélioration donnent des résultats dans les statistiques. Commencent alors les allers-retours entre ces deux outils complémentaires.&lt;/p> &lt;p>Dans mon outil des statistiques, je pourrai surveiller si ces pages bien abouties fonctionnent. Si le parcours des internautes (flux) est conforme à ce qui a été prévu et construit patiemment.&lt;/p> &lt;p>Dans Search Console, je pourrai vérifier si d’autres recherches proches de celles découvertes précédemment débarquent. Si les résultats montent dans les SERPs. Et si le taux de clic s’améliore de manière significative.&lt;/p> &lt;p>Je connais bien un difficulté récurrente pour les institutions et les petites entreprises. Elles ne veulent pas se faire dicter ce qu’elles «doivent» dire par des données. Elles proposent des offres qu’elles estiment bonnes (c’est peut-être le cas) et ce n’est pas Google qui va leur expliquer comment les promouvoir. Elles ont des produits qu’elles trouvent excellents (c’est peut-être le cas) et elles savent mieux en parler qu’un vulgaire moteur de recherche.&lt;/p> &lt;p>Au final, il y beaucoup d’énergie perdue à faire et refaire des sites en mettant son énergie et son argent sur du graphisme et des images. Au détriment, souvent, du contenu pur: le texte, la structure, la navigation, le maillage interne.&lt;/p> &lt;p>J’en souris en attendant que cela change. Parce qu’une utilisation conséquente des données combinées des statistiques et de Search Console produit des résultats. Ils sont presque assurés si l’on travaille avec rigueur. Et surtout ils sont pérennes, contrairement aux &lt;a href="https://blog.jim-nielsen.com/2024/blog-vs-social-posts/">pics de visites obtenus via les réseaux sociaux&lt;/a>.&lt;/p></description></item><item><title>Colorisation syntaxique avec Chroma dans Hugo</title><link>https://nicolasfriedli.ch/blog/hugo-chroma-colorisation-syntaxique/</link><pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/hugo-chroma-colorisation-syntaxique/</guid><description>&lt;p>Je souhaite utiliser la colorisation syntaxique sur ce site. Elle existe par défaut dans Hugo, avec l’excellent Chroma. Mais je ne vais pas le faire sans certaines précautions: la pérennité (si je modifie mon thème), l’assurance de l’accessibilité (A11Y), l’existence de versions claire et sombre et l’optimisation des performances (webperf).&lt;/p> &lt;p>&lt;strong>Remarque:&lt;/strong> pour le moment, rien n’est activé sur ce site qui présente le code en blanc sur noir (ou noir sur blanc).&lt;/p> &lt;p>Une lecture préalable de &lt;a href="https://gohugo.io/content-management/syntax-highlighting/">Syntax highlighting&lt;/a> dans la documentation de Hugo est souhaitable.&lt;/p> &lt;h2 id="contraste-des-couleurs">Contraste des couleurs&lt;/h2> &lt;p>J’ai passé &lt;a href="https://xyproto.github.io/splash/docs/longer/all.html">tous les thèmes disponibles dans Chroma&lt;/a> dans les &lt;a href="https://wave.webaim.org/report#/https://xyproto.github.io/splash/docs/longer/all.html">WAVE Web Accessibility Evaluation Tools&lt;/a>. Ceux qui disposent d’un contraste suffisant pour être accessibles sont:&lt;/p> &lt;ul> &lt;li>average&lt;/li> &lt;li>borland&lt;/li> &lt;li>bw&lt;/li> &lt;li>doom-one&lt;/li> &lt;li>doom-one2&lt;/li> &lt;li>github-dark&lt;/li> &lt;li>github&lt;/li> &lt;li>modus-operandi&lt;/li> &lt;li>modus-vivendi&lt;/li> &lt;li>pygments&lt;/li> &lt;li>rrt&lt;/li> &lt;li>witchhazel&lt;/li> &lt;li>xcode&lt;/li> &lt;/ul> &lt;p>J’exclus tous ceux qui ne sont pas accessibles (A11Y) par défaut.&lt;/p> &lt;h2 id="couleur-de-fond-definie">Couleur de fond définie&lt;/h2> &lt;p>Quand la couleur de fond de &lt;code>pre&lt;/code> n’est pas définie, il y a un risque si je modifie ma charte de couleurs. Par défaut, ces thèmes ne sont pas assez pérennes pour que je les retienne:&lt;/p> &lt;ul> &lt;li>hr_high_contrast&lt;/li> &lt;li>hrdark&lt;/li> &lt;li>onesenterprise&lt;/li> &lt;li>pygments&lt;/li> &lt;/ul> &lt;p>Par rapport à la liste des thèmes accessibles, seul &lt;em>pygments&lt;/em> est concerné. Je l’élimine.&lt;/p> &lt;p>Il me reste donc comme thèmes accessibles et pérennes:&lt;/p> &lt;ul> &lt;li>average&lt;/li> &lt;li>borland&lt;/li> &lt;li>bw&lt;/li> &lt;li>doom-one&lt;/li> &lt;li>doom-one2&lt;/li> &lt;li>github-dark&lt;/li> &lt;li>github&lt;/li> &lt;li>modus-operandi&lt;/li> &lt;li>modus-vivendi&lt;/li> &lt;li>rrt&lt;/li> &lt;li>witchhazel&lt;/li> &lt;li>xcode&lt;/li> &lt;/ul> &lt;h2 id="polices-a-chasse-fixe">Polices à chasse fixe&lt;/h2> &lt;p>&lt;em>Ce point ne concerne pas Chroma, mais mon utilisation d’Hugo et mes choix de polices.&lt;/em>&lt;/p> &lt;p>J’ai décidé de placer en priorité Roboto Mono comme police à chasse fixe (monospace). Mais si cette police est bien à largeur fixe, elle diffère légèrement entre version droite et version italique. &lt;strong>C’est à mon avis une erreur!&lt;/strong>&lt;/p> &lt;p>En conséquence, je refuse tous les thèmes qui comprennent des italiques, par exemple &lt;em>abap&lt;/em> ou &lt;em>algol&lt;/em>.&lt;/p> &lt;p>Il me reste, de la liste précédente:&lt;/p> &lt;ul> &lt;li>github&lt;/li> &lt;li>modus-operandi&lt;/li> &lt;li>modus-vivendi&lt;/li> &lt;li>witchhazel&lt;/li> &lt;li>xcode&lt;/li> &lt;/ul> &lt;h2 id="mode-clair-light-et-mode-fonce-dark">Mode clair (light) et mode foncé (dark)&lt;/h2> &lt;p>Désormais, je dois me demander si je souhaite une même version pour les thèmes light et dark de mon site.&lt;/p> &lt;p>Si je souhaite 1 même style (CSS) pour les 2 versions du site, je peux utiliser la syntaxe par CSS embarqué ou par feuilles de style externes. Autrement dit, les 2 options suivantes sont possibles dans &lt;code>hugo.toml&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>noClasses = false &amp;lt;- il faut générer 1 feuille de style externe noClasses = true &amp;lt;- option par défaut &lt;/code>&lt;/pre>&lt;p>Pour générer mon CSS externe, il faut lancer une commande du type:&lt;/p> &lt;pre tabindex="0">&lt;code>hugo gen chromastyles --style github &amp;gt; static/css/github.css &lt;/code>&lt;/pre>&lt;p>Cette feuille de style est fonctionnelle, mais ne sera pas optimisée par la suite. J’en profite pour faire mieux ci-dessous.&lt;/p> &lt;p>Si je souhaite des thèmes différents (light et dark), je dois générer 2 feuilles de style externes différentes:&lt;/p> &lt;pre tabindex="0">&lt;code>noClasses = false &amp;lt;- il faut générer 2 feuilles de style externes &lt;/code>&lt;/pre>&lt;p>Puis, je génère les CSS dans &lt;code>assets&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>hugo gen chromastyles --style modus-operandi &amp;gt; assets/css/modus-operandi.css hugo gen chromastyles --style modus-vivendi &amp;gt; assets/css/modus-vivendi.css &lt;/code>&lt;/pre>&lt;p>Ensuite, un appel distinct selon que le thème est clair ou foncé:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ $modusoperandi := resources.Get &amp;#34;css/modus-operandi.css&amp;#34; | minify | fingerprint }} {{ $modisvivendi := resources.Get &amp;#34;css/modus-vivendi.css&amp;#34; | minify | fingerprint }} &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;{{ $modusoperandi.RelPermalink }}&amp;#34; media=&amp;#34;screen and (prefers-color-scheme: dark)&amp;#34; &amp;gt; &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;{{ $modisvivendi.RelPermalink }}&amp;#34; media=&amp;#34;screen and (prefers-color-scheme: light)&amp;#34; &amp;gt; &lt;/code>&lt;/pre>&lt;p>&lt;strong>Voir aussi:&lt;/strong> mon billet &lt;a href="https://nicolasfriedli.ch/blog/css-minification-cache/">Feuilles de style minifiées et gestion du cache&lt;/a> pour comprendre les lignes ci-dessus.&lt;/p> &lt;h2 id="uniformite-des-couleurs">Uniformité des couleurs&lt;/h2> &lt;p>Quand j’utilise du code sans préciser un langage pour la colorisation syntaxique, je souhaite avoir exactement les mêmes couleurs qu’avec la colorisation activée.&lt;/p> &lt;p>Donc, dans mon exemple, il faudrait aller chercher les codes couleur exacts des CSS générés et les appliquer à &lt;code>pre&lt;/code>. Pour du code différent entre dark et light lorsque la colorisation n’est pas activée, quelque chose comme:&lt;/p> &lt;pre tabindex="0">&lt;code>pre { background: #000; color: #FFF; @media (prefers-colors-scheme: dark ) { background: #FFF; color: #000; } } &lt;/code>&lt;/pre>&lt;h2 id="validite-et-optimisation-du-css">Validité et optimisation du CSS&lt;/h2> &lt;p>La feuille de style générée avec &lt;code>hugo gen chromastyle&lt;/code> est complète et commentée. Et c’est très bien ainsi pour faciliter sa modification (sujet que je ne traite pas ici).&lt;/p> &lt;p>Le fichier &lt;code>modus-operandi.css&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>/* Background */ .bg { color:#000;background-color:#fff; } /* PreWrapper */ .chroma { color:#000;background-color:#fff; } /* Other */ .chroma .x { } /* Error */ .chroma .err { } /* CodeLine */ .chroma .cl { } /* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit } /* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; } /* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; } /* LineHighlight */ .chroma .hl { background-color:#e5e5e5 } /* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } /* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } /* Line */ .chroma .line { display:flex; } /* Keyword */ .chroma .k { color:#5317ac } /* KeywordConstant */ .chroma .kc { color:#0000c0 } /* KeywordDeclaration */ .chroma .kd { color:#5317ac } /* KeywordNamespace */ .chroma .kn { color:#5317ac } /* KeywordPseudo */ .chroma .kp { color:#5317ac } /* KeywordReserved */ .chroma .kr { color:#5317ac } /* KeywordType */ .chroma .kt { color:#005a5f } /* Name */ .chroma .n { } /* NameAttribute */ .chroma .na { } /* NameBuiltin */ .chroma .nb { color:#8f0075 } /* NameBuiltinPseudo */ .chroma .bp { } /* NameClass */ .chroma .nc { } /* NameConstant */ .chroma .no { } /* NameDecorator */ .chroma .nd { } /* NameEntity */ .chroma .ni { } /* NameException */ .chroma .ne { } /* NameFunction */ .chroma .nf { color:#721045 } /* NameFunctionMagic */ .chroma .fm { } /* NameLabel */ .chroma .nl { } /* NameNamespace */ .chroma .nn { } /* NameOther */ .chroma .nx { } /* NameProperty */ .chroma .py { } /* NameTag */ .chroma .nt { } /* NameVariable */ .chroma .nv { color:#00538b } /* NameVariableClass */ .chroma .vc { } /* NameVariableGlobal */ .chroma .vg { } /* NameVariableInstance */ .chroma .vi { } /* NameVariableMagic */ .chroma .vm { } /* Literal */ .chroma .l { color:#0000c0 } /* LiteralDate */ .chroma .ld { color:#0000c0 } /* LiteralString */ .chroma .s { color:#2544bb } /* LiteralStringAffix */ .chroma .sa { color:#2544bb } /* LiteralStringBacktick */ .chroma .sb { color:#2544bb } /* LiteralStringChar */ .chroma .sc { color:#2544bb } /* LiteralStringDelimiter */ .chroma .dl { color:#2544bb } /* LiteralStringDoc */ .chroma .sd { color:#2544bb } /* LiteralStringDouble */ .chroma .s2 { color:#2544bb } /* LiteralStringEscape */ .chroma .se { color:#2544bb } /* LiteralStringHeredoc */ .chroma .sh { color:#2544bb } /* LiteralStringInterpol */ .chroma .si { color:#2544bb } /* LiteralStringOther */ .chroma .sx { color:#2544bb } /* LiteralStringRegex */ .chroma .sr { color:#2544bb } /* LiteralStringSingle */ .chroma .s1 { color:#2544bb } /* LiteralStringSymbol */ .chroma .ss { color:#2544bb } /* LiteralNumber */ .chroma .m { color:#0000c0 } /* LiteralNumberBin */ .chroma .mb { color:#0000c0 } /* LiteralNumberFloat */ .chroma .mf { color:#0000c0 } /* LiteralNumberHex */ .chroma .mh { color:#0000c0 } /* LiteralNumberInteger */ .chroma .mi { color:#0000c0 } /* LiteralNumberIntegerLong */ .chroma .il { color:#0000c0 } /* LiteralNumberOct */ .chroma .mo { color:#0000c0 } /* Operator */ .chroma .o { color:#00538b } /* OperatorWord */ .chroma .ow { color:#00538b } /* Punctuation */ .chroma .p { } /* Comment */ .chroma .c { color:#505050 } /* CommentHashbang */ .chroma .ch { color:#505050 } /* CommentMultiline */ .chroma .cm { color:#505050 } /* CommentSingle */ .chroma .c1 { color:#505050 } /* CommentSpecial */ .chroma .cs { color:#505050 } /* CommentPreproc */ .chroma .cp { color:#505050 } /* CommentPreprocFile */ .chroma .cpf { color:#505050 } /* Generic */ .chroma .g { } /* GenericDeleted */ .chroma .gd { } /* GenericEmph */ .chroma .ge { } /* GenericError */ .chroma .gr { } /* GenericHeading */ .chroma .gh { } /* GenericInserted */ .chroma .gi { } /* GenericOutput */ .chroma .go { } /* GenericPrompt */ .chroma .gp { } /* GenericStrong */ .chroma .gs { } /* GenericSubheading */ .chroma .gu { } /* GenericTraceback */ .chroma .gt { } /* GenericUnderline */ .chroma .gl { } /* TextWhitespace */ .chroma .w { } &lt;/code>&lt;/pre>&lt;p>Avec le filtre &lt;code>minify&lt;/code>, les commentaires sont supprimés, mais pas les instructions vides. On pourrait supprimer toutes les lignes avec des &lt;code>{ }&lt;/code> avant le passage par la minification. &lt;strong>Je regrette que &lt;code>minify&lt;/code> ne supprime pas ces instructions vides!&lt;/strong>&lt;/p> &lt;p>Nous aurions donc:&lt;/p> &lt;pre tabindex="0">&lt;code>/* Background */ .bg { color:#000;background-color:#fff; } /* PreWrapper */ .chroma { color:#000;background-color:#fff; } /* LineLink */ .chroma .lnlinks { outline:none;text-decoration:none;color:inherit } /* LineTableTD */ .chroma .lntd { vertical-align:top;padding:0;margin:0;border:0; } /* LineTable */ .chroma .lntable { border-spacing:0;padding:0;margin:0;border:0; } /* LineHighlight */ .chroma .hl { background-color:#e5e5e5 } /* LineNumbersTable */ .chroma .lnt { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } /* LineNumbers */ .chroma .ln { white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f } /* Line */ .chroma .line { display:flex; } /* Keyword */ .chroma .k { color:#5317ac } /* KeywordConstant */ .chroma .kc { color:#0000c0 } /* KeywordDeclaration */ .chroma .kd { color:#5317ac } /* KeywordNamespace */ .chroma .kn { color:#5317ac } /* KeywordPseudo */ .chroma .kp { color:#5317ac } /* KeywordReserved */ .chroma .kr { color:#5317ac } /* KeywordType */ .chroma .kt { color:#005a5f } /* NameBuiltin */ .chroma .nb { color:#8f0075 } /* NameFunction */ .chroma .nf { color:#721045 } /* NameVariable */ .chroma .nv { color:#00538b } /* Literal */ .chroma .l { color:#0000c0 } /* LiteralDate */ .chroma .ld { color:#0000c0 } /* LiteralString */ .chroma .s { color:#2544bb } /* LiteralStringAffix */ .chroma .sa { color:#2544bb } /* LiteralStringBacktick */ .chroma .sb { color:#2544bb } /* LiteralStringChar */ .chroma .sc { color:#2544bb } /* LiteralStringDelimiter */ .chroma .dl { color:#2544bb } /* LiteralStringDoc */ .chroma .sd { color:#2544bb } /* LiteralStringDouble */ .chroma .s2 { color:#2544bb } /* LiteralStringEscape */ .chroma .se { color:#2544bb } /* LiteralStringHeredoc */ .chroma .sh { color:#2544bb } /* LiteralStringInterpol */ .chroma .si { color:#2544bb } /* LiteralStringOther */ .chroma .sx { color:#2544bb } /* LiteralStringRegex */ .chroma .sr { color:#2544bb } /* LiteralStringSingle */ .chroma .s1 { color:#2544bb } /* LiteralStringSymbol */ .chroma .ss { color:#2544bb } /* LiteralNumber */ .chroma .m { color:#0000c0 } /* LiteralNumberBin */ .chroma .mb { color:#0000c0 } /* LiteralNumberFloat */ .chroma .mf { color:#0000c0 } /* LiteralNumberHex */ .chroma .mh { color:#0000c0 } /* LiteralNumberInteger */ .chroma .mi { color:#0000c0 } /* LiteralNumberIntegerLong */ .chroma .il { color:#0000c0 } /* LiteralNumberOct */ .chroma .mo { color:#0000c0 } /* Operator */ .chroma .o { color:#00538b } /* OperatorWord */ .chroma .ow { color:#00538b } /* Comment */ .chroma .c { color:#505050 } /* CommentHashbang */ .chroma .ch { color:#505050 } /* CommentMultiline */ .chroma .cm { color:#505050 } /* CommentSingle */ .chroma .c1 { color:#505050 } /* CommentSpecial */ .chroma .cs { color:#505050 } /* CommentPreproc */ .chroma .cp { color:#505050 } /* CommentPreprocFile */ .chroma .cpf { color:#505050 } &lt;/code>&lt;/pre>&lt;p>Mais comme la même couleur est souvent utilisée, on peut valoir la peine de restructurer la feuille de style avec un outil comme &lt;a href="https://css.github.io/csso/csso.html">CSSO&lt;/a>.&lt;/p> &lt;p>En version bien mise en page:&lt;/p> &lt;pre tabindex="0">&lt;code>.bg,.chroma { color: #000; background-color: #fff } .chroma .lnlinks { outline: 0; text-decoration: none; color: inherit } .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0 } .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0 } .chroma .hl { background-color: #e5e5e5 } .chroma .ln,.chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: .4em; padding: 0 .4em; color: #7f7f7f } .chroma .line { display: flex } .chroma .k { color: #5317ac } .chroma .kc { color: #0000c0 } .chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr { color: #5317ac } .chroma .kt { color: #005a5f } .chroma .nb { color: #8f0075 } .chroma .nf { color: #721045 } .chroma .nv { color: #00538b } .chroma .l,.chroma .ld { color: #0000c0 } .chroma .dl,.chroma .s,.chroma .s1,.chroma .s2,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .se,.chroma .sh,.chroma .si,.chroma .sr,.chroma .ss,.chroma .sx { color: #2544bb } .chroma .il,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo { color: #0000c0 } .chroma .o,.chroma .ow { color: #00538b } .chroma .c,.chroma .c1,.chroma .ch,.chroma .cm,.chroma .cp,.chroma .cpf,.chroma .cs { color: #505050 } &lt;/code>&lt;/pre>&lt;p>En version minifiée:&lt;/p> &lt;pre tabindex="0">&lt;code>.bg,.chroma{color:#000;background-color:#fff}.chroma .lnlinks{outline:0;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#e5e5e5}.chroma .ln,.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#5317ac}.chroma .kc{color:#0000c0}.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr{color:#5317ac}.chroma .kt{color:#005a5f}.chroma .nb{color:#8f0075}.chroma .nf{color:#721045}.chroma .nv{color:#00538b}.chroma .l,.chroma .ld{color:#0000c0}.chroma .dl,.chroma .s,.chroma .s1,.chroma .s2,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .se,.chroma .sh,.chroma .si,.chroma .sr,.chroma .ss,.chroma .sx{color:#2544bb}.chroma .il,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo{color:#0000c0}.chroma .o,.chroma .ow{color:#00538b}.chroma .c,.chroma .c1,.chroma .ch,.chroma .cm,.chroma .cp,.chroma .cpf,.chroma .cs{color:#505050} &lt;/code>&lt;/pre>&lt;p>Entre la version générée par &lt;code>hugo gen&lt;/code> et la version finale, on économise 75% de poids!&lt;/p> &lt;hr> &lt;p>Cet article sera remis à une une fois ces recettes appliquées à mon site.&lt;/p></description></item><item><title>Adresses mail avec le signe + (plus)</title><link>https://nicolasfriedli.ch/blog/mail-plus/</link><pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/mail-plus/</guid><description>&lt;p>L’utilisation du signe &lt;code>+&lt;/code> (plus) dans une adresse de messagerie permet de créer un nombre illimité d’alias. C’est intéressant pour la détection des fuites de données et le filtrage avancé de sa boîte de réception. Mais cette méthode a aussi ses limites.&lt;/p> &lt;h2 id="caracteres-autorises-et-interdits">Caractères autorisés (et interdits)&lt;/h2> &lt;p>La constitution d’une adresse mail répond à la fois à des normes et aux critères adoptés par son hébergeur. Les hébergeurs peuvent être plus restrictifs que les règles définies par l’IETF (Internet Engineering Task Force).&lt;/p> &lt;p>La page Wikipédia sur les adresses de messagerie (en anglais) donne une excellente &lt;a href="https://en.wikipedia.org/wiki/Email_address#Examples">liste d’exemples d’adresse valides et invalides&lt;/a>. La validité de ces adresses est celle des normes dans les &lt;a href="https://fr.wikipedia.org/wiki/Request_for_comments">RFC (Request for comments)&lt;/a> de l’IETF.&lt;/p> &lt;p>Ensuite, votre hébergeur peut restreindre ces choix. Par exemple, Infomaniak, l’excellent hébergeur de ce site: &lt;a href="https://www.infomaniak.com/fr/support/faq/438/decouvrir-les-caracteres-admis-pour-une-adresse-mail">Découvrir les caractères admis pour une adresse mail&lt;/a>.&lt;/p> &lt;p>Pour moi, une adresse bien pensée est constituée uniquement de:&lt;/p> &lt;ul> &lt;li>&lt;strong>Lettres minuscules.&lt;/strong> La partie à droite de l’arobase &lt;code>@&lt;/code> (adresse du serveur) peut utiliser des minuscules comme des majuscules, c’est toujours équivalent. Les serveurs ne font &lt;em>en général&lt;/em> pas de distinction entre majuscules et minuscules pour la partie à gauche de &lt;code>@&lt;/code> (partie locale). Les variations de type &lt;a href="https://fr.wikipedia.org/wiki/Camel_case">CamelCase&lt;/a> apportent plus de confusion que de clarté.&lt;/li> &lt;li>&lt;strong>Points.&lt;/strong> Ils remplacent les espaces (s’il est souhaité de rendre visible les «espaces» dans une adresse). Ils sont, par exemple, la séparation logique entre prénom et nom.&lt;/li> &lt;li>&lt;strong>Traits d’union.&lt;/strong> Je conseille de les utiliser seulement quand ils existent déjà dans la graphie courante. Par exemple, l’adresse mail de Jean-Alcide Nanchen pourrait être &lt;code>jean-alcide.nanchen@gmail.com&lt;/code>.&lt;/li> &lt;/ul> &lt;p>En plus de ces 3 types de caractères, il existe le fameux signe &lt;code>+&lt;/code> ou plus. L’idée est à la fois simple et géniale. Le serveur considère comme synonyme les adresses suivantes:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@frdl.ch prenom.nom+newsletter@frdl.ch prenom.nom+anti.spam@frdl.ch &lt;/code>&lt;/pre>&lt;p>Les 3 courriers arriveront bien à l’adresse &lt;code>prenom.nom@frdl.ch&lt;/code>. C’est utile car simple à mettre en œuvre, voici pourquoi.&lt;/p> &lt;h2 id="les-alias-mail">Les alias mail&lt;/h2> &lt;h3 id="alias-classique">Alias «classique»&lt;/h3> &lt;p>Créer un alias mail, c’est équivalent à coller un nom supplémentaire sur sa boîte aux lettres. Par exemple, sous mon nom, je peux ajouter un autocollant «Association Libido Dièse». Les courriers adressés à cette remarquable association seront déposés dans ma boîte personnelle.&lt;/p> &lt;p>Sur le serveur &lt;code>frdl.ch&lt;/code>, je pourrais créer:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@frdl.ch &amp;lt;- mon adresse libido.diese@frdl.ch &amp;lt;- un alias &lt;/code>&lt;/pre>&lt;p>Cela signifie que, avant de recevoir un courrier papier ou mail:&lt;/p> &lt;ul> &lt;li>dans la vie physique, je dois créer un autocollant et l’apposer sur ma boîte aux lettres&lt;/li> &lt;li>sur le serveur, je dois créer l’alias avant qu’il soit utilisable&lt;/li> &lt;/ul> &lt;h3 id="alias-par--plus">Alias par &lt;code>+&lt;/code> (plus)&lt;/h3> &lt;p>Pour reprendre l’analogie du courrier postal, il faut que l’adresse soit quelque chose comme: «Association Libido Dièse - Nicolas Friedli».&lt;/p> &lt;p>En version serveur mail:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@frdl.ch &amp;lt;- mon adresse prenom.nom+libido.diese@frdl.ch &amp;lt;- un alias &lt;/code>&lt;/pre>&lt;p>Cela signifie que:&lt;/p> &lt;ul> &lt;li>dans la vie physique, je n’ai pas besoin d’ajouter un autocollant sur ma boîte aux lettres&lt;/li> &lt;li>sur le serveur, je n’ai rien à créer pour que cela fonctionne (à condition que mon hébergeur gère bien les &lt;code>+&lt;/code>)&lt;/li> &lt;/ul> &lt;p>C’est génial parce que je «crée» un alias au moment même de l’écriture de l’adresse.&lt;/p> &lt;h3 id="tracer-les-fuites-de-donnees">Tracer les fuites de données&lt;/h3> &lt;p>Par exemple, lorsque je m’abonne à une lettre de nouvelles, j’ajoute toujours un &lt;code>+&lt;/code>. Et j’utilise une adresse Gmail.&lt;/p> &lt;p>Donc, pour les lettres de nouvelles la commune de Pétaouchnok:&lt;/p> &lt;pre tabindex="0">&lt;code>nicolas.friedli+petaouchnok@gmail.com &lt;/code>&lt;/pre>&lt;p>Désormais, si je reçois un spam à cette adresse, je sais que la fuite de données provient de la commune Pétaouchnok. Peut-être qu’elle a donné mon adresse à des tiers (contrairement à sa promesse de ne pas le faire). Peut-être que son serveur a été piraté.&lt;/p> &lt;h3 id="trier-efficacement-ses-mails">Trier efficacement ses mails&lt;/h3> &lt;p>Comme &lt;code>nicolas.friedli+petaouchnok@gmail.com&lt;/code> est désormais utilisée pour du spam, je peux ajouter un filtre qui balance automatiquement à la poubelle tout ce qui contient &lt;code>+petaouchnok@&lt;/code>.&lt;/p> &lt;p>Si je recouvre confiance en cette commune, je peux toujours me risquer à un réabonnement avec:&lt;/p> &lt;pre tabindex="0">&lt;code>nicolas.friedli+le.retour.de.petaouchnok@gmail.com &lt;/code>&lt;/pre>&lt;p>Mais je peux aussi utiliser d’autres alias utiles. Par exemple, pour déplacer automatiquement dans un répertoire donné:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom+urgent@frdl.ch prenom.nom+reservation2025@frdl.ch &lt;/code>&lt;/pre>&lt;p>À défaut de filtrer ou trier automatiquement, une recherche avec une adresse précise est diablement efficace.&lt;/p> &lt;h3 id="creer-des-comptes-multiples">Créer des comptes multiples&lt;/h3> &lt;p>Autre utilité des alias par &lt;code>+&lt;/code>, la possibilité de créer plusieurs comptes:&lt;/p> &lt;ul> &lt;li>tu joues à Brawl Stars et tu souhaites 2 comptes&lt;/li> &lt;li>une administration exige une adresse différente pour chaque membre de la famille&lt;/li> &lt;li>tu veux profiter d’une offre gratuite limitée&amp;hellip;&lt;/li> &lt;/ul> &lt;h2 id="limites-de-lutilisation-du-">Limites de l’utilisation du &lt;code>+&lt;/code>&lt;/h2> &lt;p>Maintenant que l’on a vu plein de belles choses à faire avec &lt;code>+&lt;/code>, voici pourquoi tout n’est pas complètement rose.&lt;/p> &lt;h3 id="configuration-des-serveurs">Configuration des serveurs&lt;/h3> &lt;p>La règle &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/le-site-accepte-les-alias-mail-contenant-le-signe">Opquast 23&lt;/a> est claire:&lt;/p> &lt;blockquote> &lt;p>Le site accepte les &lt;strong>alias&lt;/strong> mail contenant le signe +.&lt;/p>&lt;/blockquote> &lt;p>La règle parle bien du serveur sur lequel vous souhaitez vous inscrire avec une adresse mail. C’est une mauvaise idée de ne pas l’accepter, mais ça arrive. Difficile de faire plier certaines entreprises et administrations.&lt;/p> &lt;p>En passant, si votre hébergeur n’accepte pas les adresses avec &lt;code>+&lt;/code>, changez d’hébergeur!&lt;/p> &lt;h3 id="changement-de-proprietaire">Changement de propriétaire&lt;/h3> &lt;p>Un «vrai» alias permet de rediriger ailleurs lorsque les propriétaires changent. Ce n’est pas le cas avec une adresse en &lt;code>+&lt;/code> qui reste toujours liée à l’adresse de départ.&lt;/p> &lt;p>Dans mon exemple de l’Association Libido Dièse, l’alias en &lt;code>+&lt;/code> sera toujours lié aux mêmes prénom et nom:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@frdl.ch &amp;lt;- mon adresse prenom.nom+libido.diese@frdl.ch &amp;lt;- un alias &lt;/code>&lt;/pre>&lt;p>Alors qu’un alias «classique» peut renvoyer ailleurs:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@frdl.ch &amp;lt;- mon adresse libido.diese@frdl.ch &amp;lt;- alias original vers prenom.nom@frdl.ch libido.diese@frdl.ch &amp;lt;- alias modifié vers prenom2.nom2@frdl.ch libido.diese@frdl.ch &amp;lt;- ou redirection vers libidodiese@gmail.com &lt;/code>&lt;/pre>&lt;p>L’alias «classique» demande de la maintenance (création, suppression, gestion des redirections), mais est très souple. L’alias &lt;code>+&lt;/code> ne demande aucun travail, mais offre moins de possibilités.&lt;/p> &lt;h3 id="malices-des-spammeurs-et-spammeuses">Malices des spammeurs et spammeuses&lt;/h3> &lt;p>Si j’étais spammeur, je m’empresserais de nettoyer tous les &lt;code>+&lt;/code> pour limiter les possibilités de filtrage de mes victimes. C’est facile avec &lt;a href="https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re">expression régulière&lt;/a>. Si vous ne savez pas ce que c’est, vous pouvez vous amuser avec &lt;a href="https://regex101.com/">regular expressions 101&lt;/a>.&lt;/p> &lt;p>Dans mon éditeur VS Code, j’efface ce qui correspond à &lt;code>\+[^@]*&lt;/code>.&lt;/p> &lt;p>En français:&lt;/p> &lt;blockquote> &lt;p>Sélectionne le &lt;code>+&lt;/code> puis tous les caractères qui suivent à condition que ce ne soit pas un &lt;code>@&lt;/code>. Puis remplace cette chaîne par&amp;hellip; rien.&lt;/p>&lt;/blockquote> &lt;p>Vous pouvez voir le résultat dans dans &lt;a href="https://regexr.com/8an1s">regexr.com&lt;/a>.&lt;/p> &lt;h3 id="adresse-temporaire">Adresse temporaire&lt;/h3> &lt;p>Avec un alias classique, il est possible de créer un mail temporaire, qui sera détruit une fois devenu inutile. Par exemple, pour envoyer des sa candidature à un emploi précis:&lt;/p> &lt;pre tabindex="0">&lt;code>postulation237@frdl.ch &lt;/code>&lt;/pre>&lt;p>Une fois le délai passé cet alias est détruit.&lt;/p> &lt;p>Alors que qu’avec les adresses en &lt;code>+&lt;/code>, l’adresse originale est toujours dévoilée. Pour un même type d’usage:&lt;/p> &lt;pre tabindex="0">&lt;code>rh+postulation237@frdl.ch &lt;/code>&lt;/pre>&lt;p>D’une part l’adresse d’origine est dévoilée (&lt;code>rh@frdl.ch&lt;/code>), d’autre part l’alias n’est pas désactivable une fois le délai passé et tous les messages envoyés à cette adresse arriveront bien dans la boîte des ressources humaines.&lt;/p> &lt;p>Un alias classique permet aussi d’anonymiser l’adresse de destination. Personne ne pourra savoir où atterit l’adresse &lt;code>qwertz@frdl.ch&lt;/code>, alors que &lt;code>prenom.nom+qwertz@frdl.ch&lt;/code> dévoile sa destination.&lt;/p> &lt;h2 id="note-sur-les-adresses-gmail">Note sur les adresses Gmail&lt;/h2> &lt;p>En lisant des normes et pratiques pour rédiger cet article, je me suis souvenu d’une particularité de Gmail.&lt;/p> &lt;p>Les points n’ont aucune importance dans les adresses &lt;code>@gmail.com&lt;/code>. Ainsi, les mails envoyés à toutes ces adresses arriveront au même endroit:&lt;/p> &lt;pre tabindex="0">&lt;code>prenom.nom@gmail.com prenomnom@gmail.com p.r.enom.n.om@gmail.com &lt;/code>&lt;/pre>&lt;p>C’est plutôt intéressant du point de vue de la sécurité, parce qu’il est difficile d’usurper une identité par l’ajout de &lt;code>.&lt;/code> (points).&lt;/p> &lt;p>Et, bien entendu: Gmail permet l’utilisation des adresses en &lt;code>+&lt;/code>.&lt;/p> &lt;hr> &lt;p>Je reçois volontiers un message avec vos cas d’utilisation intéressants. Le mail en &lt;code>+&lt;/code> se trouve en pied de page.&lt;/p> &lt;hr> &lt;h2 id="antispam">Antispam&lt;/h2> &lt;p>&lt;a href="https://matthieuamiguet.ch/">Matthieu Amiguet&lt;/a> me signale à juste titre que pour lutter sérieusement contre le spam, il est bien d’utiliser un service dédié. Par exemple &lt;a href="https://www.spamgourmet.com/">spamgourmet&lt;/a> qui permet de créer une adresse unique qui se détruit automatiquement après avoir mangé assez de messages.&lt;/p> &lt;p>Il existe aussi l’idée de l’adresse jetable, qui cache complètement votre mail, quand vous vous abonnez à des newsletters dans des lecteurs de flux RSS en ligne. C’est le cas chez Inoreader, Feedbin et Feedly (au moins).&lt;/p> &lt;p>Pour d’autres services, lancez une &lt;a href="https://nicolasfriedli.ch/blog/recherche-google-avancee/">recherche Google&lt;/a> (ou autre) sur &lt;code>mail jetable&lt;/code> ou &lt;code>adresse mail unique&lt;/code>.&lt;/p></description></item><item><title>Recherches Google avancées</title><link>https://nicolasfriedli.ch/blog/recherche-google-avancee/</link><pubDate>Thu, 05 Dec 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/recherche-google-avancee/</guid><description>&lt;p>Le moteur de recherche Google est souvent utilisé de manière basique. Comme il est plutôt efficace, quelques mots suffisent souvent. Toutefois, quelques astuces permettent d’affiner ses recherches.&lt;/p> &lt;p>La maîtrise des recherches est une compétence &lt;del>utile&lt;/del> nécessaire pour effectuer une veille efficace.&lt;/p> &lt;p>&lt;strong>Un conseil:&lt;/strong> à chaque étape de cette page, faites des tests avec vos propres requêtes! C’est en utilisant ces critères que vous en comprendrez vraiment l’utilité (et les mémoriserez).&lt;/p> &lt;h2 id="documentation-de-google">Documentation de Google&lt;/h2> &lt;p>Le moteur de recherche propose des pages de &lt;a href="https://support.google.com/websearch">documentation&lt;/a> intéressantes. Par exemple:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://support.google.com/websearch/answer/2466433">Affiner les recherches Google&lt;/a>&lt;/li> &lt;li>&lt;a href="https://support.google.com/websearch/answer/35890">Effectuer une recherche avancée sur Google&lt;/a>&lt;/li> &lt;li>&lt;a href="https://support.google.com/websearch/answer/13485060">Utiliser le filtre de langue des résultats dans la recherche Google&lt;/a>&lt;/li> &lt;/ul> &lt;p>Si c’est toujours une bonne idée de lire les documentations officielles, je préfère vous donner rapidement les requêtes les plus utiles.&lt;/p> &lt;p>Je signale qu’il existe un &lt;a href="https://www.google.ch/advanced_search">formulaire de recherche avancée&lt;/a>, mais je n’aime pas l’utiliser. Les requêtes textuelles me parlent plus qu’un formulaire.&lt;/p> &lt;h2 id="operateurs-logiques">Opérateurs logiques&lt;/h2> &lt;h3 id="rechercher-une-expression-et-une-autre-avec-and">Rechercher une expression &lt;em>et&lt;/em> une autre avec &lt;code>AND&lt;/code>&lt;/h3> &lt;p>Par défaut, une recherche sans précisions particulières recherche tous les mots. Par exemple:&lt;/p> &lt;pre>&lt;code>Nicolas Friedli &lt;/code>&lt;/pre> &lt;p>Je peux préciser explicitement que je souhaite tous ces mots avec:&lt;/p> &lt;pre>&lt;code>Nicolas+Friedli &lt;/code>&lt;/pre> &lt;p>L’utilisation de &lt;code>AND&lt;/code> au lieu de &lt;code>+&lt;/code> est possible:&lt;/p> &lt;pre>&lt;code>Nicolas AND Friedli &lt;/code>&lt;/pre> &lt;p>Ce type de recherche est celui que vous effectuez la plupart du temps.&lt;/p> &lt;h3 id="recherche-une-expression-ou-une-autre-avec-or">Recherche une expression &lt;em>ou&lt;/em> une autre avec &lt;code>OR&lt;/code>&lt;/h3> &lt;p>Le &lt;em>ou&lt;/em> n’est jamais explicite. Il faut donc le préciser dans sa recherche, avec une des syntaxes suivantes:&lt;/p> &lt;pre>&lt;code>Nicolas|Friedli Nicolas OR Friedli &lt;/code>&lt;/pre> &lt;p>C’est peu utile ainsi. Je pourrais effectuer successivement les 2 recherches pour avoir le même résultat.&lt;/p> &lt;p>Le &lt;code>OR&lt;/code> n’est pas exclusif, ce qui signifie qu’il peut y avoir des résultats avec 1 mot, l’autre mot ou les 2.&lt;/p> &lt;p>Mais c’est très puissant dans les recherches complexes dont on parlera ci-dessous.&lt;/p> &lt;h3 id="exclure-des-resultats-de-recherche-avec--">Exclure des résultats de recherche avec &lt;code>-&lt;/code>&lt;/h3> &lt;p>L’exclusion de résultat est intéressante pour éviter des résultats parasites. Il existe un Nicolas Friedli qui s’occupe de pieds.&lt;/p> &lt;p>Donc, je pourrais faire une recherche comme:&lt;/p> &lt;pre>&lt;code>Nicolas Friedli -podologue -pédicure &lt;/code>&lt;/pre> &lt;p>Comme il est possible de recherche plusieurs mots, il est possible d’en exclure plusieurs.&lt;/p> &lt;p>Les exclusions sont très intéressantes quand on utilise des requêtes complexes pour les actualités Google.&lt;/p> &lt;h3 id="rechercher-un-motif-exact-avec--">Rechercher un motif exact avec &lt;code>&amp;quot; &amp;quot;&lt;/code>&lt;/h3> &lt;p>L’utilisation de guillemets permet la recherche d’une expression exacte. Ce qui signifie que les 2 requêtes suivantes donnent des résultats différents:&lt;/p> &lt;pre>&lt;code>&amp;quot;Nicolas Friedli&amp;quot; &amp;quot;Friedli Nicolas&amp;quot; &lt;/code>&lt;/pre> &lt;p>Comme les algorithmes de recherche ont tendance à corriger automatiquement les requêtes, c’est un outil nécessaire dans certains cas. C’est particulièrement puissant quand un nom a une orthographe particulière.&lt;/p> &lt;p>Le motif exact peut être un seul mot. Ainsi, si je veux recherche &lt;em>Nicaulas&lt;/em>, j’entrerai:&lt;/p> &lt;pre>&lt;code>&amp;quot;Nicaulas&amp;quot; &lt;/code>&lt;/pre> &lt;p>Et là, malgré les guillemets, Google me propose des résultats pour &lt;em>Nicolas&lt;/em>. Je peux ensuite forcer la recherche avec le lien proposé: &lt;em>Essayez avec l’orthographe &amp;ldquo;nicaulas&amp;rdquo;&lt;/em>.&lt;/p> &lt;h3 id="combinaisons-doperateurs-logiques">Combinaisons d’opérateurs logiques&lt;/h3> &lt;p>Pour effectuer des recherches d’actualité dans le domaine du protestantisme réformé, j’utilise:&lt;/p> &lt;pre>&lt;code>&amp;quot;(église|paroisse) (protestante|réformée)&amp;quot; &lt;/code>&lt;/pre> &lt;p>Ce qui signifie que je recherche 4 expressions exactes:&lt;/p> &lt;pre>&lt;code>&amp;quot;église protestante&amp;quot; OR &amp;quot;église réformée&amp;quot; OR &amp;quot;paroisse protestante&amp;quot; OR &amp;quot;paroisse réformée&amp;quot; &lt;/code>&lt;/pre> &lt;p>Mais j’évite les articles comprennent les mots &lt;em>église&lt;/em> et &lt;em>paroisse&lt;/em> seulement.&lt;/p> &lt;h2 id="recherche-dans-un-seul-site-avec-site">Recherche dans un seul site avec &lt;code>site:&lt;/code>&lt;/h2> &lt;p>C’est un des outils méconnus les plus puissants: la recherche sur un seul nom de domaine ou une partie de site. Un exemple tout simple:&lt;/p> &lt;pre>&lt;code>&amp;quot;nicolas friedli&amp;quot; site:reformes.ch &lt;/code>&lt;/pre> &lt;p>C’est une combinaison d’une expression exacte (&lt;code>&amp;quot; &amp;quot;&lt;/code>) et d’une limitation à un seul site.&lt;/p> &lt;p>Une utilisation basique mais efficace de ce genre de requête, c’est:&lt;/p> &lt;pre>&lt;code>site:eliojaillet.ch &lt;/code>&lt;/pre> &lt;p>Ainsi, le &lt;em>théologien vaudois éclectique&lt;/em> verra comment s’affichent les pages de son site dans Google (et quelles pages sont indexées).&lt;/p> &lt;p>Il n’est pas nécessaire d’utiliser un nom de domaine entier. Une extension seule est aussi possible. Par exemple:&lt;/p> &lt;pre>&lt;code>site:.fr &amp;quot;Elio Jaillet&amp;quot; &lt;/code>&lt;/pre> &lt;p>Les négations sont aussi possibles:&lt;/p> &lt;pre>&lt;code>&amp;quot;Elio Jaillet&amp;quot; -site:eliojaillet.ch &lt;/code>&lt;/pre> &lt;p>Et quand vous souhaitez effectuer une recherche sur un blog hébergé chez wordpress.com, utilisez quelque chose comme:&lt;/p> &lt;pre>&lt;code>site:sousdomaine.wordpress.com &lt;/code>&lt;/pre> &lt;p>Ces recherches sont très (très très) utiles quand un site ne dispose pas de moteur de recherche ou que son moteur de recherche est médiocre.&lt;/p> &lt;h2 id="recherche-par-type-de-fichiers-avec-filetype">Recherche par type de fichiers avec &lt;code>filetype:&lt;/code>&lt;/h2> &lt;p>J’utilise surtout la recherche par type de fichiers pour m’attaquer aux PDF. Surtout quand ils ne sont pas référencés par le moteur de recherche interne ou que le moteur de recherche n’est pas assez bon.&lt;/p> &lt;p>Un exemple concret:&lt;/p> &lt;pre>&lt;code>filetype:pdf site:ne.ch &amp;quot;piste cyclable&amp;quot; &lt;/code>&lt;/pre> &lt;p>Avec ce que vous savez déjà, vous n’aurez aucune difficulté à comprendre ce que fait cette requête.&lt;/p> &lt;p>Essayez avec votre propre nom:&lt;/p> &lt;pre>&lt;code>&amp;quot;Prénom Nom&amp;quot; OR &amp;quot;Nom Prénom&amp;quot; filetype:pdf site:.ch &lt;/code>&lt;/pre> &lt;p>Un outil de veille très intéressant.&lt;/p> &lt;h2 id="1exemple-de-recherche-pour-des-sites-wordpress">1 exemple de recherche pour des sites WordPress&lt;/h2> &lt;p>Pour les sites WordPress, j’aime bien ajouter des limitations. En particulier quand ils comportent beaucoup de catégories et de tags.&lt;/p> &lt;p>Par exemple, sur le site d’Armin Kressmann (qui avait conservé une ancienne version de ce document), la liste des articles:&lt;/p> &lt;pre>&lt;code>site:ethikos.ch -site:ethikos.ch/category -site:ethikos.ch/tag -site:ethikos.ch/page &lt;/code>&lt;/pre> &lt;p>Et en version bien plus élégante:&lt;/p> &lt;pre>&lt;code>site:ethikos.ch -inurl:(category|tag|page) &lt;/code>&lt;/pre> &lt;p>Il y a dans cette ligne les notions de &lt;code>site:&lt;/code>, la négation &lt;code>-&lt;/code>, le &lt;code>|&lt;/code> (ou). Et j’ajoute le sélecteur &lt;code>inurl&lt;/code> qui signale un motif dans l’adresse de la page (ou URL).&lt;/p> &lt;h2 id="utiliser-ses-recherches-pour-des-alertes-google">Utiliser ses recherches pour des alertes Google&lt;/h2> &lt;p>La construction d’une requête complexe peut prendre un peu de temps, mais elle est très utile pour les alertes Google.&lt;/p> &lt;p>Je construis sans la tester une requête de veille:&lt;/p> &lt;pre>&lt;code>&amp;quot;(église|paroisse) (protestante|réformée)&amp;quot; site:.ch -site:eren.ch -site:eerv.ch &lt;/code>&lt;/pre> &lt;p>Vous avez compris:&lt;/p> &lt;ul> &lt;li>je souhaite une des 4 expressions dont j’ai parlé avant&lt;/li> &lt;li>sur un site «en principe suisse» (en &lt;code>.ch&lt;/code>)&lt;/li> &lt;li>mais pas sur les sites de l’EREN ou de l’EERV&lt;/li> &lt;/ul> &lt;p>Ajoutez une requête de ce type dans les &lt;a href="https://www.google.ch/alerts?hl=fr">alertes Google&lt;/a>, puis faites-vous envoyer un mail (ou abonnez-vous par RSS)! C’est redoutablement efficace.&lt;/p> &lt;hr> &lt;p>Évidemment, pour faire des tests sur votre propre site, il faut qu’il soit bien indexé par Google. C’est aussi un moyen de tester son référencement.&lt;/p> &lt;hr> &lt;p>Besoin de compléments? Problèmes à établir une requête précise? Souhait d’une formation? Contactez-moi!&lt;/p></description></item><item><title>Logique cumulative ou qualitative</title><link>https://nicolasfriedli.ch/blog/logique-cumulative-qualitative/</link><pubDate>Thu, 21 Nov 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/logique-cumulative-qualitative/</guid><description>&lt;p>Ce site est construit selon une logique de blog: &lt;strong>j’accumule du contenu&lt;/strong>. Chaque nouvelle publication est ajoutée dans la même rubrique. Il existe quelques taxonomies qui permettent de lier les pages entre elles par thématiques.&lt;/p> &lt;p>Mais je m’interroge et hésite à créer un site hiérarchique. Avec une idée derrière la tête: &lt;strong>maintenir à jour un corpus&lt;/strong> de taille raisonnable.&lt;/p> &lt;h2 id="le-modele-cumulatif">Le modèle cumulatif&lt;/h2> &lt;p>Les &lt;strong>sites cumulatifs&lt;/strong> par excellence sont les blogs et les sites d’actualités. L’intervention principale sur le site est l’ajout d’une nouvelle page. Et parfois l’ajout «à la volée» de nouvelles taxonomies.&lt;/p> &lt;p>Si je qualifie ce modèle de «cumulatif», cela ne dit rien de la qualité des contenus publiés. Mais plutôt l’idée qu’&lt;strong>une page en ligne est rarement modifiée&lt;/strong>.&lt;/p> &lt;p>Le blog est efficace et pertinent pour mettre en ligne des contenus «terminés». Il n’y a pas de raison de les revoir à l’avenir, parce qu’ils ont été délivrés tels quels. Bien entendu, la correction de coquilles ou de liens est toujours possible.&lt;/p> &lt;p>À mes yeux, le risque principal de ce type de publication est la cannibalisation des contenus. Je me vois mal publier 10 pages sur l’&lt;a href="https://nicolasfriedli.ch/blog/police-optimisee-titres/">optimisation des polices d’écriture&lt;/a> au fil du temps. Si 9 billets sont dépassés, à quoi bon les conserver.&lt;/p> &lt;p>Le message que donne un blog, c’est:&lt;/p> &lt;blockquote> &lt;p>Vous trouvez ici du contenu «dans son jus», tel qu’il a existé à un moment, et c’est ce qui fait sa saveur. Il n’est peut-être plus pertinent, mais ce n’est pas la question. Servez-vous si cela vous intéresse.&lt;/p>&lt;/blockquote> &lt;h2 id="le-modele-qualitatif">Le modèle qualitatif&lt;/h2> &lt;p>Les &lt;strong>sites qualitatifs&lt;/strong> sont avant tout des documentations et des wiki. Les interventions sont souvent des corrections et améliorations de pages existantes.&lt;/p> &lt;p>Généralement, les wiki ne contiennent pas de taxonomies. Et l’ajout de catégories dans les sites hiérarchiques (en arbre) est non trivial.&lt;/p> &lt;p>Si je qualifie ce modèle de «qualitatif», cela ne signifie pas que chaque contenu sera de qualité. Mais plutôt que &lt;strong>la qualité d’un contenu donné sera améliorée au fil du temps&lt;/strong>.&lt;/p> &lt;p>Lorsque je documente du code, je constate que la logique du blog n’est pas toujours la bonne. Les outils changent et il y a un grand risque de garder en ligne des extraits caducs ou dépassés.&lt;/p> &lt;p>Je préfère avoir 1 billet sur un sujet et le corriger quand nécessaire.&lt;/p> &lt;p>Le message que donne un site qualitatif:&lt;/p> &lt;blockquote> &lt;p>Vous trouvez ici un contenu utilisable aujourd’hui. Son histoire n’est pas (immédiatement) visible. Mais ce qui compte, c’est sa pertinence actuelle.&lt;/p>&lt;/blockquote> &lt;h2 id="eviter-les-absolus">Éviter les absolus&lt;/h2> &lt;p>Bien évidemment, aucun de ces modèles n’est parfait. Certains billets de blog sont corrigés, maintenus, réactualisés, parfois avec une republication ou une redirection.&lt;/p> &lt;p>Alors que le modèle hiérarchique n’empêche en rien l’ajoute régulier de contenus. Et il n’est pas certain que tous les articles seront parfaitement à jour.&lt;/p> &lt;p>La question que je me pose, c’est celle de l’&lt;strong>orientation fondamentale&lt;/strong> de mon site ou de sa &lt;strong>ligne de conduite&lt;/strong>.&lt;/p> &lt;p>Mon billet sur les &lt;a href="https://nicolasfriedli.ch/blog/hugo-pages-soeurs-filles/">pages sœurs, filles et mère&lt;/a>, utilisées dans d’autres contextes, me titille. J’aimerais bien réussir à proposer des navigations contextuelles plus intéressantes que les seuls «articles en relation» de bas de page.&lt;/p> &lt;h2 id="avantages-et-desavantages-techniques">Avantages et désavantages techniques&lt;/h2> &lt;p>Techniquement, le modèle qualitatif me paraît offrir quelques avantages:&lt;/p> &lt;ul> &lt;li>la possibilité de disposer d’un fil d’Ariane ou &lt;em>breadcrumb&lt;/em> qui permet de &lt;strong>se situer sur le site&lt;/strong>&lt;/li> &lt;li>l’utilisation d’&lt;strong>URL hiérarchiques&lt;/strong> est intéressante pour l’étude des données statistiques&lt;/li> &lt;li>la structuration de «secteurs» permet d’envisager simplement des &lt;strong>mises en pages différenciées&lt;/strong>&lt;/li> &lt;li>la &lt;strong>croissance organique du site&lt;/strong> est une manière de faire que j’apprécie&lt;/li> &lt;/ul> &lt;p>Mais ce modèle hiérarchique, en arbre, a aussi des limitations:&lt;/p> &lt;ul> &lt;li>&lt;strong>une page fait partie d’une seule rubrique&lt;/strong>, ce qui demande pas mal de réflexions du point de vue de l’architecture d’information&lt;/li> &lt;li>&lt;strong>l’utilisation des taxonomies est relativisée&lt;/strong>, alors que c’est un mode de pensée qui me convient&lt;/li> &lt;li>l’automatisation des navigations fait toujours courir le risque de proposer &lt;strong>moins de liens dans le corps du texte&lt;/strong> (pour éviter les doublets)&lt;/li> &lt;/ul> &lt;hr> &lt;p>Je reçois volontiers vos retours et conseils par &lt;em>webmention&lt;/em> ou par mail. Ou, mieux encore, dans un billet ajouté à votre propre blog.&lt;/p></description></item><item><title>Pages sœurs, filles et mère avec Hugo</title><link>https://nicolasfriedli.ch/blog/hugo-pages-soeurs-filles/</link><pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/hugo-pages-soeurs-filles/</guid><description>&lt;p>Dans un site hiérarchique construit avec Hugo, il est facile de se créer des &lt;em>shortcodes&lt;/em> ou des &lt;em>partials&lt;/em> pour afficher une navigation contextuelle. Je considère que le site est construit avec des répertoires et des pages &lt;code>_index.md&lt;/code> dans chaque répertoire.&lt;/p> &lt;p>C’est idéal pour construire automatiquement le maillage interne d’un cocon sémantique «à l’ancienne»:&lt;/p> &lt;ul> &lt;li>lien vers la page mère en haut de page&lt;/li> &lt;li>lien vers les pages sœurs en bas de page&lt;/li> &lt;li>et éventuellement des liens vers les pages filles dans le corps du texte (si ce n’est pas fait manuellement, ce qui est meilleur)&lt;/li> &lt;/ul> &lt;p>Des codes plus évolués sont disponibles dans certaines de &lt;a href="https://github.com/nfriedli/">mes dépôts GitHub&lt;/a>.&lt;/p> &lt;h2 id="shortcode-ou-partial">&lt;em>Shortcode&lt;/em> ou &lt;em>partial&lt;/em>&lt;/h2> &lt;p>La distinction entre les 2 doit être claire pour vous avant de vous lancer. Si ce n’est pas le cas, il ne vaut pas la peine d’aller plus loin. Mieux vaut lire la documentation d’Hugo: &lt;a href="https://gohugo.io/content-management/shortcodes/">Shortcodes&lt;/a> et &lt;a href="https://gohugo.io/templates/partial/">Partial templates&lt;/a>.&lt;/p> &lt;p>Un &lt;em>shortcode&lt;/em> est appelé &lt;strong>dans la source de la page en Markdown&lt;/strong>, avec un code de ce type, disponible pour les rédacteurs et rédactrices:&lt;/p> &lt;pre tabindex="0">&lt;code>{{&amp;lt; sisters &amp;gt;}} &lt;/code>&lt;/pre>&lt;p>Les &lt;em>shorcodes&lt;/em> ont un &lt;strong>avantage&lt;/strong>: ils peuvent être appelés n’importe où dans le &lt;strong>contenu&lt;/strong> de la page (corps de l’article). Par exemple un liste de billets entre 2 paragraphes. Ils ont un &lt;strong>inconvénient&lt;/strong>: il faut les appeler à chaque fois.&lt;/p> &lt;p>Un &lt;em>partial&lt;/em> est appelé &lt;strong>dans un &lt;em>template&lt;/em> de page&lt;/strong>, avec un code de type, disponibles pour les «programmeurs» et «programmeuses»:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ partial &amp;#34;header&amp;#34; . }} &lt;/code>&lt;/pre>&lt;p>Les &lt;em>partials&lt;/em> ont un &lt;strong>avantage&lt;/strong>: ils peuvent être appelés systématique &lt;strong>hors du contenu&lt;/strong> de la page (corps de l’article). Par exemple en pied de page ou comme liste de pages sous l’article. Ils ont un &lt;strong>inconvénient&lt;/strong>: les variations au cas par cas ne sont pas triviales.&lt;/p> &lt;h2 id="pages-filles-sous-pages-ou-niveau-inferieur">Pages filles (sous-pages ou niveau inférieur)&lt;/h2> &lt;h3 id="affichage-des-pages-filles-avec-un-shortcode">Affichage des pages filles avec un &lt;em>shortcode&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/shortcodes/subpages.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;ul&amp;gt; {{ range page.Pages }} &amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt;{{ .LinkTitle }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; {{ end }} &amp;lt;/ul&amp;gt; &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{&amp;lt; subpages &amp;gt;}}&lt;/code>.&lt;/p> &lt;p>Comme il n’est pas certain que des pages filles existent, on peut ajouter une condition sur la présence de pages. Ou ne jamais utiliser ce &lt;em>shortcode&lt;/em> quand il n’y a pas de filles.&lt;/p> &lt;h3 id="affichage-des-pages-filles-avec-un-partial">Affichage des pages filles avec un &lt;em>partial&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/partials/subpages.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;ul&amp;gt; {{ range .Pages }} &amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt;{{ .LinkTitle }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; {{ end }} &amp;lt;/ul&amp;gt; &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{ partial &amp;quot;subpages&amp;quot; . }}&lt;/code>. Avec le point qui transmet le &lt;a href="https://www.regisphilibert.com/blog/2018/02/hugo-the-scope-the-context-and-the-dot/">contexte&lt;/a>!&lt;/p> &lt;p>Comme il n’est pas certain que des pages filles existent, il &lt;strong>faut&lt;/strong> ajouter une condition sur la présence de pages pour ne pas créer une liste vide.&lt;/p> &lt;h2 id="pages-surs-meme-niveau">Pages sœurs (même niveau)&lt;/h2> &lt;h3 id="affichage-des-pages-surs-avec-un-shortcode">Affichage des pages sœurs avec un &lt;em>shortcode&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/shortcodes/sisters.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ with page.Parent }} &amp;lt;ul&amp;gt; {{ range .Pages }} &amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt;{{ .LinkTitle }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; {{ end }} &amp;lt;/ul&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{&amp;lt; sisters &amp;gt;}}&lt;/code>.&lt;/p> &lt;p>Quand une rubrique existe, c’est qu’elle comporte normalement plusieurs pages. Mais comme ce n’est pas une nécessité, le &lt;em>shortcode&lt;/em> n’est appelé que quand il y a plusieurs pages. Il faut alors l’ajouter sur toutes les nouvelles pages. Je conseille d’ajouter des conditions (par exemple pour ne pas mettre un lien sur la page courante).&lt;/p> &lt;h3 id="affichage-des-pages-surs-avec-un-partial">Affichage des pages sœurs avec un &lt;em>partial&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/partials/sisters.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ with .Parent }} &amp;lt;ul&amp;gt; {{ range .Pages }} &amp;lt;li&amp;gt; &amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt; {{ .LinkTitle }} &amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; {{ end }} &amp;lt;/ul&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{ partial &amp;quot;sisters&amp;quot; . }}&lt;/code>. Avec le point qui transmet le contexte!&lt;/p> &lt;p>Quand une rubrique existe, c’est qu’elle comporte normalement plusieurs pages. Je conseille d’ajouter des conditions (par exemple pour ne pas mettre un lien sur la page courante).&lt;/p> &lt;h2 id="page-mere-repertoire-ou-niveau-superieur">Page mère (répertoire ou niveau supérieur)&lt;/h2> &lt;h3 id="affichage-de-la-page-mere-avec-un-shortcode">Affichage de la page mère avec un &lt;em>shortcode&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/shortcodes/mother.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ with page.Parent }} &amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt;{{ .LinkTitle }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{&amp;lt; mother &amp;gt;}}&lt;/code>.&lt;/p> &lt;p>L’utilisation de &lt;code>with&lt;/code> ne provoquera l’affichage que si une page mère existe.&lt;/p> &lt;h3 id="affichage-de-la-page-mere-avec-un-partial">Affichage de la page mère avec un &lt;em>partial&lt;/em>&lt;/h3> &lt;p>Un fichier dans &lt;code>/layouts/partials/mother.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ with .Parent }} &amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt;{{ .LinkTitle }}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>On l’appelle par &lt;code>{{ partial &amp;quot;mother&amp;quot; . }}&lt;/code>. Avec le point qui transmet le contexte!&lt;/p> &lt;p>L’utilisation de &lt;code>with&lt;/code> ne provoquera l’affichage que si une page mère existe.&lt;/p> &lt;h2 id="conditions-utiles">Conditions utiles&lt;/h2> &lt;p>Je conseille d’ajouter certaines conditions d’affichage:&lt;/p> &lt;ul> &lt;li>affichage des pages sœurs uniquement s’il y a en a plus de 2 (la page présente et une autre page)&lt;/li> &lt;li>désactiver l’affichage de la page actuelle de la liste ou&lt;/li> &lt;li>désactiver le lien de la page actuelle dans la liste&lt;/li> &lt;/ul> &lt;p>Et aussi, tester le nombre de pages avant d’ouvrir un liste &lt;code>&amp;lt;ul&amp;gt;...&amp;lt;/ul&amp;gt;&lt;/code>.&lt;/p> &lt;p>Un exemple concret, que je vous invite à essayer de comprendre à la lecture:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ with .Parent }} {{ if gt (len .Pages ) 2 }} &amp;lt;aside&amp;gt; &amp;lt;strong&amp;gt;Ces contenus peuvent aussi vous intéresser:&amp;lt;/strong&amp;gt; &amp;lt;ul&amp;gt; {{ range .Pages }} {{ if ne .Page page }} &amp;lt;li&amp;gt; &amp;lt;a href=&amp;#34;{{ .RelPermalink }}&amp;#34;&amp;gt; {{ .LinkTitle }} &amp;lt;/a&amp;gt; &amp;lt;/li&amp;gt; {{ end }} {{ end}} &amp;lt;/ul&amp;gt; &amp;lt;/aside&amp;gt; {{ end }} {{ end }} &lt;/code>&lt;/pre>&lt;p>Je suis disponible pour vous aider à écrire vos conditions au cas par cas.&lt;/p></description></item><item><title>Philosophie d’optimisation raisonnable</title><link>https://nicolasfriedli.ch/blog/optimisation-raisonnable/</link><pubDate>Sat, 26 Oct 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/optimisation-raisonnable/</guid><description>&lt;p>À force de consulter des sites de développement, il est facile de se perdre dans des tests numériques et des solutions techniques. Mais il me paraît utile de formuler aussi les questions d’optimisation, de performance et d’éco-conception en langage naturel.&lt;/p> &lt;p>Cette idée de langage humain m’est venue en consultant la documentation de &lt;a href="https://github.com/tdewolff/minify">minify&lt;/a>. &lt;code>minify&lt;/code> permet d’optimiser les pages produites par &lt;a href="https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/">Hugo&lt;/a>.&lt;/p> &lt;p>Dans chaque passage, je proposerai des citations qui devraient rendre le contenu de cette page à des internautes non techniques.&lt;/p> &lt;h2 id="formuler-les-resultats-de-tests-en-langage-naturel">Formuler les résultats de tests en langage naturel&lt;/h2> &lt;p>&lt;code>minify&lt;/code> propose une comparaison de performances (benchmark) pour différents outils. En première lecture, je peux comparer les résultats de &lt;a href="https://github.com/tdewolff/minify?tab=readme-ov-file#compression-ratio-lower-is-better">taille&lt;/a> et définir un classement.&lt;/p> &lt;p>Mais à y regarder de plus près, il n’est pas certain que ce classement soit toujours identique. Une moyenne des résultats n’est pas probante, parce qu’il faudrait prendre le meilleur outil &lt;em>dans un cas précis&lt;/em>. L’épuisement guette.&lt;/p> &lt;p>Maintenant, je formule la chose en langage humain ou naturel:&lt;/p> &lt;blockquote> &lt;p>Les 5 outils testés permettent de gagner entre 40% et 70% de taille de fichier de manière automatique. Pour un fichier donné, le 5 outils obtiennent des résultats analogues (à 1% près). Ils sont tous excellents.&lt;/p>&lt;/blockquote> &lt;p>Vue ainsi, le classement n’a plus beaucoup de sens!&lt;/p> &lt;p>Alors on peut ajouter la question du &lt;a href="https://github.com/tdewolff/minify?tab=readme-ov-file#time-lower-is-better">temps&lt;/a> nécessaire à l’optiomisation.&lt;/p> &lt;p>Et là, en langage naturel, il faudrait dire:&lt;/p> &lt;blockquote> &lt;p>Pour produire des fichiers de taille analogue, certains outils sont plusieurs centaines de fois plus lents que d’autres.&lt;/p>&lt;/blockquote> &lt;p>C’est là que &lt;code>minify&lt;/code> excelle. Il est certes peut-être moins &lt;em>efficace&lt;/em> de 1%, mais jusqu’à 500 fois plus rapide. Il est alors question d’&lt;em>efficience&lt;/em>, l’efficacité rapportée au coût (temporel).&lt;/p> &lt;h2 id="eviter-les-erreurs">Éviter les erreurs&lt;/h2> &lt;p>Il y a quelques semaines, j’ai découvert une image de 70MB(!) sur une page d’accueil d’un site. C’est un fichier gigantesque qui pose de vrais problèmes. Elle s’afficherait sans différence sensible en étant 500 fois plus légères.&lt;/p> &lt;p>Quels que soient les efforts sur une telle page, tous est cassé par 1 fichier problématique. C’est pourquoi il faut toujours &lt;a href="https://nicolasfriedli.ch/blog/tester-site/">tester régulièrement son site web&lt;/a>. J’ai découvert l’horreur par un contrôle régulier avec &lt;a href="https://www.speedlify.dev/">speedlify&lt;/a> que je conseille.&lt;/p> &lt;p>Donc, en français:&lt;/p> &lt;blockquote> &lt;p>Avant même de chercher à optimiser, il vaut la peine de détecter des erreurs manifestes qui annihilent tous les efforts&lt;/p>&lt;/blockquote> &lt;h2 id="se-demander-ce-qui-est-necessaire">Se demander ce qui est nécessaire&lt;/h2> &lt;p>Des tests montrent &lt;a href="https://github.com/cnumr/best-practices/blob/main/chapters/BP_001_fr.md">que 70% des fonctionnalités demandées par les utilisateurs ne sont pas essentielles et que 45% ne sont jamais utilisées&lt;/a>. Dès lors, il faut se demander sérieusement ce qui est vraiment nécessaire.&lt;/p> &lt;p>Le fichier qui coût le moins du point de vue de la performance est celui qui n’est pas hébergé sur un serveur, qui ne transite pas par le réseau et qui n’est pas interprété par le périphérique final.&lt;/p> &lt;p>Avant d’utiliser une police d’écriture spécifique, je devrais me demander sur une &lt;a href="https://nicolasfriedli.ch/blog/polices-systeme/">police disponible&lt;/a> n’est pas suffisante.&lt;/p> &lt;blockquote> &lt;p>Avant de passer à une phase d’optimisation, il vaut la peine de se poser la question de la nécessité des outils proposés. Un fichier qui n’est pas envoyé n’a aucun coût écologique ou temporel.&lt;/p>&lt;/blockquote> &lt;p>Cette réflexion est valable pour les polices, pour les images, pour les encarts des réseaux sociaux.&lt;/p> &lt;h2 id="optimiser-avec-efficacite">Optimiser avec efficacité&lt;/h2> &lt;p>Si j’estime qu’une police spécifique est nécessaire, alors j’essaierai de faire les choses dans les règles de l’art. J’en parle dans &lt;a href="https://nicolasfriedli.ch/blog/police-optimisee-titres/">Police optimisée pour les titres&lt;/a>.&lt;/p> &lt;p>Dès que l’on entre dans cette phase d’optimisation, on peut se prendre au jeu et essayer d’être le plus efficace possible. C’est de bonne guerre.&lt;/p> &lt;p>Mais quand les gains entre 2 techniques ou tactiques sont minimes, il faut dire:&lt;/p> &lt;blockquote> &lt;p>La meilleure efficacité est souhaitable, mais n’est pas toujours la meilleure solution.&lt;/p>&lt;/blockquote> &lt;h2 id="favoriser-lefficience">Favoriser l’efficience&lt;/h2> &lt;p>C’est pourquoi je cherche à toujours favoriser l’efficience. C’est ce que me propose &lt;code>minify&lt;/code>, dont je parle en haut de page. Je n’ai rien à installer, rien à configurer, c’est rapide et j’obtiens un résultat excellent (mais pas forcément le meilleur possible). Donc:&lt;/p> &lt;blockquote> &lt;p>L’efficience (efficacité à moindre coût) est l’optimisation la plus raisonnable.&lt;/p>&lt;/blockquote> &lt;p>C’est là que l’on passe de la pure question technique à une question philosophique. Quand on est dans des questions de rapports entre coût et résultats, on entre dans le domaine de l’appréciation. Et, finalement, du choix.&lt;/p> &lt;h2 id="samuser-du-snobisme">S’amuser du snobisme&lt;/h2> &lt;p>Comme la performance web me passionne, je cherche à toujours obtenir le meilleur résultat possible. C’est pourquoi &lt;a href="https://nicolasfriedli.ch/about/">ce site est hyper rapide&lt;/a>.&lt;/p> &lt;p>Mais, d’une certaine manière, utiliser une mise en page simpliste, renoncer aux images et ne pas utiliser de polices spécifiques est une forme de snobisme. Au fond, je m’enorgueillis d’obtenir des &lt;a href="https://pagespeed.web.dev/analysis/https-nicolasfriedli-ch/zdziqsc5vj?form_factor=mobile">résultats parfaits dans PageSpeed Insights&lt;/a>. C’est une forme de snobisme.&lt;/p> &lt;blockquote> &lt;p>La volonté d’obtenir le meilleur résultat à tout prix est un exercice utile pour les développeurs. La compétition stimule la recherche. Mais c’est rarement un objectif de la pratique réelle.&lt;/p>&lt;/blockquote> &lt;p>J’ai effectué des &lt;a href="https://nicolasfriedli.ch/bio/">mandats dans des domaines très différents&lt;/a>. Mais la constante est que le meilleur résultat à tout prix n’est pas leur première préoccupation.&lt;/p> &lt;p>Ensemble, nous obtenons des produits raisonnablement optimisés parce que nous prenons le temps de discuter des enjeux de fond. Nous arbitrons entre le souhaitable, l’utile, le nécessaire ou ce qu’il convient d’éviter à tout prix. Ces tensions et ces négociations nous font discuter de questions sérieuses. Et parfois philosophiques.&lt;/p></description></item><item><title>Mes règles d’utilisation des réseaux sociaux</title><link>https://nicolasfriedli.ch/blog/reseaux-sociaux-regles/</link><pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/reseaux-sociaux-regles/</guid><description>&lt;p>Lorsque je donnais des formations aux réseaux sociaux il y a bien plus de 10 ans, je conseillais toujours aux internautes de réfléchir à leurs propres règles au calme. Quand un problème survient, il est trop tard pour mener une réflexion posée quant à la meilleure façon d’agir.&lt;/p> &lt;p>Le point de départ de la discussion était presque toujours une question pratique sur la modération d’une page institutionnelle. Je donnais alors quelques règles simples.&lt;/p> &lt;h2 id="regles-de-moderation">Règles de modération&lt;/h2> &lt;p>Pour modérer correctement une page Facebook, un forum, un espace Discord, il faut poser des règles limpides. Et quand la modération se fait à plusieurs, il faut s’entendre sur ces règles. Quand il y a incohérence dans la modération, c’est la porte ouverte aux conflits.&lt;/p> &lt;p>Les règles que je donnais comme point de départ étaient:&lt;/p> &lt;ul> &lt;li>&lt;strong>Le refus de toute attaque personnelle.&lt;/strong> La discussion porte sur des arguments, non sur des personnes.&lt;/li> &lt;li>&lt;strong>La suppression de tout ce qui contrevient à la loi.&lt;/strong> À faire sans délai et sans avertissement, mais avec possibilité de laisser une note.&lt;/li> &lt;li>&lt;strong>Le refus des répétitions.&lt;/strong> Ce n’est pas en répétant 10 ou 20 fois la même chose que ça devient vrai. Des internautes qui tournent en rond peuvent tuer un forum ou un page Facebook en lassant les autres.&lt;/li> &lt;li>&lt;strong>La suppression des contenus hors sujet.&lt;/strong> On ne laisse pas les vendeurs de savons bio poster leur annonce sur une page Facebook qui parle de droit du bail.&lt;/li> &lt;/ul> &lt;p>Quand il y a un souci, appliquez-les de la manière la plus mécanique possible!&lt;/p> &lt;p>Ensuite, vous pouvez en débattre, les modifier, etc., mais sans urgence.&lt;/p> &lt;h2 id="reglages-de-confidentialite">Réglages de confidentialité&lt;/h2> &lt;p>Facebook permet de nombreux réglages de confidentialité. Qui a le droit de faire quoi?&lt;/p> &lt;p>J’ai toujours adopté une posture pragmatique: &lt;strong>tout ce qui est posté sur Facebook est public.&lt;/strong>&lt;/p> &lt;p>Essayer de «protéger» des contenus est vain, parce que les options changeront, parce que vous aurez fait une erreur dans un règlage, parce qu’il y aura une faille technique.&lt;/p> &lt;p>Cette politique de &lt;em>tout public&lt;/em> est n’est pas une option de configuration, mais une attitude. C’est facile, clair, et ça fonctionne dans la durée:&lt;/p> &lt;blockquote> &lt;p>Si ce contenu ne peut pas être rendu public, alors ne le poste pas sur Facebook. Point.&lt;/p>&lt;/blockquote> &lt;h2 id="mes-bonnes-pratiques">Mes bonnes pratiques&lt;/h2> &lt;p>&lt;strong>Je n’ai plus d’activité sur les réseaux sociaux.&lt;/strong>&lt;/p> &lt;p>Désormais, à titre personnel, j’adopte les pratiques suivantes:&lt;/p> &lt;ol> &lt;li>Je partage des liens, donc des contenus disponibles ailleurs sur le web.&lt;/li> &lt;li>J’évite les interactions sous forme de simple clic (&lt;em>J’aime&lt;/em> et compagnie).&lt;/li> &lt;li>Je ne commente rien (ni sur ma page de profil, ni sur des comptes personnels, ni sur des pages).&lt;/li> &lt;li>Je supprime les commentaires problématiques sur ma page de profil.&lt;/li> &lt;li>Je nettoie régulièrement ma page de profil.&lt;/li> &lt;/ol> &lt;p>Pour un argumentaire intéressant sur le refus du &lt;em>Like&lt;/em> et du commentaire court, je vous invite à lire &lt;em>Digital Minimalism: Choosing a Focused Life in a Noisy World&lt;/em> de &lt;a href="https://calnewport.com/">Cal Newport&lt;/a>.&lt;/p> &lt;p>Pour commenter, envoyez-moi un mail!&lt;/p></description></item><item><title>Less is more</title><link>https://nicolasfriedli.ch/blog/less-is-more/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/less-is-more/</guid><description>&lt;p>Moins, c’est plus! Un magnifique slogan. Mais moins de quoi pour plus de quoi? Je remets en ligne un ancien billet publié il y a quelques années.&lt;/p> &lt;p>On ne va pas refaire la genèse de la phrase. Un détour sur la page Wikipédia en allemand &lt;a href="https://de.wikipedia.org/wiki/Weniger_ist_mehr">Weniger ist mehr&lt;/a> est un point d’entrée intéressant pour toutes les propositions d’oxymores similaires. Laissons à &lt;a href="https://fr.wikipedia.org/wiki/Ludwig_Mies_van_der_Rohe">Ludwig Mies van der Rohe&lt;/a> la popularisation de l’idée sans chercher à documenter les détails de sa genèse.&lt;/p> &lt;p>Ce slogan me plaît, mais je me demande souvent pourquoi. Peut-être parce qu’il y a plusieurs manières de le comprendre et de l’appliquer :&lt;/p> &lt;ul> &lt;li>Dans le milieu architectural, c’est le &lt;a href="https://fr.wikipedia.org/wiki/Minimalisme_(art)">minimalisme&lt;/a>. Et, dans une certaine mesure, le &lt;a href="https://fr.wikipedia.org/wiki/Brutalisme">brutalisme&lt;/a> ou le &lt;a href="https://fr.wikipedia.org/wiki/Fonctionnalisme_(architecture)">fonctionnalisme&lt;/a>.&lt;/li> &lt;li>Dans notre vie quotidienne, c’est ce qu’incarne Apple. Une entreprise qui plonge ses racines dans &lt;a href="https://www.cultofmac.com/188753/the-braun-products-that-inspired-apples-iconic-designs-gallery/">The Braun Products That Inspired Apple’s Iconic Designs&lt;/a> et les principes du &lt;em>bon design&lt;/em> de &lt;a href="https://fr.wikipedia.org/wiki/Dieter_Rams">Dieter Rams&lt;/a>.&lt;/li> &lt;li>Dans le domaine du web, ce sont les sites sites simples et lisibles (comme nicolasfriedli.ch).&lt;/li> &lt;li>Dans le domaine du web encore, c’est la page &lt;a href="https://justinjackson.ca/words_fr.html">Ceci est une page Web&lt;/a>.&lt;/li> &lt;/ul> &lt;p>Si j’essaie de reformuler, &lt;em>Less is more&lt;/em>, ce peut être :&lt;/p> &lt;ul> &lt;li>moins d’images, plus de contenu&lt;/li> &lt;li>moins de textes, des images&lt;/li> &lt;li>moins de détours, passer à l’essentiel&lt;/li> &lt;li>moins de &lt;a href="https://nicolasfriedli.ch/blog/metadiscours/">métadiscours&lt;/a>, plus de concret&lt;/li> &lt;li>moins de fonctions, des fonctions utiles&lt;/li> &lt;li>moins de graphisme, plus de design&lt;/li> &lt;li>moins de déco, plus de typo (voir: &lt;a href="https://ia.net/topics/the-web-is-all-about-typography-period">Web Design is 95% Typography&lt;/a>)&lt;/li> &lt;li>moins de lourdeurs, plus d’efficacité&lt;/li> &lt;li>moins d’explications, plus d’émotions&lt;/li> &lt;li>moins de «toujours plus de la même chose», du changement (voir: &lt;a href="https://www.lalibre.be/debats/opinions/2019/08/16/pourquoi-il-faut-relire-watzlawick-XGB3ZLOUNVH6VIDXF63BELGFL4/">Pourquoi il faut relire Watzlawick&lt;/a>)&lt;/li> &lt;li>moins de planification, des faits&lt;/li> &lt;/ul> &lt;p>Je crois que j’aime bien cette expression, mais si je ne sais toujours pas ce qu’elle signifie. Pour la route, une citation de &lt;em>Terre des hommes&lt;/em> d’Antoine de Saint-Exupéry:&lt;/p> &lt;blockquote> &lt;p>Il semble que la perfection soit atteinte non quand il n’y a plus rien à ajouter, mais quand il n’y a plus rien à retrancher. Au terme de son évolution, la machine se dissimule.&lt;/p>&lt;/blockquote></description></item><item><title>Sur le protocole Gemini</title><link>https://nicolasfriedli.ch/blog/gemini/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/gemini/</guid><description>&lt;p>Mes remarques sur le protocole Gemini qui propose une alternative au web devenu complexe, lourd et qui nous traque en permanence. Les observations de départ sont bonnes, mais le résultat ne me convainc pas.&lt;/p> &lt;p>⚠️ Ce billet ne parle pas du chatbot de Google!&lt;/p> &lt;h2 id="premiere-approche">Première approche&lt;/h2> &lt;p>Une explication simple (mais avec des d’erreurs):&lt;/p> &lt;blockquote> &lt;p>Gemini, c’est un site web très simple, avec des éléments HTML limités, qui demande peu de ressources, respecte votre vie privée et est facile à mettre en œuvre.&lt;/p>&lt;/blockquote> &lt;p>Parce que dans la réalité, Gemini:&lt;/p> &lt;ul> &lt;li>n’est pas sur le web (mais dans un «monde parallèle»)&lt;/li> &lt;li>n’est pas codé en HTML (mais dans un Markdown simplifé)&lt;/li> &lt;li>n’est pas trivial à mettre en œuvre&lt;/li> &lt;/ul> &lt;p>Ce passage résume tout le problème. Présenté en une phrase, ça fait rêver. Mais dès que l’on entre dans les détails, ça devient complexe à vulgariser.&lt;/p> &lt;h2 id="presentation-de-gemini">Présentation de Gemini&lt;/h2> &lt;p>Pour comprendre techniquement Gemini, il faut se rendre à l’adresse:&lt;/p> &lt;p>&lt;a href="gemini://geminiprotocol.net/docs/specification.gmi">gemini: //geminiprotocol.net/docs/specification.gmi&lt;/a>&lt;/p> &lt;p>Clic. Rien ne se passe. Comme Gemini n’est pas le web, le navigateur habituel ne permet pas d’ouvrir la page. Une adresse qui commence par &lt;code>gemini://&lt;/code>, ce n’est pas fait pour un navigateur web.&lt;/p> &lt;p>Dans Firefox, Safari ou Chrome, il faut choisir une version web du site. Dans le cas présent, cette version &lt;code>https://&lt;/code> existe:&lt;/p> &lt;p>&lt;a href="https://geminiprotocol.net/docs/specification.gmi">https://geminiprotocol.net/docs/specification.gmi&lt;/a>&lt;/p> &lt;p>Et là, un site apparaît. Mais pas besoin de le lire pour le moment.&lt;/p> &lt;h3 id="un-protocole">Un protocole&lt;/h3> &lt;p>Gemini, c’est donc un protocole: &lt;code>gemini://&lt;/code>. Un protocole de communication, c’est un ensemble de règles de fonctionnement entre un serveur et un client (ici un navigateur).&lt;/p> &lt;p>Les informations qui transitent &lt;code>gemini://&lt;/code> sont très limitées pour éviter le flicage, la publicité ciblée, etc.&lt;/p> &lt;p>Il vous faudra donc un navigateur spécial capable d’utiliser ce protocole. Par exemple &lt;a href="https://gmi.skyjake.fi/lagrange/">Lagrange&lt;/a> en version graphique.&lt;/p> &lt;p>Stéphane Bortzmeyer en dit bien plus dans la première partie de: &lt;a href="https://www.bortzmeyer.org/gemini.html">Le protocole Gemini, revenir à du simple et sûr pour distribuer l’information en ligne?&lt;/a>.&lt;/p> &lt;h3 id="une-syntaxe">Une syntaxe&lt;/h3> &lt;p>Gemini, c’est aussi une syntaxe: gemtext.&lt;/p> &lt;p>Pour faire simple, c’est un &lt;a href="https://commonmark.org/">Markdown&lt;/a> simplifié qui conserve:&lt;/p> &lt;ul> &lt;li>des paragraphes sans formatage&lt;/li> &lt;li>des listes à puces (non imbriquées)&lt;/li> &lt;li>des titres (sur 3 niveaux)&lt;/li> &lt;li>des liens (seuls sur une ligne)&lt;/li> &lt;li>des citations&lt;/li> &lt;li>du texte préformaté&lt;/li> &lt;/ul> &lt;p>La page transférée, c’est un fichier &lt;code>.gmi&lt;/code>, et rien d’autre. Il n’y a pas de feuille de style CSS, pas de JavaScript, pas même de métadonnées (comme une date de publication).&lt;/p> &lt;p>Une page, c’est donc un seul fichier envoyé, puis la mise en page sera faite par le navigateur (s’il le souhaite).&lt;/p> &lt;h2 id="ce-que-je-retiens-de-gemini">Ce que je retiens de Gemini&lt;/h2> &lt;p>Je reprends ces lignes d’une note écrite il y a quelques années, parce que rien n’a vraiment changé.&lt;/p> &lt;ul> &lt;li>&lt;strong>L’importance du texte sur le web.&lt;/strong> Le texte est et reste un magnifique véhicule de contenu, surtout quand il est bien structuré par des intertitres. Il peut être lu sur n’importe quel périphérique, agrandi, copié-collé, dit par une synthèse vocale, etc.&lt;/li> &lt;li>&lt;strong>Les liens sur une seule ligne.&lt;/strong> L’obligation de proposer des liens sur une ligne (sans autre contenu), valorise l’hypertexte. En les mettant ainsi en valeur, ils sont facilement visibles. Les URL publiées seules incitent à créer des adresses immédiatement compréhensibles. Et on évitera peut-être les terribles: cliquez &lt;em>ici&lt;/em>.&lt;/li> &lt;li>&lt;strong>L’absence de menus.&lt;/strong> En imposant tous les liens dans le corps de la page (il n’existe rien d’autre que le &lt;em>corps&lt;/em> de la page), le rapport entre contenus et pages cibles est valorisé. Les &lt;em>méga menus&lt;/em>, palliatifs de mauvaises structures de site, sont bannis de fait.&lt;/li> &lt;li>&lt;strong>La mise ne page côté client.&lt;/strong> C’est le navigateur qui &lt;em>esthétise&lt;/em> la page, et j’adore ça. Je souhaite que les internautes installent de bonnes polices sur leurs systèmes et configurent leurs navigateurs. Le web aurait tout intérêt à utiliser un peu plus les &lt;a href="https://nicolasfriedli.ch/blog/polices-systeme/">polices déjà installées&lt;/a> sur les périphériques.&lt;/li> &lt;li>&lt;strong>Le retour du &lt;em>vieux web&lt;/em>.&lt;/strong> Après quelques tests de Gemini, je remarque combien il est perturbant de ne pas disposer de moteur de recherche. La navigation se fait de proche en proche; les favoris (&lt;em>bookmarks&lt;/em>) reprennent tout leur sens.&lt;/li> &lt;/ul> &lt;h2 id="pourquoi-gemini-ne-me-convient-pas">Pourquoi Gemini ne me convient pas&lt;/h2> &lt;p>Pourtant, après un nouvel essai, je ne suis toujours pas convaincu.&lt;/p> &lt;p>J’ai &lt;strong>installé un serveur&lt;/strong> &lt;a href="https://github.com/mbrubeck/agate">Agate&lt;/a> en 3 minutes sur un Raspeberry Pi et mis un site en ligne. Et ça fonctionne. Du côté du serveur, la promesse de simplicité est tenue.&lt;/p> &lt;p>En revanche, l’&lt;strong>installation d’un navigateur&lt;/strong> n’est pas aussi facile. Sur mon ordinateur Linux, c’est bon. Sur Android et iOS, il n’est pas possible de passer par les outils d’installation «normaux». Faire reposer la complexité sur les internautes ne me convient pas!&lt;/p> &lt;p>En naviguant dans l’écosystème Gemini, j’ai trouvé beaucoup de &lt;strong>serveurs et navigateurs non maintenus&lt;/strong>. On a l’impression que tout est en test, comme il y a quelques années.&lt;/p> &lt;p>&lt;strong>Est-ce que Gemini est vraiment léger?&lt;/strong> Est-ce que ce site en version Gemini sur mon Raspberry serait plus léger que la version HTML hébergée chez Infomaniak? Est-ce qu’il est vraiment pertinent d’installer un navigateur graphique de plus?&lt;/p> &lt;p>Et quand je lis Daniel Stenberg dans &lt;a href="https://daniel.haxx.se/blog/2023/05/28/the-gemini-protocol-seen-by-this-http-client-person/">The Gemini protocol seen by this HTTP client person&lt;/a>, je me dis que la &lt;strong>simplicité affichée&lt;/strong> n’est pas la réalité. Quand l’auteur de &lt;a href="https://curl.se/">curl://&lt;/a>, un des logiciels les plus utilisés au monde, soulève ce genre de questions, il me semble qu’il faut l’écouter.&lt;/p> &lt;p>Dans certains cas, Gemini est aussi un &lt;strong>moyen de fuir ses responsabilités&lt;/strong>. Proposer un site principal pourri, avec du JavaScript inutile partout, des traqueurs et des images qui clignotent. Puis publier une capsule Gemini à côté (avec très peu de contenus) pour afficher sa mesure et sa sobriété. Faire un bon site principal (unique) serait une meilleure idée.&lt;/p> &lt;p>Ploum (Lionel Dricot) est une des rares personnes à avoir complètement assumé le passage à Gemini. Il en parle dans &lt;a href="https://ploum.net/2022-12-04-fin-du-blog-et-derniere-version.html">La fin d’un blog et la dernière version de ploum.net&lt;/a>. Mais en pratique, c’est bien sa version web que je lis…&lt;/p></description></item><item><title>Notes sur les textes faciles à lire et à comprendre &amp; le langage clair</title><link>https://nicolasfriedli.ch/blog/falc-plain-ia/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/falc-plain-ia/</guid><description>&lt;p>Des notes et des liens sur les textes faciles à lire et à comprendre (FALC), sur le langage clair (PLAIN) et l’accessibilité (A11Y).&lt;/p> &lt;p>Ce billet (ni facile, ni clair&amp;hellip;) sera revu en fonction de mes découvertes et de vos remarques. Certains sujets seront développés dans d’autres articles en fonction de la demande.&lt;/p> &lt;h2 id="mise-en-bouche">Mise en bouche&lt;/h2> &lt;p>Extrait du &lt;em>Premier chant&lt;/em> de l’&lt;em>Art poétique&lt;/em> de Nicolas Boileau:&lt;/p> &lt;blockquote> &lt;p>Il est certains esprits dont les sombres pensées&lt;br> Sont d’un nuage épais toujours embarrassées;&lt;br> Le jour de la raison ne le saurait percer.&lt;br> Avant donc que d’écrire, apprenez à penser.&lt;/p> &lt;p>Selon que notre idée est plus ou moins obscure,&lt;br> L’expression la suit, ou moins nette, ou plus pure.&lt;br> Ce que l’on conçoit bien s’énonce clairement,&lt;br> Et les mots pour le dire arrivent aisément.&lt;/p>&lt;/blockquote> &lt;h2 id="contenus-en-falc">Contenus en FALC&lt;/h2> &lt;p>Voici 2 exemples réussis qui m’ont incité à aller plus loin:&lt;/p> &lt;ul> &lt;li>La ville de La Chaux-de-Fonds propose une &lt;a href="https://www.chaux-de-fonds.ch/ecoles-formations/ecole-obligatoire/documents-liens">brochure scolaire d’information aux parents en FALC&lt;/a>&lt;/li> &lt;li>Le Festival de bande dessinée de Lausanne (BDFIL) propose une &lt;a href="https://bdfil.ch/falc/">présentation en FALC&lt;/a>&lt;/li> &lt;/ul> &lt;p>Ces deux contenus me paraissent exemplaires. Ils donnent des informations précises et rapides. Je les trouve plus efficaces que les contenus «normaux».&lt;/p> &lt;h2 id="pour-demarrer">Pour démarrer&lt;/h2> &lt;ul> &lt;li>&lt;a href="https://www.unapei.org/publication/linformation-pour-tous-regles-europeennes-pour-une-information-facile-a-lire-et-a-comprendre/">L’information pour tous: Règles européennes pour une information facile à lire et à comprendre&lt;/a>&lt;/li> &lt;li>la conférence &lt;a href="https://www.paris-web.fr/2023/conference/-le-contenu-doit-etre-redige-de-la-maniere-la-plus-claire-et-la-plus-simple-possible-la-question-des-1">Le contenu doit être rédigé de la manière la plus claire et la plus simple possible: les textes dans l’accessibilité numérique&lt;/a> donnée par Morgane Hauguel à Paris Web 2023&lt;/li> &lt;li>ou celle de MiXiT 2024 par la même Morgane Hauguel: &lt;a href="https://mixitconf.org/2024/ce-que-l-on-concoit-bien-s-ecrit-clairement-les-textes-et-l-accessibilite-numerique">Ce que l’on conçoit bien s’écrit clairement: les textes et l’accessibilité numérique&lt;/a>&lt;/li> &lt;li>le billet &lt;a href="https://blog.whoz.me/non-classe/le-contenu-doit-etre-redige-clairement-retour-sur-la-conference-paris-web-2023/">Le contenu doit être rédigé clairement: retour sur la conférence Paris Web 2023&lt;/a> est un excellent complément&lt;/li> &lt;li>dans les propositions de liens du billet précédent: &lt;ul> &lt;li>&lt;a href="http://www.languefrancaise.cfwb.be/index.php?eID=tx_nawsecuredl&amp;amp;u=0&amp;amp;g=0&amp;amp;hash=7e8d6eebd9532a4185ac73e38cae4507a05048c3&amp;amp;file=fileadmin/sites/sgll/upload/lf_super_editor/publicat/collection-guide/ecrire-pour-etre-lu__interactif_.pdf">Écrire pour être lu. Comment rédiger des textes administratifs faciles à comprendre&lt;/a> (Wallonie)&lt;/li> &lt;li>&lt;a href="https://mcc.gouv.qc.ca/fileadmin/documents/publications/spl/rediger_simplement.pdf">Rédiger&amp;hellip; simplement. Principes et recommandations pour une langue administrative de qualité&lt;/a> (Québec)&lt;/li> &lt;/ul> &lt;/li> &lt;/ul> &lt;h2 id="analyse-de-lisibilite">Analyse de lisibilité&lt;/h2> &lt;ul> &lt;li>&lt;a href="https://www.scolarius.com/">Scholarius&lt;/a> est un outil gratuit d’analyse de la lisibilité des textes en français&lt;/li> &lt;li>Microsoft Word semble propose le &lt;a href="https://fr.wikipedia.org/wiki/Tests_de_lisibilit%C3%A9_Flesch-Kincaid">score Fleisch-Kincaid&lt;/a> dans ses statistiques&lt;/li> &lt;li>&lt;a href="#yoast">Yoast&lt;/a> pour WordPress donne d’office un score de lisibilité dans les statistiques de la page&lt;/li> &lt;/ul> &lt;h2 id="accessibilite">Accessibilité&lt;/h2> &lt;p>Les écritures simplifiées font partie du domaine plus large de l’accessibilité. Dans le domaine du web, je considère que l’accessibilité a au moins 4 composantes:&lt;/p> &lt;ul> &lt;li>l’accessibilité du contenu (dont on parle sur cette page)&lt;/li> &lt;li>la lisibilité du contenu (choix de la police, taille, contraste, interligne, longueur de lignes, etc.)&lt;/li> &lt;li>la structure du site (architecture d’information, navigation, complexité des pages, etc.)&lt;/li> &lt;li>la technique (validité du code, sémantique des balises HTML, ARIA, etc.)&lt;/li> &lt;/ul> &lt;h2 id="simplification-par-ia">Simplification par IA&lt;/h2> &lt;p>Mes recherches sont en cours suite à la demande d’une administration pour la simplification de certains contenus administratifs.&lt;/p> &lt;p>Je ne parle pas ici des questions de confidentialité, des questions écologiques, des problèmes éthiques, etc.&lt;/p> &lt;ul> &lt;li> &lt;p>La qualité du travail dépend de qualité des demandes adressées (prompts). Je propose quelques pistes de prompts.&lt;/p> &lt;/li> &lt;li> &lt;p>Une intelligence artificielle (IA) comme ChatGPT permet de simplifier des textes de manière efficace. Elle est souvent meilleure à la simplification qu’à la génération. Il faut tout faire pour éviter les délires et hallucinations, par exemple ainsi:&lt;/p> &lt;pre>&lt;code>Il ne faut rien ajouter au contenu de départ. &lt;/code>&lt;/pre> &lt;/li> &lt;li> &lt;p>On peut ajouter les règles principales qui doivent être appliquées au texte:&lt;/p> &lt;pre>&lt;code>Réécrire le texte en langage clair (PLAIN) ou facile à lire et à comprendre (FALC) Passer les phrases à la forme active. S’adresse aux personnes en «vous». Simplifier les mots complexes (ou les expliquer entre parenthèses) &lt;/code>&lt;/pre> &lt;/li> &lt;li> &lt;p>Au départ, on peut demander à ChatGPT de calculer le score Fleisch-Kincaid. Puis demander un nouveau calcul en fin de travail.&lt;/p> &lt;/li> &lt;li> &lt;p>Affiner le travail en cours de route:&lt;/p> &lt;pre>&lt;code>Passer les énumérations en listes à puces Mettre en gras les idées les plus importantes &lt;/code>&lt;/pre> &lt;p>Et pourquoi pas relancer:&lt;/p> &lt;pre>&lt;code>Le texte doit être encore plus simple &lt;/code>&lt;/pre> &lt;/li> &lt;li> &lt;p>On peut aussi demander des mises en forme:&lt;/p> &lt;pre>&lt;code>Saut de ligne à la fin de chaque phrase (mais pas de saut de paragraphe) &lt;/code>&lt;/pre> &lt;/li> &lt;/ul> &lt;p>D’après mes premiers tests, ChatGPT (version gratuite) permet d’excellents résultats. C’est rapide et précis.&lt;/p> &lt;h2 id="yoast">Conseils de Yoast&lt;/h2> &lt;p>L’extension de référencement Yoast SEO propose un certain nombre de critères de lisiblité. S’ils peuvent favoriser le référencement, certains sont positifs pour l’accessibilité. Notamment:&lt;/p> &lt;ul> &lt;li>la structuration de la page par des intertitres&lt;/li> &lt;li>la limitation de la longueur des paragraphes&lt;/li> &lt;li>la limitation de la longueur des phrases&lt;/li> &lt;li>la rédaction à l’actif&lt;/li> &lt;li>la réduction du nombre de mots complexes&lt;/li> &lt;/ul> &lt;p>Je trouve intéressante cette convergence (logique) entre accessibilité et référencement.&lt;/p></description></item><item><title>Notes sur la création d’un site d’urgence</title><link>https://nicolasfriedli.ch/blog/site-urgence/</link><pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/site-urgence/</guid><description>&lt;p>Entre les pannes de serveur, les incertitudes concernant l’approvisionnement énergétique, les pics d’affluence et les catastrophes naturelles, nous avons toutes les raisons de penser qu’il y aura bien une urgence un jour ou l’autre. L’urgence, par définition, comporte sa part d’imprévisible. Mais ce n’est pas une raison pour ne pas s’y préparer.&lt;/p> &lt;h2 id="travail-de-max-bock">Travail de Max Böck&lt;/h2> &lt;p>Le développeur autrichien Max Böck a déjà très bien balisé le terrain. Je me suis inspiré de ces réflexions et ses solutions pour rédiger ce billet.&lt;/p> &lt;p>Je vous conseille en particulier la lecture de ses articles:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://mxb.dev/blog/hurricane-web/">The Hurricane Web&lt;/a> qui pose les problèmes à la suite de l’ouragan Florence&lt;/li> &lt;li>&lt;a href="https://mxb.dev/blog/emergency-website-kit/">The Emergency Website Kit&lt;/a> qui propose une solution technique complète viable&lt;/li> &lt;/ul> &lt;p>Par la suite, je développe ces thématiques à ma sauce.&lt;/p> &lt;h2 id="types-durgences">Types d’urgences&lt;/h2> &lt;p>Il me semble qu’il existe 3 types d’urgences dont je vous donne une typologie.&lt;/p> &lt;h3 id="crash-du-serveur">Crash du serveur&lt;/h3> &lt;p>&lt;strong>Votre serveur tombe en panne et votre site n’est plus fonctionnel.&lt;/strong> L’hébergeur subit une avarie, votre serveur de nom de domaine est cassé, la base de données hébergée chez vous est en panne, etc. Qu’importe, votre site ne peut pas être consulté.&lt;/p> &lt;p>En fonction de la réalité du bug, il faudra renvoyer les internautes ailleurs. Dans ce cas, &lt;strong>un site d’urgence préexistant&lt;/strong> est une bénédiction. Il y a déjà un lien à donner aux médias et à publier sur les réseaux sociaux.&lt;/p> &lt;h3 id="faiblesse-des-infrastructures">Faiblesse des infrastructures&lt;/h3> &lt;p>&lt;strong>Les réseaux sont affaiblis.&lt;/strong> Une grande panne électrique, une inondation ou un ouragan mettent à mal les réseaux. Les internautes consulteront le web avec un faible débit, en grand nombre sur les antennes relais encore fonctionnelles.&lt;/p> &lt;p>La légereté du site sera un critère déterminant pour le rendre accessible dans de mauvaises conditions. Un &lt;strong>site simple et léger&lt;/strong> à afficher videra moins rapidement les batteries des utilisateurs et utilisatrices qui peinent à recharger leurs téléphones.&lt;/p> &lt;h3 id="affluence-extraordinaire">Affluence extraordinaire&lt;/h3> &lt;p>&lt;strong>Un nombre exceptionnel d’internautes consulte votre site sur une courte période.&lt;/strong> Une annonce sanitaire comme celles de la crise du Coronavirus, des résultats d’élections ou l’ouverture d’une billetterie peuvent provoquer un nombre de visites considérable.&lt;/p> &lt;p>Les équipes techniques disent souvent que tout est prévu&amp;hellip; mais les sites tombent régulièrement. &lt;strong>Ces pics d’affluence sont souvent prévisibles&lt;/strong> quelques jours ou quelques jours à l’avance. Mais la solution prévue est-elle suffisante?&lt;/p> &lt;h3 id="tout-en-meme-temps">Tout en même temps&lt;/h3> &lt;p>Ces différents cas peuvent s’accumuler, mieux vaut mettre toutes les chances de son côté. Une grande innodation peut parfaitement faire tomber l’infrastructure locale (il faut arrêter le serveur), affaiblir les réseaux (l’alimentation électrique des relais est coupée) et provoquer un pic d’affluence (toutes les personnes qui subissent les pannes essaient de trouver des informations au même moment).&lt;/p> &lt;p>Pour répondre à ce scénario catastrophe, il vaut la peine d’envisager une &lt;strong>solution technique radicale&lt;/strong>.&lt;/p> &lt;h2 id="choix-techniques">Choix techniques&lt;/h2> &lt;p>Il me semble que la réponse à apporter exige les choix suivants:&lt;/p> &lt;ul> &lt;li>réserver un domaine de secours chez un autre prestataire que le domaine courant&lt;/li> &lt;li>héberger ses serveurs de nom (DNS) dans une autre région géographique&lt;/li> &lt;li>disposer d’un serveur prêt à l’emploi à distance&lt;/li> &lt;li>être capable d’administrer le site dans passer par son adresse mail courante&lt;/li> &lt;/ul> &lt;p>Pour tenir la charge, je conseille:&lt;/p> &lt;ul> &lt;li>un &lt;a href="https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/">site statique&lt;/a>&lt;/li> &lt;li>des pages légères&lt;/li> &lt;li>la suppression tièrces parties inutiles en cas d’urgence: polices d’écritures distantes, plugins des réseaux sociaux ou images «décoratives», voire l’outil statistique s’il charge le même serveur&lt;/li> &lt;/ul> &lt;p>Quand une très forte affluence est prévisible, plutôt que de remplacer le site, je propose:&lt;/p> &lt;ul> &lt;li>de publier une page statique en tant que page accueil&lt;/li> &lt;li>puis de renvoyer au site normal pour la petite proporition d’internautes qui cherche d’autres informations&lt;/li> &lt;/ul> &lt;p>Je travaille généralement avec Hugo, mais tous les générateurs de sites statiques peuvent convenir, à condition d’un &lt;strong>résultat léger&lt;/strong>. La page peut aussi être créée à la main, dans un éditeur de texte.&lt;/p> &lt;h2 id="exemple-de-realisation">Exemple de réalisation&lt;/h2> &lt;p>Pour une ville suisse qui prenait ses précaution suite aux incertitudes énergétiques suite à l’invasion russe en Ukraine, j’ai élaboré un site de secours. Avec les servicess de la ville, nous avons pris le temps, paradoxalement, de &lt;strong>ne pas travailler dans l’urgence&lt;/strong>.&lt;/p> &lt;p>Le résultat:&lt;/p> &lt;ul> &lt;li>un site en ligne (mais volontairement non référencé), dont le nom de domaine est distinct du site principal et réservé chez un autre prestataire&lt;/li> &lt;li>une gestion des contenus sur GitHub&lt;/li> &lt;li>un hébergement sur le CDN CloudFlare qui peut encaisser d’énormes charges&lt;/li> &lt;/ul> &lt;p>Au quotidien, ce site existe. Il est utilisé comme système de liens (à la Linktree). Les internautes ne s’aperçoivent pas son potentiel dans les cas particuliers.&lt;/p> &lt;p>Quand c’est nécessaire, le site officiel de la ville est basculé sur le site d’urgence (si les DNS fonctionnent encore) ou les liens sont envoyés dans les réseaux sociaux. &lt;strong>Un message apparaît avec les informations immédiatement utiles.&lt;/strong> Il a été activé une fois, pendant quelques heures, pour pallier l’absence du site officiel durant une migration technique.&lt;/p> &lt;p>Évidemment, pour que cela fonctionne, il est important que les équipes de communication disposent d’&lt;strong>une documentation sérieuse&lt;/strong> pour prendre en main la solution sans hésitation et en toute confiance.&lt;/p> &lt;hr> &lt;p>Je dispose d’une version &lt;a href="https://gohugo.io/">Hugo&lt;/a> du site d’urgence de Max Böck qui peut être déployée très rapidement.&lt;/p></description></item><item><title>Améliorer son référencement local</title><link>https://nicolasfriedli.ch/blog/referencement-local/</link><pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/referencement-local/</guid><description>&lt;p>Lorsque des pages web présentent des lieux patrimoniaux, des institutions, des entreprises et des commerces locaux, il vaut la peine d’aider les moteurs de recherche à les situer géographiquement. On parle alors de &lt;em>référencement local&lt;/em> (local SEO) qui est une «sous-discipline» du référencement (SEO).&lt;/p> &lt;p>Pour illustrer quelques principes, je prends l’exemple du Temple de Colombier que je vois de ma fenêtre en rédigeant ces lignes.&lt;/p> &lt;h2 id="une-adresse-par-page">Une adresse par page&lt;/h2> &lt;p>Pour faciliter le référencement de votre page, il est important de présenter une page par adresse. Le regroupement de plusieurs lieux sur une même page est mauvais pour votre référencement. Qu’il s’agisse de lieux de culte ou de succursales administratives importe peu.&lt;/p> &lt;p>Le principe &lt;em>1 lieu = 1 page&lt;/em> est utile en plus d’être efficace. Par exemple pour proposer des liens internes au site, pour transmettre une information précise à un contact, pour donner sans équivoque un lieu de rendez-vous.&lt;/p> &lt;p>Le titre de la page devrait être &lt;em>identique&lt;/em> à celui du nom de l’établissement sur Google Maps. On y parvient en modifiant l’un, l’autre ou les deux.&lt;/p> &lt;p>Attention aux adresses qui sont présentes dans le pied de toutes les pages du site et qui peuvent être pénalisantes. Même si les moteurs de recherche analysent bien les pages, c’est toujours une possibilité de confusion.&lt;/p> &lt;h2 id="adresse-complete">Adresse complète&lt;/h2> &lt;p>Sur la page de présentation d’un lieu ou sa page de contact, il vaut la peine d’ajouter une &lt;strong>adresse complète&lt;/strong>, &lt;em>avec le pays&lt;/em> si le nom de domaine ne le mentionne pas.&lt;/p> &lt;p>De manière verticale:&lt;/p> &lt;pre tabindex="0">&lt;code>nom du lieu rue + numéro NPA + localité pays &lt;/code>&lt;/pre>&lt;p>Ou en ligne:&lt;/p> &lt;pre tabindex="0">&lt;code>nom du lieu, rue + numéro, NPA + localité, pays &lt;/code>&lt;/pre>&lt;p>En HTML, il serait juste de baliser le lieu ainsi:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;address&amp;gt; nom du lieu&amp;lt;br&amp;gt; rue + numéro&amp;lt;br&amp;gt; NPA + localité&amp;lt;br&amp;gt; pays &amp;lt;/address&amp;gt; &lt;/code>&lt;/pre>&lt;h2 id="illustrations">Illustrations&lt;/h2> &lt;p>Je conseille la publication d’&lt;strong>au moins 2 photographies&lt;/strong>, tant sur une page web de présentation que sur une fiche Google Maps.&lt;/p> &lt;p>La &lt;em>photographie de l’extérieur&lt;/em> permet aux personnes qui connaissent les lieux de s’assurer qu’elles sont sur la bonne page. Elle permet aux internautes qui ne connaissent pas les lieux de s’orienter facilement lors de leur visite.&lt;/p> &lt;p>La &lt;em>photographie de l’intérieur&lt;/em> permet de se préparer à une visite, de se demander si c’est le bon lieu pour une manifestation, etc. Elle permet, quand l’endroit est fermé, de savoir ce qui se trouve derrière la porte close.&lt;/p> &lt;h2 id="horaires-douverture">Horaires d’ouverture&lt;/h2> &lt;p>Les horaires d’ouvertures devraient être présents sur toute présentation de bâtiments patrimoniaux, de musées, d’entreprises, etc. Si c’est fermé, il est aussi utile de le dire!&lt;/p> &lt;p>Je conseille de présenter les horaires de la manière la plus simple possible. Au besoin, je vous invite à modifier les ouvertures pour gagner en simplicité et en clarté.&lt;/p> &lt;p>Par exemple, pour un lieu patrimonial comme le temple que je cite en exemple:&lt;/p> &lt;pre tabindex="0">&lt;code>ouvert tous les jours de 8:00 à 18:00 &lt;/code>&lt;/pre>&lt;h2 id="modifier-une-fiche-google-maps">Modifier une fiche Google Maps&lt;/h2> &lt;p>Il est possible de &lt;strong>suggérer des modifications&lt;/strong> sur une fiche dont on n’a pas la responsabilité. Toute personne qui visite un lieu patrimonial ou culturel peut améliorer sa présentation.&lt;/p> &lt;p>Je conseille en particulier de corriger:&lt;/p> &lt;ul> &lt;li>le nom du lieu s’il n’est pas clair&lt;/li> &lt;li>la catégorie si elle est fausse ou vague&lt;/li> &lt;li>les horaires d’ouverture du bâtiment&lt;/li> &lt;li>l’adresse ou la position du repère&lt;/li> &lt;li>le site web&lt;/li> &lt;li>le numéro de téléphone&lt;/li> &lt;li>etc.&lt;/li> &lt;/ul> &lt;p>Si la fiche ne dispose pas d’images, il est bienvenu d’ajouter au moins une photographie extérieure. Elle facilite l’identification de du bâtiment, de l’église, du commerce, du bureau, etc. Et si possible une photographie de l’intérieur. Il est aussi possible de signaler des photos qui ne correspondent pas au lieu.&lt;/p> &lt;h2 id="prendre-possession-dune-fiche-google-maps">Prendre possession d’une fiche Google Maps&lt;/h2> &lt;p>Toute personne qui a la responsabilité d’un lieu devrait &lt;a href="https://www.google.com/intl/fr_ch/business/">prendre la main sur sa fiche d’établissement&lt;/a>. Google My Business le nom de l’interface d’administration des fiches Google Maps. Quand un lieu est déjà visible dans Google Maps, il existe un lien pour &lt;em>revendiquer un établissement&lt;/em>.&lt;/p> &lt;p>Un contrôle sera effectué pour s’assurer de la légitimité de la demande. La procédure est simple et rapide par téléphone; elle est plus lente par courrier postal.&lt;/p> &lt;p>&lt;strong>Google My Business ouvre de nouvelles possibilités&lt;/strong> pour la gestion de contenu. Notamment:&lt;/p> &lt;ul> &lt;li>la gestion précise des horaires d’ouverture (y compris les annonces de jours fériés)&lt;/li> &lt;li>la publication d’événements&lt;/li> &lt;li>une meilleure gestion des catégories&lt;/li> &lt;li>plus de possibilités avec les images&lt;/li> &lt;li>des interaction avec les internautes&lt;/li> &lt;li>la possibilité de préciser les zones desservies&lt;/li> &lt;/ul> &lt;p>Concernant les horaires d’ouverture, il vaut la peine corriger dès que possible, plutôt que d’attendre qu’une personne devant une porte close propose sa correction (et son commentaire déçu).&lt;/p> &lt;h2 id="coherence-des-donnees">Cohérence des données&lt;/h2> &lt;p>Pour fonctionner correctement, &lt;strong>les moteurs de recherche doivent trouver des données cohérentes&lt;/strong> entre pages du site web et fiches Google Maps. Ils procèdent par recoupements. Quand un lieu est mal affiché ou semble incomplet, c’est souvent que les informations sur son site «officiel» sont inutilisables.&lt;/p> &lt;p>La mise à jour d’informations dans Google Maps ou My Business a un impact sur le référencement local des lieux. La cohérence est particulièrement importante pour:&lt;/p> &lt;ul> &lt;li>le nom du lieu et&lt;/li> &lt;li>l’adresse postale exacte&lt;/li> &lt;/ul> &lt;p>Un bon &lt;em>indice de cohérence&lt;/em> est l’affichage de pages web directement dans la fiche Google Maps. Si la page de présentation de votre site apparaît en haut de liste, c’est que la correspondance est évidente pour le moteur de recherche. Quand les résultats ne sont pas cohérents, il faut modifier soit le site, soit la fiche Google Maps.&lt;/p> &lt;p>Autre exemple, cette &lt;a href="https://www.google.com/search?q=Temple+de+Colombier">recherche du Temple de Colombier&lt;/a> fera apparaître à la fois la page du site et la fiche Google Maps. Parfait!&lt;/p> &lt;h2 id="proposer-des-liens-reciproques">Proposer des liens réciproques&lt;/h2> &lt;p>Sur la page de web de présentation de son site web, je conseille d’ajouter un lien vers Google Maps. Pour faire les choses au mieux:&lt;/p> &lt;ul> &lt;li>il vaut la peine de &lt;em>renvoyer au lieu&lt;/em>: &lt;a href="https://maps.app.goo.gl/cg27QmcYEoTuH4dy8">Temple de Colombier&lt;/a>&lt;/li> &lt;li>plutôt qu’à son &lt;em>adresse&lt;/em>: &lt;a href="https://maps.app.goo.gl/N5sPL2113hBE4u9cA">Rue du Château 3a, 2013 Colombier&lt;/a>&lt;/li> &lt;/ul> &lt;p>En cliquant sur les 2 liens, on n’arrive pas exactement au même contenu. C’est particulièrement important si vous souhaitez afficher une carte sur votre site.&lt;/p> &lt;p>Sur la fiche Google Maps, il vaut la peine d’ajouter un &lt;a href="https://www.eren.ch/barc/batiments/temple-de-colombier/">lien direct&lt;/a> vers le lieu en question. Ou, à défaut, un lien vers le &lt;a href="https://www.eren.ch/barc/">la page d’accueil de l’institution&lt;/a> qui a la responsabilité de l’endroit.&lt;/p> &lt;hr> &lt;p>Je reçois avec plaisir vos retours d’expériences, vos proposition d’améliorations et vos questions.&lt;/p></description></item><item><title>Lire et relire les classiques du web</title><link>https://nicolasfriedli.ch/blog/lire-classiques-web/</link><pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/lire-classiques-web/</guid><description>&lt;p>Dans son livre &lt;em>Pourquoi lire les classiques?&lt;/em>, Italo Calvino propose 14 thèses pour définir ce qu’est un «classique». Ce &lt;a href="https://www.radiofrance.fr/franceinter/podcasts/les-80-de-nicolas-demorand/pourquoi-lire-les-classiques-4967560">podcast&lt;/a> de 80 secondes donne quelques pistes.&lt;/p> &lt;p>Il me semble qu’il vaut la peine de faire la même démarche avec des textes importants pour le web. Ils ne sont peut-être plus d’actualité sur certains points techniques, le web est peut-être devenu autre chose que ce qu’il était à l’époque de leur publication, mais ils disent toujours quelque chose de pertinent.&lt;/p> &lt;p>Ci-dessous, je vous propose quelques classiques sur le web. Et je vous dit pourquoi ils faut toujours encore les lire.&lt;/p> &lt;h2 id="les-idees-de-linventeur-du-web">Les idées de l’inventeur du web&lt;/h2> &lt;p>Dans sa note personnelle, &lt;a href="https://www.w3.org/DesignIssues/Principles.html">Principles of Design&lt;/a>, Tim Berners-Lee, expose les principes de conception du web dont il est un des inventeurs. Notamment:&lt;/p> &lt;ul> &lt;li>la simplicité&lt;/li> &lt;li>la modularité&lt;/li> &lt;li>le principe de moindre puissance&lt;/li> &lt;/ul> &lt;p>Ces sujets reviennent périodiquement, quand l’impression que le web devient trop complexe ou trop lourd. Il vaut la peine de lutter contre les excès et revenir à ce texte fondateur pour s’en inspirer.&lt;/p> &lt;p>Avec le passage à la version 5 de HTML, d’autres principes de conception ont aussi été rédigés, par d’autres personnes. Le document &lt;a href="https://www.w3.org/TR/html-design-principles/">HTML Design Principles&lt;/a> insiste en particulier sur:&lt;/p> &lt;ul> &lt;li>l’utilité pour résoudre de vrais problèmes&lt;/li> &lt;li>l’interopérabilité (et le refus de toute complexité non nécessaire)&lt;/li> &lt;li>l’accès universel (dont l’accessibilité)&lt;/li> &lt;/ul> &lt;p>Il serait bienvenu que les développeurs et développeuses relisent ces lignes avant de créer des usines à gaz.&lt;/p> &lt;h2 id="sur-le-web-independant">Sur le web indépendant&lt;/h2> &lt;p>En 1997 déjà, le &lt;a href="https://www.uzine.net/article60.html">Manifeste du Web indépendant&lt;/a> dénonçait la publicité agressive, ainsi que le fichage et le ciblage des internautes. La richesse du web se trouvait (et se trouve toujours) dans des milliers de sites indépendants et artisanaux qui ne cherchent pas le profit avant tout.&lt;/p> &lt;p>Ce texte est encore plus pertinent aujourd’hui, alors que de grands acteurs cherchent uniquement à capter un maximum de temps d’attention. Nous sommes entrés dans le monde du &lt;a href="https://www.monde-diplomatique.fr/2019/01/ZUBOFF/59443">capitalisme de surveillance&lt;/a>. La relecture régulière de ce manifeste est bienvenue.&lt;/p> &lt;h2 id="sur-le-design-web">Sur le design web&lt;/h2> &lt;p>Dans son texte &lt;a href="https://alistapart.com/article/dao/">A Dao of Web Design&lt;/a> (en français: &lt;a href="https://www.pompage.net/traduction/dao">Le tao du design Web&lt;/a>), John Allstrop parlait abondamment des feuilles de style. Pour moi, l’élément central était:&lt;/p> &lt;blockquote> &lt;p>If you use style sheets properly, to suggest the appearance of a page, not to control the appearance of a page, and you don’t &lt;em>rely&lt;/em> on your style sheet to convey information, then your pages will “work” fine in any browser, past or future.&lt;/p>&lt;/blockquote> &lt;p>On pourrait traduire ces thèses ainsi (je mets en gras):&lt;/p> &lt;blockquote> &lt;p>Si vous utilisez les feuilles de style correctement, pour &lt;strong>suggérer&lt;/strong> l’apparence d’une page, mais ne pas &lt;strong>contrôler&lt;/strong> son apparence, et que vous ne comptez pas sur votre feuille de style pour transmettre de l’information, vos pages fonctionneront très bien dans n’importe quel navigateur, passé comme futur.&lt;/p>&lt;/blockquote> &lt;p>Ce passage est fondamental. Malgré la diversité des périphériques et des formats d’écran, des agences de communication — en fait, des graphistes&amp;hellip; — cherchent toujours à faire des mises en pages au pixel près. C’est parfaitement contraire à l’esprit du web, ça coûte très cher et c’est souvent peu pérenne ni efficace.&lt;/p> &lt;p>J’essaie d’appliquer ce principe dans mon billet sur l’&lt;a href="https://nicolasfriedli.ch/blog/polices-systeme/">utilisation des polices système&lt;/a>.&lt;/p> &lt;h2 id="essence-dune-page-ou-dun-site-web">Essence d’une page ou d’un site web&lt;/h2> &lt;p>Certaines pages simples ont été mises en ligne. En premier lieu &lt;a href="https://justinjackson.ca/words.html">This is a web page&lt;/a> et sa traduction &lt;a href="https://justinjackson.ca/words_fr.html">Ceci est une page Web&lt;/a>. Le web, ce sont simplement des mots qui s’ajoutent les uns aux autres pour former des contenus pertinents. J’avais été passionné à ma première lecture de cette page. L’auteur l’a rédigée, je l’ai lue, c’est la magie du web. Point.&lt;/p> &lt;p>D’autres ont publié des mini sites (d’une seule) page comme &lt;a href="https://motherfuckingwebsite.com/">This is a motherfucking website&lt;/a>. Il a été complété par d’autres, par exemple &lt;a href="http://bettermotherfuckingwebsite.com/">This is &lt;em>still&lt;/em> a motherfucking website&lt;/a> et &lt;a href="https://perfectmotherfuckingwebsite.com/">This is the &lt;em>final&lt;/em> motherfucking website&lt;/a>. Sur un ton satirique et grossier, ces personnes ont jeté des pavés dans la mare d’un web qui se perd dans des raffinements techniques et esthétiques. C’est délicieux.&lt;/p> &lt;h2 id="ce-qui-est-vraiment-utile">Ce qui est vraiment utile&lt;/h2> &lt;p>Le développeur autrichien Max Böck a publié &lt;a href="https://mxb.dev/blog/hurricane-web/">The Hurricane Web&lt;/a>. Lors de l’ouragan Florence, il est devenu difficile de consulter le web; des infrastructures étaient hors service et recharger son téléphone n’était pas une évidence. La National Public Radio a proposé &lt;a href="https://text.npr.org/">ses actualités en pur texte&lt;/a>. Au final, cette page est aussi bonne, sinon meilleure, que le site normal.&lt;/p> &lt;p>Avec son &lt;a href="https://mxb.dev/blog/emergency-website-kit/">The Emergency Website Kit&lt;/a>, Max Böck a proposé un outil clé en main pour publier un site d’urgence minimal et performant. Il a présenté les idées principales dans une conférence web; la vidéo est disponible dans son article. J’ai souvent consulté cette page, notamment lorsque j’ai élaboré un site d’urgence pour une ville suisse.&lt;/p> &lt;p>Dans &lt;a href="https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-simple-html/">The unreasonable effectiveness of simple HTML&lt;/a>, Terence Eden donne un exemple vécu de pertinence d’un web simple pour des personnes en situation de précarité.&lt;/p> &lt;h2 id="sur-lecoconception">Sur l’écoconception&lt;/h2> &lt;p>L’article &lt;a href="https://solar.lowtechmagazine.com/2018/09/how-to-build-a-low-tech-website/">How to Build a Low-tech Website?&lt;/a> détaille la création et la mise en œuvre d’un site alimenté par une solution technique minimale. Une de ses originalités, il fonctionne à l’énergie solaire et peut parfaitement tomber en rade si le temps est mauvais durant une longue période. Le fond de page indique la charge des batteries au moment de la consultation!&lt;/p> &lt;p>Une version française existe: &lt;a href="https://solar.lowtechmagazine.com/fr/2018/09/how-to-build-a-low-tech-website/">Comment créer un site web basse technologie&lt;/a>.&lt;/p> &lt;h2 id="et-aussi">Et aussi&lt;/h2> &lt;p>Je vais peut-être ajouter d’autres catégories ou d’autres sites. En attendant, je cite ces autres classiques qui comptent:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://brutalist-web.design/">Guidelines for Brutalist Web Design&lt;/a>&lt;/li> &lt;li>&lt;a href="https://ploum.net/comment-jai-appris-a-ne-plus-men-faire-et-a-aimer-le-web/index.html">Comment j’ai appris à ne plus m’en faire et à aimer le Web&lt;/a>&lt;/li> &lt;li>&lt;a href="https://ploum.net/2023-06-15-merdification.html">De la merdification des choses&lt;/a>&lt;/li> &lt;li>&lt;a href="https://matthiasott.com/articles/into-the-personal-website-verse">Into the Personal-Website-Verse&lt;/a>&lt;/li> &lt;/ul> &lt;p>Bonnes lectures!&lt;/p> &lt;hr> &lt;p>Le site &lt;a href="https://esif.dev/">Educational Sensational Inspirational Foundational&lt;/a> de Zach Leatherman propose une sélection d’articles mis en ligne entre 1998 et 2023. Certains sont techniques, d’autres plus réflexifs, mais tous gardent une belle actualité. Quelques-uns sont cités sur cette page.&lt;/p></description></item><item><title>Croissance organique d’un site web</title><link>https://nicolasfriedli.ch/blog/croissance-organique/</link><pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/croissance-organique/</guid><description>&lt;p>Partir de rien pour créer un site web peut être une démarche difficile. La «solution» est trop souvent la reprise d’un organigramme pour créer une première structure qu’il faudra ensuite remplir.&lt;/p> &lt;p>Mais un organigramme est ce qui définit — comme son nom l’indique — l’organisation interne. Savoir comment quelque chose fonctionne est rarement ce qui intéresse les internautes en premier lieu. &lt;strong>Savoir ce que l’organisation produit d’utile est le plus important.&lt;/strong> C’est ce qui est recherché dans la vie réelle, comme en attestent les requêtes dans les moteurs de recherche.&lt;/p> &lt;p>Dans sa conférence &lt;a href="https://www.writethedocs.org/videos/portland/2021/always-complete-never-finished-daniele-procida/">Always complete, never finished&lt;/a>, Daniele Procida propose de faire grandir un corpus documentaire de manière organique.&lt;/p> &lt;h2 id="traduction">Traduction&lt;/h2> &lt;p>Le titre de la conférence, repris d’un slogan, signifie évidemment:&lt;/p> &lt;blockquote> &lt;p>Toujours entier, jamais terminé.&lt;/p>&lt;/blockquote> &lt;p>Mais pour s’approcher de l’esprit de la chose, il faudrait plutôt traduire par:&lt;/p> &lt;blockquote> &lt;p>&lt;strong>Toujours cohérent, jamais terminé.&lt;/strong>&lt;/p>&lt;/blockquote> &lt;p>Daniele Procida prend l’exemple de la croissance d’une plante. À n’importe quelle étape de sa croissance, un haricot est un haricot. Même s’il n’est jamais terminé, il ne manque jamais rien. En tout temps, la plante est complète et cohérente.&lt;/p> &lt;h2 id="problemes-dun-plan">Problèmes d’un plan&lt;/h2> &lt;p>Le même auteur a proposé le cadre de travail Diataxis. Ce qu’il ajoute dans sa conférence, c’est que ce concept est souvent compris comme un plan. Mais il n’a jamais été conçu comme tel.&lt;/p> &lt;p>Le problème d’un plan ou d’une hiérarchie, c’est qu’il impose une masse de pages à remplir. Pour reprendre l’image organique, on pourrait dire qu’un plan, c’est un arbre de très grande taille, mais sans aucune feuille. &lt;strong>Ce corpus de pages sera peu utile avant d’être terminé.&lt;/strong> C’est un peu le principe du tout ou rien.&lt;/p> &lt;p>Plus on envisage un grand site, plus on estime le plan nécessaire. Alors qu’au contraire, il faudrait le laisser croître naturellement. Un plan n’est jamais nécessaire à cause de la taille prévue d’un site. &lt;strong>Un plan est «nécessaire» uniquement pour rassurer celles et ceux qui sont en charge du projet.&lt;/strong>&lt;/p> &lt;p>Ce qu’affirme Daniele Procida, c’est que faire le travail est la partie facile. La partie difficile, c’est de savoir quoi faire. Avec un plan, on se donne tellement de travail à faire que l’on ne sait pas comment avancer, que l’on se démoralise. Et, en fin de compte, on ne fait rien.&lt;/p> &lt;h2 id="methode">Méthode&lt;/h2> &lt;p>Avec la méthode de la croissance organique, il est toujours assez &lt;strong>simple de passer à l’étape suivante&lt;/strong>. Le travail est toujours adapté à la taille actuelle du corpus.&lt;/p> &lt;p>Quand je décide d’avancer, &lt;strong>je choisis quelque chose de petit (un paragraphe ou une page) et je l’améliore&lt;/strong>. Je le reformule, je supprime l’inutile, j’ajoute le nécessaire. Si ce «quelque chose» devient trop grand, je le divise en unité plus petite (une nouvelle structure interne à la page, de nouvelles pages, une nouvelle section du site).&lt;/p> &lt;p>Toute la méthode est là. C’est sa force et sa faiblesse. &lt;strong>Le plus difficile, ce n’est pas d’intégrer cette méthodologie, mais de s’y tenir.&lt;/strong>&lt;/p> &lt;p>En raisonnant ainsi, on ne pense plus en termes de solutions ou de grands projets, mais d’&lt;strong>amélioration continue&lt;/strong>. Les moments de réflexions de fond sont plus rares, laissant la place à de petites progressions, régulières et utiles.&lt;/p> &lt;h2 id="avantages-dune-croissance-organique">Avantages d’une croissance organique&lt;/h2> &lt;p>L’avantage de la &lt;strong>croissance organique&lt;/strong> sur les plans et les organigrammes, c’est qu’elle &lt;strong>ne met pas l’accent sur ce qui manque&lt;/strong>. On a tous parcouru des sites avec de grands menus… mais plein de pages en construction. En procédant ainsi, on crée de la frustration, tant pour les internautes que pour les responsables de la publication.&lt;/p> &lt;p>Alors que quand une chose manque (encore), mais que cette lacune n’est pas mise en évidence, elle ne pose pas de problèmes. C’est seulement une lacune temporaire.&lt;/p> &lt;p>Pour que cela fonctionne, il faut publier tôt et souvent. &lt;strong>Pas besoin d’attendre qu’une page soit parfaite, il suffit qu’elle soit acceptable.&lt;/strong> Elle sera améliorée dans la durée.&lt;/p> &lt;p>Corollaire: les améliorations se feront aussi en connaissance des retours reçus. C’est un travail ancré dans la réalité du terrain plutôt que caché dans les secrets des bureaux.&lt;/p> &lt;h2 id="strategie--programme">Stratégie &amp;amp; programme&lt;/h2> &lt;p>Quand des responsables de sites veulent aller trop vite et plonger dans des structures complexes, je fais tout pour les faire adopter une croissance organique. &lt;strong>Le plan a beau être superbe, on se perdra en route.&lt;/strong>&lt;/p> &lt;p>Ensemble, nous prenons alors le contenu d’une page, nous l’améliorons, puis nous la séparons en plusieurs pages. Ainsi, le principe de la croissance organique a déjà été expérimenté avec succès.&lt;/p> &lt;p>Nous parlons alors de &lt;strong>stratégie de croissance&lt;/strong> et supprimons toute idée de programme. Je leur cite quelques phrases de &lt;em>Introduction à la pensée complexe&lt;/em> d’Edgar Morin:&lt;/p> &lt;blockquote> &lt;p>La notion de stratégie s’oppose à celle de programme.&lt;/p> &lt;p>Un programme, c’est une séquence d’actions prédéterminées qui doit fonctionner dans des circonstances qui en permettent l’accomplissement. Si les circonstances extérieures ne sont pas favorables, le programme s’arrête ou échoue. […] la stratégie, elle, élabore un ou plusieurs scénarios. Dès le début, elle se prépare, s’il y a du nouveau et de l’inattendu, à l’intégrer pour modifier ou enrichir son action.&lt;/p>&lt;/blockquote> &lt;p>Parce que le nouveau et l’inattendu, ça arrive tous les jours, dans le domaine du web comme ailleurs.&lt;/p> &lt;p>Alors on me dit que c’est très bien, que l’on peut procéder par croissance organique. Puis quelqu’un se lève et demande qui crée le plan pour la prochaine rencontre.&lt;/p> &lt;hr> &lt;p>Après la publication de ce billet, j’ai reçu des commentaires. Ils appellent ces remarques:&lt;/p> &lt;ul> &lt;li>L’idée de «publier tôt et souvent» est la bonne. J’aurais pu garder ce brouillon dans mes tiroirs durant des semaines, le relire, le corriger, mais je n’aurais pas eu l’apport des retours externes.&lt;/li> &lt;li>L’idée de «reformuler, supprimer l’inutile et ajouter le nécessaire» est celle que j’utilise pour faire évoluer cette page&lt;/li> &lt;li>J’ajoute ci-dessous un passage sur le développement logiciel.&lt;/li> &lt;/ul> &lt;hr> &lt;h2 id="developpement-logiciel-agile">Développement logiciel agile&lt;/h2> &lt;p>C’est à dessein que je n’avais pas parlé de développement logiciel ou de documentation technique dans mon premier jet de cette page. Pourtant, un commentaire sur les &lt;a href="https://fr.wikipedia.org/wiki/M%C3%A9thode_agile">méthodes agiles&lt;/a> était bienvenu.&lt;/p> &lt;p>Il existe des traits communs entre la croissance organique et le développement. Dans le &lt;a href="https://agilemanifesto.org/iso/fr/manifesto.html">Manifeste pour le développement agile de logiciels&lt;/a>, on trouve notamment:&lt;/p> &lt;blockquote> &lt;p>L’adaptation au changement plus que le suivi d’un plan.&lt;/p>&lt;/blockquote> &lt;p>Le développement agile insiste beaucoup sur les interactions dans les équipes de développement et avec les clientes et clients. Alors que, dans l’absolu, une croissance organique de site peut être réalisée par une personne seule, y compris pour un site personnel.&lt;/p> &lt;p>Ce qui retient mon attention en relisant le manifeste, c’est:&lt;/p> &lt;blockquote> &lt;p>Un logiciel opérationnel est la principale mesure d’avancement.&lt;/p>&lt;/blockquote> &lt;p>C’est un critère fondamental. À toutes les étapes de son développement, un logiciel doit fonctionner (ou, du moins, le code doit compiler). Reprise dans le domaine de la création de sites, c’est l’idée qu’en tout temps un site est complet, cohérent, utile.&lt;/p> &lt;p>Le problème d’un site bourré de pages affichées comme «en construction» est qu’il peut être en ligne et donner l’impression de fonctionner. Cette tolérance est malheureusement source de beaucoup de problèmes. Alors qu’une erreur de code empêche simplement la compilation, une page vide de sens ne retourne aucun message d’erreur.&lt;/p></description></item><item><title>Garanti sans ChatGPT (ou pas)</title><link>https://nicolasfriedli.ch/blog/garanti-sans-chatgpt/</link><pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/garanti-sans-chatgpt/</guid><description>&lt;p>Ce site est rédigé par Nicolas Friedli et non par ChatGPT (ou une autre intelligence artificielle). Je pourrais le préciser en bas de page, comme de nombreux sites qui se déclarent &lt;em>not by AI&lt;/em>. Toutefois, je ne suis pas certain de la pertinence de la mention et j’y renonce.&lt;/p> &lt;h2 id="seul-le-resultat-compte">Seul le résultat compte&lt;/h2> &lt;p>Il me semble que ce qui plaît dans les initiatives sans intelligence artificielle, c’est l’aspect artisanal et humain de la chose. Mais le contenu humain n’est pas toujours meilleur que le produit d’une machine. Mettre ses mains dans le pétrin ne signifie pas encore que le pain sera bon. Ce que je veux, c’est du bon pain.&lt;/p> &lt;p>C’est surtout très nostalgique, comme pour s’accrocher encore un peu à un monde que l’on comprenait. J’y vois l’idée que le contenu «maison» sera meilleur que sa version industrielle. On a bien envie d’y croire, mais il faudrait aussi tester à l’aveugle. Un discours de fin d’année plein de références personnelles est bien mieux que celui qu’aurait écrit ChatGPT. Mais pour ce bon discours, combien d’autres médiocres, pas plus intéressants que ce qu’auraient produit des intelligences artificielles?&lt;/p> &lt;p>Le site &lt;a href="https://notbyai.fyi/">not by AI&lt;/a> propose d’ajouter un badge qui atteste de la production humaine des contenus. Dans un passage un peu caché du site, je lis (traduction DeepL):&lt;/p> &lt;blockquote> &lt;p>Sans professionnels formés ou détecteurs d’IA (intelligence artificielle), il est presque impossible de distinguer votre contenu humain du contenu généré par l’IA. L’utilisation des badges &lt;em>not by AI&lt;/em> aide votre public à reconnaître votre approche centrée sur l’humain afin qu’il comprenne que votre contenu vient vraiment de vous et n’est pas copié-collé à partir d’une IA générative comme ChatGPT, Claude ou Gemini.&lt;/p>&lt;/blockquote> &lt;p>En tant que personnes humaines, vous comprenez toute la subtilité de la chose&amp;hellip; Le pain de boulangerie a le même goût que celui de &lt;a href="https://fr.wikipedia.org/wiki/L%27Aile_ou_la_Cuisse">l’usine Tricatel&lt;/a> d’en face. Il faut donc rappeler aux acheteurs et acheteuses qu’il est artisanal (sans être meilleur). On a envie de sourire de la démarche, mais tout n’est pas si simple.&lt;/p> &lt;h2 id="citer-ses-sources">Citer ses sources&lt;/h2> &lt;p>J’ai appris, durant mes études, à toujours citer mes sources. Je fais de même sur le web par des liens contextuels qui renvoient aux contenus utilisés. Je respecte les licences. Et là, c’est le drame&amp;hellip;&lt;/p> &lt;p>Avec ChatGPT, dans son modèle gratuit, impossible de connaître les sources utilisées. Un LLM (&lt;a href="https://fr.wikipedia.org/wiki/Grand_mod%C3%A8le_de_langage">grand modèle la langage&lt;/a>) utilise des quantités hallucinantes de données pour se construire, mais ne nous dit jamais d’où provient quoi. Alors les soucis légaux débarquent, parce que &lt;a href="https://sebsauvage.net/links/?pvvJZA">ces outils utilisent des données sous droits d’auteur&lt;/a>. On n’en est qu’aux débuts.&lt;/p> &lt;p>De ce point de vue, &lt;em>not by AI&lt;/em> a raison (toujours DeepL pour la traduction):&lt;/p> &lt;blockquote> &lt;p>L’intelligence artificielle (IA) est formée à partir de contenus créés par l’homme. Si les humains cessent de produire de nouveaux contenus et s’appuient uniquement sur l’IA, les contenus en ligne dans le monde entier risquent de devenir répétitifs et stagnants.&lt;/p>&lt;/blockquote> &lt;p>Quand on ne cite plus ses sources et que l’on construit tout à partir de l’existant, on produit quelque chose sans originalité et, peut-être, dans l’illégalité.&lt;/p> &lt;p>Il faudrait alors plaider pour une initiative inverse: que toutes les pages rédigées à coup de ChatGPT (et autres outils similaires) le déclarent. Cela ne fait pas des contenus générés automatiquement des mauvais contenus en soi, mais cela signifie qu’ils sont à la fois «mainstream» et potentiellement problématiques du point de vue du droit.&lt;/p> &lt;p>C’est une excellente raison de ne pas utiliser ChatGPT pour générer des contenus prétendument nouveaux. Il y en a quelques autres.&lt;/p> &lt;h2 id="bonnes-raisons-dajouter-une-mention-not-by-ai">Bonnes raisons d’ajouter une mention &lt;em>not by AI&lt;/em>&lt;/h2> &lt;p>Une personne qui souhaite mettre en avant ses &lt;strong>capacités rédactionnelles&lt;/strong> aura tout intérêt à signaler que c’est bien elle qui écrit, et non une intelligence artificielle.&lt;/p> &lt;p>Lorsque le résultat doit être &lt;strong>absolument fiable&lt;/strong> (par exemple dans des cas de textes juridiques, des règlements, etc.), il vaut le coup d’écrire &lt;em>not by IA&lt;/em>, mais il faut alors assumer les pages publiées comme des références validées.&lt;/p> &lt;p>Finalement, je concevrais très bien de préciser &lt;em>not by IA&lt;/em> sur un site qui cherche à &lt;strong>limiter son empreinte écologique&lt;/strong>. À quoi bon proposer un site simple et léger si l’artillerie lourde est utilisée pour produire des textes de quelques paragraphes qui peuvent être écrits en peu de temps.&lt;/p> &lt;p>Vous avez compris, je ne m’engage à rien au sujet de l’utilisation de ChatGPT ou toute autre intelligence artificielle. Je ne les utilise pas pour produire les contenus de ce site. Je n’ai pas l’intention de les utiliser à l’avenir, mais c’est une possibilité que je refuse de m’interdire par principe. &lt;strong>Le «not-by-IA-washing» ne m’intéresse pas.&lt;/strong> C’est une démarche marketing avant tout. Et ce sont les contenus qui comptent.&lt;/p> &lt;hr> &lt;p>Celles et ceux qui souhaitent &lt;strong>démontrer leur maîtrise de ChatGPT&lt;/strong> pourraient mettre une bannière inverse. Quelque chose comme: «les textes de ce site ont été entièrement rédigés par une IA». Il vaudrait alors la peine d’insister sur sa capacité à écrire des «prompts» (les «demandes» à l’IA) utiles et efficaces.&lt;/p></description></item><item><title>Utiliser des polices système</title><link>https://nicolasfriedli.ch/blog/polices-systeme/</link><pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/polices-systeme/</guid><description>&lt;p>L’utilisation de polices du système d’exploitation (&lt;em>system font stack&lt;/em>) permet une cohérence graphique sans téléchargements. Mais la diversité des plateformes rend le travail relativement complexe.&lt;/p> &lt;h2 id="problematique">Problématique&lt;/h2> &lt;p>Dans son billet &lt;a href="https://pimpmytype.com/web-safe-fonts/">Are Web-Safe Fonts still relevant in 2024?&lt;/a>, Oliver Schöndorfer se demande si l’utilisation de polices système universelles est toujours pertinente aujourd’hui. Sa question est bonne, parce que les systèmes d’exploitation sont nombreux. Toutefois, sa réponse est imparfaite.&lt;/p> &lt;p>Il part du fait qu’il n’existe plus de polices présentes sur tous les périphériques. Arial et Times New Roman avaient une disponibilité de virtuellement 100%, ce n’est plus vrai pour le système Android.&lt;/p> &lt;p>Les questions suivantes devraient toujours être posées:&lt;/p> &lt;ul> &lt;li>Est-ce qu’&lt;em>une police précise&lt;/em> est nécessaire pour ce site web?&lt;/li> &lt;li>Est-ce qu’un &lt;em>choix de polices proches&lt;/em> est suffisant?&lt;/li> &lt;li>Faut-il laisser le &lt;em>choix de la police au système d’exploitation&lt;/em>?&lt;/li> &lt;li>Faut-il laisser le &lt;em>choix de la police aux internautes&lt;/em>?&lt;/li> &lt;li>Est-ce que les enjeux d’&lt;em>écologie&lt;/em> et de &lt;em>performance&lt;/em> permettent de télécharger plusieurs fichiers?&lt;/li> &lt;/ul> &lt;h2 id="necessite-dune-police-precise-corporate-identity">Nécessité d’une police précise (&lt;em>corporate identity&lt;/em>)&lt;/h2> &lt;p>Quand une police doit être utilisée, il n’y a pas d’autre choix que de demander au navigateur de la télécharger. En pratique, ce sont plusieurs fichiers qui vont être envoyés, en général:&lt;/p> &lt;ul> &lt;li>une police «normale»&lt;/li> &lt;li>une police grasse&lt;/li> &lt;li>une police italique&lt;/li> &lt;li>une police grasse italique&lt;/li> &lt;/ul> &lt;p>Les fichiers seront mis à disposition par une directive CSS &lt;code>@font-face&lt;/code> et ceux qui sont nécessaires seront téléchargés. Lorsque ce cas se présente, il fait veilleur à une optimisation des fichiers et des chargements:&lt;/p> &lt;ul> &lt;li>bon format de fichier (&lt;code>woff2&lt;/code>)&lt;/li> &lt;li>blocage ou non de l’affichage (&lt;code>font-display&lt;/code>)&lt;/li> &lt;li>préchargement (&lt;code>preload&lt;/code>)&lt;/li> &lt;li>suppression des jeux de caractères inutiles&lt;/li> &lt;li>une gestion du cache pertinente (&lt;code>immutable&lt;/code>)&lt;/li> &lt;li>utilisation de polices variables si disponibles&lt;/li> &lt;/ul> &lt;p>En général, il devrait être possible de s’en tirer autour de 100kB pour un jeu de police complet. Pour en savoir plus sur cette thématique complexe, le billet &lt;a href="https://www.zachleat.com/web/comprehensive-webfonts/">A Comprehensive Guide to Font Loading Strategies&lt;/a> de Zach Leatherman est un point de départ précieux.&lt;/p> &lt;p>Quand ce chargement permet de répondre à une contrainte précise, c’est très bien. Mais je reste surpris par le nombre de sites qui téléchargent de tas de fichiers qui sont sans rapport avec la charte graphique de l’entreprise ou l’institution. Dans ces cas là, il y aurait peut-être mieux à faire.&lt;/p> &lt;h2 id="choix-de-polices-system-font-stack">Choix de polices (&lt;em>system font stack&lt;/em>)&lt;/h2> &lt;p>Une &lt;em>font stack&lt;/em> est une liste de polices possibles. Autrement dit, le site &lt;em>suggère&lt;/em> des polices au navigateur; il choisit la première de la liste disponible localement et l’affiche.&lt;/p> &lt;p>Le site &lt;a href="https://modernfontstacks.com/">Modern Font Stacks&lt;/a> propose des «piles de polices» toutes faites qui fonctionnent bien partout. Par exemple:&lt;/p> &lt;pre tabindex="0">&lt;code>font-family: Inter, Roboto, &amp;#34;Helvetica Neue&amp;#34;, &amp;#34;Arial Nova&amp;#34;, &amp;#34;Nimbus Sans&amp;#34;, Arial, sans-serif; &lt;/code>&lt;/pre>&lt;p>Ce qui se passe:&lt;/p> &lt;ul> &lt;li>Inter s’affiche si elle a été installée par l’internaute.&lt;/li> &lt;li>&lt;del>Sinon Roboto s’affiche sur Android (où elle est toujours disponible). Ou ailleurs si elle a été installée.&lt;/del> En fait, Roboto s’affiche sur Android par &lt;code>sans-serif&lt;/code> (dernier point ci-dessous).&lt;/li> &lt;li>Sinon Helvetica Neue s’affiche sur Apple (où elle est toujours disponible). Ou ailleurs si elle a été installée.&lt;/li> &lt;li>&amp;hellip;&lt;/li> &lt;li>Sinon Arial s’affiche sur Windows (où elle est toujours disponible). Ou presque partout ailleurs.&lt;/li> &lt;li>Finalement, si aucune n’est disponible, c’est la police de substitution, choisie par le navigateur ou l’internaute qui apparaît.&lt;/li> &lt;/ul> &lt;p>Franchement, il me parait acceptable d’afficher une des polices sans empattement présentes, que les internautes connaissent. Dans tel cas, il n’y a aucune bande passante utilisée et aucune latence. Pour tous les textes courants, c’est un excellent choix.&lt;/p> &lt;h2 id="polices-universelles-web-safe-fonts">Polices universelles (&lt;em>web safe fonts&lt;/em>)&lt;/h2> &lt;p>Comme Oliver Schöndorfer le signale, Arial et Times New Roman ne sont plus disponibles partout. Mais il est facile de contourner le problème. Si l’idée est d’obtenir simplement une police banale sans empattement, la directive CSS suivante suffit:&lt;/p> &lt;pre tabindex="0">&lt;code>font-family: sans-serif; &lt;/code>&lt;/pre>&lt;p>Et avec empattement:&lt;/p> &lt;pre tabindex="0">&lt;code>font-family: serif; &lt;/code>&lt;/pre>&lt;p>Cela va peut-être manquer un peu d’originalité, mais c’est léger. Si les internautes n’ont pas configuré leur navigateur n’importe comment, ce sera très lisible. J’estime que c’est toujours une bonne solution.&lt;/p> &lt;p>Les &lt;em>polices universelles&lt;/em> aujourd’hui ne sont plus identifiables par un nom précis; ce sont simplement les écritures par défaut du système d’exploitation.&lt;/p> &lt;h2 id="la-police-dinterface-system-ui">La police d’interface (&lt;em>system-ui&lt;/em>)&lt;/h2> &lt;p>Depuis quelque temps, il est possible d’utiliser une police spéciale. C’est celle du système d’exploitation. Elle ne peut pas être modifiée dans le navigateur par les internautes, contrairement aux précédentes. C’est tout simple:&lt;/p> &lt;pre tabindex="0">&lt;code>font-family: system-ui, sans-serif; &lt;/code>&lt;/pre>&lt;p>La directive &lt;code>sans-serif&lt;/code> reste à disposition si le navigateur &amp;ndash; cas très rare &amp;ndash; ne comprenait pas la directive &lt;code>system-ui&lt;/code>. Avec une police système, c’est une écriture parfaitement en phase avec le système utilisé qui sera choisie. C’est celle de l’interface, d’où UI (&lt;em>user interface&lt;/em>).&lt;/p> &lt;p>Au final, l’apparence laisse encore moins d’originalité que &lt;code>sans-serif&lt;/code>, mais ce sont souvent des polices de grande qualité qui sont utilisées. Le résultat est excellent.&lt;/p> &lt;h2 id="peripheriques-apple">Périphériques Apple&lt;/h2> &lt;p>Les périphériques Apple ont la particularité d’utiliser des directives spéciales comme la police UI. Sur les systèmes récents, c’est l’excellente police San Francisco qui sera choisie. Elle est élégante et dispose d’une large gamme de graisses et des tailles optiques. Franchement, il n’y a pas à hésiter à utiliser:&lt;/p> &lt;pre tabindex="0">&lt;code>font-family: ui-sans-serif, sans-serif; &lt;/code>&lt;/pre>&lt;p>La même logique existe pour les autres types de polices. Donc, pour des périphériques Apple:&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-family: ui-sans-serif, sans-serif; } blockquote, h1, h2, h3 { font-family: ui-serif, serif; } code, pre { font-family: ui-monospace, monospace; } &lt;/code>&lt;/pre>&lt;p>Tout le texte est sans empattement, sauf les citations et les titres avec empattement et le code en chasse fixe.&lt;/p> &lt;h2 id="peripheriques-android-et-linux">Périphériques Android et Linux&lt;/h2> &lt;p>Pour Android, Roboto est toujours disponible.&lt;/p> &lt;p>Elle s’affiche par les directives &lt;code>system-ui&lt;/code> ou &lt;code>sans-serif&lt;/code>, mais pas par &lt;code>Roboto&lt;/code>! Pour Linux, Roboto est presque toujours disponible et Noto Sans aussi.&lt;/p> &lt;p>Donc, pour le corps du texte:&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-family: system-ui, sans-serif; } Et pour les citations et intertitres: blockquote, h1, h2, h3 { font-family: &amp;#34;Noto Serif&amp;#34;, serif; } Et pour le code: code, pre { font-family: &amp;#34;Noto Sans Mono&amp;#34;, &amp;#34;Roboto Mono&amp;#34;, monospace; } &lt;/code>&lt;/pre>&lt;p>Attention, avec Linux, il est possible de modifier &lt;code>system-ui&lt;/code>, ce qui ne donne aucune certitude quant à la police choisie. Mais on peut supposer que les internautes utilisent des fontes lisibles sur leur système.&lt;/p> &lt;h2 id="peripheriques-windows">Périphériques Windows&lt;/h2> &lt;p>Pour Windows, c’est un peu plus complexe, car différentes versions, avec des polices différentes, cohabitent. Mais il serait possible d’utiliser des polices «universelles», par exemple:&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-family: Arial, sans-serif; } blockquote, h1, h2, h3 { font-family: Georgia, &amp;#34;Times New Roman&amp;#34;, serif; } code, pre { font-family: Consolas, monospace; } &lt;/code>&lt;/pre>&lt;p>Mon souci avec Windows, c’est que je n’aime pas Segoe UI pour les titres. Et c’est la police &lt;code>system-ui&lt;/code> pour certaines versions du système. Mais Segoe UI est meilleure qu’Arial pour le texte. J’essaie de tirer cela au clair dans ma proposition.&lt;/p> &lt;h2 id="proposition">Proposition&lt;/h2> &lt;p>Évidemment, il faut que la feuille de style CSS fonctionne pour tous les systèmes. En haut de la pile, il est possible d’ajouter des polices que je souhaiteras voir afficher. Je pourrais utiliser, pour un site comme le mien, quelque chose comme:&lt;/p> &lt;pre tabindex="0">&lt;code>html { font-family: &amp;#34;Fira Sans&amp;#34;, &amp;#34;Public Sans&amp;#34;, ui-sans-serif, Inter, Roboto, system-ui, sans-serif; } code, pre { font-family: &amp;#34;JetBrains Mono&amp;#34;, &amp;#34;Hack&amp;#34;, ui-monospace, &amp;#34;Roboto Mono&amp;#34;, Menlo, Consolas, monospace; } &lt;/code>&lt;/pre>&lt;p>La logique est:&lt;/p> &lt;ul> &lt;li>les premières lignes suggèrent des polices&lt;/li> &lt;li>puis une directive règle le cas pour tous les périphériques Apple&lt;/li> &lt;li>puis des propositions pour la majorité des Linux&lt;/li> &lt;li>puis on laisse le système se débrouiller&lt;/li> &lt;/ul> &lt;p>En adoptant une telle démarche, on prend une posture de &lt;em>suggestion de présentation&lt;/em>. J’en parle dans &lt;a href="https://nicolasfriedli.ch/blog/lire-classiques-web/#sur-le-design-web">Lire et relire les classiques du web&lt;/a>.&lt;/p> &lt;h2 id="en-conclusion">En conclusion&lt;/h2> &lt;p>Il existe aujourd’hui d’autres manières de concilier écologie, esthétique et performance qu’en utilisant des polices dites «web safe» comme Arial et Times New Roman. Entre les polices système (&lt;code>sans-serif&lt;/code>, etc.), les nouvelles directives (comme &lt;code>system-ui&lt;/code>), je pense qu’il n’est vraiment pas nécessaire d’envoyer systématiquement des fichiers à chaque internaute.&lt;/p> &lt;p>Sur ce site, malgré l’utilisation de chasse fixe (code) dans le texte, je renonce à l’idée d’envoyer des polices.&lt;/p> &lt;p>Les déclarations exactes de ma feuille de style sont toujours disponibles chez GitHub dans le fichier &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/blob/main/assets/css/all.css">&lt;code>all.css&lt;/code>&lt;/a>.&lt;/p> &lt;hr> &lt;p>J’attends avec impatience l’arrivée de la directive &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-data">&lt;code>prefers-reduced-data&lt;/code>&lt;/a> qui permettra(it) de gérer les choses beaucoup plus simplement.&lt;/p> &lt;hr> &lt;p>À ma connaissance, la police la plus légère actuellement disponible est &lt;a href="https://vercel.com/font">Geist&lt;/a>. Un seul fichier permet de remplacer les 4 variations dont je parlais ci-dessus. Une fois passée par &lt;a href="https://github.com/zachleat/glyphhanger">Glyphhanger&lt;/a>, elle pèse environ 20 kB. Toutefois, la version elle ne dispose pas d’un vrai italique, mais d’une version oblique.&lt;/p> &lt;hr> &lt;p>&lt;strong>Ajout du 30 avril 2024.&lt;/strong> Les polices système (San Franciso, Segoe UI et Roboto) sont excellentes pour les personnes dyslexiques. Elles sont bien meilleures que plusieurs polices prétendument optimisées. Je vous conseille vivement la lecture et le visionnage de &lt;a href="https://pimpmytype.com/dyslexia-fonts/">Dyslexia friendly fonts: Are they any good?&lt;/a>.&lt;/p></description></item><item><title>Introduction aux flux RSS et Atom</title><link>https://nicolasfriedli.ch/blog/rss-introduction/</link><pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/rss-introduction/</guid><description>&lt;p>Les flux RSS (Really Simple Syndication) existent depuis 25 ans. Ils sont simples, efficaces et fiables, mais ils restent méconnus par beaucoup d’internautes pour qui c’est un truc de spécialistes.&lt;/p> &lt;p>Deux remarques introductives:&lt;/p> &lt;ul> &lt;li>prendre en main les flux RSS et constituer une première liste de sites prend un peu de temps (mais permet d’en gagner beaucoup par la suite)&lt;/li> &lt;li>je ne ferai pas de distinction entre RSS et Atom (Atom Syndication Format) qui sont identiques à l’utilisation&lt;/li> &lt;/ul> &lt;h2 id="ca-sert-a-quoi">Ça sert à quoi&lt;/h2> &lt;p>Pour commencer ce petit parcours, j’ai demandé à ma femme &lt;a href="https://dianefriedli.ch/">Diane Friedli&lt;/a> de me dire spontanément comment elle définirait les RSS:&lt;/p> &lt;blockquote> &lt;p>Les flux RSS, ça te permet de savoir qu’il y a des nouveautés sur les sites qui t’intéressent sans avoir besoin d’aller voir chacun d’eux.&lt;/p>&lt;/blockquote> &lt;p>Ma définition, un peu plus complète, mais moins limpide:&lt;/p> &lt;blockquote> &lt;p>Les flux RSS permettent de s’abonner aux nouvelles publications de sites choisis. Ils sont consultés dans un logiciel spécifique (agrégateur) qui permet de gérer ses lectures. Les nouveautés s’affichent de manière chronologique ou selon un classement personnel. C’est une méthode de consultation fiable, rapide, écologique et anonyme.&lt;/p>&lt;/blockquote> &lt;p>Pour répondre à la question spécifique de l’utilité:&lt;/p> &lt;blockquote> &lt;p>Les flux RSS permettent d’organiser facilement une veille personnalisée et systématique.&lt;/p>&lt;/blockquote> &lt;h2 id="comment-ca-se-presente-pratique">Comment ça se présente (pratique)&lt;/h2> &lt;p>Voici ce qui se passe quand je me connecte à mon agrégateur de flux:&lt;/p> &lt;ul> &lt;li>je vois la liste des nouvelles publications depuis ma dernière connexion&lt;/li> &lt;li>l’instant, j’ai 47 nouvelles publications issues des 340 sites j’ai décidé de suivre&lt;/li> &lt;li>ces nouveautés sont réparties dans des rubriques (selon ma propre organisation): &lt;ul> &lt;li>4 billets publiés sur des blogs protestants&lt;/li> &lt;li>2 dans ma rubrique culture&lt;/li> &lt;li>2 dans ma rubrique web en français&lt;/li> &lt;li>6 dans ma rubrique consacrée aux médias&lt;/li> &lt;li>etc.&lt;/li> &lt;/ul> &lt;/li> &lt;li>je vais les consulter soit de manière globale, soit par rubrique: &lt;ul> &lt;li>je vais parcourir les 32 publications de ma rubrique web en anglais&lt;/li> &lt;li>puis les 15 restantes de manière antéchronologique&lt;/li> &lt;/ul> &lt;/li> &lt;li>quand un article m’intéresse, mais que je n’ai pas le temps de le lire, je vais le stocker dans «Lire plus tard»&lt;/li> &lt;li>à la fin de ma visite, j’aurai en principe tout lu (sauf les publications à lire plus tard)&lt;/li> &lt;li>parfois, je ne fais que survoler des articles (mais je sais de quoi ils parlent et ça me suffit)&lt;/li> &lt;li>j’ai aussi la possibilité de laisser des articles non lus pour ma prochaine visite (comme dans une boîte mail)&lt;/li> &lt;/ul> &lt;p>Autrement dit, ce matin, c’est comme si j’avais parcouru 340 sites pour chercher les (éventuelles) nouvelles publications. Puis que je les avais classées par catégories, puis que je les avais survolées (ou lues). Enfin que j’avais enregistrées celles que je souhaitais conserver pour plus tard en un lieu accessible de tous mes périphériques (ordinateur, téléphone ou tablette).&lt;/p> &lt;p>Franchement, nous avons mieux à faire que parcourir des centaines de sites, dont beaucoup n’ont pas de nouveautés depuis hier ou la semaine dernière. Les logiciels font ça mieux que nous.&lt;/p> &lt;h2 id="comment-ca-fonctionne-technique">Comment ça fonctionne (technique)&lt;/h2> &lt;p>Les flux RSS sont des fichiers qui ne sont pas faits pour être lus directement par vous et moi, mais pour être transformés et affichés par des logiciels comme des agrégateurs.&lt;/p> &lt;p>Ce qui fait leur force, c’est qu’ils sont bien codifiés (et peuvent être &lt;a href="https://validator.w3.org/feed/check.cgi?url=https%3A%2F%2Fnicolasfriedli.ch%2Findex.xml">validés&lt;/a> comme celui de ce site). Ils ressemblent à quelque chose comme ceci:&lt;/p> &lt;pre tabindex="0">&lt;code>titre du site description date de dernière modification lien (page d’accueil) billet de blog 1: titre description (ou contenu complet) date de publication lien ... billet de blog 10: titre description (ou contenu complet) date de publication lien &lt;/code>&lt;/pre>&lt;p>Ce formalisme permet:&lt;/p> &lt;dl> &lt;dt>rapidité&lt;/dt> &lt;dd>c’est un fichier léger à télécharger et simple à analyser (c’est pourquoi un agrégateur peut vérifier des centaines de sites en quelques secondes)&lt;/dd> &lt;dt>écologie&lt;/dt> &lt;dd>ce fichier léger minimise les ressources utilisées et il évite de se rendre sur un site web, beaucoup plus lourd, s’il n’y a pas de nouveauté à consulter&lt;/dd> &lt;dt>fiabilité&lt;/dt> &lt;dd>la lecture d’un fichier bien formaté est beaucoup plus fiable que la consultation humaine d’un site pour découvrir des nouveautés (qui ne sont pas toujours visibles en page d’accueil)&lt;/dd> &lt;/dl> &lt;h2 id="pourquoi-cest-genial">Pourquoi c’est génial&lt;/h2> &lt;p>Comme l’écrivait Thierry Crouzet dans &lt;a href="https://tcrouzet.com/books/la-mecanique-du-texte/">La mécanique du texte&lt;/a>:&lt;/p> &lt;blockquote> &lt;p>Le RSS est presque trop génial. [&amp;hellip;] Il laisse imaginer un monde où chacun serait sa propre agence de presse, où chacun recevrait les informations sélectionnées par lui. Ce serait en quelque sorte un monde trop beau, et trop peu rentable.&lt;/p>&lt;/blockquote> &lt;p>Un système tout simple permet de lire de l’actualité sans passer par un moteur de recherche ni par un réseau social. Des sources peuvent être ajoutées ou supprimées en tout temps. Et surtout, la lecture n’est pas polluée par des algorithmes qui:&lt;/p> &lt;ul> &lt;li>censurent des contenus (selon des critères souvent douteux)&lt;/li> &lt;li>proposent des tris ridicules (ce qui fait réagir est toujours mis en évidence)&lt;/li> &lt;li>suggèrent des nouveautés sans arrêt (même quand tout est lu, il ne faut pas que les internautes repartent)&lt;/li> &lt;/ul> &lt;p>Voilà ce que permettent les flux RSS:&lt;/p> &lt;ul> &lt;li>la consultation de ce que je souhaite (et &lt;em>tout&lt;/em> ce que je souhaite)&lt;/li> &lt;li>la possibilité de trier les contenus selon mes préférences&lt;/li> &lt;li>le droit d’arriver au bout de ma liste de lectures (et &lt;em>seulement&lt;/em> de celles voulues)&lt;/li> &lt;/ul> &lt;h2 id="comment-lire-des-fluxrss">Comment lire des flux RSS&lt;/h2> &lt;p>Je conseille l’utilisation d’un agrégateur en ligne, parce qu’il permet de reprendre la lecture au même endroit, quel que soit le périphérique utilisé.&lt;/p> &lt;p>J’utilise &lt;a href="https://www.inoreader.com/">Inoreader&lt;/a> en version pro. C’est à mon avis le meilleur lecteur en termes de possibilités, même si l’interface est parfois un peu tordue. La version basique gratuite permet de suivre jusqu’à 150 sites.&lt;/p> &lt;p>Un agrégateur très utilisé est &lt;a href="https://feedly.com/news-reader">Feedly&lt;/a>. Je ne le recommande que dans sa version gratuite, limitée à 3 répertoires et 100 sites. J’ai utilisé la version payante il y a quelques années, mais mes tests avec la dernière version Pro+ et son intelligence artificielle ne sont pas concluants.&lt;/p> &lt;p>J’ai beaucoup de bons échos de &lt;a href="https://feedbin.com/">Feedbin&lt;/a>, un agrégateur simple avec quelques options intéressantes. Je l’ai testé, mais il me manquait quelques possibilités plus pointues. Uniquement en version payante; à prix raisonnable.&lt;/p> &lt;p>On peut aussi installer un logiciel sur son propre serveur (par exemple &lt;a href="https://tontof.net/kriss/feed/">KrISS feed&lt;/a>), utiliser un logiciel dédié sur son ordinateur (par exemple &lt;a href="https://support.mozilla.org/en-US/products/thunderbird/news-feeds-rss-blogs-and-social-thunderbird">Thunderbird&lt;/a>) ou publier des flux RSS dans WordPress (par exemple &lt;a href="https://wordpress.org/documentation/article/rss-block/">RSS Block&lt;/a>).&lt;/p> &lt;h2 id="pourquoi-cest-irremplacable">Pourquoi c’est irremplaçable&lt;/h2> &lt;p>À mon avis, les flux RSS sont irremplaçables:&lt;/p> &lt;ul> &lt;li> &lt;p>Ils permettent un abonnement ou un désabonnement complètement anonyme par défaut, alors que les lettres de nouvelles (newsletter) donnent une adresse ou demandent des efforts pour cacher la sienne. Aucune crainte de ne pas pouvoir se désabonner ou de recevoir du spam.&lt;/p> &lt;/li> &lt;li> &lt;p>Ils permettent une veille exhaustive. Je peux partir 2 semaines en vacances et lire tous les billets publiés en mon absence. C’est presque impossible sur les réseaux sociaux.&lt;/p> &lt;/li> &lt;li> &lt;p>Ils respectent mes propres règles du jeu. Je peux les trier dans l’ordre souhaité, les filtrer, marquer des articles lus ou non lus, créer des hiérarchies, etc. Des automatismes bien conçus sont souvent meilleurs qui des intelligences artificielles qui ne cherchent qu’à impressionner.&lt;/p> &lt;/li> &lt;li> &lt;p>La liste des flux auxquels je suis abonné peut être exportée facilement. Je peux la sauvegarder, la partager à d’autres, l’importer dans un autre logiciel, etc. La liberté, c’est de pouvoir changer de plateforme et d’outil librement.&lt;/p> &lt;/li> &lt;li> &lt;p>La présentation unifiée permet une lecture rapide et agréable, même quand des flux proviennent de sites peu accessibles ou inconfortables. La légèreté des flux permet d’oublier la lenteur des sites qui les produisent. Plutôt que l’originalité, c’est l’efficacité qui compte.&lt;/p> &lt;/li> &lt;/ul> &lt;hr> &lt;p>Dans son excellente newsletter &lt;a href="https://buttondown.email/ownyourweb">Own Your Web&lt;/a>, Matthias Ott propose &lt;a href="https://buttondown.email/ownyourweb/archive/issue-09/">Issue 9: We ❤️ RSS&lt;/a>. Il vaut la peine de suivre les liens proposés pour approfondir le sujet. Les internautes qui ne maîtrisent pas assez l’anglais auront intérêt à lire au moins l’article &lt;a href="https://timkadlec.com/remembers/2023-02-23-investing-in-rss/">Investing in RSS&lt;/a> de Tim Kadlec en traduction automatique.&lt;/p> &lt;hr> &lt;p>Cory Doctorow a publié le 16 octobre 2024 un billet de qualité sur les flux RSS comme résistance à la &lt;a href="https://ploum.net/2023-06-15-merdification.html">merdification des choses&lt;/a>: &lt;a href="https://pluralistic.net/2024/10/16/keep-it-really-simple-stupid/">You should be using an RSS reader&lt;/a>.&lt;/p></description></item><item><title>Configuration d’Hugo</title><link>https://nicolasfriedli.ch/blog/hugo-configuration/</link><pubDate>Fri, 05 Apr 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/hugo-configuration/</guid><description>&lt;p>La configuration d’Hugo est simple quand on part de zéro, mais souvent complexe lorsqu’un thème existant est repris. Il est bon de connaître certains concepts de base pour se débrouiller ensuite.&lt;/p> &lt;h2 id="fichier-minimal">Fichier minimal&lt;/h2> &lt;p>Hugo a besoin d’un fichier de configuration pour fonctionner. Par défaut, il s’agit de &lt;code>hugo.toml&lt;/code> à la racine du projet. L’ancien fichier par défaut était &lt;code>config.toml&lt;/code> (qui fonctionne toujours).&lt;/p> &lt;p>Le plus petit fichier suffisant en &lt;a href="https://toml.io/en/">TOML&lt;/a> (Tom’s Obvious Minimal Language):&lt;/p> &lt;pre tabindex="0">&lt;code>baseURL = &amp;#34;https://nicolasfriedli.ch/&amp;#34; title = &amp;#34;Nicolas Friedli&amp;#34; languageCode = &amp;#34;fr&amp;#34; &lt;/code>&lt;/pre>&lt;p>Il pourrait être écrit en &lt;a href="https://yaml.org/">YAML&lt;/a> (YAML Ain’t Markup Language):&lt;/p> &lt;pre tabindex="0">&lt;code>baseURL: https://nicolasfriedli.ch/ title: Nicolas Friedli languageCode: fr &lt;/code>&lt;/pre>&lt;p>Ou en &lt;a href="http://www.json.org/json-en.html">JSON&lt;/a> (JavaScript Object Notation):&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;baseURL&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34;, &amp;#34;title&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;languageCode&amp;#34;: &amp;#34;fr&amp;#34; } &lt;/code>&lt;/pre>&lt;h2 id="preference-personnelle-pour-toml">Préférence personnelle pour TOML&lt;/h2> &lt;p>J’utilise TOML dans les fichiers de configuration, pour son excellent équilibre entre sa facilité de rédaction et sa fiabilité.&lt;/p> &lt;p>YAML pose parfois des problèmes comme le soulignent Ruud van Asseldonk dans &lt;a href="https://ruudvanasseldonk.com/2023/01/11/the-yaml-document-from-hell">The yaml document from hell&lt;/a> ou Chris Coyier dans &lt;a href="https://chriscoyier.net/2023/01/27/yaml-json-toml/">Yaml, JSON, Toml&lt;/a>.&lt;/p> &lt;p>JSON n’est pas un format très agréable à rédiger. Mais il n’est pas prévu pour cela.&lt;/p> &lt;h2 id="configuration-specifique-pour-mon-site">Configuration spécifique pour mon site&lt;/h2> &lt;p>L’adresse et le titre du site:&lt;/p> &lt;pre tabindex="0">&lt;code>baseURL = &amp;#34;https://nicolasfriedli.ch/&amp;#34; title = &amp;#34;Nicolas Friedli&amp;#34; &lt;/code>&lt;/pre>&lt;p>Le code de langue et la langue par défaut (que je configure même sur un site monolingue):&lt;/p> &lt;pre tabindex="0">&lt;code>languageCode = &amp;#34;fr&amp;#34; defaultContentLanguage = &amp;#34;fr&amp;#34; &lt;/code>&lt;/pre>&lt;p>Une sécurité si un nom de fichier source comprend un caractère problématique. Ou si j’utilise des taxonomies qui génèrent automatiquement des URL.&lt;/p> &lt;pre tabindex="0">&lt;code>removePathAccents = true &lt;/code>&lt;/pre>&lt;p>Je désactive ce que je n’utilise pas. J’ai désactivé les taxonomies, pour éviter de créer des pages de catégories ou de tags sans l’avoir choisi. Il est ainsi possible de renseigner (déjà) des catégories et tags dans les sources, mais de ne pas les afficher (pour le moment). Le fichier robots.txt est écrit à la main, dans &lt;code>/static/&lt;/code>. Donc:&lt;/p> &lt;pre tabindex="0">&lt;code>disableKinds = [ &amp;#34;taxonomy&amp;#34;, &amp;#34;term&amp;#34;, &amp;#34;robotsTXT&amp;#34;] &lt;/code>&lt;/pre>&lt;p>Le répertoire final est vidé avant compilation. La compilation est toujours complète. Et j’utilise les dates de Git (par exemple pour la dernière modification dans &lt;code>sitemap.xml&lt;/code>). Finalement, je ne génère pas de fichier &lt;code>lock&lt;/code>.&lt;/p> &lt;pre tabindex="0">&lt;code>cleanDestinationDir = true disableFastRender = true enableGitInfo = true noBuildLock = true &lt;/code>&lt;/pre>&lt;p>Je configure un copyright, mon nom et mon mail qui seront repris dans le flux RSS:&lt;/p> &lt;pre tabindex="0">&lt;code>copyright = &amp;#34;Creative Commons BY-SA&amp;#34; [params.author] name = &amp;#34;Nicolas Friedli&amp;#34; email = &amp;#34;hello+rss@nicolasfriedli.ch&amp;#34; &lt;/code>&lt;/pre>&lt;p>Pas besoin de statistiques des balises HTML et des attributs &lt;code>class&lt;/code> et &lt;code>id&lt;/code> utilisés:&lt;/p> &lt;pre tabindex="0">&lt;code>[build] writeStats = false &lt;/code>&lt;/pre>&lt;p>Les &lt;code>id&lt;/code> des titres &lt;code>h2&lt;/code>, &lt;code>h3&lt;/code>, etc., sont propres. C’est surtout important quand on génère une table des matières interne à la page:&lt;/p> &lt;pre tabindex="0">&lt;code>[markup.goldmark.parser] autoHeadingIDType = &amp;#34;github-ascii&amp;#34; &lt;/code>&lt;/pre>&lt;p>Les fichiers de sortie sont minifiés. Je supprime les attributs par défaut qui ne sont plus utiles en HTML5. Mais je conserve les guillemets et les sauts de lignes par souci de lisibilité. Voici la configuration:&lt;/p> &lt;pre tabindex="0">&lt;code>[minify] minifyOutput = true [minify.tdewolff.html] keepDefaultAttrVals = false keepQuotes = true keepWhitespace = true &lt;/code>&lt;/pre>&lt;p>Je décide de générer un RSS global, pour tout le site. Je l’active donc pour la racine, mais pas pour les sections:&lt;/p> &lt;pre tabindex="0">&lt;code>[outputs] home = [&amp;#34;HTML&amp;#34;, &amp;#34;RSS&amp;#34;] section = [&amp;#34;HTML&amp;#34;] &lt;/code>&lt;/pre>&lt;p>Finalement, je gère les relations entre billets par taxonomie:&lt;/p> &lt;pre tabindex="0">&lt;code>[related] includeNewer = true threshold = 50 toLower = true [[related.indices]] name = &amp;#34;categories&amp;#34; weight = 80 &lt;/code>&lt;/pre>&lt;p>La &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/blob/main/hugo.toml">version courante&lt;/a>, qui peut différer des exemples de cette page, est toujours disponible chez GitHub.&lt;/p> &lt;h2 id="pas-de-theme">Pas de thème&lt;/h2> &lt;p>Celles et ceux qui connaissent un peu Hugo remarqueront que mon fichier de configuration n’utilise pas de thème:&lt;/p> &lt;pre tabindex="0">&lt;code>theme = &amp;#34;monthemehugo&amp;#34; &lt;/code>&lt;/pre>&lt;p>Je n’utilise que le répertoire &lt;code>/layouts/&lt;/code> pour mes modèles de pages, mes shortcodes, etc. Aucun thème existant n’est utilisé pour mon site.&lt;/p> &lt;p>Si les &lt;em>layouts&lt;/em> permettent de surcharger les fichiers d’un thème activé. Ils peuvent aussi être utilisés seuls. Ils ne surchargent rien, mais sont suffisants.&lt;/p> &lt;p>Au passage, je trouve que l’apprentissage des logiques d’Hugo est meilleur si un thème n’est pas activé dès le début. C’est un conseil que je donne aux personnes qui débutent: commencez par créer vos &lt;em>layouts&lt;/em>, puis activez un thème si nécessaire.&lt;/p> &lt;h2 id="modularisation-de-la-configuration">Modularisation de la configuration&lt;/h2> &lt;p>Le fichier de configuration peut être séparé en plusieurs petits fichiers. Je vois peu d’intérêt à le faire avec le mien qui fait quelques dizaines de lignes. Mais ce peut être intéressant si &lt;code>hugo.toml&lt;/code> devient trop long ou trop complexe.&lt;/p> &lt;p>Pour modulariser la configuration, il faut placer les différents fichiers dans &lt;code>/config/&lt;/code>. Le nom de fichier est alors la section de configuration. Par exemple, la minification dans mon fichier unique est:&lt;/p> &lt;pre tabindex="0">&lt;code>[minify] minifyOutput = true [minify.tdewolff.html] keepDefaultAttrVals = false keepQuotes = true keepWhitespace = true &lt;/code>&lt;/pre>&lt;p>Déplacée dans /config/minify.toml/, elle devient:&lt;/p> &lt;pre tabindex="0">&lt;code>minifyOutput = true [tdewolff.html] keepDefaultAttrVals = false keepQuotes = true keepWhitespace = true &lt;/code>&lt;/pre>&lt;p>La séparation en différents fichiers me paraît très utile dans certains cas:&lt;/p> &lt;ul> &lt;li>quand un site est multilingue, la &lt;a href="https://gohugo.io/content-management/multilingual/#configure-languages">configuration des langues&lt;/a> dans un fichier dédié me semble pertinente (surtout s’il y a des paramètres par langue, etc.)&lt;/li> &lt;li>quand un site a un grand menu de navigation, un fichier dédié est une bonne idée&lt;/li> &lt;li>et bien entendu quand certaines parties de configuration sont réutilisées telles quelles dans différents projets&lt;/li> &lt;/ul> &lt;p>Surtout, la séparation en fichier permet de proposer des portions de configurations plus simples à des personnes qui interviennent sur le site. Les responsables de la partie rédactionnelle éditeront plus facilement un fichier de menu qu’une configuration monolithique.&lt;/p> &lt;h2 id="configuration-par-environnement">Configuration par environnement&lt;/h2> &lt;p>Finalement, différentes versions de configuration sont applicables selon l’environnement. Un exemple simple, pour la minification:&lt;/p> &lt;ul> &lt;li>dans &lt;code>/config/_default/hugo.toml&lt;/code>: aucune option de minification mentionnée&lt;/li> &lt;li>dans &lt;code>/config/production/hugo.toml&lt;/code>: les quelques lignes sur la minification de mon fichier&lt;/li> &lt;/ul> &lt;p>Ainsi, durant le développement, les fichiers ne sont jamais minifiés. Alors que lors de la compilation ils le sont. Par défaut, hugo server est en environnement de développement et hugo en environnement de production.&lt;/p> &lt;p>D’autres environnements sont utilisables et les variables peuvent être passées à la compilation. Ce sont des finesses inutiles pour un site aussi léger que le mien.&lt;/p></description></item><item><title>Police optimisée pour les titres</title><link>https://nicolasfriedli.ch/blog/police-optimisee-titres/</link><pubDate>Sat, 30 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/police-optimisee-titres/</guid><description>&lt;p>Voici la stratégie j’applique sur mon site pour disposer d’une belle police pour les titres et les intertitres sans prétériter la performance.&lt;/p> &lt;p>Cette solution n’est plus utilisée sur ce site, mais toutes les explications restent valables.&lt;/p> &lt;h2 id="optimisation-de-la-police">Optimisation de la police&lt;/h2> &lt;p>J’ai choisi d’utiliser &lt;a href="https://ateliertriay.github.io/bricolage/">Bricolage Grotesque&lt;/a> pour les titres (&lt;code>h1&lt;/code>, &lt;code>h2&lt;/code>, etc.) de mon blog. C’est une police variable, ce qui signifie qu’elle dispose de beaucoup de variantes, mais qu’elle est aussi assez lourde. Elle peut varier de taille optique, de largeur et de poids (&lt;code>opsz&lt;/code>, &lt;code>wdth&lt;/code> et &lt;code>wght&lt;/code>).&lt;/p> &lt;p>Le téléchargement du fichier de départ se passe dans le &lt;a href="https://github.com/ateliertriay/bricolage/tree/main">dépôt GitHub&lt;/a> ou chez &lt;a href="https://fonts.google.com/specimen/Bricolage+Grotesque">Google Fonts&lt;/a>.&lt;/p> &lt;p>Pour être certain d’avoir un fichier léger, je vais convertir un fichier &lt;code>ttf&lt;/code> en format &lt;code>woff2&lt;/code>. Ce format est accepté par tous les navigateurs. Je ne souhaite pas de version variable sur mon site pour une question de poids. Comme tous mes titres sont en gras, je choisis la version statique &lt;code>bold&lt;/code> (pour éviter la variation &lt;code>wght&lt;/code>) et je prends celle en 48px (pour éviter la variation &lt;code>opsz&lt;/code>). Je limite la gamme de caractères à l’alphabet latin.&lt;/p> &lt;p>Avec le génial &lt;a href="https://github.com/zachleat/glyphhanger">Glyphhanger&lt;/a> de l’excellent Zach Leatherman:&lt;/p> &lt;pre tabindex="0">&lt;code>glyphhanger --formats=woff2 --subset=BricolageGrotesque_48pt-Bold.ttf --LATIN &lt;/code>&lt;/pre>&lt;p>La taille du fichier passe de 79kB à 25kB. Je le renomme en &lt;code>bricolage.woff2&lt;/code> pour la suite.&lt;/p> &lt;p>Si le truc de Glyphanger semble trop compliqué, &lt;a href="https://gwfh.mranftl.com/fonts/bricolage-grotesque?subsets=latin">Google Webfonfs Helper&lt;/a> ou le &lt;a href="https://www.fontsquirrel.com/tools/webfont-generator">Webfont Generator de Font Squirrel&lt;/a> permettent de simplifier le travail.&lt;/p> &lt;h2 id="affichage-par-la-feuille-de-style-css">Affichage par la feuille de style CSS&lt;/h2> &lt;p>Désormais, il faut utiliser ce fichier dans les règles de l’art pour que tout se passe bien.&lt;/p> &lt;p>Dans ma feuille de style, j’ai des règles de ce type (&lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/blob/main/assets/css/screen.css">feuille de style complète dans GitHub&lt;/a>):&lt;/p> &lt;pre tabindex="0">&lt;code>:root { --font-main: ui-sans-serif, Roboto, system-ui, sans-serif; } html { font-family: var(--font-main); } &lt;/code>&lt;/pre>&lt;p>J’ajoute ceci pour les 3 premiers niveaux de titres:&lt;/p> &lt;pre tabindex="0">&lt;code>:root { --font-title: BricolageGrotesque, var(--font-main); } h1, h2, h3 { font-family: var(--font-title); } &lt;/code>&lt;/pre>&lt;p>Ce qui signifie que, si Bricolage Grotesque n’est pas disponible, ce sera la même police que celle du texte qui sera utilisée. On évite ainsi de mauvaises surprises.&lt;/p> &lt;p>Et maintenant, on appelle la police que j’ai placée dans &lt;code>/fonts/&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>@font-face { font-display: swap; font-family: BricolageGrotesque; font-style: normal; font-weight: 700; src: url(&amp;#34;/fonts/bricolage.woff2&amp;#34;) format(&amp;#34;woff2&amp;#34;); } &lt;/code>&lt;/pre>&lt;p>Avec un site généré par Hugo, on placera le fichier source dans &lt;code>/static/fonts/&lt;/code>.&lt;/p> &lt;h2 id="strategie-de-chargement-et-de-cache">Stratégie de chargement et de cache&lt;/h2> &lt;p>Si je dois être certain que le site ne soit jamais ralenti par le chargement de police, je peux choisir un affichage optionnel avec:&lt;/p> &lt;pre tabindex="0">&lt;code>font-display: optional; &lt;/code>&lt;/pre>&lt;p>Si ma feuille de style était dans un fichier externe, je pourrais lancer le chargement avant même la disponibilité du CSS:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;link rel=&amp;#34;preload&amp;#34; href=&amp;#34;/fonts/bricolage.woff2&amp;#34; as=&amp;#34;font&amp;#34; type=&amp;#34;font/woff2&amp;#34; crossorigin&amp;gt; &lt;/code>&lt;/pre>&lt;p>Et dans tous les cas, j’ajoute une règle de cache dans le fichier &lt;code>.htaccess&lt;/code>, pour tous les fichiers de type &lt;code>woff2&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;filesMatch &amp;#34;.(woff2)$&amp;#34;&amp;gt; Header set Cache-Control &amp;#34;max-age=63072000,immutable&amp;#34; &amp;lt;/filesMatch&amp;gt; &lt;/code>&lt;/pre>&lt;p>Ou, quand j’utilise Netlify, une règle dans &lt;code>_headers&lt;/code> appliquée pour un répertoire plutôt qu’un type de fichiers:&lt;/p> &lt;pre tabindex="0">&lt;code>/fonts/* Cache-Control: max-age=63072000,immutable &lt;/code>&lt;/pre>&lt;p>Ces règles de cache signifient que le fichier restera en mémoire durant une année et ne sera pas rechargé. Pour des informations très précises sur la gestion du cache, je conseille &lt;a href="https://www.youtube.com/watch?v=qVQjGwm_mmw">Cache Rules Everything&lt;/a> par Harry Roberts.&lt;/p> &lt;h2 id="ameliorer-votre-site">Améliorer votre site&lt;/h2> &lt;p>La même politique peut s’appliquer pour toutes les polices de votre site. Vous pouvez entreprendre une même démarche en vous inspirant des travaux de Zach Leatherman:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://beyondtellerrand.com/events/dusseldorf-2019/speakers/zach-leatherman">The Scoville Scale of Web Font Loading Opinions&lt;/a>&lt;/li> &lt;li>&lt;a href="https://www.zachleat.com/web/comprehensive-webfonts/">A Comprehensive Guide to Font Loading Strategies&lt;/a>&lt;/li> &lt;/ul> &lt;p>Mais quand plusieurs polices entrent en jeu, d’autres questions se posent. Par exemple:&lt;/p> &lt;ul> &lt;li>quels fichiers précharger (&lt;code>preload&lt;/code>) pour ne pas faire de transferts inutiles?&lt;/li> &lt;li>quelle police afficher de quelle manière (&lt;code>optional&lt;/code> ou &lt;code>swap&lt;/code>)?&lt;/li> &lt;li>quelle pertinence d’une feuille de style externe uniquement pour les chargements de polices?&lt;/li> &lt;/ul> &lt;p>Dans tous les cas, essayez d’éviter les services tiers comme Google Fonts. Ils posent des problèmes de confidentialité, de fiabilité et de performance. Et comme ils proposent un cache très court, ils gaspillent pas mal de ressources en transferts inutiles.&lt;/p></description></item><item><title>Sans commentaire!</title><link>https://nicolasfriedli.ch/blog/sans-commentaire/</link><pubDate>Tue, 26 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/sans-commentaire/</guid><description>&lt;p>J’ai décidé de ne pas activer de système de commentaires sur ce site. En 2024, les commentaires sur les blogs personnels posent plus de problèmes qu’ils n’en résolvent. Pour des raisons de simplicité technique, de performances, d’écologie et de pertinence, je vous laisse m’écrire par mail.&lt;/p> &lt;h2 id="un-blog-selon-wikipedia">Un blog selon Wikipédia&lt;/h2> &lt;p>Commentaires ou pas? L’article &lt;a href="https://fr.wikipedia.org/wiki/Blog">&lt;em>Blog&lt;/em> de Wikipédia&lt;/a> ne tranche pas:&lt;/p> &lt;blockquote> &lt;p>[les articles] sont la plupart du temps ouverts aux commentaires des lecteurs [et lectrices].&lt;/p> &lt;p>[&amp;hellip;] car chaque visiteur [ou visiteuse] d’un blog peut laisser des commentaires sur le blog lui-même, ou bien contacter le blogueur [ou la blogueuse] par courriel.&lt;/p>&lt;/blockquote> &lt;p>À mon humble avis, la question des commentaires n’est pas définitoire d’un blog. &lt;strong>Ce qui fait un blog, c’est l’accumulation de publications personnelles datées et signées.&lt;/strong> Tout le reste est accessoire.&lt;/p> &lt;p>Toutefois, les commentaires ouverts sont souvent disponibles. Ils ont fait partie de l’histoire des blogs, mais me semblent aujourd’hui dépassés.&lt;/p> &lt;h2 id="contraintes-techniques-et-performance">Contraintes techniques et performance&lt;/h2> &lt;p>Ce site est &lt;a href="https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/">statique et généré par Hugo&lt;/a>. Je ne souhaite pas l’alourdir pour permettre des commentaires. Je ne souhaite pas installer et maintenir un système comme WordPress, Drupal, SPIP, typo3 ou autre. Je souhaite encore moins ajouter un système externe, comme Disqus, qui pose des problèmes de confidentialité et de poids des pages.&lt;/p> &lt;p>La rapidité et la légèreté sont un choix. Il serait malvenu de proposer un site plus lourd et plus lent à une large majorité d’internautes qui ne commenteront jamais, au bénéfice de celles et ceux qui pourraient commenter.&lt;/p> &lt;p>&lt;strong>L’absence de commentaires est un choix pragmatique&lt;/strong>, tant pour mon travail de gestion du site que pour le confort des lecteurs et lectrices.&lt;/p> &lt;h2 id="spam-et-ecologie">Spam et écologie&lt;/h2> &lt;p>Il existe toutefois de bons outils pour gérer le spam dans les commentaires. En premier lieu &lt;a href="https://akismet.com/fr/">Akismet&lt;/a> proposé par Automattic, l’entreprise qui développe WordPress. La qualité du filtrage est excellente. Les indésirables ne passent pas la rampe.&lt;/p> &lt;p>Si la question de la modération du spam est résolue, l’aperçu des statistiques d’Akismet fait froid dans le dos. Sur beaucoup de sites, le taux de spam est supérieur à 90% des messages reçus.&lt;/p> &lt;p>En d’autres termes, 9 messages sur 10 envoyés sont inscrits dans la base de données, puis traités par un service externe, pour être finalement envoyés à la poubelle. D’un point de vue écologique, c’est indécent.&lt;/p> &lt;p>Les blogueurs et blogueuses devraient toujours se poser la question de la pertinence des commentaires ouverts. Certes, c’est agréable d’avoir un retour positif, mais ça n’en vaut pas toujours le prix. En fin de compte, c’est parce que beaucoup (trop) de sites permettent des commentaires que des outils de spam sont développés.&lt;/p> &lt;p>&lt;strong>Le paradoxe, c’est que l’efficacité d’Akismet entretient la publication de messages indésirables et le gâchis de ressources.&lt;/strong> Si l’outil était mauvais, les commentaires seraient fermés (ou réservés aux personnes inscrites) et les indésirables n’existeraient plus depuis longtemps.&lt;/p> &lt;h2 id="lieux-de-discussion">Lieux de discussion&lt;/h2> &lt;p>Les lieux pour commenter se sont multipliés. Il y avait les blogs et les forums. Il y a aujourd’hui les réseaux sociaux publics (Facebook, Instagram, Mastodon, Twitter/X), les plateformes de diffusion vidéo (Twitch, YouTube), les services privés (Discord, Slack), les messageries instantanées (Telegram, WhatsApp) pour ne citer que quelques exemples.&lt;/p> &lt;p>Quoi que l’on fasse de nos blogs, les contenus pourront toujours être discutés ailleurs et il ne sera jamais possible de suivre tous les débats. Même avec un système de commentaires activé, ce n’est plus «sous le billet» que se passe l’essentiel des interactions.&lt;/p> &lt;p>&lt;strong>Dans mon monde de rêve, toutes les interactions se feraient par un nouvel article de blog.&lt;/strong> Un billet m’a interpellé, m’a déplu ou m’a déçu, j’en écris un autre sur mon site. Se crée alors un réseau, sans coordination et sans modération centrale. Ainsi chaque site personnel est &lt;em>de fait&lt;/em> un lieu de discussion.&lt;/p> &lt;h2 id="commentaires-sans-interet">Commentaires sans intérêt&lt;/h2> &lt;p>Je ne peux terminer ce billet sans passer par le constat qui fâche. Les interactions sont de moins en moins intéressantes, sur les blogs comme ailleurs. Le schéma suivant est triste à pleurer:&lt;/p> &lt;blockquote> &lt;p>Merci Nicolas pour ce super billet.&lt;/p> &lt;blockquote> &lt;p>Avec plaisir, Sophie.&lt;/p>&lt;/blockquote>&lt;/blockquote> &lt;p>puis, interaction suivante:&lt;/p> &lt;blockquote> &lt;p>Belle réflexion, amitiés.&lt;/p> &lt;blockquote> &lt;p>Merci cher Pierre.&lt;/p>&lt;/blockquote>&lt;/blockquote> &lt;p>&lt;strong>Les pouces levés, les cœurs et autres «interactions légères» ont tué le commentaire construit.&lt;/strong> D’ailleurs, les réseaux sociaux ne prévoient qu’un lien par publication (avec prévisualisation), voilà qui en dit long sur ce qui est attendu.&lt;/p> &lt;p>Lorsque j’avais encore des commentaires sur des sites, c’était avant tout pour flatter mon propre &lt;em>ego&lt;/em>. Mais plus pour apprendre quelque chose ou relancer ma réflexion.&lt;/p> &lt;p>Si vous avez quelque chose à me dire, mon adresse est disponible sur ma page de contact. Et si votre messagerie est correctement configurée, il suffit de cliquer sur &lt;a href="mailto:hello+2025@nicolasfriedli.ch?subject=Re%3A%20Sans%20commentaire!">Répondre par mail&lt;/a> pour avoir un message au titre déjà rédigé.&lt;/p></description></item><item><title>Enseignements du framework Diátaxis</title><link>https://nicolasfriedli.ch/blog/diataxis-introduction/</link><pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/diataxis-introduction/</guid><description>&lt;p>Conçu par un spécialiste de documentation technique, le cadre de travail Diátaxis permet d’améliorer la qualité de ses pages web dans d’autres domaines que le code logiciel.&lt;/p> &lt;h2 id="diataxis-en-bref">Diátaxis en bref&lt;/h2> &lt;p>Le framework &lt;a href="https://diataxis.fr/">Diátaxis&lt;/a> propose des principes pour une approche systématique de la rédaction de documentation technique. Je pense qu’il peut être utilisé pour toute forme de documentation. Il a été développé par Daniele Procida.&lt;/p> &lt;p>Par la &lt;strong>structure&lt;/strong> qu’il propose, il facilite l’&lt;strong>utilisation&lt;/strong> de la documentation pour les internautes et la &lt;strong>maintenance&lt;/strong> pour les rédacteurs et rédactrices.&lt;/p> &lt;p>Les 4 types de contenus de toute documentation sont regroupés en 2 axes:&lt;/p> &lt;ul> &lt;li>les &lt;strong>tutoriels&lt;/strong> sont orientés vers l’&lt;em>apprentissage&lt;/em> et sont utiles à l’&lt;em>action&lt;/em>&lt;/li> &lt;li>les &lt;strong>guides how-to&lt;/strong> sont sont orientés vers l’&lt;em>application&lt;/em> et sont utiles à l’&lt;em>action&lt;/em>&lt;/li> &lt;li>les &lt;strong>références&lt;/strong> sont orientés vers l’&lt;em>application&lt;/em> et sont utiles à l’action à la &lt;em>connaissance&lt;/em>&lt;/li> &lt;li>les &lt;strong>explications&lt;/strong> sont orientées vers l’&lt;em>apprentissage&lt;/em> et sont utiles à la &lt;em>connaissance&lt;/em>&lt;/li> &lt;/ul> &lt;p>En plus du site de référence, je conseille les vidéos suivantes pour en apprendre plus:&lt;/p> &lt;ul> &lt;li>découverte de l’outil: &lt;a href="https://www.youtube.com/watch?v=t4vKPhjcMZg">What nobody tells you about documentation&lt;/a>&lt;/li> &lt;li>atelier: &lt;a href="https://www.youtube.com/watch?v=710uQqIqsWk">Python Docs Community Workshop: Introduction to Diataxis&lt;/a>&lt;/li> &lt;li>sur la croissance d’un corpus: &lt;a href="https://www.youtube.com/watch?v=Wc7n7uIg4AM">Always complete, never finished&lt;/a>&lt;/li> &lt;/ul> &lt;p>Voici ce qui m’a intéressé (et convaincu) dans la démarche.&lt;/p> &lt;h2 id="regrouper-par-categories">Regrouper par catégories&lt;/h2> &lt;p>Le classement des contenus en 4 catégories permet de hiérarchiser l’information et de rapprocher ce qui doit l’être. Une structure propre est une condition nécessaire pour naviguer efficacement dans une documentation d’une certaine taille.&lt;/p> &lt;p>Le moteur de recherche ou l’index alphabétique ne remplaceront jamais une bonne structure. La chronologie d’un blog ou les liens très nombreux d’un wiki ne permettent pas non plus d’aider les internautes à &lt;em>comprendre&lt;/em> comment est structurée la documentation.&lt;/p> &lt;p>Sur ce thème, je conseille aussi la conférence &lt;a href="https://www.writethedocs.org/videos/na/2017/building-navigation-for-your-doc-site-5-best-practices-tom-johnson/">Building navigation for your doc site: 5 best practices&lt;/a> par Tom Johnson. Elle est complémentaire au travail de Daniele Procida.&lt;/p> &lt;p>En passant, je fais remarquer qu’une taxonomie est presque toujours pensée comme un arbre. Mais elle devrait d’abord être pensée comme un moyen de regroupement. C’est ensuite seulement qu’elle peut prendre la forme d’un arbre (ou pas). Le groupement par proximité est premier.&lt;/p> &lt;p>À terme, dans un corpus qui grandit, si les regroupements ne sont pas clairs, c’est la gabegie assurée.&lt;/p> &lt;h2 id="publics-cibles-et-personnes-differentes">Publics cibles et personnes différentes&lt;/h2> &lt;p>Les 4 catégories de Diátaxis s’adressent à plusieurs publics cibles et à des personnes différentes. Un exemple tout simple:&lt;/p> &lt;ul> &lt;li>le &lt;em>tutoriel&lt;/em> de la mousse au chocolat sur YouTube est fait pour les enfants qui n’ont jamais cuisiné (mais qui veulent faire une surprise à leurs parents)&lt;/li> &lt;li>la recette de la mousse au chocolat est un &lt;em>guide how-to&lt;/em> destiné aux personnes qui cuisinent (vous et moi)&lt;/li> &lt;li>l’&lt;em>explication&lt;/em> sur la chimie de la mousse au chocolat est destinée aux personnes curieuses (mais qui ne cuisinent pas forcément)&lt;/li> &lt;/ul> &lt;p>En première approche, on pourrait dire que chaque public cible peut être intéressé par 1 ou 2 catégories. C’est une manière de voir les choses, mais je pense qu’elle est erronée. &lt;strong>Une personne peut être intéressée à 1, 2, 3 ou 4 catégories de contenu.&lt;/strong>&lt;/p> &lt;h2 id="temporalite-differente-pour-les-memes-personnes">Temporalité différente pour les mêmes personnes&lt;/h2> &lt;p>Il faudrait plutôt dire que chaque personne peut être intéressée par les 4 catégories, mais à des moments différents. La notion de temporalité est plus intéressante, parce qu’évolutive.&lt;/p> &lt;p>Les enfants qui ont suivi le tutoriel pour leur première mousse au chocolat utiliseront peut-être une recette (sans passer par un tuto) pour leur prochaine création. Et je parie que les ados pourraient bien lire quelque chose sur la cuisine moléculaire.&lt;/p> &lt;p>Pour moi, cette notion de moment est la plus grande force de Diátaxis. &lt;strong>Une même personne a besoin de contenus différents en fonction de sa tâche du moment.&lt;/strong> Parce que les besoins varient en fonction du temps, la structure doit être particulièrement propre.&lt;/p> &lt;h2 id="rigueur-et-non-linearite">Rigueur et non-linéarité&lt;/h2> &lt;p>Le plus grand risque avec cet outil, c’est de penser qu’il y a une évolution «linéaire» entre les différentes catégories. D’abord un tuto, puis un how-to, etc. C’est faux!&lt;/p> &lt;p>Les parcours peuvent être multiples. Je vous passe toutes les navigations possibles entre les différents éléments d’une documentation, que ce soit de la cuisine, de la programmation, le pilotage d’un avion ou le vélo (des exemples de Procida).&lt;/p> &lt;p>&lt;strong>La structure doit être assez claire pour permettre de sauter sans hésitation d’un type de contenu à l’autre à un moment précis.&lt;/strong> J’ai besoin de ceci, je sais que je vais trouver la réponse là!&lt;/p> &lt;p>Depuis que j’ai écouté et lu Procida, je vois souvent les choses sous un autre angle. Je combats désormais souvent ma tentation d’introduire des «motifs antipédagogiques» (introduire des éléments d’explication dans un tutoriel, par exemple), sans toujours y parvenir.&lt;/p> &lt;hr> &lt;p>Je suis convaincu que derrière le paradoxe de l’utilisation d’un outil technique pour des contenus non techniques se cachent pas mal de pistes pour améliorer l’efficacité des publications sur le web. &lt;strong>Je suis intéressé pour tous vos retours sur Diátaxis pour des documentations généralistes.&lt;/strong>&lt;/p></description></item><item><title>Données structurées pour un blog personnel</title><link>https://nicolasfriedli.ch/blog/json-ld-blog/</link><pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/json-ld-blog/</guid><description>&lt;p>Les données structurées permettent de simplifier le travail des moteurs de recherche et d’améliorer la précision des informations fournies. Après quelques généralités, je vous dis ce que j’ai implémenté sur ce site généré avec Hugo.&lt;/p> &lt;h2 id="json-for-linking-data-et-schemaorg">JSON for Linking Data et Schema.org&lt;/h2> &lt;p>JSON-LD (JSON for Linking Data) est un format recommandé pour intégrer des données structurées dans une page HTML. Comme son nom l’indique, il utilise la syntaxe JSON (JavaScript Object Notation) répandue dans le domaine du web.&lt;/p> &lt;p>En HTML, des métadonnées existent déjà, mais elles sont des balises simples, sans structure. Par exemple:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;meta name=&amp;#34;author&amp;#34; content=&amp;#34;Nicolas Friedli&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Mais qui est ce «Nicolas Friedli»? Impossible d’en dire plus dans les métadonnées habituelles. &lt;a href="https://json-ld.org/">JSON-LD&lt;/a> permet de structurer les données et propose une &lt;em>grammaire&lt;/em>.&lt;/p> &lt;p>&lt;a href="https://schema.org/">Schema.org&lt;/a> — une initiative commune de Google, Microsoft, Yahoo et Yandex — développe un &lt;em>vocabulaire&lt;/em> pour remplir ces champs JSON. Tout l’enjeu désormais, c’est de donner des informations utiles, ni trop ni trop peu.&lt;/p> &lt;h2 id="donnees-en-page-daccueil">Données en page d’accueil&lt;/h2> &lt;p>Sur la page d’accueil de ce site, je tiens à ajouter quelques métadonnées pour:&lt;/p> &lt;ul> &lt;li>définir clairement le nom du site&lt;/li> &lt;li>identifier son auteur sans hésitation&lt;/li> &lt;/ul> &lt;p>Il est possible de générer des petits fichiers avec &lt;a href="https://jsonld.com/">Steal Our JSON-LD&lt;/a>, mais j’ai préféré le faire à la main en lisant la documentation de Schema.org.&lt;/p> &lt;h3 id="nom-du-site">Nom du site&lt;/h3> &lt;p>En suivant les indications de &lt;a href="https://developers.google.com/search/docs/appearance/site-names?hl=fr">Fournir un nom de site pour la recherche Google&lt;/a>, je pourrais écrire:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;@context&amp;#34;: &amp;#34;http://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;WebSite&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34; } &lt;/code>&lt;/pre>&lt;h3 id="auteur-du-site">Auteur du site&lt;/h3> &lt;p>Comme c’est un site personnel, il me paraît intéressant d’en dire plus sur l’auteur. Je pourrais écrire:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;@context&amp;#34;: &amp;#34;http://www.schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;person&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;address&amp;#34;: { &amp;#34;@type&amp;#34;: &amp;#34;PostalAddress&amp;#34;, &amp;#34;streetAddress&amp;#34;: &amp;#34;Rue du Château 3&amp;#34;, &amp;#34;addressLocality&amp;#34;: &amp;#34;Colombier&amp;#34;, &amp;#34;addressRegion&amp;#34;: &amp;#34;Neuchâtel&amp;#34;, &amp;#34;postalCode&amp;#34;: &amp;#34;2013&amp;#34;, &amp;#34;addressCountry&amp;#34;: &amp;#34;CH&amp;#34; }, &amp;#34;email&amp;#34;: &amp;#34;hello@nicolasfriedli.ch&amp;#34;, &amp;#34;telephone&amp;#34;: &amp;#34;+41793443382&amp;#34; } &lt;/code>&lt;/pre>&lt;p>Donc, nous avons désormais 2 ensembles JSON. Le premier a un seul niveau, le second est plus structuré (champ &lt;code>address&lt;/code>).&lt;/p> &lt;h3 id="structure-simple">Structure simple&lt;/h3> &lt;p>Mais ce qui est vraiment intéressant, c’est de lier la notion d’auteur au site. Comme le nom du site est le même que le nom de l’auteur, je prends un autre exemple pour ce passage. Voici ce qui se trouvait en page d’accueil de l’&lt;a href="https://theologique.ch/">annuaire protestant theologique.ch&lt;/a> (version simplifiée):&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;@context&amp;#34;: &amp;#34;http://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;WebSite&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Annuaire protestant&amp;#34;, &amp;#34;alternateName&amp;#34;: &amp;#34;theologique.ch&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://theologique.ch/&amp;#34;, &amp;#34;author&amp;#34;: { &amp;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;Person&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34; } } &lt;/code>&lt;/pre>&lt;p>En français:&lt;/p> &lt;blockquote> &lt;p>Ce site s’appelle «Annuaire protestant», et aussi «theologique.ch». Il est disponible à l’adresse &lt;code>https://theologique.ch/&lt;/code>. Il a pour auteur Nicolas Friedli, celui du site &lt;code>https://nicolasfriedli.ch/&lt;/code>.&lt;/p>&lt;/blockquote> &lt;p>C’est clair, non?&lt;/p> &lt;h3 id="schema-complet">Schéma complet&lt;/h3> &lt;p>Pour mon blog, j’ai essayé de créer un JSON un peu plus complet:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;@context&amp;#34;: &amp;#34;http://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;WebSite&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;alternateName&amp;#34;: &amp;#34;NF&amp;#34;, &amp;#34;description&amp;#34;: &amp;#34;Consultant web à Neuchâtel (Suisse).&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34;, &amp;#34;image&amp;#34;: &amp;#34;/images/nicolas-friedli.jpg&amp;#34;, &amp;#34;author&amp;#34;: { &amp;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;Person&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;alternateName&amp;#34;: &amp;#34;NF&amp;#34;, &amp;#34;givenName&amp;#34;: &amp;#34;Nicolas&amp;#34;, &amp;#34;familyName&amp;#34;: &amp;#34;Friedli&amp;#34;, &amp;#34;jobTitle&amp;#34;: &amp;#34;Consultant web&amp;#34;, &amp;#34;address&amp;#34;: { &amp;#34;@type&amp;#34;: &amp;#34;PostalAddress&amp;#34;, &amp;#34;streetAddress&amp;#34;: &amp;#34;Rue du Château 3&amp;#34;, &amp;#34;postalCode&amp;#34;: &amp;#34;2013&amp;#34;, &amp;#34;addressLocality&amp;#34;: &amp;#34;Colombier&amp;#34;, &amp;#34;addressRegion&amp;#34;: &amp;#34;Neuchâtel&amp;#34;, &amp;#34;addressCountry&amp;#34;: &amp;#34;CH&amp;#34; }, &amp;#34;email&amp;#34;: &amp;#34;hello@nicolasfriedli.ch&amp;#34;, &amp;#34;image&amp;#34;: &amp;#34;/images/nicolas-friedli.jpg&amp;#34;, &amp;#34;telephone&amp;#34;: [ &amp;#34;+41328414874&amp;#34;, &amp;#34;+41793443382&amp;#34; ], &amp;#34;spouse&amp;#34;: { &amp;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;Person&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Diane Friedli&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://dianefriedli.ch/&amp;#34; }, &amp;#34;url&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34;, &amp;#34;sameAs&amp;#34;: [ &amp;#34;https://github.com/nfriedli/&amp;#34;, &amp;#34;https://keybase.io/nicolasfriedli&amp;#34; ], &amp;#34;nationality&amp;#34;: &amp;#34;Suisse&amp;#34;, &amp;#34;alumniOf&amp;#34;: { &amp;#34;@type&amp;#34;: &amp;#34;CollegeOrUniversity&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Université de Neuchâtel&amp;#34; } } } &lt;/code>&lt;/pre>&lt;p>L’interprétation du contenu devrait être simple. Donc je ne commente pas en détail, mais signale que l’URL du site est la même que celle de l’auteur. Ce balisage est conforme à Schema.org, même il est rarement utilisé ainsi.&lt;/p> &lt;h3 id="integration-statique-dans-hugo">Intégration statique dans Hugo&lt;/h3> &lt;p>Pour intégrer cela dans Hugo, c’est trivial, parce que ces données sont statiques. Un fichier &lt;code>schema.json&lt;/code> est placé dans le répertoire &lt;code>/data/&lt;/code>. Il est accessible par la variable &lt;code>site.Data.schema&lt;/code>.&lt;/p> &lt;p>Donc, pour ne l’afficher que sur la page d’accueil, ce sera quelque chose comme:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ if .IsHome }} &amp;lt;script type=&amp;#34;application/ld+json&amp;#34;&amp;gt; {{ site.Data.schema }} &amp;lt;/script&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>Tous les détails sont toujours disponibles dans les &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/">sources du site sur GitHub&lt;/a>.&lt;/p> &lt;h2 id="pour-les-billets-de-blog">Pour les billets de blog&lt;/h2> &lt;p>Pour les billets de blog, je souhaite donner quelques informations aux moteurs de recherche:&lt;/p> &lt;ul> &lt;li>distinguer clairement la date de publication de la date de dernière modification (non trivial en HTML)&lt;/li> &lt;li>donner le titre du billet, pour éviter l’ambiguïté entre &lt;code>h1&lt;/code>et &lt;code>title&lt;/code>&lt;/li> &lt;li>signifier que le contenu est gratuit&lt;/li> &lt;li>compter le nombre de mots&lt;/li> &lt;/ul> &lt;h3 id="structure-du-json-ld">Structure du JSON-LD&lt;/h3> &lt;p>Voici comment je le formule avec les variables Hugo:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;BlogPosting&amp;#34;, &amp;#34;headline&amp;#34;: &amp;#34;{{ .Title }}&amp;#34;, &amp;#34;wordCount&amp;#34;: &amp;#34;{{ .WordCount }}&amp;#34;, {{ with .PublishDate }} &amp;#34;datePublished&amp;#34;: &amp;#34;{{ .Format &amp;#34;2006-01-02&amp;#34; }}&amp;#34;, {{ end }} {{ with .Lastmod }} &amp;#34;dateModified&amp;#34;: &amp;#34;{{ .Format &amp;#34;2006-01-02&amp;#34; }}&amp;#34;, {{ end }} &amp;#34;author&amp;#34;: [{ &amp;#34;@type&amp;#34;: &amp;#34;Person&amp;#34;, &amp;#34;name&amp;#34;: &amp;#34;Nicolas Friedli&amp;#34;, &amp;#34;url&amp;#34;: &amp;#34;https://nicolasfriedli.ch/&amp;#34; }], &amp;#34;isAccessibleForFree&amp;#34;: true } &lt;/code>&lt;/pre>&lt;p>La version courante est elle aussi toujours disponible dans les sources.&lt;/p> &lt;h3 id="integration-dynamique-dans-hugo">Intégration dynamique dans Hugo&lt;/h3> &lt;p>Pour l’intégrer dans Hugo, vu que c’est quelque chose de dynamique, je déclare un bloc sur toutes les pages du site, mais le laisse vide par défaut:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ block &amp;#34;json-ld&amp;#34; . }}{{ end }} &lt;/code>&lt;/pre>&lt;p>Puis, uniquement pour les articles de blog, je redéfinis (ou surcharge) le bloc dans le modèle &lt;code>blog/single.html&lt;/code>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ define &amp;#34;json-ld&amp;#34; }} &amp;lt;script type=&amp;#34;application/ld+json&amp;#34;&amp;gt; { &amp;#34;@context&amp;#34;: &amp;#34;https://schema.org&amp;#34;, &amp;#34;@type&amp;#34;: &amp;#34;BlogPosting&amp;#34;, ... } &amp;lt;/script&amp;gt; {{ end }} &lt;/code>&lt;/pre>&lt;p>L’existence du bloc &lt;code>json-ld&lt;/code> sur toutes les pages permettrait d’injecter d’autres données à d’autres endroits du site.&lt;/p> &lt;h2 id="construction-a-la-main">Construction à la main&lt;/h2> &lt;p>En passant la page d’accueil ou un billet de blog de ce site dans le &lt;a href="https://validator.schema.org/">validateur Schema.org&lt;/a>, les données structurées sont rendues lisibles. Elles me semblent suffisantes. Il reste à voir comment elles seront prises en compte par les moteurs de recherche dans la durée.&lt;/p> &lt;p>En construisant ces schémas à la main, j’ai pu me rendre compte du potentiel de Schema.org pour documenter autre chose que des billets de blog. C’est ce que j’ai utilisé sur le site &lt;em>Églises ouvertes en Suisse romande&lt;/em> (ce site n’existe plus).&lt;/p> &lt;p>Beaucoup de sites utilisent JSON-LD, souvent en excès (et dans le dos des propriétaires). Je suis très réservé par la quantité astronomique de données structurées que propose l’extension de référencement Yoast SEO. C’est un peu comme si le site était réécrit 2 fois sur chacune de ses pages.&lt;/p> &lt;p>Si je vois bien l’intérêt de la chose pour un site commercial ou tout site qui cherche à &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/search-gallery?hl=fr">modifier l’apparence des résultats de recherche&lt;/a> pour être plus visible, je pense que c’est inutile pour un blog ou un simple site personnel.&lt;/p></description></item><item><title>Mon premier JSON Schema</title><link>https://nicolasfriedli.ch/blog/json-schema/</link><pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/json-schema/</guid><description>&lt;p>Le format JSON (JavaScript Object Notation) est un des plus utilisés sur le web. Il est léger et permet d’échanger des données. Je propose la rédaction d’un JSON Schema pour formaliser les contenus, à partir d’un l’exemple concret de données que j’utilise déjà.&lt;/p> &lt;h2 id="un-json-tout-simple">Un JSON tout simple&lt;/h2> &lt;p>Pour un site patrimonial qui liste les églises protestantes ouvertes en Suisse romande, j’ai utilisé dès le début des données formatées en JSON. Chaque bâtiment a son propre fichier, assez lisible, qui ressemble à ceci:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;title&amp;#34;: &amp;#34;Temple de Colombier&amp;#34;, &amp;#34;site&amp;#34;: &amp;#34;https://www.eren.ch/barc/batiments/temple-de-colombier/&amp;#34;, &amp;#34;maps&amp;#34;: &amp;#34;https://goo.gl/maps/3KSuvNTqXsdSFmnc9&amp;#34;, &amp;#34;rue&amp;#34;: &amp;#34;Rue du Château 3a&amp;#34;, &amp;#34;npa&amp;#34;: 2013, &amp;#34;localite&amp;#34;: &amp;#34;Colombier&amp;#34;, &amp;#34;commune&amp;#34;: &amp;#34;Milvignes&amp;#34;, &amp;#34;canton&amp;#34;: &amp;#34;Neuchâtel&amp;#34;, &amp;#34;latitude&amp;#34;: 46.9666066, &amp;#34;longitude&amp;#34;: 6.8623137, &amp;#34;ouverture&amp;#34;: &amp;#34;7/7&amp;#34;, &amp;#34;horaire&amp;#34;: &amp;#34;8:00-20:00&amp;#34;, &amp;#34;pbc&amp;#34;: &amp;#34;B&amp;#34;, &amp;#34;vitraux&amp;#34;: [&amp;#34;Pierre-Eugène Bouvier&amp;#34;] } &lt;/code>&lt;/pre>&lt;p>J’ai ajouté les champs de données au fur et à mesure de la création du site, ne sachant pas quelles informations j’allais découvrir dans mes recherches.&lt;/p> &lt;h2 id="un-json-plus-structure">Un JSON plus structuré&lt;/h2> &lt;p>S’il fallait modifier quelque chose, je structurerais peut-être les données un peu plus fortement, par exemple ainsi:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;title&amp;#34;: &amp;#34;Temple de Colombier&amp;#34;, &amp;#34;liens&amp;#34;: { &amp;#34;site&amp;#34;: &amp;#34;https://www.eren.ch/barc/batiments/temple-de-colombier/&amp;#34;, &amp;#34;maps&amp;#34;: &amp;#34;https://goo.gl/maps/3KSuvNTqXsdSFmnc9&amp;#34; }, &amp;#34;adresse&amp;#34;: { &amp;#34;rue&amp;#34;: &amp;#34;Rue du Château 3a&amp;#34;, &amp;#34;npa&amp;#34;: 2013, &amp;#34;localite&amp;#34;: &amp;#34;Colombier&amp;#34;, &amp;#34;commune&amp;#34;: &amp;#34;Milvignes&amp;#34;, &amp;#34;canton&amp;#34;: &amp;#34;Neuchâtel&amp;#34; }, &amp;#34;coordonnes&amp;#34;: { &amp;#34;latitude&amp;#34;: 46.9666066, &amp;#34;longitude&amp;#34;: 6.8623137 }, &amp;#34;ouverture&amp;#34;: { &amp;#34;jours&amp;#34;: &amp;#34;7/7&amp;#34;, &amp;#34;horaire&amp;#34;: &amp;#34;8:00-20:00&amp;#34; }, &amp;#34;patrimoine&amp;#34;: { &amp;#34;pbc&amp;#34;: &amp;#34;B&amp;#34;, &amp;#34;vitraux&amp;#34;: [&amp;#34;Pierre-Eugène Bouvier&amp;#34;] } } &lt;/code>&lt;/pre>&lt;p>C’est très théorique, parce qu’en voyant le résultat, je ne suis pas certain que ça apporterait beaucoup. Le «JSON tout simple» est donc celui que je conserve pour produire le site et sur lequel portent les exemples qui suivant.&lt;/p> &lt;h2 id="objectifs-du-schema-json">Objectifs du schéma JSON&lt;/h2> &lt;p>Si le &lt;a href="https://www.json.org/json-fr.html">format JSON&lt;/a> est strict du point de vue le la forme, il laisse toute liberté pour les contenus. Un &lt;a href="https://json-schema.org/">JSON Schema&lt;/a> permet de fixer des règles pour la création d’un contenu JSON.&lt;/p> &lt;p>Le schéma que je vais créer doit notamment servir à vérifier:&lt;/p> &lt;ul> &lt;li>qu’un certain nombre de données soient présentes (titre, adresse complète, coordonnée et horaires d’ouverture)&lt;/li> &lt;li>qu’il soit possible de faire un lien vers une page externe ou une fiche Google Maps&lt;/li> &lt;li>que les numéros postaux soient des nombres de 4 chiffres&lt;/li> &lt;li>que les coordonnées aient des valeurs raisonnables pour la Suisse romande&lt;/li> &lt;li>qu’il ne soit pas possible d’ajouter d’autres données&lt;/li> &lt;/ul> &lt;p>Ainsi je pourrai vérifier la validité de mon corpus d’édifices en une seule commande, &lt;a href="https://github.com/santhosh-tekuri/jsonschema">par exemple avec JSONSchema&lt;/a>. Ou tester un contenu directement en ligne avec &lt;a href="https://www.jsonschemavalidator.net/">JSON Schema Validator&lt;/a>.&lt;/p> &lt;h2 id="creation-dun-schema-json">Création d’un schéma JSON&lt;/h2> &lt;p>L’utilisation de JSON est complètement libre, mais un &lt;a href="https://json-schema.org/">JSON Schema&lt;/a> permet de fixer des règles et de valider des contenus informatiquement. Pour ma culture générale, j’ai créé un schéma pour &lt;em>Églises ouvertes en Suisse romande&lt;/em> (site abandonné).&lt;/p> &lt;p>Je le copie intégralement, même si c’est un peu long. Puis je commente certaines parties dans la suite du billet. La version courante était disponible sur le site eglises-ouvertes.ch. Elle reste disponible dans de le &lt;a href="https://github.com/nfriedli/eglises-ouvertes/blob/main/static/schema.json">dépôt GitHub nfriedli/eglises-ouvertes&lt;/a>.&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;$schema&amp;#34;: &amp;#34;https://json-schema.org/draft/2020-12/schema&amp;#34;, &amp;#34;$id&amp;#34;: &amp;#34;https://eglises-ouvertes.ch/schema.json&amp;#34;, &amp;#34;title&amp;#34;: &amp;#34;église ouverte&amp;#34;, &amp;#34;description&amp;#34;: &amp;#34;description complète d’une des Églises ouvertes de Suisse romande&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;object&amp;#34;, &amp;#34;properties&amp;#34;: { &amp;#34;title&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;nom du bâtiment&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;nomCourt&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;version simplifiée du nom du bâtiment&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;site&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;page de présentation du bâtiment (horaire d’ouverture impératif)&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;maps&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;fiche Google Mas du bâtiment (horaire d’ouverture impératif)&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;rue&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;rue avec numéro&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;localite&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;village dans une plus grande commune&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;commune&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;npa&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;numéro postal d’acheminement&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;integer&amp;#34;, &amp;#34;minimum&amp;#34;: 1000, &amp;#34;maximum&amp;#34;: 9999 }, &amp;#34;canton&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;un canton de Suisse romande&amp;#34;, &amp;#34;enum&amp;#34;: [&amp;#34;Berne&amp;#34;, &amp;#34;Fribourg&amp;#34;, &amp;#34;Genève&amp;#34;, &amp;#34;Jura&amp;#34;, &amp;#34;Neuchâtel&amp;#34;, &amp;#34;Valais&amp;#34;, &amp;#34;Vaud&amp;#34; ] }, &amp;#34;latitude&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;number&amp;#34;, &amp;#34;minimum&amp;#34;: 45, &amp;#34;maximum&amp;#34;: 48 }, &amp;#34;longitude&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;number&amp;#34;, &amp;#34;minimum&amp;#34;: 5, &amp;#34;maximum&amp;#34;: 11 }, &amp;#34;ouverture&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;jours d’ouverture (souvent 7/7)&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;horaire&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;heures d’ouverture (parfois 24/24)&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; }, &amp;#34;pbc&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;patrimoine des biens culturels suisses&amp;#34;, &amp;#34;enum&amp;#34;: [ &amp;#34;A&amp;#34;, &amp;#34;B&amp;#34; ] }, &amp;#34;vitraux&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;nom d’artiste&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;array&amp;#34;, &amp;#34;items&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; } } }, &amp;#34;anyOf&amp;#34;: [ { &amp;#34;required&amp;#34;: [ &amp;#34;site&amp;#34; ]}, { &amp;#34;required&amp;#34;: [ &amp;#34;maps&amp;#34; ]} ], &amp;#34;required&amp;#34;: [ &amp;#34;title&amp;#34;, &amp;#34;rue&amp;#34;, &amp;#34;npa&amp;#34;, &amp;#34;commune&amp;#34;, &amp;#34;canton&amp;#34;, &amp;#34;latitude&amp;#34;, &amp;#34;longitude&amp;#34;, &amp;#34;ouverture&amp;#34;, &amp;#34;horaire&amp;#34; ], &amp;#34;additionalProperties&amp;#34;: false } &lt;/code>&lt;/pre>&lt;h3 id="validation-des-champs">Validation des champs&lt;/h3> &lt;p>En début de fichier, ce sont des champs qui demandent des chaînes de caractères (du texte libre). Cela n’appelle pas de commentaires particuliers.&lt;/p> &lt;p>Pour le numéro postal d’acheminement, j’impose un nombre de 4 chiffres entre 1000 et 9999. On pourrait limiter aux NPA de Suisse romande, mais c’est très bien ainsi:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;npa&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;numéro postal d’acheminement&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;integer&amp;#34;, &amp;#34;minimum&amp;#34;: 1000, &amp;#34;maximum&amp;#34;: 9999 } &lt;/code>&lt;/pre>&lt;p>Pour le canton, on limite le choix aux cantons romands (ou avec une partie romande) et il ne peut y en avoir qu’un:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;canton&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;un canton de Suisse romande&amp;#34;, &amp;#34;enum&amp;#34;: [&amp;#34;Berne&amp;#34;, &amp;#34;Fribourg&amp;#34;, &amp;#34;Genève&amp;#34;, &amp;#34;Jura&amp;#34;, &amp;#34;Neuchâtel&amp;#34;, &amp;#34;Valais&amp;#34;, &amp;#34;Vaud&amp;#34; ] }, &lt;/code>&lt;/pre>&lt;p>La latitude et la longitude sont limitées dans des valeurs proches de celles de la Suisse:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;latitude&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;number&amp;#34;, &amp;#34;minimum&amp;#34;: 45, &amp;#34;maximum&amp;#34;: 48 }, &amp;#34;longitude&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;number&amp;#34;, &amp;#34;minimum&amp;#34;: 5, &amp;#34;maximum&amp;#34;: 11 } &lt;/code>&lt;/pre>&lt;p>Si elle est précisée, l’inscription à l’&lt;a href="https://www.bak.admin.ch/bak/fr/home/baukultur/archaeologie-und-denkmalpflege/inventare/kgs-inventar.html">Inventaire des biens culturels d’importance nationale et régionale (PBC)&lt;/a> peut prendre la valeur &lt;em>A&lt;/em> ou la valeur &lt;em>B&lt;/em>:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;pbc&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;patrimoine des biens culturels suisses&amp;#34;, &amp;#34;enum&amp;#34;: [ &amp;#34;A&amp;#34;, &amp;#34;B&amp;#34; ] } &lt;/code>&lt;/pre>&lt;p>Les artistes ayant créé des vitraux peuvent être plusieurs pour un seul édifice:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;vitraux&amp;#34;: { &amp;#34;description&amp;#34;: &amp;#34;nom d’artiste&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;array&amp;#34;, &amp;#34;items&amp;#34;: { &amp;#34;type&amp;#34;: &amp;#34;string&amp;#34; } } &lt;/code>&lt;/pre>&lt;h3 id="conditions-de-validation">Conditions de validation&lt;/h3> &lt;p>Au-delà de la validation champ par champ, des conditions plus globales sont déclarées.&lt;/p> &lt;p>En premier lieu, certaines données sont nécessaires et il faut s’assurer de leur existence:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;required&amp;#34;: [ &amp;#34;title&amp;#34;, &amp;#34;rue&amp;#34;, &amp;#34;npa&amp;#34;, &amp;#34;commune&amp;#34;, &amp;#34;canton&amp;#34;, &amp;#34;latitude&amp;#34;, &amp;#34;longitude&amp;#34;, &amp;#34;ouverture&amp;#34;, &amp;#34;horaire&amp;#34; ] &lt;/code>&lt;/pre>&lt;p>Beaucoup plus intéressant, l’obligation de la présence d’un site cible ou d’une fiche Google Maps (ou les deux):&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;anyOf&amp;#34;: [ { &amp;#34;required&amp;#34;: [ &amp;#34;site&amp;#34; ]}, { &amp;#34;required&amp;#34;: [ &amp;#34;maps&amp;#34; ]} ] &lt;/code>&lt;/pre>&lt;p>Finalement, l’interdiction d’ajouter des champs autres que ceux déclarés dans le schéma:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;#34;additionalProperties&amp;#34;: false &lt;/code>&lt;/pre>&lt;h2 id="assurances-formelles-et-validite-des-contenus">Assurances formelles et validité des contenus&lt;/h2> &lt;p>C’était mon premier essai de rédaction d’un schéma JSON. J’ai trouvé l’exercice plutôt intéressant. C’est toujours amusant de lire une référence technique sur un écran et d’écrire le fichier de code sur l’autre.&lt;/p> &lt;p>Il faudrait aller un peu plus loin pour certaines données, par exemple avec des &lt;a href="https://json-schema.org/understanding-json-schema/reference/regular_expressions#regular-expressions">expressions régulières&lt;/a> pour valider des plages horaires. Mais je m’arrête là pour le moment.&lt;/p> &lt;p>L’enjeu bien réel derrière cet exercice, c’est que la validité formelle ne dit rien de la validité réelle des contenus. Elle assure la présence de contenus, non leur justesse. Il y a quelque chose de paradoxal à formaliser des données alors que les informations n’existent souvent pas en ligne.&lt;/p> &lt;p>Le rachitisme du défunt &lt;em>Églises ouvertes en Suisse romande&lt;/em> est une conséquence directe de la paresse de celles et ceux qui pourraient publier des contenus utiles. Mais pas une question de format de données.&lt;/p> &lt;hr> &lt;p>On me signale la &lt;a href="https://jsoning.com/">plateforme JSONing&lt;/a> gratuite, créée par &lt;a href="https://github.com/cyrilbois">Cyril Bois&lt;/a>. Elle permet notamment la &lt;a href="https://jsoning.com/jsonschema/">création automatisée de JSON Schemas&lt;/a> à partir de sources JSON.&lt;/p></description></item><item><title>Création &amp; affichage d’une page web</title><link>https://nicolasfriedli.ch/blog/creation-affichage-page-web/</link><pubDate>Sun, 17 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/creation-affichage-page-web/</guid><description>&lt;p>Dans le monde des Bisnounours: j’entre une adresse et le site est à l’écran. Mais dans la vraie vie, à chaque fois qu’une page s’affiche dans un navigateur, des centaines d’opérations ont eu lieu avant pour établir la connexion au serveur, pour générer la page sur le serveur, pour transférer des tas de fichiers, pour mettre en forme le résultat final.&lt;/p> &lt;p>&lt;strong>Note.&lt;/strong> Ce billet est une vulgarisation du sujet. Je fais l’impasse sur plusieurs étapes, je simplifie le propos et je commets des erreurs dans la chronologie des choses. Ces approximations ont une visée pédagogique; ce sont les grands principes qui comptent.&lt;/p> &lt;h2 id="se-rendre-sur-le-serveur">Se rendre sur le serveur&lt;/h2> &lt;p>L’adresse &lt;code>https://nicolasfriedli.ch/blog/creation-affichage-page-web/&lt;/code> est saisie dans un navigateur ou un lien vers elle est suivi. Voici ce qui se passe:&lt;/p> &lt;ul> &lt;li>Le navigateur va interroger un serveur de noms (DNS) pour savoir à quelle adresse IP correspond le nom de domaine &lt;code>nicolasfriedli.ch&lt;/code>, par exemple &lt;code>128.65.195.39&lt;/code>. Le modem, le périphérique ou le navigateur vont garder ce résultat en mémoire un certain temps.&lt;/li> &lt;li>Puis le navigateur va demander la création d’une connexion sécurisée &lt;code>https&lt;/code> et va vérifier la validité d’un certificat, stocker des informations de chiffrement, etc. Ici aussi, des informations sont conservées dans la durée.&lt;/li> &lt;/ul> &lt;p>✅ Désormais, le navigateur est prêt.&lt;/p> &lt;h2 id="creation-de-la-page-sur-le-serveur">Création de la page sur le serveur&lt;/h2> &lt;p>Ce que demande le navigateur au serveur, c’est une page HTML (et rien d’autre pour le moment). Voici ce qui va se passer dans 3 cas distincts.&lt;/p> &lt;h3 id="avec-un-cms-comme-wordpress">Avec un CMS comme WordPress&lt;/h3> &lt;p>L’outil de gestion de contenu (CMS) va effectuer les opération suivantes:&lt;/p> &lt;ul> &lt;li>recherche dans une base de données à quel numéro de billet correspond &lt;code>/blog/creation-affichage-page-web&lt;/code>&lt;/li> &lt;li>recherche du contenu billet dans une autre table de base de données&lt;/li> &lt;li>à partir de là, recherche du nom de l’auteur ou de l’autrice, recherche des différentes taxonomies utilisées&lt;/li> &lt;li>recherche des informations sur le menu du site&lt;/li> &lt;li>recherche des contenus des &lt;em>widgets&lt;/em>&lt;/li> &lt;li>recherche de la liste des derniers billets publiés&lt;/li> &lt;li>et si le blog utilise des commentaires, recherche de tous les commentaires attribués au billet&lt;/li> &lt;li>et peut être aussi les derniers commentaires sur tout le site pour les afficher en barre latérale&lt;/li> &lt;li>etc.&lt;/li> &lt;/ul> &lt;p>Puis il va lire les gabarits de mise en page (&lt;em>templates&lt;/em>) et assembler toutes les données reçues dans un seul fichier HTML. Il est enfin prêt à répondre au navigateur. &lt;strong>Toutes ces opérations ont lieu pour chaque page du site et à chaque visite!&lt;/strong>&lt;/p> &lt;p>✅ Le HTML est envoyé.&lt;/p> &lt;h3 id="quand-le-cms-utilise-un-systeme-de-cache">Quand le CMS utilise un système de cache&lt;/h3> &lt;p>Afin de minimiser le travail inutile, un système de cache peut être utilisé. Il n’est malheureusement pas présent par défaut chez WordPress. Le principe est simple. Quand une page est demandée:&lt;/p> &lt;ul> &lt;li>si la page existe déjà sur le serveur et si elle n’est pas trop ancienne, elle est envoyée telle quelle au navigateur&lt;/li> &lt;li>si la page n’existe pas encore ou si elle est trop ancienne, elle est créée (en suivant toutes les étapes vues au point précédent) et stockée&lt;/li> &lt;/ul> &lt;p>&lt;strong>Les opérations sur le serveur ne sont pas moins nombreuses, mais elles ne sont pas réalisées à chaque visite.&lt;/strong>&lt;/p> &lt;p>Si le &lt;em>principe&lt;/em> est simple, la mise en pratique est beaucoup plus compliquée. Par exemple, lorsque la barre latérale d’un site liste les derniers billets et que le titre du dernier billet est modifié, il faut invalider le cache de toutes les pages (alors que seuls quelques mots d’une page ont changé). Pour imaginer les enjeux pratiques: &lt;a href="https://www.geeksforgeeks.org/cache-invalidation-and-the-methods-to-invalidate-cache/">Cache Invalidation and the Methods to Invalidate Cache&lt;/a>.&lt;/p> &lt;p>✅ Le HTML est envoyé.&lt;/p> &lt;h3 id="avec-un-site-statique">Avec un site statique&lt;/h3> &lt;p>Quand une page est demandée:&lt;/p> &lt;ul> &lt;li>elle existe déjà et est livrée telle quelle&lt;/li> &lt;li>sauf si le navigateur demande une page qui n’existe pas ou plus (une erreur 404 est retournée)&lt;/li> &lt;/ul> &lt;p>✅ Le HTML est envoyé.&lt;/p> &lt;h2 id="affichage-de-la-page-dans-le-navigateur">Affichage de la page dans le navigateur&lt;/h2> &lt;p>Site dynamique, site statique, qu’importe désormais, le navigateur a reçu son fichier HTML. Il pourra donc se lancer dans l’affichage de la page.&lt;/p> &lt;h3 id="telechargement-des-ressources">Téléchargement des ressources&lt;/h3> &lt;p>Dans un premier lieu, le code HTML est intégralement lu et tous les fichiers nécessaires à la page sont demandés au serveur:&lt;/p> &lt;ul> &lt;li>feuilles de style CSS (le modèle de mise en page)&lt;/li> &lt;li>images&lt;/li> &lt;li>code JavaScript&lt;/li> &lt;/ul> &lt;p>Le processus de création continue.&lt;/p> &lt;h3 id="creation-de-la-page">Création de la page&lt;/h3> &lt;p>Désormais, le navigateur utilise la structure (HTML) et la présentation (CSS) pour créer visuellement la page. Selon les informations qu’il aura trouvées dans le fichier CSS, il va charger de nouvelles ressources (par exemple des polices d’écriture particulières ou des images de fond).&lt;/p> &lt;p>Si ces polices d’écriture se trouvent sur un autre nom de domaine, il va devoir refaire la requête DNS et la vérification des certificats de sécurité si ces données ne sont pas en mémoire.&lt;/p> &lt;p>Le processus de création continue.&lt;/p> &lt;h3 id="interpretation-du-javascript">Interprétation du JavaScript&lt;/h3> &lt;p>Le code JavaScript est interprété. Le «logiciel navigateur» exécute un «logiciel JavaScript» pour avancer dans la création de la page. Ce code peur servir à:&lt;/p> &lt;ul> &lt;li>afficher un menu dynamique&lt;/li> &lt;li>envoyer des statistiques à un service tiers&lt;/li> &lt;li>chercher des données utiles pour affichage sur la page&lt;/li> &lt;/ul> &lt;p>Mais aussi à inclure des &lt;em>widgets&lt;/em> des réseaux sociaux, qui eux-mêmes vont rechercher plus de JavaScript, du code HTML et CSS, etc.&lt;/p> &lt;p>✅ En principe, la page est terminée.&lt;/p> &lt;h3 id="quelques-donnees-statistiques">Quelques données statistiques&lt;/h3> &lt;p>Le &lt;em>Web Almanac 2022&lt;/em> donne les résultats de tests pour plus de 8 millions de sites. Quelques résultats extraits de la rubrique &lt;a href="https://almanac.httparchive.org/en/2022/page-weight">Page Weight&lt;/a>:&lt;/p> &lt;ul> &lt;li>quand 1 page s’affiche, ce n’est pas 1 seul fichier qui voyage sur les réseaux, mais 70 (mesure médiane)&lt;/li> &lt;li>et ce sont plus de 2MB de données qui sont envoyées&lt;/li> &lt;li>en valeur médiane, ce sont 22 images pour une seule page&lt;/li> &lt;li>et 20 fichiers en JavaScript (qui devront tous être exécutés dans le navigateur)&lt;/li> &lt;li>le poids des pages web a été multiplié par 6 en 10 ans&lt;/li> &lt;/ul> &lt;p>Le souci que nous avons aujourd’hui, c’est que les serveurs, les réseaux et les périphériques (ordinateur, tablette, téléphone, etc.) sont devenus si performants que l’on ne voit plus tout ce qui y transite et tous les calculs effectués. Pour maintenir un niveau de performance correct, au vu de la lourdeur des sites, il faut changer plus souvent de matériel. Écologiquement, c’est lamentable.&lt;/p> &lt;h2 id="apres-la-visite">Après la visite&lt;/h2> &lt;p>Lors de l’envoi des différentes ressources au navigateur, le serveur devrait lui transmettre des informations de conservation. C’est un &lt;em>cache local&lt;/em> du navigateur, différent de celui qui peut être utilisé dans les CMS.&lt;/p> &lt;p>Par exemple:&lt;/p> &lt;ul> &lt;li>l’image du logo de l’entreprise, qui s’affiche en haut à gauche de la page, peut être conservée durant 1 mois&lt;/li> &lt;li>le feuille de style CSS est valable 1 semaines&lt;/li> &lt;li>le polices d’écriture (si elles ne sont pas chargées chez Google Fonts), peuvent être conservées durant 6 mois&lt;/li> &lt;/ul> &lt;p>Ainsi, tous les fichiers ne sont pas chargés à chaque visite, ce qui est serait un gâchis immense. Malheureusement, beaucoup de sites gèrent mal le cache ou ne l’utilisent pas du tout.&lt;/p> &lt;h2 id="difference-entre-statique-et-dynamique">Différence entre statique et dynamique&lt;/h2> &lt;p>Pour faire simple, une page web, telle que nous la voyons, ne préexiste jamais. &lt;strong>Une page est toujours assemblée dans le &lt;em>navigateur&lt;/em>&lt;/strong> à partir de HTML, de CSS, de JavaScript et des fichiers multimédia. Mais:&lt;/p> &lt;ul> &lt;li>avec un site statique, tout ce qui peut l’être est déjà prêt et optimisé sur le &lt;em>serveur&lt;/em>&lt;/li> &lt;li>avec un site dynamique, toute une machinerie se met en route sur le &lt;em>serveur&lt;/em> pour chaque page et chaque internaute&lt;/li> &lt;/ul> &lt;p>Le vrai problème avec les sites dynamiques, quel que soit l’outil (WordPress, Drupal, Typo3, etc.), c’est quand ils motorisent des &lt;em>sites vitrines&lt;/em> qui évoluent peu. À quoi bon calculer chaque page pour chaque internaute si rien de change d’une personne à l’autre. C’est de la bande passante et de l’énergie jetées par les fenêtres.&lt;/p> &lt;p>Mais rien n’est perdu. Il reste de nombreuses de possibilités de faire un site lent et peu écologique avec un générateur de sites statiques, car &lt;a href="https://jamstatic.fr/2020/10/05/la-jamstack-n-est-rapide-que-si-vous-la-rendez-rapide/">La Jamstack n’est rapide que si vous y veillez&lt;/a>. Tout est envisageable pour publier des images trop grandes, saturer le site de JavaScript, le pourrir de tierces parties inutiles et mal gérer son cache.&lt;/p></description></item><item><title>Site statique, générateur de site &amp; Hugo</title><link>https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/</link><pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/site-statique-generateur-hugo/</guid><description>&lt;p>Ce site est motorisé par Hugo, je vous dis pourquoi j’ai choisi ce générateur de sites statiques. Mais avant, je vous dis pourquoi je pense qu’un générateur de sites statiques est une bonne idée. Et avant, je vous dis pourquoi un site statique – même généré à la main – est intéressant. Bon voyage dans ce billet en 3 étapes.&lt;/p> &lt;p>&lt;strong>Note.&lt;/strong> Ce billet suppose que vous savez déjà ce qu’est un site statique.&lt;/p> &lt;h2 id="pourquoi-un-site-statique">Pourquoi un site statique?&lt;/h2> &lt;p>Un site statique envoie au client &lt;strong>les contenus exacts qui existent déjà sur le serveur&lt;/strong>, sans modifications autres qu’une éventuelle compression à la volée. Voici ce que je considère comme les principales forces des sites statiques:&lt;/p> &lt;ul> &lt;li> &lt;p>Un site statique est &lt;strong>pérenne&lt;/strong>. S’il fonctionne un jour, il fonctionnera de la même manière le lendemain. Le site restera valable tant que les navigateurs sauront interpréter HTML, CSS et JavaScript. Les navigateurs arrivent toujours à se débrouiller du vieux code ou ils n’arrêteront pas de le comprendre soudainement.&lt;/p> &lt;/li> &lt;li> &lt;p>Un site statique est &lt;strong>performant&lt;/strong> par nature. Parce que le contenu qui sera envoyé est déjà prêt sur le serveur, il n’est pas possible de faire plus léger.&lt;/p> &lt;/li> &lt;li> &lt;p>Un site statique est &lt;strong>écologique&lt;/strong>, parce qu’il ne demande pas de calculs inutiles au serveur ni la présence de la base de données. Ils sont construits une fois pour toutes. Bien évidemment, il sera encore plus écologique chez un hébergeur écoresponsable, sans envoyer des vidéos inutiles, avec des images correctement dimensionnées, en faisant l’impasse sur les &lt;em>plugins&lt;/em> des réseaux sociaux ou les statiques gourmandes en énergie, avec des polices système, etc. De&lt;/p> &lt;/li> &lt;li> &lt;p>Une &lt;strong>sauvegarde&lt;/strong> d’un site statique existe quelque part. Si le code est géré par sur GitHub par exemple, il est probable que des copies se trouvent sur au moins un ordinateur, sur le serveur de GitHub et sur le serveur Apache de l’hébergeur. Même sans système de gestion de versions, il existe probablement un site local et un site distant. En gros, à part si tout est géré à distance par FTP, il existe une sauvegarde exacte du site.&lt;/p> &lt;/li> &lt;li> &lt;p>L’&lt;strong>historique&lt;/strong> du site est entièrement disponible si le développement utilise un outil comme Git (distant ou local).&lt;/p> &lt;/li> &lt;li> &lt;p>La &lt;strong>sécurité&lt;/strong> d’un site statique est assurée. Il n’offre pas d’accès à une interface d’administration distante, il ne stocke pas de données, etc.&lt;/p> &lt;/li> &lt;li> &lt;p>Finalement, un site statique est &lt;strong>portable&lt;/strong>. Sa migration d’un serveur à un autre se résume à la copier de fichiers. En cas de problème, c’est une démarche facile et rapide; le temps étant proportionnel à la masse de données à copier.&lt;/p> &lt;/li> &lt;/ul> &lt;p>Mais avant de mettre son site sur un serveur, il faut le créer. Passons au point suivant.&lt;/p> &lt;h2 id="pourquoi-un-generateur-de-sites-statiques">Pourquoi un générateur de sites statiques?&lt;/h2> &lt;p>Fondamentalement, un générateur de sites statiques ou SSG (&lt;em>static site generator&lt;/em>) est un outil qui permet d’&lt;strong>automatiser des tâches répétitives&lt;/strong>. Il existe &lt;a href="https://jamstack.org/generators/">des centaines de générateurs de sites&lt;/a>, avec différentes visées et dans différents langages. Mais voici quelques généralités sur le sujet:&lt;/p> &lt;ul> &lt;li> &lt;p>Un générateur de sites statiques permet de &lt;strong>simplifier la rédaction&lt;/strong> de contenus. L’utilisation de Markdown ou un autre &lt;a href="https://fr.wikipedia.org/wiki/Langage_de_balisage_l%C3%A9ger">langage de balisage léger&lt;/a> facilite et accélère le travail laborieux de saisie de code HTML.&lt;/p> &lt;/li> &lt;li> &lt;p>La &lt;strong>mise en page est automatisée&lt;/strong> par un système de gabarits (&lt;em>templates&lt;/em>), par exemple en réutilisant le même entête ou le même pied sur chaque du site. Et en répercutant chaque modification sur toutes les pages.&lt;/p> &lt;/li> &lt;li> &lt;p>Les &lt;strong>tâches répétitives sont réalisées par une machine&lt;/strong> plutôt que par un cerveau humain. Un ordinateur sera beaucoup plus efficace et fiable que vous et moi pour créer une liste de pages d’un répertoire triée par dates, pour générer un fichier RSS ou Atom valide, pour exporter les contenus de tout le site en format JSON pour un moteur de recherche, etc.&lt;/p> &lt;/li> &lt;li> &lt;p>Des &lt;strong>optimisations sur les fichiers texte&lt;/strong> (HTML, CSS, JavaScript, XML, etc.) sont effectuées à la génération: minification, nettoyage, concaténation, etc.&lt;/p> &lt;/li> &lt;li> &lt;p>Les &lt;strong>images&lt;/strong> sont redimmensionnées, allégées, modifiées au moment de la création du site. Le travail fastidieux de création d’&lt;a href="https://developer.mozilla.org/fr/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images">images adaptatives&lt;/a> est effectuée par une machine.&lt;/p> &lt;/li> &lt;li> &lt;p>Le développement avec un générateur des sites statiques rend agréable la &lt;strong>prévisualisation du site en local&lt;/strong>. C’est aussi possible sans SGG, mais souvent moins agréable.&lt;/p> &lt;/li> &lt;li> &lt;p>D’autres automatisations existent, comme la &lt;strong>colorisation sytaxique&lt;/strong> du code pour en simplifier la lecture, la &lt;strong>génération d’images&lt;/strong> pour les réseaux sociaux, l’activation d’un &lt;strong>moteur de recherche interne&lt;/strong>, etc.&lt;/p> &lt;/li> &lt;/ul> &lt;p>Beaucoup d’outils permettent tout ou partie de ces opérations (et d’autres). Parmi ceux que j’ai utilisés et utilises encore: &lt;a href="https://www.11ty.dev/">Eleventy&lt;/a> (11ty), &lt;a href="https://www.sphinx-doc.org/en/master/">Sphinx&lt;/a> ou &lt;a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs&lt;/a>. Mais il y a surtout Hugo, qui motorise ce site et pas mal d’autres que j’ai créés. Passons au point suivant.&lt;/p> &lt;h2 id="pourquoi-jai-choisi-hugo">Pourquoi j’ai choisi Hugo?&lt;/h2> &lt;p>&lt;a href="https://gohugo.io/">Hugo&lt;/a> est donc &lt;strong>un des principaux générateurs de site statiques&lt;/strong>. Il est plutôt généraliste et je le choisis &lt;em>a priori&lt;/em> pour mes projets (sans exclure d’autres outils pour des développements plus spécifiques). Voici ce qui m’a convaincu chez Hugo:&lt;/p> &lt;ul> &lt;li> &lt;p>L’&lt;strong>installation est triviale&lt;/strong>, par la copie d’un seul fichier exécutable. Il ne demande aucun écosystème préalable (par exemple Python ou Node). Il peut être utilisé sur un ordinateur sans droits d’administration. Corollaire: le &lt;strong>logiciel est pérenne&lt;/strong> car sans dépendances. Il pourrait toujours générer le site dans plusieurs années et peut être stocké dans le répertoire des sources du site.&lt;/p> &lt;/li> &lt;li> &lt;p>Il est conçu selon une &lt;strong>logique «classique»&lt;/strong> que je trouve pertinente dans la très grande majorité des cas. Il existe des types implicites comme des listes (qui proposent les contenus des répertoires et sous-répertoires) et des pages simples (qui sont le contenu). Le fichier de configuration est un simple fichier de configuration. La séparation entre les &lt;em>templates&lt;/em> et les contenus est évidente.&lt;/p> &lt;/li> &lt;li> &lt;p>La &lt;strong>gestion du multilinguisme&lt;/strong> est aboutie et disponible par défaut. C’est très important quand on travaille en Suisse.&lt;/p> &lt;/li> &lt;li> &lt;p>Les &lt;strong>taxonomies&lt;/strong> et les &lt;strong>relations entre les pages&lt;/strong> sont très performantes. Notamment la notion de &lt;em>related&lt;/em> que j’utilise par exemple dans mon projet d’&lt;a href="https://nicolasfriedli.ch/blog/annuaire-protestant/">annuaire protestant en ligne&lt;/a>.&lt;/p> &lt;/li> &lt;li> &lt;p>La &lt;strong>conception monolithique&lt;/strong> du logiciel fait que tout est inclus (&lt;em>batteries included&lt;/em>). C’est parfois considéré comme une limitation, par rapport à un système modulaire (&lt;em>plugins&lt;/em>), mais c’est un avantage dans la très grande majorité des cas.&lt;/p> &lt;/li> &lt;li> &lt;p>Hugo est &lt;strong>très rapide&lt;/strong> à la compilation. Il y a débat pour savoir sur c’est le générateur le plus rapide, mais je m’en balance. Je sais qu’il me permet de travailler le code ou le contenu sur un écran et voir le résultat en temps réel sur mon second écran. C’est tout ce que je souhaite.&lt;/p> &lt;/li> &lt;li> &lt;p>Il permet par défaut des &lt;strong>optimisations raisonnables&lt;/strong> dans la minification des fichiers texte et le travail sur les images. Sans être forcément le plus performant, son rapport entre le résultat et l’investissement (en temps de compilation ou en complexité de développement) est excellent. C’est l’efficience dont je parle dans &lt;a href="https://nicolasfriedli.ch/blog/optimisation-raisonnable/">Philosophie d’optimisation raisonnable &lt;/a>.&lt;/p> &lt;/li> &lt;li> &lt;p>Finalement, Hugo dispose d’une &lt;strong>bonne communauté&lt;/strong>, tant du point de vue de la quantité d’informations disponibles que de la qualité des rapports entre personnes.&lt;/p> &lt;/li> &lt;/ul> &lt;p>Le code de plusieurs projets que je développe avec Hugo est disponibles dans &lt;a href="https://github.com/nfriedli/">mon compte GitHub&lt;/a>. C’est le cas des &lt;a href="https://github.com/nfriedli/">sources de ce site&lt;/a>.&lt;/p> &lt;hr> &lt;p>Je pense que ce billet sera complété ou revu régulièrement. Il y a des choses auxquelles je n’ai pas pensé; d’autres que je pense assez marginales pour ne pas en parler aujourd’hui. Mais tous vos retours sont bienvenus pour essayer de l’améliorer.&lt;/p></description></item><item><title>Feuilles de style minifiées et gestion du cache</title><link>https://nicolasfriedli.ch/blog/css-minification-cache/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/css-minification-cache/</guid><description>&lt;p>Ce que j’applique en général pour la minification et la mise en cache des feuilles de style. C’est une &lt;em>optimisation raisonnable&lt;/em> qui utilise certaines fonctions natives d’Hugo mais évite trop de complexité.&lt;/p> &lt;h2 id="utiliser-une-feuille-de-style-externe">Utiliser une feuille de style externe&lt;/h2> &lt;p>La version la plus simple pour déclarer une feuille de style CSS, c’est un appel dans l’entête HTML:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;/css/style.css&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Pour que la feuille de style se trouve bien à l’endroit référencé après une compilation par Hugo, on la place dans: &lt;code>/static/css/style.css&lt;/code>.&lt;/p> &lt;p>Le fichier est seulement copié, sans aucune modification, et placé dans le répertoire du site compilé: &lt;code>/public/css/style.css&lt;/code>. C’est le principe de fonctionnement pour les &lt;a href="https://gohugo.io/getting-started/directory-structure/#static">fichiers statiques&lt;/a> chez Hugo. Tout ce qui se trouve dans le répertoire &lt;code>/static/&lt;/code> est copié tel quel, avec la même hiérarchie, dans &lt;code>/public/&lt;/code>.&lt;/p> &lt;h2 id="minification-des-css-par-hugo">Minification des CSS par Hugo&lt;/h2> &lt;p>C’est une bonne idée de minifier les feuilles de style. La copie seule est alors insuffisante (à moins de placer un fichier minifié par un outil tiers dans &lt;code>/static/&lt;/code>, évidemment) Je place donc la feuille de style de départ dans &lt;code>/assets/css/screen.css&lt;/code>. Comme son nom l’indique, elle est spécifique à l’affichage sur un écran.&lt;/p> &lt;p>Le répertoire &lt;code>/assets/&lt;/code> permet d’effectuer des opérations sur les fichiers qu’il contient. Ici:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ $screen := resources.Get &amp;#34;css/screen.css&amp;#34; | minify }} &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;{{ $screen.RelPermalink }}&amp;#34; media=&amp;#34;screen&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>La première ligne va chercher le fichier, relativement au répertoire, &lt;code>/assets/&lt;/code> et le minifie. J’utilise pour cela un filtre. La seconde ligne appelle le fichier final en HTML. Le fichier produit sera &lt;code>/public/css/screen.min.css&lt;/code>.&lt;/p> &lt;p>Je procède de même pour la feuille de style dédiée à l’impression:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ $print := resources.Get &amp;#34;css/print.css&amp;#34; | minify }} &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;{{ $print.RelPermalink }}&amp;#34; media=&amp;#34;print&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Le fichier produit se trouvera au même endroit que celui dédié à l’impression. Son nom portera, lui aussi, la trace de la minification par &lt;code>.min.&lt;/code>.&lt;/p> &lt;h2 id="fingerprint-et-cache-long">Fingerprint et cache long&lt;/h2> &lt;p>Il est possible de mettre en cache les feuilles de style pour une très longue durée. C’est pourquoi je souhaite que le nom de fichier final soit unique. C’est facile avec &lt;a href="https://gohugo.io/hugo-pipes/fingerprint/">fingerprint&lt;/a>:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ $screen := resources.Get &amp;#34;css/screen.css&amp;#34; | minify | fingerprint }} &amp;lt;link rel=&amp;#34;stylesheet&amp;#34; href=&amp;#34;{{ $screen.RelPermalink }}&amp;#34; media=&amp;#34;screen&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Ainsi, le nom final sera quelque chose comme:&lt;/p> &lt;pre tabindex="0">&lt;code>/css/screen.min.215a9ff1ab8351ee4d0a3c644904e7ab4945a1fa3d70197a0735fc3e43195476.css` &lt;/code>&lt;/pre>&lt;p>Double avantage de la démarche:&lt;/p> &lt;ul> &lt;li>la certitude que la feuille de style qui s’applique à la page actuelle est toujours la bonne (et jamais une autre CSS en mémoire dans le navigateur)&lt;/li> &lt;li>la possibilité de proposer une durée de cache très longue pour ne jamais recharger la feuille de style si elle existe déjà dans le navigateur&lt;/li> &lt;/ul> &lt;p>Cela se passe dans &lt;code>.htaccess&lt;/code> avec un serveur Apache:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;filesMatch &amp;#34;.(css)$&amp;#34;&amp;gt; Header set Cache-Control &amp;#34;max-age=63072000,immutable&amp;#34; &amp;lt;/filesMatch&amp;gt; &lt;/code>&lt;/pre>&lt;p>Ou dans &lt;code>_headers&lt;/code> chez Netlify:&lt;/p> &lt;pre tabindex="0">&lt;code>/css/* Cache-Control: max-age=63072000,immutable &lt;/code>&lt;/pre>&lt;p>Tant que le style n’a pas été modifié, le fichier n’est pas téléchargé. C’est clair et efficace.&lt;/p> &lt;h2 id="integrer-la-feuille-de-style">Intégrer la feuille de style&lt;/h2> &lt;p>Sur ce site, j’intégre le CSS dans le code HTML. C’est favorable lors de la première visite d’&lt;em>une&lt;/em> page:&lt;/p> &lt;pre tabindex="0">&lt;code>{{ $screen := resources.Get &amp;#34;css/screen.css&amp;#34; }} &amp;lt;style media=&amp;#34;screen&amp;#34;&amp;gt;{{ $screen | safeCSS }}&amp;lt;/style&amp;gt; &lt;/code>&lt;/pre>&lt;p>Mais c’est potentiellement contre-productif si l’internaute lit plusieurs pages ou revient sur le site. Toutefois, le gain d’une solution ou de l’autre est toujours minime sur un site léger comme le mien.&lt;/p> &lt;p>Quand le style est intégré, on pourrait aller plus loin et nettoyer &lt;em>chaque page&lt;/em> de ses styles inutiles. C’est ce que fait Max Böck avec son &lt;a href="https://mxb.dev/blog/emergency-website-kit/">site d’urgence avec Eleventy (11ty)&lt;/a>. C’est impossible avec Hugo sans outils externes et le gain est marginal.&lt;/p> &lt;h2 id="outils-hugo-non-utilises-sur-mon-blog">Outils Hugo non utilisés sur mon blog&lt;/h2> &lt;p>Il me semble que les options choisies sont pertinentes et suffisantes pour ce site. Mais Hugo propose d’autres possibilités. Par exemple:&lt;/p> &lt;ul> &lt;li>Réunir des feuilles de style avec &lt;a href="https://gohugo.io/hugo-pipes/bundling/">Concat&lt;/a>. C’est inutile puisque je ne n’ai qu’un fichier (par type de média).&lt;/li> &lt;li>Ajouter une vérification par &lt;a href="https://gohugo.io/hugo-pipes/fingerprint/#usage">Subresource Integrity&lt;/a>. C’est pertinent si l’on dépose ses CSS sur un serveur tiers (par exemple un CDN) et que l’on veut être certain qu’elles n’ont pas été modifiées.&lt;/li> &lt;li>Traiter la feuille de style avec SASS par la commande &lt;a href="https://gohugo.io/hugo-pipes/transpile-sass-to-css/">ToCSS&lt;/a>. Je préfère l’utilisation des variables CSS. La version de SASS embarquée dans Hugo n’est plus mise à jour. Et la version Dart exige des dépendances externes.&lt;/li> &lt;li>&lt;a href="https://zwbetz.com/how-to-use-purgecss-with-hugo/">Supprimer les styles non utilisés avec PurgeCSS&lt;/a> comme le propose Zachary Wade Betz. C’est utile sur un site avec une grande feuille de style (par exemple un &lt;em>framework&lt;/em> CSS), mais pas ici.&lt;/li> &lt;/ul></description></item><item><title>Proposer un annuaire protestant en ligne</title><link>https://nicolasfriedli.ch/blog/annuaire-protestant/</link><pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/annuaire-protestant/</guid><description>&lt;p>Avec theologique.ch, je propose un annuaire protestant (réformé) francophone en ligne. C’est un outil et non une finalité en soi. Voici quelques raisons qui m’ont poussé à créer ce site.&lt;/p> &lt;p>&lt;strong>Cet annuaire n’a pas rencontré son public et n’est plus en ligne!&lt;/strong>&lt;/p> &lt;h2 id="etablir-un-etat-des-lieux">Établir un état des lieux&lt;/h2> &lt;p>Il y a presque 10 ans, j’avais proposé un recensement lors des &lt;em>Assises du web protestant romand&lt;/em>. L’&lt;a href="https://theologique.ch/">annuaire protestant theologique.ch&lt;/a> que je fournis aujourd’hui est une version plus développée de ce qui avait été fait à ce moment-là.&lt;/p> &lt;p>Des discussions existent, à différents niveaux décisionnels, pour savoir quelles présences en ligne il faut envisager. &lt;strong>Il me paraît impensable d’imaginer des choses nouvelles ou différentes sans connaître ce qui existe actuellement.&lt;/strong> L’état des lieux que constitue theologique.ch est une brique nécessaire, mais insuffisante pour réfléchir aux questions de présence sur le web.&lt;/p> &lt;h2 id="evaluer-le-web-protestant-francophone">Évaluer le web protestant francophone&lt;/h2> &lt;p>Pour construire theologique.ch, j’ai parcouru tous les sites référencés (et bien d’autres). Pour chacun, j’ai navigué assez pour rédiger une description sommaire. &lt;strong>Ce travail m’a permis une redécouverte du web protestant réformé francophone que je connais un peu mieux qu’avant.&lt;/strong>&lt;/p> &lt;p>Même si je n’ai pas systématiquement &lt;a href="https://nicolasfriedli.ch/blog/tester-site/">testé les sites&lt;/a> consultés, quelques minutes de navigation et de lecture sur chacun d’eux me donnent un bon aperçu de leur état (contenu, menus, voire performances ou accessibilité). Cela m’est utile en tant que webmaster de certains sites protestants, pour savoir comment ils se positionnent par rapport au panorama général.&lt;/p> &lt;h2 id="trouver-des-sites-sans-moteur-de-recherche">Trouver des sites sans moteur de recherche&lt;/h2> &lt;p>Pourquoi construire un annuaire alors que les moteurs de recherche, Google en premier lieu, sont aujourd’hui si performants? À mes yeux, la réponse est évidente: je n’aurais jamais réussi à construire un annuaire sans liens sur certains sites consultés.&lt;/p> &lt;p>Quelle que soit l’efficacité des moteurs de recherche, ils ne donneront presque jamais certains sites de theologique.ch dans les résultats de recherche (SERP). Sauf, bien entendu, si l’on sait quel site on veut trouver &lt;em>a priori&lt;/em>.&lt;/p> &lt;p>&lt;strong>La présence de liens est un formidable moyen de rendre visibles des sites que l’on estime pertinents dans un contexte donné.&lt;/strong> J’ai découvert ces sites sur des &lt;em>pages de liens&lt;/em>, dans des &lt;em>blogrolls&lt;/em>, dans des &lt;em>pages de partenariats&lt;/em> ou dans le &lt;em>corps du texte&lt;/em>. Toutefois, il m’en reste encore à découvrir, par vos suggestions.&lt;/p> &lt;h2 id="favoriser-la-decouverte">Favoriser la découverte&lt;/h2> &lt;p>Sur chaque page de l’annuaire qui présente un site, il existe plusieurs actions possibles:&lt;/p> &lt;ul> &lt;li>le clic sur le site en question (qui s’ouvre dans une nouvelle page)&lt;/li> &lt;li>le retour à l’accueil&lt;/li> &lt;li>le clic sur la (ou les) catégorie(s) du site&lt;/li> &lt;li>la consultation d’autres sites proposés&lt;/li> &lt;/ul> &lt;p>&lt;strong>theologique.ch rend visibles d’autres propositions pertinentes, en fonction du contexte.&lt;/strong> C’est la raison pour laquelle je n’ajoute pas de moteur de recherche sur le site pour le moment. De plus, je suis convaincu que cette mise en relation est favorable pour les moteurs de recherche.&lt;/p> &lt;p>Je signale que le lien sortant vers le site cible est toujours visible en tant qu’URL simplifiée, afin d’aider à la mémorisation des noms de domaine qui existent.&lt;/p> &lt;h2 id="travailler-avec-hugo">Travailler avec Hugo&lt;/h2> &lt;p>Le &lt;a href="https://gohugo.io/">générateur de sites statiques Hugo&lt;/a> motorise theologique.ch. J’avais envie de travailler avec les taxonomies et les liens de type &lt;em>à voir aussi&lt;/em> ou &lt;em>peut aussi vous intéresser&lt;/em>. Hugo dispose de possibilités intéressantes dans ce domaine avec &lt;a href="https://gohugo.io/methods/pages/related/">Related&lt;/a>.&lt;/p> &lt;p>Chaque page qui propose un site est classée:&lt;/p> &lt;ul> &lt;li>dans une ou plusieurs rubriques (&lt;em>tags&lt;/em>), toutes disponibles sur la page d’accueil&lt;/li> &lt;li>avec un ou plusieurs précisions (&lt;em>keywords&lt;/em>), comme le type de site ou sa localisation, pour améliorer les choix des sites en lien, mais pas affichés&lt;/li> &lt;li>avec parfois une entrée supplémentaire (&lt;em>editors&lt;/em>), pour créer une relation forte quand une même entité ou personne édite plusieurs sites&lt;/li> &lt;/ul> &lt;p>En JSON, cela se présente ainsi:&lt;/p> &lt;pre tabindex="0">&lt;code>{ &amp;#34;title&amp;#34;: &amp;#34;Cèdres Formation&amp;#34;, &amp;#34;site&amp;#34;: &amp;#34;https://cedresformation.ch/&amp;#34;, &amp;#34;tags&amp;#34;: [&amp;#34;formation&amp;#34;,&amp;#34;spiritualité&amp;#34;], &amp;#34;keywords&amp;#34;: [&amp;#34;vaud&amp;#34;], &amp;#34;editors&amp;#34;: [&amp;#34;cedres&amp;#34;] } &lt;/code>&lt;/pre>&lt;p>Ensuite, une pondération de ces 3 taxonomies permet d’afficher une liste de suggestions, limitée à 5 sites. &lt;strong>Avec une telle méthode, j’espère faire émerger des propositions de mise en relations auxquelles je ne penserais pas spontanément.&lt;/strong> Et j’espère aussi pouvoir classer beaucoup de sites sans m’égarer dans l’élaboration de menus complexes (et difficiles à maintenir).&lt;/p> &lt;h2 id="faciliter-le-partage-de-liens">Faciliter le partage de liens&lt;/h2> &lt;p>Même si j’ai découvert des sites par des liens sur d’autres, le maillage du protestantisme réformé francophone reste lacunaire. Il me semble que theologique.ch est une esquisse de solution simple et efficace.&lt;/p> &lt;p>&lt;strong>Chaque site qui fait un lien vers la page d’accueil de theologique.ch ou n’importe quelle page de l’annuaire renforce au final l’ensemble des sites référencés.&lt;/strong>&lt;/p> &lt;p>Je ne peux que conseiller à toutes les personnes qui administrent des sites d’ajouter un renvoi vers theologique.ch dans leur &lt;em>blogroll&lt;/em>, sur leur &lt;em>page de liens&lt;/em> ou dans un &lt;em>contenu éditorial&lt;/em>. Mais je ne demanderai jamais de lien en retour pour ajouter un site dans l’annuaire.&lt;/p> &lt;h2 id="en-resume">En résumé&lt;/h2> &lt;p>Ce que je retire de la création de theologique.ch:&lt;/p> &lt;ol> &lt;li>Mieux vaut un annuaire incomplet que pas d’annuaire du tout.&lt;/li> &lt;li>En recherchant des informations utiles sur des sites (pour rédiger les descriptions), j’ai appris beaucoup sur l’état du web protestant réformé francophone.&lt;/li> &lt;li>Les moteurs de recherche ne remplacent pas les &lt;em>vrais liens&lt;/em>.&lt;/li> &lt;li>Les liens contextuels apportent plus que des listes simples «plates».&lt;/li> &lt;li>Hugo permet une gestion performante des taxonomies.&lt;/li> &lt;li>Mieux vaut des liens vers un site centralisé que pas de liens du tout.&lt;/li> &lt;/ol></description></item><item><title>Conseils d’utilisation des QR codes</title><link>https://nicolasfriedli.ch/blog/conseils-qr-code/</link><pubDate>Wed, 14 Feb 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/conseils-qr-code/</guid><description>&lt;p>Les arnaques aux QR codes semblent se multiplier. Les médias généralistes en parlent et donnent quelques conseils, souvent aux utilisateurs et utilisatrices (par exemple: &lt;a href="https://www.rts.ch/info/sciences-tech/14581852-les-arnaques-aux-qr-codes-se-multiplient-depuis-quelques-mois.html">Les arnaques aux QR codes se multiplient depuis quelques mois&lt;/a>). Pourtant, j’estime que &lt;strong>l’effort de sécurisation et de fiabilité doit aussi être fait du côté des personnes qui créent les codes&lt;/strong>.&lt;/p> &lt;p>Je parle en priorité des codes qui dirigent vers une page web, mais plein d’autres utilisations sont possibles. La page &lt;a href="https://www.ncsc.admin.ch/ncsc/fr/home/infos-fuer/infos-private/aktuelle-themen/qr-code-anwendungen-und-risiken.html">Codes QR – applications et risques&lt;/a> sur le site de la Confédération suisse donne quelques exemples d’utilisations et de problèmes potentiels.&lt;/p> &lt;h2 id="petits-et-grands-problemes">Petits et grands problèmes&lt;/h2> &lt;p>Si un code qui ne fonctionne pas comme prévu est toujours un problème, il faut tout de même hiérarchiser les soucis:&lt;/p> &lt;p>Parfois, un QR code &lt;strong>ne fonctionne pas&lt;/strong>. Il renvoie à une adresse (URL) qui n’existe pas ou plus. C’est frustrant, décevant, l’image de l’institution en prend un coup. Les conséquences sont toutefois limitées.&lt;/p> &lt;p>Dans d’autres cas, le QR code &lt;strong>renvoie à la mauvaise adresse&lt;/strong>. Soit l’adresse a toujours été problématique, soit la destination (via une redirection) a été modifiée, intentionnellement ou non. Difficile de mesurer les conséquences: un détournement peut être amusant, insultant, sans intérêt, mauvais pour l’image, choquant, provocant, etc.&lt;/p> &lt;p>Finalement, un QR code est &lt;strong>utilisé pour une arnaque&lt;/strong>. Le code de départ est remplacé ou le système de redirection piraté, et les internautes arrivent sur un faux site qui cherche à voler des informations. Le code n’est qu’un maillon de la chaîne d’un système organisé. Les conséquences peuvent être importantes et on sort du domaine technique pour entrer dans les questions de loi et de justice.&lt;/p> &lt;h2 id="conseils-lors-de-lutilisation">Conseils lors de l’utilisation&lt;/h2> &lt;p>Les utilisateurs et utilisatrices de QR codes ont intérêt à adopter quelques réflexes utiles.&lt;/p> &lt;h3 id="avant-de-scanner">Avant de scanner&lt;/h3> &lt;p>Il faut vérifier aussi bien que possible si &lt;strong>le code n’a pas été remplacé par un autre&lt;/strong>. Un autocollant posé sur un ancien code est suspect, sans être forcément frauduleux.&lt;/p> &lt;p>Il vaut également la peine de se poser la question de la &lt;strong>pertinence du code&lt;/strong>. Si on vous promet l’accès à un wifi gratuit en pleine rue, sur un petit autocollant collé sur un lampadaire, il n’est pas toujours judicieux de le scanner.&lt;/p> &lt;h3 id="apres-avoir-scanne-mais-avant-de-cliquer">Après avoir scanné mais avant de cliquer&lt;/h3> &lt;p>Une fois le code scanné, le téléphone propose l’ouverture d’un lien, l’acceptation d’un réseau wifi, un paiement sur Twint, etc. Il est possible de &lt;strong>contrôler la destination&lt;/strong> du code à ce moment-là. Quand une institution officielle propose un QR code, je trouve qu’elle devrait toujours renvoyer à son nom de domaine.&lt;/p> &lt;h3 id="en-arrivant-sur-le-site">En arrivant sur le site&lt;/h3> &lt;p>Si le clic a été effectué mais que &lt;strong>le site de destination semble bizarre&lt;/strong>, il est encore temps d’arrêter les frais. En particulier quand des informations personnelles ou de paiement sont demandées ou quand une application est proposée à l’installation (surtout si elle n’avait pas été mentionnée dans le texte qui accompagne souvent le code).&lt;/p> &lt;h2 id="conseils-lors-de-la-creation">Conseils lors de la création&lt;/h2> &lt;p>Les conseils précédents sont destinés aux utilisateurs et utilisatrices. Les suivants sont destinés à celles et ceux qui créent et rendent publics des QR codes.&lt;/p> &lt;h3 id="utiliser-son-propre-nom-de-domaine">Utiliser son propre nom de domaine&lt;/h3> &lt;p>Je pense que &lt;strong>l’utilisation de raccourcisseurs d’URL est souvent une mauvaise idée&lt;/strong>. Infomaniak vient de lancer son service &lt;a href="https://chk.infomaniak.com/">chk.me&lt;/a>. Personne ne pourra savoir quelle sera l’URL finale qui se cache derrière cette version courte.&lt;/p> &lt;p>L’utilisation de &lt;strong>son propre nom de domaine est une garantie de sécurité&lt;/strong>. Il peut être utilisé de 2 manières:&lt;/p> &lt;ul> &lt;li>en renvoyant à une URL directe (peut-être longue), en générant un code dans un outil tiers ou directement dans son navigateur&lt;/li> &lt;li>en renvoyant à une URL spécifique (souvent plus courte), redirigée par &lt;code>.htaccess&lt;/code>, son outil de gestion de contenu (par exemple &lt;a href="https://fr.wordpress.org/plugins/redirection/">Redirection&lt;/a> pour WordPress) voire par son propre système de redirection&lt;/li> &lt;/ul> &lt;p>&lt;strong>C’est sans discussion la solution la plus simple et la plus efficace.&lt;/strong>&lt;/p> &lt;p>En complément, je propose de toujours écrire en toutes lettres l’adresse vers laquelle le code est censé renvoyer.&lt;/p> &lt;h3 id="proposer-un-support-non-accessible">Proposer un support non accessible&lt;/h3> &lt;p>Quand un code est affiché quelque part, tout est bon pour le rendre non accessible directement:&lt;/p> &lt;ul> &lt;li>affichage dans une vitrine ou derrière une vitre&lt;/li> &lt;li>affichage sur un écran ou en image projetée&lt;/li> &lt;li>affichage dans un endroit inaccessible (en hauteur, derrière un guichet, au plafond, etc.)&lt;/li> &lt;/ul> &lt;h3 id="rendre-la-substitution-complexe">Rendre la substitution complexe&lt;/h3> &lt;p>Si la modification d’un QR code est très difficile, &lt;strong>la génération d’un autre code et la substitution sont très simples&lt;/strong> (sauf quand le support est difficilement accessible).&lt;/p> &lt;p>Plutôt que d’imprimer seulement un petit autocollant sur fond blanc, on peut imprimer le code sur un papier à entête officiel de l’institution, et pourquoi pas y ajouter une marque au tampon encreur. D’autres pistes existent comme le papier holographique ou la gravure sur une plaque métallique.&lt;/p> &lt;p>Comme pour l’argent liquide, &lt;strong>c’est la complexité et le coût de la falsification&lt;/strong> qui la rendront moins intéressante.&lt;/p> &lt;h3 id="modifier-lurl-finale-plutot-que-remplacer">Modifier l’URL finale plutôt que remplacer&lt;/h3> &lt;p>Parfois, des adresses changent. Plutôt que de coller un nouveau code (suspect) sur l’ancien, il est préférable de &lt;strong>modifier l’URL finale&lt;/strong>. C’est une démarche facile avec son propre nom de domaine et des redirections. Ainsi, le support ne sera pas modifié par ajouts successifs.&lt;/p> &lt;p>De plus, c’est pertinent dans le cas où un QR code est utilisé à plusieurs endroits. Plutôt que de faire modifier le support à un moment précis, &lt;strong>la redirection est instantanée et généralisée&lt;/strong>.&lt;/p> &lt;h3 id="verifier-regulierement-le-fonctionnement">Vérifier régulièrement le fonctionnement&lt;/h3> &lt;p>Quand un code est utilisé par une organisation, une institution ou une entreprise, je conseille de &lt;strong>demander aux membres et employé·es de le vérifier régulièrement&lt;/strong>. Un scan rapide permet de s’assurer qu’il fonctionne toujours et qu’il renvoie au bon endroit. C’est de plus une bonne incitation à utiliser régulièrement cet outil.&lt;/p> &lt;h3 id="supprimer-proprement-les-codes-invalides">Supprimer proprement les codes invalides&lt;/h3> &lt;p>Finalement, quand une page de destination est désactivée, il faut agir intelligemment:&lt;/p> &lt;ul> &lt;li>s’il est certain que le QR code n’était affiché qu’en un endroit, il peut être simplement supprimé&lt;/li> &lt;li>mais quand le code était utilisé à plusieurs endroits, il vaut mieux &lt;strong>conserver une redirection&lt;/strong>, par exemple vers une page générique qui annonce sa désactivation (ou à défaut sur la page d’accueil de son site)&lt;/li> &lt;/ul> &lt;p>D’un point de vue technique, je pense que toutes les URL courtes (sur son nom de domaine) ne devraient jamais être utilisées pour renvoyer ailleurs après une désactivation. En version courte: &lt;strong>nouvelle redirection oui, réutilisation non&lt;/strong>. C’est le principe d’un identifiant unique (&lt;em>UID&lt;/em>).&lt;/p> &lt;hr> &lt;p>&lt;strong>Ajout du 15 mars 2024.&lt;/strong> Quelques jours après la publication de ce billet, ma commune de Milvignes publiait sur son site un &lt;a href="https://web.archive.org/web/20240313084500/https://www.milvignes.ch/communications/detail/probleme-avec-les-qr-codes-du-milvignes-infos-de-mars-2024-ne-pas-les-utiliser">problème de QR codes&lt;/a>. Elle avait utilisé un système de redirection (qr.codes ou qr.io) payant plutôt que de renvoyer directement à son propre nom de domaine. La période d’essai était expirée; les codes invalides&amp;hellip;&lt;/p> &lt;hr> &lt;p>&lt;strong>Ajout du 29 juillet 2024.&lt;/strong> Dans son billet &lt;a href="https://shkspr.mobi/blog/2024/07/qr-code-hijacking-attempts-are-pretty-inept/">QR Code Hijacking Attempts Are Pretty Inept&lt;/a>, Terence Eden montre quelques exemples de fraudes, puis insiste sur une URL officielle. On ne le dira jamais assez: votre nom de domaine est capital.&lt;/p> &lt;hr> &lt;p>&lt;strong>Ajout du 16 janvier 2024.&lt;/strong> À partir de sa version 0.141.0, le générateur de sites statiques Hugo (utilisé ici) permet de créer des codes à la volée. Si je veux créer un code avec l’adresse de mon site, je tape quelque chose comme:&lt;/p> &lt;pre tabindex="0">&lt;code>{{&amp;lt; qr text=&amp;#34;https://nicolasfriedli.ch&amp;#34; /&amp;gt;}} &lt;/code>&lt;/pre>&lt;p>Sans passer par un service tiers, j’obtiens une image légère, hébergée sur mon propre site et pérenne, à l’exemple des permaliens de bas de page.&lt;/p></description></item><item><title>Tester un site web</title><link>https://nicolasfriedli.ch/blog/tester-site/</link><pubDate>Tue, 13 Feb 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/tester-site/</guid><description>&lt;p>Il n’est pas rare que l’on me demande ce que je pense d’un site web personnel ou professionnel. Une petite phrase lâchée dans une discussion informelle:&lt;/p> &lt;blockquote> &lt;p>J’ai un nouveau site, est-ce que tu jettes un coup d’œil et tu me dis ce que tu en penses?&lt;/p>&lt;/blockquote> &lt;p>Voici quelques tests que je vais effectuer sans délai pour me faire une idée. Car je ne vais pas me contenter de &lt;em>regarder&lt;/em> le site et de naviguer sur quelques pages. L’ordre des tests dépendra de ce que je vais trouver dans mes investigations.&lt;/p> &lt;h2 id="ouvrir-le-site">Ouvrir le site&lt;/h2> &lt;p>Dans un premier temps, je vais me rendre sur le site, sur sa page d’accueil. Je vais jeter un premier regard rapide, m’intéresser à la taille de la police, aux contrastes, à la mise en page, etc. afin de voir si tout semble normal. En principe, jusqu’ici, tout va plutôt bien.&lt;/p> &lt;p>Puis je vais désactiver le cache du navigateur et limiter la bande passante. Je vais contrôler le poids des ressources qu’il télécharge et leur provenance au rechargement de la page. J’aurai une idée de la vitesse d’affichage. Il n’est pas rare que des lenteurs et des lourdeurs soient déjà perceptibles.&lt;/p> &lt;h2 id="lancer-pagespeed-insights">Lancer PageSpeed Insights&lt;/h2> &lt;p>Ensuite, je vais coller l’adresse du site dans &lt;a href="https://pagespeed.web.dev/">PageSpeed Insights&lt;/a>. Si les 4 résultats sont verts, c’est bon signe. Si certains résultats sont orange, ils deviendront naturellement des points d’attention. Si des résultats sont rouges, je vais focaliser mes investigations dans ces domaines avant tout.&lt;/p> &lt;h2 id="regarder-letat-du-referencement">Regarder l’état du référencement&lt;/h2> &lt;p>Puis je me rendrai dans Google et effectuerai une recherche du type &lt;code>site:nicolasfriedli.ch&lt;/code>. Ainsi j’aurai une idée:&lt;/p> &lt;ul> &lt;li>du nombre de pages référencées&lt;/li> &lt;li>de la qualité de l’affichage des résultats de recherche (SERP)&lt;/li> &lt;/ul> &lt;p>Si le site est très récent et qu’il n’est pas affiché, je le signalerai. Si le site est ancien et peu présent (ou mal affiché), je lancerai la thématique du référencement. À quoi bon un site, même excellent, que l’on ne trouve pas.&lt;/p> &lt;h2 id="naviguer-sur-plusieurs-peripheriques">Naviguer sur plusieurs périphériques&lt;/h2> &lt;p>Par la suite, je vais ouvrir le site sur plusieurs ordinateurs, avec des écrans de plusieurs tailles, différents systèmes d’exploitation et navigateurs. Je vais y naviguer sur ma tablette et sur mon smartphone.&lt;/p> &lt;p>Je vais redimensionner la fenêtre manuellement, essayer de zoomer le texte, vérifier des contrastes. J’essaierai de m’y rendre à plusieurs moments de la journée, parce qu’un site n’est pas le même en plein soleil ou dans la pénombre.&lt;/p> &lt;h2 id="tester-la-navigation-au-clavier-et-laccessibilite">Tester la navigation au clavier et l’accessibilité&lt;/h2> &lt;p>Je vais retourner sur la page d’accueil et tenter de naviguer en utilisant mon seul clavier. Je verrai si l’utilisation des menus est fluide, si l’ordre des liens est correct, s’ils sont visibles à la sélection, etc.&lt;/p> &lt;p>C’est un test d’accessibilité (A11Y) basique, que je vais compléter par un passage dans &lt;a href="https://wave.webaim.org/">WAVE Web Accessibility Evaluation Tools&lt;/a> pour contrôler la structure de la page, les textes alternatifs des images, etc.&lt;/p> &lt;h2 id="lire-quelques-contenus">Lire quelques contenus&lt;/h2> &lt;p>Si je trouve un page à fort contenu, je vais la lire intégralement. Je pourrai me rendre compte en pratique de la lisibilité de la police choisie (sur plusieurs systèmes d’exploitation), des choix de contraste, de la mise en évidence des liens, de l’usage des intertitres et des listes.&lt;/p> &lt;p>Je vérifierai aussi si les lignes de textes ne sont pas trop longues ou trop courtes, si l’interligne est pertinent. Si, à la moitié de la page, j’ai une impression de fatigue, je suppose que d’autres internautes l’auront aussi.&lt;/p> &lt;h2 id="se-faire-une-idee-du-bilan-carbone">Se faire une idée du bilan carbone&lt;/h2> &lt;p>Par la suite, je vais tester le bilan carbone du site dans &lt;a href="https://www.websitecarbon.com/">Website Carbon Calculator&lt;/a>. À vrai dire, j’aurai déjà une idée du résultat en fonction de tous les tests précédents, mais cette vérification n’est pas de trop.&lt;/p> &lt;p>C’est un test que je trouve particulièrement important pour tous les sites qui parlent de ressources, d’écologie, de respect de la Création, etc. Un peu de cohérence ne fait jamais de mal.&lt;/p> &lt;h2 id="controler-la-validite-du-code">Contrôler la validité du code&lt;/h2> &lt;p>Un passage par les validateurs du World Wide Web Consortium (W3C) me permettra de vérifier l’état du code:&lt;/p> &lt;ul> &lt;li>&lt;a href="https://validator.w3.org/">validation HTML&lt;/a>&lt;/li> &lt;li>&lt;a href="https://jigsaw.w3.org/css-validator/">validation CSS&lt;/a>&lt;/li> &lt;li>&lt;a href="https://validator.w3.org/feed/">validation RSS ou Atom&lt;/a>&lt;/li> &lt;/ul> &lt;p>Avec le dernier test, je contrôlerai si un flux RSS ou Atom peut être découvert automatiquement. Et s’il est absent, je me demanderai s’il serait pertinent d’en proposer un.&lt;/p> &lt;h2 id="parcourir-lentier-du-site">Parcourir l’entier du site&lt;/h2> &lt;p>Par la suite, je lancerai encore un outil qui parcourt l’entier du site (&lt;em>crawl&lt;/em>), par exemple &lt;a href="https://www.screamingfrog.co.uk/seo-spider/">SEO Spider Tool&lt;/a>. Je découvrirai les éventuels liens morts, les répétitions fautives dans les titres ou les descriptions, etc.&lt;/p> &lt;p>Un site en ligne depuis longtemps et avec beaucoup de pages aura souvent plus de liens morts qu’un site tout frais. Mais cette vue d’ensemble permet souvent de découvrir des scories qu’il est facile de corriger.&lt;/p> &lt;h2 id="passer-aux-regles-opquast">Passer aux règles Opquast&lt;/h2> &lt;p>Si tout s’est bien passé jusque là, je vérifierai certaines &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/">règles Opquast&lt;/a>. En particulier celles que je trouve les plus pertinentes sur ce site précis sur lequel j’aurai déjà passé quelques minutes.&lt;/p> &lt;p>Par exemple, si le site présente beaucoup d’adresses de contact, je contrôlerai leur contenu. Si le site est en plusieurs langues, je regarderai la gestion du multilinguisme.&lt;/p> &lt;h2 id="envoyer-un-retour">Envoyer un retour&lt;/h2> &lt;p>Cette petite analyse n’est pas un audit au sens strict. Je ne vais donc pas rendre un document complet qui détaille tous les points. En fonction de ce que j’ai vu dans mon parcours, je choisirai sur quoi portera mon retour.&lt;/p> &lt;p>J’essaierai toujours de dire le plus simplement possible:&lt;/p> &lt;ul> &lt;li>ce qui m’a plu dans le site testé&lt;/li> &lt;li>les problèmes les plus importants qu’il pose&lt;/li> &lt;/ul> &lt;p>Envie d’essayer? Testez vous-même votre site par les différentes étapes proposées. Ou prenez le risque de me demander de «jeter un coup d’œil rapide».&lt;/p></description></item><item><title>htaccess chez Infomaniak</title><link>https://nicolasfriedli.ch/blog/htaccess/</link><pubDate>Mon, 12 Feb 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/htaccess/</guid><description>&lt;p>Pour des sites générés avec Hugo et hébergés chez Infomaniak, voici le &lt;code>.htaccess&lt;/code> type que j’utilise. C’est une version découpée en plusieurs parties avec des commentaires.&lt;/p> &lt;p>L’encodage et la langue par défaut sont directement envoyés en entête:&lt;/p> &lt;pre tabindex="0">&lt;code>AddDefaultCharset UTF-8 DefaultLanguage fr-ch &lt;/code>&lt;/pre>&lt;p>Si la page est appelée en &lt;code>http&lt;/code> ou s’il elle commence par &lt;code>www&lt;/code>, on renvoie à un version en &lt;code>https&lt;/code> sans &lt;code>www&lt;/code> (voir &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/toutes-les-pages-utilisent-le-protocole-https">Opquast 192&lt;/a> et &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/ladresse-du-site-fonctionne-avec-et-sans-prefixe-www">Opquast 211&lt;/a>). On renvoie tout sur la page d’accueil et on impose le nom de domaine (plutôt que s’utiliser &lt;code>HTTP_HOST&lt;/code>):&lt;/p> &lt;pre tabindex="0">&lt;code>RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www. [NC] RewriteRule ^(.*)$ https://nicolasfriedli.ch/$1 [R=301,L] &lt;/code>&lt;/pre>&lt;p>On envoie des entêtes pour la sécurité du site. La première ligne existe &lt;a href="https://www.infomaniak.com/fr/support/faq/2133/gerer-hsts-dun-site-webhebergement">par défaut chez Infomaniak&lt;/a>, mais en version trop limitée pour le soumettre à &lt;a href="https://hstspreload.org/">HSTS preload&lt;/a>. Le reste peut être testé chez &lt;a href="https://securityheaders.com/">Security Headers&lt;/a>.&lt;/p> &lt;pre tabindex="0">&lt;code>Header always set Strict-Transport-Security &amp;#34;max-age=63072000; includeSubDomains; preload&amp;#34; Header always set X-Content-Type-Options &amp;#34;nosniff&amp;#34; Header always set X-Frame-Options &amp;#34;DENY&amp;#34; Header always set X-XSS-Protection &amp;#34;1;mode=block&amp;#34; Header always set Referrer-Policy &amp;#34;same-origin&amp;#34; Header always set X-Permitted-Cross-Domain-Policies &amp;#34;none&amp;#34; &lt;/code>&lt;/pre>&lt;p>En cas d’erreur, on renvoie logiquement une erreur 404, mais pas de page personnalisée pour le moment (voir &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/le-serveur-envoie-une-page-derreur-404-personnalisee">Opquast 216&lt;/a>):&lt;/p> &lt;pre tabindex="0">&lt;code>ErrorDocument 404 https://nicolasfriedli.ch/ &lt;/code>&lt;/pre>&lt;p>On redirige le flux RSS de WordPress (qui a été utilisé ici) vers le flux produit par Hugo. C’est une redirection permanente:&lt;/p> &lt;pre tabindex="0">&lt;code>Redirect 301 /feed/ /index.xml &lt;/code>&lt;/pre>&lt;p>Je choisis de gérer le cache (voir &lt;a href="https://checklists.opquast.com/fr/assurance-qualite-web/le-serveur-envoie-les-informations-permettant-la-mise-en-cache-des-contenus">Opquast 220&lt;/a>) très simplement, par extension de fichier. Les images reçoivent un cache de 1 mois:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;filesMatch &amp;#34;.(jpg|jpeg|png|gif|ico|svg|webp|avif)$&amp;#34;&amp;gt; Header set Cache-Control &amp;#34;max-age=2592000,public&amp;#34; &amp;lt;/filesMatch&amp;gt; &lt;/code>&lt;/pre>&lt;p>Pour les feuilles de style et les polices d’écriture locales, je choisis un cache &lt;code>immutable&lt;/code>. Ce qui signifie que ces fichiers ne seront jamais rechargés par le navigateur durant 2 ans. Il faut utiliser un numéro de version (&lt;em>cache busting&lt;/em>) pour ne pas se planter. Avec Hugo, j’utilise un identifiant unique (&lt;em>fingerprint&lt;/em>) pour les feuilles de style CSS externes. Pour les polices d’écriture, je conseille de passer par &lt;a href="https://gwfh.mranftl.com/fonts">google-webfonts-helper&lt;/a> qui donne toujours des noms de fichier avec numéro de version. Voici la directive:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;filesMatch &amp;#34;.(css|woff2)$&amp;#34;&amp;gt; Header set Cache-Control &amp;#34;max-age=63072000,immutable&amp;#34; &amp;lt;/filesMatch&amp;gt; &lt;/code>&lt;/pre>&lt;p>Le &lt;a href="https://github.com/nfriedli/nicolasfriedli.ch/blob/main/static/.htaccess">&lt;code>.htaccess&lt;/code> utilisé pour ce site&lt;/a> peut être repris presque sans modifications, mais n’oubliez pas de changer le nom de domaine ou d’utiliser &lt;code>HTTP_HOST&lt;/code>.&lt;/p> &lt;p>Avant de modifier un fichier &lt;code>.htaccess&lt;/code> en ligne, il faut s’assurer de &lt;strong>pouvoir y accéder par un autre moyen&lt;/strong> (par exemple par FTP). Si Wordpress est utilisé pour modifier un tel fichier, en cas d’erreur il ne sera plus du tout accessible (et votre site non plus).&lt;/p></description></item><item><title>Mode sombre en quelques lignes de CSS</title><link>https://nicolasfriedli.ch/blog/dark-mode/</link><pubDate>Sat, 10 Feb 2024 00:00:00 +0000</pubDate><author>hello+rss@nicolasfriedli.ch (Nicolas Friedli)</author><guid>https://nicolasfriedli.ch/blog/dark-mode/</guid><description>&lt;p>En quelques lignes de CSS, il est possible d’activer un mode sombre automatique sur son site. La &lt;em>version aboutie&lt;/em> est celle que j’utilise pour plusieurs projets. C’est simple et fiable.&lt;/p> &lt;h2 id="version-minimale">Version minimale&lt;/h2> &lt;p>Le plus simple, c’est:&lt;/p> &lt;pre tabindex="0">&lt;code>root { color-scheme: light dark; } &lt;/code>&lt;/pre>&lt;p>Si les couleurs d’arrière-plan, de texte, des liens, etc., n’ont pas été définies, c’est parfaitement fonctionnel. Il suffit de signaler au navigateur qu’il a le droit de s’afficher en clair (&lt;em>light&lt;/em>) ou en foncé (&lt;em>dark&lt;/em>) selon les préférences de l’internaute. Si aucune préférence a été fixée, c’est le mode &lt;em>light&lt;/em> qui sera choisi.&lt;/p> &lt;p>Il est aussi possible de passer au mode sombre sans fixer aucune couleur, mais sans bascule automatique en fonction des préférences:&lt;/p> &lt;pre tabindex="0">&lt;code>root { color-scheme: dark; } &lt;/code>&lt;/pre>&lt;p>Au lieu de préciser le schéma de couleur dans la feuille de style CSS, il peut être annoncé dans le code HTML de la page:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;meta name=&amp;#34;color-scheme&amp;#34; content=&amp;#34;dark light&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Dans certains cas, c’est préférable, car le navigateur a cette information avant même de charger la feuille de style. Mais c’est là une question de détails.&lt;/p> &lt;h2 id="version-aboutie-mais-simplissime">Version aboutie (mais simplissime)&lt;/h2> &lt;p>Dès que des couleurs sont choisies, il faut de la cohérence pour éviter du texte foncé sur fond foncé (ou clair sur clair). La feuille de style la plus simple pour gérer cela:&lt;/p> &lt;pre tabindex="0">&lt;code>:root { color-scheme: light dark; --background: #FFF; --text: #333; } @media (prefers-color-scheme: dark) { :root { --background: #000; --text: #DDD; } } html { background: var(--background); color: var(--text); } a { color: inherit; } &lt;/code>&lt;/pre>&lt;p>Le code est simple:&lt;/p> &lt;ul> &lt;li>Le navigateur peut choisir le mode &lt;em>light&lt;/em> ou le mode &lt;em>dark&lt;/em>&lt;/li> &lt;li>Une couleur de fond et une couleur de texte sont déclarées en variables CSS&lt;/li> &lt;li>Si la préférence du navigateur est le mode sombre, les variables sont modifiées.&lt;/li> &lt;li>Le fond et le texte sont déclarés pour tout le document.&lt;/li> &lt;li>Les liens prennent la même couleur que le texte.&lt;/li> &lt;/ul> &lt;p>La même chose est possible sans variables, de la manière suivante:&lt;/p> &lt;pre tabindex="0">&lt;code>:root { color-scheme: light dark; } html { background: #FFF;; color: #333; } @media (prefers-color-scheme: dark) { html { background: #000; color: #DDD; } } a { color: inherit; } &lt;/code>&lt;/pre>&lt;h2 id="autres-methodes">Autres méthodes&lt;/h2> &lt;p>Des feuilles de style distinctes, une pour le sombre, une pour le clair, avec un appel différencié. Ce peut être intéressant sur les thèmes qui sont très différents, mais sinon les variables CSS paraissent plus efficaces. Exemple:&lt;/p> &lt;pre tabindex="0">&lt;code>&amp;lt;link media=&amp;#34;(prefers-color-scheme: light)&amp;#34; href=&amp;#34;light.css&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt; &amp;lt;link media=&amp;#34;(prefers-color-scheme: dark)&amp;#34; href=&amp;#34;dark.css&amp;#34; rel=&amp;#34;stylesheet&amp;#34;&amp;gt; &lt;/code>&lt;/pre>&lt;p>Un changement de couleur avec du JavaScript comme le propose Max Böck dans &lt;a href="https://mxb.dev/blog/color-theme-switcher/">Color Theme Switcher&lt;/a>. C’est très élégant, ça ouvre des perspectives, mais c’est bien plus complexe que quelques lignes de CSS.&lt;/p> &lt;p>L’utilisation de la fonction &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/invert">&lt;code>invert()&lt;/code>&lt;/a> permet, comme son nom l’indique, d’inverser des valeurs. Cette méthode ne me convient pas. Je pense que l’on peut choisir ses couleurs plus finement qu’en les inversant simplement (et elle pose des problèmes avec les images).&lt;/p> &lt;p>Plutôt que cette méthode par &lt;code>invert()&lt;/code>, je procéderais plutôt ainsi s’il fallait simplement inverser les valeurs:&lt;/p> &lt;pre tabindex="0">&lt;code>:root { color-scheme: light dark; --light: #FFF; --dark: #222; } html { background: var(--light); color: var(--dark); } @media (prefers-color-scheme: dark) { :html { --background: var(--dark); --text: var(--light); } } a { color: inherit; } &lt;/code>&lt;/pre>&lt;h2 id="choix-du-mode-par-le-site">Choix du mode par le site&lt;/h2> &lt;p>Dans les exemples précédents, c’est l’internaute qui choisit un thème clair ou un thème foncé. Si le site accepte les 2 modes, c’est bien aux utilisateurs et utilisatrices que le choix incombe. Mais&amp;hellip;&lt;/p> &lt;p>Une règle &lt;code>no-preference&lt;/code> a été envisagée, mais elle n’a jamais été implémentée dans un seul navigateur. Au final, elle a simplement été &lt;a href="https://github.com/w3c/csswg-drafts/issues/3857#issuecomment-634779976">supprimée de la spécification technique&lt;/a>. C’est bien dommage. Parce que si un·e internaute n’a pas fait de choix, c’est le thème &lt;em>light&lt;/em> qui est tout de même considéré comme son choix!&lt;/p> &lt;p>En d’autres termes, en tant que responsable de site, je ne peux pas proposer, en pur CSS, un site qui s’affiche:&lt;/p> &lt;ul> &lt;li>en mode sombre par défaut&lt;/li> &lt;li>en mode clair si et seulement si l’internaute a fait un choix explicite&lt;/li> &lt;/ul> &lt;p>Pour disposer d’un mode sombre par défaut avec une possibilité de passer au mode clair sur demande, il faudra obligatoirement passer par un petit développement (par exemple le &lt;em>Color Theme Switcher&lt;/em> mentionné plus haut).&lt;/p></description></item></channel></rss>