Browse Source

Publishing PresQuotidien

master
David Larlet 3 months ago
parent
commit
246dc53544

+ 174
- 0
david/2021/01/01/index.html View File

@@ -0,0 +1,174 @@
<!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>
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>PresQuotidien — David Larlet</title>
<meta name="description" content="L’expression convolutée des légalismes se développe autour de la nécessité de nous masquer à nous-mêmes la violence dont nous usons envers les autres. Entre le fait de priver un homme d’une heure de sa vie et celui de le priver de la vie, il n’existe qu’une différence de degré. Dans l’un comme dans l’autre cas, nous usons de violence, nous consommons son énergie. Des euphémismes élaborés peuvent dissimuler nos intentions meurtrières mais tout usage de puissance à l’encontre d’autrui se traduit par l’ultime assomption : « Je me nourris de votre énergie. »">
<!-- 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="#f0f0ea">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f0f0ea">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2020-06-19.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>

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

<article>
<header>
<h1>PresQuotidien</h1>
</header>
<nav>
<p class="center">
<a rel="prev" href="/david/2020/" title="Publication précédente : Publications 2020">←</a> •
<a href="/david/" title="Aller à l’accueil">🏠</a>
</p>
</nav>
<hr>


<blockquote>
<p>L’expression convolutée des légalismes se développe autour de la nécessité de nous masquer à nous-mêmes la violence dont nous usons envers les autres. Entre le fait de priver un homme d’une heure de sa vie et celui de le priver de la vie, il n’existe qu’une différence de degré. Dans l’un comme dans l’autre cas, nous usons de violence, <mark>nous consommons son énergie</mark>. Des euphémismes élaborés peuvent dissimuler nos intentions meurtrières mais tout usage de puissance à l’encontre d’autrui se traduit par l’ultime assomption : « Je me nourris de votre énergie. »</p>
<p><cite><em>L’Empereur Paul Muad’Dib : Ordre aux Conseils (Addenda)</em> (<a href="/david/2020/12/21/#dune">Dune</a> II. Le messie de Dune)</cite></p>
</blockquote>
<p>J’avais envie de retourner à une publication <a href="/david/stream/2018/">quotidienne</a> pour 2021 après du quasi-<a href="/david/stream/2019/">hebdomadaire en 2019</a> et <a href="/david/2020/">2020</a>. Les agrégations n’ayant pas toujours un lien entre elles, je me retrouvais à chercher des transitions pas terribles parfois. J’ai publié <a href="https://git.larlet.fr/davidbgk/larlet-fr-david/src/branch/master/david/2020/fragments">300 fragments</a> en 2020, on s’approche de réflexions/réactions quotidiennes.</p>
<p><strong>L’originalité que j’aimerais explorer cette année est de retarder la publication d’une semaine.</strong> Je commence avec ce tampon et il évoluera peut-être au cours de l’année. Je m’autorise à ne pas publier pendant certains jours et à « dépublier » si je trouve après la durée tampon que ça n’a plus grand intérêt. Cela ajoutera peut-être de la profondeur à ce qui est publié… ou alors ça me démotivera complètement (la publication instantanée est ma petite dose d’adrénaline post-écriture). On verra bien, les règles du jeu restent ouvertes.</p>
<p>Une tentative de réacquérir mon temps (et le vôtre ?), encore une fois. Ménager des espaces de réactions et d’autres de créations. De l’éphémère et du permanent. De l’immédiat et de l’expérimental. Des espaces pour soi, d’autres en commun.</p>
<p><em>Pour un web diversifié… et nourrissant.</em></p>

<blockquote>
<p>Digital nutrition is about developing and implementing cognitive skills and creating new habits to help us stay in control of our technology consumption.</p>
<p><cite><em><a href="https://essays.uxdesign.cc/tech-diet/">The world needs a tech diet; here is how designers can help</a></em> (<a href="/david/cache/2021/3159c32fa194458a63b546ab789e8aed/">cache</a>)</cite></p>
</blockquote>

<nav>
<p class="center">
<a rel="prev" href="/david/2020/" title="Publication précédente : Publications 2020">←</a> •
<a href="/david/2020/" title="Liste des publications récentes">↑</a>
</p>
</nav>
</article>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil">🏠</a> •
<a href="/david/log/" title="Accès au flux RSS">🤖</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
<abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend>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>

+ 153
- 0
david/2021/index.html View File

@@ -0,0 +1,153 @@
<!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>
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>Publications (pres)quotidiennes — David Larlet</title>
<meta name="description" content="Archives 2021 des publications de David Larlet">
<!-- 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="#f0f0ea">
<meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
<meta name="theme-color" content="#f0f0ea">
<!-- Documented, feel free to shoot an email. -->
<link rel="stylesheet" href="/static/david/css/style_2020-06-19.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>

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

<header>
<h1>Publications (pres)quotidiennes</h1>
</header>
<nav>
<p class="center">
<a href="/david/" title="Aller à l’accueil">🏠</a>
</p>
</nav>
<hr>
<main>
<p>Liste des publications en ordre chronologique :</p>
<h2><a href="/david/2021/01/01/">PresQuotidien</a> (2021-01-01)</h2>
</main>


<hr>

<footer>
<p>
<a href="/david/" title="Aller à l’accueil">🏠</a> •
<a href="/david/log/" title="Accès au flux RSS">🤖</a> •
<a href="http://larlet.com" title="Go to my English profile" data-instant>🇨🇦</a> •
<a href="mailto:david%40larlet.fr" title="Envoyer un courriel">📮</a> •
<abbr title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340">🧚</abbr>
</p>
<template id="theme-selector">
<form>
<fieldset>
<legend>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>

+ 20
- 0
david/2021/sources/2021-01-01 - PresQuotidien.md View File

@@ -0,0 +1,20 @@
# PresQuotidien

> L’expression convolutée des légalismes se développe autour de la nécessité de nous masquer à nous-mêmes la violence dont nous usons envers les autres. Entre le fait de priver un homme d’une heure de sa vie et celui de le priver de la vie, il n’existe qu’une différence de degré. Dans l’un comme dans l’autre cas, nous usons de violence, ==nous consommons son énergie==. Des euphémismes élaborés peuvent dissimuler nos intentions meurtrières mais tout usage de puissance à l’encontre d’autrui se traduit par l’ultime assomption : « Je me nourris de votre énergie. »
>
> <cite>*L’Empereur Paul Muad’Dib : Ordre aux Conseils (Addenda)* ([Dune](/david/2020/12/21/#dune) II. Le messie de Dune)</cite>

J’avais envie de retourner à une publication [quotidienne](/david/stream/2018/) pour 2021 après du quasi-[hebdomadaire en 2019](/david/stream/2019/) et [2020](/david/2020/). Les agrégations n’ayant pas toujours un lien entre elles, je me retrouvais à chercher des transitions pas terribles parfois. J’ai publié [300 fragments](https://git.larlet.fr/davidbgk/larlet-fr-david/src/branch/master/david/2020/fragments) en 2020, on s’approche de réflexions/réactions quotidiennes.

**L’originalité que j’aimerais explorer cette année est de retarder la publication d’une semaine.** Je commence avec ce tampon et il évoluera peut-être au cours de l’année. Je m’autorise à ne pas publier pendant certains jours et à « dépublier » si je trouve après la durée tampon que ça n’a plus grand intérêt. Cela ajoutera peut-être de la profondeur à ce qui est publié… ou alors ça me démotivera complètement (la publication instantanée est ma petite dose d’adrénaline post-écriture). On verra bien, les règles du jeu restent ouvertes.

Une tentative de réacquérir mon temps (et le vôtre ?), encore une fois. Ménager des espaces de réactions et d’autres de créations. De l’éphémère et du permanent. De l’immédiat et de l’expérimental. Des espaces pour soi, d’autres en commun.

*Pour un web diversifié… et nourrissant.*

> Digital nutrition is about developing and implementing cognitive skills and creating new habits to help us stay in control of our technology consumption.
>
> <cite>*[The world needs a tech diet; here is how designers can help](https://essays.uxdesign.cc/tech-diet/)* ([cache](/david/cache/2021/3159c32fa194458a63b546ab789e8aed/))</cite>




+ 13
- 5
david/index.html View File

@@ -32,7 +32,7 @@
<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 type="text/javascript">
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
@@ -55,7 +55,6 @@
<header>
<h1>Bienvenue</h1>
</header>
<main>
<p>
Voici l’espace personnel de David Larlet sur le Web.
Il se veut modeste, accueillant et pérenne.
@@ -69,6 +68,16 @@
<a href="http://larlet.com" data-instant>this page 🇨🇦</a>.
</p>

<h2>Publication récentes</h2>

<nav>
<ul>
<li><a href="/david/2021/01/01/">PresQuotidien</a> (2021-01-01)</li>
</ul>
</nav>

<h2>Publications 2020</h2>

<p>Liste des publications en ordre chronologique :</p>
@@ -137,7 +146,6 @@
<p>
Je réponds à <em>presque</em> tous les courriels reçus, exception faite de ceux que j’assimile à de la publicité ou du <code>spam</code>. Vous pouvez <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">m’écrire</a> sans trop de civilités et me tutoyer, je répondrai probablement de même. Si vous souhaitez correspondre de manière chiffrée, voici <a href="/static/david/david-larlet-pgp-public-key-1359EA98.asc" title="Clé publique de chiffrement">ma clé publique</a>.
</p>
</main>
</article>


@@ -168,8 +176,8 @@
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module" defer></script>
<script type="text/javascript">
<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

+ 66
- 42
david/log/index.xml View File

@@ -5,14 +5,38 @@
<link href="https://larlet.fr/david/" rel="alternate" type="text/html" />
<link href="https://larlet.fr/david/log/" rel="self" />
<id>https://larlet.fr/david/</id>
<updated>2021-01-07T12:00:00+01:00</updated>
<updated>2021-01-08T12:00:00+01:00</updated>
<author>
<name>David Larlet</name>
<uri>https://larlet.fr/david/</uri>
</author>
<rights>Copyright (c) 2004-2020, David Larlet</rights>
<rights>Copyright (c) 2004-2021, David Larlet</rights>
<entry xml:lang="fr">
<title>PresQuotidien</title>
<link href="https://larlet.fr/david/2021/01/01/" rel="alternate" type="text/html" />
<updated>2021-01-01T12:00:00+01:00</updated>
<id>https://larlet.fr/david/2021/01/01/</id>
<summary type="html">

&lt;blockquote&gt;
&lt;p&gt;L’expression convolutée des légalismes se développe autour de la nécessité de nous masquer à nous-mêmes la violence dont nous usons envers les autres. Entre le fait de priver un homme d’une heure de sa vie et celui de le priver de la vie, il n’existe qu’une différence de degré. Dans l’un comme dans l’autre cas, nous usons de violence, &lt;mark&gt;nous consommons son énergie&lt;/mark&gt;. Des euphémismes élaborés peuvent dissimuler nos intentions meurtrières mais tout usage de puissance à l’encontre d’autrui se traduit par l’ultime assomption : « Je me nourris de votre énergie. »&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;em&gt;L’Empereur Paul Muad’Dib : Ordre aux Conseils (Addenda)&lt;/em&gt; (&lt;a href=&quot;https://larlet.fr/david/2020/12/21/#dune&quot;&gt;Dune&lt;/a&gt; II. Le messie de Dune)&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’avais envie de retourner à une publication &lt;a href=&quot;https://larlet.fr/david/stream/2018/&quot;&gt;quotidienne&lt;/a&gt; pour 2021 après du quasi-&lt;a href=&quot;https://larlet.fr/david/stream/2019/&quot;&gt;hebdomadaire en 2019&lt;/a&gt; et &lt;a href=&quot;https://larlet.fr/david/2020/&quot;&gt;2020&lt;/a&gt;. Les agrégations n’ayant pas toujours un lien entre elles, je me retrouvais à chercher des transitions pas terribles parfois. J’ai publié &lt;a href=&quot;https://git.larlet.fr/davidbgk/larlet-fr-david/src/branch/master/david/2020/fragments&quot;&gt;300 fragments&lt;/a&gt; en 2020, on s’approche de réflexions/réactions quotidiennes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L’originalité que j’aimerais explorer cette année est de retarder la publication d’une semaine.&lt;/strong&gt; Je commence avec ce tampon et il évoluera peut-être au cours de l’année. Je m’autorise à ne pas publier pendant certains jours et à « dépublier » si je trouve après la durée tampon que ça n’a plus grand intérêt. Cela ajoutera peut-être de la profondeur à ce qui est publié… ou alors ça me démotivera complètement (la publication instantanée est ma petite dose d’adrénaline post-écriture). On verra bien, les règles du jeu restent ouvertes.&lt;/p&gt;
&lt;p&gt;Une tentative de réacquérir mon temps (et le vôtre ?), encore une fois. Ménager des espaces de réactions et d’autres de créations. De l’éphémère et du permanent. De l’immédiat et de l’expérimental. Des espaces pour soi, d’autres en commun.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pour un web diversifié… et nourrissant.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Digital nutrition is about developing and implementing cognitive skills and creating new habits to help us stay in control of our technology consumption.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;&lt;em&gt;&lt;a href=&quot;https://essays.uxdesign.cc/tech-diet/&quot;&gt;The world needs a tech diet; here is how designers can help&lt;/a&gt;&lt;/em&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2021/3159c32fa194458a63b546ab789e8aed/&quot;&gt;cache&lt;/a&gt;)&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>

<entry xml:lang="fr">
<title>Livres</title>
<link href="https://larlet.fr/david/2020/12/21/" rel="alternate" type="text/html" />
<updated>2020-12-21T12:00:00+01:00</updated>
@@ -138,7 +162,7 @@ Le bonheur d’avoir dans son assiette le poisson que l’on a pêché, dans sa
&lt;p&gt;&lt;em&gt;Ce que je retiens surtout de toutes ces lectures, c’est que ça n’est pas la taille qui compte. J’ai lu beaucoup de petits livres (merci &lt;a href=&quot;https://oncletom.io/&quot;&gt;Thomas&lt;/a&gt; !) qui renfermaient de véritables pépites. Cela me motive pour écrire quelque chose d’un peu plus consistant un jour, sans pour autant avoir la pression de la taille.&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Arrakice</title>
<link href="https://larlet.fr/david/2020/12/18/" rel="alternate" type="text/html" />
@@ -192,7 +216,7 @@ Le bonheur d’avoir dans son assiette le poisson que l’on a pêché, dans sa
&lt;p&gt;Peut-être que la différence entre les deux a aussi à voir avec une question de revenus… et de privilèges associés.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Vidéos</title>
<link href="https://larlet.fr/david/2020/12/15/" rel="alternate" type="text/html" />
@@ -292,7 +316,7 @@ Je dédie ce film à toutes les femmes du monde.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note : je regarde aussi des navets beaucoup moins avouables, je suis même allé au bout de la première saison de « The Witcher », c’est dire ma résistance à la nullité.&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Publications</title>
<link href="https://larlet.fr/david/2020/12/13/" rel="alternate" type="text/html" />
@@ -387,7 +411,7 @@ Je dédie ce film à toutes les femmes du monde.&lt;/p&gt;
&lt;p&gt;Je ne me souviens plus si c’était difficile au début mais aujourd’hui je pourrais difficilement m’en passer. Écrire du code n’est qu’une petite partie de mon récit quotidien.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Compréhension</title>
<link href="https://larlet.fr/david/2020/12/01/" rel="alternate" type="text/html" />
@@ -509,7 +533,7 @@ Je dédie ce film à toutes les femmes du monde.&lt;/p&gt;
&lt;p&gt;Aussi, un trépied ça change la vie pour faire des prises un peu stables !&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Perles</title>
<link href="https://larlet.fr/david/2020/11/27/" rel="alternate" type="text/html" />
@@ -603,7 +627,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Parfois, la prise de recul est assez vertigineuse.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Chaos</title>
<link href="https://larlet.fr/david/2020/10/28/" rel="alternate" type="text/html" />
@@ -675,7 +699,7 @@ L’alternative c’est l’ermitage.&lt;/p&gt;
&lt;/figure&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Grand-écart</title>
<link href="https://larlet.fr/david/2020/10/22/" rel="alternate" type="text/html" />
@@ -777,7 +801,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Parfois, la prise de recul est assez vertigineuse.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Parvenir</title>
<link href="https://larlet.fr/david/2020/10/08/" rel="alternate" type="text/html" />
@@ -876,7 +900,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Ta première blague bilingue :’)&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Coupable</title>
<link href="https://larlet.fr/david/2020/09/16/" rel="alternate" type="text/html" />
@@ -978,7 +1002,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;C’est beau l’enfance. #EnTouteModestie&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Rappels</title>
<link href="https://larlet.fr/david/2020/09/07/" rel="alternate" type="text/html" />
@@ -1064,7 +1088,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Parfois, le &lt;q&gt;cristal de connaissance&lt;/q&gt; a besoin d’une pression extérieure pour se (dé)former.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Rentrée</title>
<link href="https://larlet.fr/david/2020/09/01/" rel="alternate" type="text/html" />
@@ -1187,7 +1211,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Personnes</title>
<link href="https://larlet.fr/david/2020/08/24/" rel="alternate" type="text/html" />
@@ -1294,7 +1318,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Difficile d’écrire activement l’amour sans &lt;em&gt;tomber&lt;/em&gt; dans le jugement.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Bilan</title>
<link href="https://larlet.fr/david/2020/07/13/" rel="alternate" type="text/html" />
@@ -1373,7 +1397,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS : je viens de me rendre compte que je n’ai pas encore répondu à deux courriels qui datent de fin 2019. Ce n’est pas pour vous décourager, j’ai l’habitude de penser que les échanges qui demandent du temps sont les meilleurs :-).&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Confetti</title>
<link href="https://larlet.fr/david/2020/07/03/" rel="alternate" type="text/html" />
@@ -1469,7 +1493,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;Comment ne pas saccager l’innocence de l’enfance ? Comment partager le fait que l’autonomie est un moyen de couper la laisse ?&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Ouvertance</title>
<link href="https://larlet.fr/david/2020/06/25/" rel="alternate" type="text/html" />
@@ -1557,7 +1581,7 @@ J’ai hâte de savoir ce que je vais faire dans ma vie.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Un ermite a-t-il des privilèges ?&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Mouvements</title>
<link href="https://larlet.fr/david/2020/06/18/" rel="alternate" type="text/html" />
@@ -1657,7 +1681,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;/blockquote&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Vrac</title>
<link href="https://larlet.fr/david/2020/06/12/" rel="alternate" type="text/html" />
@@ -1744,7 +1768,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;/blockquote&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Covidoudou</title>
<link href="https://larlet.fr/david/2020/05/26/" rel="alternate" type="text/html" />
@@ -1847,7 +1871,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;Je vais m’arrêter là pour le moment, je ferai sûrement une nouvelle entrée dédiée lorsqu’on décidera de mettre un terme au produit. D’ici là vous pouvez suivre le &lt;a href=&quot;https://github.com/Delegation-numerique-en-sante/mesconseilscovid/blob/master/CHANGELOG.md#changelog&quot;&gt;CHANGELOG&lt;/a&gt; dédié.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Bikepacking</title>
<link href="https://larlet.fr/david/2020/05/20/" rel="alternate" type="text/html" />
@@ -1948,7 +1972,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;La pression, quelle pression ?&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Relance</title>
<link href="https://larlet.fr/david/2020/05/18/" rel="alternate" type="text/html" />
@@ -2012,7 +2036,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;Il y a un « m » dans humour.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Zam</title>
<link href="https://larlet.fr/david/2020/04/18/" rel="alternate" type="text/html" />
@@ -2147,7 +2171,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;Mise à jour quelques heures après publication : Karl répond en &lt;a href=&quot;https://www.la-grange.net/2020/04/18/ombre&quot;&gt;parlant de poisson&lt;/a&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2020/2ebe3ac9e09d2d0ca91f9814d7b56c4d/&quot;&gt;cache&lt;/a&gt;) et ne sait pas à quel point il tombe juste :-).&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Résistance</title>
<link href="https://larlet.fr/david/2020/04/10/" rel="alternate" type="text/html" />
@@ -2246,7 +2270,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;&lt;em&gt;Note : je suis vraiment admiratif du travail qu’arrivent à produire les personnes qui constituent &lt;a href=&quot;https://framasoft.org&quot;&gt;Framasoft&lt;/a&gt; en ces temps difficiles. Chapeau bas.&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Patience</title>
<link href="https://larlet.fr/david/2020/04/03/" rel="alternate" type="text/html" />
@@ -2333,7 +2357,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;&lt;em&gt;Mais serait-ce vraiment une mauvaise chose ?&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Exutoire</title>
<link href="https://larlet.fr/david/2020/03/27/" rel="alternate" type="text/html" />
@@ -2458,7 +2482,7 @@ Le trou où la bête panse ses plaies, non le repaire où elle fourbit ses griff
&lt;p&gt;Et qu’un enfant m’est nécessaire.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Rédemption</title>
<link href="https://larlet.fr/david/2020/03/20/" rel="alternate" type="text/html" />
@@ -2544,7 +2568,7 @@ mark::after {
&lt;p&gt;Comment faire pour arrêter une rivière en crue ?&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Technique</title>
<link href="https://larlet.fr/david/2020/03/13/" rel="alternate" type="text/html" />
@@ -2652,7 +2676,7 @@ mark::after {
&lt;p&gt;Chacun sa route, chacun son chemin. Passe le &lt;a href=&quot;https://larlet.fr/david/blog/2019/flux-rss/&quot;&gt;flux RSS&lt;/a&gt; à ton voisin (ou ta voisine).&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Service</title>
<link href="https://larlet.fr/david/2020/02/21/" rel="alternate" type="text/html" />
@@ -2754,7 +2778,7 @@ mark::after {
&lt;p&gt;(Il n’a jamais vu le dessin animé, on le lui a raconté.)&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Espoirs</title>
<link href="https://larlet.fr/david/2020/02/14/" rel="alternate" type="text/html" />
@@ -2879,7 +2903,7 @@ Ensuite je survole régulièrement et je marque &amp;quot;comme lu&amp;quot; (sa
&lt;p&gt;:facepalm:&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>GAFAM+</title>
<link href="https://larlet.fr/david/2020/02/07/" rel="alternate" type="text/html" />
@@ -2921,8 +2945,8 @@ Ensuite je survole régulièrement et je marque &amp;quot;comme lu&amp;quot; (sa
&lt;h2&gt;Open book&lt;/h2&gt;

&lt;blockquote lang=&quot;en&quot;&gt;
&lt;p&gt;The data reviewed by Times Opinion didn’t come from a telecom or giant tech company, nor did it come from a governmental surveillance operation. It originated from a location data company, one of dozens quietly collecting precise movements using software slipped onto mobile phone apps. You’ve probably never heard of most of the companies — and yet to anyone who has access to this data, your life is an open book. They can see the places you go every moment of the day, whom you meet with or spend the night with, where you pray, whether you visit a methadone clinic, a psychiatrist’s office or a massage parlor.
&lt;p&gt;The data reviewed by Times Opinion didn’t come from a telecom or giant tech company, nor did it come from a governmental surveillance operation. It originated from a location data company, one of dozens quietly collecting precise movements using software slipped onto mobile phone apps. You’ve probably never heard of most of the companies — and yet to anyone who has access to this data, your life is an open book. They can see the places you go every moment of the day, whom you meet with or spend the night with, where you pray, whether you visit a methadone clinic, a psychiatrist’s office or a massage parlor.
&lt;cite&gt;&lt;em&gt;&lt;a href=&quot;https://www.nytimes.com/interactive/2019/12/19/opinion/location-tracking-cell-phone.html&quot;&gt;Twelve Million Phones, One Dataset, Zero Privacy&lt;/a&gt;&lt;/em&gt; (&lt;a href=&quot;https://larlet.fr/david/cache/2020/2390380d879c04ee56baf320b6f7e681/&quot;&gt;cache&lt;/a&gt;)&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et il n’y a pas que notre humeur qui est analysable, mais aussi l’endroit où nous sommes lorsque nous sommes dans cet état.
@@ -3048,7 +3072,7 @@ On croyait la main du marché invisible, c’est en fait une œillère bien opaq
&lt;p&gt;Je ne m’en suis toujours pas remis…&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Intentions</title>
<link href="https://larlet.fr/david/2020/01/31/" rel="alternate" type="text/html" />
@@ -3108,7 +3132,7 @@ On croyait la main du marché invisible, c’est en fait une œillère bien opaq
&lt;p&gt;Continuer &lt;a href=&quot;https://larlet.fr/david/stream/2019/12/17/&quot;&gt;à explorer&lt;/a&gt; ce que ça veut dire d’être un privilégié et comment faire le moins de dégâts possibles dans cette position. Au quotidien, à travers mes choix d’interactions et d’attentions, mes maladresses et mes prises de conscience.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Sortie ski</title>
<link href="https://larlet.fr/david/2020/01/29/" rel="alternate" type="text/html" />
@@ -3206,7 +3230,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;Et puis il y a &lt;em&gt;quand&lt;/em&gt; ça va arriver.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Réponses</title>
<link href="https://larlet.fr/david/2020/01/22/" rel="alternate" type="text/html" />
@@ -3278,7 +3302,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;Un lien est un doigt pointé — et une main tendue — vers l’autre.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Datagouv</title>
<link href="https://larlet.fr/david/2020/01/17/" rel="alternate" type="text/html" />
@@ -3330,7 +3354,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;Bientôt les résultats :-).&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Futurs</title>
<link href="https://larlet.fr/david/2020/01/15/" rel="alternate" type="text/html" />
@@ -3388,7 +3412,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;La petite phrase qui fait mal.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Travail</title>
<link href="https://larlet.fr/david/2020/01/10/" rel="alternate" type="text/html" />
@@ -3443,7 +3467,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;/figure&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Écriture</title>
<link href="https://larlet.fr/david/2020/01/06/" rel="alternate" type="text/html" />
@@ -3500,7 +3524,7 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;Il est beaucoup question de pratique dans ce livre sur le bouddhisme. Et de son lien étroit avec la &lt;a href=&quot;https://larlet.fr/david/stream/2015/09/22/&quot;&gt;posture&lt;/a&gt; et la &lt;a href=&quot;https://larlet.fr/david/stream/2015/09/02/&quot;&gt;respiration&lt;/a&gt; qui sont les deux axes d’amélioration dans ma pratique sportive. J’ai parfois l’impression de faire &lt;em&gt;zazen&lt;/em&gt; &lt;a href=&quot;https://larlet.fr/david/stream/2015/09/25/&quot;&gt;en mouvement&lt;/a&gt;, je ne sais pas si cela est possible et/ou si je n’ai rien compris en fait.&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
<entry xml:lang="fr">
<title>Briques</title>
<link href="https://larlet.fr/david/2020/01/03/" rel="alternate" type="text/html" />
@@ -3540,5 +3564,5 @@ Comme un hameau paisible au pied d’une montagne.&lt;/p&gt;
&lt;p&gt;Beaucoup de bonnes choses dans ces réflexions. &lt;em&gt;Merci.&lt;/em&gt;&lt;/p&gt;
&lt;hr/&gt;&lt;p&gt;&lt;a href=&quot;mailto:david@larlet.fr&quot;&gt;Réagir ?&lt;/a&gt;&lt;/p&gt;</summary>
</entry>
</feed>

+ 3
- 16
david/templates/archives_2020.html View File

@@ -1,9 +1,9 @@
{% extends "base_2020.html" %}
{% block title %}Publications récentes (2020){% endblock %}
{% block description %}Archives 2020 des publications de David Larlet{% endblock %}
{% block title %}Publications (pres)quotidiennes{% endblock %}
{% block description %}Archives 2021 des publications de David Larlet{% endblock %}
{% block content %}
<header>
<h1>Publications quasi-hebdomadaires (2020)</h1>
<h1>Publications (pres)quotidiennes</h1>
</header>
<nav>
<p class="center">
@@ -15,19 +15,6 @@
<p>Liste des publications en ordre chronologique :</p>
{% for page in page_list %}
<h2><a href="{{ page.url }}">{{ page.title }}</a> ({{ page.date }})</h2>
{{ page.extract }}
{% endfor %}
<hr>
<p>
Vous pouvez consulter les différents
<a href="/david/blog/">billets de blog</a> qui ont été rédigés de 2004 à 2019
ou les <a href="/david/stream/">entrées de journaux</a> relativement
régulières entre 2009 et 2019.
</p>

<p>
<em>Notez qu’avec un tel historique, certaines informations sont obsolètes et/ou plus cautionnées.</em>
</p>

</main>
{% endblock content %}

+ 1
- 3
david/templates/article_2020.html View File

@@ -15,9 +15,7 @@
</p>
</nav>
<hr>
<main>
{{ page.content }}
</main>
{{ page.content }}
<nav>
<p class="center">
{% if prev and not prev.is_draft %}<a rel="prev" href="{{ prev.url }}" title="Publication précédente : {{ prev.title }}">←</a> •{% endif %}

+ 3
- 3
david/templates/base_2020.html View File

@@ -32,7 +32,7 @@
<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 type="text/javascript">
<script>
function toggleTheme(themeName) {
document.documentElement.classList.toggle(
'forced-dark',
@@ -79,8 +79,8 @@
</form>
</template>
</footer>
<script src="/static/david/js/instantpage-5.1.0.min.js" type="module" defer></script>
<script type="text/javascript">
<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

+ 3531
- 1
david/templates/feed.xml
File diff suppressed because it is too large
View File


+ 10
- 2
david/templates/profil.html View File

@@ -7,7 +7,6 @@
<header>
<h1>Bienvenue</h1>
</header>
<main>
<p>
Voici l’espace personnel de David Larlet sur le Web.
Il se veut modeste, accueillant et pérenne.
@@ -21,6 +20,16 @@
<a href="http://larlet.com" data-instant>this page 🇨🇦</a>.
</p>

<h2>Publication récentes</h2>

<nav>
<ul>
{% for page in page_list %}
<li><a href="{{ page.url }}">{{ page.title }}</a> ({{ page.date }})</li>
{% endfor %}
</ul>
</nav>

<h2>Publications 2020</h2>

<p>Liste des publications en ordre chronologique :</p>
@@ -89,6 +98,5 @@
<p>
Je réponds à <em>presque</em> tous les courriels reçus, exception faite de ceux que j’assimile à de la publicité ou du <code>spam</code>. Vous pouvez <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">m’écrire</a> sans trop de civilités et me tutoyer, je répondrai probablement de même. Si vous souhaitez correspondre de manière chiffrée, voici <a href="/static/david/david-larlet-pgp-public-key-1359EA98.asc" title="Clé publique de chiffrement">ma clé publique</a>.
</p>
</main>
</article>
{% endblock content %}

+ 17
- 33
site.py View File

@@ -28,6 +28,7 @@ LOCAL_DOMAIN = "http://larlet.test:3579"
# Hardcoding publication at 12 in Paris timezone.
NORMALIZED_STRFTIME = "%Y-%m-%dT12:00:00+01:00"
TODAY = datetime.today() + timedelta(hours=6)
PUBLICATION_BUFFER = TODAY - timedelta(days=7)


class MarkParser(mistune.InlineParser):
@@ -149,7 +150,7 @@ def neighborhood(iterable, first=None, last=None):
def each_markdown_from(source_dir, file_name="*.md"):
"""Walk across the `source_dir` and return the md file paths."""
for filename in fnmatch.filter(os.listdir(source_dir), file_name):
yield os.path.join(source_dir, filename)
yield filename


@dataclass
@@ -160,11 +161,9 @@ class Page:
lang: str = "fr"

def __post_init__(self):
suffix = len(".md")
prefix = len("YYYY/MM-DD") + suffix
date_str = self.file_path[-prefix:-suffix].replace("-", "/")
self.url = f"/david/{date_str}/"
self.date = datetime.strptime(date_str, "%Y/%m/%d").date()
date_str, _ = self.file_path.split(" - ", 1)
self.url = f"/david/{date_str.replace('-', '/')}/"
self.date = datetime.strptime(date_str, "%Y-%m-%d").date()
self.full_url = f"{DOMAIN}{self.url}"
self.normalized_date = self.date.strftime(NORMALIZED_STRFTIME)
self.escaped_title = escape(self.title)
@@ -187,13 +186,13 @@ class Page:
"""Retrieve all pages sorted by desc."""
page_list = []
md = markdown_with_h2_anchors if with_h2_anchors else markdown_with_img_sizes
for file_path in each_markdown_from(source):
result = md.read(file_path)
for file_name in each_markdown_from(source):
result = md.read(source / file_name)
# Extract (and remove) the title from the generated page.
title, content = result.split("</h1>", 1)
h1_opening_size = len("<h1>")
title = title[h1_opening_size:]
page = Page(title, content, file_path)
page = Page(title, content, file_name)
if only_published and page.is_draft:
continue
page_list.append(page)
@@ -203,35 +202,20 @@ class Page:
def is_draft(self):
return (
datetime(year=self.date.year, month=self.date.month, day=self.date.day)
> TODAY
> PUBLICATION_BUFFER
)


@cli
def orphans():
"""Print out fragments not linked to any page."""
linked_fragments = []
for file_path in each_markdown_from(DAVID / "2020"):
for line in open(file_path).readlines():
if line.startswith(".. include:: fragments/"):
linked_fragments.append(line[len(".. include:: fragments/") : -1])
all_fragments = []
for file_path in each_markdown_from(DAVID / "2020" / "fragments"):
all_fragments.append(file_path[len("david/2020/fragments/") :])
for fragment_filename in set(all_fragments) - set(linked_fragments):
# Prepending path for easy command+click from fish.
print(f"Orphan: {DAVID / '2020' / 'fragments' / fragment_filename}")


@cli
def pages():
"""Build the agregations from fragments."""
root_path = DAVID / "2020"
root_path = DAVID / "2021"
source_path = root_path / "sources"
for previous, page, next_ in neighborhood(
reversed(Page.all(source=root_path, only_published=False)),
reversed(Page.all(source=source_path, only_published=False)),
first={
"url": "/david/stream/",
"title": "Streams 2009-2019",
"url": "/david/2020/",
"title": "Publications 2020",
"is_draft": False,
},
):
@@ -247,7 +231,7 @@ def pages():
if page.is_draft:
print(f"Draft: {LOCAL_DOMAIN}{page.url} ({page.title})")
template = environment.get_template("archives_2020.html")
content = template.render(page_list=reversed(Page.all(source=root_path)))
content = template.render(page_list=reversed(Page.all(source=source_path)))
open(root_path / "index.html", "w").write(content)


@@ -256,7 +240,7 @@ def home():
"""Build the home page with last published items."""
template = environment.get_template("profil.html")
content = template.render(
page_list=reversed(Page.all(source=DAVID / "2020")),
page_list=Page.all(source=DAVID / "2021" / "sources"),
)
open(DAVID / "index.html", "w").write(content)

@@ -266,7 +250,7 @@ def feed():
"""Generate a feed from last published items."""
template = environment.get_template("feed.xml")
content = template.render(
page_list=Page.all(source=DAVID / "2020", with_h2_anchors=False),
page_list=Page.all(source=DAVID / "2021" / "sources", with_h2_anchors=False),
current_dt=TODAY.strftime(NORMALIZED_STRFTIME),
BASE_URL=f"{DOMAIN}/david/",
)

+ 285
- 0
site2020.py View File

@@ -0,0 +1,285 @@
#!/usr/bin/env python3
import fnmatch
import locale
import os
from dataclasses import dataclass
from datetime import datetime, timedelta
from html import escape
from pathlib import Path
from textwrap import dedent
from time import perf_counter

import mistune
from jinja2 import Environment as Env
from jinja2 import FileSystemLoader
from minicli import cli, run, wrap
from mistune.directives import DirectiveInclude
from PIL import Image
from slugify import slugify

# Useful for dates rendering within Jinja2.
locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")

HERE = Path(".")
DAVID = HERE / "david"
STATIC = HERE / ".." / "larlet-fr-static"
DOMAIN = "https://larlet.fr"
LOCAL_DOMAIN = "http://larlet.test:3579"
# Hardcoding publication at 12 in Paris timezone.
NORMALIZED_STRFTIME = "%Y-%m-%dT12:00:00+01:00"
TODAY = datetime.today() + timedelta(hours=6)


class MarkParser(mistune.InlineParser):
"""Parses `==foo==` as `<mark>foo</mark>`."""

MARK = (
r"(\={2})(?=[^\s*])("
r"(?:\\[\\*]|[^*])*"
r"(?:" + mistune.InlineParser.ESCAPE + r"|[^\s*]))\1"
)

RULE_NAMES = mistune.InlineParser.RULE_NAMES + ("mark",)

def parse_mark(self, m, state):
marker = m.group(1)
text = m.group(2)
return "mark", self.render(text, state)


class MarkRenderer(mistune.HTMLRenderer):
"""To use in conjunction with `MarkParser`."""

def mark(self, text):
return "<mark>" + text + "</mark>"


class BlockquoteLanguageRenderer(MarkRenderer):
"""Sets the English language attribute for blockquotes with `[en]` prefix."""

def _get_language(self, text):
if text.startswith("<p>[en] "):
return "en", text.replace("<p>[en] ", "<p>")
else:
return None, text

def block_quote(self, text):
language, text = self._get_language(text)
if language:
return f'\n<blockquote lang="{language}">\n{text}</blockquote>\n'
else:
return f"\n<blockquote>\n{text}</blockquote>\n"


class ImgsWithSizesRenderer(BlockquoteLanguageRenderer):
"""Renders images as <figure>s and add sizes (useful for lazy loading)."""

def paragraph(self, text):
# In case of a figure, we do not want the (non-standard) paragraph.
if text.strip().startswith("<figure>"):
return text
return f"<p>{text}</p>\n"

def image(self, src, alt="", title=None):
full_path = STATIC / Path(src[1:])
image = Image.open(full_path)
width, height = image.size
return dedent(
f"""\
<figure>
<img src="{src}"
alt="{alt}"
loading="lazy" width="{width}" height="{height}" />
<figcaption>{title}</figcaption>
</figure>
"""
)


class H2AnchorsRenderer(ImgsWithSizesRenderer):
"""Custom renderer for H2 titles with anchors."""

def heading(self, text, level):
if level == 2:
slug = slugify(text)
return (
f'<h2 id="{slug}">'
f"{text} "
f'<a href="#{slug}" title="Ancre vers cette partie">#</a>'
f"</h2>"
)
else:
return super().heading(text, level)


# We want a custom renderer to create a hash/link for each H2 headings.
markdown_with_h2_anchors = mistune.Markdown(
renderer=H2AnchorsRenderer(escape=False),
inline=MarkParser(H2AnchorsRenderer(escape=False)),
plugins=[DirectiveInclude()],
)
# The second markdown is pertinent to generate articles for the feed,
# we do not need anchors in that case.
markdown_with_img_sizes = mistune.Markdown(
renderer=ImgsWithSizesRenderer(escape=False),
inline=MarkParser(ImgsWithSizesRenderer(escape=False)),
plugins=[DirectiveInclude()],
)

# This is the jinja2 configuration to locate templates.
environment = Env(loader=FileSystemLoader(str(DAVID / "templates")))


def neighborhood(iterable, first=None, last=None):
"""
Yield the (previous, current, next) items given an iterable.

You can specify a `first` and/or `last` item for bounds.
"""
iterator = iter(iterable)
previous = first
current = next(iterator) # Throws StopIteration if empty.
for next_ in iterator:
yield (previous, current, next_)
previous = current
current = next_
yield (previous, current, last)


def each_markdown_from(source_dir, file_name="*.md"):
"""Walk across the `source_dir` and return the md file paths."""
for filename in fnmatch.filter(os.listdir(source_dir), file_name):
yield os.path.join(source_dir, filename)


@dataclass
class Page:
title: str
content: str
file_path: str
lang: str = "fr"

def __post_init__(self):
suffix = len(".md")
prefix = len("YYYY/MM-DD") + suffix
date_str = self.file_path[-prefix:-suffix].replace("-", "/")
self.url = f"/david/{date_str}/"
self.date = datetime.strptime(date_str, "%Y/%m/%d").date()
self.full_url = f"{DOMAIN}{self.url}"
self.normalized_date = self.date.strftime(NORMALIZED_STRFTIME)
self.escaped_title = escape(self.title)
self.escaped_content = escape(
self.content.replace('href="/', f'href="{DOMAIN}/')
.replace('src="/', f'src="{DOMAIN}/')
.replace('href="#', f'href="{self.full_url}#')
+ '<hr/><p><a href="mailto:david@larlet.fr">Réagir ?</a></p>'
)
# Extract first paragraph.
self.extract = self.content.split("</p>", 1)[0] + "</p>"

def __lt__(self, other: "Page"):
if not isinstance(other, Page):
return NotImplemented
return self.date < other.date

@staticmethod
def all(source: Path, only_published=True, with_h2_anchors=True):
"""Retrieve all pages sorted by desc."""
page_list = []
md = markdown_with_h2_anchors if with_h2_anchors else markdown_with_img_sizes
for file_path in each_markdown_from(source):
result = md.read(file_path)
# Extract (and remove) the title from the generated page.
title, content = result.split("</h1>", 1)
h1_opening_size = len("<h1>")
title = title[h1_opening_size:]
page = Page(title, content, file_path)
if only_published and page.is_draft:
continue
page_list.append(page)
return sorted(page_list, reverse=True)

@property
def is_draft(self):
return (
datetime(year=self.date.year, month=self.date.month, day=self.date.day)
> TODAY
)


@cli
def orphans():
"""Print out fragments not linked to any page."""
linked_fragments = []
for file_path in each_markdown_from(DAVID / "2020"):
for line in open(file_path).readlines():
if line.startswith(".. include:: fragments/"):
linked_fragments.append(line[len(".. include:: fragments/") : -1])
all_fragments = []
for file_path in each_markdown_from(DAVID / "2020" / "fragments"):
all_fragments.append(file_path[len("david/2020/fragments/") :])
for fragment_filename in set(all_fragments) - set(linked_fragments):
# Prepending path for easy command+click from fish.
print(f"Orphan: {DAVID / '2020' / 'fragments' / fragment_filename}")


@cli
def pages():
"""Build the agregations from fragments."""
root_path = DAVID / "2020"
for previous, page, next_ in neighborhood(
reversed(Page.all(source=root_path, only_published=False)),
first={
"url": "/david/stream/",
"title": "Streams 2009-2019",
"is_draft": False,
},
):
template = environment.get_template("article_2020.html")
content = template.render(
page=page,
prev=previous,
next=next_,
)
target_path = Path(page.url[1:])
target_path.mkdir(parents=True, exist_ok=True)
open(target_path / "index.html", "w").write(content)
if page.is_draft:
print(f"Draft: {LOCAL_DOMAIN}{page.url} ({page.title})")
template = environment.get_template("archives_2020.html")
content = template.render(page_list=reversed(Page.all(source=root_path)))
open(root_path / "index.html", "w").write(content)


@cli
def home():
"""Build the home page with last published items."""
template = environment.get_template("profil.html")
content = template.render(
page_list=reversed(Page.all(source=DAVID / "2020")),
)
open(DAVID / "index.html", "w").write(content)


@cli
def feed():
"""Generate a feed from last published items."""
template = environment.get_template("feed.xml")
content = template.render(
page_list=Page.all(source=DAVID / "2020", with_h2_anchors=False),
current_dt=TODAY.strftime(NORMALIZED_STRFTIME),
BASE_URL=f"{DOMAIN}/david/",
)
open(DAVID / "log" / "index.xml", "w").write(content)


@wrap
def perf_wrapper():
start = perf_counter()
yield
elapsed = perf_counter() - start
print(f"Done in {elapsed:.5f} seconds.")


if __name__ == "__main__":
run()

Loading…
Cancel
Save