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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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. PageCrypt
  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="J’y ai passé ma soirée mais j’ai un truc qui fonctionne pour une démo. Ça ressemble beaucoup à un patchwork de bouts de code récupérés ici et là puis aussi là pour la partie Python.">
  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. <!-- To get attribution when linking on mastodon. -->
  106. <meta name="fediverse:creator" content="@david@larlet.fr">
  107. <style type="text/css">
  108. .tippy-content {
  109. min-width: 280px;
  110. padding: .5rem;
  111. font-size: calc(var(--fluid-0) * 0.8);
  112. font-family: var(--labor-font);
  113. letter-spacing: initial;
  114. text-align: left;
  115. }
  116. .tippy-content h3 {
  117. margin-top: 0;
  118. }
  119. .tippy-content h3 img {
  120. max-width: 2rem;
  121. max-height: 2rem;
  122. display: inline-block;
  123. }
  124. .tippy-content .tippy-links {
  125. display: flex;
  126. justify-content: space-around;
  127. }
  128. .tippy-content a {
  129. padding: .4rem;
  130. color: #F06048;
  131. }
  132. </style>
  133. <body data-instant-intensity="viewport-all">
  134. <article>
  135. <header>
  136. <hgroup>
  137. <h1>PageCrypt</h1>
  138. <p>Le <time datetime="2024-03-20">20 mars 2024</time></p>
  139. </hgroup>
  140. </header>
  141. <nav>
  142. <p>
  143. <a rel="prev"
  144. href="/david/2024/03/19/"
  145. title="Publication précédente : Excitation">← Précédent</a> •
  146. <a href="/david/" title="Aller à l’accueil" rel="up">Accueil</a>
  147. <a href="/david/recherche/"
  148. title="Aller à la page de recherche"
  149. rel="search" data-no-instant>Recherche</a>
  150. • <a rel="next"
  151. href="/david/2024/03/21/"
  152. title="Publication suivante : Fourchette">Suivant →</a>
  153. </p>
  154. </nav>
  155. <p><a href="/david/2024/03/19/" title="Excitation">J’y ai passé ma soirée</a> mais j’ai un <a data-link-domain="davidbgk.gitlab.io" href="https://davidbgk.gitlab.io/page-crypt-web-component/">truc qui fonctionne pour une démo</a>. Ça ressemble beaucoup à un <em>patchwork</em> de bouts de code récupérés <a data-link-domain="maxlaumeister.com" href="https://www.maxlaumeister.com/pagecrypt/">ici</a> et <a data-link-domain="github.com" href="https://github.com/Greenheart/pagecrypt">là</a> puis <a data-link-domain="github.com" href="https://github.com/MaxLaumeister/PageCrypt/blob/master/python/encrypt.py">aussi là</a> pour la partie&nbsp;Python.</p>
  156. <p>Il y a encore pas mal de travail —&nbsp;notamment pour rendre la page suffisamment accessible&nbsp;— mais au moins la partie crypto / boîte noire semble fonctionner à la fois du côté génération en Python et consommation en JS. C’est la partie qui me faisait un peu peur et sur laquelle j’ai un peu patiné car c’est bien au-delà de mes compétences et que je ne veux pas prendre l’initiative de trop adapter sans comprendre les enjeux niveau&nbsp;sécurité.</p>
  157. <p>Le dépôt est <a data-link-domain="gitlab.com" href="https://gitlab.com/davidbgk/page-crypt-web-component">par ici</a>. Il faut encore que je décide si le formulaire pour le mot de passe devient un <em>web component</em> dédié et/ou un sous-composant, je ne suis pas satisfait du couplage implicite actuel. Itération, itération.</p>
  158. <p>En bonus, il est possible d’accéder directement au contenu de la page en mettant le mot de passe en ancre de l’URL. J’ai appris au passage que ce fragment d’URL n’était pas transmis dans la requête et ne restait que dans l’historique du&nbsp;navigateur.</p>
  159. <p><em>Si tu n’as pas honte de ton premier commit, tout ça… la suite&nbsp;demain.</em></p>
  160. <a href="#hr-125" title="Lien vers cette section de la page"><hr id="hr-125" /></a>
  161. <blockquote>
  162. <p>Les mots ont un impact et, inconsciemment, quand vous ne les utilisez pas dans la bonne manière, vous minimisez mon handicap et donc vous faites moins d'effort que&nbsp;nécessaire.</p>
  163. <p>Autre point, dit-on «&nbsp;personne en situation en handicap&nbsp;» ou «&nbsp;personne&nbsp;handicapée&#8239;?&nbsp;»</p>
  164. <p>Là, encore, il y a une&nbsp;subtilité.</p>
  165. <p>Je vais à un événement tech où les conférences ne sont pas sous-titrées. Je suis en situation de handicap puisque les conférences ne me sont pas du tout&nbsp;accessibles.</p>
  166. <p>Je vais à un événement tech où les conférences sont toutes sous-titrées. Je ne suis pas en situation de handicap puisque les conférences me sont totalement&nbsp;accessibles.</p>
  167. <p>Voici la différence. <mark>Être en situation de handicap, c’est subir la situation faute&nbsp;d’accessibilité.</mark></p>
  168. <p><cite><em><a data-link-domain="emmanuelle-aboaf.netlify.app" href="https://emmanuelle-aboaf.netlify.app/blog/article/n-ayez-pas-peur-des-mots" hreflang="fr"
  169. title="Consultation de l’article">N’ayez pas peur des mots</a>
  170. <a href="/david/cache/2024/5201efaa6fe6a80f69647a354c9afd18/" hreflang="fr"
  171. data-tippy data-description="Les mots ont un impact et pourtant ils ne sont pas utilisés en tant que tels. Le mot handicapé·e n’est pas un gros mot, pas plus que les mots sourd·e et aveugle. Malheureusement, certaines personnes n’osent pas les dire par peur de vexer ou en pensant que ça ne se dit pas. Cependant, en ne les disant pas, vous créez un tabou. Je vous partage mes réflexions sur le sujet à travers cet article."
  172. data-source="https://emmanuelle-aboaf.netlify.app/blog/article/n-ayez-pas-peur-des-mots"
  173. data-date="2024-03-20"
  174. data-favicon="https://emmanuelle-aboaf.netlify.app/blog/article/favicon-32x32.png"
  175. data-domain="emmanuelle-aboaf.netlify.app"
  176. ><svg xmlns="http://www.w3.org/2000/svg"
  177. width="24" height="24" viewBox="0 0 24 24" fill="none"
  178. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  179. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  180. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  181. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  182. </svg>
  183. <span class="sr-only">[archive]</span></a></em></cite></p>
  184. </blockquote>
  185. <p>Cette page ne contient pas le contenu du HTML qui s’affiche et ça me rend triste car j’en apprécie le contenu qui m’apprend des choses / me fait&nbsp;réfléchir.</p>
  186. <p>Un autre angle de&nbsp;l’accessibilité&#8239;?</p>
  187. <a href="#hr-126" title="Lien vers cette section de la page"><hr id="hr-126" /></a>
  188. <blockquote lang="en">
  189. <p>So don’t publish for the&nbsp;world.</p>
  190. <p>When I write something here on my website, I’m not thinking about the world reading it. That would be paralyzing. I do sometimes imagine that one person is reading it; someone just like me who hasn’t yet had this particular thought, or come up with that particular&nbsp;idea.</p>
  191. <p>I’m writing for myself. <mark>I write to figure out what I think.</mark> I also publish mostly for myself—a public archive for future me. But if what I publish just happens to connect with one other person, I’m&nbsp;glad.</p>
  192. <p><cite><em><a data-link-domain="adactio.com" href="https://adactio.com/journal/20996" hreflang="en"
  193. title="Consultation de l’article (anglais)">What the world needs</a>
  194. <a href="/david/cache/2024/318dd7526e11f9476c9cbc88eb3f2b9b/" hreflang="en"
  195. data-tippy data-description="Write for yourself."
  196. data-source="https://adactio.com/journal/20996"
  197. data-date="2024-03-20"
  198. data-favicon="https://adactio.com/icon.png"
  199. data-domain="adactio.com"
  200. ><svg xmlns="http://www.w3.org/2000/svg"
  201. width="24" height="24" viewBox="0 0 24 24" fill="none"
  202. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  203. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  204. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  205. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  206. </svg>
  207. <span class="sr-only">[archive]</span></a></em></cite></p>
  208. </blockquote>
  209. <a href="#hr-127" title="Lien vers cette section de la page"><hr id="hr-127" /></a>
  210. <blockquote lang="en">
  211. <p>My goal, for this digital place I’m creating, is to make you go away. And that’s not because I want to be left alone but because <mark>I hope to help you discover new digital places to explore.</mark> If I see you again, it’s because you decided to come back, and not because you got lost and trapped inside the digital walls I&nbsp;erected.</p>
  212. <p><cite><em><a data-link-domain="manuelmoreale.com" href="https://manuelmoreale.com/digital-walled-gardens" hreflang="en"
  213. title="Consultation de l’article (anglais)">Digital walled gardens</a>
  214. <a href="/david/cache/2024/812f09bae33b395819539fd2c4693fe2/" hreflang="en"
  215. data-tippy data-description="The concept of a walled garden is not a new one in the digital world. It’s just a fancier, less aggressive way to describe a closed ecosystem or a …"
  216. data-source="https://manuelmoreale.com/digital-walled-gardens"
  217. data-date="2024-03-20"
  218. data-favicon="https://manuelmoreale.com/favicon.ico"
  219. data-domain="manuelmoreale.com"
  220. ><svg xmlns="http://www.w3.org/2000/svg"
  221. width="24" height="24" viewBox="0 0 24 24" fill="none"
  222. stroke="currentColor" stroke-width="2" stroke-linecap="square"
  223. stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle>
  224. <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path>
  225. <line x1="12" y1="17" x2="12.01" y2="17"></line>
  226. </svg>
  227. <span class="sr-only">[archive]</span></a></em></cite></p>
  228. </blockquote>
  229. <p>🌱</p>
  230. <nav>
  231. <p>
  232. <a href="/david/2024/laboratoire/"
  233. title="Liste de tous les articles 2024 associés à cette étiquette"
  234. rel="tag">#laboratoire</a>
  235. <a href="/david/2024/opensource/"
  236. title="Liste de tous les articles 2024 associés à cette étiquette"
  237. rel="tag">#opensource</a>
  238. <a href="/david/2024/technique/"
  239. title="Liste de tous les articles 2024 associés à cette étiquette"
  240. rel="tag">#technique</a>
  241. <a href="/david/2024/#tags" title="Liste de toutes les étiquettes 2024">tous ?</a>
  242. </p>
  243. </nav>
  244. <nav>
  245. <p>
  246. <a rel="prev"
  247. href="/david/2024/03/19/"
  248. title="Publication précédente : Excitation">← Précédent</a> •
  249. <a href="/david/2024/" title="Liste des publications récentes">↑ En 2024</a>
  250. • <a rel="next"
  251. href="/david/2024/03/21/"
  252. title="Publication suivante : Fourchette">Suivant →</a>
  253. </p>
  254. </nav>
  255. <form action="/david/recherche/" method="get">
  256. <fieldset>
  257. <legend>Recherche</legend>
  258. <label for="input-search">Termes de votre recherche :</label>
  259. <input id="input-search" type="search" name="s" aria-describedby="indexation-infos" required>
  260. <input type="submit" value="Chercher">
  261. <p id="indexation-infos">
  262. <small>
  263. Seuls les contenus de ces 8 dernières années sont indexés.
  264. </small>
  265. </p>
  266. </fieldset>
  267. </form>
  268. <aside>
  269. <theme-toggle></theme-toggle>
  270. </aside>
  271. </article>
  272. <hr>
  273. <footer>
  274. <p>
  275. <a href="/david/" title="Aller à l’accueil">Accueil</a>
  276. <a href="/david/log/" title="Accès au flux RSS">Suivre</a>
  277. <a href="http://larlet.com"
  278. title="Go to my English profile"
  279. data-instant>Pro</a>
  280. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">Email</a>
  281. <abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">Légal</abbr>
  282. </p>
  283. <template id="theme-selector">
  284. <form>
  285. <style type="text/css">
  286. fieldset div {
  287. text-align: center;
  288. }
  289. </style>
  290. <fieldset>
  291. <legend>Thème</legend>
  292. <div>
  293. <label>
  294. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  295. Auto
  296. </label>
  297. <label>
  298. <input type="radio" value="dark" name="chosen-color-scheme">
  299. Foncé
  300. </label>
  301. <label>
  302. <input type="radio" value="light" name="chosen-color-scheme">
  303. Clair
  304. </label>
  305. </div>
  306. </fieldset>
  307. </form>
  308. </template>
  309. </footer>
  310. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  311. <script>
  312. class ThemeToggle extends HTMLElement {
  313. constructor() {
  314. super()
  315. const themeSelectorTemplate = document.querySelector('#theme-selector')
  316. const form = themeSelectorTemplate.content.firstElementChild
  317. this.attachShadow({ mode: 'open' })
  318. this.shadowRoot.appendChild(form.cloneNode(true))
  319. }
  320. connectedCallback() {
  321. const form = this.shadowRoot.querySelector('form')
  322. form.addEventListener('change', (e) => {
  323. const chosenColorScheme = e.target.value
  324. localStorage.setItem('theme', chosenColorScheme)
  325. toggleTheme(chosenColorScheme)
  326. })
  327. const selectedTheme = localStorage.getItem('theme')
  328. if (selectedTheme && selectedTheme !== 'undefined') {
  329. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  330. }
  331. }
  332. }
  333. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  334. window.addEventListener('load', () => {
  335. let colorsLayer = undefined
  336. let hasDarkRules = false
  337. for (const styleSheet of Array.from(document.styleSheets)) {
  338. let mediaRules = []
  339. for (const layerRule of styleSheet.cssRules) {
  340. if (!(layerRule instanceof CSSLayerBlockRule)) {
  341. continue
  342. }
  343. if (layerRule.name === 'colors') {
  344. colorsLayer = layerRule
  345. }
  346. for (const cssRule of layerRule.cssRules) {
  347. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  348. continue
  349. }
  350. // WARNING: Safari does not have/supports `conditionText`.
  351. if (cssRule.conditionText) {
  352. if (cssRule.conditionText !== prefersColorSchemeDark) {
  353. continue
  354. }
  355. } else {
  356. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  357. continue
  358. }
  359. }
  360. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  361. }
  362. }
  363. // WARNING: do not try to insert a Rule to a styleSheet you are
  364. // currently iterating on, otherwise the browser will be stuck
  365. // in a infinite loop…
  366. for (const mediaRule of mediaRules) {
  367. // Safari requires the `0` second parameter (even if default).
  368. colorsLayer.insertRule(mediaRule.cssText, 0)
  369. hasDarkRules = true
  370. }
  371. }
  372. if (hasDarkRules) {
  373. if ('customElements' in window && !customElements.get('theme-toggle')) {
  374. customElements.define('theme-toggle', ThemeToggle)
  375. }
  376. }
  377. })
  378. </script>
  379. <script src="/static/david/js/popper-2.11.8.min.js"></script>
  380. <script src="/static/david/js/tippy-bundle-6.3.7.umd.min.js"></script>
  381. <script>
  382. tippy('[data-tippy]', {
  383. content(reference) {
  384. reference.addEventListener('click', (e) => e.preventDefault())
  385. return `
  386. <h3 lang="fr">
  387. <img src="${reference.dataset.favicon}" loading="lazy">
  388. <a href="${reference.dataset.source}"
  389. >Article sur ${reference.dataset.domain}</a></h3>
  390. <p lang="${reference.hreflang}"><em>${reference.dataset.description}</em></p>
  391. <div class="tippy-links" lang="fr">
  392. <a href="${reference.href}">Archive au ${reference.dataset.date}</a>
  393. </div>
  394. `
  395. },
  396. allowHTML: true,
  397. interactive: true,
  398. delay: [150, 700],
  399. hideOnClick: false
  400. })
  401. </script>
  402. <script type="module">
  403. import { annotate } from '/static/david/js/rough-notation-0.5.1.esm.min.js'
  404. const markObserver = new IntersectionObserver((entries, observer) => {
  405. const computedStyle = getComputedStyle(document.documentElement)
  406. const markBackground = computedStyle.getPropertyValue('--mark-background')
  407. for (const entry of entries) {
  408. if (entry.intersectionRatio === 0) continue
  409. const markElement = entry.target
  410. markElement.style.backgroundColor = 'inherit'
  411. const annotation = annotate(
  412. markElement, {
  413. type: 'highlight',
  414. multiline: true,
  415. color: markBackground,
  416. // animate: !window.matchMedia('(prefers-reduced-motion: reduce)').matches
  417. animate: false
  418. }
  419. )
  420. annotation.show()
  421. observer.unobserve(markElement)
  422. }
  423. }, {threshold: 1.0})
  424. for (const markElement of document.querySelectorAll('mark')) {
  425. markObserver.observe(markElement)
  426. }
  427. </script>
  428. </body>
  429. </html>