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 46KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  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. Étiquette #décision
  14. — David Larlet</title>
  15. <meta name="description" content="Publications relatives au tag #décision">
  16. <!-- That good ol' feed, subscribe :). -->
  17. <link rel="alternate"
  18. type="application/atom+xml"
  19. title="Feed"
  20. href="/david/log/">
  21. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  22. <link rel="apple-touch-icon"
  23. sizes="180x180"
  24. href="/static/david/icons2/apple-touch-icon.png">
  25. <link rel="icon"
  26. type="image/png"
  27. sizes="32x32"
  28. href="/static/david/icons2/favicon-32x32.png">
  29. <link rel="icon"
  30. type="image/png"
  31. sizes="16x16"
  32. href="/static/david/icons2/favicon-16x16.png">
  33. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  34. <link rel="mask-icon"
  35. href="/static/david/icons2/safari-pinned-tab.svg"
  36. color="#07486c">
  37. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  38. <meta name="msapplication-TileColor" content="#f7f7f7">
  39. <meta name="msapplication-config"
  40. content="/static/david/icons2/browserconfig.xml">
  41. <meta name="theme-color"
  42. content="#f7f7f7"
  43. media="(prefers-color-scheme: light)">
  44. <meta name="theme-color"
  45. content="#272727"
  46. media="(prefers-color-scheme: dark)">
  47. <!-- Is that even respected? Retrospectively? What a shAItshow…
  48. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  49. <meta name="robots" content="noai, noimageai">
  50. <!-- Documented, feel free to shoot an email. -->
  51. <link rel="stylesheet" href="/static/david/css/style_2024-02-03.css">
  52. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  53. <link rel="preload"
  54. href="/static/david/css/fonts/century_supra_ot_a_regular.woff2"
  55. as="font"
  56. type="font/woff2"
  57. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  58. crossorigin>
  59. <link rel="preload"
  60. href="/static/david/css/fonts/century_supra_ot_a_bold.woff2"
  61. as="font"
  62. type="font/woff2"
  63. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  64. crossorigin>
  65. <link rel="preload"
  66. href="/static/david/css/fonts/century_supra_ot_a_italic.woff2"
  67. as="font"
  68. type="font/woff2"
  69. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  70. crossorigin>
  71. <link rel="preload"
  72. href="/static/david/css/fonts/century_supra_ot_b_regular.woff2"
  73. as="font"
  74. type="font/woff2"
  75. media="(prefers-color-scheme: dark)"
  76. crossorigin>
  77. <link rel="preload"
  78. href="/static/david/css/fonts/century_supra_ot_b_bold.woff2"
  79. as="font"
  80. type="font/woff2"
  81. media="(prefers-color-scheme: dark)"
  82. crossorigin>
  83. <link rel="preload"
  84. href="/static/david/css/fonts/century_supra_ot_b_italic.woff2"
  85. as="font"
  86. type="font/woff2"
  87. media="(prefers-color-scheme: dark)"
  88. crossorigin>
  89. <script>
  90. function toggleTheme(themeName) {
  91. document.documentElement.classList.toggle(
  92. 'forced-dark',
  93. themeName === 'dark'
  94. )
  95. document.documentElement.classList.toggle(
  96. 'forced-light',
  97. themeName === 'light'
  98. )
  99. }
  100. const selectedTheme = localStorage.getItem('theme')
  101. if (selectedTheme !== 'undefined') {
  102. toggleTheme(selectedTheme)
  103. }
  104. </script>
  105. <style type="text/css">
  106. details[open] summary {
  107. display: none;
  108. }
  109. </style>
  110. <body data-instant-intensity="viewport-all">
  111. <article>
  112. <header>
  113. <hgroup>
  114. <h1>#décision</h1>
  115. <p>Publications relatives à cette étiquette</p>
  116. </hgroup>
  117. </header>
  118. <nav>
  119. <p>
  120. <a href="/david/" title="Aller à l’accueil">
  121. Accueil</a>
  122. <a rel="tags"
  123. href="/david/2024/#tags"
  124. title="Liste de toutes les étiquettes">
  125. Étiquettes</a>
  126. <a href="/david/recherche/" title="Aller à la page de recherche" rel="search" data-no-instant>Recherche</a>
  127. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  128. </p>
  129. </nav>
  130. <h2>
  131. <a href="/david/2024/02/22/" title="Lien permanent vers cet article">Responsabilité</a> <time datetime="2024-02-22">22 février 2024</time>
  132. </h2>
  133. <blockquote>
  134. <p>Il n’y a pas vraiment de conclusion à tout ça. Nous avons été témoins, par le petit bout de la lorgnette, du tout début de cette histoire&#8239;; nous avons imaginé un instant <mark>avoir l’opportunité, ou le devoir,</mark> d’y faire quelque chose. Finalement, nous n’avons jamais vraiment donné notre&nbsp;avis.&nbsp;🤷</p>
  135. <p><cite><em><a data-link-domain="codeursenliberte.fr" href="https://www.codeursenliberte.fr/blog/tous_anti_covid/" hreflang="fr"
  136. title="Consultation de l’article">TousAntiCovid&nbsp;: vu depuis Codeureuses en Liberté</a>
  137. <a href="/david/cache/2024/ddc3ee3603be2702cef745c180b87776/" hreflang="fr"
  138. data-tippy data-description="TousAntiCovid a refait récemment l’actualité sur les montants de l’hébergement et les modalités d’attribution du marché."
  139. data-source="https://www.codeursenliberte.fr/blog/tous_anti_covid/"
  140. data-date="2024-02-22"
  141. data-favicon="https://www.codeursenliberte.fr/favicon.png"
  142. data-domain="codeursenliberte.fr"
  143. ><svg xmlns="http://www.w3.org/2000/svg"
  144. width="24" height="24" viewBox="0 0 24 24" fill="none"
  145. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  146. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  147. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  148. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  149. </svg>
  150. <span class="sr-only">[archive]</span></a></em></cite></p>
  151. </blockquote>
  152. <p>Je me souviens vaguement de certaines discussions à ce sujet. D’un côté l’orgueil de penser que l’on pouvait faire mieux, de l’autre la culpabilité de pouvoir être associé à un tel projet. Et au milieu, une épidémie et le sentiment de pouvoir faire des choses avec nos compétences et notre position au sein de l’État français. Un mois plus tard, je m’embarquais dans <a href="/david/2020/05/26/">une autre aventure</a>, plus proche de mon&nbsp;style.</p>
  153. <p>Deux années, 23&nbsp;millions de visiteur·euses uniques et 60&nbsp;millions de pages vues plus tard, j’ai l’impression d’avoir été utile à mon échelle. Merci à la D<a data-link-domain="ronan.amicel.net" href="https://ronan.amicel.net/">R</a><a data-link-domain="ut7.fr" href="https://www.ut7.fr/">R</a>u<a data-link-domain="maiwann.net" href="https://www.maiwann.net/">M</a><a data-link-domain="fr.linkedin.com" href="https://fr.linkedin.com/in/m%C3%A9lodiedahi">M</a> team pour cette&nbsp;période.</p>
  154. <a href="#hr-84" title="Lien vers cette section de la page"><hr id="hr-84" /></a>
  155. <blockquote lang="en">
  156. <p>A custom element implementation of the Stack is provided for&nbsp;download.</p>
  157. <p><cite><em><a data-link-domain="every-layout.dev" href="https://every-layout.dev/layouts/stack/#the-component" hreflang="en"
  158. title="Consultation de l’article (anglais)">The Stack: Every Layout</a>
  159. <a href="/david/cache/2024/6b2b8e2559a07b8d66dac842017b2619/" hreflang="en"
  160. data-tippy data-description="A composable CSS layout primitive."
  161. data-source="https://every-layout.dev/layouts/stack/#the-component"
  162. data-date="2024-02-22"
  163. data-favicon="https://every-layout.dev/images/favicon.png"
  164. data-domain="every-layout.dev"
  165. ><svg xmlns="http://www.w3.org/2000/svg"
  166. width="24" height="24" viewBox="0 0 24 24" fill="none"
  167. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  168. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  169. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  170. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  171. </svg>
  172. <span class="sr-only">[archive]</span></a></em></cite></p>
  173. </blockquote>
  174. <p>Utiliser des <em>Web Components</em> pour appliquer un style, je n’y avais pas encore&nbsp;songé.</p>
  175. <a href="#hr-85" title="Lien vers cette section de la page"><hr id="hr-85" /></a>
  176. <p>Hier soir, j’ai regardé <a data-link-domain="en.wikipedia.org" href="https://en.wikipedia.org/wiki/The_Deepest_Breath">The Deepest Breath</a>. J’ai mal dormi. D’autant que, plus tôt dans la journée, on m’avait transmis <a data-link-domain="youtube.com" href="https://www.youtube.com/watch?v=LFLl9q-bEgk">ce retour d’expérience</a>, flippant (et discutable) à plus d’un&nbsp;titre.</p>
  177. <p>La récupération de ma cheville suit son cours, ça va être long, il manque du muscle. Je me sens suffisamment en confiance pour tenter une sortie hivernale en camping cette fin de semaine, on va voir ce que ça donne. Il va faire <q lang="fr_CA">frête</q> et ça laisse peu de place aux&nbsp;incapacités…</p>
  178. <nav>
  179. <p>
  180. <a href="/david/2024/decision/"
  181. title="Liste de tous les articles 2024 associés à cette étiquette"
  182. rel="tag">#décision</a>
  183. <a href="/david/2024/experience/"
  184. title="Liste de tous les articles 2024 associés à cette étiquette"
  185. rel="tag">#expérience</a>
  186. <a href="/david/2024/partage/"
  187. title="Liste de tous les articles 2024 associés à cette étiquette"
  188. rel="tag">#partage</a>
  189. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  190. </p>
  191. </nav>
  192. <h2>
  193. <a href="/david/2024/02/16/" title="Lien permanent vers cet article">uMap&nbsp;2</a> <time datetime="2024-02-16">16 février 2024</time>
  194. </h2>
  195. <blockquote lang="en">
  196. <p>But it’s deeper that that. Open source is <em>good for humanity</em>. It’s only slightly hyperbolic to say that <mark>open source is one of the most notable collective successes</mark> of humankind as a species! It’s one of the few places where essentially all of humanity works together on something that benefits everyone. A world without open source would be substantially worse than the world we live&nbsp;in.</p>
  197. <p><cite><em><a data-link-domain="jacobian.org" href="https://jacobian.org/2024/feb/16/paying-maintainers-is-good/" hreflang="en"
  198. title="Consultation de l’article (anglais)">Paying people to work on open source is good actually</a>
  199. <a href="/david/cache/2024/ad0648259b032d4d0e5a9e6220c3c71e/" hreflang="en"
  200. data-tippy data-description="If you have a problem with maintainers getting paid then you have a problem with me and I suggest you let that one marinate."
  201. data-source="https://jacobian.org/2024/feb/16/paying-maintainers-is-good/"
  202. data-date="2024-02-17"
  203. data-favicon="https://jacobian.org/favicon.ico"
  204. data-domain="jacobian.org"
  205. ><svg xmlns="http://www.w3.org/2000/svg"
  206. width="24" height="24" viewBox="0 0 24 24" fill="none"
  207. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  208. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  209. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  210. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  211. </svg>
  212. <span class="sr-only">[archive]</span></a></em></cite></p>
  213. </blockquote>
  214. <p>J’ai déjà parlé <a href="/david/2024/01/18/" title="Open-source">d’open-source</a>, de <a href="/david/2024/01/31/" title="Mécénat">mécénat</a>, de <a href="/david/2024/02/09/" title="Version">versions</a>, de <a href="/david/2024/02/15/" title="Licence">licences</a>, mais comment se passe une <em>release</em> de produit&nbsp;open-source&#8239;?</p>
  215. <p>On commence à avoir affiné et <a data-link-domain="docs.umap-project.org" href="https://docs.umap-project.org/en/master/release/">documenté le processus</a>, on a <a data-link-domain="github.com" href="https://github.com/umap-project/umap-deploy-osmfr">des scripts dédiés</a> pour arriver à cela lorsque le moment est venu et nous sommes pour l’instant 2&nbsp;à pouvoir faire cela de bout en bout avec <a data-link-domain="yohanboniface.me" href="https://yohanboniface.me/">Yohan</a>. C’est peu mais c’est aussi +100% par rapport à l’année&nbsp;dernière…</p>
  216. <p>Nous n’étions pas très loin de repousser encore une fois la version&nbsp;2&nbsp;car il y avait un dernier changement majeur à faire passer. Tiraillés, nous avons repoussé cela à une version&nbsp;3&nbsp;quitte à ce qu’elle arrive prochainement. Franchir cette barrière psychologique était important pour la suite. Le faire en visio de bout en bout (comme une bonne partie de nos interactions sur le produit) était enthousiasmant. En bonus, c’était un vendredi&nbsp;après-midi.</p>
  217. <p>Voilà donc <a data-link-domain="docs.umap-project.org" href="https://docs.umap-project.org/en/master/changelog/#200-2024-02-16">un <em>changelog</em></a> déjà bien chargé. Nous nous sommes rendu compte au cours du processus que le versionnement était davantage pertinent pour les mainteneur·euses que pour les utilisateur·ices. Les fonctionnalités sont ajoutées au compte-goutte mais il faut prévenir les personnes qui vont mettre à jour l’outil de ce qui pourrait coincer lors du déploiement. Certains changements ont été volontaires (modules ESM =&gt; support navigateurs), d’autres contraints (fin du support de l’authification OpenStreetMap OAuth1), d’autres subis (Django&nbsp;5 =&gt; Python 3.10). Un beau&nbsp;mélange.</p>
  218. <p>Je ne vais rien annoncer pour une version&nbsp;3&nbsp;car ce serait ajouter une pression inutile et même si on a des intuitions tout est loin d’être priorisé. Dans mes motivations <em>personnelles</em>&nbsp;:</p>
  219. <ul>
  220. <li>aller vers une amélioration de&nbsp;l’accessibilité&#8239;;</li>
  221. <li>voir les <a data-link-domain="blog.notmyidea.org" href="https://blog.notmyidea.org/tag/umap.html">explorations d’Alexis</a> prendre&nbsp;forme&#8239;;</li>
  222. <li>clarifier les lieux de support / documentation en participant&nbsp;davantage.</li>
  223. </ul>
  224. <blockquote lang="en">
  225. <p>We have to accept the world as it is – even if it’s not the world we want. This means we have to be okay with the idea that maintainers need to be paid. Far too often I see arguments like: “<mark>maintainers shouldn’t be paid by private companies because the government should be supporting them.</mark>” Sure, this sounds great – but <em>governments aren’t doing this!</em> So this argument reduces to “open source maintainers shouldn’t be paid”. I can’t get on board with&nbsp;that.</p>
  226. <p><cite><em>Ibid.</em></cite></p>
  227. </blockquote>
  228. <p>Étant actuellement payé par l’Agence nationale de la cohésion des territoires pour participer à de l’<em>open-source</em>, je ne peux qu’approuver cette partie de la citation et être heureux de me trouver là où je suis. Les exceptions existent grâce à une conjonction de volontés, de privilèges et de coups de&nbsp;bol.</p>
  229. <a href="#hr-73" title="Lien vers cette section de la page"><hr id="hr-73" /></a>
  230. <blockquote lang="en">
  231. <p><a data-link-domain="github.com" href="https://github.com/astral-sh/uv">uv</a> represents a milestone in our pursuit of a “<a data-link-domain="blog.rust-lang.org" href="https://blog.rust-lang.org/2016/05/05/cargo-pillars.html#pillars-of-cargo">Cargo for Python</a>”: a comprehensive Python project and package manager that’s fast, reliable, and easy to&nbsp;use.</p>
  232. <p><cite><em><a data-link-domain="astral.sh" href="https://astral.sh/blog/uv" hreflang="en"
  233. title="Consultation de l’article (anglais)">uv: Python packaging in Rust</a>
  234. <a href="/david/cache/2024/359df603dbf60e8476027b2eb26cb7ce/" hreflang="en"
  235. data-tippy data-description="uv is an extremely fast Python package installer and resolver, designed as a drop-in alternative to pip and pip-tools."
  236. data-source="https://astral.sh/blog/uv"
  237. data-date="2024-02-17"
  238. data-favicon="https://astral.sh/static/favicon-32x32.png"
  239. data-domain="astral.sh"
  240. ><svg xmlns="http://www.w3.org/2000/svg"
  241. width="24" height="24" viewBox="0 0 24 24" fill="none"
  242. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  243. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  244. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  245. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  246. </svg>
  247. <span class="sr-only">[archive]</span></a></em></cite></p>
  248. </blockquote>
  249. <p>Un futur de Python se dessine et j’en apprécie les&nbsp;esquisses.</p>
  250. <nav>
  251. <p>
  252. <a href="/david/2024/commun/"
  253. title="Liste de tous les articles 2024 associés à cette étiquette"
  254. rel="tag">#commun</a>
  255. <a href="/david/2024/decision/"
  256. title="Liste de tous les articles 2024 associés à cette étiquette"
  257. rel="tag">#décision</a>
  258. <a href="/david/2024/opensource/"
  259. title="Liste de tous les articles 2024 associés à cette étiquette"
  260. rel="tag">#opensource</a>
  261. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  262. </p>
  263. </nav>
  264. <h2>
  265. <a href="/david/2024/02/15/" title="Lien permanent vers cet article">Licence</a> <time datetime="2024-02-15">15 février 2024</time>
  266. </h2>
  267. <blockquote lang="en">
  268. <p>Title: WTFPL Submission: http://crynwr.com/cgi-bin/ezmlm-cgi?17:mss:634:200902:aglgcgbhmfcheffmdgon License: http://sam.zoy.org/wtfpl/ Comments: It’s no different from dedication to the public domain. Author has submitted license approval request — author is free to make public domain dedication. Although he agrees with the recommendation, Mr. Michlmayr notes that <mark>public domain doesn’t exist in Europe.</mark> Recommend: Reject</p>
  269. <p><cite><em><a data-link-domain="opensource.org" href="https://opensource.org/meeting-minutes/minutes20090304/" hreflang="en"
  270. title="Consultation de l’article (anglais)">OSI Board Meeting Minutes, Wednesday, March 4, 2009</a>
  271. <a href="/david/cache/2024/90e6434dbda21f9d18ad8fa53c822b47/" hreflang="en"
  272. data-tippy data-description="Quorum reached and meeting called to order 08:10 am PST. Attendees Mr. Michael Tiemann, President Ms. Danese Cooper, Secretary and Treasurer Mr. Harshad Gune, Director Mr. Martin Michlmayr, Directo…"
  273. data-source="https://opensource.org/meeting-minutes/minutes20090304/"
  274. data-date="2024-02-17"
  275. data-favicon="https://i0.wp.com/opensource.org/wp-content/uploads/2023/01/cropped-cropped-OSI_Horizontal_Logo_0-e1674081292667.png?fit=32%2C32&ssl=1"
  276. data-domain="opensource.org"
  277. ><svg xmlns="http://www.w3.org/2000/svg"
  278. width="24" height="24" viewBox="0 0 24 24" fill="none"
  279. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  280. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  281. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  282. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  283. </svg>
  284. <span class="sr-only">[archive]</span></a></em></cite></p>
  285. </blockquote>
  286. <p>Nous sommes <a data-link-domain="github.com" href="https://github.com/umap-project/umap/pull/1605">passés</a> de la licence <a data-link-domain="wtfpl.net" href="http://www.wtfpl.net/">WTFPL</a> à <a data-link-domain="gnu.org" href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3</a> pour uMap à partir de la version&nbsp;2 (à venir). Notamment car elle n’était pas acceptable pour l’<a data-link-domain="opensource.org" href="https://opensource.org/">OSI</a> ce qui nous posait des problèmes pour obtenir des financements européen ou pour bénéficier des plans <em>open-source</em> de services comme <a data-link-domain="browserstack.com" href="https://www.browserstack.com/open-source">BrowserStack</a>.</p>
  287. <p>Le seul service qui a accepté la licence WTFPL sans broncher est <a data-link-domain="sentry.io" href="https://sentry.io/for/open-source/">Sentry</a>, ceci en un temps&nbsp;record.</p>
  288. <blockquote lang="en">
  289. <p>Simply put, the AGPLv3 is effectively the GPLv3, but with an additional licensing term that ensures that users who interact <mark>over a network</mark> with modified versions of the program can receive the source code for that&nbsp;program.</p>
  290. <p><cite><em><a data-link-domain="fsf.org" href="https://www.fsf.org/bulletin/2021/fall/the-fundamentals-of-the-agplv3" hreflang="en"
  291. title="Consultation de l’article (anglais)">The fundamentals of the AGPLv3</a>
  292. <a href="/david/cache/2024/036789c955419215be9d88c6823b55aa/" hreflang="en"
  293. data-tippy data-description="The GNU Affero General Public License version 3 (AGPLv3) is the most protective of computer user freedom, yet it remains the most misunderstood of the GNU family of licenses."
  294. data-source="https://www.fsf.org/bulletin/2021/fall/the-fundamentals-of-the-agplv3"
  295. data-date="2024-02-17"
  296. data-favicon="https://www.fsf.org/favicon.ico"
  297. data-domain="fsf.org"
  298. ><svg xmlns="http://www.w3.org/2000/svg"
  299. width="24" height="24" viewBox="0 0 24 24" fill="none"
  300. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  301. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  302. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  303. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  304. </svg>
  305. <span class="sr-only">[archive]</span></a></em></cite></p>
  306. </blockquote>
  307. <a href="#hr-72" title="Lien vers cette section de la page"><hr id="hr-72" /></a>
  308. <blockquote>
  309. <p>La prévalence des drogues chinoises, et synthétiques en général, sur le marché a eu des conséquences au Mexique voisin. Dans une vidéo de fin 2020, The Intercept montre que la baisse drastique de demande en héroïne au profit du fentanyl a des conséquences humaines considérables. «&nbsp;Les cultivateurs de pavot au Mexique doivent se résoudre à migrer pour travailler ou se tourner vers le crime organisé&nbsp;», raconte le média, partageant des témoignages de personnes précaires encore appauvries par la&nbsp;situation.</p>
  310. <p><cite><em><a data-link-domain="basta.media" href="https://basta.media/crise-des-opioides-pourquoi-il-ne-faut-ni-oublier-ni-ignorer" hreflang="fr"
  311. title="Consultation de l’article">Crise des opioïdes&nbsp;: pourquoi il ne faut ni l’oublier ni l’ignorer</a>
  312. <a href="/david/cache/2024/1929f7183f694c7abeafeddb891fcf50/" hreflang="fr"
  313. data-tippy data-description="Aux États-Unis, le nombre de morts par overdose dépasse celui des décès sur la route. La crise des opioïdes, déclarée dans les années 2010, touche aussi de plein fouet le Canada. Et le phénomène dépasse les frontières nord-américaines."
  314. data-source="https://basta.media/crise-des-opioides-pourquoi-il-ne-faut-ni-oublier-ni-ignorer"
  315. data-date="2024-02-17"
  316. data-favicon="https://basta.media/squelettes/basta/favicon/favicon.svg?1634019699"
  317. data-domain="basta.media"
  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></cite></p>
  326. </blockquote>
  327. <p>Je n’avais pas encore pris conscience de tous les enjeux socio-économico-géopolitiques de ces nouvelles drogues. Il y a des guerres qui sont moins médiatisées que&nbsp;d’autres.</p>
  328. <nav>
  329. <p>
  330. <a href="/david/2024/commun/"
  331. title="Liste de tous les articles 2024 associés à cette étiquette"
  332. rel="tag">#commun</a>
  333. <a href="/david/2024/decision/"
  334. title="Liste de tous les articles 2024 associés à cette étiquette"
  335. rel="tag">#décision</a>
  336. <a href="/david/2024/opensource/"
  337. title="Liste de tous les articles 2024 associés à cette étiquette"
  338. rel="tag">#opensource</a>
  339. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  340. </p>
  341. </nav>
  342. <h2>
  343. <a href="/david/2024/02/09/" title="Lien permanent vers cet article">Version</a> <time datetime="2024-02-09">9 février 2024</time>
  344. </h2>
  345. <p>Il y a cette appréhension à sortir une version&nbsp;2&nbsp;qui est bloquante sur pas mal de projets / produits / outils. Réduire ses ambitions quitte à planifier les versions 3&nbsp;et 4&nbsp;par la même occasion est un moyen de faire baisser la pression de ses propres attentes. Ce n’est plus <strong>l</strong>’évènement mais <em>un</em> évènement parmi les suivants qui vient s’intégrer dans une dynamique plus&nbsp;globale.</p>
  346. <p>Il y a d’un côté l’<a href="/david/2024/01/19/#hr-38">effort pour les personnes qui vont l’utiliser</a> et de l’autre <a data-link-domain="yolover.org" href="https://yolover.org/" hreflang="en"
  347. title="Consultation de l’article (anglais)">la motivation</a>
  348. <a href="/david/cache/2024/959374400b4bb6d58c74116ffd08281b/" hreflang="en"
  349. data-tippy data-description="Realistic versioning for modern software."
  350. data-source="https://yolover.org/"
  351. data-date="2024-02-09"
  352. data-favicon="https://yolover.org/favicon.png"
  353. data-domain="yolover.org"
  354. ><svg xmlns="http://www.w3.org/2000/svg"
  355. width="24" height="24" viewBox="0 0 24 24" fill="none"
  356. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  357. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  358. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  359. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  360. </svg>
  361. <span class="sr-only">[archive]</span></a> pour les personnes qui vont développer et maintenir le&nbsp;produit.</p>
  362. <p>Je caricature mais on est&nbsp;vendredi.</p>
  363. <nav>
  364. <p>
  365. <a href="/david/2024/apprentissage/"
  366. title="Liste de tous les articles 2024 associés à cette étiquette"
  367. rel="tag">#apprentissage</a>
  368. <a href="/david/2024/decision/"
  369. title="Liste de tous les articles 2024 associés à cette étiquette"
  370. rel="tag">#décision</a>
  371. <a href="/david/2024/opensource/"
  372. title="Liste de tous les articles 2024 associés à cette étiquette"
  373. rel="tag">#opensource</a>
  374. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  375. </p>
  376. </nav>
  377. <h2>
  378. <a href="/david/2024/02/07/" title="Lien permanent vers cet article">Écureuil</a> <time datetime="2024-02-07">7 février 2024</time>
  379. </h2>
  380. <p>De bon matin, en me brossant les dents, l’écureuil dans un micro-sommeil après une nuit fraîche. Je le regarde avec un peu d’envie, je referme la fenêtre délicatement. Une minute plus tard, alors qu’il commençait à piquer dangereusement du nez, le voilà déjà&nbsp;reparti.</p>
  381. <figure>
  382. <a href="/static/david/2024/2024-02-05-ecureuil-soleil.jpg"
  383. title="Cliquer pour une version haute résolution">
  384. <img
  385. src="/static/david/2024/2024-02-05-ecureuil-soleil.jpg"
  386. width="3456" height="2304"
  387. srcset="/static/david/2024/2024-02-05-ecureuil-soleil.jpg 3456w, /static/david/2024/2024-02-05-ecureuil-soleil_660x440.jpg 660w, /static/david/2024/2024-02-05-ecureuil-soleil_990x660.jpg 990w, /static/david/2024/2024-02-05-ecureuil-soleil_1320x880.jpg 1320w"
  388. sizes="min(100vw, calc(100vh * 3456 / 2304))"
  389. loading="lazy"
  390. decoding="async"
  391. alt="Un écureuil endormi sur une branche.">
  392. </a>
  393. <figcaption>Un écureuil endormi sur une&nbsp;branche.</figcaption>
  394. </figure>
  395. <a href="#hr-69" title="Lien vers cette section de la page"><hr id="hr-69" /></a>
  396. <p>Une motivation importante de l’année est de réussir à économiser. C’est une chose que je n’ai jamais vraiment envisagé de faire jusqu’à présent. Si j’ai bien compris le principe actuel, chaque dollar accumulé est un dollar que je n’aurai pas à payer une <em>seconde</em> fois à la&nbsp;banque.</p>
  397. <p>C’est stupide. Mais ça motive. Mais c’est&nbsp;stupide.</p>
  398. <a href="#hr-70" title="Lien vers cette section de la page"><hr id="hr-70" /></a>
  399. <figure>
  400. <a href="/static/david/2024/2024-02-05-ecureuil-superhero.jpg"
  401. title="Cliquer pour une version haute résolution">
  402. <img
  403. src="/static/david/2024/2024-02-05-ecureuil-superhero.jpg"
  404. width="3840" height="2560"
  405. srcset="/static/david/2024/2024-02-05-ecureuil-superhero.jpg 3840w, /static/david/2024/2024-02-05-ecureuil-superhero_660x440.jpg 660w, /static/david/2024/2024-02-05-ecureuil-superhero_990x660.jpg 990w, /static/david/2024/2024-02-05-ecureuil-superhero_1320x880.jpg 1320w"
  406. sizes="min(100vw, calc(100vh * 3840 / 2560))"
  407. loading="lazy"
  408. decoding="async"
  409. alt="Un écureuil en posture de super-héros·ïne.">
  410. </a>
  411. <figcaption>Un écureuil en posture de super-héros·ïne. (Iel a juste froid aux&nbsp;pattes.)</figcaption>
  412. </figure>
  413. <nav>
  414. <p>
  415. <a href="/david/2024/decision/"
  416. title="Liste de tous les articles 2024 associés à cette étiquette"
  417. rel="tag">#décision</a>
  418. <a href="/david/2024/foret/"
  419. title="Liste de tous les articles 2024 associés à cette étiquette"
  420. rel="tag">#forêt</a>
  421. <a href="/david/2024/photographie/"
  422. title="Liste de tous les articles 2024 associés à cette étiquette"
  423. rel="tag">#photographie</a>
  424. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  425. </p>
  426. </nav>
  427. <h2>
  428. <a href="/david/2024/01/18/" title="Lien permanent vers cet article">Open-source</a> <time datetime="2024-01-18">18 janvier 2024</time>
  429. </h2>
  430. <p>Deux phrases du&nbsp;jour&nbsp;:</p>
  431. <ol>
  432. <li><q lang="en">Open Source is the Right to Repair, for software.</q>, <a data-link-domain="macaw.social" href="https://macaw.social/@andypiper/111774169944729337">sur&nbsp;masto</a></li>
  433. <li><q lang="fr">uMap est-il un produit ou un commun&#8239;?</q>, en réunion&nbsp;interne</li>
  434. </ol>
  435. <p>Faute de temps, le développement est laissé comme exercice aux&nbsp;lecteur·ices.</p>
  436. <nav>
  437. <p>
  438. <a href="/david/2024/commun/"
  439. title="Liste de tous les articles 2024 associés à cette étiquette"
  440. rel="tag">#commun</a>
  441. <a href="/david/2024/decision/"
  442. title="Liste de tous les articles 2024 associés à cette étiquette"
  443. rel="tag">#décision</a>
  444. <a href="/david/2024/opensource/"
  445. title="Liste de tous les articles 2024 associés à cette étiquette"
  446. rel="tag">#opensource</a>
  447. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  448. </p>
  449. </nav>
  450. <h2>
  451. <a href="/david/2024/01/05/" title="Lien permanent vers cet article">Vocabulaire</a> <time datetime="2024-01-05">5 janvier 2024</time>
  452. </h2>
  453. <blockquote>
  454. <p>Les tensions et processer les tensions. Essayez de remplacer les termes «&nbsp;problèmes&nbsp;» et «&nbsp;solutions&nbsp;» par «&nbsp;tensions&nbsp;» et «&nbsp;processer&nbsp;». Les êtres humains semblent être enclins de manière innée à attendre la dernière minute pour gérer ce qu’ils perçoivent comme des problèmes. Par conséquent, l’emploi de ce langage «&nbsp;négatif&nbsp;» dans le monde de l’entreprise peut donner naissance à une culture de l’évitement ou de l’inquiétude inutile. Le terme «&nbsp;tension&nbsp;», comme employé en <em>Holacracy</em>, est neutre et signifie simplement <em>la perception d’un écart entre la réalité et ce qu’elle pourrait&nbsp;être.</em></p>
  455. <p>Une tension n’est pas un «&nbsp;problème&nbsp;» et n’induit pas nécessairement une «&nbsp;solution&nbsp;». Elle met en lumière une occasion de rapprocher la situation actuelle de ce qu’elle pourrait être — ce qui sous-entend généralement une amélioration. <mark>Holacracy emploie le terme «&nbsp;processer&nbsp;» pour décrire ce phénomène, qui évite la notion de résultat fixe et définitif et illustre un cheminement fait d’une adaptation et de progrès&nbsp;permanents.</mark></p>
  456. <p>Des propositions plutôt que des problèmes. Le changement qui va de pair avec celui que je viens de décrire est de prendre l’habitude de faire des «&nbsp;propositions&nbsp;» au lieu de se contenter de se lamenter. Lorsque vous ressentez une tension, demandez-vous&nbsp;: «&nbsp;Qu’est-ce qui pourrait améliorer la situation&#8239;? Que pourrais-je proposer&#8239;?&nbsp;» Encouragez votre équipe à en faire de même. La proposition ne se doit pas d’être une «&nbsp;solution&nbsp;» parfaite — c’est un moyen d’entamer la conversation de manière proactive et créative, et non&nbsp;négative.</p>
  457. <p><cite><em>La révolution Holacracy</em>, Brian J. Robertson, chapitre «&nbsp;Changez votre langage, changez votre&nbsp;culture&nbsp;»</cite></p>
  458. </blockquote>
  459. <p>On pourrait y voir de la <a data-link-domain="fr.wikipedia.org" href="https://fr.wikipedia.org/wiki/Novlangue">novlangue</a> de <em>manager</em> mais il y a cette idée derrière qu’on ne tente pas de résoudre un problème mais de libérer —&nbsp;peut-être temporairement&nbsp;— une tension qui me plait bien. Ce que l’on aborde alors ensemble ce sont les actions qui nous semblent aller vers <em>un</em> mieux parmi l’arbre des possibles. L’enjeu d’un collectif qui se respecte est de trouver la légitimité individuelle nécessaire pour continuer à explorer des pistes ne faisant pas forcément l’unanimité lors d’une première itération. <em>Holacratie</em> semble mettre des règles explicites sur ces&nbsp;pratiques.</p>
  460. <p>J’apprécie particulièrement le couple proposition / objections. Difficile de sortir d’une forme de confort une fois celui-ci établi. Peut-être que le <em>refus de confort</em> pourrait être une notion au même titre que le <a href="/david/2020/10/08/"><em>refus de parvenir</em></a>&#8239;? Accepter le risque de l’inconnu pour ne pas se perdre dans un hier déjà expérimenté, déjà&nbsp;dé·fini.</p>
  461. <blockquote>
  462. <p>Des objections&#8239;? La prochaine fois que vous recherchez l’adhésion de votre équipe à une décision, modifiez votre mode de communication. Ne demandez pas&nbsp;: «&nbsp;Est-ce que tout le monde est d’accord&#8239;?&nbsp;» ou «&nbsp;Ma proposition plaît-elle à tout le monde&#8239;?&nbsp;». Ces questions débouchent sur une discussion longue et pénible. Demandez-leur plutôt&nbsp;: <mark>«&nbsp;Y a-t-il des objections à l’adoption de cette proposition&#8239;?&nbsp;»</mark> Et définissez une objection comme «&nbsp;une raison pour laquelle l’adoption de cette proposition causerait du tort ou nous ferait&nbsp;régresser&#8239;?&nbsp;»</p>
  463. <p>Voici une autre formulation&nbsp;: «&nbsp;Est-ce que quelqu’un considère la mise en œuvre de cette proposition comme pas assez sûre, sachant que nous pourrons revoir cette décision si elle ne porte pas ses fruits&#8239;?&nbsp;» Ce simple changement de langage peut vous faire gagner beaucoup de temps et alléger considérablement le processus&nbsp;décisionnel.</p>
  464. <p><cite><em>Ibid.</em></cite></p>
  465. </blockquote>
  466. <a href="#hr-7" title="Lien vers cette section de la page"><hr id="hr-7" /></a>
  467. <p><a data-link-domain="piaille.fr" href="https://piaille.fr/@nicosomb/111696724396676161">Nicolas L.</a> et <a data-link-domain="mamot.fr" href="https://mamot.fr/@nhoizey/111697128068526484">Nicolas H.</a> me font des retours sur le nouveau design en passant par Mastodon. Les choix respectifs de chacun·e de rendre les réponses publiques ou non enlèvent une partie des échanges mais c’est vraiment chouette d’entamer un processus d’amélioration (de libération de tensions&#8239;?) en commun à ce&nbsp;sujet.</p>
  468. <p>J’essaye de rendre l’épaisseur du soulignement des liens dynamique, lié à la fluidité de la taille du texte&nbsp;🧑‍🔬, peut-être que je devrais rendre la taille des bordures dynamiques aussi&#8239;? Parfois la contrainte technique peut devenir une contrainte éditoriale acceptable. <strong>Cet espace est suffisamment sur-pensé comme&nbsp;ça.</strong></p>
  469. <p>Je commence un thème sombre qui réagit à celui du système d’exploitation par défaut. Surtout pour un besoin personnel pour l’instant, mes yeux en ont besoin. Cela me pousse à ajouter des variables CSS pour les&nbsp;couleurs.</p>
  470. <p>Plus tard, <a data-link-domain="mamot.fr" href="https://mamot.fr/@emmanuelc/111700432836997597">Emmanuel</a> m’enlève une épine du pied sur une formule de grille que je ne comprenais pas totalement. J’apprends des choses au passage. Le copier-coller&#8239;? Oui, mais il faudra toujours finir par le&nbsp;décortiquer.</p>
  471. <p>La CSS progresse, 426&nbsp;lignes ce soir… et un seul <code>breakpoint</code> défini pour forcer une variable maximale sur les grands écrans. J’aime bien cette&nbsp;idée.</p>
  472. <a href="#hr-8" title="Lien vers cette section de la page"><hr id="hr-8" /></a>
  473. <p>Randonnée de 8&#8239;km en famille aujourd’hui, parfois je ne me rends plus trop compte des distances —&nbsp;qui plus est sur un sol difficile. Je voulais surtout savoir jusqu’à quels refuges je pouvais envisager des aventures avec l’enfant dans des conditions hivernales. Chaque année, de nouveaux horizons&nbsp;s’ouvrent.</p>
  474. <a href="#hr-9" title="Lien vers cette section de la page"><hr id="hr-9" /></a>
  475. <blockquote>
  476. <p>— Comment appelle-t-on un groupe de faisans&#8239;? demande Anna.<br />
  477. — Un bouquet, répond Isobel. Un groupe d’étourneaux&#8239;?<br />
  478. — Un murmure.<br />
  479. — De flamants&#8239;?<br />
  480. — Une flamboyance de flamants. De hiboux&#8239;?<br />
  481. Isobel hésite. Sans lever les yeux de son livre, Emily répond à sa place&nbsp;:<br />
  482. — On dit un parlement de hiboux.<br />
  483. — Très bien. Plus difficile alors. Comment appelle-t-on un groupe d’alouettes&#8239;?<br />
  484. — Une exaltation.<br />
  485. — Et de papillons&#8239;?<br />
  486. — Un kaléidoscope de&nbsp;papillons.</p>
  487. <p><cite><em>Alors nous irons trouver la beauté ailleurs</em>, Corinne Morel Darleux citant Dominique Fortier sur Emily Dickinson, <em>Les Villes de&nbsp;papiers</em></cite></p>
  488. </blockquote>
  489. <p>💚 Quand l’ornithologie fait de la&nbsp;poésie.</p>
  490. <nav>
  491. <p>
  492. <a href="/david/2024/apprentissage/"
  493. title="Liste de tous les articles 2024 associés à cette étiquette"
  494. rel="tag">#apprentissage</a>
  495. <a href="/david/2024/decision/"
  496. title="Liste de tous les articles 2024 associés à cette étiquette"
  497. rel="tag">#décision</a>
  498. <a href="/david/2024/equipe/"
  499. title="Liste de tous les articles 2024 associés à cette étiquette"
  500. rel="tag">#équipe</a>
  501. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  502. </p>
  503. </nav>
  504. <form action="/david/recherche/" method="get">
  505. <fieldset>
  506. <legend>Recherche</legend>
  507. <label for="input-search">Termes de votre recherche :</label>
  508. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  509. <input type="submit" value="Chercher">
  510. <p id="indexation-infos">
  511. <small>
  512. Seuls les contenus de ces 8 dernières années sont indexés.
  513. </small>
  514. </p>
  515. </fieldset>
  516. </form>
  517. <aside>
  518. <theme-toggle></theme-toggle>
  519. </aside>
  520. </article>
  521. <hr>
  522. <footer>
  523. <p>
  524. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  525. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  526. <a href="http://larlet.com"
  527. title="Go to my English profile"
  528. data-instant>Pro</a>
  529. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  530. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  531. </p>
  532. <template id="theme-selector">
  533. <form>
  534. <style type="text/css">
  535. fieldset div {
  536. text-align: center;
  537. }
  538. </style>
  539. <fieldset>
  540. <legend>Thème</legend>
  541. <div>
  542. <label>
  543. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  544. Auto
  545. </label>
  546. <label>
  547. <input type="radio" value="dark" name="chosen-color-scheme">
  548. Foncé
  549. </label>
  550. <label>
  551. <input type="radio" value="light" name="chosen-color-scheme">
  552. Clair
  553. </label>
  554. </div>
  555. </fieldset>
  556. </form>
  557. </template>
  558. </footer>
  559. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  560. <script>
  561. class ThemeToggle extends HTMLElement {
  562. constructor() {
  563. super()
  564. const themeSelectorTemplate = document.querySelector('#theme-selector')
  565. const form = themeSelectorTemplate.content.firstElementChild
  566. this.attachShadow({ mode: 'open' })
  567. this.shadowRoot.appendChild(form.cloneNode(true))
  568. }
  569. connectedCallback() {
  570. const form = this.shadowRoot.querySelector('form')
  571. form.addEventListener('change', (e) => {
  572. const chosenColorScheme = e.target.value
  573. localStorage.setItem('theme', chosenColorScheme)
  574. toggleTheme(chosenColorScheme)
  575. })
  576. const selectedTheme = localStorage.getItem('theme')
  577. if (selectedTheme && selectedTheme !== 'undefined') {
  578. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  579. }
  580. }
  581. }
  582. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  583. window.addEventListener('load', () => {
  584. let colorsLayer = undefined
  585. let hasDarkRules = false
  586. for (const styleSheet of Array.from(document.styleSheets)) {
  587. let mediaRules = []
  588. for (const layerRule of styleSheet.cssRules) {
  589. if (!(layerRule instanceof CSSLayerBlockRule)) {
  590. continue
  591. }
  592. if (layerRule.name === 'colors') {
  593. colorsLayer = layerRule
  594. }
  595. for (const cssRule of layerRule.cssRules) {
  596. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  597. continue
  598. }
  599. // WARNING: Safari does not have/supports `conditionText`.
  600. if (cssRule.conditionText) {
  601. if (cssRule.conditionText !== prefersColorSchemeDark) {
  602. continue
  603. }
  604. } else {
  605. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  606. continue
  607. }
  608. }
  609. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  610. }
  611. }
  612. // WARNING: do not try to insert a Rule to a styleSheet you are
  613. // currently iterating on, otherwise the browser will be stuck
  614. // in a infinite loop…
  615. for (const mediaRule of mediaRules) {
  616. // Safari requires the `0` second parameter (even if default).
  617. colorsLayer.insertRule(mediaRule.cssText, 0)
  618. hasDarkRules = true
  619. }
  620. }
  621. if (hasDarkRules) {
  622. if ('customElements' in window && !customElements.get('theme-toggle')) {
  623. customElements.define('theme-toggle', ThemeToggle)
  624. }
  625. }
  626. })
  627. </script>
  628. </body>
  629. </html>