<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="rss.css" type="text/css"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
 <title>Nico’s dreams - Blog et pensées d'un intégrateur/développeur web - Nicolas Hoffmann</title>
 <link>https://www.nicolas-hoffmann.net/rss/index.php</link>
 <atom:link href="https://www.nicolas-hoffmann.net/rss/index.php" rel="self" type="application/rss+xml" />
 <description>Nico’s dreams - Nouveautés et mises à jour - Nicolas Hoffmann</description>
 <language>fr-fr</language>
 <ttl>120</ttl>
 <pubDate>Sat, 15 Aug 2026 01:02:46 +0200</pubDate>
 <lastBuildDate>Sat, 15 Aug 2026 01:02:46 +0200</lastBuildDate>
 <managingEditor>contact@nicolas-hoffmann.net (Nico)</managingEditor>

 <webMaster>contact@nicolas-hoffmann.net (Nico)</webMaster>
 <image>
  <title>Nico’s dreams - Blog et pensées d'un intégrateur/développeur web - Nicolas Hoffmann</title>
  <url>https://www.nicolas-hoffmann.net/rss/nicos_dreams.jpg</url>
  <link>https://www.nicolas-hoffmann.net/rss/index.php</link>
  <description>Nouveautés et mises à jour</description>
 </image>
 <item>
  <title><![CDATA[ De l’importance de rapports comme l’Accessibility Report 2026 de l’Email Markup Consortium ]]></title>
  <description><![CDATA[ Je ne saurais trop vous recommander de jeter un œil à l’<a href="https://emailmarkup.org/en/reports/accessibility/2026/" hreflang="en"><span lang="en" xml:lang="en">Accessibility Report 2026</span> de l’<span lang="en" xml:lang="en">Email Markup Consortium</span></a>.</p>
<p>Chaque année, ce rapport passe en revue des milliers d’emails <abbr title="HyperText Markup Language" lang="en" xml:lang="en">HTML</abbr> et dresse <strong>un état des lieux de leur qualité</strong>, notamment du point de vue de l’accessibilité.</p>
<p>Le résultat est riche d’enseignements. On y trouve des erreurs très fréquentes, parfois étonnamment simples à corriger, qui peuvent pourtant améliorer significativement l’expérience des personnes utilisant des technologies d’assistance… et pas que.</p>
<p><h3>Des corrections parfois très simples</h3></p>
<p>Un exemple&#160;: les tableaux utilisés uniquement pour la mise en page devraient porter l’attribut <code>role="presentation"</code> (ou <code>role="none"</code>).</p>
<p>Cela permet notamment aux lecteurs d’écran de ne pas annoncer inutilement la structure tabulaire et de restituer un contenu beaucoup plus naturel. C’est une modification assez simple dans le code <abbr title="HyperText Markup Language">HTML</abbr> et peu risquée, mais qui améliore immédiatement l’expérience de lecture.</p>
<p>En parcourant les emails envoyés chez Proton, je me suis rendu compte que nous avions nous aussi ce problème.</p>
<p>J’ai commencé à le corriger progressivement. Aujourd’hui, <strong>tous les nouveaux <span lang="en" xml:lang="en">templates</span> respectent cette règle</strong>. Tout n’a pas encore été totalement repris, mais au moins, tous les futurs <span lang="en" xml:lang="en">templates</span> partiront désormais sur de bonnes bases.</p>
<p><h3>Ces rapports ne servent pas qu’aux concepteurs de <span lang="en" xml:lang="en">newsletters</span></h3></p>
<p>À première vue, ce rapport s’adresse surtout aux personnes qui conçoivent des <span lang="en" xml:lang="en">newsletters</span> ou des campagnes marketing.</p>
<p>Mais il est également utile lorsque <strong>l’on travaille… sur un client mail</strong>, comme moi&#8239;!</p>
<p><h3>Une découverte inattendue</h3></p>
<p>En parcourant le classement des erreurs les plus fréquentes, la première m’a interpellé.</p>
<p>Il s’agit de l’absence d’attribut <code>lang</code> sur les éléments <code>html</code> ou <code>body</code>.</p>
<p>Par curiosité, je m’envoie alors un email de test contenant ces attributs. Et là… <strong>horreur et putréfaction</strong>&#160;: je constate que <span lang="en" xml:lang="en">Proton Mail Web</span> les supprime lors du rendu.</p>
<p>Autrement dit, on pénalise les rares bons élèves. L’erreur n’était bien évidemment pas volontaire. Le correctif était relativement simple.</p>
<p>Il est déployé depuis quelque temps maintenant. Vous n’avez donc plus d’excuse pour oublier l’attribut <code>lang</code>… en tout cas chez Proton Mail.</p>
<p><h3>Pourquoi j’aime ce type de rapport</h3></p>
<p>Ce que j’apprécie particulièrement avec ce genre de rapports, c’est leur ancrage dans le réel. Bienvenue dans les ruines de la réalité&#8239;!</p>
<p>Des points faciles à corriger et des infos qui permettent de voir là où je peux avoir beaucoup d’impact en peu de temps… c’est top, encore&#8239;! ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1727-de-l-importance-de-rapports-comme-l-Accessibility-Report-2026-de-l-Email-Markup-Consortium.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1727-de-l-importance-de-rapports-comme-l-Accessibility-Report-2026-de-l-Email-Markup-Consortium.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Thu, 06 Aug 2026 17:16:22 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ scrollbar-gutter: stable… qui ne l’est pas vraiment ]]></title>
  <description><![CDATA[ Je m’amuse depuis quelques temps avec <code>scrollbar-gutter</code>, cela me résout quelques soucis d’alignements et de stabilité d’interfaces dans des applications comme Proton Mail et d’autres.</p>
<p><h3><code>scrollbar-gutter</code>, c’est quoi t’est-ce&#8239;?</h3></p>
<p>Depuis des années et pour des besoins de designs bien léchés si j’ose dire, certains cherchent à éviter les décalages de mise en page provoqués par l’apparition ou la disparition des barres de défilement. La solution historique consistait à forcer&#160;:</p>
<p><pre><code class="language-css">html {<br />    overflow-y: scroll;<br />}</code></pre></p>
<p>Cracra, insupportable et disgracieux. Avec <code>scrollbar-gutter</code>, on pouvait enfin écrire&#160;:</p>
<p><pre><code class="language-css">html {<br />    scrollbar-gutter: stable;<br />}</code></pre></p>
<p>L’idée semblait simple&#160;: <strong>réserver l’espace de la barre de défilement afin que la largeur de la page reste constante</strong>, notamment si une barre de défilement apparait dans une zone d’une interface.</p>
<p>Enfin… c’est ce que je pensais.</p>
<p><h3>Une découverte étonnante</h3></p>
<p>En utilisant cette propriété, un curieux <em>quiproquoi</em> (= un quiproquo et le dev dit «&#160;kewaaaa&#8239;?&#160;») m’est arrivé. Tout fier de mon travail d’alignements divers et variés dans l’interface sur laquelle je travaille, j’envoie en test… et on me signale que l’alignement n’y est pas. <strong>«&#160;Kewaaaa&#8239;?&#160;»</strong></p>
<p>En creusant un peu et en la faisant courte, j’ai remarqué un comportement étrange sur macOS. Avec une souris branchée, tout fonctionne comme prévu&#160;: la page réserve un espace pour la barre de défilement.</p>
<p>Puis je débranche la souris. Instantanément, toute la mise en page s’élargit d’une quinzaine de pixels. Pourtant, le CSS n’a <strong>pas</strong> changé, <code>scrollbar-gutter</code> est toujours appliqué.</p>
<p>Et pourtant… l’espace réservé a disparu. <strong>«&#160;Kewaaaa&#8239;?&#160;»</strong></p>
<p><h3>Le test</h3></p>
<p>En regardant les dimensions du <em lang="en" xml:lang="en">viewport</em>, on obtient ceci.</p>
<p>Avec une souris connectée&#160;:</p>
<p><pre><code class="language-js">window.innerWidth                    // 1680<br />document.documentElement.clientWidth // 1665</code></pre></p>
<p>La différence de 15&#160;pixels correspond à l’espace réservé pour la barre de défilement. Okay.</p>
<p>Après avoir débranché la souris&#160;:</p>
<p><pre><code class="language-js">window.innerWidth                    // 1680<br />document.documentElement.clientWidth // 1680</code></pre></p>
<p>La différence disparaît. Le <em lang="en" xml:lang="en">viewport</em> vient de gagner 15&#160;pixels.</p>
<p>Toute la mise en page est recalculée. <strong>«&#160;Kewaaaa&#8239;?&#160;»</strong></p>
<p><h2>Ce n’est pas un bug d’un navigateur</h2></p>
<p>Le plus surprenant est que le phénomène est reproductible dans&#160;:</p>
<p></p><ul><li>Safari</li><li>Chrome</li><li>Firefox</li></ul><p></p>
<p>Les trois navigateurs se comportent de la même façon. Plus moyen de pester contre l’un ou l’autre, c’est un complot. Plus sérieusement, cela suggère qu’ils suivent tous le comportement fourni par macOS.</p>
<p><h3>Pourquoi&#8239;?</h3></p>
<p>Le diable se cache dans les détails, en l’occurence, dans <a href="https://www.w3.org/TR/css-overflow-3/#scrollbar-gutter-property">la spécification de <code>scrollbar-gutter</code></a>.</p>
<p><code>scrollbar-gutter: stable</code> ne signifie pas&#160;:</p>
<p><blockquote>«&#160;Réserve toujours un espace pour la barre de défilement.&#160;»</blockquote></p>
<p>Cela signifie plutôt&#160;:</p>
<p><blockquote>«&#160;Réserve un espace lorsque des <em lang="en" xml:lang="en">classic scrollbars</em> existent.&#160;»</blockquote></p>
<p>Or macOS utilise deux types de barres de défilement&#160;:</p>
<p></p><ul><li>les <strong lang="en" xml:lang="en">classic scrollbars</strong>, qui occupent de l’espace dans le layout&#8239;;</li><li>les <strong lang="en" xml:lang="en">overlay scrollbars</strong>, qui sont dessinées par-dessus le contenu.</li></ul><p></p>
<p>Et macOS peut passer dynamiquement de l’une à l’autre.</p>
<p>Par exemple lorsque l’utilisateur branche ou débranche une souris, si le réglage système est <strong>«&#160;Afficher les barres de défilement&#160;: automatiquement selon la souris ou le trackpad&#160;»</strong>.</p>
<p>Lorsque le système passe en mode <em>overlay</em>, le gutter n’a plus de raison d’exister selon la spécification.</p>
<p>Le navigateur le supprime. La page change alors de largeur.</p>
<p><h3>Le problème</h3></p>
<p>Le mot <strong>stable</strong> est, selon moi, trompeur. En tant que développeur, je comprends naturellement&#160;:</p>
<p><blockquote>«&#160;Si j’utilise cette propriété, ma mise en page ne bougera plus à cause des barres de défilement.&#160;»</blockquote></p>
<p>En réalité, ce n’est vrai <strong>que tant que le système continue d’utiliser des barres de défilement classiques</strong>.</p>
<p>Le moindre changement de mode peut provoquer un recalcul complet de la largeur du <em lang="en" xml:lang="en">viewport</em>. Cela entraîne&#160;:</p>
<p></p><ul><li>des layouts qui se décalent horizontalement&#8239;;</li><li>des éléments centrés qui changent de position&#8239;;</li><li>des calculs basés sur la largeur du <em lang="en" xml:lang="en">viewport</em> qui évoluent&#8239;;</li><li>des interfaces qui «&#160;sautent&#160;» sans que le CSS n’ait changé.</li></ul><p></p>
<p>Et surtout du travail supplémentaire pour moi… <strong>vous me voyez coder en branchant et débranchant ma souris régulièrement&#8239;????</strong></p>
<p>Autrement dit, <strong><code>scrollbar-gutter: stable</code> n’est pas réellement stable dans tous les cas</strong>. Et quand on doit gérer des alignements fins entre éléments qui sont dans des zones scrollables ou non… point de salut ainsi, il faut trouver des solutions plus tordues.</p>
<p><h2>Que pourrait-on faire&#8239;?</h2></p>
<p>Je comprends pourquoi la spécification a été écrite ainsi. Mais je pense qu’il manque aujourd’hui une façon d’exprimer une intention différente&#160;:</p>
<p><blockquote>«&#160;Je souhaite réserver un espace pour la scrollbar, quel que soit le mode utilisé par le système.&#160;»</blockquote></p>
<p>Par exemple avec une valeur comme&#160;:</p>
<p><pre><code class="language-css">scrollbar-gutter: always;</code></pre></p>
<p>ou tout autre mécanisme permettant de garantir que la largeur du <em lang="en" xml:lang="en">viewport</em> de mise en page ne changera jamais. Aujourd’hui, ce n’est tout simplement pas possible, en tout cas pas avec <code class="language-css">scrollbar-gutter</code>. Tristitude.</p>
<p><h3>Conclusion et à suivre</h3></p>
<p>Bref, j’ai sacrifié un châton innocent, et ouvert <a href="https://github.com/w3c/csswg-drafts/issues/14265">un ticket auprès du CSS Working Group</a>, pour savoir s’il serait pertinent d’introduire une manière de demander un gutter réellement… stable.</p>
<p><em lang="en" xml:lang="en"><abbr title="Cascading Style Sheet">CSS</abbr> is awesome</em>, je me tape des scrollbars de rire. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1726-scrollbar-gutter-stable-qui-ne-l-est-pas-vraiment.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1726-scrollbar-gutter-stable-qui-ne-l-est-pas-vraiment.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Wed, 05 Aug 2026 18:00:54 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ CSS et faire de l'UI, c'est facile ]]></title>
  <description><![CDATA[ <em>Je retrouve de vieilles notes et autres pensées, je les complète et je les publie petit à petit. Ici c’est un thread que j’avais posté sur feu Twitter, je le reposte ici</em>.</p>
<p>Bah, <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> et faire de l’<abbr lang="en" xml:lang="en" title="User Interface">UI</abbr> c’est facile, c’est même pas un vrai métier&#160;: </p>
<p></p><ul><li>tu as testé en dark mode&#8239;?</li><li>en «&#160;light&#160;» mode&#8239;?</li><li>si ça respecte les préférences de l’utilisateur en dark/light mode&#8239;?</li><li>avec un fort zoom&#8239;?</li><li>avec un fort zoom texte&#8239;?</li><li>avec une combinaison des précédents&#8239;?</li></ul><p></p>
<p>On respire.</p>
<p></p><ul><li>si ton viewport est petit&#8239;?</li><li>si ton viewport est immense&#8239;?</li><li>si ton viewport est large mais très peu haut&#8239;? (mortel celui-là) </li><li>si ton viewport est étroit mais haut&#8239;?</li><li>de manière générale, quel que soit le viewport, ça passe côté responsive&#8239;?</li><li>sur tous les navigateurs&#8239;?</li><li>sur tous les systèmes&#8239;?</li><li>sur Safari Mobile&#8239;?</li><li>sur Android&#8239;?</li><li>sur Palemoon&#8239;? (NON)</li></ul><p></p>
<p>On respire…</p>
<p></p><ul><li>sur des périphériques improbables, consoles de jeux, liseuses, etc.&#8239;?</li><li>avec des contenus utilisateurs totalement improbables&#8239;?</li><li>si la structure change ou est reprise ailleurs, ça pète&#8239;?</li><li>si les effets de bords de ta modif font des dégâts&#8239;?</li><li>à propos, c’est scopé correctement&#8239;?</li><li>si ça passe à l’impression&#8239;?</li><li>si en «&#160;<em lang="en" xml:lang="en">high contrast mode</em>&#160;» ça déconne pas&#8239;?</li><li>si ton composant se retrouve dans n’importe quel contexte&#8239;?</li></ul><p></p>
<p>Mais il est fou.</p>
<p></p><ul><li>si ton composant se retrouve imbriqué dans un autre&#8239;?</li><li>et au fait, le code <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> est léger&#8239;?</li><li>et compréhensible ainsi que maintenable&#8239;?</li><li>et ça déclenche pas trop de <em lang="en" xml:lang="en">reflow/repaint</em> au fait&#8239;?</li><li>et ça s’affiche vite&#8239;?</li><li>et bien sûr, les contenus cachés ne sont plus focusables&#8239;?</li><li>les anims sont fluides&#8239;?</li><li>les transitions aussi&#8239;?</li><li>et les contenus cachés par transitions/animations ne sont plus focusables&#8239;?</li><li>et si on désactive les animations, ça le prend en compte&#8239;?</li><li>et c’est skinnable si jamais&#8239;?</li></ul><p></p>
<p>Si si.</p>
<p></p><ul><li>et le(s) fichier(s) générés sont légers et rapides&#8239;?</li><li>et ça matche avec les directives <abbr title="Content Security Policy" lang="en" xml:lang="en">CSP</abbr>&#8239;?</li><li>et si on change la langue de l’interface, ça ne déconne pas&#8239;?</li><li>au fait, en <abbr title="Right to Left" lang="en" xml:lang="en">RTL</abbr>, ça passe&#8239;?</li><li>et en mixant des contenus <abbr title="Left to Right" lang="en" xml:lang="en">LTR</abbr> et <abbr title="Right to Left" lang="en" xml:lang="en">RTL</abbr>, ça passe&#8239;?</li><li>et avec des caractères à la con qui inversent la direction du texte, ça passe&#8239;? (mortel celui-là)</li><li>et ton interface passe bien quand il y a tous les composants dans le pire des cas&#8239;?</li><li>et quand il y a rien&#8239;?</li><li>et ton interface avec beaucoup de contenus/très peu de contenus, ça roule&#8239;?</li><li>etc.</li></ul><p></p>
<p>On est d’accord&#160;: <strong>tout n’est pas strictement nécessaire ni même souhaitable</strong>, mais toutes ces petites choses peuvent faire partie du métier. Je ne les ai pas toutes listées, mais je me suis déjà frotté à chacune, et certaines ne sont vraiment pas faciles.</p>
<p><strong>Et arriver à les faire toutes, c’est un vrai challenge</strong>, vous invitant à énormément d’humilité.</p>
<p>Pour les gens qui pensent que ça n’est pas un vrai métier, je vous pisse au cul avec une paille de 500 mètres sans toucher les bords. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1725-CSS-et-faire-de-l-UI-c-est-facile.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1725-CSS-et-faire-de-l-UI-c-est-facile.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Wed, 25 Jun 2025 16:10:28 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Un coup de sang salvateur ]]></title>
  <description><![CDATA[ Je retrouve de vieilles notes et autres pensées, je les complète et je les publie petit à petit. </p>
<p>Comme vous avez pu le voir, je me suis <a href="https://www.nicolas-hoffmann.net/source/1721-De-l-humilite-pour-les-applications-addictives.html">quelque peu éloigné de Twitter</a> depuis un temps certain, principalement pour des raisons de santé mentale.</p>
<p>Je me posais des questions&#160;:</p>
<p></p><ul><li>fermer ou pas mon compte,</li><li>supprimer ou non mes tweets (plus de 46 000 quand même),</li><li>etc.</li></ul><p></p>
<p>Sans compter environ 3&#160;000 followers, et qu’une bonne partie de mon réseau s’est fait sur Twitter, même si j’avais l’impression que le <em lang="en" xml:lang="en">reach</em> (la capacité à atteindre ces followers) était vraiment devenu naze depuis quelque temps. Bref, <strong>incapable de prendre une décision ferme</strong>, hormis celle que j’avais déjà prise&#160;: m’en éloigner.</p>
<p>Quoi qu’il en soit, je ne suis pas trop du genre à suivre les gros mouvements de mode, genre «&#160;on va quitter telle plateforme, et se retrouver sur telle autre&#160;», qui inévitablement va devenir une réplique peu ou prou de la plateforme honnie — en général les mêmes cons<em>ommateurs</em> produisent les mêmes conséquences — ni à avoir de gros coups de sang.</p>
<p>Et soudain, je tombe un matin à la fraiche… sur le <a href="https://fr.wikipedia.org/wiki/Salut_nazi_d%27Elon_Musk">double salut nazi</a>.</p>
<p>Autant le dire de suite, je suis entré dans <strong>une rage comme j’en ai rarement eu</strong>&#8239;! En 5 minutes, la décision <strong>ferme de tout virer de ce réseau était prise</strong>, et je n’ai pas pu calmer cette colère avant que la suppression soit effective. Après plusieurs essais infructueux, je me suis tourné vers le logiciel <a href="https://cyd.social/" lang="en" xml:lang="en">Cyd</a>, qui a magnifiquement fait le job.</p>
<p><strong>Le 21 Janvier 2025, j’ai brûlé sans aucun répit plus de 46&#160;000 tweets accumulés sur des années, dans un feu de joie salvateur</strong>. Je crois qu’il en reste 4 ou 5 dont un annonçant mon départ, que je virerai d’ici quelque temps. J’hésite à finir de clore le compte, principalement pour des usurpations d’identité.</p><div><p class="centre"><a href="https://www.nicolas-hoffmann.net/images/divers/cyd-large.jpg" title="Destruction de tweets avec Cyd (nouvelle fenêtre)" target="_blank" class="internal"><img src="https://www.nicolas-hoffmann.net/images/divers/cyd-large.jpg" width="300" height="225" alt="Destruction de tweets avec Cyd" loading="lazy"   /></a></p></div><p>Que garder de cet épisode&#8239;?</p>
<p>Je ne sais pas si c’est partagé, mais vous pouvez encore une fois voir qu’il est <strong>possible de décider de dégager</strong>. Vous avez <strong>toujours</strong> le choix. Et quoi qu’on en dise, auto-héberger vos contenus comme je le fais ici ne vous rendra pas tributaire de ces aléas.</p>
<p>Je ne suis pas totalement opposé aux réseaux sociaux, mais évidemment, je deviens beaucoup plus méfiant pour ce qui est d’y investir mon temps. <strong>Qu’est-ce qui me prouve que l’un ou l’autre ne va pas devenir un dépotoir possédé par un naze&#8239;?</strong> Réfléchissez bien avant de me dire «&#160;<em>oh, ça n’arrivera jamais</em>&#160;», Twitter était quand même un monument où <strong>tout</strong> se passait. Regardez ce que c’est devenu. </p>
<p>On ne m'empêchera pas de penser que <strong>ces réseaux nous font plus travailler qu'ils ne travaillent pour nous</strong>, parfois avec l'aliénation incluse. Allez donc faire un tour sur <abbr title="LinkedIn">LinkeDingue</abbr>, <strong>le bullshit débilitant y atteint des niveaux stratosphériques</strong> (faudrait que je fasse un billet dessus un de ces jours).</p>
<p>Et à ceusses qui trouvent des excuses à l'autre naze, ce n'est même pas la peine de venir discuter, c'est pitoyable (soutien aux partis d'extrême-droite, saluts nazi, etc.). Et autant vous dire que je ne suis pas près d'acheter Tesla et consorts. Pire, ceux qui le glorifient devraient sérieusement revoir leurs idoles. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1724-Un-coup-de-sang-salvateur.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1724-Un-coup-de-sang-salvateur.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Thu, 15 May 2025 19:14:43 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Une petite surprise à propos de max en CSS ]]></title>
  <description><![CDATA[ Je partage une petite mésaventure qui m’est arrivée en <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>, il est fort probable que je ne sois pas le seul qui puisse commettre de bonne foi cette erreur (un piège facile en sorte).</p>
<p>L’autre jour, je me retrouve à utiliser <a href="https://developer.mozilla.org/fr/docs/Web/CSS/max">max</a> en <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> pour effectuer une adaptation de <a href="https://calendar.proton.me/">Proton Calendar</a> pour des écrans gigantesques (ou si on dézoome fortement).</p>
<p>Grosso modo, le code en question est (le détail de la valeur n’est même pas important)&#160;:</p>
<p><pre><code>block-size: max(3rem, calc((100lvh - 3.75rem - 4.75rem) / 24))</code></pre></p>
<p>En clair, <em>prends-moi la valeur maximum entre les deux valeurs</em>, ce qui m’assure que si l’écran n’est <strong>pas</strong> gigantesque, l’élément en question fera au moins <code>3rem</code> <em>quoi qu’il arrive</em>. Rien de bien extraordinaire, je me dis que c’est même assez <em><abbr title="à l’épreuve des balles">bulletproof</abbr></em> —&#160;en anglais dans le texte, construit ainsi en amélioration progressive. Personne ne trouve à redire.</p>
<p>Quelques jours plus tard, je reçois des retours, quelques utilisateurs ont des soucis. J’investigue un peu, et je me rends compte que ce sont de vieux navigateurs qui pêchent (des Firefox/Chrome 87 ou des Safari 15.x). Là, j’avoue que je suis surpris&#160;: cette syntaxe me parait pourtant à l’épreuve des balles. Quand bien même les navigateurs ne supporteraient pas l’unité <code>lvh</code>, <code>max</code> entre <code>3rem</code> et <em>un truc pas supporté</em>, c’est <code>3rem</code> qui gagne, logiquement.</p>
<p>Je fouille un peu dans <a href="https://drafts.csswg.org/css-values/#comp-func" hreflang="en">la spécification</a>, ouvre <a href="https://github.com/w3c/csswg-drafts/issues/11768" hreflang="en">une question sur le <span lang="en" xml:lang="en">CSS Working group</span></a>, et là… <a href="https://drafts.csswg.org/css-values-4/#determine-the-type-of-a-calculation" hreflang="en" lang="en" xml:lang="en">surprise motherf*****</a>&#8239;!</p>
<p>En fait, <strong>si une des valeurs renvoie <code>failure</code>, l’intégralité de l’expression renvoie <code>failure</code></strong>. En clair pour mon cas, <strong>si les <code>lvh</code> ne sont pas supportés, kaboom, la comparaison avec <code>max</code> foire totalement&#8239;!</strong></p>
<p>J’avoue avoir été surpris&#8239;! Ceci dit, le fix a été simplement d’entourer la version avec un <code>@supports</code> avec ce qu’il faut dedans&#160;:</p>
<p><pre><code>block-size: 3rem;<br />@supports ( block-size: ( max(1rem, 100lvh) ) ) {<br />  block-size: max(3rem, calc((100lvh - 3.75rem - 4.75rem) / 24))<br />}<br /></code></pre></p>
<p>Comme quoi, on a toujours des surprises… ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1723-Une-petite-surprise-a-propos-de-max-en-CSS.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1723-Une-petite-surprise-a-propos-de-max-en-CSS.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Tue, 04 Mar 2025 15:11:37 +0100</pubDate>
 </item>
 <item>
  <title><![CDATA[ Bref, j’ai fait une miam-list ]]></title>
  <description><![CDATA[ Fin 2022, lors d’une discussion après le repas du 31, tombe le sujet des bonnes résolutions.</p>
<p>Marronnier par excellence, mais j’avoue que je n’ai pas vraiment d’idées. Et puis bon, les bonnes résolutions… je sais très bien que je ne vais pas forcément les tenir sur la durée.</p>
<p>Me vient une idée pas sortie de <em>la cuisine à Jupiter</em> (Coluche)&#160;: je balance à mes proches que je ne prendrai aucune bonne résolution, mais que je vais me faire <strong>une miam-list</strong>. En clair&#160;: <strong>une liste de trucs que je dois cuisiner maison durant l’année suivante</strong>.</p>
<p>Cela peut être des choses simples, ou des choses nécessitant plus de travail. Bref, je teste, et le concept m’a bien fait marrer&#160;: </p>
<p></p><ul><li>C’est <strong>rigolo</strong> (et ça me détend, pas besoin de <code>npm install</code> pour cuisiner…)</li><li>Cela ajoute diverses cordes(ons bleus&#8239;?) à mon arc de père isolé</li><li>Et vu les gourmands qui m’entourent… je sais que l’initiative sera suivie et appréciée. J’ai eu des demandes même.</li></ul><p></p>
<p>Celle de 2023 a été plutôt un succès&#160;: une vingtaine de plats/pâtisseries préparées sur la liste, quelques uns non-faits, un ratage en tout et pour tout, et avec des rajouts en impro.</p>
<p>En langage chef de projet&#160;: <strong>complétion des <abbr title="Objective, Key Result" lang="en" xml:lang="en">OKR</abbr>s supérieure à 80%, avec des items non planifiés</strong> (t’as vu, ça claque).</p>
<p>Bref, je renouvelle cela en 2024, toujours amusant, et j’en arrive à celle pour cette année.</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/miam-list.jpg" width="400" height="300" alt="Miam-list de Nico"  /></p></div><p>Liste plus ambitieuse que l’année précédente, cependant avec des éléments vraiment faciles… </p>
<p>Et comme toute liste, le premier a avoir été fait a été… <strong>un non-prévu — on frise vraiment la métaphore chef de projet là&#160;!</strong> ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1722-Bref-j-ai-fait-une-miam-list.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1722-Bref-j-ai-fait-une-miam-list.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Wed, 22 Jan 2025 15:54:16 +0100</pubDate>
 </item>
 <item>
  <title><![CDATA[ De l’humilité pour les applications addictives ]]></title>
  <description><![CDATA[ Je retrouve de vieilles notes et autres pensées, alors je vais les publier petit à petit. Précision pour celle-ci, elle a été écrite <strong>avant</strong> le rachat de Twitter par le zinzin qui le possède actuellement —&#160;et avant que bon nombre de gens l’aient fui. Et oui je dis Twitter, car le nouveau «&#160;nom&#160;» pourrait changer quelque peu le sens de la phrase suivante, et… ce nom nouveau est débile.</p>
<p><em>Retour dans un passé pas trop lointain.</em></p>
<p>J’avoue, j’étais assez accro à Twitter. Notamment pour la veille, le côté instantané et efficace de chopper de l’info ou de pouvoir pinger des gens, le côté <em lang="en" xml:lang="en">micro-blogging</em>, etc., et toujours un onglet épinglé avec.</p>
<p>Toutefois, plusieurs événements —&#160;une <abbr title="Tempête de chiasse intellectuelle">shitstorm</abbr> délirante, une agressivité de plus en plus palpable, etc.&#160;— m’ont vraiment fait réfléchir sur le côté détestable/meute enragée des réseaux sociaux.</p>
<p>La problématique était&#160;: j’adore Twitter et je <strong>dois</strong> m’en éloigner, comment faire&#8239;?</p>
<p>J’ai pensé à bloquer les personnes les plus virulentes, etc. même si ça calme bien ça ne résout pas le problème. Et une bête idée m’est venue&#160;: je repensais à l’expression de Tûtie dite de «&#160;<em>la barrière de flemme</em>&#160;», notamment évoquée dans une de mes conférences préférées&#160;: <a href="https://www.paris-web.fr/2018/conference/tempete-de-boulettes-geantes">la tempête de boulettes géantes</a>.</p>
<p>Et je me suis dit&#160;: tiens, et si j’essayais. <strong>Virer l’onglet épinglé, virer le raccourci sur le téléphone, ou planquer ce dernier dans un dossier sur la tablette. Mettre le truc à une distance de l’immédiateté, aussi courte soit-elle</strong>.</p>
<p>Vous ne le croirez peut-être pas… mais ça marche&#8239;! Certes, il m’arrive d’y faire un petit tour de temps en temps, mais cette simple distance évite de gaspiller le temps de cerveau en mode zombie. En gros, il faut faire l’effort d’y aller.</p>
<p>Ensuite, je me suis lancé quelques règles débiles, notamment «&#160;<em>au troisième tweet qui en grosse colère contre quelque chose</em>&#160;» (justifié ou non, ce n’est même pas la question), je clos l’app. Autant vous dire que celle-ci est vraiment marrante. Si vous avez le <abbr title="Fear of Missing Out" lang="en" xml:lang="en">FOMO</abbr> (la peur de louper quelque chose), elle a tendance à vous en guérir&#160;: que vais-je louper&#8239;? Bah, de la probable agressivité.</p>
<p>Là où cela m’interpelle, c’est en tant que concepteur d’interfaces —&#160;ouais je suis un <abbr title="UX Engineer" lang="en" xml:lang="en">UXE</abbr>&#160;— j’entends souvent des discours sur les app addictives, etc. et aussi addictives soient-elles, j’invite les personnes qui conçoivent/possèdent ces apps à avoir beaucoup d’<strong>humilité</strong>. Aussi incroyable leur design, communauté, expérience, etc. puissent être… elles peuvent être mise au ban pour une simple icône disparue, sur laquelle vous n’avez aucune main mise.</p>
<p><em>Retour dans le présent.</em></p>
<p>Bref, au vu de ce que Twitter est devenu récemment, je me dis que finalement, c’était plutôt une bonne idée. :-D  ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1721-De-l-humilite-pour-les-applications-addictives.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1721-De-l-humilite-pour-les-applications-addictives.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Wed, 20 Nov 2024 10:14:16 +0100</pubDate>
 </item>
 <item>
  <title><![CDATA[ Vous souvenez-vous du futur, deuxième&#8239;? ]]></title>
  <description><![CDATA[ Petit préambule. </p>
<p>Il y a 10 ans, pour fêter l’anniversaire de ce site, je me payais un délire de <a href="https://www.nicolas-hoffmann.net/source/1635-Vous-souvenez-vous-du-futur.html">faire causer mon moi de 2014 avec celui de 2004</a> (autant le relire, car vous risquez de ne pas tout comprendre). Et à la fin, je termine sans réfléchir sur un gag qui fait intervenir mon moi de 2024.</p>
<p><strong>Vous savez ce qui est drôle avec les gags&#8239;?</strong> C’est qu’ils se réalisent… nous sommes en 2024, et <strong>ce blog a 20 ans</strong>. Un peu rouillé et attendant une refonte depuis longtemps, mais toujours vaillant.</p>
<p><em>En emphase, il y aura parfois mon avis, mais quelque chose que je ne peux pas dire sans risquer de faille du continuum-espace temps. Hypothèse la plus pessimiste, le phénomène pourrait être localisé à notre seule galaxie.</em></p>
<p>Pour simplifier cette histoire de fous, Nico de 2024 sera abrégé <abbr title="Nico de 2024">N24</abbr>, etc. </p>
<p><h3>La discussion</h3></p>
<p>— <abbr title="Nico de 2024">N24</abbr>, tape sur l’épaule : hé, 20 ans, je te raconte pas&#8239;! <em>(putain, j’avais qq kilos de plus)</em><br />— <abbr title="Nico de 2014">N14</abbr>&#160;: Nom d’un cul de canard dans ma baignoire&#8239;!!!!!!!! Je ne veux rien savoir. Rendez-vous dans dix ans.</p>
<p><abbr title="Nico de 2024">N24</abbr>&#160;: dix ans plus tard, c’est là&#8239;! <em>(voila, tu voulais faire le gag de la Delorean qui vole dans Retour vers le futur 1, tu l’as bien mérité)</em><br /><abbr title="Nico de 2004">N04</abbr>&#160;: QUOI&#8239;?</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/nico-20X4.jpg" width="300" alt="Meme de Spiderman, avec 3 Nico de 2004, 2014 et 2024 qui se pointent mutuellement"  /></p></div><p><abbr title="Nico de 2024">N24</abbr>&#160;: bah alors vieux, enfin, jeune, on flippe&#8239;? <em>(putain, j’avais qq kilos de plus)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: pas possible… continuum… <em>(tombe dans les vapes)</em><br /><abbr title="Nico de 2024">N24</abbr>&#160;: hé oui, à défaut de briser le continuum espace-temps, une blague revient toujours à l’envoyeur, cochon qui s’en dédit&#8239;!</p>
<p><abbr title="Nico de 2004">N04</abbr>&#160;: c’est une blague&#8239;? Tu es en train de me dire que ce site existera encore dans 20 ans&#8239;???<br /><abbr title="Nico de 2024">N24</abbr>&#160;: et pourquoi pas&#8239;? <em>(et merci pour moi jeune con, je passe après le site, sympa le merdeux&#8239;!)</em></p>
<p><abbr title="Nico de 2004">N04</abbr>, en panique&#160;: mais mais mais, ça doit être fait avec des technos ultra-modernes et j’ai dû bien le refondre au moins 100 fois&#8239;!<br /><abbr title="Nico de 2024">N24</abbr>&#160;: mais pourquoi tu cherches compliqué&#8239;? Je t’entendais discuter avec l’autre évanoui là, vous… enfin je… bref nous parlions des standards. Tu sais ce que ça veut dire la compatibilité future&#8239;?<br /><abbr title="Nico de 2004">N04</abbr>&#160;: biiiin, j’ai bien lu <a href="https://openweb.eu.org/articles/pourquoi_standards">un article sur Openweb</a> maiiiiiis…</p>
<p><abbr title="Nico de 2024">N24</abbr>&#160;: mais quoi&#8239;? Allez, crache mon petit&#8239;! <em>(putain, j’avais des cheveux y a 20 ans)</em><br /><abbr title="Nico de 2004">N04</abbr>&#160;: bin, celui de 2014 avait l’air d’avoir des réserves sur le coup de <abbr title="eXtensible HyperText Markup Language" lang="en" xml:lang="en">XHTML</abbr> et <abbr title="eXtensible Markup Language" lang="en" xml:lang="en">XML</abbr>.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: sans trop t’en dire, je peux te dire que cet article ne raconte vraiment pas que des conneries. Évidemment, ça n’évolue jamais exactement de la manière dont on le pense, mais ça c’est normal. Et bien sûr, je ne t’en dirai pas plus. <em>(bin 20 ans après, ça tourne encore, même si plus personne ne connait ce délire, hormis quelques vieux briscards)</em></p>
<p><abbr title="Nico de 2004">N04</abbr>&#160;: bin merde alors. Dire que j’implémentais un nouveau truc <abbr title="eXtensible Markup Language" lang="en" xml:lang="en">XML</abbr> dont je n’étais pas sûr…<br /><abbr title="Nico de 2024">N24</abbr>&#160;: à quoi tu penses&#8239;?<br /><abbr title="Nico de 2004">N04</abbr>&#160;: bin y a bien ce truc là, j’avoue que je me suis amusé, c’est un peu à la mode, ça s’appelle <a href="http://www.nicolas-hoffmann.net/source/16-Le-fil-RSS-est-pret.html">un flux <abbr lang="en" xml:lang="en" title="Rich Site Summary">RSS</abbr></a>. Ça m’a l’air simple mais je suis pas certain d’en comprendre la portée.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: c’est très bien d’essayer des nouveaux trucs. <em>(woupinaise, et dire que c’est peut-être un des trucs les plus beaux qui aient jamais été faits, et dire que je m’en sers encore et que TOUT le monde adore ça même si ça a un peu perdu en visibilité)</em><br /><abbr title="Nico de 2004">N04</abbr>&#160;: ça m’a l’air un peu gadget, j’avoue que j’ai un peu fait comme les autres.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: oui, je m’en souviens, t’inquiète. Non, c’est très bien d’essayer des trucs, tu peux me croire. Tu verras bien si ça mord. <em>(au moins les modes étaient moins débiles à cette époque, putain, le gamin il vient de me coller une claque… roooh, je parle comme un vieux con)</em></p>
<p><abbr title="Nico de 2004">N04</abbr>&#160;: qui vivra verra… putain, 20 ans&#8239;!<br /><abbr title="Nico de 2024">N24</abbr>&#160;: arrête, on dirait Chirac aux Guignols de l’info <em>(et dire qu’il est mort, les Guignols aussi)</em><br /><abbr title="Nico de 2004">N04</abbr>&#160;: au moins, je me suis amusé à essayer <a href="https://www.nicolas-hoffmann.net/source/52-Un-petit-test-de-la-derniere-mandrake.html">la dernière Mandrake</a>.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: héhé, je ne m’en souvenais plus. C’était amusant ces duals boots&#8239;? <em>(c’est vrai que je racontais tout et n’importe quoi sur le blog)</em><br /><abbr title="Nico de 2004">N04</abbr>&#160;: oui, avec Mozilla, Firefox 1, et tout le nécessaire.</p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: (sort des vapes) punaise, ou suis-je&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: j’ai plus l’habitude, faut dire que maintenant que Linux est inclus dans Windows, et Firefox, j’utilise toujours, mais bon, j’ai arrêté de compter les versions après la version 100…<br /><abbr title="Nico de 2004">N04</abbr>&#160;: QUOI&#8239;? LINUX INCLUS DANS WINDOWS&#8239;? Firefox 100&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: oui, 120 et quelques. Un souci gamin&#8239;? Tu es pâle.<br /><abbr title="Nico de 2004">N04</abbr>&#160;: (tombe dans les pommes)</p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: mais sérieux&#8239;! Ça va pas de raconter des âneries pareilles&#8239;!<br /><abbr title="Nico de 2024">N24</abbr>&#160;: héhé… oups&#8239;! <em>(bah quoi, j’ai pas menti, le <abbr lang="en" xml:lang="en" title="Windows Subsystem for Linux">WSL</abbr>&#8239;?)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: et le continuum espace-temps, abruti&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: bin, je me suis dit «&#160;on s’en balance&#160;», t’aurais vu sa tronche… et la tienne&#8239;!<br /><abbr title="Nico de 2014">N14</abbr>&#160;: bougre de crétin irresponsable&#8239;! Et s’il y reste, on devient quoi nous, t’y as pensé&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: ok, tu marques un point. <em>(putain, se prendre un «&#160;irresponsable&#160;» de moi plus jeune, ça c’est de l’achèvement)</em></p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: déjà que j’essayais de ne pas trop lui en révéler. Tu imagines le choc si je lui parlais media-queries, <a href="https://rocssti.net/">Röcssti</a>, <a href="https://van11y.net/fr/">Van11y</a> ou qu’il va monter sur scène dans les conférences&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: indubitablement. <em>(mon pauvre, je pourrais te faire flipper encore plus&#8239;!)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: et tout s’est <a href="https://www.nicolas-hoffmann.net/source/1507-Paris-Web-une-annee-ombre-a-lumiere.html">un peu précipité y a deux ans</a>. <br /><abbr title="Nico de 2024">N24</abbr>&#160;: c’est pas faux.</p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: au moins, rassure-moi, ça va continuer de progresser&#8239;? <br /><abbr title="Nico de 2024">N24</abbr>&#160;: par certains côtés oui, par d’autres, je serais plus circonspect.<br /><abbr title="Nico de 2014">N14</abbr>&#160;: tu parles de Chrome qui monte inexorablement&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: effectivement, c’est pas la chose la plus glorieuse. À se demander si les gens ont une mémoire. <em>(et c’est encore pire maintenant)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: des monopoles comme <abbr title="Internet Explorer" lang="en" xml:lang="en">IE</abbr>6&#8239;? Non.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: et pourtant, le gamin avait compris <a href="https://www.nicolas-hoffmann.net/source/1443-Deux-mondes-ne-pouvant-pas-se-comprendre.html">bien malgré lui les dégâts d’<abbr title="Internet Explorer" lang="en" xml:lang="en">IE</abbr>6</a>.<br /><abbr title="Nico de 2014">N14</abbr>&#160;: il y <a href="https://www.nicolas-hoffmann.net/source/475-Et-si-la-lente-evolution-du-web-1-2.html">a été confronté</a> oui. <br /><abbr title="Nico de 2024">N24</abbr>&#160;: encore maintenant, je m’étonne que rajouter une classe <code>flex</code> puisse résoudre des problèmes par magie.<br /><abbr title="Nico de 2014">N14</abbr>&#160;: parle pour toi, je peux pas encore utiliser flex comme un cochon moi&#8239;!<br /><abbr title="Nico de 2024">N24</abbr>&#160;: <em>(et m…)</em> bah tu peux mais avec des réserves pour les vieux navigateurs. <em>(vite, se rattraper aux branches)</em></p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: effectivement. Ceci dit, la communauté se bouge, c’est sympa.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: sans aucun doute. <em>(pinaise, c’est vrai c’était une certaine époque entre les confs et le reste)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: c’est qu’on rêvait de faire venir Tim Berners-Lee à Paris Web en sortant des conférences.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: c’est pas facile hein&#8239;? Enfin… <em>(ne pas lui dire qu’il va le rencontrer en 2023 et même présenter devant lui, ne pas lui dire…)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: et au moins les réseaux sociaux donnent une saine émulation. Pourquoi tu t’étouffes&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: disons que les réseaux sociaux… évolueront étrangement à l’avenir. <em>(comment lui expliquer qu’il va en fuir certains pour des raisons de santé mentale&#8239;?)</em></p>
<p><abbr title="Nico de 2014">N14</abbr>&#160;: en bien ou en mal&#8239;? C’est que <a href="https://www.nicolas-hoffmann.net/source/1663-J-adore-Twitter.html">j’aime bien Twitter</a> moi.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: joker. <em>(en mal&#8239;!)</em><br /><abbr title="Nico de 2014">N14</abbr>&#160;: rassure-moi, les gens sont toujours là au moins&#8239;?<br /><abbr title="Nico de 2024">N24</abbr>&#160;: majoritairement oui. Ça évoluera. <em>(j’ai la sensation qu’on n’a jamais été aussi seuls mais bon…)</em></p>
<p><abbr title="Nico de 2004">N04</abbr>&#160;: (sort des vapes) <br /><abbr title="Nico de 2014">N14</abbr>&#160;: tiens, respire un bon coup gamin. Tu as tourné de l’œil, c’est pas grave.<br /><abbr title="Nico de 2024">N24</abbr>&#160;: ça va vieux&#8239;? Enfin jeune.<br /><abbr title="Nico de 2004">N04</abbr>&#160;: ça va. Là, j’avoue que je suis dépassé.<br /><abbr title="Nico de 2014">N14</abbr> et <abbr title="Nico de 2024">N24</abbr>&#160;: oui, ça autant t’y habituer…<br /><abbr title="Nico de 2004">N04</abbr> et <abbr title="Nico de 2014">N14</abbr>&#160;: ça fait peur des fois ce sentiment.</p>
<p><em>Les trois se regardent avec un sourire.</em><br /><abbr title="Nico de 2024">N24</abbr>&#160;: oui, ne vous inquiétez pas pour ça. Apprenez, vivez, faites ce qui vous semble juste, fussé-ce <a href="https://www.nicolas-hoffmann.net/source/1704-Je-hacke-le-retour-d-experience-via-un-phrase-veloute-Sud-Web.html">être de la poésie</a> ou <a href="https://www.nicolas-hoffmann.net/source/43-Argh-Montjoie.html">bloguer sur des choses insignifiantes mais si importantes</a>. Le temps est sans importance, seule la vie est importante.</p>
<p><em>Note du Nico de 2024&#160;: même si le blog est très calme depuis plusieurs années, la-vie-toussa, 20 ans de blog, ce n’est pas rien. Un espace de liberté, intemporel, délicieusement imparfait, rouillé mais aussi durable… chapeau les gars. Je pensais revenir dans le passé en conquérant blagueur, et c’est vous qui me redonnez cette flamme&#160;: le gamin m’a rappelé cette passion, et l’autre me rappelle tout le chemin parcouru. Même si j’ai appris une certaine sagesse, finalement… vous z’êtes pas mal les gamins.</em></p>
<p>Nico de 2034, passe une tête par la fenêtre&#160;: dites les gars, j’ose vous parler de la suite&#8239;?<br />Les Nico de 2004 à 2024&#160;: OH LE CON&#8239;!!!</p>
<p>On remet ça dans 10 ans, peut-être. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1719-Vous-souvenez-vous-du-futur-deuxieme.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1719-Vous-souvenez-vous-du-futur-deuxieme.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Wed, 24 Apr 2024 22:09:16 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Putain 20 ans ! ]]></title>
  <description><![CDATA[ Hé oui, <a href="https://www.nicolas-hoffmann.net/source/2-ENFIN-j-y-suis-arrive.html">ce site a 20 ans</a>… et deux jours.</p>
<p>En attendant, si vous avez envie d’envoyer un pied de nez aux gens qui vous disent que <abbr title="PHP Hypertext Preprocessor" xml:lang="en" lang="en">PHP</abbr> ou autres <abbr title="Cascading Style Sheet" xml:lang="en" lang="en">CSS</abbr> sont morts et qu’il faut forcément passer par une plateforme ou je-ne-sais-quelle-techno qui lave plus blanc que blanc… hé bien, ça tient encore la route pour de l’ancien.</p>
<p>Une petite surprise est en préparation, je suis en train de la finaliser. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1718-Putain-20-ans.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1718-Putain-20-ans.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Mon, 22 Apr 2024 10:50:05 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Note de lecture : La Légion Zodiaque, Légendes d’Illuminaria ]]></title>
  <description><![CDATA[ J’ai eu le plaisir de recevoir le livre de David «&#160;Deltakosh&#160;» Catuhe, intitulé «&#160;La Légion Zodiaque, Légendes d’Illuminaria&#160;».</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/legion-zodiaque.jpg" width="200" height="250" alt="La Légion Zodiaque, Légendes d’Illuminaria"  /></p></div><p>Que dire&#8239;?</p>
<p>J’avoue que le travail de David sur les chevaliers a attiré ma curiosité, revisiter les mythiques chevaliers d’or n’est pas un pari facile&#160;: il touche à des icônes, n’importe quel fan a forcément son chevalier préféré, ou plusieurs (Kanon et Shaka pour ma part, même si j’aime bien Aldébaran et Manigoldo/El Cid).</p>
<p>En fait, cela va plus loin. En lisant ce livre, on se rend compte que l’auteur a imaginé <strong>un monde plus grand, différent</strong>. On n’en voit actuellement que quelques bribes, mais il y a <strong>un petit quelque chose qui fait… qu’on a envie d’en savoir plus</strong>, probablement la narration indirecte. (et une certaine passion personnelle pour la mythologie grecque)</p>
<p>En tout cas, le livre est de très belle facture&#160;: <strong>les illustrations sont magnifiques, les textes sont courts mais soignés</strong>, l’objet ne dépareillera pas dans une belle bibliothèque.</p>
<p>En conclusion, je reviens sur ma précédente phrase&#160;: <strong>on a envie d’en savoir plus, mais genre vraiment plus</strong>. </p>
<p>Petit message personnel&#160;: David, si tu as besoin d’un relecteur de type grammar-nazi ou d’un autre acolyte pour explorer Illuminaria… je suis ton homme. ;)</p>
<p>Pour en savoir plus, <a href="https://www.amazon.fr/Légion-Zodiaque-David-Catuhe/dp/B0BX8WR2NV/ref=sr_1_3?__mk_fr_FR=ÅMÅŽÕÑ">La Légion Zodiaque, Légendes d’Illuminaria, sur Amazon</a> ou <a href="https://www.deltakosh.com/tales-of-illuminaria" hreflang="en">sur le site de David</a>.</p>
<p><em lang="la" xml:lang="la">Addendum</em>&#160;: si par hasard, vous aimez le podcast de la Confrérie, peut-être avez-vous entendu les (més)aventures de la création de ce livre, où l’auteur — non sans un certain humour — relate les obstacles de la genèse de cet ouvrage&#160;: <a href="https://www.deltakosh.com/laconfrerie-podcast/episode/31d4c207/la-creation-de-livres-et-le-monde-des-figurines-de-bourges">la confrérie, la création de livre</a>.</p>
<p>D’autres épisode relatent des histoires toutes plus amusantes les unes que les autres avec le livre en toile de fond, comme <a href="https://www.deltakosh.com/laconfrerie-podcast/episode/31d6e40c/plongee-dans-un-forum-18-25-et-le-top-3-de-nos-jeux-les-plus-marquants">Plongée dans un forum 18-25 et le top 3 de nos jeux les plus marquants</a>.</p>
<p>Je n’écoute que très peu de podcasts, mais j’avoue que celui-ci m’accompagne souvent, je suis en train de les rattraper à reculons. Bon boulot les gars&#8239;! ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1717-Note-de-lecture-La-Legion-Zodiaque-Legendes-d-Illuminaria.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1717-Note-de-lecture-La-Legion-Zodiaque-Legendes-d-Illuminaria.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Mon, 24 Jul 2023 14:59:22 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Focus-visible, la pseudo-classe qui met presque tout le monde d’accord ]]></title>
  <description><![CDATA[ Toute belle histoire commence par…</p>
<p><h3>Il était une fois</h3></p>
<p>Il y a bien longtemps (pas tant que ça mais bon), à chaque fois que vous cliquiez sur un bouton, vous pouviez entendre un ou une <abbr title="Product Owner" lang="en" xml:lang="en">PO</abbr>/utilisateur/designer/dev/autre dire&#160;:</p>
<p></p><ul><li>«&#160;Oh, cette vilaine bordure bleue ou noire est-ce qu’on pourrait l’enlever&#8239;?&#160;»</li><li>Mais c’est nécessaire pour les utilisateurs de clavier&#8239;!</li><li>Oui mais c’est moche, on peut l’enlever&#8239;? À propos, je n’utilise pas mon clavier.</li><li>(ton qui monte) C’est nécessaire pour les utilisateurs de clavier&#8239;!!!</li><li>Oui mais c’est laid, on peut l’enlever&#8239;? À propos, je n’utilise pas mon clavier.</li><li>Etc.</li></ul><p></p>
<p>La cause principale de ces discussions interminables était la suivante&#160;: <strong>cliquer sur un élément active les styles de focus, comme avec le clavier</strong>.</p>
<p>Il était impossible de différencier un bouton activé via une souris ou un clavier (les deux avaient des styles de focus déclenchés), sauf avec des tonnes de JavaScript à coup sûr. En général, cela se finissait par un drame, un bon gros <code>outline: 0</code> des familles, soit la suppression complète et entière de l’indicateur visuel pour le clavier. <em lang="la" xml:lang="la" title="À marquer d’une pierre noire.">Nigro notanda lapillo</em>.</p>
<p>C’est là que <code>:focus-visible</code>, anciennement appelé <code>:focus-ring</code> (l’idée n’est vraiment pas récente), entre en jeu pour sauver nos âmes.</p><div class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/focusing.png" width="391" height="70" alt="Emoji focusing sur Slack, on parle de focus, donc c’est une blague absolument lamentable mais j’aime."  /></div><p><h3>Le besoin</h3></p>
<p>L’un des besoins les plus élémentaires lors de l’utilisation d’un clavier est de pouvoir <strong>savoir où vous vous trouvez</strong> dans l’interface.</p>
<p>S’il n’y a pas de surbrillance visible de l’élément actuel, l’utilisateur peut se perdre, la navigation devient vraiment pénible et une opération simple comme atteindre un lien nécessite soudainement une attention folle… ou n’est tout simplement pas possible.</p>
<p>Dans le langage expert de l’accessibilité, si je ne me trompe pas, dans les <abbr title="Web Content Accessibility Guidelines" lang="en" xml:lang="en">WCAG</abbr>, c’est le <a href="http://www.w3.org/TR/2008/REC-WCAG20-20081211/#navigation-mechanisms-focus-visible" lang="en" xml:lang="en" hreflang="en">Success Criterion 2.4.7 Focus Visible</a>: <em lang="en" xml:lang="en">Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible</em> (traduction approximative&#160;: toute interface utilisable au clavier a un mode d’utilisation où le focus clavier est visible).</p>
<p><h3>En pratique</h3></p>
<p>Avant, on doublait les styles entre <code>:focus</code> et <code>:hover</code>, et on priait pour que ça passe côté produit sans prendre de remarque comme au début de cet article.</p>
<p>Là, on peut se permettre de totalement virer l’<code>outline</code> au <code>:hover</code>, et de bien renforcer ce dernier avec <code>:focus-visible</code>.</p>
<p>Quelque chose comme&#160;:</p>
<p><pre><code>.mon-button:focus {<br />  outline: none;<br />}<br />.mon-button:focus-visible {<br />  outline: 3px solid chartreuse;<br />  // je ne peux être tenu responsable du choix de cette couleur.<br />}<br /></code></pre></p>
<p><h3>Comment <code>:focus-visible</code> marche</h3></p>
<p>Même si l’on pourrait croire que c’est de la magie… il n’y a aucune magie là dedans. Grosso modo, le navigateur utilise certaines heuristiques pour déterminer si –&#160;selon lui&#160;– l’utilisation doit déclencher <code>:focus-visible</code> ou non.</p>
<p><abbr title="Too Long Didn’t Read" lang="en" xml:lang="en">TLDR</abbr>&#160;: si l’utilisateur utilise le clavier.</p>
<p>En réalité, c’est un peu plus complexe&#160;: je vous conseille de lire la <a href="https://www.w3.org/TR/selectors-4/#the-focus-visible-pseudo" lang="en" xml:lang="en" hreflang="en">spécification de <code>:focus-visible</code></a>.</p>
<p>Je ne vais pas tout détailler, d’autres l’ont bien fait comme <a href="https://css-tricks.com/almanac/selectors/f/focus-visible/#aa-how-do-browsers-determine-when-something-is-focus-visible" lang="en" xml:lang="en" hreflang="en">How do browsers determine when something is :focus-visible?</a>, mais je m’arrête sur un exemple, les formulaires.</p>
<p>On pourrait se dire assez légitimement «&#160;<em>si je clique sur un champ de formulaire, <code>:focus-visible</code> ne sera pas activé</em>&#160;». Sauf que non&#8239;! Si un élément –&#160;comme un champ de formulaire&#160;– a <strong>besoin du clavier</strong> pour fonctionner, il activera <code>:focus-visible</code>, qu’on clique dessus ou qu’on l’atteigne au clavier.</p>
<p>En pratique, cela se gère très facilement.</p>
<p>C’est pour cela que je vous invite à lire la spécification et à tester. D’expérience, j’ai vu quelques cas qui ont du sens une fois la spécification lue, mais qui peuvent surprendre (si une modale apparait subitement au lancement du site avant que l’utilisateur n’ait pu interagir, etc.).</p>
<p><h3>La compatibilité</h3></p>
<p>Le <strong>support est excellent sur les navigateurs récents</strong>&#160;: <a href="https://caniuse.com/css-focus-visible" hreflang="en"><code>:focus-visible</code> sur <span lang="en" xml:lang="en">Can I Use</span></a>. Le souci est comme d’habitude <abbr title="Internet Explorer" lang="en" xml:lang="en">IE</abbr>11 (mais on s’en fout) et quelques vieux Safari, à vous de voir si vous vous en foutez ou non.</p>
<p>Là où c’est gênant avec ces Safari, c’est que comme ils ne reconnaissent pas du tout <code>:focus-visible</code>, ils décident de purement ignorer la ligne… et parfois d’autres lignes factorisées avec. Ce qui amène à <a href="https://github.com/ProtonMail/WebClients/blob/main/applications/mail/src/app/styles/_layout.scss#L35">des commentaires amusants</a>.</p>
<p>Au pire, vous avez un outil magique pour déployer en douceur&#160;: <code>@supports selector(:focus-visible) {</code>. En clair, si <code>:focus-visible</code> est supporté, alors… faire quelque chose.</p>
<p>Il a pu m’arriver de le déployer en douce, et –&#160;constatant que personne n’avait rien trouvé à redire en 6 mois&#160;– d'annoncer fièrement que c’était en production depuis une demi-année sans que personne ne s’en soit jamais plaint.</p>
<p><h3>Pour conclure</h3></p>
<p>Cette pseudo-classe est un régal à utiliser, et elle permet enfin de <strong>concilier demandes de designs et accessibilité</strong>, voir de même séparer totalement l’expérience clavier du reste. <em lang="la" xml:lang="la" title="À marquer d’une pierre blanche.">Albo notanda lapillo</em>. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1716-Focus-visible-la-pseudo-classe-qui-met-presque-tout-le-monde-d-accord.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1716-Focus-visible-la-pseudo-classe-qui-met-presque-tout-le-monde-d-accord.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Mon, 05 Dec 2022 14:52:19 +0100</pubDate>
 </item>
 <item>
  <title><![CDATA[ Ces modifications simples (custom scroll via CSS) ]]></title>
  <description><![CDATA[ Dans la suite directe du billet expliquant qu’<a href="https://www.nicolas-hoffmann.net/source/1714-des-metriques-pour-suivre-activite-dev.html">estimer est difficile/impossible</a>, voici un récent exemple de modification que j’estimais simple, mais qui ne l’a pas été.</p>
<p>Pour certains conteneurs sur ProtonMail V4, on a la possibilité d’activer un <span lang="en" xml:lang="en">scroll</span> légèrement customisé via <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>. Le tout est fait à coups de <a href="https://developer.mozilla.org/fr/docs/Web/CSS/scrollbar-width"><code>scrollbar-width</code></a>, <a href="https://developer.mozilla.org/fr/docs/Web/CSS/scrollbar-color"><code>scrollbar-color</code></a> pour les navigateurs le supportant, et à coups de <a href="https://developer.mozilla.org/fr/docs/Web/CSS/::-webkit-scrollbar"><code>::-webkit-scrollbar</code></a> et ses amis pour les autres. Cela remplace avantageusement des solutions via JavaScript utilisées sur la précédente version qui posaient autant de problèmes qu’elles en résolvaient (incompatibles avec le zoom ou de faibles hauteurs notamment).</p>
<p>La demande est simple&#160;: il faut l’activer par défaut partout. De totale bonne foi, je fais un rapide calcul&#160;:</p>
<p><ol><li>créer une variable pour l’activer ou non&#8239;;</li><li>la mettre dans le fragment Sass.</li></ol></p>
<p>Ok, pas de souci, c’est vraiment <strong>facile à faire, je prévois de faire ça en une petite heure</strong>.</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/wcgw.jpg" width="300" height="223" alt="Que pourrait-il mal se passer ?" loading="lazy"  /></p></div><p>Effectivement, je fais ces modifications très rapidement… et je teste vite fait. Pas de souci, ça s’active bien par exemple sur <a href="https://design-system.protontech.ch/" hreflang="en">la page d’accueil du Design System de ProtonMail</a>.<br />Je fais un tour rapide sur les pages. Cela va être vite réglé. <strong>Que pourrait-il mal se passer&#8239;?</strong></p>
<p>Hé bien, notamment sur cette page&#160;: <a href="https://design-system.protontech.ch/conversations/" hreflang="en">mockup des conversations de ProtonMail v4</a> (et donc sur la v4 en question).</p>
<p>Activé tel quel, le rendu est vraiment pas heureux. C’est encore plus frappant sur les conversations qui alternent en lues (bleu clair)/non lues (blanc).</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/bug-scroll.png" width="374" height="390" alt="Un bug du Custom Scroll" loading="lazy" /></p></div><p>En fait, un espace de couleur uniforme est réservé pour le <span lang="en" xml:lang="en">scroll</span>. Et bien entendu, je n’ai <strong>pas</strong> des contenus de couleurs uniformes (<em>c’est la fin des couleurs uniformes</em> comme dirait la pub qui le vaut bien). Solution&#8239;? </p>
<p></p><ul><li>Essayer de trifouiller la transparence du <span lang="en" xml:lang="en">scroll</span>&#8239;? Pas possible.</li><li>Essayer de mettre le <span lang="en" xml:lang="en">scroll</span> par-dessus&#8239;? Soyons sérieux, pas possible.</li><li>Mettre une bordure sur chaque élément&#8239;! Non. Sinon le conteneur n’aura pas la bordure jusqu’en bas si pas assez de messages.</li></ul><p></p>
<p>Bref, j’en arrive à mettre un conteneur avec la bordure à l’intérieur dudit conteneur qui aura donc le <span lang="en" xml:lang="en">scroll</span>, ainsi, le design des conversations ne sera pas pété. On peut argumenter sur le fait que le <span lang="en" xml:lang="en">scroll</span> semble en dehors de son conteneur, mais c’est quand même mieux. Au pire, on peut envisager une seconde bordure à droite du <span lang="en" xml:lang="en">scroll</span> pour l’entourer mais ce ne sera pas nécessaire.</p>
<p>Alors, refaisons notre calcul. Activer cela, modifier les composants, tester… sur trois projets ayant leurs spécificités. Tiens, <strong>c’est plus long que prévu</strong>. Gag, autre effet de bord découvert de nombreux jours après. Pour peu qu’on ait un contenu en <span lang="en" xml:lang="en">dark mode</span> contenant un contenu clair, le tout peut totalement dérailler avec quelques effets de bords rigolos.</p>
<p>Mais bon, <strong>c’était l’affaire d’une petite heure hein&#8239;?</strong> ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1715-Ces-modifications-simples-custom-scroll-via-CSS.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1715-Ces-modifications-simples-custom-scroll-via-CSS.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Thu, 02 Jul 2020 15:32:11 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Des métriques pour suivre l’activité d’un dev ? ]]></title>
  <description><![CDATA[ Il y a quelques mois, j’ai suggéré sur Twitter l’idée de faire <a href="https://twitter.com/Nico3333fr/status/1194560070497001472">un billet pour dénoncer les fausses-bonnes idées en matière de métriques</a> pour suivre l’activité d’un développeur.</p>
<p>Hasard du calendrier, le confinement a pu tenter certains emm… –&#160;pardon, je reformule&#160;– certaines personnes stressées par le contrôle peuvent vouloir suivre l’activité d’un développeur.</p>
<p>Qu’on soit clair, je comprends le besoin… non pas de contrôle bête, mais de suivi. <strong>Le suivi est utile</strong>. Pour pouvoir planifier, intercaler, gérer d’autres personnes. C’est légitime. Le contrôle bête et méchant l’est sûrement beaucoup moins.</p>
<p>Et dans notre Startuffe Nation, on peut se poser la question d’<strong>une métrique magique pouvant quantifier l’activité d’un développeur</strong>. En clair, il y a les bonnes et les mauvaises façons de le faire. Commençons par… les mauvaises.</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/notre-projet.webp" width="480" height="270" alt="Les mauvaises métriques, parce que c’est NOTRE PROJET"  loading="lazy" /></p></div><p><h3>Idée débile numéro 1&#160;: au poids&#8239;!</h3></p>
<p>Afin de rester poli, j’évacue de suite l’angle «&#160;<em>Le dev est là pour pisser des lignes de code</em>&#160;». C’est idiot. <strong>Si vous considérez vos dévs ainsi, ne vous fatiguez pas avec de l’humain</strong>. Et si d’aventure, vous aviez quelqu’un correspondant à ce profil, gare&#8239;! Certes, certaines tâches sont répétitives et/ou reviennent entre divers projets. Mais cela veut peut-être dire que votre organisation paie des gens pour faire du travail de robot. Autrement dit, si c’est le cas, cela peut tuer leur créativité, et donc leur capacité à résoudre vos problèmes. Ou alors, vous avez embauché quelqu’un de pas bon.</p>
<p>Hein, je te regarde, toi, chef de projet/directeur/dev qui clame un «&#160;<em>on a toujours fait comme ça, on n’a aucune raison de changer</em>&#160;». C’est bien connu, le Web est réputé pour être quelque chose d’immuable, et tous les projets/contextes sont exactement les mêmes&#8239;! (sarcasmes <i lang="en" xml:lang="en">inside</i>)</p>
<p>Revenons au poids, et prenons un petit exemple. Si je regarde la <abbr title="Pull Request" lang="en" xml:lang="en">PR</abbr> qui fait passer ProtonMail de sa v3 à la v4 en cours de conception, <strong>nous avons réussi quelque chose d’extraordinaire</strong>.</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/v3-v4.png" width="159" height="31" alt="v3 à v4, 50000 ajouts et 3 fois plus de suppressions" loading="lazy" /></p></div><p>Si on paie au poids, nous avons réussi l’exploit de <strong>produire une nouvelle version, et les devs paieront pour cela</strong>, vu que le code a diminué de manière drastique&#8239;! Je passe les chiffres en détail, mais le dégraissage du mammouth a été violent.</p>
<p>Plus sérieusement, on voit bien que <strong>cette métrique n’a pas de sens</strong>. Une refonte peut être l’occasion de dégager du vieux code moisi ou des parties devenues inutiles.</p>
<p><h3>Idée débile numéro 2&#160;: au commit&#8239;!</h3></p>
<p>Regardons le <i lang="en" xml:lang="en">contribution graph</i> de <a href="https://github.com/ProtonMail/react-components/" lang="en" xml:lang="en" hreflang="en">react-components</a>, un projet de composants React faits chez ProtonMail (en gros, des trucs partagés dont on se sert sur tous les projets). Quelque chose vous surprend&#8239;? (vous pouvez cliquer pour agrandir)</p><div><p class="centre"><a href="https://www.nicolas-hoffmann.net/images/divers/contribution-graph-1.png" title="Contribution Graph version 1… (nouvelle fenêtre)" target="_blank" class="internal"><img src="https://www.nicolas-hoffmann.net/images/divers/contribution-graph-1.png" width="300" height="296" alt="Contribution Graph version 1…" loading="lazy" /></a></p></div><p>Je suis 3e, moi, le spécialiste <abbr title="Cascading Style Sheet" xml:lang="en" lang="en">CSS</abbr> de la boite&#8239;!! Seuls deux devs me dépassent au nombre de commits, et je suis devant 5 autres devs <abbr title="JavaScript" xml:lang="en" lang="en">JS</abbr>. Qu’on me donne une augmentation de suite&#8239;!!!</p>
<p>Sauf que… il est possible, je dis bien possible, que j’aie été <strong>très légèrement malhonnête</strong> en présentant cela. Déjà… il ne faut pas croire tout ce qu’on lit sur Internet, et aller <a href="https://github.com/ProtonMail/react-components/graphs/contributors">à la source</a>.</p><div><p class="centre"><a href="https://www.nicolas-hoffmann.net/images/divers/contribution-graph-2.png" title="Contribution Graph, la vraie version, nous sachons (nouvelle fenêtre)" target="_blank" class="internal"><img src="https://www.nicolas-hoffmann.net/images/divers/contribution-graph-2.png" width="300" height="297" alt="Contribution Graph, la vraie version, nous sachons" loading="lazy" /></a></p></div><p>Déjà, on voit le rapport de grandeur est très relatif vu le nombre d’ajouts/suppressions. Et cela n’a <strong>aucun sens de comparer des choux et des carottes</strong>. En l’occurrence, il est aisé de voir que j’opère moins de modifications, et si on creuse un peu, mon job consiste à ajouter des classes, modifier quelques bricoles sur les composants. En outre&#160;:</p>
<p></p><ul><li>Les 4e, 5e et 6e modifient bien plus de choses que moi et c’est normal, c’est leur job de faire du JavaScript&#8239;!</li><li>Cela ne rend également pas compte de l’activité réelle d’autres, qui travaillent plus sur d’autres projets, sont amenés à opérer sur d’autres aspects, etc.</li></ul><p></p>
<p>Bref, pour tuer cette idée, j’ajouterai que j’ai même déjà entendu des devs démotivés se sachant surveillés ainsi… multiplier les commits pour chaque virgule ou point-virgule changé. À bon entendeur. </p>
<p><h3>Idée débile numéro 3&#160;: au temps&#8239;!</h3></p>
<p>Si on regarde bêtement le changement dans la <abbr title="Pull Request" lang="en" xml:lang="en">PR</abbr>&#160;: «&#160;<em>Punaise, il lui a fallu 4H pour changer deux classes dans les templates de l’app&#8239;? Il fait quoi le dev <abbr title="User Interface" lang="en" xml:lang="en">UI</abbr>, il se fait bronzer les doigts de pied&#8239;?</em>&#160;»</p>
<p>C’est possible que le dev <abbr title="User Interface" lang="en" xml:lang="en">UI</abbr> se fasse bronzer oui. Mais ce qui est possible aussi&#160;: </p>
<p></p><ul><li>c’est qu’il ait <strong>galéré à trouver</strong> le maillon qui foire dans un projet complexe avec des abstractions de malade&#8239;;</li><li>qu’il ait été <strong>dérangé entre temps ou demandé sur d’autres trucs</strong>&#8239;;</li><li>que le souci ait été particulièrement <strong>dur à reproduire</strong>&#8239;;</li><li>ou que la sacro-sainte solution soit éclatée sur 4 projets avec 20 contextes, la rendant particulièrement délicate&#8239;;</li><li>ou qu’il soit parti sur une autre piste, et qu’après 20 tentatives, 2 crises de nerfs, 4 arbitrages, un <code>npm i</code> et une crucifixion, le problème ait été réglé différemment (genre le lendemain, un éclair de génie, paf, problème réglé).</li></ul><p></p>
<p>Le temps est quelque chose d’<strong>impossible à estimer</strong>. J’ai plus de 15 ans de métier, et je me gourre encore lourdement sur mes estimations, parce que quantifier l’imprévu ou l’inconnu est <strong>tout sauf une science exacte</strong>. </p>
<p>Encore ces derniers jours, j’ai estimé deux demandes en mode «&#160;<em>oui ça c’est simple, une demi-journée max tout compris</em>&#160;», et sans pêcher par orgueil, ça me semblait vraiment simple. Sauf que non&#160;: effets de bord, soucis divers imprévisibles. 2 jours de taf.</p>
<p>Et par pitié, ne confondez pas durée et délai. Un jour de taf, si on est sur plusieurs projets, ça peut s’étaler sur plusieurs jours. Allez, je passe sur toutes les autres idées complètement débiles.</p>
<p><h3>De meilleures métriques</h3></p>
<p>Désolé de ce truisme (j’adore placer ce mot), mais <strong>faire confiance à vos devs, ça fera partir tout le monde sur de bonnes bases</strong>. </p>
<p>Si vos devs disent que c’est compliqué de développer, c’est que ça l’est. Et s’ils disent qu’estimer est difficile/impossible, c’est que ça l’est vraiment. Si on le dit tous, c’est pas un complot des francs-développeurs dans le monde, c’est que c’est vrai.</p>
<p>Voici quelques pistes&#160;: </p>
<p></p><ul><li>De la valeur business est-elle produite dans le temps sur un même produit (je cite <a href="https://twitter.com/alborq42/status/1194624076633067520">une réponse très juste</a>)&#8239;?</li><li>Les clients sont-ils contents&#8239;?</li><li>Est-ce que votre dev est apprécié des autres humainement&#8239;?</li><li>Est-ce que son travail facilite celui des autres&#8239;?</li><li>Maîtrise-t-il sa partie&#8239;?</li><li>Est-ce que les tâches sont expédiées et résolues&#8239;?</li><li>Est-ce qu’au long cours, son travail permet de continuer à garder la vélocité de l’équipe, ou est-ce que cela devient de plus en plus dur&#8239;?</li><li>Est-ce que sa partie facilite des évolutions non prévues initialement&#8239;?</li><li>Etc.</li></ul><p></p>
<p>Certes, tout cela est plus difficile à quantifier via une formule magique. Surtout sur des mastodontes que personne ne maitrise. <br />Ceci dit, avec de la confiance et surtout des ambiances saines, cela <strong>se construit</strong>.</p>
<p>Après, cela ne veut pas dire que les estimations sont à jeter, mais il faut les considérer comme ce qu’elles sont&#160;: des approximations. Cela peut donner une idée –&#160;imprécise&#160;– de la charge de travail.</p>
<p>Pas plus tard qu’il y a 3 jours, j’ai entendu un <i lang="en" xml:lang="en">Product Owner</i> dire «&#160;<em>je me fous de l’exactitude des estimations, tout ce que je veux, c’est avoir une idée de la quantité de boulot, et voir qu’on avance. Et si un jour, la boîte commençait à avoir des lemmings qui n’ont d’autres boulots que de surveiller ça, vous vous barrerez vite car la boite sera devenue merdique</em>&#160;». Tout est dit.</p>
<p>Mais pour conclure&#160;: <strong>comptez le coût induit par la mise en place d’outils pour gérer la non-confiance</strong>, que ce soit en humain, temps, argent, processus, bien-être… et <strong>comptez le coût de la confiance</strong>. C’est peut-être délirant, mais croyez que la balance est nettement en faveur de cette dernière, sans compter les effets bénéfiques induits. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1714-des-metriques-pour-suivre-activite-dev.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1714-des-metriques-pour-suivre-activite-dev.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Mon, 11 May 2020 19:06:06 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Note de lecture&#160;: Grid Layout, de Raphaël Goetter ]]></title>
  <description><![CDATA[ J’ai eu le plaisir de recevoir le dernier livre de Raphaël Goetter, intitulé «&#160;<strong><span lang="en" xml:lang="en">Grid Layout</span>, vous allez enfin aimer <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr></strong>&#160;». Ce livre est sorti depuis le 18 Février de cette année.</p><div><p class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/grid-couverture-mini.png" width="165" height="200" alt="Grid Layout, par Raphaël Goetter"  /></p></div><p>Un livre entier pour un seul module de <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>&#8239;! Est-ce bien raisonnable&#8239;?</p>
<p>Hé bien, autant dire de suite&#160;: <strong>oui, et cela ne sera pas de trop&#8239;!</strong> Si le positionnement en <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> a toujours été une partie de plaisir (<em>tousse très fort</em>) et absolument pas limitatif (<em>s’étouffe en toussant</em>), là, nous tenons un des modules majeurs, car parmi les plus puissants qui soit. </p>
<p>Des choses soit difficilement faisables jusqu’à présent (fusion de cellules) ou souvent bricolées (grilles robustes et responsive, avec des marges négatives par exemple) sont désormais possibles sans bidouillage, et le tout très simplement. Il m’arrive parfois de me servir de <span lang="en" xml:lang="en">Grid Layout</span>, et je me surprends à constater la puissance et la concision de ce nouveau module. </p>
<p>Ce module ne va pas vous dispenser des bonnes pratiques sur <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> (séparation layout/positionnement d’un élément), mais va permettre dans l’absolu de gérer le positionnement global beaucoup plus aisément&#160;: on peut commencer à envisager de se passer de conteneurs exclusivement pour le positionnement, <span lang="en" xml:lang="en">Grid Layout</span> permet aussi bien de créer des systèmes complexes que des choses très simples. </p>
<p>En pratique, m’est d’avis que les règles de scalabilité/réutilisabilité risquent de nous faire revenir sur terre dans les intégrations complexes, mais qu’on ne se méprenne pas, <strong>le pas franchi avec <span lang="en" xml:lang="en">Grid Layout</span> est gigantesque, les possibilités sont énormes</strong>.</p>
<p>Sinon, que dire de plus sur l’auteur, est-il encore besoin de le présenter&#8239;? Passionné des <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> et des <a href="https://knacss.com/">Knacss</a>, <strong>coutumier des bons livres et… coutumier des interventions sur <span lang="en" xml:lang="en">Grid Layout</span></strong> depuis un certain temps. Autant j’avais eu le plaisir il y a quelques années de co-présenter un atelier sur <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> en duo avec lui, mais la dernière fois, j’étais simple élève lors d’un de ses ateliers sur le sujet à Paris Web en 2018. </p>
<p>Je retrouve tout le style de Raphaël -&#160;style, <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>, vous suivez&#160;- dans ce livre, très proche de son atelier, en bien plus complet bien sûr&#160;: <strong>expliquer les choses simplement, pas à pas, sans pour autant trainer. C’est efficace, on apprend vite et bien</strong>. Le livre se lit rapidement, il se dévore même.</p>
<p>Bref, vous l’aurez compris&#160;: je ne peux que vous recommander la lecture de cet ouvrage. Chapeau Raphaël, ton nom truste ma bibliothèque en matière de <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>. ;)</p>
<p>Si vous voulez en savoir plus sur cet ouvrage, voici le site dédié&#160;: <a href="http://goetter.fr/livres/gridlayout/"><span lang="en" xml:lang="en">Grid Layout</span>, vous allez enfin aimer <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr></a>. ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1713-Note-de-lecture-Grid-Layout-de-Raphael-Goetter.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1713-Note-de-lecture-Grid-Layout-de-Raphael-Goetter.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Tue, 30 Apr 2019 14:59:00 +0200</pubDate>
 </item>
 <item>
  <title><![CDATA[ Créer un RevealJS light avec CSS Scroll Snap Points ]]></title>
  <description><![CDATA[ Cela faisait un certain moment que je voulais tester ce module <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> ainsi d’autres choses, l’occasion m’en a été donnée avec <a href="https://www.nicolas-hoffmann.net/sudweb/">mes slides de Sud Web 2018</a>. Voici un petit retour d’expérience.</p>
<p>Attention, je le dis de suite&#160;: <strong>certaines parties de ce délire ne sont clairement PAS utilisables en production à grande échelle</strong>. Je me le suis permis car j’étais dans un contexte totalement maitrisé… et vous allez voir que je ne m’en suis vraiment pas privé. Grosso modo, c’est un RevealJS en version très light, codé à la rache en moins de deux heures.</p><div class="centre"><img src="https://www.nicolas-hoffmann.net/images/divers/15ans-sudweb.png" width="300" height="160" alt="Présentation à Sud Web" /></div><p><h3 lang="en" xml:lang="en"><em><abbr title="Cascading Style Sheet">CSS</abbr> Scroll Snap Points</em></h3></p>
<p>L’idée de <em lang="en" xml:lang="en"><abbr title="Cascading Style Sheet">CSS</abbr> Scroll Snap Points</em> est de permettre de définir une force d’adhérence aux points d’accroche en cas de défilement d’un conteneur. Le <em lang="en" xml:lang="en">viewport</em> du conteneur doit s’arrêter à un point d’accroche s’il n’est pas en train de défiler. Ce n’est pas clair&#8239;? Rassurez-vous, c’est normal&#8239;! </p>
<p>Un exemple vaut mille mots, allez voir (idéalement avec Firefox) <a href="https://codepen.io/nico3333fr/pen/BVLeKY">un exemple</a>.</p>
<p>Comme vous pouvez le voir, l’idée des slides en <abbr title="HyperText Markup Language" lang="en" xml:lang="en">HTML</abbr> est assez simple. En clair, chaque élément aura une taille de <code>100%</code> et une hauteur de <code>100vh</code>. Et dès qu’on se déplacera, <em lang="en" xml:lang="en"><abbr title="Cascading Style Sheet">CSS</abbr> Scroll Snap Points</em> permettra d’aller de slide en slide, nativement si j’ose dire.</p>
<p>La petite surprise, c’est que le <em lang="en" xml:lang="en">touch</em> est très très bien géré ainsi (essayez sur une Surface sur Firefox ou sur Edge). Et une fois que le focus est sur la page… les flèches gauche et droite permettent aussi de gérer le déplacement. Vous voyez l’intérêt pour un carrousel par exemple&#8239;? :)</p>
<p>En clair, ce module <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr> a beaucoup d’avantages. Actuellement, le <em lang="en" xml:lang="en">touch</em> est très bien géré par Edge et Firefox (les points d’adhérence sont effectifs). Chrome et autres ne semblent pas (encore) les gérer.</p>
<p>Dans mon cas, cela s’est limité à définir un conteneur <code>scroll-snap-type: mandatory</code> et <code>scroll-snap-points-x: repeat(100%)</code>. Et à donner à chaque slide la largeur/hauteur complète du <em lang="en" xml:lang="en">viewport</em>. Oui, c’est aussi simple que cela.</p>
<p>La doc&#160;: <a href="https://developer.mozilla.org/fr/docs/Web/CSS/scroll-snap-type"><em lang="en" xml:lang="en"><abbr title="Cascading Style Sheet">CSS</abbr> Scroll Snap Points</em></a></p>
<p><h3 lang="en" xml:lang="en">Intersection Observer</h3></p>
<p>Grosso modo, l’idée de cette <abbr title="Application Programming Interface" lang="en" xml:lang="en">API</abbr> est de gérer quand un élément «&#160;observé&#160;» rentre ou sort du <em lang="en" xml:lang="en">viewport</em>, d’appeler une fonction quand c’est le cas, cela évite de devoir le faire soi-même avec des fonctions plus ou hasardeuses et/ou coûteuses en performance.</p>
<p>Pour être très franc, au début, j’ai voulu utiliser cela juste pour avoir l’occasion de m’en servir (je n’en ai eu l’utilité que plus tard), voir <a href="https://developer.mozilla.org/fr/docs/Web/API/Intersection_Observer_API">la documentation d’<span lang="en" xml:lang="en">Intersection Observer</span></a>.</p>
<p>L’idée était de pouvoir ajouter une classe pour savoir quelle était la slide active. En clair, je surveille toutes les slides. </p>
<p><pre><code>if ('IntersectionObserver' in window) {<br />   // IntersectionObserver Supported<br />   let config = {<br />      root: null,<br />      rootMargin: '0px',<br />      threshold: 0.5<br />   };<br />   let observer = new IntersectionObserver(onChange, config);<br />   slides.forEach(slide => observer.observe(slide));<br />} else {<br />   // IntersectionObserver NOT Supported<br />   console.log('Whomp Whomp Whomp');<br />   }<br /></code></pre></p>
<p>Et quand une passe dans le <em lang="en" xml:lang="en">viewport</em>, je lui ajoute la classe <code>is-active</code> et au passage j’ajoute le fragment correspondant dans l’URL.</p>
<p><pre><code>function onChange(changes) {<br />   changes.forEach(change => {<br />      if (change.intersectionRatio > 0.5) {<br />         change.target.classList.add('is-active');<br />         history.pushState(null, null, location.pathname + location.search + '#' + change.target.getAttribute('id'));<br />         } else {<br />             change.target.classList.remove('is-active');<br />            }<br />   });<br />}<br /></code></pre></p>
<p>C’était un caprice au début, mais cela va se révéler utile ensuite.</p>
<p><h3>Ajouter des contenus qui apparaissent/bougent</h3></p>
<p>Dans la présentation, à plusieurs moments je me suis dit que ce serait bien d’avoir des contenus qui apparaissent au fur et à mesure dans la même slide. Du coup, j’ai mis quelques boutons ainsi.</p>
<p><pre><code>&lt;button class="js-next" data-next="next_2"&gt;Ce qui change…&lt;/button&gt;</code></pre></p>
<p>En clair, quand ce bouton est activé, il va chopper l’élément qui a l’<code>id</code> <code>next_2</code> et il le fait apparaître.</p>
<p>Oui c’est pas génial point de vue accessibilité, on peut faire mieux, je sais&#8239;! :)</p>
<p><h3>Gérer la télécommande</h3></p>
<p>Durant les répétitions, je me suis rendu compte que devoir me rapprocher de ma Surface pour activer les boutons/passer les slides était gênant pour le rythme et ma liberté sur scène (et bien m’en a pris vu la configuration du lieu le jour même). C’est là que je me suis amusé à coder un peu de raffinement… qui va s’avérer vital durant la présentation.</p>
<p>Grosso modo, la télécommande envoie un événement clavier (voir <a href="http://keycode.info/">keycode.info</a>), comme si on appuyait sur <kbd>Page Down</kbd> (34) ou <kbd>Page Up</kbd> (33). J’avais déjà codé que si cet événement arrivait, j’appelais une fonction qui passait à la slide suivante/précédente. Pour l’animation, je ne me suis pas cassé la tête, j’ai utilisé <code>scrollIntoView</code>, et comme je n’avais pas de souci de compatibilité, j’ai utilisé l’option <code>behavior: "smooth"</code> (attention, <a href="https://developer.mozilla.org/fr/docs/Web/API/Element/scrollIntoView">le support est très variable selon les navigateurs</a>, la version de base ne marche pas trop mal, mais <code>scrollIntoViewOptions</code> est plus rare).</p>
<p>Comme je voulais pouvoir activer les boutons, l’idée est assez simple&#160;: si j’ai un bouton non encore activé dans la slide active, alors j’envoie un clic dessus.</p>
<p><pre><code>if (eventName === 'keydown' &amp;&amp; 34 === e.keyCode) {<br />  let activeSlide = document.querySelector('.slide.is-active');<br />  let buttonNext = activeSlide.querySelector('.js-next:not(.has-been-pressed)');<br />  if (buttonNext) {<br />  buttonNext.click();<br />  } else {<br />    let buttonAnim = activeSlide.querySelector('.js-anim:not(.has-been-played)');<br />    if (buttonAnim) {<br />      buttonAnim.click();<br />    } else {<br />      let slides = [].slice.call(document.querySelectorAll('.slide'));<br />      selectSlideInList(slides, 'next');<br />    }<br />  }<br />}</code></pre></p>
<p>Dans la fonction qui permet de revenir en arrière (sait-on jamais, des fois que j’en aie besoin durant la présentation), j’ai réinitialisé les boutons d’animation et suivants. Ce n’est pas optimal, mais ça me permettra de les rejouer si besoin est.</p>
<p>Et hop, le job était fait, <strong>je contrôlais l’intégralité de la présentation à la télécommande</strong>. Bien m’en a pris, car ce sera obligatoire sur place.</p>
<p><h3>En conclusion</h3></p>
<p>Certes c’est un exercice de style fait à la rache, mais grosso modo, avec quelques <abbr title="Application Programming Interface" lang="en" xml:lang="en">API</abbr>s, de la <abbr lang="en" xml:lang="en" title="Cascading Style Sheet">CSS</abbr>, très peu de JavaScript et un peu d’huile de coude, j’ai pu tester quelques trucs et <strong>recréer un mini-système façon RevealJS en très peu de temps</strong>.</p>
<p>Il serait assez facile d’ajouter une version imprimable, de perfectionner le système, j’avais même fait quelques essais pour avoir des slides horizontales et verticales, à creuser pour plus tard, car là je n’ai clairement pas eu le temps.</p>
<p>Là où je me dis que cela est intéressant, c’est pour un hypothétique carrousel&#160;: <strong>on n'aurait plus à gérer le <em lang="en" xml:lang="en">touch</em> à coups de JavaScript, mais tout serait fait automatiquement grâce à <em lang="en" xml:lang="en"><abbr title="Cascading Style Sheet">CSS</abbr> Scroll Snap Points</em></strong>… quand il fonctionnera correctement chez Webkit.</p>
<p>Voilà, si vous avez des remarques ou des commentaires, à votre disposition&#8239;!  ]]>
  </description>
  <guid>https://www.nicolas-hoffmann.net/source/1712-Creer-un-RevealJS-light-avec-CSS-Scroll-Snap-Points.html</guid>
  <link>https://www.nicolas-hoffmann.net/source/1712-Creer-un-RevealJS-light-avec-CSS-Scroll-Snap-Points.html</link>
  <author>contact@nicolas-hoffmann.net (Nico)</author>
  <pubDate>Thu, 07 Jun 2018 17:49:44 +0200</pubDate>
 </item>
</channel>
</rss>