Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 30KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. <!DOCTYPE html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="fr">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>
  13. Calme
  14. — David Larlet</title>
  15. <script>
  16. function toggleTheme(themeName) {
  17. document.documentElement.classList.toggle(
  18. 'forced-dark',
  19. themeName === 'dark'
  20. )
  21. document.documentElement.classList.toggle(
  22. 'forced-light',
  23. themeName === 'light'
  24. )
  25. }
  26. const selectedTheme = localStorage.getItem('theme')
  27. if (selectedTheme !== 'undefined') {
  28. toggleTheme(selectedTheme)
  29. }
  30. </script>
  31. <!-- Documented, feel free to shoot an email. -->
  32. <link rel="stylesheet" href="/static/david/css/style_2024-03-09.css">
  33. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  34. <link rel="preload"
  35. href="/static/david/css/fonts/century_supra_ot_a_regular.woff2"
  36. as="font"
  37. type="font/woff2"
  38. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  39. crossorigin>
  40. <link rel="preload"
  41. href="/static/david/css/fonts/century_supra_ot_a_bold.woff2"
  42. as="font"
  43. type="font/woff2"
  44. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  45. crossorigin>
  46. <link rel="preload"
  47. href="/static/david/css/fonts/century_supra_ot_a_italic.woff2"
  48. as="font"
  49. type="font/woff2"
  50. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  51. crossorigin>
  52. <link rel="preload"
  53. href="/static/david/css/fonts/century_supra_ot_b_regular.woff2"
  54. as="font"
  55. type="font/woff2"
  56. media="(prefers-color-scheme: dark)"
  57. crossorigin>
  58. <link rel="preload"
  59. href="/static/david/css/fonts/century_supra_ot_b_bold.woff2"
  60. as="font"
  61. type="font/woff2"
  62. media="(prefers-color-scheme: dark)"
  63. crossorigin>
  64. <link rel="preload"
  65. href="/static/david/css/fonts/century_supra_ot_b_italic.woff2"
  66. as="font"
  67. type="font/woff2"
  68. media="(prefers-color-scheme: dark)"
  69. crossorigin>
  70. <meta name="description" content="Le calme avant la tempête ou la tempête avant le calme. Ces prochains jours en décideront. C’est peut-être aussi la tempête avant la tempête. Me voilà à la barre, en essayant de ne pas la mettre trop haute, acceptant que le cap puisse être réajusté en cours de route.">
  71. <!-- That good ol' feed, subscribe :). -->
  72. <link rel="alternate"
  73. type="application/atom+xml"
  74. title="Feed"
  75. href="/david/log/">
  76. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  77. <link rel="apple-touch-icon"
  78. sizes="180x180"
  79. href="/static/david/icons2/apple-touch-icon.png">
  80. <link rel="icon"
  81. type="image/png"
  82. sizes="32x32"
  83. href="/static/david/icons2/favicon-32x32.png">
  84. <link rel="icon"
  85. type="image/png"
  86. sizes="16x16"
  87. href="/static/david/icons2/favicon-16x16.png">
  88. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  89. <link rel="mask-icon"
  90. href="/static/david/icons2/safari-pinned-tab.svg"
  91. color="#07486c">
  92. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  93. <meta name="msapplication-TileColor" content="#f7f7f7">
  94. <meta name="msapplication-config"
  95. content="/static/david/icons2/browserconfig.xml">
  96. <meta name="theme-color"
  97. content="#f7f7f7"
  98. media="(prefers-color-scheme: light)">
  99. <meta name="theme-color"
  100. content="#272727"
  101. media="(prefers-color-scheme: dark)">
  102. <!-- Is that even respected? Retrospectively? What a shAItshow…
  103. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  104. <meta name="robots" content="noai, noimageai">
  105. <style type="text/css">
  106. .tippy-content {
  107. min-width: 280px;
  108. padding: .5rem;
  109. font-size: calc(var(--fluid-0) * 0.8);
  110. font-family: var(--labor-font);
  111. letter-spacing: initial;
  112. text-align: left;
  113. }
  114. .tippy-content h3 {
  115. margin-top: 0;
  116. }
  117. .tippy-content h3 img {
  118. max-width: 2rem;
  119. max-height: 2rem;
  120. display: inline-block;
  121. }
  122. .tippy-content .tippy-links {
  123. display: flex;
  124. justify-content: space-around;
  125. }
  126. .tippy-content a {
  127. padding: .4rem;
  128. color: #F06048;
  129. }
  130. </style>
  131. <body data-instant-intensity="viewport-all">
  132. <article>
  133. <header>
  134. <hgroup>
  135. <h1>Calme</h1>
  136. <p>Le <time datetime="2024-04-18">18 avril 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/04/17/"
  143. title="Publication précédente : Échelle">← Précédent</a> •
  144. <a href="/david/" title="Aller à l’accueil" rel="up">Accueil</a>
  145. <a href="/david/recherche/"
  146. title="Aller à la page de recherche"
  147. rel="search" data-no-instant>Recherche</a>
  148. • <a rel="next"
  149. href="/david/2024/04/20/"
  150. title="Publication suivante : Jour 1">Suivant →</a>
  151. </p>
  152. </nav>
  153. <p>Le calme avant la tempête ou la tempête avant le calme. Ces prochains jours en décideront. C’est peut-être aussi la tempête avant la tempête. Me voilà à la barre, en essayant de ne pas la mettre trop haute, acceptant que le cap puisse être réajusté en cours de&nbsp;route.</p>
  154. <a href="#hr-152" title="Lien vers cette section de la page"><hr id="hr-152" /></a>
  155. <blockquote lang="en">
  156. <p>A calm company’s purpose is to provide exceptional service to customers while simultaneously improving the lives of the people who work&nbsp;there.</p>
  157. <p><mark>By default, a calm company is profitable.</mark> Those profits give a calm company its resilience: there’s no last-minute scramble to meet payroll or earn a last-minute sale to keep the business afloat. The company has enough financial margin to weather economic&nbsp;storms.</p>
  158. <p>Moreover, calm companies are fun to work for. The work is usually interesting and enjoyable. The team has been carefully selected, and there’s a good vibe in&nbsp;meetings.</p>
  159. <p>Calm companies provide meaningful work, healthy interactions, and flexibility for people’s lives. If your kid is home sick, you can set work aside and take care of them. If it’s a beautiful day, you can go for a run on the&nbsp;beach.</p>
  160. <p><cite><em><a data-link-domain="justinjackson.ca" href="https://justinjackson.ca/calm-company" hreflang="en"
  161. title="Consultation de l’article (anglais)">We need more calm companies</a>
  162. <a href="/david/cache/2024/944899e3cafa6019bd2f285284a14dd7/" hreflang="en"
  163. data-tippy data-description="Calm companies are profitable, value freedom, have a purpose, and improve the team's lives. Frenzied companies are crisis-driven."
  164. data-source="https://justinjackson.ca/calm-company"
  165. data-date="2024-04-18"
  166. data-favicon="https://justinjackson.ca/img/asset/bWFpbi9icnV0YWwvanVzdGluLWphY2tzb24tZG90cy1jaXJjbGUucG5n?w=32&h=32&s=84e63e02be5161c4fdb75e2f8304ae35"
  167. data-domain="justinjackson.ca"
  168. ><svg xmlns="http://www.w3.org/2000/svg"
  169. width="24" height="24" viewBox="0 0 24 24" fill="none"
  170. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  171. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  172. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  173. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  174. </svg>
  175. <span class="sr-only">[archive]</span></a></em></cite></p>
  176. </blockquote>
  177. <p>Par la force des choses, je me retrouve à réfléchir à cette histoire de profit. Peut-être que l’équilibre est suffisant. Peut-être même qu’il incite à rester frugal, à rester à une échelle humaine, à prendre soin de relations qui ne soient pas dégradées par l’argent. Peut-être que le profit introduit un déséquilibre en lui-même qui ne permet pas de rester&nbsp;calme.</p>
  178. <a href="#hr-153" title="Lien vers cette section de la page"><hr id="hr-153" /></a>
  179. <blockquote lang="en">
  180. <p><code>Line-height</code> and <code>vertical-align</code> are simple CSS properties. So simple that most of us are convinced to fully understand how they work and how to use them. But it’s not. They really are complex, maybe the hardest ones, as they have a major role in the creation of one of the less-known feature of CSS: inline formatting&nbsp;context.</p>
  181. <p><cite><em><a data-link-domain="iamvdo.me" href="https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align" hreflang="en"
  182. title="Consultation de l’article (anglais)">Deep dive CSS: font metrics, line-height and vertical-align</a>
  183. <a href="/david/cache/2024/157e744e8062e5495ba700566e99f8f2/" hreflang="en"
  184. data-tippy data-description="An introduction to the inline formatting context. Explores line-height and vertical-align properties, as well as the font metrics. Understand how text is rendered on screen, and how to control it with CSS."
  185. data-source="https://iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align"
  186. data-date="2024-04-18"
  187. data-favicon="https://iamvdo.me/images/favicon.png"
  188. data-domain="iamvdo.me"
  189. ><svg xmlns="http://www.w3.org/2000/svg"
  190. width="24" height="24" viewBox="0 0 24 24" fill="none"
  191. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  192. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  193. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  194. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  195. </svg>
  196. <span class="sr-only">[archive]</span></a></em></cite></p>
  197. </blockquote>
  198. <p>Centrer des éléments sur le web —&nbsp;<em>a fortiori</em> du texte&nbsp;— a toujours été compliqué. <a data-link-domain="tonsky.me" href="https://tonsky.me/blog/centering/" hreflang="en"
  199. title="Consultation de l’article (anglais)">Voire impossible.</a>
  200. <a href="/david/cache/2024/4bda7c6500950716846bdeb6bddbafed/" hreflang="en"
  201. data-tippy data-description="Somehow we forgot how to center rectangles and must find our way back"
  202. data-source="https://tonsky.me/blog/centering/"
  203. data-date="2024-04-18"
  204. data-favicon="https://tonsky.me/i/favicon.png"
  205. data-domain="tonsky.me"
  206. ><svg xmlns="http://www.w3.org/2000/svg"
  207. width="24" height="24" viewBox="0 0 24 24" fill="none"
  208. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  209. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  210. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  211. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  212. </svg>
  213. <span class="sr-only">[archive]</span></a> Je me demande si des unités comme <code>rlh</code> on une chance de <a data-link-domain="pawelgrzybek.com" href="https://pawelgrzybek.com/vertical-rhythm-using-css-lh-and-rlh-units/" hreflang="en"
  214. title="Consultation de l’article (anglais)">changer des choses</a>
  215. <a href="/david/cache/2024/c224a3174ad7a76fae1aaa8d174ec791/" hreflang="en"
  216. data-tippy data-description="Vertical rhythm is a design concept that helps to create a harmonious layout by following consistent spacing between elements, typically using the height of a line as a base."
  217. data-source="https://pawelgrzybek.com/vertical-rhythm-using-css-lh-and-rlh-units/"
  218. data-date="2024-04-18"
  219. data-favicon="https://pawelgrzybek.com/icon.svg"
  220. data-domain="pawelgrzybek.com"
  221. ><svg xmlns="http://www.w3.org/2000/svg"
  222. width="24" height="24" viewBox="0 0 24 24" fill="none"
  223. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  224. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  225. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  226. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  227. </svg>
  228. <span class="sr-only">[archive]</span></a> à ce&nbsp;sujet.</p>
  229. <p>Je vous ai déjà dit que <a data-link-domain="moderncss.dev" href="https://moderncss.dev/modern-css-for-dynamic-component-based-architecture/" hreflang="en"
  230. title="Consultation de l’article (anglais)">les CSS c’était devenu génial&#8239;?</a>
  231. <a href="/david/cache/2024/35c44c8d8b999faa625ed6009da60e99/" hreflang="en"
  232. data-tippy data-description="Explore modern project architecture, theming, responsive layouts, and component design. Learn to improve code organization, dig into layout techniques, and review real-world, context-aware components that use cutting-edge CSS techniques."
  233. data-source="https://moderncss.dev/modern-css-for-dynamic-component-based-architecture/"
  234. data-date="2024-04-18"
  235. data-favicon="https://moderncss.dev/favicon.png"
  236. data-domain="moderncss.dev"
  237. ><svg xmlns="http://www.w3.org/2000/svg"
  238. width="24" height="24" viewBox="0 0 24 24" fill="none"
  239. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  240. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  241. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  242. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  243. </svg>
  244. <span class="sr-only">[archive]</span></a> Le temps que ça a dû prendre à Stephanie Eckles pour découvrir/collecter/tester/agencer/écrire tout&nbsp;ça&nbsp;😮.</p>
  245. <a href="#hr-154" title="Lien vers cette section de la page"><hr id="hr-154" /></a>
  246. <blockquote lang="en">
  247. <p>What is less thrilling is that, nevermind the basic accessibility requirements that are often missing like alt text on images, we stopped letting people do very normal web things. There are a number of avenues to route the blame to: rushing to release something midly usable for testing protocols in the wild, not having a UI engineer on the project, building things in a mobile “touch first” experience and ignoring other inputs or devices; the list goes on. In the end, <mark>it’s usually because we’ve JavaScript’ed our way out of these&nbsp;things.</mark></p>
  248. <p>Here are some things I wish people allowed to continue to work in their web&nbsp;projects:</p>
  249. <p><cite><em><a data-link-domain="heather-buchel.com" href="https://heather-buchel.com/blog/2023/07/just-normal-web-things/" hreflang="en"
  250. title="Consultation de l’article (anglais)">Just normal web things.</a>
  251. <a href="/david/cache/2024/a20d47394f5c790270fd5af6faa58651/" hreflang="en"
  252. data-tippy data-description="A plea for us to get back to building websites that can do normal website things."
  253. data-source="https://heather-buchel.com/blog/2023/07/just-normal-web-things/"
  254. data-date="2024-04-18"
  255. data-favicon="https://heather-buchel.com/icon.svg"
  256. data-domain="heather-buchel.com"
  257. ><svg xmlns="http://www.w3.org/2000/svg"
  258. width="24" height="24" viewBox="0 0 24 24" fill="none"
  259. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  260. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  261. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  262. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  263. </svg>
  264. <span class="sr-only">[archive]</span></a></em></cite></p>
  265. </blockquote>
  266. <p>Oui. Les cas exceptionnels existent… dans la mesure où ils restent des cas exceptionnels. Ça arrive, mais ça doit rester très&nbsp;rare.</p>
  267. <a href="#hr-155" title="Lien vers cette section de la page"><hr id="hr-155" /></a>
  268. <blockquote lang="en">
  269. <p>It comes down to this annoying, upsetting, stupid fact: the only way to build a great product is to use it every day, to stare at it, to hold it in your hands to feel its lumps. The data and customers will lie to you but the product never will. And <mark>most product orgs suck because they simply don’t use the products that they’re building;</mark> they ship incremental nothings without direction because they’re looking at spreadsheets all day long filled with junk data&nbsp;nothings.</p>
  270. <p>See, I don’t know much about product stuff. I have no experience as a product manager, no experience running teams or building a company. Take everything I say here with an enormous silo of salt. But: I don’t care what the data shows me and I’m not sure I ever will. You can show me charts and spreadsheets all day long and I will not care. Tell me what your gut says instead after relentless experience of the product every day. This is the only way to see the world&nbsp;clearly.</p>
  271. <p><cite><em><a data-link-domain="robinrendle.com" href="https://robinrendle.com/notes/vibe-driven-development/" hreflang="en"
  272. title="Consultation de l’article (anglais)">Vibe Driven Development</a>
  273. <a href="/david/cache/2024/2b6f113e6c47bf6d2b282fa0a48b48a6/" hreflang="en"
  274. data-tippy data-description="The website of Robin Rendle, a designer and writer from the UK."
  275. data-source="https://robinrendle.com/notes/vibe-driven-development/"
  276. data-date="2024-04-18"
  277. data-favicon="https://robinrendle.com/images/favicons3/favicon-32x32.png"
  278. data-domain="robinrendle.com"
  279. ><svg xmlns="http://www.w3.org/2000/svg"
  280. width="24" height="24" viewBox="0 0 24 24" fill="none"
  281. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  282. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  283. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  284. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  285. </svg>
  286. <span class="sr-only">[archive]</span></a></em></cite></p>
  287. </blockquote>
  288. <p>Je voulais en parler depuis bien longtemps. C’est l’une des raisons pour lesquelles j’essaye d’être acteur des <a href="/david/2024/04/17/" title="Échelle">évènements</a> que je produis. Entre égoïsme et altruisme la frontière peut être fine dans ce&nbsp;domaine.</p>
  289. <a href="#hr-156" title="Lien vers cette section de la page"><hr id="hr-156" /></a>
  290. <blockquote lang="en">
  291. <p>I said “delve” was overused by ChatGPT compared to the internet at large. But there’s one part of the internet where “delve” is a much more common word: the African web. In Nigeria, “delve” is much more frequently used in business English than it is in England or the US. So the workers training their systems provided examples of input and output that used the same language, <mark>eventually ending up with an AI system that writes slightly like an&nbsp;African.</mark></p>
  292. <p><cite><em><a data-link-domain="theguardian.com" href="https://www.theguardian.com/technology/2024/apr/16/techscape-ai-gadgest-humane-ai-pin-chatgpt" hreflang="en"
  293. title="Consultation de l’article (anglais)">TechScape: How cheap, outsourced labour in Africa is shaping AI English</a>
  294. <a href="/david/cache/2024/3a28346225751986cc06aaadb8c8bb90/" hreflang="en"
  295. data-tippy data-description="Workers in Africa have been exploited first by being paid a pittance to help make chatbots, then by having their own words become AI-ese. Plus, new AI gadgets are coming for your smartphones"
  296. data-source="https://www.theguardian.com/technology/2024/apr/16/techscape-ai-gadgest-humane-ai-pin-chatgpt"
  297. data-date="2024-04-18"
  298. data-favicon="https://static.guim.co.uk/images/favicon-32x32.ico"
  299. data-domain="theguardian.com"
  300. ><svg xmlns="http://www.w3.org/2000/svg"
  301. width="24" height="24" viewBox="0 0 24 24" fill="none"
  302. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  303. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  304. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  305. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  306. </svg>
  307. <span class="sr-only">[archive]</span></a></em></cite></p>
  308. </blockquote>
  309. <p>On ne sait plus qui donne la leçon à qui dans ces jeux d’apprentissages. La langue ne ment pas. J’attends qu’Olivier Ertzscheid en fasse un billet&nbsp;🍿.</p>
  310. <p><em>Via <a data-link-domain="simonwillison.net" href="https://simonwillison.net/2024/Apr/18/delve/" hreflang="en"
  311. title="Consultation de l’article (anglais)">Simon Willison</a>
  312. <a href="/david/cache/2024/1137631455ddd7b2acdd1f4071756ba6/" hreflang="en"
  313. data-tippy data-description="The word delve has been getting a lot of attention recently as an example of something that might be an indicator of ChatGPT generated content. One example: articles on medical …"
  314. data-source="https://simonwillison.net/2024/Apr/18/delve/"
  315. data-date="2024-04-18"
  316. data-favicon="https://simonwillison.net/favicon.ico"
  317. data-domain="simonwillison.net"
  318. ><svg xmlns="http://www.w3.org/2000/svg"
  319. width="24" height="24" viewBox="0 0 24 24" fill="none"
  320. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  321. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  322. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  323. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  324. </svg>
  325. <span class="sr-only">[archive]</span></a>.</em></p>
  326. <nav>
  327. <p>
  328. <a href="/david/2024/apprentissage/"
  329. title="Liste de tous les articles 2024 associés à cette étiquette"
  330. rel="tag">#apprentissage</a>
  331. <a href="/david/2024/introspection/"
  332. title="Liste de tous les articles 2024 associés à cette étiquette"
  333. rel="tag">#introspection</a>
  334. <a href="/david/2024/technique/"
  335. title="Liste de tous les articles 2024 associés à cette étiquette"
  336. rel="tag">#technique</a>
  337. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  338. </p>
  339. </nav>
  340. <nav>
  341. <p>
  342. <a rel="prev"
  343. href="/david/2024/04/17/"
  344. title="Publication précédente : Échelle">← Précédent</a> •
  345. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  346. • <a rel="next"
  347. href="/david/2024/04/20/"
  348. title="Publication suivante : Jour 1">Suivant →</a>
  349. </p>
  350. </nav>
  351. <form action="/david/recherche/" method="get">
  352. <fieldset>
  353. <legend>Recherche</legend>
  354. <label for="input-search">Termes de votre recherche :</label>
  355. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  356. <input type="submit" value="Chercher">
  357. <p id="indexation-infos">
  358. <small>
  359. Seuls les contenus de ces 8 dernières années sont indexés.
  360. </small>
  361. </p>
  362. </fieldset>
  363. </form>
  364. <aside>
  365. <theme-toggle></theme-toggle>
  366. </aside>
  367. </article>
  368. <hr>
  369. <footer>
  370. <p>
  371. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  372. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  373. <a href="http://larlet.com"
  374. title="Go to my English profile"
  375. data-instant>Pro</a>
  376. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  377. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  378. </p>
  379. <template id="theme-selector">
  380. <form>
  381. <style type="text/css">
  382. fieldset div {
  383. text-align: center;
  384. }
  385. </style>
  386. <fieldset>
  387. <legend>Thème</legend>
  388. <div>
  389. <label>
  390. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  391. Auto
  392. </label>
  393. <label>
  394. <input type="radio" value="dark" name="chosen-color-scheme">
  395. Foncé
  396. </label>
  397. <label>
  398. <input type="radio" value="light" name="chosen-color-scheme">
  399. Clair
  400. </label>
  401. </div>
  402. </fieldset>
  403. </form>
  404. </template>
  405. </footer>
  406. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  407. <script>
  408. class ThemeToggle extends HTMLElement {
  409. constructor() {
  410. super()
  411. const themeSelectorTemplate = document.querySelector('#theme-selector')
  412. const form = themeSelectorTemplate.content.firstElementChild
  413. this.attachShadow({ mode: 'open' })
  414. this.shadowRoot.appendChild(form.cloneNode(true))
  415. }
  416. connectedCallback() {
  417. const form = this.shadowRoot.querySelector('form')
  418. form.addEventListener('change', (e) => {
  419. const chosenColorScheme = e.target.value
  420. localStorage.setItem('theme', chosenColorScheme)
  421. toggleTheme(chosenColorScheme)
  422. })
  423. const selectedTheme = localStorage.getItem('theme')
  424. if (selectedTheme && selectedTheme !== 'undefined') {
  425. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  426. }
  427. }
  428. }
  429. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  430. window.addEventListener('load', () => {
  431. let colorsLayer = undefined
  432. let hasDarkRules = false
  433. for (const styleSheet of Array.from(document.styleSheets)) {
  434. let mediaRules = []
  435. for (const layerRule of styleSheet.cssRules) {
  436. if (!(layerRule instanceof CSSLayerBlockRule)) {
  437. continue
  438. }
  439. if (layerRule.name === 'colors') {
  440. colorsLayer = layerRule
  441. }
  442. for (const cssRule of layerRule.cssRules) {
  443. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  444. continue
  445. }
  446. // WARNING: Safari does not have/supports `conditionText`.
  447. if (cssRule.conditionText) {
  448. if (cssRule.conditionText !== prefersColorSchemeDark) {
  449. continue
  450. }
  451. } else {
  452. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  453. continue
  454. }
  455. }
  456. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  457. }
  458. }
  459. // WARNING: do not try to insert a Rule to a styleSheet you are
  460. // currently iterating on, otherwise the browser will be stuck
  461. // in a infinite loop…
  462. for (const mediaRule of mediaRules) {
  463. // Safari requires the `0` second parameter (even if default).
  464. colorsLayer.insertRule(mediaRule.cssText, 0)
  465. hasDarkRules = true
  466. }
  467. }
  468. if (hasDarkRules) {
  469. if ('customElements' in window && !customElements.get('theme-toggle')) {
  470. customElements.define('theme-toggle', ThemeToggle)
  471. }
  472. }
  473. })
  474. </script>
  475. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  476. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  477. <script>
  478. tippy('[data-tippy]', {
  479. content(reference) {
  480. reference.addEventListener('click', (e) => e.preventDefault())
  481. return `
  482. <h3 lang="fr">
  483. <img src="${reference.dataset.favicon}" loading="lazy">
  484. <a href="${reference.dataset.source}"
  485. >Article sur ${reference.dataset.domain}</a></h3>
  486. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  487. <div class="tippy-links" lang="fr">
  488. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  489. </div>
  490. `
  491. },
  492. allowHTML: true,
  493. interactive: true,
  494. delay: [150, 700],
  495. hideOnClick: false
  496. })
  497. </script>
  498. <script type="module">
  499. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  500. const markObserver = new IntersectionObserver((entries, observer) => {
  501. const computedStyle = getComputedStyle(document.documentElement)
  502. const markBackground = computedStyle.getPropertyValue('--mark-background')
  503. for (const entry of entries) {
  504. if (entry.intersectionRatio === 0) continue
  505. const markElement = entry.target
  506. markElement.style.backgroundColor = 'inherit'
  507. const annotation = annotate(
  508. markElement, {
  509. type: 'highlight',
  510. multiline: true,
  511. color: markBackground,
  512. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  513. animate: false
  514. }
  515. )
  516. annotation.show()
  517. observer.unobserve(markElement)
  518. }
  519. }, {threshold: 1.0})
  520. for (const markElement of document.querySelectorAll('mark')) {
  521. markObserver.observe(markElement)
  522. }
  523. </script>
  524. </body>
  525. </html>