Browse Source

More links

master
David Larlet 2 years ago
parent
commit
e8979a0fc8
25 changed files with 3622 additions and 0 deletions
  1. 183
    0
      cache/2022/128ce7c2bc3cbf479318e36ae2faf6b8/index.html
  2. 16
    0
      cache/2022/128ce7c2bc3cbf479318e36ae2faf6b8/index.md
  3. 183
    0
      cache/2022/1ab2a594ae40deb0f4443807f1fa7596/index.html
  4. 16
    0
      cache/2022/1ab2a594ae40deb0f4443807f1fa7596/index.md
  5. 229
    0
      cache/2022/1f0b2ca39bffe2d3551c7ea20dc315a1/index.html
  6. 62
    0
      cache/2022/1f0b2ca39bffe2d3551c7ea20dc315a1/index.md
  7. 196
    0
      cache/2022/27ced7003612537f6ad81106f34607af/index.html
  8. 29
    0
      cache/2022/27ced7003612537f6ad81106f34607af/index.md
  9. 205
    0
      cache/2022/4cea6f484d1e161074216e23d8826dea/index.html
  10. 39
    0
      cache/2022/4cea6f484d1e161074216e23d8826dea/index.md
  11. 194
    0
      cache/2022/56f14d85f38a7bb04e187aa3334bdb57/index.html
  12. 27
    0
      cache/2022/56f14d85f38a7bb04e187aa3334bdb57/index.md
  13. 312
    0
      cache/2022/66d9d4be64db7fe8324a4fdcbf3ef705/index.html
  14. 145
    0
      cache/2022/66d9d4be64db7fe8324a4fdcbf3ef705/index.md
  15. 223
    0
      cache/2022/7d378db0707cc63aa2d466ada68fe690/index.html
  16. 47
    0
      cache/2022/7d378db0707cc63aa2d466ada68fe690/index.md
  17. 283
    0
      cache/2022/8299fd0b8bd7010b4c74f4c06719f81d/index.html
  18. 116
    0
      cache/2022/8299fd0b8bd7010b4c74f4c06719f81d/index.md
  19. 179
    0
      cache/2022/c8c3f9a0a328a21db8c91c7a288a8b4f/index.html
  20. 12
    0
      cache/2022/c8c3f9a0a328a21db8c91c7a288a8b4f/index.md
  21. 267
    0
      cache/2022/df33a2f3d5f174aadda2a8311eebcafa/index.html
  22. 100
    0
      cache/2022/df33a2f3d5f174aadda2a8311eebcafa/index.md
  23. 351
    0
      cache/2022/fc0fd0dbeeb8a3f2b47e8ccab6d2cbc9/index.html
  24. 184
    0
      cache/2022/fc0fd0dbeeb8a3f2b47e8ccab6d2cbc9/index.md
  25. 24
    0
      cache/2022/index.html

+ 183
- 0
cache/2022/128ce7c2bc3cbf479318e36ae2faf6b8/index.html View File

@@ -0,0 +1,183 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Lessy est terminé (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://marienfressinaud.fr/lessy-est-termine.html">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Lessy est terminé</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://marienfressinaud.fr/lessy-est-termine.html" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Lessy <del>est</del> était un gestionnaire de temps mettant à disposition une liste de tâches et un gestionnaire de projets.</p>
<p>Il y a un an, <a href="des-nouvelles-de-lessy.html">j’écrivais</a> :</p>
<blockquote>
<p>En l’état, Lessy m’est en fait relativement peu utile. […] Ma manière de gérer mes tâches a évolué et j’arrive la plupart du temps à me contenter d’un bout de papier […].</p>
<p>Lessy, dans sa version actuelle, correspond en fait pas mal à ce que je souhaitais avoir quand j’ai commencé son développement. […]</p>
<p><strong>Tout bien pensé, je crois que Lessy est terminé.</strong></p>
</blockquote>
<p>Depuis, rien n’a vraiment changé. Je gère toujours mes tâches sur un bout de papier, aidé en plus par un mécanisme de routines qui ne nécessite que d’une feuille de tableur (je vous en reparle prochainement). Je continue également de penser que Lessy, dans sa forme actuelle, correspond à ce que j’imaginais initialement et qu’il n’a plus besoin de changer.</p>
<p>Le problème, c’est que je ne savais pas trop quoi faire de lui. <strong>En octobre dernier, j’ai décidé de fermer les inscriptions sur <a href="https://lessy.io">lessy.io</a>.</strong> C’était déjà un petit soulagement.</p>
<p>Mais que faire alors du code existant ? Initialement, je pensais <a href="terminer-ses-projets.html">terminer</a> Lessy proprement en n’ajoutant plus de fonctionnalités, mais en continuant de mettre à jour les dépendances logicielles afin d’éviter des failles de sécurité. Mais je dois vous avouer que je n’en suis plus capable. Les dépendances JavaScript sont une véritable plaie à maintenir avec des trucs qui pètent dans tous les sens à chaque mise à jour. C’est une charge que je n’ai pas envie de gérer.</p>
<p>Finalement, j’ai décidé de clore et archiver <a href="https://github.com/lessy-community/lessy">le dépôt de code</a> un peu plus sauvagement. Le fichier README a été mis à jour pour expliquer que le projet n’est plus maintenu. <strong>Je continuerai de maintenir le service <a href="https://lessy.io">lessy.io</a> ouvert tant que des gens l’utiliseront</strong> (et il y en a !) ; les inscriptions, elles, resteront fermées.</p>
<p>Je suis très heureux d’avoir bossé sur Lessy avec lequel j’aurai appris plein de choses. Mais je suis encore plus content de pouvoir annoncer qu’il est terminé et ainsi de ne plus avoir à m’en soucier 🙂</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 16
- 0
cache/2022/128ce7c2bc3cbf479318e36ae2faf6b8/index.md View File

@@ -0,0 +1,16 @@
title: Lessy est terminé
url: https://marienfressinaud.fr/lessy-est-termine.html
hash_url: 128ce7c2bc3cbf479318e36ae2faf6b8

<p>Lessy <del>est</del> était un gestionnaire de temps mettant à disposition une liste de tâches et un gestionnaire de projets.</p>
<p>Il y a un an, <a href="des-nouvelles-de-lessy.html">j’écrivais</a> :</p>
<blockquote>
<p>En l’état, Lessy m’est en fait relativement peu utile. […] Ma manière de gérer mes tâches a évolué et j’arrive la plupart du temps à me contenter d’un bout de papier […].</p>
<p>Lessy, dans sa version actuelle, correspond en fait pas mal à ce que je souhaitais avoir quand j’ai commencé son développement. […]</p>
<p><strong>Tout bien pensé, je crois que Lessy est terminé.</strong></p>
</blockquote>
<p>Depuis, rien n’a vraiment changé. Je gère toujours mes tâches sur un bout de papier, aidé en plus par un mécanisme de routines qui ne nécessite que d’une feuille de tableur (je vous en reparle prochainement). Je continue également de penser que Lessy, dans sa forme actuelle, correspond à ce que j’imaginais initialement et qu’il n’a plus besoin de changer.</p>
<p>Le problème, c’est que je ne savais pas trop quoi faire de lui. <strong>En octobre dernier, j’ai décidé de fermer les inscriptions sur <a href="https://lessy.io">lessy.io</a>.</strong> C’était déjà un petit soulagement.</p>
<p>Mais que faire alors du code existant ? Initialement, je pensais <a href="terminer-ses-projets.html">terminer</a> Lessy proprement en n’ajoutant plus de fonctionnalités, mais en continuant de mettre à jour les dépendances logicielles afin d’éviter des failles de sécurité. Mais je dois vous avouer que je n’en suis plus capable. Les dépendances JavaScript sont une véritable plaie à maintenir avec des trucs qui pètent dans tous les sens à chaque mise à jour. C’est une charge que je n’ai pas envie de gérer.</p>
<p>Finalement, j’ai décidé de clore et archiver <a href="https://github.com/lessy-community/lessy">le dépôt de code</a> un peu plus sauvagement. Le fichier README a été mis à jour pour expliquer que le projet n’est plus maintenu. <strong>Je continuerai de maintenir le service <a href="https://lessy.io">lessy.io</a> ouvert tant que des gens l’utiliseront</strong> (et il y en a !) ; les inscriptions, elles, resteront fermées.</p>
<p>Je suis très heureux d’avoir bossé sur Lessy avec lequel j’aurai appris plein de choses. Mais je suis encore plus content de pouvoir annoncer qu’il est terminé et ainsi de ne plus avoir à m’en soucier 🙂</p>

+ 183
- 0
cache/2022/1ab2a594ae40deb0f4443807f1fa7596/index.html View File

@@ -0,0 +1,183 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Performances trop bonnes (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://nota-bene.org/Performances-trop-bonnes">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Performances trop bonnes</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://nota-bene.org/Performances-trop-bonnes" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>On croit rêver&nbsp;:</p>
<blockquote cite="https://larlet.fr/david/stream/2015/12/22/">
<p>Notez qu’en attendant j’ai mis une courte animation à l’affichage des pages car on m’a plusieurs fois fait la remarque que &#171;&nbsp;les performances sont trop bonnes&nbsp;&#187; pour identifier le changement de page (la première fois j’ai pris ça pour une blague mais il faut bien constater qu’il s’agit d’une expérience aux antipodes des pratiques sur le web…)[…]</p>
<footer><a href="https://larlet.fr/david/stream/2015/12/22/" class='spip_out' rel='external'>Refonte de Noël &mdash; David Larlet</a></footer></blockquote>
<p>Être obligé de donner une illusion de ralentissement pour que les gens comprennent que la page est chargée, ça me donne un petit tic nerveux, je ne sais pas pourquoi.</p>
<p>Au contraire, dès que je vois un site qui se charge presque instantanément, je suis ravi.</p>
<p>J&#8217;aimerais bien connaître mieux les gens qui ont fait cette remarque.</p>
<p><strong>Mise à jour du 1<sup>er</sup> janvier&nbsp;:</strong></p>
<p>David donne <a href="https://larlet.fr/david/stream/2015/12/30/" class='spip_out' rel='external'>plus d&#8217;informations</a>, c&#8217;est éducatif&nbsp;:</p>
<blockquote cite="https://larlet.fr/david/stream/2015/12/30/">
<p>J’ai mis en place cette animation suite à deux emails et trois observations de personnes <em>non techniques</em>. C’est peu mais je n’ai malheureusement pas le luxe de pouvoir avoir plus de retours. L’avantage des observations est d’avoir pu voir la désorientation sans même que les personnes en aient vraiment eues conscience, un instant de réflexion et de balayage d’écran avant de comprendre que la page avait bien changée.</p>
<footer><a href="https://larlet.fr/david/stream/2015/12/30/" class='spip_out' rel='external'>Performances et ressenti &mdash; David Larlet</a></footer></blockquote>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 16
- 0
cache/2022/1ab2a594ae40deb0f4443807f1fa7596/index.md View File

@@ -0,0 +1,16 @@
title: Performances trop bonnes
url: https://nota-bene.org/Performances-trop-bonnes
hash_url: 1ab2a594ae40deb0f4443807f1fa7596

<p>On croit rêver&nbsp;:</p>
<blockquote cite="https://larlet.fr/david/stream/2015/12/22/">
<p>Notez qu’en attendant j’ai mis une courte animation à l’affichage des pages car on m’a plusieurs fois fait la remarque que &#171;&nbsp;les performances sont trop bonnes&nbsp;&#187; pour identifier le changement de page (la première fois j’ai pris ça pour une blague mais il faut bien constater qu’il s’agit d’une expérience aux antipodes des pratiques sur le web…)[…]</p>
<footer><a href="https://larlet.fr/david/stream/2015/12/22/" class='spip_out' rel='external'>Refonte de Noël &mdash; David Larlet</a></footer></blockquote>
<p>Être obligé de donner une illusion de ralentissement pour que les gens comprennent que la page est chargée, ça me donne un petit tic nerveux, je ne sais pas pourquoi.</p>
<p>Au contraire, dès que je vois un site qui se charge presque instantanément, je suis ravi.</p>
<p>J&#8217;aimerais bien connaître mieux les gens qui ont fait cette remarque.</p>
<p><strong>Mise à jour du 1<sup>er</sup> janvier&nbsp;:</strong></p>
<p>David donne <a href="https://larlet.fr/david/stream/2015/12/30/" class='spip_out' rel='external'>plus d&#8217;informations</a>, c&#8217;est éducatif&nbsp;:</p>
<blockquote cite="https://larlet.fr/david/stream/2015/12/30/">
<p>J’ai mis en place cette animation suite à deux emails et trois observations de personnes <em>non techniques</em>. C’est peu mais je n’ai malheureusement pas le luxe de pouvoir avoir plus de retours. L’avantage des observations est d’avoir pu voir la désorientation sans même que les personnes en aient vraiment eues conscience, un instant de réflexion et de balayage d’écran avant de comprendre que la page avait bien changée.</p>
<footer><a href="https://larlet.fr/david/stream/2015/12/30/" class='spip_out' rel='external'>Performances et ressenti &mdash; David Larlet</a></footer></blockquote>

+ 229
- 0
cache/2022/1f0b2ca39bffe2d3551c7ea20dc315a1/index.html View File

@@ -0,0 +1,229 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer) (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="http://www.homme-moderne.org/textes/classics/ereclus/jgrave.html">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer)</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="http://www.homme-moderne.org/textes/classics/ereclus/jgrave.html" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p align="center"><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">                                   Clarens, Vaud, 26 septembre 1885. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">                                  Compagnons, </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Vous demandez à un homme de bonne volonté, qui
n'est ni votant ni candidat, de vous exposer quelles sont ses
idées sur l'exercice du droit de suffrage. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Le délai que vous m'accordez est bien court, mais ayant, au
sujet du vote électoral, des convictions bien nettes, ce que
j'ai à vous dire peut se formuler en quelques mots. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     <strong>Voter, c'est abdiquer </strong>; nommer un ou plusieurs maîtres pour
une période courte ou longue, c'est renoncer à sa
propre souveraineté. Qu'il devienne monarque absolu, prince
constitutionnel ou simplement mandataire muni d'une petite part de
royauté, le candidat que vous portez au trône ou
au fauteuil sera votre supérieur. Vous nommez des hommes qui
sont au-dessus des lois, puisqu'ils se chargent de les
rédiger et que leur mission est de vous faire
obéir. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Voter, c'est être dupe ; c'est croire que des hommes comme
vous acquerront soudain, au tintement d'une sonnette, la vertu de tout
savoir et de tout comprendre. Vos mandataires ayant à
légiférer sur toutes choses, des allumettes aux
vaisseaux de guerre, de l'échenillage des arbres
à l'extermination des peuplades rouges ou noires, il vous
semble que leur intelligence grandisse en raison même de
l'immensité de la tâche. L'histoire vous enseigne
que le contraire a lieu. Le pouvoir a toujours affolé, le
parlotage a toujours abêti. Dans les assemblées
souveraines, la médiocrité prévaut
fatalement. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Voter c'est évoquer la trahison. Sans doute, les votants
croient à l'honnêteté de ceux auxquels
ils accordent leurs suffrages  — et peut-être ont-il
raison le premier jour, quand les candidats sont encore dans la ferveur
du premier amour. Mais chaque jour a son lendemain. Dès que
le milieu change, l'homme change avec lui. Aujourd'hui, le candidat
s'incline devant vous, et peut-être trop bas ; demain, il se
redressera et peut-être trop haut. Il mendiait les votes, il
vous donnera des ordres. L'ouvrier, devenu contre-maître,
peut-il rester ce qu'il était avant d'avoir obtenu la faveur
du patron ? Le fougueux démocrate n'apprend-il pas
à courber l'échine quand le banquier daigne
l'inviter à son bureau, quand les valets des rois lui font
l'honneur de l'entretenir dans les antichambres ?
L'atmosphère de ces corps législatifs est malsain
à respirer, vous envoyez vos mandataires dans un milieu de
corruption ; ne vous étonnez pas s'ils en sortent corrompus. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     N'abdiquez donc pas, ne remettez donc pas vos destinées
à des hommes forcément incapables et à
des traîtres futurs. Ne votez pas ! Au lieu de confier vos
intérêts à d'autres,
défendez-les vous-mêmes ; au lieu de prendre des
avocats pour proposer un mode d'action futur,  agissez ! Les
occasions ne manquent pas aux hommes de bon vouloir. Rejeter sur les
autres la responsabilité de sa conduite, c'est manquer de
vaillance. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Je vous salue de tout cœur, compagnons . </font></p>
<p align="center"><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">Élisée Reclus. </font><br>
  </p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 62
- 0
cache/2022/1f0b2ca39bffe2d3551c7ea20dc315a1/index.md View File

@@ -0,0 +1,62 @@
title: Lettre à Jean Grave, par Élisée Reclus (Voter c'est abdiquer)
url: http://www.homme-moderne.org/textes/classics/ereclus/jgrave.html
hash_url: 1f0b2ca39bffe2d3551c7ea20dc315a1

<p align="center"><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">                                   Clarens, Vaud, 26 septembre 1885. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">                                  Compagnons, </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Vous demandez à un homme de bonne volonté, qui
n'est ni votant ni candidat, de vous exposer quelles sont ses
idées sur l'exercice du droit de suffrage. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Le délai que vous m'accordez est bien court, mais ayant, au
sujet du vote électoral, des convictions bien nettes, ce que
j'ai à vous dire peut se formuler en quelques mots. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     <strong>Voter, c'est abdiquer </strong>; nommer un ou plusieurs maîtres pour
une période courte ou longue, c'est renoncer à sa
propre souveraineté. Qu'il devienne monarque absolu, prince
constitutionnel ou simplement mandataire muni d'une petite part de
royauté, le candidat que vous portez au trône ou
au fauteuil sera votre supérieur. Vous nommez des hommes qui
sont au-dessus des lois, puisqu'ils se chargent de les
rédiger et que leur mission est de vous faire
obéir. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Voter, c'est être dupe ; c'est croire que des hommes comme
vous acquerront soudain, au tintement d'une sonnette, la vertu de tout
savoir et de tout comprendre. Vos mandataires ayant à
légiférer sur toutes choses, des allumettes aux
vaisseaux de guerre, de l'échenillage des arbres
à l'extermination des peuplades rouges ou noires, il vous
semble que leur intelligence grandisse en raison même de
l'immensité de la tâche. L'histoire vous enseigne
que le contraire a lieu. Le pouvoir a toujours affolé, le
parlotage a toujours abêti. Dans les assemblées
souveraines, la médiocrité prévaut
fatalement. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Voter c'est évoquer la trahison. Sans doute, les votants
croient à l'honnêteté de ceux auxquels
ils accordent leurs suffrages  — et peut-être ont-il
raison le premier jour, quand les candidats sont encore dans la ferveur
du premier amour. Mais chaque jour a son lendemain. Dès que
le milieu change, l'homme change avec lui. Aujourd'hui, le candidat
s'incline devant vous, et peut-être trop bas ; demain, il se
redressera et peut-être trop haut. Il mendiait les votes, il
vous donnera des ordres. L'ouvrier, devenu contre-maître,
peut-il rester ce qu'il était avant d'avoir obtenu la faveur
du patron ? Le fougueux démocrate n'apprend-il pas
à courber l'échine quand le banquier daigne
l'inviter à son bureau, quand les valets des rois lui font
l'honneur de l'entretenir dans les antichambres ?
L'atmosphère de ces corps législatifs est malsain
à respirer, vous envoyez vos mandataires dans un milieu de
corruption ; ne vous étonnez pas s'ils en sortent corrompus. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     N'abdiquez donc pas, ne remettez donc pas vos destinées
à des hommes forcément incapables et à
des traîtres futurs. Ne votez pas ! Au lieu de confier vos
intérêts à d'autres,
défendez-les vous-mêmes ; au lieu de prendre des
avocats pour proposer un mode d'action futur,  agissez ! Les
occasions ne manquent pas aux hommes de bon vouloir. Rejeter sur les
autres la responsabilité de sa conduite, c'est manquer de
vaillance. </font></p>
<p><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">     Je vous salue de tout cœur, compagnons . </font></p>
<p align="center"><font size="4" face="AGaramond, Garamond, Times, Baskerville, Sabon, serif">Élisée Reclus. </font><br>
  </p>

+ 196
- 0
cache/2022/27ced7003612537f6ad81106f34607af/index.html View File

@@ -0,0 +1,196 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>There’s More to Design Than Data and Rationality (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://blog.jim-nielsen.com/2022/more-to-design-than-data-and-rationality/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>There’s More to Design Than Data and Rationality</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://blog.jim-nielsen.com/2022/more-to-design-than-data-and-rationality/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>Spurred by the article <a href="https://terrytao.wordpress.com/career-advice/theres-more-to-mathematics-than-rigour-and-proofs/">“There’s more to mathematics than rigour and proofs”</a>, I couldn’t help but riff on the idea but in terms of design.</p>
<p>While the author suggests there’s more to math than “rigour and proofs”, I tangentially suggest there’s more to design than data and rationality. Design can be much richer when intuition and the intangible is factored into decision making. Too often, design is boiled down to what appears to be a material science: create something—anything really—put metrics in place to measure its success, then determine its ultimate value by purely numerical outcomes.</p>
<p>Here’s the math parallel:</p>
<blockquote>
<p>It is of course vitally important that you know how to think rigorously, as this gives you the discipline to avoid many common errors and purge many misconceptions. Unfortunately, this has the unintended consequence that “fuzzier” or “intuitive” thinking (such as heuristic reasoning, judicious extrapolation from examples, or analogies with other contexts such as physics) gets deprecated as “non-rigorous”. All too often, one ends up discarding one’s initial intuition and is only able to process mathematics at a formal level, thus getting stalled at the second stage of one’s mathematical education.</p>
</blockquote>
<p>It’s very easy to reduce design to a process of material proof while “heuristic reasoning, judicious extrapolation from examples, or analogies with other contexts…gets deprecated as ‘non-rigorous’”. If you don’t have the data to backup your decision making, you have little merit. </p>
<p>But the point of data and rationality is not to destroy intuition, but to be the yin to intuition’s yang.</p>
<p>Again, the mathematical parallel:</p>
<blockquote>
<p>The point of rigour is <em>not</em> to destroy all intuition; instead, it should be used to destroy <em>bad</em> intuition while clarifying and elevating good intuition. It is only with a combination of both rigorous formalism and good intuition that one can tackle complex mathematical problems; one needs the former to correctly deal with the fine details, and the latter to correctly deal with the big picture.</p>
</blockquote>
<p>Let’s rephrase that, replacing “rigour” with “data”, and it feels like a good mental model thinking about the merger of intuition and data-informed decision making in design:</p>
<blockquote>
<p>The point of [data in design] is not to destroy all intuition; instead, it should be used to destroy bad intuition while clarifying and elevating good intuition. It is only with a combination of both [data] and good intuition that one can tackle complex…problems; one needs [data] to correctly deal with the fine details, and [intuition] to correctly deal with the big picture.</p>
</blockquote>
<p>I know for me, there’s been an evolution and growth working in design. Early on, I had my innate gut feeling but little experience to back it up. As I grew, I moved towards ignoring my intuition in favor of “objective” data or reasoning. However, as I grew more and gained more experience, I realized the value of my early intuition and began to pair it with my seasoned experience. I grew from an instinctual designer to a data-driven designer to data-informed designer and beyond.</p>
<p>Continuing this thought, I riffed on the author’s commentary about the evolution of “mathematical education” but, in this case, changing it to “design education”:</p>
<ol>
<li>The “pre-rigorous” stage, in which design is taught in an informal, intuitive manner. What does your gut and instinct tell you for decision making? Go with it.</li>
<li>The “rigorous” stage, in which one is now taught that in order to do design “properly”, one needs to work and think in a much more precise and formal manner. The emphasis is now primarily on data and metrics and “proving” outcomes. Don’t focus too much on feeling but more on rationality. </li>
<li>The “post-rigorous” stage, in which one has grown comfortable with all the rigorous foundations of one’s chosen field, and is now ready to revisit and refine one’s pre-rigorous intuition on the subject, but this time with the intuition solidly buttressed by rigorous theory. The emphasis is now not design as it relates to individual things, but synthesizing the relationships between things and how they relate to the “big picture”. Feeling, intuition, data, and rationality are kept in balance with each other through iteration</li>
</ol>
<p>To be honest, I don’t know if any of this relates to what the author was trying to say as it relates to math, but it <em>feels</em> relatable to my path as a designer.</p>
<p>It’s a good reminder that the answer is usually a mix: it’s not data over intuition, nor rationality over feeling. Argue the contraries and you’ll find wisdom in-between. </p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 29
- 0
cache/2022/27ced7003612537f6ad81106f34607af/index.md View File

@@ -0,0 +1,29 @@
title: There’s More to Design Than Data and Rationality
url: https://blog.jim-nielsen.com/2022/more-to-design-than-data-and-rationality/
hash_url: 27ced7003612537f6ad81106f34607af

<p>Spurred by the article <a href="https://terrytao.wordpress.com/career-advice/theres-more-to-mathematics-than-rigour-and-proofs/">“There’s more to mathematics than rigour and proofs”</a>, I couldn’t help but riff on the idea but in terms of design.</p>
<p>While the author suggests there’s more to math than “rigour and proofs”, I tangentially suggest there’s more to design than data and rationality. Design can be much richer when intuition and the intangible is factored into decision making. Too often, design is boiled down to what appears to be a material science: create something—anything really—put metrics in place to measure its success, then determine its ultimate value by purely numerical outcomes.</p>
<p>Here’s the math parallel:</p>
<blockquote>
<p>It is of course vitally important that you know how to think rigorously, as this gives you the discipline to avoid many common errors and purge many misconceptions. Unfortunately, this has the unintended consequence that “fuzzier” or “intuitive” thinking (such as heuristic reasoning, judicious extrapolation from examples, or analogies with other contexts such as physics) gets deprecated as “non-rigorous”. All too often, one ends up discarding one’s initial intuition and is only able to process mathematics at a formal level, thus getting stalled at the second stage of one’s mathematical education.</p>
</blockquote>
<p>It’s very easy to reduce design to a process of material proof while “heuristic reasoning, judicious extrapolation from examples, or analogies with other contexts…gets deprecated as ‘non-rigorous’”. If you don’t have the data to backup your decision making, you have little merit. </p>
<p>But the point of data and rationality is not to destroy intuition, but to be the yin to intuition’s yang.</p>
<p>Again, the mathematical parallel:</p>
<blockquote>
<p>The point of rigour is <em>not</em> to destroy all intuition; instead, it should be used to destroy <em>bad</em> intuition while clarifying and elevating good intuition. It is only with a combination of both rigorous formalism and good intuition that one can tackle complex mathematical problems; one needs the former to correctly deal with the fine details, and the latter to correctly deal with the big picture.</p>
</blockquote>
<p>Let’s rephrase that, replacing “rigour” with “data”, and it feels like a good mental model thinking about the merger of intuition and data-informed decision making in design:</p>
<blockquote>
<p>The point of [data in design] is not to destroy all intuition; instead, it should be used to destroy bad intuition while clarifying and elevating good intuition. It is only with a combination of both [data] and good intuition that one can tackle complex…problems; one needs [data] to correctly deal with the fine details, and [intuition] to correctly deal with the big picture.</p>
</blockquote>
<p>I know for me, there’s been an evolution and growth working in design. Early on, I had my innate gut feeling but little experience to back it up. As I grew, I moved towards ignoring my intuition in favor of “objective” data or reasoning. However, as I grew more and gained more experience, I realized the value of my early intuition and began to pair it with my seasoned experience. I grew from an instinctual designer to a data-driven designer to data-informed designer and beyond.</p>
<p>Continuing this thought, I riffed on the author’s commentary about the evolution of “mathematical education” but, in this case, changing it to “design education”:</p>
<ol>
<li>The “pre-rigorous” stage, in which design is taught in an informal, intuitive manner. What does your gut and instinct tell you for decision making? Go with it.</li>
<li>The “rigorous” stage, in which one is now taught that in order to do design “properly”, one needs to work and think in a much more precise and formal manner. The emphasis is now primarily on data and metrics and “proving” outcomes. Don’t focus too much on feeling but more on rationality. </li>
<li>The “post-rigorous” stage, in which one has grown comfortable with all the rigorous foundations of one’s chosen field, and is now ready to revisit and refine one’s pre-rigorous intuition on the subject, but this time with the intuition solidly buttressed by rigorous theory. The emphasis is now not design as it relates to individual things, but synthesizing the relationships between things and how they relate to the “big picture”. Feeling, intuition, data, and rationality are kept in balance with each other through iteration</li>
</ol>
<p>To be honest, I don’t know if any of this relates to what the author was trying to say as it relates to math, but it <em>feels</em> relatable to my path as a designer.</p>
<p>It’s a good reminder that the answer is usually a mix: it’s not data over intuition, nor rationality over feeling. Argue the contraries and you’ll find wisdom in-between. </p>

+ 205
- 0
cache/2022/4cea6f484d1e161074216e23d8826dea/index.html View File

@@ -0,0 +1,205 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Innovating beyond libraries and frameworks (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://nilsnh.no/2022/04/09/innovating-beyond-libraries-and-frameworks/">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Innovating beyond libraries and frameworks</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://nilsnh.no/2022/04/09/innovating-beyond-libraries-and-frameworks/" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p>I believe we should look beyond libraries and frameworks and rediscover the value of patterns and principles, and I’d argue that it would lead us to have less breaking changes and add more longevity to the stuff we build.</p>
<p>I have been a big fan of the <a href="https://www.brandons.me/blog/libraries-not-frameworks">write libraries, not frameworks</a> argument for a while now. Lately, I’ve come to ponder that there might be a fruitful expansion to this argument, that we should start to value principles over patterns, patterns over libraries, and libraries over frameworks.</p>
<p>Let’s clarify some terminology:</p>
<ul>
<li>
<p><strong>Framework:</strong> This is (usually) someone else’s code that calls your code. In order for this to work your code will need to conform to constraints set down by the framework. These constraints are often firm boundaries that’s hard to code around. On the flipside by coding within the framework’s conventions and constraints you tend to get a lot of useful functionality out of the box making coding quicker.</p>
</li>
<li>
<p><strong>Library:</strong> This is (usually) someone else’s code that <em>you call</em> from your code. A library tends to be some code that imposes fewer constraints on your code as compared to frameworks. By using one or more libraries you’re able to reuse someone else’s code to solve your problems. Libraries are easier to combine and interchange, while putting frameworks on top of frameworks can lead to a bad time.</p>
</li>
<li>
<p><strong>Pattern:</strong> This is a descriptive, reusable <em>approach</em> to writing your code (see: <a href="https://en.wikipedia.org/wiki/Software_design_pattern">software design pattern</a>). Patterns range in their vaguenes, applicability and prescriptiveness. Examples of programming patterns include <a href="https://www.itamarweiss.com/personal/2018/02/28/return-early-pattern.html">early-return pattern</a>, <a href="https://en.wikipedia.org/wiki/Builder_pattern">builder-pattern</a>, <a href="https://en.wikipedia.org/wiki/Actor_model">actor model</a>, <a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">model-view-controller</a>, <a href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/">onion architecture</a>, <a href="https://en.wikipedia.org/wiki/Microservices">microservices</a>, <a href="https://m.signalvnoise.com/the-majestic-monolith/">majestic monolith</a>, <a href="https://en.wikipedia.org/wiki/Monorepo">monorepos</a>, and <a href="https://en.wikipedia.org/wiki/React_(JavaScript_library)#Unidirectional_data_flow">flux architecture</a>. These are just some patterns that I can think off from the top of my head, but there are many books that cover programming patterns.</p>
</li>
</ul>

<p>Having listed all these helpful points, I must also add a caution here about not to overuse them and/or apply them in ill-fit contexts (<a href="https://en.wikipedia.org/wiki/Law_of_the_instrument">see: Law of the instrument</a>). Case in point, here’s an article titled <a href="https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction">The Wrong Abstraction</a> where developer Sandi Metz gives an excellent critique of developers' tendency to apply the DRY principle at all costs.</p>
<h2 id="who-maintains-the-maintainers">Who maintains the maintainers? <a href="#who-maintains-the-maintainers" aria-label="Link to section: Who maintains the maintainers?">#</a></h2>
<p>So, I’m not here to argue that we should stop using frameworks and libraries, but we should recognize that using them is a tradeoff where we gain some functionality by incurring some costs. For instance there’s a cost in having to keep up with updates. Codebases that lag behind on updates can become vulnerable to security exploits. Conversely, if you uncritically install the latest updates you open the door to supply-chain attacks where malicious code is inserted into one or more packages.</p>
<p>Beyond security-related costs there’s also the risk that the code you rely on becomes abandon-ware <a href="https://medium.com/@timrwood/moment-endof-term-522d8965689">because an author burns</a> out or <a href="https://blog.angular.io/stable-angularjs-and-long-term-support-7e077635ee9c">an in-house team changes focus</a>. Apparently, <a href="https://endoflife.date/">all sorts of stuff is discontinued</a> all the time. And to this you might retort, “it’s open-source we can always fork it.” That’s true, so will you maintain it? I think it’s useful to ask oneself when adding any given dependency what’s the chance of this being abandoned and if so what do I do then, maintain it or switch it out? Libraries tend at least to be more replaceable.</p>
<p>How do we gauge whether some code project is in danger of being abandoned? We tend to look at the recent activity, just <a href="https://github.com/search?q=is+this+dead&amp;type=issues">try searching Github for “is this dead”</a>. Faced with an onslaught of such questions authors can either declare bancrupcy and archive the project, not respond to the issue and fade into oblivion, or put the pedal to the metal by pushing out new features and expanding the code’s scope to solve any problem ever encountered by any user of the code. Succumbing to such a feature-fever quickly leads to breaking changes, necessitating <a href="https://www.sitepoint.com/getting-started-with-codemods/">codemods</a>, documenting upgrade-paths and responding to issues by developers who are desperately trying to keep up with all the changes. Any technology that matures and stabilizes risk being declared “dead” and shunned by a hype-sensitive industry which is something I covered in <a href="https://nilsnh.no/2018/01/13/how-good-code-dies/">How good code dies</a>.</p>
<p>Others' code can also impose a hidden change-cost that makes it painful to upgrade or move away from it. Frameworks and libraries often introduce concepts that are specific to them. In other words all the experience that you build up by using and debugging this tool risk being useless if you decide to move to another framework or library. Bat an eyelash and your framework releases a major version upgrade removing old framework-specific concepts and thereby by making all your hardwon experience irrelevant anyway. I think this cost is particularly insidious especially coupled with <a href="https://en.wikipedia.org/wiki/Sunk_cost">the sunk-cost fallacy</a>.</p>

<h2 id="beyond-libraries-and-frameworks">Beyond libraries and frameworks <a href="#beyond-libraries-and-frameworks" aria-label="Link to section: Beyond libraries and frameworks">#</a></h2>
<p>I believe that in our search for new and better ways to build technology we should not confine our thinking to only looking to libraries and frameworks for answers.</p>
<p>So, what lies beyond?</p>
<p>To start to answer that I’d like to point to some interesting undercurrents I’ve stumbled upon on the web. First, there’s an interesting talk by Adrian Holovaty titled <a href="https://www.youtube.com/watch?v=VvOsegaN9Wk">A framework author’s case against frameworks</a> where he argues that it’s fully feasible to build rich web applications without a framework. Second, I was pleasantly surprised when I read the <a href="https://remix.run/docs/en/v1/pages/philosophy">Remix Run framework’s philosophy</a>:</p>
<blockquote>
<p>We abstract enough to optimize your app’s performance […], without hiding the underlying technology. Learn how to prefetch assets in Remix with links, and you’ve learned how to prefetch assets in any website.</p>
</blockquote>
<p>This quote reads like an antidote to the change-cost I covered above. It’s a plus if learning some technology means learning transferrable knowledge.</p>
<p>Third, I learned about the concept of the <a href="https://tutorials.yax.com/articles/build-websites-the-yax-way/quicktakes/what-is-the-yax-way.html">Stackless Way</a> and read <a href="https://elisehe.in/2021/08/22/using-the-platform">a very interesting article by Elise Hein</a> who explored this nonorthodox idea of going stackless by not having a build-step and not using a framework.</p>
<p>When I <a href="https://nilsnh.no/2022/03/26/building-and-hosting-a-workshop-on-web-components/">built my workshop on web components</a> I also opted to explore how far I could go with a stackless approach. What I found was that our modern browsers are very capable and that I was able to write rich functionality without pulling in external code. It felt quite exhilarating and freeing. Yes, there’s still some rough edges to this approach. However, what’s missing might not be mature frameworks or libraries but rather a cookbook of patterns and principles.</p>
<p>Imagine that, an industry that’s a little less reliant on libraries and frameworks because we invest time into discovering and cultivating patterns and principles. I believe that’s a future with less maintainer burnout, less breaking changes and better, more long-lived programs.</p>
<p>Moving forward you’ll still find me using frameworks and libraries, and maybe I’ll even author some new one’s. Nevertheless, this stackless approach and searching for useful patterns and principles all the while prioritizing transferrable knowledge is something I aim to explore more.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 39
- 0
cache/2022/4cea6f484d1e161074216e23d8826dea/index.md View File

@@ -0,0 +1,39 @@
title: Innovating beyond libraries and frameworks
url: https://nilsnh.no/2022/04/09/innovating-beyond-libraries-and-frameworks/
hash_url: 4cea6f484d1e161074216e23d8826dea

<p>I believe we should look beyond libraries and frameworks and rediscover the value of patterns and principles, and I’d argue that it would lead us to have less breaking changes and add more longevity to the stuff we build.</p>
<p>I have been a big fan of the <a href="https://www.brandons.me/blog/libraries-not-frameworks">write libraries, not frameworks</a> argument for a while now. Lately, I’ve come to ponder that there might be a fruitful expansion to this argument, that we should start to value principles over patterns, patterns over libraries, and libraries over frameworks.</p>
<p>Let’s clarify some terminology:</p>
<ul>
<li>
<p><strong>Framework:</strong> This is (usually) someone else’s code that calls your code. In order for this to work your code will need to conform to constraints set down by the framework. These constraints are often firm boundaries that’s hard to code around. On the flipside by coding within the framework’s conventions and constraints you tend to get a lot of useful functionality out of the box making coding quicker.</p>
</li>
<li>
<p><strong>Library:</strong> This is (usually) someone else’s code that <em>you call</em> from your code. A library tends to be some code that imposes fewer constraints on your code as compared to frameworks. By using one or more libraries you’re able to reuse someone else’s code to solve your problems. Libraries are easier to combine and interchange, while putting frameworks on top of frameworks can lead to a bad time.</p>
</li>
<li>
<p><strong>Pattern:</strong> This is a descriptive, reusable <em>approach</em> to writing your code (see: <a href="https://en.wikipedia.org/wiki/Software_design_pattern">software design pattern</a>). Patterns range in their vaguenes, applicability and prescriptiveness. Examples of programming patterns include <a href="https://www.itamarweiss.com/personal/2018/02/28/return-early-pattern.html">early-return pattern</a>, <a href="https://en.wikipedia.org/wiki/Builder_pattern">builder-pattern</a>, <a href="https://en.wikipedia.org/wiki/Actor_model">actor model</a>, <a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">model-view-controller</a>, <a href="https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/">onion architecture</a>, <a href="https://en.wikipedia.org/wiki/Microservices">microservices</a>, <a href="https://m.signalvnoise.com/the-majestic-monolith/">majestic monolith</a>, <a href="https://en.wikipedia.org/wiki/Monorepo">monorepos</a>, and <a href="https://en.wikipedia.org/wiki/React_(JavaScript_library)#Unidirectional_data_flow">flux architecture</a>. These are just some patterns that I can think off from the top of my head, but there are many books that cover programming patterns.</p>
</li>
</ul>


<p>Having listed all these helpful points, I must also add a caution here about not to overuse them and/or apply them in ill-fit contexts (<a href="https://en.wikipedia.org/wiki/Law_of_the_instrument">see: Law of the instrument</a>). Case in point, here’s an article titled <a href="https://sandimetz.com/blog/2016/1/20/the-wrong-abstraction">The Wrong Abstraction</a> where developer Sandi Metz gives an excellent critique of developers' tendency to apply the DRY principle at all costs.</p>
<h2 id="who-maintains-the-maintainers">Who maintains the maintainers? <a href="#who-maintains-the-maintainers" aria-label="Link to section: Who maintains the maintainers?">#</a></h2>
<p>So, I’m not here to argue that we should stop using frameworks and libraries, but we should recognize that using them is a tradeoff where we gain some functionality by incurring some costs. For instance there’s a cost in having to keep up with updates. Codebases that lag behind on updates can become vulnerable to security exploits. Conversely, if you uncritically install the latest updates you open the door to supply-chain attacks where malicious code is inserted into one or more packages.</p>
<p>Beyond security-related costs there’s also the risk that the code you rely on becomes abandon-ware <a href="https://medium.com/@timrwood/moment-endof-term-522d8965689">because an author burns</a> out or <a href="https://blog.angular.io/stable-angularjs-and-long-term-support-7e077635ee9c">an in-house team changes focus</a>. Apparently, <a href="https://endoflife.date/">all sorts of stuff is discontinued</a> all the time. And to this you might retort, “it’s open-source we can always fork it.” That’s true, so will you maintain it? I think it’s useful to ask oneself when adding any given dependency what’s the chance of this being abandoned and if so what do I do then, maintain it or switch it out? Libraries tend at least to be more replaceable.</p>
<p>How do we gauge whether some code project is in danger of being abandoned? We tend to look at the recent activity, just <a href="https://github.com/search?q=is+this+dead&amp;type=issues">try searching Github for “is this dead”</a>. Faced with an onslaught of such questions authors can either declare bancrupcy and archive the project, not respond to the issue and fade into oblivion, or put the pedal to the metal by pushing out new features and expanding the code’s scope to solve any problem ever encountered by any user of the code. Succumbing to such a feature-fever quickly leads to breaking changes, necessitating <a href="https://www.sitepoint.com/getting-started-with-codemods/">codemods</a>, documenting upgrade-paths and responding to issues by developers who are desperately trying to keep up with all the changes. Any technology that matures and stabilizes risk being declared “dead” and shunned by a hype-sensitive industry which is something I covered in <a href="https://nilsnh.no/2018/01/13/how-good-code-dies/">How good code dies</a>.</p>
<p>Others' code can also impose a hidden change-cost that makes it painful to upgrade or move away from it. Frameworks and libraries often introduce concepts that are specific to them. In other words all the experience that you build up by using and debugging this tool risk being useless if you decide to move to another framework or library. Bat an eyelash and your framework releases a major version upgrade removing old framework-specific concepts and thereby by making all your hardwon experience irrelevant anyway. I think this cost is particularly insidious especially coupled with <a href="https://en.wikipedia.org/wiki/Sunk_cost">the sunk-cost fallacy</a>.</p>

<h2 id="beyond-libraries-and-frameworks">Beyond libraries and frameworks <a href="#beyond-libraries-and-frameworks" aria-label="Link to section: Beyond libraries and frameworks">#</a></h2>
<p>I believe that in our search for new and better ways to build technology we should not confine our thinking to only looking to libraries and frameworks for answers.</p>
<p>So, what lies beyond?</p>
<p>To start to answer that I’d like to point to some interesting undercurrents I’ve stumbled upon on the web. First, there’s an interesting talk by Adrian Holovaty titled <a href="https://www.youtube.com/watch?v=VvOsegaN9Wk">A framework author’s case against frameworks</a> where he argues that it’s fully feasible to build rich web applications without a framework. Second, I was pleasantly surprised when I read the <a href="https://remix.run/docs/en/v1/pages/philosophy">Remix Run framework’s philosophy</a>:</p>
<blockquote>
<p>We abstract enough to optimize your app’s performance […], without hiding the underlying technology. Learn how to prefetch assets in Remix with links, and you’ve learned how to prefetch assets in any website.</p>
</blockquote>
<p>This quote reads like an antidote to the change-cost I covered above. It’s a plus if learning some technology means learning transferrable knowledge.</p>
<p>Third, I learned about the concept of the <a href="https://tutorials.yax.com/articles/build-websites-the-yax-way/quicktakes/what-is-the-yax-way.html">Stackless Way</a> and read <a href="https://elisehe.in/2021/08/22/using-the-platform">a very interesting article by Elise Hein</a> who explored this nonorthodox idea of going stackless by not having a build-step and not using a framework.</p>
<p>When I <a href="https://nilsnh.no/2022/03/26/building-and-hosting-a-workshop-on-web-components/">built my workshop on web components</a> I also opted to explore how far I could go with a stackless approach. What I found was that our modern browsers are very capable and that I was able to write rich functionality without pulling in external code. It felt quite exhilarating and freeing. Yes, there’s still some rough edges to this approach. However, what’s missing might not be mature frameworks or libraries but rather a cookbook of patterns and principles.</p>
<p>Imagine that, an industry that’s a little less reliant on libraries and frameworks because we invest time into discovering and cultivating patterns and principles. I believe that’s a future with less maintainer burnout, less breaking changes and better, more long-lived programs.</p>
<p>Moving forward you’ll still find me using frameworks and libraries, and maybe I’ll even author some new one’s. Nevertheless, this stackless approach and searching for useful patterns and principles all the while prioritizing transferrable knowledge is something I aim to explore more.</p>

+ 194
- 0
cache/2022/56f14d85f38a7bb04e187aa3334bdb57/index.html View File

@@ -0,0 +1,194 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>désabler l'imagination (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://www.la-grange.net/2022/03/20/imagination">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>désabler l'imagination</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://www.la-grange.net/2022/03/20/imagination" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<figure>
<img src="https://www.la-grange.net/2022/03/20/3858-chateau.jpg" alt="château de sable.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<blockquote>
<p>I had no idea where it had come from or where it was going, but it felt as if this thing that held my shape, this form before my eyes, would be stuck floating there forever.<br>
— Breasts and eggs, Mieko Kawakami, urn:isbn:978-1529074413</p>
</blockquote>
<p>Sur la plage de Tsujido, nous avons construit un grand château de sable. Nous avons découvert un chat (?) que l'océan a délaissé sur la plage après la marée. Je pense à son <a href="/2002/12/18.html">ami de l'aître Saint-Maclou</a>. Celui-ci ne survivra pas les années de l'autre même dans sa forme décharnée. Combien de squelettes au fond des océans ?</p>

<figure>
<img src="https://www.la-grange.net/2022/03/20/3862-tete-chat.jpg" alt="crâne de chat.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<p>Il me pose de nombreuses questions. Il s'interroge probablement. Il tente de trouver une réponse, d'organiser le monde dans une forme palpable, abordable pour lui. Nous continuons le château. Et puis je le vois plus tard s'éloigner de nouveau et expliquer la découverte aux gens qui passent sur la plage. Il est maintenant le maître de l'histoire. Il n'est plus soumis à elle. Il la détermine en se libérant par les mots vers les autres.</p>

<figure>
<img src="https://www.la-grange.net/2022/03/20/3864-coquillages.jpg" alt="branche d'arbres avec coquillages sur le bout des brindilles.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<p>J'aime les constructions de sable sur la plage. Il n'y a pas d'attente de durabilité, ni de perfection. L'espace est totalement libre. L'œuvre disparaîtra irrémédiablement. Mais le temps de l'élaboration nous construit poétiquement, amicalement, socialement. Nous sommes, dans ce moment là, existence.</p>
<hr>
<p>Les <a href="https://www.theatlantic.com/ideas/archive/2022/03/writing-controversial-opinions-journalism/627014/">choses que nous avons peur d'écrire</a>. À cause de la meute sociale sur le Web, par respect pour une personne aimée, pour éviter les conflits avec des proches, pour des raisons professionnelles. Tous ces petits moments où on auto-censure sa propre réflexion, son processus de pensée candide afin d'explorer un sujet au risque que le sujet apporte plus de troubles que nécessaire.</p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 27
- 0
cache/2022/56f14d85f38a7bb04e187aa3334bdb57/index.md View File

@@ -0,0 +1,27 @@
title: désabler l'imagination
url: https://www.la-grange.net/2022/03/20/imagination
hash_url: 56f14d85f38a7bb04e187aa3334bdb57
<figure>
<img src="https://www.la-grange.net/2022/03/20/3858-chateau.jpg" alt="château de sable.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<blockquote>
<p>I had no idea where it had come from or where it was going, but it felt as if this thing that held my shape, this form before my eyes, would be stuck floating there forever.<br>
— Breasts and eggs, Mieko Kawakami, urn:isbn:978-1529074413</p>
</blockquote>
<p>Sur la plage de Tsujido, nous avons construit un grand château de sable. Nous avons découvert un chat (?) que l'océan a délaissé sur la plage après la marée. Je pense à son <a href="/2002/12/18.html">ami de l'aître Saint-Maclou</a>. Celui-ci ne survivra pas les années de l'autre même dans sa forme décharnée. Combien de squelettes au fond des océans ?</p>

<figure>
<img src="https://www.la-grange.net/2022/03/20/3862-tete-chat.jpg" alt="crâne de chat.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<p>Il me pose de nombreuses questions. Il s'interroge probablement. Il tente de trouver une réponse, d'organiser le monde dans une forme palpable, abordable pour lui. Nous continuons le château. Et puis je le vois plus tard s'éloigner de nouveau et expliquer la découverte aux gens qui passent sur la plage. Il est maintenant le maître de l'histoire. Il n'est plus soumis à elle. Il la détermine en se libérant par les mots vers les autres.</p>

<figure>
<img src="https://www.la-grange.net/2022/03/20/3864-coquillages.jpg" alt="branche d'arbres avec coquillages sur le bout des brindilles.">
<figcaption>Tsujido, Japon, 20 mars 2022</figcaption>
</figure>
<p>J'aime les constructions de sable sur la plage. Il n'y a pas d'attente de durabilité, ni de perfection. L'espace est totalement libre. L'œuvre disparaîtra irrémédiablement. Mais le temps de l'élaboration nous construit poétiquement, amicalement, socialement. Nous sommes, dans ce moment là, existence.</p>
<hr>
<p>Les <a href="https://www.theatlantic.com/ideas/archive/2022/03/writing-controversial-opinions-journalism/627014/">choses que nous avons peur d'écrire</a>. À cause de la meute sociale sur le Web, par respect pour une personne aimée, pour éviter les conflits avec des proches, pour des raisons professionnelles. Tous ces petits moments où on auto-censure sa propre réflexion, son processus de pensée candide afin d'explorer un sujet au risque que le sujet apporte plus de troubles que nécessaire.</p>

+ 312
- 0
cache/2022/66d9d4be64db7fe8324a4fdcbf3ef705/index.html View File

@@ -0,0 +1,312 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>Hope for the Future (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
themeName === 'dark'
)
document.documentElement.classList.toggle(
'forced-light',
themeName === 'light'
)
}
const selectedTheme = localStorage.getItem('theme')
if (selectedTheme !== 'undefined') {
toggleTheme(selectedTheme)
}
</script>

<meta name="robots" content="noindex, nofollow">
<meta content="origin-when-cross-origin" name="referrer">
<!-- Canonical URL for SEO purposes -->
<link rel="canonical" href="https://hackeducation.com/2022/03/08/hope">

<body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">


<article>
<header>
<h1>Hope for the Future</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="https://hackeducation.com/2022/03/08/hope" title="Lien vers le contenu original">Source originale</a>
</p>
</nav>
<hr>
<p><em>This is the transcript of the keynote I gave today at Digifest. (Well, I recorded it a couple of weeks ago, but it was broadcast today, and I popped in for some "live" Q&amp;A afterwards, where I was asked the obligatory "do you hate all ed-tech" question. And here I was, trying to be all sweetness and light...)</em></p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest1.jpg"></p>

<p>Thank you very much for inviting me to speak to you today. I'm happy to be here — and when I say "here," I do mean in my apartment, in sunny California. Personally, I'm not ready to travel yet, not remotely interested in getting back on an airplane — because let's be honest, air travel was already terrible. And I am pleased that, if nothing else good comes out of the pandemic, I can now do keynote talks in my bare feet and yoga pants.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest2.jpg"></p>

<p>Those of you who are familiar with my work are likely a bit taken aback to see that the title of my talk today contains the word "Hope." After all, I have been called "Ed-Tech's Cassandra," and like the Trojan priestess, I am known for my proclamations and predictions of doom. As such, I am not viewed as a messenger with good news. My talks, I'm often told, are "depressing" and make folks want to leave the field. (From time-to-time, when I do hear about some high-profile tech entrepreneur who has decided to turn away from "disrupting education" towards building "flying taxis" or whatever, I do like to think I played some small part in their frustrated disillusionment.)</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest3.jpg"></p>

<p>The thing is, though, like Cassandra, I'm not wrong. I know that my work makes people feel uncomfortable, particularly when so much of the tech and ed-tech industry mantra rests on narratives promising a happy, shiny, better future. No one appreciates it when someone comes along and says "actually, if you wheel this giant horse — impressive as it looks — inside the gates, it'll destroy everything you love, everyone you care about. Don't do it."</p>

<p>And like Cassandra, it's exhausting to keep repeating "don't do it," and to have folks go right on ahead and do it anyway. I've been writing about ed-tech for over a decade now, cautioning people about the repercussions of handing over data, infrastructure, ideology, investment to Silicon Valley types. And for what?</p>

<p>And for what?</p>

<p>Trust me, I've spent a lot of the last few years stewing on that question — particularly as I have watched the awfulness of pandemic education (and its digital components) unfold: what has my work done? What change, what difference have I made?</p>

<p>For so many reasons, it's been hard not to sink into utter despair. I know many of us feel that way right now.</p>

<p>I don't think I'm exaggerating or even doomsaying to state that things don't look good. The pandemic. Still. Global climate change. (I say I'm glad to be in sunny California but it's actually the rainy season, and it hasn't rained in over a month.) Poverty. War and impending war. Inflation. Rising economic inequality and precarity. Drug overdoses. Genocide. Nationalism. White supremacy. Neoliberalism. Violence. Mass incarceration. Fanaticism. Surveillance technologies. Disinvestment from the public sphere. Anti-science rhetoric. A rejection of education. A rejection of knowledge. "Things are," as Malcolm Harris wrote on a sign during the Occupy Wall Street protests in Zucotti Park back in 2011 (and as he titled his recent book) "fucked up and bullshit." We aren't in a good place right now — structurally or socially or individually or psychologically or physically. And it's hard to see how we're headed towards a good place either.</p>

<p>Many of us are grieving; many of us are traumatized. Many of our students are grieving; many of our students are traumatized. Most, dare I say. All of us, even. Deeply and profoundly so. To ignore this, to minimize this, to pretend as though "back to normal" can or even should happen is injurious. To prescribe a piece of technology as some sort of solution or fix to any of this is insulting. To give a keynote full of sanitized sunshine is just gross.</p>

<p>And yet, we cannot not respond to trauma. We cannot not address what we have been through with the pandemic specifically and with — sweeping hand gesture — everything else.</p>

<p>Denial won't work. But the worst response, perhaps, is to forget (arguably a form of denial, but one that happens at a social not just on a psychological level).</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest4.jpg"></p>

<p>And that's what many powerful forces want — it's what they always want. Because forgetting isn't just about sliding into complacency. Forgetting also leads to despair — and this is crucial to my argument today — and broadly speaking, this is why (I tell myself at least) my work matters. Contrary to those who dismiss my work as a critic as negative or destructive, criticism is generative; it can be one of many (small) acts of hope — criticism grounded in historical analysis is the antithesis of a numbing forgetfulness or an invented nostalgia.</p>

<p>One of the things I have written about quite a bit is the idea of an "ed-tech amnesia" — that is, there is a certain inattention to and erasure of the history of the field of education technology. And I don’t just mean forgetting or erasing what happened in the 1950s or 1980s (although I wrote a book on that). I mean forgetting what happened five, ten years ago — it's been ten years, incidentally, since Occupy Wall Street, and I fear we've forgotten that great push to hold the rich and the banks and the venture capitalists accountable. I specifically mean forgetting what happened during the last few years, during the pandemic.</p>

<p>Ed-tech amnesia.</p>

<p>Some of this is a result of an influx of Silicon Valley types in recent years — people with no ties to education or education technology who think that their ignorance and lack of expertise is a strength. (I use that phrase "Silicon Valley" less as a geographic marker than an ideological one.) And it doesn't help, of course, that there is, in general, a repudiation of history within the Silicon Valley framework itself. The tech industry's historical amnesia — the inability to learn about, to recognize, to remember what has come before — is deeply intertwined with the idea of "disruption" and its firm belief that new technologies are necessarily innovative and are always "progress." I like to cite, as an example, a New Yorker article from a few years ago, an interview with an Uber engineer who'd pleaded guilty to stealing Google's self-driving car technology. "The only thing that matters is the future," he told the magazine. "I don't even know why we study history. It's entertaining, I guess — the dinosaurs and the Neanderthals and the Industrial Revolution, and stuff like that. But what already happened doesn't really matter. You don't need to know that history to build on what they made. In technology, all that matters is tomorrow." (I could tie this attitude to the Italian Futurists and to fascism, but that’s a presentation for another day.)</p>

<p>There are other examples of this historical amnesia in ed-tech specifically, no doubt. Narratives about the “factory model of education." Stories that education hasn't changed in hundreds of years. Tall tales about the invention of the MOOC. </p>

<p>I want us to be vigilant about this amnesia because it has political implications. In the coming months and years, many people will want us to forget their mistakes; they will try to rehabilitate not just their bad ideas but their very reputations. By "many people," of course, I mean Ivanka Trump. Maybe Prince Charles. But I also mean any number of people in education and education technology, who've not only screwed up the tools and practices of teaching and learning over the past year or so, but who have a rather long history of bad if not dangerous ideas and decisions. These are people who have done real, substantive damage to students, to teachers, to public education. Again and again. We cannot forget this.</p>

<p>I worry we already have, of course.</p>

<p>If we forget, we cannot hold the perpetrators accountable for this damage. If we forget, we cannot see the ways in which we have been strong, resilient, even defiant in the face of it all.</p>

<p>"Memory produces hope in the same way that amnesia produces despair," the theologian Walter Brueggeman wrote. Rebecca Solnit cites him in her book Hope in the Dark, originally published in April 2004, at the start of the second term of President George W. Bush (speaking of people whose reputations have been rehabilitated), right as many of us despaired that his incompetence had led us to war, as well as to an expansion of governmental power and surveillance. </p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest5.jpg"></p>

<p>"Memory produces hope in the same way that amnesia produces despair." "It’s an extraordinary statement," Solnit writes, "one that reminds us that though hope is about the future, grounds for hope lie in the records and recollections of the past. We can tell of a past that was nothing but defeats and cruelties and injustices, or of a past that was some lovely golden age now irretrievably lost, or we can tell a more complicated and accurate story, one that has room for the best and worst, for atrocities and liberations, for grief and jubilation. A memory commensurate to the complexity of the past and the whole cast of participants, a memory that includes our power, produces that forward-directed energy called hope."</p>

<p>"Amnesia leads to despair in many ways," she continues. "The status quo would like you to believe it is immutable, inevitable, and invulnerable, and lack of memory of a dynamically changing world reinforces this view. In other words, when you don’t know how much things have changed, you don’t see that they are changing or that they can change."</p>

<p>The future is not pre-ordained. Yes, these are terrible times. Yes, the path forward seems incredibly challenging for those of us who believe in education, particularly public education, and who believe that education can be re-oriented away from exploitation and domination and towards justice. </p>

<p>Contrary to the popular story, there is no inevitability of a technological future of education. There's no inevitability to "online." There's not, despite how loudly ed-tech evangelists insist that "There's no going back now," so pleased that disaster capitalism has helped unlock the possibility they've longed for: one in which all teaching and learning is mediated through their digital platforms, in which labor unions are busted, in which public funding is eviscerated to make way for privatized profiteering. </p>

<p>Of course, there is no "back." Time doesn't work that way. And no one wants to go "back." That's a red herring, akin to thinking "luddite" is an insult. The luddites didn't want to go back; they wanted the future to be better. From where we are, there is always only forward. But the future is unwritten. Forward is open and incumbent upon us to shape.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest6.jpg"></p>

<p>"The best way to predict the future is to build it," computer scientist Alan Kay famously said. But computer scientists should not be alone in that building. (God forbid.) </p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest7.jpg"></p>

<p>I've long argued that the best way to predict the future is to issue a press release. Or the best way to predict the future is to complain about something in your weekly op-ed in The New York Times. By this, I mean that it's not always so much the building as it is the storytelling that sways the direction the future flows.</p>

<p>Again, that's why stories of the past matter as much as do stories of the future — even when (and especially when) predicting the future.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest8.jpg"></p>

<p>One of my favorite science fiction authors, Octavia Butler, was once asked about this: </p>

<blockquote>
<p>'So do you really believe that in the future we’re going to have the kind of trouble you write about in your books?' a student asked me as I was signing books after a talk. The young man was referring to the troubles I’d described in Parable of the Sower and Parable of the Talents, novels that take place in a near future of increasing drug addiction and illiteracy, marked by the popularity of prisons and the unpopularity of public schools, the vast and growing gap between the rich and everyone else, and the whole nasty family of problems brought on by global warming.</p></blockquote>

<blockquote><p>'I didn’t make up the problems,' I pointed out. 'All I did was look around at the problems we’re neglecting now and give them about 30 years to grow into full-fledged disasters.'</p></blockquote>

<blockquote><p>'Okay,' the young man challenged. 'So what’s the answer?'</p></blockquote>

<blockquote><p>'There isn’t one,' I told him.</p></blockquote>

<blockquote><p>'No answer? You mean we’re just doomed?' He smiled as though he thought this might be a joke.</p></blockquote>

<blockquote><p>'No,' I said. 'I mean there’s no single answer that will solve all of our future problems. There’s no magic bullet. Instead there are thousands of answers — at least. You can be one of them if you choose to be.'</p>
</blockquote>

<p>You can be one of the answers if you choose to be.</p>

<p>"Writing novels about the future doesn’t give me any special ability to foretell the future," Butler said. "But it does encourage me to use our past and present behaviors as guides to the kind of world we seem to be creating. The past, for example, is filled with repeating cycles of strength and weakness, wisdom and stupidity, empire and ashes. To study history is to study humanity. And to try to foretell the future without studying history is like trying to learn to read without bothering to learn the alphabet."</p>

<p>Too many people who try to predict the future of education and education technology have not bothered to learn the alphabet — the grammar of schooling, to borrow a phrase from education historian Larry Cuban. That grammar includes the beliefs and practices and memory of schooling — our collective memory, not just our own personal experiences of school. That collective memory — that's history.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest9.jpg"></p>

<p>When I wrote my book Teaching Machines, I wanted to chronicle a longer history of ed-tech than the story that often gets told — a history that, strangely enough when you think about it, often begins and ends with the computer. Through this framework, computers — "the digital" — are teleological. And those who question technology are therefore aberrant because technology is all there ever was, is, or will be. </p>

<p>I wanted to show in my book that many of the ideas that get bandied about today as innovative or (god forbid) revolutionary have a long history. Educational psychologists, for example, have been building technologies to "personalize education" for over a century. To recognize this is to see the legacy of their work in our objects and in our practices today; it is to understand that if these objects were constructed they can be challenged and dismantled. They are not natural. They are not inevitable. And it is to know too that there has always been resistance and refusal — successful resistance and refusal — to the vision of an automated education. </p>

<p>There has always been change — and that change has come from the popular power of students and teachers, not just the financial and political power of businessmen, always so desperate to center themselves in our stories of "transformation." We have always been strong. We have had to be resilient.</p>

<p>"Who controls the past controls the future. Who controls the present controls the past," as Rage Against the Machine sang in their 1999 song "Testify." OK, actually it's a quote from George Orwell's 1984, but hey. To control the past, we have to know our history. "The stories we tell about who we were and what we did shape what we can and will do," Rebecca Solnit argues.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest10.jpg"></p>

<p>And we can change the future. We have before. Never forget that. As my other favorite science fiction author Ursula Le Guin said, "any human power can be resisted and changed by human beings." And we must resist and we much change. We must believe we can. We must have hope.</p>

<p>A few years ago, I listened to a speaker who was quite critical — in passing, mind you — of hope. And she wasn't alone. There was so much energy channeled into that word when it became the slogan of a young Senator from Illinois and his starry-eyed Presidential campaign. After 8 years of Barack Obama in office and so many unfulfilled promises, so much disappointment (and of course the rise of a violent white nationalism in response) many people have lost hope. They've lost faith in hope. They're utterly disillusioned by it.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest11.jpg"></p>

<p>That speaker said that "you cannot counter structural inequality with good will." And I immediately thought of Antonio Gramsci, as one does. One of the greatest Marxist thinkers of the 20th century, Gramsci is best known for writing some 3000 pages of history during his imprisonment by the Fascist Italian government from 1927 until his death ten years later at age 46. Gramsci famously said "I am a pessimist because of intelligence but an optimist because of will." Will, according to Gramsci, is part of a revolutionary praxis. It recognizes the social structure, and it helps us to move deliberately from thinking about to acting for radical change. Will is, for Gramsci, political and intellectual. Will is a strategy, or part of a strategy of struggle. Will is bound of in the politics of hope. Hope is bound up in the politics of will.</p>

<p>You all came to this event because, I'd wager, of will. Good will. Willpower. A will to change your own pedagogical practices. A will to change your institutions. Will is necessary, politically. I hope that you will consider how to tie that will to action, to collective action. You are not alone. I believe that you came to education too because you believe in the future. You must to work in this field. Educators engage in the profound process and practice of engaging minds in change — intellectual transformation. Education straddles the past — "the curriculum" — and the future — individually and societally. Education is about what we learn today so we can be better tomorrow. Education is a practice of hope. You cannot be indifferent about the future and be an educator. </p>

<p>Another passage from Gramsci (who I put alongside Paolo Freire, Franz Fanon, bell hooks as one of the most important thinkers in education who's rarely recognized as such), from a 1917 letter "Indifferenti":</p>

<blockquote>
<p>I hate the indifferent. I believe that life means taking sides. One who is really alive, can be nothing if not citizen and partisan. Indifference is lethargy: it is parasitism, not life. Therefore, I hate the indifferent.</p></blockquote>

<blockquote><p>Indifference is the dead weight of history. Indifference plays an important role in history. It plays a passive role, but it does play a role. It is fatality; it is something that cannot be counted on; it is something that disrupts programmes, overturns the best made plans; it is that awful something that chokes intelligence. What happens, the evil that touches everyone, happens because the majority relinquish their will to it, allowing the enactment of laws that only a revolution can revoke, letting men rise to power who, later, only a mutiny can remove. </p></blockquote>

<blockquote><p>... I am "partigiano", alive, and already I hear, in the consciences of those on my same side, the throbbing bustle of the city of the future that we are building. And in it, the social chain does not weigh on the shoulders of only a few .... There is no-one watching from the sidelines while others are sacrificed, bled dry. I am alive, partisan. And, therefore, I hate those who do not take sides; I hate the indifferent.</p>
</blockquote>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest12.jpg"></p>

<p>Memory counteracts indifference. Memory counteracts despair. Memory creates the space for hope. Memory reminds us: change is possible. It urges us: change is necessary. </p>

<p>It will not be easy. It never is. Even having hope can be hard, let alone making change.</p>

<p>"Hope is a discipline," prison abolitionist Mariame Kaba reminds us. It is not an emotion. It is not even as Gramsci put it simply "optimism" — a belief that things will get better. Hope is work. You have to put energy and time into it. You have to practice, repeatedly. You have to keep at it, keep moving, keep pushing. No one else will free you or fix you — except us, collectively through our power to imagine and build a better future. </p>

<p>Hope is not in technology. Hope is in our humanity.</p>

<p>A better future for all of us, for all living creatures on this planet does not look like an app or a platform or a gadget. It does not look like an institution founded hundreds of years ago, desperate to cling to old hierarchies. It does not look like an institution founded more recently, desperate to re-inscribe new hierarchies. Join me in refusing the old world, and in refusing the future envisioned by the techno-elite. Our refusals can be small. Our actions might seem insignificant. But do not despair. We aren't alone in this — resistance is part of our legacy. We can make it our future. We can hope.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest13.jpg"></p>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
</svg> Accueil</a> •
<a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
</svg> Suivre</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
</svg> Pro</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
</svg> Email</a> •
<abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
</svg> Légal</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend><svg class="icon icon-brightness-contrast">
<use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
</svg> Thème</legend>
<label>
<input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
</label>
<label>
<input type="radio" value="dark" name="chosen-color-scheme"> Foncé
</label>
<label>
<input type="radio" value="light" name="chosen-color-scheme"> Clair
</label>
</fieldset>
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
<script>
function loadThemeForm(templateName) {
const themeSelectorTemplate = document.querySelector(templateName)
const form = themeSelectorTemplate.content.firstElementChild
themeSelectorTemplate.replaceWith(form)

form.addEventListener('change', (e) => {
const chosenColorScheme = e.target.value
localStorage.setItem('theme', chosenColorScheme)
toggleTheme(chosenColorScheme)
})

const selectedTheme = localStorage.getItem('theme')
if (selectedTheme && selectedTheme !== 'undefined') {
form.querySelector(`[value="${selectedTheme}"]`).checked = true
}
}

const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
window.addEventListener('load', () => {
let hasDarkRules = false
for (const styleSheet of Array.from(document.styleSheets)) {
let mediaRules = []
for (const cssRule of styleSheet.cssRules) {
if (cssRule.type !== CSSRule.MEDIA_RULE) {
continue
}
// WARNING: Safari does not have/supports `conditionText`.
if (cssRule.conditionText) {
if (cssRule.conditionText !== prefersColorSchemeDark) {
continue
}
} else {
if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
continue
}
}
mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
}

// WARNING: do not try to insert a Rule to a styleSheet you are
// currently iterating on, otherwise the browser will be stuck
// in a infinite loop…
for (const mediaRule of mediaRules) {
styleSheet.insertRule(mediaRule.cssText)
hasDarkRules = true
}
}
if (hasDarkRules) {
loadThemeForm('#theme-selector')
}
})
</script>
</body>
</html>

+ 145
- 0
cache/2022/66d9d4be64db7fe8324a4fdcbf3ef705/index.md View File

@@ -0,0 +1,145 @@
title: Hope for the Future
url: https://hackeducation.com/2022/03/08/hope
hash_url: 66d9d4be64db7fe8324a4fdcbf3ef705

<p><em>This is the transcript of the keynote I gave today at Digifest. (Well, I recorded it a couple of weeks ago, but it was broadcast today, and I popped in for some "live" Q&amp;A afterwards, where I was asked the obligatory "do you hate all ed-tech" question. And here I was, trying to be all sweetness and light...)</em></p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest1.jpg"></p>

<p>Thank you very much for inviting me to speak to you today. I'm happy to be here — and when I say "here," I do mean in my apartment, in sunny California. Personally, I'm not ready to travel yet, not remotely interested in getting back on an airplane — because let's be honest, air travel was already terrible. And I am pleased that, if nothing else good comes out of the pandemic, I can now do keynote talks in my bare feet and yoga pants.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest2.jpg"></p>

<p>Those of you who are familiar with my work are likely a bit taken aback to see that the title of my talk today contains the word "Hope." After all, I have been called "Ed-Tech's Cassandra," and like the Trojan priestess, I am known for my proclamations and predictions of doom. As such, I am not viewed as a messenger with good news. My talks, I'm often told, are "depressing" and make folks want to leave the field. (From time-to-time, when I do hear about some high-profile tech entrepreneur who has decided to turn away from "disrupting education" towards building "flying taxis" or whatever, I do like to think I played some small part in their frustrated disillusionment.)</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest3.jpg"></p>

<p>The thing is, though, like Cassandra, I'm not wrong. I know that my work makes people feel uncomfortable, particularly when so much of the tech and ed-tech industry mantra rests on narratives promising a happy, shiny, better future. No one appreciates it when someone comes along and says "actually, if you wheel this giant horse — impressive as it looks — inside the gates, it'll destroy everything you love, everyone you care about. Don't do it."</p>

<p>And like Cassandra, it's exhausting to keep repeating "don't do it," and to have folks go right on ahead and do it anyway. I've been writing about ed-tech for over a decade now, cautioning people about the repercussions of handing over data, infrastructure, ideology, investment to Silicon Valley types. And for what?</p>

<p>And for what?</p>

<p>Trust me, I've spent a lot of the last few years stewing on that question — particularly as I have watched the awfulness of pandemic education (and its digital components) unfold: what has my work done? What change, what difference have I made?</p>

<p>For so many reasons, it's been hard not to sink into utter despair. I know many of us feel that way right now.</p>

<p>I don't think I'm exaggerating or even doomsaying to state that things don't look good. The pandemic. Still. Global climate change. (I say I'm glad to be in sunny California but it's actually the rainy season, and it hasn't rained in over a month.) Poverty. War and impending war. Inflation. Rising economic inequality and precarity. Drug overdoses. Genocide. Nationalism. White supremacy. Neoliberalism. Violence. Mass incarceration. Fanaticism. Surveillance technologies. Disinvestment from the public sphere. Anti-science rhetoric. A rejection of education. A rejection of knowledge. "Things are," as Malcolm Harris wrote on a sign during the Occupy Wall Street protests in Zucotti Park back in 2011 (and as he titled his recent book) "fucked up and bullshit." We aren't in a good place right now — structurally or socially or individually or psychologically or physically. And it's hard to see how we're headed towards a good place either.</p>

<p>Many of us are grieving; many of us are traumatized. Many of our students are grieving; many of our students are traumatized. Most, dare I say. All of us, even. Deeply and profoundly so. To ignore this, to minimize this, to pretend as though "back to normal" can or even should happen is injurious. To prescribe a piece of technology as some sort of solution or fix to any of this is insulting. To give a keynote full of sanitized sunshine is just gross.</p>

<p>And yet, we cannot not respond to trauma. We cannot not address what we have been through with the pandemic specifically and with — sweeping hand gesture — everything else.</p>

<p>Denial won't work. But the worst response, perhaps, is to forget (arguably a form of denial, but one that happens at a social not just on a psychological level).</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest4.jpg"></p>

<p>And that's what many powerful forces want — it's what they always want. Because forgetting isn't just about sliding into complacency. Forgetting also leads to despair — and this is crucial to my argument today — and broadly speaking, this is why (I tell myself at least) my work matters. Contrary to those who dismiss my work as a critic as negative or destructive, criticism is generative; it can be one of many (small) acts of hope — criticism grounded in historical analysis is the antithesis of a numbing forgetfulness or an invented nostalgia.</p>

<p>One of the things I have written about quite a bit is the idea of an "ed-tech amnesia" — that is, there is a certain inattention to and erasure of the history of the field of education technology. And I don’t just mean forgetting or erasing what happened in the 1950s or 1980s (although I wrote a book on that). I mean forgetting what happened five, ten years ago — it's been ten years, incidentally, since Occupy Wall Street, and I fear we've forgotten that great push to hold the rich and the banks and the venture capitalists accountable. I specifically mean forgetting what happened during the last few years, during the pandemic.</p>

<p>Ed-tech amnesia.</p>

<p>Some of this is a result of an influx of Silicon Valley types in recent years — people with no ties to education or education technology who think that their ignorance and lack of expertise is a strength. (I use that phrase "Silicon Valley" less as a geographic marker than an ideological one.) And it doesn't help, of course, that there is, in general, a repudiation of history within the Silicon Valley framework itself. The tech industry's historical amnesia — the inability to learn about, to recognize, to remember what has come before — is deeply intertwined with the idea of "disruption" and its firm belief that new technologies are necessarily innovative and are always "progress." I like to cite, as an example, a New Yorker article from a few years ago, an interview with an Uber engineer who'd pleaded guilty to stealing Google's self-driving car technology. "The only thing that matters is the future," he told the magazine. "I don't even know why we study history. It's entertaining, I guess — the dinosaurs and the Neanderthals and the Industrial Revolution, and stuff like that. But what already happened doesn't really matter. You don't need to know that history to build on what they made. In technology, all that matters is tomorrow." (I could tie this attitude to the Italian Futurists and to fascism, but that’s a presentation for another day.)</p>

<p>There are other examples of this historical amnesia in ed-tech specifically, no doubt. Narratives about the “factory model of education." Stories that education hasn't changed in hundreds of years. Tall tales about the invention of the MOOC. </p>

<p>I want us to be vigilant about this amnesia because it has political implications. In the coming months and years, many people will want us to forget their mistakes; they will try to rehabilitate not just their bad ideas but their very reputations. By "many people," of course, I mean Ivanka Trump. Maybe Prince Charles. But I also mean any number of people in education and education technology, who've not only screwed up the tools and practices of teaching and learning over the past year or so, but who have a rather long history of bad if not dangerous ideas and decisions. These are people who have done real, substantive damage to students, to teachers, to public education. Again and again. We cannot forget this.</p>

<p>I worry we already have, of course.</p>

<p>If we forget, we cannot hold the perpetrators accountable for this damage. If we forget, we cannot see the ways in which we have been strong, resilient, even defiant in the face of it all.</p>

<p>"Memory produces hope in the same way that amnesia produces despair," the theologian Walter Brueggeman wrote. Rebecca Solnit cites him in her book Hope in the Dark, originally published in April 2004, at the start of the second term of President George W. Bush (speaking of people whose reputations have been rehabilitated), right as many of us despaired that his incompetence had led us to war, as well as to an expansion of governmental power and surveillance. </p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest5.jpg"></p>

<p>"Memory produces hope in the same way that amnesia produces despair." "It’s an extraordinary statement," Solnit writes, "one that reminds us that though hope is about the future, grounds for hope lie in the records and recollections of the past. We can tell of a past that was nothing but defeats and cruelties and injustices, or of a past that was some lovely golden age now irretrievably lost, or we can tell a more complicated and accurate story, one that has room for the best and worst, for atrocities and liberations, for grief and jubilation. A memory commensurate to the complexity of the past and the whole cast of participants, a memory that includes our power, produces that forward-directed energy called hope."</p>

<p>"Amnesia leads to despair in many ways," she continues. "The status quo would like you to believe it is immutable, inevitable, and invulnerable, and lack of memory of a dynamically changing world reinforces this view. In other words, when you don’t know how much things have changed, you don’t see that they are changing or that they can change."</p>

<p>The future is not pre-ordained. Yes, these are terrible times. Yes, the path forward seems incredibly challenging for those of us who believe in education, particularly public education, and who believe that education can be re-oriented away from exploitation and domination and towards justice. </p>

<p>Contrary to the popular story, there is no inevitability of a technological future of education. There's no inevitability to "online." There's not, despite how loudly ed-tech evangelists insist that "There's no going back now," so pleased that disaster capitalism has helped unlock the possibility they've longed for: one in which all teaching and learning is mediated through their digital platforms, in which labor unions are busted, in which public funding is eviscerated to make way for privatized profiteering. </p>

<p>Of course, there is no "back." Time doesn't work that way. And no one wants to go "back." That's a red herring, akin to thinking "luddite" is an insult. The luddites didn't want to go back; they wanted the future to be better. From where we are, there is always only forward. But the future is unwritten. Forward is open and incumbent upon us to shape.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest6.jpg"></p>

<p>"The best way to predict the future is to build it," computer scientist Alan Kay famously said. But computer scientists should not be alone in that building. (God forbid.) </p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest7.jpg"></p>

<p>I've long argued that the best way to predict the future is to issue a press release. Or the best way to predict the future is to complain about something in your weekly op-ed in The New York Times. By this, I mean that it's not always so much the building as it is the storytelling that sways the direction the future flows.</p>

<p>Again, that's why stories of the past matter as much as do stories of the future — even when (and especially when) predicting the future.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest8.jpg"></p>

<p>One of my favorite science fiction authors, Octavia Butler, was once asked about this: </p>

<blockquote>
<p>'So do you really believe that in the future we’re going to have the kind of trouble you write about in your books?' a student asked me as I was signing books after a talk. The young man was referring to the troubles I’d described in Parable of the Sower and Parable of the Talents, novels that take place in a near future of increasing drug addiction and illiteracy, marked by the popularity of prisons and the unpopularity of public schools, the vast and growing gap between the rich and everyone else, and the whole nasty family of problems brought on by global warming.</p></blockquote>

<blockquote><p>'I didn’t make up the problems,' I pointed out. 'All I did was look around at the problems we’re neglecting now and give them about 30 years to grow into full-fledged disasters.'</p></blockquote>

<blockquote><p>'Okay,' the young man challenged. 'So what’s the answer?'</p></blockquote>

<blockquote><p>'There isn’t one,' I told him.</p></blockquote>

<blockquote><p>'No answer? You mean we’re just doomed?' He smiled as though he thought this might be a joke.</p></blockquote>

<blockquote><p>'No,' I said. 'I mean there’s no single answer that will solve all of our future problems. There’s no magic bullet. Instead there are thousands of answers — at least. You can be one of them if you choose to be.'</p>
</blockquote>

<p>You can be one of the answers if you choose to be.</p>

<p>"Writing novels about the future doesn’t give me any special ability to foretell the future," Butler said. "But it does encourage me to use our past and present behaviors as guides to the kind of world we seem to be creating. The past, for example, is filled with repeating cycles of strength and weakness, wisdom and stupidity, empire and ashes. To study history is to study humanity. And to try to foretell the future without studying history is like trying to learn to read without bothering to learn the alphabet."</p>

<p>Too many people who try to predict the future of education and education technology have not bothered to learn the alphabet — the grammar of schooling, to borrow a phrase from education historian Larry Cuban. That grammar includes the beliefs and practices and memory of schooling — our collective memory, not just our own personal experiences of school. That collective memory — that's history.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest9.jpg"></p>

<p>When I wrote my book Teaching Machines, I wanted to chronicle a longer history of ed-tech than the story that often gets told — a history that, strangely enough when you think about it, often begins and ends with the computer. Through this framework, computers — "the digital" — are teleological. And those who question technology are therefore aberrant because technology is all there ever was, is, or will be. </p>

<p>I wanted to show in my book that many of the ideas that get bandied about today as innovative or (god forbid) revolutionary have a long history. Educational psychologists, for example, have been building technologies to "personalize education" for over a century. To recognize this is to see the legacy of their work in our objects and in our practices today; it is to understand that if these objects were constructed they can be challenged and dismantled. They are not natural. They are not inevitable. And it is to know too that there has always been resistance and refusal — successful resistance and refusal — to the vision of an automated education. </p>

<p>There has always been change — and that change has come from the popular power of students and teachers, not just the financial and political power of businessmen, always so desperate to center themselves in our stories of "transformation." We have always been strong. We have had to be resilient.</p>

<p>"Who controls the past controls the future. Who controls the present controls the past," as Rage Against the Machine sang in their 1999 song "Testify." OK, actually it's a quote from George Orwell's 1984, but hey. To control the past, we have to know our history. "The stories we tell about who we were and what we did shape what we can and will do," Rebecca Solnit argues.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest10.jpg"></p>

<p>And we can change the future. We have before. Never forget that. As my other favorite science fiction author Ursula Le Guin said, "any human power can be resisted and changed by human beings." And we must resist and we much change. We must believe we can. We must have hope.</p>

<p>A few years ago, I listened to a speaker who was quite critical — in passing, mind you — of hope. And she wasn't alone. There was so much energy channeled into that word when it became the slogan of a young Senator from Illinois and his starry-eyed Presidential campaign. After 8 years of Barack Obama in office and so many unfulfilled promises, so much disappointment (and of course the rise of a violent white nationalism in response) many people have lost hope. They've lost faith in hope. They're utterly disillusioned by it.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest11.jpg"></p>

<p>That speaker said that "you cannot counter structural inequality with good will." And I immediately thought of Antonio Gramsci, as one does. One of the greatest Marxist thinkers of the 20th century, Gramsci is best known for writing some 3000 pages of history during his imprisonment by the Fascist Italian government from 1927 until his death ten years later at age 46. Gramsci famously said "I am a pessimist because of intelligence but an optimist because of will." Will, according to Gramsci, is part of a revolutionary praxis. It recognizes the social structure, and it helps us to move deliberately from thinking about to acting for radical change. Will is, for Gramsci, political and intellectual. Will is a strategy, or part of a strategy of struggle. Will is bound of in the politics of hope. Hope is bound up in the politics of will.</p>

<p>You all came to this event because, I'd wager, of will. Good will. Willpower. A will to change your own pedagogical practices. A will to change your institutions. Will is necessary, politically. I hope that you will consider how to tie that will to action, to collective action. You are not alone. I believe that you came to education too because you believe in the future. You must to work in this field. Educators engage in the profound process and practice of engaging minds in change — intellectual transformation. Education straddles the past — "the curriculum" — and the future — individually and societally. Education is about what we learn today so we can be better tomorrow. Education is a practice of hope. You cannot be indifferent about the future and be an educator. </p>

<p>Another passage from Gramsci (who I put alongside Paolo Freire, Franz Fanon, bell hooks as one of the most important thinkers in education who's rarely recognized as such), from a 1917 letter "Indifferenti":</p>

<blockquote>
<p>I hate the indifferent. I believe that life means taking sides. One who is really alive, can be nothing if not citizen and partisan. Indifference is lethargy: it is parasitism, not life. Therefore, I hate the indifferent.</p></blockquote>

<blockquote><p>Indifference is the dead weight of history. Indifference plays an important role in history. It plays a passive role, but it does play a role. It is fatality; it is something that cannot be counted on; it is something that disrupts programmes, overturns the best made plans; it is that awful something that chokes intelligence. What happens, the evil that touches everyone, happens because the majority relinquish their will to it, allowing the enactment of laws that only a revolution can revoke, letting men rise to power who, later, only a mutiny can remove. </p></blockquote>

<blockquote><p>... I am "partigiano", alive, and already I hear, in the consciences of those on my same side, the throbbing bustle of the city of the future that we are building. And in it, the social chain does not weigh on the shoulders of only a few .... There is no-one watching from the sidelines while others are sacrificed, bled dry. I am alive, partisan. And, therefore, I hate those who do not take sides; I hate the indifferent.</p>
</blockquote>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest12.jpg"></p>

<p>Memory counteracts indifference. Memory counteracts despair. Memory creates the space for hope. Memory reminds us: change is possible. It urges us: change is necessary. </p>

<p>It will not be easy. It never is. Even having hope can be hard, let alone making change.</p>

<p>"Hope is a discipline," prison abolitionist Mariame Kaba reminds us. It is not an emotion. It is not even as Gramsci put it simply "optimism" — a belief that things will get better. Hope is work. You have to put energy and time into it. You have to practice, repeatedly. You have to keep at it, keep moving, keep pushing. No one else will free you or fix you — except us, collectively through our power to imagine and build a better future. </p>

<p>Hope is not in technology. Hope is in our humanity.</p>

<p>A better future for all of us, for all living creatures on this planet does not look like an app or a platform or a gadget. It does not look like an institution founded hundreds of years ago, desperate to cling to old hierarchies. It does not look like an institution founded more recently, desperate to re-inscribe new hierarchies. Join me in refusing the old world, and in refusing the future envisioned by the techno-elite. Our refusals can be small. Our actions might seem insignificant. But do not despair. We aren't alone in this — resistance is part of our legacy. We can make it our future. We can hope.</p>

<p><img src="https://s3.amazonaws.com/hackedu/2022-03-08-digifest13.jpg"></p>

+ 223
- 0
cache/2022/7d378db0707cc63aa2d466ada68fe690/index.html View File

@@ -0,0 +1,223 @@
<!doctype html><!-- This is a valid HTML5 document. -->
<!-- Screen readers, SEO, extensions and so on. -->
<html lang="fr">
<!-- Has to be within the first 1024 bytes, hence before the `title` element
See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
<meta charset="utf-8">
<!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
<!-- The viewport meta is quite crowded and we are responsible for that.
See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
<meta name="viewport" content="width=device-width,initial-scale=1">
<!-- Required to make a valid HTML5 document. -->
<title>20 Things I’ve Learned in my 20 Years as a Software Engineer (archive) — David Larlet</title>
<meta name="description" content="Publication mise en cache pour en conserver une trace.">
<!-- That good ol' feed, subscribe :). -->
<link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
<!-- Generated from https://realfavicongenerator.net/ such a mess. -->
<link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
<link rel="manifest" href="/static/david/icons2/site.webmanifest">
<link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
<link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
<meta name="msapplication-TileColor" content="#f7f7f7">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
<!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',