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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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. Technocritique
  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="Given the extreme connectivity constraints at the South Pole, I wrote a Python script for publishing to S3 that worked well in the challenging environment. It uses the S3 API to upload assets in small chunks. It detects and resumes failed uploads without losing progress. It waits until everything is safely uploaded before publishing the new version.">
  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>Technocritique</h1>
  136. <p>Le <time datetime="2024-05-31">31 mai 2024</time></p>
  137. </hgroup>
  138. </header>
  139. <nav>
  140. <p>
  141. <a rel="prev"
  142. href="/david/2024/05/24/"
  143. title="Publication précédente : Tout">← 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/06/06/"
  150. title="Publication suivante : Sensibilité">Suivant →</a>
  151. </p>
  152. </nav>
  153. <blockquote lang="en">
  154. <p>Given the extreme connectivity constraints at the South Pole, I wrote a Python script for publishing to S3 that worked well in the challenging environment. It uses the S3 API to upload assets in small chunks. It detects and resumes failed uploads without losing progress. It waits until everything is safely uploaded before publishing the new&nbsp;version.</p>
  155. <p>If I can do it, unpaid, working alone, for my silly little hobby blog, in 200&nbsp;lines of Python… <mark>surely your team of engineers can do so</mark> for your flagship&nbsp;webapp.</p>
  156. <p><cite><em><a data-link-domain="brr.fyi" href="https://brr.fyi/posts/engineering-for-slow-internet" hreflang="en"
  157. title="Consultation de l’article (anglais)">Engineering for Slow Internet</a>
  158. <a href="/david/cache/2024/9e9c6f97d732010e14201f1624782ddc/" hreflang="en"
  159. data-tippy data-description="How to minimize user frustration in Antarctica."
  160. data-source="https://brr.fyi/posts/engineering-for-slow-internet"
  161. data-date="2024-05-31"
  162. data-favicon="https://brr.fyi/favicon-32x32.png"
  163. data-domain="brr.fyi"
  164. ><svg xmlns="http://www.w3.org/2000/svg"
  165. width="24" height="24" viewBox="0 0 24 24" fill="none"
  166. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  167. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  168. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  169. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  170. </svg>
  171. <span class="sr-only">[archive]</span></a></em></cite></p>
  172. </blockquote>
  173. <p>En ce moment, suite à une mise à jour de l’application SONOS rendant mes enceintes inutilisables (n’achetez jamais cette marque…), je m’amuse à faire une interface web grâce au <a data-link-domain="github.com" href="https://github.com/avantrec/soco-cli/">serveur open-source</a> qui a été développé ces dernières&nbsp;années.</p>
  174. <p>C’est triste d’en arriver là, je ressens fort le pouvoir que me procurent mes capacités de développeur mais je sais aussi que la majorité subit l’emmerdification logicielle (c’était déjà pas terrible avant&#8239;!) sans avoir d’autre&nbsp;option.</p>
  175. <p>Ce n’est pas encore prêt à être utilisable par d’autres mais c’est stimulant d’ajouter des fonctionnalités au fil des besoins locaux. Je réalise à quel point le manque de réactivité de l’app de 175Mo n’est pas liée au <em>hardware</em> vu que j’arrive à avoir quelque chose d’immédiat avec quelques lignes de Python +&nbsp;JS/HTML.</p>
  176. <blockquote lang="en">
  177. <p>The <strong>only way</strong> I was able to get this done was by <strong>turning off the phone entirely</strong>, right before Internet access dropped, and then turning it back on when Internet access resumed at the next satellite pass. This tricked the phone into not giving up on the download, because it was totally off during the period without Internet. It never had a chance to fail. By doing this, I was able to spread out the download across multiple satellite passes, and I could complete the&nbsp;download.</p>
  178. <p>This is an absurd workaround! I should not have had to do&nbsp;this.</p>
  179. <p><cite><em>Ibid.</em></cite></p>
  180. </blockquote>
  181. <a href="#hr-175" title="Lien vers cette section de la page"><hr id="hr-175" /></a>
  182. <blockquote>
  183. <p>À chaque technologie qu’on vous propose, qui émerge dans le champ commercial, il s’agit toujours de se demander&nbsp;: en quoi cette tech va-t-elle nourrir ou appauvrir mon rapport aux autres, au monde et à moi-même&#8239;? Il est très facile de mesurer le pouvoir qu’une appli ou qu’un service numérique apporte, beaucoup plus insidieux de réaliser ce qu’elle nous fait perdre ou même dégrade dans nos relations et nos puissances propres&nbsp;: puissance de créer, de réfléchir, d’imaginer, d’être empathique, d’écouter, puissance physique de ressentir par soi-même, de se déplacer, de garder son énergie, etc.</p>
  184. <p><mark>La technocritique doit discriminer pouvoir (le faire faire) et puissance (le faire par soi-même, en autonomie),</mark> ouverture ou fermeture au monde, enrichissement ou effilochement des liens, impact sur l’écologie en amont et en aval, exhaustion des ressources, impacts sociaux sur les pays en développement, pollutions induites, pour notre Terre — mais aussi dans nos cerveaux avec le siphonnage permanent de notre attention, de nos temps libres par le numérique. Et elle doit aussi se demander&nbsp;: quels désirs doit-on encourager&#8239;? Quelle liberté ou émancipation la techno doit-elle nous aider à atteindre&#8239;? Le peut-elle seulement, et dans quel contexte&nbsp;d’usage&#8239;?</p>
  185. <p><cite><em><a data-link-domain="bonpote.com" href="https://bonpote.com/on-a-besoin-de-pirates-pour-saboter-les-datacenters-damazon-pour-bloquer-les-plateformes-duber-ou-de-airbnb/" hreflang="fr"
  186. title="Consultation de l’article">«&nbsp;On a besoin de pirates pour saboter les datacenters d’Amazon, pour bloquer les plateformes d’Uber ou de Airbnb&nbsp;»</a>
  187. <a href="/david/cache/2024/02acbf716d95797a371706c8983d6164/" hreflang="fr"
  188. data-tippy data-description="La Silicon Valley n’est qu’à la marge soucieuse de l’écologie. Mais c’est aussi qu’elle croit profondément au solutionnisme techno pour"
  189. data-source="https://bonpote.com/on-a-besoin-de-pirates-pour-saboter-les-datacenters-damazon-pour-bloquer-les-plateformes-duber-ou-de-airbnb/"
  190. data-date="2024-05-31"
  191. data-favicon="https://bonpote.com/wp-content/uploads/2024/01/ezez_1.ico"
  192. data-domain="bonpote.com"
  193. ><svg xmlns="http://www.w3.org/2000/svg"
  194. width="24" height="24" viewBox="0 0 24 24" fill="none"
  195. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  196. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  197. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  198. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  199. </svg>
  200. <span class="sr-only">[archive]</span></a></em></cite></p>
  201. </blockquote>
  202. <p><del>Martine</del> Alain aux&nbsp;US.</p>
  203. <a href="#hr-176" title="Lien vers cette section de la page"><hr id="hr-176" /></a>
  204. <blockquote lang="en">
  205. <p>Google utilizes cookie history, logged-in Chrome data, and pattern detection (referred to in the leak as “unsquashed” clicks versus “squashed” clicks) as effective means for fighting manual &amp; automated click spam. […]</p>
  206. <p>My anonymous source claimed that way back in 2005, <mark>Google wanted the full clickstream of billions of Internet users, and with Chrome, they’ve now got it.</mark> The API documents suggest Google calculates several types of metrics that can be called using Chrome views related to both individual pages and entire&nbsp;domains.</p>
  207. <p>This document, describing the features around how Google creates Sitelinks, is particularly interesting. It showcases a call named topUrl, which is “A list of top urls with highest two_level_score, i.e., chrome_trans_clicks.” My read is that Google likely uses the number of clicks on pages in Chrome browsers and uses that to determine the most popular/important URLs on a site, which go into the calculation of which to include in the sitelinks&nbsp;feature.</p>
  208. <p><cite><em><a data-link-domain="sparktoro.com" href="https://sparktoro.com/blog/an-anonymous-source-shared-thousands-of-leaked-google-search-api-documents-with-me-everyone-in-seo-should-see-them/" hreflang="en"
  209. title="Consultation de l’article (anglais)">An Anonymous Source Shared Thousands of Leaked Google Search API Documents with Me; Everyone in SEO Should See Them</a>
  210. <a href="/david/cache/2024/2eba81418d244e79cef08638976dbeae/" hreflang="en"
  211. data-tippy data-description="On Sunday, May 5th, I received an email from a person claiming to have access to a massive leak of API documentation from inside Google’s Search division."
  212. data-source="https://sparktoro.com/blog/an-anonymous-source-shared-thousands-of-leaked-google-search-api-documents-with-me-everyone-in-seo-should-see-them/"
  213. data-date="2024-05-31"
  214. data-favicon="https://sparktoro.com/favicon.ico"
  215. data-domain="sparktoro.com"
  216. ><svg xmlns="http://www.w3.org/2000/svg"
  217. width="24" height="24" viewBox="0 0 24 24" fill="none"
  218. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  219. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  220. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  221. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  222. </svg>
  223. <span class="sr-only">[archive]</span></a></em></cite></p>
  224. </blockquote>
  225. <p>Ce qui est bien avec les produits Google c’est qu’on n’est jamais&nbsp;surpris.</p>
  226. <a href="#hr-177" title="Lien vers cette section de la page"><hr id="hr-177" /></a>
  227. <blockquote>
  228. <p>En prenant un tout petit peu de recul Josh se rend compte que cette troupe ne comprend pas vraiment ce qu’est le Bluetooth, son fonctionnement SANS FIL justement. Josh a de son côté pris part à des développement dans ce format au cours de son activité professionnelle. Il a même remonté des bugs rencontrés sur ce format à Ericsson au début des années 2000. <mark>Comment, avec un diplôme d’informatique en poche, Josh peut-il avoir tord</mark> et comment ces gens qui ne comprennent pas le fonctionnement du Bluetooth peuvent-ils avoir&nbsp;raison&#8239;?</p>
  229. <p><cite><em><a data-link-domain="minimachines.net" href="https://www.minimachines.net/actu/casque-apple-lightning-bluetooth-127339" hreflang="fr"
  230. title="Consultation de l’article">L’aventurier du casque Bluetooth maudit</a>
  231. <a href="/david/cache/2024/acf33204fda8c91ac054bb26f99e8c59/" hreflang="fr"
  232. data-tippy data-description="Cette histoire est un témoignage étonnant d'un internaute qui ne comprend plus comment le Bluetooth - et notre monde - fonctionnent."
  233. data-source="https://www.minimachines.net/actu/casque-apple-lightning-bluetooth-127339"
  234. data-date="2024-05-31"
  235. data-favicon="https://www.minimachines.net/wp-content/uploads/2012/09/favicon1.png"
  236. data-domain="minimachines.net"
  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></em></cite></p>
  245. </blockquote>
  246. <p>Cette histoire peut être lue avec tellement d’angles —&nbsp;et de biais&nbsp;— possibles. Je me demande quel serait le bilan carbone des deux options sur du long terme en tenant compte de la production, du transport, de la durabilité, de la consommation, etc.</p>
  247. <a href="#hr-178" title="Lien vers cette section de la page"><hr id="hr-178" /></a>
  248. <blockquote lang="en">
  249. <p>This approach serves as a reminder of the constantly changing tactics of cybercriminals and, unfortunately, illustrates why you can never blindly trust what someone shares&nbsp;online.</p>
  250. <p>Instead, <mark>developers must verify the source of all packages they add to their projects,</mark> and even if it feels trustworthy, check the code (with word wrap enabled) for unusual or obfuscated commands that will be&nbsp;executed.</p>
  251. <p><cite><em><a data-link-domain="bleepingcomputer.com" href="https://www.bleepingcomputer.com/news/security/cybercriminals-pose-as-helpful-stack-overflow-users-to-push-malware/" hreflang="en"
  252. title="Consultation de l’article (anglais)">Cybercriminals pose as “helpful” Stack Overflow users to push malware</a>
  253. <a href="/david/cache/2024/1bff60d11f3a030aa5b3d1da84dce189/" hreflang="en"
  254. data-tippy data-description="Cybercriminals are abusing Stack Overflow in an interesting approach to spreading malware&mdash;answering users&#039; questions by promoting a malicious PyPi package that installs Windows information-stealing malware."
  255. data-source="https://www.bleepingcomputer.com/news/security/cybercriminals-pose-as-helpful-stack-overflow-users-to-push-malware/"
  256. data-date="2024-05-31"
  257. data-favicon="https://www.bleepstatic.com/favicon/bleeping.ico"
  258. data-domain="bleepingcomputer.com"
  259. ><svg xmlns="http://www.w3.org/2000/svg"
  260. width="24" height="24" viewBox="0 0 24 24" fill="none"
  261. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  262. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  263. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  264. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  265. </svg>
  266. <span class="sr-only">[archive]</span></a></em></cite></p>
  267. </blockquote>
  268. <p>Bon&nbsp;courage.</p>
  269. <a href="#hr-179" title="Lien vers cette section de la page"><hr id="hr-179" /></a>
  270. <blockquote>
  271. <p>J’ai appris qu’un produit beau avec des erreurs fonc­tionne mieux qu’un produit moche sans erreurs. <mark>C’est contre-intui­tif pour moi et pas dans mes attentes mais c’est la réalité du terrain.</mark> J’ai appris qu’au-delà du <em>beau</em>, l’ex­pé­rience utili­sa­teur dans la mani­pu­la­tion des inter­faces était une vraie exper­tise qui faisait toute la diffé­rence. J’ai appris que l’adé­qua­tion aux besoins métier primait encore plus sur tout&nbsp;ça.</p>
  272. <p><cite><em><a data-link-domain="n.survol.fr" href="https://n.survol.fr/n/quick-n-dirty" hreflang="fr"
  273. title="Consultation de l’article">Quick ‘n dirty - Carnet de notes</a>
  274. <a href="/david/cache/2024/23c807abc870219e09f41f92bc869d37/" hreflang="fr"
  275. data-tippy data-description="J'ai appris.En bon ingénieur j'ai beaucoup poussé l'idée qu'il faut un produit très bien foutu, sans erreur, sans zone d'ombre, performant et que, quand tout ça va, les utilisateurs vont ven"
  276. data-source="https://n.survol.fr/n/quick-n-dirty"
  277. data-date="2024-05-31"
  278. data-favicon=""
  279. data-domain="n.survol.fr"
  280. ><svg xmlns="http://www.w3.org/2000/svg"
  281. width="24" height="24" viewBox="0 0 24 24" fill="none"
  282. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  283. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  284. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  285. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  286. </svg>
  287. <span class="sr-only">[archive]</span></a></em></cite></p>
  288. </blockquote>
  289. <p>Oui. J’ai appris cela&nbsp;aussi.</p>
  290. <p>J’ai même appris que des gué-guerres politiques internes pouvaient sabrer la meilleure des&nbsp;techniques.</p>
  291. <nav>
  292. <p>
  293. <a href="/david/2024/apprentissage/"
  294. title="Liste de tous les articles 2024 associés à cette étiquette"
  295. rel="tag">#apprentissage</a>
  296. <a href="/david/2024/deception/"
  297. title="Liste de tous les articles 2024 associés à cette étiquette"
  298. rel="tag">#déception</a>
  299. <a href="/david/2024/dystopie/"
  300. title="Liste de tous les articles 2024 associés à cette étiquette"
  301. rel="tag">#dystopie</a>
  302. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  303. </p>
  304. </nav>
  305. <nav>
  306. <p>
  307. <a rel="prev"
  308. href="/david/2024/05/24/"
  309. title="Publication précédente : Tout">← Précédent</a> •
  310. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  311. • <a rel="next"
  312. href="/david/2024/06/06/"
  313. title="Publication suivante : Sensibilité">Suivant →</a>
  314. </p>
  315. </nav>
  316. <form action="/david/recherche/" method="get">
  317. <fieldset>
  318. <legend>Recherche</legend>
  319. <label for="input-search">Termes de votre recherche :</label>
  320. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  321. <input type="submit" value="Chercher">
  322. <p id="indexation-infos">
  323. <small>
  324. Seuls les contenus de ces 8 dernières années sont indexés.
  325. </small>
  326. </p>
  327. </fieldset>
  328. </form>
  329. <aside>
  330. <theme-toggle></theme-toggle>
  331. </aside>
  332. </article>
  333. <hr>
  334. <footer>
  335. <p>
  336. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  337. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  338. <a href="http://larlet.com"
  339. title="Go to my English profile"
  340. data-instant>Pro</a>
  341. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  342. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  343. </p>
  344. <template id="theme-selector">
  345. <form>
  346. <style type="text/css">
  347. fieldset div {
  348. text-align: center;
  349. }
  350. </style>
  351. <fieldset>
  352. <legend>Thème</legend>
  353. <div>
  354. <label>
  355. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  356. Auto
  357. </label>
  358. <label>
  359. <input type="radio" value="dark" name="chosen-color-scheme">
  360. Foncé
  361. </label>
  362. <label>
  363. <input type="radio" value="light" name="chosen-color-scheme">
  364. Clair
  365. </label>
  366. </div>
  367. </fieldset>
  368. </form>
  369. </template>
  370. </footer>
  371. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  372. <script>
  373. class ThemeToggle extends HTMLElement {
  374. constructor() {
  375. super()
  376. const themeSelectorTemplate = document.querySelector('#theme-selector')
  377. const form = themeSelectorTemplate.content.firstElementChild
  378. this.attachShadow({ mode: 'open' })
  379. this.shadowRoot.appendChild(form.cloneNode(true))
  380. }
  381. connectedCallback() {
  382. const form = this.shadowRoot.querySelector('form')
  383. form.addEventListener('change', (e) => {
  384. const chosenColorScheme = e.target.value
  385. localStorage.setItem('theme', chosenColorScheme)
  386. toggleTheme(chosenColorScheme)
  387. })
  388. const selectedTheme = localStorage.getItem('theme')
  389. if (selectedTheme && selectedTheme !== 'undefined') {
  390. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  391. }
  392. }
  393. }
  394. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  395. window.addEventListener('load', () => {
  396. let colorsLayer = undefined
  397. let hasDarkRules = false
  398. for (const styleSheet of Array.from(document.styleSheets)) {
  399. let mediaRules = []
  400. for (const layerRule of styleSheet.cssRules) {
  401. if (!(layerRule instanceof CSSLayerBlockRule)) {
  402. continue
  403. }
  404. if (layerRule.name === 'colors') {
  405. colorsLayer = layerRule
  406. }
  407. for (const cssRule of layerRule.cssRules) {
  408. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  409. continue
  410. }
  411. // WARNING: Safari does not have/supports `conditionText`.
  412. if (cssRule.conditionText) {
  413. if (cssRule.conditionText !== prefersColorSchemeDark) {
  414. continue
  415. }
  416. } else {
  417. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  418. continue
  419. }
  420. }
  421. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  422. }
  423. }
  424. // WARNING: do not try to insert a Rule to a styleSheet you are
  425. // currently iterating on, otherwise the browser will be stuck
  426. // in a infinite loop…
  427. for (const mediaRule of mediaRules) {
  428. // Safari requires the `0` second parameter (even if default).
  429. colorsLayer.insertRule(mediaRule.cssText, 0)
  430. hasDarkRules = true
  431. }
  432. }
  433. if (hasDarkRules) {
  434. if ('customElements' in window && !customElements.get('theme-toggle')) {
  435. customElements.define('theme-toggle', ThemeToggle)
  436. }
  437. }
  438. })
  439. </script>
  440. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  441. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  442. <script>
  443. tippy('[data-tippy]', {
  444. content(reference) {
  445. reference.addEventListener('click', (e) => e.preventDefault())
  446. return `
  447. <h3 lang="fr">
  448. <img src="${reference.dataset.favicon}" loading="lazy">
  449. <a href="${reference.dataset.source}"
  450. >Article sur ${reference.dataset.domain}</a></h3>
  451. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  452. <div class="tippy-links" lang="fr">
  453. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  454. </div>
  455. `
  456. },
  457. allowHTML: true,
  458. interactive: true,
  459. delay: [150, 700],
  460. hideOnClick: false
  461. })
  462. </script>
  463. <script type="module">
  464. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  465. const markObserver = new IntersectionObserver((entries, observer) => {
  466. const computedStyle = getComputedStyle(document.documentElement)
  467. const markBackground = computedStyle.getPropertyValue('--mark-background')
  468. for (const entry of entries) {
  469. if (entry.intersectionRatio === 0) continue
  470. const markElement = entry.target
  471. markElement.style.backgroundColor = 'inherit'
  472. const annotation = annotate(
  473. markElement, {
  474. type: 'highlight',
  475. multiline: true,
  476. color: markBackground,
  477. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  478. animate: false
  479. }
  480. )
  481. annotation.show()
  482. observer.unobserve(markElement)
  483. }
  484. }, {threshold: 1.0})
  485. for (const markElement of document.querySelectorAll('mark')) {
  486. markObserver.observe(markElement)
  487. }
  488. </script>
  489. </body>
  490. </html>