Palaiseau, le dimanche 3 août 2025
Cher Journal,
Faisant suite à ma publication de carnet à la fin du mois de juin, j'ai continué à produire des mises à jour à intervalles réguliers, pour corriger des bogues et rajouter des fonctionnalités qui se sont avérées utiles pour moi. Dans ma précédente entrée de blog, le carnet était mis à disposition en version 1.1.2. Il est désormais disponible en version 1.6.1. Je suis la nomenclature de version sémantique, c'est-à-dire que le numéro majeur n'est changé que quand j'introduis des changements cassants, par exemple je sortirais carnet en version 2 quand j'aurais décidé de changer le format des entrées pour faciliter certaines tâches. Les numéros de version successives suggèrent donc l'introduction de nombreuses nouveautés.
En version 1.2, j'ai introduit une variable d'environnement CARNET_OVERTIME, permettant de configurer un mécanisme d'alerte quand le temps passé à remplir des entrées de carnet devient excessif par rapport à l'heure de la première entrée. C'est utile pour limiter le temps d'écran dans une journée, dans une certaine mesure, mais comme le suggère le nom de la variable, la fonctionnalité est avant tout prévue pour limiter le risque d'entrer dans un régime d'heures supplémentaires. La détection de temps excessif ne tourne pas par défaut. Elle est activée quand CARNET_OVERTIME contient un entier décrivant le temps standard à passer entre la première et la dernière entrée de carnet sur une journée. Quelqu'un travaillant en trois huit peut ainsi avoir un tel export dans ses fichiers de configuration du shell :
CARNET_OVERTIME=8 export CARNET_OVERTIME
Quelqu'un ayant un temps de travail de sept heures trente quotidienne avec une pause déjeuner d'une heure trente pourrait ajuster la variable à :
CARNET_OVERTIME=9 export CARNET_OVERTIME
Les alertes se matérialisent alors dans le champs libre après l'horaire. Voici un exemple tiré de la page d'accueil révisée de carnet :
________________________________________________________________________ Date : Wednesday (2025-07-09) 09:23 : Starting the day, […] 18:42 : warning: overtime for 19m. Ouch, I'm running late, it's time to go.
Pour l'instant, le détecteur d'heures supplémentaires ne prend que les heures entières, mais je serais bien inspiré d'inclure le support des minutes en plus des heures afin de permettre un grain plus fin pour ajuster le temps de travail.
La série 1.3.y de carnet a introduit la notion de feuillets. Chaque entrée saisie dans le carnet est un feuillet, qui peut être référencé par sa date et son heure dans un format rappelant la RFC 3339, à savoir : AAAA-MM-JJThh:mm. Par exemple, j'ai gardé la référence d'un feuillet enregistré le 5 juillet dernier à 23:34 et je souhaite m'y référer :
$ carnet -f 2025-07-05T23:34 /home/emollier/doc/carnet/2025-27.txt:560 23:34 : sur fond de : Oddland - Skylines Je viens d'implémenter le système de navigation dans les feuillets. Le mécanisme se compose de multiples modifications. La plus évidente est l'ajout de l'option --feuillet, que je mentionne déjà dans mon entrée du 2025-07-05T18:23. J'ai quelque craintes que l'option ne soit confuse au premier abord, […]
Le mécano est accompagné d'un subtil ajustement de l'affichage des feuillets, qui met visuellement en valeur les références à d'autre feuillets dans le format spécifié ci-dessus. Cela facilite la navigation d'un feuillet à l'autre, ce qui peut amener à des résultats intéressants dans les carnets densément référencés entre feuillets :
$ carnet -f 2025-07-05T18:23 /home/emollier/doc/carnet/2025-27.txt:499 18:23 : J'ai passé un petit coup de balai. Pour l'idée de faire un Zettelkasten en utilisant le carnet (Cf: 2025-07-05T11:25), il me faut deux choses : * construire facilement un marqueur pour référencer un ticket par sa date et son heure, ce que je peux faire très simplement en ajustant le format de sortie de la fonction de recherche ; manifestement je pars sur un format YYYY-MM-DDThh:mm, parce que c'est ce qui me semble le plus évident ; * ajouter une option pour référencer une entrée par son marqueur ; j'hésite sur le nom de l'option, peut-être quelque chose comme --feuillet ?
On voit ainsi un début de navigation de référence en référence dans une base de connaissances. Le mécanisme vient en complément du moteur de recherche, qui est ajusté pour l'occasion pour indiquer les références des feuillets ressortis lors de la recherche :
$ carnet --search sauvegarde | head -n5 2024-42.txt : vendredi (2024-10-18T18:33) : Le mécano de surveillance de mes sauvegardes manuelles sur mes disques externes me signale que je n'ai pas lancé de `backup` depuis plus de vingt-quatre heures. Je viens de corriger ça, la sauvegarde devrait être terminée dans quelque minutes. $ carnet -f 2024-10-18T18:33 /home/emollier/doc/carnet/2024-42.txt:357 18:33 : Le mécano de surveillance de mes sauvegardes manuelles sur mes disques externes me signale que je n'ai pas lancé de `backup` depuis plus de vingt-quatre heures. Je viens de corriger ça, la sauvegarde devrait être terminée dans quelque minutes.
J'ai accompagné cette fonctionnalité d'un fichier de registre nommé register.txt, à placer dans le répertoire contenant le carnet (par défaut ~/Documents/carnet). Il s'agit d'un texte de forme libre, mais dans lequel il est encouragé de noter des références vers des feuillets d'intérêt, qui sont par exemple fortement connectées à des sujets d'intérêt stockés dans le carnet. Le fichier peut être récupéré automatiquement si l'on passe l'option --feuillet sans préciser de référence Mon fichier de registre correspond à peu près à ceci, quoique pour la brièveté les références et les mots clés sont limités à un exemple, et enregistre d'une part des références et d'autre part des mots clés pour le moteur de recherche :
$ carnet --feuillet Registre des entrées d'intérêt ============================== Notice ------ $ carnet -f YYYY-MM-DDThh:mm # références $ carnet -s YYYY-MM-DDThh:mm # références inverses $ carnet -s '\<motif\>' # mots clés Références ---------- 2025-07-27T17:02 : jalons pour carnet version 2. Mots clés --------- \<debian\> Le système d'exploitation, contient les références à mon activité au sein du projet Debian.
Comme toujours, les références seront en surbrillance pour faciliter le copiage et le collage, facilitant du même coup la navigation entre les entrées.
J'ai essayé tant bien que mal d'examiner un certain nombre d'outils de gestion de tâche pendant un certain nombre d'années. Fort de l'expérience des systèmes de suivi de ticket professionnel, j'ai cherché pendant longtemps quelque chose d'assez léger pour être utilisable machinalement, mais en même temps suffisamment tolérant pour qu'une simple tâche en apparence puisse se transformer en véritable projet. À ce titre, j'ai essayé cil pendant plusieurs années, alors même que le projet est archivé par son auteur en amont, depuis 2018. Bien que l'outil ait été presque approprié à mon cahier des charges, il y a quelque chose qui n'est jamais passé, quelque chose que je n'ai toujours pas réussi à déterminer, mais qui a à voir avec la fluidité d'utilisation de l'outil. J'ai fini par remarquer que j'avais tendance à laisser des notes dans mes cahiers, sous forme de choses à faire marquées par un TODO en début de ligne ou par un carré blanc, à remplir pour matérialiser une tâche résolue. J'ai pu éventuellement retrouver ce genre de marques dans mon carnet dans des feuillets datant de 2024. J'ai donc fini par implémenter un raccourci pour retrouver les tickets associés à des tâches en cours, via l'option de carnet --todo, dont voici un exemple de sortie avec une tâche que j'ai noté à faire pendant la rédaction de la présente entrée de journal :
$ carnet --todo | tail -n8 2025-31.txt : dimanche (2025-08-03T18:21) : on air: Thought Chamber - Kerakryps [ ] Il faudrait que CARNET_OVERTIME supporte les heures partielles, c'est-à-dire que je permette de passer une heure au format « hh:mm », au lieu d'un entier décrivant une simple heure « h ». ________________________________________________________________________ 34 feuillets found.
Avec l'option de recherche --search, je peux retrouver les références inverses à un feuillet, ce qui fait un suivi de ticket à peu de frais :
$ carnet --search 2025-08-03T18:21 2025-31.txt : dimanche (2025-08-03T18:56) : on air: Jon Anderson and The Band Geeks - Still A Friend Je réfléchis à 2025-08-03T18:21 pour rajouter le support des minutes. À vue de nez, mon code raisonne déjà en minutes, donc il me suffirait d'isoler les minutes si un caractère deux-points ':' est présent et de les rajouter au total. ________________________________________________________________________ 1 feuillet found.
Quand j'aurais fini avec la tâche enregistrée dans le feuillet 2025-08-03T18:21, je rajouterais une astérisque entre les crochets pour marquer la tâche comme résolue. L'option --todo admet un argument pour spécifier les tâches qui ne sont ni vierges ni résolues, par exemple je peux avoir des tâches dans un état pending, pour indiquer qu'elles sont en attente d'un évènement, par exemple d'une date ou de la résolution d'une autre tâche.
$ carnet --todo pending | head -n5 2025-28.txt : samedi (2025-07-12T22:46) : [pending] Je suis en train de travailler sur l'implémentation de la gestion de tâches du carnet, et cette entrée représente un exemple de tâche en pause.
Comme il est pénible de taper l'expression rationnelle complète permettant de trouver les tâches résolues, notamment par mon usage de l'astérisque pour les marquer comme telles, il y a également une option --done qui sert de raccourci pour ressortir les tâches dans un état résolu :
$ carnet --done […] ________________________________________________________________________ 2025-28.txt : samedi (2025-07-12T22:49) : [*] Ce marqueur représente une tâche terminée. […]
Sur un grand nombre de feuillets et de semaines, j'ai commencé à avoir des difficultés à aller éditer les tâches ouvertes depuis pas mal de temps pour aller les résoudre. J'ai donc introduit l'option -ef, ou --edit-feuillet, pour immédiatement démarrer l'éditeur de texte à l'emplacement du feuillet sélectionné. Par exemple, une fois que j'aurais résolu le problème de gestion des minutes dans la fonctionnalité de gestion du temps, je lancerais directement l'éditeur au bon endroit à partir de la référence du feuillet avec :
$ carnet -ef 2025-08-03T18:21
Ce complément est essentiel pour la gestion de tâches, afin de les changer d'état, mais également pour la création de connexions entre feuillets. Les feuillets passés ne sont pas statiques, il peuvent être édités dans le futur s'il semble intéressant de les relier à de nouvelles entrées. Par exemple ce feuillet de 2024 fait référence à des entrées de 2025 :
$ carnet -f 2024-10-27T10:24 /home/emollier/doc/carnet/2024-43.txt:418 10:24 : J'ai un problème de longue date avec Apache httpd […] J'ai tenté de renforcer les dépendances au 2025-04-10T20:02, mais sans succès au 2025-04-11T19:54.
J'ai commencé à parler de mon script de gestion de carnet, ou de journal de bord, ou peu importe, à mes collègues au bureau, et il y a eu comme un semblant d'intérêt pour l'outil. Ce qu'il se passe est que je suis pris de cours avec les cas d'usage qu'on a pu me présenter. Du coup, pour compenser, j'ai implémenté un petit mécanisme d'exécution de module personnalisé à stocker dans le répertoire du carnet, et à exécuter avec l'option -m, ou --module. J'ai un petit module de type hello world dans mon carnet, à fins de démonstration :
$ carnet -m hello world hello, world! arguments passed were: - world my carnet environment is: CARNET_EDITOR=vi CARNET_DIR=/home/emollier/doc/carnet CARNET_LANG=fr_FR.UTF-8 $ cat doc/carnet/hello #! /bin/sh set -e printf -- 'hello, world!\n' test -z "$*" || printf -- 'arguments passed were:\n' for arg in "$@" do printf -- ' - %s\n' "$arg" done printf -- 'my carnet environment is:\n' env | grep ^CARNET_
Des collègues ont pu ainsi implémenter un système de recherche personnalisé basé sur autre chose que des expressions rationnelles. Me concernant, je compte également me servir de ce système pour évaluer la faisabilité de futures fonctionnalités ou d'efforts de portage.
Ça fait beaucoup d'un coup, je ne sais pas trop s'il vaut mieux que je fasse des mises à jour fréquentes sur le sujet. Je ne vois pour l'instant pas de fonctionnalités supplémentaires à rajouter. Ce qu'il me manque, c'est une référence de feuillet à facilement copier et coller depuis un fichier ouvert avec un éditeur de texte. Un tel changement nécessiterait de modifier le format du fichier d'entrées pour exposer directement la date au format AAAA-MM-DDThh:mm. Une fois que je serais confiant que c'est la bonne approche et que j'aurais mis en place l'outillage pour manipuler le nouveau format de fichier, alors il sera temps de basculer carnet en version 2.
L'autre détail qui me chiffonne avec carnet est qu'il s'agit d'un script shell de plus de huit cent lignes :
$ wc -l carnet 832 carnet
C'est excessif de près d'un ordre de grandeur pour un script Shell. J'ai rationalisé tant bien que mal un découpage des éléments compliqués en fonctions, en gardant à l'esprit de m'assurer que chaque fonction soit autant que possible constituées de primitives indépendantes, gardant en tête l'Art of Unix Programming, où il est question de préserver la finesse de la couche de glu, à la conjonction entre les fonctions de bas niveau et les fonctions de haut niveau ; je présume que ça contribue à préserver la complexité du code source sous contrôle. Et encore, une grosse portion du code, celle qui couvrait l'affichage des statistiques, a été isolée dans son script en Perl :
$ wc -l carnet_activity.pl 435 carnet_activity.pl
Je ne sais pas trop comment consolider le tout. Chaque fonctionnalité dépend d'outils très précis et un certain nombre de choses se passe moyennement bien quand il y a de légères différences d'implémentation, ce qui suggère que le portage de carnet vers d'autres distributions que Debian pourrait être un problème. J'ai tenté de limiter la casse en faisant en sorte que carnet fonctionne correctement sur NetBSD 10 ; carnet 1.6.1 n'y montre pas de problèmes évidents, exception faite des difficultés à digérer les espaces insécables dans son terminal système wsvt25.
![]() | Name | Last modified | Size |
---|---|---|---|
![]() | Parent Directory | - |