Compare commits

..

18 commits
master ... main

Author SHA1 Message Date
Fabien Freling
655db813be add chasseur, cueilleur, parent 2025-05-06 15:45:56 +02:00
Fabien Freling
419390f692 update web stack 2025-02-19 15:41:37 +01:00
Fabien Freling
271083d71f add jujutsu article 2025-02-19 15:39:30 +01:00
Fabien Freling
c47942b451 static footer 2025-01-13 11:26:14 +01:00
Fabien Freling
45ce87e6b1 update article main page generator 2024-11-28 09:47:19 +01:00
Fabien Freling
70005c9228 update mastodon link 2024-11-28 09:46:59 +01:00
Fabien Freling
5066f456f1 add nushell 2024-11-27 15:24:32 +01:00
Fabien Freling
ca36f290b4 fix variant path for footer generated file 2024-11-27 10:09:08 +01:00
Fabien Freling
8a84b11503 remove ubuntu setup 2024-11-19 17:44:01 +01:00
Fabien Freling
f0af5efd81 add jujutsu 2024-11-19 17:42:21 +01:00
Fabien Freling
6a3440dd1a switch to flake 2024-11-19 15:13:02 +01:00
Fabien Freling
c28b99933e update "about" page 2022-07-10 23:45:04 +02:00
Fabien Freling
be3345736b add AVIF support 2022-01-13 14:41:39 +01:00
Fabien Freling
fa15d60ae1 add nix shell 2022-01-12 16:36:11 +01:00
Fabien Freling
eacb2c685b update deploy location 2021-12-29 17:51:19 +01:00
Fabien Freling
6911b53616 add git large files article 2021-12-29 16:02:26 +01:00
Fabien Freling
b73a81a129 add horizontal rule 2021-08-31 13:59:09 +02:00
Fabien Freling
c6543c3669 update build scripts 2021-08-31 13:58:44 +02:00
20 changed files with 738 additions and 40 deletions

View file

@ -1,6 +1,5 @@
&root = . &root = .
&tmpl_dir = ./templates &tmpl_dir = ./templates
&gen_tmpl_dir = ./build/templates
HTML_TEMPLATE = main.html HTML_TEMPLATE = main.html
@ -10,8 +9,8 @@ HTML_TEMPLATE = main.html
--template=&(tmpl_dir)/$(HTML_TEMPLATE) \ --template=&(tmpl_dir)/$(HTML_TEMPLATE) \
--include-in-header=&(tmpl_dir)/header.html \ --include-in-header=&(tmpl_dir)/header.html \
--include-before-body=&(tmpl_dir)/nav.html \ --include-before-body=&(tmpl_dir)/nav.html \
--include-after-body=&(tmpl_dir)/footer.html \
--css &(root)/css/style.css \ --css &(root)/css/style.css \
--include-after-body=&(gen_tmpl_dir)/footer.html \
%f | sed 's|%%webRoot%%|&(root)|g' > %o \ %f | sed 's|%%webRoot%%|&(root)|g' > %o \
|> %B.html |> %B.html
@ -20,7 +19,17 @@ HTML_TEMPLATE = main.html
!compress_png = |> zopflipng %f %o |> !compress_png = |> zopflipng %f %o |>
!compress_jpg = |> cjpeg -quality 80 -progressive -outfile %o %f |> !compress_jpg = |> cjpeg -quality 80 -progressive -outfile %o %f |>
!compress_pdf = |> ps2pdf %f %o |> !compress_pdf = |> ps2pdf %f %o |>
!avif = |> avifenc %f %o |> %B.avif
!jxl = |> cjxl %f %o |> %B.jxl
JPG_OPT = -quality 80 -strip -interlace Plane JPG_OPT = -quality 80 -strip -interlace Plane
!blur_mini = |> ^ %f -> blur mini^ convert %f -resize 400x400 -blur 0x8 $(JPG_OPT) %o |> blur_mini.jpg !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 |> !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

View file

@ -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. am thrilled to work on computer vision again.
<div style="text-align:center; padding-top:2em;"> <div style="text-align:center; padding-top:2em;">
<a href="https://octodon.social/@ffreling"> <a href="https://mas.to/@ffreling">
<img src="images/mastodon.svg" alt="Mastodon" style="height:40px; padding-inline:5px"> <img src="images/mastodon.svg" alt="Mastodon" style="height:40px; padding-inline:5px">
</a> </a>
<a href="http://code.ffreling.com"> <a href="http://code.ffreling.com">

View file

@ -1,5 +1,5 @@
include_rules include_rules
HTML_TEMPLATE = article.html HTML_TEMPLATE = article.html
: *.md |> ./generate_listing.sh > %o |> index.md : *.md |> ./generate_listing.nu > %o |> index.md
: foreach *.md |> !html |> : foreach *.md |> !html |>

View file

@ -0,0 +1,378 @@
---
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 dingérence
## Comment élever des enfants serviables ?
- Les enfants ont le désir inné daider leurs parents. Il peut donc sembler
inapte ou empoté. Cest à ses parents de le former.
- Ne découragez jamais un enfant daider. Si une tâche est trop difficile ou
trop dangereuse, dites-lui dobserver. 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 darrosage
- 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 lheure de préparer le dîner"
## Comment élever des enfants coopérants
- Les enfants sont animés dune 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.
- À linverse, en incluant les enfants dans les activités dadulte, on accroît
leur motivation à coopérer et à faire comme les autres membres de la famille.
- Les enfants ont tendance à mal se comporter lorsquils 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 nont pas besoin quon les stimule ou quon 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 quil soit dans les
parages lorsque vous vous adonnez à des tâches domestiques ou à dautres
activités dadulte.
- Réduisez les distractions telles que les écrans et les jouets. Moins lenfant
disposera dobjets 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 naviez pas denfant.
### Actions pour les enfants à partir de 7 ans
- Laissez-le prévoir et organiser ses activités (les cours de sport, de musique,
darts plastiques, toute autre activité extrascolaire, les goûters avec
les copains...).
- Augmentez progressivement les responsabilités de lenfant dans la maison, y
compris le fait de soccuper 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. Sil se
conduit mal, expliquez-lui comment il doit se comporter dans le monde des
adultes.
- Si lenfant 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 lamadouer, il doit avoir
limpression :
- Dêtre relié à vous ou à une autre personne proche.
- De choisir daccomplir la tâche sans que personne ly 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 lautre. Lorsquon
accorde de lattention aux idées et aux points de vue dun enfant, on en tire
souvent des informations précieuses et utiles.
- Accepter les connaissances, les idées et les contributions dun enfant est un
excellent moyen de le motiver.
- Résistez à lenvie de corriger un enfant, surtout quand il est en train de
mettre la main à la pâte ou daider la famille.
- Si un enfant refuse dobéir à une demande (par exemple aider à débarrasser),
vous êtes probablement trop insistant. Lenfant sait ce que vous voulez. Arrêtez
de le demander. Attendez et laissez lenfant prendre les rênes.
- Soyez très attentif à la participation de lenfant, 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 quen
lui faisant un cours complet sur la manière de laccomplir. Proposez de simples
ajustements, avec parcimonie, pendant que lenfant est à lœuvre.
- Acceptez la contribution de lenfant, même si elle ne répond pas à vos
attentes ou à vos désirs.
- Usez des compliments avec modération. Associez vos félicitations à
lapprentissage dune 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 quon crie après un enfant,
on lui apprend à hurler et à se mettre en colère au moindre problème ou à la
moindre contrariété. Lenfant pratique la colère et les cris.
- Vous pouvez interrompre ce cycle en répondant à lenfant avec calme et
gentillesse.
- On surestime souvent lintelligence é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 quon 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 dun enfant, restez silencieux
et attendez que la colère passe. Si vous parlez, lenfant 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 lenfant. 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 à lenfant de sentraî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 limposer.
## 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 lenfant 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 lenfant à réfléchir plutôt que de lui dire ce quil
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 lenfant, en silence, et montrez-lui que vous êtes là pour lui et que
vous le soutenez.
- **Le contact physique.** Touchez doucement lépaule de lenfant ou tendez-lui
la main.
- **Lémerveillement.** Aidez lenfant à remplacer la colère par cette émotion
quest lémerveillement.
- **Lextérieur.** Si lenfant ne se calme toujours pas, sortez-le prendre
lair. Conduisez-le dehors en douceur ou emmenez-le dans vos bras.
- **Changer de comportement et transmettre des valeurs.** Au lieu dordonner à
lenfant 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
à lenfant.
- **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 à lenfant (par exemple: «Qui est méchant avec Freddy?» quand il est
en train de taper son frère, ou «Qui est irrespectueuse?» quand lenfant 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 maider
à 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. Lenfant 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 dapprendre.
- 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 quil existe une tension sur cette question
entre lenfant et le parent. Une fois cette tension dissipée grâce au jeu
théâtral ou à une histoire, lenfant 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, dexpériences et dobjets de leur propre vie.
Ils ont une tendance naturelle à apprendre de cette manière. Ils adorent par
exemple:
Quon leur parle de leur histoire familiale et de lenfance de leurs parents.
Imaginer des objets prendre vie et faire des erreurs.
Simaginer vivre entourés de fantômes, de monstres, de fées et dautres
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 sentraî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 dun enfant ou lui inculquer
une valeur, attendez un moment de calme et de détente et essayez lun 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
lenfant et lui montrer comment vous aimeriez quil se conduise. Demandez-lui de
jouer lun des personnages.
- **Déplacez le problème sur le terrain du jeu.** Dites à lenfant: «Jai remarqué
quon 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. Nayez pas peur
de partir dans le délire et lexagération. Lobjectif, cest den rire et de
relâcher la tension qui sest créée autour de cette question.
- **Ayez recours à un monstre.** Créez un monstre tapi près de la maison. Dites
à lenfant quun monstre le regarde et que, sil se conduit mal, le monstre
viendra lenlever (seulement pour quelques jours).
- **Donnez vie à un objet inanimé.** Utilisez une peluche, un vêtement ou tout
autre objet inanimé pour amadouer lenfant et le persuader daccomplir une
tâche. Faites faire cette tâche à lobjet en question (brosser les dents
dune peluche) ou faites parler lobjet (cest la brosse à dents qui demande à
lenfant de se brosser les dents, par exemple).
## Comment élever un enfant sûr de lui
- Tout comme les adultes, les enfants, petits et grands, naiment pas quon
les commande. Ils ont, quel que soit leur âge, un penchant naturel pour
lapprentissage de lautonomie sans quon sen mêle.
- Quand on mène un enfant à la baguette, on sape sa confiance en lui et son
autonomie.
- Quand on respecte lautonomie de lenfant et quon réduit ses instructions
au minimum, on lui envoie le message quil est autonome et capable de régler
lui-même les problèmes.
- Donner de lautonomie à un enfant est la meilleure façon de le protéger du
stress et de lanxiété.
- Lindépendance et lautonomie sont deux concepts distincts:
- Un enfant indépendant est déconnecté des autres, il nest responsable de
personne dautre 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 quil rende au groupe chaque
fois quil 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). Nayez recours aux
ordres que pour apprendre à lenfant la serviabilité, la générosité et les
responsabilités envers sa famille.
- **Trouvez une zone dautonomie.** 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 dautonomie.** 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 dhonneur à ne plus parler à la
place de votre enfant ou lui dire ce quil doit dire. Laissez-le répondre aux
questions quon lui pose, passer commande au restaurant, décider quand dire
«sil te plaît» et «merci». Faites en sorte quil 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 damour et de soutien aide lenfant à voir le monde comme un lieu
bénéfique et bienveillant, ce qui le protège de la dépression et dautres
troubles de santé mentale.
- Un ou deux alloparents supplémentaires peuvent vraiment faire la différence
dans la vie dun 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 lexercice physique et une alimentation
saine.
- **Tissez un réseau de tantes et doncles.** 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 denfants multiâges).** Encouragez votre enfant à jouer
avec dautres, 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 à
soccuper de leurs petits frères et sœurs. Établissez un lien entre laide
quils apportent et leur maturité croissante («Tu aides ton petit frère parce
que tu es une grande fille maintenant»). Récompensez lenfant en augmentant ses
responsabilités au fil du temps.
- **Appréciez laide 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 lexemple du respect et de
la générosité.

32
articles/generate_listing.nu Executable file
View file

@ -0,0 +1,32 @@
#!/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 ""
}
}

View file

@ -1,23 +0,0 @@
#!/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

9
articles/jujutsu/Tupfile Normal file
View file

@ -0,0 +1,9 @@
include_rules
HTML_TEMPLATE = article.html
: foreach *.png |> !avif |>
: foreach *.png |> !jxl |>
: index.md | ./<deps> |> !html |>
# images embedding not working in marp + tup
# : slides.md |> !marp_pdf |> jujutsu_slides.pdf ./<deps>

154
articles/jujutsu/index.md Normal file
View file

@ -0,0 +1,154 @@
---
title: "Lightning talk: Jujutsu"
date: 2025-02-17
---
_Slides available: [pdf](./jujutsu_slides.pdf)_
<p style="text-align:center;">
<picture>
<source type="image/avif" srcset="jj-logo.avif" />
<source type="image/jxl" srcset="jj-logo.jxl" />
<img src="jj-logo.png" alt="jujutsu logo" width=20% />
</picture>
</p>
## 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. Im 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
articles/jujutsu/jj_02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

131
articles/jujutsu/slides.md Normal file
View file

@ -0,0 +1,131 @@
---
marp: false
theme: gaia
footer: '**Fabien Freling** - 2025-02-17'
paginate: true
---
<style>
section::after {
content: attr(data-marpit-pagination) '/' attr(data-marpit-pagination-total);
}
</style>
<!--
_class: lead
-->
# Jujutsu
![](./jj-logo.png)
---
## 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
![](./jj_02.png)
<revision id> <author> <date> <branch> <commit id>
- @ 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
---
<!--
_class: lead
-->
## 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)

View file

@ -1,6 +1,7 @@
--- ---
title: Web stack title: Web stack
date: 2019-06-26 date: 2019-06-26
update: 2024-11-26
--- ---
Previous stacks Previous stacks
@ -24,5 +25,5 @@ Pandoc + Tup = ❤️
I decided to use [Pandoc](https://pandoc.org/) to convert from Markdown to HTML. 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. It is widely used by other generators and takes care of the file conversion.
For automation, I use a simple top-level Makefile and For automation, I use a simple top-level [Justfile](https://just.systems/) and
[Tup](http://gittup.org/tup/index.html). [Tup](http://gittup.org/tup/index.html).

View file

@ -7,10 +7,14 @@
devShell.x86_64-linux = with pkgs; devShell.x86_64-linux = with pkgs;
mkShell { mkShell {
nativeBuildInputs = [ nativeBuildInputs = [
entr
graphviz-nox
imagemagick imagemagick
just just
libavif libavif
libjxl libjxl
nodejs
nushell
pandoc pandoc
tup tup
]; ];

View file

@ -1,5 +1,5 @@
# vim: set ft=make : root := justfile_directory()
root := `pwd` build := root / "build"
# Build static website # Build static website
build: build:
@ -23,3 +23,13 @@ deploy: build
preview: build preview: build
python3 -m webbrowser -t "file://{{root}}/build/index.html" 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

View file

@ -1 +0,0 @@
: |> ./generate_footer.sh > %o |> footer.html ./<tmpl_group>

3
templates/footer.html Executable file
View file

@ -0,0 +1,3 @@
<div id="footer">
Copyright &copy; Fabien Freling since 2007
</div>

View file

@ -1,9 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
cat << EOF
<div id="footer">
Copyright &copy; Fabien Freling 2007-$(date +%Y)
</div>
EOF