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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. Documentation
  14. — David Larlet</title>
  15. <meta name="description" content="The deeper I dig into my research, the more case studies and examples I find. Institutional memory is frequently overlooked and undervalued - until the moment when someone needs access to memory right now, and of course by then it’s too late. Good remembering means turning tacit knowledge into explicit knowledge; if all your tacit knowledge has left the building inside the heads of former colleagues, it’s lost to you forever.">
  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. <!-- Documented, feel free to shoot an email. -->
  48. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  49. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  50. <link rel="preload"
  51. href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2"
  52. as="font"
  53. type="font/woff2"
  54. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  55. crossorigin>
  56. <link rel="preload"
  57. href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2"
  58. as="font"
  59. type="font/woff2"
  60. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  61. crossorigin>
  62. <link rel="preload"
  63. href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2"
  64. as="font"
  65. type="font/woff2"
  66. media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"
  67. crossorigin>
  68. <link rel="preload"
  69. href="/static/david/css/fonts/triplicate_t3_regular.woff2"
  70. as="font"
  71. type="font/woff2"
  72. media="(prefers-color-scheme: dark)"
  73. crossorigin>
  74. <link rel="preload"
  75. href="/static/david/css/fonts/triplicate_t3_bold.woff2"
  76. as="font"
  77. type="font/woff2"
  78. media="(prefers-color-scheme: dark)"
  79. crossorigin>
  80. <link rel="preload"
  81. href="/static/david/css/fonts/triplicate_t3_italic.woff2"
  82. as="font"
  83. type="font/woff2"
  84. media="(prefers-color-scheme: dark)"
  85. crossorigin>
  86. <script>
  87. function toggleTheme(themeName) {
  88. document.documentElement.classList.toggle(
  89. 'forced-dark',
  90. themeName === 'dark'
  91. )
  92. document.documentElement.classList.toggle(
  93. 'forced-light',
  94. themeName === 'light'
  95. )
  96. }
  97. const selectedTheme = localStorage.getItem('theme')
  98. if (selectedTheme !== 'undefined') {
  99. toggleTheme(selectedTheme)
  100. }
  101. </script>
  102. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick"
  103. data-instant-intensity="viewport-all">
  104. <article>
  105. <header>
  106. <h1>Documentation</h1>
  107. </header>
  108. <nav>
  109. <p class="center">
  110. <a rel="prev"
  111. href="/david/2023/09/09/"
  112. title="Publication précédente : Blogroll">← Précédent</a> •
  113. <nobr>
  114. <a href="/david/" title="Aller à l’accueil" rel="up">
  115. <svg class="icon icon-home">
  116. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home"></use>
  117. </svg>
  118. Accueil</a>
  119. </nobr>
  120. <nobr>
  121. <a href="/david/recherche/"
  122. title="Aller à la page de recherche"
  123. rel="search">
  124. <svg class="icon icon-search">
  125. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-search"></use>
  126. </svg>
  127. Recherche</a>
  128. </nobr>
  129. </p>
  130. </nav>
  131. <hr>
  132. <blockquote lang="en">
  133. <p>The deeper I dig into my research, the more case studies and examples I find. Institutional memory is frequently overlooked and undervalued - until the moment when someone needs access to memory right now, and of course by then it’s too late. Good remembering means turning tacit knowledge into explicit knowledge; <mark>if all your tacit knowledge has left the building inside the heads of former colleagues, it’s lost to you&nbsp;forever.</mark></p>
  134. <p>So I think there’s a case for allowing and encouraging documentation for teams, just as much as documentation for software. Writing that documentation is a task, It needs to be part of someone’s job. Every organisation needs a little bit of storytelling capability, to help make that job&nbsp;easier.</p>
  135. <p><cite><em><a href="https://gilest.org/htr.html">How teams remember</a></em>&nbsp;(<a href="/david/cache/2023/5a9fa7db62f151b8a863b949ed4e9e5f/">cache</a>)</cite></p>
  136. </blockquote>
  137. <p>J’ai développé un outil pour Scopyleft l’année dernière qui s’intitule «&nbsp;Le Voilier&nbsp;». Il s’agit d’un lieux où l’on consigne nos discussions, propositions et résolutions. C’était important car il y avait pas mal de perte/dilution d’information orale, ce qui est classique en équipes distribuées qui grandissent. Depuis un an et demi, il y a 381&nbsp;sujets qui ont été consignés dans ce <a href="/david/2022/12/19/">journal</a> de bord collectif, c’est un outil vivant. Des fonctionnalités bourgeonnent ou passent au compost au gré des besoins, c’est assez plaisant d’avoir la flexibilité de connaître le générateur du site (350&nbsp;lignes de Python à ce jour) et de pouvoir sortir du cadre sans que ce soit trop&nbsp;douloureux.</p>
  138. <p>Cela a commencé avec un site totalement statique qui était (re)construit par l’intégration continue à chaque ajout de fichier <em>markdown</em> avec les bonnes méta-données dans un dossier dédié. Classique. C’était facile pour les personnes familières de git(lab) mais moins pratique pour celles qui ne le sont pas, notamment lorsqu’il faut prendre des notes en séance. L’expérience utilisateur·ice des forges logicielles n’est pas vraiment adaptée à un tel usage, surtout dans un contexte de charge cognitive&nbsp;élevée.</p>
  139. <p>J’ai donc transformé cela en site <em>semynamique</em> 🌱&nbsp;: on reste sur la même infrastructure mais je rajoute un formulaire (toujours statique) qui va soumettre les données vers une seule fonction Python/wsgi qui consiste à créer le fichier <em>markdown</em> conforme aux attentes de l’outil et à le pousser sur le dépôt. Cela a rendu l’outil plus accessible et avenant. Depuis, j’ai décliné ce principe pour d’autres <em>scenarii</em> avec de bons&nbsp;retours.</p>
  140. <p>Avec l’expérience et un petit script de déploiement, cela me prend moins d’une heure à mettre en place sur AlwaysData avec un strict minimum de maintenance. J’ai une relative tranquillité d’esprit aussi car seule une petite partie du site serait inutilisable si le service tombait et il reste la possibilité d’ajouter des fichiers dans git à la main s’il y avait une&nbsp;urgence.</p>
  141. <p>Je ne sais pas trop quoi faire à partir de là, je me dis que ça pourrait en inspirer d’autres. Entre les sites purement statiques et les usines à gaz en JS, il y a tout un dégradé de couleurs enthousiasmantes, certaines restant à&nbsp;découvrir&#8239;!</p>
  142. <p><em>Peut-être qu’à un moment, on pourrait aussi proposer un catalogue d’outils utiles aux coopératives — à l’instar de <a href="https://paheko.cloud/">Paheko</a> pour les&nbsp;associations…</em></p>
  143. <hr />
  144. <blockquote>
  145. <p>🏡 Une grande partie de mon entourage est déjà propriétaire. Ça en dit long sur la sphère dans laquelle j’évolue. J’ai l’impression que le fait d’acheter une maison fait partie de la liste non-négociable d’une vie réussie dans notre monde capitaliste. Jusqu’à très récemment, je n’avais jamais interrogé ce&nbsp;postulat.</p>
  146. <p><cite><em><a href="https://ynote.hk/mots/argent/propriete.html">Propriété par Fanny Cheung</a></em>&nbsp;(<a href="/david/cache/2023/37b0c9d01d6f788bee398b64377cb6c1/">cache</a>)</cite></p>
  147. </blockquote>
  148. <blockquote lang="en">
  149. <p>🔨 Yes, it’s fair to point out that AI in its many different software manifestations can be considered a tool. But that is not the point of the statement. The word to watch out for is “just”. If someone were to say ”it’s a tool”, that makes sense. But the word “just” is there to shed&nbsp;accountability.</p>
  150. <p>Hence my concern is that the statement itself removes accountability and consideration for the bigger picture effects. <mark>Saying something is just a tool creates the faulty mental model</mark> of all tools having interchangeable qualities from an ethical perspective, which simply isn’t&nbsp;true.</p>
  151. <p><cite><em><a href="https://axbom.com/hammer-ai/">If a hammer was like AI…</a></em>&nbsp;(<a href="/david/cache/2023/aac3c4716f9ff73e7409ecbc9550491b/">cache</a>)</cite></p>
  152. </blockquote>
  153. <blockquote lang="en">
  154. <p>💯 When it comes to front-end development, I’m worried that we’ve reached a state where the more complex over-engineered approach is viewed as the&nbsp;default.</p>
  155. <p>I may be committing a fundamental attribution error here, but I think that we’ve reached this point not because of any consideration for users, but rather <mark>because of how it makes us developers feel.</mark> Perhaps building an old-fashioned website that uses HTML for navigations feels too easy, like it’s beneath us. But building an “app” that requires JavaScript just to render text on a screen feels like <em>real</em>&nbsp;programming.</p>
  156. <p><cite><em><a href="https://adactio.com/journal/20442">Multi-page web apps</a></em>&nbsp;(<a href="/david/cache/2023/efc348f6559d55129657c7ba9d740b76/">cache</a>)</cite></p>
  157. </blockquote>
  158. <nav>
  159. <p>
  160. <a href="/david/2023/ecriture/"
  161. title="Liste de tous les articles 2023 associés à cette étiquette"
  162. rel="tag">#écriture</a>
  163. <a href="/david/2023/partage/"
  164. title="Liste de tous les articles 2023 associés à cette étiquette"
  165. rel="tag">#partage</a>
  166. <a href="/david/2023/scopyleft/"
  167. title="Liste de tous les articles 2023 associés à cette étiquette"
  168. rel="tag">#scopyleft</a>
  169. <a href="/david/#tags-2023" title="Liste de toutes les étiquettes 2023">
  170. <svg class="icon icon-tags">
  171. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-tags"></use>
  172. </svg>
  173. tous ?</a>
  174. </p>
  175. </nav>
  176. <nav>
  177. <p class="center">
  178. <a rel="prev"
  179. href="/david/2023/09/09/"
  180. title="Publication précédente : Blogroll">← Précédent</a> •
  181. <a href="/david/2023/" title="Liste des publications récentes">↑ En 2023</a>
  182. </p>
  183. </nav>
  184. </article>
  185. <hr>
  186. <footer>
  187. <p>
  188. <nobr>
  189. <a href="/david/" title="Aller à l’accueil">
  190. <svg class="icon icon-home">
  191. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-home"></use>
  192. </svg>
  193. Accueil</a>
  194. </nobr>
  195. <nobr>
  196. <a href="/david/log/" title="Accès au flux RSS">
  197. <svg class="icon icon-rss2">
  198. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-rss2"></use>
  199. </svg>
  200. Suivre</a>
  201. </nobr>
  202. <nobr>
  203. <a href="http://larlet.com"
  204. title="Go to my English profile"
  205. data-instant>
  206. <svg class="icon icon-user-tie">
  207. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-user-tie"></use>
  208. </svg>
  209. Pro</a>
  210. </nobr>
  211. <nobr>
  212. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">
  213. <svg class="icon icon-mail">
  214. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-mail"></use>
  215. </svg>
  216. Email</a>
  217. </nobr>
  218. <nobr>
  219. <abbr class="nowrap"
  220. title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">
  221. <svg class="icon icon-hammer2">
  222. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-hammer2"></use>
  223. </svg>
  224. Légal</abbr>
  225. </nobr>
  226. </p>
  227. <template id="theme-selector">
  228. <form>
  229. <fieldset>
  230. <legend>
  231. <svg class="icon icon-brightness-contrast">
  232. <use xlink:href="/static/david/icons2/symbol-defs-2022-03.svg#icon-brightness-contrast"></use>
  233. </svg>
  234. Thème
  235. </legend>
  236. <label>
  237. <input type="radio" value="auto" name="chosen-color-scheme" checked>
  238. Auto
  239. </label>
  240. <label>
  241. <input type="radio" value="dark" name="chosen-color-scheme">
  242. Foncé
  243. </label>
  244. <label>
  245. <input type="radio" value="light" name="chosen-color-scheme">
  246. Clair
  247. </label>
  248. </fieldset>
  249. </form>
  250. </template>
  251. </footer>
  252. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  253. <script>
  254. function loadThemeForm(templateName) {
  255. const themeSelectorTemplate = document.querySelector(templateName)
  256. const form = themeSelectorTemplate.content.firstElementChild
  257. themeSelectorTemplate.replaceWith(form)
  258. form.addEventListener('change', (e) => {
  259. const chosenColorScheme = e.target.value
  260. localStorage.setItem('theme', chosenColorScheme)
  261. toggleTheme(chosenColorScheme)
  262. })
  263. const selectedTheme = localStorage.getItem('theme')
  264. if (selectedTheme && selectedTheme !== 'undefined') {
  265. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  266. }
  267. }
  268. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  269. window.addEventListener('load', () => {
  270. let hasDarkRules = false
  271. for (const styleSheet of Array.from(document.styleSheets)) {
  272. let mediaRules = []
  273. for (const cssRule of styleSheet.cssRules) {
  274. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  275. continue
  276. }
  277. // WARNING: Safari does not have/supports `conditionText`.
  278. if (cssRule.conditionText) {
  279. if (cssRule.conditionText !== prefersColorSchemeDark) {
  280. continue
  281. }
  282. } else {
  283. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  284. continue
  285. }
  286. }
  287. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  288. }
  289. // WARNING: do not try to insert a Rule to a styleSheet you are
  290. // currently iterating on, otherwise the browser will be stuck
  291. // in a infinite loop…
  292. for (const mediaRule of mediaRules) {
  293. styleSheet.insertRule(mediaRule.cssText)
  294. hasDarkRules = true
  295. }
  296. }
  297. if (hasDarkRules) {
  298. loadThemeForm('#theme-selector')
  299. }
  300. })
  301. </script>
  302. </body>
  303. </html>