diff --git a/Tuprules.tup b/Tuprules.tup
index e342576..3712e6e 100644
--- a/Tuprules.tup
+++ b/Tuprules.tup
@@ -1,5 +1,6 @@
&root = .
&tmpl_dir = ./templates
+&gen_tmpl_dir = ./build/templates
HTML_TEMPLATE = main.html
@@ -9,8 +10,8 @@ HTML_TEMPLATE = main.html
--template=&(tmpl_dir)/$(HTML_TEMPLATE) \
--include-in-header=&(tmpl_dir)/header.html \
--include-before-body=&(tmpl_dir)/nav.html \
- --include-after-body=&(tmpl_dir)/footer.html \
--css &(root)/css/style.css \
+ --include-after-body=&(gen_tmpl_dir)/footer.html \
%f | sed 's|%%webRoot%%|&(root)|g' > %o \
|> %B.html
@@ -19,17 +20,7 @@ HTML_TEMPLATE = main.html
!compress_png = |> zopflipng %f %o |>
!compress_jpg = |> cjpeg -quality 80 -progressive -outfile %o %f |>
!compress_pdf = |> ps2pdf %f %o |>
-!avif = |> avifenc %f %o |> %B.avif
-!jxl = |> cjxl %f %o |> %B.jxl
JPG_OPT = -quality 80 -strip -interlace Plane
!blur_mini = |> ^ %f -> blur mini^ convert %f -resize 400x400 -blur 0x8 $(JPG_OPT) %o |> blur_mini.jpg
!thumbnail = |> ^ %f -> thumbnail^ convert %f -resize 200x200 $(JPG_OPT) %o |>
-
-#
-# Slides
-#
-MARP = npx @marp-team/marp-cli@latest
-MARP_OPTS = --allow-local-files --bespoke.progress
-!marp_pdf = |> $(MARP) $(MARP_OPTS) %f --pdf --output %o |> %B.pdf
-!marp_html = |> $(MARP) $(MARP_OPTS) %f --html --output %o |> %B.html
diff --git a/about.md b/about.md
index 2762b5e..7a69288 100644
--- a/about.md
+++ b/about.md
@@ -66,7 +66,7 @@ work on smart homes. I work in the Vision team, making home cameras smarter. I
am thrilled to work on computer vision again.
-
+
diff --git a/articles/Tupfile b/articles/Tupfile
index 924243a..c8d9bfc 100644
--- a/articles/Tupfile
+++ b/articles/Tupfile
@@ -1,5 +1,5 @@
include_rules
HTML_TEMPLATE = article.html
-: *.md |> ./generate_listing.nu > %o |> index.md
+: *.md |> ./generate_listing.sh > %o |> index.md
: foreach *.md |> !html |>
diff --git a/articles/chasseur_cueilleur_parents.md b/articles/chasseur_cueilleur_parents.md
deleted file mode 100644
index 851edde..0000000
--- a/articles/chasseur_cueilleur_parents.md
+++ /dev/null
@@ -1,378 +0,0 @@
----
-title: "Chasseur, cueilleur, parent"
-date: 2025-05-06
----
-
-_Ceci est un résumé du livre [Chasseur, cueilleur, parent](https://www.editionsleduc.com/produit/2579/9791028521592/chasseur-cueilleur-parent)_
-
-## Méthode TEAM
-
-1. tendre camaraderie
-2. encouragements
-3. autonomie
-4. minimum d’ingérence
-
-## Comment élever des enfants serviables ?
-
-- Les enfants ont le désir inné d’aider leurs parents. Il peut donc sembler
-inapte ou empoté. C’est à ses parents de le former.
-
-- Ne découragez jamais un enfant d’aider. Si une tâche est trop difficile ou
-trop dangereuse, dites-lui d’observer. Ou divisez la tâche en sous-tâches plus
-réalisables.
-
-- Tâches simples mais réelles à effectuer ensemble, 1x / heure.
- - aller chercher quelque chose dont vous avez besoin
- - porter un petit sac de courses
- - remuer une préparation dans une casserole
- - couper un légume
- - tenir la porte
- - ouvrir le robinet du tuyau d’arrosage
- - remettre un livre dans la bibliothèque
-
-- Pour les enfants plus grands (à partir de 7 ans) : essayez de déclencher son
-action en faisant une allusion indirecte à la tâche :
- - "la gamelle du chien est vide"
- - "il est l’heure de préparer le dîner"
-
-## Comment élever des enfants coopérants
-
-- Les enfants sont animés d’une motivation naturelle très forte pour le travai
-en équipe et la coopération.
-
-- Les activités centrées sur les enfants sapent cette motivation pour le travail
-en équipe.
-
-- À l’inverse, en incluant les enfants dans les activités d’adulte, on accroît
-leur motivation à coopérer et à faire comme les autres membres de la famille.
-
-- Les enfants ont tendance à mal se comporter lorsqu’ils doivent passer du monde
-des enfants au monde des adultes.
-
-- Dans la plupart des cultures, les parents ne passent pas leur temps à stimuler
-et à divertir les enfants.
-
-- Les enfants n’ont pas besoin qu’on les stimule ou qu’on les amuse.
-
-### Actions pour tous les enfants
-
-- Limitez les activités centrées sur les enfants. Veillez à ce que votre enfant
-ait accès à votre vie et à votre travail. Veillez à ce qu’il soit dans les
-parages lorsque vous vous adonnez à des tâches domestiques ou à d’autres
-activités d’adulte.
-
-- Réduisez les distractions telles que les écrans et les jouets. Moins l’enfant
-disposera d’objets de «divertissement», plus il sera attiré par votre univers et
-plus il sera susceptible de vouloir vous aider et de passer du temps avec vous.
-
-- Augmentez au maximum son exposition au monde des adultes. Vaquez à vos
-occupations avec votre enfant près de vous.
-
-- Le week-end, choisissez des activités qui vous font envie, celles que vous
-feriez même si vous n’aviez pas d’enfant.
-
-### Actions pour les enfants à partir de 7 ans
-
-- Laissez-le prévoir et organiser ses activités (les cours de sport, de musique,
-d’arts plastiques, toute autre activité extrascolaire, les goûters avec
-les copains...).
-
-- Augmentez progressivement les responsabilités de l’enfant dans la maison, y
-compris le fait de s’occuper de ses petits frères et sœurs, et sa participation
-à la préparation des repas et au ménage. Pensez à la manière dont il pourrait
-vous aider dans votre travail.
-
-- Si un enfant plus âgé a été peu exposé au monde des adultes, allez-y par
-paliers. Vaquez à vos occupations en emmenant votre enfant avec vous. S’il se
-conduit mal, expliquez-lui comment il doit se comporter dans le monde des
-adultes.
-
-- Si l’enfant a toujours un comportement perturbateur, soyez patient. Ne
-renoncez pas. Réessayez plus tard. Il apprendra.
-
-## Comment motiver les enfants
-
-- Si vous voulez motiver un enfant sans le soudoyer ou l’amadouer, il doit avoir
-l’impression :
- - D’être relié à vous ou à une autre personne proche.
- - De choisir d’accomplir la tâche sans que personne l’y oblige.
- - D’être compétent, en sorte que sa participation sera valorisée.
-
-- Les compliments peuvent saper la motivation et générer de la compétition (et
-des querelles) entre frères et sœurs.
-
-- Les connaissances peuvent circuler dans un sens comme dans l’autre. Lorsqu’on
-accorde de l’attention aux idées et aux points de vue d’un enfant, on en tire
-souvent des informations précieuses et utiles.
-
-- Accepter les connaissances, les idées et les contributions d’un enfant est un
-excellent moyen de le motiver.
-
-- Résistez à l’envie de corriger un enfant, surtout quand il est en train de
-mettre la main à la pâte ou d’aider la famille.
-
-- Si un enfant refuse d’obéir à une demande (par exemple aider à débarrasser),
-vous êtes probablement trop insistant. L’enfant sait ce que vous voulez. Arrêtez
-de le demander. Attendez et laissez l’enfant prendre les rênes.
-
-- Soyez très attentif à la participation de l’enfant, puis inspirez-vous de ses
-idées plutôt que de vous y opposer.
-
-- Aidez un enfant à apprendre une tâche en le laissant pratiquer plutôt qu’en
-lui faisant un cours complet sur la manière de l’accomplir. Proposez de simples
-ajustements, avec parcimonie, pendant que l’enfant est à l’œuvre.
-
-- Acceptez la contribution de l’enfant, même si elle ne répond pas à vos
-attentes ou à vos désirs.
-
-- Usez des compliments avec modération. Associez vos félicitations à
-l’apprentissage d’une valeur globale («tu commences réellement à nous aider») ou
-à une certaine maturité («tu es en train de devenir une grande fille»).
-
-## Comment apprendre aux enfants à maîtriser leur colère
-
-- La colère contre un enfant est stérile. Elle génère du conflit, crée de la
-tension et coupe la communication. Chaque fois qu’on crie après un enfant,
-on lui apprend à hurler et à se mettre en colère au moindre problème ou à la
-moindre contrariété. L’enfant pratique la colère et les cris.
-
-- Vous pouvez interrompre ce cycle en répondant à l’enfant avec calme et
-gentillesse.
-
-- On surestime souvent l’intelligence émotionnelle des enfants.
-
-- Pour aider un enfant à savoir maîtriser sa colère, le mieux est de maîtriser
-sa propre colère devant lui.
-
-- Chaque fois qu’on répond avec calme et sang-froid à un enfant contrarié, on
-lui donne la possibilité de trouver cette réponse en lui.
-
-- Lorsque vous ressentez de la colère à l’égard d’un enfant, restez silencieux
-et attendez que la colère passe. Si vous parlez, l’enfant ressentira votre
-colère. Mieux vaut donc se taire.
-
-- Si vous ne parvenez pas à maîtriser votre colère, sortez de la pièce ou
-éloignez-vous de l’enfant. Revenez une fois que vous êtes calmé.
-
-- Apprenez à ressentir moins (voire pas du tout) de colère à l’égard des
-enfants.
-
-- **Modifiez votre point de vue sur leur comportement.** Attendez-vous à ce que
-les jeunes enfants se comportent mal et causent des problèmes.
-
-- **Ne vous disputez (et ne négociez) jamais avec un enfant.** Les disputes
-permettent à l’enfant de s’entraîner à argumenter. Taisez-vous et éloignez-vous.
-
-- **Arrêtez de forcer les enfants à faire des choses.** Cela engendre des
-conflits, érode la communication et fait monter la colère (des deux côtés).
-Utilisez les outils décrits dans le chapitre suivant pour favoriser un
-comportement approprié plutôt que de l’imposer.
-
-## Outils pour modifier le comportement
-
-- La parole est souvent le moyen de communication le moins efficace avec les
-enfants, en particulier les plus jeunes.
-
-- Les émotions de l’enfant sont le miroir de nos émotions.
- - Si vous souhaitez que votre enfant soit calme, doux et silencieux, parlez peu
-ou pas du tout (les mots stimulent).
- - Si vous souhaitez que votre enfant soit bruyant et très agité, soyez-le.
-Parlez beaucoup.
-
-- Les ordres et les leçons entraînent souvent des bras de fer, des négociations
-et des spirales de colère.
-
-- On peut rompre le cycle de la colère et des bras de fer grâce à des outils
-non verbaux ou en amenant l’enfant à réfléchir plutôt que de lui dire ce qu’il
-doit faire.
-
-- **Dompter les crises.** Les crises de colère se dissipent si vous réagissez
-avec calme.
- - **L’énergie.** En restant aussi calme et paisible que possible, tenez-vous
-près de l’enfant, en silence, et montrez-lui que vous êtes là pour lui et que
-vous le soutenez.
- - **Le contact physique.** Touchez doucement l’épaule de l’enfant ou tendez-lui
-la main.
- - **L’émerveillement.** Aidez l’enfant à remplacer la colère par cette émotion
-qu’est l’émerveillement.
- - **L’extérieur.** Si l’enfant ne se calme toujours pas, sortez-le prendre
-l’air. Conduisez-le dehors en douceur ou emmenez-le dans vos bras.
-
-- **Changer de comportement et transmettre des valeurs.** Au lieu d’ordonner à
-l’enfant de «ne pas faire ça», poussez-le à réfléchir.
- - **Le regard-qui-dit-tout.** Prenez tout ce que vous avez envie de dire à
-un enfant qui se comporte mal et dirigez-le dans votre expression faciale.
-Ouvrez grand les yeux, plissez le nez ou secouez la tête. Puis jetez ce regard
-à l’enfant.
- - **Le puzzle des conséquences.** Énoncez calmement quelles sont les
-conséquences de ses actes, puis partez (par exemple: «Tu vas tomber et te faire
-mal»).
- - **Les questions.** Au lieu d’émettre des ordres et des consignes, posez une
-question à l’enfant (par exemple: «Qui est méchant avec Freddy?» quand il est
-en train de taper son frère, ou «Qui est irrespectueuse?» quand l’enfant ignore
-une demande).
- - **La responsabilité.** Si un enfant se comporte mal, donnez-lui une tâche à
-réaliser (par exemple, dites à un enfant qui pleurniche le matin: «Viens m’aider
-à préparer ta boîte à goûter»).
- - **Les actes.** Au lieu de demander à un enfant de faire quelque chose (par
-exemple sortir de la maison), faites-le. L’enfant suivra.
-
-## Modeler le comportement grâce aux histoires et au jeu théâtral
-
-- Quand un enfant est contrarié, il lui est difficile d’écouter et d’apprendre.
-
-- Quand un enfant est détendu et se sent protégé de toute punition, il est ouvert
-pour apprendre de nouvelles règles et réparer ses erreurs.
-
-- Si un enfant ne se montre pas coopérant dans une situation donnée (par exemple,
-faire ses devoirs), il est probable qu’il existe une tension sur cette question
-entre l’enfant et le parent. Une fois cette tension dissipée grâce au jeu
-théâtral ou à une histoire, l’enfant adoptera un meilleur comportement et sera
-plus coopérant.
-
-- Les enfants adorent apprendre à travers des récits oraux, surtout quand ces
-histoires parlent de personnages, d’expériences et d’objets de leur propre vie.
-Ils ont une tendance naturelle à apprendre de cette manière. Ils adorent par
-exemple:
-
- – Qu’on leur parle de leur histoire familiale et de l’enfance de leurs parents.
-
- – Imaginer des objets prendre vie et faire des erreurs.
-
- – S’imaginer vivre entourés de fantômes, de monstres, de fées et d’autres
-créatures surnaturelles qui les aident à apprendre à se comporter correctement.
-
-- Les enfants adorent apprendre par le jeu. Cela leur permet de relâcher la
-tension et de s’entraîner à bien se comporter. Ils aiment rejouer une erreur ou
-un comportement problématique et observer les conséquences dans un environnement
-ludique et sans stress (sans craindre d’être punis).
-
-Plutôt que de vous lancer dans des leçons de morale et de vous appuyer sur un
-raisonnement adulte pour modifier le comportement d’un enfant ou lui inculquer
-une valeur, attendez un moment de calme et de détente et essayez l’un de ces
-outils:
-
- - **Racontez une anecdote de votre enfance.** Expliquez comment vous et vos
-parents aviez géré une bêtise, un problème, un mauvais comportement. Aviez-vous
-été puni ? Comment aviez-vous réagi ?
-
- - **Faites un spectacle de marionnettes.** Prenez un animal en peluche ou une
-paire de chaussettes pour mettre en scène les conséquences du comportement de
-l’enfant et lui montrer comment vous aimeriez qu’il se conduise. Demandez-lui de
-jouer l’un des personnages.
-
- - **Déplacez le problème sur le terrain du jeu.** Dites à l’enfant: «J’ai remarqué
-qu’on se dispute beaucoup à propos de tes devoirs [ou du problème en question].
-Si on jouait à un jeu ? Qui as-tu envie de jouer ? Toi ou moi ?» Puis rejouez
-sur un ton humoristique ce qui se passe pendant les disputes. N’ayez pas peur
-de partir dans le délire et l’exagération. L’objectif, c’est d’en rire et de
-relâcher la tension qui s’est créée autour de cette question.
-
- - **Ayez recours à un monstre.** Créez un monstre tapi près de la maison. Dites
-à l’enfant qu’un monstre le regarde et que, s’il se conduit mal, le monstre
-viendra l’enlever (seulement pour quelques jours).
-
- - **Donnez vie à un objet inanimé.** Utilisez une peluche, un vêtement ou tout
-autre objet inanimé pour amadouer l’enfant et le persuader d’accomplir une
-tâche. Faites faire cette tâche à l’objet en question (brosser les dents
-d’une peluche) ou faites parler l’objet (c’est la brosse à dents qui demande à
-l’enfant de se brosser les dents, par exemple).
-
-## Comment élever un enfant sûr de lui
-
-- Tout comme les adultes, les enfants, petits et grands, n’aiment pas qu’on
-les commande. Ils ont, quel que soit leur âge, un penchant naturel pour
-l’apprentissage de l’autonomie sans qu’on s’en mêle.
-
-- Quand on mène un enfant à la baguette, on sape sa confiance en lui et son
-autonomie.
-
-- Quand on respecte l’autonomie de l’enfant et qu’on réduit ses instructions
-au minimum, on lui envoie le message qu’il est autonome et capable de régler
-lui-même les problèmes.
-
-- Donner de l’autonomie à un enfant est la meilleure façon de le protéger du
-stress et de l’anxiété.
-
-- L’indépendance et l’autonomie sont deux concepts distincts:
-
- - Un enfant indépendant est déconnecté des autres, il n’est responsable de
-personne d’autre que lui.
-
- - Un enfant autonome est maître de ses actes et prend ses propres décisions,
-mais il est en relation permanente avec sa famille et ses amis. On attend de lui
-aide, partage et bienveillance. On attend de lui qu’il rende au groupe chaque
-fois qu’il le peut.
-
-- **Soyez attentif à la fréquence des consignes que vous donnez à votre enfant.**
-Programmez le minuteur de votre téléphone sur vingt minutes. Comptez combien de
-commentaires, questions et demandes vous avez émis pendant ce laps de temps.
-
-- **Limitez-vous à trois ordres par heure.** Efforcez-vous de vous y tenir, notamment
-dans les activités génératrices de conflits et de disputes (se préparer
-pour aller à l’école ou pour aller au lit, par exemple). N’ayez recours aux
-ordres que pour apprendre à l’enfant la serviabilité, la générosité et les
-responsabilités envers sa famille.
-
-- **Trouvez une zone d’autonomie.** Identifiez des lieux autour de chez vous où les
-enfants de tous les âges peuvent évoluer en toute autonomie, où vous pouvez les
-surveiller de loin en interférant le moins possible. Pensez aux parcs et aux
-aires de jeux en plein air, aux prés et aux plages. Prenez de la lecture ou du
-travail et laissez les enfants jouer pendant quelques heures.
-
-- **Faites de votre jardin et de votre quartier une zone d’autonomie.** Formez votre
-enfant à gérer les dangers, chez vous et aux alentours. Tissez un «filet de
-protection invisible» en sympathisant avec vos voisins et leurs enfants.
-
-- **Cessez d’être ventriloque.** Mettez un point d’honneur à ne plus parler à la
-place de votre enfant ou lui dire ce qu’il doit dire. Laissez-le répondre aux
-questions qu’on lui pose, passer commande au restaurant, décider quand dire
-«s’il te plaît» et «merci». Faites en sorte qu’il soit capable de gérer lui-même
-toutes les conversations, y compris les discussions avec ses enseignants,
-entraîneurs ou moniteurs.
-
-## Comment protéger ses enfants de la dépression
-
-- Les bébés et les enfants sont conçus pour être élevés par toutes sortes
-de personnes. Grands-parents, tantes, nourrices, voisins... toutes sont
-importantes.
-
-- Ce réseau d’amour et de soutien aide l’enfant à voir le monde comme un lieu
-bénéfique et bienveillant, ce qui le protège de la dépression et d’autres
-troubles de santé mentale.
-
-- Un ou deux alloparents supplémentaires peuvent vraiment faire la différence
-dans la vie d’un enfant.
-
-- Les autres enfants peuvent être de fantastiques alloparents et ont tendance
-à faire de meilleurs enseignants et camarades de jeu que les adultes. Les
-enfants intègrent naturellement le jeu aux apprentissages et ont des niveaux de
-compétence plus proches de ceux des petits que les adultes.
-
-- Les amitiés intimes et profondes sont probablement tout aussi importantes pour
-votre santé et celle de votre enfant que l’exercice physique et une alimentation
-saine.
-
-- **Tissez un réseau de tantes et d’oncles.** Collaborez avec trois ou quatre
-autres familles pour vous partager les temps extrascolaires, en mettant en
-place un roulement pour chaque jour de la semaine. Ce réseau procure un soutien
-émotionnel aux enfants et permet aux parents de souffler.
-
-- **Créer un GEM (groupe d’enfants multiâges).** Encouragez votre enfant à jouer
-avec d’autres, de tous les âges et dans tout le quartier. Invitez les autres
-familles à des dîners ou des apéros. Organisez de grandes garderies de quartier
-le week-end, où vous invitez des enfants de tous les âges à jouer dans votre
-jardin ou dans un parc.
-
-- **Formez de mini-alloparents.** Apprenez très tôt aux enfants plus âgés à
-s’occuper de leurs petits frères et sœurs. Établissez un lien entre l’aide
-qu’ils apportent et leur maturité croissante («Tu aides ton petit frère parce
-que tu es une grande fille maintenant»). Récompensez l’enfant en augmentant ses
-responsabilités au fil du temps.
-
-- **Appréciez l’aide des alloparents déjà présents.** Travaillez main dans
-la main avec votre enfant pour exprimer votre reconnaissance aux nourrices,
-puéricultrices, professeurs et entraîneurs. Faites-lui rédiger des petits mots,
-préparer des biscuits et friandises pour les remercier. Considérez-les comme
-des membres importants de votre famille. Montrez l’exemple du respect et de
-la générosité.
diff --git a/articles/generate_listing.nu b/articles/generate_listing.nu
deleted file mode 100755
index 8df24a7..0000000
--- a/articles/generate_listing.nu
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env nu
-
-def get_metadata [path: string] {
- let lines = open $path | lines
- let anchors = $lines | enumerate | filter {|l| ($l.item | str starts-with "---")} | take 2
- let header = $lines
- | range (($anchors | first | get 'index') + 1)..(($anchors | last | get 'index') - 1)
- let metadata = $header | split column -n 2 --regex '\s*:\s*' | rename key value
- let record = $metadata | reduce -f {} {|it, acc| $acc | upsert $it.key ($it.value | str trim --char '"') }
- $record |
-}
-
-let pages = (glob *.md) ++ (glob **/index.md)
-let sorted_pages = $pages | wrap 'path'
- | upsert metadata {|row| (get_metadata $row.path)}
- | sort-by --reverse metadata.date
-
-print "---
-title: Articles
----
-"
-
-let _ = $sorted_pages | each {|p|
- let rel_path = $p.path | path relative-to (pwd)
- let html_path = $rel_path | path parse --extension md | upsert extension { 'html' } | path join
- print --no-newline $"- ($p.metadata.date): [($p.metadata.title)]\(($html_path)\)"
- if $p.metadata.update? != null {
- print $" \(Updated: ($p.metadata.update)\)"
- } else {
- print ""
- }
-}
diff --git a/articles/generate_listing.sh b/articles/generate_listing.sh
new file mode 100755
index 0000000..cf62c2d
--- /dev/null
+++ b/articles/generate_listing.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+cat << EOF
+---
+title: Articles
+---
+
+EOF
+
+listing=""
+for file in *.md; do
+ if [ $file = "index.md" ]; then
+ continue
+ fi
+
+ link=$(basename $file .md).html
+ date=$(sed -n 's/date: \(.*\)/\1/p' $file)
+ title=$(sed -n 's/title: \(.*\)/\1/p' $file)
+ listing="$listing- $date: [$title]($link)\n"
+done
+echo -e $listing | sort --reverse
diff --git a/articles/jujutsu/Tupfile b/articles/jujutsu/Tupfile
deleted file mode 100644
index a3775a5..0000000
--- a/articles/jujutsu/Tupfile
+++ /dev/null
@@ -1,9 +0,0 @@
-include_rules
-HTML_TEMPLATE = article.html
-
-: foreach *.png |> !avif |>
-: foreach *.png |> !jxl |>
-: index.md | ./ |> !html |>
-
-# images embedding not working in marp + tup
-# : slides.md |> !marp_pdf |> jujutsu_slides.pdf ./
diff --git a/articles/jujutsu/index.md b/articles/jujutsu/index.md
deleted file mode 100644
index 0b1863d..0000000
--- a/articles/jujutsu/index.md
+++ /dev/null
@@ -1,154 +0,0 @@
----
-title: "Lightning talk: Jujutsu"
-date: 2025-02-17
----
-
-_Slides available: [pdf](./jujutsu_slides.pdf)_
-
-
-
-
-
-
-
-
-
-## What is it?
-
-[Jujutsu](https://github.com/jj-vcs/jj) is a new version control software (VCS),
-like git, mercurial, etc. Git is the actual gold standard for VCS, even if its
-UX could be better. There is a whole ecosystem around git that makes switching
-to similar projects (eg. mercurial) a daunting task. How does jujutsu plan on
-making us switch?
-
-Jujutsu separates the frontend (what the user interacts with) and the
-backend (how the information is stored). And the main backend is actually git
-repositories. There is a native backend being developed but it's not ready for
-prime time. Sharing the same backend as the most popular VCS, Jujutsu aims to
-improve on the frontend.
-
-## How does it compare?
-
-### No branch, only revisions
-
-Jujutsu understand git commits, but operates at a higher level with revisions.
-Revisions wrap commits, however as you move revisions around (edit with changes,
-or rebase), they keep their id. Only their underlying commit id changes.
-
-With revision ids being stable, you don't need branches to start working: create
-a new revision, and start working. You will need to create a branch (or bookmark
-in jujutsu world) to push your changes, but it can be done at the end.
-
-There is no special mode like git's "Detached HEAD", you are always on a
-revision. You can jump around the history and you will always see the whole
-history, unlike git where you only see parents revisions.
-
-This emphasis on revisions changes the paradigm a bit: you tend to better split
-your revisions, whereas in git you often do smaller commits then clean the whole
-branch during a rebase phase.
-
-You can also modify revisions freely: unlike git where you can only modify
-the current branch, you can squash part of any revision into another unrelated
-revision.
-
-Some revisions (such as the `main` or `master` branch) are considered immutable,
-meaning you are not allowed to modify them. You can override this but this is a
-sane choice by default.
-
-### No staging area
-
-Every modification in jujutsu is stored. It removes a step from git and
-avoids scenarios where you cannot switch branches because of a untracked file
-collision, or when you forget to add a file (it works locally but not on the
-CI env).
-
-It does require a good .gitignore file to avoid adding unnecessary (big) files,
-but that is good practice anyway.
-
-You can mimic git staging area with a new revision on top of your work.[^1]
-
-### Conflicts are ok
-
-Conflicts during rebase are recorded but never stop the rebase. Revisions will
-be flagged as "conflicted" until the conflict markers are removed. You can then
-see how long the conflicts last (maybe a later revision fixes them).
-
-You deal with conflicts how you want, it is never a hurry. You can save your
-progress and change branch in the meanwhile. Once you fix a conflict you do
-not need to explicitely mark them as resolved, the absence of markers is enough
-for jujutsu.
-
-### Branch, bookmark
-
-A "branch" in git is named "bookmark" in jujutsu. You do not need one during
-dev, you can safely switch revisions trees without naming them. This is very
-useful when you need to try something on top of the main branch: you just
-create a new revision on top of it without creating an dedicated branch or even
-modifying the main branch (I often modified my local copy of the main branch
-this way with git).
-
-However, you need a bookmark when you want to push changes to a remote (which is often).
-I believe this could be skipped with a dedicated jujutsu backend.
-
-When creating a bookmark, it sticks to the revision it was created on, you need
-to manually update it if you add revision on top of it. This manual step is
-useful when you want to push your changes but keep a few revisions private until
-your work is done.
-
-Tracked bookmarks are similar to tracked branches in git, but they are
-automatically updated during fetching. No more out-of-date information between a
-local bookmark and its remote (I'm looking at you `origin/main`).
-
-### Tooling
-
-Jujutsu comes with nice CLI tools out-of-the-box: you can select part of a commit
-for squashing / splitting with a dedicated TUI, and the log are pretty-printed
-in graph format.
-
-But it cannot compare to the exhaustive ecosystem that exists for git: GUI,
-scripts, etc. Unfortunately, git tools are confused when you use jujutsu in
-your repository: they only see the detached HEAD, they are missing the overall
-picture.
-
-You can always come back to a regular git workflow based on branches (they are
-mapped on bookmarks), should you need it.
-
-### Takeaway
-
-Jujutsu shines when you are dealing with multiple tracks (bug hunting,
-work-in-progress, small tests).
-
-The need to specify bookmarks when pushing changes feels a bit heavy compared
-to how smooth it is working locally. A backend tailored for jujutsu, supporting
-revisions without bookmarks, would remove a lot of friction.
-
-Jujutsu has cool features, but I wouldn't consider them game-changing. It feels
-simpler though, which is good coming from git.
-
-The ecosystem is almost null, but it is growing.[^2]
-
-
-## VCS landscape
-
-Jujutsu seems to materialize what the next VCS after git should be: better
-conflict support and nicer UX.
-
-It is developed by Googlers and I believe the goal is to slowly replace git CLI
-at Google. It is making good progress with frequent releases.
-
-[Sapling](https://sapling-scm.com/) is another contender, developed at Facebook.
-It is more inspired by Mercurial (which is used at Facebook). Its feature set is
-similar to Jujutsu but it seems less popular.
-
-> I was part of the team at Meta that built Sapling for many years. I’m no
-> longer at Meta and I use jj full time.
->
-> _[Discussion on Lobste.rs](https://lobste.rs/s/rojoz1/jujutsu_jj_git_compatible_vcs#c_foqya4)_
-
-[Pijul](https://pijul.org/) is less focusing on git compatibility and looks
-more like a research project, focusing on theory of patches. I am not sure how
-production ready it currently is, but the clean break with git means it needs to
-be rock solid to tempt people over.
-
-[^1]: [The Squash Workflow](https://steveklabnik.github.io/jujutsu-tutorial/real-world-workflows/the-squash-workflow.html)
-[^2]: [GUI and TUI](https://github.com/jj-vcs/jj/wiki/GUI-and-TUI)
diff --git a/articles/jujutsu/jj-logo.png b/articles/jujutsu/jj-logo.png
deleted file mode 100644
index dc94ced..0000000
Binary files a/articles/jujutsu/jj-logo.png and /dev/null differ
diff --git a/articles/jujutsu/jj_01_commits.png b/articles/jujutsu/jj_01_commits.png
deleted file mode 100644
index 1d58bcf..0000000
Binary files a/articles/jujutsu/jj_01_commits.png and /dev/null differ
diff --git a/articles/jujutsu/jj_01_revs.png b/articles/jujutsu/jj_01_revs.png
deleted file mode 100644
index 1969406..0000000
Binary files a/articles/jujutsu/jj_01_revs.png and /dev/null differ
diff --git a/articles/jujutsu/jj_02.png b/articles/jujutsu/jj_02.png
deleted file mode 100644
index af437d3..0000000
Binary files a/articles/jujutsu/jj_02.png and /dev/null differ
diff --git a/articles/jujutsu/jj_revision.drawio.png b/articles/jujutsu/jj_revision.drawio.png
deleted file mode 100644
index 66d7151..0000000
Binary files a/articles/jujutsu/jj_revision.drawio.png and /dev/null differ
diff --git a/articles/jujutsu/slides.md b/articles/jujutsu/slides.md
deleted file mode 100644
index eb18126..0000000
--- a/articles/jujutsu/slides.md
+++ /dev/null
@@ -1,131 +0,0 @@
----
-marp: false
-theme: gaia
-footer: '**Fabien Freling** - 2025-02-17'
-paginate: true
----
-
-
-
-
-
-
-# Jujutsu
-
-
-
----
-
-## What is it?
-
-* New version control software (VCS)
-* Separation of **frontend** and **backend**
-* Compatible with git
-* Slowly replacing git cli at Google (askip)
-* Aiming for a simpler workflow
-
----
-
-## No branch, only revisions
-
-
-
-
-- @ working copy
-- ◆ immutable
-- × conflict
-
----
-
-## Embrace the DETACHED HEAD
-
-- No need to be at the tip of a branch
-- Easy to change the current revision (no rebase step)
-- Each revision has a scope, you can switch / split / squash
-- You can modify other branches, not only the current one (there is none)
-
----
-
-## Immutable revisions
-
-- New concept
-- By default `master` is immutable, sane choice
-- Clearly express what would create conflict, even local copy cannot change
-- You can override it (but don't)
-
----
-
-## No staging area, everything is logged
-
-- You need a good gitignore
-- You can always switch commits without loss
-- You might want to recreate a "staging" commit
-
----
-
-## Conflicts are ok
-
-- Conflicts are recorded but never stop a rebase
-- Conflicted commits are annotated
-- You can safely rebase, deal with conflicts later on
-- No need to mark as resolved
-
----
-
-## Branches, bookmarks
-
-- Branches (git) = bookmarks (jujutsu)
-- Optional during dev
-- Mandatory when pushing
-- Stick to revision, manual step to update
-- Tracked bookmarks are updated during fetch
- - No sync conflict between a local copy and its remote
-
----
-
-## Back to git?
-
-- A way back is always possible
-- git view gets confused in detached HEAD
-
----
-
-## Tooling
-
-- Battery included
- - CLI tool for splitting commits
-- Git tools not compatible
-
----
-
-## Takeaway
-
-- 🤩 Good when dealing with multiple tracks
-- 😔 Need to explicitely specify branch when pushing commits
-- Small improvements, not game-changing
-- 😔 No ecosystem, but it's growing (TUI)
-- Native backend (not ready yet) would remove a lot of friction
-
----
-
-
-
-## Worth the switch?
-
-# ✋ Not yet
-
----
-
-# References
-
-- [Official website](https://jj-vcs.github.io/jj/)
- - [GUI & TUI](https://github.com/jj-vcs/jj/wiki/GUI-and-TUI)
-
diff --git a/articles/web_stack.md b/articles/web_stack.md
index d3a41b8..1ffc6d8 100644
--- a/articles/web_stack.md
+++ b/articles/web_stack.md
@@ -1,7 +1,6 @@
---
title: Web stack
date: 2019-06-26
-update: 2024-11-26
---
Previous stacks
@@ -25,5 +24,5 @@ Pandoc + Tup = ❤️
I decided to use [Pandoc](https://pandoc.org/) to convert from Markdown to HTML.
It is widely used by other generators and takes care of the file conversion.
-For automation, I use a simple top-level [Justfile](https://just.systems/) and
+For automation, I use a simple top-level Makefile and
[Tup](http://gittup.org/tup/index.html).
diff --git a/flake.nix b/flake.nix
index 994956d..b426747 100644
--- a/flake.nix
+++ b/flake.nix
@@ -7,14 +7,10 @@
devShell.x86_64-linux = with pkgs;
mkShell {
nativeBuildInputs = [
- entr
- graphviz-nox
imagemagick
just
libavif
libjxl
- nodejs
- nushell
pandoc
tup
];
diff --git a/justfile b/justfile
index 04019d3..36a8e8f 100644
--- a/justfile
+++ b/justfile
@@ -1,5 +1,5 @@
-root := justfile_directory()
-build := root / "build"
+# vim: set ft=make :
+root := `pwd`
# Build static website
build:
@@ -23,13 +23,3 @@ deploy: build
preview: build
python3 -m webbrowser -t "file://{{root}}/build/index.html"
-
-JJ_SLIDES_SRC := root / "articles/jujutsu/slides.md"
-JJ_SLIDES_OUT := build / "articles/jujutsu/jujutsu_slides.pdf"
-jj-slides:
- npx @marp-team/marp-cli@latest --allow-local-files \
- --bespoke.progress {{ JJ_SLIDES_SRC }} --pdf \
- --output {{ JJ_SLIDES_OUT }}
-
-jj-slides-watch:
- ls {{ JJ_SLIDES_SRC }} | entr just jj-slides
diff --git a/templates/Tupfile b/templates/Tupfile
new file mode 100644
index 0000000..f179092
--- /dev/null
+++ b/templates/Tupfile
@@ -0,0 +1 @@
+: |> ./generate_footer.sh > %o |> footer.html ./
diff --git a/templates/footer.html b/templates/footer.html
deleted file mode 100755
index d1d3b81..0000000
--- a/templates/footer.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/templates/generate_footer.sh b/templates/generate_footer.sh
new file mode 100755
index 0000000..54df8f5
--- /dev/null
+++ b/templates/generate_footer.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+cat << EOF
+
+EOF