<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/log/atom.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom">
<id>https://si3t.ch/log/</id>
<title>journal de prx</title>
<link rel="self" type="application/atom+xml" href="https://si3t.ch/log/atom.xml" />
<author>
<name>prx</name>
<email>[email protected]</email>
</author>
<updated>2024-05-21T09:58:28Z</updated>
<entry>
<title type="text">Vagues de notes - 3</title>
<id>https://si3t.ch/log/2024-05-16-vagues-3.txt</id>
<updated>2024-05-16T12:01:00Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-05-16-vagues-3.txt" />
<content type="text"><![CDATA[
Et c'est reparti pour un tour!

## Pas de solarpunk sans lowtech :)

Je me suis abonné au lowtech journal sur les conseils d'un ami. Il y aun peu de philo, de l'économie, mais aussi des descriptions de bricolages et montages. On sent que c'est fait par passion mais avec des petits moyens (quelques coquilles). En tout cas, je me régale et l'attend avec impatience. J'y ai même trouvé quelques montages et articles pour agrémenter mes cours. Ce qui est sûr, c'est que je laisserai quelques numéros en fond de classe.

=> https://www.lowtechjournal.fr/

Dans le numéro précédent, ils étudiaient simplement divers paramètres pour améliorer un four solaire. Je compte m'atteler à la construction du modèle suivant maintenant que j'ai ENFIN trouvé une vitre (ça aura été le + difficile :))

=> https://web.archive.org/web/20220629185951/http://four-solaire.iguane.org/

En parlant de bricolages, j'ai presque terminé ma pompe manuelle. J'ai perdu le bouchon, il faut vraiment que je fasse du tri...

=> https://wiki.lowtechlab.org/wiki/Pompe_manuelle_(verticale)

## Potager

Il a enfin cessé de pleuvoir quelques jours.
Ça fait du bien de remettre les mains dans la terre.
Mon potager est prêt. Moins ambitieux que les années précédentes, je n'arrive pas à trouver suffisamment de temps. Et j'étais en retard sur les semis. Il faut que je sois + vigilant cette année sur l'aération du sol et essaie de mettre plusieurs cultures à se suivre.

Dans le lowtech magazine, ils évoquaient le Plectranthus Barbatus. J'en ai trouvé un plan, il pousse bien. Je ne suis pas sûr de remplacer réellement le papier toilette avec, mais en attendant, c'est une plante toute douce qui vient agrémenter ma haie coupe-vent pour le potager.

En parlant de haie, j'avais mis de la menthe devant le muret, le long de la rue. Elle s'est bien développée. Très bien même. C'est plus joli que les mauvaises herbes, et ça sent bon quand on marche dessus.
En parlant de mauvaises herbes, mon voisin laisse tout en friche à tel point que ça déborde chez moi. J'aime bien la nature, mais les ronces, c'est pas trop mon truc. Du coup, après avoir bien taillé le long de ma cloture, j'ai repiqué quelques pieds de menthe qui, peut-être (je l'espère), vont se propager de son côté et ralentir les ronces petit à petit.

## Réflexions...

Quand c'est hors-ligne, c'est mieux.

Les livres pour enfant montrent toujours l'hiver avec de la neige. Les livres pour enfants ne sont pas à jour : la neige appartient au passé. Dans 50 ans, il y aura peut-être des légendes qui naîtront sur cette substance étrange, froide et blanche.

## Informatique

Je redécouvre la palette de couleurs de June:
=> https://causal.agency/scheme.png

J'aime beaucoup, elle est très reposante pour les yeux. Je vois une vraie différence, c'est moins éblouissant, comme si j'étais devant les pages d'un livre. En plus, c'est chaleureux. Ça ressemble un peu à gruvbox, mais en plus foncé.

Voici les couleurs utilisées (pour xterm):

```
*background:    #14130e
*foreground:    #b7a980
*color0:        #161510
*color1:        #a32810
*color2:        #727a18
*color3:        #a37720
*color4:        #3d6266
*color5:        #7a4955
*color6:        #557a55
*color7:        #998d6b
*color8:        #4c4635
*color9:        #cc3214
*color10:       #8e991e
*color11:       #cc9528
*color12:       #4c7b7f
*color13:       #995b6b
*color14:       #6b996b
*color15:       #ccbc8e
```

## Vu sur le web

Pourquoi écrire un blog?
Je traduis tès librement et sans détails, l'article d'origine est bien mieux:

=> https://chavanniclass.wordpress.com/2024/05/16/why-blog/

* Pour se faire une réputation d'auteur (ça peut en intéresser certains...)
* Pour laisser un héritage, en particulier pour ceux qu'on aime
* Pour parler des choses qu'on aime
* Pour y voir plus clair, organiser ses idées
* Pour parler de sujets tabous et participer à leur déstigmatisation
* Pour échanger et profiter de la compagnie de personnes autour du monde. "Se faire des relations". Une forme de société numérique choisie.
* Pour entretenir sa créativité
* Pour se sentir apprécié (ou pas?)
* Pour avoir un impact.

Ce dernier point est plus vrai qu'on ne l'imagine. Il m'est arrivé de lire par hasard des billets ui m'ont fait un bien fou. Je pense notamment à June ou encore à f6k.

=> https://causal.agency/
=> http://huld.re/
^^ (cherchez bien :))

J'y ajouterai : Pour faire comme on a envie. :)

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes) :
=> mailto:[email protected]?subject=vagues-3

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">fossil is great to self-host</title>
<id>https://si3t.ch/log/2024-05-13-fossil-great-self-host.txt</id>
<updated>2024-05-13T12:51:38Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-05-13-fossil-great-self-host.txt" />
<content type="text"><![CDATA[
Today, I'd like to talk about fossil:
=> https://fossil-scm.org/

It is solene, you probably already know her, who proposed to use it to host a forum for a french community about OpenBSD.
=> https://dataswamp.org/~solene/
=> https://fr.forum.puffy.cafe/wiki?name=Index

Indeed, fossil is well known as an alternative to git or hg. And a good one if you ever tried.
You can host your projects and publish source code quite easily.
But it's more than that.
It offers:

* a forum engine
* a wiki engine, and btw a sort-of website content manager
* a real-time chat

All this while staying very light and thus, self-hosting friendly. It even serve gzipped content by default!
Backups are easy, just lcone the repository or copy/rsync/scp/whatever the ".fossil" file.
Upgrades are painless, just upgrade the binary.

There are already good instructions to set it up:
=> https://fossil-scm.org/home/doc/trunk/www/server/openbsd/fastcgi.md

As you could read, fossil is very selfhosting friendly.
I found quite clever the use of a template to fill the mfs.

One may add a new "/etc/newsyslog.conf" entry to avoid evergrowing error log file.

```
/var/www/logs/fossil.log                644  5     300  *     Z
```

I wonder if it is worth adding a part about fossil on https://si3t.ch/ah/en/09-services/ ?

What do you think about fossil?

---
This was written for the mailing-list about self-hosting with OpenBSD.
=> mailto:[email protected]

If you want to subscribe, write to [email protected]
]]>
</content>
</entry>
<entry>
<title type="text">Host with OpenBSD: mailing-list</title>
<id>https://si3t.ch/log/2024-05-10-ah-mailing-list.txt</id>
<updated>2024-05-10T14:10:37Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-05-10-ah-mailing-list.txt" />
<content type="text"><![CDATA[
I just created a mailing list to discuss (self-) hosting experiences or questions with OpenBSD.
If you're interested, subscribe at:

[email protected]

As Usual, mlmmj is great for mailing lists.
Maybe I should setup a browsable archive one day.

Anyway, welcome if you want :)
]]>
</content>
</entry>
<entry>
<title type="text">Garder les modules prosody à jour</title>
<id>https://si3t.ch/log/2024-05-07-xmpp-prosody-up-to-date-modules.txt</id>
<updated>2024-05-07T09:07:56Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-05-07-xmpp-prosody-up-to-date-modules.txt" />
<content type="text"><![CDATA[
Après avoir mis à jour votre serveur prosody, peut-être avez-vous oublié de vérifier que les modules étaient eux-aussi bien à jour.
C'est mon cas.
De toute façon, les modules devraient être mis à jour dès que possible, ne serait-ce que pour corriger de potentielles failles de sécurité.

Voici comment j'ai résolu ce souci avec OpenBSD.

Tout d'abord, dans /etc/prosody/prosody.cfg.lua, on va préciser l'URL du dépôt des modules:

```
plugin_server = "https://modules.prosody.im/rocks/"
```

Ensuite, dans /etc/daily.local, on ajoute une commande qui va vérifier et alerter si de nouvelles versions sont disponibles en allant regarder l'URL ci-dessus.

```
next_part "Prosody modules"
/usr/local/sbin/prosodyctl list --outdated
```

Cela retourne pour moi :

Pour mettre à jour un module, il suffit de l'installer:

```
prosodyctl install conversejs
```

Documentation officielle:
=> https://prosody.im/doc/installing_modules


---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes) :
=> mailto:[email protected]?subject=xmpp-prosody-up-to-date-modules

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Vagues de notes - 2</title>
<id>https://si3t.ch/log/2024-05-06-vagues-2.txt</id>
<updated>2024-05-06T10:45:27Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-05-06-vagues-2.txt" />
<content type="text"><![CDATA[
## Edito (lol)

Je n'ai pas eu très envie d'écrire dernièrement. Besoin de rester silencieux? Consommateur plutôt que producteur? Sans doute aussi un peu de paresse.

Toutefois, je continue d'ouvrir un fichier contenant des notes en début de session. Il s'agit d'un script "notd" comme "notes of the day" ouvert dans tmux :

```
tmux new-window -d -n "notd" notd
```

Le script en question ajoute la date à la fin si elle n'est pas déjà présente, puis ouvre vi à la fin. Ça ressemble désormais à ça :

```
#!/bin/sh
# notd : notes of the day.
# open a new YYYY-MM-dd.txt in $NOTESDIR with $EDITOR
# Author: prx <[email protected]>

NOTESDIR=~/work/notes
dotd="$(date +%Y-%m-%d)"
f="${NOTESDIR}/notd.txt"

test -d ${NOTESDIR} || mkdir -p ${NOTESDIR}
#test -f "${f}" || printf "# %s - Notes du jour\n\n" "${dotd}" > "${f}"
if [ -z "$(grep $dotd $f)" ]; then
       printf "\n\n# %s \n\n" "${dotd}" >> "${f}"
fi
${EDITOR} + "${f}"
```

Bref, je vais publier aujourd'hui une partie de ces notes, il est temps ^^.
C'est donc un billet en vrac, que je vais appeler "vagues de notes".


## Pop culture geek

Mon fils de 5 ans n'échappe pas aux influences publicitaires des t-shirts de ses camarades, des effets de modes en tout genre.
Après "Pat patrouille", il parle de plus en plus de Sonic, de Mario, Pokemon...  Il me fait rire à vouloir en savoir plus sur ces personnages, comme s'il s'agissait d'une histoire à raconter.
Ceci dit, ça me donne trop envie de lui montrer les jeux et faire du retrogaming avec lui. C'est encore un peu tôt, mais j'ai hâte! Ma retrostation est prête!

## Retrogaming

J'ai eu le malheur de tomber sur un article qui parle de romhack.

=> https://www.romhacking.net/

Le site ci-dessus est une source inestimable de trésors.

Il s'agit de modifications apportées à des roms de jeux déjà existants. Parfois des traductions, des modifications du gameplay voire des ajouts ou encore de tous nouveaux jeux!

Je suis donc en ce moment en train de jouer à Ash Gray
=> https://visualboyadvance.org/gba-roms/pokemon-ash-gray/
=> https://www.emulatorhacks.com/2021/05/Pokemon-AshGray-Walkthrough.html?m=1

Cela me donne encore plus envie de montrer les épisodes télé à mon fils (patience...)

## Informatique

Une liste de blogs à découvrir, il y en a pour la vie!
=> https://indieblog.page/all


## Livres

Des élèves m'ont offert pour mon anniversaire la belle version de Dune (les fous). Je vais pouvoir laisser mes anciens de poches en libre accès au fond de ma salle de cours, et me racher les autres tomes en version collector (pas le choix hein :) )

J'ai lu Les Culottés de Pénélope Bagieux, et acheté les Strates. À faire lire aux jeunes filles, et pas que. Non seulement elle est géniale dans La Bonne Auberge, mais elle trouve le ton juste pour parler de sujets profonds en finesse et avec humour.


## Citations

=> Ce sont toujours les gentils qui sont malheureux.

=> https://www.michalzelazny.com/thoughts-9/
> Life is the art of choice. We make choices every day, every moment. We choose what we eat for breakfast, how we spend our time, whom we give our energy to. Well, it’s easy to make the wrong choices and I make a lot of them.

> Allez prendre vos leçons dans la nature, c'est là qu'est notre futur. Leonard de Vinci

> Nous avons trop souvent tendance à confondre l'aube avec le crépuscule. Ploum

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes) :
=> mailto:[email protected]?subject=vagues-2

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Quoi de neuf ? 1</title>
<id>https://si3t.ch/log/2024-04-06-koidneuf-1.txt</id>
<updated>2024-04-06T14:47:21Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-04-06-koidneuf-1.txt" />
<content type="text"><![CDATA[
Que s'est-il passé depuis le 3 avril? (un peu avant en vrai, je ne sais plus trop)

## code

On commence avec un bout de code pour obtenir un nombre aléatoire entre 0 et 60 avec awk, parce que j'aime bien awk:

```
awk 'BEGIN { printf("%d\n",rand()*60)  }' < /dev/null
```

Mais il y a mieux, la commande jot qui peut donner un nombre aléatoire entre "start" et "end":

```
jot -r 1 start end
```

Je crois que j'ai eu besoin de chercher ça pour écrire un script qui patientait un nombre aléatoire de secondes.

Sinon, j'ai ajouté des liens vers la racine de mon site en bas de chaque page, pour les versions http/gemini et gopher. Merci le Makefile.
=> https://git.sr.ht/~prx/si3t.ch/tree/master/item/Makefile

Je me suis aperçu que le liens derrière le logo en haut de page n'était pas assez pratique en pestant lorsque certains blogs n'en proposaient pas lorsque je fouillais sur blogroll.org:
=> https://blogroll.org/

## solarpunk

Ce mouvement, décidément, me fait du bien.
C'est ma chérie qui m'en a fait la remarque : "dis donc, t'es à fond là-dedans dernièrement". Et pour cause, je couve ce qu'on appelle une "éco anxiété" sur laquelle je ne m'étenderai pas ici, ce n'est pas tellement mon style. Au contraire, je préfère garder tout ça bien enfoui car lorsque j'y réfléchis un peu j'en suffoquerai.
(oui, je sais, il faudrait probablement que je consulte un psy, et pas que pour ça d'ailleurs).
Forcément, le solarpunk ne peut que m'apaiser.

Comme Péhä, j'ai recopié le manifeste au format txt pour la postérité:

=> https://fuchu-shuku.pages.casa/misc/un_manifeste_pour_le_solarpunk.txt
=> /misc/notes/solarpunk/

En fouillant aléatoirement sur l'Internet sur le sujet, je suis tombé sur des plans de géonefs:

=> https://earthship.com/
=> https://fr.wikipedia.org/wiki/G%C3%A9onef

Ça donne tellement envie. J'imagine déjà une sorte de maison de hobbit dans le jardin.
J'aurais bien fait ma maison ainsi, malheureusement ça ne doit pas être accepté quand on dépose permis de construire...

J'ai fait imprimer ce logo derrière une veste, j'attends de voir si des gens vont le remarquer et venir discuter:

=> https://si3t.ch/misc/notes/solarpunk/solarpunk-logo.png

## auto-hébergement

Je suis passé de rspamd à spamassassin avec opensmtpd-filter-spamassassin.
Pour la signature dkim, j'utilise alors opensmtpd-filter-dkimsign.
Ça me plaît davantage. UNIX style, un outil par tâche.
Je n'ai plus envie de redis non plus, retour aux vieux trucs lents mais qui marchent.
Et ça fait du bien de remettre les mains dans le cambouis, pour se rafraîchir la mémoire et mettre à jour le tuto auto-hébergement.

Et puis, on ne sait jamais:
=> https://www.lemagit.fr/actualites/366575532/SGBD-Redis-seloigne-lui-aussi-de-lopen-source

J'ai droit à un 10/10 sur mail-tester (#jmelapète)
=> https://www.mail-tester.com/test-2uyw49gu5

Sinon, OpenBSD a publié sa version 7.5.

La mise à jour s'est faîte sans soucis.

```
sysupgrade
pkg_add -u
sysclean # + verification des fichiers et
sysclean |xargs rm
```

J'adore la nouvelle apparence de l'auto index d'httpd. C'est en voulant proposer un patche pour un affichage plus pratique que j'ai découvert que c'était prévu pour la 7.5. Par contre, ce n'est toujours pas très pratique sur petit écran comme celui d'un smartphone. Il faudrait que je tente des modifications pour améliorer ça.

## Boulot

J'ai fait ma demande de mutation.
Après les multiples plantages du serveur et des barèmes franchement pas clairs et des onglets à fouiller pour pouvoir valider.
Clairement, tout est fait pour que ça soit difficile.
J'ai peu d'espoir vu le nombre de postes fermés à nouveau à la rentrée prochaine.
Mais je suis tellement fatigué de devoir me taper 1h de route aller, 1h de route retour, soit 2h sup' dans ma journée.

## Ça fait du bien

J'ai entendu une phrase du style:
> À partir du moment où t'as des enfants, tu t'en fous.

C'était à propos d'une mauvaise journée, ou des merdes de la vie quotidienne : quand t'as des enfants, y a finalement plus important et mieux qui t'attend à la maison avec eux.

C'est vrai.

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes):
=> mailto:[email protected]?subject=koidneuf-1

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Mon fils m'a envoyé un courrier</title>
<id>https://si3t.ch/log/2024-03-24-mon-fils-m-a-envoye-un-courrier.txt</id>
<updated>2024-03-24T15:11:31Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-24-mon-fils-m-a-envoye-un-courrier.txt" />
<content type="text"><![CDATA[
Cher Papa,

J'espère que ce courrier te trouvera en pleine forme, et surtout que cette chauve-souris trouvera le chemin de la maison contrairement à la dernière. Ce sont mes premiers dressages et j'apprends encore de mes échecs.
Je pourrai y consacrer davantage de temps à la prochaine saison des pluies.
Pour l'instant, il est plus urgent de réparer le piège à nuages pour ne pas manquer d'eau, les grandes chaleurs approchent et les réservoirs ne seront jamais assez remplis.
J'ai creusé une nouvelle cuve derrière la maison, à l'intérieur cette fois.
À quelques mètres de profondeur à flanc de colline, nous serons au frais et ne risquons plus les inondations lorsque la période des orages surviendra.

Ta petite fille a trouvé un vieil alternateur sur une twingo abandonnée. Elle commence déjà à bricoler une éolienne verticale. Elle dit vouloir préparer un système fermé à combustion d'hydrogène pour nous éclairer même en l'absence de vent. Comme tu vois, elle ne manque pas d'idée, je suppose qu'elle a fouillé dans tes vieilles notes de cours. Je reste prudent, je crains qu'à ce rythme, toute cette lumière attire des siluriens.

Je profite de ces lignes pour t'envoyer des nouvelles de ma petite soeur.
Elle est radieuse, la vie en ville lui réussit. Tu la connais, elle déborde d'énergie et participe sans relâche à l'aménagement de la banlieue. Là-bas, les inégalités restent fortes, pourtant tout le monde semble se rendre service. Les immeubles récents ont été abaissés, les toits aplanis. Reste à y monter suffisamment de terre pour les végétaliser. Les premiers essais de jardins sont épatants, les légumes et arbres donnent au sommet des bâtiments des allures de coiffures punk. C'est à leur floraison que c'est magnifique, mais surtout, cela permet de rendre la température supportable à la saison des brûlures.

Elle m'a parlé d'une résine spéciale dont ils enduisent les murs : la photosynthésine. Exposée à la lumière, elle génère de l'électricité. Cette énergie permettrait de briser les molécules de CO₂ en deux pour réduire sa concentration. Encore une fois, les plantes nous servent de modèle.

En attendant, ta fille peint les murs en blanc pour augmenter l'albédo, et répand des spores de mousse pour végétaliser les murs et les toits. Ce sont d'excellents pièges à carbone. Elle m'a parlé de certaines espèces d'algues qui recouvrent des bâtiments de ville voisine, je suppose qu'elle ne résistera pas à tenter cette alternative.

Quant à toi, te décideras-tu enfin à nous rejoindre? Tu sais bien que la maison est trop humide, elle baigne dans les eaux de la Loire les deux tiers de l'année, le salpêtre gagne les murs et cette humidité nuit à ta santé. Laisse les souvenirs sur place et vient en vivre de nouveaux avec tes petits enfants. Je peux te creuser une bibliothèque. Je t'aiderai à y déplacer tous tes livres. De plus, le four solaire fonctionne bien, nous pourrons nous débrouiller pour y chauffer de la céramique et faire cuire les crêpes que tu aimes tant.

Ton fils qui pense à toi.
N

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=mon-fils-m-a-envoye-un-courrier

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">sloweb partie 3 : lecture</title>
<id>https://si3t.ch/log/2024-03-21-sloweb-part-3-whatsinthebox.txt</id>
<updated>2024-03-21T12:32:06Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-21-sloweb-part-3-whatsinthebox.txt" />
<content type="text"><![CDATA[
Afin de consulter les pages enregistrées, regarder les images récupérées ou visonner les vidéos téléchargées par yt-dlp, j'appelle le script "whatsinthebox".

Petite référence à un film et au fait que toutes les ressources sont stockées dans le dossier ~/sloweb/box par défaut.

Ce script va tout simplement afficher les fichiers les uns après les autres, et proposer pour chacun de le conserver ou de le supprimer (choix par défaut).

```
OLDIFS=$IFS
IFS='
'
for f in $(find "${SLOWEB_BOX}" -type f -maxdepth 1); do

       "${SLOWEB_OPENER}" "${f}"

       ans=""
       printf "%s\n" "${f}"
       printf "[d]elete, [k]eep? or [e]xit [d] > "
       read ans
       case "${ans}" in
       k|K)
               printf "Keep ${f}\n"
               ;;
       e|E)
               exit
               ;;
       *)
               #d|D|n|N)
               printf "Delete ${f}, next!\n"
               rm -f "${f}"
               rm -rf "${f}-data"
               ;;
       esac
done

IFS=$OLDIFS
```

On voit qu'il appelle "SLOWEB_OPENER" pour ouvrir un fichier.
Par défaut, il s'agit d'olab, un autre script à modifier qui effectue une action selon l'extension du fichier. Par défaut, il appelle xdg-open:

```
#!/bin/sh
# olab : open like a boss
# Usage:
#     ./olab.sh /path/to/file

# get extension + lower extension
ext="$(echo .${1#*.} | tr '[:upper:]' '[:lower:]')"

case "${ext}" in
*.htm|*.html|*.xhtml)
       #fmt="w3m %s"
       fmt="surf %s"
       ;;
*.pdf|*.xps|*.cbz|*.epub)
       fmt="mupdf %s" ;;
*.jpg|*.jpeg|*.png|*.gif|*.tiff|*.svg)
       fmt="nsxiv %s" ;;
*.odt|*.odt|*.ods|*.od*|*.docx|*.doc|*.xls|*.xlsx|*.ppt*)
       fmt="libreoffice %s" ;;
*.mp4|*.avi|*.mpg|*.ogv|*.webm|*.mkv)
       fmt="mpv %s" ;;
*.ogg|*.flac|*.wav|*.mp3|*.opus)
       fmt="mpv %s" ;;
*.[1-9])
       fmt="man -l %s" ;;
*.c|*.h|*.sh|*.lua|*.py|*.ml|*[Mm]akefile|*.md|*.tex)
       fmt="st -e $EDITOR %s" ;;
*.txt|*.gmi|*.gemtext)
       which bat && fmt="bat %s" || fmt="less %s" ;;
*)
       fmt="xdg-open %s" ;;
esac

printf "$fmt" "\"$1\"" | ${SHELL:-"/bin/sh"}

exit
```

En passant, on remarquera que pour les fichiers gmi, la coloration est obtenue avec "bat" s'il est présent.

À l'usage, je me dis qu'utiliser un navigateur de fichier comme noice serait tout aussi pratique, mais retire la possibilité de supprimer par défaut.
=> https://git.2f30.org/noice/log.html

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=sloweb-part-3-whatsinthebox

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">sloweb partie 2 : les flux</title>
<id>https://si3t.ch/log/2024-03-14-sloweb-part-2-feeds.txt</id>
<updated>2024-03-14T12:29:58Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-14-sloweb-part-2-feeds.txt" />
<content type="text"><![CDATA[
Pour la lecture des flux, sloweb s'appuie sur des outils déjà existants.
Quel que soit la méthode choisie, l'objectif est de récupérer les nouveaux articles à lire sur la machine et les garder en cache.

La plupart des lecteurs de flux fonctionnent ainsi : on les ouvre, ils récupères les nouveautés.

Cependant, je n'ai pas toujours prévu de lire mes flux quand j'allume l'ordinateur.
De plus, pour éviter d'être distrait, je préfère rester dans un contexte de texte brut.
Enfin, il y a la question des phlogs et gemlogs, des protocoles peu souvent supportés par les lecteurs de flux.
(oui ploum, je sais, il y a offpunk ;))

## Quels outils?

J'ai tout d'abord utilisé rss2email, qui envoie les articles par mail.
=> https://github.com/rss2email/rss2email

Cependant, je lui ai trouvé 2 défauts:
* La gestion des abonnements est un peu pénible, surtout si je charge mon serveur de faire tourner rss2email.
* Les articles étant des mails, je suis trop tenté d'ouvrir mon application de messagerie pour vérifier s'il y a de nouveaux articles. C'est de ma faute, mais je retombe dans les travers du "plus, encore, maintenant!".

À la place, je lui préfère sfeed et son interface éventuelle qui rappelle newsboat:

=> https://codemadness.org/sfeed.html
=> https://codemadness.org/sfeed_curses-ui.html

sfeed est justement très modulaire, et s'entoure de plusieurs petits outils faciles à articuler entre eux. On peut d'ailleurs très bien faire de sfeed un équivalent de rss2email si on le souhaite, tout est expliqué dans le readme.

Sur mon ordinateur, sfeed m'apporte les avantages suivants :

* Récupération des flux avec curl, ou une autre commande. Ça supporte ainsi aussi le protocole gopher, donc les phlogs. Il ne devrait pas être trop difficile d'y ajouter les gemlogs, mais j'ai écrit un script dédié pour ça.
* Il garde en mémoire les articles déjà lus dans sfeed-curses. On peu les lire ou ouvrir dans le navigateur. Le lien de l'article est affiché, je peux l'utiliser pour l'envoyer à d'autres outils (voir Exemple).
* Il permet de filtrer les flux et d'effectuer des remplacements du type youtube > invidious, ou encore retirer des liens publicitaires... On peut même choisir de télécharger les vidéos des abonnements youtubes avec yt-dlp.
* La mutliplicité des outils pour lire me plaît : dmenu, mail, texte, ...

Il reste limité à un affichage en mode texte, parfois gênant pour des articles contenant des images (xkcd, APOD) que j'aimerais pouvoir voir même hors-ligne.

Pour cela, le script sloweb_forlater est là.

## Un exemple avec APOD

Si vous ne connaissez pas, sachez que la NASA publie chaque jour une photo d'astronomie avec des commentaires d'astronomes profesionnels.
=> https://apod.nasa.gov/apod/

Ça n'a d'intérêt que si on a l'image sous la main.
Lorsqu'une nouvelle entrée apparaît dans le flux, je passe l'URL à forlater:

```
forlater https://apod.nasa.gov/apod/ap240314.html
```

Ce script est très court.
Il va faire en sorte que la commande sloweb_forlater soit exécutée la prochaine fois que sloweb tourne, avec l'aide de sloweb_cmd déjà présenté dans l'article précédent.

```
sloweb_cmd "cd \"${SLOWEB_BOX}\"; sloweb_forlater \"$1\""
```

La commande sloweb_forlater sera alors exécutée dans le dossier ~/sloweb/box pour enregistrer la page apod ainsi que l'image.

## sloweb_forlater
sloweb_forlater est un des outils dont je suis le plus content car il permet d'avoir une version locale d'une page web/gemini/gopher.

Dans le cas d'une page web, je sais que wget sait déjà aspirer un site. Cependant, les liens vers le ressources ne sont pas réécris.
Autement dit, si la page appelle un script vers googleapis, ou encore si elle demande le chargement d'une image avec un lien du type "https://bla/blop/blup.jpg", alors impossible de charger l'image si on est hors-ligne.

sloweb_forlater se charge donc de réécrire les liens vers les images. Ces liens sont des liens locaux du type "./chemin_vers_limage.jpg".

Pour télécharger les ressources, je vais appel à "sloweb_anyget", qui n'est qu'un "wrapper" afin d'appeler la bonne commande de téléchargement selon si le protocole esthttp, gopher ou gemini. À la même occasion, si le lien est une vidéo youtube, alors yt-dlp va la télécharger.

Ainsi, je peux lire les pages et médias gardés dans la "box" sans avoir besoin d'un accès à internet. Cela fera appel au script sloweb_whatsinthebox, mais c'est pour un futur article ;)

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=sloweb-part-2-feeds

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">sloweb partie 1 : run_cmds</title>
<id>https://si3t.ch/log/2024-03-13-sloweb-part-1-run-cmds.txt</id>
<updated>2024-03-13T13:42:23Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-13-sloweb-part-1-run-cmds.txt" />
<content type="text"><![CDATA[
C'est parti pour détailler tout ce que me permet de faire sloweb actuellement:
=> https://git.sr.ht/~prx/sloweb

## sloweb_online

Tout d'abord, sloweb vérifie que l'on a bien un accès en ligne, et appelle pour cela le script sloweb_online. Si tout va bien, ce dernier retourne 0, sinon il retourne une erreur.

On peut lire au tout début de ce script quelques lignes communes à tous les scripts sloweb_*. Cela concerne la configuration :

```
# configuration
# if SLOWEB_DIR not set as ENV VARS, set default
test -z "${SLOWEB_DIR}" && SLOWEB_DIR=~/sloweb
config="${SLOWEB_DIR}/slowebrc"
if [ ! -f "${config}" ]; then
       printf "%s" "Configuration not found, copy slowebrc.example to ${config}"
       exit 1
fi
# import config
"${config}"
```

On peut voir qu'à moins qu'une variable d'environnement soit déjà définie, on va aller chercher le fichier ~/sloweb/slowebrc comme configuration.
Utiliser une variable d'environnement facilite la possibilité de changer la structure des répertoires utilisés par sloweb sans se prendre la tête. Dans le fichier ~/.profile, on pourra écrire:

```
export SLOWEB_DIR=/var/sloweb/or/else
```

On retiendra donc que par défaut, la configuration de sloweb a lieu dans ~/sloweb/slowebrc. Un exemple est fourni, il est commenté pour expliquer à quoi servent chaque partie.

On trouve notamment dans ce fichier la partie relative à sloweb_online:

```
# sloweb_online
# connectivity check, multiple domains in case one of them is down
SLOWEB_ONLINE_DOMAINS="openbsd.org wikipedia.org www.nasa.gov"
SLOWEB_ONLINE_PORT=443
```

Voici une liste de domaines qu'on va chercher à atteindre via le port 443.
Si le premier échoue, alors on essaie le suivant : après tout, un site peut bien être en panne alors que vous êtes pourtant connecté.
Dès qu'un accès a réussi, alors sloweb_s'arrête et retourne 0.

Ça tient finalement en quelques lignes:

```
# check if currently connected
connected=0

for d in ${SLOWEB_ONLINE_DOMAINS}; do
       # uncomment to use ping instead of netcat
       # ping -c1 -w2 "$d" >/dev/null 2>&1
       nc -zw1 "${d}" $SLOWEB_ONLINE_PORT >/dev/null 2>&1

       if [ $? -eq 0 ]; then
               connected=1
               break
       fi
done

if [ $connected -eq 0 ]; then
       _err "It seems you cannot reach the Internet"
       exit 1
fi
exit 0
```

Vous aurez noté l'utilisation de netcat. Il est présent par défaut sous OpenBSD.

Certains préféreront décommenter l'appel à "ping" à la place. J'ai cependant lu à ce propos que certains fournisseurs bloquent le ping, pas tant le serveur que le point d'accès : pensez WiFi public, ce qui donnerait l'impression d'être hors ligne, alors que le port 443 protocole TCP utilisé pour les "accès https" est bien ouvert. J'avoue, je n'ai pas trop d'avis là-dessus, je n'ai jamais été confronté à ça.

Pour finir, vous aurez remarqué la fonction "_err", qu'on retrouvera dans d'autres scripts.
J'aurais pu l'écrire dans le fichier de configuration, mais je craignais de rentre les choses trop confuses en mélangeant fonctions et configuration.

## sloweb_run_cmds

le script sloweb_run_cmds va exécuter toutes les commandes présentes dans des fichiers, eux-même stockés dans le dossier SLOWEB_CMDS (~/sloweb/cmds par défaut).

```
find "${SLOWEB_CMDS}" -type f | while read -r cmd; do
       ${SHELL:-"/bin/sh"} -e "${cmd}"

       if [ $? -ne 0 ]; then
               _err "'$(cat ${cmd})' in ${cmd} failed"
       else
               _log "'$(cat ${cmd})' successfully executed"
               rm -f "${cmd}"
       fi
done
```

"find" permet de lister tous les fichiers du dossier cité ci-dessus puis d'en exécuter le contenu comme un script. On passe ce fichier au shell par défaut et on informe l'utilisateur si tout s'est bien déroulé. Dans ce cas, on supprime le fichier.
On laisse le fichier présent pour que l'utilisateur puisse éventuellement corriger la commande.

On pourrait laisser l'utilisateur créer des fichiers dans ce dossier, mais autant l'aider avec un script qui va créer des fichiers uniques pour les commandes qu'il voudra exécuter lors de son retour en ligne. C'est ce que fait sloweb_cmd.

## sloweb_cmd

Ce script se charge de créer un fichier dont le nom est unique pour ne pas écraser un éventuel fichie déjà existant. Pour cela, la commande "mktemp" est parfaite.

```
# use mktemp for unique file, and a timestamp to keep order
cmd_file=$(mktemp "${SLOWEB_DIR}/cmds/$(date +%s).XXXXXXXX")
printf "%s\n" "$*" >> "${cmd_file}"
```

Le "printf" permet de conserver tous les caractères qui seraient sinon interprétés.

## Le mot de la fin

J'ai commencé par une partie un peu technique de sloweb.
Le prochain coup, je présenterai la partie sur les abonnements aux flux RSS/ATOM, qui utilise des outils déjà existants.

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=sloweb-part-1-run-cmds

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">sloweb -- Le web sans s'essouffler</title>
<id>https://si3t.ch/log/2024-03-12-sloweb-le-web-sans-s-essoufler.txt</id>
<updated>2024-03-12T20:47:27Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-12-sloweb-le-web-sans-s-essoufler.txt" />
<content type="text"><![CDATA[
Voilà quelques semaines, voire quelques mois que je tente de limiter le temps passé (perdu) devant mon écran.
Vous savez, dès qu'une petite difficulté se présente, qu'il faut réfléchir un petit peu, ou que on a un petit peu avancé dans le boulot : hop, une petite pause sur 9gag ou mastodon histoire de voir ce qu'il y a de nouveau.

Rien de tel pour manquer de concentration et perdre du temps.

Le pire, c'est que ce comportement devient préoccupant lorsque j'en arrive à vérifier à la moindre seconde "libre" aussi sur mon smartphone s'il y a de nouveaux mails, de nouveaux posts sur le fediverse, un nouvel article dans la liste des flux suivis.

Vous avez dit aliénation?

Je laisse donc mon smartphone en dehors de ma poche lorsque j'en ai pas BESOIN. Fedilab est désinstallé, et le raccourci vers mon client mail effacé.
J'ai étendu ce nettoyage sur mon ordinateur : je l'allume pour effectuer une tâche prévue à l'avance, avec une fenêtre en plein écran.
Fini les multiples onglets, les notifications, le client de messagerie instantanée ouvert à côté du client mail avec un client mastodon sous les yeux et ...

Pour ceux qui ont suivi son aventure, j'ai 2 ans de retard sur Ploum:

=> gemini://ploum.net/3-janvier-2022-quest-ce-quune-deconnexion/
=> https://ploum.net/3-janvier-2022-quest-ce-quune-deconnexion/index.html

J'ai suivi son exemple et écrit un "do-the-internet.sh" à ma sauce.
Le résultat, c'est "sloweb" : on prend le temps de respirer, on y va doucement.

Avant qu'il ne m'écrive agacé par mes divagations, notez que la plupart des choses que fait sloweb se retrouvent aussi dans offpunk de ploum:
=> https://sr.ht/~lioploum/offpunk/

Cependant, j'avais besoin de m'approprier la démarche, de me faire mon petit outil afin de bien cerner mes besoins, mais aussi mes défauts dans mon utilisation d'internet.

Voilà quelques semaines que je l'utilise, je peux désormais détailler ses différents aspects dans une série de petits articles. En effet, sloweb ne se limite pas à la navigation, mais va intervenir dans de nombreux aspects de mes accès en ligne.

Pour les plus pressés et plus curieux, voici le code source :

sloweb: tools to stay offline/offtime
=> https://sr.ht/~prx/sloweb/

## À l'allumage de mon ordinateur

Lorsque ma session s'ouvre, sloweb se charge de :

* Récupérer les nouveaux articles des flux RSS/ATOM auxquels je suis abonnés.
* Télécharger les nouveaux articles des capsules gemini (gemlogs) suivis.
* Télécharger mes mails
* Vérifier et récupérer les changements éventuels de sites qui n'auraient pas de flux.
* Enregistrer dans un fichier ma timeline mastodon.
* Afficher le nombre de nouveaux mails et la météo à venir.

## Lorsque je ferme ma session/éteins mon ordinateur

Dans ce cas, sloweb se charge "d'envoyer" mon activité en ligne, c'est à dire:

* Envoyer les mails rédigés, en attente
* Exécuter une liste de commandes. Ces derniers peuvent être l'envoi de status mastodon, des réponses à des posts, booster un message, télécharger une page web et les médias associés pour lecture ultérieure, ...
* Sauvegarder mes documents
* Uploader mon site web/capsule/gopherhole

## Entre les deux

sloweb me permet de garder en stock les commandes qui seraient à exécuter lors de mon retour en ligne.

Quelques scripts sont alors utile pour prévoir le téléchargement d'une vidéo youtube ou bien une page web avec ses images.
D'autres se chargent de garder les toots/twtxt à envoyer.

Enfin, un autre script me permet de lire les documents gardés dans la bibliothèque. Tous les trucs "à lire + tard" : flux rss, vidéos récupérés, ...

## Pour finir

J'ai pour l'instant l'impression que ça fonctionne.
Je prends plus le temps de lire, je découvre de nouvelles choses.
Je redécouvre aussi les petits bonheurs simples : discuter avec mon entourage, profiter du spectacle à ma fenêtre, ou simplement m'asseoir et profiter du temps qui coule.

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=sloweb-le-web-sans-s-essoufler

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Moi, je pollue. Et toi? Autocollants...</title>
<id>https://si3t.ch/log/2024-03-06-moi-je-pollue.txt</id>
<updated>2024-03-06T15:53:58Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-06-moi-je-pollue.txt" />
<content type="text"><![CDATA[
Père de 2 enfants.
Climatoanxieux.
Excédé par toutes ces voitures qui prennent toute la place sur la route.
La plupart avec 1 seule personne dedans...
Sans doute influencé par mes lectures d'Alain Damasio.
J'ai envie de faire + que râler.

Alors juste comme ça, j'ai joué avec inkscape pour imaginer un sticker à coller inocemment derrière les SUV et autrs 4x4 au cours d'une promenade :

=> https://si3t.ch/pub/img/ecolo/suv.svg
=> http://si3t.ch/pub/img/ecolo/suv.svg
=> gemini://si3t.ch/pub/img/ecolo/suv.svg
=> gopher://si3t.ch/9/pub/img/ecolo/suv.svg

Et juste comme ça, je me demandais, de façon tout à fait hypothétique, où faire imprimer des stickers en grande quantité?

Si vous avez envie de jouer vous aussi avec inkscape, ou des réponses à ces interrogations conditionnelles, vous savez où me trouver ;)

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=moi-je-pollue

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Comment j'ai perdu un ami</title>
<id>https://si3t.ch/log/2024-03-06-comment-j-ai-perdu-un-ami.txt</id>
<updated>2024-03-06T09:43:22Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-06-comment-j-ai-perdu-un-ami.txt" />
<content type="text"><![CDATA[
Voici le récit de comment j'ai perdu mon meilleur ami.
Tout commence le jour où nos avis divergent sur une oeuvre majeure.
Lui passionné de cinéma, moi du roman original.
Impossible de se mettre d'accord, ses souvenirs de l'oeuvre initiale sont remplacés par les images du film tandis que je n'arrive pas à me défaire de mon admiration pour le livre.
Et puis avouons-le, on s'amuse bien à se chicaner.

En parallèle, il se trouve que quelqu'un d'adorable m'a trouvé le texte original au format numérique.
Je pensais en faire un générateur de mots de passe, mais soudain, le diable me susurre à l'oreille.
Comme on dit, pas besoin d'ennemis avec des amis pareils.

Je commence par activer le mode débogage de mon téléphone.
Avec le câble USB, ça marche mal, mais en WiFi, c'est nickel:

```
adb pair 192.168.1.40:xxxxx
adb connect 192.168.1.40:zzzzz
```

Quelques tests suivent, je trouve alors comment envoyer un SMS:

```
#!/bin/sh
tel="+33xxxxxxxxxxx"
msg="$(printf "%s" "$*" | sed -e 's/\x27/’/g')"
adb shell service call isms 5 i32 1 s16 "com.android.mms.service" s16 "null" s16 "$tel" s16 "null" s16 "'${msg}'" s16 "null" s16 "null" i32 1 i32 0
```

Le message est entre single quotes. Obligé, sinon il faut échapper tous les espaces.
De même, je remplace le single quote par une apostrophe avec sed, ça évite de mettre le bazar dans le paramètre de la commande utilisée.

Tout est prêt, reste à envoyer le contenu du livre, ligne après ligne.

Cependant, les trop longs messages ne partent pas, il y a une limite à la taille d'un SMS, et je n'ai pas trouvé comment en faire un MMS.
Alors, on appelle ''fold'' pour limiter une ligne à 70 caractères. On pourrait plus, mais à condition de n'utiliser que des caractères ASCII.

```
fold -s -w 70 book.txt > book-folded.txt
```

J'envoie maintenant les lignes une à unes:

```
#!/bin/sh -e
book=~/book/book-folded.txt
tel="+33xxxxxxxxx"
# warning : lines must be 70 char max long

while [ $(awk 'END {print NR}' $book) -ne 0 ]; do
       # get the line and replace quotes with apostrophes
       l="$(sed -n '1p' $book | sed -e 's/\x27/’/g')"

       # wait as many seconds as there are chars / 4
       n=$(($(printf "%s" "${l}" | awk '{print length($0)}') / 4))

       # send sms
       printf "%s [%s]\n" "$l" "$n"

       adb shell service call isms 5 i32 1 s16 "com.android.mms.service" s16 "null" s16 "$tel" s16 "null" s16 "'${l}'" s16 "null" s16 "null" i32 1 i32 0

       # delete line
       sed -i '1d' $book
       sleep $n
done
```

En supprimant les lignes au fur et à mesure, on peut arrêter et reprendre quand on veut.

Il y a des limites contre les spams, et c'est très bien comme ça. Il vaut donc mieux garder le délai entre chaque message. J'ai dans le script considéré qu'il faut 0.25s pour écrire un caractère.


Ne faîtes pas ça chez vous :)

---
Une réaction?

Envoyez votre commentaire par mail (votre adresse mail sera retirée des entêtes cachée):
=> mailto:[email protected]?subject=comment-j-ai-perdu-un-ami

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Dune partie 2, le garçon pas content qui voulait se venger</title>
<id>https://si3t.ch/log/2024-03-01-dune-partie-2.txt</id>
<updated>2024-03-01T09:06:46Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-03-01-dune-partie-2.txt" />
<content type="text"><![CDATA[
Hier soir, j'ai vu Dune partie 2 au cinéma.

Il faut d'abord que je précise, je suis un très grand fan de l'oeuvre de Frank Herbert. Cet univers m'a (trans)formé, et je le relis toujours avec émotion pour y redécouvrir de nouvelles strates.

Le premier film m'avait bouleversé tant l'univers y était dessiné avec finesse, la musique sublime enveloppait parfaitement le récit. On y ressentait une tension suffocante pour les protagonistes. Les multiples factions et les enjeux de pouvoirs selon les objectifs propres à chacun étaient dosés avec subtilité.

Bref, j'ai adoré le premier volet.

Je trépignais d'impatience de découvrir le second, les insupportables publicités des gros complexes cinés ont mis mes nerfs à rude épreuve. ^^ Mais j'étais en compagnie de ma moitié qui ne connaît pas du tout Dune. Dans mes commentaires à suivre, elle fait office de spectatrice neutre XD.

Si vous aussi êtes un(e) fidèle de Frank Herbert, vous risquez comme moi de sortir de la salle déçus et en colère.

Pour faire court : ce film est inspiré de Dune, mais CE N'EST PAS Dune.

Je suis fâché que les personnes qui ne connaissent pas Dune puissent penser que c'est ÇA, Dune.
Tellement agacé que je dois l'écrire.

Voilà pourquoi.

## Avant tout...

Certains craignent peut-être en lisant la suite que je divulgâche le film. Rassurez-vous, puisqu'il n'y a pas grand chose à dire sur le fond. Dune partie 2 est plein de vide.
C'est justement ce qui me dérange le plus : tout ce qui manque.
Je comprends très bien qu'on ne puisse pas tout raconter.
C'est évident qu'il est nécessaire de choisir de taire certains éléments, d'autant plus vrai pour une oeuvre aussi conséquente et complexe que Dune : le spectateur ne peut pas tout comprendre, le film serait trop long...
Cependant, cela doit permettre de développer et d'approfondir d'autres aspects.

Dans Dune partie 2, ce n'est pas le cas : on a retiré des éléments qui, pour moi, sont absolument essentiels à l'histoire de Dune. Le résultat manque d'intérêt.

Cela va sans dire, si vous voulez garder la surprise complète, ne lisez pas la suite.

## Le rythme ne va pas

C'est la première réaction de ma chérie : le rythme est mal dosé.
En effet, la temporalité est très mal gérée.
C'est ennuyeux, on passe d'une scène à l'autre sans grands liens entre elles. Les dialogues sont pauvres. Il y a de la bagarre de temps en temps pour réveiller le spectateur, mais pas de fond.
D'un seul coup, on voit réapparaître comme de par hasard des personnages pratiques pour faire avancer le film.

La gestion du temps est ratée.
Tellement ratée qu'à la fin du film, Jessica n'a toujours pas accouché.
Cela veut dire qu'en moins de 9 mois, Paul a gagné la confiance de tout le peuple Fremen et organisé sa revanche. C'est idiot.

Tout ceci manque de ciment, il n'y a pas d'enjeu.

## Quel est l'enjeu ?

Dit autrement, pourquoi cette histoire vaut la peine d'être racontée.
Dans Dune partie 2, il est seulement fait mention du désir de vengeance de Paul.

C'est ça pour vous Dune? Un jeune garçon qui veut se venger???

On aperçoit les manigances Bene Gesserit.
Le nombre de scènes avec l'empereur doit s'élever à 2 ou 3.

Il n'y est pas décrit les visions de Paul, ou alors ça se résume à un vilain cauchemar parce qu'il a pris un peu trop d'épice, mode geule-deub'.
À ce titre, l'agonie de l'épice est très décevante : sans avoir lu le livre, on ne comprend pas ce qui se passe. Le dialogue avec la multitude est absent.
Le conflit intérieur qui le torture est mal mentionné : des gens vont avoir faim, c'est tout.
Le Jihad, la peur de perdre Chani, tout ça n'y est pas.
Tout l'économie autour de l'épice : absent.
L'enjeu écologique : absent
Les jeux de pouvoirs entre les factions : absent.
Et la prescience ??? Ce questionnement philosophique sur le sens de la vie lorsque l'on voit l'avenir : absent. On ne comprend même pas très bien pourquoi Paul choisit de boire l'Eau de vie.
Le courage de Paul face au suicide, le choix d'accepter le moins mauvais des avenirs malgré l'horreur qu'il représente : absent

Reste un Paul presque capricieux qui veut juste se venger.

## Absentéisme

Voici la 3e erreur trop dérangeante pour moi : l'absence de personnages riches, complexes et essentiels à l'histoire de Dune. Et encore une fois, leur absence ne permet même pas de développer davantage les autres personnages, parfois même au contraire.

Tout d'abord, Jessica. Interprétée avec génie dans le premier volet, Rebecca Ferguson m'avait bouleversé tant dans son rôle de concubine, amoureuse et compagne. Elle incarnait une mère vibrante, qui augurait un excellent 2e volet où elle veille à préserver tout ce qui reste de "son Duc" : Paul.
Cependant, très vite elle disparaît pour devenir à la place une encapuchonnée qui manigance dans le dos de son fils et stimuler l'adoration religieuse. Pourquoi fait-elle ça??? Encore une fois, l'enjeu n'est pas clair.

Cette disparition vient avec l'absence totale d'Alia.
Alia, la petite soeur de Paul, la future abomination.
Alia ne naît jamais dans le film. À la place, elle dialogue avec Paul au travers de sa mère. Ça ne dérange pas Paul d'ailleurs.
Alia ne tuera donc jamais le baron.
Alia, enfant sage comme la multitude des vies qu'elle contient, ne prendra donc jamais la parole pour enrichir les dialogues entre les femmes Fremen.

Dernier absent : l'enfant de Paul et Chani, dont la mort prématurée est un élément déclencheur indispensable aux choix de Paul vers le chemin du Jihad.

Voilà 3 femmes mises de côté.

## La place des femmes

J'ai comme l'impression que les femmes ont été mises de côté.
On a évoqué Jessica et Alia.
Irulan n'est jamais mentionnée. Oh, elle est interprétée, mais je ne me souviens pas d'avoir seulement entendu son nom.
Chani reste une amourette d'adolescent. Elle est la seule à garder la tête sur les épaules alors que le fanatisme entoure Paul, pourtant, elle ne reste que la nana de Paul.
On piétine tellement son personnage qu'au lieu de souligner l'importance qu'elle a pour Paul lors de son agonie, la seule chose qu'elle peut faire c'est verser une larme sur ses lèvres. Et encore, c'est seulement parce qu'il y a une légende avec son nom secret Sihaya. Bravo les féministes!
Chani est celle qui forme Paul.
Chani est celle qui voit le monde tel qu'il est.
Chani est le personnage le plus courageux de Dune.
Chani se suffit à elle-même sans avoir besoin de Paul : c'est Paul qui a besoin de Chani.
Ils forment un duo magnifique.

Plus largement, l'importance des femmes dans le monde de Dune est occultée. Ce sont les femmes qui portent l'eau : ce n'est pas montré.
La femme de Jamis et par extension sa famille deviennent la responsabilité du jeune Paul, on ne tue pas sans conséquences. Cependant, ce personnage aussi est effacé, alors qu'il permettait d'enrichir la description de la société Fremen.

## La société Fremen

Très peu décrite, l'organisation de Fremen n'est pas détaillée.
L'adaptation des hommes dans un milieu hostile et leur ingéniosité pour s'insérer dans une logique écologique est absente.
D'accord, ça aurait peut-être été trop long de détailler cette partie.
Mais à la place, on y évoque très rapidement le rêve d'un Paradis Vert, et surtout on insiste bien sur le fanatisme religieux des Fremen.

Stilgar en devient comique et les Fremens ridicules.
Fremens qui sont censés être inquiétants.
Les enjeux entre pouvoir religieux et intérêts politiques sont pourtant passionnants dans l'oeuvre d'origine, et pourrait résonner avec l'actualité.

Comble du ridicule, lorsque Paul rallie les Fremen à sa cause et endosse son rôle de messie, il lui suffit de décrire les pensées d'1 Fremen présent pour que l'assemblée constituée de milliers de personnes l'accepte comme omniscient. Pas de tension ici. Heureusement, une reprise du thème musical réussie juste avant.

## En vrac

* L'intelligence du plan de bataille est bâclée. On n'y décrit pas du tout l'utilisation des atomiques pour détruire la barrière rocheuse alors qu'une tempête prédite par Paul fait rage et entrave les défenses de l'empereur. À la place, Paul est tout guilleret et sourit, ALORS QU'IL EST CENSÉ ÊTRE DÉVASTÉ PAR LE CHAGRIN D'AVOIR PERDU SON FILS. (pardon)
* Paul entre en guerre contre les maisons du Landsraad. N'importe quoi. Preuve qu'on n'a pas du tout détaillé les enjeux de pouvoir.
* On ne parle pas de la Guilde qui craint la destruction de l'épice, à qui les Fremen paient un lourd tribut pour rester cachés.

## Du positif quand même

Reste quelques choses très bien réussies à mon avis :
* La direction artistique, notamment pour les Harkonnens, est exceptionnelle. Les choix des couleurs, des costumes, bravo! Heureusement, car Feyd-Rautha aurait lui aussi gagné à être approfondi : là, c'est juste un méchant qui coupe.
* Les moissonneuses d'épices sont vraiment cool.
* Le rendu à l'image lorsque les Fremen chevauchent les vers.
* Les fremens qui sortent du sable en courant, bravo.
* L'eau de vie tient dans un erlenmeyer.

Mais ce qu'il y a de plus réussi, ce sont les livres de Frank Herbert.
LISEZ-LES!

## Pour finir

Appelez-moi romantique, ces quelques lignes m'ont tellement manqué qu'elles me hantent :

> Aucun titre pour moi, dit Chani. Rien. Je vous en supplie.

Paul rencontra son regard et il la revit soudain avec le petit Leto dans ses bras, leur fils qui avait trouvé la mort dans toute cette violence.

> Je te jure, dit-il, que tu n'as besoin d'aucun titre. Cette femme, là-bas, sera mon épouse et tu ne seras qu'une concubine parce que ceci est une affaire politique et que nous devons conclure la paix et rallier les Grandes Maisons du Landsraad. Il faut obéir aux usages. Mais cette princesse n'aura de moi que mon nom. Elle n'aura nul enfant, nul geste, nul regard, nul instant de désir.

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=dune-partie-2

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> /log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Gemfeeds downloader</title>
<id>https://si3t.ch/log/2024-02-28-gemfeeds-downloader.txt</id>
<updated>2024-02-28T14:15:32Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-28-gemfeeds-downloader.txt" />
<content type="text"><![CDATA[
So, I wrote a gemfeed parser and news downloader.

I read a lot of ATOM/RSS feeds with rss2email or sfeed, especially sfeed:
=> https://github.com/rss2email/rss2email
=> https://codemadness.org/sfeed.html

However, it doesn't support gemfeeds.
I wasn't happy to open a gemini client to check for new entries.
It felt not natural to me, and even if lagrange or amfora are great to these tasks, I finally never opened them.

But it was disappointing, there are capsules I miss reading.

So, here I am with this piece of awk: gemfeeds.
awk is great to parse text, and gemtext is line-oriented so it's perfect.

There is one part I don't really like: to download over gemini protocol, I use openssl. I miss gemini support in curl, and feel lazy to install one. I should install "gg":
=> https://gmid.omarpolo.com/


For now, I use gemfeeds this way:

```
gemfeeds file-with-list-of-gemfeeds.txt
```

in file-with-list-of-gemfeeds.txt, there is :

```
gemini://ploum.net/
gemini://adele.pollux.casa/gemlog/
..
```

When a new entry is found, it is downloaded in the current directory, and the item url is recorded in "~/.gemfeeds-items.urls".

Feel free to check the code below and suggest improvements ;)

```gemfeeds.awk
#!/usr/bin/awk -f
# gemfeeds : download new items from gemfeeds
#
# 1. read a gemfeed url as input
# 2. download new items
# 3. keep track of old items in ~/.gemfeeds-items.urls
#
# ex: gemfeed list-of-gemfeeds-urls.txt
# require: openssl

BEGIN {
       # set defaults
       if ( oldurls == "" ) {
               oldurls = ENVIRON["HOME"] "/.gemfeeds-items.urls"
       }
}

function fetch_gemini_cmd(url) {
       # return command to get gemini content

       host = ""

       split(url, a, "/")
       if (a[3] !~ /:[[:digit:]]+/) {
               a[3] = sprintf("%s:1965", a[3])
       }
       host = a[3]

       # FIXME : check response code
       cmd = sprintf("printf \"%s\\n\" |\
               openssl s_client -crlf -quiet -connect \"%s\" 2> /dev/null |\
               sed '1d'", url, host)

       return cmd
}

function isnew(url) {
       # quite slow...
       ret = 1
       while ((getline o < oldurls) == 1 ) {
               if ( o == url ) {
                       ret = 0
                       break
               }
       }
       close oldurls
       return ret
}

function download_item(url) {
       if (isnew(url) == 1) {
               printf "new item: %s\n", url
               print url >> oldurls

               # get filename
               n = split(url, a, "/")
               filename = sprintf("%s-%s", a[3], a[n])
               fetch_cmd = fetch_gemini_cmd(url)
               getitem_cmd = sprintf("%s > %s", fetch_cmd, filename)
               system(getitem_cmd)
       }
}

function gemfeed(url) {

       fetch_cmd = fetch_gemini_cmd(url)

       while ((fetch_cmd | getline) == 1) {

               link = ""

               # skip non-links
               if ( $1 != "=>" ) { continue }

               # skip if date not YYYY-mm-dd,
               # gemini://geminiprotocol.net/docs/companion/subscription.gmi
               if ( $3 !~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/ ) {
                       continue
               }

               # now build an appropriate link

               if ( $2 ~ /^gemini:\/\// ) {
                       link = $2
               } else if ( $2 ~ /^\// ) {
                       # start with /, add domain in link
                       split(url, a, "/")
                       link = sprintf("%s//%s%s", a[1], a[3], $2)
               } else {
                       # link relative to current url
                       # remove page name if any
                       if ( $2 ~ /\.gmi$/ ) {
                               sub(/\/[^/]*\.gmi$/, "/", $2)
                       }
                       link = sprintf("%s%s", url, $2)
               }

               download_item(link)
       }
       close(cmd)
}

/gemini:\/\// {
       gemfeed($0)
       next
}

{
       printf "unhandled protocol, sorry\n"
}
```

(I also added a phlog parser somewhere else, but curl support gopher protocol, and sfeed can parse atom feeds over gopher :))

---
Comments?

Using email (anonymous)
=> mailto:[email protected]?subject=gemfeeds-downloader

Instructions
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">J'aimerais plus ou moins que tu ailles te faire cuire le cul</title>
<id>https://si3t.ch/log/2024-02-23-j-aimerais-que-tu-ailles-te-faire-cuire-le-cul.txt</id>
<updated>2024-02-23T11:07:35Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-23-j-aimerais-que-tu-ailles-te-faire-cuire-le-cul.txt" />
<content type="text"><![CDATA[
Hier soir, on a regardé Fargo, episode 1 saison 5. Très drôle. Elle a de la ressource cette protagoniste. Chouette de voir une nana badass. Scènes très bien tournées. Ambiance à l'américaine malsaine avec le culte des armes. On a envie de cramer du bourgeois à un moment... hâte de voir la suite.

Vivement les vacances, besoin de repos, envie de jouer à Nethack aussi!
Heureusement, j'ai des élèves vraiment sympas. Je m'inquiète pour eux, ils vont avoir une école bien pourrie. Je vois les conditions se dégrader, ça va être l'enfer à la prochaine rentrée : suppression de postes, classes surchargées.
Arrêtez de faire croire qu'il y a des solutions miracles : juste augmenter le ratio prof/élèves. Moins d'élève spar classe, ou plusieurs profs par classe en "co-enseignement".
Actuellement, j'ai des classe de presque 30 élèves pour des cours de 90 minutes.
La division est simple : 90/30 = 3 minutes.
Ça signifie que pour répondre à des besoins individuels légitimes, je peux accorder 3 minutes à chaque élève.
3 PUTAIN DE MINUTES PAR SEMAINE!!!
Alors vos ajustements pédagogiques, groupes de niveaux, modalités d'apprentissage et autre novlangue ministérielle, c'est des arguments de vente, des effets d'annonce.

Et pendant ce temps :
> "Il y a deux mois, jour pour jour, Gabriel Attal, ministre de l’Education nationale annonçait la création de 2137 postes d’enseignants par rapport au budget 2024 prévu pour permettre l’application de ses réformes. Deux mois plus tard il en supprime plus du double."
=> https://www.cafepedagogique.net/2024/02/22/pres-de-11-000-emplois-supprimes-a-leducation-nationale/

Gabriel,
=> /log/img/cuire-le-cul.png J'aimerais plus ou moins que tu ailles te faire cuire le cul.
=> /log/img/peter-dans-les-fleurs.png Va péter dans les fleurs.

L'image vient des Cartes de désaveux. J'adore, allez y jeter un oeil, c'est vraiment drôle et grinçant :
=> https://librairie.lapin.org/fr/strip-club/267-les-cartes-de-desavoeux-9782918653943.html

Parce qu'en attendant, j'ai des élèves qui bossent POUR LES AUTRES, et m'envoient des trucs juste pour aider les petits copains. Le prof a rien demandé, et c'est partagé comme ça en toute simplicité. Voilà qui redonne espoir en l'humanité!

=> /educ/3/atome-feuille-de-route/Carte-mentale-atome-Olivia.pdf

Dans un tout autre registre, je me suis déjà servi de btdigg, très pratique et surtout ne nécessitant pas de tracker. Je découvre aujourd'hui bitmagnet, à auto-héberger.
=> https://bitmagnet.io/
Faut que je teste :)
Ah non en fait, c'est docker :/
Arrêtez de faire des trucs compliqués comme ça!

Allez, un peu de Shaka Ponk pour se redonner des forces et finir la journée:

=> https://invidious.fdn.fr/watch?v=Fw0O_0V6538

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=j-aimerais-que-tu-ailles-te-faire-cuire-le-cul

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Prise de note à l'ouverture de l'ordinateur</title>
<id>https://si3t.ch/log/2024-02-22-prise-de-note-a-l-ouverture.txt</id>
<updated>2024-02-22T12:22:56Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-22-prise-de-note-a-l-ouverture.txt" />
<content type="text"><![CDATA[
Lorsque j'allume mon ordinateur, un script lance divers tâches, notamment ouvrir une session tmux qui me sert au travers les divers terminaux que j'utilise.

```starttmux

#!/bin/ksh

session=0
showtmux()
{
   st -c tmux -e tmux a -t $session
   exit
}

# set up tmux
tmux has-session -t $session && showtmux

# open a new session and take notes
tmux new -d -s $session notd
# do-the-internet, show calendar then open a shell
tmux split-window -h -d "sloweb get; showcal; ksh"

# xmpp
tmux new-window -d -n "chat" "profanity"

# educ
tmux new-window -d -n "educ" -c "$HOME/work/educ/College/Cours" noice

# show tmux
showtmux
```

Il est très court comme vous le voyez et se contente de me préparer quelques panels.
On voit à la fin que le tmux est affiché.
Avant cela, un gestionnaire de fichiers est ouvert dans le dossier de mes cours.
Encore avant, j'ouvre un client xmpp.
Et au tout début, j'ouvre le script "notd". (Les plus attentifs auront remarqués comment j'ignore "sloweb get", ça sera l'objet d'un futur article.

C'est de ce script dont je veux parler aujourd'hui.
notd m'ouvre un fichier de notes daté du jour : "notes of the day".
Il reste ouvert tout au long de ma session, et me permet de noter à la volée tout ce qui peut m'être utiles : trucs à ne pas oublier, todos, liens à aller voir, idées...

C'est très pratique, alors peut-être ça vous intéressera. Le voici :

```notd
#!/bin/sh
# notd : notes of the day.
# open a new YYYY-MM-dd.txt in $NOTESDIR with $EDITOR
# Author: prx <[email protected]>

NOTESDIR=~/work/notes/notd
dotd="$(date +%Y-%m-%d)"
f="${NOTESDIR}/${dotd}.txt"

test -d ${NOTESDIR} || mkdir -p ${NOTESDIR}
test -f "${f}" || printf "# %s - Notes du jour\n\n" "${dotd}" > "${f}"
${EDITOR} "${f}"
```

Après quelques tests, les dossiers et fichiers inexistants sont éventuellement créés.
J'utilise la variable d'environnement ${EDITOR} pour ouvrir le fichier, mais en réalité, j'ai remplacé cette ligne par la suivants pour automatiquement : placer le curseur à la fin :


```
#${EDITOR} "${f}"
vi + "${f}"
```

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=prise-de-note-a-l-ouverture

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">sfeed show mastodon toot title</title>
<id>https://si3t.ch/log/2024-02-20-sfeed-mastodon-title.txt</id>
<updated>2024-02-20T14:03:20Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-20-sfeed-mastodon-title.txt" />
<content type="text"><![CDATA[
I use sfeed to read feeds, and I love it.
=> https://codemadness.org/sfeed.html

I also prefer to follow people on mastodon with the associated rss feed, I mean https://instance.tld/@username.rss.

However, this rss feed don't have a title, resulting of the publication date displayed in sfeed_curses.
Even if I can read the toot when pressing enter, I'd like to see a preview of the toot.

sfeed is so good that you can write you own filter() function.
So now, in my sfeedrc, I have:

```
filter() {
       case "$1" in
       masto*:*)
               # don't insert date in title, just first line
               awk -F '\t' 'BEGIN { OFS = "\t"; }
               {
                       # turn description into title
                       $2 = gensub("<[^>]+>", " ", "G", $4)
                       print $0
               }
               '
               ;;
```

It isn't perfect, but give a nice preview:

```
2024-02-19 11:12  I forgot about audacity&#39;s fork Tenacity  it&#39;s still alive!    https://  codeber…
2024-02-18 17:04  Interesting project, but a bit weird     it's a tool to create interactive documents, i…
2024-02-14 16:39  TIL ecryptfs doesn't support very long file names  long as in 148 characters "only"
2024-02-12 19:24  As a former ZNC user, is there an advantage at switching to soju?  I don't have any ZNC…
2024-02-11 16:48  If you want to experience  # Gentoo   Linux for the first time, or if you are bored wit…
2024-02-08 23:50   # OpenBSD   may introduces Word into the base system    https://  marc.info/?l=openbsd…
```


Of course, I have to name mastodon feeds with "masto<someting>:otherthing" like this:

```
feed 'masto:[email protected]' 'https://fosstodon.org/@drewdevault.rss'
feed 'masto:[email protected]' 'https://pouet.chapril.org/@fredg.rss'
feed 'masto:[email protected]' 'https://mamot.fr/@ploum.rss'
feed 'masto:[email protected]' 'https://im-in.space/@noroanka.rss'
feed 'masto:[email protected]' 'https://bsd.network/@solene.rss' "" "iso-8859-1"
feed 'mastotag:solarpunk' 'https://im-in.space/tags/solarpunk.rss'
feed 'mastotag:openbsd' 'https://im-in.space/tags/openbsd.rss'
```

You you're interesed, here is the full filter() I use now:

```
filter() {
       case "$1" in
       masto*:*)
               # don't insert date in title, just first line
               awk -F '\t' 'BEGIN { OFS = "\t"; }
               {
                       # turn description into title
                       $2 = gensub("<[^>]+>", "", "G", $4)
                       print $0
               }
               '
               ;;
       "xkcd.com")
               # do not turn html with w3m/lynx -dump to get img url
               awk -F '\t' 'BEGIN { OFS = "\t"; }
               {
                       $5 = "plain";
                       # extract img url
                       match($4, "src=\"(.+)");
                       imglink = substr($4, RSTART,RLENGTH);
                       split(imglink , a, "\"");
                       imglink = a[2];
                       # same with alt
                       match($4, "alt=\"(.+)");
                       alt = substr($4, RSTART,RLENGTH);
                       split(alt , a, "\"");
                       alt = a[2]
                       # append img link at the end
                       $4 = sprintf("%s \\n=> %s", alt,  imglink);
                       print $0
                       # download the img
                       #cmd = sprintf("cd /home/prx/lessernet/box/; curl -O -s -L -H 'User-Agent:' '%s'", imglink)
                       #system(cmd)
               }
               '
               ;;
       *)
               cat
               ;;
       esac | \
       # replace privacy invasive services with alternatives
       # see https://farside.link/

       sed 's@www\.youtube\.com/@invidious.fdn.fr/@g' | \
       sed 's@youtu\.be/@invidious.fdn.fr/@g' | \
       sed 's@.*twitter\.com/@https://nitter.net/@g' | \
       sed 's@.*reddit\.com/@https://i.opnxng.com/@g' | \
       sed 's@.*medium\.com/@https://scribe.rip/@g' | \

       awk -F '\t' 'BEGIN { OFS = "\t"; }
       function filterlink(s) {
               # protocol must start with http, https or gopher.
               if (match(s, /^(http|https|gopher):\/\//) == 0) {
                       return "";
               }

               # shorten feedburner links.
               if (match(s, /^(http|https):\/\/[^\/]+\/~r\/.*\/~3\/[^\/]+\//)) {
                       s = substr($3, RSTART, RLENGTH);
               }

               # strip tracking parameters
               # urchin, facebook, piwik, webtrekk and generic.
               gsub(/\?(ad|campaign|fbclid|pk|tm|utm|wt)_([^&]+)/, "?", s);
               gsub(/&(ad|campaign|fbclid|pk|tm|utm|wt)_([^&]+)/, "", s);

               gsub(/\?&/, "?", s);
               gsub(/[\?&]+$/, "", s);

               return s
       }
       {
               $3 = filterlink($3); # link
               $8 = filterlink($8); # enclosure

               # try to remove tracking pixels: <img/> tags with 1px width or height.
               gsub("<img[^>]*(width|height)[[:space:]]*=[[:space:]]*[\"'"'"' ]?1[\"'"'"' ]?[^0-9>]+[^>]*>", "", $4);

               print $0;
       }'
}
```

---
Comments?

Send it by mail (anonymous, add a signature if you want):
=> mailto:[email protected]?subject=sfeed-mastodon-title

Diff list instructions:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Générateur de mot de passe</title>
<id>https://si3t.ch/log/2024-02-14-generateur-mots-de-passes.txt</id>
<updated>2024-02-14T15:20:31Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-14-generateur-mots-de-passes.txt" />
<content type="text"><![CDATA[
Je sais qu'il en existe des tas en ligne, mais que voulez-vous, j'ai de plus en plus besoin de garder près de moi les outils qui me sont utiles.

Cette démarche est à la fois un caprice de collectionneur et une crainte latente de voir disparaître les ressources que j'apprécie.

Après avoir prévu des miroirs pour mon site:
=> /log/2024-02-07-miroirs.txt

et après avoir réservé un domaine de secours (si3tch.eu), je m'attelle à des outils. J'ai du boulot devant moi :
=> https://lehollandaisvolant.net/tout/tools/

Pour l'instant, je proposais un générateur de mot de passe via gemini, un script crée des chaînes aléatoires ainsi qu'une liste de mots issus d'une page man tirée au sort.

=> gemini://si3t.ch/tools/pw/

J'ai écrit un peu de C pour faire la même chose et respecter le chroot strict d'httpd en compilant avec l'option ''-static''.

S'il y a un bout de code intéressant ici, c'est cette portion :

```
#define ASCII_START 33
#define ASCII_END 126

for (int i = 0; i < wordlen; i++) {
       printf("%c",
           arc4random_uniform(ASCII_END - ASCII_START) + ASCII_START);
}
```

La fonction arc4random_uniform va retourner n'importe quel nombre dont le maximum est donné en argument. Après avoir regardé "man ascii", j'ai décidé que tous les caractères après l'espace (32) pourraient être affichés.

Si vous voulez tester, ça donne ça:

=> https://si3t.ch/tools/rdmpw

"Mes" outils sont par ici:
=> /tools/

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=generateur-mots-de-passes

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">uptm: just show system uptime</title>
<id>https://si3t.ch/log/2024-02-10-uptm-only-show-system-uptime.txt</id>
<updated>2024-02-10T14:32:16Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-10-uptm-only-show-system-uptime.txt" />
<content type="text"><![CDATA[
I find annoying to have current date, load averages, numbers or users next to system uptime in ''w'' or ''uptime''.

So, I modified w.c to just print uptime.

I find it handy in a status script for tmux or dwm.

```
/* modified w.c to only display uptime */

#include <sys/time.h>
#include <stdio.h>

#define SECSPERHOUR     (60 * 60)
#define SECSPERDAY      (24 * 60 * 60)

int
main(void)
{

       struct timespec boottime;
       time_t uptime, now;
       int days, hrs, mins;

       time(&now);

       /*
        * Print how long system has been up.
        */
       if (clock_gettime(CLOCK_BOOTTIME, &boottime) != -1) {
               uptime = boottime.tv_sec;
               if (uptime > 59) {
                       uptime += 30;
                       days = uptime / SECSPERDAY;
                       uptime %= SECSPERDAY;
                       hrs = uptime / SECSPERHOUR;
                       uptime %= SECSPERHOUR;
                       mins = uptime / 60;
                       if (days > 0)
                               (void)printf("%d day%s", days,
                                   days > 1 ? "s" : "");
                       if (hrs > 0 && mins > 0)
                               (void)printf("%2d:%02d", hrs, mins);
                       else {
                               if (hrs > 0)
                                       (void)printf("%d hr%s",
                                           hrs, hrs > 1 ? "s" : "");
                               if (mins > 0 || (days == 0 && hrs == 0))
                                       (void)printf("%d min%s",
                                           mins, mins != 1 ? "s" : "");
                       }
               } else
                       printf("%d secs", (int)uptime);
       }
       return 0;
}
```

---

Comments?
=> mailto:[email protected]?subject=uptm-only-show-system-uptime

Comments intructions
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">miroirs</title>
<id>https://si3t.ch/log/2024-02-07-miroirs.txt</id>
<updated>2024-02-07T21:24:39Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-02-07-miroirs.txt" />
<content type="text"><![CDATA[
Dans le cas où mon serveur serait inaccessible : panne de réseau, FAI capricieux, disque dur qui vieillit, mauvaise manip'...
j'ai pris un peu de temps pour configurer des miroirs.

Tout d'abord, j'ai tenté ma chance avec srht.site. Cependant, mon site dépasse de peu le 1G limite, et puisque j'envisage de partager davantage de cours, ça ne passe pas.
En tout cas, j'ai un dépot git sur sr.ht qui garde un accès aux fichiers : on peut déposer mon site sur n'importe quel ordinateur en quelques minutes.

=> https://srht.site/

J'ai ensuite tenté un accès chez sdf.org.
C'est excellent ce truc, mais pas possible d'utiliser rsync avec mon compte.
De plus, il n'est pas possible d'avoir du https.
Ça fonctionne, je le garde sous le coude, puisque je peux toujours mettre à jour à partir du dépôt git.

=> https://sdf.org

Finalement, j'ai configuré un truc un peu plus propre avec ma VM chez openbsd.amsterdam.
=> https://openbsd.amsterdam/

J'ai édité ma zone DNS pour y ajouter un nouveau champ et j'ai configuré acme-client pour activer le https.
J'uploade les changements via rsync, et je me garde une crontab qui met à jour le dépôt git sous le coude si un jour le rsync m'ennuie.
Cette VM me laisse la possibilité d'activer un jour les protocoles gopher/gemini si j'ai envie.

Finalement, voici les miroirs:

=> https://si3t.ch
=> https://mirror.si3t.ch
=> https://git.sr.ht/~prx/si3t.ch

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=miroirs

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Turn following csv mastodon list to rss for sfeed</title>
<id>https://si3t.ch/log/2024-01-27-turn-mastodon-followed-to-rss-list-for-sfeed.txt</id>
<updated>2024-01-27T21:25:17Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-27-turn-mastodon-followed-to-rss-list-for-sfeed.txt" />
<content type="text"><![CDATA[
I really enjoy sfeed:
=> https://codemadness.org/sfeed.html

Find below an awk file to convert a following_accounts.csv to sfeedrc format.
Now, in ~/.sfeed/sfeedrc, I have:

```
feeds() {
..
..
~/.sfeed/mastodon.txt
```

I filled ~/.sfeed/mastodon.txt with:

```
awk -F, -f mastocsv2sfeed.awk following_accounts.csv > ~/.sfeed/mastodon.txt
```

mastocsvfeed.awk is:

```mastocsvfeed.awk
#!/usr/bin/awk -f

{
       account = $1

       split($1, a, "@")

       username = a[1]
       domain = a[2]

       printf "feed '%s' 'https://%s/@%s.rss'\n", account, domain, username

}
```

To get your following_accounts.csv, go to your profile export panel.

---
Something to say?

Send it by email:
=> mailto:[email protected]?subject=turn-mastodon-followed-to-rss-list-for-sfeed

See instructions:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Update zim library</title>
<id>https://si3t.ch/log/2024-01-23-update-zim-library.txt</id>
<updated>2024-01-23T15:15:42Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-23-update-zim-library.txt" />
<content type="text"><![CDATA[
If for some reasons you're offline, you still can read wikipedia or other knowledge sources thanks to kiwix project:
=> https://kiwix.org/en/

It uses dumps writen in zim files.
You can find a lot of them here:
=> https://download.kiwix.org/zim

From wikipedia to gutenberg and even french show "C'est pas sorcier" i used to watch when I was a kid.

Most of the times, zim files are big.
To update them one in a while, i wrote a script: zim-update.sh.

It require curl to download zim files, but you can use wget or another tool if you prefer. I strongly suggest to uncomment parts of the script using aria2 to download zim with bittorrent protocol.

In the end, kiwix-manage add new zim to your library, you can read them in a browser thanks to kiwix-serve.
It looks like this:
=> /log/img/kiwix-serve-shot.png

```zim-update.sh
#!/bin/sh
# update zim files
# see https://wiki.kiwix.org/wiki/Content_in_all_languages
# require kiwix-tools and curl

zim_dir=~/docs/zim
zim_library=~/docs/zim/library.xml
zims="wikipedia_fr_all_nopic wiktionary_fr_all_nopic vikidia_fr_all_maxi lesbelleshistoires_fr"

dlurl="https://download.kiwix.org/zim"

cd "${zim_dir}"
for z in ${zims}; do
       # please uncomment to use torrent if you can. Install aria2 to do so
       #zimurl="${dlurl}/${z}.zim"
       #zimtorrent="${zimurl}.torrent"
       #aria2c --seed-time=0 "${zimtorrent}" # disable seed
       #rm *.torrent
       # direct download
       curl -L -O -C - "${zimurl}"
done

# add zims to library
for zim in *.zim; do
       kiwix-manage "${zim_library}" add "${zim}"
done

cat << EOF
You can now run
       kiwix-serve --library ${zim_library} -p 51318
       and open a browser at http://127.0.0.1:51318
EOF


```
---
Comment?

Send it to:
=> mailto:[email protected]?subject=update-zim-library

Find instructions here:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">gghget: téléchargement multi-protocole gemini/gopher/http(s)/...</title>
<id>https://si3t.ch/log/2024-01-21-gghget-wget-pour-tous-protocoles.txt</id>
<updated>2024-01-21T15:52:23Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-21-gghget-wget-pour-tous-protocoles.txt" />
<content type="text"><![CDATA[
Pour un petit projet, je souhaite pouvoir télécharger en ligne de commande.
Pour ça, wget, curl ou encore ftp sont disponibles.
Cependant, ils ne supportent pas le protocole gemini, cela m'ennuie.

Après un peu de recherche, il s'avère que curl, déjà présent sur ma machine, supporte à peu près tous les protocoles.
=> https://everything.curl.dev/protocols/curl

Restait à trouver comment faire pour gemini.
La commande openssl fait le job, il faut juste virer l'entête avec "sed '1d'" et on est bon :)

Au final, ça donne le script suivant qui permet de préciser si on le souhaite le nom du fichier à écrire.
J'aurais bien laissé vers stdout, mais ça met le bazar quand on récupère des binaires ^^.

```
#!/bin/sh
# gghget : download file grom gemini, gopher or http(s)
# require curl and openssl

usage()
{
       printf "usage: %s 'protocol://url/something' '[output_file]'\n" "$0"
       exit 1
}

# remove ending "/" if any to get the filename
if [ -z "$2" ]; then
       name="$(printf "$1" | awk -F/ '{sub("/+$", "", $0); print $NF}')"
else
       name="$2"
fi

case "$1" in
       -h|--help|help)
               usage
               ;;
       gemini://*)
               # set default port if not specified next to domain in url
               host="$(printf "$1" | awk -F/ '$3 !~ /:[[:digit:]]+/ {$3=$3 ":1965"} END {print $3; exit}')"

               # sed will remove response header
               printf "$1\r\n" |\
                       openssl s_client -crlf -quiet  -connect "${host}" 2>/dev/null |\
                       sed '1d' \
                       > "${name}"
               ;;

       *://*)
               curl \
                       -L \
                       -f \
                       -s \
                       -m 5 \
                       -H "User-Agent:" \
                       --compressed \
                       "$1" \
                       > "${name}"
               ;;
       *)
               printf "The URL must start with protocol://\n"
               ;;
esac
```

Voir aussi hurl:
=> https://codemadness.org/hurl.html

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=gghget-wget-pour-tous-protocoles

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Répondre à un toot sans ouvrir son navigateur</title>
<id>https://si3t.ch/log/2024-01-20-repondre-toot-en-cli.txt</id>
<updated>2024-01-20T14:49:48Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-20-repondre-toot-en-cli.txt" />
<content type="text"><![CDATA[
Petit à petit, j'essaie de limiter les distractions lorsque j'utilise mon ordinateur.
L'idéal serait une utilisation déconectée comme le permet offpunk de ploum:
=> https://ploum.net/2023-11-25-offpunk2.html

Malheureusement, je n'y arrive pas encore.
Mon travail nécessite que j'ouvre un navigateur qui supporte du javascript pour Pronote.
La vie fait qu'il est souvent indispensable de consulter le site de la banque pour faire les comptes.
Il faut déclarer les salaires de la nounou sur Pajemploi.
Je vérifie le trajet pour la prochaine formation sur openstreetmap.
..
Tout ceci, je pourrai le réserver à une session dédiée pour ces tâches après m'être fait un planning, et éviter de me perdre sur internet.

Pour l'instant, je gagne du temps avec les flux RSS/ATOM.
Ils sont récupérés par sfeed (ou rss2email), ça fait une synchronisation des choses à lire. C'était avant envoyé par mail, mais je tente de réserver la lecture sur mon ordinateur plutôt que d'être tenté d'ouvrir un webmail à chaque instant "libre" de la journée dans une quête futile d'optimisation de la moindre seconde.
=> https://github.com/rss2email/rss2email
=> https://codemadness.org/sfeed-simple-feed-parser.html

Reste un problème : les messages sur mastodon.
Je déteste l'interface de Mastodon, c'est un piège, un distracteur, avec notifications et nouveautés régulières.
Alors, je m'abonne au flux RSS des personnes que je veux lire. Il suffit d'ajouter ".rss" à la fin, par exemple :
=> https://mamot.fr/@ploum.rss

Seulement, je perds la possibilité d'interagir et de commenter les posts.
On en arrive enfin au sujet de ce billet : comment répondre à un toot sans ouvrir le navigateur?
Facile, le lecteur de flux RSS indique l'URL des toots.
J'ai écrit un petit script qui prend en argument l'id du toot auquel on veut répondre. Il s'utilise par exemple ainsi :

```
pwet -r https://im-in.space/@prx/111788504349081874 Réponse au toot
```

Voici la tête du script, qui a seulement besoin de "curl":

```
#!/bin/sh
# toot with curl
# create a new application in your mastodon profile to get a token and write it in ~/.config/mastodon.token

instance="im-in.space"
token="$(cat $HOME/.config/mastodon.token)"
url="https://$instance/api/v1/statuses"


help()
{
       printf "usage:\n"
       printf "\t%s [-r reply_to ] [-h] Your status\n" "$0"
       printf "\n"
       printf "\t-h             Show this help\n"
       printf "\t-r reply_to    String. ID or url of the status being replied to.\n"
       printf "\n"
       printf "example:\n"
       printf "\t%s -r https://foo.bar/@username/1104349081874 The reply message\n" "$0"
       exit 1
}

while getopts 'hr:' c
do
       case $c in
               h) help ;;
               r) reply_to="${OPTARG}" ;;
       esac
done
# skip options in argument index so $1 is the status
shift $((OPTIND - 1))

status="\"$*\""
test -z "$status" && help

if [ -n "${reply_to}" ]; then
       # get id if url is given
       reply_to_id="$(printf "${reply_to}" | awk -F/ '{print $NF}')"

       curl -s "${url}" \
               -H "Authorization: Bearer $token" \
               -F status="${status}" \
               -F in_reply_to_id="${reply_to_id}" > /dev/null

else
       curl -s "${url}" \
               -H "Authorization: Bearer $token" \
               -F status="${status}" > /dev/null
fi
```

Toutes ces réponses prennent la forme de commandes, lignes après lignes, dans un fichier qui est éxécuté comme un script lorsque je veux les envoyer (lorsque je passe en mode "en ligne").

En complément, il me reste à créer une file d'attente des mails à envoyer. Ils sont rédigés hors ligne, et j'envoie quand tout est prêt.
=> https://github.com/Stebalien/msmtp-queue

Ces idées de déconnexion a déjà été bien décrit par ploum:
=> https://ploum.net/3-janvier-2022-quest-ce-quune-deconnexion/index.html

Je n'en suis qu'aux début de l'aventure, mais j'en ai besoin.

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
=> mailto:[email protected]?subject=repondre-toot-en-cli

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
=> https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Afficher les paroles de la chanson jouée par mpd</title>
<id>https://si3t.ch/log/2024-01-18-afficher-paroles-mpd.txt</id>
<updated>2024-01-18T13:47:20Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-18-afficher-paroles-mpd.txt" />
<content type="text"><![CDATA[
J'ai récemment trié ma bibliothèque de musiques.
Pour cela, Solène m'a conseillé l'excellent beets:
https://beets.io/

La première bonne nouvelle, c'est que je n'ai pas besoin d'acheter de nouveau disque dur pour me promener avec ma musique, le format opus est excellent, et beets m'a permis de convertir mes flac sans difficultés ni différence notable avec mon casque.
L'autre bonne nouvelle, c'est que beets a intégré les paroles aux fichiers sous forme de métadonnées.

Voici comment je les affiche avec ffprobe (ffmpeg):

```
#!/bin/sh
# show lyrics of current played song

mpdconf=~/.config/mpd/mpd.conf
music_directory=$(awk '/music_directory/ {sub("^\"","",$2);sub("\"$","",$2); print $2}' $mpdconf)

echo "$(ffprobe -of flat -show_entries stream_tags=lyrics "$music_directory/$(mpc -f %file% current)")" | less
```



---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
       mailto:[email protected]?subject=afficher-paroles-mpd

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
       https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
<entry>
<title type="text">Choisissez l'apparence du site que vous lisez</title>
<id>https://si3t.ch/log/2024-01-14-choose-webste-appearance.txt</id>
<updated>2024-01-14T14:55:26Z</updated>
<link rel="alternate" type="text/plain" href="//si3t.ch/log/2024-01-14-choose-webste-appearance.txt" />
<content type="text"><![CDATA[
On me dit que mes articles sont moches.
Le texte brut ne plaît pas à tout le monde.
Je peux comprendre.

Toutefois, lorsque je bricole le CSS de mon site pour fair eun truc joli, je finis toujours par me lassez du rendu.
De plus, qui suis-je pour décider à la place des lecteurs de ce qu'ils devraient préférer?
On en arrive à des règles CSS pour proposer des modes sombres ou clairs selon les cas.
Et pourquoi pas en faire autant avec les polices?
On peut souffrir de dyslexie : on utilisera alors Opendyslexic?
Ou alors juste voir très mal : Luciole ou Atkinson Hyperlegible feront mieux l'affaire.
Préférer une apparence qui ressemble à son environnement habituel : on définit la police du système.

Je choisi donc de ne pas préciser de police si possible.
Chacun peut configurer son navigateur à son gré et choisir une police qui lui convient.
Il y a même un mode lecture qui fonctionne aussi très bien avec les fichiers txt : Ctrl-Alt-R.
On l'oublie souvent ce mode, moi le premier ^^

---
Une réaction?

Envoyez votre commentaire par mail (anonyme):
       mailto:[email protected]?subject=choose-webste-appearance

Voici quelques instructions pour utiliser la liste de diffusion et recevoir les réponses à vos messages:
       https://si3t.ch/log/_commentaires_.txt

]]>
</content>
</entry>
</feed>